Потоковая передача
События, отправляемые сервером, в обоих форматах — структура событий различается, и при их смешении клиент не видит данных.
Задайте stream в true, и ответ будет передаваться в формате text/event-stream. Оба эндпоинта поддерживают потоковую передачу, но выдают события разной структуры.
Формат 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"}
Текст поступает в content_block_delta событиях по пути delta.text. Итоговое число выходных токенов поступает в message_delta, а не message_start.
Формат OpenAI
data: {"choices":[{"delta":{"content":"One"},"index":0}]}
data: {"choices":[{"delta":{},"finish_reason":"stop","index":0}]}
data: [DONE]
Текст поступает по пути choices[0].delta.content, а поток заканчивается буквальным data: [DONE] маркером завершения, который не является JSON.
Это несоответствие приводит к пустому ответу без ошибки: клиент, разбирающий
choices[].delta.content в потоке Messages, каждый раз ничего не находит и сообщает об успехе. Если потоковая передача вроде бы работает, но ничего не возвращает, проверьте, какую структуру вы разбираете.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)
Практические замечания
- Используйте
curl -Nпри ручном тестировании, иначе curl буферизует весь поток и кажется, что ничего не происходит. - Отключите буферизацию прокси перед своим приложением (
proxy_buffering offв nginx), иначе клиенты получат весь ответ разом в конце. - Если соединение обрывается во время потоковой передачи, уже сгенерированные токены всё равно оплачиваются.
- Потоковая передача не меняет цену — только время поступления байтов.