Chat compatibile con OpenAI
Utilizza POST /v1/chat/completions e GET /v1/models con OpenAI Python o JavaScript SDK modificando l'URL di base e la chiave API. Si tratta della compatibilità dei completamenti chat di testo, non del supporto per ogni endpoint o funzionalità OpenAI.
Autenticazione e modelli
Utilizzare lo stesso tasto API della console: Authorization: Bearer sk-your-key. L'elenco dei modelli contiene i modelli di testo attualmente disponibili e i relativi ID pubblici. Utilizzare il id restituito; non utilizzare un nome visualizzato. I prezzi e gli ID vocali rimangono disponibili in /v1/chat/catalog.
curl https://api.coldstart.win/v1/models -H "Authorization: Bearer sk-your-key"{"object":"list","data":[{"id":"chat-standard","object":"model","created":0,"owned_by":"girllab"}]}Richieste e cronologia delle conversazioni
Ogni richiesta fornisce l'array completo messages in ordine. Ruoli supportati: system, developer, user, assistant, tool. Il contenuto può essere una stringa o un array di parti { "type": "text", "text": "..." }. Non viene aggiunta alcuna cronologia del server o persona predefinita. Ogni turno deve includere le istruzioni di sistema richieste e la relativa cronologia.
curl https://api.coldstart.win/v1/chat/completions \
-H "Authorization: Bearer sk-your-key" \
-H "Content-Type: application/json" \
-d '{"model":"chat-standard","messages":[{"role":"system","content":"You are a helpful assistant."},{"role":"user","content":"Hello!"}],"max_tokens":256}'{
"id": "chatcmpl_example",
"object": "chat.completion",
"created": 1792540800,
"model": "chat-standard",
"choices": [{"index": 0, "message": {"role": "assistant", "content": "Hello!", "refusal": null}, "logprobs": null, "finish_reason": "stop"}],
"usage": {"prompt_tokens": 12, "completion_tokens": 3, "total_tokens": 15}
}Parametri supportati
model e un array messages non vuoto. Opzionale: stream (predefinito false), temperature (0–2), top_p (0–1), max_tokens o max_completion_tokens (numero intero 1–8192, mutuamente esclusivi), stop (una stringa o stringhe 1–4), presence_penalty e frequency_penalty (−2–2), seed (numero intero sicuro), n (solo 1). Le impostazioni di generazione omesse utilizzano le impostazioni predefinite del servizio; gli effetti dei parametri di campionamento dipendono dal modello selezionato. stream_options: {"include_usage": true} è valido solo con stream: true. I valori null facoltativi utilizzano i valori predefiniti. Il limite del corpo HTTP JSON è 15 MiB; I limiti del contesto del token dipendono dal modello.
Streaming e utilizzo
Lo streaming utilizza SSE di soli dati, senza event: delta o event: completed personalizzati. Leggi choices[0].delta.content, quindi l'ultimo finish_reason (stop, length o content_filter, tool_calls) e data: [DONE]. Con include_usage: true, un pezzo extra con choices: [] e il usage finale precedono [DONE]; altri blocchi hanno usage: null. Senza di esso, i blocchi di streaming omettono l'utilizzo. Tutti i blocchi condividono un ID di completamento locale, ora di creazione e ID del modello pubblico.
{"model":"chat-standard","messages":[{"role":"user","content":"Hello!"}],"stream":true,"stream_options":{"include_usage":true}}data: {"id":"chatcmpl_example","object":"chat.completion.chunk","created":1792540800,"model":"chat-standard","choices":[{"index":0,"delta":{"role":"assistant","content":""},"logprobs":null,"finish_reason":null}],"usage":null}
data: {"id":"chatcmpl_example","object":"chat.completion.chunk","created":1792540800,"model":"chat-standard","choices":[{"index":0,"delta":{"content":"Hello!"},"logprobs":null,"finish_reason":null}],"usage":null}
data: {"id":"chatcmpl_example","object":"chat.completion.chunk","created":1792540800,"model":"chat-standard","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":null}
data: {"id":"chatcmpl_example","object":"chat.completion.chunk","created":1792540800,"model":"chat-standard","choices":[],"usage":{"prompt_tokens":12,"completion_tokens":3,"total_tokens":15}}
data: [DONE]Errori e ambito supportato
Gli errori utilizzano { "error": { "message": "...", "type": "invalid_request_error", "param": null, "code": "invalid_request" } }. HTTP 400 significa input non valido o non supportato; 401 chiave non valida, 402 crediti insufficienti, 429 limitazione della velocità, 503 errore temporaneo del servizio e 504 timeout. Gli errori vengono disinfettati. Prima dell'inizio dello streaming, gli errori utilizzano un errore HTTP JSON; dopo l'inizio, un frame data: {"error": ...} termina lo stream senza un indicatore di successo. Non considerare una risposta parziale come completata. Timeout primo testo: 90 secondi; timeout di inattività: 60 secondi, reimpostato da ogni delta di testo. Le richieste non di streaming scadono dopo 60 secondi.
Non supportati: input immagine/audio, ricerca ed esecuzione di codice ospitate, vecchi functions / function_call, tipi di strumenti personalizzati, logprobs, candidati multipli, store, Responses API e parametri non elencati. Vengono rifiutati. Per la voce usa /v1/chat/speech.
Esempi di fatturazione ed SDK
Si applicano lo stesso saldo, i prezzi del modello pubblico e la fatturazione dei token di input/output. I crediti vengono riservati prima della generazione e liquidati utilizzando l'utilizzo riportato; le prenotazioni non utilizzate vengono rilasciate. Mancata generazione, utilizzo non valido o disconnessione prima che la liquidazione rilasci la prenotazione. La cancellazione dopo una transazione andata a buon fine non annulla l'addebito. Le chiamate vengono visualizzate nella Cronologia utilizzo e nel dashboard di amministrazione; la risposta JSON standard contiene usage, non un campo billing personalizzato. La ripetizione di una richiesta può comportare un ulteriore addebito; non è prevista alcuna idempotenza.
pip install openai
npm install openaiimport os
from openai import OpenAI
client = OpenAI(api_key=os.environ["KARMAN_API_KEY"], base_url="https://api.coldstart.win/v1", max_retries=0)
print([model.id for model in client.models.list().data])
model = os.environ["KARMAN_MODEL"]
messages = [{"role": "system", "content": "You are a helpful assistant."}, {"role": "user", "content": "Hello!"}]
reply = client.chat.completions.create(model=model, messages=messages, max_tokens=256)
print(reply.choices[0].message.content)
stream = client.chat.completions.create(model=model, messages=messages, max_tokens=256,
stream=True, stream_options={"include_usage": True})
for chunk in stream:
if chunk.choices:
print(chunk.choices[0].delta.content or "", end="", flush=True)
if chunk.usage:
print("\n", chunk.usage)import OpenAI from "openai";
const client = new OpenAI({ apiKey: process.env.KARMAN_API_KEY, baseURL: "https://api.coldstart.win/v1", maxRetries: 0 });
const models = await client.models.list();
console.log(models.data.map(model => model.id));
const stream = await client.chat.completions.create({
model: process.env.KARMAN_MODEL,
messages: [{ role: "user", content: "Hello!" }],
stream: true,
stream_options: { include_usage: true }
});
for await (const chunk of stream) {
process.stdout.write(chunk.choices[0]?.delta.content ?? "");
if (chunk.usage) console.log("\n", chunk.usage);
}Strumenti degli agenti e output strutturato
Consulta models[].capabilities in /v1/chat/catalog: tool_calling, parallel_tool_calls, json_mode, structured_outputs. Le capacità dipendono dal modello; quelle non supportate restituiscono HTTP 400 prima della generazione. Gli strumenti vengono eseguiti nella tua applicazione. L’API non esegue funzioni né conserva la memoria dell’agente.
Sono disponibili tools (fino a 128 funzioni), tool_choice (auto, none, required o funzione specifica) e parallel_tool_calls (booleano, richiede tools). Le funzioni accettano name, description, parameters JSON Schema e strict facoltativo. Leggi message.tool_calls; content può essere null. Conserva il messaggio assistant e aggiungi un messaggio role: "tool" per ogni chiamata con il relativo tool_call_id. Restituisci tutti i risultati, inclusi gli errori, prima del turno successivo. Mantieni ID univoci e ordine.
In streaming, raggruppa choices[0].delta.tool_calls per index, concatena i frammenti di function.arguments e conserva id, type, function.name. Esegui solo dopo finish_reason: "tool_calls" e la corretta fine del flusso, mai con length o errori. I delta degli strumenti reimpostano il timeout di inattività di 60 secondi; il primo output ha un limite di 90 secondi. Verifica nomi, argomenti e permessi e limita i turni.
response_format accetta text, json_object e json_schema con json_schema: {name, schema, strict, description?}. In modalità JSON richiedi esplicitamente JSON nel prompt. Gli schemi rigorosi richiedono tutte le proprietà in required e additionalProperties: false; null rappresenta valori facoltativi. Non combinare JSON Schema con parallel_tool_calls: true. Controlla refusal, length ed errori prima del parsing. Lo schema non garantisce accuratezza fattuale. Definizioni, argomenti e risultati contano nei token; ogni turno viene fatturato separatamente.
Ciclo completo degli strumenti
import os, json
from openai import OpenAI
client = OpenAI(api_key=os.environ["KARMAN_API_KEY"],
base_url="https://api.coldstart.win/v1", max_retries=0)
model = os.environ["KARMAN_MODEL"]
tools = [{"type": "function", "function": {
"name": "lookup_memory", "description": "Read a saved preference.",
"parameters": {"type": "object", "properties": {"topic": {"type": "string"}},
"required": ["topic"], "additionalProperties": False},
"strict": True
}}]
messages = [{"role": "user", "content": "What food do I like? Use my saved memory."}]
for _ in range(4):
reply = client.chat.completions.create(
model=model, messages=messages, tools=tools,
tool_choice="auto", parallel_tool_calls=False, max_tokens=512)
choice = reply.choices[0]
message = choice.message
if message.refusal or choice.finish_reason not in ("stop", "tool_calls"):
raise RuntimeError("Incomplete or refused response")
messages.append(message.model_dump(exclude_none=True))
if not message.tool_calls:
print(message.content)
break
for call in message.tool_calls:
try:
if call.function.name != "lookup_memory":
raise ValueError("Unknown function")
args = json.loads(call.function.arguments)
if not isinstance(args, dict) or set(args) != {"topic"} or not isinstance(args["topic"], str):
raise ValueError("Invalid arguments")
result = {"topic": args["topic"], "preference": "apples"}
except (ValueError, TypeError):
result = {"error": "Invalid tool request"}
messages.append({"role": "tool", "tool_call_id": call.id,
"content": json.dumps(result)})
else:
raise RuntimeError("Agent round limit reached")Esempio di output strutturato
reply = client.chat.completions.create(
model=model,
messages=[{"role": "user", "content": "I like apples. Extract this preference as JSON."}],
response_format={"type": "json_schema", "json_schema": {
"name": "memory", "strict": True,
"schema": {"type": "object", "properties": {"preference": {"type": "string"}},
"required": ["preference"], "additionalProperties": False}
}}, max_tokens=256)
choice = reply.choices[0]
if choice.finish_reason != "stop" or choice.message.refusal:
raise RuntimeError("Incomplete or refused response")
memory = json.loads(choice.message.content)
print(memory)