Felo APIs
LLM API
Wywołuj endpointy modeli Felo przez protokoły zgodne z OpenAI i Anthropic.
/api/v1/modelsUwierzytelnianie
Bearer API key or X-API-Key
Typ zawartości
application/json
Uwagi o limitach
Model service limits may apply. Retry with backoff on 429 or 503.
API LLM udostępnia endpointy bezpośredniego wywoływania modeli przez Felo API Platform. Użyj go, gdy chcesz wywoływać modele językowe ogólnego przeznaczenia, ponownie wykorzystać klienty zgodne z OpenAI lub Anthropic albo podłączyć frameworki agentowe do Felo API Platform.
API LLM obejmuje obecnie trzy płaszczyzny wywoływania modeli zgodne z czatem:
POST /api/v1/responses: zgodna z OpenAI ResponsesPOST /api/v1/chat/completions: zgodna z OpenAI Chat CompletionsPOST /api/v1/messages: zgodna z Anthropic Messages
API decyzji
POST https://openapi.felo.ai/api/v1/decisionsWysyłaj stan i wąskie pytania typowane do jev-1.13 (akceptowany jest też typesafe/jev-1.13). Używaj /api/v1/decisions, a nie endpointów Chat Completions, Messages ani Responses. Przesyłanie strumieniowe nie jest obsługiwane.
Pola żądania
model:jev-1.13state: kontekst do oceny; ciąg znaków lub wartość JSON.questions: nazwane pytania wykorzystującetype,instructionsicriteria.
import os
import requests
response = requests.post(
"https://openapi.felo.ai/api/v1/decisions",
headers={"Authorization": f"Bearer {os.environ['FELO_API_KEY']}"},
json={
"model": "jev-1.13",
"state": "Help! My payouts have been failing for 3 days.",
"questions": {
"is_urgent": {
"type": "noul",
"instructions": "Does this message convey urgency?",
"criteria": {"true": "Time-sensitive", "false": "No urgency"},
},
"department": {
"type": "choice",
"instructions": "Which team should handle this?",
"criteria": {
"billing": "Payments, invoicing, refunds",
"technical": "Bugs, outages, integrations",
"sales": "Pricing, upgrades, new accounts",
},
},
"frustration": {
"type": "score",
"instructions": "How frustrated is the customer?",
"criteria": ["Calm", "Frustrated", "Very angry"],
},
},
},
timeout=60,
)
response.raise_for_status()
answers = response.json()["answers"]
print(answers["is_urgent"]["noul"])
print(answers["department"]["choice"], answers["department"]["probabilities"])
print(answers["frustration"]["score"])Typy odpowiedzi
noul: prawdopodobieństwo od 0 do 1. choice: wybrana opcja i jej rozkład prawdopodobieństwa. score: wynik liczbowy dla uporządkowanych kryteriów wraz z rozkładem.
Błędy używają error.code (liczbowy status HTTP) i error.message. Obsłuż odpowiedzi inne niż 2xx przed odczytaniem answers.
Zużycie i ceny
Odpowiedź zawiera usage.input_tokens, usage.output_tokens i może zawierać usage.cost. Stawki referencyjne sprawdzone 2026-10-12: wejście 0,042 USD za milion tokenów; wyjście 0 USD. Zerowa stawka wyjściowa nie oznacza, że użycie wejścia jest bezpłatne. Stawki mogą się zmieniać; do szacunków używaj opublikowanej ceny modelu i obowiązujących rabatów konta.
Uwierzytelnianie
Żądania do API LLM wymagają klucza Felo API Platform. Użyj Authorization: Bearer ... albo X-API-Key.
Authorization: Bearer YOUR_API_KEYX-API-Key: YOUR_API_KEYSzczegóły tworzenia kluczy API i zarządzania nimi znajdziesz w przewodniku uwierzytelniania.
Bazowy adres URL
Użyj publicznego hosta Felo API Platform:
https://openapi.felo.aiDla klientów SDK skonfiguruj bazowy adres URL specyficzny dla protokołu, pokazany w Podstawowym użyciu.
Wspólne nagłówki
| Nagłówek | Wymagany | Opis |
|---|---|---|
Authorization | Tak, chyba że używany jest X-API-Key | Klucz API w formacie Bearer YOUR_API_KEY |
X-API-Key | Tak, chyba że używany jest Authorization | Alternatywa dla nagłówka Bearer |
Content-Type | Tak | Musi mieć wartość application/json |
X-Request-Id | Nie | Opcjonalny identyfikator żądania do celów diagnostycznych |
Wykrywanie modeli
Ogólny katalog obejmuje wszystkie kategorie modeli. Użyj dedykowanych list, aby wykrywać modele wideo lub decyzyjne:
| Endpoint | Kategorie modeli |
|---|---|
GET /api/v1/models | Wszystkie kategorie (bez zmian) |
GET /api/v1/videos/models | Generowanie wideo (video_generation) |
GET /api/v1/decisions/models | Decyzje, w tym Jev (decisions) |
Wszystkie trzy endpointy przyjmują opcjonalny parametr zapytania provider (na przykład openrouter) i zwracają {"object":"list","data":[...]}. Każdy element zawiera id, object, created, owned_by i model_kind. Dedykowane listy używają efektywnej kategorii po nadpisaniach mapowania włączonych dostawców.
Zwracane są tylko włączone, wymienione i nieusunięte modele z bieżącymi cenami pasującymi do warunków dostawcy; zerowa cena jest prawidłowa. Nowo zsynchronizowane modele są ukryte, dopóki administrator ich nie wymieni. Wszystkie listy używają skonfigurowanej kolejności, a nazwa modelu i identyfikator rozstrzygają remisy. Brak dopasowań zwraca HTTP 200 z pustą tablicą data. Wykrywanie odczytuje lokalny katalog i nie wywołuje modelu ani nie nalicza opłat.
Tylko GET /api/v1/models przyjmuje exclude_video_and_decisions (wartość logiczna, domyślnie false). Ustaw je na true, aby wykluczyć efektywne typy video_generation i decisions; modele obrazów pozostają uwzględniane. Można je łączyć z provider. Pominięcie lub ustawienie false zachowuje pełny katalog. Nieprawidłowe wartości logiczne zwracają HTTP 422.
curl "https://openapi.felo.ai/api/v1/models?exclude_video_and_decisions=true&provider=openrouter" \
-H "Authorization: Bearer ${FELO_API_KEY}"
curl "https://openapi.felo.ai/api/v1/videos/models?provider=openrouter" \
-H "Authorization: Bearer ${FELO_API_KEY}"
curl "https://openapi.felo.ai/api/v1/decisions/models?provider=openrouter" \
-H "Authorization: Bearer ${FELO_API_KEY}"Wybierz endpoint wywołania według model_kind: chat dla Responses, Chat Completions lub Messages zgodnie z obsługą modelu; video_generation dla POST /api/v1/videos/generations; decisions dla POST /api/v1/decisions; image_generation dla POST /api/v1/images/generations. Szczegóły pozostają pod GET /api/v1/models/{model_id}. Wymieniony model niekoniecznie jest zgodny z każdym endpointem wywołania.
Modele obrazów nie mają dedykowanego endpointu listy. Filtruj GET /api/v1/models według model_kind: "image_generation". Pola żądania obrazu znajdziesz w Generowaniu obrazów.
Modele i ceny
Żądania używają domyślnego kanału modelu, chyba że przypniesz kanał nagłówkiem X-Felo-Channel. Przekaż uporządkowaną, rozdzieloną przecinkami listę publicznych kodów kanałów z katalogu modeli; pomiń nagłówek, aby użyć domyślnego. Używaj default tylko samodzielnie. Przesyłana jest tylko grupa dostawcy pierwszego kanału; nie ma automatycznego przełączania awaryjnego. Zobacz Kanały i routing dostawców.
Ceny są podane w USD. Stawki tokenów są wyświetlane za 1 milion tokenów dla czytelności; rozliczenie używa precyzji na token z bieżącej migawki cen. Stawki pamięci podręcznej obowiązują tylko wtedy, gdy odpowiedź protokołu zawiera użycie pamięci podręcznej. Myślnik oznacza brak osobno opublikowanej stawki lub opublikowanego limitu. Użycie wyszukiwania w sieci, gdy jest raportowane przez usługę modelu, jest rozliczane według $0.01 za wyszukiwanie.
| Identyfikator modelu | Kontekst | Maks. wyjście | Wejście / 1 mln tokenów | Wyjście / 1 mln tokenów | Odczyt pamięci podręcznej / 1 mln tokenów | Zapis pamięci podręcznej / 1 mln tokenów |
|---|---|---|---|---|---|---|
claude-haiku-4-5 | 200K | 64K | $1.00 | $5.00 | $0.10 | $1.25 |
claude-sonnet-4-6 | 1M | 128K | $3.00 | $15.00 | $0.30 | $3.75 |
claude-opus-4-8 | 1M | 128K | $5.00 | $25.00 | $0.50 | $6.25 |
claude-sonnet-5 | 1M | 128K | $2.00 | $10.00 | $0.20 | $2.50 |
claude-haiku-5-5 | 1M | 128K | $0.10 | $0.50 | $0.01 | $0.0125 |
gpt-5.5 | 1.05M | 128K | $5.00 | $30.00 | $0.50 | - |
gpt-5.5-pro | 1.05M | 128K | $30.00 | $180.00 | - | - |
gpt-5.6-luna | 1.05M | 128K | $1.00 | $6.00 | $0.10 | $1.25 |
gpt-5.6-terra | 1.05M | 128K | $2.50 | $15.00 | $0.25 | $3.125 |
gpt-5.6-sol | 1.05M | 128K | $5.00 | $30.00 | $0.50 | $6.25 |
grok-4.5 | 500K | - | $2.00 | $6.00 | $0.50 | - |
deepseek-v4-flash | 1M | 384K | $0.09 | $0.18 | $0.018 | - |
Claude Haiku 5.5 stosuje ceny progowe: prompty do 100K tokenów są rozliczane według powyższych standardowych stawek, a żądania, których prompt przekracza 100K tokenów, są rozliczane według $0.50 za wejście, $2.50 za wyjście, $0.05 za odczyt pamięci podręcznej i $0.0625 za zapis pamięci podręcznej na 1 mln tokenów za całe żądanie.
GPT-5.6 jest dostępny w trzech poziomach: Luna do szybkich, oszczędnych obciążeń; Terra do zrównoważonych zadań kodowania, rozumowania i agentowych; Sol do flagowego, złożonego rozumowania i kodowania. Każdy poziom udostępnia też identyfikator modelu -pro (gpt-5.6-luna-pro, gpt-5.6-terra-pro i gpt-5.6-sol-pro), który używa tego samego modelu bazowego w trybie rozumowania pro. Ceny, długość kontekstu i maksymalne wyjście nie zmieniają się dla identyfikatorów -pro.
DeepSeek V4 Flash obsługuje tryby rozumowania i bez rozumowania, dane wyjściowe JSON, wywołania narzędzi, API Responses oraz zgodność z API Anthropic. Jest dostępny przez płaszczyzny Responses, Chat Completions i Messages Felo. Ceny zapisu pamięci podręcznej nie są jeszcze opublikowane.
Podstawowe użycie
Te przykłady używają oficjalnych SDK OpenAI i Anthropic. Przed uruchomieniem przykładów ustaw FELO_API_KEY na swój klucz Felo API Platform.
export FELO_API_KEY="YOUR_API_KEY"Instalacja SDK
OpenAI SDK
Użyj OpenAI SDK dla API Responses i API Chat Completions.
##### JavaScript
npm install openai##### Python
pip install openaiAnthropic SDK
Użyj Anthropic SDK dla API Messages.
##### JavaScript
npm install @anthropic-ai/sdk##### Python
pip install anthropicKonfiguracja klientów
Endpointy zgodne z OpenAI używają bazowego adresu URL OpenAI SDK z /api/v1, ponieważ SDK dopisuje ścieżki zasobów, takie jak /responses i /chat/completions.
JavaScript
import OpenAI from "openai";
const openai = new OpenAI({
apiKey: process.env.FELO_API_KEY,
baseURL: "https://openapi.felo.ai/api/v1",
});Python
import os
from openai import OpenAI
openai = OpenAI(
api_key=os.environ.get("FELO_API_KEY"),
base_url="https://openapi.felo.ai/api/v1",
)Endpointy zgodne z Anthropic używają bazowego adresu URL Anthropic SDK bez /v1, ponieważ SDK dopisuje /v1/messages.
JavaScript
import Anthropic from "@anthropic-ai/sdk";
const anthropic = new Anthropic({
apiKey: process.env.FELO_API_KEY,
baseURL: "https://openapi.felo.ai/api",
});Python
import os
from anthropic import Anthropic
anthropic = Anthropic(
api_key=os.environ.get("FELO_API_KEY"),
base_url="https://openapi.felo.ai/api",
)Używanie API Responses
Używaj API Responses do nowych integracji zgodnych z OpenAI i obiektów odpowiedzi w stylu agentowym.
JavaScript
import OpenAI from "openai";
const client = new OpenAI({
apiKey: process.env.FELO_API_KEY,
baseURL: "https://openapi.felo.ai/api/v1",
});
const response = await client.responses.create({
model: "gpt-5.6-sol",
input: "Write a one-sentence bedtime story about a unicorn.",
});
console.log(response.output_text);Python
import os
from openai import OpenAI
client = OpenAI(
api_key=os.environ.get("FELO_API_KEY"),
base_url="https://openapi.felo.ai/api/v1",
)
response = client.responses.create(
model="gpt-5.6-sol",
input="Write a one-sentence bedtime story about a unicorn.",
)
print(response.output_text)Używanie Chat Completions
Używaj Chat Completions, gdy Twoja aplikacja już wysyła messages w stylu OpenAI.
JavaScript
import OpenAI from "openai";
const client = new OpenAI({
apiKey: process.env.FELO_API_KEY,
baseURL: "https://openapi.felo.ai/api/v1",
});
const completion = await client.chat.completions.create({
model: "gpt-5.6-sol",
messages: [
{
role: "user",
content: "Give me one sentence about why API compatibility matters.",
},
],
});
console.log(completion.choices[0].message.content);Python
import os
from openai import OpenAI
client = OpenAI(
api_key=os.environ.get("FELO_API_KEY"),
base_url="https://openapi.felo.ai/api/v1",
)
completion = client.chat.completions.create(
model="gpt-5.6-sol",
messages=[
{
"role": "user",
"content": "Give me one sentence about why API compatibility matters.",
}
],
)
print(completion.choices[0].message.content)Używanie Messages
Używaj Messages, gdy Twój klient lub framework agentowy oczekuje kształtów żądań i odpowiedzi zgodnych z Anthropic.
JavaScript
import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic({
apiKey: process.env.FELO_API_KEY,
baseURL: "https://openapi.felo.ai/api",
});
const message = await client.messages.create({
model: "claude-sonnet-4-6",
max_tokens: 128,
messages: [
{
role: "user",
content: "Summarize the value of direct model APIs in one sentence.",
},
],
});
const text = message.content
.filter((block) => block.type === "text")
.map((block) => block.text)
.join("");
console.log(text);Python
import os
from anthropic import Anthropic
client = Anthropic(
api_key=os.environ.get("FELO_API_KEY"),
base_url="https://openapi.felo.ai/api",
)
message = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=128,
messages=[
{
"role": "user",
"content": "Summarize the value of direct model APIs in one sentence.",
}
],
)
text = "".join(block.text for block in message.content if block.type == "text")
print(text)Oficjalna dokumentacja
- OpenAI API Quickstart
- OpenAI Create response
- OpenAI Create chat completion
- Claude Messages API
- Anthropic TypeScript SDK
- Anthropic Python SDK
Informacje o konfiguracji klientów agentowych znajdziesz w Konfiguracji Claude Code i Codex.
Dokumentacja protokołów
Responses
Użyj tego endpointu dla klientów i integracji zgodnych z API OpenAI Responses.
Endpoint
POST https://openapi.felo.ai/api/v1/responsesTreść żądania
| Parametr | Typ | Wymagany | Opis |
|---|---|---|---|
model | string | Tak | Publiczny identyfikator modelu Felo |
input | string lub array | Tak | Dane wejściowe użytkownika, dane wieloturowe lub dane multimodalne |
instructions | string | Nie | Instrukcje systemowe lub deweloperskie |
stream | boolean | Nie | Czy używać przesyłania strumieniowego Server-Sent Events |
temperature | number | Nie | Temperatura próbkowania |
max_output_tokens | integer | Nie | Maksymalna liczba tokenów wyjściowych |
Żądanie SDK
const response = await client.responses.create({
model: "gpt-5.6-sol",
input: "Reply with exactly: responses ok",
});
console.log(response.output_text);Ścieżka tekstu odpowiedzi
output_textChat Completions
Użyj tego endpointu dla klientów i SDK zgodnych z OpenAI Chat Completions.
Endpoint
POST https://openapi.felo.ai/api/v1/chat/completionsTreść żądania
| Parametr | Typ | Wymagany | Opis |
|---|---|---|---|
model | string | Tak | Publiczny identyfikator modelu Felo |
messages | array | Tak | Wiadomości konwersacji |
messages[].role | string | Tak | system, user lub assistant |
messages[].content | string | Tak | Treść wiadomości |
stream | boolean | Nie | Czy używać przesyłania strumieniowego Server-Sent Events |
temperature | number | Nie | Temperatura próbkowania |
max_tokens | integer | Nie | Maksymalna liczba tokenów wyjściowych |
Żądanie SDK
const completion = await client.chat.completions.create({
model: "gpt-5.6-sol",
messages: [
{
role: "user",
content: "Reply with exactly: chat completions ok",
},
],
});
console.log(completion.choices[0].message.content);Ścieżka tekstu odpowiedzi
choices[0].message.contentMessages
Użyj tego endpointu dla klientów i SDK zgodnych z Anthropic Messages.
Endpoint
POST https://openapi.felo.ai/api/v1/messagesTreść żądania
| Parametr | Typ | Wymagany | Opis |
|---|---|---|---|
model | string | Tak | Publiczny identyfikator modelu Felo |
max_tokens | integer | Tak | Maksymalna liczba tokenów wyjściowych |
messages | array | Tak | Wiadomości konwersacji |
messages[].role | string | Tak | user lub assistant |
messages[].content | string lub array | Tak | Zwykły tekst lub bloki treści Anthropic |
system | string | Nie | Prompt systemowy |
stream | boolean | Nie | Czy używać przesyłania strumieniowego Server-Sent Events |
temperature | number | Nie | Temperatura próbkowania |
Żądanie SDK
const message = await client.messages.create({
model: "claude-sonnet-4-6",
max_tokens: 64,
messages: [
{
role: "user",
content: "Reply with exactly: messages ok",
},
],
});
const text = message.content
.filter((block) => block.type === "text")
.map((block) => block.text)
.join("");
console.log(text);Żądanie z blokami treści
const message = await client.messages.create({
model: "claude-sonnet-4-6",
max_tokens: 64,
messages: [
{
role: "user",
content: [
{
type: "text",
text: "Reply with exactly: messages ok",
},
],
},
],
});Ścieżka tekstu odpowiedzi
content[].textPrzesyłanie strumieniowe
Ustaw stream na true, aby otrzymywać zdarzenia Server-Sent Events. Format ładunku zdarzeń zależy od wybranego protokołu:
- strumienie Responses zwracają zdarzenia odpowiedzi zgodne z Responses.
- strumienie Chat Completions zwracają fragmenty ukończenia czatu zgodne z OpenAI.
- strumienie Messages zwracają zdarzenia wiadomości zgodne z Anthropic.
const stream = await client.responses.create({
model: "gpt-5.6-sol",
input: "Write one sentence.",
stream: true,
});Klienci powinni parsować strumień zgodnie z używanym protokołem, zamiast oczekiwać jednego wspólnego schematu zdarzeń dla wszystkich trzech endpointów.
Błędy
API LLM zwraca kształt błędu wybranego protokołu, gdy to możliwe. Typowe przyczyny:
| Status HTTP | Przyczyna | Sugerowane działanie |
|---|---|---|
400 | Nieprawidłowa treść JSON lub brak wymaganych pól protokołu | Sprawdź model, messages, input, max_tokens i pola bloków treści |
401 | Brakujący lub nieprawidłowy klucz API | Zweryfikuj Authorization: Bearer ... lub X-API-Key |
402 | Niewystarczające kredyty na koncie | Sprawdź saldo konta Felo |
429 | Przekroczono limit szybkości | Zwolnij tempo żądań i ponów później |
502 | Niepowodzenie żądania do usługi modelu | Ponów i podaj X-Request-Id przy kontakcie z pomocą techniczną |
503 | Usługa modelu tymczasowo niedostępna | Ponów z wykładniczym opóźnieniem lub wybierz inny opublikowany model |