Hoppa till innehållet
Tillbaka till Nymbot

Kunskapsbas Utvecklare

Chat, svar och meddelanden

Tre sätt att fråga en modell något, i de tre format som klienterna redan talar, alla körs på samma modeller och faktureras på samma sätt.

Chat kompletterar

OpenAI chattformat, och det som nästan alla verktyg stöder. Skicka konversationen så långt och få nästa meddelande tillbaka.

POST https://nymbot.ai/api/v1/chat/completions Behöver en API nyckel.

Endast model och messages En provtagningsparameter som den valda modellen inte tar droppas utan ett fel, så en begäran kropp fungerar över modeller. supported_parametersVad som avvisas snarare än droppas är något som modellen inte kan göra alls: bilder för en modell som inte kan se, verktyg för en modell som inte kan ringa dem.

fältetTyp avnödvändigtBeskrivning
modelSträngarJanymbot/auto (eller auto) för Nymbots routing på standardbalansen, eller en katalogmodell-id som anthropic/claude-sonnet-5 på Pro-balansen. Appens korta namn och alias accepteras också. tillräckligt.
messagesArrayJaSamtal - roller system, developer (behandlas som ett system) user, assistant och toolInnehåll är en sträng eller en lista över text och image_url delar; bilder endast i användarmeddelanden. input_audio och fildelar avvisas.
streamBooleanskaNejSkicka svaret som det är skrivet.Se Streaming är.
stream_optionsObjektetNej{"include_usage": true} lägger till en sista bit med token räkningar och kostnaden.
max_tokens
max_completion_tokens
integerNejDe flesta tokens att skriva. Sänkt till modellens max om högre. Anger också hur mycket som hålls från din balans, så ett mindre antal behöver mindre kredit för att starta.
temperature
top_p
AntaletNejSampling av kontroller: temperature från 0 till 2, top_p Från 0 till 1.
stopString eller arrayNejText som avslutar svaret: en sträng eller högst 4 strängar, var och en högst 256 tecken. nymbot/auto.
seedintegerNejFör repeterbar provtagning, där modellen stöder den.
presence_penalty
frequency_penalty
AntaletNejUpprepa kontrollerna, var och en från -2 till 2.
response_formatObjektetNej{"type": "json_object"} eller {"type": "json_schema", "json_schema": {…}}där modellen stöder den. Används inte av nymbot/auto.
tools
tool_choice
parallel_tool_calls
array, sträng eller objekt, booleanNejFunktion att ringa. se Verktyg för samtaloch a web_search Verktyget vänder sig WebbsökningPå högst 128 verktyg och 512 KB av definitioner, inbäddade på högst 64 nivåer djup; mer är en 400.
reasoning_effort
reasoning
sträng, föremålNej"minimal", "low", "medium" eller "high"eller {"effort": "high"}. "none" eller {"enabled": false} Stäng av den. se Argumentera.
pluginsArrayNej[{"id": "web", "max_results": 5}] alltid söker på webben först. upp till 10 resultat.
nintegerNejAvsnitt 1 - Allt annat kommer tillbaka 400.
logit_bias
user
metadata
String, String och ObjectNejGodkänd och inte skickad. logit_bias kartor på högst 300 token-id till nummer från -100 till 100; user är högst 256 tecken; metadata Håller upp till 16 strängvärden, nycklar upp till 64 tecken och värden upp till 512.

Svaret är ett vanligt chat.completionMed kostnaden i usage.cost (i dollar) och i nymbot och objekt. model är den lösta modellen id, så ett kort namn kommer tillbaka som den fullständiga. message.reasoning_contentskiljer sig från svaret.

svarar

{
  "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 är utarbetad från vad som kom tillbaka, eftersom leverantörer rapporterar det annorlunda: tool_calls När man frågar efter verktyg, length när svaret använde varje tillåten token (eller modellen spenderade dem alla resonerar och skrev inget svar), content_filter när leverantören vägrar, och stop Annars alltså. usage.completion_tokens_details.reasoning_tokens är alltid 0: dolda resonemang tokens räknas, och debiteras, i completion_tokens.

statusenNär
400Nej model eller messages (missing_required_parameter); en ljud- eller fildel eller bilder för en modell som inte kan se dem (unsupported_content); mer än 20 bilder (too_many_images); en provtagningsparameter av fel typ eller utanför intervallet (invalid_value); en bild länk som inte är offentlig (invalid_image_url); verktyg på en modell som inte kan kalla dem (unsupported_tool); n annat än 1; a :thinking ett argument som inte kan motiveras (model_not_found) eller leverantören avvisade begäran (upstream_rejected).
402Balansen som modellen spenderar kan inte täcka innehavet.
403Det värsta fallet passar inte nyckelns lock (key_limit_reached) lägre max_tokens Eller höja huvudet.
404Ingen modell med det namnet (model_not_found).
429Tillhandahålls av leverantören eller leverantören (upstream_rate_limited).
502, 503Leverantören har misslyckats (upstream_error) eller är överbelastad (upstream_overloaded, med Retry-AfterInget debiteras om inte leverantören faktureras för försöket.

Statuskoderna för varje endpoint aktier är listade under misstag.

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 är

med "stream": true Svaret kommer som en server-sänd händelse medan modellen skriver det. chat.completion.chunk är a data: linje, och strömmen slutar med data: [DONE]Förnuftet kommer in i delta.reasoning_contentSvaret i delta.content.

Streama allt som kan ta mer än cirka 100 sekunder, till exempel ett långt svar, en stor max_tokens En begäran som inte streamas skickar ingenting tills svaret är komplett, och nätverket mellan dig och Nymbot kan stänga en tom anslutning efter ca 100 sekunder; modellen är fortfarande klar och vad den skrev laddas, men svaret är förlorat.

strömma

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 börjar med : är levande kommentarer, skickas var 15: e sekund medan modellen tänker.
  • fråga för "stream_options": {"include_usage": true} för att få den sista delen ovanför, med en tom choices, token räknas, kostnaden och den nymbot och objekt.
  • Om du stänger anslutningen tidigt stoppas inte modellen: Nymbot läser resten av leverantörens ström, i upp till 25 sekunder, för att få sitt tokental, och du betalar vad leverantören rapporterar.
  • Ett misstag före den första delen, till exempel 401 eller 402, kommer tillbaka som vanlig JSON med sin statuskod, inte som en ström. data: {"error": {…}} händelse, och strömmen slutar utan [DONE].
  • Förfrågningar med verktyg och modeller på OpenAI:s Responses-transport strömmar inte från leverantören.De svarar fortfarande med en giltig ström, skickad när svaret är komplett.

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

Verktyg för samtal

Beskriv funktionerna i tools och modellen kan be om ett samtal i stället för att svara. Du kör funktionen och lägger till resultatet som ett tool Ett meddelande med samma tool_call_idNymbot kör aldrig dina funktioner; det skickar modellens begäran tillbaka till dig.

tool_choice tar "auto", "none", "required" eller {"type": "function", "function": {"name": "…"}}Modellistan markerar vilka modeller som kan ringa verktyg (capabilities.tools) Verktyg avvisas med 400 unsupported_tool är nymbot/auto och på de få katalogmodeller som körs på OpenAI: s Responses transport, som Nymbot inte kan passera verktyg till.

med "stream": true, en begäran med verktyg körs i ett stycke och skickas sedan som en normal chunk-sekvens: rollen, en chunk som bär varje verktygsamtal med dess index, id, namn och argument och slutpunkten.

Svaret är 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 en begäran

Modeller med capabilities.vision kan läsa bilder. Lägg till en image_url del till ett användarmeddelande, med antingen en publik https:// Länk eller a data:image/…;base64, URL. Upp till 20 bilder per begäran SVG bilder nekas, och så är en länk över 4 096 tecken eller en med ett användarnamn eller lösenord i den (400 invalid_image_url) ett valfritt detail är auto, low eller high.

med nymbot/autoEn begäran med en bild i den omdirigeras till en standardmodell som kan ses. capabilities.vision Avvisa bilder med 400 unsupported_contentEn länk måste peka på en offentlig värd; Nymbot skickar bilden till modellens leverantör och behåller den inte.

En bild debiteras som de input tokens leverantören räknar för det, som resten av begäran.

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

Förnuft

Modeller med capabilities.reasoning kan tänka innan de svarar. be om mer eller mindre av det med reasoning_effort ("minimal", "low", "medium" eller "high") eller "reasoning": {"effort": "high"}eller lägga till :thinking till modellnamnet, vilket betyder hög ansträngning. På en modell utan resonemang ignoreras inställningen. nymbot/auto, :thinking skickar begäran till standardvägledningen.

På Anthropic-modeller blir ansträngningen en tänkande budget på cirka 1 000, 2 000, 8 000 eller 16 000 tokens, aldrig mer än max_tokens tillåter. tänkandet lämnas av när tool_choice tvingar ett verktyg, och när begäran fortsätter ett verktygslopp (det sista meddelandet är ett verktygsresultat), eftersom Anthropic behöver det tidigare signerade tänkandet för att återuppta det.

Resonemanget kommer tillbaka i message.reasoning_contenteller delta.reasoning_content när strömma, aldrig blandas i svaret. Rationering är utgång och laddas som sådan, inuti completion_tokensVissa leverantörer returnerar inte resonemangstexten alls, och den debiteras fortfarande.

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

Typ av suffix

Ett tillägg på modellnamnet ändrar hur begäran hanteras, utan ett annat fält. De fungerar på fullständiga ids och korta namn lika, som i anthropic/claude-sonnet-5:online.

tillräckligtEffekt
:onlineSök på webben först, som plugins: [{"id": "web"}]och se Webbsökning.
:thinkingHögt resonemang; på nymbot/autoPå en modell som inte kan förneka, 400 model_not_found med “no endpoints found”.
:nitro, :floor, :exacto, :extendedVarje katalogmodell har en väg, så det finns ingen snabbare, billigare eller längre att välja; efterföljarna är tillåtna så att modellnamn kopierade från andra tjänster fortfarande fungerar.

Alla andra efterföljare ignoreras. Hela namnet prövas först, så en modell vars id verkligen innehåller en kolon fungerar fortfarande; om inte, efterföljare tas bort från änden en i taget tills en modell matchar. 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 efter det senaste användarmeddelandet (sitt första 2000 tecken), läser de bästa sidorna och ger dem till modellen med frågan, märkt som yttre innehåll som modellen inte ska ta instruktioner från.

  • Alltid söka: "plugins": [{"id": "web", "max_results": 5}]eller a :online tillräckligt på modellen.
  • Sök när det hjälper: "tools": [{"type": "web_search", "parameters": {"max_results": 5}}]Även accepterat som web_search_preview eller openrouter:web_searchNymbot söker bara när frågan verkar behöva aktuell information, samma test som appen använder.

max_results är 5 som standard och högst 10. källorna återkommer i nymbot.web_search.sourcesVar och en med en title, snippet och urloch som url_citation anteckningar på meddelandet.

Varje sökning som kör kostar $ 0,008, omvandlas till sats, på toppen av tokens, och det är en del av hållet.Sidorna det läser är input tokens också, så ett svar från webben kostar mer än samma fråga kallt, ibland flera gånger mer.

Svaret är 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 från API

OpenAI:s nyare format, som används av OpenAI Agents SDK och av Codex. Det körs på samma modeller, fakturering och funktioner som Chat Completions.

POST https://nymbot.ai/api/v1/responses Behöver en API nyckel.

fältetTyp avnödvändigtBeskrivning
modelSträngarJaSom för Chat kompletterarInkluderar även suffix.
inputString eller arrayJaEn sträng, eller en lista över objekt: meddelanden (roller user, assistant, system, developer) med input_text, input_image och output_text delar, och function_call och function_call_output föremål för verktyg. input_image tar en image_url länk eller data URL, inte en fil-id. reasoning och web_search_call Föremålen är borttappade; item_reference är vägrat .
instructionsSträngarNejSystemets instruktioner .
max_output_tokensintegerNejDe flesta tokens att skriva.
temperature
top_p
AntaletNejSampling kontroller, där modellen tar dem.
tools
tool_choice
parallel_tool_calls
array, sträng eller objekt, booleanNejFunktionsverktyg, i form av Svar ({"type": "function", "name": …, "parameters": …}) a web_search eller web_search_preview Verktyget vänder sig Webbsökning när det hjälper. Andra inbyggda verktyg nekas.
reasoningObjektetNej{"effort": "minimal" | "low" | "medium" | "high"}. xhigh och max betyder high; none Vänd den av.
text.format
response_format
ObjektetNejstrukturerad utgång, som ett JSON-schema eller json_object.
metadataObjektetNejReturneras oförändrad i svaret Vid högst 16 strängvärden, nycklar upp till 64 tecken och värden upp till 512.
streamBooleanskaNejStream händelser som beskrivs nedan.
storeBooleanskaNejIgnorerad. Inget lagras, och svaret säger alltid "store": false.
previous_response_id
conversation
background
String, Objekt och BooleanNejInte stöds av: 400 unsupported_parameterSvar sparas inte, så skicka hela konversationen till input Varje gång .

svarar

{
  "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 verktygsförfrågan visas i output som a function_call Punkt med call_id, name och argumentsSkicka tillbaka resultatet som a function_call_output Punkt med samma call_idRationering, när modellen returnerar den, är en reasoning Punkt med reasoning_text Innehållet listas först. status är incomplete När svaret träffar max_output_tokens eller avvisade leverantören, med incomplete_details.reason Sätt två max_output_tokens eller content_filterSvaret återspeglar också begäran inställningar (temperatur, verktyg, verktygsval och så vidare) som OpenAI gör, och bär den nymbot Kostnad för objekt.

Streamed, varje händelse är en event: linje och a data: linje med a sequence_numberi denna ordning: response.created, response.in_progress, response.output_item.added, response.content_part.addedVarje antal av response.output_text.delta, response.output_text.done, response.content_part.done, response.output_item.doneoch slutligen response.completed med användning och kostnad. Ett svar skära kort slut med response.incomplete istället, och ett misslyckande efter att strömmen började med response.failedRationalisera strömmar som sitt eget objekt med response.reasoning_text.delta och .doneVerktygssamtal kommer efter meddelandet, var och en som ett objekt med response.function_call_arguments.delta och .done.

statusenNär
400Nej model eller input; previous_response_id, conversation, background eller en item_reference (unsupported_parameter); ett verktyg eller en innehållstyp som inte stöds.
402, 403, 404, 429, 502, 503När det gäller chatt slutför.

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

Antropiska budskap

Det fungerar med alla modeller i katalogen, inte bara Claude: begäran översätts, körs genom samma rörledning och översätts tillbaka.

POST https://nymbot.ai/api/v1/messages - behöver en API-nyckel, som x-api-key eller Authorization: Bearer.

den anthropic-version och anthropic-beta Antropiska modellnamn matchas med katalogen, så Claude Code och SDK fungerar med namnen de redan använder:

  • Ett namn som katalogen känner till, som claude-sonnet-5 eller anthropic/claude-opus-5Den används som den är.
  • Ett annat datum (-20260514), -latestEn version taggad som -v1En bracketed tag som [1m] och en anthropic/ eller anthropic. Prefixet tas bort, och prickar och dash i versionen prövas på båda sätt (claude-haiku-4-5 Hittar claude-haiku-4.5).
  • Om det fortfarande inte matchar något, används familjen (Opus, Sonnet eller Haiku) så länge katalogens version är densamma eller nyare än den som begärts.
  • Ett namn som matchar ingenting returnerar 404 not_found_error.
fältetTyp avnödvändigtBeskrivning
modelSträngarJaEn katalogmodell-id eller ett antropiskt modellnamn.
max_tokensintegerJaDe flesta tokens att skriva.
messagesArrayJauser och assistant vänder, med text, image (base64 eller URL källa) tool_use och tool_result och block. thinking Block från tidigare turer accepteras och släpps.
systemString eller arrayNejSystem prompt, som en sträng eller textblock.
temperature
top_p
AntaletNejSampling kontroller, där modellen tar dem. top_k Accepteras och släpps.
stop_sequencesArray av stringsNejText som avslutar svaret. Högst 4 strängar, vardera högst 256 tecken.
tools
tool_choice
Array och ObjectNejVerktyg med name, description och input_schemaoch a web_search Serververktyget är på WebbsökningAnthropics andra inbyggda verktyg (bash, textredigerare, datoranvändning) vägras med unsupported_tool. tool_choice tar auto, any, tool eller noneoch disable_parallel_tool_use.
thinkingObjektetNej{"type": "enabled", "budget_tokens": 8192}, {"type": "adaptive"} eller {"type": "disabled"}Budgeten väljer en ansträngningsnivå: under 2 048 minimum, från 2 048 låg, från 8 192 medium, från 16 384 hög. output_config.effortEller högt .
streamBooleanskaNejStream i Anthropics eventformat.
metadataObjektetNejAccepterat och ignorerat.

svarar

{
  "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 även hålla tool_use Blocker och a thinking Blocket, vars signature är tomt . stop_reason är end_turn, max_tokens, tool_use eller refusalarbetade på samma sätt som finish_reason är Chat kompletterar; stop_sequence är alltid null, även när en stop-sekvens slutade svaret. input_tokens räknas endast färska inmatningar; cachade inmatningar finns i de två cache-fälten. nymbot Objekt och den X-Nymbot-Cost-Sats och header.

Streamed, händelserna är Anthropics: message_start, content_block_start, ping, content_block_delta (text_delta, input_json_delta eller thinking_delta), content_block_stop, message_delta med den stoppa orsaken, användningen och nymbot kostnaden för objektet och message_stopoch a ping skickas också var 15:e sekund medan modellen är igång. Verktygssamtal anländer efter texten, var och en som en tool_use block med hela inmatningen i ett input_json_delta.

Fel på den här slutpunkten använder Anthropics format: {"type": "error", "error": {"type": "not_found_error", "message": "…"}}En kort balans är 402 billing_errorEn överbelastad leverantör 503 overloaded_errorEtt misslyckande efter att strömmen har startat skickas som en error Ett evenemang .

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

Räkna med tokens

En uppskattning av hur många input tokens en Messages-förfrågan skulle använda, så att en klient kan kontrollera innan den skickar.

POST https://nymbot.ai/api/v1/messages/count_tokens - Behöver en API nyckel. gratis

Kroppen är densamma som för Meddelandenoch utan max_tokens; modellnamnet måste lösa. räkningen är en uppskattning: tecknen i systemmeddelandet, meddelanden, verktygsamtal och verktygsdefinitioner dividerade med fyra, plus 1,600 för varje bild. Det är inte leverantörens egen tokenizer, så det verkliga antalet kan skilja sig.

svarar

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

Lista över modeller

Varje modell och generator som API accepterar, med vad det kostar.Listan läses från samma levande katalog som appens plocker, så det är alltid vad servern kommer att köra.

GET https://nymbot.ai/api/v1/models Ingen nyckel behövs. Dold i fem minuter.

GET /api/v1/models/{id} Returnerar en ingång.

fältetTyp avnödvändigtBeskrivning
typesträng (förfrågan)Nejchat (Det är en defekt) image, video, audio, embedding eller allFlera kan ges, som image,video.

Priser är vad du betalar, med avgiften och marginalen redan i, i dollar och i satser till det nuvarande Bitcoin-priset. balance Berätta vilken balans som modellen spenderar. nymbot_key är modellens korta namn i appen. created är alltid 0, eftersom katalogen inte registrerar när en modell läggs till. En modell utan publicerade tokenpriser prissätts per_request i stället.

nymbot/auto är alltid först, prissatt som variable, med en routes Det listar vision och resonemang, men inte verktyg.

GET /api/v1/models/{id} accepterar samma namn och alias som en begäran, och returnerar posten för den modell de bestämmer sig för.

svarar

{
  "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 andra typerna:

  • Bilden Ingångar har capabilities (accepts_image_url, requires_image_url, edit) och ett pris per_generation.
  • Videor Ingångar har max_duration_seconds och resolutionsoch ett pris per_second för varje resolution.
  • Lyssna Ingångar har audio_type speech eller transcriptionPriset är per_1k_chars eller per_minute.
  • Inbäddat Ingångar har dimensions, context_length, max_inputs och ett pris per miljon input tokens.

Priser märkta "estimated": true är appens uppskattning för en generator vars pris inte publiceras. type Återvänder 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);