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:inputioutput).
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:
messagesz rolamisystem,developer(traktowana jaksystem),user,assistantitool,toolsitool_choice(auto,none,requiredlub 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_formatzjson_object.json_schemajest 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_tokenslubmax_tokens,stop(do 4 sekwencji),seedireasoning_effort,streamistream_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 swoimindex. - 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_usageostatni fragment ma pustechoicesi zawierausage. - 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.