База знания Разработчиците
Чат, отговори и съобщения
Три начина да попитате модел нещо, в трите формата клиентите вече говорят, всички работят по същите модели и се таксуват по същия начин.
Тази страница е машинно преведена за удобство. Английският оригинал е версията, която се прилага.
Чат завършване
OpenAI чат формат, и този, който почти всеки инструмент поддържа. изпратете разговора дотук и да получите следващото съобщение обратно.
POST https://nymbot.ai/api/v1/chat/completions Нуждаете се от API ключ.
само model и messages Избраният модел не взема параметър за вземане на проби, който се пада без грешка, така че тялото на едно искане работи между моделите. supported_parametersТова, което е отхвърлено, а не изоставено, е нещо, което моделът изобщо не може да направи: снимки за модел, който не може да види, инструменти за модел, който не може да ги назове.
| полето | Тип | Необходими | Описание на |
|---|---|---|---|
model | Стрийт | да | nymbot/auto (или auto) за маршрутизиране на Nymbot по стандартния баланс, или каталог модел id като anthropic/claude-sonnet-5 на баланса на Pro. Кратките имена и псевдоними на приложението също се приемат. Достатъчно. |
messages | Арсенал | да | Разговорът - ролите system, developer (разглежда се като система) user, assistant и toolСъдържанието е низ или списък с text и image_url части; изображения само в потребителски съобщения. input_audio Част от файловете са отхвърлени. |
stream | булевард | не | Изпратете отговора така, както е написан. стрийминг. |
stream_options | Обектът | не | {"include_usage": true} добавя последната част с токените и разходите. |
max_tokensmax_completion_tokens | интегритет | не | Най-много токени, за да напишете. Намалено до максимума на модела, ако е по-висок. Също така определя колко се държи от вашия баланс, така че по-малък брой се нуждае от по-малко кредит, за да започне. |
temperaturetop_p | брой | не | Контрол на извадката: temperature от 0 до 2, top_p от 0 до 1. |
stop | String или Array | не | Текст, който завършва отговора: един низ или най-много 4 нива, всеки с най-много 256 знака. nymbot/auto. |
seed | интегритет | не | За повтарящо се вземане на проби, където моделът го поддържа. |
presence_penaltyfrequency_penalty | брой | не | Повтарящи се контроли, всеки от -2 до 2. |
response_format | Обектът | не | {"type": "json_object"} или {"type": "json_schema", "json_schema": {…}}, където моделът го поддържа.Не се използва от nymbot/auto. |
toolstool_choiceparallel_tool_calls | матрица, низ или обект, булеви | не | Функция на повикване. виж Инструменти за обажданеА web_search Инструментът се превръща WEB ТърсенеНай-много 128 инструмента и 512 KB дефиниции, вградени в най-много 64 нива дълбочина; повече е 400. |
reasoning_effortreasoning | Пъзел, обект | не | "minimal", "low", "medium" или "high"или {"effort": "high"}. "none" или {"enabled": false} Изключете го. виж още Разумът. |
plugins | Арсенал | не | [{"id": "web", "max_results": 5}] Винаги търси първо в мрежата. до 10 резултата. |
n | интегритет | не | 1.Всичко останало се връща 400. |
logit_biasusermetadata | Обект, Структура, Обект | не | Приети и не изпратени. logit_bias Карти с най-много 300 токенови идентификатори до числа от -100 до 100; user съдържа максимум 256 символа; metadata съдържа най-много 16 стойности за струни, ключове до 64 знака и стойности до 512. |
Отговорът е обикновено chat.completionС цената на usage.cost
(в долари) и в nymbot на обекта. model е разрешеният модел id, така че краткото име се връща като пълно. message.reasoning_contentотделно от отговора.
Отговор
{
"id": "chatcmpl-5f1c0a9e27d84b3c",
"object": "chat.completion",
"created": 1790726400,
"model": "anthropic/claude-sonnet-5",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "A Lightning invoice is a one-time payment request..."
},
"logprobs": null,
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 1240,
"completion_tokens": 380,
"total_tokens": 1620,
"prompt_tokens_details": { "cached_tokens": 0 },
"completion_tokens_details": { "reasoning_tokens": 0 },
"cost": 0.01895
},
"nymbot": {
"balance": "pro",
"charged_credits": 0.162,
"charged_sats": 16.2,
"balance_credits": 412.425,
"balance_sats": 41242.5
}
}
finish_reason се работи от това, което се върна, тъй като доставчиците го съобщават по различен начин: tool_calls Когато моделът поиска инструменти, length когато отговорът използва всеки позволен токен (или моделът ги изразходва всички разсъждения и не пише отговор), content_filter когато доставчикът откаже, и stop
В противен случай usage.completion_tokens_details.reasoning_tokens винаги е 0: скритите разсъждаващи токени се броят и се таксуват в completion_tokens.
| статут | Кога |
|---|---|
400 | не model или messages (missing_required_parameter); аудио или файлова част, или изображения за модел, който не може да ги види (unsupported_content); повече от 20 снимки (too_many_images); параметър за вземане на проби от грешен тип или извън обхвата (invalid_value); линк към снимка, който не е публичен (invalid_image_url); инструменти на модел, който не може да ги назове (unsupported_tool); n В допълнение към 1; а :thinking Допълнение към модел, който не може да разсъждава (model_not_found(или доставчикът е отхвърлил искането)upstream_rejected). |
402 | Балансът, който моделът изразходва, не може да покрие задържането. |
403 | Най-лошият случай не се вписва в капака на ключа (key_limit_reached• По-ниско max_tokens Или да вдигнете главата. |
404 | Няма модел с това име (model_not_found). |
429 | Стойността на лимита на ключа или на доставчика (upstream_rate_limited). |
502, 503 | Доставчикът е неуспешен (upstream_error) или е претоварено (upstream_overloaded, с Retry-AfterНищо не се таксува, освен ако доставчикът не е таксувал за опита. |
Кодовете за състоянието на всяка крайна точка акции са изброени под Грешките.
cURL
curl https://nymbot.ai/api/v1/chat/completions \
-H "Authorization: Bearer $NYMBOT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "anthropic/claude-sonnet-5",
"messages": [
{"role": "system", "content": "Answer in one short paragraph."},
{"role": "user", "content": "What is a Lightning invoice?"}
],
"max_tokens": 400
}'
Python
import os
from openai import OpenAI
client = OpenAI(base_url="https://nymbot.ai/api/v1", api_key=os.environ["NYMBOT_API_KEY"])
reply = client.chat.completions.create(
model="anthropic/claude-sonnet-5",
messages=[
{"role": "system", "content": "Answer in one short paragraph."},
{"role": "user", "content": "What is a Lightning invoice?"},
],
max_tokens=400,
)
print(reply.choices[0].message.content)
print(reply.usage.cost)
JavaScript
import OpenAI from "openai";
const client = new OpenAI({ baseURL: "https://nymbot.ai/api/v1", apiKey: process.env.NYMBOT_API_KEY });
const reply = await client.chat.completions.create({
model: "anthropic/claude-sonnet-5",
messages: [
{ role: "system", content: "Answer in one short paragraph." },
{ role: "user", content: "What is a Lightning invoice?" },
],
max_tokens: 400,
});
console.log(reply.choices[0].message.content);
console.log(reply.usage.cost);
стрийминг
с "stream": true Отговорът идва като събитие, изпратено от сървъра, докато моделът го пише. chat.completion.chunk е а data: линия, и потокът завършва с data: [DONE]Разумът идва в
delta.reasoning_contentОтговорът в delta.content.
Излъчвайте всичко, което може да отнеме повече от около 100 секунди, като например дълъг отговор, голяма
max_tokens заявка, която не се излъчва, не изпраща нищо, докато отговорът не е завършен, а мрежата между вас и Nymbot може да затвори безпроблемна връзка след около 100 секунди; моделът все още завършва и това, което е написал, се зарежда, но отговорът е загубен. поток изпраща keep-alives, така че остава отворен, докато моделът пише.
Потокът
data: {"id":"chatcmpl-5f1c0a9e27d84b3c","object":"chat.completion.chunk","created":1790726400,"model":"anthropic/claude-sonnet-5","choices":[{"index":0,"delta":{"role":"assistant","content":""},"finish_reason":null}]}
data: {"id":"chatcmpl-5f1c0a9e27d84b3c","object":"chat.completion.chunk","created":1790726400,"model":"anthropic/claude-sonnet-5","choices":[{"index":0,"delta":{"content":"A Lightning invoice"},"finish_reason":null}]}
: keep-alive
data: {"id":"chatcmpl-5f1c0a9e27d84b3c","object":"chat.completion.chunk","created":1790726400,"model":"anthropic/claude-sonnet-5","choices":[{"index":0,"delta":{},"finish_reason":"stop"}]}
data: {"id":"chatcmpl-5f1c0a9e27d84b3c","object":"chat.completion.chunk","created":1790726400,"model":"anthropic/claude-sonnet-5","choices":[],"usage":{"prompt_tokens":1240,"completion_tokens":380,"total_tokens":1620,"cost":0.01895},"nymbot":{"balance":"pro","charged_credits":0.162,"charged_sats":16.2,"balance_credits":412.425,"balance_sats":41242.5}}
data: [DONE]
- Линии, започващи с
:са живи коментари, изпращани на всеки 15 секунди, докато моделът мисли. - Попитайте за
"stream_options": {"include_usage": true}за да получите последното парче отгоре, с празенchoices, токените се броят, цената иnymbotна обекта. - Ако затворите връзката рано, моделът не се спира: Nymbot чете останалата част от потока на доставчика, за до 25 секунди, за да получи своя брой токени, и вие плащате това, което доставчикът съобщава.
- Една грешка преди първата част, като например
401или402, се връща като обикновен JSON със своя код за състояние, а не като поток.data: {"error": {…}}събитие, и потокът завършва без[DONE]. - Заявки с инструменти и модели на OpenAI отговори транспорт, не поток от доставчика. Те все още отговарят с валиден поток, изпратени след като отговорът е завършен.
cURL
curl -N https://nymbot.ai/api/v1/chat/completions \
-H "Authorization: Bearer $NYMBOT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "nymbot/auto",
"stream": true,
"stream_options": {"include_usage": true},
"messages": [{"role": "user", "content": "Write a haiku about sats."}]
}'
Python
import os
from openai import OpenAI
client = OpenAI(base_url="https://nymbot.ai/api/v1", api_key=os.environ["NYMBOT_API_KEY"])
stream = client.chat.completions.create(
model="nymbot/auto",
stream=True,
stream_options={"include_usage": True},
messages=[{"role": "user", "content": "Write a haiku about sats."}],
)
for chunk in stream:
if chunk.choices:
print(chunk.choices[0].delta.content or "", end="", flush=True)
elif chunk.usage:
print("\ncost:", chunk.usage.cost)
JavaScript
import OpenAI from "openai";
const client = new OpenAI({ baseURL: "https://nymbot.ai/api/v1", apiKey: process.env.NYMBOT_API_KEY });
const stream = await client.chat.completions.create({
model: "nymbot/auto",
stream: true,
stream_options: { include_usage: true },
messages: [{ role: "user", content: "Write a haiku about sats." }],
});
for await (const chunk of stream) {
if (chunk.choices.length) process.stdout.write(chunk.choices[0].delta.content || "");
else if (chunk.usage) console.log("\ncost:", chunk.usage.cost);
}
Инструменти за обаждане
Опишете функциите в tools и моделът може да поиска да бъде повикан вместо да отговаря. Изпълнявате функцията, добавяйки нейния резултат като tool Съобщение със същото
tool_call_idNymbot никога не изпълнява функциите ви; той предава искането на модела обратно към вас.
tool_choice взема "auto", "none",
"required" или {"type": "function", "function": {"name": "…"}}Моделният списък маркира кои модели могат да се наричат инструменти (capabilities.toolsИнструментите се отказват 400 unsupported_tool е nymbot/auto и на малкото каталогови модели, които работят на транспорта на OpenAI Responses, на които Nymbot не може да предава инструменти.
с "stream": true, заявка с инструменти се изпълнява в едно парче и след това се изпраща като нормална частична последователност: ролята, една частица, която носи всеки призив за инструмент с неговия индекс, идентификатор, име и аргументи, и крайната част.
Отговорът, отчасти
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": null,
"tool_calls": [
{
"id": "call_7d2e",
"type": "function",
"function": { "name": "get_invoice_status", "arguments": "{\"invoice_id\":\"a41f\"}" }
}
]
},
"finish_reason": "tool_calls"
}
]
cURL
curl https://nymbot.ai/api/v1/chat/completions \
-H "Authorization: Bearer $NYMBOT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "anthropic/claude-sonnet-5",
"messages": [{"role": "user", "content": "Has invoice a41f been paid?"}],
"tools": [{
"type": "function",
"function": {
"name": "get_invoice_status",
"description": "Look up whether an invoice is paid.",
"parameters": {
"type": "object",
"properties": {"invoice_id": {"type": "string"}},
"required": ["invoice_id"]
}
}
}]
}'
Python
import json, os
from openai import OpenAI
client = OpenAI(base_url="https://nymbot.ai/api/v1", api_key=os.environ["NYMBOT_API_KEY"])
tools = [{
"type": "function",
"function": {
"name": "get_invoice_status",
"description": "Look up whether an invoice is paid.",
"parameters": {
"type": "object",
"properties": {"invoice_id": {"type": "string"}},
"required": ["invoice_id"],
},
},
}]
messages = [{"role": "user", "content": "Has invoice a41f been paid?"}]
reply = client.chat.completions.create(model="anthropic/claude-sonnet-5", messages=messages, tools=tools)
call = reply.choices[0].message.tool_calls[0]
args = json.loads(call.function.arguments)
messages.append(reply.choices[0].message)
messages.append({"role": "tool", "tool_call_id": call.id, "content": json.dumps({"paid": True})})
final = client.chat.completions.create(model="anthropic/claude-sonnet-5", messages=messages, tools=tools)
print(final.choices[0].message.content)
JavaScript
import OpenAI from "openai";
const client = new OpenAI({ baseURL: "https://nymbot.ai/api/v1", apiKey: process.env.NYMBOT_API_KEY });
const tools = [{
type: "function",
function: {
name: "get_invoice_status",
description: "Look up whether an invoice is paid.",
parameters: {
type: "object",
properties: { invoice_id: { type: "string" } },
required: ["invoice_id"],
},
},
}];
const messages = [{ role: "user", content: "Has invoice a41f been paid?" }];
const reply = await client.chat.completions.create({ model: "anthropic/claude-sonnet-5", messages, tools });
const call = reply.choices[0].message.tool_calls[0];
const args = JSON.parse(call.function.arguments);
messages.push(reply.choices[0].message);
messages.push({ role: "tool", tool_call_id: call.id, content: JSON.stringify({ paid: true }) });
const final = await client.chat.completions.create({ model: "anthropic/claude-sonnet-5", messages, tools });
console.log(final.choices[0].message.content);
Снимки в заявка
Модели с capabilities.vision Можете да прочетете снимки.Добавете image_url
част към потребителско съобщение, с публиката или https:// Линк или А
data:image/…;base64, URL. До 20 изображения на заявка. SVG изображения са отхвърлени, така че линкът е над 4096 символа или един с потребителско име или парола в него (400 invalid_image_url) е опционален detail е
auto, low или high.
с nymbot/auto, заявка с картина в нея се маршрутизира към стандартен модел, който може да се види. capabilities.vision Отказвам снимки с
400 unsupported_contentСнимките могат да бъдат само в потребителски съобщения.Връзката трябва да посочи публичен хост; Nymbot предава изображението на доставчика на модела и не го запазва.
Едно изображение се таксува като входните токени, които доставчикът брои за него, както и останалата част от заявката.
cURL
curl https://nymbot.ai/api/v1/chat/completions \
-H "Authorization: Bearer $NYMBOT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "anthropic/claude-sonnet-5",
"messages": [{
"role": "user",
"content": [
{"type": "text", "text": "What is in this picture?"},
{"type": "image_url", "image_url": {"url": "https://example.com/receipt.jpg"}}
]
}]
}'
Python
import base64, os
from openai import OpenAI
client = OpenAI(base_url="https://nymbot.ai/api/v1", api_key=os.environ["NYMBOT_API_KEY"])
with open("receipt.jpg", "rb") as f:
data_url = "data:image/jpeg;base64," + base64.b64encode(f.read()).decode()
reply = client.chat.completions.create(
model="anthropic/claude-sonnet-5",
messages=[{
"role": "user",
"content": [
{"type": "text", "text": "What is in this picture?"},
{"type": "image_url", "image_url": {"url": data_url}},
],
}],
)
print(reply.choices[0].message.content)
JavaScript
import { readFile } from "node:fs/promises";
import OpenAI from "openai";
const client = new OpenAI({ baseURL: "https://nymbot.ai/api/v1", apiKey: process.env.NYMBOT_API_KEY });
const dataUrl = "data:image/jpeg;base64," + (await readFile("receipt.jpg")).toString("base64");
const reply = await client.chat.completions.create({
model: "anthropic/claude-sonnet-5",
messages: [{
role: "user",
content: [
{ type: "text", text: "What is in this picture?" },
{ type: "image_url", image_url: { url: dataUrl } },
],
}],
});
console.log(reply.choices[0].message.content);
Разумът
Модели с capabilities.reasoning може да мисли, преди да отговори.Поискайте повече или по-малко от него с reasoning_effort ("minimal", "low",
"medium" или "high") или "reasoning": {"effort": "high"}или да добавите :thinking на името на модела, което означава високо усилие. На модел без разсъждение настройката се пренебрегва. nymbot/auto, :thinking Изпраща искането към стандартния маршрут за разсъждение.
На антропологичните модели усилието се превръща в бюджет за мислене от около 1000, 2000 или 8000 токена, никога повече от max_tokens Мисленето е изоставено, когато
tool_choice принуждава инструмент, а когато искането продължава инструментна лента (последното му съобщение е резултат от инструмент), защото Anthropic се нуждае от по-рано подписаното мислене, за да го възобнови.
Разумът се връща в message.reasoning_contentили
delta.reasoning_content когато стрийминг, никога не се смесват в отговора. Разсъждение е изход и се зарежда като такъв, вътре completion_tokensНякои доставчици изобщо не връщат мотивационния текст и той все още се таксува.
cURL
curl https://nymbot.ai/api/v1/chat/completions \
-H "Authorization: Bearer $NYMBOT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "anthropic/claude-sonnet-5",
"reasoning_effort": "high",
"messages": [{"role": "user", "content": "Is 2^61 - 1 prime? Show why."}]
}'
Python
import os
from openai import OpenAI
client = OpenAI(base_url="https://nymbot.ai/api/v1", api_key=os.environ["NYMBOT_API_KEY"])
reply = client.chat.completions.create(
model="anthropic/claude-sonnet-5",
reasoning_effort="high",
messages=[{"role": "user", "content": "Is 2^61 - 1 prime? Show why."}],
)
message = reply.choices[0].message
print(getattr(message, "reasoning_content", None))
print(message.content)
JavaScript
import OpenAI from "openai";
const client = new OpenAI({ baseURL: "https://nymbot.ai/api/v1", apiKey: process.env.NYMBOT_API_KEY });
const reply = await client.chat.completions.create({
model: "anthropic/claude-sonnet-5",
reasoning_effort: "high",
messages: [{ role: "user", content: "Is 2^61 - 1 prime? Show why." }],
});
console.log(reply.choices[0].message.reasoning_content);
console.log(reply.choices[0].message.content);
Допълнителни модели
Суфиксът на името на модела променя начина, по който се обработва заявката, без друго поле. anthropic/claude-sonnet-5:online.
| Достатъчно | Ефект |
|---|---|
:online | Търси в интернет първо, като plugins: [{"id": "web"}]Виж WEB Търсене. |
:thinking | Високо рационално усилие; на nymbot/autoНа модела, който не може да разсъждава, 400 model_not_found с “не са намерени крайни точки”. |
:nitro, :floor, :exacto, :extended | Всеки модел на каталога има един маршрут, така че няма по-бърз, по-евтин или по-дълъг, за да изберете един; суфиксите са позволени, така че имената на моделите, копирани от други услуги, все още работят. |
Всякакви други суфикси се игнорират. Цялото име се опитва първо, така че модел, чийто идентификатор наистина съдържа колона, все още работи; в противен случай, суфиксите се изваждат от края един по един, докато моделът не съвпадне. 400 invalid_value.
cURL
curl https://nymbot.ai/api/v1/chat/completions \
-H "Authorization: Bearer $NYMBOT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "anthropic/claude-sonnet-5:thinking",
"messages": [{"role": "user", "content": "Plan a three-day trip to Lisbon."}]
}'
Python
import os
from openai import OpenAI
client = OpenAI(base_url="https://nymbot.ai/api/v1", api_key=os.environ["NYMBOT_API_KEY"])
reply = client.chat.completions.create(
model="anthropic/claude-sonnet-5:thinking",
messages=[{"role": "user", "content": "Plan a three-day trip to Lisbon."}],
)
print(reply.choices[0].message.content)
JavaScript
import OpenAI from "openai";
const client = new OpenAI({ baseURL: "https://nymbot.ai/api/v1", apiKey: process.env.NYMBOT_API_KEY });
const reply = await client.chat.completions.create({
model: "anthropic/claude-sonnet-5:thinking",
messages: [{ role: "user", content: "Plan a three-day trip to Lisbon." }],
});
console.log(reply.choices[0].message.content);
WEB Търсене
Nymbot търси последното потребителско съобщение (първите 2000 символа), чете най-добрите страници и ги дава на модела с въпрос, маркиран като външно съдържание, от което моделът не трябва да взема инструкции.
- Винаги търси:
"plugins": [{"id": "web", "max_results": 5}]или а:onlineДостатъчно е за модела. - Търси, когато помага:
"tools": [{"type": "web_search", "parameters": {"max_results": 5}}]Също така приети катоweb_search_previewилиopenrouter:web_searchNymbot търси само когато въпросът изглежда, че се нуждае от текуща информация, същият тест използва приложението.
max_results е 5 по подразбиране и на максимум 10. източниците се връщат в
nymbot.web_search.sourcesВсеки с а title, snippet и
urlи като url_citation бележки върху съобщението.
Всяко търсене, което работи, струва $ 0,008, преобразувано в sats, на върха на токените, и това е част от задържането. Страниците, които чете, също са входни токени, така че отговорът от интернет струва повече от същия въпрос, зададен студено, понякога няколко пъти повече.
Отговорът, отчасти
"nymbot": {
"balance": "pro",
"charged_credits": 0.431,
"charged_sats": 43.1,
"balance_credits": 411.994,
"balance_sats": 41199.4,
"web_search": {
"sources": [
{ "title": "Lightning Network - Wikipedia", "snippet": "The Lightning Network is a payment protocol...", "url": "https://en.wikipedia.org/wiki/Lightning_Network" }
]
}
}
cURL
curl https://nymbot.ai/api/v1/chat/completions \
-H "Authorization: Bearer $NYMBOT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "anthropic/claude-sonnet-5",
"plugins": [{"id": "web", "max_results": 5}],
"messages": [{"role": "user", "content": "What changed in the latest Bitcoin Core release?"}]
}'
Python
import os
from openai import OpenAI
client = OpenAI(base_url="https://nymbot.ai/api/v1", api_key=os.environ["NYMBOT_API_KEY"])
reply = client.chat.completions.create(
model="anthropic/claude-sonnet-5",
messages=[{"role": "user", "content": "What changed in the latest Bitcoin Core release?"}],
extra_body={"plugins": [{"id": "web", "max_results": 5}]},
)
print(reply.choices[0].message.content)
for source in reply.model_extra["nymbot"]["web_search"]["sources"]:
print(source["url"])
JavaScript
import OpenAI from "openai";
const client = new OpenAI({ baseURL: "https://nymbot.ai/api/v1", apiKey: process.env.NYMBOT_API_KEY });
const reply = await client.chat.completions.create({
model: "anthropic/claude-sonnet-5",
plugins: [{ id: "web", max_results: 5 }],
messages: [{ role: "user", content: "What changed in the latest Bitcoin Core release?" }],
});
console.log(reply.choices[0].message.content);
for (const source of reply.nymbot.web_search.sources) console.log(source.url);
Отговор на огън
По-новият формат на OpenAI, използван от OpenAI Agents SDK и от Codex. Той работи на същите модели, фактуриране и функции като Chat Completions.
POST https://nymbot.ai/api/v1/responses Нуждаете се от API ключ.
| полето | Тип | Необходими | Описание на |
|---|---|---|---|
model | Стрийт | да | Като за Чат завършванеВключени са и суфикси. |
input | String или Array | да | string, или списък с елементи: съобщения (роли user, assistant, system, developer) с input_text, input_image и output_text части и function_call и function_call_output Елементи за инструменти. input_image Вземете една image_url връзка или URL адрес на данните, а не идентификатор на файла. reasoning и web_search_call предметите са премахнати; item_reference е отхвърлено |
instructions | Стрийт | не | Инструкции за системата. |
max_output_tokens | интегритет | не | Най-много токени за писане |
temperaturetop_p | брой | не | Измерване на контролите, където моделът ги взема. |
toolstool_choiceparallel_tool_calls | матрица, низ или обект, булеви | не | Функционални инструменти, под формата на отговори ({"type": "function", "name": …, "parameters": …}) А web_search или web_search_preview Инструментът се превръща WEB Търсене Когато помага, други вградени инструменти се отказват. |
reasoning | Обектът | не | {"effort": "minimal" | "low" | "medium" | "high"}. xhigh и max означава high; none Превърнете го от. |
text.formatresponse_format | Обектът | не | Структуриран изход, като JSON схема или json_object. |
metadata | Обектът | не | Връща се непроменено в отговора. при максимум 16 стойности на низ, ключове до 64 знака и стойности до 512. |
stream | булевард | не | Изтегляне на събития, както е описано по-долу. |
store | булевард | не | Нищо не се съхранява и отговорът винаги казва: "store": false. |
previous_response_idconversationbackground | Структура, обект, булевард | не | Не са подкрепени: 400 unsupported_parameterОтговорите не се съхраняват, така че изпратете целия разговор в input Всеки път |
Отговор
{
"id": "resp_8c1e4b0f9a2d4e61",
"object": "response",
"created_at": 1790726400,
"status": "completed",
"model": "anthropic/claude-sonnet-5",
"output": [
{
"type": "message",
"id": "msg_2b7f",
"role": "assistant",
"status": "completed",
"content": [{ "type": "output_text", "text": "A Lightning invoice is...", "annotations": [] }]
}
],
"output_text": "A Lightning invoice is...",
"usage": {
"input_tokens": 1240,
"input_tokens_details": { "cached_tokens": 0 },
"output_tokens": 380,
"output_tokens_details": { "reasoning_tokens": 0 },
"total_tokens": 1620
},
"incomplete_details": null,
"error": null,
"instructions": null,
"store": false,
"previous_response_id": null,
"metadata": {},
"nymbot": { "balance": "pro", "charged_credits": 0.162, "charged_sats": 16.2, "balance_credits": 412.425, "balance_sats": 41242.5 }
}
Искане за инструмент се появява в output като а function_call точка с
call_id, name и argumentsИзпратете резултата обратно като a
function_call_output Етикет със същото call_idРазумът, когато моделът го върне, е reasoning точка с reasoning_text съдържание, изброени първо. status е incomplete Когато отговорът удари
max_output_tokens Доставчикът е отказал, с
incomplete_details.reason Поставете max_output_tokens или
content_filterОтговорът също така отговаря на настройките на заявката (температура, инструменти, избор на инструменти и т.н.), както прави OpenAI, и носи nymbot Цената на обекта.
Стремейд, всяко събитие е event: линия и а data: Линия с а
sequence_numberВ този ред: response.created,
response.in_progress, response.output_item.added,
response.content_part.addedВсеки брой на response.output_text.delta,
response.output_text.done, response.content_part.done,
response.output_item.doneИ накрая response.completed с използването и разходите. Отговорът се съкращава с кратки response.incomplete Вместо това, и провал, след като потокът започна с response.failedРазсъждавайки потоци като свой собствен елемент с response.reasoning_text.delta и .doneИнструменталните повиквания идват след съобщението, всеки като елемент с response.function_call_arguments.delta
и .done.
| статут | Кога |
|---|---|
400 | не model или input; previous_response_id, conversation, background или на item_reference (unsupported_parameter); неподдържан инструмент или тип съдържание. |
402, 403, 404, 429, 502, 503 | По отношение на завършването на чата. |
cURL
curl https://nymbot.ai/api/v1/responses \
-H "Authorization: Bearer $NYMBOT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "anthropic/claude-sonnet-5",
"instructions": "Answer in one short paragraph.",
"input": "What is a Lightning invoice?"
}'
Python
import os
from openai import OpenAI
client = OpenAI(base_url="https://nymbot.ai/api/v1", api_key=os.environ["NYMBOT_API_KEY"])
response = client.responses.create(
model="anthropic/claude-sonnet-5",
instructions="Answer in one short paragraph.",
input="What is a Lightning invoice?",
)
print(response.output_text)
JavaScript
import OpenAI from "openai";
const client = new OpenAI({ baseURL: "https://nymbot.ai/api/v1", apiKey: process.env.NYMBOT_API_KEY });
const response = await client.responses.create({
model: "anthropic/claude-sonnet-5",
instructions: "Answer in one short paragraph.",
input: "What is a Lightning invoice?",
});
console.log(response.output_text);
Антропогенни послания
Форматът на Anthropic, за Anthropic SDK и Claude Code. Той работи с всеки модел в каталога, не само Claude: заявката се превежда, изпълнява се през един и същ тръбопровод и се превежда обратно.
POST https://nymbot.ai/api/v1/messages — се нуждае от API ключ, както x-api-key или Authorization: Bearer.
на anthropic-version и anthropic-beta Антропогенните имена на моделите са съобразени с каталога, така че Claude Code и SDK работят с имената, които вече използват:
- Име, което каталогът знае, като например
claude-sonnet-5илиanthropic/claude-opus-5Използва се така, както е. - В случай, че датата (
-20260514),-latestЕдна версия като-v1И така, за един блестящ ден като[1m]и еднаanthropic/илиanthropic.Префиксът се премахва, а точките и тапите в версията се изпробват и по двата начина (claude-haiku-4-5Намериclaude-haiku-4.5). - Ако това все още не съвпада, се използва семейството (Opus, Sonnet или Haiku), стига версията на каталога да е същата или по-нова от поисканата.
- Името, което не съвпада с нищо, се връща
404not_found_error.
| полето | Тип | Необходими | Описание на |
|---|---|---|---|
model | Стрийт | да | Идентификатор на каталогов модел или име на антропологичен модел. |
max_tokens | интегритет | да | Най-много токени за писане |
messages | Арсенал | да | user и assistant Върни се, с text, image (base64 или източник на URL), tool_use и tool_result на блоковете. thinking Блокове от предишни обиколки се приемат и отпадат. |
system | String или Array | не | Помощ на системата, като string или текстови блокове. |
temperaturetop_p | брой | не | Измерване на контролите, където моделът ги взема. top_k Приети са и отпаднали. |
stop_sequences | Съвпадение за Strings | не | Текст, който завършва отговора. Най-много 4 струни, всеки с максимум 256 символа. |
toolstool_choice | Археология, обект | не | Инструменти с name, description и input_schemaА web_search Серверният инструмент се превръща в WEB ТърсенеДругите вградени инструменти на Anthropic (баш, текстов редактор, използване на компютър) се отказват с unsupported_tool. tool_choice взема auto, any, tool или noneи disable_parallel_tool_use. |
thinking | Обектът | не | {"type": "enabled", "budget_tokens": 8192}, {"type": "adaptive"} или {"type": "disabled"}Бюджетът избира ниво на усилие: под 2 048 минимално, от 2 048 ниско, от 8 192 средно, от 16 384 високо. output_config.effortИли пък високо. |
stream | булевард | не | Изтегляне във формат на събитие на Anthropic. |
metadata | Обектът | не | Приети и игнорирани. |
Отговор
{
"id": "msg_01c7a2f93e5b4d08",
"type": "message",
"role": "assistant",
"model": "anthropic/claude-sonnet-5",
"content": [{ "type": "text", "text": "A Lightning invoice is..." }],
"stop_reason": "end_turn",
"stop_sequence": null,
"usage": {
"input_tokens": 1240,
"output_tokens": 380,
"cache_read_input_tokens": 0,
"cache_creation_input_tokens": 0
},
"nymbot": { "balance": "pro", "charged_credits": 0.162, "charged_sats": 16.2, "balance_credits": 412.425, "balance_sats": 41242.5 }
}
content Също така може да задържи tool_use Блокове и А thinking
Блокът, който signature Той е празен. stop_reason е
end_turn, max_tokens, tool_use или refusalРаботи по същия начин, по който finish_reason е
Чат завършване; stop_sequence винаги е
null, дори когато спираща се последователност завършва отговора. input_tokens брои само пресни входове; кеширан вход е в двете полета за кеширане.
nymbot Обектът и X-Nymbot-Cost-Sats на хедър
Събитията са от Anthropic’s: message_start,
content_block_start, ping, content_block_delta
(text_delta, input_json_delta или thinking_delta),
content_block_stop, message_delta Причината за това е, че използването и nymbot Цената на обекта и message_stopА ping Също така се изпраща на всеки 15 секунди, докато моделът работи. Обажданията на инструментите пристигат след текста, всеки като
tool_use Блок с целия си вход в един input_json_delta.
Грешки в тази крайна точка използват формата на Anthropic:
{"type": "error", "error": {"type": "not_found_error", "message": "…"}}Краткото равновесие е 402 billing_errorПретоварен доставчик
503 overloaded_errorПровал, след като потокът е започнал, се изпраща като error Събитието .
cURL
curl https://nymbot.ai/api/v1/messages \
-H "x-api-key: $NYMBOT_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "Content-Type: application/json" \
-d '{
"model": "claude-sonnet-5",
"max_tokens": 1024,
"messages": [{"role": "user", "content": "What is a Lightning invoice?"}]
}'
Python
import os
import anthropic
client = anthropic.Anthropic(base_url="https://nymbot.ai/api", api_key=os.environ["NYMBOT_API_KEY"])
message = client.messages.create(
model="claude-sonnet-5",
max_tokens=1024,
messages=[{"role": "user", "content": "What is a Lightning invoice?"}],
)
print(message.content[0].text)
JavaScript
import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic({ baseURL: "https://nymbot.ai/api", apiKey: process.env.NYMBOT_API_KEY });
const message = await client.messages.create({
model: "claude-sonnet-5",
max_tokens: 1024,
messages: [{ role: "user", content: "What is a Lightning invoice?" }],
});
console.log(message.content[0].text);
Преброяване на токени
Оценка на броя на входните токени, които искането за съобщения ще използва, така че клиентът да може да проверява преди да изпрати.
POST https://nymbot.ai/api/v1/messages/count_tokens Нуждаете се от ключ за API.
Тялото е същото като СъобщенияБез да max_tokens; името на модела трябва да се реши. броят е оценка: символите на системния бутон, съобщенията, повикванията на инструменти и определенията на инструментите се делят на четири, плюс 1600 за всяко изображение. Това не е собствен токенизатор на доставчика, така че действителното броене може да се различава.
Отговор
{ "input_tokens": 318 }
cURL
curl https://nymbot.ai/api/v1/messages/count_tokens \
-H "x-api-key: $NYMBOT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "claude-sonnet-5",
"messages": [{"role": "user", "content": "What is a Lightning invoice?"}]
}'
Python
import os
import anthropic
client = anthropic.Anthropic(base_url="https://nymbot.ai/api", api_key=os.environ["NYMBOT_API_KEY"])
count = client.messages.count_tokens(
model="claude-sonnet-5",
messages=[{"role": "user", "content": "What is a Lightning invoice?"}],
)
print(count.input_tokens)
JavaScript
import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic({ baseURL: "https://nymbot.ai/api", apiKey: process.env.NYMBOT_API_KEY });
const count = await client.messages.countTokens({
model: "claude-sonnet-5",
messages: [{ role: "user", content: "What is a Lightning invoice?" }],
});
console.log(count.input_tokens);
Списък на моделите
Всеки модел и генератор на API приема, с това, което струва. списъкът се чете от същия директен каталог като пикера на приложението, така че винаги е това, което сървърът ще работи.
GET https://nymbot.ai/api/v1/models — няма нужда от ключ. Скрито за пет минути.
GET /api/v1/models/{id} Връща се един вход.
| полето | Тип | Необходими | Описание на |
|---|---|---|---|
type | Стрийт (поискане на търсене) | не | chat (В случай на неизпълнение на задължението), image, video, audio, embedding или allНякои от тях могат да се използват, като image,video. |
Цените са това, което плащате, с таксата и маржа вече в, в долари и в ставки на текущата цена на Bitcoin. balance Показва какъв баланс харчи моделът.
nymbot_key е краткото име на модела в приложението. created винаги е 0, тъй като каталогът не записва кога е добавен модел. per_request вместо това.
nymbot/auto винаги е на първо място, ценен като variable, с а
routes Списъкът, който дава тарифите на всеки стандартен маршрут.Той изброява визията и разсъжденията, но не и инструментите.
GET /api/v1/models/{id} приема същите имена и псевдоними като заявка и връща входа за модела, за който решават.
Отговор
{
"object": "list",
"data": [
{
"id": "anthropic/claude-sonnet-5",
"object": "model",
"type": "chat",
"owned_by": "anthropic",
"name": "Claude Sonnet 5",
"created": 0,
"context_length": 1000000,
"max_output_tokens": 64000,
"architecture": { "input_modalities": ["text", "image"], "output_modalities": ["text"] },
"supported_parameters": ["max_tokens", "temperature", "tools", "tool_choice", "reasoning", "response_format", "stop"],
"capabilities": { "vision": true, "video": false, "tools": true, "reasoning": true, "web_search": true },
"balance": "pro",
"pricing": {
"type": "per_token",
"currency": "USD",
"input_per_1M_tokens": 4.725,
"output_per_1M_tokens": 23.625,
"cache_read_per_1M_tokens": 0.4725,
"sats_input_per_1M_tokens": 4038,
"sats_output_per_1M_tokens": 20192
},
"description": "...",
"nymbot_key": "claude-sonnet"
}
]
}
Другите видове:
- Изображение Входовете са
capabilities(accepts_image_url,requires_image_url,editи една ценаper_generation. - Видеото Входовете са
max_duration_secondsиresolutionsи една ценаper_secondза всяка резолюция. - Аудио Входовете са
audio_typespeechилиtranscriptionЦенатаper_1k_charsилиper_minute. - Вграждане Входовете са
dimensions,context_length,max_inputsи цена на един милион входящи токени.
Маркирани цени "estimated": true е прогнозата на приложението за генератор, чиято цена не е публикувана. type Връщане 400.
cURL
curl "https://nymbot.ai/api/v1/models?type=chat"
Python
import requests
models = requests.get("https://nymbot.ai/api/v1/models", params={"type": "chat"}).json()["data"]
for m in models:
print(m["id"], m["balance"], m["pricing"].get("input_per_1M_tokens"))
JavaScript
const res = await fetch("https://nymbot.ai/api/v1/models?type=chat");
const { data } = await res.json();
for (const m of data) console.log(m.id, m.balance, m.pricing.input_per_1M_tokens);