Gå til innholdet
Tilbake til Nymbot

Kunnskapsgrunnlag Utviklere

Chat, svar og meldinger

Tre måter å spørre en modell noe, i de tre formatene kundene allerede snakker, alle kjører på de samme modellene og fakturert på samme måte.

Chat fullføringer

OpenAI chat-formatet, og det som nesten alle verktøy støtter. Send samtalen så langt og få neste melding tilbake.

POST https://nymbot.ai/api/v1/chat/completions Trenger en API-nøkkel

Bare model og messages En samplingsparameter som den valgte modellen ikke tar faller uten en feil, slik at en forespørsel kropp fungerer på tvers av modeller. supported_parametersDet som blir avvist i stedet for kastet er noe som modellen ikke kan gjøre i det hele tatt: bilder for en modell som ikke kan se, verktøy for en modell som ikke kan ringe dem.

FeltetTypenKrevdeBeskrivelse
modelStrengeJanymbot/auto (eller auto) for Nymbots ruting på standardbalansen, eller en katalogmodell id som anthropic/claude-sonnet-5 på Pro-balansen. Appens korte navn og aliaser aksepteres også. Tilstrekkelig.
messagesArrayJaSamtaler - roller system, developer (behandlet som et system) user, assistant og toolInnhold er en streng eller en liste over text og image_url deler; bilder bare i brukermeldinger. input_audio Noen filer blir avvist.
streamBooleanskNeiSend svaret slik det er skrevet.Se Streaming av.
stream_optionsObjektetNei{"include_usage": true} legger til et siste stykke med token teller og kostnadene.
max_tokens
max_completion_tokens
IntegrertNeiDe fleste tokens å skrive. Senket til modellens maksimum hvis høyere. Angir også hvor mye som holdes fra saldoen din, så et mindre antall trenger mindre kreditt for å starte.
temperature
top_p
AntallNeiSampling av kontroller: temperature fra 0 til 2, top_p Fra 0 til 1.
stopString eller arrayNeiTekst som slutter svaret: en streng eller maksimalt 4 strenger, hver med maksimalt 256 tegn. nymbot/auto.
seedIntegrertNeiTil repeterbar sampling, der modellen støtter den.
presence_penalty
frequency_penalty
AntallNeiGjenta kontroller, hver fra -2 til 2.
response_formatObjektetNei{"type": "json_object"} eller {"type": "json_schema", "json_schema": {…}}, der modellen støtter den. Ikke brukt av nymbot/auto.
tools
tool_choice
parallel_tool_calls
Array, String eller Object, BooleanNeiFunksjonell oppfordring. se Verktøy for å ringe• A web_search Verktøyet blir WEB SøkPå maksimalt 128 verktøy og 512 KB av definisjoner, nestet på maksimalt 64 nivåer dyp; mer er en 400.
reasoning_effort
reasoning
Streng, gjenstandNei"minimal", "low", "medium" eller "high"eller {"effort": "high"}. "none" eller {"enabled": false} Slå den av. se begrunnelse.
pluginsArrayNei[{"id": "web", "max_results": 5}] alltid søker på nettet først. Opptil 10 resultater.
nIntegrertNei1 - Alt annet kommer tilbake 400.
logit_bias
user
metadata
String, String og ObjectNeiGodkjent og ikke sendt videre. logit_bias kart på maksimalt 300 token ids til tall fra -100 til 100; user Maksimalt 256 tegn metadata holder opptil 16 strengverdier, nøkler opptil 64 tegn og verdier opptil 512.

Svaret er vanlig chat.completionMed kostnadene i usage.cost (i dollar) og i nymbot og objekt. model er den løste modell id, så et kort navn kommer tilbake som den fullstendige. message.reasoning_contentSeparert 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 utarbeidet fra det som kom tilbake, siden leverandørene rapporterer det annerledes: tool_calls Når man ber om verktøy, length når svaret brukte hver token tillatt (eller modellen brukte dem alle resonnement og skrev ingen svar), content_filter Når leverandøren avviser, og stop Ellers altså. usage.completion_tokens_details.reasoning_tokens er alltid 0: skjulte resonnement tokens telles, og belastes, i completion_tokens.

StatusNår
400Nei model eller messages (missing_required_parameter); en lyd eller fil del, eller bilder for en modell som ikke kan se dem (unsupported_contentmer enn 20 bilder (too_many_images); en prøveparameter av feil type eller ute av rekkevidde (invalid_value); et bilde link som ikke er offentlig (invalid_image_url); verktøy på en modell som ikke kan kalle dem (unsupported_tool); n annet enn 1; a :thinking For eksempel er det ikke mulig å forklare noe som ikke kan forklare noe som helst (model_not_found(eller leverandøren avviste forespørselen)upstream_rejected).
402Saldoen som modellen bruker, kan ikke dekke holdet.
403I verste fall passer ikke nøkkelens kappe (key_limit_reached• Lavere max_tokens Eller heve hodet.
404Ingen modell med dette navnet (model_not_found).
429Nøkkelens rentegrense, eller leverandørens (upstream_rate_limited).
502, 503Leverandøren mislyktes (upstream_erroreller er overbelastet (upstream_overloaded, med Retry-AfterIngenting er belastet med mindre leverandøren fakturert for forsøket.

Statuskodene for hver endpoint-aksje er oppført under Feilene.

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

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

Stream alt som kan ta mer enn ca. 100 sekunder, for eksempel et langt svar, en stor max_tokens En forespørsel som ikke strømmes, sender ikke noe før svaret er fullført, og nettverket mellom deg og Nymbot kan stenge en tom forbindelse etter ca 100 sekunder; modellen er fortsatt ferdig og det den skrev er ladet, men svaret er tapt.

Stream

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 som begynner med : er hold-live kommentarer, sendt hver 15 sekunder mens modellen tenker.
  • Be om "stream_options": {"include_usage": true} for å få det siste stykket ovenfor, med en tom choices, token teller, kostnadene og nymbot og objekt.
  • Hvis du lukker forbindelsen tidlig, stopper ikke modellen: Nymbot leser resten av leverandørens strøm, i opptil 25 sekunder, for å få sin token telle, og du betaler hva leverandøren rapporterer.
  • En feil før det første stykket, for eksempel 401 eller 402, kommer tilbake som vanlig JSON med sin statuskode, ikke som en strøm. data: {"error": {…}} begivenhet, og strømmen slutter uten [DONE].
  • Forespørsler med verktøy, og modeller på OpenAI's Responses transport, strømmer ikke fra leverandøren.

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

Verktøy for å ringe

Beskriv funksjonene i tools og modellen kan be om at man ringer i stedet for å svare.Du kjører funksjonen og legger til resultatet som en tool Budskap med samme tool_call_idNymbot kjører aldri dine funksjoner; det overfører modellens forespørsel tilbake til deg.

tool_choice tar "auto", "none", "required" eller {"type": "function", "function": {"name": "…"}}Modelllisten markerer hvilke modeller som kan ringe verktøy (capabilities.toolsVerktøyene blir avvist med 400 unsupported_tool er nymbot/auto og på de få katalogmodellene som kjører på OpenAIs Responses transport, som Nymbot ikke kan passere verktøy til.

med "stream": true, en forespørsel med verktøy kjører i ett stykke og sendes deretter som en normal chunk-sekvens: rollen, en chunk som bærer hvert verktøykall med sitt indeks, id, navn og argumenter, og finish-stykket.

Svaret er delvis

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

Bilder i forespørsel

Modeller med capabilities.vision kan lese bilder. Legg til en image_url del til en brukermelding, med enten et publikum https:// Link eller a data:image/…;base64, URL. Opptil 20 bilder per forespørsel. SVG bilder er avvist, og så er en kobling over 4 096 tegn eller en med brukernavn eller passord i den (400 invalid_image_urlEt valgfritt detail er auto, low eller high.

med nymbot/auto, en forespørsel med et bilde i den blir rutet til en standardmodell som kan se. capabilities.vision Avviser bilder med 400 unsupported_contentEn kobling må peke til en offentlig vert; Nymbot overfører bildet til modellens leverandør og beholder det ikke.

Et bilde belastes som input tokens leverandøren teller for det, som resten av forespørselen.

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

begrunnelse

Modeller med capabilities.reasoning kan tenke før de svarer. be om mer eller mindre av det med reasoning_effort ("minimal", "low", "medium" eller "high") eller "reasoning": {"effort": "high"}eller legge til :thinking til modellnavnet, som betyr høy innsats. På en modell uten begrunnelse blir innstillingen ignorert. nymbot/auto, :thinking sender forespørselen til standard resonnement rute.

På antropiske modeller blir innsatsen et tankebudsjett på rundt 1000, 2 000, 8 000 eller 16 000 tokens, aldri mer enn max_tokens Å tenke er å forlate når tool_choice tvinger et verktøy, og når forespørselen fortsetter en verktøyløype (det siste meldingen er et verktøyløp), fordi Anthropic trenger den tidligere signerte tenkningen for å gjenoppta den.

Argumentasjonen kommer tilbake message.reasoning_contenteller delta.reasoning_content når strømming, aldri blandet inn i svaret. Reasoning er utgang og er belastet som sådan, innvendig completion_tokensNoen leverandører returnerer ikke resonnementstekst i det hele tatt, og det blir fortsatt belastet.

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 av suffiks

Et suffiks på modellnavnet endrer hvordan forespørselen håndteres, uten et annet felt. anthropic/claude-sonnet-5:online.

TilstrekkeligEffekt
:onlineSøk på nettet først, som plugins: [{"id": "web"}]Se også WEB Søk.
:thinkingHøy resonnement; på nymbot/autoPå en modell som ikke kan fornuft, 400 model_not_found med “no endpoints found”
:nitro, :floor, :exacto, :extendedHver katalogmodell har en rute, så det er ingen raskere, billigere eller lengre en å velge; suffiksene er tillatt slik at modellnavn kopiert fra andre tjenester fortsatt fungerer.

Enhver annen suffiks blir ignorert. Hele navnet blir prøvd først, så en modell hvis id virkelig inneholder en kolon fortsatt fungerer; hvis ikke, blir suffiksene tatt fra slutten en etter en til en modell 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øker etter den siste brukermeldingen (sine første 2000 tegn), leser de beste sidene og gir dem til modellen med spørsmålet, merket som eksternt innhold modellen ikke bør ta instruksjoner fra.

  • Alltid søk: "plugins": [{"id": "web", "max_results": 5}]eller a :online Tilstrekkelig på modellen.
  • Søk når det hjelper: "tools": [{"type": "web_search", "parameters": {"max_results": 5}}]Godkjent også som web_search_preview eller openrouter:web_searchNymbot søker bare når spørsmålet ser ut til å trenge aktuell informasjon, samme test som appen bruker.

max_results er 5 som standard og maksimalt 10. kildene kommer tilbake i nymbot.web_search.sourcesHver med en title, snippet og urlOg som url_citation Notater på meldingen.

Hver søk som kjører koster $ 0,008, konvertert til sats, på toppen av tokens, og det er en del av holdet. sidene det leser er input tokens også, så et svar fra nettet koster mer enn det samme spørsmålet spurte kaldt, noen ganger flere ganger mer.

Svaret er delvis

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

Svar fra API

OpenAI's nyere format, brukt av OpenAI Agents SDK og av Codex. Det kjører på de samme modellene, fakturering og funksjoner som Chat Completions.

POST https://nymbot.ai/api/v1/responses Trenger en API-nøkkel

FeltetTypenKrevdeBeskrivelse
modelStrengeJaSom for Chat fullføringerInkluderer også suffiks.
inputString eller arrayJaEn streng, eller en liste over elementer: meldinger (roller user, assistant, system, developer) med input_text, input_image og output_text deler, og function_call og function_call_output elementer for verktøy. input_image tar en image_url link eller data URL, ikke en fil-id. reasoning og web_search_call elementer er overskygget; item_reference er blitt avvist.
instructionsStrengeNeiInstruksjoner for system.
max_output_tokensIntegrertNeiDe fleste tokens å skrive.
temperature
top_p
AntallNeiSampling kontroller, hvor modellen tar dem.
tools
tool_choice
parallel_tool_calls
Array, String eller Object, BooleanNeiFunksjonsverktøy, i form av Responses ({"type": "function", "name": …, "parameters": …}) a web_search eller web_search_preview Verktøyet blir WEB Søk Når det hjelper, blir andre innebygde verktøy avvist.
reasoningObjektetNei{"effort": "minimal" | "low" | "medium" | "high"}. xhigh og max Betyr high; none Slå den av.
text.format
response_format
ObjektetNeiStrukturert utgang, som et JSON-skjema eller json_object.
metadataObjektetNeiReturneres uendret i svaret Ved maksimalt 16 strengverdier, nøkler opptil 64 tegn og verdier opptil 512.
streamBooleanskNeiStream hendelser som beskrevet nedenfor.
storeBooleanskNeiIgnorert: Ingenting lagres, og svaret sier alltid "store": false.
previous_response_id
conversation
background
String, Object og BooleanNeiIkke støttet: 400 unsupported_parameterSvarene lagres 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 }
}

Et verktøy for forespørsel vises i output som a function_call Poeng med call_id, name og argumentsSend resultatet tilbake som a function_call_output Artikkel med samme call_idReasoning, når modellen returnerer den, er en reasoning Poeng med reasoning_text Innhold, oppført først status er incomplete Når svaret treffer max_output_tokens Leverandøren avviser, med incomplete_details.reason Sett to max_output_tokens eller content_filterSvaret ekkoer også forespørselsinnstillingene (temperatur, verktøy, verktøyvalg og så videre) som OpenAI gjør, og bærer den nymbot Kostnad for objekt.

Streamed, hver begivenhet er en event: linje og a data: linje med a sequence_numberI denne rekkefølgen: response.created, response.in_progress, response.output_item.added, response.content_part.addedEt hvilket som helst antall response.output_text.delta, response.output_text.done, response.content_part.done, response.output_item.doneOg til slutt response.completed med bruk og kostnad. Et svar kutter korte ender med response.incomplete i stedet, og et svikt etter at strømmen startet med response.failedReasoning streams som sitt eget element med response.reasoning_text.delta og .doneVerktøykall kommer etter meldingen, hver som et element med response.function_call_arguments.delta og .done.

StatusNår
400Nei model eller input; previous_response_id, conversation, background eller en item_reference (unsupported_parameterEt verktøy eller en innholdstype som ikke støttes.
402, 403, 404, 429, 502, 503Når det gjelder chat fullføringer.

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 budskap

Det fungerer med alle modeller i katalogen, ikke bare Claude: forespørselen blir oversatt, kjørt gjennom samme rør og oversatt tilbake.

POST https://nymbot.ai/api/v1/messages - trenger en API-nøkkel, som x-api-key eller Authorization: Bearer.

Den anthropic-version og anthropic-beta Antropiske modellnavn matches med katalogen, så Claude Code og SDK-ene fungerer med navnene de allerede bruker:

  • Et navn som katalogen kjenner, slik som claude-sonnet-5 eller anthropic/claude-opus-5Den brukes som den er.
  • Hvis det er en dato (-20260514), -latestEn versjon som -v1Et bracketed tag som [1m] og en anthropic/ eller anthropic. Det er ikke mulig å bruke forhåndsinnstilling, og forhåndsinnstilling og forhåndsinnstilling kan gjøres på begge måter (claude-haiku-4-5 Finnes claude-haiku-4.5).
  • Hvis det fortsatt ikke stemmer, brukes familien (Opus, Sonnet eller Haiku), så lenge katalogversjonen er den samme eller nyere enn den som ble bedt om.
  • Et navn som ikke matcher noe returnerer 404 not_found_error.
FeltetTypenKrevdeBeskrivelse
modelStrengeJaEt katalogmodell-id, eller et antropisk modellnavn.
max_tokensIntegrertJaDe fleste tokens å skrive.
messagesArrayJauser og assistant Turneringer, med text, image (base64 eller URL kilde) tool_use og tool_result av blokkene. thinking Blokkene fra tidligere turer blir akseptert og kastet.
systemString eller arrayNeiSystem prompt, som en streng eller tekstblokker.
temperature
top_p
AntallNeiSampling kontroller, hvor modellen tar dem. top_k er akseptert og droppet.
stop_sequencesArray av stringsNeiTekst som avslutter svaret: Maksimalt 4 strenger, hver med maksimalt 256 tegn.
tools
tool_choice
Array, gjenstandNeiVerktøy med name, description og input_schema• A web_search Serververktøyet blir WEB SøkAnthropics andre innebygde verktøy (bash, tekstredigerer, datamaskinbruk) er avvist med unsupported_tool. tool_choice tar auto, any, tool eller noneog disable_parallel_tool_use.
thinkingObjektetNei{"type": "enabled", "budget_tokens": 8192}, {"type": "adaptive"} eller {"type": "disabled"}Budsjettet velger et innsatsnivå: under 2,048 minimum, fra 2,048 lavt, fra 8,192 medium, fra 16,384 høyt. output_config.effortEller høyt.
streamBooleanskNeiStream i Anthropics arrangement format.
metadataObjektetNeiGodkjent og ignorert.

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 Blokkene og a thinking Blokkering, som signature Den er tom. stop_reason er end_turn, max_tokens, tool_use eller refusalArbeidet på samme måte som finish_reason er Chat fullføringer; stop_sequence er alltid null, selv når en stop-sekvens endte svaret. input_tokens teller bare fersk input; cachede input er i de to cache-feltene. nymbot Objektet og X-Nymbot-Cost-Sats og header.

Streamed, hendelsene 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 den stopper årsaken, bruk og nymbot kostnad objekt, og message_stop• A ping sendes også hvert 15. sekund mens modellen er i drift. Verktøykall kommer etter teksten, hver som en tool_use Blokk med hele innspillingen i ett input_json_delta.

Feil på dette endepunktet bruker Anthropics format: {"type": "error", "error": {"type": "not_found_error", "message": "…"}}En kort balanse er 402 billing_errorEn overbelastet leverandør 503 overloaded_errorEn feil etter at strømmen har startet sendes som en error av hendelsen.

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

Telle tokens

En estimat av hvor mange input tokens en meldingsforespørsel ville bruke, slik at en klient kan sjekke før den sender.

POST https://nymbot.ai/api/v1/messages/count_tokens - Trenger en API nøkkel. gratis

Kroppen er den samme som MeldingerUten å max_tokens; modellnavnet må løse. Tellingen er en estimat: tegnene i systemprøven, meldinger, verktøykallinger og verktøydefinisjoner delt med fire, pluss 1,600 for hvert bilde. Det er ikke leverandørens egen tokenizer, så det virkelige tallet 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);

Liste over modeller

Hver modell og generator som API aksepterer, med hva det koster.Listen leses fra samme live katalog som appens plukker, så det er alltid hva serveren vil kjøre.

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

GET /api/v1/models/{id} Returnerer én inngang.

FeltetTypenKrevdeBeskrivelse
typeString (forespørsel)Neichat (Dette er et forsinkelse) image, video, audio, embedding eller allFlere kan brukes, som image,video.

Priser er hva du betaler, med avgiften og margin allerede i, i dollar og i satser til gjeldende Bitcoin-pris. balance Det forteller hvilken balanse modellen bruker. nymbot_key er modellens korte navn i appen. created er alltid 0, siden katalogen ikke registrerer når en modell ble lagt til. per_request i stedet.

nymbot/auto er alltid først, prissatt som variableMed a routes Det viser visjon og resonnement, men ikke verktøy.

GET /api/v1/models/{id} aksepterer de samme navnene og aliasene som en forespørsel, og returnerer oppføringen for modellen de bestemmer seg 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 typene:

  • bilde Inngangen har capabilities (accepts_image_url, requires_image_url, edit) og en pris per_generation.
  • Videoer Inngangen har max_duration_seconds og resolutionsOg en pris per_second for hver av resolusjonene.
  • - Audio Inngangen har audio_type speech eller transcriptionPrisen er per_1k_chars eller per_minute.
  • Embedded Inngangen har dimensions, context_length, max_inputs Og en pris per million input tokens.

Priser merket "estimated": true er appens estimat for en generator hvis pris ikke er publisert. type Tilbake 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);