Vai al contenuto principale

Guida all’integrazione

Tieni il tuo client. Cambia la base URL e il valore di model.

Qui i modelli di testo parlano i protocolli che il tuo SDK già parla: Chat Completions, il sottoinsieme senza stato di Responses, Anthropic Messages e generateContent di Google. La domanda interessante è cosa succede a un parametro che il modello di destinazione non ha mai dichiarato.

La sfida

I livelli di compatibilità di solito mentono per omissione

Il fallimento classico non è un 500. È un parametro che il tuo gateway ha accettato, scartato e mai menzionato, così il modello ha girato senza la tua temperature, senza le tue definizioni di strumenti o senza il tuo formato di risposta – e l’output è sembrato soltanto deludente invece che rotto.

01

I parametri non dichiarati vengono rifiutati, non scartati

messages, tools, tool_choice, response_format, max_tokens, temperature e top_p si mappano sui campi dichiarati dal modello. Tutto il resto viene inoltrato allo schema del modello e restituisce 400 quando il modello non lo dichiara. Il silenzio non è mai la risposta.

02

La forma dell’errore segue il protocollo che hai chiamato

Su /v1 il corpo è un oggetto errore in stile OpenAI o Anthropic, non la struttura {code, msg, data, request_id} usata da /api/v1. Gestisci entrambi se il tuo prodotto mescola le due superfici.

03

Streaming e liquidazione sono due cose distinte

stream: true restituisce eventi chat.completion.chunk chiusi da data: [DONE]. La fatturazione segue comunque l’uso misurato, quindi uno stream interrotto non è una richiesta gratis.

L’approccio

Cambia l’endpoint, poi rilancia le tue valutazioni

Cambia base_url e api_key, sostituisci la stringa del modello con un valore da GET /v1/models ed esegui la suite di test che hai già. Dove torna un 400 su un parametro, quel parametro non era supportato dal modello che hai scelto – un’informazione che la versione silenziosa non ti dava.

Funziona qualsiasi client compatibile con OpenAI. Cambiano solo la base URL e il valore di model.

POST /v1/chat/completions

from openai import OpenAI

client = OpenAI(
    base_url="https://api.spicyapi.ai/v1",
    api_key=os.environ["SPICY_API_KEY"],
)

stream = client.chat.completions.create(
    model="<publisher>/<model>/chat",          # exact value from GET /v1/models
    messages=[{"role": "user", "content": "Summarise these notes in three bullets."}],
    temperature=0.7,
    stream=True,
)
for chunk in stream:
    print(chunk.choices[0].delta.content or "", end="")

text/event-stream

data: {"object":"chat.completion.chunk","choices":[{"delta":{"content":"- "}}]}
data: {"object":"chat.completion.chunk","choices":[{"delta":{"content":"Ships"}}]}
data: [DONE]

Contratto

Cosa conviene fissare fin dall’inizio

API LLM compatibile OpenAI: cambia la base URL — Cosa conviene fissare fin dall’inizio
Campo o headerValore o limite
POST /v1/chat/completionschat.completion · SSE with stream: true
GET /v1/modelsevery callable model value
Authorization: Bearer · x-api-key · x-goog-api-keyaccepted on /v1
undeclared parameter400 · never silently dropped

Scorri in orizzontale per vedere tutte le colonne.

Integrazione

Dalla prima chiamata alla produzione

  1. 01Crea una chiave, poi fai GET /v1/models per gli identificatori richiamabili in questo momento.
  2. 02Punta il client alla base URL e manda una richiesta non in streaming: la risposta è un normale oggetto chat.completion.
  3. 03Attiva lo streaming e verifica che il tuo lettore gestisca chat.completion.chunk e il sentinella [DONE].
  4. 04Segui il consumo per chiave nella console e imposta un limite giornaliero prima di indirizzare traffico di produzione.

Scelta

Quando questa strada è quella giusta

Scegli questa via se

  • Hai già codice client OpenAI, Anthropic o Google che funziona e vuoi un modello diverso dietro.
  • Vuoi immagine, video e testo su una sola chiave, un solo saldo e un solo insieme di limiti di spesa.

Cerca altrove se

  • Dipendi da thread o assistenti con stato lato server. Qui il supporto a Responses è il sottoinsieme senza stato.
  • Ti serve output media. Quello passa da createTask, o dalla proiezione Videos per i client che già la parlano.

Verifiche

Cosa puoi verificare in autonomia

Quattro superfici di protocollo, una chiave

/v1/chat/completions, /v1/responses, /v1/messages e /v1beta/models/{model}:generateContent si autenticano tutti con la stessa chiave. Authorization: Bearer, x-api-key e x-goog-api-key sono accettati ognuno dove l’SDK se lo aspetta.

L’elenco dei modelli è il contratto

GET /v1/models restituisce esattamente gli identificatori accettati da ogni operazione /v1 e /api/v1, con il produttore del modello in owned_by. I prezzi arrivano da /api/v1/models, che è specifico dell’account e quindi privato.

Validazione, limiti e blocchi sono condivisi

Il livello di compatibilità riusa autenticazione, limiti di frequenza, validazione, prezzi e logica dei blocchi della superficie nativa. Cambia solo la struttura della risposta.

Prima del lancio

Comportamenti della piattaforma da confermare

  • Tieni la chiave lato server: una credenziale nella query string dell’URL non viene mai accettata.
  • Registra l’id di risposta del protocollo a ogni chiamata, così le richieste di assistenza hanno un appiglio.
  • Decidi come un 400 su un parametro non supportato arriva ai tuoi utenti prima di pubblicare.
  • Imposta limiti di spesa giornalieri, mensili e a vita per chiave invece di affidarti al solo saldo.

Domande frequenti

Cosa ci chiedono su questa pagina

Qualsiasi client che ti lasci impostare una base URL e una stringa di modello. I client in stile OpenAI usano /v1/chat/completions e /v1/responses, quelli Anthropic usano /v1/messages e i client Google GenAI usano i percorsi generateContent.

Continua

Punta un client su un modello di testo

Punta un client OpenAI, Anthropic o Google su SpicyAPI. Cosa passa tale e quale, cosa viene rifiutato apposta e come si fattura il testo.

Guide correlate