Trang chủ / Tài liệu / Truyền dữ liệu theo luồng

Truyền dữ liệu theo luồng

Sự kiện do máy chủ gửi ở cả hai định dạng — cấu trúc sự kiện khác nhau và nhầm lẫn giữa chúng sẽ khiến bạn tưởng rằng không có phản hồi.

Đặt stream thành true và phản hồi sẽ trở thành text/event-stream. Cả hai endpoint đều truyền luồng, nhưng chúng phát ra các cấu trúc sự kiện khác nhau.

Định dạng Anthropic

curl -N https://aiprimetech.io/v1/messages \
  -H "x-api-key: $CLAUDEAPIKEY" \
  -H "anthropic-version: 2023-06-01" \
  -H "content-type: application/json" \
  -d '{"model":"claude-sonnet-4-6","max_tokens":512,"stream":true,
       "messages":[{"role":"user","content":"Count to five"}]}'
event: message_start
data: {"type":"message_start","message":{"id":"msg_...","usage":{"input_tokens":9}}}

event: content_block_delta
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"One"}}

event: message_delta
data: {"type":"message_delta","delta":{"stop_reason":"end_turn"},"usage":{"output_tokens":14}}

event: message_stop
data: {"type":"message_stop"}

Văn bản được gửi trong content_block_delta các sự kiện tại delta.text. Số token đầu ra cuối cùng được gửi trong message_delta, không phải message_start.

Định dạng OpenAI

data: {"choices":[{"delta":{"content":"One"},"index":0}]}

data: {"choices":[{"delta":{},"finish_reason":"stop","index":0}]}

data: [DONE]

Văn bản được gửi tại choices[0].delta.content, và luồng kết thúc bằng giá trị đánh dấu nguyên văn data: [DONE] không phải là JSON.

Sự không khớp này tạo ra phản hồi rỗng mà không có lỗi: một ứng dụng khách phân tích choices[].delta.content từ luồng Messages luôn không tìm thấy gì và báo thành công. Nếu việc truyền luồng có vẻ hoạt động nhưng không trả về gì, hãy kiểm tra cấu trúc bạn đang phân tích.

Python, SDK Anthropic

from anthropic import Anthropic

client = Anthropic(api_key=class="s">"sk-your-key", base_url=class="s">"https://aiprimetech.io")

with client.messages.stream(
    model=class="s">"claude-sonnet-4-6",
    max_tokens=512,
    messages=[{class="s">"role": class="s">"user", class="s">"content": class="s">"Count to five"}],
) as stream:
    for text in stream.text_stream:
        print(text, end=class="s">"", flush=True)

Lưu ý vận hành