@every-app/sdk 0.3.0-rc.1 → 0.3.0-rc.3

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 (91) hide show
  1. package/LICENSE +21 -0
  2. package/dist/cloudflare/index.d.ts +2 -2
  3. package/dist/cloudflare/index.d.ts.map +1 -1
  4. package/dist/cloudflare/index.js +1 -1
  5. package/dist/cloudflare/sentinel.d.ts +39 -1
  6. package/dist/cloudflare/sentinel.d.ts.map +1 -1
  7. package/dist/cloudflare/sentinel.js +22 -1
  8. package/dist/cloudflare/worker.d.ts +205 -7
  9. package/dist/cloudflare/worker.d.ts.map +1 -1
  10. package/dist/cloudflare/worker.js +174 -11
  11. package/dist/internal/aiDefault.d.ts +141 -0
  12. package/dist/internal/aiDefault.d.ts.map +1 -0
  13. package/dist/internal/aiDefault.js +204 -0
  14. package/dist/internal/aiProviders.d.ts +4 -1
  15. package/dist/internal/aiProviders.d.ts.map +1 -1
  16. package/dist/internal/aiProviders.js +5 -1
  17. package/dist/internal/appSettings.d.ts +20 -2
  18. package/dist/internal/appSettings.d.ts.map +1 -1
  19. package/dist/internal/appSettings.js +53 -7
  20. package/dist/internal/audit.d.ts +108 -0
  21. package/dist/internal/audit.d.ts.map +1 -0
  22. package/dist/internal/audit.js +235 -0
  23. package/dist/internal/capabilities.d.ts +2315 -141
  24. package/dist/internal/capabilities.d.ts.map +1 -1
  25. package/dist/internal/capabilities.js +122 -0
  26. package/dist/internal/catalog/commerce.d.ts +394 -0
  27. package/dist/internal/catalog/commerce.d.ts.map +1 -0
  28. package/dist/internal/catalog/commerce.js +477 -0
  29. package/dist/internal/catalog/comms.d.ts +338 -0
  30. package/dist/internal/catalog/comms.d.ts.map +1 -0
  31. package/dist/internal/catalog/comms.js +477 -0
  32. package/dist/internal/catalog/index.d.ts +1936 -0
  33. package/dist/internal/catalog/index.d.ts.map +1 -0
  34. package/dist/internal/catalog/index.js +19 -0
  35. package/dist/internal/catalog/inference.d.ts +393 -0
  36. package/dist/internal/catalog/inference.d.ts.map +1 -0
  37. package/dist/internal/catalog/inference.js +457 -0
  38. package/dist/internal/catalog/infra.d.ts +423 -0
  39. package/dist/internal/catalog/infra.d.ts.map +1 -0
  40. package/dist/internal/catalog/infra.js +543 -0
  41. package/dist/internal/catalog/search.d.ts +400 -0
  42. package/dist/internal/catalog/search.d.ts.map +1 -0
  43. package/dist/internal/catalog/search.js +463 -0
  44. package/dist/internal/devProviders.d.ts +2 -2
  45. package/dist/internal/devProviders.d.ts.map +1 -1
  46. package/dist/internal/devProviders.js +19 -1
  47. package/dist/internal/events.d.ts +13 -2
  48. package/dist/internal/events.d.ts.map +1 -1
  49. package/dist/internal/events.js +21 -3
  50. package/dist/internal/gatewaySettings.d.ts +2 -1
  51. package/dist/internal/gatewaySettings.d.ts.map +1 -1
  52. package/dist/internal/gatewaySettings.js +10 -2
  53. package/dist/internal/index.d.ts +5 -0
  54. package/dist/internal/index.d.ts.map +1 -1
  55. package/dist/internal/index.js +5 -0
  56. package/dist/internal/oauthPresets.d.ts +29 -0
  57. package/dist/internal/oauthPresets.d.ts.map +1 -0
  58. package/dist/internal/oauthPresets.js +534 -0
  59. package/dist/internal/oauthScopes.d.ts +56 -1
  60. package/dist/internal/oauthScopes.d.ts.map +1 -1
  61. package/dist/internal/oauthScopes.js +98 -4
  62. package/dist/internal/oauthSpec.d.ts +59 -0
  63. package/dist/internal/oauthSpec.d.ts.map +1 -0
  64. package/dist/internal/oauthSpec.js +676 -0
  65. package/dist/internal/protocol.d.ts +11 -0
  66. package/dist/internal/protocol.d.ts.map +1 -1
  67. package/dist/internal/protocol.js +9 -0
  68. package/dist/internal/providerRegistry.d.ts +17 -6
  69. package/dist/internal/providerRegistry.d.ts.map +1 -1
  70. package/dist/internal/providerRegistry.js +51 -2
  71. package/dist/internal/providerSpec.d.ts +11 -7
  72. package/dist/internal/providerSpec.d.ts.map +1 -1
  73. package/dist/internal/providerSpec.js +142 -33
  74. package/dist/internal/signInProviders.d.ts +104 -0
  75. package/dist/internal/signInProviders.d.ts.map +1 -0
  76. package/dist/internal/signInProviders.js +245 -0
  77. package/dist/server/ai.d.ts +45 -0
  78. package/dist/server/ai.d.ts.map +1 -0
  79. package/dist/server/ai.js +40 -0
  80. package/dist/server/connectUrl.d.ts +21 -0
  81. package/dist/server/connectUrl.d.ts.map +1 -0
  82. package/dist/server/connectUrl.js +37 -0
  83. package/dist/server/gatewayFetch.d.ts.map +1 -1
  84. package/dist/server/gatewayFetch.js +72 -8
  85. package/dist/server/index.d.ts +4 -2
  86. package/dist/server/index.d.ts.map +1 -1
  87. package/dist/server/index.js +3 -1
  88. package/dist/server/integrationFetch.d.ts +39 -2
  89. package/dist/server/integrationFetch.d.ts.map +1 -1
  90. package/dist/server/integrationFetch.js +177 -13
  91. package/package.json +12 -12
@@ -0,0 +1,457 @@
1
+ export const INFERENCE = {
2
+ // Bearer is the documented header today; x-api-key is the legacy fallback. A workspace-scoped key keeps anthropic-workspace-id harmless.
3
+ anthropic: {
4
+ mode: "ai",
5
+ label: "Anthropic",
6
+ description: "Claude models through the Messages API.",
7
+ auth: {
8
+ kind: "bearer",
9
+ secret: "ANTHROPIC_API_KEY",
10
+ },
11
+ docs: "https://platform.claude.com/settings/keys",
12
+ api: "https://platform.claude.com/docs/en/api/overview",
13
+ origin: "https://api.anthropic.com",
14
+ inferenceRoutes: [
15
+ "/v1/messages",
16
+ "/v1/messages/count_tokens",
17
+ // Anthropic's OpenAI-compatible chat completions (its docs: not a
18
+ // long-term solution; `strict` is ignored): what the default route
19
+ // maps onto when Anthropic is the Gateway's default.
20
+ "/v1/chat/completions",
21
+ ],
22
+ unstoredRoutes: ["/v1/chat/completions"],
23
+ // The Messages API is the shape an app pins `anthropic` for.
24
+ shape: "anthropic",
25
+ chat: { path: "/v1/chat/completions", model: "claude-haiku-5-5" },
26
+ aig: { slug: "anthropic" },
27
+ hint: "An API key from the Claude Console's API keys page; the Gateway sends it as a bearer token. Apps send the anthropic-version header themselves.",
28
+ secrets: [
29
+ {
30
+ name: "ANTHROPIC_API_KEY",
31
+ hint: "A key scoped to one workspace, so no call needs an anthropic-workspace-id header.",
32
+ },
33
+ ],
34
+ smoke: {
35
+ method: "GET",
36
+ path: "/v1/models",
37
+ expect: [200],
38
+ free: true,
39
+ note: "Send an anthropic-version header, as every call does.",
40
+ },
41
+ rate: {
42
+ note: "Requests and tokens per minute by usage tier, on the Console's Rate limits page; token counting is free, with its own per-minute limit.",
43
+ },
44
+ example: "summarize this support thread in three bullet points",
45
+ verified: {
46
+ on: "2026-10-25",
47
+ how: "docs",
48
+ },
49
+ tags: ["ai", "llm"],
50
+ },
51
+ gemini: {
52
+ mode: "ai",
53
+ label: "Google Gemini",
54
+ description: "Google's Gemini models through their OpenAI-compatible endpoint: chat, embeddings, images.",
55
+ auth: {
56
+ kind: "bearer",
57
+ secret: "GEMINI_API_KEY",
58
+ },
59
+ docs: "https://aistudio.google.com/apikey",
60
+ api: "https://ai.google.dev/gemini-api/docs/openai",
61
+ origin: "https://generativelanguage.googleapis.com",
62
+ inferenceRoutes: [
63
+ "/v1beta/openai/chat/completions",
64
+ "/v1beta/openai/embeddings",
65
+ "/v1beta/openai/images/generations",
66
+ ],
67
+ chat: {
68
+ path: "/v1beta/openai/chat/completions",
69
+ model: "gemini-3.1-flash-lite",
70
+ },
71
+ embeddings: {
72
+ path: "/v1beta/openai/embeddings",
73
+ model: "gemini-embedding-001",
74
+ },
75
+ // No `aig`: AI Gateway documents Google AI Studio's native form only
76
+ // (/v1/models/{model}:generateContent), not these OpenAI-shaped paths.
77
+ hint: "An API key from Google AI Studio; the Gateway sends it as a bearer token. Apps call Gemini's OpenAI-shaped paths under /v1beta/openai.",
78
+ secrets: [
79
+ {
80
+ name: "GEMINI_API_KEY",
81
+ hint: "A Google AI Studio key restricted to the Gemini API only.",
82
+ },
83
+ ],
84
+ smoke: {
85
+ method: "GET",
86
+ path: "/v1beta/openai/models",
87
+ expect: [200],
88
+ free: true,
89
+ },
90
+ rate: {
91
+ note: "Per project, not per key: requests and tokens per minute and requests per day, by tier (Free, then Tiers 1 to 3).",
92
+ },
93
+ example: "describe what is in this product photo",
94
+ verified: {
95
+ on: "2026-10-25",
96
+ how: "docs",
97
+ },
98
+ tags: ["ai", "llm", "embeddings", "images"],
99
+ },
100
+ mistral: {
101
+ mode: "ai",
102
+ label: "Mistral AI",
103
+ description: "Mistral's models: chat, code completion, embeddings, moderation, OCR, speech.",
104
+ auth: {
105
+ kind: "bearer",
106
+ secret: "MISTRAL_API_KEY",
107
+ },
108
+ docs: "https://console.mistral.ai",
109
+ api: "https://docs.mistral.ai/api/",
110
+ origin: "https://api.mistral.ai",
111
+ inferenceRoutes: [
112
+ "/v1/chat/completions",
113
+ "/v1/fim/completions",
114
+ "/v1/embeddings",
115
+ "/v1/moderations",
116
+ "/v1/chat/moderations",
117
+ "/v1/classifications",
118
+ "/v1/chat/classifications",
119
+ "/v1/ocr",
120
+ "/v1/audio/transcriptions",
121
+ "/v1/audio/speech",
122
+ ],
123
+ chat: { path: "/v1/chat/completions", model: "mistral-small-latest" },
124
+ embeddings: { path: "/v1/embeddings", model: "mistral-embed" },
125
+ aig: { slug: "mistral" },
126
+ hint: "An API key from API Keys in the Mistral Studio console; the Gateway sends it as a bearer token. Free mode needs no card; usage and rate limits apply.",
127
+ secrets: [
128
+ {
129
+ name: "MISTRAL_API_KEY",
130
+ hint: "A key from API Keys in the Studio console, with an expiry date.",
131
+ },
132
+ ],
133
+ smoke: {
134
+ method: "GET",
135
+ path: "/v1/models",
136
+ expect: [200],
137
+ free: true,
138
+ },
139
+ example: "extract the text from this scanned invoice",
140
+ verified: {
141
+ on: "2026-10-25",
142
+ how: "docs",
143
+ },
144
+ tags: ["ai", "llm", "ocr", "embeddings"],
145
+ },
146
+ groq: {
147
+ mode: "ai",
148
+ label: "Groq",
149
+ description: "Open models on Groq through OpenAI's API shape: chat, responses, transcription, speech.",
150
+ auth: {
151
+ kind: "bearer",
152
+ secret: "GROQ_API_KEY",
153
+ },
154
+ docs: "https://console.groq.com/keys",
155
+ api: "https://console.groq.com/docs/api-reference",
156
+ origin: "https://api.groq.com",
157
+ inferenceRoutes: [
158
+ "/openai/v1/chat/completions",
159
+ "/openai/v1/responses",
160
+ "/openai/v1/audio/transcriptions",
161
+ "/openai/v1/audio/translations",
162
+ "/openai/v1/audio/speech",
163
+ ],
164
+ chat: { path: "/openai/v1/chat/completions", model: "openai/gpt-oss-20b" },
165
+ // AI Gateway's Groq endpoint takes the path without `/openai/v1`.
166
+ aig: { slug: "groq", trim: "/openai/v1" },
167
+ hint: "An API key from the Groq console; the Gateway sends it as a bearer token. Apps call the OpenAI-shaped paths under /openai/v1.",
168
+ secrets: [
169
+ {
170
+ name: "GROQ_API_KEY",
171
+ hint: "A key from the API Keys page of the Groq console.",
172
+ },
173
+ ],
174
+ smoke: {
175
+ method: "GET",
176
+ path: "/openai/v1/models",
177
+ expect: [200],
178
+ free: true,
179
+ },
180
+ rate: {
181
+ note: "Requests and tokens per minute and per day, per model and plan, for the whole organization; the console Limits page shows them.",
182
+ },
183
+ example: "transcribe this voice memo",
184
+ verified: {
185
+ on: "2026-10-25",
186
+ how: "docs",
187
+ },
188
+ tags: ["ai", "llm", "speech"],
189
+ },
190
+ cohere: {
191
+ mode: "ai",
192
+ label: "Cohere",
193
+ description: "Cohere's models: chat, embeddings, reranking, classification, transcription, document parsing.",
194
+ auth: {
195
+ kind: "bearer",
196
+ secret: "COHERE_API_KEY",
197
+ },
198
+ docs: "https://dashboard.cohere.com/api-keys",
199
+ api: "https://docs.cohere.com/reference/about",
200
+ origin: "https://api.cohere.com",
201
+ inferenceRoutes: [
202
+ "/v2/chat",
203
+ "/v2/embed",
204
+ "/v2/rerank",
205
+ "/v1/classify",
206
+ "/v2/audio/transcriptions",
207
+ "/v2/parse",
208
+ "/v1/tokenize",
209
+ "/v1/detokenize",
210
+ ],
211
+ // Cohere's own v2 shape: pinned by an app that speaks it, never the
212
+ // default (its OpenAI-compatible endpoint is on another host,
213
+ // api.cohere.ai). No `aig`: AI Gateway documents v1 paths only.
214
+ shape: "other",
215
+ hint: "An API key from the Cohere dashboard; the Gateway sends it as a bearer token. Trial keys are free and limited; production keys are paid.",
216
+ secrets: [
217
+ {
218
+ name: "COHERE_API_KEY",
219
+ hint: "A production key; a trial key is limited to 1,000 calls a month.",
220
+ },
221
+ ],
222
+ smoke: {
223
+ method: "GET",
224
+ path: "/v1/models",
225
+ expect: [200],
226
+ free: true,
227
+ },
228
+ rate: {
229
+ note: "Production: 500 calls a minute for Command A chat and most endpoints, rerank 1,000. Trial: 20 chat calls a minute, 1,000 calls a month.",
230
+ },
231
+ example: "rerank these search results for the query refund policy",
232
+ verified: {
233
+ on: "2026-10-25",
234
+ how: "docs",
235
+ },
236
+ tags: ["ai", "llm", "embeddings", "rerank"],
237
+ },
238
+ voyage: {
239
+ mode: "api_key",
240
+ label: "Voyage AI",
241
+ description: "Embeddings and rerankers for search and retrieval: text, code, multimodal, contextualized chunks.",
242
+ auth: {
243
+ kind: "bearer",
244
+ secret: "VOYAGE_API_KEY",
245
+ },
246
+ docs: "https://dashboard.voyageai.com/organization/api-keys",
247
+ api: "https://docs.voyageai.com/reference/embeddings-api",
248
+ hosts: ["api.voyageai.com"],
249
+ data: "per-call",
250
+ access: ["read"],
251
+ readMethods: ["POST"],
252
+ accountWidePaths: [
253
+ ["v1", "files"],
254
+ ["v1", "batches"],
255
+ ],
256
+ hint: "A secret key from the Voyage dashboard; the Gateway sends it as a bearer token. Apps POST to /v1/embeddings, /v1/multimodalembeddings, /v1/contextualizedembeddings and /v1/rerank.",
257
+ secrets: [
258
+ {
259
+ name: "VOYAGE_API_KEY",
260
+ hint: "A secret key from API keys in the Voyage dashboard.",
261
+ },
262
+ ],
263
+ smoke: {
264
+ method: "GET",
265
+ path: "/v1/batches",
266
+ expect: [200],
267
+ free: true,
268
+ note: "Lists the organization's batches, so the Gateway refuses it for apps; run it from the person's terminal.",
269
+ },
270
+ cost: {
271
+ unit: "token",
272
+ note: "voyage-4 $0.06 per million tokens; the first 200 million tokens of the voyage-4 family are free per account.",
273
+ },
274
+ rate: {
275
+ perMinute: 2000,
276
+ note: "2,000 requests a minute at tier 1, doubled at tier 2, tripled at tier 3; tokens per minute vary by model.",
277
+ },
278
+ example: "embed these product descriptions for semantic search",
279
+ verified: {
280
+ on: "2026-10-25",
281
+ how: "docs",
282
+ },
283
+ tags: ["embeddings", "rerank", "search"],
284
+ },
285
+ perplexity: {
286
+ mode: "api_key",
287
+ label: "Perplexity",
288
+ description: "Web-grounded answers from the Agent API, raw web search results, and embeddings.",
289
+ auth: {
290
+ kind: "bearer",
291
+ secret: "PERPLEXITY_API_KEY",
292
+ },
293
+ docs: "https://console.perplexity.ai/project/keys",
294
+ api: "https://docs.perplexity.ai/api-reference/agent-post",
295
+ hosts: ["api.perplexity.ai"],
296
+ data: "per-call",
297
+ access: ["read"],
298
+ readMethods: ["GET", "POST"],
299
+ accountWidePaths: [
300
+ ["v1", "batches"],
301
+ ["v1", "files"],
302
+ ["v1", "skills"],
303
+ ["v1", "analytics"],
304
+ ["v2", "analytics"],
305
+ ["generate_auth_token"],
306
+ ["revoke_auth_token"],
307
+ ],
308
+ hint: "An API key from the Perplexity console; the Gateway sends it as a bearer token. Apps POST to /v1/agent for researched answers and /search for result lists, and GET /v1/agent/{id} to poll a background run.",
309
+ secrets: [
310
+ {
311
+ name: "PERPLEXITY_API_KEY",
312
+ hint: "An API key from the project's API keys page in the Perplexity console.",
313
+ },
314
+ ],
315
+ smoke: {
316
+ method: "GET",
317
+ path: "/orchestrator/v1/models",
318
+ expect: [200],
319
+ free: true,
320
+ },
321
+ cost: {
322
+ unit: "token",
323
+ note: "Agent API per token plus tool fees (web_search $0.0025 a call); Search API $5 per 1,000 requests.",
324
+ },
325
+ example: "research the latest pricing changes from our three main competitors",
326
+ verified: {
327
+ on: "2026-10-25",
328
+ how: "docs",
329
+ },
330
+ tags: ["search", "ai", "research"],
331
+ },
332
+ // r.jina.ai's /echo reflects the request, key included: refused as an account-wide path.
333
+ jina: {
334
+ mode: "api_key",
335
+ label: "Jina AI",
336
+ description: "Reads web pages as Markdown, searches the web, and embeds and reranks text and images.",
337
+ auth: {
338
+ kind: "bearer",
339
+ secret: "JINA_API_KEY",
340
+ },
341
+ docs: "https://jina.ai/api-dashboard/key-manager",
342
+ api: "https://docs.jina.ai/",
343
+ hosts: ["api.jina.ai", "r.jina.ai", "s.jina.ai"],
344
+ data: "per-call",
345
+ access: ["read"],
346
+ readMethods: ["GET", "POST"],
347
+ accountWidePaths: [["v1", "batches"], ["echo"]],
348
+ hint: 'An API key from the Jina API dashboard; the Gateway sends it as a bearer token. Reader is r.jina.ai (POST {"url": ...}), Search is s.jina.ai, and embeddings and rerank are on api.jina.ai.',
349
+ secrets: [
350
+ {
351
+ name: "JINA_API_KEY",
352
+ hint: "A key starting jina_, from Manage API Key in the Jina API dashboard.",
353
+ },
354
+ ],
355
+ smoke: {
356
+ method: "GET",
357
+ host: "api.jina.ai",
358
+ path: "/v1/batches",
359
+ expect: [200],
360
+ free: true,
361
+ note: "Lists the account's batch jobs, so the Gateway refuses it for apps; run it from the person's terminal.",
362
+ },
363
+ cost: {
364
+ unit: "token",
365
+ note: "Billed in tokens against the account balance; GET /v1/models lists each model's price.",
366
+ },
367
+ rate: {
368
+ note: "Reader 500 requests a minute, Search 100, embeddings and rerank 500; premium keys get ten times more.",
369
+ },
370
+ example: "read this article as Markdown and pull out the key claims",
371
+ verified: {
372
+ on: "2026-10-25",
373
+ how: "docs",
374
+ },
375
+ tags: ["scrape", "search", "embeddings", "rerank"],
376
+ },
377
+ replicate: {
378
+ mode: "api_key",
379
+ label: "Replicate",
380
+ description: "Runs open-source and official models by API: images, video, audio and language.",
381
+ auth: {
382
+ kind: "bearer",
383
+ secret: "REPLICATE_API_TOKEN",
384
+ },
385
+ docs: "https://replicate.com/account/api-tokens",
386
+ api: "https://replicate.com/docs/reference/http",
387
+ hosts: ["api.replicate.com"],
388
+ data: "per-call",
389
+ access: ["read"],
390
+ readMethods: ["POST"],
391
+ accountWidePaths: [
392
+ ["v1", "account"],
393
+ ["v1", "deployments"],
394
+ ["v1", "files"],
395
+ ["v1", "webhooks"],
396
+ ["trainings"],
397
+ ],
398
+ hint: "An API token from Replicate's API tokens page; the Gateway sends it as a bearer token. Apps POST to /v1/models/{owner}/{name}/predictions or /v1/predictions with Prefer: wait (up to 60 seconds), or pass a webhook URL for longer runs.",
399
+ secrets: [
400
+ {
401
+ name: "REPLICATE_API_TOKEN",
402
+ hint: "An API token from the API tokens page of the Replicate account.",
403
+ },
404
+ ],
405
+ smoke: {
406
+ method: "GET",
407
+ path: "/v1/account",
408
+ expect: [200],
409
+ free: true,
410
+ note: "Account-wide, so the Gateway refuses it for apps; run it from the person's terminal.",
411
+ },
412
+ rate: {
413
+ perMinute: 600,
414
+ note: "Creating predictions 600 a minute; every other endpoint 3,000 a minute.",
415
+ },
416
+ example: "generate a product photo of a ceramic mug on a wooden table",
417
+ verified: {
418
+ on: "2026-10-25",
419
+ how: "docs",
420
+ },
421
+ tags: ["ai", "images", "video", "audio"],
422
+ },
423
+ // The router forwards X-HF-Bill-To as sent, so an app can bill any organization the token's user belongs to (TODO.md).
424
+ huggingface: {
425
+ mode: "api_key",
426
+ label: "Hugging Face Inference",
427
+ description: "Open models from Hugging Face's inference providers through one router: chat, embeddings, images, speech.",
428
+ auth: {
429
+ kind: "bearer",
430
+ secret: "HUGGINGFACE_API_TOKEN",
431
+ },
432
+ docs: "https://huggingface.co/settings/tokens/new?ownUserPermissions=inference.serverless.write&tokenType=fineGrained",
433
+ api: "https://huggingface.co/docs/inference-providers/index",
434
+ hosts: ["router.huggingface.co"],
435
+ data: "per-call",
436
+ access: ["read"],
437
+ readMethods: ["GET", "POST"],
438
+ accountWidePaths: [],
439
+ hint: "A fine-grained access token from Hugging Face settings with the Inference Providers permission; the Gateway sends it as a bearer token. Apps POST OpenAI-style chat to /v1/chat/completions, or other tasks under /<provider>/, such as /hf-inference/models/<model>.",
440
+ secrets: [
441
+ {
442
+ name: "HUGGINGFACE_API_TOKEN",
443
+ hint: "A fine-grained token with only the Make calls to Inference Providers permission.",
444
+ },
445
+ ],
446
+ cost: {
447
+ unit: "call",
448
+ note: "Pay as you go at each provider's own rate with no markup; PRO accounts get $2 of compute credits a month.",
449
+ },
450
+ example: "embed these support articles for semantic search",
451
+ verified: {
452
+ on: "2026-10-25",
453
+ how: "docs",
454
+ },
455
+ tags: ["ai", "llm", "embeddings", "images"],
456
+ },
457
+ };