用curl实现Ollama API流式调用

部署运行你感兴趣的模型镜像


作为码农,多多少少都有点“强迫症”。虽然用 Python 调用 Ollama API 是天经地义的选择,但既然 curl 可以非流式调用,没理由流式就不行----就像职场上领导常PUA的那样,“事事有回应时时有回应”----也必须让curl时时有回应,不能已读不回半天才响应!经过一番探索(主要是折腾 LLM),终于实现了用 curl 流式调用 Ollama API 的方法。

1 前提准备

1.1 安装jq

需有jq工具来处理JSON数据,或者使用以下命令进行安装

# ubuntu
sudo apt update
sudo apt install jq -y

1.2 安装base64

需要base64工具来将图片转码,或者使用以下命令进行安装

# ubuntu
sudo apt update
sudo apt install base64 -y

2 流式调用基于openai api的ollama聊天模型

curl -sN http://127.0.0.1:11434/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
        "model": "qwen3:8b",
        "messages": [{"role": "user", "content": "写一首四句唐诗"}],
        "stream": true
      }' \
| {
c_flag=0; r_flag=0                # 标记是否已打印前缀
while IFS= read -r line; do
    # 去掉 "data: " 前缀
    json=${line#data: }
    # 跳过空行或 [DONE]
    [[ $json == "" || $json == "[DONE]" ]] && continue
    # 提取 delta.content 并打印
    content=$(echo "$json" | jq -r '.choices[0].delta.content // empty')
    reasoning=$(echo "$json" | jq -r '.choices[0].delta.reasoning // empty')
    
    if [[ -n $reasoning ]]; then
	     ((r_flag)) || { printf "\n【reasoning】\n\t"; r_flag=1; }
	      printf "%s" "$reasoning"
    fi
    
    if [[ -n $content ]]; then
	     ((c_flag)) || { printf "\n\n【content】\n\t"; c_flag=1; }
	      printf "%s" "$content"
    fi
done
echo
echo
}

在这里插入图片描述

3 流式调用ollama聊天模型

curl -sN http://127.0.0.1:11434/api/generate \
  -d '{
    "model": "qwen3:8b",
    "prompt": "写一首四句唐诗",
    "stream": true
  }' \
| {
  t_flag=0; r_flag=0                # 标记是否已打印前缀
  while read -r l; do
    t=$(echo "$l" | jq -r '.thinking//empty')
    r=$(echo "$l" | jq -r '.response//empty')

    if [[ -n $t ]]; then
      ((t_flag)) || { printf "\n【thinking】\n\t"; t_flag=1; }
      printf "%s" "$t"
    fi

    if [[ -n $r ]]; then
      ((r_flag)) || { printf "\n\n【response】\n\t"; r_flag=1; }
      printf "%s" "$r"
    fi
  done
  echo
  echo
}

在这里插入图片描述

4 流式调用ollama gemma3多模态模型

ip="127.0.0.1:11434"
model="gemma3:4b"
# 将 test.png 替换为你要喂给模型的图片
cat > /tmp/request.json <<EOF
{
  "model": "${model}",
  "prompt": "请描述这张图片",
  "images": ["$(base64 -i test.png)"],
  "stream": true
}
EOF

# 从文件发送请求
curl -sX POST http://${ip}/api/generate \
  -H "Content-Type: application/json" \
  -d @/tmp/request.json | {
  r_flag=0                # 标记是否已打印前缀
  while read -r l; do

    r=$(echo "$l" | jq -r '.response//empty')

    if [[ -n $r ]]; then
      ((r_flag)) || { printf "\n\n【response】\n\t"; r_flag=1; }
      printf "%s" "$r"
    fi
  done
  echo
  echo
}

# 清理
rm /tmp/request.json

在这里插入图片描述

5 流式调用ollama qwen3-vl多模态模型

ip="127.0.0.1:11434"
model="qwen3-vl:8b"
# 将 test.png 替换为你要喂给模型的图片
cat > /tmp/request.json <<EOF
{
  "model": "${model}",
  "prompt": "请描述这张图片",
  "images": ["$(base64 -i test.png)"],
  "stream": true
}
EOF

# 从文件发送请求
curl -sX POST http://${ip}/api/generate \
  -H "Content-Type: application/json" \
  -d @/tmp/request.json | {
  t_flag=0; r_flag=0                # 标记是否已打印前缀
  while read -r l; do
    t=$(echo "$l" | jq -r '.thinking//empty')
    r=$(echo "$l" | jq -r '.response//empty')

    if [[ -n $t ]]; then
      ((t_flag)) || { printf "\n【thinking】\n\t"; t_flag=1; }
      printf "%s" "$t"
    fi

    if [[ -n $r ]]; then
      ((r_flag)) || { printf "\n\n【response】\n\t"; r_flag=1; }
      printf "%s" "$r"
    fi
    
  done
  echo
  echo
}

# 清理
rm /tmp/request.json

在这里插入图片描述

6 附其它curl方法

6.1 查看Ollama的模型信息

curl -s http://localhost:11434/v1/models | jq
# 或
curl -s http://127.0.0.1:11434/api/tags | jq

6.2 非流式访问ollama聊天模型

curl http://127.0.0.1:11434/api/chat \
  -d '{
        "model": "qwen3:8b",
        "messages": [
          {"role": "system", "content": "你是一位科普助手"},
          {"role": "user",   "content": "用一句话解释量子纠缠"}
        ],
        "stream": false
      }'
curl http://127.0.0.1:11434/api/generate \
  -d '{
        "model": "qwen3:8b",
        "prompt": "写一首四句唐诗",
        "stream": false
      }'

6.3 非流式访问ollama gemma3多模态模型

# 将 test.png 替换为你要喂给模型的图片
curl -sX POST http://127.0.0.1:11434/api/generate \
-H "Content-Type: application/json" \
-d @- <<EOF
{
  "model": "gemma3:4b",
  "prompt": "请描述这张图片",
  "images": ["$(base64 -i test.png)"],
  "stream": false
}
EOF

6.4 非流式访问ollama qwen3-vl多模态模型

# 将 test.png 替换为你要喂给模型的图片
curl -X POST http://127.0.0.1:11434/api/generate -H "Content-Type: application/json" -d @- <<EOF
{
  "model": "qwen3-vl:8b",
  "prompt": "请描述这张图片",
  "images": ["$(base64 -i test.png)"],
  "stream": false
}
EOF

您可能感兴趣的与本文相关的镜像

Llama Factory

Llama Factory

模型微调
LLama-Factory

LLaMA Factory 是一个简单易用且高效的大型语言模型(Large Language Model)训练与微调平台。通过 LLaMA Factory,可以在无需编写任何代码的前提下,在本地完成上百种预训练模型的微调

<think>首先,用户的问题是关于如何使用OllamaAPI进行开发。根据系统指令,我需要使用中文回答,结构清晰,帮助用户逐步解决问题。回答必须真实可靠,基于提供的引用。 提供的引用: - 引用[1]:在 Python 中使用 Ollama API。介绍了在Python中使用Ollama API进行聊天对话、流式响应、模型操作等。 - 引用[2]:Ollama系列05:Ollama API 使用指南。提到了在本地运行模型、集成UI界面、构建私有知识库。 - 引用[3]:使用 Ollama API 生成 Python 代码的实现过程。具体展示了发送POST请求和处理响应的代码。 用户意图明确:了解如何调用OllamaAPI。 我需要组织回答结构: 1. **引言**:简要介绍Ollama API。 2. **步骤**:分步解释如何使用API,包括环境准备、基本调用、示例代码。 3. **代码示例**:提供Python代码片段,展示如何调用API。 4. **优化建议**:提到流式响应、异步编程等优化方法。 5. **相关问题**:生成相关问题,作为结束。 确保LaTeX语法正确: - 行内数学表达式用$...$,但在这个上下文中,可能不需要数学表达式,因为主题是API调用。如果有变量等,我会使用。 - 独立公式用$$...$$,但同样,可能不适用。 回答中引用的段落末尾添加引用标识,例如[^1]。所以,在引用具体内容时,我需要添加引用标识。 生成相关问题:在回答结束时,添加"相关问题"部分。 详细步骤: 1. **环境准备**:参考引用[1]和[2],提到安装OllamaPython库。 2. **基本API调用**:参考引用[3],展示发送POST请求的代码。 3. **示例**:提供完整的Python代码示例。 4. **高级功能**:讨论流式响应、模型操作等。 5. **相关问题**:生成3-5个相关问题。 代码示例:使用Markdown代码块。 最终回答结构: - 标题:例如,"如何使用Ollama API进行开发" - 正文:分点解释。 - 代码块。 - 相关问题。 相关问题示例: 1. 如何优化Ollama API的性能? 2. 如何用Ollama构建私有知识库? 3. Ollama API支持哪些模型操作?</think>### 如何使用Ollama API进行开发 Ollama是一个开源工具,允许用户在本地运行大型语言模型(LLM),并提供了简洁的API接口。通过API,您可以进行聊天对话、模型管理(如创建或删除模型)、流式响应处理等任务。以下我将逐步指导您如何使用Python调用Ollama API,确保开发过程高效可靠。整个过程基于官方文档和社区实践,包括环境准备、基本调用、代码实现和优化建议。 #### 步骤1: 环境准备 在开始前,确保您的系统满足以下要求: - **安装Ollama**:从[Ollama官网](https://ollama.com/)下载并安装最新版本,支持Windows、macOS和Linux。安装后,通过命令行运行`ollama serve`启动本地服务,默认API地址为`http://localhost:11434`[^1]。 - **Python环境**:建议使用Python 3.8+版本。安装必要的库: ```bash pip install requests # 用于发送HTTP请求 pip install aiohttp # 可选,用于异步优化 ``` - **模型准备**:通过Ollama命令行下载所需模型,例如运行`ollama pull llama2`下载Llama 2模型。确保模型已加载并可用[^2]。 #### 步骤2: 基本API调用 Ollama API基于HTTP RESTful接口,主要端点包括: - `/api/generate`:用于生成文本响应,支持流式输出。 - `/api/chat`:用于对话式交互。 - `/api/tags`:列出可用模型。 - `/api/create`:创建或复制模型(需要管理员权限)。 API请求格式通常为POST请求,包含JSON数据。例如,调用`/api/generate`时需要指定模型名称和提示文本[^3]。 #### 步骤3: Python代码实现 以下是一个完整的Python示例,展示如何发送API请求并处理响应。代码基于引用[3]的实现,添加了错误处理和注释。 ```python import requests import json # API基础URL(本地服务) api_url = "http://localhost:11434/api/generate" # 请求数据:指定模型和提示 data = { "model": "llama2", # 替换为您的模型名称,如"deepseek" "prompt": "请解释量子力学的基本原理", "stream": False # 设置为True可启用流式响应 } # 发送POST请求 try: response = requests.post( api_url, headers={"Content-Type": "application/json"}, data=json.dumps(data) ) response.raise_for_status() # 检查HTTP错误 # 处理响应结果 if response.status_code == 200: result = response.json() print("API响应成功:") print(f"生成文本: {result['response']}") # 提取生成的文本 print(f"总耗时: {result['total_duration']} 毫秒") else: print(f"请求失败,状态码: {response.status_code}, 错误信息: {response.text}") except requests.exceptions.RequestException as e: print(f"网络错误: {e}") except json.JSONDecodeError: print("响应解析错误,请检查API返回格式") ``` **代码说明**: - 此示例调用`/api/generate`端点生成文本响应。您可以通过修改`data`字典自定义请求参数,如`temperature`(控制随机性)或`max_tokens`(限制输出长度)。 - 如果设置`"stream": True`,API会以流式方式返回数据,适合处理大型输出(见优化建议部分)[^3]。 - 在实际应用中,建议添加重试逻辑或超时设置以提高鲁棒性。 #### 步骤4: 高级功能与优化 - **流式响应处理**:对于大数据生成,启用流式响应可减少内存占用。代码示例: ```python if data["stream"]: for line in response.iter_lines(): if line: chunk = json.loads(line.decode('utf-8')) print(chunk.get('response', ''), end='', flush=True) # 实时输出 ``` 这允许逐步处理响应,避免一次性加载所有数据[^1]。 - **异步编程**:使用`aiohttp`库提升并发性能,适合高吞吐场景: ```python import aiohttp import asyncio async def fetch_ollama_response(): async with aiohttp.ClientSession() as session: data = {"model": "llama2", "prompt": "你好,Ollama!"} async with session.post(api_url, json=data) as response: return await response.json() # 调用异步函数 response = asyncio.run(fetch_ollama_response()) print(response) ``` 异步方法能显著提升多请求场景的效率[^1]。 - **模型管理**:通过API创建或删除模型。例如,发送POST到`/api/create`上传自定义模型文件: ```python create_data = {"name": "my_model", "path": "/path/to/model.bin"} response = requests.post("http://localhost:11434/api/create", json=create_data) ``` 这需Ollama服务具有相应权限[^2]。 #### 注意事项 - **安全性**:本地API默认无认证,生产环境建议添加API密钥或防火墙规则。 - **性能监控**:使用工具如`curl`测试API延迟:`curl -X POST http://localhost:11434/api/generate -d '{"model":"llama2","prompt":"test"}'`。 - **错误处理**:常见错误包括模型未加载(404错误)或无效参数(400错误)。参考[Ollama官方文档](https://github.com/ollama/ollama/blob/main/docs/api.md)获取详细错误码。 通过以上步骤,您可以快速集成Ollama APIPython应用中。如需进一步探索,推荐阅读官方API文档或社区教程[^1][^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值