Spring til indholdet
Tilbage til Nymbot

Vidensgrundlag Udviklere

Chat, svar og beskeder

Tre måder at spørge en model noget, i de tre formater klienter allerede taler, alle kører på de samme modeller og faktureret på samme måde.

Chat færdiggørelse

Den OpenAI chat format, og den, næsten alle værktøjer understøtter. Send samtalen så langt og få den næste besked tilbage.

POST https://nymbot.ai/api/v1/chat/completions Det kræver en API-nøgle.

Kun til model og messages En samplingsparameter, som den valgte model ikke tager, falder uden en fejl, så en anmodning krop fungerer på tværs af modeller. supported_parametersHvad der bliver afvist i stedet for droppet er noget, som modellen slet ikke kan gøre: billeder for en model, der ikke kan se, værktøjer til en model, der ikke kan ringe til dem.

FeltetType afKrævesBeskrivelse af
modelStrengeJanymbot/auto (eller auto) for Nymbots routing på standardbalancen, eller en katalogmodellid såsom anthropic/claude-sonnet-5 på Pro-balancen. Appens korte navne og aliaser accepteres også. Tilstrækkeligt.
messagesArrayJaSamtaler - roller system, developer (behandlet som et system) user, assistant og toolIndhold er en streng eller en liste over text og image_url dele; billeder kun i brugerbeskeder. input_audio og dele af filen afvises.
streamBooleanskNej ikkeSend svaret, som det er skrevet. Streaming af.
stream_optionsObjektetNej ikke{"include_usage": true} tilføjer et sidste stykke med token tæller og omkostningerne.
max_tokens
max_completion_tokens
IntegerNej ikkeDe fleste tokens til at skrive. Sænket til modelens maksimum, hvis højere. Det angiver også, hvor meget der holdes fra din balance, så et mindre antal har brug for mindre kredit til at starte.
temperature
top_p
NummeretNej ikkeSampling af kontrol: temperature Fra 0 til 2, top_p Fra 0 til 1.
stopString eller arrayNej ikkeTekst, der slutter svaret: en streng eller højst 4 strenge, hver med højst 256 tegn. nymbot/auto.
seedIntegerNej ikkeTil gentagelig prøveudtagning, hvor modellen understøtter det.
presence_penalty
frequency_penalty
NummeretNej ikkeKontrol af gentagelser, hver fra -2 til 2.
response_formatObjektetNej ikke{"type": "json_object"} eller {"type": "json_schema", "json_schema": {…}}, hvor modellen understøtter det. Ikke anvendt af nymbot/auto.
tools
tool_choice
parallel_tool_calls
Array, String eller Object, BooleanNej ikkeFunktionen kalder. se Værktøj til opkalda) a web_search Værktøjet bliver til WebsøgningPå maksimalt 128 værktøjer og 512 KB definitioner, indlejret på maksimalt 64 niveauer dybt; mere er en 400.
reasoning_effort
reasoning
Streng, genstandNej ikke"minimal", "low", "medium" eller "high"eller {"effort": "high"}. "none" eller {"enabled": false} Sluk det op. Se begrundelse.
pluginsArrayNej ikke[{"id": "web", "max_results": 5}] altid søger på nettet først. Op til 10 resultater.
nIntegerNej ikke1: Alt andet kommer tilbage 400.
logit_bias
user
metadata
Værktøj, String og ObjectNej ikkeGodkendt og ikke sendt videre. logit_bias kort på højst 300 token-id'er til tal fra -100 til 100; user Der er højst 256 tegn. metadata kan indeholde op til 16 strengværdier, nøgler op til 64 tegn og værdier op til 512.

Svaret er almindeligt chat.completionMed omkostningerne i usage.cost (i dollars) og i nymbot Et objekt . model er den løste model id, så et kort navn kommer tilbage som den fulde. message.reasoning_contentadskilt fra svaret.

Svaret

{
  "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 er udarbejdet ud fra, hvad der kom tilbage, da udbydere rapporterer det anderledes: tool_calls Når man har brug for værktøjer, length når svaret brugte hver tilladte token (eller modellen brugte dem alle begrundelse og skrev ingen svar), content_filter Hvis udbyderen afviser, og stop Ellers er det. usage.completion_tokens_details.reasoning_tokens er altid 0: skjulte ræsonnement tokens tælles, og opkræves, i completion_tokens.

Status erNår
400Nej ikke model eller messages (missing_required_parameter); en lyd eller fil del, eller billeder for en model, der ikke kan se dem (unsupported_content); mere end 20 billeder (too_many_images); en stikprøveparameter af den forkerte type eller ud af rækkevidde (invalid_value); et link, der ikke er offentligt tilgængeligt (invalid_image_url); værktøjer på en model, der ikke kan kalde dem (unsupported_tool); n andet end 1; a :thinking en fornemmelse af, at der ikke er tale om en fornemmelse (model_not_found); eller leverandøren afviste anmodningen (upstream_rejected).
402Den balance, som modellen bruger, kan ikke dække holdet.
403Det værste tilfælde passer ikke til nøgleens cap (key_limit_reached• Lavere max_tokens Eller hæve hovedet.
404Ingen model med dette navn (model_not_found).
429Den pågældende udbyder eller udbyder (upstream_rate_limited).
502, 503Leverandøren har undladt (upstream_error) eller er overbelastet (upstream_overloaded, med Retry-AfterIntet opkræves, medmindre udbyderen har faktureret for forsøget.

Statuskoderne for hver endpoint aktie er angivet under Fejl.

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

Streaming af

med "stream": true svaret kommer som server-sendte begivenheder, mens modellen skriver det. chat.completion.chunk er a data: linje, og strømmen slutter med data: [DONE]Fornuft kommer ind i delta.reasoning_contentSvaret er i delta.content.

Stream noget, der kan tage mere end ca. 100 sekunder, f.eks. et langt svar, et stort max_tokens En anmodning, der ikke streames, sender ikke noget, før svaret er færdigt, og netværket mellem dig og Nymbot kan lukke en tom forbindelse efter ca. 100 sekunder; modellen er stadig færdig, og det, den skrev, oplades, men svaret er tabt.

strømmen

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]
  • Linjer, der starter med : er live-kommentarer, der sendes hvert 15. sekund, mens modellen tænker.
  • Spørg om "stream_options": {"include_usage": true} for at få det sidste stykke ovenfor, med et tomt choices, token tæller, omkostningerne og nymbot Et objekt .
  • Hvis du lukker forbindelsen tidligt, stopper modellen ikke: Nymbot læser resten af udbyderens strøm, i op til 25 sekunder, for at få sit tokental, og du betaler, hvad udbyderen rapporterer.
  • En fejl før den første chunk, såsom 401 eller 402, kommer tilbage som almindelig JSON med sin statuskode, ikke som en stream. data: {"error": {…}} begivenhed, og strømmen slutter uden [DONE].
  • Anmodninger med værktøjer, og modeller på OpenAI's Responses transport, strømmer ikke fra udbyderen.

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);
}

Værktøj til opkald

Beskriv funktionerne i tools og modellen kan bede om, at man ringer i stedet for at svare. Du kører funktionen, tilføjer dens resultat som en tool En besked med samme tool_call_idNymbot kører aldrig dine funktioner; det sender modelens anmodning tilbage til dig.

tool_choice tager "auto", "none", "required" eller {"type": "function", "function": {"name": "…"}}Modellen liste markerer, hvilke modeller kan kalde værktøjer (capabilities.toolsVærktøjer afvises med 400 unsupported_tool er nymbot/auto og på de få katalogmodeller, der kører på OpenAI's Responses transport, som Nymbot ikke kan passere værktøjer til.

med "stream": true, en anmodning med værktøjer kører i et stykke og sendes derefter som en normal chunk sekvens: rollen, en chunk bærer hvert værktøj opkald med dets indeks, id, navn og argumenter, og finish chunk.

Svaret er delvist

"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);

Billeder i en anmodning

Modeller med capabilities.vision Du kan læse billeder. Tilføj en image_url dele til en brugerbesked, med enten et publikum https:// Link eller A data:image/…;base64, URL. Op til 20 billeder pr. anmodning. SVG-billeder afvises, og så er et link over 4 096 tegn eller en med et brugernavn eller en adgangskode i den (400 invalid_image_urlEt valgfrit detail er auto, low eller high.

med nymbot/auto, en forespørgsel med et billede i den bliver rettet til en standardmodel, der kan se. capabilities.vision Afviser billeder med 400 unsupported_contentBilleder kan kun være i brugerbeskeder.En link skal pege til en offentlig vært; Nymbot videregiver billedet til modelens udbyder og gemmer det ikke.

Et billede opkræves som de input tokens, som udbyderen tæller for det, ligesom resten af anmodningen.

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

begrundelse

Modeller med capabilities.reasoning kan tænke, før de svarer. spørg om mere eller mindre af det med reasoning_effort ("minimal", "low", "medium" eller "high") eller "reasoning": {"effort": "high"}Eller tilføje :thinking modellenavnet, hvilket betyder høj indsats. På en model uden begrundelse ignoreres indstillingen. nymbot/auto, :thinking sender anmodningen til den standardiserede rute.

På Anthropic-modellerne bliver indsatsen et tankebudget på omkring 1.000, 2.000, 8.000 eller 16.000 tokens, aldrig mere end max_tokens Tænk, tænk, tænk, når der er tool_choice Når forespørgslen fortsætter med en værktøjsloop (det sidste budskab er et værktøjsresultat), fordi Anthropic har brug for den tidligere underskrevne tænkning for at genoptage den.

Argumentationen vender tilbage til message.reasoning_contenteller delta.reasoning_content når streaming, aldrig blandet ind i svaret. begrundelse er output og opkræves som sådan, inde i completion_tokensNogle udbydere returnerer ikke begrundelsesteksten overhovedet, og den opkræves stadig.

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

Modeller af suffixes

Et suffix på modelnavnet ændrer, hvordan anmodningen håndteres, uden et andet felt. anthropic/claude-sonnet-5:online.

TilstrækkeligtEffekt
:onlineSøg på internettet først, som plugins: [{"id": "web"}]Se det Websøgning.
:thinkingHøj resonansindsats; på nymbot/autoPå en model, der ikke kan begrunde, 400 model_not_found med “ ingen slutpunkter fundet”.
:nitro, :floor, :exacto, :extendedHver katalogmodel har en rute, så der er ingen hurtigere, billigere eller længere at vælge; efterfølgerne er tilladt, så modelnavne kopieret fra andre tjenester stadig fungerer.

Enhver anden efterfølger ignoreres. Det fulde navn prøves først, så en model, hvis id virkelig indeholder en kolon, stadig fungerer; hvis ikke, bliver efterfølgerne fjernet fra slutningen en ad gangen, indtil en model matcher. 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);

Nymbot søger efter den sidste brugerbesked (deres første 2.000 tegn), læser de bedste sider og giver dem til modellen med spørgsmålet, markeret som eksternt indhold modellen ikke bør tage instruktioner fra.

  • Søger altid: "plugins": [{"id": "web", "max_results": 5}]eller a :online suffix på modellen.
  • Søg når det hjælper: "tools": [{"type": "web_search", "parameters": {"max_results": 5}}]Også accepteret som web_search_preview eller openrouter:web_searchNymbot søger kun, når spørgsmålet ser ud til, at det har brug for aktuelle oplysninger, det samme test, som appen bruger.

max_results er 5 som standard og højst 10. Kilderne kommer tilbage i nymbot.web_search.sourcesHver med et title, snippet og urlOg som url_citation Noter på budskabet.

Hver søgning, der kører, koster $ 0,008, konverteret til sats, på toppen af tokenerne, og det er en del af holdet.

Svaret er delvist

"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);

Besvarelse af API

OpenAI's nyere format, der anvendes af OpenAI Agents SDK og af Codex. Det kører på de samme modeller, fakturering og funktioner som Chat Completions.

POST https://nymbot.ai/api/v1/responses Det kræver en API-nøgle.

FeltetType afKrævesBeskrivelse af
modelStrengeJaSom for Chat færdiggørelseSupplementer er inkluderet.
inputString eller arrayJaEn streng eller en liste over elementer: meddelelser (roller user, assistant, system, developer) med input_text, input_image og output_text dele, og function_call og function_call_output Materialer til værktøjer. input_image tager en image_url link eller data-URL, ikke et fil-id. reasoning og web_search_call genstande er overskygget; item_reference er blevet afvist.
instructionsStrengeNej ikkeSystemets instruktioner .
max_output_tokensIntegerNej ikkeDe fleste tokens at skrive.
temperature
top_p
NummeretNej ikkeSampling kontroller, hvor modellen tager dem.
tools
tool_choice
parallel_tool_calls
Array, String eller Object, BooleanNej ikkeFunktionsværktøjer, i form af Responses ({"type": "function", "name": …, "parameters": …}) a web_search eller web_search_preview Værktøjet bliver til Websøgning Når det hjælper, afvises andre indbyggede værktøjer.
reasoningObjektetNej ikke{"effort": "minimal" | "low" | "medium" | "high"}. xhigh og max betyder high; none Gør det af.
text.format
response_format
ObjektetNej ikkeStruktureret output, som et JSON-schema eller json_object.
metadataObjektetNej ikkeReturneret uændret i svaret Ved højst 16 strengværdier, nøgler op til 64 tegn og værdier op til 512.
streamBooleanskNej ikkeStream begivenheder som beskrevet nedenfor.
storeBooleanskNej ikkeIntet gemmes, og svaret siger altid "store": false.
previous_response_id
conversation
background
String, Objekt og BooleanNej ikkeIkke støttet af: 400 unsupported_parameterSvar gemmes ikke, så send hele samtalen til input Hver gang .

Svaret

{
  "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 }
}

En værktøjsanmodning vises i output som a function_call Punkt med call_id, name og argumentsSend resultatet tilbage som a function_call_output Et emne med samme call_idReasoning, når modellen returnerer det, er en reasoning Punkt med reasoning_text Indholdet er opført først. status er incomplete Når svaret rammer max_output_tokens eller afviste leverandøren, med incomplete_details.reason Sæt to max_output_tokens eller content_filterSvaret afspejler også anmodningens indstillinger (temperatur, værktøj, værktøjsvalg og så videre), som OpenAI gør, og bærer nymbot Omkostningerne ved objektet.

Streamed, hver begivenhed er en event: linje og a data: linje med a sequence_numberI denne rækkefølge: response.created, response.in_progress, response.output_item.added, response.content_part.addedEt hvilket som helst antal response.output_text.delta, response.output_text.done, response.content_part.done, response.output_item.doneOg endelig response.completed med brug og omkostninger. Et svar skærer korte ender med response.incomplete i stedet, og et fiasko efter strømmen begyndte med response.failedRationalisere strømme som sit eget emne med response.reasoning_text.delta og .doneVærktøjsopkald kommer efter meddelelsen, hver som et element med response.function_call_arguments.delta og .done.

Status erNår
400Nej ikke model eller input; previous_response_id, conversation, background eller en item_reference (unsupported_parameterEt værktøj eller en indholdstype, der ikke understøttes.
402, 403, 404, 429, 502, 503Hvad angår chat færdiggørelse.

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

Antropiske budskaber

Det fungerer med alle modeller i kataloget, ikke kun Claude: anmodningen oversættes, kører gennem samme rørledning og oversættes tilbage.

POST https://nymbot.ai/api/v1/messages - har brug for en API-nøgle, som x-api-key eller Authorization: Bearer.

Den anthropic-version og anthropic-beta Antropiske modelnavne matches med kataloget, så Claude Code og SDK'erne arbejder med de navne, de allerede bruger:

  • Et navn, som kataloget kender, såsom claude-sonnet-5 eller anthropic/claude-opus-5Den bruges som den er.
  • Hvis der er en dato (-20260514), -latestEn version som -v1En brækkede dag som [1m] og en anthropic/ eller anthropic. Derudover er det også muligt at udskifte og udskifte de forskellige former for udskifter i begge versioner (claude-haiku-4-5 Findes claude-haiku-4.5).
  • Hvis det stadig ikke matcher noget, anvendes familien (Opus, Sonnet eller Haiku), så længe katalogets version er den samme eller nyere end den, der blev anmodet om.
  • Et navn, der ikke matcher noget, returnerer 404 not_found_error.
FeltetType afKrævesBeskrivelse af
modelStrengeJaEt katalogmodellid eller et antropisk modelnavn.
max_tokensIntegerJaDe fleste tokens at skrive.
messagesArrayJauser og assistant Turnering, med text, image (base64 eller URL kilde) tool_use og tool_result af blokke. thinking Blokke fra tidligere omgange accepteres og droppes.
systemString eller arrayNej ikkeSystem prompt, som en streng eller tekst blokke.
temperature
top_p
NummeretNej ikkeSampling kontroller, hvor modellen tager dem. top_k Det er accepteret og droppet.
stop_sequencesArray af stringsNej ikkeTekst, der slutter svaret. I højst 4 strenge, hver højst 256 tegn.
tools
tool_choice
Array og ObjectNej ikkeVærktøjer med name, description og input_schemaa) a web_search Serverværktøjet bliver til WebsøgningAnthropics andre indbyggede værktøjer (bash, teksteditor, computerbrug) afvises med unsupported_tool. tool_choice tager auto, any, tool eller noneog disable_parallel_tool_use.
thinkingObjektetNej ikke{"type": "enabled", "budget_tokens": 8192}, {"type": "adaptive"} eller {"type": "disabled"}Budgettet vælger et indsatsniveau: under 2.048 minimum, fra 2.048 lavt, fra 8.192 medium, fra 16.384 højt. output_config.effortEller høj.
streamBooleanskNej ikkeStream i Anthropics begivenhedsformat.
metadataObjektetNej ikkeAccepteret og ignoreret.

Svaret

{
  "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 Kan også holde tool_use Blokke og a thinking Blok, hvis signature Den er tom. stop_reason er end_turn, max_tokens, tool_use eller refusalArbejdede på samme måde som finish_reason er Chat færdiggørelse; stop_sequence er altid nullSelv når en stop sekvens afsluttede svaret. input_tokens tæller kun friske input; cachede input er i de to cachefelter. nymbot Objektet og den X-Nymbot-Cost-Sats af Header.

Streamed, begivenhederne er Anthropic's: message_start, content_block_start, ping, content_block_delta (text_delta, input_json_delta eller thinking_delta), content_block_stop, message_delta med hensyn til årsagen, brugen og nymbot omkostninger, og message_stopa) a ping sendes også hvert 15. sekund, mens modellen arbejder. Værktøjsopkald ankommer efter teksten, hver som en tool_use Blok med hele sin input i en input_json_delta.

Fejl på dette endpoint bruger Anthropics format: {"type": "error", "error": {"type": "not_found_error", "message": "…"}}En kort balance er 402 billing_errorEn overbelastet udbyder 503 overloaded_errorEn fejl, når strømmen er startet, sendes som en error begivenhed .

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

Tælling af tokens

En estimat af, hvor mange input tokens en meddelelsesforespørgsel ville bruge, så en klient kan tjekke, før den sender.

POST https://nymbot.ai/api/v1/messages/count_tokens Du har brug for en API-nøgle.

Kroppen er den samme som Meddelelseruden at max_tokens; modelnavnet skal løse. Tællingen er en estimering: tegnene i systemopfordringen, meddelelser, værktøjsopkald og værktøjsdefinitioner divideret med fire, plus 1,600 for hvert billede. Det er ikke udbyderens egen tokenizer, så det faktiske tal kan variere.

Svaret

{ "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);

Listen over modeller

Hver model og generator, som API accepterer, med hvad det koster.Listen læses fra den samme live-katalog som appens picker, så det er altid, hvad serveren vil køre.

GET https://nymbot.ai/api/v1/models - Ingen nøgle nødvendig. skjult i fem minutter.

GET /api/v1/models/{id} Returnerer en indgang.

FeltetType afKrævesBeskrivelse af
typeString (Kørsel)Nej ikkechat (Det er et underskud) image, video, audio, embedding eller allDer kan gives flere, som image,video.

Priser er, hvad du betaler, med gebyr og margin allerede i, i dollars og i sats til den nuværende Bitcoin pris. balance Det angiver, hvilken balance modellen bruger. nymbot_key er modelens korte navn i appen. created er altid 0, da kataloget ikke registrerer, hvornår en model blev tilføjet. per_request i stedet.

nymbot/auto er altid først, prissat som variable, med en routes Listen giver hver standard rute priser. Det lister vision og begrundelse, men ikke værktøjer.

GET /api/v1/models/{id} accepterer de samme navne og aliaser som en anmodning, og returnerer posten for den model, de beslutter sig for.

Svaret

{
  "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"
    }
  ]
}

De andre typer:

  • Billede Entréerne har capabilities (accepts_image_url, requires_image_url, edit) og en pris per_generation.
  • Videoer Entréerne har max_duration_seconds og resolutionsOg en pris per_second for hver enkelt beslutning.
  • Audio af Entréerne har audio_type speech eller transcriptionPrisen er per_1k_chars eller per_minute.
  • Indlejring Entréerne har dimensions, context_length, max_inputs Prisen er pr. million input tokens.

Priser mærket "estimated": true er app’s estimat for en generator, hvis pris ikke offentliggøres. type Tilbage 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);