Iris
आधिकारिकMCP-नेटिव एजेंट मूल्यांकन और अवलोकन सर्वर जिसमें ट्रेस लॉगिंग, आउटपुट गुणवत्ता मूल्यांकन, लागत ट्रैकिंग, 12 अंतर्निहित मूल्यांकन नियम, रीयल-टाइम डैशबोर्ड और PII डिटेक्शन शामिल है
Iris MCP के साथ आप क्या कर सकते हैं?
- लॉग और एजेंट रन का मूल्यांकन करें — अपने सहायक से Iris में एक टास्क लॉग करने को कहें और आउटपुट पर निर्धारित गुणवत्ता, सुरक्षा, और लागत स्कोर प्राप्त करें।
- ट्रेस इतिहास क्वेरी करें — फ़िल्टरिंग, पेजिनेशन, और समय-सीमा समर्थन के साथ संग्रहीत एजेंट निष्पादन प्राप्त करें ताकि पिछले प्रदर्शन की समीक्षा की जा सके।
- समय के साथ रनों की तुलना करें — एजेंट व्यवहार में गिरावट या सुधार को पहचानने के लिए समान प्रश्नों पर दो रनों का साथ-साथ विश्लेषण करें।
- आउटपुट गुणवत्ता स्कोर करें — पूर्णता, प्रासंगिकता, सुरक्षा, और लागत को कवर करने वाले 25 अंतर्निहित नियमों के विरुद्ध किसी भी टेक्स्ट का मूल्यांकन करें, साथ ही PII और प्रॉम्प्ट-इंजेक्शन पहचान के साथ।
- डेमो डैशबोर्ड चलाएं — Iris के स्कोरिंग इंजन को स्थानीय रूप से एक्सप्लोर करने के लिए नमूना विफलताओं और निर्णयों के साथ एक सीडेड डेमो डेटाबेस लॉन्च करें।
दस्तावेज़
Iris — एजेंटों को अटकलों पर शिप करना बंद करें
Iris हर एजेंट रन को गुणवत्ता, सुरक्षा और लागत के लिए स्कोर करता है — आपकी मशीन पर, बिना किसी SDK और बिना किसी खाते के। अधिकांश एजेंट प्रोजेक्ट कुछ याद किए गए प्रॉम्प्ट चलाकर और आउटपुट को देखकर गुणवत्ता की जाँच करते हैं। Iris उसे उन संख्याओं से बदल देता है जिन्हें आप ऑडिट कर सकते हैं: आपके एजेंट के रन आपकी डिस्क पर एक SQLite डेटाबेस में जमा होते हैं, 25 अंतर्निहित नियम उन्हें निर्धारित रूप से स्कोर करते हैं — PII, प्रॉम्प्ट इंजेक्शन, भ्रम के मार्कर, लागत सीमाएँ, और एजेंट के अपने टूल कॉल — मुफ्त, बिना किसी LLM कॉल के, और एक वैकल्पिक LLM जज जिसकी प्रति-मूल्यांकन लागत की कठोर सीमा है, शब्दार्थ संबंधी प्रश्नों को संभालता है। हर नियम निरीक्षण योग्य और संपादन योग्य है, क्योंकि एक जज जिसे आप ऑडिट नहीं कर सकते, वह सिर्फ एक संख्या के साथ अटकलें हैं। MIT लाइसेंस, कोई टेलीमेट्री नहीं। जब तक आप इनमें से किसी एक को चालू नहीं करते, आपकी मशीन से कुछ भी बाहर नहीं जाता: एक OpenTelemetry एंडपॉइंट (IRIS_OTEL_ENDPOINT), जो आपके नामित कलेक्टर को ट्रेस निर्यात करता है; आपकी अपनी कुंजी के साथ LLM जज, जो अपने द्वारा निर्णय किए गए टेक्स्ट को उस प्रदाता को भेजता है, और जिसकी उद्धरण जाँच उन पृष्ठों को लाती है जिन्हें एक आउटपुट उद्धृत करता है; या एक वेबहुक, जो आपके द्वारा निर्धारित पते पर आईडी, निर्णय और नियम के नाम पोस्ट करता है, कभी भी टेक्स्ट नहीं।
Node.js 22.13 या उससे नए की आवश्यकता है। node --version से जाँचें।

डेमो डेटाबेस, scripts/demo-media.mts द्वारा रिकॉर्ड किया गया; स्रोत demo.mp4 है। एक स्थिर छवि: dashboard-overview.png।
60 सेकंड में स्क्रीन पर एक विफलता
कोई एजेंट वायरिंग नहीं, कोई कॉन्फ़िग नहीं — एक कमांड:
npx @iris-eval/mcp-server --demo
यह एक डेमो डेटाबेस सीड करता है — पाँच छोटे एजेंट, दो सप्ताह के रन, हर निर्णय इंजन का अपना — और उसके खिलाफ डैशबोर्ड को http://localhost:6920 पर परोसता है (आपका ब्राउज़र पहले रन पर स्वचालित रूप से खुलता है)। डैशबोर्ड Failures पर उतरता है: क्या विफल हुआ, सबसे खराब और सबसे नया पहले, प्रत्येक कार्ड नियम और उसके साक्ष्य का नाम देता है। इसमें क्लिक करने लायक है — सुरक्षा नियमों द्वारा पकड़ा गया एक PII रिसाव, एक फोरम पोस्ट में एक छिपा निर्देश जिसका सारांशकर्ता ने पालन किया, एक संख्या जो स्रोत दस्तावेज़ ने कभी नहीं कही, एक अंतराल के साथ समान बारह प्रश्नों पर दो रन (Runs), एक तैनात कस्टम नियम और एक रोका गया नियम उनकी ऑडिट पंक्तियों के साथ, और एक विफल LLM-जज स्कोर उसके तर्क के साथ।
डेमो डेटा अपने स्वयं के डेटाबेस में रहता है (आपके Iris होम निर्देशिका में demo.db — macOS/Linux पर ~/.iris, Windows पर %USERPROFILE%\.iris) और आपके वास्तविक ट्रेस के साथ कभी मिश्रित नहीं होता। इसे एक कमांड से पूरी तरह हटाएँ:
npx @iris-eval/mcp-server --demo-clear
अपना खुद का एजेंट जोड़ें
पहले, साबित करें कि इंस्टॉल इस मशीन पर काम करता है — यह ऑफ़लाइन चलता है और आपकी कोई चीज़ नहीं खोलता:
npx @iris-eval/mcp-server --self-test # exit 0 = healthy
फिर अपने MCP क्लाइंट में Iris जोड़ें। एक कमांड क्लाइंट की अपनी कॉन्फ़िग फ़ाइल लिखता है, उसमें हर दूसरे सर्वर को रखता है, और आपके द्वारा चलाए गए संस्करण को पिन करता है:
npx -y @iris-eval/mcp-server install claude-code
क्लाइंट: claude-code, claude-desktop, cursor, windsurf, continue, vscode, cline, zed, codex, gemini। install --list इस मशीन पर पाए गए क्लाइंट, प्रत्येक द्वारा चलाया गया Iris और उसके द्वारा पढ़ी गई फ़ाइल दिखाता है; install <client> --uninstall Iris को फिर से बाहर निकालता है। हर क्लाइंट एक डेटाबेस साझा करता है, इसलिए अपग्रेड के बाद उन सभी को एक साथ install --upgrade से स्थानांतरित करें (अपडेट करना)। इसे लोड करने के लिए क्लाइंट को पुनरारंभ करें।
Claude Desktop: एक क्लिक। 0.20.0 से प्रत्येक रिलीज़ iris-eval.mcpb, एक MCP बंडल संलग्न करता है: नवीनतम डाउनलोड करें, इसे खोलें, और Claude Desktop एक इंस्टॉल डायलॉग दिखाता है। इस पर कुछ भी आवश्यक नहीं है — LLM जज के लिए एक Anthropic या OpenAI कुंजी वैकल्पिक है, और डैशबोर्ड एक स्विच है जो बंद शुरू होता है। बंडल में npm पैकेज और उसकी निर्भरताएँ हैं, इसलिए कुछ और स्थापित करने की आवश्यकता नहीं है: Claude Desktop इसे उस Node के तहत चलाता है जो वह भेजता है जब वह Node 22.13 या नया होता है (Claude Desktop 1.1.6679 24.13 भेजता है), और Iris ट्रेस को Node के अंतर्निहित SQLite के साथ, उसी ~/.iris में संग्रहीत करता है जो हर दूसरा इंस्टॉल उपयोग करता है। रिलीज़ नोट्स दिखाते हैं कि इसके हस्ताक्षर और बिल्ड प्रमाणन को कैसे सत्यापित किया जाए।
यह किसी भी MCP क्लाइंट में चलता है, और इसके द्वारा नामित हर क्लाइंट के पास वास्तव में जाँच की गई चीज़ों के साथ एक पंक्ति है। हर CI रन पर सत्यापित: Claude Code, Gemini CLI — वास्तविक क्लाइंट इंस्टॉलर द्वारा लिखे गए कॉन्फ़िग से Iris शुरू करता है और रिपोर्ट करता है कि यह जुड़ा हुआ है (claude mcp list, gemini mcp list), Linux, macOS और Windows पर; Claude Code के कैप्चर प्लगइन हुक भी वास्तविक स्क्रिप्ट के माध्यम से संचालित होते हैं। प्रत्येक क्लाइंट के अपने MCP दस्तावेज़ीकरण से दावा किया गया — इंस्टॉलर क्लाइंट द्वारा प्रलेखित कॉन्फ़िगरेशन आकार लिखता है, और वह लेखक आकार पर परीक्षण किया जाता है; Iris पक्ष पर किसी ने इसे जुड़ा हुआ नहीं देखा है: Claude Desktop, Cursor, Devin Desktop (Windsurf), Continue, VS Code, Cline, Zed, OpenAI Codex CLI। हर पंक्ति उसके स्रोत और पढ़ने की तारीख के साथ: https://iris-eval.com/clients. हाथ से इसके बजाय, एक ब्लॉक, डैशबोर्ड सहित:
{
"mcpServers": {
"iris-eval": {
"command": "npx",
"args": ["-y", "@iris-eval/mcp-server", "--dashboard"]
}
}
}
आपका क्लाइंट कनेक्ट होने पर Iris के बारह टूल सूचीबद्ध करता है, और डैशबोर्ड http://localhost:6920. पर परोसता है। अब इसे अपने एजेंट पर पेस्ट करें:
उस अंतिम कार्य को Iris में लॉग करें और आउटपुट का मूल्यांकन करें।
ट्रेस अपने स्कोर के साथ डैशबोर्ड पर उतरता है। हेडलेस MCP सर्वर पसंद करते हैं? तर्कों से --dashboard हटाएँ — आप किसी भी समय npx @iris-eval/mcp-server --dashboard के साथ वही डैशबोर्ड खोल सकते हैं।
पहले से जानने लायक एक बात: MCP टूल तब कहलाते हैं जब मॉडल उन्हें कॉल करने का निर्णय लेता है। Iris आपके एजेंट को इंटरसेप्ट नहीं करता, इसलिए ट्रेस तब लॉग होते हैं जब आपका एजेंट उन्हें लॉग करने के लिए कहता है — या तो क्योंकि आपने उसे बताया, या क्योंकि आपका कोड सीधे टूल को कॉल करता है। अपने एजेंट से "इसे Iris में लॉग करें और मूल्यांकन करें" कहें और यह करेगा। यदि आप ऐसा कैप्चर चाहते हैं जो मॉडल की पसंद पर निर्भर नहीं करता, POST /api/v1/traces बिल्कुल वही करता है — आपका कोड सादे HTTP पर ट्रेस भेजता है, लूप में कोई मॉडल नहीं (देखें docs/http-ingest.md)। रोडमैप पर CLI और होस्ट हुक उसी एंडपॉइंट पर पतले क्लाइंट होंगे।
HTTP पर कैप्चर (लूप में कोई मॉडल नहीं)
इन्जेस्ट एंडपॉइंट डैशबोर्ड पोर्ट पर रहता है — डिफ़ॉल्ट रूप से 6920, MCP ट्रांसपोर्ट पोर्ट नहीं — और यह केवल तब मौजूद होता है जब डैशबोर्ड चल रहा हो। --dashboard पास करें (या IRIS_DASHBOARD=true सेट करें); अकेले --transport http इसे शुरू नहीं करता, और ट्रांसपोर्ट पोर्ट पर एक अनुरोध 404 लौटाता है। डैशबोर्ड ऊपर होने पर, कोई भी चीज़ जो HTTP अनुरोध भेज सकती है, एक ट्रेस लॉग कर सकती है — और वैकल्पिक रूप से उसी अनुरोध में निर्धारक मूल्यांकन चला सकती है। उसी पोर्ट पर GET /api/v1/capabilities बताता है कि यह सर्वर क्या निर्णय कर सकता है, प्रत्येक नियम को क्या चाहिए, जज की स्थिति उन चरणों के साथ जो इसे सक्षम करते हैं, और सीमाएँ — वही ऑब्जेक्ट जो MCP संसाधन iris://capabilities परोसता है — ताकि एक HTTP कॉलर के पास वह ढाँचा हो जो एक MCP क्लाइंट को initialize पर मिलता है:
curl -s -X POST "http://127.0.0.1:6920/api/v1/traces" \
-H "Content-Type: application/json" \
-d '{
"agent_name": "support-bot",
"input": "What is the refund policy?",
"output": "Refunds are available within 30 days of purchase.",
"evaluate": true,
"eval_type": "safety"
}'
संग्रहीत trace_id और मूल्यांकन परिणाम के साथ 201 लौटाता है (--demo मोड में एंडपॉइंट 403 के साथ लेखन को अस्वीकार करता है, ताकि डेमो डेटा आपके साथ कभी मिश्रित न हो)। एंडपॉइंट log_trace टूल के समान बॉडी स्वीकार करता है और डैशबोर्ड के बाकी हिस्सों के समान मिडलवेयर स्टैक के पीछे बैठता है: डिफ़ॉल्ट रूप से लूपबैक बाइंड और DNS-रीबाइंडिंग गार्ड, साथ ही जब आप एक सेट करते हैं तो Bearer प्रमाणीकरण। इसके बारे में दो सादे तथ्य: यह बिना प्रमाणीकरण के लेखन स्वीकार करता है जब तक कि Iris --api-key (या IRIS_API_KEY) के साथ शुरू नहीं किया गया था — लूपबैक बाइंड ही इसे डिफ़ॉल्ट रूप से आपकी मशीन तक रखता है, इसलिए लूपबैक से परे बाइंड करने से पहले एक कुंजी सेट करें; और यह जो संग्रहीत करता है वह शब्दशः है — input और output iris.db में बिल्कुल भेजे गए अनुसार उतरते हैं, जिसमें कोई भी टेक्स्ट शामिल है जिसे no_pii आगे फ्लैग करता है। पूर्ण अनुबंध, फ़ील्ड संदर्भ, और त्रुटि शब्दार्थ: docs/http-ingest.md।
हर Claude Code टर्न कैप्चर करें (वैकल्पिक)
/plugin marketplace add iris-eval/mcp-server
/plugin install iris-eval-capture@iris-eval
एक दूसरा, अलग से स्थापित प्लगइन: तीन हुक प्रत्येक टर्न के प्रॉम्प्ट, टूल कॉल और अंतिम उत्तर रिकॉर्ड करते हैं और उन्हें iris-eval ingest को सौंपते हैं, अलग किए गए, संग्रहीत मूल्यांकन टेक्स्ट में महत्वपूर्ण स्पैन रेडैक्टेड के साथ — कैप्चर जो मॉडल के टूल कॉल करने के निर्णय पर निर्भर नहीं करता। यह कभी भी उस टर्न को लॉग नहीं करता जिसे मॉडल पहले ही लॉग कर चुका है, कभी प्रिंट नहीं करता, कभी ब्लॉक नहीं करता, कभी कहीं कुछ नहीं भेजता। अकेले iris-eval स्थापित करना आपके टर्न लूप के बारे में कुछ नहीं बदलता। सीमाएँ और निष्कासन: claude-plugin-capture/README.md।
Python
pip install iris-eval
from iris_eval import IrisClient
iris = IrisClient() # IRIS_URL, or the running dashboard's runtime.json
iris.evaluate_output("…", input="…", agent_name="support-bot")["verdict"] # {"state": "pass", "basis": "clean", "by": []}
सर्वर 0.16.0 और उसके बाद के HTTP API पर एक पतला क्लाइंट, अपने आप संस्करणित — iris_eval.__version__ और PyPI पृष्ठ इसकी संख्या रखते हैं, जो सर्वर की नहीं है: log_trace(), evaluate_output(), get_traces(), get_trace(), health(), capabilities(), sync और async, टाइप किए गए उत्तर, अस्वीकृति पर सर्वर का अपना वाक्य — और एक pytest प्लगइन: एक iris फिक्स्चर और assert_iris(output, expect="pass") जो निर्णय की स्थिति पर जोर देता है। packages/python/README.md।
हर OpenAI और Anthropic कॉल रिकॉर्ड करें
from iris_eval import wrap_openai
client = wrap_openai(OpenAI(), agent_name="support-bot") # every call: a GenAI span to POST /v1/traces, scored
import { wrapOpenAI } from '@iris-eval/sdk';
const openai = wrapOpenAI(new OpenAI(), { agentName: 'support-bot' });
प्रदाता क्लाइंट को एक बार लपेटें और प्रत्येक मॉडल कॉल एक OpenTelemetry GenAI स्पैन बन जाता है जो OTLP दरवाजे पर भेजा जाता है, उसके इनपुट, आउटपुट, टोकन उपयोग और टूल कॉल के साथ संग्रहीत किया जाता है, और स्कोर किया जाता है: कैप्चर जो मॉडल के टूल कॉल करने पर निर्भर नहीं करता। Python क्लाइंट में wrap_openai / wrap_anthropic; @iris-eval/sdk में Vercel AI SDK के लिए wrapOpenAI, wrapAnthropic और irisMiddleware। दोनों अभी तक प्रकाशित नहीं हैं (अगला iris-eval PyPI पर रिलीज़; @iris-eval/sdk अपने पहले npm रिलीज़ तक स्रोत से बनाया गया है)। स्ट्रीम, SDK के स्ट्रीम हेल्पर और टूल कॉल शामिल हैं, मूल क्लाइंट नहीं बदला गया है, और Iris के डाउन होने से कभी कॉल नहीं टूटती — packages/sdk/README.md, packages/python/README.md।
हर LangChain और LangGraph रन स्कोर करें
from iris_eval.langchain import IrisCallbackHandler
graph.invoke(inputs, config={"callbacks": [IrisCallbackHandler(agent_name="support-bot")]})
प्रत्येक शीर्ष-स्तरीय रन एक ट्रेस बन जाता है (रन, उसके मॉडल कॉल, उसके टूल कॉल और उसके ग्राफ नोड GenAI स्पैन के रूप में) उसके इनपुट, आउटपुट, टूल कॉल, टोकन उपयोग और एक निर्णय के साथ। क्लाइंट में Python (अगली रिलीज़, अभी तक PyPI पर प्रकाशित नहीं), JavaScript @iris-eval/langchain के रूप में (अभी तक npm पर प्रकाशित नहीं)। दोनों CI में एक स्क्रिप्टेड मॉडल के साथ एक वास्तविक LangGraph ऐप के खिलाफ सिद्ध हैं; LangSmith का अपना OpenTelemetry निर्यात उसी तरह सिद्ध है — docs/otel-recipes.md।
एक CI गेट, कोई सर्वर आवश्यक नहीं
npx -y @iris-eval/mcp-server ingest --file traces.ndjson --evaluate --fail-on detector_veto
या GitHub Action (0.16.0), जो आपके नामित निर्णयों पर जॉब को विफल करता है, रसीद को जॉब सारांश में लिखता है और इसे एक पुल-रिक्वेस्ट टिप्पणी के रूप में पोस्ट करता है जो जगह पर अपडेट होती है: uses: iris-eval/mcp-server/.github/actions/gate@v0.19.0 के साथ traces: traces.ndjson — docs/ci-gate.md।
चौथा द्वार (0.15.0): POST /v1/traces डैशबोर्ड पोर्ट पर OTLP/HTTP JSON या protobuf लेता है जो आपका OpenTelemetry इंस्ट्रुमेंटेशन पहले से उत्सर्जित करता है (Python SDK का एक्सपोर्टर केवल protobuf बोलता है, इसलिए यह Python द्वार भी है), और प्रत्येक OTLP ट्रेस अपने स्पैन के साथ एक Iris ट्रेस बन जाता है — docs/otel-integration.md; प्रत्येक फ्रेमवर्क के लिए एक रेसिपी (Pydantic AI, Google ADK, LangGraph via LangSmith, CrewAI, OpenAI Agents SDK Python और JavaScript में, LlamaIndex, AutoGen, Microsoft Agent Framework, Semantic Kernel, Vercel AI SDK और Mastra), प्रत्येक एक फिक्स्चर द्वारा सिद्ध, docs/otel-recipes.md में। ingest stdin या एक फ़ाइल से एक JSON ट्रेस (या NDJSON, प्रति पंक्ति एक) पढ़ता है, उसे संग्रहीत करता है, उसे ठीक उन्हीं नियमों के अंतर्गत मूल्यांकित करता है जिन्हें evaluate_output चलाता है, प्रति ट्रेस एक JSON पंक्ति फैसले और उसके आधार के साथ प्रिंट करता है, और जब कोई फैसला --fail-on से मेल खाता है तो 1 से बाहर निकलता है। --dataset <id|label> उस गेट को डेटासेट में केस कुंजियों तक सीमित करता है (POST /api/v1/datasets एक रन की केस कुंजियों को एक में बढ़ावा देता है), इसलिए कोई जॉब केवल उन मामलों पर विफल होता है जिन्हें आपने चुना है। पूरी रेसिपी, निकास कोड और आठ आधार docs/ci-gate.md में हैं।
एक नियम को कोड के रूप में लिखें
eval.plugins में config.json आपके द्वारा लिखे गए नियमों को लोड करता है — एक ES मॉड्यूल जिसका डिफ़ॉल्ट निर्यात { name, kind, mechanism, version, needs, evaluate(ctx) } है — फ़ाइल के sha256 द्वारा पिन किया गया, इसलिए एक फ़ाइल जो पिन करने के बाद बदल गई है वह चलने के बजाय स्टार्टअप से इनकार करती है। एक लोड किया गया प्लगइन अंतर्निहित की तरह फायर करता है और plugins के अंतर्गत list_rules पर दिखता है। अनुबंध, हैश रेसिपी और एक प्लगइन क्या लौटा सकता है: docs/plugins.md।
अपनी स्वयं की प्रक्रिया में इंजन का उपयोग करें
मूल्यांकन इंजन आयात योग्य है — कोई सर्वर नहीं, कोई डेटाबेस नहीं, कोई मॉडल नहीं:
import { EvalEngine, defaultConfig } from '@iris-eval/mcp-server/engine';
const engine = new EvalEngine(defaultConfig.eval.defaultThreshold, defaultConfig.eval.ruleThresholds, defaultConfig.eval);
const result = await engine.evaluateAll({ output: answer, input: prompt, toolCalls, costUsd });
result.verdict.state; // 'pass' | 'fail' | 'unknown', with result.verdict.basis and result.interpretations
वही इंजन, वही नियम और वही कंपोज़र जो सर्वर चलाता है; builtInRules(), createCustomRule(), compose() और प्रकाशित-सटीकता रीडर इसके बगल में निर्यात किए गए हैं।
HTTP रूट के लिए एक टाइप किया गया क्लाइंट
import { createClient } from '@iris-eval/mcp-server/client';
const iris = createClient({ baseUrl: 'http://127.0.0.1:6920', apiKey: process.env.IRIS_API_KEY });
const { trace_id, evaluation } = await iris.logTrace({ agent_name: 'support-bot', input, output, tool_calls, evaluate: true });
evaluation?.verdict?.state; // the same object evaluate_output returns
हर द्वार पर एक बॉडी: यह वही है जो log_trace और iris-eval ingest स्वीकार करते हैं। एक इनकार IrisClientError को सर्वर के अपने वाक्य और स्थिति के साथ फेंकता है। दोनों उपपथ हर बिल्ड पर एक पैक किए गए टारबॉल से जांचे जाते हैं।
अपनी स्थापना सत्यापित करें
npx @iris-eval/mcp-server --self-test # offline diagnostic; exit 0 = healthy, 1 = a check failed
npx @iris-eval/mcp-server --version # prints the bare version, e.g. 1.2.3
--self-test पहले आपका Iris होम बनाता है यदि यह गायब है और जांचता है कि यह लिखने योग्य है (यदि नहीं है तो पथ का नाम देते हुए 1 से बाहर निकलता है), रिपोर्ट करता है कि आपके डेटाबेस का खोज सूचकांक कहाँ है (पूरा, एक पृष्ठभूमि बिल्ड ने अब तक कितने ट्रेस अनुक्रमित किए हैं, या इस SQLite पर कोई FTS5 नहीं), आपके डेटाबेस की स्कीमा पढ़ता है (1 से बाहर निकलता है, फिक्स के साथ, जब यह संस्करण या एक MCP क्लाइंट जो पुराने रिलीज़ से पिन किया गया है उसे नहीं खोल सकता), फिर अपनी जांच चलाता है — स्टोरेज राउंड-ट्रिप, एक लगाया गया SSN और एक लगाया गया इंजेक्शन जो सुरक्षा नियमों द्वारा पकड़ा गया, डैशबोर्ड बूट, DNS-रीबाइंडिंग गार्ड — एक अलग अस्थायी होम के अंदर। आपका वास्तविक डेटाबेस केवल पढ़ा जाता है, कभी नहीं बदला जाता। Iris जो कुछ भी लिखता है वह एक निर्देशिका के अंतर्गत रहता है, आपका Iris होम: डिफ़ॉल्ट रूप से ~/.iris (Windows पर %USERPROFILE%\.iris), या जहाँ भी IRIS_HOME इंगित करता है। वहीं iris.db, config.json, custom-rules.json, audit.log, preferences.json और डेमो फ़ाइलें रहती हैं; अपने वास्तविक डेटा को छुए बिना Iris आज़माने के लिए IRIS_HOME को एक स्क्रैच निर्देशिका पर इंगित करें।
टूल द्वारा सेटअप
| क्लाइंट | स्थिति | इसका क्या मतलब है | पढ़ें |
|---|---|---|---|
| Claude Code | सत्यापित | एक परीक्षण हर CI रन पर वास्तविक क्लाइंट चलाता है | 2026-09-25 |
| Claude Desktop | दावा किया गया | इंस्टॉलर वह आकार लिखता है जो क्लाइंट दस्तावेज़ित करता है, और वह लेखक आकार पर परीक्षण किया जाता है; Iris पक्ष के किसी ने इसे कनेक्ट होते नहीं देखा है | 2026-09-25 |
| Cursor | दावा किया गया | इंस्टॉलर वह आकार लिखता है जो क्लाइंट दस्तावेज़ित करता है, और वह लेखक आकार पर परीक्षण किया जाता है; Iris पक्ष के किसी ने इसे कनेक्ट होते नहीं देखा है | 2026-09-25 |
| Devin Desktop (Windsurf) | दावा किया गया | इंस्टॉलर वह आकार लिखता है जो क्लाइंट दस्तावेज़ित करता है, और वह लेखक आकार पर परीक्षण किया जाता है; Iris पक्ष के किसी ने इसे कनेक्ट होते नहीं देखा है | 2026-09-25 |
| Continue | दावा किया गया | इंस्टॉलर वह आकार लिखता है जो क्लाइंट दस्तावेज़ित करता है, और वह लेखक आकार पर परीक्षण किया जाता है; Iris पक्ष के किसी ने इसे कनेक्ट होते नहीं देखा है | 2026-09-25 |
| VS Code | दावा किया गया | इंस्टॉलर वह आकार लिखता है जो क्लाइंट दस्तावेज़ित करता है, और वह लेखक आकार पर परीक्षण किया जाता है; Iris पक्ष के किसी ने इसे कनेक्ट होते नहीं देखा है | 2026-09-25 |
| Cline | दावा किया गया | इंस्टॉलर वह आकार लिखता है जो क्लाइंट दस्तावेज़ित करता है, और वह लेखक आकार पर परीक्षण किया जाता है; Iris पक्ष के किसी ने इसे कनेक्ट होते नहीं देखा है | 2026-09-25 |
| Zed | दावा किया गया | इंस्टॉलर वह आकार लिखता है जो क्लाइंट दस्तावेज़ित करता है, और वह लेखक आकार पर परीक्षण किया जाता है; Iris पक्ष के किसी ने इसे कनेक्ट होते नहीं देखा है | 2026-09-25 |
| OpenAI Codex CLI | दावा किया गया | इंस्टॉलर वह आकार लिखता है जो क्लाइंट दस्तावेज़ित करता है, और वह लेखक आकार पर परीक्षण किया जाता है; Iris पक्ष के किसी ने इसे कनेक्ट होते नहीं देखा है | 2026-09-25 |
| Gemini CLI | सत्यापित | एक परीक्षण हर CI रन पर वास्तविक क्लाइंट चलाता है | 2026-09-25 |
हर पंक्ति जो जांचा गया था उसके साथ: iris-eval.com/clients। बिना पंक्ति के किसी क्लाइंट को समर्थित नहीं कहा जाता।
npx -y @iris-eval/mcp-server install <client> आपके लिए इनमें से प्रत्येक लिखता है। हाथ से, प्रति क्लाइंट:
Claude Desktop
अपनी MCP कॉन्फ़िग फ़ाइल संपादित करें:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
ऊपर JSON कॉन्फ़िग जोड़ें, फिर Claude Desktop पुनः आरंभ करें।
Claude Code
claude mcp add --transport stdio iris-eval -- npx -y @iris-eval/mcp-server
फिर टूल लोड होने के लिए सत्र पुनः आरंभ करें (/clear या फिर से लॉन्च करें)।
Windows नोट:
cmd /cरैपर का उपयोग न करें — यह पथ पार्सिंग समस्याएँ पैदा करता है।npxकमांड सीधे काम करता है।
Cursor
ऊपर JSON कॉन्फ़िग को ~/.cursor/mcp.json (हर प्रोजेक्ट) या एक वर्कस्पेस में .cursor/mcp.json में जोड़ें, iris-eval प्रविष्टि में "type": "stdio" के साथ — Cursor के दस्तावेज़ इसे आवश्यक चिह्नित करते हैं।
Devin Desktop (Windsurf)
ऊपर JSON कॉन्फ़िग को mcp_config.json में जोड़ें: macOS और Linux पर ~/.config/devin/mcp_config.json, Windows पर %APPDATA%\devin\mcp_config.json।
Continue
ऊपर JSON कॉन्फ़िग को Continue के mcpServers फ़ोल्डर में अपनी स्वयं की फ़ाइल के रूप में सहेजें: ~/.continue/mcpServers/iris-eval.json (हर वर्कस्पेस) या एक में .continue/mcpServers/iris-eval.json।
VS Code (नेटिव MCP)
अपने वर्कस्पेस में .vscode/mcp.json में जोड़ें (नोट: VS Code mcpServers नहीं, servers का उपयोग करता है):
{
"servers": {
"iris-eval": {
"command": "npx",
"args": ["-y", "@iris-eval/mcp-server"]
}
}
}
Cline
Cline का MCP सर्वर पैनल खोलें → MCP सर्वर कॉन्फ़िगर करें, और ऊपर mcpServers JSON कॉन्फ़िग को cline_mcp_settings.json (~/.cline/data/settings/cline_mcp_settings.json, VS Code, JetBrains और CLI में Cline द्वारा साझा) में जोड़ें।
Zed
Zed settings.json में जोड़ें:
{
"context_servers": {
"iris-eval": {
"command": "npx",
"args": ["-y", "@iris-eval/mcp-server"],
"env": {}
}
}
}
OpenAI Codex CLI
~/.codex/config.toml में जोड़ें:
[mcp_servers.iris-eval]
command = "npx"
args = ["-y", "@iris-eval/mcp-server"]
Gemini CLI
ऊपर mcpServers JSON कॉन्फ़िग को ~/.gemini/settings.json में जोड़ें। Gemini CLI केवल उन फ़ोल्डरों में MCP सर्वर से जुड़ता है जिन पर वह भरोसा करता है: यदि gemini mcp list iris-eval को अक्षम दिखाता है, तो उस फ़ोल्डर में /permissions चलाएँ।
कुछ और जो MCP बोलता है
Iris एक मानक stdio MCP सर्वर है — एक npx @iris-eval/mcp-server कमांड, कोई SDK नहीं, कोई कोड परिवर्तन नहीं। यदि आपका क्लाइंट MCP का समर्थन करता है, तो यह Iris का समर्थन करता है। क्लाइंट कॉन्फ़िग प्रारूप बदलते हैं; संदेह होने पर, अपने क्लाइंट के MCP दस्तावेज़ देखें और उसे उस कमांड पर इंगित करें।
अन्य स्थापना विधियाँ
# Global install (recommended for persistent data and faster startup)
npm install -g @iris-eval/mcp-server
iris-eval --dashboard
# Docker — two servers, two ports: 3000 = MCP HTTP transport,
# 6920 = dashboard (which also serves the POST /api/v1/traces ingest endpoint).
# The image binds 0.0.0.0 inside the container, so a key is required (see Production).
# The volume is the Iris home: the database, deployed rules and audit log persist in it.
docker run -p 3000:3000 -p 6920:6920 -v iris-data:/data \
-e IRIS_API_KEY="$(openssl rand -hex 32)" ghcr.io/iris-eval/mcp-server
टिप: वैश्विक स्थापना (
npm install -g) ट्रेस को~/.iris/iris.dbपर स्थायी रूप से संग्रहीत करती है।npxके साथ, ट्रेस उसी स्थान पर बने रहते हैं, लेकिन पैकेज समाधान के कारण स्टार्टअप धीमा होता है।
आपको क्या मिलता है
| ट्रेस लॉगिंग | प्रति-टूल-कॉल विलंबता, टोकन उपयोग और USD में लागत के साथ पदानुक्रमित स्पैन ट्री। SQLite में संग्रहीत, तुरंत क्वेरी योग्य। |
| आउटपुट मूल्यांकन | 4 श्रेणियों में 25 अंतर्निहित नियम: पूर्णता, प्रासंगिकता, सुरक्षा, लागत। PII पहचान (21 पैटर्न: SSN, क्रेडिट कार्ड, फोन, ईमेल, IBAN, DOB, MRN, IP, API कुंजी, पासपोर्ट, साथ ही AWS/Slack/SendGrid/GitHub/Google/npm/DigitalOcean टोकन, URL के अंदर क्रेडेंशियल, गुप्त-नामित असाइनमेंट, PEM निजी-कुंजी ब्लॉक और सीड वाक्यांश; जन्म तिथि, चिकित्सा रिकॉर्ड संख्या, पासपोर्ट और सीड वाक्यांश केवल उनके लेबल के बगल में फायर करते हैं, डिज़ाइन द्वारा), प्रॉम्प्ट इंजेक्शन (38 पैटर्न, वाक्यांश + संरचनात्मक), स्टब-आउटपुट पहचान, मतिभ्रम पहचान (25 संदर्भ-आधारित निर्माण/विरोधाभास संकेत — उन्हें एजेंट की स्रोत सामग्री के खिलाफ आधारित करने के लिए input पास करें), और छह प्रक्षेपवक्र नियम जो पढ़ते हैं कि एजेंट ने क्या किया: एक अस्वीकृत विफल टूल कॉल, एक दोहराया गया (कॉल द्वारा, दोहराए गए अनुक्रम द्वारा, या लक्ष्य द्वारा एक बार आप tools भेजते हैं), एक कॉल जिसके तर्क टूल की अपनी JSON स्कीमा अस्वीकार करती है और एजेंट ने कभी पुनः प्रयास नहीं किया, एक फ़ाइल, निर्देशिका या URL जो उत्तर उद्धृत करता है जो एजेंट द्वारा पढ़ी गई किसी चीज़ में प्रकट नहीं होता, एक निर्देश जो TOOL RESULT के अंदर आया और फिर बाद के कॉल द्वारा पालन किया गया, और एक कार्य जिसने आपके चरण बजट से अधिक टूल कॉल लिए। एक प्रक्षेपवक्र tool_calls या OpenTelemetry TOOL स्पैन के रूप में आ सकता है। Zod स्कीमा के साथ कस्टम नियम जोड़ें। |
| LLM-एज़-जज | Anthropic या OpenAI के माध्यम से वैकल्पिक शब्दार्थ स्कोरिंग — अपनी स्वयं की API कुंजी लाएँ। सात टेम्पलेट। IRIS_RELEVANCE_JUDGE_MODEL सेट होने पर, answers_the_ask relevance जज से पूछता है और एक ऑफ-टॉपिक उत्तर विफल करता है; इसके बिना नियम अनुरोध को शाब्दिक रूप से पढ़ता है और सलाह देता है। कठोर प्रति-मूल्यांकन लागत सीमा (IRIS_LLM_JUDGE_MAX_COST_USD_PER_EVAL, डिफ़ॉल्ट $0.25), प्रति-मूल्यांकन मूल्य निर्धारण परिणाम में प्रकट। |
| लागत दृश्यता | किसी भी समय विंडो पर सभी एजेंटों में कुल लागत। बजट सीमाएँ निर्धारित करें। एजेंटों द्वारा अधिक खर्च करने पर ध्वजांकित करें। एक ट्रेस जो टोकन गणना और एक मॉडल भेजता है लेकिन कोई लागत नहीं (अधिकांश OpenTelemetry और फ्रेमवर्क ट्रेस) मॉडल की सूची मूल्य पर मूल्यांकित होता है और जहाँ भी दिखता है अनुमानित चिह्नित होता है; config.json में pricing.models उन मॉडलों का मूल्य निर्धारण करता है जो अंतर्निहित तालिका नहीं करती — docs/cost.md। |
| वेब डैशबोर्ड | रीयल-टाइम डार्क-मोड UI जो विफलताओं पर उतरता है, सबसे खराब और नवीनतम पहले — हर ट्रेस के पाठ पर पूर्ण-पाठ खोज के साथ ट्रेस विज़ुअलाइज़ेशन, मूल्यांकन परिणाम, लागत विवरण, और एक कमांड पैलेट (⌘K) जो आपके स्वयं के नियम, ट्रेस और मूल्यांकन खोजता है। |
| स्थानीय-पहले | सब कुछ आपकी डिस्क पर SQLite में रहता है। कोई खाता नहीं, कोई साइन-अप नहीं, कोई टेलीमेट्री नहीं। आउटबाउंड HTTP केवल वहीं होता है जहाँ आप ऑप्ट-इन करते हैं: आपकी स्वयं की LLM-जज कुंजी, उद्धरण लाना, एक OTel एक्सपोर्टर जो आप कॉन्फ़िगर करते हैं, या एक वेबहुक जो आप सेट करते हैं। |
यह आगे कहाँ जा रहा है: क्षमता मानचित्र — हर प्रश्न जो Iris से हर विषय के बारे में पूछा जा सकता है, उसके पास क्या है और क्या कमी है — और तीन ट्रैक।
मापा गया, दावा नहीं किया गया
हर अंतर्निहित नियम का एक प्रकाशित precision, recall और F1 होता है, जिसमें 95% confidence intervals होते हैं, जो इस रिपॉजिटरी में मौजूद एक लेबल किए गए corpus पर मापे जाते हैं (proof/corpus/) और एक कमांड से पुनर्जीवित होते हैं — npm run proof — ऑफ़लाइन, बिना किसी key और बिना किसी model के। वे संख्याएँ दो अलग-अलग प्रकार की होती हैं, और पृष्ठ उन्हें कभी एक साथ नहीं जोड़ता: कुछ नियम उन लेबलों के विरुद्ध मापे जाते हैं जो एक model ने स्वयं failure को पढ़कर दिए हैं, जो detection को मापता है; बाकी की जाँच उनके अपने प्रलेखित definition के विरुद्ध की जाती है, जिसे स्वतंत्र रूप से लागू किया जाता है, जो दिखाता है कि code अपना formula लागू करता है और यह नहीं बताता कि formula failure को पकड़ता है या नहीं। proof/RESULTS.md और proof पृष्ठ प्रत्येक नियम को चिह्नित करते हैं। CI हर pull request पर माप को फिर से चलाता है और विफल हो जाता है यदि committed संख्याएँ code द्वारा उत्पादित संख्याओं से भिन्न हों, इसलिए कोई नियम बिना उसकी संख्याओं के बदले बदल नहीं सकता। संख्याएँ iris-eval.com/proof और proof/RESULTS.md पर हैं; corpus कैसे बनाया गया, यह क्या नहीं है, और interval कैसे पढ़ें, यह docs/proof.md में है। Corpus सिंथेटिक और model-लेबल किया हुआ है — एक मानव blind label लंबित है, और पृष्ठ ऐसा कहता है; node proof/blind-sample.mjs प्रतिलिपि प्रस्तुत करने योग्य नमूना खींचता है जो इसे तय करेगा।
MCP Tools
Iris बारह उपकरण पंजीकृत करता है जिन्हें कोई भी MCP-संगत agent लागू कर सकता है — trace और rule lifecycle, runs के बीच तुलना, LLM-as-judge और semantic citation verification:
log_trace— एक agent निष्पादन को spans, tool calls, token usage और cost के साथ लॉग करें; उसी कॉल में इसे स्कोर करने के लिएevaluate: trueपास करेंevaluate_output— completeness, relevance, safety और cost नियमों के विरुद्ध आउटपुट गुणवत्ता को स्कोर करें (heuristic, deterministic, free)get_traces— filtering, pagination और time-range समर्थन के साथ संग्रहीत traces को क्वेरी करें, और वह run खोजें जहाँ agent नेqके साथ कुछ कहा: input, output, tool-call values और metadata पर full-text खोज, रैंक किया हुआ, मिलान किए गए शब्दों के साथ चिह्नितlist_rules— तैनात कस्टम eval नियमों की सूची बनाएं (read-only)deploy_rule— एक नया कस्टम eval नियम पंजीकृत करें ताकि यह उस श्रेणी के हरevaluate_outputपर सक्रिय होdelete_rule— एक तैनात कस्टम नियम हटाएं (destructive, idempotent)delete_trace— ID द्वारा एक संग्रहीत trace हटाएं (destructive, tenant-scoped)evaluate_with_llm_judge— LLM के माध्यम से Semantic eval (Anthropic या OpenAI)। सात टेम्पलेट: accuracy, helpfulness, safety, correctness, faithfulness, task_completed, relevance। Cost-capped, प्रति-eval मूल्य निर्धारण प्रकट। अपनी API key लाएं (IRIS_ANTHROPIC_API_KEYयाIRIS_OPENAI_API_KEY) — Iris LLM कॉल्स को proxy या relay नहीं करता।verify_citations— आउटपुट से citations निकालें (numbered, author-year, URLs, DOIs), SSRF-guarded + domain-allowlisted resolver के पीछे स्रोतों को लाएं, और यह जाँचने के लिए LLM judge का उपयोग करें कि प्रत्येक स्रोत वास्तव में उद्धृत दावे का समर्थन करता है या नहीं। Opt-in outbound HTTP।evaluate_with_llm_judgeके समान BYOK आवश्यकता।compare_runs— क्या किसी बदलाव ने agent को बदतर बना दिया? संग्रहीत evaluations के दो runs की तुलना करता है: एक paired exact test जब runs साझा case keys रखते हैं, अन्यथा अंतर पर एक interval, एक ईमानदार "cannot tell" जिसमें लगने वाले cases की संख्या होती है, या "equivalent within a margin"। प्रत्येक नियम अपना स्वयं का one-sided test रखता है, एक साथ सही किया गया (Benjamini–Hochberg) ताकि बीस नियम regression नहीं बना सकेंcompare_traces— agent एक ही प्रश्न का कितनी विश्वसनीयता से उत्तर देता है? intervals के साथ प्रति-case pass rates, पहले flaky cases, और एक समग्र दर जो repeats का सम्मान करती हैevaluate_runs— एक run में हर trace को आज के नियमों के तहत एक नए run में फिर से स्कोर करें, ताकि नियमों में बदलाव को agent में बदलाव के रूप में कभी न पढ़ा जाए
LLM judge सक्षम करें (वैकल्पिक; deterministic नियमों को कभी इसकी आवश्यकता नहीं होती)
- Anthropic या OpenAI से API key प्राप्त करें।
- इसे Iris चलाने वाली प्रक्रिया के environment में रखें, न कि केवल अपने shell में। Claude Code, Claude Desktop, Cursor और अधिकांश MCP clients: अपने MCP config में iris-eval प्रविष्टि का "env" ब्लॉक — "iris-eval": { "command": "npx", "args": ["-y", "@iris-eval/mcp-server"], "env": { "IRIS_ANTHROPIC_API_KEY": "sk-ant-..." } } (OpenAI key के लिए IRIS_OPENAI_API_KEY)। Docker: run कमांड पर -e IRIS_ANTHROPIC_API_KEY=...। HTTP या CI: iris-eval शुरू करने से पहले इसे export करें।
- MCP सत्र पुनः आरंभ करें। एक चल रही प्रक्रिया उसके शुरू होने के बाद सेट किया गया variable कभी नहीं देखती।
- अपने client के अंदर से पुष्टि करें: iris://capabilities पढ़ें — judge.enabled वहाँ true होना चाहिए। आपके shell में export की गई key आपके client द्वारा शुरू की गई प्रक्रिया को नहीं दी जाती जब तक उसका config इसे सूचीबद्ध न करे। एक मशीन पर,
npx @iris-eval/mcp-server --self-testउस shell के लिए judge लाइन प्रिंट करता है, और GET /api/v1/health एक चल रहे dashboard पर judge.enabled रिपोर्ट करता है। - Spend guard: प्रत्येक कॉल IRIS_LLM_JUDGE_MAX_COST_USD_PER_EVAL (डिफ़ॉल्ट 0.25 USD) द्वारा सीमित है और सबसे खराब स्थिति इसे पार करने पर किसी भी spend से पहले अस्वीकार कर दिया जाता है। Iris आपकी key के साथ सीधे provider को कॉल करता है और इसे कभी proxy नहीं करता।
- वैकल्पिक: IRIS_RELEVANCE_JUDGE_MODEL को एक मूल्यवान model id (उदाहरण के लिए, claude-haiku-4-5) पर सेट करें ताकि answers_the_ask judge से पूछे कि प्रत्येक उत्तर अपने ask को संबोधित करता है या नहीं, और एक off-topic उत्तर को विफल करे। यह प्रति evaluation एक judge कॉल है जो एक input रखता है, आपकी key पर और उपरोक्त cap के तहत; key अकेले इसे कभी चालू नहीं करती। प्रत्येक कॉल उस input और output को model के provider को भेजता है, पहले no_pii flags के साथ व्यक्तिगत डेटा और credentials को बदलकर (IRIS_RELEVANCE_JUDGE_REDACT=off उन्हें जैसे हैं वैसे भेजता है)। यह प्रति UTC दिन अधिकतम IRIS_RELEVANCE_JUDGE_DAILY_BUDGET_USD (डिफ़ॉल्ट 1 USD) खर्च करता है और प्रति अनुरोध अधिकतम IRIS_RELEVANCE_JUDGE_MAX_CALLS_PER_REQUEST कॉल करता है (डिफ़ॉल्ट 20); इनमें से किसी के पार होने पर, answers_the_ask ask को शाब्दिक रूप से पढ़ता है और कारण बताता है।
जब IRIS_OTEL_ENDPOINT कॉन्फ़िगर किया जाता है, log_trace कॉल्स किसी भी OpenTelemetry collector (Jaeger, Grafana Tempo, Datadog OTLP, Honeycomb, आदि) के लिए एक best-effort OTLP/HTTP JSON export भी उत्सर्जित करते हैं। देखें docs/otel-integration.md।
passed कैसे तय किया जाता है
evaluate_output एक score और एक passed फ़्लैग दोनों लौटाता है — वे अलग-अलग प्रश्नों का उत्तर देते हैं:
score(0..1) चलाए गए नियमों में भारित औसत है — एक गुणवत्ता gradient।passedship/no-ship निर्णय है, और स्कोर इसके लिए कभी परामर्श नहीं किया जाता। एक composer प्रत्येक नियम को उसके दावे के प्रकार से पढ़ता है: एक policy जिसे आपने कॉन्फ़िगर किया है gates; एक critical detector vetoes; एक critical check जो पूछा गया था और उत्तर नहीं दे सका निर्णय को unknown (passed: false) बनाता है न कि clean; हर शेष detector एक संभावना में जुड़ता है कि आउटपुट खराब है, जिसे आपeval.falsePassCostमें बताए गए loss ratio के विरुद्ध तौला जाता है (डिफ़ॉल्ट 1, इसलिए कट 0.5 है)।verdict.basisउस परत का नाम बताता है जिसने निर्णय लिया औरverdict.byनियमों का, औरverdict.alsoहर बाद की परत को सूचीबद्ध करता है जिसने इसे भी तय किया होता;interpretations[]बताता है कि एक नियम जो विफल हुआ उसने निर्णय क्यों नहीं लिया और कौन सी सेटिंग इसे बदल देगी, और किसी भी प्रश्न का नाम बताता है जिसे नहीं आंका गया और वह input जो इसे आंकने देगा।
वास्तविक सुरक्षा उल्लंघन hard-fail होते हैं। डिफ़ॉल्ट रूप से no_pii, no_injection_patterns, और no_blocklist_words critical rules हैं: यदि एक विफल होता है, eval passed: false रिपोर्ट करता है चाहे अन्य नियमों ने कितना भी अच्छा स्कोर किया हो, और प्रतिक्रिया critical_failures में दोषियों का नाम बताती है। एक लीक हुआ SSN औसत नहीं किया जा सकता। कौन से अंतर्निहित नियम critical हैं यह एक deployment सेटिंग है (eval.criticalRules / eval.nonCriticalRules); प्रत्येक नियम परिणाम प्रभावी critical फ़्लैग और criticalSource रखता है, और list_rules उस roster की रिपोर्ट करता है जिसे यह सर्वर लागू करता है। severity: "high" या "critical" के साथ तैनात कस्टम नियम उसी तरह hard-fail होते हैं; low/medium गंभीरता केवल स्कोर को प्रभावित करती है। एक सीमा जानने योग्य है, हर सतह पर उसी तरह बताई गई: एक critical rule जो skipped (लापता संदर्भ, एक टूटी हुई परिभाषा, या sandbox बजट पर मारा गया regex) ने आउटपुट का न्याय नहीं किया और veto नहीं करता — ऐसा हर नियम critical_skipped में नामित है। एक gate जिसे fail closed होना चाहिए वह एक गैर-खाली critical_skipped को unknown मानता है, clean नहीं, और rule_results में किसी भी budgetExceeded skip को उसी तरह मान सकता है।
CI gates के लिए: यदि आप eval_type छोड़ देते हैं, हर bundle चलता है — completeness, relevance, safety, cost और कोई भी कस्टम नियम — और प्रतिक्रिया eval_type: "all" कहती है जिसमें note है कि डिफ़ॉल्ट चला, साथ ही एक प्रति-bundle categories मानचित्र। एक bundle जिसके पास न्याय करने के लिए कुछ नहीं है (बिना cost_usd के cost, बिना input के relevance) वहाँ passed: null रिपोर्ट करता है — मूल्यांकित नहीं, विफल नहीं — और कभी निर्णय की ओर नहीं गिना जाता। प्रतिक्रिया हमेशा eval_type को प्रतिध्वनित करती है जो चला, ताकि आपका gate कवरेज सत्यापित कर सके; निर्णय के लिए passed पर कुंजी लगाएं और केवल तभी एक bundle का नाम लें जब आप एक संकीर्ण run चाहते हैं।
एक कस्टम नियम लिखना
एक नियम जोड़ने के दो तरीके। Inline नियम एक evaluate_output कॉल पर सवार होते हैं (custom_rules, प्रति कॉल अधिकतम 10); वे आपके चुने हुए eval_type bundle के साथ, या अकेले eval_type: "custom" के साथ सक्रिय होते हैं। Deployed नियम एक बार deploy_rule के साथ पंजीकृत होते हैं, आपके Iris home के तहत custom-rules.json में बने रहते हैं, और उनके evalType के हर भविष्य के evaluate_output पर सक्रिय होते हैं। परिभाषा किसी भी तरह से समान आकार की है:
| फ़ील्ड | आवश्यक | यह क्या है |
|---|---|---|
name | हाँ | 1–80 वर्ण; परिणामों में ruleName के रूप में दिखाई देता है |
type | हाँ | regex_match · regex_no_match · min_length · max_length · contains_keywords · excludes_keywords · json_schema · cost_threshold में से एक |
config | हाँ | उस प्रकार के लिए कुंजियाँ: दो regex प्रकारों के लिए pattern (+ वैकल्पिक flags) · min_length / max_length (एक वर्ण गणना) · दो कीवर्ड प्रकारों के लिए keywords (+ वैकल्पिक threshold, 0–1, डिफ़ॉल्ट 1 = सभी दिखना चाहिए) · json_schema के लिए {} · cost_threshold के लिए USD में max_cost |
weight | नहीं | स्कोर में वजन; डिफ़ॉल्ट 1 |
deploy_rule परिभाषा को name, एक वैकल्पिक description, evalType (completeness · relevance · safety · cost · custom) और severity के साथ लपेटता है। गंभीरता बताती है कि एक विफलता का क्या अर्थ है: low/medium केवल स्कोर कम करते हैं; high/critical मूल्यांकन को hard-fail करते हैं — passed: false, नियम critical_failures में नामित — चाहे भारित स्कोर कुछ भी कहे। एक नियम जो skip करता है (बिना cost_usd के cost_threshold नियम, या 100 ms sandbox बजट पर मारा गया regex) ने आउटपुट का न्याय नहीं किया है और इसके बजाय critical_skipped में सूचीबद्ध है। एक critical नियम तैनात करें जो agent द्वारा कही गई किसी भी चीज़ में आंतरिक hostnames को प्रतिबंधित करता है:
{
"name": "no_internal_hostnames",
"description": "Output must not mention internal hostnames.",
"evalType": "safety",
"severity": "critical",
"definition": {
"name": "no_internal_hostnames",
"type": "regex_no_match",
"config": { "pattern": "\\b[a-z0-9-]+\\.internal\\.example\\b", "flags": "i" }
}
}
प्रतिक्रिया बना रहा नियम है — delete_rule के लिए id रखें:
{ "rule": { "id": "rule-588823d0", "name": "no_internal_hostnames", "evalType": "safety", "severity": "critical", "enabled": true, "version": 1, "definition": { "…": "…" } } }
अगले ही evaluate_output से eval_type: "safety" के साथ, एक आउटपुट जो db-primary.internal.example का उल्लेख करता है वह passed: false के साथ critical_failures: ["no_internal_hostnames"] लौटाता है — भले ही सभी पाँच अंतर्निहित सुरक्षा नियम पारित हुए और भारित स्कोर 0.895 है। Regex पैटर्न को तैनाती के समय ReDoS जाँच पास करनी चाहिए और हमेशा एक कठोर 100 ms deadline के तहत sandbox worker में चलना चाहिए। list_rules दिखाता है कि क्या तैनात है; dashboard का rule composer उसी आकार को एक failure से बनाता है जिस पर आपने क्लिक किया। पूर्ण संदर्भ, प्रति प्रकार स्कोरिंग, और काम किए गए उदाहरण: docs/custom-rules.md।
पूर्ण tool schemas और कॉन्फ़िगरेशन: iris-eval.com
Hosted features
Iris आज पूरी तरह से आपकी मशीन पर चलता है, और यह जो कुछ भी करता है वह मुफ्त और MIT लाइसेंस प्राप्त है जिसमें कोई सीमा या खाता नहीं है। होस्टेड स्टोरेज, साझा टीम इतिहास और अलर्टिंग विचाराधीन हैं, निर्माणाधीन नहीं। कोई मूल्य निर्धारण नहीं है, और खरीदने के लिए कुछ भी नहीं है। यदि साझा इतिहास आपके लिए उपयोगी होगा, तो प्रतीक्षा सूची यह पता लगाने का हमारा तरीका है कि क्या इसे बनाना उचित है — यह आपको किसी भी चीज़ के लिए प्रतिबद्ध नहीं करता है।
दो प्रतिबद्धताएँ किसी भी स्थिति में कायम रहती हैं: आज जो मुफ़्त है वह कभी भी पेवॉल के पीछे नहीं जाएगा, और कोई भी अनुपालन प्रमाणन उसके प्राप्त होने से पहले दावा नहीं किया जाएगा।
उदाहरण
- Claude Desktop सेटअप — stdio और HTTP मोड के लिए MCP कॉन्फ़िग
- TypeScript — MCP SDK क्लाइंट — टूल्स से कनेक्ट करें और इनवोक करें
- HTTP ट्रांसपोर्ट (TS + Python) — REST-शैली एकीकरण के लिए पूर्ण क्लाइंट कोड
- एक LangGraph एजेंट, रन दर रन स्कोर किया गया (Python) —
IrisCallbackHandlerग्राफ़ के कॉलबैक में; CI एक स्क्रिप्टेड मॉडल के साथ वही ग्राफ़ चलाता है - OpenTelemetry पर एक CrewAI क्रू (Python) — OpenInference इंस्ट्रूमेंटर सीधे Iris के OTLP द्वार तक, CrewAI रेसिपी एक स्क्रिप्ट के रूप में
- OpenTelemetry पर एक OpenAI Agents SDK एजेंट (Python) और (JavaScript), और एक LlamaIndex एजेंट — प्रत्येक रेसिपी उस स्क्रिप्ट के रूप में जिसे CI एक वास्तविक Iris सर्वर के विरुद्ध चलाता है
समुदाय
- GitHub Issues — बग रिपोर्ट और फीचर अनुरोध
- GitHub Discussions — प्रश्न और विचार
- योगदान गाइड — योगदान कैसे करें
- HTTP इन्जेस्ट —
POST /api/v1/tracesके माध्यम से निर्धारणात्मक ट्रेस कैप्चर - क्षमता मानचित्र — हर वह प्रश्न जो Iris से पूछा जा सकता है, और उसमें क्या कमी है
- संस्करण नीति — प्रत्येक संस्करण संख्या क्या वादा करती है, और 1.0 से पहले क्या सत्य होना चाहिए
कॉन्फ़िगरेशन और सुरक्षा
CLI तर्क
| फ़्लैग | डिफ़ॉल्ट | विवरण |
|---|---|---|
--transport | stdio | ट्रांसपोर्ट प्रकार: stdio या http |
--port | 3000 | HTTP ट्रांसपोर्ट पोर्ट |
--db-path | ~/.iris/iris.db | SQLite डेटाबेस पथ |
--config | ~/.iris/config.json | कॉन्फ़िग फ़ाइल पथ |
--api-key | — | HTTP प्रमाणीकरण के लिए API कुंजी (ट्रांसपोर्ट और डैशबोर्ड, जिसमें POST /api/v1/traces शामिल है) |
--dashboard | false | वेब डैशबोर्ड सक्षम करें। यह भी एकमात्र तरीका है जिससे POST /api/v1/traces इन्जेस्ट एंडपॉइंट शुरू होता है — यह --transport http के साथ कभी भी निहित रूप से शुरू नहीं होता है |
--dashboard-port | 6920 | डैशबोर्ड पोर्ट |
--dashboard-host | 127.0.0.1 | डैशबोर्ड बाइंड पता। डिफ़ॉल्ट रूप से लूपबैक — डैशबोर्ड अनप्रमाणित है जब तक --api-key सेट नहीं है, इसलिए लूपबैक से परे बाइंडिंग आपके पूर्ण ट्रेस इतिहास को उजागर करती है |
--demo | false | एक डेमो डेटाबेस सीड करें (आपके वास्तविक ट्रेस से अलग) और उसके विरुद्ध डैशबोर्ड परोसें |
--demo-clear | false | डेमो डेटाबेस हटाएँ और बाहर निकलें |
--self-test | false | एक पृथक अस्थायी होम में ऑफ़लाइन इंस्टॉल डायग्नोस्टिक चलाएँ, फिर बाहर निकलें (0 = स्वस्थ, 1 = एक जाँच विफल)। यह कॉन्फ़िगर किए गए डेटाबेस को भी पढ़ता है, केवल-पढ़ने के लिए, और विफल हो जाता है जब यह संस्करण या एक पिन किया गया MCP क्लाइंट इसे नहीं खोल सकता |
--purge | false | कॉन्फ़िगर किए गए डेटाबेस से हर संग्रहीत ट्रेस, स्पैन और मूल्यांकन हटाएँ, फ़ाइल को कॉम्पैक्ट करें और राइट-आगे लॉग को ट्रंकेट करें ताकि हटाया गया टेक्स्ट डिस्क पर न रहे, फिर बाहर निकलें। तैनात नियम, ऑडिट लॉग और प्राथमिकताएँ रखी जाती हैं। प्रतिवर्ती नहीं। पहले किसी भी चल रहे Iris सर्वर को रोकें — फ़ाइल को स्थान पर कॉम्पैक्ट किया जाता है। --demo, --demo-clear या --self-test के साथ संयोजन करने से इनकार करता है |
--version | — | बेयर संस्करण प्रिंट करें (जैसे 1.2.3) stdout पर और 0 के साथ बाहर निकलें। आपके Iris होम के अंतर्गत कुछ भी नहीं पढ़ता है |
तीन कमांड अपने स्वयं के तर्क लेते हैं और बाहर निकलते हैं: iris-eval ingest एक फ़ाइल या stdin से ट्रेस लोड करता है (एक CI गेट, कोई सर्वर आवश्यक नहीं), iris-eval export traces|evaluations --format csv|jsonl वही लिखता है जो संग्रहीत है, डैशबोर्ड की सूचियों की तरह फ़िल्टर किया गया, stdout या --out पर (docs/api-reference.md), और iris-eval install <client> Iris को एक MCP क्लाइंट के कॉन्फ़िग में लिखता है — --uninstall इसे बाहर निकालता है, --list इस मशीन पर पाए गए क्लाइंट और प्रत्येक द्वारा चलाए जाने वाले Iris को दिखाता है, --upgrade हर क्लाइंट को इस संस्करण में ले जाता है जो Iris चलाता है (अपना स्वयं का एजेंट कनेक्ट करें, अपडेट करना)। कोई भी सर्वर शुरू नहीं करता है।
config.json Iris शुरू होने पर मान्य किया जाता है। एक कुंजी जिसे Iris नहीं पढ़ता है — एक टाइपो जैसे eval.critcalRules, किसी अन्य टूल की कुंजी — या गलत प्रकार का मान एक वाक्य के साथ स्टार्टअप से इनकार करता है जो पूर्ण कुंजी, सबसे संभावित कुंजी, या वांछित प्रकार का नाम देता है। फ़ाइल में कुछ भी चुपचाप अनदेखा नहीं किया जाता है।
पर्यावरण चर
हर चर --help दस्तावेज़ित करता है। CLI फ़्लैग पर्यावरण चर पर पूर्वता लेते हैं जब दोनों सेट होते हैं।
| चर | विवरण |
|---|---|
IRIS_TRANSPORT | ट्रांसपोर्ट प्रकार (stdio या http) |
IRIS_HOST | HTTP ट्रांसपोर्ट बाइंड पता (डिफ़ॉल्ट 127.0.0.1) |
IRIS_PORT | HTTP ट्रांसपोर्ट पोर्ट (1-65535, डिफ़ॉल्ट 3000) |
IRIS_HOME | सभी प्रति-उपयोगकर्ता फ़ाइलों के लिए निर्देशिका: config.json, iris.db, custom-rules.json, audit.log, preferences.json (डिफ़ॉल्ट ~/.iris) |
IRIS_DB_PATH | SQLite डेटाबेस पथ (केवल DB के लिए IRIS_HOME को ओवरराइड करता है) |
IRIS_SQLITE_DRIVER | कौन सा SQLite ड्राइवर डेटाबेस रखता है: native (better-sqlite3, डिफ़ॉल्ट) या node (Node का अंतर्निहित node:sqlite, Node 22.13+)। अनसेट: नेटिव, और जब नेटिव मॉड्यूल लोड नहीं हो सकता (या एक बिल्ड है जो इस Node पर रुक जाएगा) Iris एक बार चेतावनी देता है और अंतर्निहित पर वापस आ जाता है |
IRIS_SEARCH_BUDGET_MS | एक ट्रेस खोज (q) कितनी देर तक पढ़ सकती है इससे पहले कि वह अब तक मिले मिलानों और search.complete: false के साथ उत्तर दे, मिलीसेकंड में (50 से 60000, डिफ़ॉल्ट 1000)। एक खोज पढ़ते समय अन्य अनुरोधों को रोकती है, इसलिए यह भी सबसे लंबा समय है जो उन्हें प्रतीक्षा करा सकता है। config.json में storage.searchBudgetMs भी |
IRIS_SEARCH_INDEX | on (डिफ़ॉल्ट) या off। off ट्रेस का कोई पूर्ण-पाठ सूचकांक नहीं रखता है: एक लेखन ट्रेस और कुछ नहीं संग्रहीत करता है, और एक ट्रेस खोज (q) ट्रेस को स्वयं IRIS_SEARCH_BUDGET_MS के भीतर पढ़ती है, नवीनतम पहले, इसलिए एक बड़े स्टोर पर यह मिलानों के हिस्से के साथ उत्तर दे सकती है (search.complete: false)। इसे बंद करने से डेटाबेस द्वारा रखा गया सूचकांक मिट जाता है; इसे फिर से चालू करने से पृष्ठभूमि में एक नया बनता है। config.json में storage.searchIndex भी |
IRIS_LOG_LEVEL | लॉग स्तर: debug, info, warn, error |
IRIS_DASHBOARD | true/1/yes/on वेब डैशबोर्ड सक्षम करता है; false/0/no/off इसे अक्षम करता है (config.json में dashboard.enabled को भी ओवरराइड करता है) |
IRIS_DASHBOARD_PORT | डैशबोर्ड पोर्ट (1-65535, डिफ़ॉल्ट 6920) |
IRIS_WEBHOOK_URL | वेबहुक का प्राप्तकर्ता जो एक क्षण पर फायर करता है — config.json में notify.webhook पर मर्ज किया गया (docs/webhooks.md) |
IRIS_WEBHOOK_SECRET | वेबहुक की हस्ताक्षर कुंजी (कोई भी स्ट्रिंग, या whsec_ + base64); iris प्रारूप एक के बिना चलने से इनकार करता है |
IRIS_DASHBOARD_HOST | डैशबोर्ड बाइंड पता (डिफ़ॉल्ट 127.0.0.1) |
IRIS_API_KEY | HTTP प्रमाणीकरण के लिए API कुंजी। HTTP ट्रांसपोर्ट या डैशबोर्ड को लूपबैक से परे बाइंड करने के लिए आवश्यक (0.0.0.0, एक LAN पता, एक कंटेनर): इसके बिना सर्वर शुरू करने से इनकार करता है |
IRIS_API_KEY_FILE | एक फ़ाइल का पथ जिसकी ट्रिम की गई सामग्री API कुंजी है — गुप्त-फ़ाइल पैटर्न जिसे Docker और Kubernetes माउंट करते हैं, ताकि कुंजी कभी भी पर्यावरण ब्लॉक में न बैठे। यह या IRIS_API_KEY सेट करें, दोनों नहीं |
IRIS_ALLOW_UNAUTHENTICATED | जानबूझकर बिना कुंजी के गैर-लूपबैक बाइंड चलाने के लिए 1 पर सेट करें (इनकार को हटाता है; नेटवर्क तब आपकी सीमा है) |
IRIS_ALLOWED_ORIGINS | अल्पविराम-पृथक मूल अनुमति सूची। डैशबोर्ड: CORS हेडर (ग्लोब्स का समर्थन करता है, जैसे http://localhost:*)। HTTP ट्रांसपोर्ट: DNS-रीबाइंडिंग सुरक्षा के लिए सटीक-मिलान Origin अनुमति सूची (ग्लोब्स अनदेखा किए जाते हैं; सर्वर के स्वयं के लूपबैक मूल हमेशा अनुमत होते हैं) |
IRIS_NO_AUTO_LAUNCH | पहली-रन डैशबोर्ड ऑटो-लॉन्च अक्षम करने के लिए 1 पर सेट करें |
IRIS_ANTHROPIC_API_KEY | evaluate_with_llm_judge + verify_citations द्वारा provider=anthropic के साथ आवश्यक |
IRIS_OPENAI_API_KEY | evaluate_with_llm_judge + verify_citations द्वारा provider=openai के साथ आवश्यक |
IRIS_LLM_JUDGE_MAX_COST_USD_PER_EVAL | प्रति LLM जज कॉल हार्ड लागत सीमा (डिफ़ॉल्ट 0.25) |
IRIS_RELEVANCE_JUDGE_MODEL | एक मूल्यवान जज मॉडल आईडी (जैसे claude-haiku-4-5)। जब सेट होता है, उस प्रदाता की कुंजी के साथ, answers_the_ask हर मूल्यांकन पर इस LLM जज से पूछता है जो एक इनपुट रखता है और उसकी प्रासंगिकता निर्णय पर गेट करता है — प्रति मूल्यांकन एक जज कॉल, उपरोक्त लागत सीमा और नीचे दो सीमाओं के अंतर्गत। ऐसे प्रत्येक मूल्यांकन का इनपुट और आउटपुट उस मॉडल के प्रदाता (Anthropic या OpenAI) को आपकी कुंजी पर भेजा जाता है, पहले no_pii द्वारा चिह्नित व्यक्तिगत डेटा और क्रेडेंशियल्स को बदल दिया जाता है। अनसेट (डिफ़ॉल्ट), answers_the_ask अनुरोध को शाब्दिक रूप से पढ़ता है और सलाह देता है, और कुछ भी नहीं भेजा जाता है (docs/llm-as-judge.md) |
IRIS_RELEVANCE_JUDGE_DAILY_BUDGET_USD | प्रासंगिकता जज प्रति UTC दिन, प्रति टेनेंट कितना खर्च कर सकता है (डिफ़ॉल्ट 1)। डेटाबेस में रखा जाता है, इसलिए एक पुनरारंभ इसे रीसेट नहीं करता है। एक कॉल केवल तभी की जाती है यदि उसका सबसे खराब मामला शेष में फिट बैठता है; उसके बाद, answers_the_ask अनुरोध को शाब्दिक रूप से पढ़ता है और judge.withheld daily_budget है। 0 हर कॉल रोकता है |
IRIS_RELEVANCE_JUDGE_MAX_CALLS_PER_REQUEST | प्रासंगिकता जज कॉल जो एक अनुरोध कर सकता है (डिफ़ॉल्ट 20): एक OTLP बैच या एक evaluate_runs पुनः-स्कोर अपने पहले 20 ट्रेस का न्याय करता है और बाकी को शाब्दिक रूप से पढ़ता है, judge.withheld: "request_cap" के साथ |
IRIS_RELEVANCE_JUDGE_REDACT | on (डिफ़ॉल्ट): हर स्पैन no_pii इनपुट और आउटपुट में (व्यक्तिगत डेटा और क्रेडेंशियल्स) चिह्नित करता है, उन्हें प्रासंगिकता जज को भेजने से पहले एक [REDACTED:<kind>#<n>] मार्कर द्वारा बदल दिया जाता है। off उन्हें जैसे हैं वैसे भेजता है |
IRIS_CITATION_ALLOW_FETCH | verify_citations में आउटबाउंड HTTP की अनुमति देने के लिए 1 पर सेट करें (डिफ़ॉल्ट रूप से बंद) |
IRIS_CITATION_DOMAINS | verify_citations के लिए अल्पविराम-पृथक होस्टनाम अनुमति सूची (प्रत्यय मिलान) |
IRIS_OTEL_ENDPOINT | इस कलेक्टर URL पर सर्वोत्तम-प्रयास OTLP/HTTP JSON ट्रेस निर्यात सक्षम करें |
IRIS_OTEL_SERVICE_NAME | OTel निर्यात के लिए service.name संसाधन विशेषता (डिफ़ॉल्ट iris-eval) |
IRIS_OTEL_HEADERS | OTel निर्यात के लिए अल्पविराम-पृथक k=v हेडर (जैसे authorization=Bearer abc) |
IRIS_OTEL_TIMEOUT_MS | प्रति-निर्यात टाइमआउट (डिफ़ॉल्ट 15000) |
RATE_LIMIT_SALT | वेबसाइट प्रतीक्षा सूची API केवल — आवश्यक जब iris-eval.com साइट तैनात होती है; सर्वर इसे कभी नहीं पढ़ता है |
सुरक्षा
HTTP ट्रांसपोर्ट का उपयोग करते समय, Iris शामिल करता है:
- टाइमिंग-सुरक्षित तुलना के साथ API कुंजी प्रमाणीकरण (API क्लाइंट के लिए Bearer;
?key=के माध्यम से डैशबोर्ड में ब्राउज़र साइन-इन) - CORS डिफ़ॉल्ट रूप से localhost तक सीमित
- प्रति क्लाइंट पता और मिनट दर सीमा: डैशबोर्ड API (
security.rateLimit.api) पर 600 अनुरोध और MCP एंडपॉइंट (security.rateLimit.mcp) पर 20, दोनोंconfig.jsonमें सेट; सीमा से अधिक एक MCP अनुरोध को एक JSON-RPC त्रुटि मिलती है जो कुंजी का नाम देती है - Helmet सुरक्षा हेडर
- सभी मार्गों पर Zod इनपुट सत्यापन
- कस्टम मूल्यांकन नियमों के लिए ReDoS-सुरक्षित regex
- हर ट्रांसपोर्ट पर एक 1MB अनुरोध आकार सीमा (
security.requestSizeLimit): HTTP413का उत्तर देता है, stdio एक JSON-RPC त्रुटि का उत्तर देता है और सत्र खुला रखता है
# Production deployment
iris-eval --transport http --port 3000 --api-key "$(openssl rand -hex 32)" --dashboard
कुंजी सेट होने पर, API क्लाइंट — MCP क्लाइंट, कैप्चर SDK, POST /api/v1/traces — Authorization: Bearer <key> भेजते हैं। डैशबोर्ड को ब्राउज़र में खोलने के लिए, कुंजी को किसी भी डैशबोर्ड URL में एक बार जोड़ें, http://localhost:6920/?key=<api key>: Iris इसे HttpOnly, SameSite=Lax सत्र कुकी के लिए विनिमय करता है और एड्रेस बार से कुंजी हटाकर उसी पृष्ठ पर पुनर्निर्देशित करता है। बिना सत्र के खोला गया पृष्ठ एक साइन-इन फ़ॉर्म दिखाता है जो वही विनिमय करता है। कुंजी कभी भी ब्राउज़र में संग्रहीत नहीं होती है, और सत्र केवल सर्वर प्रक्रिया में रहते हैं (एक समय में अधिकतम 256 सक्रिय; एक साइन-इन जो उन सभी को सक्रिय पाता है, उसे अस्वीकार कर दिया जाता है, किसी को बाहर नहीं निकाला जाता)।
उत्पादन
कई कुंजियाँ, और बिना अंतराल के रोटेशन। security.apiKeys में config.json किसी भी संख्या में अतिरिक्त कुंजियाँ रखता है, प्रत्येक में एक id और निम्न में से ठीक एक होता है: keyFile (एक फ़ाइल जिसकी ट्रिम की गई सामग्री कुंजी है) या keyHash (कुंजी का sha256 हेक्स, ताकि कॉन्फ़िग फ़ाइल में कोई रहस्य न हो — printf %s "$KEY" | openssl dgst -sha256), और एक वैकल्पिक expiresAt (ISO 8601) जिसके बाद यह उसी क्षण मिलान करना बंद कर देता है। रोटेट करने के लिए: नई कुंजी जोड़ें, अपने क्लाइंट को स्थानांतरित करें, पुरानी कुंजी हटाएँ। config.json और कुंजी फ़ाइलों में कुंजियाँ बिना पुनरारंभ के प्रभावी होती हैं (0.20.0): प्रत्येक अनुरोध पर सर्वर जाँचता है कि क्या config.json या उसके द्वारा नामित कोई कुंजी फ़ाइल बदली गई है, और यदि हाँ, तो उत्तर देने से पहले कुंजियों को फिर से पढ़ता है। security.apiKeys से कुंजी हटाना, या उसकी कुंजी फ़ाइल को हटाना, अगले अनुरोध पर इसे रद्द कर देता है: वह अनुरोध अस्वीकार कर दिया जाता है, और उसके साथ खोला गया हर ब्राउज़र सत्र साइन आउट हो जाता है। एक config.json जिसे पढ़ा नहीं जा सकता (उदाहरण के लिए, आधा-लिखा हुआ) विफल-बंद होता है, और जब तक इसे ठीक नहीं किया जाता, केवल IRIS_API_KEY या --api-key से एक कुंजी स्वीकार की जाती है। IRIS_API_KEY या --api-key में कुंजी, और प्रमाणीकरण चालू है या नहीं, यह अभी भी केवल पुनरारंभ पर बदलता है। हर कुंजी तब तक प्रमाणित करती है जब तक उसे हटाया या समाप्त नहीं किया जाता, Bearer पथ पर और ब्राउज़र साइन-इन पर समान रूप से; स्टार्टअप लॉग आईडी नाम देता है। security.rateLimit.mcpKeyBy: "apiKey" MCP एंडपॉइंट के प्रति-मिनट बजट को प्रति क्लाइंट पते के बजाय प्रति कुंजी गिनता है, इसलिए एक पते के पीछे कई एजेंटों को प्रत्येक अपना मिनट मिलता है।
Iris शुरू करने से इनकार करता है जब HTTP ट्रांसपोर्ट या डैशबोर्ड लूपबैक से परे बंधा होता है — 0.0.0.0, एक LAN पता, एक कंटेनर — बिना API कुंजी के, और इसे एक वाक्य में कहता है जो IRIS_API_KEY नाम देता है। इसमें छवि का एक नंगा docker run शामिल है, जो कंटेनर के अंदर 0.0.0.0 बाँधता है क्योंकि प्रकाशित पोर्ट के माध्यम से लूपबैक अप्राप्य है। बिना कुंजी के लूपबैक काम करता रहता है (HTTP ट्रांसपोर्ट पर चेतावनी के साथ): मशीन सीमा वहाँ एक्सपोज़र नियंत्रण है।
# The image: pass a key
docker run -p 3000:3000 -p 6920:6920 -v iris-data:/data \
-e IRIS_API_KEY="$(openssl rand -hex 32)" ghcr.io/iris-eval/mcp-server
# Compose: the file requires the variable and refuses before the container starts
IRIS_API_KEY="$(openssl rand -hex 32)" docker compose up
# A network you have already fenced some other way: run open, on purpose
IRIS_ALLOW_UNAUTHENTICATED=1 iris-eval --transport http --dashboard
डिज़ाइन द्वारा खुला, कुंजी वाले सर्वर पर: ट्रांसपोर्ट पर GET /health और डैशबोर्ड पर GET /api/v1/health बिना कुंजी के और हर दर सीमा के बाहर उत्तर देते हैं, एक रूप में: स्थिति, संस्करण, अपटाइम, SQLite ड्राइवर, स्टोरेज के लिए checks, तैनात-नियम फ़ाइल और माइग्रेशन (ज्ञात के विरुद्ध लागू), खोज सूचकांक की स्थिति (search: तैयार, या एक निर्माण ट्रेस के हिस्से के रूप में कितनी दूर पहुँचा है), और क्या एक जज कुंजी मौजूद है — कभी कुंजी नहीं, कभी ट्रेस नहीं, कभी उनकी गिनती नहीं। status केवल तब ok होता है जब हर जाँच होती है; अन्यथा यह HTTP 503 के साथ degraded होता है, जिसे Docker छवि का अपना HEALTHCHECK पढ़ता है। बाकी सब कुछ Authorization: Bearer <key> या ब्राउज़र सत्र की आवश्यकता होती है। प्रतिधारण हर सर्वर पर चलता है: retention.days (डिफ़ॉल्ट 30) से पुराने ट्रेस और मूल्यांकन स्टार्टअप पर हटाए जाते हैं, एक बार सर्वर उत्तर दे रहा हो, और हर retention.sweepIntervalHours, छोटे चरणों में जो कभी भी किसी अनुरोध को लंबा इंतज़ार नहीं कराते; --self-test इस इंस्टॉल की नीति प्रिंट करता है, और iris://capabilities / GET /api/v1/capabilities इसे retention के रूप में ले जाते हैं।
एक वेबहुक एक क्षण पर फायर करता है (0.16.0): notify.webhook में config.json (या IRIS_WEBHOOK_URL और IRIS_WEBHOOK_SECRET) एक रिसीवर नाम देता है, और Iris एक हस्ताक्षरित संदेश पोस्ट करता है जब कोई निर्णय विफल होता है, एक महत्वपूर्ण जाँच वीटो करती है, एक लागत बाहरी होती है, एक नियम की विफलता दर बदलती है, या एक मामला पहली बार दोनों तरह से उत्तर दिया जाता है — आईडी, निर्णय, नियम और संख्याएँ, कभी एजेंट का पाठ नहीं। Standard Webhooks तरीके से और GitHub तरीके से एक साथ हस्ताक्षरित, बैकऑफ़ के साथ पुनः प्रयास किया गया, प्रति एजेंट और नियम ठंडा किया गया, मूल्यांकन के रास्ते में कभी नहीं; Slack और Discord बॉडी अंतर्निहित। docs/webhooks.md।
आपका डेटा डिस्क पर
Iris जो कुछ भी संग्रहीत करता है वह आपके Iris होम के अंतर्गत रहता है (~/.iris, या IRIS_HOME)। iris.db हर ट्रेस का input और output शब्दशः रखता है — जिसमें कोई भी पाठ शामिल है जिसे no_pii आगे चलकर फ़्लैग करता है; जाँच तब तक संपादित नहीं करती जब तक आप इसे नहीं कहते: storage.redact: "critical_spans" में config.json प्रत्येक मूल्यांकन के आउटपुट को उन स्पैन के साथ संग्रहीत करता है जिन्हें एक महत्वपूर्ण जाँचकर्ता ने [REDACTED:<pattern>] द्वारा प्रतिस्थापित किया है (डिफ़ॉल्ट रूप से बंद; साक्ष्य ऑफ़सेट अभी भी उस पाठ को अनुक्रमित करते हैं जो कॉलर ने देखा)। storage.synchronous सेट करता है कि एक लेखन डिस्क तक कब पहुँचता है: normal (डिफ़ॉल्ट) प्रत्येक चेकपॉइंट पर राइट-आगे लॉग को सिंक करता है, इसलिए Iris का क्रैश कुछ भी नहीं खोता और फ़ाइल भ्रष्ट नहीं हो सकती, लेकिन एक बिजली कटौती या ऑपरेटिंग-सिस्टम क्रैश अंतिम सिंक के बाद के लेखन को पूर्ववत कर सकता है; full हर कमिट को सिंक करता है और उन्हें दोनों के माध्यम से रखता है, प्रति लेखन लगभग 1.5 ms अधिक पर। स्टार्टअप पर, और उसके बाद हर retention.sweepIntervalHours (डिफ़ॉल्ट 24, 0 टाइमर अक्षम करता है), retention.days (डिफ़ॉल्ट 30, 0 अक्षम करता है, config.json में सेट) से पुराने ट्रेस और मूल्यांकन हटाए जाते हैं और राइट-आगे लॉग चेकपॉइंट किया जाता है। एक ट्रेस हटाना — delete_trace द्वारा या स्वीप द्वारा — उससे जुड़े हर मूल्यांकन के पाठ को मिटा देता है (आउटपुट, अपेक्षित पाठ, और नियम संदेश) और erased_at स्टैम्प करता है; निर्णय, स्कोर और साक्ष्य ऑफ़सेट रहते हैं। प्रत्येक हटाना लौटने से पहले राइट-आगे लॉग को चेकपॉइंट करता है, इसलिए हटाया गया पाठ iris.db या iris.db-wal में पठनीय नहीं छोड़ा जाता (यदि कोई खोज उस समय फ़ाइल पढ़ रही है, या कोई अन्य प्रक्रिया इसे पढ़ या लिख रही है, तो हटाना बिना प्रतीक्षा के लौटता है और पाठ फ़ाइल से बाहर चला जाता है जैसे ही यह समाप्त होता है)। अब सब कुछ हटाने के लिए, सर्वर रोकें और --purge चलाएँ: यह हर संग्रहीत ट्रेस, स्पैन और मूल्यांकन हटाता है, डेटाबेस को संकुचित करता है और राइट-आगे लॉग को छोटा करता है ताकि पाठ डिस्क से गायब हो, और आपके तैनात नियम, ऑडिट लॉग और प्राथमिकताएँ रखता है। एक रिलीज़ मौजूदा iris.db पर माइग्रेशन लागू करने से पहले, यह फ़ाइल को उसके बगल में कॉपी करता है (iris.db.<from>-to-<to>.<time>.bak, केवल-स्वामी, नवीनतम तीन रखे जाते हैं; डाउनग्रेडिंग): कॉपी ट्रेस को वैसे ही रखती है जैसे वे थे, इसलिए प्रतिधारण स्वीप retention.days से पुराने को हटाता है और --purge उन सभी को हटाता है। सर्वर कॉपी और माइग्रेशन अपने क्लाइंट को उत्तर देने के बाद, अपने स्वयं के थ्रेड पर करता है: टूल कॉल, संसाधन रीड और HTTP अनुरोध जो इस बीच आते हैं, उनके लिए प्रतीक्षा करते हैं, प्रत्येक अधिकतम 30 सेकंड, और फिर एक वाक्य के साथ अस्वीकार कर दिए जाते हैं जो कहता है कि सर्वर क्या कर रहा है (IRIS_STORAGE_ERROR, पुनः प्रयास योग्य; HTTP 503 के साथ Retry-After)। स्वास्थ्य पूरे समय उत्तर देता है और कहता है कि अपग्रेड क्या कर रहा है। 0.19.0 से 100,000 ट्रेस पर जो प्रत्येक एक एजेंट लूप हैं, कॉपी और माइग्रेशन में लगभग 6 सेकंड लगे। iris-eval ingest, --purge और --self-test अभी भी कुछ और करने से पहले अपग्रेड करते हैं।
Iris अपने डेटा को आराम पर एन्क्रिप्ट नहीं करता है। iris.db और इसकी राइट-आगे लॉग फ़ाइलें केवल-स्वामी (मोड 600) बनाई जाती हैं, और Iris होम निर्देशिका मोड 700 बनाई जाती है (Windows पर, फ़ाइल ACL इसके बजाय शासन करते हैं)। डेटाबेस कोई LLM प्रदाता कुंजी संग्रहीत नहीं करता: IRIS_ANTHROPIC_API_KEY और IRIS_OPENAI_API_KEY पर्यावरण से पढ़े जाते हैं और कभी डिस्क पर नहीं लिखे जाते। यह ट्रेस इनपुट और आउटपुट शब्दशः संग्रहीत करता है, इसलिए Iris होम को एक एन्क्रिप्टेड डिस्क या वॉल्यूम पर रखें (FileVault, BitLocker, LUKS, या Docker छवि के /data माउंट के लिए एक एन्क्रिप्टेड क्लाउड वॉल्यूम)।
एक निर्यात — डैशबोर्ड के ट्रेस और मूल्यांकन पृष्ठों पर निर्यात बटन, GET /api/v1/traces/export और /api/v1/evaluations/export, या iris-eval export — इस संग्रहीत पाठ को वैसे ही ले जाता है जैसे यह है, वैसे ही जैसे डैशबोर्ड इसे दिखाता है: ट्रेस इनपुट और आउटपुट शब्दशः, मूल्यांकन आउटपुट के साथ storage.redact लागू। एक निर्यातित फ़ाइल को उस डेटाबेस की तरह मानें जिससे वह आई है।
समस्या निवारण
पहला कदम: स्व-परीक्षण चलाएँ
npx @iris-eval/mcp-server --self-test
यह एक पृथक अस्थायी होम में स्टोरेज, नियतात्मक मूल्यांकन और डैशबोर्ड की जाँच करता है और प्रति-चरण निर्णय प्रिंट करता है — विफलता आउटपुट टूटे हुए चरण का नाम देता है। निकास कोड 0 का मतलब है कि इंस्टॉल स्वस्थ है।
Iris शुरू नहीं होगा / ERR_MODULE_NOT_FOUND
आपके पास एक कैश्ड पुराना संस्करण हो सकता है। npx कैश साफ़ करें और पुनः प्रयास करें:
npx --yes @iris-eval/mcp-server@latest
या कैश समस्याओं से पूरी तरह बचने के लिए वैश्विक रूप से स्थापित करें:
npm install -g @iris-eval/mcp-server@latest
npm install --ignore-scripts ने SQLite बाइंडिंग तोड़ दी
Iris ट्रेस को better-sqlite3 के साथ संग्रहीत करता है, एक मूल मॉड्यूल जो एक इंस्टॉल स्क्रिप्ट में अपनी बाइंडिंग लाता या संकलित करता है। यदि वह स्क्रिप्ट छोड़ दी गई थी — कमांड लाइन पर --ignore-scripts, एक .npmrc में ignore-scripts=true (कॉर्पोरेट मशीनों पर सामान्य), या एक रजिस्ट्री मिरर जो पोस्टइंस्टॉल छीन लेता है — स्टार्टअप एक लंबे "बाइंडिंग फ़ाइल का पता नहीं लगा सका" डंप के साथ विफल होता है जो एक दर्जन पथ सूचीबद्ध करता है जो उसने आज़माए। उस एक मॉड्यूल को फिर से बनाएँ:
npm rebuild better-sqlite3
# for a global install:
npm rebuild -g better-sqlite3
Claude Code में टूल दिखाई नहीं दे रहे
MCP टूल केवल सत्र की शुरुआत में लोड होते हैं। iris-eval जोड़ने के बाद, /clear के साथ सत्र पुनरारंभ करें या टर्मिनल फिर से लॉन्च करें।
संस्करण जाँच
npx @iris-eval/mcp-server --version
पहली स्टार्टअप लॉग लाइन भी इसे ले जाती है (Starting Iris MCP server vX.Y.Z), और --self-test इसे अपने सारांश में प्रिंट करता है। वैश्विक इंस्टॉल के लिए, npm ls -g @iris-eval/mcp-server स्थापित संस्करण दिखाता है।
अद्यतन करना
एक मशीन पर हर MCP क्लाइंट एक डेटाबेस साझा करता है, ~/.iris/iris.db, और install प्रत्येक क्लाइंट को उस रिलीज़ पर पिन करता है जिसने उसका कॉन्फ़िग लिखा था। जब एक रिलीज़ डेटाबेस की स्कीमा बदलती है, उस रिलीज़ की पहली प्रक्रिया जो फ़ाइल खोलती है, उसे अपग्रेड करती है, और उसके बाद एक पुरानी रिलीज़ पर पिन किया गया क्लाइंट शुरू करने से इनकार करता है। इसलिए हर क्लाइंट को एक चरण में स्थानांतरित करें, अपग्रेड से पहले या ठीक बाद:
npx -y @iris-eval/mcp-server@latest install --upgrade
यह इस मशीन पर हर क्लाइंट कॉन्फ़िग ढूंढता है जो Iris चलाता है, प्रत्येक पिन को उस रिलीज़ में स्थानांतरित करता है (प्रविष्टि में आपके द्वारा जोड़ी गई किसी भी चीज़ को रखते हुए, जैसे --dashboard या एक env ब्लॉक), एक नई रिलीज़ पर पिन और एक प्रविष्टि जो npm पैकेज के अलावा कुछ और चलाती है, को अकेला छोड़ देता है, और सूचीबद्ध करता है कि उसने क्या किया। उन क्लाइंटों को पुनरारंभ करें जिन्हें यह नाम देता है। install --list दिखाता है कि प्रत्येक क्लाइंट कौन सा Iris चलाता है।
दो इंस्टॉल उन फ़ाइलों के बाहर रहते हैं: Claude Desktop एक्सटेंशन (iris-eval.mcpb) तब स्थानांतरित होता है जब आप एक नया बंडल खोलते हैं, और Claude Code प्लगइन्स claude plugin marketplace update iris-eval और फिर claude plugin update iris-eval@iris-eval के साथ (और कैप्चर प्लगइन के लिए claude plugin update iris-eval-capture@iris-eval)।
0.19.x से 0.20.0 में अपग्रेड करना। 0.20.0 खोज सूचकांक और डेटाबेस में अन्य जोड़ जोड़ता है (माइग्रेशन 015 और बाद में)। एक बार किसी 0.20.0 प्रक्रिया ने ~/.iris/iris.db खोल लिया है (Claude Desktop एक्सटेंशन, npx iris-eval, या बिना संस्करण के npx @iris-eval/mcp-server), 0.19.x पर पिन किया गया क्लाइंट This database was migrated by a newer Iris (…) — migration(s) 015-trace-search, … are unknown to v0.19.0. Upgrade Iris, … के साथ रुक जाता है। वह संदेश 0.19.x से आता है और बदल नहीं सकता; समाधान उपरोक्त कमांड है। अपग्रेड से पहले, 0.20.0 फ़ाइल को उसके बगल में कॉपी करता है, इसलिए वापस जाना भी संभव है (नीचे)।
एक शुरुआत जो डेटाबेस को अपग्रेड करती है, stderr पर प्रिंट करती है कि उसने क्या किया: उसने जो कॉपी ली, कौन सी पुरानी रिलीज़ अब फ़ाइल नहीं खोल सकतीं, और इस मशीन पर कोई भी क्लाइंट उनमें से एक पर पिन किया हुआ, कमांड के साथ। --self-test डेटाबेस को बदले बिना पढ़ता है और कुछ भी शुरू करने से पहले वही कहता है।
वैश्विक इंस्टॉल के लिए, npm update -g @iris-eval/mcp-server, फिर iris-eval install --upgrade।
डाउनग्रेडिंग
एक रिलीज़ जिसने डेटाबेस को अपग्रेड किया, वह पहले उसकी प्रतिलिपि बनाता है, उसके बगल में: iris.db.<from>-to-<to>.<time>.bak आपके Iris होम में (<from> वह रिलीज़ है जिसने अंतिम बार फ़ाइल की स्कीमा बदली, <to> वह जिसने इसे अपग्रेड किया; स्टार्टअप लाइन ने सटीक पथ मुद्रित किया)। वापस जाने के लिए:
- हर MCP क्लाइंट और कोई भी अन्य Iris प्रक्रिया रोकें जो डेटाबेस का उपयोग करती है।
- अपग्रेड की गई फ़ाइल रखें, यदि आप वापस आते हैं:
iris.dbका नाम बदलकरiris.db.upgradedकरें, औरiris.db-walऔरiris.db-shmहटा दें यदि वे वहाँ हैं। - बैकअप को
iris.dbपर कॉपी करें:cp ~/.iris/iris.db.0.19.0-to-0.20.0.<time>.bak ~/.iris/iris.db। - हर क्लाइंट को पुराने रिलीज़ पर वापस पिन करें: प्रत्येक के लिए
npx -y @iris-eval/mcp-server@0.19.0 install <client>(install --upgradeकभी भी किसी क्लाइंट को वापस नहीं ले जाता)।
अपग्रेड के बाद संग्रहीत ट्रेस iris.db.upgraded में हैं, बैकअप में नहीं। यदि कोई प्रतिलिपि नहीं ली गई थी (स्टार्टअप लाइन कारण बताती है, उदाहरण के लिए भरी हुई डिस्क), पुराना रिलीज़ अपग्रेड की गई फ़ाइल नहीं खोल सकता, और आगे का रास्ता install --upgrade है।
स्टोरेज ड्राइवर
ऐसे प्लेटफ़ॉर्म पर जहाँ कोई पूर्व-निर्मित better-sqlite3 नहीं है, इंस्टॉल फिर भी सफल होता है। better-sqlite3 एक वैकल्पिक निर्भरता है: जब npm आपके Node और प्लेटफ़ॉर्म के लिए पूर्व-निर्मित बाइनरी डाउनलोड नहीं कर सकता और न ही एक संकलित कर सकता है (संकलन के लिए Python और C++ टूलचेन चाहिए — Windows पर Visual Studio के C++ बिल्ड टूल), npm बिल्ड त्रुटि मुद्रित करता है, मॉड्यूल छोड़ देता है, और इंस्टॉल समाप्त करता है। Iris तब Node के अंतर्निहित SQLite पर चलता है, और ऐसा कहता है: स्टार्टअप stderr पर एक पंक्ति मुद्रित करता है जो कारण बताती है, और --self-test driver node: better-sqlite3 is not installed … दिखाता है। मूल ड्राइवर वापस पाने के लिए, इसे वहाँ इंस्टॉल करें जहाँ प्रीबिल्ड या टूलचेन मौजूद है (प्रोजेक्ट में npm install better-sqlite3; वैश्विक इंस्टॉल के लिए, Iris को फिर से npm install -g @iris-eval/mcp-server के साथ इंस्टॉल करें जब टूलचेन उपलब्ध हो)। CI पैक किए गए सर्वर को हर बदलाव पर मूल बिल्ड को विफल करने के लिए मजबूर करके इंस्टॉल करता है, और आवश्यकता है कि इंस्टॉल समाप्त हो और सेल्फ-टेस्ट अंतर्निहित पर एक ट्रेस संग्रहीत और पढ़े।
Iris सब कुछ एक SQLite फ़ाइल में रखता है, जिसे better-sqlite3 द्वारा खोला जाता है — एक मूल ऐडऑन जो आपके Node और प्लेटफ़ॉर्म के लिए डाउनलोड या संकलित किया जाता है। जब वह मॉड्यूल लोड नहीं हो सकता, Iris Node के अंतर्निहित SQLite पर वापस आ जाता है (node:sqlite, Node 22.13 या बाद का) stderr पर एक चेतावनी के साथ, इसलिए एक लापता प्रीबिल्ड धीमी शुरुआत है, मृत नहीं। यह लोड करने से पहले, Node 24.19 या बाद के हेडर के खिलाफ आपकी मशीन पर संकलित better-sqlite3 के लिए भी ऐसा करता है: अब तक हर 24.x रिलीज़ पर ऐसा बाइनरी पहली बार स्टेटमेंट मुक्त करते समय पूरी प्रक्रिया को समाप्त कर देता है (Assertion failed: (env) != nullptr, nodejs/node#65446), और npm rebuild better-sqlite3 इसे सुरक्षित प्रीबिल्ड बाइनरी से बदल देता है। IRIS_SQLITE_DRIVER=node जानबूझकर अंतर्निहित चुनता है, native फॉलबैक को मना करता है। अंतर्निहित एक्सटेंशन लोडिंग बंद और trusted_schema बंद के साथ खोला जाता है; Node लोड होने पर stderr पर अपनी स्वयं की ExperimentalWarning: SQLite is an experimental feature पंक्ति मुद्रित करता है, और Iris इसे चुप नहीं करता। --self-test और GET /health उपयोग में ड्राइवर का नाम देते हैं; प्रूफ पेज पर हर संख्या मूल ड्राइवर पर मापी गई थी, और परीक्षण सूट CI में दोनों पर चलता है।
Node.js संस्करण
Iris को Node.js 22.13 या बाद का आवश्यकता है। Node 20 2026-04-30 को जीवन के अंत तक पहुँच गया और समर्थित नहीं है; Node 18 अप्रैल 2025 में गया।
न्यूनतम 22.13 है, 22.0 नहीं, क्योंकि 22.13.0 पहला रिलीज़ है जो node:sqlite भेजता है। यह इसे पहला संस्करण बनाता है जिस पर हर समर्थित Iris इंस्टॉल में दूसरा स्टोरेज ड्राइवर है: जब मूल better-sqlite3 ऐडऑन लोड नहीं होगा, Iris शुरू करने में विफल होने के बजाय Node के अंतर्निहित SQLite पर वापस आ जाता है। 22.13 से नीचे — और Node 20 पर, इसके पूरे जीवन के लिए — केवल एक ड्राइवर था, और एक लापता प्रीबिल्ड एक मृत शुरुआत थी।
node --version # Must be v22.13.0 or newer
Windows: cmd /c आवश्यक नहीं
Claude Code का /doctor npx को cmd /c के साथ लपेटने का सुझाव दे सकता है। यह आवश्यक नहीं है और पथ पार्सिंग समस्याएँ पैदा करता है। npx सीधे उपयोग करें:
# Correct
claude mcp add --transport stdio iris-eval -- npx -y @iris-eval/mcp-server
# Wrong (causes /c to be parsed as a path)
claude mcp add --transport stdio iris-eval -- cmd /c "npx -y @iris-eval/mcp-server"
यदि Iris आपके लिए उपयोगी है, रिपो पर स्टार करने पर विचार करें — यह दूसरों को इसे खोजने में मदद करता है।
MIT लाइसेंस प्राप्त।