AI गेटवे (LiteLLM, Portkey)
AI गेटवे आपके ऐप और मॉडल प्रदाताओं के बीच बैठता है, इसलिए हर मॉडल कॉल उससे होकर गुज़रती है। गेटवे का OpenTelemetry एक बार Status200 को भेजें, और उसके पीछे की हर कॉल मॉडल, टोकन, लागत और, जब तक आप इसे बंद न करें, प्रॉम्प्ट और जवाब के साथ AI / LLM में पहुँचती है, हर ऐप को इंस्ट्रुमेंट किए बिना।
यह कैसे काम करता है
एक एक्सपोर्ट गेटवे के पीछे के हर ऐप को कवर करता है
| LiteLLM Proxy | Portkey, सेल्फ़-होस्टेड या Enterprise | Portkey, ओपन सोर्स या होस्टेड | |
|---|---|---|---|
| Status200 को एक्सपोर्ट | बिल्ट-इन | बिल्ट-इन, प्रायोगिक | कोई नहीं: इसके बजाय ऐप को इंस्ट्रुमेंट करें |
| सेट करने वाला एंडपॉइंट | https://status200.ru/otlp/v1/traces | https://status200.ru/otlp | ऐप का अपना एक्सपोर्टर |
| हर व्यक्ति की पहचान | हाँ, हर कर्मचारी के लिए एक वर्चुअल कुंजी से | नहीं | सिर्फ़ वही जो ऐप भेजता है |
| प्रॉम्प्ट और जवाब | भेजे जाते हैं, जब तक आप बंद न करें | हमेशा भेजे जाते हैं | इंस्ट्रुमेंटेशन पर निर्भर |
Status200 का अपना कोई गेटवे नहीं है: वह आपकी प्रदाता कुंजियाँ रखता और आपके ऐप्स की हर मॉडल कॉल में एक और कदम जोड़ता। यह वह गेटवे पढ़ता है जो आप पहले से चलाते हैं, और आपके प्रदाता खातों का उपयोग और लागत बिना किसी कोड के: AI प्रदाता खाते देखें।
शुरू करने से पहले
- एक इन्जेशन कुंजी: प्रोजेक्ट सेटिंग्स → टेलीमेट्री और APM → इंजेशन कुंजियाँ खोलें और इन्जेशन कुंजी बनाएँ पर क्लिक करें।
- आपका OTLP बेस URL:
https://status200.ru/otlp, या अगर आप Status200 खुद होस्ट करते हैं तोhttps://YOUR-ONEUPTIME-HOST/otlp। Status200 HTTP पर OTLP स्वीकार करता है, protobuf और JSON दोनों में। - कुंजी हर एक्सपोर्ट अनुरोध के
x-status200-tokenहेडर में जाती है।
LiteLLM Proxy
LiteLLM का OpenTelemetry कॉलबैक ओपन सोर्स प्रॉक्सी का हिस्सा है, और आधिकारिक Docker इमेज (ghcr.io/berriai/litellm) में उसके लिए ज़रूरी पैकेज पहले से हैं।
otel कॉलबैक चालू करें
प्रॉक्सी के
config.yamlमें कॉलबैक मेंotelजोड़ें:model_list: - model_name: gpt-4o litellm_params: model: openai/gpt-4o api_key: os.environ/OPENAI_API_KEY litellm_settings: callbacks: ["otel"]एक्सपोर्टर को Status200 की ओर मोड़ें
प्रॉक्सी पर तीन वेरिएबल सेट करें:
export OTEL_EXPORTER="otlp_http" export OTEL_ENDPOINT="https://status200.ru/otlp/v1/traces" export OTEL_HEADERS="x-status200-token=YOUR_INGESTION_TOKEN"प्रॉक्सी शुरू करें
Docker
docker run \ -v $(pwd)/config.yaml:/app/config.yaml \ -e OPENAI_API_KEY="sk-..." \ -e OTEL_EXPORTER="otlp_http" \ -e OTEL_ENDPOINT="https://status200.ru/otlp/v1/traces" \ -e OTEL_HEADERS="x-status200-token=YOUR_INGESTION_TOKEN" \ -e OTEL_SERVICE_NAME="litellm-gateway" \ -p 4000:4000 \ ghcr.io/berriai/litellm:main-stable \ --config /app/config.yamlpip
pip install 'litellm[proxy]' opentelemetry-api opentelemetry-sdk opentelemetry-exporter-otlp litellm --config config.yamlसिर्फ़
litellm[proxy]में OpenTelemetry पैकेज शामिल नहीं हैं, इसलिए उन्हें साथ में इंस्टॉल करें।उससे होकर एक अनुरोध भेजें
प्रॉक्सी को एक बार कॉल करें, फिर जाँचें कि कॉल पहुँच रही हैं में बताए तरीके से AI / LLM जाँचें।
| वेरिएबल | मान | टिप्पणी |
|---|---|---|
OTEL_EXPORTER | otlp_http | OTEL_EXPORTER_OTLP_PROTOCOL के रूप में भी पढ़ा जाता है |
OTEL_ENDPOINT | https://status200.ru/otlp/v1/traces | पूरा पथ /v1/traces हर LiteLLM वर्शन के साथ काम करता है; OTEL_EXPORTER_OTLP_ENDPOINT के रूप में भी पढ़ा जाता है |
OTEL_HEADERS | x-status200-token=YOUR_INGESTION_TOKEN | कॉमा से अलग key=value जोड़े; OTEL_EXPORTER_OTLP_HEADERS के रूप में भी पढ़ा जाता है |
OTEL_SERVICE_NAME | आपके गेटवे का नाम | वह सेवा जिसके अंदर कॉल दिखती हैं; कुछ सेट न करें तो litellm |
LiteLLM क्या भेजता है
हर कॉल में gen_ai.system, gen_ai.request.model, gen_ai.response.model, gen_ai.usage.input_tokens और gen_ai.usage.output_tokens, उसके पैरामीटर, और प्रॉम्प्ट और जवाब होते हैं: वह सब जो Status200 को कॉल पढ़ने के लिए चाहिए।
LiteLLM 1.81 से ये विशेषताएँ अनुरोध के Received Proxy Server Request स्पैन पर होती हैं, और अब अलग litellm_request स्पैन नहीं होता। जब एक अनुरोध कई मॉडल कॉल करता है, तो हर कॉल वहाँ पिछली कॉल की विशेषताओं को ओवरराइट कर देती है, इसलिए हर कॉल के लिए एक litellm_request स्पैन पाने के लिए USE_OTEL_LITELLM_REQUEST_SPAN=true सेट करें।
LiteLLM हर कॉल की कीमत खुद लगाता है, प्रॉक्सी पर सेट की गई कस्टम दरों सहित, और कीमत को gen_ai.cost.total_cost के रूप में रिपोर्ट करता है। Status200 अपने अनुमान से ज़्यादा रिपोर्ट की गई कीमत को प्राथमिकता देता है, और टोकन से अनुमान तभी लगाता है जब LiteLLM कॉल की कीमत नहीं लगा सका, जैसे बिना कीमत सेट किए कस्टम मॉडल के लिए।
हर कर्मचारी के लिए एक वर्चुअल कुंजी
हर व्यक्ति को उसकी अपनी LiteLLM वर्चुअल कुंजी दें, और उसकी हर कॉल इस जानकारी के साथ पहुँचती है कि वह कौन है। LiteLLM कुंजी के मालिक की ID, ईमेल और टीम स्पैन पर लिखता है, और Status200 उन्हें कर्मचारी और टीम के रूप में पढ़ता है, इसलिए उपयोग टैब किसी की मशीन पर कुछ सेट किए बिना हर व्यक्ति के खर्च की रैंकिंग दिखाता है।
वर्चुअल कुंजियों के लिए प्रॉक्सी पर एक डेटाबेस और एक मास्टर कुंजी चाहिए (DATABASE_URL और LITELLM_MASTER_KEY)। व्यक्ति के ईमेल से एक उपयोगकर्ता बनाएँ, फिर उस उपयोगकर्ता के लिए एक कुंजी:
curl -X POST "http://localhost:4000/user/new" \
-H "Authorization: Bearer YOUR_MASTER_KEY" \
-H "Content-Type: application/json" \
-d '{"user_email": "alice@example.com"}'
curl -X POST "http://localhost:4000/key/generate" \
-H "Authorization: Bearer YOUR_MASTER_KEY" \
-H "Content-Type: application/json" \
-d '{"user_id": "USER_ID_FROM_THE_FIRST_CALL", "team_id": "platform"}'| LiteLLM की स्पैन विशेषता | Status200 इसे इस रूप में पढ़ता है |
|---|---|
metadata.user_api_key_user_id | कर्मचारी की ID |
metadata.user_api_key_user_email | कर्मचारी का ईमेल |
metadata.user_api_key_team_id | टीम |
metadata.user_api_key_end_user_id | कभी कर्मचारी नहीं: यह वह user है जो आपका ऐप अपने ग्राहक के लिए भेजता है |
LiteLLM के OpenTelemetry v2 मोड में वही मान litellm. प्रीफ़िक्स के साथ आते हैं (litellm.metadata.user_api_key_user_email आदि), जिन्हें Status200 भी पढ़ता है।
प्रॉम्प्ट बाहर रखें
otel कॉलबैक डिफ़ॉल्ट रूप से पूरे प्रॉम्प्ट और जवाब भेजता है। उन्हें बाहर रखने के लिए इनमें से कोई एक विकल्प इस्तेमाल करें:
हर कॉलबैक
litellm_settings:
callbacks: ["otel"]
turn_off_message_logging: trueसिर्फ़ OTel कॉलबैक
litellm_settings:
callbacks: ["otel"]
callback_settings:
otel:
message_logging: Falseएनवायरनमेंट वेरिएबल
export OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT="NO_CONTENT"callback_settings एक टॉप-लेवल कुंजी है, litellm_settings के अंदर की कुंजी नहीं। प्रॉम्प्ट रखते हुए उनके कुछ हिस्से छिपाने के लिए, इसके बजाय ट्रेस → सेटिंग्स के अंदर स्क्रब नियम इस्तेमाल करें।
LiteLLM का OpenTelemetry v2 मोड
नए LiteLLM वर्शन में एक वैकल्पिक OpenTelemetry v2 मोड है (LITELLM_OTEL_V2=true, config.yaml में कोई बदलाव नहीं)। यह हर अनुरोध के लिए एक ट्रेस भेजता है, जिसमें HTTP हैंडलिंग, प्रमाणीकरण, गार्डरेल और मॉडल कॉल chat gpt-4o जैसे नामों वाले GenAI स्पैन के रूप में होते हैं। v2 मोड में प्रॉम्प्ट डिफ़ॉल्ट रूप से बंद रहते हैं; उन्हें OTEL_INSTRUMENTATION_GENAI_CAPTURE_MESSAGE_CONTENT से चालू करें। लागत litellm.cost.total के रूप में आती है, जिसे Status200 भी पढ़ता है। एक ही मोड इस्तेमाल करें, दोनों नहीं।
Portkey
Portkey क्या भेज सकता है, यह इस पर निर्भर करता है कि आप उसे कैसे चलाते हैं:
| डिप्लॉयमेंट | Status200 को एक्सपोर्ट |
|---|---|
| सेल्फ़-होस्टेड या Enterprise गेटवे | बिल्ट-इन (प्रायोगिक): नीचे दिए वेरिएबल सेट करें |
ओपन सोर्स गेटवे (portkey-ai/gateway) | कोई नहीं: उसे कॉल करने वाले ऐप को इंस्ट्रुमेंट करें |
| होस्टेड गेटवे (portkey.ai) | गेटवे पर कोई नहीं: उसे कॉल करने वाले ऐप को इंस्ट्रुमेंट करें |
Portkey का अपना OpenTelemetry एंडपॉइंट (api.portkey.ai/v1/otel) भी है। वह Portkey में ट्रेस प्राप्त करता है, जो इस पेज की उलटी दिशा है।
सेल्फ़-होस्टेड और Enterprise गेटवे
गेटवे के कंटेनर पर ये वेरिएबल सेट करें:
services:
portkey-gateway:
environment:
EXPERIMENTAL_GEN_AI_OTEL_TRACES_ENABLED: "true"
EXPERIMENTAL_GEN_AI_OTEL_EXPORTER_OTLP_ENDPOINT: "https://status200.ru/otlp"
EXPERIMENTAL_GEN_AI_OTEL_EXPORTER_OTLP_HEADERS: "x-status200-token=YOUR_INGESTION_TOKEN"- OTLP बेस URL दें: Portkey
/v1/tracesखुद जोड़ता है। - हेडर कॉमा से अलग
key=valueजोड़े होते हैं।EXPERIMENTAL_GEN_AI_OTEL_RESOURCE_ATTRIBUTESइसी तरह रिसोर्स विशेषताएँ जोड़ता है, जैसेdeployment.environment=production। - Portkey HTTP पर OTLP सिर्फ़ JSON में भेजता है, जिसे Status200 बीच में कलेक्टर के बिना स्वीकार करता है।
- हर कॉल
{operation} {model}नाम का एक स्पैन है, जैसेchat gpt-4o, जोportkeyसेवा के अंदर होता है, और उसमेंgen_ai.provider.name, माँगा गया और जवाब देने वाला मॉडल, टोकन की गिनती,gen_ai.conversation.id, औरgen_ai.input.messagesऔरgen_ai.output.messagesमें संदेश होते हैं। - पूरे प्रॉम्प्ट और जवाब हमेशा शामिल रहते हैं। जो ज़रूरी हो उसे ट्रेस → सेटिंग्स के अंदर स्क्रब नियमों से छिपाएँ।
- हर कॉल जवाब के बाद अलग से भेजी जाती है, बिना बैचिंग और बिना रीट्राई के: विफल एक्सपोर्ट खो जाता है। इसे ऑब्ज़र्वेबिलिटी मानें, ऑडिट लॉग नहीं।
- अगर आपका
x-portkey-trace-idएक मान्य ट्रेस ID है (32 हेक्साडेसिमल अक्षर), तो Portkey उसे फिर से इस्तेमाल करता है, जिससे गेटवे के स्पैन आपके अपने ऐप के ट्रेस से जुड़ जाते हैं।
Portkey इस एक्सपोर्ट को प्रायोगिक बताता है। अगर वेरिएबल का कोई असर न हो, तो Portkey के मौजूदा दस्तावेज़ को अपने गेटवे के वर्शन से मिलाकर देखें।
ओपन सोर्स और होस्टेड गेटवे
ओपन सोर्स गेटवे में कोई एक्सपोर्टर नहीं है, और होस्टेड गेटवे पर आप उसके वेरिएबल सेट नहीं कर सकते। इसके बजाय उस ऐप को इंस्ट्रुमेंट करें जो Portkey को कॉल करता है। Portkey OpenAI API बोलता है, इसलिए AI / LLM ऑब्ज़र्वेबिलिटी के GenAI इंस्ट्रुमेंटेशन (OpenLLMetry, OpenInference, OpenLIT) आपके SDK की कॉल ट्रेस करते हैं, तब भी जब बेस URL Portkey की ओर इशारा करता हो:
from traceloop.sdk import Traceloop
from openai import OpenAI
Traceloop.init(
app_name="my-ai-agent",
api_endpoint="https://status200.ru/otlp",
headers={"x-status200-token": "YOUR_INGESTION_TOKEN"},
)
client = OpenAI(
base_url="https://api.portkey.ai/v1", # or your gateway's URL
default_headers={"x-portkey-api-key": "PORTKEY_API_KEY"},
)
# Calls through Portkey are now traced to Status200.ये स्पैन कॉल को वैसे बताते हैं जैसे आपके ऐप ने उसे किया: उसने कौन-सा मॉडल माँगा, कितनी देर इंतज़ार किया, कितने टोकन वापस मिले। गेटवे ने रास्ते में जो तय किया, जैसे फ़ॉलबैक, रीट्राई या कैश हिट, वह Portkey में ही रहता है। उसे Status200 में देखने के लिए सेल्फ़-होस्टेड गेटवे का एक्सपोर्ट इस्तेमाल करें।
OpenRouter
OpenRouter का Broadcast आपके OpenRouter खाते के हर अनुरोध का ट्रेस एक OpenTelemetry एंडपॉइंट पर भेजता है: मॉडल, टोकन, OpenRouter की ली गई लागत और, अगर आप उन्हें बंद न करें, प्रॉम्प्ट और जवाब। आप इसे एक बार, OpenRouter में, अपने ऐप्स बदले बिना सेट करते हैं।
Broadcast चालू करें
OpenRouter में Settings, Observability खोलें और Enable Broadcast चालू करें।
Status200 को कलेक्टर के रूप में जोड़ें
OpenTelemetry Collector गंतव्य संपादित करें। उसका एंडपॉइंट पूरे ट्रेस पथ
https://status200.ru/otlp/v1/tracesपर, और उसके हेडर{"x-status200-token": "YOUR_INGESTION_TOKEN"}पर सेट करें। फिर कनेक्शन जाँचें: OpenRouter गंतव्य तभी सहेजता है जब जाँच सफल होती है।इसके ज़रिए एक मॉडल कॉल करें
OpenRouter के ज़रिए एक मॉडल कॉल करें, फिर जाँचें कि कॉल पहुँच रही हैं में बताए अनुसार AI / LLM देखें।
- OpenRouter HTTP पर JSON में OTLP भेजता है, जिसे Status200 बीच में किसी कलेक्टर के बिना स्वीकार करता है।
- किसी अनुरोध का
useruser.idके रूप में आता है, जिसे Status200 कॉल करने वाले व्यक्ति के रूप में पढ़ता है, और उसकाsession_idsession.idके रूप में, जो कॉल को एक बातचीत में समूहित करता है।userमें किसी कर्मचारी की ID भेजें, किसी ग्राहक की कभी नहीं। - प्रॉम्प्ट और जवाब जनरेशन स्पैन पर होते हैं,
gen_ai.promptऔरgen_ai.completionके रूप में। उन्हें बाहर रखने के लिए गंतव्य का प्राइवेसी मोड चालू करें।
जाँचें कि कॉल पहुँच रही हैं
- गेटवे से होकर एक अनुरोध भेजें और कुछ सेकंड इंतज़ार करें।
- उत्पाद → AI / LLM → कॉल खोलें। कॉल प्रदाता, मॉडल और टोकन के साथ सूची में दिखती है।
- कॉल पर क्लिक करके उसका ट्रेस खोलें, और स्पैन का LLM टैब खोलें: मॉडल, टोकन, पैरामीटर और, जब तक आपने बंद न किया हो, प्रॉम्प्ट और जवाब।
- उपयोग खोलें: कॉल कुल में गिनी जाती है, उस लागत के साथ जो गेटवे ने रिपोर्ट की या Status200 ने अनुमान लगाई।
समस्या निवारण
LiteLLM से कुछ नहीं आता
थोड़ी देर के लिए OTEL_EXPORTER="console" सेट करें। अगर प्रॉक्सी के आउटपुट में स्पैन दिखते हैं, तो LiteLLM ट्रेस कर रहा है, और समस्या एंडपॉइंट या कुंजी में है। DEBUG_OTEL="true" दिखाता है कि एक्सपोर्टर क्या कर रहा है।
कुंजी अस्वीकार हो जाती है
कुंजी न होने, अज्ञात होने या उसकी समय-सीमा खत्म होने पर Status200 401 जवाब देता है, और बंद की गई कुंजी या ब्राउज़र कुंजी पर 422। प्रोजेक्ट सेटिंग्स → टेलीमेट्री और APM → इंजेशन कुंजियाँ के अंदर एक सर्वर कुंजी बनाएँ और उसे x-status200-token में भेजें।
एंडपॉइंट गलत है
LiteLLM पूरा पथ लेता है, https://status200.ru/otlp/v1/traces। Portkey बेस URL लेता है, https://status200.ru/otlp, और /v1/traces खुद जोड़ता है।
स्पैन आते हैं, लेकिन AI / LLM में नहीं
कच्चे स्पैन देखने के लिए ट्रेस को गेटवे की सेवा (litellm, portkey या आपका OTEL_SERVICE_NAME) से फ़िल्टर करें। कोई स्पैन मॉडल कॉल तभी गिना जाता है जब उसमें gen_ai.* विशेषताएँ हों: जाँचें कि कॉलबैक otel है और कॉल किसी मॉडल को गई थी।
खर्च बिना एट्रिब्यूशन दिखता है
कॉल किसी व्यक्ति का नाम नहीं बतातीं। हर कर्मचारी के लिए एक वर्चुअल कुंजी की तरह, हर कर्मचारी को उसकी अपनी वर्चुअल कुंजी दें। आपका ऐप जो user फ़ील्ड भेजता है, वह उसके ग्राहक का नाम बताता है, कर्मचारी का नहीं, और उसे कभी कर्मचारी के रूप में नहीं पढ़ा जाता।
कई कॉल में से सिर्फ़ आख़िरी दिखती है
LiteLLM 1.81 से एक अनुरोध की मॉडल कॉल एक ही स्पैन साझा करती हैं। हर कॉल के लिए एक स्पैन पाने के लिए USE_OTEL_LITELLM_REQUEST_SPAN=true सेट करें।
OpenRouter गंतव्य सहेजता नहीं है
उसकी कनेक्शन जाँच विफल हुई। जाँचें कि एंडपॉइंट /v1/traces पर खत्म होता है और हेडर में एक सर्वर इंजेशन कुंजी है।