SweetRouterAPI

Reference API

Chat completions

Pošlete konverzaci a dostanete další odpověď postavy. Endpoint dodržuje formát chat completions od OpenAI.
POST/v1/chat/completions

Příklad

Funguje s libovolným OpenAI SDK. Nastavte base URL na https://api.sweetrouter.com/v1 a model na sweet-character-1.

python
# pip install openai
import os
from openai import OpenAI

client = OpenAI(
    base_url="https://api.sweetrouter.com/v1",
    api_key=os.environ["SWEETROUTER_API_KEY"],
)

reply = client.chat.completions.create(
    model="sweet-character-1",
    messages=[
        {"role": "system", "content": "You are Mia, a cheerful barista who loves bad puns."},
        {"role": "user", "content": "Hi Mia! What should I order today?"},
    ],
    max_tokens=300,
)
print(reply.choices[0].message.content)

Tělo požadavku

Chat completions
PoleTypPopis
model
Povinné
stringVždy sweet-character-1.
messages
Povinné
arrayKonverzace od nejstarší zprávy. Každá položka má role (system, user nebo assistant) a textový content. Až 200 zpráv a 60 000 znaků, alespoň jedna zpráva od uživatele.
max_tokens
Volitelné
integerNejdelší povolená odpověď, 1 až 4 096. Výchozí 1 024. Funguje i max_completion_tokens.
temperature
Volitelné
number0 až 2. Vyšší hodnota dává pestřejší odpovědi.
top_p
Volitelné
number0 až 1. Alternativa k temperature; měňte jen jedno z nich.
frequency_penalty / presence_penalty
Volitelné
number-2 až 2. Kladné hodnoty omezují opakování.
stop
Volitelné
string | string[]Až 4 sekvence, na kterých odpověď skončí.
stream
Volitelné
booleanVýchozí false. S true se odpověď streamuje. Viz Streamování.
stream_options.include_usage
Volitelné
booleanPři streamování nastavte true a spotřebu tokenů dostanete v posledním chunku.
user
Volitelné
stringVolitelné id vašeho koncového uživatele, uložené u volání ve vašich záznamech. Až 256 znaků.

Odpověď

json
{
  "id": "chatcmpl-cmg8x2k0d0003",
  "object": "chat.completion",
  "created": 1791105133,
  "model": "sweet-character-1",
  "choices": [
    {
      "index": 0,
      "message": { "role": "assistant", "content": "A latte, obviously. I'd never steer you wrong, that would be a grave misdeed... or a grave mis-bean." },
      "finish_reason": "stop"
    }
  ],
  "usage": { "prompt_tokens": 41, "completion_tokens": 27, "total_tokens": 68 },
  "sweetrouter": { "job_id": "cmg8x2k0d0003", "cost_usd": "0.00012" }
}

usage ukazuje tokeny, za které platíte. sweetrouter.job_id identifikuje volání v záznamech v konzoli a sweetrouter.cost_usd je jeho přesná cena.

Konverzace o více výměnách

API je bezstavové, stejně jako u OpenAI: předchozí volání si nepamatuje. Když chcete v konverzaci pokračovat, držte zprávy ve své aplikaci a s každým požadavkem pošlete všechny: systémovou zprávu, předchozí výměny uživatele a asistenta a nakonec novou zprávu uživatele.

python
history = [{"role": "system", "content": "You are Mia, a cheerful barista."}]

def say(text):
    history.append({"role": "user", "content": text})
    reply = client.chat.completions.create(model="sweet-character-1", messages=history)
    answer = reply.choices[0].message.content
    history.append({"role": "assistant", "content": answer})
    return answer

say("Hi Mia!")
say("What did I just say to you?")  # Mia remembers, because the history is sent again

Požadavek pojme až 200 zpráv a 60 000 znaků a delší historie stojí víc vstupních tokenů. Ponechte systémovou zprávu a nejnovější výměny:

python
MAX_TURNS = 40  # keep the last 40 user and assistant messages

def build_messages(system_prompt, history, user_text):
    recent = history[-MAX_TURNS:]
    return [{"role": "system", "content": system_prompt}, *recent, {"role": "user", "content": user_text}]

Streamování

Nastavte stream: true a odpověď budete dostávat průběžně, jak vzniká. Stream má formát chunků OpenAI: první chunk s rolí, jeden chunk na každý kus textu, poslední chunk s finish_reason, volitelný chunk se spotřebou a nakonec data: [DONE].

python
stream = client.chat.completions.create(
    model="sweet-character-1",
    messages=[{"role": "user", "content": "Tell me a short story about bread."}],
    stream=True,
    stream_options={"include_usage": True},
)
for chunk in stream:
    if chunk.choices and chunk.choices[0].delta.content:
        print(chunk.choices[0].delta.content, end="", flush=True)

API nikdy nevolejte z prohlížeče, prozradili byste klíč. Volejte ho ze svého serveru a stream přepošlete dál:

next.js
// app/api/chat/route.ts (Next.js). Your key stays on the server.
import OpenAI from "openai"

const client = new OpenAI({
  baseURL: "https://api.sweetrouter.com/v1",
  apiKey: process.env.SWEETROUTER_API_KEY,
})

export async function POST(request: Request) {
  const { messages } = await request.json()
  const stream = await client.chat.completions.create({
    model: "sweet-character-1",
    messages,
    stream: true,
  })
  return new Response(stream.toReadableStream(), {
    headers: { "Content-Type": "text/event-stream" },
  })
}
  • Když volání selže před prvním slovem, dostanete běžnou JSON chybu se stavovým kódem HTTP.
  • Když selže uprostřed odpovědi, poslední chunk nese objekt error a nic se neúčtuje.
  • Když se váš klient odpojí, odpověď se i tak dokončí a naúčtují se použité tokeny.

Kompatibilita

Jen text. Obrázky, zvuk, volání nástrojů a response_format nejsou podporované a n je vždy 1.

Viz také