---
read_when:
    - आप एक OpenClaw Plugin बना रहे हैं
    - आपको Plugin कॉन्फ़िगरेशन स्कीमा जारी करना है या Plugin सत्यापन त्रुटियों को डीबग करना है
summary: Plugin मैनिफ़ेस्ट + JSON स्कीमा आवश्यकताएँ (सख्त कॉन्फ़िग सत्यापन)
title: Plugin मैनिफ़ेस्ट
x-i18n:
    generated_at: "2026-07-27T18:14:06Z"
    model: gpt-5.6
    postprocess_version: locale-links-v1
    prompt_version: 32
    provider: openai
    source_hash: 244e5c8265ff79b0ff6e8f4b60c9635cccc3ba66093cecab458676beb9578264
    source_path: plugins/manifest.md
    workflow: 16
---

यह पृष्ठ **मूल OpenClaw Plugin मैनिफ़ेस्ट**, `openclaw.plugin.json`, को कवर करता है। संगत बंडल लेआउट (Codex, Claude, Cursor) के लिए, [Plugin बंडल](/hi/plugins/bundles) देखें।

संगत बंडल प्रारूप इसके बजाय अपनी स्वयं की मैनिफ़ेस्ट फ़ाइलों का उपयोग करते हैं:

- Codex बंडल: `.codex-plugin/plugin.json`
- Claude बंडल: `.claude-plugin/plugin.json`, या बिना मैनिफ़ेस्ट वाला डिफ़ॉल्ट Claude कंपोनेंट लेआउट
- Cursor बंडल: `.cursor-plugin/plugin.json`

OpenClaw उन लेआउट का स्वतः पता लगाता है, लेकिन नीचे दिए गए `openclaw.plugin.json` स्कीमा के अनुसार उन्हें सत्यापित नहीं करता। संगत बंडल के लिए, लेआउट के OpenClaw की रनटाइम अपेक्षाओं से मेल खाने पर OpenClaw बंडल मेटाडेटा, घोषित स्किल रूट, Claude कमांड रूट, Claude `settings.json` डिफ़ॉल्ट, Claude LSP डिफ़ॉल्ट और समर्थित हुक पैक पढ़ता है।

प्रत्येक मूल OpenClaw Plugin के **Plugin रूट** में `openclaw.plugin.json` **होना अनिवार्य है**। OpenClaw इसका उपयोग **Plugin कोड निष्पादित किए बिना** कॉन्फ़िगरेशन सत्यापित करने के लिए करता है। अनुपलब्ध या अमान्य मैनिफ़ेस्ट कॉन्फ़िगरेशन सत्यापन को रोक देता है और इसे Plugin त्रुटि माना जाता है।

संपूर्ण Plugin सिस्टम मार्गदर्शिका के लिए [Plugin](/hi/tools/plugin) और मूल क्षमता मॉडल तथा मौजूदा बाहरी-संगतता मार्गदर्शन के लिए [क्षमता मॉडल](/hi/plugins/architecture#public-capability-model) देखें।

## यह फ़ाइल क्या करती है

`openclaw.plugin.json` वह मेटाडेटा है जिसे OpenClaw **आपका Plugin कोड लोड करने से पहले** पढ़ता है। इसमें मौजूद प्रत्येक चीज़ इतनी किफ़ायती होनी चाहिए कि Plugin रनटाइम बूट किए बिना उसका निरीक्षण किया जा सके।

**इसका उपयोग इनके लिए करें:**

- Plugin पहचान, कॉन्फ़िगरेशन सत्यापन और कॉन्फ़िगरेशन UI संकेत
- प्रमाणीकरण, ऑनबोर्डिंग और सेटअप मेटाडेटा (उपनाम, स्वतः-सक्षम करना, प्रदाता एनवायरनमेंट वेरिएबल, प्रमाणीकरण विकल्प)
- कंट्रोल-प्लेन सतहों के लिए सक्रियण संकेत
- संक्षिप्त मॉडल-फ़ैमिली स्वामित्व
- स्थिर क्षमता-स्वामित्व स्नैपशॉट (`contracts`)
- डैशबोर्ड विजेट डेटा बाइंडिंग और क्रिया शब्द
- स्थिर MCP सर्वर, जो Plugin सक्षम रहने के दौरान मौजूद होने चाहिए
- QA रनर मेटाडेटा, जिसका साझा `openclaw qa` होस्ट निरीक्षण कर सकता है
- चैनल-विशिष्ट कॉन्फ़िगरेशन मेटाडेटा, जिसे कैटलॉग और सत्यापन सतहों में मर्ज किया जाता है

**इसका उपयोग इनके लिए न करें:** मूल रनटाइम हुक पंजीकृत करना, Plugin कोड एंट्रीपॉइंट घोषित करना या npm इंस्टॉल मेटाडेटा। ये आपके Plugin कोड और `package.json` में होने चाहिए।

## न्यूनतम उदाहरण

```json
{
  "id": "voice-call",
  "configSchema": {
    "type": "object",
    "additionalProperties": false,
    "properties": {}
  }
}
```

## विस्तृत उदाहरण

```json
{
  "id": "openrouter",
  "name": "OpenRouter",
  "description": "OpenRouter प्रदाता Plugin",
  "version": "1.0.0",
  "providers": ["openrouter"],
  "modelSupport": {
    "modelPrefixes": ["router-"]
  },
  "modelIdNormalization": {
    "providers": {
      "openrouter": {
        "prefixWhenBare": "openrouter"
      }
    }
  },
  "providerEndpoints": [
    {
      "endpointClass": "openrouter",
      "hostSuffixes": ["openrouter.ai"]
    }
  ],
  "providerRequest": {
    "providers": {
      "openrouter": {
        "family": "openrouter"
      }
    }
  },
  "cliBackends": ["openrouter-cli"],
  "syntheticAuthRefs": ["openrouter-cli"],
  "setup": {
    "providers": [
      {
        "id": "openrouter",
        "envVars": ["OPENROUTER_API_KEY"]
      }
    ]
  },
  "providerAuthAliases": {
    "openrouter-coding": "openrouter"
  },
  "providerAuthChoices": [
    {
      "provider": "openrouter",
      "method": "api-key",
      "choiceId": "openrouter-api-key",
      "choiceLabel": "OpenRouter API कुंजी",
      "groupId": "openrouter",
      "groupLabel": "OpenRouter",
      "optionKey": "openrouterApiKey",
      "cliFlag": "--openrouter-api-key",
      "cliOption": "--openrouter-api-key <key>",
      "cliDescription": "OpenRouter API कुंजी",
      "onboardingScopes": ["text-inference"]
    }
  ],
  "uiHints": {
    "apiKey": {
      "label": "API कुंजी",
      "placeholder": "sk-or-v1-...",
      "sensitive": true
    }
  },
  "configSchema": {
    "type": "object",
    "additionalProperties": false,
    "properties": {
      "apiKey": {
        "type": "string"
      }
    }
  }
}
```

## शीर्ष-स्तरीय फ़ील्ड संदर्भ

| फ़ील्ड                                | आवश्यक | प्रकार                         | इसका अर्थ                                                                                                                                                                                                                                                                                  |
| ------------------------------------ | -------- | ---------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `id`                                 | हाँ      | `string`                     | प्रामाणिक Plugin आईडी। यही आईडी `plugins.entries.<id>` में उपयोग की जाती है।                                                                                                                                                                                                                            |
| `configSchema`                       | हाँ      | `object`                     | इस Plugin के कॉन्फ़िगरेशन के लिए इनलाइन JSON Schema।                                                                                                                                                                                                                                                   |
| `requiresPlugins`                    | नहीं       | `string[]`                   | वे Plugin आईडी जिन्हें इस Plugin के प्रभावी होने के लिए भी इंस्टॉल करना आवश्यक है। खोज प्रक्रिया Plugin को लोड करने योग्य रखती है, लेकिन कोई आवश्यक Plugin अनुपस्थित होने पर चेतावनी देती है।                                                                                                                                   |
| `enabledByDefault`                   | नहीं       | `true`                       | बंडल किए गए Plugin को डिफ़ॉल्ट रूप से सक्षम के रूप में चिह्नित करता है। Plugin को डिफ़ॉल्ट रूप से अक्षम रखने के लिए इसे छोड़ दें या कोई भी गैर-`true` मान सेट करें।                                                                                                                                                                   |
| `enabledByDefaultOnPlatforms`        | नहीं       | `string[]`                   | बंडल किए गए Plugin को केवल सूचीबद्ध Node.js प्लेटफ़ॉर्म पर डिफ़ॉल्ट रूप से सक्षम के रूप में चिह्नित करता है, उदाहरण के लिए `["darwin"]`। स्पष्ट कॉन्फ़िगरेशन फिर भी प्राथमिकता पाता है।                                                                                                                                                       |
| `legacyPluginIds`                    | नहीं       | `string[]`                   | पुराने आईडी जो इस प्रामाणिक Plugin आईडी में सामान्यीकृत होते हैं।                                                                                                                                                                                                                                         |
| `autoEnableWhenConfiguredProviders`  | नहीं       | `string[]`                   | वे प्रदाता आईडी जिनका उल्लेख प्रमाणीकरण, कॉन्फ़िगरेशन या मॉडल संदर्भों में होने पर यह Plugin स्वतः सक्षम होना चाहिए।                                                                                                                                                                                                |
| `kind`                               | नहीं       | `PluginKind \| PluginKind[]` | `plugins.slots.*` द्वारा उपयोग किए जाने वाले एक या अधिक अनन्य Plugin प्रकार (`"memory"`, `"context-engine"`) घोषित करता है। दोनों स्लॉट का स्वामी Plugin दोनों प्रकारों को एक ही ऐरे में घोषित करता है।                                                                                                                        |
| `channels`                           | नहीं       | `string[]`                   | इस Plugin के स्वामित्व वाली चैनल आईडी। खोज और कॉन्फ़िगरेशन सत्यापन के लिए उपयोग की जाती हैं।                                                                                                                                                                                                                    |
| `providers`                          | नहीं       | `string[]`                   | इस Plugin के स्वामित्व वाली प्रदाता आईडी।                                                                                                                                                                                                                                                             |
| `providerCatalogEntry`               | नहीं       | `string`                     | Plugin रूट के सापेक्ष हल्के प्रदाता-कैटलॉग मॉड्यूल का पथ, मैनिफ़ेस्ट-स्कोप वाले प्रदाता कैटलॉग मेटाडेटा के लिए, जिसे पूर्ण Plugin रनटाइम सक्रिय किए बिना लोड किया जा सकता है।                                                                                                            |
| `modelSupport`                       | नहीं       | `object`                     | रनटाइम से पहले Plugin को स्वतः लोड करने के लिए उपयोग किया जाने वाला मैनिफ़ेस्ट-स्वामित्व वाला संक्षिप्त मॉडल-परिवार मेटाडेटा।                                                                                                                                                                                                    |
| `modelCatalog`                       | नहीं       | `object`                     | इस Plugin के स्वामित्व वाले प्रदाताओं के लिए घोषणात्मक मॉडल कैटलॉग मेटाडेटा। यह Plugin रनटाइम लोड किए बिना भविष्य की केवल-पठन सूची, ऑनबोर्डिंग, मॉडल चयनकर्ताओं, उपनामों और दमन के लिए नियंत्रण-प्लेन अनुबंध है।                                                                    |
| `modelPricing`                       | नहीं       | `object`                     | प्रदाता-स्वामित्व वाली बाहरी मूल्य-खोज नीति। इसका उपयोग स्थानीय/स्व-होस्टेड प्रदाताओं को दूरस्थ मूल्य कैटलॉग से बाहर रखने या कोर में प्रदाता आईडी हार्डकोड किए बिना प्रदाता संदर्भों को OpenRouter/LiteLLM कैटलॉग आईडी से मैप करने के लिए करें।                                                                        |
| `modelIdNormalization`               | नहीं       | `object`                     | प्रदाता-स्वामित्व वाली मॉडल-आईडी उपनाम/उपसर्ग सफ़ाई, जिसे प्रदाता रनटाइम लोड होने से पहले चलना आवश्यक है।                                                                                                                                                                                                      |
| `providerEndpoints`                  | नहीं       | `object[]`                   | प्रदाता रूट के लिए मैनिफ़ेस्ट-स्वामित्व वाला एंडपॉइंट होस्ट/baseUrl मेटाडेटा, जिसे कोर को प्रदाता रनटाइम लोड होने से पहले वर्गीकृत करना आवश्यक है।                                                                                                                                                                       |
| `providerRequest`                    | नहीं       | `object`                     | प्रदाता रनटाइम लोड होने से पहले सामान्य अनुरोध नीति द्वारा उपयोग किया जाने वाला हल्का प्रदाता-परिवार और अनुरोध-संगतता मेटाडेटा।                                                                                                                                                                         |
| `secretProviderIntegrations`         | नहीं       | `Record<string, object>`     | घोषणात्मक SecretRef exec प्रदाता प्रीसेट, जिन्हें सेटअप या इंस्टॉल सतहें कोर में प्रदाता-विशिष्ट एकीकरण हार्डकोड किए बिना प्रस्तुत कर सकती हैं।                                                                                                                                                |
| `cliBackends`                        | नहीं       | `string[]`                   | इस Plugin के स्वामित्व वाली CLI अनुमान बैकएंड आईडी। स्पष्ट कॉन्फ़िगरेशन संदर्भों से स्टार्टअप पर स्वचालित सक्रियण के लिए उपयोग की जाती हैं।                                                                                                                                                                                    |
| `syntheticAuthRefs`                  | नहीं       | `string[]`                   | वे प्रदाता या CLI बैकएंड संदर्भ जिनके Plugin-स्वामित्व वाले कृत्रिम प्रमाणीकरण हुक की जाँच रनटाइम लोड होने से पहले कोल्ड मॉडल खोज के दौरान की जानी चाहिए।                                                                                                                                                         |
| `nonSecretAuthMarkers`               | नहीं       | `string[]`                   | बंडल किए गए Plugin के स्वामित्व वाले प्लेसहोल्डर API कुंजी मान, जो गैर-गोपनीय स्थानीय, OAuth या परिवेशी क्रेडेंशियल स्थिति दर्शाते हैं।                                                                                                                                                                           |
| `commandAliases`                     | नहीं       | `object[]`                   | इस Plugin के स्वामित्व वाले कमांड नाम, जिन्हें रनटाइम लोड होने से पहले Plugin-जागरूक कॉन्फ़िगरेशन और CLI निदान उत्पन्न करना चाहिए।                                                                                                                                                                           |
| `providerUsageAuthEnvVars`           | नहीं       | `Record<string, string[]>`   | केवल उपयोग/बिलिंग के लिए प्रदाता क्रेडेंशियल। OpenClaw इन नामों का उपयोग उपयोग खोज और गोपनीय जानकारी हटाने के लिए करता है, लेकिन अनुमान प्रमाणीकरण के लिए कभी नहीं।                                                                                                                                                      |
| `providerAuthAliases`                | नहीं       | `Record<string, string>`     | वे प्रदाता आईडी जिन्हें प्रमाणीकरण खोज के लिए किसी अन्य प्रदाता आईडी का पुनः उपयोग करना चाहिए, उदाहरण के लिए ऐसा कोडिंग प्रदाता जो आधार प्रदाता की API कुंजी और प्रमाणीकरण प्रोफ़ाइल साझा करता है।                                                                                                                                     |
| `providerAuthChoices`                | नहीं       | `object[]`                   | ऑनबोर्डिंग चयनकर्ताओं, पसंदीदा-प्रदाता समाधान और सरल CLI फ़्लैग वायरिंग के लिए हल्का प्रमाणीकरण-विकल्प मेटाडेटा।                                                                                                                                                                                  |
| `activation`                         | नहीं       | `object`                     | स्टार्टअप, प्रदाता, कमांड, चैनल, रूट और क्षमता से ट्रिगर होने वाली लोडिंग के लिए हल्का सक्रियण योजनाकार मेटाडेटा। केवल मेटाडेटा; वास्तविक व्यवहार का स्वामी फिर भी Plugin रनटाइम है।                                                                                                                  |
| `setup`                              | नहीं       | `object`                     | हल्के सेटअप/ऑनबोर्डिंग वर्णनकर्ता, जिनका निरीक्षण खोज और सेटअप सतहें Plugin रनटाइम लोड किए बिना कर सकती हैं।                                                                                                                                                                               |
| `qaRunners`                          | नहीं       | `object[]`                   | साझा `openclaw qa` होस्ट द्वारा Plugin रनटाइम लोड होने से पहले उपयोग किए जाने वाले हल्के QA रनर वर्णनकर्ता।                                                                                                                                                                                                 |
| `dashboard`                          | नहीं       | `object`                     | डैशबोर्ड विजेट डेटा बाइंडिंग और क्रिया क्रियापद। प्रत्येक प्रविष्टि को इस Plugin द्वारा आवश्यक पठन या लेखन स्कोप के साथ पंजीकृत Gateway विधि के विरुद्ध सत्यापित किया जाता है। [डैशबोर्ड संदर्भ](#dashboard-reference) देखें।                                                                            |
| `mcpServers`                         | नहीं       | `Record<string, object>`     | इस Plugin के सक्षम रहने के दौरान प्रदान की गई स्थिर MCP सर्वर परिभाषाएँ। सापेक्ष कमांड आर्ग्युमेंट और कार्यशील डायरेक्टरी Plugin रूट से रिज़ॉल्व होती हैं। ऑपरेटर की `mcp.servers` प्रविष्टियाँ समान नाम वाली परिभाषाओं को ओवरराइड या अक्षम करती हैं। [MCP सर्वर संदर्भ](#mcp-server-reference) देखें। |
| `contracts`                          | नहीं       | `object`                     | बाहरी प्रमाणीकरण हुक, एम्बेडिंग, वाक्, रीयलटाइम ट्रांसक्रिप्शन, रीयलटाइम वॉइस, मीडिया-समझ, छवि/वीडियो/संगीत जनरेशन, वेब फ़ेच, वेब खोज, वर्कर प्रदाताओं, दस्तावेज़/वेब-सामग्री निष्कर्षण और टूल स्वामित्व के लिए स्थिर क्षमता-स्वामित्व स्नैपशॉट।                     |
| `configContracts`                    | नहीं       | `object`                     | जेनेरिक कोर सहायकों द्वारा उपयोग किया जाने वाला मैनिफ़ेस्ट-स्वामित्व वाला कॉन्फ़िग व्यवहार: खतरनाक फ़्लैग की पहचान, SecretRef माइग्रेशन लक्ष्य और लीगेसी कॉन्फ़िग-पथ का संकुचन। [configContracts संदर्भ](#configcontracts-reference) देखें।                                                                         |
| `mediaUnderstandingProviderMetadata` | नहीं       | `Record<string, object>`     | `contracts.mediaUnderstandingProviders` में घोषित प्रदाता आईडी के लिए कम लागत वाले मीडिया-समझ डिफ़ॉल्ट।                                                                                                                                                                                       |
| `imageGenerationProviderMetadata`    | नहीं       | `Record<string, object>`     | `contracts.imageGenerationProviders` में घोषित प्रदाता आईडी के लिए कम लागत वाला छवि-जनरेशन प्रमाणीकरण मेटाडेटा, जिसमें प्रदाता-स्वामित्व वाले प्रमाणीकरण उपनाम और बेस-URL गार्ड शामिल हैं।                                                                                                                             |
| `videoGenerationProviderMetadata`    | नहीं       | `Record<string, object>`     | `contracts.videoGenerationProviders` में घोषित प्रदाता आईडी के लिए कम लागत वाला वीडियो-जनरेशन प्रमाणीकरण मेटाडेटा, जिसमें प्रदाता-स्वामित्व वाले प्रमाणीकरण उपनाम और बेस-URL गार्ड शामिल हैं।                                                                                                                             |
| `musicGenerationProviderMetadata`    | नहीं       | `Record<string, object>`     | `contracts.musicGenerationProviders` में घोषित प्रदाता आईडी के लिए कम लागत वाला संगीत-जनरेशन प्रमाणीकरण मेटाडेटा, जिसमें प्रदाता-स्वामित्व वाले प्रमाणीकरण उपनाम और बेस-URL गार्ड शामिल हैं।                                                                                                                             |
| `toolMetadata`                       | नहीं       | `Record<string, object>`     | `contracts.tools` में घोषित Plugin-स्वामित्व वाले टूल के लिए कम लागत वाला उपलब्धता मेटाडेटा। इसका उपयोग तब करें, जब कॉन्फ़िग, परिवेश या प्रमाणीकरण का प्रमाण मौजूद न होने पर किसी टूल को रनटाइम लोड नहीं करना चाहिए।                                                                                                                      |
| `channelConfigs`                     | नहीं       | `Record<string, object>`     | रनटाइम लोड होने से पहले खोज और सत्यापन सतहों में मर्ज किया गया मैनिफ़ेस्ट-स्वामित्व वाला चैनल कॉन्फ़िग मेटाडेटा।                                                                                                                                                                                     |
| `skills`                             | नहीं       | `string[]`                   | लोड की जाने वाली Skill डायरेक्टरी, जो Plugin रूट के सापेक्ष हैं।                                                                                                                                                                                                                                        |
| `name`                               | नहीं       | `string`                     | मानव-पठनीय Plugin नाम।                                                                                                                                                                                                                                                                    |
| `description`                        | नहीं       | `string`                     | Plugin सतहों पर दिखाया जाने वाला संक्षिप्त सारांश।                                                                                                                                                                                                                                                        |
| `catalog`                            | नहीं       | `object`                     | Plugin कैटलॉग सतहों के लिए वैकल्पिक प्रस्तुति संकेत। यह मेटाडेटा किसी Plugin को इंस्टॉल या सक्षम नहीं करता और न ही उसे विश्वसनीयता प्रदान करता है।                                                                                                                                                                   |
| `icon`                               | नहीं       | `string`                     | मार्केटप्लेस/कैटलॉग कार्ड के लिए HTTPS छवि URL। ClawHub किसी भी मान्य `https://` URL को स्वीकार करता है और इसे छोड़े जाने या अमान्य होने पर डिफ़ॉल्ट Plugin आइकन का उपयोग करता है।                                                                                                                             |
| `version`                            | नहीं       | `string`                     | जानकारी हेतु Plugin संस्करण।                                                                                                                                                                                                                                                                  |
| `uiHints`                            | नहीं       | `Record<string, object>`     | कॉन्फ़िग फ़ील्ड के लिए UI लेबल, प्लेसहोल्डर और संवेदनशीलता संकेत।                                                                                                                                                                                                                              |

## MCP सर्वर संदर्भ

`mcpServers` किसी नेटिव Plugin को MCP App सहित MCP सर्वर प्रदान करने देता है, जिसके लिए ऑपरेटरों को `openclaw.json` में उसकी स्थिर प्रक्रिया परिभाषा दोहराने की आवश्यकता नहीं होती:

```json
{
  "mcpServers": {
    "example": {
      "transport": "stdio",
      "command": "node",
      "args": ["./mcp-server.js"]
    }
  }
}
```

OpenClaw इन सर्वरों को केवल तभी शामिल करता है, जब स्वामी Plugin सक्षम हो। सापेक्ष `command`, `args`, `cwd`, और `workingDirectory` पथ Plugin रूट से रिज़ॉल्व होते हैं। उपयोगकर्ता कॉन्फ़िगरेशन प्रामाणिक रहता है: `mcp.servers.<name>` किसी Plugin डिफ़ॉल्ट को बदल सकता है या उसे छोड़ने के लिए `enabled: false` सेट कर सकता है। MCP App रेंडरिंग और सर्वर-टूल कॉल के लिए अब भी सामान्य MCP Apps सेटिंग और प्रभावी टूल नीति आवश्यक हैं; सर्वर घोषित करने से इनमें से कोई भी सीमा बायपास नहीं होती।

## डैशबोर्ड संदर्भ

`dashboard` किसी सक्षम Plugin को कोर में Plugin नीति जोड़े बिना, अनुमति-प्राप्त डैशबोर्ड विजेट के लिए मौजूदा Gateway RPC उपलब्ध कराने देता है। डेटा बाइंडिंग में उसी Plugin द्वारा `operator.read` के साथ पंजीकृत विधि का नाम होना चाहिए; एक्शन वर्ब में उसके द्वारा `operator.write` के साथ पंजीकृत विधि का नाम होना चाहिए। असंगति होने पर पंजीकरण के दौरान Plugin अस्वीकार कर दिया जाता है।

```json
{
  "dashboard": {
    "dataBindings": [
      {
        "id": "items.list",
        "method": "example.items.list",
        "description": "उदाहरण आइटम सूचीबद्ध करें।"
      }
    ],
    "actionVerbs": [
      {
        "id": "refresh",
        "method": "example.items.refresh",
        "description": "उदाहरण आइटम रीफ़्रेश करें।",
        "paramShape": {
          "type": "object",
          "additionalProperties": false,
          "properties": {
            "force": { "type": "boolean" }
          }
        }
      }
    ]
  }
}
```

मैनिफ़ेस्ट आईडी Plugin-स्थानीय होते हैं। विजेट अनुमतियाँ `<plugin-id>.<id>` का उपयोग करती हैं, जैसे `example.items.list` और `example.refresh`। स्थायी अनुमति नेमस्पेस को असंदिग्ध रखने के लिए, OpenClaw Plugin-आईडी खंड में `%` और `.` को `%25` और `%2E` के रूप में एस्केप करता है; सामान्य Plugin आईडी अपना स्वाभाविक रूप बनाए रखते हैं। `paramShape` एक वैकल्पिक JSON Schema है, जिसे OpenClaw द्वारा Plugin RPC लागू करने से पहले एक्शन पैरामीटर ऑब्जेक्ट पर लागू किया जाता है।

## कैटलॉग संदर्भ

`catalog` Plugin ब्राउज़र के लिए वैकल्पिक प्रदर्शन संकेत प्रदान करता है। होस्ट इन संकेतों को अनदेखा कर सकते हैं। ये कभी भी Plugin को इंस्टॉल या सक्षम नहीं करते, और न ही उसके रनटाइम व्यवहार या विश्वास स्तर को बदलते हैं।

```json
{
  "catalog": {
    "featured": true,
    "order": 10
  }
}
```

| फ़ील्ड      | प्रकार      | इसका अर्थ                                                              |
| ---------- | --------- | -------------------------------------------------------------------------- |
| `featured` | `boolean` | क्या कैटलॉग सतहों को इस Plugin को प्रमुखता देनी चाहिए।                       |
| `order`    | `number`  | क्यूरेट किए गए Plugin के बीच आरोही प्रदर्शन संकेत; कम मान पहले दिखाई देते हैं। |

## जनरेशन प्रदाता मेटाडेटा संदर्भ

जनरेशन प्रदाता मेटाडेटा फ़ील्ड संबद्ध `contracts.*GenerationProviders` सूची में घोषित प्रदाताओं के लिए स्थिर प्रमाणीकरण संकेतों का वर्णन करते हैं। OpenClaw इन फ़ील्ड को प्रदाता रनटाइम लोड होने से पहले पढ़ता है, ताकि कोर टूल प्रत्येक प्रदाता Plugin को आयात किए बिना यह तय कर सकें कि कोई जनरेशन प्रदाता उपलब्ध है या नहीं।

इन फ़ील्ड का उपयोग केवल कम लागत वाले, घोषणात्मक तथ्यों के लिए करें। ट्रांसपोर्ट, अनुरोध रूपांतरण, टोकन रीफ़्रेश, क्रेडेंशियल सत्यापन और वास्तविक जनरेशन व्यवहार Plugin रनटाइम में रहते हैं।

```json
{
  "contracts": {
    "imageGenerationProviders": ["example-image"]
  },
  "imageGenerationProviderMetadata": {
    "example-image": {
      "aliases": ["example-image-oauth"],
      "authProviders": ["example-image"],
      "configSignals": [
        {
          "rootPath": "plugins.entries.example-image.config",
          "overlayPath": "image",
          "mode": {
            "path": "mode",
            "default": "local",
            "allowed": ["local"]
          },
          "requiredAny": ["workflow", "workflowPath"],
          "required": ["promptNodeId"]
        }
      ],
      "authSignals": [
        {
          "provider": "example-image"
        },
        {
          "provider": "example-image-oauth",
          "providerBaseUrl": {
            "provider": "example-image",
            "defaultBaseUrl": "https://api.example.com/v1",
            "allowedBaseUrls": ["https://api.example.com/v1"]
          }
        }
      ]
    }
  }
}
```

प्रत्येक मेटाडेटा प्रविष्टि में ये समर्थित हैं:

| फ़ील्ड                  | आवश्यक | प्रकार       | इसका अर्थ                                                                                                                                       |
| ---------------------- | -------- | ---------- | --------------------------------------------------------------------------------------------------------------------------------------------------- |
| `aliases`              | नहीं       | `string[]` | अतिरिक्त प्रदाता आईडी, जिन्हें जनरेशन प्रदाता के लिए स्थिर प्रमाणीकरण उपनामों के रूप में गिना जाना चाहिए।                                                       |
| `authProviders`        | नहीं       | `string[]` | वे प्रदाता आईडी, जिनकी कॉन्फ़िगर की गई प्रमाणीकरण प्रोफ़ाइल को इस जनरेशन प्रदाता के लिए प्रमाणीकरण माना जाना चाहिए।                                                      |
| `configSignals`        | नहीं       | `object[]` | स्थानीय या स्व-होस्टेड प्रदाताओं के लिए कम लागत वाले, केवल-कॉन्फ़िगरेशन उपलब्धता संकेत, जिन्हें प्रमाणीकरण प्रोफ़ाइल या एनवायरनमेंट वेरिएबल के बिना कॉन्फ़िगर किया जा सकता है।                 |
| `authSignals`          | नहीं       | `object[]` | स्पष्ट प्रमाणीकरण संकेत। मौजूद होने पर ये प्रदाता आईडी, `aliases`, और `authProviders` से प्राप्त डिफ़ॉल्ट संकेत सेट को बदल देते हैं।                     |
| `referenceAudioInputs` | नहीं       | `boolean`  | केवल वीडियो जनरेशन। जब प्रदाता संदर्भ ऑडियो एसेट स्वीकार करता हो, तो इसे `true` पर सेट करें; अन्यथा `video_generate` ऑडियो संदर्भ पैरामीटर छिपा देता है। |

प्रत्येक `configSignals` प्रविष्टि में ये समर्थित हैं:

| फ़ील्ड            | आवश्यक | प्रकार       | इसका अर्थ                                                                                                                                                                             |
| ---------------- | -------- | ---------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `rootPath`       | हाँ      | `string`   | जाँचने के लिए Plugin-स्वामित्व वाले कॉन्फ़िगरेशन ऑब्जेक्ट का डॉट पथ, उदाहरण के लिए `plugins.entries.example.config`।                                                                                      |
| `overlayPath`    | नहीं       | `string`   | रूट कॉन्फ़िगरेशन के अंदर वह डॉट पथ, जिसका ऑब्जेक्ट संकेत का मूल्यांकन करने से पहले रूट ऑब्जेक्ट पर ओवरले होना चाहिए। इसका उपयोग क्षमता-विशिष्ट कॉन्फ़िगरेशन के लिए करें, जैसे `image`, `video`, या `music`।   |
| `overlayMapPath` | नहीं       | `string`   | रूट कॉन्फ़िगरेशन के अंदर वह डॉट पथ, जिसके प्रत्येक ऑब्जेक्ट मान को रूट ऑब्जेक्ट पर ओवरले होना चाहिए। इसका उपयोग `accounts` जैसे नामित अकाउंट मैप के लिए करें, जहाँ कोई भी कॉन्फ़िगर किया गया अकाउंट योग्य होना चाहिए। |
| `required`       | नहीं       | `string[]` | प्रभावी कॉन्फ़िगरेशन के अंदर वे डॉट पथ, जिनमें कॉन्फ़िगर किए गए मान होना आवश्यक है। स्ट्रिंग खाली नहीं होनी चाहिए; ऑब्जेक्ट और ऐरे खाली नहीं होने चाहिए।                                                  |
| `requiredAny`    | नहीं       | `string[]` | प्रभावी कॉन्फ़िगरेशन के अंदर वे डॉट पथ, जिनमें से कम-से-कम एक में कॉन्फ़िगर किया गया मान होना आवश्यक है।                                                                                                    |
| `mode`           | नहीं       | `object`   | प्रभावी कॉन्फ़िगरेशन के अंदर वैकल्पिक स्ट्रिंग मोड गार्ड। इसका उपयोग तब करें, जब केवल-कॉन्फ़िगरेशन उपलब्धता केवल एक मोड पर लागू होती हो।                                                                  |

प्रत्येक `mode` गार्ड में ये समर्थित हैं:

| फ़ील्ड        | आवश्यक | प्रकार       | इसका अर्थ                                                                      |
| ------------ | -------- | ---------- | ---------------------------------------------------------------------------------- |
| `path`       | नहीं       | `string`   | प्रभावी कॉन्फ़िगरेशन के अंदर डॉट पथ। डिफ़ॉल्ट रूप से `mode`।                          |
| `default`    | नहीं       | `string`   | कॉन्फ़िगरेशन में पथ न होने पर उपयोग किया जाने वाला मोड मान।                                  |
| `allowed`    | नहीं       | `string[]` | मौजूद होने पर संकेत केवल तभी सफल होता है, जब प्रभावी मोड इनमें से किसी एक मान के बराबर हो। |
| `disallowed` | नहीं       | `string[]` | मौजूद होने पर संकेत तब विफल होता है, जब प्रभावी मोड इनमें से किसी एक मान के बराबर हो।       |

प्रत्येक `authSignals` प्रविष्टि में ये समर्थित हैं:

| फ़ील्ड             | आवश्यक | प्रकार     | इसका अर्थ                                                                                                                                                                 |
| ----------------- | -------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `provider`        | हाँ      | `string` | कॉन्फ़िगर की गई प्रमाणीकरण प्रोफ़ाइल में जाँचने के लिए प्रदाता आईडी।                                                                                                                             |
| `providerBaseUrl` | नहीं       | `object` | वैकल्पिक गार्ड, जो संकेत को केवल तभी गिनता है, जब संदर्भित कॉन्फ़िगर किया गया प्रदाता किसी अनुमत बेस URL का उपयोग करता हो। इसका उपयोग तब करें, जब कोई प्रमाणीकरण उपनाम केवल कुछ API के लिए मान्य हो। |

प्रत्येक `providerBaseUrl` गार्ड में ये समर्थित हैं:

| फ़ील्ड             | आवश्यक | प्रकार       | इसका अर्थ                                                                                                                                        |
| ----------------- | -------- | ---------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- |
| `provider`        | हाँ      | `string`   | वह प्रदाता कॉन्फ़िगरेशन आईडी, जिसके `baseUrl` की जाँच की जानी चाहिए।                                                                                                |
| `defaultBaseUrl`  | नहीं       | `string`   | प्रदाता कॉन्फ़िगरेशन में `baseUrl` न होने पर माने जाने वाला बेस URL।                                                                                         |
| `allowedBaseUrls` | हाँ      | `string[]` | इस प्रमाणीकरण संकेत के लिए अनुमत बेस URL। कॉन्फ़िगर किया गया या डिफ़ॉल्ट बेस URL इन सामान्यीकृत मानों में से किसी से मेल न खाने पर संकेत अनदेखा कर दिया जाता है। |

## टूल मेटाडेटा संदर्भ

`toolMetadata` टूल नाम के अनुसार कुंजीबद्ध, जनरेशन प्रदाता मेटाडेटा के समान `configSignals` और `authSignals` आकारों का उपयोग करता है। `contracts.tools` स्वामित्व घोषित करता है। `toolMetadata` कम लागत वाला उपलब्धता प्रमाण घोषित करता है, ताकि केवल उसकी टूल फ़ैक्ट्री से `null` लौटवाने के लिए OpenClaw को Plugin रनटाइम आयात न करना पड़े।

```json
{
  "setup": {
    "providers": [
      {
        "id": "example",
        "envVars": ["EXAMPLE_API_KEY"]
      }
    ]
  },
  "contracts": {
    "tools": ["example_search"]
  },
  "toolMetadata": {
    "example_search": {
      "authSignals": [
        {
          "provider": "example"
        }
      ],
      "configSignals": [
        {
          "rootPath": "plugins.entries.example.config",
          "overlayPath": "search",
          "required": ["apiKey"]
        }
      ]
    }
  }
}
```

`toolMetadata` प्रविष्टियाँ साझा किए गए उपरोक्त `configSignals`/`authSignals` फ़ील्ड के अतिरिक्त `optional` (टूल को Plugin सक्रियण के लिए अनिवार्य नहीं चिह्नित करता है) और `replaySafe` (अपूर्ण मॉडल टर्न के बाद टूल निष्पादन को दोहराने के लिए सुरक्षित चिह्नित करता है) भी स्वीकार करती हैं।

यदि किसी टूल में `toolMetadata` नहीं है, तो OpenClaw मौजूदा व्यवहार बनाए रखता है और टूल अनुबंध के नीति से मेल खाने पर स्वामी Plugin को लोड करता है। उन हॉट-पाथ टूल के लिए जिनकी फ़ैक्टरी प्रमाणीकरण/कॉन्फ़िगरेशन पर निर्भर है, Plugin लेखकों को पूछने के लिए कोर से रनटाइम आयात कराने के बजाय `toolMetadata` घोषित करना चाहिए।

## providerAuthChoices संदर्भ

प्रत्येक `providerAuthChoices` प्रविष्टि एक ऑनबोर्डिंग या प्रमाणीकरण विकल्प का वर्णन करती है। OpenClaw इसे प्रदाता रनटाइम लोड होने से पहले पढ़ता है। प्रदाता सेटअप सूचियाँ प्रदाता रनटाइम लोड किए बिना इन मैनिफ़ेस्ट विकल्पों, डिस्क्रिप्टर से प्राप्त सेटअप विकल्पों और इंस्टॉल-कैटलॉग मेटाडेटा का उपयोग करती हैं।

| फ़ील्ड                 | आवश्यक | प्रकार                                                                  | इसका अर्थ                                                                                             |
| --------------------- | -------- | --------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------- |
| `provider`            | हाँ      | `string`                                                              | वह प्रदाता आईडी जिससे यह विकल्प संबंधित है।                                                                       |
| `method`              | हाँ      | `string`                                                              | वह प्रमाणीकरण विधि आईडी जिस पर डिस्पैच करना है।                                                                            |
| `choiceId`            | हाँ      | `string`                                                              | ऑनबोर्डिंग और CLI प्रवाहों द्वारा उपयोग की जाने वाली स्थिर प्रमाणीकरण-विकल्प आईडी।                                                   |
| `choiceLabel`         | नहीं       | `string`                                                              | उपयोगकर्ता को दिखाई देने वाला लेबल। इसे छोड़ने पर OpenClaw `choiceId` का उपयोग करता है।                                         |
| `choiceHint`          | नहीं       | `string`                                                              | चयनकर्ता के लिए संक्षिप्त सहायक पाठ।                                                                         |
| `icon`                | नहीं       | HTTPS URL                                                             | समर्थित ऑनबोर्डिंग क्लाइंट में इस विकल्प के बगल में दिखाई जाने वाली कलाकृति।                                         |
| `website`             | नहीं       | HTTPS URL                                                             | समर्थित ऑनबोर्डिंग क्लाइंट द्वारा दिखाई जाने वाली उत्पाद, साइन-इन या इंस्टॉलेशन पृष्ठ।                             |
| `assistantPriority`   | नहीं       | `number`                                                              | सहायक-संचालित इंटरैक्टिव चयनकर्ताओं में कम मान पहले क्रमबद्ध होते हैं।                                        |
| `assistantVisibility` | नहीं       | `"visible"` \| `"manual-only"`                                        | मैन्युअल CLI चयन की अनुमति बनाए रखते हुए विकल्प को सहायक चयनकर्ताओं से छिपाएँ।                         |
| `deprecatedChoiceIds` | नहीं       | `string[]`                                                            | पुराने विकल्प आईडी जिन्हें उपयोगकर्ताओं को इस प्रतिस्थापन विकल्प पर पुनर्निर्देशित करना चाहिए।                                  |
| `groupId`             | नहीं       | `string`                                                              | संबंधित विकल्पों को समूहित करने के लिए वैकल्पिक समूह आईडी।                                                           |
| `groupLabel`          | नहीं       | `string`                                                              | उस समूह के लिए उपयोगकर्ता को दिखाई देने वाला लेबल।                                                                         |
| `groupHint`           | नहीं       | `string`                                                              | समूह के लिए संक्षिप्त सहायक पाठ।                                                                          |
| `onboardingFeatured`  | नहीं       | `boolean`                                                             | इंटरैक्टिव ऑनबोर्डिंग चयनकर्ता में "More..." प्रविष्टि से पहले इस समूह को फ़ीचर्ड स्तर में दिखाएँ। |
| `optionKey`           | नहीं       | `string`                                                              | सरल एक-फ़्लैग प्रमाणीकरण प्रवाहों के लिए आंतरिक विकल्प कुंजी।                                                       |
| `cliFlag`             | नहीं       | `string`                                                              | CLI फ़्लैग नाम, जैसे `--openrouter-api-key`।                                                            |
| `cliOption`           | नहीं       | `string`                                                              | पूर्ण CLI विकल्प स्वरूप, जैसे `--openrouter-api-key <key>`।                                              |
| `cliDescription`      | नहीं       | `string`                                                              | CLI सहायता में उपयोग किया जाने वाला विवरण।                                                                             |
| `appGuidedSecret`     | नहीं       | `boolean`                                                             | ऐप-निर्देशित सेटअप के लिए चिपकाया गया एक सीक्रेट और प्रदाता डिफ़ॉल्ट पर्याप्त हैं।                              |
| `appGuidedDiscovery`  | नहीं       | `boolean`                                                             | मेल खाने वाली रनटाइम प्रमाणीकरण विधि `appGuidedSetup` के माध्यम से केवल-पढ़ने योग्य स्थानीय खोज की स्वामी है।                 |
| `appGuidedAuth`       | नहीं       | `"oauth"` \| `"device-code"`                                          | प्रदाता-स्वामित्व वाला इंटरैक्टिव लॉगिन जिसे नेटिव सेटअप क्लाइंट सामान्य रूप से रेंडर कर सकते हैं।                        |
| `onboardingScopes`    | नहीं       | `Array<"text-inference" \| "image-generation" \| "music-generation">` | यह विकल्प किन ऑनबोर्डिंग सतहों में दिखाई देना चाहिए। इसे छोड़ने पर यह `["text-inference"]` पर डिफ़ॉल्ट होता है।  |

जब `appGuidedDiscovery` सत्य हो, तो मेल खाने वाली प्रदाता प्रमाणीकरण विधि को
`appGuidedSetup.detect` और `appGuidedSetup.prepare` उपलब्ध कराने होंगे। पहचान
केवल-पढ़ने योग्य होनी चाहिए: कोई लॉगिन, मॉडल पुल, डाउनलोड या कॉन्फ़िगरेशन लेखन नहीं। तैयारी
चुने गए सटीक मॉडल की दोबारा जाँच करती है और एक कॉन्फ़िगरेशन प्रस्ताव लौटाती है; OpenClaw उस
प्रस्ताव का अलगाव में लाइव परीक्षण करता है और सफलता के बाद ही उसे कमिट करता है।

## commandAliases संदर्भ

जब कोई Plugin ऐसे रनटाइम कमांड नाम का स्वामी हो जिसे उपयोगकर्ता गलती से `plugins.allow` में रख सकते हैं या रूट CLI कमांड के रूप में चलाने का प्रयास कर सकते हैं, तब `commandAliases` का उपयोग करें। OpenClaw निदान के लिए Plugin रनटाइम कोड आयात किए बिना इस मेटाडेटा का उपयोग करता है।

```json
{
  "commandAliases": [
    {
      "name": "dreaming",
      "kind": "runtime-slash",
      "cliCommand": "memory"
    }
  ]
}
```

| फ़ील्ड        | आवश्यक | प्रकार              | इसका अर्थ                                                           |
| ------------ | -------- | ----------------- | ----------------------------------------------------------------------- |
| `name`       | हाँ      | `string`          | वह कमांड नाम जो इस Plugin से संबंधित है।                               |
| `kind`       | नहीं       | `"runtime-slash"` | उपनाम को रूट CLI कमांड के बजाय चैट स्लैश कमांड के रूप में चिह्नित करता है। |
| `cliCommand` | नहीं       | `string`          | CLI संचालनों के लिए सुझाया जाने वाला संबंधित रूट CLI कमांड, यदि कोई हो।  |

## activation संदर्भ

जब Plugin कम लागत में यह घोषित कर सकता हो कि किन नियंत्रण-प्लेन इवेंट में उसे सक्रियण/लोड योजना में शामिल करना चाहिए, तब `activation` का उपयोग करें।

यह ब्लॉक प्लानर मेटाडेटा है, लाइफ़साइकल API नहीं। यह रनटाइम व्यवहार पंजीकृत नहीं करता, `register(...)` को प्रतिस्थापित नहीं करता और यह वादा नहीं करता कि Plugin कोड पहले ही निष्पादित हो चुका है। सक्रियण प्लानर मौजूदा मैनिफ़ेस्ट स्वामित्व मेटाडेटा, जैसे `providers`, `channels`, `commandAliases`, `setup.providers`, `contracts.tools` और हुक पर वापस जाने से पहले उम्मीदवार Plugin को सीमित करने के लिए इन फ़ील्ड का उपयोग करता है।

उस सबसे संकीर्ण मेटाडेटा को प्राथमिकता दें जो पहले से स्वामित्व का वर्णन करता है। जब `providers`, `channels`, `commandAliases`, सेटअप डिस्क्रिप्टर या `contracts` संबंध को व्यक्त करते हों, तब उनका उपयोग करें। उन अतिरिक्त प्लानर संकेतों के लिए `activation` का उपयोग करें जिन्हें उन स्वामित्व फ़ील्ड द्वारा दर्शाया नहीं जा सकता। `claude-cli`, `my-cli` या `google-gemini-cli` जैसे CLI रनटाइम उपनामों के लिए शीर्ष-स्तरीय `cliBackends` का उपयोग करें; `activation.onAgentHarnesses` केवल उन एम्बेडेड एजेंट हार्नेस आईडी के लिए है जिनके पास पहले से कोई स्वामित्व फ़ील्ड नहीं है।

प्रत्येक Plugin को `activation.onStartup` जानबूझकर सेट करना चाहिए। इसे केवल तभी `true` पर सेट करें जब Plugin को Gateway स्टार्टअप के दौरान चलना अनिवार्य हो। जब Plugin स्टार्टअप पर निष्क्रिय हो और केवल अधिक संकीर्ण ट्रिगर से लोड होना चाहिए, तब इसे `false` पर सेट करें। `onStartup` को छोड़ने पर अब Plugin स्टार्टअप पर निहित रूप से लोड नहीं होता; स्टार्टअप, चैनल, कॉन्फ़िगरेशन, एजेंट हार्नेस, मेमोरी या अन्य अधिक संकीर्ण सक्रियण ट्रिगर के लिए स्पष्ट सक्रियण मेटाडेटा का उपयोग करें।

```json
{
  "activation": {
    "onStartup": false,
    "onProviders": ["openai"],
    "onCommands": ["models"],
    "onChannels": ["web"],
    "onRoutes": ["gateway-webhook"],
    "onConfigPaths": ["browser"],
    "onCapabilities": ["provider", "tool"]
  }
}
```

| फ़ील्ड              | आवश्यक | प्रकार                                                 | इसका अर्थ                                                                                                                                                                               |
| ------------------ | -------- | ---------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `onStartup`        | नहीं       | `boolean`                                            | स्पष्ट Gateway स्टार्टअप सक्रियण। प्रत्येक Plugin को इसे सेट करना चाहिए। `true` स्टार्टअप के दौरान Plugin को इंपोर्ट करता है; `false` इसे स्टार्टअप पर लेज़ी रखता है, जब तक कि किसी अन्य मेल खाने वाले ट्रिगर के कारण इसे लोड करना आवश्यक न हो। |
| `onProviders`      | नहीं       | `string[]`                                           | वे प्रोवाइडर आईडी, जिन्हें सक्रियण/लोड योजनाओं में इस Plugin को शामिल करना चाहिए।                                                                                                                      |
| `onAgentHarnesses` | नहीं       | `string[]`                                           | एम्बेडेड एजेंट हार्नेस रनटाइम आईडी, जिन्हें सक्रियण/लोड योजनाओं में इस Plugin को शामिल करना चाहिए। CLI बैकएंड उपनामों के लिए शीर्ष-स्तरीय `cliBackends` का उपयोग करें।                                           |
| `onCommands`       | नहीं       | `string[]`                                           | वे कमांड आईडी, जिन्हें सक्रियण/लोड योजनाओं में इस Plugin को शामिल करना चाहिए।                                                                                                                       |
| `onChannels`       | नहीं       | `string[]`                                           | वे चैनल आईडी, जिन्हें सक्रियण/लोड योजनाओं में इस Plugin को शामिल करना चाहिए।                                                                                                                       |
| `onRoutes`         | नहीं       | `string[]`                                           | वे रूट प्रकार, जिन्हें सक्रियण/लोड योजनाओं में इस Plugin को शामिल करना चाहिए।                                                                                                                       |
| `onConfigPaths`    | नहीं       | `string[]`                                           | रूट-सापेक्ष कॉन्फ़िगरेशन पथ, जिन्हें पथ मौजूद होने और स्पष्ट रूप से अक्षम न किए जाने पर स्टार्टअप/लोड योजनाओं में इस Plugin को शामिल करना चाहिए।                                                      |
| `onCapabilities`   | नहीं       | `Array<"provider" \| "channel" \| "tool" \| "hook">` | कंट्रोल-प्लेन सक्रियण योजना में उपयोग किए जाने वाले व्यापक क्षमता संकेत। संभव होने पर अधिक विशिष्ट फ़ील्ड को प्राथमिकता दें।                                                                                     |

वर्तमान सक्रिय उपभोक्ता:

- Gateway स्टार्टअप योजना स्पष्ट स्टार्टअप इंपोर्ट के लिए `activation.onStartup` का उपयोग करती है।
- कमांड-ट्रिगर की गई CLI योजना पुराने `commandAliases[].cliCommand` या `commandAliases[].name` पर फ़ॉलबैक करती है।
- एजेंट-रनटाइम स्टार्टअप योजना एम्बेडेड हार्नेस के लिए `activation.onAgentHarnesses` और CLI रनटाइम उपनामों के लिए शीर्ष-स्तरीय `cliBackends[]` का उपयोग करती है।
- स्पष्ट चैनल सक्रियण मेटाडेटा अनुपलब्ध होने पर चैनल-ट्रिगर की गई सेटअप/चैनल योजना पुराने `channels[]` स्वामित्व पर फ़ॉलबैक करती है।
- स्टार्टअप Plugin योजना बंडल किए गए ब्राउज़र Plugin के `browser` ब्लॉक जैसे गैर-चैनल रूट कॉन्फ़िगरेशन सतहों के लिए `activation.onConfigPaths` का उपयोग करती है।
- स्पष्ट प्रोवाइडर सक्रियण मेटाडेटा अनुपलब्ध होने पर प्रोवाइडर-ट्रिगर की गई सेटअप/रनटाइम योजना पुराने `providers[]` और शीर्ष-स्तरीय `cliBackends[]` स्वामित्व पर फ़ॉलबैक करती है।

प्लानर डायग्नोस्टिक्स स्पष्ट सक्रियण संकेतों को मैनिफ़ेस्ट स्वामित्व फ़ॉलबैक से अलग कर सकते हैं। उदाहरण के लिए, `activation-command-hint` का अर्थ है कि `activation.onCommands` मेल खाता है, जबकि `manifest-command-alias` का अर्थ है कि प्लानर ने इसके बजाय `commandAliases` स्वामित्व का उपयोग किया। ये कारण लेबल होस्ट डायग्नोस्टिक्स और परीक्षणों के लिए हैं; Plugin लेखकों को उस मेटाडेटा की घोषणा जारी रखनी चाहिए जो स्वामित्व का सर्वोत्तम वर्णन करता है।

## qaRunners संदर्भ

जब कोई Plugin साझा `openclaw qa` रूट के अंतर्गत एक या अधिक ट्रांसपोर्ट रनर प्रदान करता है, तब `qaRunners` का उपयोग करें। इस मेटाडेटा को सस्ता और स्थिर रखें; Plugin
रनटाइम अब भी एक हल्की
`runtime-api.ts` सतह के माध्यम से वास्तविक CLI पंजीकरण का स्वामी होता है, जो मेल खाने वाले `qaRunnerCliRegistrations` निर्यात करती है। एक
वैकल्पिक `adapterFactory` पंजीकृत कमांड के रनर को बदले बिना
ट्रांसपोर्ट को साझा QA परिदृश्यों के लिए उपलब्ध कराता है।

```json
{
  "qaRunners": [
    {
      "commandName": "matrix",
      "description": "डिस्पोज़ेबल होमसर्वर के विरुद्ध Docker-समर्थित Matrix लाइव QA लेन चलाएँ"
    }
  ]
}
```

| फ़ील्ड         | आवश्यक | प्रकार     | इसका अर्थ                                                      |
| ------------- | -------- | -------- | ------------------------------------------------------------------ |
| `commandName` | हाँ      | `string` | `openclaw qa` के अंतर्गत माउंट किया गया सबकमांड, उदाहरण के लिए `matrix`।    |
| `description` | नहीं       | `string` | साझा होस्ट को स्टब कमांड की आवश्यकता होने पर उपयोग किया जाने वाला फ़ॉलबैक सहायता टेक्स्ट। |

`adapterFactory` आईडी का `commandName` से मेल खाना आवश्यक है। मैनिफ़ेस्ट में अनुपस्थित
कमांड के लिए पंजीकरण निर्यात न करें।

## setup संदर्भ

जब सेटअप और ऑनबोर्डिंग सतहों को रनटाइम लोड होने से पहले सस्ते Plugin-स्वामित्व वाले मेटाडेटा की आवश्यकता हो, तब `setup` का उपयोग करें।

```json
{
  "setup": {
    "providers": [
      {
        "id": "openai",
        "authMethods": ["api-key"],
        "envVars": ["OPENAI_API_KEY"],
        "authEvidence": [
          {
            "type": "local-file-with-env",
            "fileEnvVar": "OPENAI_CREDENTIALS_FILE",
            "requiresAllEnv": ["OPENAI_PROJECT"],
            "credentialMarker": "openai-local-credentials",
            "source": "openai स्थानीय क्रेडेंशियल"
          }
        ]
      }
    ],
    "cliBackends": ["openai-cli"],
    "configMigrations": ["legacy-openai-auth"],
    "requiresRuntime": false
  }
}
```

शीर्ष-स्तरीय `cliBackends` वैध रहता है और CLI अनुमान बैकएंड का वर्णन करना जारी रखता है। `setup.cliBackends` कंट्रोल-प्लेन/सेटअप प्रवाहों के लिए सेटअप-विशिष्ट डिस्क्रिप्टर सतह है, जिसे केवल-मेटाडेटा रहना चाहिए।

मौजूद होने पर, `setup.providers` और `setup.cliBackends` सेटअप खोज के लिए पसंदीदा डिस्क्रिप्टर-प्रथम लुकअप सतह हैं। यदि डिस्क्रिप्टर केवल उम्मीदवार Plugin को सीमित करता है और सेटअप को अब भी अधिक समृद्ध सेटअप-समय रनटाइम हुक की आवश्यकता है, तो `requiresRuntime: true` सेट करें और फ़ॉलबैक निष्पादन पथ के रूप में `setup-api` को बनाए रखें।

OpenClaw सामान्य प्रोवाइडर प्रमाणीकरण और एन्वायरनमेंट-वेरिएबल लुकअप में `setup.providers[].envVars` को शामिल करता है। सेटअप और स्थिति का एन्वायरनमेंट मेटाडेटा वहाँ रखें।

जब किसी बिलिंग या संगठन-स्तरीय क्रेडेंशियल को अनुमान क्रेडेंशियल बने बिना `resolveUsageAuth` सक्रिय करना हो, तब `providerUsageAuthEnvVars` का उपयोग करें। ये नाम वर्कस्पेस dotenv ब्लॉकिंग, ACP चाइल्ड-प्रोसेस स्ट्रिपिंग, सैंडबॉक्स सीक्रेट फ़िल्टरिंग और व्यापक सीक्रेट स्क्रबिंग में जुड़ते हैं। प्रोवाइडर रनटाइम अब भी `resolveUsageAuth` के भीतर मान को पढ़ता और वर्गीकृत करता है।

जब कोई सेटअप प्रविष्टि उपलब्ध न हो, या जब `setup.requiresRuntime: false` यह घोषित करे कि सेटअप रनटाइम अनावश्यक है, तब OpenClaw `setup.providers[].authMethods` से सरल सेटअप विकल्प भी प्राप्त कर सकता है। कस्टम लेबल, CLI फ़्लैग, ऑनबोर्डिंग दायरे और असिस्टेंट मेटाडेटा के लिए स्पष्ट `providerAuthChoices` प्रविष्टियों को प्राथमिकता मिलती है।

`requiresRuntime: false` केवल तभी सेट करें, जब वे डिस्क्रिप्टर सेटअप सतह के लिए पर्याप्त हों। OpenClaw स्पष्ट `false` को केवल-डिस्क्रिप्टर अनुबंध मानता है और सेटअप लुकअप के लिए `setup-api` या `openclaw.setupEntry` निष्पादित नहीं करेगा। यदि कोई केवल-डिस्क्रिप्टर Plugin फिर भी उन सेटअप रनटाइम प्रविष्टियों में से किसी एक को शिप करता है, तो OpenClaw एक योगात्मक डायग्नोस्टिक रिपोर्ट करता है और उसे अनदेखा करना जारी रखता है। `requiresRuntime` को छोड़ देने पर पुराना फ़ॉलबैक व्यवहार बना रहता है, ताकि फ़्लैग के बिना डिस्क्रिप्टर जोड़ने वाले मौजूदा Plugin न टूटें।

चूँकि सेटअप लुकअप Plugin-स्वामित्व वाला `setup-api` कोड निष्पादित कर सकता है, सामान्यीकृत `setup.providers[].id` और `setup.cliBackends[]` मानों को खोजे गए सभी Plugin में अद्वितीय रहना आवश्यक है। अस्पष्ट स्वामित्व खोज क्रम से विजेता चुनने के बजाय बंद होकर विफल होता है।

जब सेटअप रनटाइम निष्पादित होता है, तब सेटअप रजिस्ट्री डायग्नोस्टिक्स डिस्क्रिप्टर विचलन की रिपोर्ट करते हैं, यदि `setup-api` ऐसे प्रोवाइडर या CLI बैकएंड को पंजीकृत करता है जिसे मैनिफ़ेस्ट डिस्क्रिप्टर घोषित नहीं करते, या यदि किसी डिस्क्रिप्टर के लिए कोई मेल खाता रनटाइम पंजीकरण नहीं है। ये डायग्नोस्टिक्स योगात्मक हैं और पुराने Plugin को अस्वीकार नहीं करते।

### setup.providers संदर्भ

| फ़ील्ड          | आवश्यक | प्रकार       | इसका अर्थ                                                                                    |
| -------------- | -------- | ---------- | ------------------------------------------------------------------------------------------------ |
| `id`           | हाँ      | `string`   | सेटअप या ऑनबोर्डिंग के दौरान प्रदर्शित प्रोवाइडर आईडी। सामान्यीकृत आईडी को वैश्विक रूप से अद्वितीय रखें।             |
| `authMethods`  | नहीं       | `string[]` | वे सेटअप/प्रमाणीकरण विधि आईडी, जिनका यह प्रोवाइडर पूर्ण रनटाइम लोड किए बिना समर्थन करता है।                       |
| `envVars`      | नहीं       | `string[]` | वे एन्वायरनमेंट वेरिएबल, जिन्हें सामान्य सेटअप/स्थिति सतहें Plugin रनटाइम लोड होने से पहले जाँच सकती हैं।               |
| `authEvidence` | नहीं       | `object[]` | उन प्रोवाइडर के लिए सस्ती स्थानीय प्रमाणीकरण प्रमाण जाँच, जो गैर-सीक्रेट मार्कर के माध्यम से प्रमाणित कर सकते हैं। |

`authEvidence` प्रोवाइडर-स्वामित्व वाले स्थानीय क्रेडेंशियल मार्कर के लिए है, जिन्हें रनटाइम कोड लोड किए बिना सत्यापित किया जा सकता है। इन जाँचों को सस्ता और स्थानीय रहना आवश्यक है: कोई नेटवर्क कॉल नहीं, कोई कीचेन या सीक्रेट-मैनेजर रीड नहीं, कोई शेल कमांड नहीं और कोई प्रोवाइडर API प्रोब नहीं।

समर्थित प्रमाण प्रविष्टियाँ:

| फ़ील्ड              | आवश्यक | प्रकार       | इसका अर्थ                                                                                                  |
| ------------------ | -------- | ---------- | -------------------------------------------------------------------------------------------------------------- |
| `type`             | हाँ      | `string`   | वर्तमान में `local-file-with-env`।                                                                               |
| `fileEnvVar`       | नहीं       | `string`   | स्पष्ट क्रेडेंशियल फ़ाइल पथ वाला एन्वायरनमेंट वेरिएबल।                                                           |
| `fallbackPaths`    | नहीं       | `string[]` | `fileEnvVar` के अनुपस्थित या रिक्त होने पर जाँचे जाने वाले स्थानीय क्रेडेंशियल फ़ाइल पथ। `${HOME}` और `${APPDATA}` का समर्थन करता है। |
| `requiresAnyEnv`   | नहीं       | `string[]` | प्रमाण के वैध होने से पहले सूचीबद्ध एन्वायरनमेंट वेरिएबल में से कम-से-कम एक गैर-रिक्त होना आवश्यक है।                                    |
| `requiresAllEnv`   | नहीं       | `string[]` | प्रमाण के वैध होने से पहले प्रत्येक सूचीबद्ध एन्वायरनमेंट वेरिएबल का गैर-रिक्त होना आवश्यक है।                                           |
| `credentialMarker` | हाँ      | `string`   | प्रमाण मौजूद होने पर लौटाया गया गैर-सीक्रेट मार्कर।                                                       |
| `source`           | नहीं       | `string`   | प्रमाणीकरण/स्थिति आउटपुट के लिए उपयोगकर्ता-दृश्य स्रोत लेबल।                                                               |

### setup फ़ील्ड

| फ़ील्ड              | आवश्यक | प्रकार       | इसका अर्थ                                                                                       |
| ------------------ | -------- | ---------- | --------------------------------------------------------------------------------------------------- |
| `providers`        | नहीं       | `object[]` | सेटअप और ऑनबोर्डिंग के दौरान उपलब्ध कराए गए प्रदाता सेटअप विवरणक।                                     |
| `cliBackends`      | नहीं       | `string[]` | विवरणक-प्रथम सेटअप लुकअप के लिए उपयोग की जाने वाली सेटअप-समय बैकएंड आईडी। सामान्यीकृत आईडी को वैश्विक रूप से अद्वितीय रखें। |
| `configMigrations` | नहीं       | `string[]` | इस Plugin की सेटअप सतह के स्वामित्व वाली कॉन्फ़िग माइग्रेशन आईडी।                                          |
| `requiresRuntime`  | नहीं       | `boolean`  | क्या विवरणक लुकअप के बाद भी सेटअप को `setup-api` निष्पादन की आवश्यकता है।                            |

## uiHints संदर्भ

`uiHints` कॉन्फ़िग फ़ील्ड नामों से छोटे रेंडरिंग संकेतों तक का एक मैप है। नेस्टेड कॉन्फ़िग फ़ील्ड के लिए कुंजियों में डॉट का उपयोग किया जा सकता है, लेकिन कोई भी पथ खंड `__proto__`, `constructor`, या `prototype` नहीं हो सकता; सेटअप इन नामों को अस्वीकार करता है।

```json
{
  "uiHints": {
    "apiKey": {
      "label": "API कुंजी",
      "help": "OpenRouter अनुरोधों के लिए उपयोग किया जाता है",
      "placeholder": "sk-or-v1-...",
      "sensitive": true
    }
  }
}
```

प्रत्येक फ़ील्ड संकेत में ये शामिल हो सकते हैं:

| फ़ील्ड          | प्रकार             | इसका अर्थ                                                                                                     |
| -------------- | ---------------- | ----------------------------------------------------------------------------------------------------------------- |
| `label`        | `string`         | उपयोगकर्ता को दिखाई देने वाला फ़ील्ड लेबल।                                                                                          |
| `help`         | `string`         | संक्षिप्त सहायक टेक्स्ट।                                                                                                |
| `tags`         | `string[]`       | वैकल्पिक UI टैग।                                                                                                 |
| `advanced`     | `boolean`        | फ़ील्ड को उन्नत के रूप में चिह्नित करता है।                                                                                      |
| `sensitive`    | `boolean`        | फ़ील्ड को गुप्त या संवेदनशील के रूप में चिह्नित करता है।                                                                           |
| `placeholder`  | `string`         | फ़ॉर्म इनपुट के लिए प्लेसहोल्डर टेक्स्ट।                                                                                 |
| `presentation` | `"phone-number"` | पार्स किए जा सकने वाले अंतरराष्ट्रीय (`+...`) मानों के लिए केवल-प्रदर्शन स्थानीयकृत फ़ोन प्रारूपण; मूल मान अपरिवर्तित रहते हैं। |

## contracts संदर्भ

`contracts` का उपयोग केवल स्थिर क्षमता-स्वामित्व मेटाडेटा के लिए करें, जिसे OpenClaw Plugin रनटाइम आयात किए बिना पढ़ सके।

```json
{
  "contracts": {
    "agentToolResultMiddleware": ["openclaw", "codex"],
    "trustedToolPolicies": ["workflow-budget"],
    "externalAuthProviders": ["acme-ai"],
    "embeddingProviders": ["openai-compatible"],
    "speechProviders": ["openai"],
    "realtimeTranscriptionProviders": ["openai"],
    "realtimeVoiceProviders": ["openai"],
    "memoryEmbeddingProviders": ["local"],
    "mediaUnderstandingProviders": ["openai"],
    "imageGenerationProviders": ["openai"],
    "videoGenerationProviders": ["qwen"],
    "musicGenerationProviders": ["stability-audio"],
    "documentExtractors": ["example-docs"],
    "webContentExtractors": ["firecrawl"],
    "webFetchProviders": ["firecrawl"],
    "webSearchProviders": ["gemini"],
    "workerProviders": ["example-worker"],
    "usageProviders": ["acme-ai"],
    "migrationProviders": ["hermes"],
    "gatewayMethodDispatch": ["authenticated-request"],
    "tools": ["firecrawl_search", "firecrawl_scrape"]
  }
}
```

प्रत्येक सूची वैकल्पिक है:

| फ़ील्ड                            | प्रकार       | इसका अर्थ                                                                                                                        |
| -------------------------------- | ---------- | ------------------------------------------------------------------------------------------------------------------------------------ |
| `embeddedExtensionFactories`     | `string[]` | Codex ऐप-सर्वर एक्सटेंशन फ़ैक्टरी आईडी, वर्तमान में `codex-app-server`।                                                                |
| `agentToolResultMiddleware`      | `string[]` | वे रनटाइम आईडी जिनके लिए यह Plugin टूल-परिणाम मिडलवेयर पंजीकृत कर सकता है।                                                                     |
| `trustedToolPolicies`            | `string[]` | Plugin-स्थानीय विश्वसनीय प्री-टूल नीति आईडी, जिन्हें कोई इंस्टॉल किया गया Plugin पंजीकृत कर सकता है। बंडल किए गए Plugin इस फ़ील्ड के बिना नीतियाँ पंजीकृत कर सकते हैं। |
| `externalAuthProviders`          | `string[]` | वे प्रदाता आईडी जिनके बाहरी प्रमाणीकरण प्रोफ़ाइल हुक का स्वामित्व इस Plugin के पास है।                                                                      |
| `embeddingProviders`             | `string[]` | पुनः उपयोग योग्य वेक्टर एम्बेडिंग उपयोग, जिसमें मेमोरी भी शामिल है, के लिए इस Plugin के स्वामित्व वाली सामान्य एम्बेडिंग प्रदाता आईडी।                                 |
| `speechProviders`                | `string[]` | इस Plugin के स्वामित्व वाली वाक् प्रदाता आईडी।                                                                                                |
| `realtimeTranscriptionProviders` | `string[]` | इस Plugin के स्वामित्व वाली रीयलटाइम-ट्रांसक्रिप्शन प्रदाता आईडी।                                                                                |
| `realtimeVoiceProviders`         | `string[]` | इस Plugin के स्वामित्व वाली रीयलटाइम-वॉइस प्रदाता आईडी।                                                                                        |
| `memoryEmbeddingProviders`       | `string[]` | इस Plugin के स्वामित्व वाली अप्रचलित मेमोरी-विशिष्ट एम्बेडिंग प्रदाता आईडी।                                                                  |
| `mediaUnderstandingProviders`    | `string[]` | इस Plugin के स्वामित्व वाली मीडिया-समझ प्रदाता आईडी।                                                                                   |
| `transcriptSourceProviders`      | `string[]` | इस Plugin के स्वामित्व वाली ट्रांसक्रिप्ट स्रोत प्रदाता आईडी।                                                                                     |
| `documentExtractors`             | `string[]` | इस Plugin के स्वामित्व वाली दस्तावेज़ (उदाहरण के लिए PDF) निष्कर्षक प्रदाता आईडी।                                                                  |
| `imageGenerationProviders`       | `string[]` | इस Plugin के स्वामित्व वाली छवि-जनरेशन प्रदाता आईडी।                                                                                      |
| `videoGenerationProviders`       | `string[]` | इस Plugin के स्वामित्व वाली वीडियो-जनरेशन प्रदाता आईडी।                                                                                      |
| `musicGenerationProviders`       | `string[]` | इस Plugin के स्वामित्व वाली संगीत-जनरेशन प्रदाता आईडी।                                                                                      |
| `webContentExtractors`           | `string[]` | इस Plugin के स्वामित्व वाली वेब-पेज सामग्री-निष्कर्षण प्रदाता आईडी।                                                                           |
| `webFetchProviders`              | `string[]` | इस Plugin के स्वामित्व वाली वेब-फ़ेच प्रदाता आईडी।                                                                                             |
| `webSearchProviders`             | `string[]` | इस Plugin के स्वामित्व वाली वेब-सर्च प्रदाता आईडी।                                                                                            |
| `workerProviders`                | `string[]` | प्रावधान और प्रोफ़ाइल-समर्थित लीज़ जीवनचक्र के लिए इस Plugin के स्वामित्व वाली क्लाउड-वर्कर प्रदाता आईडी।                                      |
| `usageProviders`                 | `string[]` | वे प्रदाता आईडी जिनके उपयोग-प्रमाणीकरण और उपयोग-स्नैपशॉट हुक का स्वामित्व इस Plugin के पास है।                                                             |
| `migrationProviders`             | `string[]` | `openclaw migrate` के लिए इस Plugin के स्वामित्व वाली आयात प्रदाता आईडी।                                                                         |
| `gatewayMethodDispatch`          | `string[]` | प्रमाणीकृत Plugin HTTP रूट के लिए आरक्षित अधिकार, जो प्रक्रिया के भीतर Gateway विधियाँ डिस्पैच करते हैं।                                  |
| `tools`                          | `string[]` | इस Plugin के स्वामित्व वाले एजेंट टूल नाम।                                                                                                   |

`contracts.embeddedExtensionFactories` को केवल बंडल किए गए Codex ऐप-सर्वर एक्सटेंशन फ़ैक्टरी के लिए रखा गया है। इसके बजाय बंडल किए गए टूल-परिणाम रूपांतरणों को `contracts.agentToolResultMiddleware` घोषित करना और `api.registerAgentToolResultMiddleware(...)` के साथ पंजीकृत करना चाहिए। इंस्टॉल किए गए Plugin केवल स्पष्ट रूप से सक्षम होने पर और केवल उन रनटाइम के लिए समान मिडलवेयर सीम का उपयोग कर सकते हैं, जिन्हें वे `contracts.agentToolResultMiddleware` में घोषित करते हैं।

जिन इंस्टॉल किए गए Plugin को होस्ट-विश्वसनीय प्री-टूल नीति स्तर की आवश्यकता है, उन्हें प्रत्येक पंजीकृत स्थानीय आईडी को `contracts.trustedToolPolicies` में घोषित करना और स्पष्ट रूप से सक्षम होना चाहिए। बंडल किए गए Plugin मौजूदा विश्वसनीय-नीति पथ बनाए रखते हैं, लेकिन अघोषित नीति आईडी वाले इंस्टॉल किए गए Plugin पंजीकरण से पहले अस्वीकार कर दिए जाते हैं। नीति आईडी पंजीकरण करने वाले Plugin के दायरे में होती हैं, इसलिए दो Plugin दोनों `workflow-budget` को घोषित और पंजीकृत कर सकते हैं; कोई एकल Plugin समान स्थानीय आईडी को दो बार पंजीकृत नहीं कर सकता।

रनटाइम `api.registerTool(...)` पंजीकरणों का `contracts.tools` से मेल खाना आवश्यक है। टूल खोज इस सूची का उपयोग केवल उन Plugin रनटाइम को लोड करने के लिए करती है, जो अनुरोधित टूल के स्वामी हो सकते हैं।

`resolveExternalAuthProfiles` लागू करने वाले प्रदाता Plugin को `contracts.externalAuthProviders` घोषित करना चाहिए; अघोषित बाहरी-प्रमाणीकरण हुक अनदेखे किए जाते हैं।

`resolveUsageAuth` और `fetchUsageSnapshot` दोनों लागू करने वाले प्रदाता Plugin को प्रत्येक स्वतः खोजी गई प्रदाता आईडी को `contracts.usageProviders` में घोषित करना चाहिए। उपयोग खोज रनटाइम कोड लोड करने से पहले इस अनुबंध को पढ़ती है, फिर केवल घोषित स्वामियों को लोड करने के बाद दोनों हुक सत्यापित करती है।

सामान्य एम्बेडिंग प्रदाताओं को `api.registerEmbeddingProvider(...)` के साथ पंजीकृत प्रत्येक अडैप्टर के लिए `contracts.embeddingProviders` घोषित करना चाहिए। मेमोरी खोज द्वारा उपयोग किए जाने वाले प्रदाताओं सहित पुनः उपयोग योग्य वेक्टर जनरेशन के लिए सामान्य अनुबंध का उपयोग करें। `contracts.memoryEmbeddingProviders` अप्रचलित मेमोरी-विशिष्ट संगतता है और केवल तब तक रहता है, जब तक मौजूदा प्रदाता सामान्य एम्बेडिंग प्रदाता सीम पर माइग्रेट नहीं हो जाते।

वर्कर प्रदाताओं को प्रत्येक `api.registerWorkerProvider(...)` आईडी को `contracts.workerProviders` में घोषित करना होगा। कोर `provision` को कॉल करने से पहले स्थायी आशय सहेजता है; प्रदाता बाहरी आवंटन से पहले अपनी सेटिंग सत्यापित करते हैं, और समान ऑपरेशन आईडी वाले दोहराए गए कॉल को समान लीज़ अपनानी होगी। कोर उस सत्यापित सेटिंग स्नैपशॉट को भी सहेजता है और नामित प्रोफ़ाइल बदले या हटाए जाने के बाद भी उसे `leaseId` के साथ `inspect({ leaseId, profile })` और `destroy({ leaseId, profile })` को भेजता है। विनाश आइडेम्पोटेंट है, निरीक्षण बंद `active` / `destroyed` / `unknown` स्थिति यूनियन लौटाता है, और SSH निजी-कुंजी सामग्री को केवल `SecretRef` के माध्यम से संदर्भित किया जाता है। प्रावधान किए गए SSH एंडपॉइंट में विश्वसनीय प्रावधान आउटपुट से एक सार्वजनिक `hostKey` भी ठीक `algorithm base64` के रूप में शामिल होना चाहिए, बिना होस्टनाम या टिप्पणी के, ताकि कोर कनेक्ट होने से पहले होस्ट को पिन कर सके। गतिशील पहचान संदर्भ जारी करने वाले प्रदाता प्रामाणिक `resolveSshIdentity({ leaseId, profile, keyRef })` लागू कर सकते हैं; इसके बिना प्रदाता कोर के सामान्य सीक्रेट रिज़ॉल्वर का उपयोग करते हैं। एक प्रामाणिक `unknown` सक्रिय स्थानीय रिकॉर्ड को अनाथ कर देता है; स्थायी विनाश अनुरोध के बाद यह विघटन की पुष्टि करता है।

`contracts.gatewayMethodDispatch` वर्तमान में `"authenticated-request"` स्वीकार करता है। यह उन नेटिव Plugin HTTP रूटों के लिए एक API स्वच्छता गेट है जो जानबूझकर Gateway कंट्रोल-प्लेन विधियों को इन-प्रोसेस डिस्पैच करते हैं, दुर्भावनापूर्ण नेटिव Plugins के विरुद्ध सैंडबॉक्स नहीं। इसका उपयोग केवल कड़ी समीक्षा वाले बंडल किए गए/ऑपरेटर सरफ़ेसों के लिए करें, जिन्हें पहले से Gateway HTTP प्रमाणीकरण की आवश्यकता होती है। Gateway रूट-वर्क प्रवेश बंद होने पर भी कोई अधिकार-प्राप्त रूट केवल तभी पहुँच योग्य रहता है, जब वह `auth: "gateway"` और रूट-विशिष्ट `gatewayRuntimeScopeSurface: "trusted-operator"` भी घोषित करता है; उसी Plugin के सामान्य सहोदर रूट प्रवेश सीमा के पीछे बने रहते हैं। इससे पूरे Plugin को प्रवेश बायपास दिए बिना निलंबन स्थिति और पुनः आरंभ तक पहुँच बनी रहती है। पार्सिंग और प्रतिक्रिया संरचना को डिस्पैच के बाहर सीमित रखें; महत्वपूर्ण या परिवर्तनकारी कार्य Gateway विधि डिस्पैच से होकर जाना चाहिए, जो प्रवेश और स्कोप प्रवर्तन का स्वामी है।

## configContracts संदर्भ

मैनिफ़ेस्ट-स्वामित्व वाले उस कॉन्फ़िग व्यवहार के लिए `configContracts` का उपयोग करें, जिसकी सामान्य कोर सहायकों को Plugin रनटाइम आयात किए बिना आवश्यकता होती है: खतरनाक फ़्लैग की पहचान, SecretRef माइग्रेशन लक्ष्य और पुराने कॉन्फ़िग-पथ का संकुचन।

```json
{
  "configContracts": {
    "compatibilityMigrationPaths": ["legacyProvider"],
    "compatibilityRuntimePaths": ["legacyProvider.webhook"],
    "dangerousFlags": [
      {
        "path": "accounts.*.allowUnverifiedSenders",
        "equals": true
      }
    ],
    "secretInputs": {
      "bundledDefaultEnabled": false,
      "paths": [
        {
          "path": "routes.*.secret",
          "expected": "string",
          "ownerKind": "route"
        }
      ]
    }
  }
}
```

| फ़ील्ड                         | आवश्यक | प्रकार       | इसका अर्थ                                                                                                                                                                                                                          |
| ----------------------------- | -------- | ---------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `compatibilityMigrationPaths` | नहीं       | `string[]` | रूट-सापेक्ष कॉन्फ़िग पथ, जो संकेत देते हैं कि इस Plugin के सेटअप-समय संगतता माइग्रेशन लागू हो सकते हैं। जब कॉन्फ़िग में Plugin का कोई संदर्भ न हो, तो सामान्य रनटाइम कॉन्फ़िग रीड को प्रत्येक Plugin सेटअप सरफ़ेस छोड़ने देता है।                 |
| `compatibilityRuntimePaths`   | नहीं       | `string[]` | रूट-सापेक्ष संगतता पथ, जिन्हें यह Plugin, Plugin कोड पूरी तरह सक्रिय होने से पहले रनटाइम के दौरान संभाल सकता है। इसका उपयोग उन पुराने सरफ़ेसों के लिए करें, जिन्हें प्रत्येक संगत Plugin रनटाइम आयात किए बिना बंडल किए गए प्रत्याशी समूहों को सीमित करना चाहिए। |
| `dangerousFlags`              | नहीं       | `object[]` | वे कॉन्फ़िग लिटरल, जिन्हें सक्षम होने पर `openclaw doctor` को असुरक्षित या खतरनाक के रूप में चिह्नित करना चाहिए। नीचे देखें।                                                                                                                                   |
| `secretInputs`                | नहीं       | `object`   | SecretRef माइग्रेशन, ऑडिट, स्टार्टअप मैटेरियलाइज़ेशन और वैकल्पिक रनटाइम स्वामी पृथक्करण के लिए `plugins.entries.<id>.config` के अंतर्गत कॉन्फ़िग पथ। नीचे देखें।                                                                             |

प्रत्येक `dangerousFlags` प्रविष्टि इसका समर्थन करती है:

| फ़ील्ड    | आवश्यक | प्रकार                                  | इसका अर्थ                                                                                                       |
| -------- | -------- | ------------------------------------- | ------------------------------------------------------------------------------------------------------------------- |
| `path`   | हाँ      | `string`                              | `plugins.entries.<id>.config` के सापेक्ष डॉट से अलग किया गया कॉन्फ़िग पथ। मैप/ऐरे खंडों के लिए `*` वाइल्डकार्ड का समर्थन करता है। |
| `equals` | हाँ      | `string \| number \| boolean \| null` | सटीक लिटरल, जो इस कॉन्फ़िग मान को खतरनाक के रूप में चिह्नित करता है।                                                            |

`secretInputs` इसका समर्थन करता है:

| फ़ील्ड                   | आवश्यक | प्रकार       | इसका अर्थ                                                                                                                                                                                                                                                                                                                                              |
| ----------------------- | -------- | ---------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `bundledDefaultEnabled` | नहीं       | `boolean`  | यह तय करते समय कि यह SecretRef सरफ़ेस सक्रिय है या नहीं, बंडल किए गए Plugin की डिफ़ॉल्ट सक्षमता को ओवरराइड करें। इसका उपयोग तब करें, जब Plugin बंडल किया गया हो, लेकिन कॉन्फ़िग में स्पष्ट रूप से सक्षम किए जाने तक सरफ़ेस निष्क्रिय रहना चाहिए।                                                                                                                                            |
| `paths`                 | हाँ      | `object[]` | सीक्रेट-रूपी कॉन्फ़िग पथ, प्रत्येक में `path` (डॉट से अलग किया गया, `plugins.entries.<id>.config` के सापेक्ष, `*` वाइल्डकार्ड समर्थित), वैकल्पिक `expected` (वर्तमान में केवल `"string"`) और वैकल्पिक `ownerKind` (वर्तमान में केवल `"route"`)। रिज़ॉल्यूशन विफल होने पर घोषित स्वामी केवल उसी सटीक मेल खाने वाले पथ को पृथक करता है; उसका स्वामी आईडी पूर्ण कॉन्फ़िग पथ होता है। |

## mediaUnderstandingProviderMetadata संदर्भ

जब किसी मीडिया-समझ प्रदाता के पास डिफ़ॉल्ट मॉडल, स्वचालित प्रमाणीकरण फ़ॉलबैक प्राथमिकता या नेटिव दस्तावेज़ समर्थन हो, जिसकी सामान्य कोर सहायकों को रनटाइम लोड होने से पहले आवश्यकता होती है, तब `mediaUnderstandingProviderMetadata` का उपयोग करें। कुंजियाँ `contracts.mediaUnderstandingProviders` में भी घोषित होनी चाहिए।

```json
{
  "contracts": {
    "mediaUnderstandingProviders": ["example"]
  },
  "mediaUnderstandingProviderMetadata": {
    "example": {
      "capabilities": ["image", "audio"],
      "defaultModels": {
        "image": "example-vision-latest",
        "audio": "example-transcribe-latest"
      },
      "autoPriority": {
        "image": 40
      },
      "nativeDocumentInputs": ["pdf"],
      "documentModels": {
        "pdf": {
          "textExtraction": "example-doc-text-latest",
          "image": "example-doc-vision-latest"
        }
      }
    }
  }
}
```

प्रत्येक प्रदाता प्रविष्टि में ये शामिल हो सकते हैं:

| फ़ील्ड                  | प्रकार                                                             | इसका अर्थ                                                                                                   |
| ---------------------- | ---------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------- |
| `capabilities`         | `("image" \| "audio" \| "video")[]`                              | इस प्रदाता द्वारा उपलब्ध कराई गई मीडिया क्षमताएँ।                                                                    |
| `defaultModels`        | `Record<string, string>`                                         | जब कॉन्फ़िग कोई मॉडल निर्दिष्ट नहीं करता, तब उपयोग किए जाने वाले क्षमता-से-मॉडल डिफ़ॉल्ट।                                         |
| `autoPriority`         | `Record<string, number>`                                         | स्वचालित क्रेडेंशियल-आधारित प्रदाता फ़ॉलबैक के लिए छोटी संख्याएँ पहले क्रमबद्ध होती हैं।                                    |
| `nativeDocumentInputs` | `"pdf"[]`                                                        | प्रदाता द्वारा समर्थित नेटिव दस्तावेज़ इनपुट।                                                               |
| `documentModels`       | `{ pdf?: { textExtraction?: string; image?: string \| false } }` | प्रति-दस्तावेज़-प्रकार मॉडल ओवरराइड। उस दस्तावेज़ प्रकार के लिए छवि-आधारित निष्कर्षण अक्षम करने हेतु `image: false` सेट करें। |

## channelConfigs संदर्भ

जब किसी चैनल Plugin को रनटाइम लोड होने से पहले कम लागत वाले कॉन्फ़िग मेटाडेटा की आवश्यकता हो, तब `channelConfigs` का उपयोग करें। जब कोई सेटअप प्रविष्टि उपलब्ध न हो, या जब `setup.requiresRuntime: false` सेटअप रनटाइम को अनावश्यक घोषित करे, तब केवल-पढ़ने योग्य चैनल सेटअप/स्थिति खोज कॉन्फ़िगर किए गए बाहरी चैनलों के लिए सीधे इस मेटाडेटा का उपयोग कर सकती है।

`channelConfigs` Plugin मैनिफ़ेस्ट मेटाडेटा है, कोई नया शीर्ष-स्तरीय उपयोगकर्ता कॉन्फ़िग अनुभाग नहीं। उपयोगकर्ता अब भी चैनल इंस्टेंस को `channels.<channel-id>` के अंतर्गत कॉन्फ़िगर करते हैं। Plugin रनटाइम कोड निष्पादित होने से पहले, OpenClaw यह तय करने के लिए मैनिफ़ेस्ट मेटाडेटा पढ़ता है कि उस कॉन्फ़िगर किए गए चैनल का स्वामी कौन-सा Plugin है।

किसी चैनल Plugin के लिए, `configSchema` और `channelConfigs` अलग-अलग पथों का वर्णन करते हैं:

- `configSchema`, `plugins.entries.<plugin-id>.config` को सत्यापित करता है
- `channelConfigs.<channel-id>.schema`, `channels.<channel-id>` को सत्यापित करता है

`channels[]` घोषित करने वाले गैर-बंडल Plugins को मेल खाती `channelConfigs` प्रविष्टियाँ भी घोषित करनी चाहिए। इनके बिना OpenClaw अब भी Plugin लोड कर सकता है, लेकिन Plugin रनटाइम निष्पादित होने तक कोल्ड-पाथ कॉन्फ़िग स्कीमा, सेटअप और Control UI सरफ़ेस चैनल-स्वामित्व वाले विकल्प का आकार या केवल-प्रदर्शन UI संकेत नहीं जान सकते।

`channelConfigs.<channel-id>.commands.nativeCommandsAutoEnabled` और `nativeSkillsAutoEnabled` कमांड कॉन्फ़िग जाँचों के लिए स्थिर `auto` डिफ़ॉल्ट घोषित कर सकते हैं, जो चैनल रनटाइम लोड होने से पहले चलती हैं। बंडल किए गए चैनल अपने अन्य पैकेज-स्वामित्व वाले चैनल कैटलॉग मेटाडेटा के साथ `package.json#openclaw.channel.commands` के माध्यम से भी वही डिफ़ॉल्ट प्रकाशित कर सकते हैं।

```json
{
  "channelConfigs": {
    "matrix": {
      "schema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "homeserverUrl": { "type": "string" }
        }
      },
      "uiHints": {
        "homeserverUrl": {
          "label": "Homeserver URL",
          "placeholder": "https://matrix.example.com"
        }
      },
      "label": "Matrix",
      "description": "Matrix homeserver connection",
      "commands": {
        "nativeCommandsAutoEnabled": true,
        "nativeSkillsAutoEnabled": true
      },
      "preferOver": ["matrix-legacy"]
    }
  }
}
```

प्रत्येक चैनल प्रविष्टि में ये शामिल हो सकते हैं:

| फ़ील्ड         | प्रकार                     | इसका अर्थ                                                                                                    |
| ------------- | ------------------------ | ---------------------------------------------------------------------------------------------------------------- |
| `schema`      | `object`                 | `channels.<id>` के लिए JSON Schema। प्रत्येक घोषित चैनल कॉन्फ़िग प्रविष्टि के लिए आवश्यक।                                |
| `uiHints`     | `Record<string, object>` | उस चैनल कॉन्फ़िग अनुभाग के लिए वैकल्पिक लेबल, प्लेसहोल्डर, संवेदनशीलता और केवल-प्रदर्शन प्रस्तुति संकेत। |
| `label`       | `string`                 | रनटाइम मेटाडेटा तैयार न होने पर पिकर और निरीक्षण सरफ़ेसों में मर्ज किया गया चैनल लेबल।                        |
| `description` | `string`                 | निरीक्षण और कैटलॉग सरफ़ेसों के लिए संक्षिप्त चैनल विवरण।                                                      |
| `commands`    | `object`                 | रनटाइम-पूर्व कॉन्फ़िग जाँचों के लिए स्थिर नेटिव कमांड और नेटिव Skills स्वचालित डिफ़ॉल्ट।                              |
| `preferOver`  | `string[]`               | पुराने या कम प्राथमिकता वाले Plugin आईडी, जिनसे इस चैनल को चयन सरफ़ेसों में ऊपर स्थान मिलना चाहिए।                           |

### किसी अन्य चैनल Plugin को प्रतिस्थापित करना

जब आपका Plugin ऐसे चैनल आईडी का पसंदीदा स्वामी हो, जिसे कोई अन्य Plugin भी प्रदान कर सकता है, तब `preferOver` का उपयोग करें। सामान्य मामलों में बदला हुआ Plugin आईडी, बंडल किए गए Plugin का स्थान लेने वाला स्टैंडअलोन Plugin, या कॉन्फ़िग संगतता के लिए वही चैनल आईडी बनाए रखने वाला अनुरक्षित फ़ोर्क शामिल हैं।

```json
{
  "id": "acme-chat",
  "channels": ["chat"],
  "channelConfigs": {
    "chat": {
      "schema": {
        "type": "object",
        "additionalProperties": false,
        "properties": {
          "webhookUrl": { "type": "string" }
        }
      },
      "preferOver": ["chat"]
    }
  }
}
```

जब `channels.chat` कॉन्फ़िगर किया जाता है, तो OpenClaw चैनल आईडी और पसंदीदा Plugin आईडी, दोनों पर विचार करता है। यदि कम-प्राथमिकता वाला Plugin केवल इसलिए चुना गया था क्योंकि वह बंडल में शामिल है या डिफ़ॉल्ट रूप से सक्षम है, तो OpenClaw प्रभावी रनटाइम कॉन्फ़िगरेशन में उसे अक्षम कर देता है, ताकि एक Plugin चैनल और उसके टूल का स्वामी हो। स्पष्ट उपयोगकर्ता चयन फिर भी प्रभावी रहता है: यदि उपयोगकर्ता दोनों Plugin को स्पष्ट रूप से सक्षम करता है (`plugins.allow` या किसी वास्तविक `plugins.entries` कॉन्फ़िगरेशन के माध्यम से), तो OpenClaw उस चयन को बनाए रखता है और अनुरोधित Plugin समूह को चुपचाप बदलने के बजाय डुप्लिकेट चैनल/टूल निदान रिपोर्ट करता है।

`preferOver` को केवल उन Plugin आईडी तक सीमित रखें जो वास्तव में वही चैनल प्रदान कर सकती हैं। यह कोई सामान्य प्राथमिकता फ़ील्ड नहीं है और यह उपयोगकर्ता कॉन्फ़िगरेशन कुंजियों का नाम नहीं बदलता।

## modelSupport संदर्भ

जब Plugin रनटाइम लोड होने से पहले OpenClaw को `gpt-5.6-sol` या `claude-sonnet-4.6` जैसी संक्षिप्त मॉडल आईडी से आपके प्रदाता Plugin का अनुमान लगाना चाहिए, तब `modelSupport` का उपयोग करें।

```json
{
  "modelSupport": {
    "modelPrefixes": ["gpt-", "o1", "o3", "o4"],
    "modelPatterns": ["^computer-use-preview"]
  }
}
```

OpenClaw यह वरीयता क्रम लागू करता है:

- स्पष्ट `provider/model` संदर्भ स्वामी `providers` की मैनिफ़ेस्ट मेटाडेटा का उपयोग करते हैं
- `modelPatterns`, `modelPrefixes` से अधिक प्राथमिकता रखते हैं
- यदि एक गैर-बंडल Plugin और एक बंडल Plugin, दोनों मेल खाते हैं, तो गैर-बंडल Plugin को प्राथमिकता मिलती है
- शेष अस्पष्टता को तब तक अनदेखा किया जाता है, जब तक उपयोगकर्ता या कॉन्फ़िगरेशन किसी प्रदाता को निर्दिष्ट नहीं करता

फ़ील्ड:

| फ़ील्ड           | प्रकार       | इसका अर्थ                                                                   |
| --------------- | ---------- | ------------------------------------------------------------------------------- |
| `modelPrefixes` | `string[]` | संक्षिप्त मॉडल आईडी के विरुद्ध `startsWith` से मिलाए गए उपसर्ग।                 |
| `modelPatterns` | `string[]` | प्रोफ़ाइल प्रत्यय हटाने के बाद संक्षिप्त मॉडल आईडी से मिलाए गए रेगेक्स स्रोत। |

`modelPatterns` प्रविष्टियों को `compileSafeRegex` के माध्यम से संकलित किया जाता है, जो नेस्टेड पुनरावृत्ति वाले पैटर्न (उदाहरण के लिए `(a+)+$`) को अस्वीकार करता है। सुरक्षा जाँच में विफल होने वाले पैटर्न को वाक्य-विन्यास की दृष्टि से अमान्य रेगेक्स की तरह चुपचाप छोड़ दिया जाता है। पैटर्न सरल रखें और नेस्टेड क्वांटिफ़ायर से बचें।

## modelCatalog संदर्भ

जब Plugin रनटाइम लोड करने से पहले OpenClaw को प्रदाता मॉडल मेटाडेटा की जानकारी होनी चाहिए, तब `modelCatalog` का उपयोग करें। यह स्थिर कैटलॉग पंक्तियों, प्रदाता उपनामों, दमन नियमों और खोज मोड के लिए मैनिफ़ेस्ट-स्वामित्व वाला स्रोत है। रनटाइम रीफ़्रेश अब भी प्रदाता रनटाइम कोड के अंतर्गत आता है, लेकिन मैनिफ़ेस्ट कोर को बताता है कि रनटाइम कब आवश्यक है।

```json
{
  "providers": ["openai"],
  "modelCatalog": {
    "providers": {
      "openai": {
        "baseUrl": "https://api.openai.com/v1",
        "api": "openai-responses",
        "models": [
          {
            "id": "gpt-5.4",
            "name": "GPT-5.4",
            "input": ["text", "image"],
            "reasoning": true,
            "contextWindow": 256000,
            "maxTokens": 128000,
            "cost": {
              "input": 1.25,
              "output": 10,
              "cacheRead": 0.125
            },
            "status": "available",
            "tags": ["default"]
          }
        ]
      }
    },
    "aliases": {
      "azure-openai-responses": {
        "provider": "openai",
        "api": "azure-openai-responses"
      }
    },
    "suppressions": [
      {
        "provider": "azure-openai-responses",
        "model": "gpt-5.3-codex-spark",
        "reason": "not available on Azure OpenAI Responses"
      }
    ],
    "discovery": {
      "openai": "static"
    }
  }
}
```

शीर्ष-स्तरीय फ़ील्ड:

| फ़ील्ड            | प्रकार                                                     | इसका अर्थ                                                                                               |
| ---------------- | -------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------- |
| `providers`      | `Record<string, object>`                                 | इस Plugin के स्वामित्व वाली प्रदाता आईडी के लिए कैटलॉग पंक्तियाँ। कुंजियाँ शीर्ष-स्तरीय `providers` में भी दिखाई देनी चाहिए।       |
| `aliases`        | `Record<string, object>`                                 | प्रदाता उपनाम, जिन्हें कैटलॉग या दमन योजना के लिए किसी स्वामित्व वाले प्रदाता में रिज़ॉल्व होना चाहिए।              |
| `suppressions`   | `object[]`                                               | किसी अन्य स्रोत की मॉडल पंक्तियाँ, जिन्हें यह Plugin प्रदाता-विशिष्ट कारण से दबाता है।                  |
| `discovery`      | `Record<string, "static" \| "refreshable" \| "runtime">` | क्या प्रदाता कैटलॉग को मैनिफ़ेस्ट मेटाडेटा से पढ़ा जा सकता है, कैश में रीफ़्रेश किया जा सकता है, या उसे रनटाइम की आवश्यकता है। |
| `runtimeAugment` | `boolean`                                                | केवल तभी `true` पर सेट करें, जब प्रदाता रनटाइम को मैनिफ़ेस्ट/कॉन्फ़िगरेशन योजना के बाद कैटलॉग पंक्तियाँ जोड़नी हों।       |

`aliases` मॉडल-कैटलॉग योजना के लिए प्रदाता स्वामित्व खोज में भाग लेता है। उपनाम लक्ष्य उसी Plugin के स्वामित्व वाले शीर्ष-स्तरीय प्रदाता होने चाहिए। जब प्रदाता-फ़िल्टर की गई सूची किसी उपनाम का उपयोग करती है, तो OpenClaw प्रदाता रनटाइम लोड किए बिना स्वामी मैनिफ़ेस्ट को पढ़ सकता है और उपनाम के API/आधार URL ओवरराइड लागू कर सकता है। उपनाम बिना फ़िल्टर वाली कैटलॉग सूचियों का विस्तार नहीं करते; व्यापक सूचियाँ केवल स्वामी की कैनोनिकल प्रदाता पंक्तियाँ उत्सर्जित करती हैं।

`suppressions` पुराने प्रदाता रनटाइम `suppressBuiltInModel` हुक का स्थान लेता है। दमन प्रविष्टियों का पालन केवल तभी किया जाता है, जब प्रदाता Plugin के स्वामित्व में हो या उसे ऐसी `modelCatalog.aliases` कुंजी के रूप में घोषित किया गया हो जो किसी स्वामित्व वाले प्रदाता को लक्षित करती है। मॉडल रिज़ॉल्यूशन के दौरान अब रनटाइम दमन हुक नहीं बुलाए जाते।

प्रदाता फ़ील्ड:

| फ़ील्ड                 | प्रकार                     | इसका अर्थ                                                                                                                                                                                                     |
| --------------------- | ------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `baseUrl`             | `string`                 | इस प्रदाता कैटलॉग के मॉडलों के लिए वैकल्पिक डिफ़ॉल्ट आधार URL।                                                                                                                                                    |
| `api`                 | `ModelApi`               | इस प्रदाता कैटलॉग के मॉडलों के लिए वैकल्पिक डिफ़ॉल्ट API अडैप्टर।                                                                                                                                                 |
| `headers`             | `Record<string, string>` | इस प्रदाता कैटलॉग पर लागू होने वाले वैकल्पिक स्थिर हेडर।                                                                                                                                                      |
| `defaultUtilityModel` | `string`                 | छोटे आंतरिक उपयोगिता कार्यों (शीर्षक, प्रगति विवरण) के लिए वैकल्पिक प्रदाता-अनुशंसित लघु मॉडल आईडी। इसका उपयोग तब किया जाता है, जब `agents.defaults.utilityModel` सेट न हो और यह प्रदाता एजेंट के प्राथमिक मॉडल को सेवा देता हो। |
| `models`              | `object[]`               | आवश्यक मॉडल पंक्तियाँ। `id` के बिना पंक्तियों को अनदेखा किया जाता है।                                                                                                                                                            |

मॉडल फ़ील्ड:

| फ़ील्ड              | प्रकार                                                           | इसका अर्थ                                                               |
| ------------------ | -------------------------------------------------------------- | --------------------------------------------------------------------------- |
| `id`               | `string`                                                       | `provider/` उपसर्ग के बिना प्रदाता-स्थानीय मॉडल आईडी।                    |
| `name`             | `string`                                                       | वैकल्पिक प्रदर्शन नाम।                                                      |
| `api`              | `ModelApi`                                                     | वैकल्पिक प्रति-मॉडल API ओवरराइड।                                            |
| `baseUrl`          | `string`                                                       | वैकल्पिक प्रति-मॉडल आधार URL ओवरराइड।                                       |
| `headers`          | `Record<string, string>`                                       | वैकल्पिक प्रति-मॉडल स्थिर हेडर।                                          |
| `input`            | `Array<"text" \| "image" \| "document">`                       | मॉडल द्वारा स्वीकार की जाने वाली मोडैलिटी। अन्य मान चुपचाप हटा दिए जाते हैं।            |
| `reasoning`        | `boolean`                                                      | क्या मॉडल तर्क-क्षमता व्यवहार प्रदान करता है।                               |
| `contextWindow`    | `number`                                                       | प्रदाता का मूल कॉन्टेक्स्ट विंडो।                                             |
| `contextTokens`    | `number`                                                       | `contextWindow` से भिन्न होने पर वैकल्पिक प्रभावी रनटाइम कॉन्टेक्स्ट सीमा। |
| `maxTokens`        | `number`                                                       | ज्ञात होने पर अधिकतम आउटपुट टोकन।                                           |
| `thinkingLevelMap` | `Record<string, string \| null>`                               | वैकल्पिक प्रति-विचार-स्तर मॉडल-आईडी या पैरामीटर ओवरराइड।                    |
| `cost`             | `object`                                                       | वैकल्पिक `tieredPricing` सहित, प्रति दस लाख टोकन वैकल्पिक USD मूल्य निर्धारण। |
| `compat`           | `object`                                                       | OpenClaw मॉडल कॉन्फ़िगरेशन संगतता से मेल खाने वाले वैकल्पिक संगतता फ़्लैग।  |
| `mediaInput`       | `object`                                                       | वैकल्पिक प्रति-मोडैलिटी इनपुट कॉन्फ़िगरेशन, वर्तमान में केवल चित्र।                   |
| `status`           | `"available"` \| `"preview"` \| `"deprecated"` \| `"disabled"` | सूचीकरण स्थिति। केवल तभी दबाएँ, जब पंक्ति बिल्कुल दिखाई नहीं देनी चाहिए।          |
| `statusReason`     | `string`                                                       | अनुपलब्ध स्थिति के साथ दिखाया जाने वाला वैकल्पिक कारण।                            |
| `replaces`         | `string[]`                                                     | पुराने प्रदाता-स्थानीय मॉडल आईडी, जिनका स्थान यह मॉडल लेता है।                       |
| `replacedBy`       | `string`                                                       | अप्रचलित पंक्तियों के लिए प्रतिस्थापन प्रदाता-स्थानीय मॉडल आईडी।                    |
| `tags`             | `string[]`                                                     | चयनकर्ताओं और फ़िल्टर द्वारा उपयोग किए जाने वाले स्थिर टैग।                                    |

दमन फ़ील्ड:

| फ़ील्ड                      | प्रकार       | इसका अर्थ                                                                                             |
| -------------------------- | ---------- | --------------------------------------------------------------------------------------------------------- |
| `provider`                 | `string`   | दबाने के लिए अपस्ट्रीम पंक्ति की प्रोवाइडर आईडी। इसका स्वामित्व इस Plugin के पास होना चाहिए या इसे स्वामित्व वाले उपनाम के रूप में घोषित किया जाना चाहिए। |
| `model`                    | `string`   | दबाने के लिए प्रोवाइडर-स्थानीय मॉडल आईडी।                                                                      |
| `reason`                   | `string`   | दबाई गई पंक्ति का सीधे अनुरोध किए जाने पर दिखाया जाने वाला वैकल्पिक संदेश।                                     |
| `when.baseUrlHosts`        | `string[]` | दबाव लागू होने से पहले आवश्यक प्रभावी प्रोवाइडर बेस URL होस्ट की वैकल्पिक सूची।               |
| `when.providerConfigApiIn` | `string[]` | दबाव लागू होने से पहले आवश्यक सटीक प्रोवाइडर-कॉन्फ़िग `api` मानों की वैकल्पिक सूची।              |

केवल रनटाइम के डेटा को `modelCatalog` में न रखें। `static` का उपयोग केवल तब करें, जब मैनिफ़ेस्ट पंक्तियाँ इतनी पूर्ण हों कि प्रोवाइडर-फ़िल्टर की गई सूची और पिकर सतहें रजिस्ट्री/रनटाइम खोज को छोड़ सकें। `refreshable` का उपयोग तब करें, जब मैनिफ़ेस्ट पंक्तियाँ सूचीबद्ध किए जा सकने वाले उपयोगी प्रारंभिक डेटा या पूरक हों, लेकिन रीफ़्रेश/कैश बाद में और पंक्तियाँ जोड़ सके; रीफ़्रेश की जा सकने वाली पंक्तियाँ अपने आप में प्रामाणिक नहीं होतीं। `runtime` का उपयोग तब करें, जब सूची जानने के लिए OpenClaw को प्रोवाइडर रनटाइम लोड करना आवश्यक हो।

## modelIdNormalization संदर्भ

कम लागत वाली, प्रोवाइडर-स्वामित्व वाली मॉडल-आईडी सफ़ाई के लिए `modelIdNormalization` का उपयोग करें, जिसे प्रोवाइडर रनटाइम लोड होने से पहले होना आवश्यक है। इससे छोटे मॉडल नामों, प्रोवाइडर-स्थानीय लेगेसी आईडी और प्रॉक्सी प्रीफ़िक्स नियमों जैसे उपनाम कोर मॉडल-चयन तालिकाओं के बजाय स्वामी Plugin मैनिफ़ेस्ट में रहते हैं।

```json
{
  "providers": ["anthropic", "openrouter"],
  "modelIdNormalization": {
    "providers": {
      "anthropic": {
        "aliases": {
          "sonnet-4.6": "claude-sonnet-4-6"
        }
      },
      "openrouter": {
        "prefixWhenBare": "openrouter"
      }
    }
  }
}
```

प्रोवाइडर फ़ील्ड:

| फ़ील्ड                                | प्रकार                    | इसका अर्थ                                                                             |
| ------------------------------------ | ----------------------- | ----------------------------------------------------------------------------------------- |
| `aliases`                            | `Record<string,string>` | केस-असंवेदी सटीक मॉडल-आईडी उपनाम। मान लिखे गए रूप में ही लौटाए जाते हैं।                  |
| `stripPrefixes`                      | `string[]`              | उपनाम खोज से पहले हटाए जाने वाले प्रीफ़िक्स, जो लेगेसी प्रोवाइडर/मॉडल दोहराव के लिए उपयोगी हैं।     |
| `prefixWhenBare`                     | `string`                | जब सामान्यीकृत मॉडल आईडी में पहले से `/` न हो, तब जोड़ा जाने वाला प्रीफ़िक्स।                  |
| `prefixWhenBareAfterAliasStartsWith` | `object[]`              | उपनाम खोज के बाद सशर्त बेयर-आईडी प्रीफ़िक्स नियम, जिन्हें `modelPrefix` और `prefix` द्वारा कुंजीबद्ध किया जाता है। |

## providerEndpoints संदर्भ

एंडपॉइंट वर्गीकरण के लिए `providerEndpoints` का उपयोग करें, जिसे सामान्य अनुरोध नीति को प्रोवाइडर रनटाइम लोड होने से पहले जानना आवश्यक है। प्रत्येक `endpointClass` का अर्थ अब भी कोर के स्वामित्व में है; होस्ट और बेस URL मेटाडेटा Plugin मैनिफ़ेस्ट के स्वामित्व में है।

आधिकारिक रूप से बाहरी किए गए प्रोवाइडर Plugin कोर डिस्ट्रीब्यूशन से बाहर रखे जाते हैं, इसलिए
इंस्टॉल होने तक उनके मैनिफ़ेस्ट दिखाई नहीं देते। उनके `providerEndpoints` को
`scripts/lib/official-external-provider-catalog.json` में भी प्रतिबिंबित किया जाना चाहिए, ताकि
Plugin के बिना भी एंडपॉइंट वर्गीकरण कार्य करता रहे; एक अनुबंध परीक्षण
इस प्रतिबिंब को लागू करता है।

एंडपॉइंट फ़ील्ड:

| फ़ील्ड                          | प्रकार       | इसका अर्थ                                                                                  |
| ------------------------------ | ---------- | ---------------------------------------------------------------------------------------------- |
| `endpointClass`                | `string`   | ज्ञात कोर एंडपॉइंट वर्ग, जैसे `openrouter`, `moonshot-native` या `google-vertex`।        |
| `hosts`                        | `string[]` | एंडपॉइंट वर्ग से मैप होने वाले सटीक होस्टनाम।                                                |
| `hostSuffixes`                 | `string[]` | एंडपॉइंट वर्ग से मैप होने वाले होस्ट प्रत्यय। केवल डोमेन-प्रत्यय मिलान के लिए `.` से शुरू करें। |
| `baseUrls`                     | `string[]` | एंडपॉइंट वर्ग से मैप होने वाले सटीक सामान्यीकृत HTTP(S) बेस URL।                             |
| `googleVertexRegion`           | `string`   | सटीक वैश्विक होस्ट के लिए स्थिर Google Vertex क्षेत्र।                                            |
| `googleVertexRegionHostSuffix` | `string`   | Google Vertex क्षेत्र प्रीफ़िक्स दिखाने के लिए मेल खाने वाले होस्ट से हटाया जाने वाला प्रत्यय।                 |

## providerRequest संदर्भ

कम लागत वाले अनुरोध-संगतता मेटाडेटा के लिए `providerRequest` का उपयोग करें, जिसकी सामान्य अनुरोध नीति को प्रोवाइडर रनटाइम लोड किए बिना आवश्यकता होती है। व्यवहार-विशिष्ट पेलोड पुनर्लेखन को प्रोवाइडर रनटाइम हुक या साझा प्रोवाइडर-परिवार हेल्पर में रखें।

```json
{
  "providerRequest": {
    "providers": {
      "vllm": {
        "family": "vllm",
        "openAICompletions": {
          "supportsStreamingUsage": true
        }
      }
    }
  }
}
```

प्रोवाइडर फ़ील्ड:

| फ़ील्ड                 | प्रकार         | इसका अर्थ                                                                          |
| --------------------- | ------------ | -------------------------------------------------------------------------------------- |
| `family`              | `string`     | सामान्य अनुरोध संगतता निर्णयों और निदान द्वारा उपयोग किया जाने वाला प्रोवाइडर परिवार लेबल। |
| `compatibilityFamily` | `"moonshot"` | साझा अनुरोध हेल्पर के लिए वैकल्पिक प्रोवाइडर-परिवार संगतता बकेट।              |
| `openAICompletions`   | `object`     | OpenAI-संगत कम्प्लीशन अनुरोध फ़्लैग, वर्तमान में `supportsStreamingUsage`।       |

## secretProviderIntegrations संदर्भ

जब कोई Plugin पुनः उपयोग योग्य SecretRef exec प्रोवाइडर प्रीसेट प्रकाशित कर सकता हो, तब `secretProviderIntegrations` का उपयोग करें। OpenClaw, Plugin रनटाइम लोड होने से पहले यह मेटाडेटा पढ़ता है, Plugin स्वामित्व को `secrets.providers.<alias>.pluginIntegration` में संग्रहीत करता है और वास्तविक सीक्रेट समाधान को SecretRef रनटाइम पर छोड़ देता है। प्रीसेट केवल बंडल किए गए Plugin और प्रबंधित Plugin इंस्टॉल रूट से खोजे गए इंस्टॉल किए हुए Plugin, जैसे git और ClawHub इंस्टॉल, के लिए उपलब्ध कराए जाते हैं।

```json
{
  "secretProviderIntegrations": {
    "secret-store": {
      "providerAlias": "team-secrets",
      "displayName": "Team secrets",
      "source": "exec",
      "command": "${node}",
      "args": ["./bin/resolve-secrets.mjs"]
    }
  }
}
```

मैप कुंजी इंटीग्रेशन आईडी है। यदि `providerAlias` छोड़ दिया गया है, तो OpenClaw इंटीग्रेशन आईडी को SecretRef प्रोवाइडर उपनाम के रूप में उपयोग करता है। प्रोवाइडर उपनाम को सामान्य SecretRef प्रोवाइडर उपनाम पैटर्न से मेल खाना चाहिए, उदाहरण के लिए `team-secrets` या `onepassword-work`।

जब कोई ऑपरेटर प्रीसेट चुनता है, तो OpenClaw इस तरह का प्रोवाइडर संदर्भ लिखता है:

```json
{
  "secrets": {
    "providers": {
      "team-secrets": {
        "source": "exec",
        "pluginIntegration": {
          "pluginId": "acme-secrets",
          "integrationId": "secret-store"
        }
      }
    }
  }
}
```

स्टार्टअप/रीलोड पर, OpenClaw वर्तमान Plugin मैनिफ़ेस्ट मेटाडेटा लोड करके, यह जाँचकर कि स्वामी Plugin इंस्टॉल और सक्रिय है, और मैनिफ़ेस्ट से exec कमांड को साकार करके उस प्रोवाइडर को हल करता है। Plugin को अक्षम करने या हटाने से सक्रिय SecretRefs के लिए प्रोवाइडर निरस्त हो जाता है। जो ऑपरेटर स्वतंत्र exec कॉन्फ़िगरेशन चाहते हैं, वे अब भी मैन्युअल `command`/`args` प्रोवाइडर सीधे लिख सकते हैं।

वर्तमान में केवल `source: "exec"` प्रीसेट समर्थित हैं। `command`, `${node}` होना चाहिए और `args[0]`, `./` Plugin-रूट-सापेक्ष रिज़ॉल्वर स्क्रिप्ट होनी चाहिए। OpenClaw स्टार्टअप/रीलोड पर इसे वर्तमान Node एक्ज़ीक्यूटेबल और Plugin के भीतर पूर्ण स्क्रिप्ट पथ में साकार करता है। `--require`, `--import`, `--loader`, `--env-file`, `--eval` और `--print` जैसे Node विकल्प मैनिफ़ेस्ट प्रीसेट अनुबंध का भाग नहीं हैं। जिन ऑपरेटरों को गैर-Node कमांड की आवश्यकता है, वे स्वतंत्र मैन्युअल exec प्रोवाइडर सीधे कॉन्फ़िगर कर सकते हैं।

OpenClaw मैनिफ़ेस्ट प्रीसेट के लिए `trustedDirs` को Plugin रूट से और `${node}` प्रीसेट के लिए वर्तमान Node एक्ज़ीक्यूटेबल डायरेक्टरी से प्राप्त करता है। मैनिफ़ेस्ट में लिखे गए `trustedDirs` को अनदेखा किया जाता है। `timeoutMs`, `noOutputTimeoutMs`, `maxOutputBytes`, `jsonOnly`, `env`, `passEnv` और `allowInsecurePath` जैसे अन्य exec प्रोवाइडर विकल्प सामान्य SecretRef exec प्रोवाइडर कॉन्फ़िगरेशन को यथावत भेजे जाते हैं।

## modelPricing संदर्भ

जब किसी प्रोवाइडर को रनटाइम लोड होने से पहले कंट्रोल-प्लेन मूल्य-निर्धारण व्यवहार की आवश्यकता हो, तब `modelPricing` का उपयोग करें। Gateway मूल्य-निर्धारण कैश प्रोवाइडर रनटाइम कोड आयात किए बिना यह मेटाडेटा पढ़ता है।

```json
{
  "providers": ["ollama", "openrouter"],
  "modelPricing": {
    "providers": {
      "ollama": {
        "external": false
      },
      "openrouter": {
        "openRouter": {
          "passthroughProviderModel": true
        },
        "liteLLM": false
      }
    }
  }
}
```

प्रोवाइडर फ़ील्ड:

| फ़ील्ड        | प्रकार              | इसका अर्थ                                                                                      |
| ------------ | ----------------- | -------------------------------------------------------------------------------------------------- |
| `external`   | `boolean`         | स्थानीय/स्वयं-होस्ट किए गए प्रोवाइडर के लिए `false` सेट करें, जिन्हें कभी भी OpenRouter या LiteLLM मूल्य-निर्धारण प्राप्त नहीं करना चाहिए। |
| `openRouter` | `false \| object` | OpenRouter मूल्य-निर्धारण खोज मैपिंग। `false` इस प्रोवाइडर के लिए OpenRouter खोज अक्षम करता है।           |
| `liteLLM`    | `false \| object` | LiteLLM मूल्य-निर्धारण खोज मैपिंग। `false` इस प्रोवाइडर के लिए LiteLLM खोज अक्षम करता है।                 |

स्रोत फ़ील्ड:

| फ़ील्ड                      | प्रकार               | इसका अर्थ                                                                                                        |
| -------------------------- | ------------------ | -------------------------------------------------------------------------------------------------------------------- |
| `provider`                 | `string`           | जब बाहरी कैटलॉग प्रोवाइडर आईडी OpenClaw प्रोवाइडर आईडी से अलग हो, उदाहरण के लिए किसी `zai` प्रोवाइडर के लिए `z-ai`। |
| `passthroughProviderModel` | `boolean`          | स्लैश वाले मॉडल आईडी को नेस्टेड प्रोवाइडर/मॉडल संदर्भ मानें, जो OpenRouter जैसे प्रॉक्सी प्रोवाइडर के लिए उपयोगी है।       |
| `modelIdTransforms`        | `"version-dots"[]` | अतिरिक्त बाहरी कैटलॉग मॉडल-आईडी प्रकार। `version-dots`, `claude-opus-4.6` जैसे डॉट वाले संस्करण आईडी आज़माता है।            |

### OpenClaw प्रोवाइडर इंडेक्स

OpenClaw प्रोवाइडर इंडेक्स उन प्रोवाइडर के लिए OpenClaw-स्वामित्व वाला पूर्वावलोकन मेटाडेटा है, जिनके Plugin संभवतः अभी इंस्टॉल नहीं हुए हैं। यह किसी Plugin मैनिफ़ेस्ट का भाग नहीं है। Plugin मैनिफ़ेस्ट इंस्टॉल किए गए Plugin के लिए प्रामाणिक स्रोत बने रहते हैं। प्रोवाइडर इंडेक्स वह आंतरिक फ़ॉलबैक अनुबंध है, जिसका उपयोग भविष्य की इंस्टॉल-योग्य प्रोवाइडर और इंस्टॉल-पूर्व मॉडल पिकर सतहें तब करेंगी, जब कोई प्रोवाइडर Plugin इंस्टॉल नहीं है।

कैटलॉग प्रामाणिकता क्रम:

1. उपयोगकर्ता कॉन्फ़िगरेशन।
2. इंस्टॉल किया गया Plugin मैनिफ़ेस्ट `modelCatalog`।
3. स्पष्ट रीफ़्रेश से मॉडल कैटलॉग कैश।
4. OpenClaw प्रोवाइडर इंडेक्स पूर्वावलोकन पंक्तियाँ।

Provider Index में secrets, enabled state, runtime hooks, या live account-specific model data नहीं होना चाहिए। इसके preview catalogs plugin manifests के समान `modelCatalog` provider row shape का उपयोग करते हैं, लेकिन इन्हें स्थिर display metadata तक सीमित रहना चाहिए, जब तक कि `api`, `baseUrl`, pricing, या compatibility flags जैसे runtime adapter fields को जानबूझकर installed plugin manifest के साथ संरेखित न रखा गया हो। live `/models` discovery वाले providers को सामान्य listing या onboarding से provider APIs कॉल कराने के बजाय explicit model catalog cache path के माध्यम से refreshed rows लिखनी चाहिए।

Provider Index entries उन providers के लिए installable-plugin metadata भी रख सकती हैं, जिनका plugin core से बाहर स्थानांतरित हो गया है या किसी अन्य कारण से अभी installed नहीं है। यह metadata channel catalog pattern को प्रतिबिंबित करता है: package name, npm install spec, expected integrity, और सरल auth-choice labels किसी installable setup option को दिखाने के लिए पर्याप्त हैं। plugin install हो जाने के बाद, उसका manifest प्रभावी होता है और उस provider के लिए Provider Index entry की उपेक्षा की जाती है।

`openclaw doctor --fix`, legacy top-level manifest capability keys के एक छोटे, बंद समूह को `contracts.*` में migrate करता है: `speechProviders`, `mediaUnderstandingProviders`, `imageGenerationProviders`, और `tools`। इनमें से किसी को भी (या किसी अन्य capability list को) अब top-level manifest fields के रूप में नहीं पढ़ा जाता; सामान्य manifest loading इन्हें केवल `contracts` के अंतर्गत पहचानती है।

## Manifest बनाम package.json

दोनों files अलग-अलग कार्य करती हैं:

| फ़ाइल                   | इसका उपयोग                                                                                                                       |
| ---------------------- | -------------------------------------------------------------------------------------------------------------------------------- |
| `openclaw.plugin.json` | Discovery, config validation, auth-choice metadata, और ऐसे UI hints जिनका plugin code चलने से पहले उपलब्ध होना आवश्यक है                         |
| `package.json`         | npm metadata, dependency installation, और entrypoints, install gating, setup, या catalog metadata के लिए उपयोग होने वाला `openclaw` block |

यदि यह स्पष्ट न हो कि metadata का कोई भाग कहाँ होना चाहिए, तो इस नियम का उपयोग करें:

- यदि OpenClaw को plugin code load करने से पहले इसकी जानकारी होना आवश्यक है, तो इसे `openclaw.plugin.json` में रखें
- यदि यह packaging, entry files, या npm install behavior से संबंधित है, तो इसे `package.json` में रखें

### discovery को प्रभावित करने वाले package.json fields

कुछ pre-runtime plugin metadata जानबूझकर `openclaw.plugin.json` के बजाय `package.json` में `openclaw` block के अंतर्गत रहता है। `openclaw.bundle` और `openclaw.bundle.json`, OpenClaw plugin contracts नहीं हैं; native plugins को `openclaw.plugin.json` तथा नीचे दिए गए supported `package.json#openclaw` fields का उपयोग करना चाहिए।

महत्वपूर्ण उदाहरण:

| फ़ील्ड                                                                                      | इसका अर्थ                                                                                                                                                                             |
| ------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `openclaw.extensions`                                                                      | native plugin entrypoints घोषित करता है। इन्हें plugin package directory के भीतर ही रहना चाहिए।                                                                                                        |
| `openclaw.runtimeExtensions`                                                               | installed packages के लिए built JavaScript runtime entrypoints घोषित करता है। इन्हें plugin package directory के भीतर ही रहना चाहिए।                                                                      |
| `openclaw.setupEntry`                                                                      | onboarding, deferred channel startup, और read-only channel status/SecretRef discovery के दौरान उपयोग होने वाला lightweight setup-only entrypoint। इसे plugin package directory के भीतर ही रहना चाहिए।      |
| `openclaw.runtimeSetupEntry`                                                               | installed packages के लिए built JavaScript setup entrypoint घोषित करता है। इसके लिए `setupEntry` आवश्यक है, इसका मौजूद होना आवश्यक है, और इसे plugin package directory के भीतर ही रहना चाहिए।                              |
| `openclaw.channel`                                                                         | labels, docs paths, aliases, और selection copy जैसा सरल channel catalog metadata।                                                                                                      |
| `openclaw.channel.approvalFlags`                                                           | runtime load से पहले उपलब्ध बंद approval behavior flags। `native` का अर्थ है कि channel, native approval UI और same-turn resolution का स्वामी है।                                                |
| `openclaw.channel.commands`                                                                | config, audit, और command-list surfaces द्वारा channel runtime load होने से पहले उपयोग किया जाने वाला static native command तथा native skill auto-default metadata।                                               |
| `openclaw.channel.cliAddOptions`                                                           | Plugin के स्वामित्व वाले `openclaw channels add` options। प्रत्येक entry, `flags`, `description`, वैकल्पिक `defaultValue`, और generic input coercion के लिए वैकल्पिक `valueType` (`int` या `list`) घोषित करती है। |
| `openclaw.channel.configuredState`                                                         | lightweight configured-state checker metadata, जो पूरा channel runtime load किए बिना यह उत्तर दे सकता है कि "क्या env-only setup पहले से मौजूद है?"                                              |
| `openclaw.channel.persistedAuthState`                                                      | lightweight persisted-auth checker metadata, जो पूरा channel runtime load किए बिना यह उत्तर दे सकता है कि "क्या किसी भी चीज़ में पहले से sign in किया गया है?"                                                    |
| `openclaw.install.clawhubSpec` / `openclaw.install.npmSpec` / `openclaw.install.localPath` | bundled और externally published plugins के लिए install/update hints।                                                                                                                        |
| `openclaw.install.defaultChoice`                                                           | अनेक install sources उपलब्ध होने पर पसंदीदा install path।                                                                                                                       |
| `openclaw.install.minHostVersion`                                                          | न्यूनतम supported OpenClaw host version, जिसमें `>=2026.3.22` या `>=2026.5.1-beta.1` जैसी semver floor का उपयोग होता है।                                                                                  |
| `openclaw.compat.pluginApi`                                                                | इस package के लिए आवश्यक न्यूनतम OpenClaw plugin API range, जिसमें `>=2026.5.27` जैसी semver floor का उपयोग होता है।                                                                                      |
| `openclaw.install.expectedIntegrity`                                                       | `sha512-...` जैसी expected npm dist integrity string; install और update प्रवाह fetched artifact को इसके विरुद्ध verify करते हैं।                                                                 |
| `openclaw.install.allowInvalidConfigRecovery`                                              | config के invalid होने पर सीमित bundled-plugin reinstall recovery path की अनुमति देता है।                                                                                                            |
| `openclaw.install.requiredPlatformPackages`                                                | वे npm package aliases जिन्हें उनके lockfile platform constraints के current host से match होने पर materialize होना आवश्यक है।                                                                                |
| `openclaw.startup.deferConfiguredChannelFullLoadUntilAfterListen`                          | setup-runtime channel surfaces को listen से पहले load होने देता है, फिर पूर्ण configured channel plugin को post-listen activation तक defer करता है।                                                      |

Manifest metadata निर्धारित करता है कि runtime load होने से पहले onboarding में कौन-से provider/channel/setup choices दिखाई देंगे। जब उपयोगकर्ता उन choices में से किसी एक को चुनता है, तो `package.json#openclaw.install` onboarding को बताता है कि उस plugin को कैसे fetch या enable करना है। install hints को `openclaw.plugin.json` में न ले जाएँ।

`openclaw.channel.cliAddOptions` के लिए Commander's long-option syntax का उपयोग करें, जैसे `--initial-sync-limit <n>`। non-negative integer parse करने के लिए `valueType: "int"` सेट करें, या plugin setup adapter को input मिलने से पहले comma-, semicolon-, या newline-delimited input को strings में विभाजित करने के लिए `valueType: "list"` सेट करें। parsed Commander value को अपरिवर्तित रूप से आगे भेजने के लिए `valueType` को छोड़ दें।

non-bundled plugin sources के लिए install और manifest registry loading के दौरान `openclaw.install.minHostVersion` लागू किया जाता है। invalid values अस्वीकार कर दी जाती हैं; newer-but-valid values पुराने hosts पर external plugins को छोड़ देती हैं। bundled source plugins को host checkout के साथ co-versioned माना जाता है।

`openclaw.install.requiredPlatformPackages` उन npm packages के लिए है जो optional, platform-specific aliases के माध्यम से आवश्यक native binaries उपलब्ध कराते हैं। प्रत्येक supported platform alias के लिए bare npm package name सूचीबद्ध करें। npm install के दौरान, OpenClaw केवल उस declared alias को verify करता है जिसके lockfile constraints current host से match करते हैं। यदि npm success report करता है लेकिन उस alias को छोड़ देता है, तो OpenClaw fresh cache के साथ एक बार retry करता है और alias के अब भी missing होने पर install को roll back कर देता है।

non-bundled plugin sources के लिए package install के दौरान `openclaw.compat.pluginApi` लागू किया जाता है। इसका उपयोग उस OpenClaw plugin SDK/runtime API floor के लिए करें जिसके विरुद्ध package बनाया गया था। यदि किसी plugin package को नए API की आवश्यकता है, लेकिन वह अन्य प्रवाहों के लिए कम install hint बनाए रखता है, तो यह `minHostVersion` से अधिक strict हो सकता है। Official OpenClaw release sync मौजूदा official plugin API floors को default रूप से OpenClaw release version तक बढ़ाता है, लेकिन plugin-only releases कम floor बनाए रख सकते हैं, जब package जानबूझकर पुराने hosts को support करता हो। केवल package version को compatibility contract के रूप में उपयोग न करें। `peerDependencies.openclaw`, npm package metadata ही रहता है; OpenClaw install compatibility decisions के लिए `openclaw.compat.pluginApi` contract का उपयोग करता है।

जब plugin ClawHub पर published हो, तो official install-on-demand metadata को `clawhubSpec` का उपयोग करना चाहिए; onboarding इसे पसंदीदा remote source मानता है और install के बाद ClawHub artifact facts record करता है। उन packages के लिए जो अभी ClawHub पर स्थानांतरित नहीं हुए हैं, `npmSpec` compatibility fallback बना रहता है।

Exact npm version pinning पहले से `npmSpec` में रहता है, उदाहरण के लिए `"npmSpec": "@wecom/wecom-openclaw-plugin@1.2.3"`। Official external catalog entries को exact specs के साथ `expectedIntegrity` जोड़ना चाहिए, ताकि fetched npm artifact के pinned release से अब match न करने पर update प्रवाह fail closed हों। compatibility के लिए interactive onboarding अभी भी trusted registry npm specs प्रदान करता है, जिनमें bare package names और dist-tags शामिल हैं। Catalog diagnostics exact, floating, integrity-pinned, missing-integrity, package-name mismatch, और invalid default-choice sources के बीच अंतर कर सकते हैं। जब `expectedIntegrity` मौजूद हो लेकिन ऐसा कोई valid npm source न हो जिसे वह pin कर सके, तो वे चेतावनी भी देते हैं। जब `expectedIntegrity` मौजूद हो, तो install/update प्रवाह इसे लागू करते हैं; जब इसे छोड़ दिया जाता है, तो registry resolution को integrity pin के बिना record किया जाता है।

जब status, channel list, या SecretRef scans को पूरा runtime load किए बिना configured accounts की पहचान करनी हो, तो channel plugins को `openclaw.setupEntry` प्रदान करना चाहिए। setup entry को channel metadata के साथ setup-safe config, status, और secrets adapters उपलब्ध कराने चाहिए; network clients, gateway listeners, और transport runtimes को main extension entrypoint में रखें।

रनटाइम एंट्रीपॉइंट फ़ील्ड, स्रोत एंट्रीपॉइंट फ़ील्ड के लिए पैकेज-सीमा जाँचों को ओवरराइड नहीं करते। उदाहरण के लिए, `openclaw.runtimeExtensions` किसी सीमा से बाहर जाते `openclaw.extensions` पथ को लोड करने योग्य नहीं बना सकता।

`openclaw.install.allowInvalidConfigRecovery` जानबूझकर सीमित है। यह मनमाने ढंग से खराब कॉन्फ़िग को इंस्टॉल करने योग्य नहीं बनाता। वर्तमान में यह केवल इंस्टॉल प्रवाहों को विशिष्ट पुराने बंडल किए गए Plugin अपग्रेड विफलताओं से उबरने देता है, जैसे बंडल किए गए Plugin का पथ अनुपलब्ध होना या उसी बंडल किए गए Plugin के लिए पुरानी `channels.<id>` प्रविष्टि। असंबंधित कॉन्फ़िग त्रुटियाँ अब भी इंस्टॉल को अवरुद्ध करती हैं और ऑपरेटरों को `openclaw doctor --fix` पर भेजती हैं।

`openclaw.channel.persistedAuthState` एक छोटे जाँचकर्ता मॉड्यूल के लिए पैकेज मेटाडेटा है:

```json
{
  "openclaw": {
    "channel": {
      "id": "whatsapp",
      "persistedAuthState": {
        "specifier": "./auth-presence",
        "exportName": "hasAnyWhatsAppAuth"
      }
    }
  }
}
```

इसका उपयोग तब करें जब सेटअप, डॉक्टर, स्थिति या केवल-पठन उपस्थिति प्रवाहों को पूरा चैनल Plugin लोड होने से पहले एक सस्ती हाँ/नहीं प्रमाणीकरण जाँच की आवश्यकता हो। स्थायी प्रमाणीकरण स्थिति, कॉन्फ़िगर की गई चैनल स्थिति नहीं है: Plugin को स्वतः सक्षम करने, रनटाइम निर्भरताओं की मरम्मत करने या यह तय करने के लिए कि किसी चैनल रनटाइम को लोड होना चाहिए या नहीं, इस मेटाडेटा का उपयोग न करें। लक्ष्य एक्सपोर्ट एक छोटा फ़ंक्शन होना चाहिए जो केवल स्थायी स्थिति पढ़े; इसे पूरे चैनल रनटाइम बैरल के माध्यम से रूट न करें।

`openclaw.channel.configuredState` कम लागत वाली कॉन्फ़िगरेशन जाँचों का समर्थन करता है। जब पर्यावरण चर पर्याप्त हों, तो घोषणात्मक पर्यावरण मेटाडेटा को प्राथमिकता दें:

```json
{
  "openclaw": {
    "channel": {
      "id": "telegram",
      "configuredState": {
        "env": {
          "allOf": ["TELEGRAM_BOT_TOKEN"]
        }
      }
    }
  }
}
```

जब प्रत्येक सूचीबद्ध चर आवश्यक हो, तब `env.allOf` का उपयोग करें और जब कोई भी एक गैर-रिक्त चर पर्याप्त हो, तब `env.anyOf` का उपयोग करें। यदि किसी छोटे गैर-रनटाइम जाँच को पर्यावरण मेटाडेटा से अधिक की आवश्यकता हो, तो `persistedAuthState` के लिए दिखाए अनुसार `specifier` के साथ `exportName` का उपयोग करें; जब `env` मौजूद होता है, तो OpenClaw उस मॉड्यूल को लोड किए बिना इसका उपयोग करता है। यदि जाँच को पूर्ण कॉन्फ़िग समाधान या वास्तविक चैनल रनटाइम की आवश्यकता हो, तो उस लॉजिक को इसके बजाय Plugin के `config.hasConfiguredState` हुक में रखें।

## खोज प्राथमिकता (डुप्लिकेट Plugin आईडी)

OpenClaw तीन रूट से Plugin खोजता है, जिनकी जाँच इस क्रम में होती है: OpenClaw के साथ भेजे गए बंडल किए गए Plugin, वैश्विक इंस्टॉल रूट (`~/.openclaw/extensions`), और वर्तमान कार्यस्थान रूट (`<workspace>/.openclaw/extensions`), साथ ही कोई भी स्पष्ट `plugins.load.paths` प्रविष्टियाँ।

यदि दो खोजों में समान `id` हो, तो केवल **सर्वोच्च-प्राथमिकता** वाला मैनिफ़ेस्ट रखा जाता है; निम्न-प्राथमिकता वाले डुप्लिकेट को साथ में लोड करने के बजाय हटा दिया जाता है। प्राथमिकता, सर्वोच्च से निम्नतम:

1. **कॉन्फ़िग द्वारा चयनित** — `plugins.entries.<id>` में स्पष्ट रूप से पिन किया गया पथ
2. **ट्रैक किए गए इंस्टॉल रिकॉर्ड से मेल खाने वाला वैश्विक इंस्टॉल** — `openclaw plugin install`/`openclaw plugin update` के माध्यम से इंस्टॉल किया गया ऐसा Plugin, जिसे OpenClaw की इंस्टॉल ट्रैकिंग उसी आईडी के लिए पहचानती है, भले ही वह आईडी किसी बंडल किए गए Plugin की भी हो
3. **बंडल किया गया** — OpenClaw के साथ भेजे गए Plugin
4. **कार्यस्थान** — वर्तमान कार्यस्थान के सापेक्ष खोजे गए Plugin
5. कोई अन्य खोजा गया उम्मीदवार

निहितार्थ:

- कार्यस्थान या वैश्विक रूट में बिना ट्रैकिंग के मौजूद किसी बंडल किए गए Plugin की फ़ोर्क की गई या पुरानी प्रति, बंडल किए गए बिल्ड को प्रतिस्थापित नहीं करेगी।
- किसी बंडल किए गए Plugin को ओवरराइड करने के लिए, या तो उस आईडी के लिए `openclaw plugin install` चलाएँ ताकि ट्रैक किया गया वैश्विक इंस्टॉल बंडल की गई प्रति से उच्च प्राथमिकता पाए, या `plugins.entries.<id>` के माध्यम से किसी विशिष्ट पथ को पिन करें ताकि वह कॉन्फ़िग द्वारा चयनित प्राथमिकता से विजयी हो।
- डुप्लिकेट हटाए जाने को लॉग किया जाता है, ताकि डॉक्टर और स्टार्टअप निदान छोड़ी गई प्रति की ओर संकेत कर सकें।
- कॉन्फ़िग द्वारा चयनित डुप्लिकेट ओवरराइड को निदान में स्पष्ट ओवरराइड के रूप में लिखा जाता है, लेकिन फिर भी चेतावनी दी जाती है ताकि पुराने फ़ोर्क और आकस्मिक प्रतिस्थापन दिखाई देते रहें।

## JSON Schema आवश्यकताएँ

- **प्रत्येक Plugin को JSON Schema प्रदान करना आवश्यक है**, भले ही वह कोई कॉन्फ़िग स्वीकार न करता हो।
- रिक्त स्कीमा स्वीकार्य है (उदाहरण के लिए, `{ "type": "object", "additionalProperties": false }`)।
- स्कीमा का सत्यापन कॉन्फ़िग पढ़ने/लिखने के समय होता है, रनटाइम पर नहीं।
- किसी बंडल किए गए Plugin को नई कॉन्फ़िग कुंजियों के साथ विस्तारित या फ़ोर्क करते समय, उसी समय उस Plugin के `openclaw.plugin.json` `configSchema` को भी अपडेट करें। बंडल किए गए Plugin के स्कीमा सख्त होते हैं, इसलिए `myNewKey` को `configSchema.properties` में जोड़े बिना उपयोगकर्ता कॉन्फ़िग में `plugins.entries.<id>.config.myNewKey` जोड़ने पर Plugin रनटाइम लोड होने से पहले ही उसे अस्वीकार कर दिया जाएगा।

स्कीमा विस्तार का उदाहरण:

```json
{
  "configSchema": {
    "type": "object",
    "additionalProperties": false,
    "properties": {
      "myNewKey": {
        "type": "string"
      }
    }
  }
}
```

## सत्यापन व्यवहार

- अज्ञात `channels.*` कुंजियाँ **त्रुटियाँ** हैं, जब तक चैनल आईडी किसी Plugin मैनिफ़ेस्ट द्वारा घोषित न हो। यदि वही आईडी `plugins.allow`, `plugins.entries`, या `plugins.installs` (ऐसा Plugin जिसका संदर्भ दिया गया है, लेकिन जो वर्तमान में खोजने योग्य नहीं है) में भी दिखाई देती है, तो OpenClaw इसके बजाय इसे घटाकर **चेतावनी** कर देता है।
- अज्ञात Plugin आईडी का संदर्भ देने वाले `plugins.entries.<id>`, `plugins.allow`, और `plugins.deny` **चेतावनियाँ** ("पुरानी कॉन्फ़िग प्रविष्टि अनदेखी की गई") हैं, त्रुटियाँ नहीं, ताकि अपग्रेड और हटाए गए/पुनःनामित Plugin Gateway स्टार्टअप को अवरुद्ध न करें।
- अज्ञात Plugin आईडी का संदर्भ देने वाला `plugins.slots.memory` एक **त्रुटि** है, ज्ञात `memory-lancedb` आधिकारिक बाहरी Plugin को छोड़कर, जिसके लिए इसके बजाय चेतावनी दी जाती है।
- यदि कोई Plugin इंस्टॉल है, लेकिन उसका मैनिफ़ेस्ट या स्कीमा खराब अथवा अनुपलब्ध है, तो सत्यापन विफल हो जाता है और डॉक्टर Plugin त्रुटि की रिपोर्ट करता है।
- यदि Plugin कॉन्फ़िग मौजूद है, लेकिन Plugin **अक्षम** है, तो कॉन्फ़िग रखा जाता है और डॉक्टर + लॉग में एक **चेतावनी** दिखाई जाती है।

पूर्ण `plugins.*` स्कीमा के लिए [कॉन्फ़िगरेशन संदर्भ](/hi/gateway/configuration) देखें।

## टिप्पणियाँ

- स्थानीय फ़ाइल सिस्टम लोड सहित, **मूल OpenClaw Plugin के लिए मैनिफ़ेस्ट आवश्यक है**। रनटाइम अब भी Plugin मॉड्यूल को अलग से लोड करता है; मैनिफ़ेस्ट केवल खोज + सत्यापन के लिए है।
- मूल मैनिफ़ेस्ट को JSON5 के साथ पार्स किया जाता है, इसलिए टिप्पणियाँ, अंतिम अल्पविराम और उद्धरण-रहित कुंजियाँ स्वीकार की जाती हैं, बशर्ते अंतिम मान अब भी एक ऑब्जेक्ट हो।
- मैनिफ़ेस्ट लोडर केवल दस्तावेजीकृत मैनिफ़ेस्ट फ़ील्ड पढ़ता है। कस्टम शीर्ष-स्तरीय कुंजियों से बचें।
- जब किसी Plugin को उनकी आवश्यकता न हो, तो `channels`, `providers`, `cliBackends`, और `skills` सभी को छोड़ा जा सकता है।
- `providerCatalogEntry` हल्का रहना चाहिए और व्यापक रनटाइम कोड आयात नहीं करना चाहिए; इसका उपयोग स्थिर प्रदाता कैटलॉग मेटाडेटा या सीमित खोज विवरणकों के लिए करें, अनुरोध-समय निष्पादन के लिए नहीं।
- विशिष्ट Plugin प्रकारों का चयन `plugins.slots.*` के माध्यम से होता है: `plugins.slots.memory` के माध्यम से `kind: "memory"` (डिफ़ॉल्ट `memory-core`), `plugins.slots.contextEngine` के माध्यम से `kind: "context-engine"` (डिफ़ॉल्ट `legacy`)।
- इस मैनिफ़ेस्ट में विशिष्ट Plugin प्रकार घोषित करें। रनटाइम-प्रविष्टि `OpenClawPluginDefinition.kind` अप्रचलित है और केवल पुराने Plugin के लिए संगतता फ़ॉलबैक के रूप में बनी हुई है।
- `setup.providers[].envVars` में पर्यावरण-चर मेटाडेटा केवल घोषणात्मक है। स्थिति, ऑडिट, Cron डिलीवरी सत्यापन और अन्य केवल-पठन सतहें किसी पर्यावरण चर को कॉन्फ़िगर किया हुआ मानने से पहले अब भी Plugin विश्वास और प्रभावी सक्रियण नीति लागू करती हैं।
- प्रदाता कोड की आवश्यकता वाले रनटाइम विज़ार्ड मेटाडेटा के लिए, [प्रदाता रनटाइम हुक](/hi/plugins/architecture-internals#provider-runtime-hooks) देखें।
- यदि आपका Plugin मूल मॉड्यूल पर निर्भर है, तो बिल्ड चरणों और पैकेज-मैनेजर अनुमति-सूची की किसी भी आवश्यकता का दस्तावेज़ीकरण करें (उदाहरण के लिए, pnpm `allow-build-scripts` + `pnpm rebuild <package>`)।

## संबंधित

<CardGroup cols={3}>
  <Card title="Plugin बनाना" href="/hi/plugins/building-plugins" icon="rocket">
    Plugin के साथ शुरुआत करना।
  </Card>
  <Card title="Plugin आर्किटेक्चर" href="/hi/plugins/architecture" icon="diagram-project">
    आंतरिक आर्किटेक्चर और क्षमता मॉडल।
  </Card>
  <Card title="SDK अवलोकन" href="/hi/plugins/sdk-overview" icon="book">
    Plugin SDK संदर्भ और उपपथ आयात।
  </Card>
</CardGroup>
