@ailib-official/ai-protocol 0.8.4 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/README.md +10 -2
  2. package/dist/v1/models/deepseek-chat.json +4 -4
  3. package/dist/v1/models/gemini.json +59 -1
  4. package/dist/v1/providers/gemini.json +11 -1
  5. package/dist/v2/contracts/anthropic-messages.contract.json +62 -0
  6. package/dist/v2/contracts/gemini-generate.contract.json +59 -0
  7. package/dist/v2/providers/anthropic.json +42 -10
  8. package/dist/v2/providers/cohere.json +21 -0
  9. package/dist/v2/providers/deepseek.json +121 -47
  10. package/dist/v2/providers/doubao.json +23 -8
  11. package/dist/v2/providers/google.json +39 -0
  12. package/dist/v2/providers/groq.json +223 -0
  13. package/dist/v2/providers/jina.json +15 -0
  14. package/dist/v2/providers/moonshot.json +23 -8
  15. package/dist/v2/providers/nvidia.json +520 -0
  16. package/dist/v2/providers/openai.json +39 -11
  17. package/dist/v2/providers/qwen.json +25 -9
  18. package/dist/v2/providers/zhipu.json +114 -22
  19. package/package.json +12 -3
  20. package/schemas/v1.json +1 -1
  21. package/schemas/v2/availability.json +12 -0
  22. package/schemas/v2/capabilities.json +4 -0
  23. package/schemas/v2/error-codes.yaml +5 -0
  24. package/schemas/v2/metadata-model-entry.json +57 -0
  25. package/schemas/v2/pack.json +145 -0
  26. package/schemas/v2/provider-contract.json +45 -0
  27. package/schemas/v2/provider.json +15 -2
  28. package/schemas/v2/tool-calling.json +61 -0
  29. package/v1/models/deepseek-chat.yaml +4 -4
  30. package/v1/models/gemini.yaml +31 -1
  31. package/v1/providers/gemini.yaml +10 -2
  32. package/v2/contracts/anthropic-messages.contract.yaml +55 -0
  33. package/v2/contracts/gemini-generate.contract.yaml +52 -0
  34. package/v2/packs/examples/README.md +9 -0
  35. package/v2/packs/examples/deepseek-economy-pack.json +43 -0
  36. package/v2/providers/anthropic.yaml +34 -13
  37. package/v2/providers/cohere.yaml +16 -3
  38. package/v2/providers/deepseek.yaml +77 -33
  39. package/v2/providers/doubao.yaml +18 -8
  40. package/v2/providers/google.yaml +32 -4
  41. package/v2/providers/groq.yaml +159 -0
  42. package/v2/providers/jina.yaml +10 -0
  43. package/v2/providers/moonshot.yaml +20 -12
  44. package/v2/providers/nvidia.yaml +405 -0
  45. package/v2/providers/openai.yaml +33 -11
  46. package/v2/providers/qwen.yaml +20 -9
  47. package/v2/providers/zhipu.yaml +70 -23
@@ -3,13 +3,13 @@
3
3
  "id": "zhipu",
4
4
  "protocol_version": "2.0",
5
5
  "name": "Zhipu AI",
6
- "version": "5.0.0",
6
+ "version": "5.2.0",
7
7
  "status": "stable",
8
8
  "category": "ai_provider",
9
- "official_url": "https://open.bigmodel.cn/dev/api",
10
- "support_contact": "https://open.bigmodel.cn/",
9
+ "official_url": "https://docs.z.ai",
10
+ "support_contact": "https://z.ai",
11
11
  "endpoint": {
12
- "base_url": "https://open.bigmodel.cn/api/paas/v4",
12
+ "base_url": "https://api.z.ai/api/paas/v4",
13
13
  "chat": "/chat/completions",
14
14
  "auth": {
15
15
  "type": "bearer",
@@ -22,6 +22,7 @@
22
22
  "by_http_status": {
23
23
  "400": "invalid_request",
24
24
  "401": "authentication",
25
+ "402": "insufficient_quota",
25
26
  "403": "permission_denied",
26
27
  "404": "not_found",
27
28
  "429": "rate_limited",
@@ -35,6 +36,22 @@
35
36
  "insufficient_quota": "quota_exhausted"
36
37
  }
37
38
  },
39
+ "availability": {
40
+ "required": false,
41
+ "regions": [
42
+ "cn",
43
+ "global"
44
+ ],
45
+ "check": {
46
+ "method": "GET",
47
+ "path": "/models",
48
+ "expected_status": [
49
+ 200,
50
+ 401
51
+ ],
52
+ "timeout_ms": 5000
53
+ }
54
+ },
38
55
  "capabilities": {
39
56
  "required": [
40
57
  "text",
@@ -42,6 +59,7 @@
42
59
  "tools"
43
60
  ],
44
61
  "optional": [
62
+ "vision",
45
63
  "parallel_tools",
46
64
  "agentic",
47
65
  "reasoning",
@@ -50,8 +68,19 @@
50
68
  "feature_flags": {
51
69
  "structured_output": true,
52
70
  "parallel_tool_calls": true,
71
+ "extended_thinking": true,
53
72
  "streaming_usage": true,
54
73
  "system_messages": true
74
+ },
75
+ "tool_calling": {
76
+ "native": {
77
+ "supported": true,
78
+ "reliability": "full",
79
+ "parallel": true,
80
+ "streaming": true,
81
+ "notes": "Well-evaluated on MCP-Atlas 500-task benchmark; reliable native tool calling"
82
+ },
83
+ "text_fallback": null
55
84
  }
56
85
  },
57
86
  "capability_profile": {
@@ -71,8 +100,7 @@
71
100
  },
72
101
  "systems": {
73
102
  "requires": [
74
- "mcp",
75
- "search"
103
+ "mcp"
76
104
  ]
77
105
  }
78
106
  },
@@ -81,9 +109,9 @@
81
109
  "type": "float",
82
110
  "range": [
83
111
  0,
84
- 2
112
+ 1
85
113
  ],
86
- "default": 1
114
+ "default": 0.7
87
115
  },
88
116
  "max_tokens": {
89
117
  "type": "integer",
@@ -99,16 +127,16 @@
99
127
  },
100
128
  "stream": {
101
129
  "type": "boolean"
130
+ },
131
+ "reasoning_effort": {
132
+ "type": "string",
133
+ "enum": [
134
+ "high",
135
+ "max"
136
+ ],
137
+ "default": "max"
102
138
  }
103
139
  },
104
- "parameter_mappings": {
105
- "temperature": "temperature",
106
- "max_tokens": "max_tokens",
107
- "stream": "stream",
108
- "top_p": "top_p",
109
- "tools": "tools",
110
- "tool_choice": "tool_choice"
111
- },
112
140
  "streaming": {
113
141
  "decoder": {
114
142
  "format": "sse",
@@ -127,6 +155,13 @@
127
155
  "content": "$.choices[*].delta.content"
128
156
  }
129
157
  },
158
+ {
159
+ "match": "exists($.choices[*].delta.reasoning_content)",
160
+ "emit": "ThinkingDelta",
161
+ "fields": {
162
+ "thinking": "$.choices[*].delta.reasoning_content"
163
+ }
164
+ },
130
165
  {
131
166
  "match": "exists($.choices[*].delta.tool_calls)",
132
167
  "emit": "PartialToolCall",
@@ -154,13 +189,28 @@
154
189
  "multimodal": {
155
190
  "input": {
156
191
  "vision": {
157
- "supported": false
192
+ "supported": true,
193
+ "formats": [
194
+ "jpeg",
195
+ "png",
196
+ "webp"
197
+ ],
198
+ "encoding_methods": [
199
+ "base64_inline",
200
+ "url"
201
+ ],
202
+ "document_understanding": true
158
203
  },
159
204
  "audio": {
160
205
  "supported": false
161
206
  },
162
207
  "video": {
163
- "supported": false
208
+ "supported": true,
209
+ "formats": [
210
+ "mp4",
211
+ "mov",
212
+ "avi"
213
+ ]
164
214
  }
165
215
  },
166
216
  "output": {
@@ -215,17 +265,57 @@
215
265
  "api_compatibility": "openai",
216
266
  "open_source": {
217
267
  "license": "MIT",
218
- "hugging_face": "https://huggingface.co/zhipuai/glm-5"
268
+ "hugging_face": "https://huggingface.co/zai-org/GLM-5.2"
219
269
  },
220
270
  "agentic_engineering": {
221
271
  "supported": true,
222
272
  "capabilities": [
223
273
  "long_horizon_planning",
224
274
  "multi_step_workflows",
225
- "autonomous_debugging"
275
+ "autonomous_debugging",
276
+ "computer_use"
226
277
  ]
227
278
  },
228
279
  "models": {
280
+ "glm-5.2": {
281
+ "context_window": 1048576,
282
+ "max_output_tokens": 128000,
283
+ "release_date": "2026-05-01",
284
+ "architecture": {
285
+ "type": "moe",
286
+ "total": "744B",
287
+ "active": "40B"
288
+ },
289
+ "thinking": "dual_mode",
290
+ "reasoning_effort": [
291
+ "high",
292
+ "max"
293
+ ]
294
+ },
295
+ "glm-5v-turbo": {
296
+ "context_window": 200000,
297
+ "max_output_tokens": 64000,
298
+ "release_date": "2026-04-01",
299
+ "architecture": {
300
+ "type": "moe",
301
+ "total": "744B",
302
+ "active": "40B"
303
+ },
304
+ "vision": true,
305
+ "computer_use": true,
306
+ "mcp_support": true
307
+ },
308
+ "glm-5.1": {
309
+ "context_window": 200000,
310
+ "max_output_tokens": 128000,
311
+ "release_date": "2026-03-01",
312
+ "architecture": {
313
+ "type": "moe",
314
+ "total": "744B",
315
+ "active": "40B"
316
+ },
317
+ "status": "deprecated"
318
+ },
229
319
  "glm-5": {
230
320
  "context_window": 200000,
231
321
  "max_output_tokens": 128000,
@@ -243,9 +333,11 @@
243
333
  },
244
334
  "regional": {
245
335
  "primary": "china",
246
- "alternative_base": "https://api.z.ai/v1",
336
+ "international_base": "https://api.z.ai/api/paas/v4",
337
+ "legacy_base": "https://open.bigmodel.cn/api/paas/v4",
247
338
  "international_partners": [
248
- "aimlapi"
339
+ "aimlapi",
340
+ "openrouter"
249
341
  ]
250
342
  },
251
343
  "sdk": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ailib-official/ai-protocol",
3
- "version": "0.8.4",
3
+ "version": "1.0.0",
4
4
  "description": "Provider-agnostic AI provider + model registry specification",
5
5
  "type": "module",
6
6
  "main": "dist/index.json",
@@ -17,11 +17,14 @@
17
17
  "validate:providers": "node scripts/validate.js --providers",
18
18
  "validate:models": "node scripts/validate.js --models",
19
19
  "validate:examples": "node scripts/validate.js --examples",
20
+ "validate:packs": "node scripts/validate.js --packs",
20
21
  "validate:schemas": "node scripts/validate.js --schemas",
21
22
  "validate:specs": "node scripts/validate.js --specs",
22
- "validate:capability-profile": "node scripts/validate-capability-profile-boundary.js",
23
+ "validate:compliance": "node scripts/validate-compliance-cases.js",
24
+ "validate:error-codes": "node scripts/validate-error-codes-sync.js",
23
25
  "drift:check": "node scripts/drift-detect.js",
24
26
  "gate:manifest-consumption": "node scripts/gate-manifest-consumption.js",
27
+ "gate:manifest-authority": "node scripts/gate-manifest-authority.js",
25
28
  "gate:compliance-matrix": "node scripts/gate-compliance-matrix.js",
26
29
  "gate:compliance-matrix:required": "node scripts/gate-compliance-matrix.js",
27
30
  "gate:compliance-matrix:report-only": "node scripts/gate-compliance-matrix.js --report-only",
@@ -35,7 +38,9 @@
35
38
  "release:gate": "node scripts/release-gate.js",
36
39
  "fact-check:models": "node scripts/fact-check-models.js",
37
40
  "fact-check:models:strict": "node scripts/fact-check-models.js --strict",
38
- "fact-check:models:strict-all": "node scripts/fact-check-models.js --strict --require-keys"
41
+ "fact-check:models:strict-all": "node scripts/fact-check-models.js --strict --require-keys",
42
+ "migrate:v2alpha-capacity": "node scripts/migrate-v1-capacity-to-v2alpha.js",
43
+ "verify:v1-v2-capacity": "node scripts/verify-v1-v2-capacity-parity.js"
39
44
  },
40
45
  "engines": {
41
46
  "node": ">=18.0.0"
@@ -55,6 +60,10 @@
55
60
  "model"
56
61
  ],
57
62
  "license": "MIT OR Apache-2.0",
63
+ "repository": {
64
+ "type": "git",
65
+ "url": "git+https://github.com/ailib-official/ai-protocol.git"
66
+ },
58
67
  "publishConfig": {
59
68
  "access": "public"
60
69
  }
package/schemas/v1.json CHANGED
@@ -14,7 +14,7 @@
14
14
  ]
15
15
  },
16
16
  {
17
- "pattern": "^(https://raw\\.githubusercontent\\.com/ailib-official/ai-protocol/(main|master|v\\d+\\.\\d+)/schemas/v1\\.json|\\.\\./schemas/v1\\.json)$"
17
+ "pattern": "^(https://raw\\.githubusercontent\\.com/ailib-official/ai-protocol/(main|master|v\\d+\\.\\d+(\\.\\d+)?)/schemas/v1\\.json|\\.\\./schemas/v1\\.json)$"
18
18
  }
19
19
  ],
20
20
  "description": "Schema reference: GitHub raw URL (preferred) or relative path (for local development)"
@@ -13,6 +13,18 @@
13
13
  "regions": {
14
14
  "$ref": "./regions.json"
15
15
  },
16
+ "approval_ids": {
17
+ "type": "object",
18
+ "description": "Optional regulatory filing IDs keyed by region (e.g. cn ICP/algorithm filing numbers for audit trails)",
19
+ "additionalProperties": {
20
+ "type": "array",
21
+ "minItems": 1,
22
+ "items": {
23
+ "type": "string",
24
+ "minLength": 1
25
+ }
26
+ }
27
+ },
16
28
  "interval_ms": {
17
29
  "type": "integer",
18
30
  "minimum": 1000,
@@ -87,6 +87,10 @@
87
87
  "additionalProperties": {
88
88
  "type": "boolean"
89
89
  }
90
+ },
91
+ "tool_calling": {
92
+ "$ref": "./tool-calling.json",
93
+ "description": "Tool calling capability declaration (VL-TTC-001)"
90
94
  }
91
95
  },
92
96
  "additionalProperties": false
@@ -62,6 +62,11 @@ error_codes:
62
62
  fallbackable: false
63
63
  description: "Input exceeds the model's context window or the API payload size limit"
64
64
  recovery_hint: "Reduce input size or use a model with a larger context window"
65
+ # QA-protocol-002: capability_guard / undeclared advanced capability (adv-001..004, gen-007)
66
+ # intentionally maps to E1005 — client-side rejection before request is sent; not payload size.
67
+ compliance_aliases:
68
+ - "capability_not_declared"
69
+ - "unsupported_capability"
65
70
 
66
71
  # --- Rate/Quota Errors (2xxx) ---
67
72
  E2001:
@@ -0,0 +1,57 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://raw.githubusercontent.com/ailib-official/ai-protocol/main/schemas/v2/metadata-model-entry.json",
4
+ "title": "V2 Provider Metadata Model Entry",
5
+ "description": "Model-level capacity metadata under provider manifest metadata.models. Integer fields use 0 for unknown. Distinct from capabilities string enums.",
6
+ "type": "object",
7
+ "properties": {
8
+ "context_window": {
9
+ "type": "integer",
10
+ "minimum": 0,
11
+ "description": "Maximum input context tokens. 0 = unknown."
12
+ },
13
+ "max_output_tokens": {
14
+ "type": "integer",
15
+ "minimum": 0,
16
+ "description": "Maximum output/completion tokens. 0 = unknown."
17
+ },
18
+ "release_date": {
19
+ "type": "string",
20
+ "format": "date",
21
+ "description": "Model release or GA date (ISO 8601 date)"
22
+ },
23
+ "status": {
24
+ "type": "string",
25
+ "enum": ["active", "deprecated", "research_preview", "public_preview", "preview", "beta"],
26
+ "description": "Operational status of this model entry"
27
+ },
28
+ "pricing": {
29
+ "type": "object",
30
+ "additionalProperties": true,
31
+ "description": "Optional per-model pricing hints (not a substitute for pricing.json)"
32
+ },
33
+ "verification": {
34
+ "type": "object",
35
+ "properties": {
36
+ "status": {
37
+ "type": "string",
38
+ "enum": ["operational", "verified", "unverified", "deprecated"]
39
+ },
40
+ "source": {
41
+ "type": "string",
42
+ "enum": [
43
+ "official_documentation",
44
+ "api_probe",
45
+ "compliance_registry",
46
+ "provider_catalog"
47
+ ],
48
+ "description": "Provenance of verification evidence. Application or deployment names (eos, velaclaw, etc.) are forbidden — see docs/MANIFEST_AUTHORITY.md."
49
+ },
50
+ "verified_at": { "type": "string", "format": "date" },
51
+ "notes": { "type": "string" }
52
+ },
53
+ "additionalProperties": true
54
+ }
55
+ },
56
+ "additionalProperties": true
57
+ }
@@ -0,0 +1,145 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://raw.githubusercontent.com/ailib-official/ai-protocol/main/schemas/v2/pack.json",
4
+ "title": "AI-Protocol V2 Prism Pack Manifest",
5
+ "description": "Prism Pack capability contract: a curated bundle of provider routes for cost/latency/balanced routing. Extends the v2 provider manifest ecosystem; references provider ids and model ids from ai-protocol v2 provider manifests. Contract only — no marketplace or registry implementation.",
6
+ "type": "object",
7
+ "required": [
8
+ "id",
9
+ "name",
10
+ "version",
11
+ "protocol_version",
12
+ "provider_routes"
13
+ ],
14
+ "properties": {
15
+ "$schema": {
16
+ "type": "string",
17
+ "description": "Schema reference URL (must point to schemas/v2/pack.json)"
18
+ },
19
+ "id": {
20
+ "type": "string",
21
+ "pattern": "^[a-z0-9][a-z0-9-_]{1,63}$",
22
+ "description": "Stable pack identifier (lowercase, alphanumeric, hyphens, underscores)"
23
+ },
24
+ "name": {
25
+ "type": "string",
26
+ "minLength": 1,
27
+ "description": "Human-readable pack name"
28
+ },
29
+ "version": {
30
+ "type": "string",
31
+ "pattern": "^\\d+\\.\\d+\\.\\d+(-[a-zA-Z0-9.]+)?$",
32
+ "description": "Pack manifest SemVer"
33
+ },
34
+ "protocol_version": {
35
+ "type": "string",
36
+ "const": "2.0",
37
+ "description": "AI-Protocol version this pack conforms to"
38
+ },
39
+ "description": {
40
+ "type": "string",
41
+ "description": "Short summary of pack intent and routing strategy"
42
+ },
43
+ "status": {
44
+ "type": "string",
45
+ "enum": ["draft", "stable", "deprecated"],
46
+ "default": "draft",
47
+ "description": "Pack lifecycle status"
48
+ },
49
+ "optimize_default": {
50
+ "type": "string",
51
+ "enum": ["cost", "latency", "balanced"],
52
+ "default": "cost",
53
+ "description": "Default routing optimize mode when the consumer does not specify one (aligns with Prism /v1/route/decide)"
54
+ },
55
+ "provider_routes": {
56
+ "type": "array",
57
+ "minItems": 1,
58
+ "description": "Ordered provider/model routes; lower priority value = higher preference within the same optimize mode",
59
+ "items": {
60
+ "$ref": "#/$defs/provider_route"
61
+ }
62
+ },
63
+ "signing_info": {
64
+ "$ref": "#/$defs/signing_info",
65
+ "description": "Optional publisher signature metadata (future registry use; not required for draft packs)"
66
+ },
67
+ "metadata": {
68
+ "type": "object",
69
+ "description": "Opaque publisher metadata (tags, docs links, billing hints)",
70
+ "additionalProperties": true
71
+ }
72
+ },
73
+ "additionalProperties": false,
74
+ "$defs": {
75
+ "provider_route": {
76
+ "type": "object",
77
+ "required": ["provider", "model", "priority"],
78
+ "additionalProperties": false,
79
+ "properties": {
80
+ "provider": {
81
+ "type": "string",
82
+ "pattern": "^[a-z0-9][a-z0-9-_]{1,63}$",
83
+ "description": "Provider id — must match an ai-protocol v2 provider manifest id"
84
+ },
85
+ "model": {
86
+ "type": "string",
87
+ "minLength": 1,
88
+ "description": "Model id within the provider manifest metadata.models"
89
+ },
90
+ "priority": {
91
+ "type": "integer",
92
+ "minimum": 0,
93
+ "description": "Route preference rank (0 = primary)"
94
+ },
95
+ "cost_weight": {
96
+ "type": "number",
97
+ "minimum": 0,
98
+ "maximum": 1,
99
+ "description": "Relative cost weight for balanced optimize mode (0 = ignore cost, 1 = cost-only)"
100
+ },
101
+ "capability_tags": {
102
+ "type": "array",
103
+ "items": {
104
+ "type": "string",
105
+ "minLength": 1
106
+ },
107
+ "uniqueItems": true,
108
+ "description": "Capability tags for filtering (e.g. chat, reasoning, vision)"
109
+ },
110
+ "notes": {
111
+ "type": "string",
112
+ "description": "Publisher notes for this route (alias handling, SLA caveats)"
113
+ }
114
+ }
115
+ },
116
+ "signing_info": {
117
+ "type": "object",
118
+ "additionalProperties": false,
119
+ "properties": {
120
+ "publisher": {
121
+ "type": "string",
122
+ "description": "Publisher identity (org or individual)"
123
+ },
124
+ "signed_at": {
125
+ "type": "string",
126
+ "format": "date-time",
127
+ "description": "ISO-8601 signature timestamp"
128
+ },
129
+ "algorithm": {
130
+ "type": "string",
131
+ "enum": ["ed25519", "rsa-pss-sha256"],
132
+ "description": "Signature algorithm identifier"
133
+ },
134
+ "public_key_id": {
135
+ "type": "string",
136
+ "description": "Key id for verifying the pack manifest signature"
137
+ },
138
+ "signature": {
139
+ "type": "string",
140
+ "description": "Base64-encoded detached signature over canonical JSON (registry TBD)"
141
+ }
142
+ }
143
+ }
144
+ }
145
+ }
@@ -101,6 +101,51 @@
101
101
  "id_field": { "type": "string" },
102
102
  "content_field": { "type": "string" }
103
103
  }
104
+ },
105
+ "document": {
106
+ "type": "object",
107
+ "description": "Maps ContentBlock::Document to provider-native document or inline payload",
108
+ "properties": {
109
+ "format": {
110
+ "type": "string",
111
+ "enum": ["anthropic_document", "gemini_inline_data", "openai_file"],
112
+ "description": "Wire shape family for document blocks"
113
+ },
114
+ "source_wrapper": {
115
+ "type": "string",
116
+ "enum": ["anthropic_source", "gemini_inline_data", "openai_file"],
117
+ "description": "Nested source object style (Anthropic base64/url source)"
118
+ },
119
+ "base64_field": {
120
+ "type": "string",
121
+ "description": "JSON path to base64 payload relative to encoded block (e.g. source.data, inlineData.data)"
122
+ },
123
+ "mime_type_field": {
124
+ "type": "string",
125
+ "description": "JSON path to MIME type (e.g. source.media_type, inlineData.mimeType)"
126
+ },
127
+ "type_field": {
128
+ "type": "string",
129
+ "description": "Top-level discriminator value when provider uses typed content blocks (e.g. document)"
130
+ },
131
+ "default_mime_type": {
132
+ "type": "string",
133
+ "default": "application/pdf",
134
+ "description": "Fallback MIME when unified block omits mime_type"
135
+ },
136
+ "ref_resolution": {
137
+ "type": "string",
138
+ "enum": ["error_before_encode", "resolve_at_runtime"],
139
+ "default": "error_before_encode",
140
+ "description": "Whether document ref must be resolved before encoder runs"
141
+ },
142
+ "supported": {
143
+ "type": "boolean",
144
+ "default": true,
145
+ "description": "Explicit opt-out when api_style lacks native document blocks"
146
+ }
147
+ },
148
+ "additionalProperties": false
104
149
  }
105
150
  },
106
151
  "additionalProperties": false
@@ -190,12 +190,25 @@
190
190
  },
191
191
  "metadata": {
192
192
  "type": "object",
193
- "additionalProperties": true,
194
- "description": "Additional provider-specific metadata"
193
+ "description": "Additional provider-specific metadata",
194
+ "properties": {
195
+ "models": {
196
+ "type": "object",
197
+ "description": "Model-level capacity and operational metadata keyed by model id",
198
+ "additionalProperties": {
199
+ "$ref": "./metadata-model-entry.json"
200
+ }
201
+ }
202
+ },
203
+ "additionalProperties": true
195
204
  },
196
205
  "pricing": {
197
206
  "$ref": "./pricing.json",
198
207
  "description": "Optional pricing for cost estimation (per 1k tokens)"
208
+ },
209
+ "tool_calling": {
210
+ "$ref": "./tool-calling.json",
211
+ "description": "Native function calling and text fallback configuration (optional)"
199
212
  }
200
213
  },
201
214
  "additionalProperties": false