Skip to content

流式输出允许您在模型生成文本时实时渲染内容。

通过 REST API 使用时,流式输出默认启用;但在 SDK 中,流式输出默认是禁用的。

若要在 SDK 中启用流式输出,请将 stream 参数设置为 True

流式输出的核心概念

  1. 对话:流式传输部分助手消息。每个 chunk 都包含 content,因此您可以随着消息的到达进行渲染。
  2. 思考:具备思考能力的模型在每个 chunk 中除了常规内容外还会输出一个 thinking 字段。通过检测流式 chunk 中的此字段,可以在最终答案出现前显示或隐藏推理轨迹。
  3. 工具调用:监听每个 chunk 中流式传输的 tool_calls,执行请求的工具,并将工具输出添加到对话中。

处理流式数据块(Chunks)

注意

需要累加部分字段以维护对话历史。这对于工具调用尤为重要,因为模型生成的思考内容、工具调用以及执行的工具结果必须在下一次请求中传递给模型。

Python

python
from ollama import chat

stream = chat(
  model='qwen3',
  messages=[{'role': 'user', 'content': 'What is 17 × 23?'}],
  stream=True,
)

in_thinking = False
content = ''
thinking = ''
for chunk in stream:
  if chunk.message.thinking:
    if not in_thinking:
      in_thinking = True
      print('Thinking:\n', end='', flush=True)
    print(chunk.message.thinking, end='', flush=True)
    # 累加部分思考内容
    thinking += chunk.message.thinking
  elif chunk.message.content:
    if in_thinking:
      in_thinking = False
      print('\n\nAnswer:\n', end='', flush=True)
    print(chunk.message.content, end='', flush=True)
    # 累加部分内容
    content += chunk.message.content

  # 将累加的字段添加到下一请求的消息中
  new_messages = [{ role: 'assistant', thinking: thinking, content: content }]

JavaScript

javascript
import ollama from 'ollama'

async function main() {
  const stream = await ollama.chat({
    model: 'qwen3',
    messages: [{ role: 'user', content: 'What is 17 × 23?' }],
    stream: true,
  })

  let inThinking = false
  let content = ''
  let thinking = ''

  for await (const chunk of stream) {
    if (chunk.message.thinking) {
      if (!inThinking) {
        inThinking = true
        process.stdout.write('Thinking:\n')
      }
      process.stdout.write(chunk.message.thinking)
      // 累加部分思考内容
      thinking += chunk.message.thinking
    } else if (chunk.message.content) {
      if (inThinking) {
        inThinking = false
        process.stdout.write('\n\nAnswer:\n')
      }
      process.stdout.write(chunk.message.content)
      // 累加部分内容
      content += chunk.message.content
    }
  }

  // 将累加的字段添加到下一请求的消息中
  new_messages = [{ role: 'assistant', thinking: thinking, content: content }]
}

main().catch(console.error)