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)
import OpenAI from "openai"; const client = new OpenAI({ apiKey: "cg-live-XXXXXXXX", baseURL: "https://api.chatgrap.ai/v1" }); const r = await client.chat.completions.create({ model: "chatgrap-flash", messages: [{ role: "user", content: "Salom!" }], }); console.log(r.choices[0].message.content);
curl https://api.chatgrap.ai/v1/chat/completions \ -H "Authorization: Bearer cg-live-XXXXXXXX" \ -H "Content-Type: application/json" \ -d '{"model": "chatgrap-flash", "messages": [{"role": "user", "content": "Salom!"}]}'
Tez boshlash
cg-live- bilan boshlanadi va faqat bir marta ko'rsatiladi.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
| Metod | Yo'l | Tavsif |
|---|---|---|
| POST | /v1/chat/completions | Suhbat (stream qo'llab-quvvatlanadi) |
| POST | /v1/embeddings | Matn embeddinglari (vektor) |
| WSS | /v1/live | Jonli ovozli suhbat (real vaqt) — batafsil |
| POST | /v1/live/token | Brauzer uchun bir martalik jonli ulanish tokeni |
| GET | /v1/models | Mavjud modellar |
| GET | /health | Xizmat 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
wss://api.chatgrap.ai/v1/live?token=… ga ulaning, mikrofon ovozini yuboring va AI ovozini ijro eting (pastdagi JavaScript namunasi — o'zgarishsiz ishlaydi).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 } });
// live-token.php → { url } $ch = curl_init("https://api.chatgrap.ai/v1/live/token"); curl_setopt_array($ch, [CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => ["Authorization: Bearer " . getenv("CHATGRAP_KEY")]]); header("Content-Type: application/json"); echo curl_exec($ch);
curl -X POST https://api.chatgrap.ai/v1/live/token \ -H "Authorization: Bearer cg-live-XXXXXXXX" # → {"token":"cgls_…","expires_in":120,"url":"wss://api.chatgrap.ai/v1/live?token=cgls_…","price_per_minute":0.03}
Xabarlar tartibi
| Kim | Xabar | Ma'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 |
| Server | serverContent.modelTurn.parts[].inlineData | AI ovozi: PCM16, 24 kHz, base64 |
| Server | inputTranscription / outputTranscription | Sizning va AI gapining yozma matni |
| Server | interrupted / turnComplete | Gapini 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)
// 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)
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
| Model | Qachon ishlatish |
|---|---|
chatgrap-flash | Kundalik suhbat va botlar uchun — tavsiya etiladi |
chatgrap-flash-lite | Eng tez va arzon, qisqa javoblar |
chatgrap-pro | Murakkabroq vazifalar |
gemini-flash-latest | To'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
| Kod | Ma'nosi va yechimi |
|---|---|
401 | Kalit yo'q, noto'g'ri yoki o'chirilgan — Authorization: Bearer … sarlavhasini va kalit to'liq nusxalanganini tekshiring. |
402 | Balans yetarli emas — balansni to'ldiring. |
429 | Daqiqasiga so'rovlar chegarasidan oshdi — biroz kutib qayta urining. |
5xx | Vaqtinchalik xato — bir necha soniyadan keyin qayta urining. |