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
- Sử dụng
curl -Nkhi kiểm thử thủ công, nếu không curl sẽ lưu toàn bộ luồng vào bộ đệm và trông như không có gì đang diễn ra. - Tắt cơ chế lưu vào bộ đệm của proxy phía trước ứng dụng của bạn (
proxy_buffering offtrong nginx), nếu không ứng dụng khách sẽ nhận toàn bộ phản hồi cùng lúc vào cuối quá trình. - Nếu kết nối bị ngắt giữa luồng, các token đã được tạo vẫn bị tính phí.
- Truyền luồng không thay đổi giá — chỉ thay đổi thời điểm các byte đến.