POST/v1/chat
असिस्टेंट के जवाब की स्ट्रीम (SSE)
chat
लोड बैलेंसर के पीछे API की कई कॉपियाँ हों (api.<domain> पता, 1.62.0), तो जवाब और उसके इवेंट का बफ़र उस कॉपी की मेमोरी में रहते हैं, जो उसे बनाती है। Last-Event-ID के साथ स्ट्रीम फिर से शुरू करना सिर्फ़ उसी कॉपी पर काम करता है।
उसी request_id और बातचीत वाली दोहराई गई रिक्वेस्ट, जो जवाब पूरा होने के बाद दूसरी कॉपी तक पहुँचती है, सवाल दोबारा पूछे बिना सेव किया गया जवाब पाती है (token और done, इवेंट 1 से क्रमांकित)। जो दोहराई गई रिक्वेस्ट जवाब बनते समय दूसरी कॉपी तक पहुँचती है, वह उस बनने को रोकती है और जवाब नए सिरे से बनाती है; दूसरा सवाल भी नहीं बनता। नए सिरे से बनाए बिना स्ट्रीम फिर से शुरू करने के लिए उसी कॉपी से कनेक्शन बनाए रखें या done इवेंट के बाद रिक्वेस्ट दोहराएँ।
ऑथेंटिकेशन
Authorization हेडर में API कुंजी भेजें: Authorization: Bearer <कुंजी>।
हेडर पैरामीटर
X-View-Asstringसिर्फ़
adminरोल वाली API कुंजियों के लिए। रिक्वेस्ट को डेटा प्रोफ़ाइल<profile>[:viewer|verifier|editor]की ओर से चलाता है, जैसेemployee:viewer। इंस्टॉलेशन कुंजी इस हेडर का इस्तेमाल नहीं कर सकती (403)।
कुकी पैरामीटर
kb_view_asstringसेशन के लिए “View as” मोड की कुकी।
POST /auth/view-asइसे सेट करता है औरDELETE /auth/view-asहटाता है।
रिक्वेस्ट बॉडी
application/json
items ≥ 1
collectionstringडिफ़ॉल्ट: "default"
tagsarray of string | nullexportstring | nullcard_idsarray of string | nullitems ≤ 50
streambooleanडिफ़ॉल्ट: false
conversation_idstring | nulllength ≤ 64
originstring | nulltoolsboolean | nullbypass_cachebooleanजवाब, जवाबों के कैश से न लें (कैश किए गए जवाब के नीचे “Get a fresh answer” बटन)। नया जवाब कैश की एंट्री की जगह ले लेता है।
डिफ़ॉल्ट: false
languagestring | nullजवाब की भाषा: उस भाषा में जवाब पाने के लिए ISO 639-1 कोड (
de,en,ru, …)।autoके साथ या फ़ील्ड के बिना भाषा सवाल से पहचानी जाती है। इंटरफ़ेस दूसरी भाषा वाले सुझाव की भाषा साफ़ तौर पर भेजता है (Starter.language)।scopeChatScope | nullसवाल का दायरा: कई कलेक्शन, एक स्रोत, टैग और एक अवधि। दायरे के कलेक्शन
collectionकी जगह लेते हैं। स्रोत जवाब को अपने कलेक्शन (और अपने कार्ड) तक सीमित करता है। टैगtagsमें जोड़े जाते हैं। अवधि वित्तीय जवाबों को उसी अवधि तक सीमित करती है। आप सिर्फ़ वही चुन सकते हैं, जो यूज़र को दिखता है (कलेक्शन:collections.no_access/collections.not_found; स्रोत:sources.not_found)।conversation_idके साथ दायरा बातचीत में सेव होता है। फ़ील्ड के बिना बातचीत का दायरा लागू होता है;nullया ख़ाली दायरा उसे साफ़ कर देता है।request_idstringसवाल की आइडेम्पोटेंसी कुंजी। एक सवाल के लिए स्ट्रीम की हर रीट्राई में वही कुंजी भेजें (कनेक्शन टूटने के बाद रीट्राई; यहाँ
Last-Event-IDस्ट्रीम को आगे नहीं बढ़ाता और सिर्फ़ लॉग होता है)। पहले से सेव हुए जवाब की कुंजी वाली रीट्राई दूसरा सवाल नहीं बनाती: सेव किया गया नतीजा एकdoneइवेंट के रूप में दोबारा भेजा जाता है (और टेक्स्ट के साथ एकtoken), भले ही सवालों या क्रेडिट की सीमा ख़त्म हो चुकी हो। अगर डिस्कनेक्ट हुए क्लाइंट के लिए पिछला जवाब अभी तैयार हो रहा है, तो उसकी तैयारी रुक जाती है और जवाब नए सिरे से तैयार होता है।length ≤ 64
version_ofinteger (int64)बातचीत में इस सवाल वाले संदेश का नया वर्शन बनाता है (फ़ीड से
question_id): बदला हुआ सवाल (messagesमें नया टेक्स्ट), दोबारा तैयार किया गया जवाब (वही टेक्स्ट, आम तौर परbypass_cacheके साथ) या किसी दूसरेqualityके साथ वही सवाल (उदाहरण के लिए,fastजवाब के बादprecise)। पिछला सवाल-जवाब का जोड़ा बना रहता है। उसके बाद के संदेश उसकी शाखा में रहते हैं और जब तक नया वर्शन चुना हुआ है, फ़ीड में छिपे रहते हैं (FeedItem.versions,POST /v1/conversations/{conv_id}/versions)। जवाब के लिए इस्तेमाल होने वाला इतिहास इस संदेश तक की चुनी हुई शाखा है। वर्शन काqualityबातचीत की सेटिंग्स नहीं बदलता।conversation_idज़रूरी है; किसी दूसरी बातचीत का सवाल404 questions.not_foundलौटाता है।qualitystringनतीजे के पीछे की खोज में रफ़्तार और सटीकता का संतुलन:
fastज़्यादा तेज़ है,preciseज़्यादा सटीक। डिफ़ॉल्ट:precise।मान्य मान:
fastprecise
रिस्पॉन्स
200`stream=true` के साथ: `text/event-stream`। हर इवेंट में `id: <number>` (स्ट्रीम में इवेंट का क्रम नंबर, 1 से शुरू) और `data: <JSON>` पंक्तियाँ होती हैं, और उसके बाद एक ख़ाली पंक्ति। `event:` और `retry:` फ़ील्ड इस्तेमाल नहीं होते; इवेंट टाइप `type` फ़ील्ड में होता है (`ChatEvent`)।
stream=true के साथ: text/event-stream। हर इवेंट में id: <number> (स्ट्रीम में इवेंट का क्रम नंबर, 1 से शुरू) और data: <JSON> पंक्तियाँ होती हैं, और उसके बाद एक ख़ाली पंक्ति। event: और retry: फ़ील्ड इस्तेमाल नहीं होते; इवेंट टाइप type फ़ील्ड में होता है (ChatEvent)।
request_id वाले सवाल का जवाब कनेक्शन से अलग दिया जाता है। कनेक्शन टूटने से जवाब नहीं रुकता: वह पूरा होता है और बातचीत में सेव होता है (10 मिनट तक)। वही रिक्वेस्ट दोहराने (वही request_id और बातचीत) पर वह चल रहे जवाब से जुड़ जाती है, और Last-Event-ID हेडर के साथ उस नंबर के बाद के इवेंट पाती है, इसलिए स्ट्रीम उन्हीं इवेंट नंबरों के साथ जारी रहती है। अगर स्ट्रीम उस नंबर से जारी नहीं रह सकती, तो दोहराई गई रिक्वेस्ट को शुरू से स्ट्रीम मिलती है: तब पहले इवेंट का नंबर Last-Event-ID से बड़ा नहीं होता, और क्लाइंट जवाब शुरू से दिखाता है। अगर जवाब पहले ही पूरा हो चुका है और उसके इवेंट का बफ़र छोड़ दिया गया है (3 मिनट बाद), तो सेव किया गया नतीजा सवाल दोबारा पूछे बिना फिर से भेजा जाता है (token और done, 1 से क्रमांकित); वरना जवाब नए सिरे से बनता है। ऐसे जवाब को रोकने के लिए POST /v1/chat/cancel कॉल करें। request_id के बिना क्लाइंट का कनेक्शन टूटने पर जवाब रद्द हो जाता है।
पहले इवेंट के बाद, जब तक जवाब बन रहा है, सर्वर हर 15 सेकंड में : ping कमेंट भेजता है; इसे छोड़ दें। इवेंट का क्रम: stage इवेंट (प्रगति), meta, sources, data, फिर token इवेंट में जवाब का टेक्स्ट, फिर done। जवाब के टेक्स्ट से पहले sources और data दोहराए जा सकते हैं और tool इवेंट आ सकते हैं; टेक्स्ट एक token में या हिस्सों में आ सकता है। कैश से जवाब: meta (cached के साथ), sources, data, token, done। स्ट्रीम शुरू होने के बाद की एरर error इवेंट के रूप में आती है, और स्ट्रीम done के बिना बंद हो जाती है; स्ट्रीम का HTTP स्टेटस हमेशा 200 होता है। done के बाद अगले सुझाए गए सवालों के साथ followups इवेंट आ सकता है। जिन इवेंट टाइप को आप हैंडल नहीं करते, उन्हें अनदेखा करें।
stream=false के साथ: AnswerResponse बॉडी वाला application/json (साथ में conversation_id)।
रिस्पॉन्स हेडर
RateLimit-Policyलागू सीमाएँ, IETF ड्राफ़्ट
draft-ietf-httpapi-ratelimit-headersके फ़ॉर्मेट में: कॉमा से अलग आइटम"<name>";q=<quota>;w=<window in seconds>।keyAPI कुंजी की रिक्वेस्ट दर है (कोटा बर्स्ट है, विंडो उसके पूरी तरह भरने का समय है; सेशन के लिए यहuserहै, बिना क्रेडेंशियल केip);minute,dayऔरmonthUTC में कैलेंडर मिनट, दिन और महीने के लिए संगठन के कोटा हैं।RateLimitRateLimit-Policyकी हर सीमा में से कितना बचा है:"<name>";r=<remaining>;t=<seconds until reset>।X-RateLimit-LimitRateLimit-Policyकी सबसे सख़्त एंट्री की सीमा (जिसमें सबसे कम रिक्वेस्ट बची हैं)।X-RateLimit-Remainingसबसे सख़्त सीमा में बची रिक्वेस्ट।
X-RateLimit-Resetसबसे सख़्त सीमा के रीसेट होने तक के सेकंड।
text/event-stream
application/json
answerstringज़रूरीquestion_idintegerज़रूरीquerystringcollectionstringज़रूरीprovenancearray of NumberProvenanceemptystringमान्य मान:
no_hitsrestrictedguardrailno_data_for_periodbasisAnswerBasisverificationAnswerVerificationalt_periodsarray of AnswerAltPerioditems ≤ 6
drilldownarray of AnswerDrilldownitems ≤ 20
restrictedRestrictedInfoguardrailGuardrailVerdictverified_onlybooleancachedbooleancache_hitAnswerCacheHitout_of_scopeAnswerOutOfScopeattachmentsarray of Attachmentexport_errorstringtoolsstring | nullइस जवाब के लिए टूल क्यों इस्तेमाल हुए:
request(साफ़ तौर पर माँगा गया);compare,compute,action(सवाल के आधार पर);needs_calc(टेबल पर गणना ज़रूरी है);summary(कलेक्शन या दस्तावेज़ों का सार);mcp(संगठन ने बाहरी MCP सर्वर कनेक्ट किए हैं)।मान्य मान:
requestcomparecomputeactionneeds_calcsummarymcpnulltool_callsarray of ToolCallInfocalculationsarray of Calculationpending_actionsarray of PendingActionconversation_idstringसिर्फ़ बातचीत वाले
POST /v1/chatके लिए।answer_idstringजवाब के ऑब्जेक्ट का ID।
400रिक्वेस्ट अमान्य है: पैरामीटर का मान या ऑब्जेक्ट की स्थिति यह कार्रवाई करने नहीं देती (`detail` एक संदेश है)।
रिस्पॉन्स हेडर
RateLimit-Policyलागू सीमाएँ, IETF ड्राफ़्ट
draft-ietf-httpapi-ratelimit-headersके फ़ॉर्मेट में: कॉमा से अलग आइटम"<name>";q=<quota>;w=<window in seconds>।keyAPI कुंजी की रिक्वेस्ट दर है (कोटा बर्स्ट है, विंडो उसके पूरी तरह भरने का समय है; सेशन के लिए यहuserहै, बिना क्रेडेंशियल केip);minute,dayऔरmonthUTC में कैलेंडर मिनट, दिन और महीने के लिए संगठन के कोटा हैं।RateLimitRateLimit-Policyकी हर सीमा में से कितना बचा है:"<name>";r=<remaining>;t=<seconds until reset>।X-RateLimit-LimitRateLimit-Policyकी सबसे सख़्त एंट्री की सीमा (जिसमें सबसे कम रिक्वेस्ट बची हैं)।X-RateLimit-Remainingसबसे सख़्त सीमा में बची रिक्वेस्ट।
X-RateLimit-Resetसबसे सख़्त सीमा के रीसेट होने तक के सेकंड।
application/json
401कोई क्रेडेंशियल नहीं भेजा गया (न सेशन कुकी, न API कुंजी), या कुंजी नहीं मिली।
रिस्पॉन्स हेडर
RateLimit-Policyलागू सीमाएँ, IETF ड्राफ़्ट
draft-ietf-httpapi-ratelimit-headersके फ़ॉर्मेट में: कॉमा से अलग आइटम"<name>";q=<quota>;w=<window in seconds>।keyAPI कुंजी की रिक्वेस्ट दर है (कोटा बर्स्ट है, विंडो उसके पूरी तरह भरने का समय है; सेशन के लिए यहuserहै, बिना क्रेडेंशियल केip);minute,dayऔरmonthUTC में कैलेंडर मिनट, दिन और महीने के लिए संगठन के कोटा हैं।RateLimitRateLimit-Policyकी हर सीमा में से कितना बचा है:"<name>";r=<remaining>;t=<seconds until reset>।X-RateLimit-LimitRateLimit-Policyकी सबसे सख़्त एंट्री की सीमा (जिसमें सबसे कम रिक्वेस्ट बची हैं)।X-RateLimit-Remainingसबसे सख़्त सीमा में बची रिक्वेस्ट।
X-RateLimit-Resetसबसे सख़्त सीमा के रीसेट होने तक के सेकंड।
application/json
403कार्रवाई की अनुमति नहीं है: रोल काफ़ी नहीं है, कलेक्शन या कार्ड तक ऐक्सेस नहीं है, रिक्वेस्ट “View as” मोड में चल रही है, या संगठन निलंबित है या हटा दिया गया है (`detail` एक ऑब्जेक्ट है, जिसमें `code: org_suspended | org_deleted` है)।
रिस्पॉन्स हेडर
RateLimit-Policyलागू सीमाएँ, IETF ड्राफ़्ट
draft-ietf-httpapi-ratelimit-headersके फ़ॉर्मेट में: कॉमा से अलग आइटम"<name>";q=<quota>;w=<window in seconds>।keyAPI कुंजी की रिक्वेस्ट दर है (कोटा बर्स्ट है, विंडो उसके पूरी तरह भरने का समय है; सेशन के लिए यहuserहै, बिना क्रेडेंशियल केip);minute,dayऔरmonthUTC में कैलेंडर मिनट, दिन और महीने के लिए संगठन के कोटा हैं।RateLimitRateLimit-Policyकी हर सीमा में से कितना बचा है:"<name>";r=<remaining>;t=<seconds until reset>।X-RateLimit-LimitRateLimit-Policyकी सबसे सख़्त एंट्री की सीमा (जिसमें सबसे कम रिक्वेस्ट बची हैं)।X-RateLimit-Remainingसबसे सख़्त सीमा में बची रिक्वेस्ट।
X-RateLimit-Resetसबसे सख़्त सीमा के रीसेट होने तक के सेकंड।
application/json
404ऑब्जेक्ट मौजूद नहीं है या आपके लिए उपलब्ध नहीं है। API यह पुष्टि नहीं करता कि प्रतिबंधित ऑब्जेक्ट मौजूद है।
रिस्पॉन्स हेडर
RateLimit-Policyलागू सीमाएँ, IETF ड्राफ़्ट
draft-ietf-httpapi-ratelimit-headersके फ़ॉर्मेट में: कॉमा से अलग आइटम"<name>";q=<quota>;w=<window in seconds>।keyAPI कुंजी की रिक्वेस्ट दर है (कोटा बर्स्ट है, विंडो उसके पूरी तरह भरने का समय है; सेशन के लिए यहuserहै, बिना क्रेडेंशियल केip);minute,dayऔरmonthUTC में कैलेंडर मिनट, दिन और महीने के लिए संगठन के कोटा हैं।RateLimitRateLimit-Policyकी हर सीमा में से कितना बचा है:"<name>";r=<remaining>;t=<seconds until reset>।X-RateLimit-LimitRateLimit-Policyकी सबसे सख़्त एंट्री की सीमा (जिसमें सबसे कम रिक्वेस्ट बची हैं)।X-RateLimit-Remainingसबसे सख़्त सीमा में बची रिक्वेस्ट।
X-RateLimit-Resetसबसे सख़्त सीमा के रीसेट होने तक के सेकंड।
application/json
422वैलिडेशन एरर: बॉडी या पैरामीटर स्कीमा से मेल नहीं खाते (`detail` वैलिडेशन एरर की सूची है), या पैरामीटर का मान सीमा से बाहर है (`detail` एक संदेश है)।
रिस्पॉन्स हेडर
RateLimit-Policyलागू सीमाएँ, IETF ड्राफ़्ट
draft-ietf-httpapi-ratelimit-headersके फ़ॉर्मेट में: कॉमा से अलग आइटम"<name>";q=<quota>;w=<window in seconds>।keyAPI कुंजी की रिक्वेस्ट दर है (कोटा बर्स्ट है, विंडो उसके पूरी तरह भरने का समय है; सेशन के लिए यहuserहै, बिना क्रेडेंशियल केip);minute,dayऔरmonthUTC में कैलेंडर मिनट, दिन और महीने के लिए संगठन के कोटा हैं।RateLimitRateLimit-Policyकी हर सीमा में से कितना बचा है:"<name>";r=<remaining>;t=<seconds until reset>।X-RateLimit-LimitRateLimit-Policyकी सबसे सख़्त एंट्री की सीमा (जिसमें सबसे कम रिक्वेस्ट बची हैं)।X-RateLimit-Remainingसबसे सख़्त सीमा में बची रिक्वेस्ट।
X-RateLimit-Resetसबसे सख़्त सीमा के रीसेट होने तक के सेकंड।
application/json
429बहुत ज़्यादा रिक्वेस्ट (`api.rate_limited`), संगठन का मिनट, दिन या महीने का कोटा ख़त्म हो गया है (`api.quota_exceeded`; `error.details` में `quota`, `limit` और `reset_at` होते हैं), संगठन की सीमा पूरी हो गई है, या जवाब देने वाली सर्विस व्यस्त है (`answers.engine_busy`)। `Retry-After` हेडर में दिए गए समय तक इंतज़ार करें।
रिस्पॉन्स हेडर
Retry-Afterरिक्वेस्ट का रीट्राई करने से पहले कितने सेकंड इंतज़ार करना है।
RateLimit-Policyलागू सीमाएँ, IETF ड्राफ़्ट
draft-ietf-httpapi-ratelimit-headersके फ़ॉर्मेट में: कॉमा से अलग आइटम"<name>";q=<quota>;w=<window in seconds>।keyAPI कुंजी की रिक्वेस्ट दर है (कोटा बर्स्ट है, विंडो उसके पूरी तरह भरने का समय है; सेशन के लिए यहuserहै, बिना क्रेडेंशियल केip);minute,dayऔरmonthUTC में कैलेंडर मिनट, दिन और महीने के लिए संगठन के कोटा हैं।RateLimitRateLimit-Policyकी हर सीमा में से कितना बचा है:"<name>";r=<remaining>;t=<seconds until reset>।X-RateLimit-LimitRateLimit-Policyकी सबसे सख़्त एंट्री की सीमा (जिसमें सबसे कम रिक्वेस्ट बची हैं)।X-RateLimit-Remainingसबसे सख़्त सीमा में बची रिक्वेस्ट।
X-RateLimit-Resetसबसे सख़्त सीमा के रीसेट होने तक के सेकंड।
application/json
एरर कोड
हर रिक्वेस्ट के सामान्य कोड के अलावा वे कोड, जो यह एंडपॉइंट एरर होने पर error.code में लौटा सकता है।
- 400answers.empty_question
- 409answers.external_ai_disabled
- 400answers.last_message_not_user
- 404answers.no_collections
- 422answers.scope_invalid
- 401auth.not_authenticated
- 403auth.system_scope
- 403collections.no_access
- 404collections.not_found
- 404conversations.not_found
- 422conversations.title_empty
- 429limits.concurrent_answers
- 429limits.questions
- 403org.deleted
- 403org.suspended
- 404sources.not_found
- 403view_as.read_only
सुरक्षित रीट्राई
हर POST और PATCH के साथ Idempotency-Key हेडर भेजें (उदाहरण के लिए, UUID)। 24 घंटे के अंदर उसी कुंजी के साथ रीट्राई करने पर रिक्वेस्ट दोबारा नहीं चलती, बल्कि सेव किया गया रिस्पॉन्स लौटता है।
रेट लिमिट
रिस्पॉन्स में RateLimit और RateLimit-Policy हेडर होते हैं, और पहले वाले X-RateLimit-Limit, X-RateLimit-Remaining और X-RateLimit-Reset भी। 429 रिस्पॉन्स में Retry-After सेकंड में होता है: उतना इंतज़ार करें और रीट्राई करें।