Skip to content

ストリーミングを使用すると、モデルが生成したテキストをその場でレンダリングできます。

REST APIではストリーミングはデフォルトで有効ですが、SDKではデフォルトで無効になっています。

SDKでストリーミングを有効にするには、stream パラメータを True に設定してください。

主要なストリーミングの概念

  1. チャット: アシスタントの部分的なメッセージをストリーミングします。各チャンクには content が含まれるため、メッセージが到着次第レンダリングできます。
  2. 思考: 思考機能を搭載したモデルは、各チャンクの通常のコンテンツに加えて thinking フィールドを出力します。ストリーミングチャンク内でこのフィールドを検出することで、最終的な回答が到着する前に推論のトレースを表示または非表示にできます。
  3. ツール呼び出し: 各チャンクでストリーミングされる tool_calls を監視し、要求されたツールを実行して、ツールの出力結果を会話に追加します。

ストリーミングチャンクの処理

注記

会話の履歴を維持するには、部分的なフィールドを累積する必要があります。特にツール呼び出しの場合、モデルの思考内容、ツール呼び出し、実行したツールの結果を次のリクエストでモデルに送り返す必要があるため重要です。

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)
```