मुख्य बिंदु
- लेबल URL पथों, JSON अनुरोध और प्रतिक्रिया के स्वरूप, Bearer प्रमाणीकरण और SSE स्ट्रीमिंग को कवर करता है।
- यह इस बात के बारे में कुछ नहीं बताता कि कौन सा मॉडल उत्तर देता है, वह कैसे व्यवहार करता है, या उसकी लागत क्या है।
- स्विचिंग आमतौर पर दो मान बदलने का मतलब है: बेस URL और API कुंजी।
- किसी प्रदाता पर भरोसा करने से पहले स्ट्रीमिंग, टूल्स, JSON मोड और त्रुटि कोड का परीक्षण करें।
संक्षिप्त उत्तर
जब कोई प्रदाता कहता है कि उसका API openai-compatible है, तो इसका मतलब है कि वह OpenAI क्लाइंट लाइब्रेरीज द्वारा भेजे जाने वाले समान HTTP अनुरोध स्वीकार करता है और समान संरचना में प्रतिक्रियाएँ देता है। आप अपना कोड रखते हैं, बेस URL और कुंजी बदलते हैं, और कॉल एक अलग सर्वर पर जाती है।
यही पूरा वादा है। यह इंटरफ़ेस के बारे में एक बयान है, जैसे यह कहना कि दो चार्जर एक ही प्लग का उपयोग करते हैं। यह आपको यह नहीं बताता कि केबल के दूसरे सिरे पर क्या है। मॉडल, उसकी सुरक्षा नियम, उसकी कीमत और उसकी सीमाएँ सभी प्रदाता द्वारा तय की जाती हैं, और वे काफी भिन्न होती हैं।
लेबल वास्तव में क्या कवर करता है
व्यावहारिक रूप से, OpenAI संगतता एक छोटी सूची ठोस चीज़ों की है। यदि कोई प्रदाता उन सभी का समर्थन करता है, तो अधिकांश क्लाइंट कोड बिना किसी बदलाव के चलता है।
- पथ। चैट अनुरोध
POST /v1/chat/completionsपर जाते हैं और मॉडल सूचीGET /v1/modelsसे आती है। - प्रमाणीकरण। कुंजी
Authorization: Bearerहेडर में जाती है। - अनुरोध बॉडी। एक
modelस्ट्रिंग,roleऔरcontentवाले ऑब्जेक्ट्स की एकmessagesसरणी, औरtemperature,top_p,stopऔरseedजैसे वैकल्पिक सैंपलिंग फ़ील्ड। - प्रतिक्रिया बॉडी। एक
choicesसरणी जिसमें सहायक संदेश होता है, एकfinish_reason, और टोकन गणना वाला एकusageऑब्जेक्ट। - स्ट्रीमिंग।
stream: trueके साथ सर्वर सर्वर-सेंट इवेंट्स भेजता है, प्रत्येक एक छोटे JSON डेल्टा को ले जाता है, जो एक अंतिम मार्कर के साथ समाप्त होता है। - वैकल्पिक सुविधाएँ। टूल कॉलिंग, JSON मोड और समान फ़ील्ड, जहाँ प्रदाता उन्हें समर्थित चुनता है।
क्योंकि इस फ़ॉर्मेट के खिलाफ इतने सारे टूल्स लिखे गए थे, यह एक सामान्य लक्ष्य बन गया। एडिटर, एजेंट फ्रेमवर्क, रोलेप्ले फ्रंट एंड और सादे स्क्रिप्ट सभी आपको एक कस्टम बेस URL दर्ज करने की अनुमति देते हैं, और यही एकमात्र आवश्यकता है।
एक फ़ॉर्मेट सामान्य लक्ष्य क्यों बना
चैट कंप्लीशन्स फ़ॉर्मेट इसलिए फैला क्योंकि यह सरल था और जल्दी आया। एक टूल लेखक जो इसे एक बार समर्थित करता है, कई बैकएंड तक पहुँच सकता है, और एक बैकएंड लेखक जो इसे एक बार समर्थित करता है, कई टूल्स तक पहुँच सकता है। यह दोनों पक्षों के लिए एक अच्छा सौदा है, इसलिए फ़ॉर्मेट टिक गया, भले ही उन सेवाओं के बीच जहाँ कंपनी जिसने इसे डिज़ाइन किया है, उससे कुछ लेना-देना न हो।
आपके लिए एक डेवलपर के रूप में इसका एक व्यावहारिक अर्थ है। आपके कोड को हर प्रदाता के लिए एक अलग इंटीग्रेशन की आवश्यकता नहीं है। आप एक दोपहर में प्रोटोटाइप को एंडपॉइंट्स के बीच ले जा सकते हैं, समान प्रॉम्प्ट पर दो मॉडल की तुलना कर सकते हैं, या एक दूसरे प्रदाता को फॉलबैक के रूप में रख सकते हैं जब पहला धीमा हो। अपने मन बदलने की लागत कम है, और यह नई सेवा को आजमाने को आसान बनाता है बिना उस पर प्रतिबद्ध हुए।
उल्टा पक्ष यह है कि साझा सतह वास्तविक अंतर छुपाती है। क्योंकि स्विचिंग इतनी आसान है, यह आकर्षक लगता है कि URL के पीछे सब कुछ समान है। यह ऐसा नहीं है, और नीचे दिए गए खंड दिखाते हैं कि अंतर आमतौर पर कहाँ दिखाई देते हैं।
यह आपको क्या नहीं बताता
यहाँ वह जगह है जहाँ लोग हैरान होते हैं। लेबल उस सब कुछ छोड़ देता है जो तय करता है कि क्या API आपके काम के लिए उपयोगी है।
इसके पीछे का मॉडल
एक संगत एंडपॉइंट किसी भी मॉडल की सेवा कर सकता है। कुछ ओपन-वेट मॉडल प्रदान करते हैं, कुछ कई वेंडर्स को रूट करते हैं, कुछ एक स्वामित्व वाले मॉडल को लपेटते हैं। संगतता का अर्थ यह नहीं है कि सेवा OpenAI द्वारा चलाई जाती है, और न ही इसका अर्थ है कि मॉडल उनके जैसे व्यवहार करता है। आप जो मॉडल नाम model में पास करते हैं, वह प्रदाता द्वारा परिभाषित एक स्ट्रिंग है।
अस्वीकार व्यवहार
सामग्री नियम मॉडल और प्रदाता के हैं, प्रोटोकॉल के नहीं। दो संगत APIs एक ही प्रॉम्प्ट का विपरीत तरीके से उत्तर दे सकते हैं। यदि आपका उपयोग केस कथा, रोलप्ले या अन्य कानूनी वयस्क सामग्री है, तो कुछ भी कनेक्ट करने से पहले प्रदाता द्वारा अस्वीकार के बारे में क्या कहा गया है, यह जांचें।
विशेषता गहराई
कुछ प्रदाता केवल चैट लागू करते हैं। अन्य टूल्स, JSON मोड, लॉग प्रोबेबिलिटी या अतिरिक्त एंडपॉइंट जोड़ते हैं। एक क्लाइंट जो एक फ़ील्ड भेजता है जिसे सर्वर अनदेखा करता है, वह हमेशा तेज़ी से विफल नहीं होगा, इसलिए एक मौन असंगति संभव है।
सीमाएँ, मूल्य और त्रुटियाँ
रेट लिमिट, कॉन्टेक्स्ट लंबाई, अधिकतम बॉडी साइज और प्रति टोकन मूल्य सभी प्रदाता के चयन हैं। त्रुटि बॉडी विवरण में भी भिन्न होती है, भले ही HTTP स्टेटस कोड मेल खाते हों, इसलिए पुनः प्रयास तर्क को संदेश पाठ के बजाय स्टेटस कोड और हेडर्स पर आधारित होना चाहिए।
एक त्वरित संगतता परीक्षण
आप तीन अनुरोधों के साथ कुछ मिनटों में एक प्रदाता की जांच कर सकते हैं। कुंजी को अपनी खुद की कुंजी से बदलें। यह उदाहरण इस साइट के बेस URL का उपयोग करता है।
curl https://api.kimicode.top/v1/models \
-H "Authorization: Bearer YOUR_API_KEY"
curl https://api.kimicode.top/v1/chat/completions \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "uncensored",
"messages": [{"role": "user", "content": "Reply with the word ready."}]
}'
पहला अनुरोध कुंजी की पुष्टि करता है और मॉडल ID सूचीबद्ध करता है। दूसरा अनुरोध चैट की संरचना की जाँच करता है। फिर उस भाग की जाँच करें जिन पर आपकी एप्लिकेशन निर्भर करता है: "stream": true जोड़ें और क्रमिक चंक देखें, यदि आप फ़ंक्शन कॉलिंग का उपयोग करते हैं तो tools सरणी पास करें, और यदि आपको विश्लेष्य आउटपुट चाहिए तो response_format को {"type":"json_object"} पर सेट करें।
उद्देश्यपूर्ण रूप से एक त्रुटि भी ट्रिगर करें, जैसे अमान्य कुंजी। आप एक स्वच्छ HTTP स्थिति और एक JSON त्रुटि बॉडी देखना चाहते हैं जिसे आपका क्लाइंट संभाल सके।
Node में वही कॉल
JavaScript SDK वही दो मान लेता है। यहाँ एक स्ट्रीमिंग कॉल है, जो अधिकांश चैट इंटरफ़ेस द्वारा उपयोग की जाने वाली संरचना है।
import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://api.kimicode.top/v1",
apiKey: process.env.API_KEY,
});
const stream = await client.chat.completions.create({
model: "uncensored",
stream: true,
messages: [{ role: "user", content: "Name three uses of SSE." }],
});
for await (const chunk of stream) {
process.stdout.write(chunk.choices[0]?.delta?.content ?? "");
}
यदि यह पाठ को शब्द-दर-शब्द प्रिंट करता है, तो स्ट्रीमिंग पाथ अंत से अंत तक काम करता है। समान लूप किसी भी संगत प्रदाता के खिलाफ काम करता है, जो फॉर्मेट का पूरा बिंदु है।
कोड में स्विचिंग कैसी दिखती है
आधिकारिक Python SDK के साथ, परिवर्तन दो कंस्ट्रक्टर तर्कों का है। आपका कार्यक्रम का शेष भाग वैसा ही रहता है।
from openai import OpenAI
client = OpenAI(
base_url="https://api.kimicode.top/v1",
api_key="YOUR_API_KEY",
)
resp = client.chat.completions.create(
model="uncensored",
messages=[{"role": "user", "content": "Summarize SSE in one sentence."}],
)
print(resp.choices[0].message.content)
Node SDK baseURL और apiKey विकल्पों के साथ वही विचार है। कई टूल पर्यावरण से OPENAI_BASE_URL और OPENAI_API_KEY पढ़ते हैं, इसलिए आप कभी-कभी बिना कोड छुए ही स्विच कर सकते हैं।
मॉडल स्ट्रिंग को बदलना न भूलें। एक अनुरोध जो एक मॉडल का नाम देता है जिसे नया सर्वर होस्ट नहीं करता है, वह विफल हो जाएगा, और यह सबसे सामान्य पहली त्रुटि है।
इस साइट का API कहाँ फिट बैठता है
यह सेवा एक होस्टेड, केवल-टेक्स्ट API है जो OpenAI प्रारूप का पालन करती है। यह एक ओपन-वेट मॉडल चलाती है, जो एक स्वतंत्र प्रदाता द्वारा संचालित है और कानूनी वयस्कों के उपयोग के लिए बिना सामग्री अस्वीकृति के उत्तर देने के लिए ट्यून्ड है। यह किसी मॉडल वेंडर की आधिकारिक API नहीं है और यह वेंडर्स के बीच रूट नहीं करती है। मॉडल ID uncensored है।
यह SSE के साथ स्ट्रीमिंग, टूल कॉलिंग, JSON मोड का समर्थन करता है, और तापमान, top_p, stop, seed और पेनल्टीज़ को पास करता है। कॉन्टेक्स्ट विंडो प्रॉम्प्ट और पूर्णता दोनों के लिए 100,000 टोकन है। यह छवियाँ या ऑडियो उत्पन्न नहीं करता है, और न ही यह एम्बेडिंग या फाइन-ट्यूनिंग प्रदान करता है। एक नियम निश्चित है: नाबालिगों से संबंधित यौन सामग्री नहीं।
बिलिंग प्रीपेड और मीटरिंग है: 1M इनपुट टोकन के लिए $0.15 और 1M आउटपुट टोकन के लिए $0.50, कोई सदस्यता नहीं। आप मूल्य निर्धारण पृष्ठ पर संख्याएँ देख सकते हैं, और दस्तावेज़ एक पहले अनुरोध को समझाते हैं। यदि आप बिना भुगतान किए इसे आज़माना चाहते हैं, तो नए खाते API कुंजी पृष्ठ पर एक क्लिक के साथ $0.50 का ट्रायल क्रेडिट दावा कर सकते हैं।
सामान्य संगतता जोखिम
- गलत बेस URL। URL
/v1पर समाप्त होना चाहिए। क्लाइंट/chat/completionsस्वयं जोड़ते हैं, इसलिए बेस में इसे जोड़ने से 404 मिलता है। - असमर्थित पैरामीटर। यदि कोई लाइब्रेरी एक ऐसा फ़ील्ड भेजती है जिसका सर्वर को पता नहीं है, तो जाँचें कि क्या इसे अस्वीकार किया गया है या चुपचाप छोड़ दिया गया है, फिर इसे हटा दें।
- स्ट्रीमिंग और समानांतरता। एक स्ट्रीम किए गए अनुरोध में समानांतरता स्लॉट स्ट्रीम समाप्त होने तक बनी रहती है। यदि आपका एप्लिकेशन कई स्ट्रीम खोलता है, तो आप 429 कोड
concurrencyके साथ एक रेट लिमिट पर पहुँच सकते हैं, भले ही आपकी प्रति मिनट गणना कम हो। - 429 पर पुन: प्रयास करें। 429 को प्रतीक्षा का संकेत मानें। जब
Retry-Afterहेडर मौजूद होता है, तो उसका सम्मान करें। - टोकन गणना। यह न मानें कि किसी अन्य प्रदाता का टोकनाइज़र मेल खाता है। उन संख्याओं को पढ़ें जिन पर आपका बिल बनाया जाता है, प्रतिक्रिया में
usageऑब्जेक्ट से।
इनमें से किसी को भी ठीक करना मुश्किल नहीं है जब आपको उन्हें खोजने का तरीका पता हो, और अधिकांश समस्याएं प्रथम त्रुटि संदेश को सावधानी से पढ़ने में ही समाप्त होती हैं।
