Hujjatlar

ChatGRAP API

Bitta kalit bilan chat, streaming, embeddings va jonli ovozli suhbat. OpenAI SDK bilan to'liq mos — mavjud kodingizda faqat base_url va kalitni almashtirasiz.

from openai import OpenAI

client = OpenAI(api_key="cg-live-XXXXXXXX", base_url="https://api.chatgrap.ai/v1")
r = client.chat.completions.create(
    model="chatgrap-flash",
    messages=[{"role": "user", "content": "Salom! O'zbekcha javob ber."}],
)
print(r.choices[0].message.content)

Tez boshlash

1
Kalit yaratingAPI kalitlar sahifasida ChatGRAP akkauntingiz bilan kiring va kalit yarating. Kalit cg-live- bilan boshlanadi va faqat bir marta ko'rsatiladi.
2
Balansni to'ldiringAPI faqat balansdan ishlaydi — ishlatilgan token bo'yicha yechiladi, tarif obunasiga kirmaydi. Balansni to'ldirish →
3
So'rov yuboringYuqoridagi namunada cg-live-XXXXXXXX o'rniga kalitingizni qo'ying.

Autentifikatsiya

Har bir so'rovda kalitni sarlavhada yuboring. Kalitni brauzer kodiga yoki ommaviy repoga qo'ymang — faqat serveringizda saqlang.

Authorization: Bearer cg-live-XXXXXXXX

Endpoint'lar

Asosiy manzil: https://api.chatgrap.ai/v1

MetodYo'lTavsif
POST/v1/chat/completionsSuhbat (stream qo'llab-quvvatlanadi)
POST/v1/embeddingsMatn embeddinglari (vektor)
WSS/v1/liveJonli ovozli suhbat (real vaqt) — batafsil
POST/v1/live/tokenBrauzer uchun bir martalik jonli ulanish tokeni
GET/v1/modelsMavjud modellar
POST/v1/chat/completionsAgent bilan suhbat: "model": "agent-<nom>" — agent-chatgrap, agent-kotiba, agent-ustoz, agent-oshpaz
GET/healthXizmat holati

Streaming

"stream": true qo'shsangiz javob SSE (text/event-stream) ko'rinishida, OpenAI formatida bo'lak-bo'lak keladi.

{ "model": "chatgrap-flash", "stream": true, "messages": [...] }

Embeddings

curl https://api.chatgrap.ai/v1/embeddings \
  -H "Authorization: Bearer cg-live-XXXXXXXX" \
  -H "Content-Type: application/json" \
  -d '{"input": "salom dunyo"}'

Jonli ovoz (Live)

Chatdagi jonli suhbat kabi: ovoz real vaqtda ikki tomonga oqadi, AI gapni tugatishingiz bilan javob beradi (odatda ~0.6 s). Ulanish — WebSocket:

wss://api.chatgrap.ai/v1/live

Kirish ikki xil: serverdan — Authorization: Bearer cg-live-… sarlavhasi bilan; brauzerdan — kalitni ochmaslik uchun avval serveringizda bir martalik token oling (POST /v1/live/token, 2 daqiqa amal qiladi) va ?token=cgls_… bilan ulaning.

Narx: $0.03 / daqiqa, balansdan — har daqiqa boshida oldindan yechiladi. Bitta sessiya ko'pi bilan 60 daqiqa, bir vaqtda 3 ta ulanish.

Ulash tartibi

1
Kalit va balansAPI kalit yarating va balansni to'ldiring — jonli ovoz daqiqasiga balansdan yechiladi.
2
Serveringizda token manziliKalit faqat serveringizda turadi: brauzer sizning manzilingizdan bir martalik token oladi (pastdagi Node.js yoki PHP namunasi).
3
Brauzerda ulanishToken bilan wss://api.chatgrap.ai/v1/live?token=… ga ulaning, mikrofon ovozini yuboring va AI ovozini ijro eting (pastdagi JavaScript namunasi — o'zgarishsiz ishlaydi).
4
Bot yoki server ilovasiBrauzer bo'lmasa token shart emas — kalitni Authorization sarlavhasida berib to'g'ridan-to'g'ri ulaning (Python namunasi).

Serveringizda token berish

// Express: GET /live-token → { url } (kalit .env da, brauzerga berilmaydi)
app.get("/live-token", async (req, res) => {
  const r = await fetch("https://api.chatgrap.ai/v1/live/token", {
    method: "POST", headers: { Authorization: "Bearer " + process.env.CHATGRAP_KEY },
  });
  res.json(await r.json());   // { token, url, expires_in, price_per_minute }
});

Xabarlar tartibi

KimXabarMa'nosi
Siz{"config": {...}}Birinchi xabar: instructions (AI roli), voice (Kore, Puck, Aoede, Charon…), modalities: ["AUDIO"] yoki ["TEXT"], tools
Server{"setupComplete": {...}}Ulanish tayyor — gapirishingiz mumkin
Siz{"realtimeInput": {"audio": {...}}}Mikrofon: PCM16, 16 kHz, mono, base64 — mimeType: "audio/pcm;rate=16000", 100 ms bo'laklarda
Siz{"clientContent": {...}}Matnli savol: turns + "turnComplete": true
ServerserverContent.modelTurn.parts[].inlineDataAI ovozi: PCM16, 24 kHz, base64
ServerinputTranscription / outputTranscriptionSizning va AI gapining yozma matni
Serverinterrupted / turnCompleteGapini bo'ldingiz (ovozni to'xtating) / AI javobi tugadi
Server{"error": {"code", "message"}}4001 kirish rad etildi · 4002 balans yetarli emas · 4029 juda ko'p ulanish · 4008 vaqt tugadi · 4500 xizmat xatosi

Brauzer (mikrofon → AI ovozi)

JavaScript
// 1) Serveringiz kalit bilan token oladi: POST https://api.chatgrap.ai/v1/live/token → { url }
const { url } = await fetch("/sizning-backend/live-token").then(r => r.json());
const ws = new WebSocket(url);
ws.onopen = () => ws.send(JSON.stringify({ config: { voice: "Kore", instructions: "Sen do'kon yordamchisisan" } }));

// 2) Mikrofon → 16 kHz PCM16
const mic = new AudioContext({ sampleRate: 16000 });
const src = mic.createMediaStreamSource(await navigator.mediaDevices.getUserMedia({ audio: true }));
const proc = mic.createScriptProcessor(2048, 1, 1);
proc.onaudioprocess = (e) => {
  const f = e.inputBuffer.getChannelData(0), pcm = new Int16Array(f.length);
  for (let i = 0; i < f.length; i++) pcm[i] = Math.max(-1, Math.min(1, f[i])) * 32767;
  if (ws.readyState === 1) ws.send(JSON.stringify({ realtimeInput: { audio: {
    data: btoa(String.fromCharCode(...new Uint8Array(pcm.buffer))), mimeType: "audio/pcm;rate=16000" } } }));
};
src.connect(proc); proc.connect(mic.destination);

// 3) AI ovozi — 24 kHz PCM16, ketma-ket ijro
const out = new AudioContext({ sampleRate: 24000 }); let t = 0;
ws.onmessage = (ev) => {
  const d = JSON.parse(ev.data);
  for (const p of d.serverContent?.modelTurn?.parts || []) {
    if (!p.inlineData) continue;
    const raw = Uint8Array.from(atob(p.inlineData.data), (c) => c.charCodeAt(0)), pcm = new Int16Array(raw.buffer);
    const buf = out.createBuffer(1, pcm.length, 24000);
    buf.getChannelData(0).set(Float32Array.from(pcm, (x) => x / 32768));
    const s = out.createBufferSource(); s.buffer = buf; s.connect(out.destination);
    t = Math.max(t, out.currentTime); s.start(t); t += buf.duration;
  }
};

Python (serverdan, matnli javob)

Python · aiohttp
import asyncio, json, aiohttp

async def main():
    async with aiohttp.ClientSession() as s, s.ws_connect("wss://api.chatgrap.ai/v1/live",
            headers={"Authorization": "Bearer cg-live-XXXXXXXX"}) as ws:
        await ws.send_json({"config": {"modalities": ["TEXT"]}})
        async for m in ws:
            d = json.loads(m.data)
            if "setupComplete" in d:
                await ws.send_json({"clientContent": {"turns": [{"role": "user", "parts": [{"text": "Salom!"}]}], "turnComplete": True}})
            for p in d.get("serverContent", {}).get("modelTurn", {}).get("parts", []):
                print(p.get("text", ""), end="")
            if d.get("serverContent", {}).get("turnComplete"): break

asyncio.run(main())

Modellar

ModelQachon ishlatish
chatgrap-flashKundalik suhbat va botlar uchun — tavsiya etiladi
chatgrap-flash-liteEng tez va arzon, qisqa javoblar
chatgrap-proMurakkabroq vazifalar
gemini-flash-latestTo'g'ridan-to'g'ri Gemini Flash

OpenAI nomlari (gpt-4o, gpt-4o-mini, gpt-3.5-turbo) ham qabul qilinadi va mos modelga yo'naltiriladi.

Xatolar

KodMa'nosi va yechimi
401Kalit yo'q, noto'g'ri yoki o'chirilgan — Authorization: Bearer … sarlavhasini va kalit to'liq nusxalanganini tekshiring.
402Balans yetarli emas — balansni to'ldiring.
429Daqiqasiga so'rovlar chegarasidan oshdi — biroz kutib qayta urining.
5xxVaqtinchalik xato — bir necha soniyadan keyin qayta urining.