Slaan oor na die inhoud
Terug na Nymbot

Kennisbasis Ontwikkelaar

Chat, antwoorde en boodskappe

Drie maniere om 'n model iets te vra, in die drie formate kliënte reeds praat, almal op dieselfde modelle en op dieselfde manier gefactureer.

Chat voltooiing

Die OpenAI chat formaat, en die een wat byna elke instrument ondersteun. Stuur die gesprek tot dusver en kry die volgende boodskap terug.

POST https://nymbot.ai/api/v1/chat/completions Jy het 'n API sleutel nodig.

slegs model en messages 'N bemonsteringsparameter wat die gekose model nie neem nie, word sonder 'n fout neergelê, so 'n versoek lichaam werk oor modelle. supported_parametersWat geweier word in plaas van weggegooi word, is iets wat die model nie kan doen nie: foto's vir 'n model wat nie kan sien nie, gereedskap vir 'n model wat hulle nie kan bel nie.

Die veldDie tipevereisBeskrywing
modelStringJanymbot/auto (en die auto) vir Nymbot se routing op die standaardbalans, of 'n katalogusmodel-id soos anthropic/claude-sonnet-5 op die Pro-balans. Die app se kort name en alias word ook aanvaar. Genoeg.
messagesdie arrayJaDie gesprekke. rolle system, developer (Hierdie word as 'n stelsel behandel) user, assistant en toolInhoud is 'n string of 'n lys van text en image_url dele; beelde slegs in gebruikersboodskappe. input_audio Die bestanddele word verwerp.
streamBooleaannieStuur die antwoord soos dit geskryf is. Die streaming.
stream_optionsDie voorwerpnie{"include_usage": true} voeg 'n finale stuk met token getalle en die koste.
max_tokens
max_completion_tokens
IntegraalnieDie meeste tokens om te skryf. Verlaag na die maksimum van die model as hoër. Dit stel ook hoeveel van jou balans gehou word, sodat 'n kleiner aantal minder krediet nodig het om te begin.
temperature
top_p
Die nommernieKontrole van sampling: temperature van 0 tot 2, top_p van 0 tot 1.
stopString of ArraynieTekst wat die antwoord eindig: 'n reeks of ten hoogste 4 reeks, elkeen ten hoogste 256 karakters. nymbot/auto.
seedIntegraalnieVir herhaalbare sampling, waar die model dit ondersteun.
presence_penalty
frequency_penalty
Die nommernieHerhalingsbeheer, elkeen van -2 tot 2.
response_formatDie voorwerpnie{"type": "json_object"} of {"type": "json_schema", "json_schema": {…}}waar die model dit ondersteun. nie gebruik word deur nymbot/auto.
tools
tool_choice
parallel_tool_calls
array, string of voorwerp, booleaannieDie funksie van die oproep. sien Tool oproepe· a web_search Die gereedskap word Web soekOp die meeste 128 gereedskap en 512 KB van definisies, ingebed by die meeste 64 vlakke diep; meer is 'n 400.
reasoning_effort
reasoning
String, die voorwerpnie"minimal", "low", "medium" of "high"of {"effort": "high"}. "none" of {"enabled": false} Sluit dit af. sien Redensies.
pluginsdie arraynie[{"id": "web", "max_results": 5}] soek altyd die web eerste. Tot 10 resultate.
nIntegraalnie1 Alles wat terugkom 400.
logit_bias
user
metadata
String, String en ObjectnieAanvaar en nie gestuur nie. logit_bias kaarte met nie meer as 300 token-id's tot getalle van -100 tot 100; user Dit is 'n maksimum van 256 karakters. metadata hou tot 16 string waardes, sleutels tot 64 karakters en waardes tot 512.

Die antwoord is gewoonlik chat.completionMet die koste in usage.cost (In dollars) en in die nymbot die voorwerp. model is die opgeloste model id, so 'n kort naam kom terug as die volle een. message.reasoning_contentafsonderlik van die antwoord.

Reaksies

{
  "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 wat teruggekom het, aangesien verskaffers dit anders rapporteer: tool_calls Wanneer die model vir gereedskap gevra het, length wanneer die antwoord elke toelaatbare token gebruik het (of die model hulle almal oorweeg en geen antwoord geskryf het), content_filter wanneer die verskaffer geweier het, en stop Anders so. usage.completion_tokens_details.reasoning_tokens is altyd 0: verborge rede tokens word getel, en in rekening geneem, in completion_tokens.

StatusWanneer
400nie model of messages (missing_required_parameter); 'n klank- of lêerdeel, of beelde vir 'n model wat dit nie kan sien nie (unsupported_contentmeer as 20 foto's (too_many_images); 'n steekproefparameter van die verkeerde tipe of uit die bereik (invalid_value); 'n foto skakel wat nie openbaar is nie (invalid_image_url); gereedskap op 'n model wat hulle nie kan noem nie (unsupported_tool); n anders as 1; a :thinking 'n Model wat geen rede kan gee nie (model_not_found(of die verskaffer die versoek geweier het)upstream_rejected).
402Die saldo wat die model spandeer, kan nie die hold dek nie.
403In die ergste geval pas die sleutelkap nie (key_limit_reached· Laer max_tokens Of verhoog die kop.
404Geen model met hierdie naam (model_not_found).
429die aankoop van die produk, of die gebruik van die produk (upstream_rate_limited).
502, 503Die verskaffer het misluk (upstream_error(Of dit is oorbelast)upstream_overloaded, met Retry-AfterNiks word in rekening gestel tenzij die verskaffer vir die poging in rekening gestel het nie.

Die statuscodes van elke eindpunt-aandeel word opgelys onder Die foute.

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

met "stream": true die antwoord kom as server-gestuurde gebeure terwyl die model dit skryf. chat.completion.chunk Die a data: die lyn, en die stroom eindig met data: [DONE]Die rede kom in delta.reasoning_contentDie antwoord in delta.content.

Stream iets wat meer as ongeveer 100 sekondes kan neem, soos 'n lang antwoord, 'n groot max_tokens 'N Verzoek wat nie gestream word nie, stuur niks totdat die antwoord voltooi is nie, en die netwerk tussen jou en Nymbot kan na ongeveer 100 sekondes 'n leegverbinding sluit; die model eindig nog en wat dit geskryf het, word geladen, maar die antwoord is verlore.

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]
  • Lines wat begin met : is hou-lewe kommentaar, gestuur elke 15 sekondes terwyl die model dink.
  • Vra vir "stream_options": {"include_usage": true} om die laaste stuk hierbo te kry, met 'n leë choices, die token tel, die koste en die nymbot die voorwerp.
  • As jy die verbinding vroeër sluit, word die model nie gestop nie: Nymbot lees die res van die verskaffer se stroom, vir tot 25 sekondes, om sy token telling te kry, en jy betaal wat die verskaffer rapporteer.
  • 'N Fout voor die eerste stuk, soos 401 of 402, kom terug as gewone JSON met sy status kode, nie as 'n stroom nie. 'n Fout nadat die stroom begin het, kom as 'n laaste data: {"error": {…}} gebeur, en die stroom eindig sonder [DONE].
  • Vrae met gereedskap, en modelle op OpenAI se Antwoorde vervoer, vloei nie van die verskaffer nie.

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

Tool oproepe

Beskryf die funksies in tools en die model kan vra vir een om geroep te word in plaas van om te antwoord. Jy voer die funksie uit, voeg sy resultaat by as 'n tool Boodskap met dieselfde tool_call_idNymbot voer nooit jou funksies uit nie; dit stuur die model se versoek terug na jou.

tool_choice neem "auto", "none", "required" of {"type": "function", "function": {"name": "…"}}Die model lys teken wat modelle kan roep gereedskap (capabilities.toolsDie gereedskap word verwerp met 400 unsupported_tool die nymbot/auto en op die paar katalogumodelle wat op OpenAI se Responses-vervoer hardloop, wat Nymbot nie gereedskap kan oordra nie.

met "stream": true, 'n versoek met gereedskap loop in een stuk en word dan as 'n normale stukke volgorde gestuur: die rol, een stuk wat elke gereedskapoproep met sy indeks, id, naam en argumente dra, en die eindstuk.

Die antwoord, gedeeltelik

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

Foto's in 'n versoek

Modelle met capabilities.vision kan lees foto's. Voeg 'n image_url deel aan 'n gebruikersboodskap, met 'n publiek https:// Link of 'n data:image/…;base64, URL. Tot 20 foto's per versoek. SVG-foto's word verwerp, en so is 'n skakel oor 4.096 karakters of een met 'n gebruikersnaam of wagwoord daarin (400 invalid_image_urlEen van die optionele detail is auto, low of high.

met nymbot/auto, 'n versoek met 'n prentjie daarin word geruiteer na 'n standaardmodel wat kan sien. capabilities.vision Weier foto's met 400 unsupported_contentFoto's kan slegs in gebruikersboodskappe wees. 'N skakel moet na 'n openbare gasheer dui; Nymbot stuur die beeld na die model se verskaffer en hou dit nie.

'N Afbeelding word in rekening geneem as die invoer tokens wat die verskaffer daarvoor tel, soos die res van die versoek.

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

Reaksies

Modelle met capabilities.reasoning kan dink voordat hulle antwoord. vra vir meer of minder daarvan met reasoning_effort ("minimal", "low", "medium" of "high") of "reasoning": {"effort": "high"}of byvoeg :thinking na die modelnaam, wat beteken hoë inspanning. Op 'n model sonder om te rede, word die instelling geïgnoreer. nymbot/auto, :thinking stuur die versoek na die standaard redeweging pad.

Op Anthropic modelle word die poging 'n denke begroting van ongeveer 1,000, 2,000, 8,000 of 16,000 tokens, nooit meer as max_tokens Die gedagtes word verlaat wanneer tool_choice dwing 'n instrument, en wanneer die versoek 'n werktuigloop voortduur (sy laaste boodskap is 'n werktuigresultaat), want Anthropic benodig die vroeër ondertekende denke om dit te hervat.

Die rede kom terug in message.reasoning_contentof delta.reasoning_content wanneer streaming, nooit gemeng in die antwoord nie. Reasoning is output en word as sodanig in rekening geneem, binne completion_tokensSommige verskaffers retourneer nie die redeverklaringsteks nie, en dit word nog steeds in rekening geneem.

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

Modelleer die suffiks

'N Suffix op die modelnaam verander hoe die versoek hanteer word, sonder 'n ander veld. anthropic/claude-sonnet-5:online.

Genoegeffekte
:onlineSoek die web eerste, soos plugins: [{"id": "web"}]Ek sien Web soek.
:thinkingHoë verstandige poging; op nymbot/autoop 'n model wat nie kan rede nie, 400 model_not_found met “ geen eindpunte gevind”.
:nitro, :floor, :exacto, :extendedElke kataloogmodel het een roete, so daar is geen vinniger, goedkoper of langer een om te kies nie; die gevolgtrekkings is toegelaat sodat model name wat van ander dienste gekopieer word, nog steeds werk.

Die hele naam word eers probeer, so 'n model wie se id regtig 'n kolon bevat, werk nog steeds; anders word die aanhangsels een op 'n tyd geneem totdat 'n model ooreenstem. 'n modelnaam kan tot 200 karakters lank wees met ten hoogste 4 aanhangsels; 'n langer een word geweier met 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 soek na die laaste gebruikersboodskap (sy eerste 2000 karakters), lees die beste bladsye en gee dit aan die model met die vraag, gemerk as buitelandse inhoud waarvan die model nie instruksies moet neem nie.

  • Altijd soek: "plugins": [{"id": "web", "max_results": 5}]of a :online Voldoen aan die model.
  • Soek wanneer dit help: "tools": [{"type": "web_search", "parameters": {"max_results": 5}}]Ook aanvaar as web_search_preview of openrouter:web_searchNymbot soek net wanneer die vraag lyk asof dit huidige inligting benodig, dieselfde toets wat die app gebruik.

max_results is 5 standaard en by maksimum 10. die bronne kom terug in nymbot.web_search.sourcesElkeen met 'n title, snippet en urlEn as url_citation aantekeninge op die boodskap.

Elke soektog wat hardloop, kos $ 0,008, omskep na sats, bo die tokens, en dit is deel van die hou. Die bladsye wat dit lees, is input tokens ook, dus 'n antwoord van die web kos meer as dieselfde vraag wat koud gevra is, soms 'n paar keer meer.

Die antwoord, gedeeltelik

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

Reaksies op vuur

OpenAI se nuwer formaat, wat deur die OpenAI Agents SDK en deur Codex gebruik word. Dit loop op dieselfde modelle, faktureer en funksies as Chat Completions.

POST https://nymbot.ai/api/v1/responses Jy het 'n API sleutel nodig.

Die veldDie tipevereisBeskrywing
modelStringJaAs vir Chat voltooiingDie suffixes is inbegrepen.
inputString of ArrayJa'N string, of 'n lys van items: boodskappe (roles user, assistant, system, developer) met input_text, input_image en output_text dele, en function_call en function_call_output items vir gereedskap. input_image Neem 'n image_url link of data URL, nie 'n lêer id nie. reasoning en web_search_call items word verwyder; item_reference Hy is verwerp.
instructionsStringnieInstruksies vir die stelsel.
max_output_tokensIntegraalnieDie meeste tokens om te skryf.
temperature
top_p
Die nommernieSampling beheer, waar die model neem hulle.
tools
tool_choice
parallel_tool_calls
array, string of voorwerp, booleaannieIn die vorm van die reaksie ({"type": "function", "name": …, "parameters": …}a) die web_search of web_search_preview Die gereedskap word Web soek wanneer dit help. Ander ingeboude gereedskap word verwerp.
reasoningDie voorwerpnie{"effort": "minimal" | "low" | "medium" | "high"}. xhigh en max betekenis high; none Draai dit af.
text.format
response_format
Die voorwerpniegestruktureerde uitvoer, as 'n JSON-skema of json_object.
metadataDie voorwerpnieTeruggekeer onveranderd in die reaksie. By maximaal 16 string waardes, sleutels tot 64 karakters en waardes tot 512.
streamBooleaannieStream gebeurtenisse soos hieronder beskryf.
storeBooleaannieNiets word gestoor nie, en die antwoord sê altyd "store": false.
previous_response_id
conversation
background
String, Object en BooleaannieNie ondersteun nie: 400 unsupported_parameterAntwoorde word nie opgeslagen nie, so stuur die hele gesprek in input Elke keer.

Reaksies

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

'N Werktuigverzoek verskyn in output As 'n function_call Die item met call_id, name en argumentsStuur die resultaat terug as a function_call_output Artikel met dieselfde call_idReasoning, wanneer die model dit teruggee, is 'n reasoning Die item met reasoning_text Inhoud, die eerste opsomming. status is incomplete Wanneer die antwoord klop max_output_tokens of die verskaffer geweier het, met incomplete_details.reason Stel die max_output_tokens of content_filterDie antwoord weerspieël ook die instellings van die versoek (temperatuur, gereedskap, gereedskapkeuse, ensovoorts) soos OpenAI se doen, en dra die nymbot koste van die voorwerp.

Streamed, elke gebeurtenis is 'n event: Die lyn en a data: Linie met 'n sequence_numberIn hierdie volgorde: response.created, response.in_progress, response.output_item.added, response.content_part.addedEnige aantal van response.output_text.delta, response.output_text.done, response.content_part.done, response.output_item.doneEn uiteindelik response.completed met die gebruik en koste. 'n Antwoord kort eindig met response.incomplete in plaas daarvan, en 'n mislukking nadat die stroom begin met response.failedReasoning streams as sy eie item met response.reasoning_text.delta en .doneWerktuigoproepe kom na die boodskap, elkeen as 'n item met response.function_call_arguments.delta en .done.

StatusWanneer
400nie model of input; previous_response_id, conversation, background of 'n item_reference (unsupported_parameter); 'n nie-ondersteunde instrument of inhoudstype.
402, 403, 404, 429, 502, 503Wat oor chat voltooiings.

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

Antropiese boodskappe

Anthropic se formaat, vir die Anthropic SDK's en Claude Code. Dit werk met elke model in die katalogus, nie net Claude nie: die versoek word vertaal, deur dieselfde pipeline uitgevoer en terug vertaal.

POST https://nymbot.ai/api/v1/messages — benodig 'n API sleutel, as x-api-key of Authorization: Bearer.

die anthropic-version en anthropic-beta Antropiese model name word saamgestel met die katalogus, so Claude Code en die SDKs werk met die name wat hulle reeds gebruik:

  • 'N Naam wat die katalogus ken, soos claude-sonnet-5 of anthropic/claude-opus-5Dit word gebruik soos dit is.
  • Die datum van die datum (-20260514), -latest'n Versie soos die -v1'n Brekkige dag soos [1m] en 'n anthropic/ of anthropic. die voorvoegsel weggeneem word, en punte en dashes in die weergawe word beide maniere probeer (claude-haiku-4-5 vind claude-haiku-4.5).
  • As dit nog steeds niks ooreenstem nie, word die familie (Opus, Sonnet of Haiku) gebruik, solank die weergawe van die katalogus dieselfde of nuwer is as die een wat gevra is.
  • 'N Naam wat niks ooreenstem nie, keer terug 404 not_found_error.
Die veldDie tipevereisBeskrywing
modelStringJa'N katalogus model id, of 'n Antropiese model naam.
max_tokensIntegraalJaDie meeste tokens om te skryf.
messagesdie arrayJauser en assistant Stuur, met text, image (Base64 of die URL bron) tool_use en tool_result die blokke. thinking Blokke van vorige beurt word aanvaar en weggegooi.
systemString of ArraynieStelsel prompt, as 'n string of teks blokke.
temperature
top_p
Die nommernieSampling beheer, waar die model neem hulle. top_k Hy word aanvaar en afgeneem.
stop_sequencesOor die stringsnieTekst wat die antwoord eindig. Maximaal 4 stringe, elk met 'n maksimum van 256 karakters.
tools
tool_choice
Skepper, die voorwerpniegereedskap met name, description en input_schema· a web_search Die server-tool word Web soekAntropic se ander ingeboude gereedskap (bash, teksredakteur, rekenaargebruik) word geweier met unsupported_tool. tool_choice neem auto, any, tool of noneen disable_parallel_tool_use.
thinkingDie voorwerpnie{"type": "enabled", "budget_tokens": 8192}, {"type": "adaptive"} of {"type": "disabled"}Die begroting kies 'n inspanning vlak: onder 2.048 minimum, van 2.048 laag, van 8.192 medium, van 16.384 hoë. output_config.effortOf hoog.
streamBooleaannieStream in die gebeurtenis formaat van Anthropic.
metadataDie voorwerpnieAanvaar en ignoreer.

Reaksies

{
  "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 Jy kan ook hou tool_use Blokke en a thinking Die blok, wat signature Hy is leeg. stop_reason is end_turn, max_tokens, tool_use of refusalHy werk op dieselfde manier as finish_reason die Chat voltooiing; stop_sequence Dit is altyd null, selfs wanneer 'n stop volgorde die antwoord beëindig het. input_tokens slegs vars invoer tel; cached invoer is in die twee cache velde. nymbot Object en die X-Nymbot-Cost-Sats Die header.

Streamed, die gebeure is Anthropic se: message_start, content_block_start, ping, content_block_delta (text_delta, input_json_delta of thinking_delta), content_block_stop, message_delta met die stop rede, die gebruik en die nymbot die koste van die voorwerp, en message_stop· a ping word ook elke 15 sekondes gestuur terwyl die model werk. gereedskapoproepe kom na die teks, elkeen as 'n tool_use blok met sy hele invoer in een input_json_delta.

Foute op hierdie eindpunt gebruik die formaat van Anthropic: {"type": "error", "error": {"type": "not_found_error", "message": "…"}}'N Korte balans is 402 billing_error'N Overtollige verskaffer 503 overloaded_error'N mislukking nadat die stroom begin het, word as 'n error die gebeurtenis.

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

Teken die tokens

'N Schatting van hoeveel input tokens 'n boodskappeverzoek sal gebruik, sodat 'n kliënt kan kyk voordat dit stuur.

POST https://nymbot.ai/api/v1/messages/count_tokens — benodig 'n API sleutel. gratis

Die liggaam is dieselfde as die boodskappesonder max_tokens; die modelnaam moet oplos. Die telling is 'n raming: die karakters van die stelsel prompt, boodskappe, gereedskap oproepe en gereedskap definisies verdeel deur vier, plus 1,600 vir elke prentjie. Dit is nie die verskaffer se eie tokenizer nie, so die werklike telling kan verskil. 'N sleutel wat sy cap bereik het, kan dit nog steeds gebruik.

Reaksies

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

Lysteer modelle

Elke model en generator wat die API aanvaar, met wat dit kos. Die lys word gelees uit dieselfde lewendige katalogus as die app se pick, so dit is altyd wat die bediener sal hardloop.

GET https://nymbot.ai/api/v1/models – Geen sleutel nodig nie. Verberg vir vyf minute.

GET /api/v1/models/{id} Terugkeer 1 ingang.

Die veldDie tipevereisBeskrywing
typeDie vraag (query)niechat die vervalsing, image, video, audio, embedding of allSommige kan aangedui word, soos image,video.

Pryse is wat jy betaal, met die vergoeding en marge reeds in, in dollars en in sats by die huidige Bitcoin prys. balance Dit sê watter balans die model spandeer. nymbot_key is die model se kort naam in die app. created is altyd 0, aangesien die katalogus nie registreer wanneer 'n model bygevoeg is nie. per_request in plaas daarvan.

nymbot/auto is altyd eerste, geprijs as variablemet 'n routes 'N lys wat die tariewe van elke standaardroete gee.Dit lys visie en rede, maar nie gereedskap nie.

GET /api/v1/models/{id} aanvaar dieselfde name en alias's as 'n versoek, en retourneer die inskrywing vir die model wat hulle oplos.

Reaksies

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

Die ander tipes:

  • Die beeld Inkomste het capabilities (accepts_image_url, requires_image_url, edit(en 'n prys per_generation.
  • Video’s Inkomste het max_duration_seconds en resolutionsEn 'n prys per_second vir elke resolusie.
  • Die audio Inkomste het audio_type speech of transcriptionDie prys per_1k_chars of per_minute.
  • Integrasie Inkomste het dimensions, context_length, max_inputs en 'n prys per miljoen input tokens.

Die markpryse "estimated": true is die app se raming vir 'n generator waarvan die prys nie gepubliseer word nie. type Terugkeer 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);