Yearly Pay yearly and get 2 months free on every paid plan. See plans
Zaloguj się Zacznij za darmo

API zgodne z OpenAI

Ostatnia aktualizacja: 11 lis 2026

Co to jest

API zgodne z OpenAI pozwala narzędziu, które obsługuje format chat completions OpenAI, używać modeli czatu ToRun z opłatą z Twojego konta ToRun. Agent programistyczny taki jak opencode może używać ToRun jako swojego dostawcy modeli obok narzędzi MCP ToRun.

Adres i logowanie

Bazowy URL https://mcp.torun.ai/v1
Logowanie Authorization: Bearer <your developer key>

Użyj tego samego klucza programisty co dla serwera MCP: zobacz Klucze programisty. Klucz utworzony przed dodaniem API zgodnego z OpenAI dostaje odpowiedź 403 insufficient_scope. Uprawnienia klucza nigdy się nie zmieniają, więc utwórz nowy klucz.

API ma dwa punkty końcowe: GET /v1/models i POST /v1/chat/completions. Każda inna ścieżka w /v1 odpowiada 404 not_found.

Modele

GET /v1/models podaje najpierw torun/auto, a potem każdy model tekstowy, z którego może korzystać Twój plan, według jego identyfikatora. Dla każdego modelu podano:

  • ile tekstu może przeczytać (context_length) i jak długą odpowiedź może napisać (max_completion_tokens),
  • czy potrafi wywoływać narzędzia (supports_tools) i czytać obrazy (supports_vision),
  • jego cenę w Runs za milion tokenów (pricing: input i output).

torun/auto pozwala ToRun dobrać model do każdego żądania: taki, który czyta obrazy, gdy żądanie zawiera obraz, i taki, który wywołuje narzędzia, gdy wysyła tools.

Chat completions

POST /v1/chat/completions przyjmuje:

  • messages z rolami system, developer (traktowana jak system), user, assistant i tool,
  • tools i tool_choice (auto, none, required lub jedna nazwana funkcja): własne narzędzia Twojego narzędzia wracają do niego jako wywołania narzędzi, a ToRun nigdy ich nie uruchamia,
  • response_format z json_object. json_schema jest przyjmowany, a odpowiedź przychodzi w JSON, ale sam schemat nie jest wymuszany,
  • temperature (od 0 do 2), top_p (od 0 do 1), max_completion_tokens lub max_tokens, stop (do 4 sekwencji), seed i reasoning_effort,
  • stream i stream_options.include_usage.

n większe niż 1, logprobs, top_logprobs, audio i każde wyjście inne niż tekst są odrzucane z 400 unsupported_parameter, a nie ignorowane.

Obrazy

Wysyłaj obraz osadzony, jako data:image/...;base64,... w części image_url, do 20 MB na żądanie. Obraz wysłany jako link jest odrzucany z 400 image_url_not_supported: ToRun go nie pobiera. Obrazy przechodzą kontrolę bezpieczeństwa, tak jak w aplikacji.

Strumieniowanie

Przy "stream": true odpowiedź przychodzi jako server-sent events w formacie chat.completion.chunk:

  • Pierwszy fragment zawiera rolę assistant, a wywołania narzędzi są przesyłane strumieniowo ze swoim index.
  • Gdy nie ma nic do wysłania, co 15 sekund przychodzi wiersz komentarza : keepalive; parsery SSE go pomijają.
  • data: [DONE] kończy strumień, który się powiódł.
  • Z stream_options.include_usage ostatni fragment ma puste choices i zawiera usage.
  • Błąd po rozpoczęciu strumienia przychodzi jako jedno zdarzenie data: {"error": ...}, bez [DONE].

Wywołanie bez strumieniowania jest przerywane po 110 sekundach z 504 timeout. Długie żądania wysyłaj z "stream": true.

Użycie

usage zawiera prompt_tokens, completion_tokens, total_tokens, prompt_tokens_details.cached_tokens i completion_tokens_details.reasoning_tokens, a także torun_credits: ile wywołanie kosztowało w Runs.

Użycie w opencode

Konfiguracja opencode na stronie Dla programistów dodaje ToRun jako dostawcę modeli obok serwera MCP:

{
  "$schema": "https://opencode.ai/config.json",
  "provider": {
    "torun": {
      "npm": "@ai-sdk/openai-compatible",
      "name": "ToRun",
      "options": { "baseURL": "https://mcp.torun.ai/v1", "apiKey": "{env:TORUN_API_KEY}" },
      "models": { "torun/auto": { "name": "ToRun Auto" } }
    }
  }
}

Każde inne narzędzie, które obsługuje API czatu OpenAI, działa tak samo. Karta API OpenAI na tej stronie pokazuje takie wywołanie:

curl https://mcp.torun.ai/v1/chat/completions \
  -H "Authorization: Bearer $TORUN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model": "torun/auto", "messages": [{"role": "user", "content": "Hello"}]}'

Jak opłacane są wywołania

Wywołania API kosztują tyle samo Runs co takie samo użycie w aplikacji. Opłacają je tylko płatne środki: najpierw limit Twojego płatnego planu, potem portfel, jeśli zezwoliłeś na to w kluczu. Darmowy limit nigdy nie opłaca wywołań API. Obowiązują miesięczny i dzienny limit klucza, a odpowiedzi przechodzą kontrolę bezpieczeństwa tak jak odpowiedzi w czacie.

Limity

Każdy klucz może wysłać do tego API 60 żądań na minutę i wykonywać 4 completions jednocześnie. Powyżej tego API odpowiada 429 rate_limit_exceeded z nagłówkiem Retry-After.

Błędy

Każdy błąd ma postać {"error": {"message": ..., "type": ..., "param": ..., "code": ...}}. message jest w języku, o który prosi nagłówek Accept-Language żądania.

Status Kod Znaczenie
400 invalid_json, missing_parameter, invalid_parameter, unsupported_parameter Żądanie jest nieprawidłowe lub używa parametru, którego ToRun nie obsługuje.
400 image_url_not_supported Obraz został wysłany jako link; wyślij go osadzony.
400 content_blocked Kontrola bezpieczeństwa zablokowała treść.
400 upstream_rejected Dostawca modelu odrzucił żądanie; komunikat podaje powód.
401 invalid_api_key Brakuje klucza, jest błędnie wpisany lub unieważniony.
402 insufficient_credits, wallet_spend_not_allowed, spending_cap_reached Konto lub klucz nie może opłacić wywołania.
403 insufficient_scope Klucz został utworzony przed dodaniem tego API; utwórz nowy klucz.
403 model_not_available Model nie jest dostępny w Twoim planie.
403 account_suspended, no_developer_access Konto jest zawieszone lub nie ma dostępu dla programistów.
404 model_not_found Tego identyfikatora modelu nie ma na liście GET /v1/models.
404 not_found W /v1 nie ma takiej ścieżki.
429 rate_limit_exceeded Zbyt wiele wywołań; poczekaj czas podany w Retry-After.
500 internal_error Coś poszło nie tak po stronie ToRun.
502 upstream_error, empty_reply Dostawca modelu zawiódł lub przysłał pustą odpowiedź.
503 upstream_error, cap_unreadable, scan_unavailable Usługa potrzebna do wywołania jest chwilowo niedostępna; spróbuj ponownie.
504 timeout Wywołanie bez strumieniowania trwało dłużej niż 110 sekund.

Żądanie, którego nie da się opłacić, dostaje odpowiedź 402, a nie 429, aby klient nie ponawiał go w kółko.