@juspay/neurolink 12.45.2 → 12.46.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.
- package/CHANGELOG.md +3 -3
- package/README.md +1 -1
- package/dist/browser/neurolink.min.js +401 -401
- package/dist/factories/mediaHandlerCatalog.js +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/types/tts.d.ts +1 -1
- package/dist/types/voice.d.ts +1 -1
- package/dist/voice/index.d.ts +1 -0
- package/dist/voice/index.js +3 -0
- package/dist/voice/providers/SixtyDBTTS.d.ts +23 -0
- package/dist/voice/providers/SixtyDBTTS.js +390 -0
- package/docs-site/static/search-index.json +37 -28
- package/package.json +2 -1
|
@@ -4511,9 +4511,9 @@
|
|
|
4511
4511
|
{"objectID":"19352c9bf82d208bbd76e4303e3e35ac7d4f7497562a4f1ee006d8cf1fae5f6b","title":"The wording that made this work: a measured A/B result","url":"/docs/features/tool-routing-decision-model#the-wording-that-made-this-work-a-measured-ab-result","content":"The first phrasing tried was the obvious one: \"answering this request will\nrequire calling at least one tool from this server,\" with false meaning\n\"this server is unrelated, OR the request needs no tool at all.\" Measured\nagainst a 10-request × 5-server labelled set, it separated correctly but\nweakly — unrelated servers averaged p = 0.31 and reached as high as\n0.80, so at the 0.6 drop bar only 12 of 39 unneeded servers were\nactually dropped.\n\nThree changes fixed it: naming the server explicitly, asking in the present\ntense about what carrying out the request involves rather than what\n\"will require,\" and splitting the bundled false criterion (which was\nreally two separate claims joined by \"or\") into one single claim. That\nmoved unrelated servers to a mean of p = 0.03 with a maximum of 0.35\n— 37 of 39 dropped at the same 0.6 bar, still with zero wrong drops.\n\nThe lesson generalises past this one question: a decision model reads\nliterally, and an \"or\" in a criterion is two questions wearing one coat. Each\nhalf of a compound criterion pulls the answer toward the middle whenever\nonly one half is true, which is exactly the muddy, hard-to-gate signal the\nfirst version produced.","hierarchy":{"lvl0":"Features","lvl1":"Tool / MCP routing by decision model","lvl2":"The wording that made this work: a measured A/B result","lvl3":""}},
|
|
4512
4512
|
{"objectID":"9c9af1c1ff58051674501cb10c371fdcf50758c935a2dfa168df9719969bb7af","title":"What this is bad at","url":"/docs/features/tool-routing-decision-model#what-this-is-bad-at","content":"It reasons about servers, not individual tools. The unit of decision is\n a whole MCP server; a server with twenty tools where the request needs one\n is kept or dropped as a unit, not tool-by-tool.\nThe description quality bounds the question quality. A server with no\n declared description falls back to a comma-joined list of its own tool\n names, which carries much less signal than a well-written one-line\n description — the wording fix above only helps once the server's own text\n is legible to a literal reader.\nA close call still resolves to \"keep.\" There is no partial exclusion;\n anything from a coin flip up to just under 0.6 confidence is treated\n identically to a confident true.\nIt shares the base model's general limits — literal reading, no\n arithmetic, accuracy sensitive to a noisy or oversized state — all\n described in\n what decide is bad at.\nThe query is untrusted input sent as state, and this module does not\n sanitize it. The blast radius is deliberately bounded instead: server ids\n are never read back off the wire (answers are matched by position, not by\n name), so the worst a crafted query can do is keep more already-registered\n servers than necessary — it cannot register a server that wasn't already\n configured.","hierarchy":{"lvl0":"Features","lvl1":"Tool / MCP routing by decision model","lvl2":"What this is bad at","lvl3":""}},
|
|
4513
4513
|
{"objectID":"b55a36dccb54a184ce24fa850942a8f5455cbe7f4391a23fc94f326aebeae19e","title":"See also","url":"/docs/features/tool-routing-decision-model#see-also","content":"The decide inference type\nModel routing with a decision model\nRelevance-driven compaction","hierarchy":{"lvl0":"Features","lvl1":"Tool / MCP routing by decision model","lvl2":"See also","lvl3":""}},
|
|
4514
|
-
{"objectID":"499945493bd6604fe9de0b7511127a8f248c00e05724562e9c6c1cd6bf63aa97","title":"Text-to-Speech (TTS) Integration Guide","url":"/docs/features/tts","content":"Text-to-Speech (TTS) Integration Guide\n\nNeuroLink provides integrated Text-to-Speech (TTS) capabilities, allowing you to generate high-quality audio from text prompts or AI-generated responses. This feature is perfect for voice assistants, accessibility features, narration, podcasts, and more.\n\nOverview\n\nKey Features:\nMultiple providers - Google Cloud TTS, OpenAI TTS, ElevenLabs, Azure TTS, Fish Audio, and
|
|
4514
|
+
{"objectID":"499945493bd6604fe9de0b7511127a8f248c00e05724562e9c6c1cd6bf63aa97","title":"Text-to-Speech (TTS) Integration Guide","url":"/docs/features/tts","content":"Text-to-Speech (TTS) Integration Guide\n\nNeuroLink provides integrated Text-to-Speech (TTS) capabilities, allowing you to generate high-quality audio from text prompts or AI-generated responses. This feature is perfect for voice assistants, accessibility features, narration, podcasts, and more.\n\nOverview\n\nKey Features:\nMultiple providers - Google Cloud TTS, OpenAI TTS, ElevenLabs, Azure TTS, Fish Audio, Cartesia, and 60db\nHigh-quality voices - Neural, Wavenet, Standard, and multilingual voice types\nMultiple languages - 50+ voices across 10+ languages\nFlexible audio formats - MP3, WAV, OGG/Opus\nVoice customization - Adjust speed, pitch, and volume\nTwo synthesis modes - Direct text-to-speech OR AI response synthesis\nProduction-ready - Works with Google Cloud, OpenAI, ElevenLabs, Azure, Fish Audio, Cartesia, and 60db\n\nQuick Start\n\nInstallation\n\nTTS support is built into NeuroLink. No additional installation required.\n\nEnvironment Setup\n\nSet the appropriate environment variables for your chosen TTS provider:\n\nGoogle API Key Configuration:\n\nIf using API key authentication for Google, enable both APIs in Google Cloud Console:\nNavigate to \"APIs & Services\" > \"Credentials\"\nCreate or select your API key\nUnder \"API restrictions\", enable:\nGenerative Language API (for Gemini)\nCloud Text-to-Speech API (for TTS)\n\nBasic Usage\n\nCLI:\n\nSDK:\n\nSupported Providers\n\nTTS is available through the following providers:\n\n| Provider | Authentication | Voices / Models | Notes |\n| -------------- | ----------------------------------------------------------- | ------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| google-ai | Service Account (GOOGLE_APPLICATION_CREDENTIALS) | 50+ voices (Neural2, Wavenet, Standard) | Same auth as vertex (TTS uses Google Cloud Text-to-Speech client) |\n| vertex | Service Account (GOOGLE_APPLICATION_CREDENTIALS) | 50+ voices (Neural2, Wavenet, Standard) | Recommended for production |\n| openai-tts | API Key (OPENAI_API_KEY) | 6 voices: alloy, echo, fable, onyx, nova, shimmer; models: tts-1, tts-1-hd | Good default quality |\n| elevenlabs | API Key (ELEVENLABS_API_KEY) | Multilingual voices; model: elevenmultilingualv2 | High-quality multilingual synthesis |\n| azure-tts | API Key (AZURE_SPEECH_KEY + region AZURE_SPEECH_REGION) | Neural voices with SSML support | Enterprise-grade Azure Speech |\n| fish-audio | API Key (FISH_AUDIO_API_KEY) | 14 languages, voice cloning (15 s reference); models: s1 (default), speech-1.6, speech-1.5 | Low-cost, ~80% cheaper than ElevenLabs — see provider guide |\n| cartesia | API Key (CARTESIA_API_KEY) | Cartesia voice library, English-first; models: sonic-2 (default), sonic | Low-latency Sonic models — see provider guide. Synchronous /tts/bytes; the WebSocket streaming flow is exposed separately via CartesiaStream in the voice server. |\n| sixtydb | Workspace API key (SIXTYDB_API_KEY) | Quality and fast workspace voice catalogs | WAV or PCM16 at 24 kHz — see prov","hierarchy":{"lvl0":"Features","lvl1":"Text-to-Speech (TTS) Integration Guide","lvl2":"","lvl3":""}},
|
|
4515
4515
|
{"objectID":"9384b791f5d32ea2c126e7a7a7a8852d80e56954c061aba2d9e493b0a9c25f2b","title":"Text-to-Speech (TTS) Integration Guide","url":"/docs/features/tts#text-to-speech-tts-integration-guide","content":"NeuroLink provides integrated Text-to-Speech (TTS) capabilities, allowing you to generate high-quality audio from text prompts or AI-generated responses. This feature is perfect for voice assistants, accessibility features, narration, podcasts, and more.","hierarchy":{"lvl0":"Features","lvl1":"Text-to-Speech (TTS) Integration Guide","lvl2":"Text-to-Speech (TTS) Integration Guide","lvl3":""}},
|
|
4516
|
-
{"objectID":"9cc14837132bc1ce344a44ef8c73aa1b77fe9b81356e3f5e565115a158d47618","title":"Overview","url":"/docs/features/tts#overview","content":"Key Features:\nMultiple providers - Google Cloud TTS, OpenAI TTS, ElevenLabs, Azure TTS, Fish Audio, and
|
|
4516
|
+
{"objectID":"9cc14837132bc1ce344a44ef8c73aa1b77fe9b81356e3f5e565115a158d47618","title":"Overview","url":"/docs/features/tts#overview","content":"Key Features:\nMultiple providers - Google Cloud TTS, OpenAI TTS, ElevenLabs, Azure TTS, Fish Audio, Cartesia, and 60db\nHigh-quality voices - Neural, Wavenet, Standard, and multilingual voice types\nMultiple languages - 50+ voices across 10+ languages\nFlexible audio formats - MP3, WAV, OGG/Opus\nVoice customization - Adjust speed, pitch, and volume\nTwo synthesis modes - Direct text-to-speech OR AI response synthesis\nProduction-ready - Works with Google Cloud, OpenAI, ElevenLabs, Azure, Fish Audio, Cartesia, and 60db","hierarchy":{"lvl0":"Features","lvl1":"Text-to-Speech (TTS) Integration Guide","lvl2":"Overview","lvl3":""}},
|
|
4517
4517
|
{"objectID":"fb806097773dc1e87ec327d66a211bf8490b77fa0bc7fafb95d74effe72bb7a5","title":"Installation","url":"/docs/features/tts#installation","content":"TTS support is built into NeuroLink. No additional installation required.","hierarchy":{"lvl0":"Features","lvl1":"Text-to-Speech (TTS) Integration Guide","lvl2":"Installation","lvl3":""}},
|
|
4518
4518
|
{"objectID":"94f9f3f0dc63ff1c28db27aaedc66128752d84a828cdb6a23d4eaa4e7f08f67a","title":"Environment Setup","url":"/docs/features/tts#environment-setup","content":"Set the appropriate environment variables for your chosen TTS provider:\n\n`bash","hierarchy":{"lvl0":"Features","lvl1":"Text-to-Speech (TTS) Integration Guide","lvl2":"Environment Setup","lvl3":""}},
|
|
4519
4519
|
{"objectID":"d491cece29e9fe21abe77a04f3f4369b1c391cf0b0b56ecfe365f4c5c0c6fe0c","title":"Cartesia TTS (cartesia) — low-latency Sonic models, voice cloning","url":"/docs/features/tts#cartesia-tts-cartesia-low-latency-sonic-models-voice-cloning","content":"`\n\nGoogle API Key Configuration:\n\nIf using API key authentication for Google, enable both APIs in Google Cloud Console:\nNavigate to \"APIs & Services\" > \"Credentials\"\nCreate or select your API key\nUnder \"API restrictions\", enable:\nGenerative Language API (for Gemini)\nCloud Text-to-Speech API (for TTS)","hierarchy":{"lvl0":"Features","lvl1":"Text-to-Speech (TTS) Integration Guide","lvl2":"Cartesia TTS (cartesia) — low-latency Sonic models, voice cloning","lvl3":""}},
|
|
@@ -5692,10 +5692,10 @@
|
|
|
5692
5692
|
{"objectID":"1851e6d139da310cbf80236f9546ee5916deabb56bc9613a32858da70cc4f1d4","title":"Verification status","url":"/docs/getting-started/providers/deepinfra#verification-status","content":"Tier-2 onboarding requires evidence before a provider is accepted, and\npnpm run verify:provider-onboarding gates it in CI. This is what the\ncatalog currently records for DeepInfra — docs- and roster-verified, not\nlive-verified:\n\n| Probe | Result |\n| ------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| Roster | unauthenticated GET /v1/openai/models, HTTP 200, 187 models, 2026-09-28 — no key used |\n| Billing | public pricing page confirms \"You have to add a card or pre-pay or you won't be able to use our services\" — no free tier, 2026-09-28 |\n| Auth-failure shape | not documented anywhere DeepInfra publishes (docs site has no errors page; the public OpenAPI spec at api.deepinfra.com/openapi.json documents only 200/422 for chat/completions) and not probed live — errorRules is empty |\n| Tools / structured output | documented on docs.deepinfra.com/chat/tool-calling and /chat/structured-outputs respectively; neither was exercised live, and no combined tools+schema request was sent — structuredOutputWithTools stays false |\n| Live capability sweep | not run. evidence.liveMatrix is null. Before treating this provider as production-ready, run npx tsx test/continuous-test-suite-provider-matrix.ts --provider=deepinfra with a real key and record the result","hierarchy":{"lvl0":"Getting Started","lvl1":"DeepInfra Provider Guide","lvl2":"Verification status","lvl3":""}},
|
|
5693
5693
|
{"objectID":"fb44a1382137d42baf47eb334f37ec240ceaf42aee393a3f83b7c8c611f7ab7d","title":"Troubleshooting","url":"/docs/getting-started/providers/deepinfra#troubleshooting","content":"| Symptom | Cause | Fix |\n| --------------------------------------------- | --------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------ |\n| Requests fail immediately | No card on file / no pre-payment balance | DeepInfra requires billing setup before any request succeeds; add a card or pre-pay |\n| Model not found | The roster changed since 2026-09-28 | Pick a current id from the unauthenticated GET /v1/openai/models roster |\n| Structured output ignored with tools attached | structuredOutputWithTools is false on this entry — untested combination | NeuroLink omits response_format automatically whenever tools are present, before sending |\n| Tool calls not returned | Tool calling on DeepInfra is model-dependent | Use a model DeepInfra names as tool-capable (e.g. the default, or moonshotai/Kimi-K3) |","hierarchy":{"lvl0":"Getting Started","lvl1":"DeepInfra Provider Guide","lvl2":"Troubleshooting","lvl3":""}},
|
|
5694
5694
|
{"objectID":"f6f02175bacb3dbce06e1319e4446333c67507304989d69b5c4c9abc89d81faf","title":"See also","url":"/docs/getting-started/providers/deepinfra#see-also","content":"Provider setup overview\nAll providers\nTier-2 onboarding — how this provider's JSON becomes a working integration\nProvider feature compatibility","hierarchy":{"lvl0":"Getting Started","lvl1":"DeepInfra Provider Guide","lvl2":"See also","lvl3":""}},
|
|
5695
|
-
{"objectID":"f0011413e792381f4d6131f700afe5f7742598666be073cf1f98530c99fd5138","title":"DeepSeek Provider Guide","url":"/docs/getting-started/providers/deepseek","content":"DeepSeek Provider Guide\n\nText and image input with DeepSeek-V4.1-Flash and DeepSeek-V4-Pro through a single API\n\nOverview\n\nDeepSeek is a Chinese AI research lab offering highly capable open-weight models via a hosted cloud API. NeuroLink wraps their OpenAI-compatible endpoint. The API serves two models:\ndeepseek-flash — DeepSeek-V4.1-Flash. Reads images as well as text.\ndeepseek-v4-pro — DeepSeek-V4-Pro-0813. Text only.\n\nThe older ids still work as aliases of deepseek-flash: deepseek-chat answers with thinking off, and deepseek-reasoner answers with thinking on and returns a reasoning trace.\n\nKey Facts\nProtocol: OpenAI-compatible (/v1/chat/completions)\nDefault base URL: https://api.deepseek.com\nContext window: 1M tokens (1,048,576), with up to 384K (393,216) output tokens\nVision: deepseek-flash and its aliases; not deepseek-v4-pro
|
|
5695
|
+
{"objectID":"f0011413e792381f4d6131f700afe5f7742598666be073cf1f98530c99fd5138","title":"DeepSeek Provider Guide","url":"/docs/getting-started/providers/deepseek","content":"DeepSeek Provider Guide\n\nText and image input with DeepSeek-V4.1-Flash and DeepSeek-V4-Pro through a single API\n\nOverview\n\nDeepSeek is a Chinese AI research lab offering highly capable open-weight models via a hosted cloud API. NeuroLink wraps their OpenAI-compatible endpoint. The API serves two models:\ndeepseek-flash — DeepSeek-V4.1-Flash. Reads images as well as text.\ndeepseek-v4-pro — DeepSeek-V4-Pro-0813. Text only.\n\nThe older ids still work as aliases of deepseek-flash: deepseek-chat answers with thinking off, and deepseek-reasoner answers with thinking on and returns a reasoning trace.\n\nKey Facts\nProtocol: OpenAI-compatible (/v1/chat/completions)\nDefault base URL: https://api.deepseek.com\nContext window: 1M tokens (1,048,576), with up to 384K (393,216) output tokens\nVision: deepseek-flash and its aliases; not deepseek-v4-pro\nStreaming: Supported\nTool calling: Supported. Tools and JSON output work in the same request.\nReasoning trace: returned as reasoning_content when thinking is on (deepseek-reasoner)\n\nQuick Start\nGet an API Key\n\nSign up at https://platform.deepseek.com and create an API key under API Keys.\nConfigure Environment\n\nAdd to your .env file:\nInstall NeuroLink\nGenerate Your First Response\n\nSupported Models\n\n| Model ID | Serves | Context | Images | Notes |\n| ------------------- | ------------------- | ------- | ------ | ------------------------------------------------ |\n| deepseek-chat | DeepSeek-V4.1-Flash | 1M | Yes | Default; alias of deepseek-flash, thinking off |\n| deepseek-reasoner | DeepSeek-V4.1-Flash | 1M | Yes | Alias of deepseek-flash, thinking on |\n| deepseek-flash | DeepSeek-V4.1-Flash | 1M | Yes | Thinking on by default |\n| deepseek-v4-pro | DeepSeek-V4-Pro | 1M | No | Thinking on by default |\n\nPass any model ID via --model (CLI) or model: (SDK). GET /models on api.deepseek.com lists only deepseek-flash and deepseek-v4-pro; the two older ids are accepted as aliases.\n\nSDK Usage\n\nBasic Generation\n\nUsing the Reasoner Model\n\nNote: with thinking on, responses take longer because the model reasons before answering.\n\nStreaming\n\nPer-Call Credential Override\n\nPass credentials at call time to override the instance-level or environment-variable defaults. Useful when routing requests for different users through separate DeepSeek accounts.\n\nYou can also override the base URL per call — useful when pointing at a self-hosted OpenAI-compatible proxy in front of DeepSeek:\n\nCLI Usage\n\nBasic Commands\n\nStreaming via CLI\n\nThe CLI streams output by default when a TTY is attached. No extra flags are required.\n\nProvider Aliases\n\nThe DeepSeek provider can be referenced by any of the following names:\n\n| Alias | Example |\n| ---------- | --------------------- |\n| deepseek | --provider deepseek |\n| ds | --provider ds |\n\nConfiguration Reference\n\n| Environment Variable | Required | Default | Description |\n| -------------------- | -------- | -------------------------- | ------------------------------------------- |\n| DEEPSEEK_API_KEY | Yes | — | DeepSeek API key (starts with sk-) |\n| DEEPSEEK_MODEL | No | deepseek-chat | Default model to use |\n| DEEPSEEK_BASE_URL | No | https://api.deepseek.com | Base URL for the API (override for proxies) |\n\nFeature Support Matrix\n\n| Feature | deepseek-chat | deepseek-reasoner | deepseek-flash | deepseek-v4-pro |\n| ----------------- | --------------- | ------------------- | ---------------- | ----------------- |\n| Text generation | Yes | Yes | Yes | Yes |\n| Streaming | Yes | Yes | Yes | Yes |\n| Tool calling | Yes | See below | See below | See below |\n| Structured output | Yes | Not tested | Not tested | Not tested |\n| Vision / images | Yes | Yes | Yes | No |\n| Embeddings | No | No | No | No |\n| Reasoning trace | No | Yes | Yes | Yes |\n\nTroubleshooting\n\n\"Invalid DeepSeek API key\"\n\nThe DEEPSEEK_API_KEY is missing or incorrect.\n\nGet or rotate keys at https://platform.deepseek.com/api_keys.\n\n\"DeepSeek account has insufficient balance\"\n\nYour account credit is exhausted. Top up at https://platform.deepseek.com/usage.\n\n\"DeepSeek rate limit exceeded\"\n\nToo many requests in a short window. Implement exponential backoff or reduce request concurrency. Rate limits are published in the DeepSeek API docs.\n\n\"Model not found\"\n\nDeepSeek answers an unknown id with 400 and ","hierarchy":{"lvl0":"Getting Started","lvl1":"DeepSeek Provider Guide","lvl2":"","lvl3":""}},
|
|
5696
5696
|
{"objectID":"958538aa2497f8c0121993c79063ab03a4e9182ad54e8e826fac34ccf66059d2","title":"DeepSeek Provider Guide","url":"/docs/getting-started/providers/deepseek#deepseek-provider-guide","content":"Text and image input with DeepSeek-V4.1-Flash and DeepSeek-V4-Pro through a single API","hierarchy":{"lvl0":"Getting Started","lvl1":"DeepSeek Provider Guide","lvl2":"DeepSeek Provider Guide","lvl3":""}},
|
|
5697
5697
|
{"objectID":"c3e1684d29fb0fb80d0a6c08cccede4c72627e18920573ed08ace68662625d5e","title":"Overview","url":"/docs/getting-started/providers/deepseek#overview","content":"DeepSeek is a Chinese AI research lab offering highly capable open-weight models via a hosted cloud API. NeuroLink wraps their OpenAI-compatible endpoint. The API serves two models:\ndeepseek-flash — DeepSeek-V4.1-Flash. Reads images as well as text.\ndeepseek-v4-pro — DeepSeek-V4-Pro-0813. Text only.\n\nThe older ids still work as aliases of deepseek-flash: deepseek-chat answers with thinking off, and deepseek-reasoner answers with thinking on and returns a reasoning trace.","hierarchy":{"lvl0":"Getting Started","lvl1":"DeepSeek Provider Guide","lvl2":"Overview","lvl3":""}},
|
|
5698
|
-
{"objectID":"90018a4be75353babd3c1ed5c9f76895280adfbeaad70cff5718ac9f60d46d88","title":"Key Facts","url":"/docs/getting-started/providers/deepseek#key-facts","content":"Protocol: OpenAI-compatible (/v1/chat/completions)\nDefault base URL: https://api.deepseek.com\nContext window: 1M tokens (1,048,576), with up to 384K (393,216) output tokens\nVision: deepseek-flash and its aliases; not deepseek-v4-pro
|
|
5698
|
+
{"objectID":"90018a4be75353babd3c1ed5c9f76895280adfbeaad70cff5718ac9f60d46d88","title":"Key Facts","url":"/docs/getting-started/providers/deepseek#key-facts","content":"Protocol: OpenAI-compatible (/v1/chat/completions)\nDefault base URL: https://api.deepseek.com\nContext window: 1M tokens (1,048,576), with up to 384K (393,216) output tokens\nVision: deepseek-flash and its aliases; not deepseek-v4-pro\nStreaming: Supported\nTool calling: Supported. Tools and JSON output work in the same request.\nReasoning trace: returned as reasoning_content when thinking is on (deepseek-reasoner)","hierarchy":{"lvl0":"Getting Started","lvl1":"DeepSeek Provider Guide","lvl2":"Key Facts","lvl3":""}},
|
|
5699
5699
|
{"objectID":"305803a4e9c944a1b9b2fc22fdcb96e2c1653bbb43e170e0ebc1fc88705f57f2","title":"1. Get an API Key","url":"/docs/getting-started/providers/deepseek#1-get-an-api-key","content":"Sign up at https://platform.deepseek.com and create an API key under API Keys.","hierarchy":{"lvl0":"Getting Started","lvl1":"DeepSeek Provider Guide","lvl2":"1. Get an API Key","lvl3":""}},
|
|
5700
5700
|
{"objectID":"1de6146c363d4139cac7191b36356838a742db03ae156fac5c0c6417c687c370","title":"2. Configure Environment","url":"/docs/getting-started/providers/deepseek#2-configure-environment","content":"Add to your .env file:\n\n`bash","hierarchy":{"lvl0":"Getting Started","lvl1":"DeepSeek Provider Guide","lvl2":"2. Configure Environment","lvl3":""}},
|
|
5701
5701
|
{"objectID":"d24a327297806b341e71999e6add069ebdc54c6b41b66ce4140ba5706de15fa2","title":"Required","url":"/docs/getting-started/providers/deepseek#required","content":"DEEPSEEKAPIKEY=sk-...","hierarchy":{"lvl0":"Getting Started","lvl1":"DeepSeek Provider Guide","lvl2":"Required","lvl3":""}},
|
|
@@ -6103,13 +6103,13 @@
|
|
|
6103
6103
|
{"objectID":"25f1d3278b1488298f5b9109f01c8dde6c5435b8f5e4173ccf44d3e52552381a","title":"Live verification still needed","url":"/docs/getting-started/providers/inco#live-verification-still-needed","content":"Tier-2 onboarding normally requires an authenticated roster probe, an auth\nrejection probe, and a live capability sweep\n(docs/provider-integration/tiers/tier-2-catalog-entry.md). This entry was\nbuilt credential-free — no signup, no key, no POST request to Inco — so\nnone of that could run yet:\n\n| Probe | Result |\n| ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| Roster | Done. Unauthenticated GET /v1/models, HTTP 200, 2026-09-28, 10 models — matches the vendor docs' claim that the catalog \"can be fetched without a key.\" |\n| Docs cross-check | Done. https://platform.inco.ai/docs confirms the OpenAI Chat Completions wire shape, Authorization: Bearer sk-inco-... auth, and the documented error code values (invalid_api_key, key_expired, model_not_found, rate_limit_exceeded, spend_limit_exceeded, credit_balance_exhausted) used to build errorRules — no literal JSON error bodies were shown on the page, only the code table. |\n| A","hierarchy":{"lvl0":"Getting Started","lvl1":"Inco Provider Guide","lvl2":"Live verification still needed","lvl3":""}},
|
|
6104
6104
|
{"objectID":"05f582110af48060e03a60a8669d5104da1b95217c289cebbc9e838740f646d8","title":"Troubleshooting","url":"/docs/getting-started/providers/inco#troubleshooting","content":"| Symptom | Cause | Fix |\n| -------------------------------- | -------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- |\n| Invalid Inco API key | INCO_API_KEY unset, wrong, or expired | Check the key on the dashboard's Keys page (https://platform.inco.ai/keys) |\n| Model not found | The roster changed since 2026-09-28, or the id is mistyped | Pick a current id from the unauthenticated GET /v1/models roster |\n| HTTP 402 on every request | Prepaid balance is empty (credit_balance_exhausted) — no free tier | Top up credit on the dashboard before retrying |\n| HTTP 429, spend_limit_exceeded | Your account's monthly spending cap was hit | Raise the cap on the Limits page, or wait for the next billing cycle |\n| HTTP 429, rate_limit_exceeded | Per-minute request limit hit | Back off and retry; check the x-inco-ratelimit-scope response header (quota vs upstream) |\n| Can't sign up | Access is currently gated by a waitlist, not open signup | Join the waitlist at https://platform.inco.ai/waitlist |","hierarchy":{"lvl0":"Getting Started","lvl1":"Inco Provider Guide","lvl2":"Troubleshooting","lvl3":""}},
|
|
6105
6105
|
{"objectID":"1c1fbb4b7a4dfb07f32bac79e9f5e4ceb900107e47960af3df8300fca99f1d04","title":"See also","url":"/docs/getting-started/providers/inco#see-also","content":"Provider setup overview\nAll providers\nTier-2 onboarding — how this provider's JSON becomes a working integration\nProvider feature compatibility","hierarchy":{"lvl0":"Getting Started","lvl1":"Inco Provider Guide","lvl2":"See also","lvl3":""}},
|
|
6106
|
-
{"objectID":"7c072c8c78d8d180a49a16614547286fe7383a263bca00df6636171ffe874cc5","title":"AI Provider Guides","url":"/docs/getting-started/providers","content":"AI Provider Guides\n\nComplete setup guides for all supported AI providers.\n\n🆓 Free Tier Providers\n\nStart with zero cost using these free-tier options:\n\nHugging Face\n\n100,000+ open-source models\n✅ Free inference API\n🌍 Largest model collection\n🔓 Fully open source\n📊 Models by task: chat, classification, NER, summarization\n\nSetup Guide →\n\nGoogle AI Studio\n\nGemini models with generous free tier\n✅ 1,500 requests/day free\n⚡ Fast Gemini 2.0 Flash\n🎯 15 requests/minute\n💰 Pay-as-you-go option\n\nSetup Guide →\n\n🤖 Direct AI Providers\n\nAccess leading AI models directly from their creators:\n\nOpenAI\n\nGPT-5.4, GPT-5, GPT-4o, and o-series reasoning models\n🧠 GPT-5.4 and GPT-5 series flagships with up to
|
|
6106
|
+
{"objectID":"7c072c8c78d8d180a49a16614547286fe7383a263bca00df6636171ffe874cc5","title":"AI Provider Guides","url":"/docs/getting-started/providers","content":"AI Provider Guides\n\nComplete setup guides for all supported AI providers.\n\n🆓 Free Tier Providers\n\nStart with zero cost using these free-tier options:\n\nHugging Face\n\n100,000+ open-source models\n✅ Free inference API\n🌍 Largest model collection\n🔓 Fully open source\n📊 Models by task: chat, classification, NER, summarization\n\nSetup Guide →\n\nGoogle AI Studio\n\nGemini models with generous free tier\n✅ 1,500 requests/day free\n⚡ Fast Gemini 2.0 Flash\n🎯 15 requests/minute\n💰 Pay-as-you-go option\n\nSetup Guide →\n\n🤖 Direct AI Providers\n\nAccess leading AI models directly from their creators:\n\nOpenAI\n\nGPT-5.4, GPT-5, GPT-4o, and o-series reasoning models\n🧠 GPT-5.4 and GPT-5 series flagships with up to 1.05M context\n👁️ GPT-4o multimodal (vision) and o3 / o3-pro / o4-mini reasoning models\n🔧 Full tool/function calling and embeddings support\n🔑 Auth: API Key (OPENAI_API_KEY)\n\nSetup Guide →\n\nAnthropic\n\nClaude models with API key or OAuth authentication\n🧠 Claude 4.5 Opus/Sonnet/Haiku, Claude 4.0 Opus/Sonnet\n🔐 API key or OAuth (Pro/Max subscription)\n💭 Extended thinking for deep reasoning\n📄 200K context window, multimodal support\n\nSetup Guide →\n\n🏢 Enterprise Providers\n\nProduction-grade providers for enterprise deployments:\n\nAzure OpenAI\n\nEnterprise AI with Microsoft Azure\n🔒 SOC2, HIPAA, ISO 27001 compliant\n🌍 Multi-region deployment (30+ regions)\n🛡️ Private endpoints with VNet\n💼 Enterprise SLAs\n\nSetup Guide →\n\nGoogle Vertex AI\n\nGoogle Cloud ML platform\n☁️ GCP integration\n🔐 IAM, VPC, service accounts\n🌏 Global deployment\n🎯 Gemini, PaLM, Codey models\n\nSetup Guide →\n\nAWS Bedrock\n\nServerless AI on AWS\n📦 13 foundation models (Claude, Llama, Mistral)\n🔐 IAM, VPC integration\n🌍 Multi-region (us-east-1, eu-west-1, ap-southeast-1)\n💰 Pay-per-use pricing\n\nSetup Guide →\n\nAWS SageMaker\n\nCustom model endpoints on AWS SageMaker infrastructure\n🎯 Deploy fine-tuned, Hugging Face, or JumpStart models\n🔐 IAM, VPC, PrivateLink, KMS encryption\n⚠️ generate() only — streaming is not implemented\n💰 Full control over instance types and autoscaling\n\nSetup Guide →\n\n🌍 Compliance-Focused\n\nProviders with specific compliance certifications:\n\nMistral AI\n\nEuropean AI with GDPR compliance\n🇪🇺 EU data residency\n✅ GDPR compliant by default\n🔓 Open source models\n💰 Cost-effective\n\nSetup Guide →\n\n🧑💻 Hosted Inference Providers\n\nAccess frontier models via hosted cloud inference APIs:\n\nDeepSeek\n\ndeepseek-chat (V3) and deepseek-reasoner (R1)\n🧠 deepseek-chat — high-quality general chat at low cost\n💭 deepseek-reasoner — R1 chain-of-thought reasoning model\n🔑 API key from platform.deepseek.com\n🔄 Aliases: ds\n\nSetup Guide →\n\nNVIDIA NIM\n\n400+ models via NVIDIA's hosted and self-hosted inference platform\n🚀 Llama 3.3 70B Instruct (default), Mistral, Nemotron, and 400+ catalog models\n🔧 NIM-specific extras: topk, minp, repetitionpenalty, reasoningbudget\n🔑 API key from build.nvidia.com\n🖥️ Also supports self-hosted NIM endpoints via NVIDIA_NIM_BASE_URL\n🔄 Aliases: nim, nvidia\n\nSetup Guide →\n\nxAI Grok\n\nGrok 3 / 3 Mini / 2 / 2 Vision via api.x.ai\n🧠 Grok 3 — flagship reasoning + coding\n⚡ Grok 3 Mini — faster + cheaper\n👁️ Grok 2 Vision — multimodal text + images\n🔑 API key from console.x.ai\n🔄 Aliases: grok\n\nSetup Guide →\n\nGroq\n\nSub-100ms inference via LPU acceleration\n⚡ \\\n\nStrategy 2: Multi-Region Enterprise\n\nStrategy 3: GDPR Compliance\n\nNext Steps\nChoose a provider based on your requirements (free tier, compliance, region)\nFollow the setup guide to get your API key\nConfigure NeuroLink with the provider\nTest the integration with a simple request\nAdd failover for production reliability\n\nRelated Documentation\nMulti-Provider Failover - High availability patterns\nCost Optimization - Reduce costs by 80-95%\nCompliance & Security - GDPR, SOC2, HIPAA\nLoad Balancing - Distribution strategies\nVoice Providers Comparison - TTS, STT, and Realtime capability matrix\nVoice Provider Selection - Choosing the right voice provider","hierarchy":{"lvl0":"Getting Started","lvl1":"AI Provider Guides","lvl2":"","lvl3":""}},
|
|
6107
6107
|
{"objectID":"61fd5d334fc9a01ce08b9d06d237d42e3bec615a6af167e9f21285e6602a5cb3","title":"AI Provider Guides","url":"/docs/getting-started/providers#ai-provider-guides","content":"Complete setup guides for all supported AI providers.","hierarchy":{"lvl0":"Getting Started","lvl1":"AI Provider Guides","lvl2":"AI Provider Guides","lvl3":""}},
|
|
6108
6108
|
{"objectID":"186f620ef7eedd0c1191700ef81e03911662a949091bd47dbe9aae5146728090","title":"🆓 Free Tier Providers","url":"/docs/getting-started/providers#-free-tier-providers","content":"Start with zero cost using these free-tier options:","hierarchy":{"lvl0":"Getting Started","lvl1":"AI Provider Guides","lvl2":"🆓 Free Tier Providers","lvl3":""}},
|
|
6109
6109
|
{"objectID":"a5c5d85342beed55592caaf4ede7acb7b2bc5196fe8ae151275fa2d3bee5134b","title":"[Hugging Face](/docs/getting-started/providers/huggingface)","url":"/docs/getting-started/providers#hugging-facedocsgetting-startedprovidershuggingface","content":"100,000+ open-source models\n✅ Free inference API\n🌍 Largest model collection\n🔓 Fully open source\n📊 Models by task: chat, classification, NER, summarization\n\nSetup Guide →","hierarchy":{"lvl0":"Getting Started","lvl1":"AI Provider Guides","lvl2":"[Hugging Face](/docs/getting-started/providers/huggingface)","lvl3":""}},
|
|
6110
6110
|
{"objectID":"4926906f2ddbb8a7f804e91bbad4b4eb40954a2b3096964730a19d45d0aeae03","title":"[Google AI Studio](/docs/getting-started/providers/google-ai)","url":"/docs/getting-started/providers#google-ai-studiodocsgetting-startedprovidersgoogle-ai","content":"Gemini models with generous free tier\n✅ 1,500 requests/day free\n⚡ Fast Gemini 2.0 Flash\n🎯 15 requests/minute\n💰 Pay-as-you-go option\n\nSetup Guide →","hierarchy":{"lvl0":"Getting Started","lvl1":"AI Provider Guides","lvl2":"[Google AI Studio](/docs/getting-started/providers/google-ai)","lvl3":""}},
|
|
6111
6111
|
{"objectID":"7b854ac7cf667ec3616dafd38dca58d6632015491a6f60f88cdf3127a59f2dbe","title":"🤖 Direct AI Providers","url":"/docs/getting-started/providers#-direct-ai-providers","content":"Access leading AI models directly from their creators:","hierarchy":{"lvl0":"Getting Started","lvl1":"AI Provider Guides","lvl2":"🤖 Direct AI Providers","lvl3":""}},
|
|
6112
|
-
{"objectID":"d80aa404baacfa4eac522027b41d65e3963f22428813afdc33eae17fe008df05","title":"[OpenAI](/docs/getting-started/providers/openai)","url":"/docs/getting-started/providers#openaidocsgetting-startedprovidersopenai","content":"GPT-5.4, GPT-5, GPT-4o, and o-series reasoning models\n🧠 GPT-5.4 and GPT-5 series flagships with up to
|
|
6112
|
+
{"objectID":"d80aa404baacfa4eac522027b41d65e3963f22428813afdc33eae17fe008df05","title":"[OpenAI](/docs/getting-started/providers/openai)","url":"/docs/getting-started/providers#openaidocsgetting-startedprovidersopenai","content":"GPT-5.4, GPT-5, GPT-4o, and o-series reasoning models\n🧠 GPT-5.4 and GPT-5 series flagships with up to 1.05M context\n👁️ GPT-4o multimodal (vision) and o3 / o3-pro / o4-mini reasoning models\n🔧 Full tool/function calling and embeddings support\n🔑 Auth: API Key (OPENAI_API_KEY)\n\nSetup Guide →","hierarchy":{"lvl0":"Getting Started","lvl1":"AI Provider Guides","lvl2":"[OpenAI](/docs/getting-started/providers/openai)","lvl3":""}},
|
|
6113
6113
|
{"objectID":"54a5f8ee7ac2993436d73c191b984ee56ccfd4cd56a4c4e1b7812547b0879d5d","title":"[Anthropic](/docs/getting-started/providers/anthropic)","url":"/docs/getting-started/providers#anthropicdocsgetting-startedprovidersanthropic","content":"Claude models with API key or OAuth authentication\n🧠 Claude 4.5 Opus/Sonnet/Haiku, Claude 4.0 Opus/Sonnet\n🔐 API key or OAuth (Pro/Max subscription)\n💭 Extended thinking for deep reasoning\n📄 200K context window, multimodal support\n\nSetup Guide →","hierarchy":{"lvl0":"Getting Started","lvl1":"AI Provider Guides","lvl2":"[Anthropic](/docs/getting-started/providers/anthropic)","lvl3":""}},
|
|
6114
6114
|
{"objectID":"686b1ef4c817369d143b47730f2c4641aefa0638cb510ef6e6ba273c7d653039","title":"🏢 Enterprise Providers","url":"/docs/getting-started/providers#-enterprise-providers","content":"Production-grade providers for enterprise deployments:","hierarchy":{"lvl0":"Getting Started","lvl1":"AI Provider Guides","lvl2":"🏢 Enterprise Providers","lvl3":""}},
|
|
6115
6115
|
{"objectID":"a2dc4a1576d1b02ea51d5edd546dca91e7c4ac34bac2ffb1a4aa03364cead1a1","title":"[Azure OpenAI](/docs/getting-started/providers/azure-openai)","url":"/docs/getting-started/providers#azure-openaidocsgetting-startedprovidersazure-openai","content":"Enterprise AI with Microsoft Azure\n🔒 SOC2, HIPAA, ISO 27001 compliant\n🌍 Multi-region deployment (30+ regions)\n🛡️ Private endpoints with VNet\n💼 Enterprise SLAs\n\nSetup Guide →","hierarchy":{"lvl0":"Getting Started","lvl1":"AI Provider Guides","lvl2":"[Azure OpenAI](/docs/getting-started/providers/azure-openai)","lvl3":""}},
|
|
@@ -6175,6 +6175,7 @@
|
|
|
6175
6175
|
{"objectID":"99f26adf90af871484d290a04c53d1194c4eaa7b76e5902d52f38c4e74b876a5","title":"[Google TTS](/docs/getting-started/provider-setup)","url":"/docs/getting-started/providers#google-ttsdocsgetting-startedprovider-setup","content":"1M characters/month free tier\n💰 Generous free tier for standard voices\n🌍 380+ voices across 50+ languages\n🎼 Formats: MP3, WAV, OGG\n🔑 Auth: Service Account\n\nSetup Guide →","hierarchy":{"lvl0":"Getting Started","lvl1":"AI Provider Guides","lvl2":"[Google TTS](/docs/getting-started/provider-setup)","lvl3":""}},
|
|
6176
6176
|
{"objectID":"3b96ce51637a80a06ca1b0e5d72274c47b372d7a7b9b5e5a977ee44c4e860a9a","title":"[Azure TTS](/docs/getting-started/providers/azure-speech)","url":"/docs/getting-started/providers#azure-ttsdocsgetting-startedprovidersazure-speech","content":"Enterprise TTS with full SSML support\n🏢 Fine-grained prosody control via SSML\n🌍 400+ neural voices, 140+ languages\n🎼 Formats: MP3, WAV (PCM), Opus (Ogg container)\n🔑 Auth: API Key + Region\n\nSetup Guide →","hierarchy":{"lvl0":"Getting Started","lvl1":"AI Provider Guides","lvl2":"[Azure TTS](/docs/getting-started/providers/azure-speech)","lvl3":""}},
|
|
6177
6177
|
{"objectID":"a93c1ee491b1a547f2ef0e9c8977b18b09a82653136a52afdd692986ce5c3e0a","title":"[Fish Audio](/docs/getting-started/providers/fish-audio)","url":"/docs/getting-started/providers#fish-audiodocsgetting-startedprovidersfish-audio","content":"Low-cost TTS with 15s voice cloning\n💰 ~80% cheaper than ElevenLabs\n🎭 15-second reference audio → custom voice\n🌍 14 languages\n🎼 Formats: MP3, WAV, PCM16 (raw)\n🔑 Auth: API Key (FISH_AUDIO_API_KEY)\n\nSetup Guide →","hierarchy":{"lvl0":"Getting Started","lvl1":"AI Provider Guides","lvl2":"[Fish Audio](/docs/getting-started/providers/fish-audio)","lvl3":""}},
|
|
6178
|
+
{"objectID":"d82756afb4b6eac7c66d1d208e2479804fbd566073c54f69793b26b866fd9fc4","title":"[60db](/docs/getting-started/providers/sixtydb)","url":"/docs/getting-started/providers#60dbdocsgetting-startedproviderssixtydb","content":"Workspace voice catalogs and HTTP text-to-speech.\nWAV or raw PCM16 output at 24 kHz\nWorkspace API key and voice UUID\nSetup guide","hierarchy":{"lvl0":"Getting Started","lvl1":"AI Provider Guides","lvl2":"[60db](/docs/getting-started/providers/sixtydb)","lvl3":""}},
|
|
6178
6179
|
{"objectID":"903a2fd304d3ffb2990000168873c629a7138258d97d09e227fe6ef8c0a5df65","title":"[Cartesia](/docs/getting-started/providers/cartesia)","url":"/docs/getting-started/providers#cartesiadocsgetting-startedproviderscartesia","content":"Low-latency Sonic models — synchronous + streaming\n⚡ Sub-second turnaround on the synchronous /tts/bytes endpoint\n🌊 Separate WebSocket streaming flow via CartesiaStream (voice server)\n🎭 Voice cloning via dashboard upload\n🎼 Formats: MP3 (44.1 kHz), WAV (PCM s16le @ 44.1 kHz), PCM16 (raw @ 24 kHz)\n🔑 Auth: API Key (CARTESIA_API_KEY)\n\nSetup Guide →","hierarchy":{"lvl0":"Getting Started","lvl1":"AI Provider Guides","lvl2":"[Cartesia](/docs/getting-started/providers/cartesia)","lvl3":""}},
|
|
6179
6180
|
{"objectID":"ec38161b9e0bfc27cc33414952e99234678504ec515b7638457b5c44ca722668","title":"[Whisper (OpenAI)](/docs/getting-started/provider-setup#whisper)","url":"/docs/getting-started/providers#whisper-openaidocsgetting-startedprovider-setupwhisper","content":"Highest transcription accuracy\n🎯 Best-in-class accuracy on diverse audio\n🌍 Multilingual with automatic language detection\n🎼 Formats: WAV, MP3, M4A, FLAC, OGG, OPUS, WEBM, MP4, MPEG, MPGA\n🔑 Auth: API Key (OPENAI_API_KEY)\n\nSetup Guide →","hierarchy":{"lvl0":"Getting Started","lvl1":"AI Provider Guides","lvl2":"[Whisper (OpenAI)](/docs/getting-started/provider-setup#whisper)","lvl3":""}},
|
|
6180
6181
|
{"objectID":"b5ff21c7e4f90ef4d8b0234f2020843f46ab569d3781c9f2c2f30c736723ca0f","title":"[Deepgram](/docs/getting-started/providers/deepgram)","url":"/docs/getting-started/providers#deepgramdocsgetting-startedprovidersdeepgram","content":"Real-time streaming transcription via WebSocket\n⚡ Sub-300 ms word-level results over WebSocket\n🌊 REST batch and WebSocket streaming modes\n🎼 Formats: WAV, MP3, OGG, FLAC\n🔑 Auth: API Key (DEEPGRAM_API_KEY)\n\nSetup Guide →","hierarchy":{"lvl0":"Getting Started","lvl1":"AI Provider Guides","lvl2":"[Deepgram](/docs/getting-started/providers/deepgram)","lvl3":""}},
|
|
@@ -6751,10 +6752,10 @@
|
|
|
6751
6752
|
{"objectID":"e2d66c098b27a18e31a0985c2b41817ec2896b37532ec07b38e09f1ed760c1b7","title":"\"OpenAI TTS request timed out after 30 seconds\"","url":"/docs/getting-started/providers/openai-tts#openai-tts-request-timed-out-after-30-seconds","content":"A network issue or overloaded API caused the request to time out. Retry the request — the error is marked retriable by NeuroLink's error system.","hierarchy":{"lvl0":"Getting Started","lvl1":"OpenAI TTS Provider Guide","lvl2":"\"OpenAI TTS request timed out after 30 seconds\"","lvl3":""}},
|
|
6752
6753
|
{"objectID":"9a54f6363be2937d7c7f9328a1e90b4e1945f5d0c31f3e66477c6468d131b099","title":"Audio sounds distorted at high speed","url":"/docs/getting-started/providers/openai-tts#audio-sounds-distorted-at-high-speed","content":"Speeds above 2.0 can introduce artifacts. Use speed: 1.0 – 1.5 for natural-sounding output.","hierarchy":{"lvl0":"Getting Started","lvl1":"OpenAI TTS Provider Guide","lvl2":"Audio sounds distorted at high speed","lvl3":""}},
|
|
6753
6754
|
{"objectID":"f98d39032204ab3aed29744d24a667388d714a7e1214577e166e2d377469d80e","title":"See Also","url":"/docs/getting-started/providers/openai-tts#see-also","content":"TTS Integration Guide — complete multi-provider TTS reference\nAudio Input (STT) — speech-to-text counterpart\nOpenAI Provider Guide — full OpenAI text generation provider\nElevenLabs Provider Guide — alternative TTS provider with voice cloning\n\nNeed Help? Join the GitHub Discussions or open an issue.","hierarchy":{"lvl0":"Getting Started","lvl1":"OpenAI TTS Provider Guide","lvl2":"See Also","lvl3":""}},
|
|
6754
|
-
{"objectID":"988dc021ae1e24ac074ba6ccd12141310a44053f1327466076993828c5bf0d61","title":"OpenAI Provider Guide","url":"/docs/getting-started/providers/openai","content":"OpenAI Provider Guide\n\nAccess GPT-5.4, GPT-5, GPT-4o, o-series reasoning models, and embedding models through the OpenAI API\n\nOverview\n\nOpenAI provides API access to the GPT model family, including the
|
|
6755
|
+
{"objectID":"988dc021ae1e24ac074ba6ccd12141310a44053f1327466076993828c5bf0d61","title":"OpenAI Provider Guide","url":"/docs/getting-started/providers/openai","content":"OpenAI Provider Guide\n\nAccess GPT-5.4, GPT-5, GPT-4o, o-series reasoning models, and embedding models through the OpenAI API\n\nOverview\n\nOpenAI provides API access to the GPT model family, including the GPT-6 family, the GPT-5.4 series, GPT-5 series, GPT-4o multimodal models, and o-series reasoning models. NeuroLink talks to the OpenAI HTTP API directly — generation, streaming, tool calling, vision and embeddings are all served by NeuroLink's own client, with no third-party model SDK in the path.\n\nKey Benefits\nGPT-5.4 Series: Flagship models (March 2026) with 1.05M context (gpt-5.4, gpt-5.4-pro; mini and nano 400K)\nGPT-5 Series: Flagship models with up to 400K context windows\nGPT-4.1 Series: 1M context window models for large document processing\nGPT-4o: Multimodal model with vision support\no-Series Reasoning: o3, o3-pro, and o4-mini for deep reasoning tasks\nEmbeddings: text-embedding-3-small and other embedding models\nTool/Function Calling: Full support for agent workflows\nStreaming: Real-time streaming responses with tool execution\nProxy Support: Route requests through HTTP/HTTPS/SOCKS proxies\n\nProvider Aliases\n\nYou can reference this provider using any of the following names:\n\n| Alias | Usage |\n| --------- | --------------------------- |\n| openai | Canonical provider name |\n| gpt | Short alias for convenience |\n| chatgpt | Alternative alias |\n\nThese aliases are registered in src/lib/factories/providerRegistry.ts.\n\nQuick Start\nGet Your API Key\nVisit platform.openai.com/api-keys\nSign in or create an account\nClick Create new secret key\nCopy your new API key (starts with sk-)\nConfigure Environment\n\nAdd to your .env file:\nTest the Setup\n\nSupported Models\n\nAvailable Models (from OpenAIModels enum)\n\n| Enum Key | Model ID | Series | Context Window | Notes |\n| --------------------- | --------------------- | ------------ | -------------- | ------------------------ |\n| GPT_6_ASTRA | gpt-6-astra | GPT-6 | 1.05M | New (September 2026) |\n| GPT_6_SOL | gpt-6-sol | GPT-6 | 1.05M | New (September 2026) |\n| GPT_6_LUNA | gpt-6-luna | GPT-6 | 1.05M | New (September 2026) |\n| GPT_5_4 | gpt-5.4 | GPT-5.4 | 1.05M | New (March 2026) |\n| GPT_5_4_MINI | gpt-5.4-mini | GPT-5.4 | 400K | New (March 2026) |\n| GPT_5_4_NANO | gpt-5.4-nano | GPT-5.4 | 400K | New (March 2026) |\n| GPT_5_3_CODEX | gpt-5.3-codex | GPT-5.3 | 400K | |\n| GPT_5_2 | gpt-5.2 | GPT-5.2 | 400K | |\n| GPT_5_2_CHAT_LATEST | gpt-5.2-chat-latest | GPT-5.2 | 128K | |\n| GPT_5_2_PRO | gpt-5.2-pro | GPT-5.2 | 400K | |\n| GPT_5_2_CODEX | gpt-5.2-codex | GPT-5.2 | 400K | |\n| GPT_5_1 | gpt-5.1 | GPT-5.1 | 400K | |\n| GPT_5_1_CHAT_LATEST | gpt-5.1-chat-latest | GPT-5.1 | 128K | |\n| GPT_5_1_CODEX | gpt-5.1-codex | GPT-5.1 | 400K | |\n| GPT_5_1_CODEX_MAX | gpt-5.1-codex-max | GPT-5.1 | 400K | |\n| GPT_5_1_CODEX_MINI | gpt-5.1-codex-mini | GPT-5.1 | 400K | |\n| GPT_5 | gpt-5 | GPT-5 | 400K | |\n| GPT_5_MINI | gpt-5-mini | GPT-5 | 400K | |\n| GPT_5_NANO | gpt-5-nano | GPT-5 | 400K | |\n| GPT_5_PRO | gpt-5-pro | GPT-5 | 400K | |\n| GPT_5_CHAT_LATEST | gpt-5-chat-latest | GPT-5 | 128K | |\n| GPT_5_CODEX | gpt-5-codex | GPT-5 | 400K | |\n| GPT_OSS_120B | gpt-oss-120b | GPT OSS | 128K | |\n| GPT_OSS_20B | gpt-oss-20b | GPT OSS | 128K | |\n| GPT_4_1 | gpt-4.1 | GPT-4.1 | 1M | |\n| GPT_4_1_MINI | gpt-4.1-mini | GPT-4.1 | 1M | |\n| GPT_4_1_NANO | gpt-4.1-nano | GPT-4.1 | 1M | |\n| GPT_4O | gpt-4o | GPT-4o | 128K | |\n| GPT_4O_MINI | gpt-4o-mini | GPT-4o | 128K | Default model ","hierarchy":{"lvl0":"Getting Started","lvl1":"OpenAI Provider Guide","lvl2":"","lvl3":""}},
|
|
6755
6756
|
{"objectID":"09a56d9dc91320ff37eda19c92d08529dc6471dd3b273124ca539bf8c68cf8eb","title":"OpenAI Provider Guide","url":"/docs/getting-started/providers/openai#openai-provider-guide","content":"Access GPT-5.4, GPT-5, GPT-4o, o-series reasoning models, and embedding models through the OpenAI API","hierarchy":{"lvl0":"Getting Started","lvl1":"OpenAI Provider Guide","lvl2":"OpenAI Provider Guide","lvl3":""}},
|
|
6756
|
-
{"objectID":"00a9eec16078fe5bf845c9876ae67265e060b64f3150a402681173526d5f9037","title":"Overview","url":"/docs/getting-started/providers/openai#overview","content":"OpenAI provides API access to the GPT model family, including the
|
|
6757
|
-
{"objectID":"7ef3ddd9cd1195ba96e4a45b2019a85d9ef0f4aa77585f4cff3f58140d40ea8e","title":"Key Benefits","url":"/docs/getting-started/providers/openai#key-benefits","content":"GPT-5.4 Series:
|
|
6757
|
+
{"objectID":"00a9eec16078fe5bf845c9876ae67265e060b64f3150a402681173526d5f9037","title":"Overview","url":"/docs/getting-started/providers/openai#overview","content":"OpenAI provides API access to the GPT model family, including the GPT-6 family, the GPT-5.4 series, GPT-5 series, GPT-4o multimodal models, and o-series reasoning models. NeuroLink talks to the OpenAI HTTP API directly — generation, streaming, tool calling, vision and embeddings are all served by NeuroLink's own client, with no third-party model SDK in the path.","hierarchy":{"lvl0":"Getting Started","lvl1":"OpenAI Provider Guide","lvl2":"Overview","lvl3":""}},
|
|
6758
|
+
{"objectID":"7ef3ddd9cd1195ba96e4a45b2019a85d9ef0f4aa77585f4cff3f58140d40ea8e","title":"Key Benefits","url":"/docs/getting-started/providers/openai#key-benefits","content":"GPT-5.4 Series: Flagship models (March 2026) with 1.05M context (gpt-5.4, gpt-5.4-pro; mini and nano 400K)\nGPT-5 Series: Flagship models with up to 400K context windows\nGPT-4.1 Series: 1M context window models for large document processing\nGPT-4o: Multimodal model with vision support\no-Series Reasoning: o3, o3-pro, and o4-mini for deep reasoning tasks\nEmbeddings: text-embedding-3-small and other embedding models\nTool/Function Calling: Full support for agent workflows\nStreaming: Real-time streaming responses with tool execution\nProxy Support: Route requests through HTTP/HTTPS/SOCKS proxies","hierarchy":{"lvl0":"Getting Started","lvl1":"OpenAI Provider Guide","lvl2":"Key Benefits","lvl3":""}},
|
|
6758
6759
|
{"objectID":"266efd96b42e82eae06984fdf0aaa0e27101a28514514b7349737efe2274beb5","title":"Provider Aliases","url":"/docs/getting-started/providers/openai#provider-aliases","content":"You can reference this provider using any of the following names:\n\n| Alias | Usage |\n| --------- | --------------------------- |\n| openai | Canonical provider name |\n| gpt | Short alias for convenience |\n| chatgpt | Alternative alias |\n\nThese aliases are registered in src/lib/factories/providerRegistry.ts.","hierarchy":{"lvl0":"Getting Started","lvl1":"OpenAI Provider Guide","lvl2":"Provider Aliases","lvl3":""}},
|
|
6759
6760
|
{"objectID":"769a8aea5668e683c64e455fc484af87c547264189eaed08c2ff047dfc535167","title":"1. Get Your API Key","url":"/docs/getting-started/providers/openai#1-get-your-api-key","content":"Visit platform.openai.com/api-keys\nSign in or create an account\nClick Create new secret key\nCopy your new API key (starts with sk-)","hierarchy":{"lvl0":"Getting Started","lvl1":"OpenAI Provider Guide","lvl2":"1. Get Your API Key","lvl3":""}},
|
|
6760
6761
|
{"objectID":"c2df7c52c3715cfca6e8c91fd43d047a5c50e2fd573e9ca5b78784aa4b98068c","title":"2. Configure Environment","url":"/docs/getting-started/providers/openai#2-configure-environment","content":"Add to your .env file:\n\n`bash","hierarchy":{"lvl0":"Getting Started","lvl1":"OpenAI Provider Guide","lvl2":"2. Configure Environment","lvl3":""}},
|
|
@@ -6764,7 +6765,7 @@
|
|
|
6764
6765
|
{"objectID":"51393d2a6f860f549650441d19ba86353e5feb0d267b47894b1cd40e16d7e3d0","title":"Quick generation","url":"/docs/getting-started/providers/openai#quick-generation","content":"pnpm run cli -- generate \"Hello from GPT!\" \\\n --provider openai","hierarchy":{"lvl0":"Getting Started","lvl1":"OpenAI Provider Guide","lvl2":"Quick generation","lvl3":""}},
|
|
6765
6766
|
{"objectID":"6102cd238f922f95762068dd3d2b3950e839a87ac388ee96bb805db79c47d00e","title":"Use specific model","url":"/docs/getting-started/providers/openai#use-specific-model","content":"pnpm run cli -- generate \"Write a haiku about AI\" \\\n --provider openai \\\n --model \"gpt-4o\"","hierarchy":{"lvl0":"Getting Started","lvl1":"OpenAI Provider Guide","lvl2":"Use specific model","lvl3":""}},
|
|
6766
6767
|
{"objectID":"b56485bde526a3210810b768ba819d40dffdff5e3cf66309d26c5f53b89e30c1","title":"Interactive loop mode","url":"/docs/getting-started/providers/openai#interactive-loop-mode","content":"pnpm run cli -- loop \\\n --provider openai \\\n --model \"gpt-4o-mini\"\n`","hierarchy":{"lvl0":"Getting Started","lvl1":"OpenAI Provider Guide","lvl2":"Interactive loop mode","lvl3":""}},
|
|
6767
|
-
{"objectID":"dc674c0134ff9c1c707403e195849d7738176f984fe0c8226f05877f4951e0cd","title":"Available Models (from OpenAIModels enum)","url":"/docs/getting-started/providers/openai#available-models-from-openaimodels-enum","content":"| Enum Key | Model ID | Series | Context Window | Notes |\n| --------------------- | --------------------- | ------------ | -------------- | ------------------------ |\n| GPT_6_ASTRA | gpt-6-astra | GPT-6 | 1.05M | New (September 2026) |\n| GPT_6_SOL | gpt-6-sol | GPT-6 | 1.05M | New (September 2026) |\n| GPT_6_LUNA | gpt-6-luna | GPT-6 | 1.05M | New (September 2026) |\n| GPT_5_4 | gpt-5.4 | GPT-5.4 |
|
|
6768
|
+
{"objectID":"dc674c0134ff9c1c707403e195849d7738176f984fe0c8226f05877f4951e0cd","title":"Available Models (from OpenAIModels enum)","url":"/docs/getting-started/providers/openai#available-models-from-openaimodels-enum","content":"| Enum Key | Model ID | Series | Context Window | Notes |\n| --------------------- | --------------------- | ------------ | -------------- | ------------------------ |\n| GPT_6_ASTRA | gpt-6-astra | GPT-6 | 1.05M | New (September 2026) |\n| GPT_6_SOL | gpt-6-sol | GPT-6 | 1.05M | New (September 2026) |\n| GPT_6_LUNA | gpt-6-luna | GPT-6 | 1.05M | New (September 2026) |\n| GPT_5_4 | gpt-5.4 | GPT-5.4 | 1.05M | New (March 2026) |\n| GPT_5_4_MINI | gpt-5.4-mini | GPT-5.4 | 400K | New (March 2026) |\n| GPT_5_4_NANO | gpt-5.4-nano | GPT-5.4 | 400K | New (March 2026) |\n| GPT_5_3_CODEX | gpt-5.3-codex | GPT-5.3 | 400K | |\n| GPT_5_2 | gpt-5.2 | GPT-5.2 | 400K | |\n| GPT_5_2_CHAT_LATEST | gpt-5.2-chat-latest | GPT-5.2 | 128K | |\n| GPT_5_2_PRO | gpt-5.2-pro | GPT-5.2 | 400K | |\n| GPT_5_2_CODEX | gpt-5.2-codex | GPT-5.2 | 400K | |\n| GPT_5_1 | gpt-5.1 | GPT-5.1 | 400K | |\n| GPT_5_1_CHAT_LATEST | gpt-5.1-chat-latest | GPT-5.1 | 128K | |\n| GPT_5_1_CODEX | gpt-5.1-codex | GPT-5.1 | 400K | |\n| GPT_5_1_CODEX_MAX | gpt-5.1-codex-max | GPT-5.1 | 400K | |\n| GPT_5_1_CODEX_MINI | gpt-5.1-codex-mini | GPT-5.1 | 400K | |\n| GPT_5 | gpt-5 | GPT-5 | 400K | |\n| GPT_5_MINI ","hierarchy":{"lvl0":"Getting Started","lvl1":"OpenAI Provider Guide","lvl2":"Available Models (from OpenAIModels enum)","lvl3":""}},
|
|
6768
6769
|
{"objectID":"daaa71958d244b14e0a92247a5ea7890e487f466f9647915a9b274196dcf2cd3","title":"Default Model","url":"/docs/getting-started/providers/openai#default-model","content":"The default model when no model is specified is gpt-4o-mini (set via OpenAIModels.GPT_4O_MINI in the provider registry). This can be overridden with the OPENAI_MODEL environment variable.\n\nNote: When using NeuroLink SDK/CLI, the default is gpt-4o-mini. When instantiating OpenAIProvider directly without setting OPENAI_MODEL, the internal fallback is gpt-4o.","hierarchy":{"lvl0":"Getting Started","lvl1":"OpenAI Provider Guide","lvl2":"Default Model","lvl3":""}},
|
|
6769
6770
|
{"objectID":"a722c79038b2a55ddfff8bbe51cc124c6b52334826423cf1b4db83de4e7b9aef","title":"Multimodal Capabilities","url":"/docs/getting-started/providers/openai#multimodal-capabilities","content":"Models listed in VISION_CAPABILITIES for the openai provider support image analysis. This includes the GPT-5 family, GPT-4.1 family, GPT-4o family, and o-series models.","hierarchy":{"lvl0":"Getting Started","lvl1":"OpenAI Provider Guide","lvl2":"Multimodal Capabilities","lvl3":""}},
|
|
6770
6771
|
{"objectID":"c331cb5e1ae253efea1792e057d6a4178c61191fe30972b6974856225af3cb12","title":"Image Analysis","url":"/docs/getting-started/providers/openai#image-analysis","content":"`bash","hierarchy":{"lvl0":"Getting Started","lvl1":"OpenAI Provider Guide","lvl2":"Image Analysis","lvl3":""}},
|
|
@@ -6864,15 +6865,15 @@
|
|
|
6864
6865
|
{"objectID":"e4a90009c7bcd26ccb6a5309dfd66d6dc17c46b9abbfb292b212fe38b41c1b98","title":"Verification status","url":"/docs/getting-started/providers/parasail#verification-status","content":"Tier-2 onboarding requires evidence before a provider is accepted, and\npnpm run verify:provider-onboarding gates it in CI. This is what the\ncatalog currently records for Parasail — docs-verified only, not yet\nlive-verified:\n\n| Probe | Result |\n| ------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| Roster | unauthenticated GET https://api.parasail.io/v1/models answered HTTP 401 on 2026-09-29 — no key used, so the model ids are taken from the Models page (retrieved 2026-09-29) and the roster is not verified |\n| Billing | the Pricing page says \"To use models, create API keys, and access paid platform services, add a credit card. Without a card, you can still view the platform but can't use models or API keys.\"; the Limits and Quotas page has a \"Serverless - Free\" rate-limit row; no signup was performed, 2026-09-29 |\n| Auth-failure shape | unauthenticated GETs of /v1/models, /v1/cha","hierarchy":{"lvl0":"Getting Started","lvl1":"Parasail Provider Guide","lvl2":"Verification status","lvl3":""}},
|
|
6865
6866
|
{"objectID":"7524ca685dabe987464872496673f6a1795cb28e182c63b7eea6e8e6f2f7de4d","title":"Documented error statuses","url":"/docs/getting-started/providers/parasail#documented-error-statuses","content":"The\nChat Completions reference\nsays \"Errors use OpenAI-compatible status codes and a JSON body with an error\nobject (message, type, code).\" and lists these statuses:\n\n| Status | Parasail's description |\n| ------ | -------------------------------------------------------------------------------------- |\n| 400 | Malformed request—invalid JSON, missing required field, or unsupported parameter value |\n| 401 | Missing or invalid API key |\n| 403 | API key lacks access to the requested model or resource |\n| 404 | Model or endpoint not found |\n| 429 | Rate limit or quota exceeded—back off and retry |\n| 500 | Internal server error—retry with exponential backoff |\n\nThe\nTool/Function Calling guide\nsays of models outside its table: \"Depending on the model, a request with tools\nreturns an error or plain text with no tool_calls.\"","hierarchy":{"lvl0":"Getting Started","lvl1":"Parasail Provider Guide","lvl2":"Documented error statuses","lvl3":""}},
|
|
6866
6867
|
{"objectID":"f48bba8c2e9813155262f99a41ecc882205dc495aa27c27bb0b50c527a0f8a5d","title":"See also","url":"/docs/getting-started/providers/parasail#see-also","content":"Provider setup overview\nAll providers\nTier-2 onboarding — how this provider's JSON becomes a working integration\nProvider feature compatibility\nParasail docs pages used for this entry: Models, Pricing, Authentication, Chat Completions reference, Tool/Function Calling, Structured Output, Multi-Modal, Model-specific Notes, Limits and Quotas","hierarchy":{"lvl0":"Getting Started","lvl1":"Parasail Provider Guide","lvl2":"See also","lvl3":""}},
|
|
6867
|
-
{"objectID":"5e3a315038085bf3d2d31cbaaf7a07c7df8228093af856dd3a697f19736edf24","title":"Pareto Inference Provider Guide","url":"/docs/getting-started/providers/pareto-inference","content":"Pareto Inference Provider Guide\n\nVerification status: this entry is docs- and roster-verified only —\nnot yet live-verified. It was onboarded credential-free: no Pareto\nInference API key was ever created or used. Every field below comes from\nPareto's public docs (https://docs.paretoinference.com/) and an\nunauthenticated GET /v1/models call (no auth header). No POST\nrequest was ever sent, so no generate, stream, tool-calling or\nstructured-output capability has been exercised end to end. Treat\ncapabilities.tools and .thinking as documentation-grade, not\nwire-proven, until evidence.liveMatrix is filled in by a live run.\n\nPareto Inference is a Tier-2 catalog provider: OpenAI-wire-compatible\nwith no behavioural quirks, so its entire integration is one JSON file\n(src/lib/providers/catalog/pareto-inference.json) rather than hand-written\ncode. That file is the source of truth for everything on this page.\n\nKey Facts\nProvider id: pareto-inference\nProtocol: OpenAI-compatible (/chat/completions) — \"Pareto accepts\n only OpenAI Chat Completions.\"\nBase URL: https://api.paretoinference.com/v1\nDefault model: z-ai/glm-5.3-flash (GLM 5.3 Flash; the docs also\n document a bare alias, glm-5.3-flash, for the same model)\nModels in catalog: 1 — the only model Pareto serves. Confirmed by an\n unauthenticated GET /v1/models (no key needed), which returns exactly\n one id.\nStreaming: documented (SSE, text in choices[0].delta.content, tool\n calls in choices[0].delta.tool_calls, terminal data: [DONE]) — not\n live-probed.\nTool calling: documented (tools, tool_choice) but the vendor's own\n request-parameter table hedges it with \"Model support can differ,\" with no\n model-specific confirmation — set to model-dependent, not true.\nStructured output: response_format is a documented parameter but\n carries the same \"Model support can differ\" hedge as tools; the catalog\n schema has no model-dependent option for this field, so it is set\n false rather than asserted from a hedged table. structuredOutputWithTools\n is false — no combined probe was possible credential-free.\nReasoning: reasoning_effort (\"Sets the reasoning level\") is\n documented as a plain, unhedged request parameter — unlike tools /\n response_format / tool_choice / logprobs, it carries no \"Model\n support can differ\" caveat — the basis for capabilities.thinking: true.\nVision: not documented anywhere on the site.\nEmbeddings: not documented anywhere on the site.\nBilling: no free tier. A payment card and prepaid credits are\n required before a key is issued.\nSignup: https://paretoinference.com/dashboard\nKey format: none declared.\nData handling: Pareto documents zero data retention (ZDR) — request\n content is not kept after a request finishes.\n\nQuick Start\nGet an API key\nVisit: https://paretoinference.com/dashboard and sign in\nAdd a payment card — Pareto has no free tier; a card and prepaid credits\n are required before a key is issued\n (https://docs.paretoinference.com/pricing)\nBuy prepaid credits, then create your API key from the dashboard\nSet PARETO_INFERENCE_API_KEY in your .env file\nConfigure\nUse it\n\nPer-request credentials work as they do for every provider:\n\nModels\n\n| Model | Context
|
|
6868
|
+
{"objectID":"5e3a315038085bf3d2d31cbaaf7a07c7df8228093af856dd3a697f19736edf24","title":"Pareto Inference Provider Guide","url":"/docs/getting-started/providers/pareto-inference","content":"Pareto Inference Provider Guide\n\nVerification status: this entry is docs- and roster-verified only —\nnot yet live-verified. It was onboarded credential-free: no Pareto\nInference API key was ever created or used. Every field below comes from\nPareto's public docs (https://docs.paretoinference.com/) and an\nunauthenticated GET /v1/models call (no auth header). No POST\nrequest was ever sent, so no generate, stream, tool-calling or\nstructured-output capability has been exercised end to end. Treat\ncapabilities.tools and .thinking as documentation-grade, not\nwire-proven, until evidence.liveMatrix is filled in by a live run.\n\nPareto Inference is a Tier-2 catalog provider: OpenAI-wire-compatible\nwith no behavioural quirks, so its entire integration is one JSON file\n(src/lib/providers/catalog/pareto-inference.json) rather than hand-written\ncode. That file is the source of truth for everything on this page.\n\nKey Facts\nProvider id: pareto-inference\nProtocol: OpenAI-compatible (/chat/completions) — \"Pareto accepts\n only OpenAI Chat Completions.\"\nBase URL: https://api.paretoinference.com/v1\nDefault model: z-ai/glm-5.3-flash (GLM 5.3 Flash; the docs also\n document a bare alias, glm-5.3-flash, for the same model)\nModels in catalog: 1 — the only model Pareto serves. Confirmed by an\n unauthenticated GET /v1/models (no key needed), which returns exactly\n one id.\nStreaming: documented (SSE, text in choices[0].delta.content, tool\n calls in choices[0].delta.tool_calls, terminal data: [DONE]) — not\n live-probed.\nTool calling: documented (tools, tool_choice) but the vendor's own\n request-parameter table hedges it with \"Model support can differ,\" with no\n model-specific confirmation — set to model-dependent, not true.\nStructured output: response_format is a documented parameter but\n carries the same \"Model support can differ\" hedge as tools; the catalog\n schema has no model-dependent option for this field, so it is set\n false rather than asserted from a hedged table. structuredOutputWithTools\n is false — no combined probe was possible credential-free.\nReasoning: reasoning_effort (\"Sets the reasoning level\") is\n documented as a plain, unhedged request parameter — unlike tools /\n response_format / tool_choice / logprobs, it carries no \"Model\n support can differ\" caveat — the basis for capabilities.thinking: true.\nVision: not documented anywhere on the site.\nEmbeddings: not documented anywhere on the site.\nBilling: no free tier. A payment card and prepaid credits are\n required before a key is issued.\nSignup: https://paretoinference.com/dashboard\nKey format: none declared.\nData handling: Pareto documents zero data retention (ZDR) — request\n content is not kept after a request finishes.\n\nQuick Start\nGet an API key\nVisit: https://paretoinference.com/dashboard and sign in\nAdd a payment card — Pareto has no free tier; a card and prepaid credits\n are required before a key is issued\n (https://docs.paretoinference.com/pricing)\nBuy prepaid credits, then create your API key from the dashboard\nSet PARETO_INFERENCE_API_KEY in your .env file\nConfigure\nUse it\n\nPer-request credentials work as they do for every provider:\n\nModels\n\n| Model | Context | Vision | $/M in · out · cached | Notes |\n| ----------------------- | --------------- | ------ | ----------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |\n| z-ai/glm-5.3-flash ⭐ | not published\\ | no | $0.09 / $0.30 (cached $0.018) | Only model Pareto serves. Max output documented as 1–131,072 tokens (default 131,072). \\Pareto publishes no context window; the catalog falls back to 131,072, the documented output ceiling, which is not a vendor context length. |\n\n\\ Pareto's own docs state it does not* disclose GLM 5.3 Flash's serving\ndetails (\"We do not disclose the technical details of our GLM 5.3 Flash\nserving system\"), and no context-window number appears on any public page.\nmodels.defaultContextWindow (131,072) is therefore a catalog fallback — the\ndocumented output ceiling, not a vendor context length — flagged in the\ncatalog entry's description. Correct it once Pareto publishes a real figure or\nan authenticated probe reveals one.\n\nFallback order: none — z-ai/glm-5.3-flash is the only model Pareto\nserves, so it is both the default and its own (schema-exempt) single-entry\nfallback list.\n\nVerification status\n\nTier-2 onboarding requires evidence before a provider is accepted, and\npnpm run verify:provider-onboarding gates it in CI. This is what the\ncatalog records for Pareto Inference — and, just as importantly, what it\ndoes not ye","hierarchy":{"lvl0":"Getting Started","lvl1":"Pareto Inference Provider Guide","lvl2":"","lvl3":""}},
|
|
6868
6869
|
{"objectID":"6a8ee157b685405e8c480486655e4656ea272f63493e36006b7ac43e499b5e27","title":"Pareto Inference Provider Guide","url":"/docs/getting-started/providers/pareto-inference#pareto-inference-provider-guide","content":"Verification status: this entry is docs- and roster-verified only —\nnot yet live-verified. It was onboarded credential-free: no Pareto\nInference API key was ever created or used. Every field below comes from\nPareto's public docs (https://docs.paretoinference.com/) and an\nunauthenticated GET /v1/models call (no auth header). No POST\nrequest was ever sent, so no generate, stream, tool-calling or\nstructured-output capability has been exercised end to end. Treat\ncapabilities.tools and .thinking as documentation-grade, not\nwire-proven, until evidence.liveMatrix is filled in by a live run.\n\nPareto Inference is a Tier-2 catalog provider: OpenAI-wire-compatible\nwith no behavioural quirks, so its entire integration is one JSON file\n(src/lib/providers/catalog/pareto-inference.json) rather than hand-written\ncode. That file is the source of truth for everything on this page.","hierarchy":{"lvl0":"Getting Started","lvl1":"Pareto Inference Provider Guide","lvl2":"Pareto Inference Provider Guide","lvl3":""}},
|
|
6869
6870
|
{"objectID":"4098c852271191df4a2cf6cfcd19b7832504f8a2e019abcce21852d7bc292fe3","title":"Key Facts","url":"/docs/getting-started/providers/pareto-inference#key-facts","content":"Provider id: pareto-inference\nProtocol: OpenAI-compatible (/chat/completions) — \"Pareto accepts\n only OpenAI Chat Completions.\"\nBase URL: https://api.paretoinference.com/v1\nDefault model: z-ai/glm-5.3-flash (GLM 5.3 Flash; the docs also\n document a bare alias, glm-5.3-flash, for the same model)\nModels in catalog: 1 — the only model Pareto serves. Confirmed by an\n unauthenticated GET /v1/models (no key needed), which returns exactly\n one id.\nStreaming: documented (SSE, text in choices[0].delta.content, tool\n calls in choices[0].delta.tool_calls, terminal data: [DONE]) — not\n live-probed.\nTool calling: documented (tools, tool_choice) but the vendor's own\n request-parameter table hedges it with \"Model support can differ,\" with no\n model-specific confirmation — set to model-dependent, not true.\nStructured output: response_format is a documented parameter but\n carries the same \"Model support can differ\" hedge as tools; the catalog\n schema has no model-dependent option for this field, so it is set\n false rather than asserted from a hedged table. structuredOutputWithTools\n is false — no combined probe was possible credential-free.\nReasoning: reasoning_effort (\"Sets the reasoning level\") is\n documented as a plain, unhedged request parameter — unlike tools /\n response_format / tool_choice / logprobs, it carries no \"Model\n support can differ\" caveat — the basis for capabilities.thinking: true.\nVision: not documented anywhere on the site.\nEmbeddings: not documented anywhere on the site.\nBilling: no free tier. A payment card and prepaid credits are\n required before a key is issued.\nSignup: https://paretoinference.com/dashboard\nKey format: none declared.\nData handling: Pareto documents zero data retention (ZDR) — request\n content is not kept after a request finishes.","hierarchy":{"lvl0":"Getting Started","lvl1":"Pareto Inference Provider Guide","lvl2":"Key Facts","lvl3":""}},
|
|
6870
6871
|
{"objectID":"caf0e714786bb6800e72192b4bab1eb0c3e5b66a58b7545323fa523c7af1fe96","title":"1. Get an API key","url":"/docs/getting-started/providers/pareto-inference#1-get-an-api-key","content":"Visit: https://paretoinference.com/dashboard and sign in\nAdd a payment card — Pareto has no free tier; a card and prepaid credits\n are required before a key is issued\n (https://docs.paretoinference.com/pricing)\nBuy prepaid credits, then create your API key from the dashboard\nSet PARETO_INFERENCE_API_KEY in your .env file","hierarchy":{"lvl0":"Getting Started","lvl1":"Pareto Inference Provider Guide","lvl2":"1. Get an API key","lvl3":""}},
|
|
6871
6872
|
{"objectID":"6ebc7974cc2c829d61423aa76879f84bf39f510a89e5d69d413a837fe72d86c6","title":"3. Use it","url":"/docs/getting-started/providers/pareto-inference#3-use-it","content":"`bash","hierarchy":{"lvl0":"Getting Started","lvl1":"Pareto Inference Provider Guide","lvl2":"3. Use it","lvl3":""}},
|
|
6872
6873
|
{"objectID":"88e47ec55c1f3481092432425a6fabfeda109649e1722eff1cc531f760df674c","title":"CLI","url":"/docs/getting-started/providers/pareto-inference#cli","content":"npx @juspay/neurolink generate \"Hello\" --provider pareto-inference\ntypescript\nawait neurolink.generate({\n input: { text: \"Hello\" },\n provider: \"pareto-inference\",\n credentials: {\n \"pareto-inference\": { apiKey: process.env.PARETOINFERENCEAPI_KEY },\n },\n});\n`","hierarchy":{"lvl0":"Getting Started","lvl1":"Pareto Inference Provider Guide","lvl2":"CLI","lvl3":""}},
|
|
6873
|
-
{"objectID":"79c93948b6d461182578b28b94eb9fa1edbf0815941cdb6090462ac57a92a6ab","title":"Models","url":"/docs/getting-started/providers/pareto-inference#models","content":"| Model | Context
|
|
6874
|
+
{"objectID":"79c93948b6d461182578b28b94eb9fa1edbf0815941cdb6090462ac57a92a6ab","title":"Models","url":"/docs/getting-started/providers/pareto-inference#models","content":"| Model | Context | Vision | $/M in · out · cached | Notes |\n| ----------------------- | --------------- | ------ | ----------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |\n| z-ai/glm-5.3-flash ⭐ | not published\\ | no | $0.09 / $0.30 (cached $0.018) | Only model Pareto serves. Max output documented as 1–131,072 tokens (default 131,072). \\Pareto publishes no context window; the catalog falls back to 131,072, the documented output ceiling, which is not a vendor context length. |\n\n\\ Pareto's own docs state it does not* disclose GLM 5.3 Flash's serving\ndetails (\"We do not disclose the technical details of our GLM 5.3 Flash\nserving system\"), and no context-window number appears on any public page.\nmodels.defaultContextWindow (131,072) is therefore a catalog fallback — the\ndocumented output ceiling, not a vendor context length — flagged in the\ncatalog entry's description. Correct it once Pareto publishes a real figure or\nan authenticated probe reveals one.\n\nFallback order: none — z-ai/glm-5.3-flash is the only model Pareto\nserves, so it is both the default and its own (schema-exempt) single-entry\nfallback list.","hierarchy":{"lvl0":"Getting Started","lvl1":"Pareto Inference Provider Guide","lvl2":"Models","lvl3":""}},
|
|
6874
6875
|
{"objectID":"106d04b8baec018f872ce608c3b0dd33f8b3d43ada85072831a2e9ab9c64c46b","title":"Verification status","url":"/docs/getting-started/providers/pareto-inference#verification-status","content":"Tier-2 onboarding requires evidence before a provider is accepted, and\npnpm run verify:provider-onboarding gates it in CI. This is what the\ncatalog records for Pareto Inference — and, just as importantly, what it\ndoes not yet record:\n\n| Probe | Result |\n| --------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| Roster | unauthenticated GET /v1/models, HTTP 200, 1 model (z-ai/glm-5.3-flash), 2026-09-28. No API key was used or required for this call. |\n| Auth rejection | Not probed. Would require a POST with an invalid key, which this credential-free onboarding pass does not send. Pareto's docs describe 401 as \"the chat API key is missing, invalid, or no longer active,\" with no example error body. |\n| Live capability sweep | Not run. evidence.liveMatrix is null. capabilities.tools and .thinking are set from the v","hierarchy":{"lvl0":"Getting Started","lvl1":"Pareto Inference Provider Guide","lvl2":"Verification status","lvl3":""}},
|
|
6875
|
-
{"objectID":"b844edaf09c93fb3089bbf0a71254c5039dedf111e2b59563321484496862aa4","title":"Troubleshooting","url":"/docs/getting-started/providers/pareto-inference#troubleshooting","content":"| Symptom | Cause | Fix
|
|
6876
|
+
{"objectID":"b844edaf09c93fb3089bbf0a71254c5039dedf111e2b59563321484496862aa4","title":"Troubleshooting","url":"/docs/getting-started/providers/pareto-inference#troubleshooting","content":"| Symptom | Cause | Fix |\n| --------------------------------------- | -------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- |\n| Invalid Pareto Inference API key | PARETO_INFERENCE_API_KEY unset, wrong, or expired | Pareto documents 401 as \"the chat API key is missing, invalid, or no longer active\" — check or replace the key in the dashboard |\n| 429 with credit_exhausted | Prepaid balance is empty | Buy more prepaid credits |\n| 429 with credit_insufficient | Held credits (reserved for max_tokens) are below what's needed | Lower max_tokens, or buy more credits |\n| 429 with model_capacity | The model itself is at capacity — not an account-level limit | Honor the Retry-After header and retry |\n| 502 mid-stream | The model request failed after the stream started | Retry the request; check whether a tool call already ran before retrying |\n| 503 | Temporary Pareto-side failure (e.g. maintenance, GPU outage) | Wait and retry; Retry-After gives the delay in seconds ","hierarchy":{"lvl0":"Getting Started","lvl1":"Pareto Inference Provider Guide","lvl2":"Troubleshooting","lvl3":""}},
|
|
6876
6877
|
{"objectID":"57b8457eff592f229d3c0f0fb7c73148341ecffd72bb29c15d73f1471b1fd886","title":"See also","url":"/docs/getting-started/providers/pareto-inference#see-also","content":"Provider setup overview\nAll providers\nTier-2 onboarding — how this provider's JSON becomes a working integration\nProvider feature compatibility","hierarchy":{"lvl0":"Getting Started","lvl1":"Pareto Inference Provider Guide","lvl2":"See also","lvl3":""}},
|
|
6877
6878
|
{"objectID":"daf00919862e4bbed4b3fc1082bea17843a987e5e3970cefed2c95537b22cceb","title":"Perplexity Decisions Provider Guide","url":"/docs/getting-started/providers/perplexity-decider","content":"Perplexity Decisions Provider Guide\n\nA provider of decide — the same typed boolean / choice / score\nanswers as TypeSafe's Jev, Laya and XOR,\nfrom Perplexity's hosted Decisions API, and it also reads images. It emits no\ntext at all.\n\nThis is not the Perplexity text provider (perplexity, the\nSonar models), which serves generate() and stream(). The two share one API\nkey, which has a consequence worth reading before you set it. See\nWhat is sent to Perplexity and\nOne key, two providers.\n\nOverview\n\npplx-decider-v1-27b is Perplexity's decision model. You send one state\nplus named, typed questions, and optionally images. The model answers every\nquestion in a single batched pass and returns a typed answer for each, with a\nprobability instead of a sentence. NeuroLink calls Perplexity's public endpoint,\nso a key alone configures it: there is no base URL to set.\n\nKey Facts\n\n| | |\n| ------------------------ | ----------------------------------------------------------------------------------------------------------------- |\n| Provider id | perplexity-decider (no aliases) — distinct from perplexity, the Sonar text provider |\n| Inference type | decide only |\n| Model | pplx-decider-v1-27b; the API answers 400 to a missing or unknown model. PERPLEXITY_DECIDER_MODEL sets it |\n| Key | PERPLEXITY_API_KEY, shared with the Perplexity text provider, or credentials.perplexityDecider.apiKey |\n| Endpoint | https://api.perplexity.ai/v1/decisions; PERPLEXITY_DECIDER_BASE_URL can name another origin |\n| Media | images (PNG, JPEG or WebP), up to 8 per request; no video |\n| Questions per request | up to 128 |\n| Server input ceiling | under 262,144 tokens (state, questions and images); more is refused with an explicit 400, never cut off silently |\n| Images and that ceiling | billed as input tokens, and counted toward the ceiling at one token per 32 × 32 tile (measured) |\n| NeuroLink's state window | 100,000 estimated tokens: a deliberate local limit, not the server's |\n| Cost | $0.04 per million input tokens (image tokens included); output tokens are free. Perplexity's documented price |\n| Default timeout | 10 seconds plus 100 ms for each question (10.1 s for one, 22.8 s for 128); timeoutMs or --timeout replaces it |\n| Precedence | used automatically when TypeSafe, Laya and XOR are not configured |\n\nEach limit, token rate and latency in this guide is either measured on a real\naccount in October 2026 or taken from Perplexity's documentation, and says\nwhich where it appears. Measured: the 128-question and 8-image caps, the\n262,144-token input ceiling for the state, the questions and the images (nothing\nis cut off silently), characters per token for each kind of text, latency by\ninput size and by question count, what an image costs, which image sizes stall\n(the 2,048-tile rule, checked at its edge: see Images), and how the\nAPI answers a burst of requests. Documented and not tested: the 32 MiB request\nbody, the price, and the option and level counts. Perplexity documents a limit of\n10 requests per second for the account's tier (every organization, on every\nplan, with a token limit on large bursts), and a burst test on the one account\ntested saw the request limit act.\n\nQuick Start\nGet a key\n\nCreate one in the Perplexity console. Any\nPerplexity API key works.\nConfigure\n\nSet the key in the environment:\n\nor in the config passed to the SDK, exactly as for any other provider. Values\npassed per call override the constructor's, which override the environment:\n\ncredentials.perplexityDecider is its own slice. A key passed as\ncredentials.perplexity belongs to the text provider and does not configure\nthis one. PERPLEXITY_BASE_URL, which moves the text provider, is not read here;\nthe override for this provider is PERPLEXITY_DECIDER_BASE_URL, and a trailing\n/v1 on it is accepted.\nUse it\n\nNeuroLink's boolean question is sent to the API as its noul type, and the\nanswer is read back as a boolean. A boolean answer carries a probability and\nno confidence of its own; a choice or score answer carries the confidence the\nAPI reports, which Perplexity describes as the model's own certainty estimate,\nnot the top probability. Perplexity's API reference and quickstart do not call\nthat confidence calibrated, and NeuroLink did not measure whether it is, so tune\na t","hierarchy":{"lvl0":"Getting Started","lvl1":"Perplexity Decisions Provider Guide","lvl2":"","lvl3":""}},
|
|
6878
6879
|
{"objectID":"cd579839c9ecb7a84dee24ccd591e76f90eb1f05b384a35488c7603f72178d38","title":"Perplexity Decisions Provider Guide","url":"/docs/getting-started/providers/perplexity-decider#perplexity-decisions-provider-guide","content":"A provider of decide — the same typed boolean / choice / score\nanswers as TypeSafe's Jev, Laya and XOR,\nfrom Perplexity's hosted Decisions API, and it also reads images. It emits no\ntext at all.\n\nThis is not the Perplexity text provider (perplexity, the\nSonar models), which serves generate() and stream(). The two share one API\nkey, which has a consequence worth reading before you set it. See\nWhat is sent to Perplexity and\nOne key, two providers.","hierarchy":{"lvl0":"Getting Started","lvl1":"Perplexity Decisions Provider Guide","lvl2":"Perplexity Decisions Provider Guide","lvl3":""}},
|
|
@@ -7093,6 +7094,14 @@
|
|
|
7093
7094
|
{"objectID":"d3fa9fe0cd14116640be135371818f894b920afecd0e0eeb8d456b691dcb032f","title":"Verification status","url":"/docs/getting-started/providers/siliconflow#verification-status","content":"Tier-2 onboarding requires evidence before a provider is accepted, and\npnpm run verify:provider-onboarding gates it in CI. This is what the catalog\ncurrently records for SiliconFlow — docs-verified only, not live-verified:\n\n| Probe | Result |\n| ------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| Roster | unauthenticated GET https://api.siliconflow.com/v1/models answers HTTP 401 without a key (2026-09-29), so model ids are taken from the API reference and the model pages (retrieved 2026-09-29); roster not verified ","hierarchy":{"lvl0":"Getting Started","lvl1":"SiliconFlow Provider Guide","lvl2":"Verification status","lvl3":""}},
|
|
7094
7095
|
{"objectID":"fc0490611c80ade458aea34aed72e5384701e9113ac0a35d9ce58472c2f8d4ad","title":"Troubleshooting","url":"/docs/getting-started/providers/siliconflow#troubleshooting","content":"Causes and fixes in quotation marks are SiliconFlow's wording, with the page\nnamed.\n\n| Symptom | Cause | Fix |\n| -------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| HTTP 401 | \"API Key is not properly set.\" (Error Handling) | \"Verify the API Key\" (Text Generation, error code table) |\n| HTTP 403 | \"The most common reason is that the model re","hierarchy":{"lvl0":"Getting Started","lvl1":"SiliconFlow Provider Guide","lvl2":"Troubleshooting","lvl3":""}},
|
|
7095
7096
|
{"objectID":"542760473bdb0052ffd4d8de58a6bb5c713decbb147b33cd821a72dee67af37f","title":"See also","url":"/docs/getting-started/providers/siliconflow#see-also","content":"Provider setup overview\nAll providers\nTier-2 onboarding — how this provider's JSON becomes a working integration\nProvider feature compatibility\nSiliconFlow pages this entry was built from:\n Quick Start,\n Text Generation,\n Chat completions API reference,\n List models,\n Create embeddings,\n Function Calling,\n JSON Mode,\n Reasoning,\n Stream Mode,\n Error Handling,\n Documentation index,\n Pricing,\n Models,\n SiliconFlow console,\n API Keys\nSiliconFlow model pages (retrieved 2026-09-29):\n DeepSeek-V4-Pro,\n DeepSeek-V4-Flash,\n DeepSeek-V3.2,\n GLM-5.1,\n GLM-5,\n Kimi-K2.6,\n Kimi-K2.5,\n Qwen3.6-27B,\n Qwen3.6-35B-A3B,\n Qwen3-32B,\n Qwen3-VL-32B-Instruct,\n gemma-4-31B-it,\n openai/gpt-oss-120b","hierarchy":{"lvl0":"Getting Started","lvl1":"SiliconFlow Provider Guide","lvl2":"See also","lvl3":""}},
|
|
7097
|
+
{"objectID":"255b33886ebb54846526fc181abecf9fce349c20831f4fc03bf280bff8b90555","title":"60db TTS Provider Guide","url":"/docs/getting-started/providers/sixtydb","content":"60db TTS Provider Guide\n\n60db is a hosted speech API with workspace-scoped voices. NeuroLink exposes\nits HTTP text-to-speech endpoint as sixtydb.\n\nConfiguration\n\nSet SIXTYDB_API_KEY to your workspace API key. Supply a workspace voice UUID\nthrough tts.voice, or set SIXTYDB_DEFAULT_VOICE. There is no shared default\nvoice. Existing LLM configuration still applies when using NeuroLink.generate().\n\nThis synthesizes the input directly. Set tts.useAiResponse: true to synthesize\nthe LLM response instead.\n\nVoice discovery\n\nTTSProcessor.getVoices(\"sixtydb\") loads the workspace's quality and fast\ncatalogs and caches their combined results for five minutes. Pass\n{ languageCode: \"hi\" } as the second argument to filter using the catalog's\nlanguage labels. The selected voice determines the synthesis tier; no model ID\nis sent in the synthesis request.\n\nAudio and options\n\n| Option | Supported values |\n| ---------- | ------------------------------- |\n| voice | Workspace voice UUID |\n| format | wav (default), pcm16 |\n| speed | 0.5–2; default 1 |\n| Input text | 1–5000 characters per synthesis |\n\nThe handler requests mono LINEAR16 audio at 24 kHz. WAV output includes a RIFF\nheader; pcm16 is raw signed 16-bit little-endian audio. Other formats are\nrejected before the HTTP request. Native timestamp, pitch and volume controls\nare not exposed by this handler.\n\nThe handler buffers each HTTP synthesis response. stream() uses NeuroLink's\nexisting sentence-based TTS processing; it does not expose 60db's native audio\nstream. Each request has a 30-second timeout covering headers and response body,\nand a 64 MiB response limit.\n\nCLI\n\nWith the workspace key and default voice configured:\n\nUse --tts-voice to override the default workspace voice for one request.\n\nExplicit credentials\n\nFor applications that manage credentials themselves, register an instance:\n\nAn optional second constructor argument overrides the API endpoint for an\napplication-managed proxy. Credentials are sent as a Bearer token; HTTP\nredirects are rejected.\n\nTroubleshooting\nMissing credentials: configure the workspace key before registration.\nMissing voice or invalid UUID: list workspace voices and supply an ID from\n that catalog.\nUnsupported format: select WAV or PCM16 explicitly, especially in the CLI,\n whose common format default is MP3.\nFailed generate(): inspect result.ttsMetadata and check result.audio\n before saving. NeuroLink reports speech failures separately from text output.\nHTTP authentication errors and malformed audio responses are non-retryable.\n\nSee the 60db TTS reference\nand workspace voice reference\nfor the upstream request contract.","hierarchy":{"lvl0":"Getting Started","lvl1":"60db TTS Provider Guide","lvl2":"","lvl3":""}},
|
|
7098
|
+
{"objectID":"09b76cd09fda8118f6ba1d276cc631959578c174bf64ae78b2be9c59aa91bb52","title":"60db TTS Provider Guide","url":"/docs/getting-started/providers/sixtydb#60db-tts-provider-guide","content":"60db is a hosted speech API with workspace-scoped voices. NeuroLink exposes\nits HTTP text-to-speech endpoint as sixtydb.","hierarchy":{"lvl0":"Getting Started","lvl1":"60db TTS Provider Guide","lvl2":"60db TTS Provider Guide","lvl3":""}},
|
|
7099
|
+
{"objectID":"59a5b2102793066937fdce1b3223d2542f2f137d40c79659ccdef56b00a964f6","title":"Configuration","url":"/docs/getting-started/providers/sixtydb#configuration","content":"Set SIXTYDB_API_KEY to your workspace API key. Supply a workspace voice UUID\nthrough tts.voice, or set SIXTYDB_DEFAULT_VOICE. There is no shared default\nvoice. Existing LLM configuration still applies when using NeuroLink.generate().\n\nThis synthesizes the input directly. Set tts.useAiResponse: true to synthesize\nthe LLM response instead.","hierarchy":{"lvl0":"Getting Started","lvl1":"60db TTS Provider Guide","lvl2":"Configuration","lvl3":""}},
|
|
7100
|
+
{"objectID":"af9db493212c20fcba55442c97a16aea7ef0b3776743bac838c29b9b9bbd3cb7","title":"Voice discovery","url":"/docs/getting-started/providers/sixtydb#voice-discovery","content":"TTSProcessor.getVoices(\"sixtydb\") loads the workspace's quality and fast\ncatalogs and caches their combined results for five minutes. Pass\n{ languageCode: \"hi\" } as the second argument to filter using the catalog's\nlanguage labels. The selected voice determines the synthesis tier; no model ID\nis sent in the synthesis request.","hierarchy":{"lvl0":"Getting Started","lvl1":"60db TTS Provider Guide","lvl2":"Voice discovery","lvl3":""}},
|
|
7101
|
+
{"objectID":"b3856bda9d1789193e474dc5482d8bcc3d2913cb591dcce780170dfa5639a540","title":"Audio and options","url":"/docs/getting-started/providers/sixtydb#audio-and-options","content":"| Option | Supported values |\n| ---------- | ------------------------------- |\n| voice | Workspace voice UUID |\n| format | wav (default), pcm16 |\n| speed | 0.5–2; default 1 |\n| Input text | 1–5000 characters per synthesis |\n\nThe handler requests mono LINEAR16 audio at 24 kHz. WAV output includes a RIFF\nheader; pcm16 is raw signed 16-bit little-endian audio. Other formats are\nrejected before the HTTP request. Native timestamp, pitch and volume controls\nare not exposed by this handler.\n\nThe handler buffers each HTTP synthesis response. stream() uses NeuroLink's\nexisting sentence-based TTS processing; it does not expose 60db's native audio\nstream. Each request has a 30-second timeout covering headers and response body,\nand a 64 MiB response limit.","hierarchy":{"lvl0":"Getting Started","lvl1":"60db TTS Provider Guide","lvl2":"Audio and options","lvl3":""}},
|
|
7102
|
+
{"objectID":"b20fa89380885b197abe8bd921a6fa506f1406def0bb87c21ad85a3cbe970059","title":"CLI","url":"/docs/getting-started/providers/sixtydb#cli","content":"With the workspace key and default voice configured:\n\nUse --tts-voice to override the default workspace voice for one request.","hierarchy":{"lvl0":"Getting Started","lvl1":"60db TTS Provider Guide","lvl2":"CLI","lvl3":""}},
|
|
7103
|
+
{"objectID":"d1a94daa1c0f70eaf57ca167d5109e217d63164af7263653b411ab698bc0e132","title":"Explicit credentials","url":"/docs/getting-started/providers/sixtydb#explicit-credentials","content":"For applications that manage credentials themselves, register an instance:\n\nAn optional second constructor argument overrides the API endpoint for an\napplication-managed proxy. Credentials are sent as a Bearer token; HTTP\nredirects are rejected.","hierarchy":{"lvl0":"Getting Started","lvl1":"60db TTS Provider Guide","lvl2":"Explicit credentials","lvl3":""}},
|
|
7104
|
+
{"objectID":"e29858f1929ab8492ab5ac6876bafa4d1b74b358784de47977167f341e04f40d","title":"Troubleshooting","url":"/docs/getting-started/providers/sixtydb#troubleshooting","content":"Missing credentials: configure the workspace key before registration.\nMissing voice or invalid UUID: list workspace voices and supply an ID from\n that catalog.\nUnsupported format: select WAV or PCM16 explicitly, especially in the CLI,\n whose common format default is MP3.\nFailed generate(): inspect result.ttsMetadata and check result.audio\n before saving. NeuroLink reports speech failures separately from text output.\nHTTP authentication errors and malformed audio responses are non-retryable.\n\nSee the 60db TTS reference\nand workspace voice reference\nfor the upstream request contract.","hierarchy":{"lvl0":"Getting Started","lvl1":"60db TTS Provider Guide","lvl2":"Troubleshooting","lvl3":""}},
|
|
7096
7105
|
{"objectID":"adff568ca72c577a263a48494421247c42ae820733451b03d9bbfa8e898f42c1","title":"Stability AI Provider Guide","url":"/docs/getting-started/providers/stability","content":"Stability AI Provider Guide\n\nDirect image generation — image-only provider with no chat / streaming\n(use the imageOutput.base64 field on the result)\n\nOverview\n\nStability AI hosts the Stable Diffusion family + Stable Image Ultra /\nCore. NeuroLink wraps api.stability.ai/v2beta/stable-image/generate/{model}\nso image generation works through the same nl.generate() flow as the\nLLM-routed image-gen providers (DALL-E on OpenAI, Imagen on Vertex).\nstable-image-ultra — flagship quality (default)\nstable-image-core — fast tier\nsd3.5-large, sd3.5-large-turbo, sd3.5-medium — open-weight Stable Diffusion 3.5\n\nKey Facts\nProtocol: REST /v2beta/stable-image/generate/{model} — multipart/form-data submit, base64 PNG response\nDefault base URL: https://api.stability.ai\nDefault model: stable-image-ultra\nOutput: PNG (always — output_format=png is hard-coded)\nStreaming / chat / tool calling: NOT supported (image-only; executeStream throws a friendly error)\nReference images: Not supported via this provider (use Replicate-hosted SDXL or Vertex Imagen for img-to-img)\nPricing: Per image — Stable Image Ultra is the most expensive tier\n\nQuick Start\nGet an API Key\n\nSign up at https://platform.stability.ai/\nand create an API key at\nhttps://platform.stability.ai/account/keys.\nConfigure Environment\nGenerate Your First Image\n\nSDK Usage\n\nBasic Generation (Stable Image Ultra)\n\nStable Image Core (Fast Tier)\n\nSD 3.5 Large\n\nAspect Ratio + Negative Prompt\n\nThe handler reads aspectRatio and negativePrompt from the options:\n\n(NeuroLink threads aspectRatio and negativePrompt through to the\nprovider when present; canonical typing for image-gen extras is a\nfollow-up improvement.)\n\nPer-Call Credentials\n\nCLI Usage\n\nProvider Aliases\n\n| Alias | Example |\n| -------------- | ------------------------- |\n| stability | --provider stability |\n| stability-ai | --provider stability-ai |\n| sd | --provider sd |\n\nConfiguration Reference\n\n| Environment Variable | Required | Default | Description |\n| -------------------- | -------- | -------------------------- | -------------------- |\n| STABILITY_API_KEY | Yes | — | Stability AI API key |\n| STABILITY_MODEL | No | stable-image-ultra | Default model |\n| STABILITY_BASE_URL | No | https://api.stability.ai | Base URL |\n\nFeature Support Matrix\n\n| Feature | stable-image-ultra | stable-image-core | sd3.5-large |\n| ---------------- | ------------------- | ----------------- | ----------- |\n| Image generation | Yes | Yes | Yes |\n| Text-to-image | Yes | Yes | Yes |\n| Image-to-image | No (this provider)¹ | No | No |\n| Aspect ratio | Yes | Yes | Yes |\n| Negative prompt | Yes | Yes | Yes |\n| Seed control | Yes | Yes | Yes |\n| Streaming | No | No | No |\n| Chat / tools | No | No | No |\n\n¹ For image-to-image with Stable Diffusion, use Replicate-hosted SDXL\nvariants via the Replicate provider.\n\nTroubleshooting\n\n\"Invalid Stability AI API key\"\n\nGet / rotate at\nhttps://platform.stability.ai/account/keys.\n\n\"Stability AI rate limit exceeded\"\n\nStability has per-second rate limits per tier. Implement exponential\nbackoff or upgrade your tier at\nhttps://platform.stability.ai/account/credits.\n\n\"Stability AI declined the request due to content policy\"\n\nThe prompt triggered Stability's content filter (finish_reason:\nCONTENT_FILTERED). Adjust the prompt and retry. Use a different model\nif you need looser filtering — but note that ALL Stable Image / SD 3.5\nmodels on the hosted API enforce the same policy.\n\n\"Stability AI returned no image\"\n\nThe upstream returned finish_reason: ERROR without an image. Check\nthe prompt for malformed Unicode or excessive length (>2000 chars).\n\n\"Model not found\"\n\nUse one of the documented model IDs: stable-image-ultra,\nstable-image-core, sd3.5-large, sd3.5-large-turbo, sd3.5-medium.\nNote: some older Stability models (SDXL 1.0, Stable Diffusion 1.5) are\ndeprecated on the hosted API — use Replicate to access them.\n\nSee Also\nIdeogram — sibling image-gen with strong typography (no setup doc yet; see src/lib/providers/ideogram.ts)\nRecraft — sibling image-gen with vector / illustration focus (no setup doc yet; see src/lib/providers/recraft.ts)\nReplicate Provider — image-gen via FLUX, SDXL variants, etc.\nAdding an image-gen provider — internal reference\n\nNeed Help? Open a GitHub Discussion or issue.","hierarchy":{"lvl0":"Getting Started","lvl1":"Stability AI Provider Guide","lvl2":"","lvl3":""}},
|
|
7097
7106
|
{"objectID":"158fb3f19b9c5a8afc9caf5497ad88e808c29b5d5f54fc55a94b0d7ddec885b5","title":"Stability AI Provider Guide","url":"/docs/getting-started/providers/stability#stability-ai-provider-guide","content":"Direct image generation — image-only provider with no chat / streaming\n(use the imageOutput.base64 field on the result)","hierarchy":{"lvl0":"Getting Started","lvl1":"Stability AI Provider Guide","lvl2":"Stability AI Provider Guide","lvl3":""}},
|
|
7098
7107
|
{"objectID":"9be4095a72a8e90fffc492dda791996e54456c0fdbb189805bf453ad83e05629","title":"Overview","url":"/docs/getting-started/providers/stability#overview","content":"Stability AI hosts the Stable Diffusion family + Stable Image Ultra /\nCore. NeuroLink wraps api.stability.ai/v2beta/stable-image/generate/{model}\nso image generation works through the same nl.generate() flow as the\nLLM-routed image-gen providers (DALL-E on OpenAI, Imagen on Vertex).\nstable-image-ultra — flagship quality (default)\nstable-image-core — fast tier\nsd3.5-large, sd3.5-large-turbo, sd3.5-medium — open-weight Stable Diffusion 3.5","hierarchy":{"lvl0":"Getting Started","lvl1":"Stability AI Provider Guide","lvl2":"Overview","lvl3":""}},
|
|
@@ -8576,7 +8585,7 @@
|
|
|
8576
8585
|
{"objectID":"eab1054b46ac95b776cdc6f442a35f85748f4658d409941418c58bcdf27dac1b","title":"Run the full RAG suite (canonical entry point)","url":"/docs/implementation-guides/14-rag-document-processing#run-the-full-rag-suite-canonical-entry-point","content":"pnpm run test:rag","hierarchy":{"lvl0":"Implementation Guides","lvl1":"RAG Document Processing - Implementation Guide","lvl2":"Run the full RAG suite (canonical entry point)","lvl3":""}},
|
|
8577
8586
|
{"objectID":"1dfcdd7f939eaf1c928080629de1e038fd9baee40a31fad65557d587a7a80d66","title":"Run the suite directly with tsx if you want extra logging","url":"/docs/implementation-guides/14-rag-document-processing#run-the-suite-directly-with-tsx-if-you-want-extra-logging","content":"pnpm exec tsx test/continuous-test-suite-rag.ts\n\n\n> NeuroLink runs all suites via tsx; there is no vitest runner. RAG-specific scenarios (chunkers, rerankers, metadata) are exercised by continuous-test-suite-rag.ts`.","hierarchy":{"lvl0":"Implementation Guides","lvl1":"RAG Document Processing - Implementation Guide","lvl2":"Run the suite directly with tsx if you want extra logging","lvl3":""}},
|
|
8578
8587
|
{"objectID":"95f574ed3e7979eee5be188ccd16efb2639e30e8258e55366d7ccd344bbc3126","title":"Related Documentation","url":"/docs/implementation-guides/14-rag-document-processing#related-documentation","content":"Vector Store Integrations\nEvaluation and Scoring\nMaster Implementation Guide","hierarchy":{"lvl0":"Implementation Guides","lvl1":"RAG Document Processing - Implementation Guide","lvl2":"Related Documentation","lvl3":""}},
|
|
8579
|
-
{"objectID":"60877eba17c1fe5c9fda2100a737f42fddb5c4c7083297e61a66884dbe5c326e","title":"NeuroLink","url":"/docs/","content":"🧠 NeuroLink\n The Pipe Layer of an AI Nervous System\n Provider Neurons Across Major AI Vendors | 3 Inference Types (generate · stream · decide) | Voice (TTS/STT/Realtime) | 58+ MCP
|
|
8588
|
+
{"objectID":"60877eba17c1fe5c9fda2100a737f42fddb5c4c7083297e61a66884dbe5c326e","title":"NeuroLink","url":"/docs/","content":"🧠 NeuroLink\n The Pipe Layer of an AI Nervous System\n Provider Neurons Across Major AI Vendors | 3 Inference Types (generate · stream · decide) | Voice (TTS/STT/Realtime) | 58+ MCP Servers | HITL Security | Redis Persistence\n\nNeuroLink is the pipe layer of an AI nervous system: one interface connecting provider neurons — major AI vendors and local runtimes — to the applications that consume them. Built-in tooling and an opinionated factory architecture mean adding a new provider, or a new capability, never touches application code. NeuroLink ships as both a TypeScript SDK and a professional CLI so teams can build, operate, and iterate on AI features quickly.\n\n🧠 What is NeuroLink?\n\nNeuroLink is the pipe layer of an AI nervous system. Providers — OpenAI, Anthropic, Google, AWS, Azure, DeepSeek, NVIDIA NIM, local runtimes like Ollama and llama.cpp, and dozens more — are the neurons: each generates a different kind of intelligence, at a different cost and latency. NeuroLink is the vascular layer that carries that intelligence, as a stream, to the applications that consume it, across three inference types: generate and stream produce text, decide produces a calibrated boolean/choice/score judgment instead.\n\nExtracted from production systems at Juspay, NeuroLink provides a practical, TypeScript-first way to plug any application into that nervous system. Switch which neuron answers a request with a single parameter change — any provider you're building with, or any provider you add.\n\nWhy NeuroLink? Three genuine inference types, not one dressed up three ways — generate and stream produce text, while decide returns a typed, calibrated judgment (boolean / choice / score) with no text at all, for the routing and gating decisions the other two were never meant to make. Every neuron plugs into the same pipe. Switch providers with a single parameter change, leverage 64+ built-in tools and MCP servers, deploy with confidence using enterprise features like Redis memory and multi-provider failover, and optimize costs automatically with intelligent routing. Use it via our professional CLI or TypeScript SDK—whichever fits your workflow.\n\nWhere we're headed: We're building for the future of AI—edge-first execution and continuous streaming architectures that make AI practically free and universally available. Read our vision →\n\nGet Started in \\ Observability Guide\nServer Adapters -- Deploy NeuroLink as an HTTP API server with your framework of choice (Hono, Express, Fastify, Koa). Full CLI support with serve and server commands for foreground/background modes, route management, and OpenAPI generation. -> Server Adapters Guide\nTitle Generation Events -- Emit real-time events when conversation titles are auto-generated. Listen to conversation:titleGenerated for session tracking. -> Conversation Memory Guide\nCustom Title Prompts -- Customize conversation title generation with NEUROLINK_TITLE_PROMPT environment variable. Use ${userMessage} placeholder for dynamic prompts. -> Conversation Memory Guide\nVideo Generation -- Transform images into 8-second videos with synchronized audio using Google Veo 3.1 via Vertex AI. Supports 720p/1080p resolutions, portrait/landscape aspect ratios. -> Video Generation Guide\nImage Generation -- Generate images from text prompts using Gemini models via Vertex AI or Google AI Studio. Supports streaming mode with automatic file saving. -> Image Generation Guide\nHTTP/Streamable HTTP Transport for MCP -- Connect to remote MCP servers via HTTP with authentication headers, retry logic, and rate limiting. -> HTTP Transport Guide\nClaude Subscription (OAuth) Support -- Use your Claude Pro/Max/Team subscription with NeuroLink via OAuth authentication, no API key required. -> Subscription Guide\nGemini 3 Preview Support - Full support for gemini-3-flash-preview and gemini-3-pro-preview with extended thinking capabilities\nStructured Output with Zod Schemas -- Type-safe JSON generation with automatic validation using schema + output.format: \"json\" in generate(). -> Structured Output Guide\nCSV File Support -- Attach CSV files to prompts for AI-powered data analysis with auto-detection. -> CSV Guide\nPDF File Support -- Process PDF documents with native visual analysis for Vertex AI, Anthropic, Bedrock, AI Studio. -> PDF Guide\n50+ File Types -- Process Excel, Word, RTF, JSON, YAML, XML, HTML, SVG, Markdown, and 50+ code languages with intelligent content extraction. -> File Processors Guide\nLiteLLM Integration -- Access 100+ AI models across a broad range of AI providers through unified interface. -> Setup Guide\nSageMaker Integration -- Deploy and use custom trained models on AWS infrastructure. -> Setup Guide\nOpenRouter Integration -- Access 300+ models from OpenAI, Anthropic, Google, Meta, and more through a single unified API. -> Setup Guide\nHuman-in-the-loop workflows -- Pause generation for user approval/input before tool execution. -> HITL Guide\nGuardrails middleware -- Block PII, profanity, and unsafe cont","hierarchy":{"lvl0":"Docs","lvl1":"NeuroLink","lvl2":"","lvl3":""}},
|
|
8580
8589
|
{"objectID":"7bd402837d03dbfbb9586674bc914cfc6ee7691e33540eeabe6555363697375e","title":"🧠 What is NeuroLink?","url":"/docs/#-what-is-neurolink","content":"NeuroLink is the pipe layer of an AI nervous system. Providers — OpenAI, Anthropic, Google, AWS, Azure, DeepSeek, NVIDIA NIM, local runtimes like Ollama and llama.cpp, and dozens more — are the neurons: each generates a different kind of intelligence, at a different cost and latency. NeuroLink is the vascular layer that carries that intelligence, as a stream, to the applications that consume it, across three inference types: generate and stream produce text, decide produces a calibrated boolean/choice/score judgment instead.\n\nExtracted from production systems at Juspay, NeuroLink provides a practical, TypeScript-first way to plug any application into that nervous system. Switch which neuron answers a request with a single parameter change — any provider you're building with, or any provider you add.\n\nWhy NeuroLink? Three genuine inference types, not one dressed up three ways — generate and stream produce text, while decide returns a typed, calibrated judgment (boolean / choice / score) with no text at all, for the routing and gating decisions the other two were never meant to make. Every neuron plugs into the same pipe. Switch providers with a single parameter change, leverage 64+ built-in tools and MCP servers, deploy with confidence using enterprise features like Redis memory and multi-provider failover, and optimize costs automatically with intelligent routing. Use it via our professional CLI or TypeScript SDK—whichever fits your workflow.\n\nWhere we're headed: We're building for the future of AI—edge-first execution and continuous streaming architectures that make AI practically free and universally available. Read our vision →\n\nGet Started in \\<5 Minutes →","hierarchy":{"lvl0":"Docs","lvl1":"NeuroLink","lvl2":"🧠 What is NeuroLink?","lvl3":""}},
|
|
8581
8590
|
{"objectID":"293082e7b04b9b0eb186f10fec40eefc1996d8eab9becff9e2b428731642291f","title":"What's New (Q1 2026)","url":"/docs/#whats-new-q1-2026","content":"| Feature | Version | Description | Guide |\n| ---------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------","hierarchy":{"lvl0":"Docs","lvl1":"NeuroLink","lvl2":"What's New (Q1 2026)","lvl3":""}},
|
|
8582
8591
|
{"objectID":"3e5ecc512d348470d92717ef33a2ff5067ffdd99c7ea212613df7986db133390","title":"Enterprise Security: Human-in-the-Loop (HITL)","url":"/docs/#enterprise-security-human-in-the-loop-hitl","content":"NeuroLink includes a HITL (Human-in-the-Loop) system for regulated industries and high-stakes AI operations:\n\n| Capability | Description | Use Case |\n| --------------------------- | ----------------------------------------------------------------------- | ------------------------------------------ |\n| Tool Approval Workflows | Require human approval before AI executes sensitive tools | Financial transactions, data modifications |\n| Output Validation | Route AI outputs through human review pipelines | Medical diagnosis, legal documents |\n| Confidence Thresholds | Automatically trigger human review below confidence level | Critical business decisions |\n| Complete Audit Trail | Audit logging to support your compliance program (HIPAA / SOC 2 / GDPR) | Regulated industries |\n\nEnterprise HITL Guide | Quick Start","hierarchy":{"lvl0":"Docs","lvl1":"NeuroLink","lvl2":"Enterprise Security: Human-in-the-Loop (HITL)","lvl3":""}},
|
|
@@ -8611,7 +8620,7 @@
|
|
|
8611
8620
|
{"objectID":"465ec37baf54875e8b6f7bec89b234a5948559d268bb7da7fcbc1e28df42c2c5","title":"Gemini 3 with Extended Thinking","url":"/docs/#gemini-3-with-extended-thinking","content":"Full command and API breakdown lives in docs/cli/commands.md and docs/sdk/api-reference.md.","hierarchy":{"lvl0":"Docs","lvl1":"NeuroLink","lvl2":"Gemini 3 with Extended Thinking","lvl3":""}},
|
|
8612
8621
|
{"objectID":"0b3ca8dabd93fb623251b649545083d11aa9108455c2700fe048c279660cd911","title":"Platform Capabilities at a Glance","url":"/docs/#platform-capabilities-at-a-glance","content":"| Capability | Highlights |\n| ------------------------ | ----------------------------------------------------------------------------------------------------------------------------- |\n| Provider unification | Provider neurons behind one API, with automatic fallback, cost-aware routing, providerFallback policy, modelChain config. |\n| Multimodal pipeline | Stream images + CSV data + PDF documents across providers with local/remote assets. Auto-detection for mixed file types. |\n| Voice pipeline | TTS (6 providers) + STT (4 providers) + realtime APIs (OpenAI Realtime, Gemini Live). |\n| Quality & governance | Auto-evaluation engine (14 scorers), guardrails middleware, HITL workflows, audit logging. |\n| Memory & context | Per-user condensed memory (S3/Redis/SQLite), Redis session export, 5-stage context compaction. |\n| CLI tooling | Loop sessions, setup wizard, config validation, Redis auto-detect, JSON output, TTS/STT flags. |\n| Enterprise ops | Claude proxy, OTLP observability, OpenObserve dashboard, regional routing, credential management. |\n| Tool ecosystem | MCP auto discovery, HTTP/stdio/SSE/WebSocket transports, LiteLLM hub access, SageMaker custom deployment, web search. |","hierarchy":{"lvl0":"Docs","lvl1":"NeuroLink","lvl2":"Platform Capabilities at a Glance","lvl3":""}},
|
|
8613
8622
|
{"objectID":"a52c3e036c1ddd2b2c5b6e086b7c5b9228edfddd931b194c450c65a7a60cb4da","title":"Documentation Map","url":"/docs/#documentation-map","content":"| Area | When to Use | Link |\n| --------------- | ----------------------------------------------------- | ----------------------------------------------------------- |\n| Getting started | Install, configure, run first prompt | docs/getting-started/index.md |\n| Feature guides | Understand new functionality front-to-back | docs/features/index.md |\n| CLI reference | Command syntax, flags, loop sessions | docs/cli/index.md |\n| SDK reference | Classes, methods, options | docs/sdk/index.md |\n| Integrations | LiteLLM, SageMaker, MCP | docs/litellm-integration.md |\n| Advanced | Middleware, architecture, streaming patterns | docs/advanced/index.md |\n| Cookbook | Practical recipes for common patterns | docs/cookbook/index.md |\n| Guides | Migration, Redis, troubleshooting, provider selection | docs/guides/index.md |\n| Operations | Configuration, troubleshooting, provider matrix | docs/reference/index.md |","hierarchy":{"lvl0":"Docs","lvl1":"NeuroLink","lvl2":"Documentation Map","lvl3":""}},
|
|
8614
|
-
{"objectID":"8c1712021aa9be2eb9e7c0377096e6260c5cacd3b493cb81ba4fb71e3e91338e","title":"New in 2026: Enhanced Documentation","url":"/docs/#new-in-2026-enhanced-documentation","content":"Enterprise Features:\nEnterprise HITL Guide - Approval workflows for high-stakes operations\nInteractive CLI Guide - AI development environment\nMCP Tools Showcase - 58+ external
|
|
8623
|
+
{"objectID":"8c1712021aa9be2eb9e7c0377096e6260c5cacd3b493cb81ba4fb71e3e91338e","title":"New in 2026: Enhanced Documentation","url":"/docs/#new-in-2026-enhanced-documentation","content":"Enterprise Features:\nEnterprise HITL Guide - Approval workflows for high-stakes operations\nInteractive CLI Guide - AI development environment\nMCP Tools Showcase - 58+ external MCP servers & 6 built-in tools\n\nProvider Intelligence:\nProvider Capabilities Audit - Technical capabilities matrix\nProvider Selection Guide - Interactive decision wizard\nProvider Comparison - Feature & cost comparison\n\nMiddleware System:\nMiddleware Architecture - Complete lifecycle & patterns\nBuilt-in Middleware - Analytics, Guardrails, Evaluation\nCustom Middleware Guide - Build your own\n\nRedis & Persistence:\nRedis Quick Start - 5-minute setup\nRedis Configuration - Production deployment setup\nRedis Migration - Migration patterns\n\nMigration Guides:\nFrom LangChain - Complete migration guide\nFrom Vercel AI SDK - Next.js focused\n\nDeveloper Experience:\nCookbook - 15 practical recipes\nTroubleshooting Guide - Common issues & solutions","hierarchy":{"lvl0":"Docs","lvl1":"NeuroLink","lvl2":"New in 2026: Enhanced Documentation","lvl3":""}},
|
|
8615
8624
|
{"objectID":"a66e51aab3feeb7357e7656b91e242e80a6d8ec7927328ffd2ad7e258c6b8008","title":"Integrations","url":"/docs/#integrations","content":"LiteLLM 100+ model hub – Unified access to third-party models via LiteLLM routing. → docs/litellm-integration.md\nAmazon SageMaker – Deploy and call custom endpoints directly from NeuroLink CLI/SDK. → docs/sagemaker-integration.md\nEnterprise proxy & security – Configure outbound policies and compliance posture. → docs/enterprise-proxy-setup.md\nConfiguration automation – Manage environments, regions, and credentials safely. → docs/configuration-management.md\nMCP tool ecosystem – Auto-discover Model Context Protocol tools and extend workflows. → docs/advanced/mcp-integration.md\nRemote MCP via HTTP – Connect to HTTP-based MCP servers with authentication, retries, and rate limiting. → docs/mcp-http-transport.md","hierarchy":{"lvl0":"Docs","lvl1":"NeuroLink","lvl2":"Integrations","lvl3":""}},
|
|
8616
8625
|
{"objectID":"5183e8370f9623985379eb01f660a3fbcdb5e5f0929ff36987fbb1f328151ad0","title":"Contributing & Support","url":"/docs/#contributing-support","content":"Bug reports and feature requests → GitHub Issues\nDevelopment workflow, testing, and pull request guidelines → docs/development/contributing.md\nDocumentation improvements → open a PR referencing the documentation matrix.\n\nNeuroLink is built with ❤️ by Juspay. Contributions, questions, and production feedback are always welcome.","hierarchy":{"lvl0":"Docs","lvl1":"NeuroLink","lvl2":"Contributing & Support","lvl3":""}},
|
|
8617
8626
|
{"objectID":"b454ad1a51b7a33efef2bb3dcb0b1a1e48e0f5a4ee348c4bdb15dec7184ce419","title":"🚀 Lighthouse Unified Integration Guide","url":"/docs/lighthouse-unified-integration","content":"🚀 Lighthouse Unified Integration Guide\n\n✅ FINAL IMPLEMENTATION: Unified registerTools() API\n\nThis document outlines the final implementation of Lighthouse integration through a unified registerTools() method that accepts both object and array formats.\n\n🎯 Overview\n\nProblem Solved: Seamless integration of Lighthouse tools without migration or special methods.\n\nSolution: Enhanced registerTools() method that automatically detects and handles both:\nObject format: Record<string, SimpleTool> (existing compatibility)\nArray format: Array<{ name: string; tool: SimpleTool }> (Lighthouse compatibility)\n\n🔧 Core Implementation\n\nMethod Signature\n\nAutomatic Format Detection\n\n🌟 Lighthouse Compatibility\n\nZod Schema Support\n\nNeuroLink already supports Zod schemas in the SimpleTool interface:\n\nExample: Lighthouse Tool Integration\n\n📊 Compatibility Matrix\n\n| Format | Type | Lighthouse Compatible | Backward Compatible | Status |\n| ------ | ------------------------------------------- | ----------------------- | ------------------- | -------- |\n| Object | Record<string, SimpleTool> | ⚠️ Requires conversion | ✅ Yes | Existing |\n| Array | Array<{ name: string; tool: SimpleTool }> | ✅ Direct compatibility | ✅ Yes | New |\n\n🔄 Migration Path\n\nExisting Code\n\nNo changes required - object format continues to work:\n\nNew Lighthouse Integration\n\nDirect import using array format:\n\n🚀 Benefits\nUnified API: Single method for all tool registration needs\nZero Migration: Lighthouse tools work without conversion\nBackward Compatibility: Existing code unchanged\nType Safety: Full TypeScript support for both formats\nZod Integration: Native support for Zod parameter validation\nAPI Simplification: Removes need for separate methods\n\n🧪 Testing Strategy\n\nFormat Detection Tests\n\nLighthouse Integration Tests\n\n📚 Implementation Checklist\n[x] Design: Unified method signature with union types\n[x] Detection: Automatic format detection using Array.isArray()\n[x] Compatibility: Zod schema support verification\n[x] Documentation: Updated README and guides\n[x] Implementation: Modify registerTools() method in NeuroLink class\n[x] Cleanup: Remove redundant registerToolsFromArray() method (never existed)\n[x] Testing: Update tests for unified method\n[x] Validation: End-to-end integration testing\n\n🔮 Future Extensibility\n\nThe unified approach supports future extensions:\n\nThis architecture ensures the API can grow with new tool formats while maintaining compatibility.","hierarchy":{"lvl0":"Lighthouse Unified Integration","lvl1":"🚀 Lighthouse Unified Integration Guide","lvl2":"","lvl3":""}},
|
|
@@ -9147,7 +9156,7 @@
|
|
|
9147
9156
|
{"objectID":"2ffdb223dac8263f80806fa56949891f5b7009470175bbf85e48e879ec43740f","title":"Why it was left","url":"/docs/plans/2026-09-07-middleware-on-native-providers#why-it-was-left","content":"Acknowledged twice and deliberately: docs/plans/2026-09-03-remove-remaining-ai-sdk-plan.md\nrecords that these three \"already bypass it for exactly this reason, so stage 3\nextends an existing gap rather than inventing one\", and PR #1636 scoped itself\nto the OpenAI-compatible family and said so under \"Not in this PR\".\n\nSo this is a pre-existing gap widened by the native migration, not a\nregression it introduced. Wording in any PR should say that.","hierarchy":{"lvl0":"Plans","lvl1":"Model middleware on Vertex, AI Studio and Bedrock","lvl2":"Why it was left","lvl3":""}},
|
|
9148
9157
|
{"objectID":"65376f7d1279f4258909a230331317c89cb720126c497682f23c502c9a8181c0","title":"The pattern to copy","url":"/docs/plans/2026-09-07-middleware-on-native-providers#the-pattern-to-copy","content":"PR #1636 solved the same problem for the OpenAI-compatible stream path. Its shape\nis the template, and its four hard-won corrections are the specification for\nwhat \"done\" means here:\nBuild a V3 base model whose doStream starts the real native loop,\n wrap it with the middleware chain, then drive the wrapped model. Convert\n the prompt to the wire format after transformParams, or a rewrite\n never reaches the wire.\nEmit a terminal finish part carrying usage and finish reason, from\n the loop's deferred promises. Without it a middleware observing the stream\n sees neither.\nTolerate a middleware that never calls doStream. Guardrails' precall\n path returns its own stream; the loop never starts, so every reader of the\n loop promise must survive its absence or analytics hang forever.\nForward cancellation. Breaking out of a wrapped stream must abort the\n upstream request, or the HTTP connection leaks.\n\nHonour on the way back in: prompt, maxOutputTokens, temperature, topP.\ntools is read-only — a rewrite gets a WARN, never a silent drop.","hierarchy":{"lvl0":"Plans","lvl1":"Model middleware on Vertex, AI Studio and Bedrock","lvl2":"The pattern to copy","lvl3":""}},
|
|
9149
9158
|
{"objectID":"bdcac9ef00752255414e8ea68d4b329fd13d28d504d0ac52e5309738112e4722","title":"Order","url":"/docs/plans/2026-09-07-middleware-on-native-providers#order","content":"Count the native loops before choosing, because two of these providers branch\ninside their entry points:\n\n| provider | native loops behind generate + stream |\n| --------- | -------------------------------------------------------------------------------------------------------------------------------------------------- |\n| AI Studio | executeNativeGemini3Stream, plus executeAudioStreamViaGeminiLive when options.input?.audio (executeStream:780) — not a single SSE loop |\n| Vertex | four — executeNativeGemini3Stream / executeNativeAnthropicStream (executeStream:1254 / :1244), and the matching pair on generate:6635 |\n| Bedrock | one generate and one executeStream, over the AWS SDK rather than fetch |\n\nStill AI Studio first — two loops against Vertex's four — but not for the\nreason an earlier draft gave. Its audio branch is a decision, not a detail:\nGemini Live is not SSE, so either middleware applies there too, and\ntransformParams has to mean something for an audio turn, or the branch is\nexplicitly excluded and says so in code. Settle that before writing it.\n\nThen Vertex, where the Anthropic-on-Vertex loops are the larger half of the\nfile and need covering alongside the Gemini-3 ones. Then Bedrock, whose\nAWS-SDK transport means cancellation (point 4) needs its own answer.\n\nOne PR per provider. They are independent, and a single PR touching all three\ncannot be reviewed against a live matrix cell by cell.","hierarchy":{"lvl0":"Plans","lvl1":"Model middleware on Vertex, AI Studio and Bedrock","lvl2":"Order","lvl3":""}},
|
|
9150
|
-
{"objectID":"89309acd56ad0014b1dfb27e71cfcfb1b2eee11c61b4e8fe5cb883663bc23346","title":"Proving it — red first","url":"/docs/plans/2026-09-07-middleware-on-native-providers#proving-it-red-first","content":"The existing test/continuous-test-suite-stream-middleware.ts is the right\nhome; it already drives the shipped dist against local HTTP stand-ins on\nboth modes. Add, per provider, and watch each fail before implementing:\ntransformParams rewrites the prompt → assert the rewritten text on the\n wire, read from the stand-in's recorded request body. Not the reply.\nwrapGenerate / wrapStream observed → assert the hook ran and that a\n V3 finish part carried usage.\nguardrails precall blocking → assert the stand-in received zero\n requests and the caller still got a settled result. This is the case that\n fails loudest today.\ncancellation → break out mid-stream, assert the stand-in saw the request\n closed.\n\nA precondition assertion comes before each claim, per the repo's rule: prove\nthe stand-in was actually exercised before asserting on what it saw.\n\nAnswer the transport question first — the existing cases do not. Today's\nstand-ins work because the OpenAI-compatible family takes a caller-supplied\nbaseURL, so an http.createServer is trivial to aim it at. These three do\nnot: AI Studio and Vertex resolve a client from Google credentials or ADC, and\nBedrock goes through the AWS SDK. Each PR has to say how its provider is\npointed at a local server — an env base-URL override, Vertex's Express/API-key\nroute, an injected fetch, or the SDK's own endpoint option — and where no such\nseam exists, adding one is part of the work, not a footnote.\n\nStart from the precedent already in the repo rather than inventing one: the\nper-provider characterization suites (test:vertex-loop-characterization,\ntest:aistudio-loop-characterization, test:bedrock-loop-characterization)\nalready drive these three deterministically,
|
|
9159
|
+
{"objectID":"89309acd56ad0014b1dfb27e71cfcfb1b2eee11c61b4e8fe5cb883663bc23346","title":"Proving it — red first","url":"/docs/plans/2026-09-07-middleware-on-native-providers#proving-it-red-first","content":"The existing test/continuous-test-suite-stream-middleware.ts is the right\nhome; it already drives the shipped dist against local HTTP stand-ins on\nboth modes. Add, per provider, and watch each fail before implementing:\ntransformParams rewrites the prompt → assert the rewritten text on the\n wire, read from the stand-in's recorded request body. Not the reply.\nwrapGenerate / wrapStream observed → assert the hook ran and that a\n V3 finish part carried usage.\nguardrails precall blocking → assert the stand-in received zero\n requests and the caller still got a settled result. This is the case that\n fails loudest today.\ncancellation → break out mid-stream, assert the stand-in saw the request\n closed.\n\nA precondition assertion comes before each claim, per the repo's rule: prove\nthe stand-in was actually exercised before asserting on what it saw.\n\nAnswer the transport question first — the existing cases do not. Today's\nstand-ins work because the OpenAI-compatible family takes a caller-supplied\nbaseURL, so an http.createServer is trivial to aim it at. These three do\nnot: AI Studio and Vertex resolve a client from Google credentials or ADC, and\nBedrock goes through the AWS SDK. Each PR has to say how its provider is\npointed at a local server — an env base-URL override, Vertex's Express/API-key\nroute, an injected fetch, or the SDK's own endpoint option — and where no such\nseam exists, adding one is part of the work, not a footnote.\n\nStart from the precedent already in the repo rather than inventing one: the\nper-provider characterization suites (test:vertex-loop-characterization,\ntest:aistudio-loop-characterization, test:bedrock-loop-characterization)\nalready drive these three deterministically, each through its own seam.\nproviders-mocked is not that precedent: it has no AI Studio section, and\nits Vertex and Bedrock sections are construction-only because their SDKs\nbypass globalThis.fetch, so installMockFetch cannot reach them. The seams\nthe characterization suites use are:\n","hierarchy":{"lvl0":"Plans","lvl1":"Model middleware on Vertex, AI Studio and Bedrock","lvl2":"Proving it — red first","lvl3":""}},
|
|
9151
9160
|
{"objectID":"6996999965775be0333b436cff87d96435bb3319904213bb947775fddcb6e8c4","title":"Two traps this repo has already paid for","url":"/docs/plans/2026-09-07-middleware-on-native-providers#two-traps-this-repo-has-already-paid-for","content":"Keep payloads out of assertion messages. defineSuite's test()\n downgrades a thrown error to SKIP when the message matches\n isExpectedProviderError(). An assertion that quotes a provider-ish payload\n turns a real failure into ⊘ and CI stays green. Describe the discrepancy,\n never quote the value.\nOne module graph per suite. Take NeuroLink and everything else from\n dist/. Mixing src/ and dist/ breaks stubs, spies and instanceof\n silently, with a clean typecheck.\n\nSanity-check each new case by breaking one assertion on purpose and confirming\nit reports ✗ and exits non-zero rather than ⊘.","hierarchy":{"lvl0":"Plans","lvl1":"Model middleware on Vertex, AI Studio and Bedrock","lvl2":"Two traps this repo has already paid for","lvl3":""}},
|
|
9152
9161
|
{"objectID":"e83e0da96e30cdfd34acbbaf7f0e1f6331888a7a668997902d7a61f3195c30c1","title":"Gates","url":"/docs/plans/2026-09-07-middleware-on-native-providers#gates","content":"Per PR: pnpm run check, pnpm run lint, pnpm run build,\npnpm run test:stream-middleware, pnpm run test:providers-mocked (95/95 —\nthis is the gate that catches a changed wire), plus that provider's\ncharacterization suite (test:vertex-loop-characterization,\ntest:aistudio-loop-characterization, test:bedrock-loop-characterization)\nand a live test:matrix --provider=<name>.\n\ntest:providers-mocked is not optional. The live matrix passed a change that\nbroke ten of its cells once, because every provider reachable from a dev\nmachine supports streaming and only the mocked gate serves a non-streaming\nbody.","hierarchy":{"lvl0":"Plans","lvl1":"Model middleware on Vertex, AI Studio and Bedrock","lvl2":"Gates","lvl3":""}},
|
|
9153
9162
|
{"objectID":"181e324d6ebaeab8c3e10056b405efd356e08bda2f76af9fc56f0b931f3338bf","title":"Out of scope","url":"/docs/plans/2026-09-07-middleware-on-native-providers#out-of-scope","content":"A mutable tools in transformParams.\nThe other native providers' generate paths, which already wrap correctly.\nAI Studio's Gemini Live audio branch (executeAudioStreamViaGeminiLive,\n reached from executeStream:780 when options.input?.audio is set). The\n loop-count comparison above is between the text SSE branches only. Audio\n is excluded from the first PR deliberately — it is not an SSE transport, so\n transformParams and cancellation would both need their own meaning there —\n and excluding it must be explicit in code, not implied by the tests never\n sending audio.","hierarchy":{"lvl0":"Plans","lvl1":"Model middleware on Vertex, AI Studio and Bedrock","lvl2":"Out of scope","lvl3":""}},
|
|
@@ -9604,7 +9613,7 @@
|
|
|
9604
9613
|
{"objectID":"a193c0d33fafeb979282acd2e8a90efca0d80f0576a1d2019d757f89ece4157a","title":"5. Image-gen routing — isImageGenerationModel","url":"/docs/provider-integration/SAFETY-PRIMITIVES#5-image-gen-routing-isimagegenerationmodel","content":"Use for: detecting whether a model name should dispatch to\nexecuteImageGeneration() instead of the chat path.\n\nBoundary-aware match: the model name must equal a known image-model\nentry OR contain it as a prefix bordered by -, _, :, /, .,\nor end-of-string. Prevents accidental matches like a fine-tune named\ngpt-image-1-finetune-2025-q1 triggering image-gen routing for what's\nactually a chat model.\n\nSource list: IMAGE_GENERATION_MODELS in src/lib/core/constants.ts.","hierarchy":{"lvl0":"Provider Integration","lvl1":"Safety Primitives Reference","lvl2":"5. Image-gen routing — isImageGenerationModel","lvl3":""}},
|
|
9605
9614
|
{"objectID":"7c8a7c3c382f34f33b6d45d7e383025a81f662dd9d1173b17c7d6357654c5a0e","title":"6. Provider error convention — typed errors only","url":"/docs/provider-integration/SAFETY-PRIMITIVES#6-provider-error-convention-typed-errors-only","content":"Use for: every formatProviderError implementation in any chat /\nimage / embedding provider.\n\nWhy typed: baseProvider.handleProviderError classifies errors via\ninstanceof against the typed hierarchy and sets error.type on the\nOTel span (\"auth_failure\", \"rate_limit\", \"network\",\n\"invalid_model\", \"timeout\", or \"provider_error\"). Plain\nnew Error() always falls through to the default tag, erasing\nfidelity from observability dashboards and breaking alerts that\nfilter by error.type.\n\nESLint enforcement: neurolink/provider-typed-errors blocks\nreturn new Error(...) from any formatProviderError method body\ninside src/lib/providers/*.ts.","hierarchy":{"lvl0":"Provider Integration","lvl1":"Safety Primitives Reference","lvl2":"6. Provider error convention — typed errors only","lvl3":""}},
|
|
9606
9615
|
{"objectID":"0060ac273f386c349e42799641f9fc2ac514f569b1870b20a2cc8097d482bf2d","title":"7. Shared logging fetch — createLoggingFetch","url":"/docs/provider-integration/SAFETY-PRIMITIVES#7-shared-logging-fetch-createloggingfetch","content":"Use for: the fetch option on createOpenAI({...}) / similar SDK\nclient constructors when you want non-2xx upstream responses logged\nwith sanitized output.\n\nBody opt-in: response bodies are NOT logged by default. Set\nNEUROLINK_DEBUG_HTTP=1 to enable body logging — bodies are run\nthrough sanitizeForLog to redact tokens.\n\nPreviously duplicated in: cohere, xai, groq, togetherAi, fireworks,\nperplexity, cloudflare, llamaCpp, lmStudio, nvidiaNim, deepseek (11\nnear-identical copies with subtle differences). Now centralised.","hierarchy":{"lvl0":"Provider Integration","lvl1":"Safety Primitives Reference","lvl2":"7. Shared logging fetch — createLoggingFetch","lvl3":""}},
|
|
9607
|
-
{"objectID":"1ba0f0ac7f804aa5d9cabe5106734436439a83dc273dcf5e05984d218fae5b1f","title":"8. Test scripts","url":"/docs/provider-integration/SAFETY-PRIMITIVES#8-test-scripts","content":"⚠️ These three suites no longer exist. ssrf, log-sanitize and\nstream-span each imported the primitive out of src/lib/ and asserted on\nit directly, so they were removed when the suites became end-to-end only\n(CLAUDE.md rule 15).\n\n| Removed suite | Covered |\n| -------------------------------------------- | ------------------------------------------------------------------------------------------------------- |\n| test/continuous-test-suite-ssrf.ts | H01 + H06 bypass categories, handler-coverage audit |\n| test/continuous-test-suite-log-sanitize.ts | H03 + H04 token formats, record/header sanitization, H04 regression grep |\n| test/continuous-test-suite-stream-span.ts | H07 span lifetime + error path + recordException ordering, M08 typed-error sweep, M09 brand check sweep |\n\nNothing has replaced them. The primitives themselves are unchanged and
|
|
9616
|
+
{"objectID":"1ba0f0ac7f804aa5d9cabe5106734436439a83dc273dcf5e05984d218fae5b1f","title":"8. Test scripts","url":"/docs/provider-integration/SAFETY-PRIMITIVES#8-test-scripts","content":"⚠️ These three suites no longer exist. ssrf, log-sanitize and\nstream-span each imported the primitive out of src/lib/ and asserted on\nit directly, so they were removed when the suites became end-to-end only\n(CLAUDE.md rule 15).\n\n| Removed suite | Covered |\n| -------------------------------------------- | ------------------------------------------------------------------------------------------------------- |\n| test/continuous-test-suite-ssrf.ts | H01 + H06 bypass categories, handler-coverage audit |\n| test/continuous-test-suite-log-sanitize.ts | H03 + H04 token formats, record/header sanitization, H04 regression grep |\n| test/continuous-test-suite-stream-span.ts | H07 span lifetime + error path + recordException ordering, M08 typed-error sweep, M09 brand check sweep |\n\nNothing has replaced them. The primitives themselves are unchanged, and only\ntwo eslint rules still apply (no-inline-secret-regex for log redaction,\nprovider-typed-errors for typed provider errors). The SSRF/safeDownload,\nstream-span and isNeuroLink brand-check bypasses have no rule and are caught\nonly by review. Treat the checklist below as the live control.","hierarchy":{"lvl0":"Provider Integration","lvl1":"Safety Primitives Reference","lvl2":"8. Test scripts","lvl3":""}},
|
|
9608
9617
|
{"objectID":"2c421be98a40dada99b032fd6dab31bc387486db4c7060e3c4fd720b1135742d","title":"9. Universal safety checklist (paste into PR description)","url":"/docs/provider-integration/SAFETY-PRIMITIVES#9-universal-safety-checklist-paste-into-pr-description","content":"When adding any new provider / modality / handler, tick:\n[ ] All caller-influenced URL downloads go through safeDownload (or predictionLifecycle.downloadPredictionOutput for Replicate-based handlers)\n[ ] All HTTP response bodies sanitized via sanitizeForLog / sanitizeRecord / sanitizeHeaders (NO inline regex)\n[ ] Streaming spans wrapped in withClientStreamSpan (NOT withClientSpan)\n[ ] Provider SDK reference validated via isNeuroLink(sdk) (NOT duck-typing)\n[ ] formatProviderError returns typed errors (AuthenticationError / RateLimitError / InvalidModelError / NetworkError / ProviderError / NeuroLinkError) — never plain Error\n[ ] Reviewed by hand against §8 — the ssrf / log-sanitize / stream-span suites that used to gate this were removed with the unit suites\n\nIf a custom redaction or fetch pattern is genuinely required, add an\neslint-disable-next-line with a one-line justification rather than\nsilently bypassing the centralized helper.","hierarchy":{"lvl0":"Provider Integration","lvl1":"Safety Primitives Reference","lvl2":"9. Universal safety checklist (paste into PR description)","lvl3":""}},
|
|
9609
9618
|
{"objectID":"a38fecff2a45c5d93cfd8f93417b053e1d9b60919a6802b88a0876d3729d2c0d","title":"Credential-free provider acceptance gate","url":"/docs/provider-integration/acceptance-gate","content":"Credential-free provider acceptance gate\n\nSuite: test/continuous-test-suite-acceptance-gate.ts\nRun: pnpm run test:acceptance-gate\nScript: test:acceptance-gate in package.json\nMock server: test/helpers/acceptanceGateServer.ts\n\nWhy this exists\n\nThe prior full provider capability matrix (test/continuous-test-suite-provider-matrix.ts,\n1,037 cells) was audited and found to be able to report green without proving\nanything, in at least 10 ways: tool cells that passed with zero tool calls\nmade, no disableInternalFallback and no provider/model identity check on\nany cell, structured-output cells that asserted a value's type rather than\nits contents, and a harness that could exit 0 on zero coverage.\n\nThis gate replaces that surface area with a small, falsifiable one: at most\n9 cells per (provider, pinned model), fail-fast, cheapest first, run\nentirely against a local mock vendor HTTP server — no real vendor calls, no\nreal API keys, ever. Every provider is pointed at the mock through its own\ndocumented base-URL environment override, with a fake key, so the SDK and\nthe CLI both round-trip through the exact same server (that's what makes\ncell 9, CLI parity, meaningful instead of a re-derivation).\n\nThe 9 cells\n\nEach cell asserts an exact value the mock server returns, never a shape\nor a \"non-empty\" check. A row stops (remaining cells report SKIP, not a\nsecond FAIL) the first time a cell genuinely fails — this is the\n\"fail-fast\" contract; a capability-gated skip (e.g. a provider that doesn't\ndeclare tools) never counts as a failure and never poisons the rest of the\nrow.\nIdentity pin — every call carries\n { provider, model, disableInternalFallback: true }; the result's\n provider and model fields are asserted against what was requested.\nExact-output generate — generate()'s content is asserted equal to\n a specific constant (GATE_EXACT_VALUE), not merely non-empty.\nDrained stream, identity asserted — the stream is fully drained and\n the accumulated content is asserted equal to a constant. The\n StreamResult's provider/model are then asserted — and for the\n OpenAI-compatible protocol rows, against what the mock server actually\n served (${model}::mock-server-resolved), not what was requested. See\n \"The stream-identity defect\" below — this cell is the reason that defect\n was caught and fixed.\nTool-nonce proof — the test tool's execute() returns a fresh\n randomUUID() nonce that exists nowhere else. The final answer is\n asserted to contain ACCEPTANCE_GATE_TOOL_CONFIRMED:<nonce>, which the\n mock server only emits once it sees that exact nonce echoed back in a\n tool-result message — i.e. the assertion can only pass if a real tool\n call round-tripped through the model.\nStructured-exact — generate({ schema })'s parsed structuredData is\n asserted equal (via JSON.stringify) to an exact object, and\n jsonTruncated is asserted not true — truncation is surfaced, never\n silently swallowed.\nThinking proof — only for providers whose catalog/descriptor declares\n thinking: true (currently anthropic and the deepseek catalog row).\n Drives stream() with an explicit\n thinkingConfig: { enabled: true, budgetTokens: 2048 } (the SDK path has no bare thinkingLevel\n convenience — that folding only exists on the CLI's option parser) and\n asserts the accumulated reasoning deltas and the post-thinking answer\n both equal exact constants.\nEmbeddings proof — only for providers whose row declares\n embeddings: true. Goes through ProviderFactory.createProvider()\n directly (NeuroLink has no embed() method) and asserts the returned\n vector equals an exact constant array.\nBudget ceiling enforced — a dedicated, low-ceiling (1) mock\n server instance proves the ceiling mechanism itself is real: a first call\n succeeds, a second call against the same server must fail, and the\n server's own request counter is asserted to have observed both. This\n runs against its own server, never the shared one every other cell uses,\n so it can't be tripped by unrelated traffic.\nCLI parity — the same identity + exact-output assertions as cells 1-2,\n but driven through the built CLI\n (node dist/cli/index.js generate ... --format json), parsing its JSON\n stdout, against the same mock server.\n Not a separate re-derivation of the assertions — literally the same\n constants.\n\nKnown, documented gap in cell 9\n\nThe CLI's generate/stream commands have no flag that reaches\ndisableInternalFallback — commandFactory.ts's processOptions()\nwhitelist omits it (only the interactive REPL's separate options schema\nsupports it). Cell 9 therefore runs without disableInternalFallback. This\nis an intentional, documented gap, not an oversight: fixing it is a CLI\noption-surface change out of scope for this gate.\n\nWhat keeps the gap harmless is that the suite holds no real credential to\nfall back to. test/helpers/credentialFreeEnv.ts is its first import: it\npoints DOTENV_CONFIG_PATH at /dev/null, so neither the SDK's nor the\nharness's .env load r","hierarchy":{"lvl0":"Provider Integration","lvl1":"Credential-free provider acceptance gate","lvl2":"","lvl3":""}},
|
|
9610
9619
|
{"objectID":"6bfda42431fee55d45b08f169983782641ed449c8f73abe19f2f3c421f8666cb","title":"Credential-free provider acceptance gate","url":"/docs/provider-integration/acceptance-gate#credential-free-provider-acceptance-gate","content":"Suite: test/continuous-test-suite-acceptance-gate.ts\nRun: pnpm run test:acceptance-gate\nScript: test:acceptance-gate in package.json\nMock server: test/helpers/acceptanceGateServer.ts","hierarchy":{"lvl0":"Provider Integration","lvl1":"Credential-free provider acceptance gate","lvl2":"Credential-free provider acceptance gate","lvl3":""}},
|
|
@@ -9635,11 +9644,11 @@
|
|
|
9635
9644
|
{"objectID":"196673cbbaf943651309549db3e4d5d6582f7fa0cf10321e39717198282438d9","title":"Consequences","url":"/docs/provider-integration/adr/0003-mocked-contract-as-merge-gate#consequences","content":"Positive: there is now an automated check — CI, not a human — that\n verifies a newly-registered provider is wired correctly before merge,\n at zero marginal cost per provider.\nPositive: because the gate lives in the provider-safety-net job\n alongside a real provider-structure check (test:provider-structure, registry ↔\n filesystem consistency), a new provider that drifts from the registry\n (missing dynamic import, unresolvable enum value, absent\n PROVIDER_MODULE_TO_ID entry) fails CI rather than merging silently.\n Missing mocked coverage specifically is not caught by either suite\n automatically — see the Decision section above.\nNegative: mocked contract tests only prove wire-shape correctness\n against NeuroLink's assumptions about the vendor's API, not that the\n real vendor endpoint still matches those assumptions today. A live,\n scheduled (not per-PR) suite remains necessary to catch vendor-side\n drift — explicitly out of scope for this plan; see the existing\n test:matrix/test:new-providers scripts.\nNegative: the gate only meaningfully covers the 18 providers with\n existing mocked sections plus any added going forward; it does not\n retroactively audit the 13 of 31 existing providers still missing\n mocked coverage. That backfill is tracked as follow-up work, not\n blocked on this plan.","hierarchy":{"lvl0":"Provider Integration","lvl1":"ADR-0003: Mocked-fetch contract tests are the CI merge gate; live-API suites are not","lvl2":"Consequences","lvl3":""}},
|
|
9636
9645
|
{"objectID":"14cd2d9341f3a0cb55d4fdf5a79ca1507499b3d84cd6021bc7aaa88925717590","title":"Architecture Decision Records — Provider Onboarding Redesign","url":"/docs/provider-integration/adr/README","content":"Architecture Decision Records — Provider Onboarding Redesign\n\nShort, dated records of the load-bearing decisions behind the provider\nonboarding redesign (Plans 04–10, August 2026). Read these before arguing to\nchange the shape of ProviderDescriptor, the catalog, or the CI gate — the\ntradeoffs were already litigated once.\n\n| ADR | Decision | Status |\n| ---- | ------------------------------------------------------------------------------ | -------------------- |\n| 0001 | ProviderDescriptor is the single source of truth for provider identity | Accepted |\n| 0002 | OpenAI-wire-compatible providers default to a data-catalog row, not a subclass | Accepted and shipped |\n| 0003 | Mocked-fetch contract tests are the CI gate; live-API suites are not | Accepted and shipped |","hierarchy":{"lvl0":"Provider Integration","lvl1":"Architecture Decision Records — Provider Onboarding Redesign","lvl2":"","lvl3":""}},
|
|
9637
9646
|
{"objectID":"aaa9ef50d62dd989356ea2bb28e77e07f8bb8cbe1fcff8fb4c84600bee0c8474","title":"Architecture Decision Records — Provider Onboarding Redesign","url":"/docs/provider-integration/adr/README#architecture-decision-records-provider-onboarding-redesign","content":"Short, dated records of the load-bearing decisions behind the provider\nonboarding redesign (Plans 04–10, August 2026). Read these before arguing to\nchange the shape of ProviderDescriptor, the catalog, or the CI gate — the\ntradeoffs were already litigated once.\n\n| ADR | Decision | Status |\n| ---- | ------------------------------------------------------------------------------ | -------------------- |\n| 0001 | ProviderDescriptor is the single source of truth for provider identity | Accepted |\n| 0002 | OpenAI-wire-compatible providers default to a data-catalog row, not a subclass | Accepted and shipped |\n| 0003 | Mocked-fetch contract tests are the CI gate; live-API suites are not | Accepted and shipped |","hierarchy":{"lvl0":"Provider Integration","lvl1":"Architecture Decision Records — Provider Onboarding Redesign","lvl2":"Architecture Decision Records — Provider Onboarding Redesign","lvl3":""}},
|
|
9638
|
-
{"objectID":"91f87bcd98e1883a00b720044811501a2f90818bf3c3eff22c5d71b2a5e7d80b","title":"Provider Manifests","url":"/docs/provider-integration/manifests/README","content":"Provider Manifests\n\nThis convention originally applied to every provider onboarded via Tier 2,\n3, or 4: one JSON file here, named <provider>.json where <provider> is\nthe exact AIProviderName enum value (e.g. cerebras.json for\nAIProviderName.CEREBRAS = \"cerebras\").\n\nTier 2 (JSON catalog) providers no longer use a manifest here\n\nAs of the provider-JSON-catalog refactor, Tier 2 providers are declared\nentirely in src/lib/providers/catalog/<id>.json, validated by the zod\nschema in src/lib/providers/catalog/schema.ts. That file's evidence\nobject — rosterVerified, addedInPR, and optionally authProbe,\nbillingProbe, liveMatrix — carries the same onboarding evidence a\nmanifest used to hold, so a separate manifest file would just duplicate\nit. tools/verify-provider-onboarding.ts reflects this: for any provider\nwith a matching src/lib/providers/catalog/<id>.json file, the gate\nchecks that the JSON file exists, parses via the real zod schema, and\n(via that same successful parse, since both fields are non-optional in\nthe schema) carries evidence.rosterVerified and evidence.addedInPR.\n\ncerebras.json and sambanova.json — the two manifests that used to\nlive in this directory — were removed for this reason: both providers\nare now JSON-catalog entries, and their onboarding evidence lives in\nsrc/lib/providers/catalog/cerebras.json and\nsrc/lib/providers/catalog/sambanova.json respectively.\n\nTier 3/4 (hand-written) providers still use a manifest here\n\nA provider onboarded outside the JSON catalog — a custom adapter (Tier 3)\nor fully custom integration (Tier 4) — has no catalog JSON file, so\ntools/verify-provider-onboarding.ts falls back to its original\nfour-check flow for it, including a manifest at\ndocs/provider-integration/manifests/<name>.json. The shape below still\napplies to those providers.\n\nThe block is annotated JSONC for documentation purposes only — the\n// comments and trailing comma explain each field but are not valid\nJSON. A real <provider>.json manifest file must be strict JSON: no\ncomments, no trailing commas.\n\nHow it's checked\n\npnpm run verify:provider-onboarding (tools/verify-provider-onboarding.ts)\nfails a PR that introduces a new AIProviderName member without matching\nonboarding evidence: a valid catalog JSON entry for Tier 2 providers (see\nabove), or a structurally valid manifest here for Tier 3/4 providers.
|
|
9647
|
+
{"objectID":"91f87bcd98e1883a00b720044811501a2f90818bf3c3eff22c5d71b2a5e7d80b","title":"Provider Manifests","url":"/docs/provider-integration/manifests/README","content":"Provider Manifests\n\nThis convention originally applied to every provider onboarded via Tier 2,\n3, or 4: one JSON file here, named <provider>.json where <provider> is\nthe exact AIProviderName enum value (e.g. cerebras.json for\nAIProviderName.CEREBRAS = \"cerebras\").\n\nTier 2 (JSON catalog) providers no longer use a manifest here\n\nAs of the provider-JSON-catalog refactor, Tier 2 providers are declared\nentirely in src/lib/providers/catalog/<id>.json, validated by the zod\nschema in src/lib/providers/catalog/schema.ts. That file's evidence\nobject — rosterVerified, addedInPR, and optionally authProbe,\nbillingProbe, liveMatrix — carries the same onboarding evidence a\nmanifest used to hold, so a separate manifest file would just duplicate\nit. tools/verify-provider-onboarding.ts reflects this: for any provider\nwith a matching src/lib/providers/catalog/<id>.json file, the gate\nchecks that the JSON file exists, parses via the real zod schema, and\n(via that same successful parse, since both fields are non-optional in\nthe schema) carries evidence.rosterVerified and evidence.addedInPR.\n\ncerebras.json and sambanova.json — the two manifests that used to\nlive in this directory — were removed for this reason: both providers\nare now JSON-catalog entries, and their onboarding evidence lives in\nsrc/lib/providers/catalog/cerebras.json and\nsrc/lib/providers/catalog/sambanova.json respectively.\n\nTier 3/4 (hand-written) providers still use a manifest here\n\nA provider onboarded outside the JSON catalog — a custom adapter (Tier 3)\nor fully custom integration (Tier 4) — has no catalog JSON file, so\ntools/verify-provider-onboarding.ts falls back to its original\nfour-check flow for it, including a manifest at\ndocs/provider-integration/manifests/<name>.json. The shape below still\napplies to those providers.\n\nThe block is annotated JSONC for documentation purposes only — the\n// comments and trailing comma explain each field but are not valid\nJSON. A real <provider>.json manifest file must be strict JSON: no\ncomments, no trailing commas.\n\nHow it's checked\n\npnpm run verify:provider-onboarding (tools/verify-provider-onboarding.ts)\nfails a PR that introduces a new AIProviderName member without matching\nonboarding evidence: a valid catalog JSON entry for Tier 2 providers (see\nabove), or a structurally valid manifest here for Tier 3/4 providers. A\nmanifest is structurally valid when it is a JSON object whose provider\nmatches the file name and which carries provider, tier, addedInPR,\naddedDate, filesTouched (an array of strings), mockedContractSection\nand manualTestStatus, plus tier4Justification when tier is 4. The gate\ndoes not retroactively require either for providers that predate the gate\n— see that tool's LEGACY_PROVIDERS list.","hierarchy":{"lvl0":"Provider Integration","lvl1":"Provider Manifests","lvl2":"","lvl3":""}},
|
|
9639
9648
|
{"objectID":"f50e43e805f49ece132b5ced9027edcbcb232799cd12a67be9b04ccceb764437","title":"Provider Manifests","url":"/docs/provider-integration/manifests/README#provider-manifests","content":"This convention originally applied to every provider onboarded via Tier 2,\n3, or 4: one JSON file here, named <provider>.json where <provider> is\nthe exact AIProviderName enum value (e.g. cerebras.json for\nAIProviderName.CEREBRAS = \"cerebras\").","hierarchy":{"lvl0":"Provider Integration","lvl1":"Provider Manifests","lvl2":"Provider Manifests","lvl3":""}},
|
|
9640
9649
|
{"objectID":"a68c16599df99491c1e91d0857d3b92f4bd78a3caa88b6279381ff1ca665926f","title":"Tier 2 (JSON catalog) providers no longer use a manifest here","url":"/docs/provider-integration/manifests/README#tier-2-json-catalog-providers-no-longer-use-a-manifest-here","content":"As of the provider-JSON-catalog refactor, Tier 2 providers are declared\nentirely in src/lib/providers/catalog/<id>.json, validated by the zod\nschema in src/lib/providers/catalog/schema.ts. That file's evidence\nobject — rosterVerified, addedInPR, and optionally authProbe,\nbillingProbe, liveMatrix — carries the same onboarding evidence a\nmanifest used to hold, so a separate manifest file would just duplicate\nit. tools/verify-provider-onboarding.ts reflects this: for any provider\nwith a matching src/lib/providers/catalog/<id>.json file, the gate\nchecks that the JSON file exists, parses via the real zod schema, and\n(via that same successful parse, since both fields are non-optional in\nthe schema) carries evidence.rosterVerified and evidence.addedInPR.\n\ncerebras.json and sambanova.json — the two manifests that used to\nlive in this directory — were removed for this reason: both providers\nare now JSON-catalog entries, and their onboarding evidence lives in\nsrc/lib/providers/catalog/cerebras.json and\nsrc/lib/providers/catalog/sambanova.json respectively.","hierarchy":{"lvl0":"Provider Integration","lvl1":"Provider Manifests","lvl2":"Tier 2 (JSON catalog) providers no longer use a manifest here","lvl3":""}},
|
|
9641
9650
|
{"objectID":"00fb88ca42034f14d0a87eea1d06b38350fc2cb9b5bed8bb3f544f10b3cd99ab","title":"Tier 3/4 (hand-written) providers still use a manifest here","url":"/docs/provider-integration/manifests/README#tier-34-hand-written-providers-still-use-a-manifest-here","content":"A provider onboarded outside the JSON catalog — a custom adapter (Tier 3)\nor fully custom integration (Tier 4) — has no catalog JSON file, so\ntools/verify-provider-onboarding.ts falls back to its original\nfour-check flow for it, including a manifest at\ndocs/provider-integration/manifests/<name>.json. The shape below still\napplies to those providers.\n\nThe block is annotated JSONC for documentation purposes only — the\n// comments and trailing comma explain each field but are not valid\nJSON. A real <provider>.json manifest file must be strict JSON: no\ncomments, no trailing commas.","hierarchy":{"lvl0":"Provider Integration","lvl1":"Provider Manifests","lvl2":"Tier 3/4 (hand-written) providers still use a manifest here","lvl3":""}},
|
|
9642
|
-
{"objectID":"4384ec258a233739ea35584f79662d5111be0b8defd38f75a6ab8068bf3a7e30","title":"How it's checked","url":"/docs/provider-integration/manifests/README#how-its-checked","content":"pnpm run verify:provider-onboarding (tools/verify-provider-onboarding.ts)\nfails a PR that introduces a new AIProviderName member without matching\nonboarding evidence: a valid catalog JSON entry for Tier 2 providers (see\nabove), or a structurally valid manifest here for Tier 3/4 providers.
|
|
9651
|
+
{"objectID":"4384ec258a233739ea35584f79662d5111be0b8defd38f75a6ab8068bf3a7e30","title":"How it's checked","url":"/docs/provider-integration/manifests/README#how-its-checked","content":"pnpm run verify:provider-onboarding (tools/verify-provider-onboarding.ts)\nfails a PR that introduces a new AIProviderName member without matching\nonboarding evidence: a valid catalog JSON entry for Tier 2 providers (see\nabove), or a structurally valid manifest here for Tier 3/4 providers. A\nmanifest is structurally valid when it is a JSON object whose provider\nmatches the file name and which carries provider, tier, addedInPR,\naddedDate, filesTouched (an array of strings), mockedContractSection\nand manualTestStatus, plus tier4Justification when tier is 4. The gate\ndoes not retroactively require either for providers that predate the gate\n— see that tool's LEGACY_PROVIDERS list.","hierarchy":{"lvl0":"Provider Integration","lvl1":"Provider Manifests","lvl2":"How it's checked","lvl3":""}},
|
|
9643
9652
|
{"objectID":"c533e90a3190ff6ad955d7e0c25b0b6370956144cb2b59f1c07b4ffdb1b1e452","title":"Provider Descriptor Migration Ledger","url":"/docs/provider-integration/migration-ledger","content":"Provider Descriptor Migration Ledger\n\nInventory taken at origin/release @ 2cefa3ae4115f817f75a415b6bc70fc3ecaed2d3. TypeSafe was added afterwards (#1761) and is included below; the 25-entry count matched origin/release @ f536fd091.\n\nmistral, huggingface and deepseek have since migrated to the JSON catalog and been removed from HAND_DESCRIPTORS (#1781) — see Migrated below — and laya, xor and perplexity-decider (decision-only, like TypeSafe) were added as hand descriptors afterwards. Net effect: 25 minus the 3 migrated plus 3 (laya, xor, perplexity-decider) leaves 25 entries currently in HAND_DESCRIPTORS (src/lib/factories/providerDescriptors.ts). The category counts below (Shared adapter needed / Must remain class / Must remain core class) cover exactly those 25; the 3 migrated providers are recorded separately as done and no longer count toward \"what remains.\"\n\nThis ledger records, per provider, why it is (or isn't) a JSON-catalog migration candidate, so \"add a provider\" work doesn't re-litigate the same analysis per PR.\n\nEvery verdict allows one thing regardless of class: the static descriptor metadata (name, aliases, default model, credential env var names, setup URL) can always move into a class-backed JSON record. \"Must remain class\" means the execution — the inference loop (generate/stream/decide, per the provider's inferenceKinds), auth, media pipelines — cannot be reduced to declarative catalog data; it does not mean the provider is exempt from descriptor consolidation.\n\nMigrated (3)\n\nAll three ran the same class-removal path this ledger recommended below: resolve the JSON/descriptor data conflicts, then delete the hand descriptor and hand-written subclass so the provider is fully catalog-derived.\n\n| Provider | Note |\n| ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |\n| mistral | Moved onto catalog/mistral.json. defaultModel now derives from the new optional models.registryDefaultModel field when present (only Mistral sets it), and the setupUrl/key-format/timeout/priority conflicts this ledger flagged were resolved in the JSON rather than carried forward. |\n| huggingface | Moved onto catalog/huggingface.json, which gained wire.apiKeyFallbackEnvVars (HF_TOKEN alongside HUGGINGFACE_API_KEY) and capabilities.tools: \"model-dependent\" — the two schema gaps this ledger flagged below before the extension landed. |\n| deepseek | Moved onto catalog/deepseek.json, using the new quirks.responseFormatDowngrade: \"json-schema-to-json-object\" field (DeepSeek 400s on json_schema) instead of an executable hook — the named-quirk approach this ledger recommended. It also sets quirks.replayReasoningContent: true. |\n\nShared adapter needed (9)\n\nThree adapter families, not nine one-off migrations:\n\nLocal-runtime adapter (ollama, lm-studio, llamacpp) — one OpenAI-compatible local-runtime adapter with optional auth, model discovery/probe, actionable transport errors, timeout policy, optional embeddings. Vendor-specific pull/diagnostic guidance becomes adapter data.\n\nEmbedding-only adapter (voyage, jina, cohere) — one embedding-only provider adapter parameterized by path, request shape, batch size, response-extraction/index policy, unsupported-surface messages. jina extends it with an optional rerank operation profile (don't force reranking into the boolean capability shape). cohere composes this with a generic OpenAI chat adapter (it has both /compatibility/v1 chat and native /v2/embed); preserve its batch limit and body-field quirks in the embedding profile.\n\nImage-generation adapter (stability, ideogram, recraft) — one image-generation adapter family: explicit multipart vs JSON request profile, base64-vs-URL response profile, custom auth-header support, model-path mapping as data. SSRF and bounded-read policy remain shared mandatory behavior, not per-vendor opt-outs.\n\nMust remain class (15)\n\n| Provider | Why |\n| -------------------- | ---------------------------------------------------------------------------------","hierarchy":{"lvl0":"Provider Integration","lvl1":"Provider Descriptor Migration Ledger","lvl2":"","lvl3":""}},
|
|
9644
9653
|
{"objectID":"b5d36740e9c9cb41c6ccb01db0a9fb1f9c0ac8ac59f1084b9a92332dd79c3e4d","title":"Provider Descriptor Migration Ledger","url":"/docs/provider-integration/migration-ledger#provider-descriptor-migration-ledger","content":"Inventory taken at origin/release @ 2cefa3ae4115f817f75a415b6bc70fc3ecaed2d3. TypeSafe was added afterwards (#1761) and is included below; the 25-entry count matched origin/release @ f536fd091.\n\nmistral, huggingface and deepseek have since migrated to the JSON catalog and been removed from HAND_DESCRIPTORS (#1781) — see Migrated below — and laya, xor and perplexity-decider (decision-only, like TypeSafe) were added as hand descriptors afterwards. Net effect: 25 minus the 3 migrated plus 3 (laya, xor, perplexity-decider) leaves 25 entries currently in HAND_DESCRIPTORS (src/lib/factories/providerDescriptors.ts). The category counts below (Shared adapter needed / Must remain class / Must remain core class) cover exactly those 25; the 3 migrated providers are recorded separately as done and no longer count toward \"what remains.\"\n\nThis ledger records, per provider, why it is (or isn't) a JSON-catalog migration candidate, so \"add a provider\" work doesn't re-litigate the same analysis per PR.\n\nEvery verdict allows one thing regardless of class: the static descriptor metadata (name, aliases, default model, credential env var names, setup URL) can always move into a class-backed JSON record. \"Must remain class\" means the execution — the inference loop (generate/stream/decide, per the provider's inferenceKinds), auth, media pipelines — cannot be reduced to declarative catalog data; it does not mean the provider is exempt from descriptor consolidation.","hierarchy":{"lvl0":"Provider Integration","lvl1":"Provider Descriptor Migration Ledger","lvl2":"Provider Descriptor Migration Ledger","lvl3":""}},
|
|
9645
9654
|
{"objectID":"fb3b171594dd4553aaf04fd301572eb1db1e459c15541867bd93a67ece8cfadb","title":"Migrated (3)","url":"/docs/provider-integration/migration-ledger#migrated-3","content":"All three ran the same class-removal path this ledger recommended below: resolve the JSON/descriptor data conflicts, then delete the hand descriptor and hand-written subclass so the provider is fully catalog-derived.\n\n| Provider | Note |\n| ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |\n| mistral | Moved onto catalog/mistral.json. defaultModel now derives from the new optional models.registryDefaultModel field when present (only Mistral sets it), and the setupUrl/key-format/timeout/priority conflicts this ledger flagged were resolved in the JSON rather than carried forward. |\n| huggingface | Moved onto catalog/huggingface.json, which gained wire.apiKeyFallbackEnvVars (HF_TOKEN alongside HUGGINGFACE_API_KEY) and capabilities.tools: \"model-dependent\" — the two schema gaps this ledger flagged below before the extension landed. |\n| deepseek | Moved onto catalog/deepseek.json, using the new quirks.responseFormatDowngrade: \"json-schema-to-json-object\" field (DeepSeek 400s on json_schema) instead of an executable hook — the named-quirk approach this ledger recommended. It also sets quirks.replayReasoningContent: true. |","hierarchy":{"lvl0":"Provider Integration","lvl1":"Provider Descriptor Migration Ledger","lvl2":"Migrated (3)","lvl3":""}},
|
|
@@ -9652,7 +9661,7 @@
|
|
|
9652
9661
|
{"objectID":"16e60ee66171009a6638b5110cc8693f90c1a2cfde796c6932c3512d7f7421fb","title":"The JSON is the source of truth","url":"/docs/provider-integration/openai-compat-catalog#the-json-is-the-source-of-truth","content":"OPENAI_COMPAT_CATALOG still exists and keeps its name and element type,\nbut it is now built by the loader (src/lib/providers/catalog/loader.ts)\nfrom the JSON files rather than hand-written. Two consumers read the JSON:\nCodegen (pnpm run codegen:catalog) writes the compile-time\n artifacts into marked regions — the AIProviderName member, the\n <Name>Models enum, the NeurolinkCredentials key — plus the generated\n index. Pre-commit and CI fail on stale output.\nThe loader builds the runtime entry; the descriptor, config options,\n context windows, pricing, vision map and model-choice tables all derive\n from it, as do the provider test suites' rows and counts.\n\nEach file is validated by a zod schema (src/lib/providers/catalog/schema.ts)\nwith a mirrored provider-catalog.schema.json for editor squiggles.\nProbe evidence (roster/auth/billing dates, live-matrix result, PR URL)\nlives in the file's evidence block — the old\ndocs/provider-integration/manifests/<id>.json files were folded into it.\n\nField-by-field reference and the escape hatches:\ntiers/tier-2-catalog-entry.md. Design rationale and the approved rulings:\ndocs/superpowers/plans/2026-08-28-provider-json-catalog-spec.md.","hierarchy":{"lvl0":"Provider Integration","lvl1":"OpenAI-Compatible Provider Catalog","lvl2":"The JSON is the source of truth","lvl3":""}},
|
|
9653
9662
|
{"objectID":"00a7366eb480e85f5377e0cb8575403e7fd9b33cc028bf95cf0fe48cc94fcea9","title":"When a provider belongs in the catalog","url":"/docs/provider-integration/openai-compat-catalog#when-a-provider-belongs-in-the-catalog","content":"A provider belongs in the JSON catalog if it needs only:\na credential (API key, optionally an extra field like Cloudflare's account id)\na base URL (static default + optional env override, or computed from an\n extra credential field)\na default/fallback model\nerror-message classification (auth / rate-limit / invalid-model / generic)\na named, closed catalog quirk. DeepSeek is the worked example: it 400s on\n json_schema structured-output requests, so deepseek.json sets\n quirks.responseFormatDowngrade: \"json-schema-to-json-object\" and the\n generic ConfiguredOpenAICompatProvider downgrades to json_object before\n sending — no subclass. It also sets quirks.replayReasoningContent: true:\n DeepSeek documents that each assistant turn's reasoning_content must go\n back on later requests once tools are in play, so the shared message\n converter and the streaming tool loop send it — for this quirk only, since\n strict OpenAI-compatible backends reject the unknown field.\na wire-proven capability such as\n capabilities.structuredOutputWithTools. The generic provider suppresses\n response_format when tools are attached by default; an explicit true\n keeps it on the same generate() or stream() request. Set this only after\n a combined tools-plus-schema request returned successfully. Separate tool\n and structured-output probes are not evidence for the combined capability.\n A stale opt-in is still protected by the runtime conflict retry, which drops\n structured output and retries rather than losing the turn.\n\nThe currently opted-in providers are Baseten, DeepSeek, Fireworks AI, GMI\nCloud, Inception Labs, io.net Intelligence, Novita AI, Together AI, Upstage and\nxAI. API Route remains opted out because its evidence verifies the features\nseparately, not together in one request. Mistral remains opted out because its\ncombined probes returned 429 twice, not a successful capability response.","hierarchy":{"lvl0":"Provider Integration","lvl1":"OpenAI-Compatible Provider Catalog","lvl2":"When a provider belongs in the catalog","lvl3":""}},
|
|
9654
9663
|
{"objectID":"c2a9e3425a4cecb520467f900df8b5fa78fc4178514eba6385040bb9506e48ee","title":"When a provider needs a dedicated subclass instead","url":"/docs/provider-integration/openai-compat-catalog#when-a-provider-needs-a-dedicated-subclass-instead","content":"Azure OpenAI is deliberately not in the catalog because it overrides real\nrequest-shaping behavior that no named catalog quirk expresses:\nAzure OpenAI (src/lib/providers/azureOpenai.ts) overrides four hooks:\n getChatCompletionsURL (deployment-name URL routing across two Azure\n endpoint schemes), getAuthHeaders (Azure's api-key header instead of\n Authorization: Bearer), adjustRequestBody (renames max_tokens to\n max_completion_tokens for o-series/gpt-5+ deployments), and\n suppressResponseFormatWithTools (Azure supports both at once).\n\nIf a future provider needs any hook beyond the 3 mandatory ones\n(getProviderName, getDefaultModel, formatProviderError) or the 2\npurely-declarative optional ones (getFallbackModelName,\ngetFallbackModels) and that hook is not already a named catalog quirk, it\nneeds either a new closed quirk (the DeepSeek route) or a dedicated subclass\n(the Azure OpenAI route).","hierarchy":{"lvl0":"Provider Integration","lvl1":"OpenAI-Compatible Provider Catalog","lvl2":"When a provider needs a dedicated subclass instead","lvl3":""}},
|
|
9655
|
-
{"objectID":"a5276d835ceba15da6ec36261ab78001e17f8b78ba9c8cb1c5e1282aa2f377e3","title":"Error-message fidelity","url":"/docs/provider-integration/openai-compat-catalog#error-message-fidelity","content":"Each entry's errorRules is a direct, order-preserving translation of its\noriginal subclass's formatProviderError if/else ladder into rule data\n(status code and/or case-insensitive pattern), classified via\nclassifyProviderError()\n(src/lib/utils/errorClassifier.ts). Every bespoke message string is\npreserved verbatim — including xAI's \"top up your account\" quota URL and\nGroq's decommissioned-vs-not-found distinction — via each rule's own\nmessage field (string | ((ctx) => string)), with model-name\ninterpolation carried through ctx.modelName. There is no message-wording\nregression here. Timeout classification is likewise unchanged:
|
|
9664
|
+
{"objectID":"a5276d835ceba15da6ec36261ab78001e17f8b78ba9c8cb1c5e1282aa2f377e3","title":"Error-message fidelity","url":"/docs/provider-integration/openai-compat-catalog#error-message-fidelity","content":"Each entry's errorRules is a direct, order-preserving translation of its\noriginal subclass's formatProviderError if/else ladder into rule data\n(status code and/or case-insensitive pattern), classified via\nclassifyProviderError()\n(src/lib/utils/errorClassifier.ts). Every bespoke message string is\npreserved verbatim — including xAI's \"top up your account\" quota URL and\nGroq's decommissioned-vs-not-found distinction — via each rule's own\nmessage field (string | ((ctx) => string)), with model-name\ninterpolation carried through ctx.modelName. There is no message-wording\nregression here. Timeout classification is likewise unchanged: every catalog\nprovider except Groq maps TimeoutError to NetworkError (the classifier's\ndefault), and Groq alone maps it to ProviderError. Groq's subclass override is\npreserved verbatim via the JSON's quirks.timeoutErrorClass, so no\nprovider's timeout class changed during migration.","hierarchy":{"lvl0":"Provider Integration","lvl1":"OpenAI-Compatible Provider Catalog","lvl2":"Error-message fidelity","lvl3":""}},
|
|
9656
9665
|
{"objectID":"2a22fddc1a2c383a5e75a53e2d512d764f01ad66ab03bfe6edf12acb5d204814","title":"Known pre-existing quirk this migration preserved (not fixed)","url":"/docs/provider-integration/openai-compat-catalog#known-pre-existing-quirk-this-migration-preserved-not-fixed","content":"Mistral's provider registration passes a defaultModel value to\nProviderFactory.registerProvider() that does not check MISTRAL_MODEL\n(MistralModels.MISTRAL_LARGE_LATEST, a bare literal), while\nConfiguredOpenAICompatProvider.getDefaultModel() for Mistral does\ncheck MISTRAL_MODEL (falling back to MistralModels.MISTRAL_SMALL_2506).\nEvery other catalog provider's registry default and class default agree.\nThis is expressed via the JSON's quirks.registryDefaultIgnoresModelEnvVar\n(true only for Mistral). The JSON migration did reconcile one half of it:\ngetDefaultModel(MISTRAL) now returns the real generation default\n(mistral-small-2506) rather than the registry literal — a disclosed\nbug-fix-grade delta, since the two disagreed before.","hierarchy":{"lvl0":"Provider Integration","lvl1":"OpenAI-Compatible Provider Catalog","lvl2":"Known pre-existing quirk this migration preserved (not fixed)","lvl3":""}},
|
|
9657
9666
|
{"objectID":"1d94ab5116c71ed28e2428889216922df96e1d6d4d5fdc955ee65a4171c483e3","title":"What comes next","url":"/docs/provider-integration/openai-compat-catalog#what-comes-next","content":"The credential-free growth queue in docs/provider-integration/growth-queue.json lists every\nverified candidate vendor by wave (W1 = hosted OpenAI-compatible, the catalog path). Entries\nonboarded from it carry evidence.liveMatrix: null until a live run with a real key.","hierarchy":{"lvl0":"Provider Integration","lvl1":"OpenAI-Compatible Provider Catalog","lvl2":"What comes next","lvl3":""}},
|
|
9658
9667
|
{"objectID":"bf3e1f8f1233a9b3d12aedbdbec4bf8cd196d18bf56b7bb104b34e31e90b61e0","title":"Provider Onboarding Tiers","url":"/docs/provider-integration/tiers/README","content":"Provider Onboarding Tiers\n\nFour tiers, ordered by effort. Always pick the lowest tier that's\nactually true for the provider you're adding — a provider that's\nOpenAI-wire-compatible but gets built as a bespoke Tier 3 subclass \"to be\nsafe\" is exactly the copy-pasted-boilerplate problem this redesign\nexists to eliminate (see ../adr/0002-catalog-over-subclass-default.md).\n\n| Tier | Example | Code required | Time |\n| -------------------------- | ---------------------------------------------------------------------------------- | ----------------------------------------------------------------- | --------------------------------- |\n| 1 — Aggregator passthrough | A new model id on an existing LiteLLM/OpenRouter route | None | Minutes |\n| 2 — Catalog entry | A new zero-quirk OpenAI-compatible vendor (the Groq/xAI/Together shape) | One data row + one mocked-test section | ~1 hour |\n| 3 — Adapter-based native | A vendor with its own SDK/wire format but a normal request/response HTTP lifecycle | One provider class | Days |\n| 4 — Full custom | SageMaker-class: non-HTTP protocol, SDK-signed auth, bespoke lifecycle | Custom executeStream/doGenerate, possibly own CLI subcommands | Days, needs written justification |\n\nTier 1 adds zero provider coverage — it is a usage change against an\nalready-counted aggregator, never reflected in\ndocs/reference/provider-comparison.md or the README's provider count.\n\nEvery tier that adds a new AIProviderName member (Tier 2 and above) ends\nthe same way: a manifest at\ndocs/provider-integration/manifests/<provider>.json\n(see ../manifests/README.md) and a green run\nof pnpm run verify:provider-onboarding (see\n../../../tools/verify-provider-onboarding.ts).\nTier 1 needs no manifest and no gate — see\ntier-1-aggregator-passthrough.md.\n\nUse ../../../tools/scaffold-provider.ts\n(pnpm run scaffold:provider) to generate the starting-point snippets for\nTiers 2–4 instead of copy-pasting from an existing provider by hand. Both\ntools ship in the tree; there is no manual-fallback era anymore — a PR\nthat skips the gate locally just fails it in CI.","hierarchy":{"lvl0":"Provider Integration","lvl1":"Provider Onboarding Tiers","lvl2":"","lvl3":""}},
|
|
@@ -10170,8 +10179,8 @@
|
|
|
10170
10179
|
{"objectID":"89919a058b907858961d8bc0c5f5bdb7b7bf90ce902807b7e60eac8aaf69a9e9","title":"Dynamic Provider Loading","url":"/docs/reference/provider-capabilities-audit#dynamic-provider-loading","content":"Providers are registered via dynamic imports in ProviderRegistry:\nAvoids circular dependencies\nLazy loading for better performance\nClean provider isolation","hierarchy":{"lvl0":"Reference","lvl1":"Provider Capabilities Audit","lvl2":"Dynamic Provider Loading","lvl3":""}},
|
|
10171
10180
|
{"objectID":"7eeabea19fc2d4a88ed1f7e7210455ca022997af57fc310d93009193f69f2a87","title":"Tool Execution Flow","url":"/docs/reference/provider-capabilities-audit#tool-execution-flow","content":"Tools registered with MCPToolRegistry\nProvider calls getAllTools() to get available tools\nAI model receives tool definitions\nModel calls tools during generation\nTool results sent back to model\nProcess repeats until completion","hierarchy":{"lvl0":"Reference","lvl1":"Provider Capabilities Audit","lvl2":"Tool Execution Flow","lvl3":""}},
|
|
10172
10181
|
{"objectID":"912ca4c33c9178b968f8115502950b168b759c64defbab38c6961d04b4c26198","title":"Version History","url":"/docs/reference/provider-capabilities-audit#version-history","content":"v9.62.0 (May 2026) - Multi-provider voice (TTS/STT/realtime); 24 providers\nv9.60.0 (April 2026) - Added DeepSeek, NVIDIA NIM, LM Studio, llama.cpp providers\nv9.59.0 - Typed ModelAccessDeniedError + sdk.checkCredentials()\nv9.58.0 - providerFallback callback + modelChain config\nv9.53.0 - AutoResearch autonomous experiment engine\nv9.52.0 - Per-request and per-instance credentials for all providers\nv8.26.1 (January 2026) - 13 providers (historical)\nv8.26.0 - Added video output types\nv8.25.0 - Gemini 3 support improvements\nv8.24.0 - Enhanced provider capabilities\n\nNext Steps:\nSee Provider Comparison Guide for feature matrix\nSee Provider Selection Wizard for recommendations\nSee API Reference for usage examples","hierarchy":{"lvl0":"Reference","lvl1":"Provider Capabilities Audit","lvl2":"Version History","lvl3":""}},
|
|
10173
|
-
{"objectID":"b5658c7aef6b919577fa54be541443bcc672f58ebb3dcf04193c2e39f490966f","title":"AI Provider Comparison Guide","url":"/docs/reference/provider-comparison","content":"AI Provider Comparison Guide\n\n⚠️ STALE DOCUMENT — This comparison predates the current provider roster, including the JSON-catalog providers, and is due for a fresh pass. Provider rows below may be missing or out of date; see the README for the current provider list.\n\nLast Updated: May 2026\nNeuroLink Version: 9.62.0\n\nComparison of NeuroLink's text and multimodal AI providers, including capabilities, pricing, and use case recommendations. (Note: voice providers — OpenAI TTS, ElevenLabs, Deepgram, Azure Speech, Google TTS/STT, Whisper, OpenAI Realtime, Gemini Live — are documented separately under Voice Providers.)\n\nComplete Overview Matrix\n\n| Provider | Text | Stream | Tools | Vision | PDF | Thinking | Struct Out | Free Tier | Setup Time |\n| ----------------- | ---- | ------ | ----- | ------ | --- | -------- | ---------- | --------- | ---------- |\n| OpenAI | ✓ | ✓ | ✓ | ✓ | ✗ | ✗ | ✓ | ✗ | 2 min |\n| Anthropic ^1^ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ⚠️ | 2 min |\n| Google AI Studio | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ⚠️ | ✓ | 2 min |\n| Google Vertex | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ⚠️ | ✗ | 15 min |\n| Amazon Bedrock | ✓ | ✓ | ✓ | ⚠️ | ✓ | ✗ | ✓ | ✗ | 10 min |\n| Amazon SageMaker | ✓ | ⚠️ | ✓ | ✗ | ✗ | ✗ | ✗ | ✗ | 30 min |\n| Azure OpenAI | ✓ | ✓ | ✓ | ✓ | ✗ | ✗ | ✓ | ✗ | 20 min |\n| Mistral | ✓ | ✓ | ✓ | ⚠️ | ✗ | ✗ | ✓ | ✓ | 2 min |\n| HuggingFace | ✓ | ✓ | ⚠️ | ✗ | ✗ | ✗ | ✗ | ✓ | 2 min |\n| LiteLLM | ✓ | ✓ | ✓ | ⚠️ | ✗ | ✗ | ✓ | ⚠️ | 5 min |\n| Ollama | ✓ | ✓ | ✓ | ⚠️ | ✗ | ✗ | ✗ | ✓ | 5 min |\n| OpenAI Compatible | ✓ | ✓ | ✓ | ⚠️ | ✗ | ✗ | ✓ | ⚠️ | 5 min |\n| OpenRouter | ✓ | ✓ | ⚠️ | ⚠️ | ✗ | ✗ | ✓ | ⚠️ | 2 min |\n| DeepSeek | ✓ | ✓ | ✓ | ✗ | ✗ | ✓ | ✓ | ✗ | 2 min |\n| NVIDIA NIM | ✓ | ✓ | ✓ | ⚠️ | ✗ | ✓ | ✓ | ✗ | 5 min |\n| LM Studio | ✓ | ✓ | ⚠️ | ⚠️ | ✗ | ⚠️ | ⚠️ | ✓ | 5 min |\n| llama.cpp | ✓ | ✓ | ⚠️ | ⚠️ | ✗ | ⚠️ | ⚠️ | ✓ | 10 min |\n\nLegend:\n✓ Full Support\n⚠️ Partial/Model-Dependent\n✗ Not Supported\n\n^1^ Anthropic supports both API Key and OAuth authentication. Free tier access is available via Claude subscription (OAuth). See Anthropic Deep Dive for details.\n\nPricing Comparison\n\nPay-per-Token Providers\n\n| Provider | Input (per 1M tokens) | Output (per 1M tokens) | Vision | Best Value Model |\n| -------------------- | --------------------- | ---------------------- | -------------- | ----------------------------- |\n| OpenAI | $2.50 - $60.00 | $10.00 - $180.00 | $5.00 - $60.00 | GPT-4o-mini: $0.15/$0.60 |\n| Anthropic ^2^ | $3.00 - $15.00 | $15.00 - $75.00 | Same | Claude Haiku: $0.25/$1.25 |\n| Google AI Studio | FREE - $7.00 | FREE - $21.00 | FREE - $7.00 | Gemini 2.5 Flash: FREE |\n| Google Vertex | $0.35 - $35.00 | $1.05 - $105.00 | $0.35 - $35.00 | Gemini 2.5 Flash: $0.35/$1.05 |\n| Amazon Bedrock | $3.00 - $15.00 | $15.00 - $75.00 | $3.00 - $15.00 | Claude Haiku: $0.25/$1.25 |\n| Azure OpenAI | $2.50 - $60.00 | $10.00 - $180.00 | $5.00 - $60.00 | GPT-4o-mini: $0.15/$0.60 |\n| Mistral | $0.25 - $8.00 | $0.75 - $24.00 | $0.25 - $8.00 | Mistral Small: $0.20/$0.60 |\n| HuggingFace | FREE - $1.00 | FREE - $1.00 | N/A | Qwen 2.5 72B: FREE |\n| OpenRouter | $0.00 - $60.00 | $0.00 - $180.00 | Varies | Many free models |\n| DeepSeek | $0.14 - $2.19 | $0.28 - $8.75 | N/A | deepseek-chat: $0.14/$0.28 |\n| NVIDIA NIM | Varies by model | Varies by model | Varies | Free credits for new users |\n\n^2^ Anthropic also offers subscription-based pricing as an alternative to per-token API pricing: Free tier (limited), Pro ($20/mo), Max ($100+/mo with 5x-20x usage). NeuroLink supports both API key and OAuth (subscription) authentication. See Anthropic Deep Dive.\n\nSelf-Hosted / Custom Pricing\n\n| Provider | Model | Cost Structure | Notes |\n|
|
|
10174
|
-
{"objectID":"041fff84f31b9b7b564f13d270b57f79e0ab4391e66f7d9761eec0e082b80a9f","title":"AI Provider Comparison Guide","url":"/docs/reference/provider-comparison#ai-provider-comparison-guide","content":"⚠️ STALE DOCUMENT — This comparison predates the current provider roster, including the JSON-catalog providers, and is due for a fresh pass. Provider rows below may be missing or out of date; see the README for the current provider list.\n\nLast Updated: May 2026\nNeuroLink Version: 9.62.0\n\nComparison of NeuroLink's text and multimodal AI providers, including capabilities, pricing, and use case recommendations. (Note: voice providers — OpenAI TTS, ElevenLabs, Deepgram, Azure Speech, Google TTS/STT, Whisper, OpenAI Realtime, Gemini Live — are documented separately under Voice Providers.)","hierarchy":{"lvl0":"Reference","lvl1":"AI Provider Comparison Guide","lvl2":"AI Provider Comparison Guide","lvl3":""}},
|
|
10182
|
+
{"objectID":"b5658c7aef6b919577fa54be541443bcc672f58ebb3dcf04193c2e39f490966f","title":"AI Provider Comparison Guide","url":"/docs/reference/provider-comparison","content":"AI Provider Comparison Guide\n\n⚠️ STALE DOCUMENT — This comparison predates the current provider roster, including the JSON-catalog providers, and is due for a fresh pass. Provider rows below may be missing or out of date; see the README for the current provider list.\n\nLast Updated: May 2026\nNeuroLink Version: 9.62.0\n\nComparison of NeuroLink's text and multimodal AI providers, including capabilities, pricing, and use case recommendations. (Note: voice providers — OpenAI TTS, ElevenLabs, Deepgram, Azure Speech, Google TTS/STT, 60db, Whisper, OpenAI Realtime, Gemini Live — are documented separately under Voice Providers.)\n\nComplete Overview Matrix\n\n| Provider | Text | Stream | Tools | Vision | PDF | Thinking | Struct Out | Free Tier | Setup Time |\n| ----------------- | ---- | ------ | ----- | ------ | --- | -------- | ---------- | --------- | ---------- |\n| OpenAI | ✓ | ✓ | ✓ | ✓ | ✗ | ✗ | ✓ | ✗ | 2 min |\n| Anthropic ^1^ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ⚠️ | 2 min |\n| Google AI Studio | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ⚠️ | ✓ | 2 min |\n| Google Vertex | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ⚠️ | ✗ | 15 min |\n| Amazon Bedrock | ✓ | ✓ | ✓ | ⚠️ | ✓ | ✗ | ✓ | ✗ | 10 min |\n| Amazon SageMaker | ✓ | ⚠️ | ✓ | ✗ | ✗ | ✗ | ✗ | ✗ | 30 min |\n| Azure OpenAI | ✓ | ✓ | ✓ | ✓ | ✗ | ✗ | ✓ | ✗ | 20 min |\n| Mistral | ✓ | ✓ | ✓ | ⚠️ | ✗ | ✗ | ✓ | ✓ | 2 min |\n| HuggingFace | ✓ | ✓ | ⚠️ | ✗ | ✗ | ✗ | ✗ | ✓ | 2 min |\n| LiteLLM | ✓ | ✓ | ✓ | ⚠️ | ✗ | ✗ | ✓ | ⚠️ | 5 min |\n| Ollama | ✓ | ✓ | ✓ | ⚠️ | ✗ | ✗ | ✗ | ✓ | 5 min |\n| OpenAI Compatible | ✓ | ✓ | ✓ | ⚠️ | ✗ | ✗ | ✓ | ⚠️ | 5 min |\n| OpenRouter | ✓ | ✓ | ⚠️ | ⚠️ | ✗ | ✗ | ✓ | ⚠️ | 2 min |\n| DeepSeek | ✓ | ✓ | ✓ | ✗ | ✗ | ✓ | ✓ | ✗ | 2 min |\n| NVIDIA NIM | ✓ | ✓ | ✓ | ⚠️ | ✗ | ✓ | ✓ | ✗ | 5 min |\n| LM Studio | ✓ | ✓ | ⚠️ | ⚠️ | ✗ | ⚠️ | ⚠️ | ✓ | 5 min |\n| llama.cpp | ✓ | ✓ | ⚠️ | ⚠️ | ✗ | ⚠️ | ⚠️ | ✓ | 10 min |\n\nLegend:\n✓ Full Support\n⚠️ Partial/Model-Dependent\n✗ Not Supported\n\n^1^ Anthropic supports both API Key and OAuth authentication. Free tier access is available via Claude subscription (OAuth). See Anthropic Deep Dive for details.\n\nPricing Comparison\n\nPay-per-Token Providers\n\n| Provider | Input (per 1M tokens) | Output (per 1M tokens) | Vision | Best Value Model |\n| -------------------- | --------------------- | ---------------------- | -------------- | ----------------------------- |\n| OpenAI | $2.50 - $60.00 | $10.00 - $180.00 | $5.00 - $60.00 | GPT-4o-mini: $0.15/$0.60 |\n| Anthropic ^2^ | $3.00 - $15.00 | $15.00 - $75.00 | Same | Claude Haiku: $0.25/$1.25 |\n| Google AI Studio | FREE - $7.00 | FREE - $21.00 | FREE - $7.00 | Gemini 2.5 Flash: FREE |\n| Google Vertex | $0.35 - $35.00 | $1.05 - $105.00 | $0.35 - $35.00 | Gemini 2.5 Flash: $0.35/$1.05 |\n| Amazon Bedrock | $3.00 - $15.00 | $15.00 - $75.00 | $3.00 - $15.00 | Claude Haiku: $0.25/$1.25 |\n| Azure OpenAI | $2.50 - $60.00 | $10.00 - $180.00 | $5.00 - $60.00 | GPT-4o-mini: $0.15/$0.60 |\n| Mistral | $0.25 - $8.00 | $0.75 - $24.00 | $0.25 - $8.00 | Mistral Small: $0.20/$0.60 |\n| HuggingFace | FREE - $1.00 | FREE - $1.00 | N/A | Qwen 2.5 72B: FREE |\n| OpenRouter | $0.00 - $60.00 | $0.00 - $180.00 | Varies | Many free models |\n| DeepSeek | $0.14 - $2.19 | $0.28 - $8.75 | N/A | deepseek-chat: $0.14/$0.28 |\n| NVIDIA NIM | Varies by model | Varies by model | Varies | Free credits for new users |\n\n^2^ Anthropic also offers subscription-based pricing as an alternative to per-token API pricing: Free tier (limited), Pro ($20/mo), Max ($100+/mo with 5x-20x usage). NeuroLink supports both API key and OAuth (subscription) authentication. See Anthropic Deep Dive.\n\nSelf-Hosted / Custom Pricing\n\n| Provider | Model | Cost Structure | Notes |\n| -------------","hierarchy":{"lvl0":"Reference","lvl1":"AI Provider Comparison Guide","lvl2":"","lvl3":""}},
|
|
10183
|
+
{"objectID":"041fff84f31b9b7b564f13d270b57f79e0ab4391e66f7d9761eec0e082b80a9f","title":"AI Provider Comparison Guide","url":"/docs/reference/provider-comparison#ai-provider-comparison-guide","content":"⚠️ STALE DOCUMENT — This comparison predates the current provider roster, including the JSON-catalog providers, and is due for a fresh pass. Provider rows below may be missing or out of date; see the README for the current provider list.\n\nLast Updated: May 2026\nNeuroLink Version: 9.62.0\n\nComparison of NeuroLink's text and multimodal AI providers, including capabilities, pricing, and use case recommendations. (Note: voice providers — OpenAI TTS, ElevenLabs, Deepgram, Azure Speech, Google TTS/STT, 60db, Whisper, OpenAI Realtime, Gemini Live — are documented separately under Voice Providers.)","hierarchy":{"lvl0":"Reference","lvl1":"AI Provider Comparison Guide","lvl2":"AI Provider Comparison Guide","lvl3":""}},
|
|
10175
10184
|
{"objectID":"f75897796deb7e634daa409ae93f8bb9f6dd7d00a5b75909839fe8dfae59eede","title":"Complete Overview Matrix","url":"/docs/reference/provider-comparison#complete-overview-matrix","content":"| Provider | Text | Stream | Tools | Vision | PDF | Thinking | Struct Out | Free Tier | Setup Time |\n| ----------------- | ---- | ------ | ----- | ------ | --- | -------- | ---------- | --------- | ---------- |\n| OpenAI | ✓ | ✓ | ✓ | ✓ | ✗ | ✗ | ✓ | ✗ | 2 min |\n| Anthropic ^1^ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ⚠️ | 2 min |\n| Google AI Studio | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ⚠️ | ✓ | 2 min |\n| Google Vertex | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ⚠️ | ✗ | 15 min |\n| Amazon Bedrock | ✓ | ✓ | ✓ | ⚠️ | ✓ | ✗ | ✓ | ✗ | 10 min |\n| Amazon SageMaker | ✓ | ⚠️ | ✓ | ✗ | ✗ | ✗ | ✗ | ✗ | 30 min |\n| Azure OpenAI | ✓ | ✓ | ✓ | ✓ | ✗ | ✗ | ✓ | ✗ | 20 min |\n| Mistral | ✓ | ✓ | ✓ | ⚠️ | ✗ | ✗ | ✓ | ✓ | 2 min |\n| HuggingFace | ✓ | ✓ | ⚠️ | ✗ | ✗ | ✗ | ✗ | ✓ | 2 min |\n| LiteLLM | ✓ | ✓ | ✓ | ⚠️ | ✗ | ✗ | ✓ | ⚠️ | 5 min |\n| Ollama | ✓ | ✓ | ✓ | ⚠️ | ✗ | ✗ | ✗ | ✓ | 5 min |\n| OpenAI Compatible | ✓ | ✓ | ✓ | ⚠️ | ✗ | ✗ | ✓ | ⚠️ | 5 min |\n| OpenRouter | ✓ | ✓ | ⚠️ | ⚠️ | ✗ | ✗ | ✓ | ⚠️ | 2 min |\n| DeepSeek | ✓ | ✓ | ✓ | ✗ | ✗ | ✓ | ✓ | ✗ | 2 min |\n| NVIDIA NIM | ✓ | ✓ | ✓ | ⚠️ | ✗ | ✓ | ✓ | ✗ | 5 min |\n| LM Studio | ✓ | ✓ | ⚠️ | ⚠️ | ✗ | ⚠️ | ⚠️ | ✓ | 5 min |\n| llama.cpp ","hierarchy":{"lvl0":"Reference","lvl1":"AI Provider Comparison Guide","lvl2":"Complete Overview Matrix","lvl3":""}},
|
|
10176
10185
|
{"objectID":"9974fc2be3942f172d7a0f4ed23f28266fd280e9add6a4dfb5dbeb3ce61e17bb","title":"Pay-per-Token Providers","url":"/docs/reference/provider-comparison#pay-per-token-providers","content":"| Provider | Input (per 1M tokens) | Output (per 1M tokens) | Vision | Best Value Model |\n| -------------------- | --------------------- | ---------------------- | -------------- | ----------------------------- |\n| OpenAI | $2.50 - $60.00 | $10.00 - $180.00 | $5.00 - $60.00 | GPT-4o-mini: $0.15/$0.60 |\n| Anthropic ^2^ | $3.00 - $15.00 | $15.00 - $75.00 | Same | Claude Haiku: $0.25/$1.25 |\n| Google AI Studio | FREE - $7.00 | FREE - $21.00 | FREE - $7.00 | Gemini 2.5 Flash: FREE |\n| Google Vertex | $0.35 - $35.00 | $1.05 - $105.00 | $0.35 - $35.00 | Gemini 2.5 Flash: $0.35/$1.05 |\n| Amazon Bedrock | $3.00 - $15.00 | $15.00 - $75.00 | $3.00 - $15.00 | Claude Haiku: $0.25/$1.25 |\n| Azure OpenAI | $2.50 - $60.00 | $10.00 - $180.00 | $5.00 - $60.00 | GPT-4o-mini: $0.15/$0.60 |\n| Mistral | $0.25 - $8.00 | $0.75 - $24.00 | $0.25 - $8.00 | Mistral Small: $0.20/$0.60 |\n| HuggingFace | FREE - $1.00 | FREE - $1.00 | N/A | Qwen 2.5 72B: FREE |\n| OpenRouter | $0.00 - $60.00 | $0.00 - $180.00 | Varies | Many free models |\n| DeepSeek | $0.14 - $2.19 | $0.28 - $8.75 | N/A | deepseek-chat: $0.14/$0.28 |\n| NVIDIA NIM | Varies by model | Varies by model | Varies | Free credits for new users |\n\n^2^ Anthropic also offers subscription-based pricing as an alternative to per-token API pricing: Free tier (limited), Pro ($20/mo), Max ($100+/mo with 5x-20x usage). NeuroLink supports both API key and OAuth (subscription) authentication. See Anthropic Deep Dive.","hierarchy":{"lvl0":"Reference","lvl1":"AI Provider Comparison Guide","lvl2":"Pay-per-Token Providers","lvl3":""}},
|
|
10177
10186
|
{"objectID":"eaaf3da103a1b5c86eb52913a92b81ebbd7592ed9a20caac997dd6533bb14df9","title":"Self-Hosted / Custom Pricing","url":"/docs/reference/provider-comparison#self-hosted-custom-pricing","content":"| Provider | Model | Cost Structure | Notes |\n| --------------------- | ------ | ------------------------ | ------------------------------------------------- |\n| Amazon SageMaker | Custom | Instance hours + storage | Varies by instance type (ml.g5.xlarge: ~$1.41/hr) |\n| LiteLLM | Proxy | Backend provider costs | No additional fee, proxy overhead only |\n| Ollama | Local | Hardware costs only | FREE (uses local compute) |\n| OpenAI Compatible | Custom | Backend-dependent | Varies by endpoint provider |\n| LM Studio | Local | Hardware costs only | FREE (uses local compute) |\n| llama.cpp | Local | Hardware costs only | FREE (uses local compute) |","hierarchy":{"lvl0":"Reference","lvl1":"AI Provider Comparison Guide","lvl2":"Self-Hosted / Custom Pricing","lvl3":""}},
|
|
@@ -10267,7 +10276,7 @@
|
|
|
10267
10276
|
{"objectID":"098d221678a87157295b371e3d609ce13446e21727d45349b0f93a99e974b435","title":"1. Quality and Accuracy","url":"/docs/reference/provider-selection#1-quality-and-accuracy","content":"When output quality is paramount, consider these factors:\n\n| Provider | Quality Tier | Best Models | Strengths |\n| ------------------------ | ------------ | ---------------------------- | ----------------------------------------------------- |\n| OpenAI | Tier 1 | GPT-4o, GPT-5, O-series | Industry-leading accuracy, extensive training data |\n| Anthropic | Tier 1 | Claude 4.5 Opus, Sonnet | Superior reasoning, safety-focused, extended thinking |\n| Google | Tier 1-2 | Gemini 3 Pro, Gemini 2.5 Pro | Native multimodal, large context windows |\n| Mistral | Tier 2 | Mistral Large | European-trained, efficient architecture |\n| Meta (via providers) | Tier 2-3 | Llama 3.3 70B | Open-source leader, good general performance |","hierarchy":{"lvl0":"Reference","lvl1":"Provider Selection Guide","lvl2":"1. Quality and Accuracy","lvl3":""}},
|
|
10268
10277
|
{"objectID":"fb7452decbe1811e113701b33adf80eb196823c057368314b642425ab9b84ed3","title":"2. Cost Optimization","url":"/docs/reference/provider-selection#2-cost-optimization","content":"Choose providers based on your budget constraints:\n\n| Budget Level | Recommended Provider | Monthly Cost (1M tokens) | Notes |\n| -------------------- | ------------------------ | ------------------------ | -------------------------------------- |\n| Free | Google AI Studio | $0 | 1M tokens/day free limit |\n| Free | OpenRouter (free models) | $0 | Gemini, Llama, Qwen models |\n| Free | Ollama | $0 | Hardware costs only |\n| Low ($0-50) | Mistral Small | ~$20 | Good quality, European compliance |\n| Medium ($50-200) | GPT-4o-mini | ~$75 | Excellent quality/cost ratio |\n| High ($200+) | Claude 4.5 Sonnet | ~$180 | Premium quality with extended thinking |\n| Enterprise | Azure/Bedrock | Negotiated | Volume discounts, SLA guarantees |","hierarchy":{"lvl0":"Reference","lvl1":"Provider Selection Guide","lvl2":"2. Cost Optimization","lvl3":""}},
|
|
10269
10278
|
{"objectID":"c1fc79f60024d628c9fd9603846eb97e190d2f1b51ec9bea890b17e499f53a68","title":"3. Latency and Performance","url":"/docs/reference/provider-selection#3-latency-and-performance","content":"Time-to-first-token (TTFT) and throughput considerations:\n\n| Provider | Average TTFT | Tokens/sec | Best For |\n| -------------------- | ------------ | ---------- | --------------------------------- |\n| Ollama (Local) | 50-200ms | 30-50 | Local development, lowest latency |\n| Google AI Studio | 300-700ms | 45-65 | Fast cloud inference |\n| OpenAI | 300-800ms | 40-60 | Balanced performance |\n| Anthropic | 400-900ms | 35-55 | Complex reasoning tasks |\n| Azure OpenAI | 350-850ms | 40-60 | Enterprise with SLA |","hierarchy":{"lvl0":"Reference","lvl1":"Provider Selection Guide","lvl2":"3. Latency and Performance","lvl3":""}},
|
|
10270
|
-
{"objectID":"1efa58bcda6a14b07a2cabd56771c201c1c60abdf49aff31b61f3d5f6a63d63e","title":"4. Feature Requirements","url":"/docs/reference/provider-selection#4-feature-requirements","content":"Match provider capabilities to your feature needs:\n\n| Feature | Full Support | Partial Support | No Support |\n| --------------------- | ------------------------------------------------------------ | ------------------------------------------------------ | ----------------------------------------------------------- |\n| Streaming | All except SageMaker
|
|
10279
|
+
{"objectID":"1efa58bcda6a14b07a2cabd56771c201c1c60abdf49aff31b61f3d5f6a63d63e","title":"4. Feature Requirements","url":"/docs/reference/provider-selection#4-feature-requirements","content":"Match provider capabilities to your feature needs:\n\n| Feature | Full Support | Partial Support | No Support |\n| --------------------- | ------------------------------------------------------------ | ------------------------------------------------------ | ----------------------------------------------------------- |\n| Streaming | All text-generation providers except SageMaker | SageMaker | - |\n| Tool Calling | OpenAI, Anthropic, Google, Azure, Bedrock, Mistral, DeepSeek | HuggingFace, Ollama, NIM†, LM Studio†, llama.cpp† | SageMaker |\n| Vision | OpenAI, Anthropic, Google, Azure | Mistral, Ollama, LiteLLM, NIM†, LM Studio†, llama.cpp† | HuggingFace, SageMaker, DeepSeek |\n| PDF Native | Anthropic, Google AI Studio, Vertex | Bedrock (Claude) | OpenAI, Azure, Mistral, DeepSeek, NIM, LM Studio, llama.cpp |\n| Extended Thinking | Anthropic, Google (Gemini 2.5+), DeepSeek (R1), NVIDIA NIM‡ | LM Studio†, llama.cpp† | Others |\n| Structured Output | OpenAI, Anthropic, Azure, Mistral, DeepSeek | Google\\*, NIM†, LM Studio†, llama.cpp† | HuggingFace, Ollama |\n| Local Execution | Ollama, LM Studio, llama.cpp | - | All cloud providers |\n| Zero API Cost | Ollama, LM Studio, llama.cpp | - ","hierarchy":{"lvl0":"Reference","lvl1":"Provider Selection Guide","lvl2":"4. Feature Requirements","lvl3":""}},
|
|
10271
10280
|
{"objectID":"fdabbd2dfcab20be5dc428797866185229cb755a64abed488f863d401a0d2dee","title":"5. Compliance and Security","url":"/docs/reference/provider-selection#5-compliance-and-security","content":"Choose based on regulatory and security requirements:\n\n| Requirement | Best Providers | Configuration Notes |\n| ---------------------- | ----------------------------- | ------------------------------------------ |\n| GDPR | Mistral, Ollama | European data centers, no US data transfer |\n| HIPAA | Azure OpenAI, Bedrock, Vertex | Requires BAA agreement |\n| SOC 2 | All major cloud providers | Available on enterprise tiers |\n| Data Privacy | Ollama, Self-hosted | Zero data transmission |\n| Air-gapped | Ollama, SageMaker | On-premise deployment |\n| Financial Services | Azure OpenAI, Bedrock | Enterprise compliance packages |","hierarchy":{"lvl0":"Reference","lvl1":"Provider Selection Guide","lvl2":"5. Compliance and Security","lvl3":""}},
|
|
10272
10281
|
{"objectID":"f7522ef43ce2cbd68588101a79eea303cc8adf49e9428a7844ba1b34a78b04b5","title":"Startup / MVP Development","url":"/docs/reference/provider-selection#startup-mvp-development","content":"Recommended Stack:\n\nCost Projection:\nDevelopment: $0/month (Google AI Studio free tier)\nProduction (10K users): ~$50-150/month (GPT-4o-mini)","hierarchy":{"lvl0":"Reference","lvl1":"Provider Selection Guide","lvl2":"Startup / MVP Development","lvl3":""}},
|
|
10273
10282
|
{"objectID":"adefcedd575b72009c4bc0f61997c4250040929f014824c6c6cdbbe7fa0ef1e6","title":"Enterprise Production","url":"/docs/reference/provider-selection#enterprise-production","content":"Recommended Stack:\n\nEnterprise Requirements Checklist:\n[x] SLA guarantees (99.9%+)\n[x] HIPAA/SOC2 compliance\n[x] Multi-region deployment\n[x] Provider failover strategy\n[x] Cost monitoring and alerts","hierarchy":{"lvl0":"Reference","lvl1":"Provider Selection Guide","lvl2":"Enterprise Production","lvl3":""}},
|
|
@@ -11168,7 +11177,7 @@
|
|
|
11168
11177
|
{"objectID":"4589ca04c60f98e113dd88a78b93066c160296544175440cb313f20df1759b1e","title":"Task 9: Stale-comment truth fixes","url":"/docs/superpowers/plans/2026-08-15-03-dead-code-purge#task-9-stale-comment-truth-fixes","content":"Files:\nEdit: src/lib/core/modules/structuredOutputPolicy.ts (line 47 area — corrected path; not src/lib/policies/)\nEdit: src/lib/core/modules/GenerationHandler.ts (lines 364-366 area)\nEdit: CLAUDE.md (lines 162, 266, 272)\nEdit: src/lib/providers/perplexity.ts (line 34)\n\nInterfaces: None — comment/doc-only changes, zero runtime behavior change.\n[ ] Verify all four stale claims against the actual implementations.\n\n \n\n Expected:\nstructuredOutputPolicy.ts:46-48 currently reads (in part) \"...handling (it runs on the third-party @ai-sdk/amazon-bedrock model) and still falls back to text-mode coercion.\" — false. Bedrock's real implementation imports directly from @aws-sdk/client-bedrock-runtime (amazonBedrock/client.ts:10,16,2461) and dynamically from @aws-sdk/client-bedrock (amazonBedrock/utils.ts:2,4); @ai-sdk/amazon-bedrock is not a dependency anywhere in package.json or src/.\nGenerationHandler.ts:364-366 currently reads (in part) \"...Bedrock is deliberately excluded — it runs on the third-party @ai-sdk/amazon-bedrock model, which has no such handling.\" — same false claim, same proof.\nCLAUDE.md:162 (Key Files table) and :266/:272 (How-To Guide) claim AIProviderName lives in src/lib/types/providers.ts — it lives in src/lib/constants/enums.ts:8. (types/providers.ts does separately define the AIProvider type/interface — only the AIProviderName enum location claim is wrong.)\nperplexity.ts:34's docstring claims \"web context (search-augmented answers + citations)\" — the word \"citation\" appears nowhere else in the file or in the shared openaiChatCompletionsBase.ts base class; there is no citation extraction/parsing/return logic anywhere.\n[ ] Fix src/lib/core/modules/structuredOutputPolicy.ts — replace the false @ai-sdk/amazon-bedrock claim with an accurate description (Bedrock uses the raw AWS SDK directly, not an ai-sdk provider package).\n[ ] Fix src/lib/core/modules/GenerationHandler.ts — same correction, matching wording style to the surrounding comment.\n[ ] Fix CLAUDE.md","hierarchy":{"lvl0":"Superpowers","lvl1":"Dead Code Purge Implementation Plan","lvl2":"Task 9: Stale-comment truth fixes","lvl3":""}},
|
|
11169
11178
|
{"objectID":"5482f40b4ea627aa36e04ffbb6b1d04e76cf544d4c8dc5e7e35f7ca7e2f8a56d","title":"Task 10: Unreachable class-constructor fallback branch in providerFactory.ts","url":"/docs/superpowers/plans/2026-08-15-03-dead-code-purge#task-10-unreachable-class-constructor-fallback-branch-in-providerfactoryts","content":"Files:\nEdit: src/lib/factories/providerFactory.ts — simplify createProvider's inner try/catch (lines 127-172) to remove the unreachable constructor-retry branch\n\nInterfaces: None — the outer catch (error) block (line 175, unchanged) already formats and rethrows any error from the inner block identically to how the dead branch's else { throw factoryError; } did, so this is a behavior-preserving simplification, not a behavior change.\n[ ] Verify the branch is unreachable: every registered factory is an arrow function (arrow functions have no .prototype, so the guard registration.constructor.prototype && ... is always falsy), and confirm the outer catch already handles the rethrow identically.\n\n \n\n Expected: the read confirms the if (registration.constructor.prototype && registration.constructor.prototype.constructor === registration.constructor) guard at lines 144-148, whose if body (the new (registration.constructor as new (...) => AIProvider)(...) constructor-retry attempt, lines 149-168) can never execute because every one of the 30 registerProvider( calls in providerRegistry.ts passes an async (modelName?, ...) => {...} arrow function as the factory — arrow functions have no .prototype property per the JS spec, so the guard is always false and execution always falls to the else { throw factoryError; } at line 170. The outer catch (error) at line 175 formats and rethrows any error identically regardless of which inner path produced it.\n[ ] Edit src/lib/factories/providerFactory.ts, replacing lines 125-172 (the let result: AIProvider; declaration plus the whole inner try/catch) with a direct, non-wrapped call — letting any factory error propagate straight to the existing outer catch (error) at line 175 unchanged:\n\n \n\n (The surrounding outer try { ... } catch (error) { logger.error(...); throw new Error(...); } at lines 118/175-181 stays exactly as-is; only the inner try/catch and its dead branch are removed.)\n[ ] Run the full verification gate.\n[ ] Run the target","hierarchy":{"lvl0":"Superpowers","lvl1":"Dead Code Purge Implementation Plan","lvl2":"Task 10: Unreachable class-constructor fallback branch in providerFactory.ts","lvl3":""}},
|
|
11170
11179
|
{"objectID":"3ce37c13b59060572fffb4c9f0aa07daa3b1cd846ceafa9bc28d4acbc2408b73","title":"Verification Checklist","url":"/docs/superpowers/plans/2026-08-15-03-dead-code-purge#verification-checklist","content":"[ ] All 10 tasks' grep-verification steps were re-run against the current tree (not copy-pasted from this plan's cached line numbers) immediately before each deletion.\n[ ] pnpm run check && pnpm run lint && pnpm run build passes after every single task, not just at the end.\n[ ] Every provider directory's index.ts barrel exports exactly the files that still exist in that directory — no barrel line points at a deleted file.\n[ ] src/lib/types/index.ts no longer exports universalProviderOptions.js; every other barrel line is untouched.\n[ ] AnthropicModelMetadata's supportsVision field is confirmed still present in the type (src/lib/types/subscription.ts) and in all 9 MODEL_METADATA entries — this task deliberately did NOT touch it.\n[ ] modelConfiguration.ts's ModelConfigurationManager class and modelConfig singleton are confirmed still present and functioning — this task deliberately did NOT delete the file.\n[ ] npx tsx test/continuous-test-suite-providers.ts passes after Tasks 1, 2, 3, 5, 8, 10 (the tasks that touch provider-instantiation-adjacent code).\n[ ] npx tsx test/continuous-test-suite-model-capabilities.ts and test:credentials pass after Task 6.\n[ ] npx tsx test/continuous-test-suite-dynamic.ts passes after Task 7.\n[ ] npx tsx test/continuous-test-suite-observability.ts and test:evaluation pass after Task 8.\n[ ] git log shows one commit per task (10 commits), each a conventional-commit message, none pushed.\n[ ] A final grep -rn \"TODO\\|FIXME\" <touched files> sanity check shows no leftover markers from the edits.","hierarchy":{"lvl0":"Superpowers","lvl1":"Dead Code Purge Implementation Plan","lvl2":"Verification Checklist","lvl3":""}},
|
|
11171
|
-
{"objectID":"ce6285548f3f943b4f4852c398391b4ab34e8996b9492a8c992b21c0659827cd","title":"Risks & Rollback","url":"/docs/superpowers/plans/2026-08-15-03-dead-code-purge#risks-rollback","content":"Risk — Task 3 (googleVertex) is the largest single edit (12 functions across a 9,966-line file, deleted in two blocks whose line numbers shift relative to each other). Mitigation: delete bottom-to-top (second block, i.e. the higher line numbers, first) so the first block's line numbers never move out from under you mid-edit; re-run the grep-verification step after the first deletion to get fresh line numbers before the second.\nRisk — Task 4 (universalProviderOptions.ts) is a nominal breaking change. It's reachable via the package's main . export today, even though nothing internally or externally (per repo-wide grep) consumes it. If semantic-release / commit-message conventions in this repo treat a !-suffixed conventional commit as a major-version trigger, confirm that's the intended signal before merging — a chore!: may need to become a plain chore: with a note in the PR description instead, depending on how strictly this repo's release automation reads commit types. Rollback: git revert the single Task 4 commit; the deleted file's content is fully captured in this plan's Task 4 section if it needs reconstructing without a git history dive.\nRisk — Task 6 deliberately does LESS than originally assigned (keeps the supportsVision field). If the team intended a genuine breaking change to AnthropicModelMetadata's shape as part of a larger model-metadata consolidation (out of scope here, see below), this task's conservative choice may need revisiting once that consolidation plan exists — at that point deleting the field becomes a deliberate, coordinated breaking change rather than an accidental one, which is a different decision than this task is scoped to make alone.\nRisk — Task 8 deliberately does LESS than originally assigned (keeps the file). Same shape of risk as Task 6: if a broader model-configuration consolidation plan later wants to retire ModelConfigurationManager entirely in favor of
|
|
11180
|
+
{"objectID":"ce6285548f3f943b4f4852c398391b4ab34e8996b9492a8c992b21c0659827cd","title":"Risks & Rollback","url":"/docs/superpowers/plans/2026-08-15-03-dead-code-purge#risks-rollback","content":"Risk — Task 3 (googleVertex) is the largest single edit (12 functions across a 9,966-line file, deleted in two blocks whose line numbers shift relative to each other). Mitigation: delete bottom-to-top (second block, i.e. the higher line numbers, first) so the first block's line numbers never move out from under you mid-edit; re-run the grep-verification step after the first deletion to get fresh line numbers before the second.\nRisk — Task 4 (universalProviderOptions.ts) is a nominal breaking change. It's reachable via the package's main . export today, even though nothing internally or externally (per repo-wide grep) consumes it. If semantic-release / commit-message conventions in this repo treat a !-suffixed conventional commit as a major-version trigger, confirm that's the intended signal before merging — a chore!: may need to become a plain chore: with a note in the PR description instead, depending on how strictly this repo's release automation reads commit types. Outcome: it did trigger a major release, v11.0.0 (see the note under Task 4). Rollback: git revert the single Task 4 commit; the deleted file's content is fully captured in this plan's Task 4 section if it needs reconstructing without a git history dive.\nRisk — Task 6 deliberately does LESS than originally assigned (keeps the supportsVision field). If the team intended a genuine breaking change to AnthropicModelMetadata's shape as part of a larger model-metadata consolidation (out of scope here, see below), this task's conservative choice may need revisiting once that consolidation plan exists — at that point deleting the field becomes a deliberate, coordinated breaking change rather than an accidental one, which is a different decision than this task is scoped to make alone.\nRisk — Task 8 deliberately does LESS than originally assigned (keeps the file). Same shape of risk as Task 6: if a broader model-configuration consolidation plan later wants to retire ModelConfigurationManager entirely in favor of","hierarchy":{"lvl0":"Superpowers","lvl1":"Dead Code Purge Implementation Plan","lvl2":"Risks & Rollback","lvl3":""}},
|
|
11172
11181
|
{"objectID":"d7635687ba3b43659146bab3bec3bdb978676dd95699f9567a879808b692c004","title":"Out of Scope","url":"/docs/superpowers/plans/2026-08-15-03-dead-code-purge#out-of-scope","content":"SageMaker orphaned streaming code — flagged in the audit as a separate dead/orphaned pattern in the SageMaker provider; whether to wire it up or delete it is a design decision, not a mechanical dead-code deletion. Covered by Plan 08.\nVertex's duplicated live loops (the live code paths that duplicate logic across executeNativeGemini3Stream/Generate and executeNativeAnthropicStream/Generate, as opposed to this plan's Task 3, which only removes the fully-dead legacy call tree those live paths replaced) — a refactor of working code, not a deletion of dead code. Covered by Plan 08.\nMODEL_REGISTRY consolidation — merging the anthropicModels.ts / MODELREGISTRY / MODELCONTEXTWINDOWS / VISIONCAPABILITIES model-metadata stores into one source of truth, including any future decision to reshape AnthropicModelMetadata itself (which would supersede this plan's conservative Task 6 choice to keep supportsVision as-is). Covered by Plan 06.\nOLLAMA_OPENAI_COMPATIBLE doc/behavior mismatch — discovered incidentally during Task 1's ollama verification (the env var is documented as live in docs/getting-started/providers/ollama.md and docs/reference/provider-capabilities-audit.md, but the code path that would read it is dead and client.ts's docstring says the provider now always uses the OpenAI-compatible API unconditionally). This is a docs-accuracy issue adjacent to, but distinct from, the dead-code deletion this plan performs — worth a follow-up docs fix, not bundled into Task 1 here.\nevaluationProviders.ts's barrel re-export from src/lib/types/index.ts — noted during Task 8's consumer trace as a pre-existing Critical Rule 12 violation (a non-type file's content re-exported from the types barrel). Not part of this plan's scope; flagged for whichever plan owns general Rule-12 cleanup, if one exists.","hierarchy":{"lvl0":"Superpowers","lvl1":"Dead Code Purge Implementation Plan","lvl2":"Out of Scope","lvl3":""}},
|
|
11173
11182
|
{"objectID":"6d4673ae8eff94c51ccbaac4634e74ba6ab12328879b77eb05ad90ea339abc09","title":"ProviderDescriptor Single Source of Truth Implementation Plan","url":"/docs/superpowers/plans/2026-08-15-04-provider-descriptor","content":"ProviderDescriptor Single Source of Truth Implementation Plan\n\nFor agentic workers: REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (- [ ]) syntax for tracking.\n\nGoal: Replace five independently-drifted provider-identity tables (CLI choices, CREDENTIAL_KEY_MAP, env-var checks, health-check switches, tool-support sets) with one ProviderDescriptor record per provider and a single PROVIDER_DESCRIPTORS array, so every consumer derives its view from one source instead of hand-maintaining its own copy.\n\nArchitecture: A new pure-data module (src/lib/factories/providerDescriptors.ts) declares one ProviderDescriptor object per of the 30 real AIProviderName values (everything except AUTO), plus a name→descriptor map and an alias→canonical-name index, all computed once at module load with zero imports of provider classes or dynamic import(). ProviderFactory (src/lib/factories/providerFactory.ts) gains getDescriptor()/getAllDescriptors() reading from that module, and registerProvider() gains an optional 5th parameter so a live registration can carry its descriptor too. Nine existing consumers (CLI provider choices, provider env-var checks, health-check dispatch, auto-select priority, getProviderStatus(), environmentManager.ts, setup.ts, the prompt-only-tools set, and CREDENTIAL_KEY_MAP/resolveCredentialKey) are each migrated, one task at a time, to read from PROVIDER_DESCRIPTORS instead of their own hand-written table. Plan 01 (Tier A Bug Fixes, landed on this branch first) already fixed two of the originally-confirmed bugs — the missing together-ai credential mapping and getAvailableProviders()/isValidProvider() only recognizing 10 of 30 providers — ahead of this plan; this plan's remaining fixes are hasProviderEnvVars() silently returning false for 20 of 30 providers and the missing nvidia/lms CLI completions, plus it re-derives Plan 01's two already-fixed spots from the same PROVIDER_DESCRIPTORS source (rather than their now-separate hand-written fixes) so all nine consumers genuinely share one source instead of nine independently-correct ones.\n\nTech Stack: TypeScript (strict, ESM, NodeNext module resolution), pnpm, tsx for direct TS execution of test suites and CLI-only consumers, the repo's defineSuite/test/assert/runSuite harness (test/helpers/harness.ts) for regression suites, ESLint with this repo's custom neurolink/* rules for the type-placement/naming constraints.\n\nSpec:\n$SCRATCH/47d64fa8-f94f-404c-b134-3e117deddba3/scratchpad/areas/00-provider-registration-instantiation-chain.md\n$SCRATCH/47d64fa8-f94f-404c-b134-3e117deddba3/scratchpad/areas/02-sdk-entry-orchestration-src-lib-neurolink-ts-gener.md\n$SCRATCH/47d64fa8-f94f-404c-b134-3e117deddba3/scratchpad/areas/07-cli-env-config-surface-for-ai-providers.md\n$SCRATCH/47d64fa8-f94f-404c-b134-3e117deddba3/scratchpad/areas/11-types-models-config.md\n\nGlobal Constraints\npnpm ONLY. pnpm run check / pnpm run lint / pnpm run build. Tests via npx tsx test/continuous-test-suite-<name>.ts + package.json test:<name> scripts.\nTEST HARNESS SKIP HAZARD: NEVER interpolate payloads into assertion messages (SKIP-not-FAIL downgrade); new suites include a break-one-assertion sanity step.\nRepo rules: dynamic imports only in providerRegistry.ts factory closures; ALL types in src/lib/types/; no interface (type + intersection only); unique exported type names; types barrel only export *; barrel-only internal type imports; no double assertions; named exports only; no export default. Public SDK API must not break.\nConventional commits; commit per task; NEVER git push.\n\nTesting convention for this plan specifically: Task 6's completeness suite (test/continuous-test-suite-provider-descriptors.ts) is the one place this plan tests the public contract — it imports PROVIDER_DESCRIPTORS, ProviderFactory (getDescriptor/getAllDescriptors) from ../dist/index.js, matching the repo convention that test:* suites exercise the built package. Tasks 7–15 migrate internal consumer functions (CLI option builders, env-var checkers, health-check switches) that are not part of the public SDK barrel; those tasks add test() blocks to the same suite file but import the consumer functions directly from their src/ .ts files via tsx (no build step required to iterate on them), consistent with how test:mcp:bash and test:mcp:infra mix build-artifact and source-level checks in this repo. This split is called out again at the top of each task's Files section.\n\nTask 1: ProviderDescriptor type\n\nFiles:\nsrc/lib/types/providers.ts — add new type after the existing ProviderRegistration type (currently lines 1967-1971).\n\nInterfaces:\nProduces: type ProviderDescriptor (exported).\n\nSteps:\n[ ] Before-grep: confirm the type doesn't exist yet.\n\n \n\n Expected: no output (empty).\n[ ] Add the type immediately after ProviderRegistration (after line 1971) in src/lib/types/providers.ts:\n[ ] Run typecheck and lint, verify t","hierarchy":{"lvl0":"Superpowers","lvl1":"ProviderDescriptor Single Source of Truth Implementation Plan","lvl2":"","lvl3":""}},
|
|
11174
11183
|
{"objectID":"a5ddcd24b0db1523d7658e18c8ff8a584edb89a87e5167b4bf394afbc8ee6978","title":"ProviderDescriptor Single Source of Truth Implementation Plan","url":"/docs/superpowers/plans/2026-08-15-04-provider-descriptor#providerdescriptor-single-source-of-truth-implementation-plan","content":"For agentic workers: REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (- [ ]) syntax for tracking.\n\nGoal: Replace five independently-drifted provider-identity tables (CLI choices, CREDENTIAL_KEY_MAP, env-var checks, health-check switches, tool-support sets) with one ProviderDescriptor record per provider and a single PROVIDER_DESCRIPTORS array, so every consumer derives its view from one source instead of hand-maintaining its own copy.\n\nArchitecture: A new pure-data module (src/lib/factories/providerDescriptors.ts) declares one ProviderDescriptor object per of the 30 real AIProviderName values (everything except AUTO), plus a name→descriptor map and an alias→canonical-name index, all computed once at module load with zero imports of provider classes or dynamic import(). ProviderFactory (src/lib/factories/providerFactory.ts) gains getDescriptor()/getAllDescriptors() reading from that module, and registerProvider() gains an optional 5th parameter so a live registration can carry its descriptor too. Nine existing consumers (CLI provider choices, provider env-var checks, health-check dispatch, auto-select priority, getProviderStatus(), environmentManager.ts, setup.ts, the prompt-only-tools set, and CREDENTIAL_KEY_MAP/resolveCredentialKey) are each migrated, one task at a time, to read from PROVIDER_DESCRIPTORS instead of their own hand-written table. Plan 01 (Tier A Bug Fixes, landed on this branch first) already fixed two of the originally-confirmed bugs — the missing together-ai credential mapping and getAvailableProviders()/isValidProvider() only recognizing 10 of 30 providers — ahead of this plan; this plan's remaining fixes are hasProviderEnvVars() silently returning false for 20 of 30 providers and the missing nvidia/lms CLI completions, plus it re-derives Plan 01's two already-fixed spots from the same PROVIDER_DESCRIPTORS source (rather than their ","hierarchy":{"lvl0":"Superpowers","lvl1":"ProviderDescriptor Single Source of Truth Implementation Plan","lvl2":"ProviderDescriptor Single Source of Truth Implementation Plan","lvl3":""}},
|
|
@@ -11298,14 +11307,14 @@
|
|
|
11298
11307
|
{"objectID":"75beda4daaffc6a0dc0761f4143c6dc0ba42fb6e852bb56cbc7728acec91c415","title":"Verification Checklist","url":"/docs/superpowers/plans/2026-08-15-09-media-registry-consolidation#verification-checklist","content":"[ ] pnpm run check passes with zero errors.\n[ ] pnpm run lint passes with zero errors (custom ESLint rules for repo rules 2, 7-13 all clean; no-restricted-syntax clean for rule 14).\n[ ] pnpm run build passes (SDK + CLI).\n[ ] Every new no-API suite passes standalone: pnpm run test:handler-registry, pnpm run test:tts:unit, pnpm run test:stt:unit, pnpm run test:realtime:unit, pnpm run test:music:unit, pnpm run test:avatar:unit, pnpm run test:video-generation:unit, pnpm run test:media-handler-catalog, pnpm run test:video-handler-registration, pnpm run test:media-registration-wiring, pnpm run test:resolve-request-kind, pnpm run test:media-registry-collisions.\n[ ] pnpm test (the main orchestrator) still exits 0.\n[ ] pnpm run test:multimodal (which chains test:tts:unit among others) still exits 0.\n[ ] pnpm run test:media and pnpm run test:tts (the pre-existing live suites) still exit 0 or SKIP gracefully without API keys — no new FAILs introduced.\n[ ] Every one of the six processors (TTS, STT, Realtime, Video, Music, Avatar) has exactly one Map-backed registry internally, composed via HandlerRegistry<THandler> — grep confirms no processor still declares its own private static readonly handlers = new Map<...> field.\n[ ] grep -rn \"IMAGE_GENERATION_MODELS\" src/lib/core/baseProvider.ts returns nothing.\n[ ] grep -n \"^registerDefault\" src/lib/voice/index.ts src/lib/music/index.ts src/lib/avatar/index.ts src/lib/adapters/video/index.ts shows only export function declaration lines — no bare module-scope invocation lines remain.\n[ ] providerRegistry.ts's six former hand-written registration blocks are each reduced to a call into their ecosystem's registerDefault*Handlers().\n[ ] resolveRequestKind() is the only place output.mode/output.format/tts.enabled/isImageGenerationModel are combined into a routing decision — both neurolink.ts and baseProvider.ts call it rather than re-deriving the logic inline.\n[ ] VideoProcessor.generate and its one caller (baseProvider.ts's handleVideoGener","hierarchy":{"lvl0":"Superpowers","lvl1":"Media Registry Consolidation Implementation Plan","lvl2":"Verification Checklist","lvl3":""}},
|
|
11299
11308
|
{"objectID":"c9b9d13a0cb7d35899590d54794e7c4f75479be2150c5188cf547d79c9a3774f","title":"Risks & Rollback","url":"/docs/superpowers/plans/2026-08-15-09-media-registry-consolidation#risks-rollback","content":"Risk: the dual-registration removal (Tasks 10-11) creates a window where a media handler is unregistered. Between Task 10 (removing the ecosystem barrels' auto-run side effects) and Task 11 (wiring providerRegistry.ts to call them explicitly) landing, any code path that imports voice/index.ts/music/index.ts/avatar/index.ts directly for its side effect (rather than going through ProviderRegistry.registerAllProviders()) would silently stop getting handlers registered. Mitigation: Tasks 10 and 11 are sequenced back-to-back and each has its own commit — if a consumer outside the six processors turns out to rely on the import-side-effect, git revert Task 10's commit alone restores the auto-run behavior without touching Task 11's providerRegistry.ts changes (Task 11's calls into registerDefault*Handlers() remain correct either way, since those functions are idempotent).\nRisk: ProviderRegistry.realtimeRegistration's failure-message text becomes coarser. Task 11's reconstruction of the realtime outcomes report loses the original per-handler constructor error message in favor of a generic \"not registered (see debug log for details)\" sentinel. Any external caller string-matching on the OLD specific error text (rather than just checking === \"ok\") would break. Mitigation: this is called out explicitly in Task 11's own inline code comment; if a real caller is found to depend on the old text, the fix is to have registerDefaultRealtimeHandlers() return a Record<string, \"ok\" | string> outcomes map instead of void, which is a larger, additive signature change scoped to a follow-up rather than this plan.\nRisk: VideoProcessor.generate's signature change is a breaking change for any external SDK consumer calling it directly. VideoProcessor is exported from the package (via src/lib/utils/videoProcessor.ts and re-exported through src/lib/adapters/video/index.ts), so a consumer calling VideoProcessor.generate(provider, image, prompt, options, region) positionally would break at compile ti","hierarchy":{"lvl0":"Superpowers","lvl1":"Media Registry Consolidation Implementation Plan","lvl2":"Risks & Rollback","lvl3":""}},
|
|
11300
11309
|
{"objectID":"5522519c37e4bcfbf9ec5882fa38d3a72395b859c7d05eae7deac9df7f259e79","title":"Out of Scope","url":"/docs/superpowers/plans/2026-08-15-09-media-registry-consolidation#out-of-scope","content":"Making media handlers extend BaseProvider — a deliberate non-goal; the six media-handler ecosystems have a fundamentally different contract (single-shot generate/synthesize/transcribe vs. BaseProvider's full generate/stream/tool-loop surface) and unifying them is not part of this plan.\nImage providers — already served by the main ProviderFactory/ProviderRegistry pattern; out of scope here.\nProxy — not addressed by any current plan; tracked only in the roadmap notes (see docs/superpowers/plans/2026-08-15-00-roadmap.md).\nFixing isImageGenerationModel dispatch-site correctness itself — that is plan 01's scope (Tier A bug fixes); this plan's resolveRequestKind() consumes the existing, already-correct isImageGenerationModel() helper rather than re-deriving or re-fixing its boundary-matching logic.\nThe pure-data provider-descriptor pattern for text/image providers (providerDescriptors.ts) — that is plan 04's scope; this plan only mirrors its shape for media handlers.","hierarchy":{"lvl0":"Superpowers","lvl1":"Media Registry Consolidation Implementation Plan","lvl2":"Out of Scope","lvl3":""}},
|
|
11301
|
-
{"objectID":"316916b2511c41606919b1726e19d3614a55cc8583edc679c1f396626e7a8cc7","title":"200-Provider Onboarding Playbook Implementation Plan","url":"/docs/superpowers/plans/2026-08-15-10-onboarding-playbook","content":"200-Provider Onboarding Playbook Implementation Plan\n\nFor agentic workers: REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (- [ ]) syntax for tracking.\n\nGoal: Turn the nine architecture-redesign plans into a repeatable, CI-enforced process — a tiered onboarding guide, a scaffolding tool, and a data-driven completeness gate — so adding provider #50 through #230 is a checklist, not an archaeology exercise.\n\nArchitecture: Four onboarding tiers (aggregator passthrough → catalog entry → adapter-based native → full custom) map 1:1 to the four tables of effort the audit found (zero code / ~1 hour / days / bespoke). Each tier's checklist is derived from the end state of Plans 04 (ProviderDescriptor), 05 (OpenAICompatCatalogEntry), and 07 (classifyProviderError) — not today's 25-touch-point reality. A new docs/provider-integration/manifests/<provider>.json convention plus a source-only, build-free CI script (tools/verify-provider-onboarding.ts) turn \"did this PR wire the new provider correctly\" from an honor-system checkbox into a data-driven, zero-network gate that diffs the AIProviderName enum against PROVIDER_DESCRIPTORS, OPENAI_COMPAT_CATALOG, the mocked-contract suite, and the manifest directory.\n\nTech Stack: TypeScript, tsx (no build step for tooling), Markdown docs, GitHub Actions (existing ci.yml), pnpm scripts.\n\nSpec
|
|
11302
|
-
{"objectID":"f9b48892a0013064dec0cb4d0b5d75a9c62c278775b420830af0fd58141a8661","title":"200-Provider Onboarding Playbook Implementation Plan","url":"/docs/superpowers/plans/2026-08-15-10-onboarding-playbook#200-provider-onboarding-playbook-implementation-plan","content":"For agentic workers: REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (- [ ]) syntax for tracking.\n\nGoal: Turn the nine architecture-redesign plans into a repeatable, CI-enforced process — a tiered onboarding guide, a scaffolding tool, and a data-driven completeness gate — so adding provider #50 through #230 is a checklist, not an archaeology exercise.\n\nArchitecture: Four onboarding tiers (aggregator passthrough → catalog entry → adapter-based native → full custom) map 1:1 to the four tables of effort the audit found (zero code / ~1 hour / days / bespoke). Each tier's checklist is derived from the end state of Plans 04 (ProviderDescriptor), 05 (OpenAICompatCatalogEntry), and 07 (classifyProviderError) — not today's 25-touch-point reality. A new docs/provider-integration/manifests/<provider>.json convention plus a source-only, build-free CI script (tools/verify-provider-onboarding.ts) turn \"did this PR wire the new provider correctly\" from an honor-system checkbox into a data-driven, zero-network gate that diffs the AIProviderName enum against PROVIDER_DESCRIPTORS, OPENAI_COMPAT_CATALOG, the mocked-contract suite, and the manifest directory.\n\nTech Stack: TypeScript, tsx (no build step for tooling), Markdown docs, GitHub Actions (existing ci.yml), pnpm scripts.\n\nSpec
|
|
11310
|
+
{"objectID":"316916b2511c41606919b1726e19d3614a55cc8583edc679c1f396626e7a8cc7","title":"200-Provider Onboarding Playbook Implementation Plan","url":"/docs/superpowers/plans/2026-08-15-10-onboarding-playbook","content":"200-Provider Onboarding Playbook Implementation Plan\n\nFor agentic workers: REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (- [ ]) syntax for tracking.\n\nGoal: Turn the nine architecture-redesign plans into a repeatable, CI-enforced process — a tiered onboarding guide, a scaffolding tool, and a data-driven completeness gate — so adding provider #50 through #230 is a checklist, not an archaeology exercise.\n\nArchitecture: Four onboarding tiers (aggregator passthrough → catalog entry → adapter-based native → full custom) map 1:1 to the four tables of effort the audit found (zero code / ~1 hour / days / bespoke). Each tier's checklist is derived from the end state of Plans 04 (ProviderDescriptor), 05 (OpenAICompatCatalogEntry), and 07 (classifyProviderError) — not today's 25-touch-point reality. A new docs/provider-integration/manifests/<provider>.json convention plus a source-only, build-free CI script (tools/verify-provider-onboarding.ts) turn \"did this PR wire the new provider correctly\" from an honor-system checkbox into a data-driven, zero-network gate that diffs the AIProviderName enum against PROVIDER_DESCRIPTORS, OPENAI_COMPAT_CATALOG, the mocked-contract suite, and the manifest directory.\n\nTech Stack: TypeScript, tsx (no build step for tooling), Markdown docs, GitHub Actions (existing ci.yml), pnpm scripts.\n\nSpec: four audit notes, kept as uncommitted local scratch notes and not in the repo: the OpenAI-compat family (area 10), CI/CD automated-testing coverage for provider changes (gap 1), the provider registration and instantiation chain (area 00), and types, models and config (area 11).\n\nGlobal Constraints\nPackage manager: pnpm ONLY (repo pins version via packageManager field). Build: pnpm run build. Typecheck: pnpm run check. Lint+format check: pnpm run lint. Auto-format: pnpm run format.\nTests run via tsx, NOT vitest (vitest.config.ts exists but is unused): npx tsx test/continuous-test-suite-<name>.ts. New suites need a matching test:<name> script in package.json.\nTEST HARNESS SKIP HAZARD: defineSuite's test() classifies a thrown error as SKIP (not FAIL) when the message matches isExpectedProviderError() — so NEVER interpolate payloads/actual values into assertion messages (describe the discrepancy, e.g. \"mismatch at <keyPath>\"). When adding a suite, include a step to deliberately break one assertion and confirm it reports ✗ and exits non-zero, then restore.\nRepo critical rules (ESLint-enforced): (1) dynamic imports only in providerRegistry.ts factory closures — never static-import provider classes there; (2) ALL type definitions go in src/lib/types/ — never create local types/ dirs or inline shared types; (7) zero interface — always type X = { ... }, intersection (&) not extends; (8) no \"Types\" suffix in type filenames; (9) globally unique exported type names across src/lib/types/ (use domain prefixes); (10) types barrel src/lib/types/index.ts contains only export * lines; (12) no type re-exports from non-type files; (13) code outside src/lib/types/ imports internal types from the barrel (../types or ../types/index.js), never from specific type files; (14) no double type assertions (x as unknown as T) in src/.\nNamed exports only. No export default.\nformatProviderError must RETURN the error object, never throw.\nBackward compatibility: the public SDK API must not break existing callers.\nConventional commits (feat:/fix:/refactor:/test:/docs:/chore:). Commit at the end of every task. NEVER git push.\nWorkflow per change: edit → pnpm run check → pnpm run lint → targeted test suite(s) → commit.\n\nPlan-specific constraints:\nHard dependency: this plan assumes Plans 02, 04, 05, and 07 have already landed on the branch you're working from. Concretely: src/lib/factories/providerDescriptors.ts (exporting PROVIDER_DESCRIPTORS), src/lib/providers/openaiCompatCatalog.ts (exporting OPENAI_COMPAT_CATALOG), ProviderDescriptor/OpenAICompatCatalogEntry in src/lib/types/providers.ts, and classifyProviderError/ProviderErrorRule/DEFAULT_ERROR_RULES (Plan 07) must exist before Tasks 3, 4, 6, and 9 will pass their verification steps. If those files don't exist yet in your worktree, stop and land Plans 02/04/05/07 first — the code samples in this plan are written against their documented end state (see the Shared cross-plan contracts each task's Interfaces block cites), not today's code.\ntools/**/*.ts is excluded from pnpm run check (tsconfig.json → \"exclude\": [..., \"tools\", ...]) and is not matched by any ESLint files: block (eslint.config.js only scopes TS-aware linting to src/**/*.ts and test/**/*.ts). This means the two new tools in this plan are verified by running them and inspecting output, plus pnpm run format for Prettier compliance (Prettier's --check . in pnpm run lint covers every file in the repo, tools included) — not by pnpm run check/ESLint custom rules.\nProvider manifests (docs/provider-integrat","hierarchy":{"lvl0":"Superpowers","lvl1":"200-Provider Onboarding Playbook Implementation Plan","lvl2":"","lvl3":""}},
|
|
11311
|
+
{"objectID":"f9b48892a0013064dec0cb4d0b5d75a9c62c278775b420830af0fd58141a8661","title":"200-Provider Onboarding Playbook Implementation Plan","url":"/docs/superpowers/plans/2026-08-15-10-onboarding-playbook#200-provider-onboarding-playbook-implementation-plan","content":"For agentic workers: REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (- [ ]) syntax for tracking.\n\nGoal: Turn the nine architecture-redesign plans into a repeatable, CI-enforced process — a tiered onboarding guide, a scaffolding tool, and a data-driven completeness gate — so adding provider #50 through #230 is a checklist, not an archaeology exercise.\n\nArchitecture: Four onboarding tiers (aggregator passthrough → catalog entry → adapter-based native → full custom) map 1:1 to the four tables of effort the audit found (zero code / ~1 hour / days / bespoke). Each tier's checklist is derived from the end state of Plans 04 (ProviderDescriptor), 05 (OpenAICompatCatalogEntry), and 07 (classifyProviderError) — not today's 25-touch-point reality. A new docs/provider-integration/manifests/<provider>.json convention plus a source-only, build-free CI script (tools/verify-provider-onboarding.ts) turn \"did this PR wire the new provider correctly\" from an honor-system checkbox into a data-driven, zero-network gate that diffs the AIProviderName enum against PROVIDER_DESCRIPTORS, OPENAI_COMPAT_CATALOG, the mocked-contract suite, and the manifest directory.\n\nTech Stack: TypeScript, tsx (no build step for tooling), Markdown docs, GitHub Actions (existing ci.yml), pnpm scripts.\n\nSpec: four audit notes, kept as uncommitted local scratch notes and not in the repo: the OpenAI-compat family (area 10), CI/CD automated-testing coverage for provider changes (gap 1), the provider registration and instantiation chain (area 00), and types, models and config (area 11).","hierarchy":{"lvl0":"Superpowers","lvl1":"200-Provider Onboarding Playbook Implementation Plan","lvl2":"200-Provider Onboarding Playbook Implementation Plan","lvl3":""}},
|
|
11303
11312
|
{"objectID":"e942a96e0ade47766b166f5c91921002bc93ef14bbabeb4f2136df30d6fef437","title":"Global Constraints","url":"/docs/superpowers/plans/2026-08-15-10-onboarding-playbook#global-constraints","content":"Package manager: pnpm ONLY (repo pins version via packageManager field). Build: pnpm run build. Typecheck: pnpm run check. Lint+format check: pnpm run lint. Auto-format: pnpm run format.\nTests run via tsx, NOT vitest (vitest.config.ts exists but is unused): npx tsx test/continuous-test-suite-<name>.ts. New suites need a matching test:<name> script in package.json.\nTEST HARNESS SKIP HAZARD: defineSuite's test() classifies a thrown error as SKIP (not FAIL) when the message matches isExpectedProviderError() — so NEVER interpolate payloads/actual values into assertion messages (describe the discrepancy, e.g. \"mismatch at <keyPath>\"). When adding a suite, include a step to deliberately break one assertion and confirm it reports ✗ and exits non-zero, then restore.\nRepo critical rules (ESLint-enforced): (1) dynamic imports only in providerRegistry.ts factory closures — never static-import provider classes there; (2) ALL type definitions go in src/lib/types/ — never create local types/ dirs or inline shared types; (7) zero interface — always type X = { ... }, intersection (&) not extends; (8) no \"Types\" suffix in type filenames; (9) globally unique exported type names across src/lib/types/ (use domain prefixes); (10) types barrel src/lib/types/index.ts contains only export * lines; (12) no type re-exports from non-type files; (13) code outside src/lib/types/ imports internal types from the barrel (../types or ../types/index.js), never from specific type files; (14) no double type assertions (x as unknown as T) in src/.\nNamed exports only. No export default.\nformatProviderError must RETURN the error object, never throw.\nBackward compatibility: the public SDK API must not break existing callers.\nConventional commits (feat:/fix:/refactor:/test:/docs:/chore:). Commit at the end of every task. NEVER git push.\nWorkflow per change: edit → pnpm run check → pnpm run lint → targeted test suite(s) → commit.\n\nPlan-specific constraints:\nHard dependency: this plan assumes Plans 02, 04, 0","hierarchy":{"lvl0":"Superpowers","lvl1":"200-Provider Onboarding Playbook Implementation Plan","lvl2":"Global Constraints","lvl3":""}},
|
|
11304
11313
|
{"objectID":"0f958db3719fb0282e7abb8df0dfbd7f2d9a05b6759c2024484dd6268d644785","title":"Task 1: Architecture Decision Records","url":"/docs/superpowers/plans/2026-08-15-10-onboarding-playbook#task-1-architecture-decision-records","content":"Files:\nCreate: docs/provider-integration/adr/README.md\nCreate: docs/provider-integration/adr/0001-provider-descriptor-as-source-of-truth.md\nCreate: docs/provider-integration/adr/0002-catalog-over-subclass-default.md\nCreate: docs/provider-integration/adr/0003-mocked-contract-as-merge-gate.md\n\nInterfaces:\nConsumes: ProviderDescriptor (Plan 04, src/lib/types/providers.ts), OpenAICompatCatalogEntry / ConfiguredOpenAICompatProvider (Plan 05), test/continuous-test-suite-providers-mocked.ts's installMockFetch pattern (existing).\nProduces: three ADR documents other tasks in this plan (and future provider PRs) link back to for rationale.\n\nThis is a docs-only task; there is no code to test, so the verification step is a grep-based content check instead of TDD.\n[ ] Create the ADR directory and index.\n[ ] Write docs/provider-integration/adr/README.md:\n[ ] Write docs/provider-integration/adr/0001-provider-descriptor-as-source-of-truth.md:\n[ ] Write docs/provider-integration/adr/0002-catalog-over-subclass-default.md:\n[ ] Write docs/provider-integration/adr/0003-mocked-contract-as-merge-gate.md:\n[ ] Verify the ADRs render as expected Markdown (no broken relative links) and commit.","hierarchy":{"lvl0":"Superpowers","lvl1":"200-Provider Onboarding Playbook Implementation Plan","lvl2":"Task 1: Architecture Decision Records","lvl3":""}},
|
|
11305
11314
|
{"objectID":"6aa2608bc34f23d9f73b07a3a6bcb12791de65ab9330de3ac46e037064448894","title":"Task 2: Tier overview + Tier 1 (aggregator passthrough)","url":"/docs/superpowers/plans/2026-08-15-10-onboarding-playbook#task-2-tier-overview-tier-1-aggregator-passthrough","content":"Files:\nCreate: docs/provider-integration/tiers/README.md\nCreate: docs/provider-integration/tiers/tier-1-aggregator-passthrough.md\n\nInterfaces:\nConsumes: nothing from other plans (Tier 1 requires zero SDK code changes by design).\nProduces: the tier decision tree that Task 7 wires the top-level docs/provider-integration/README.md into, and that tools/scaffold-provider.ts (Task 8) references by file path.\n[ ] Create the tiers directory and write the overview.\n\n \n\n docs/provider-integration/tiers/README.md:\n\n text\n Is the model already served by an aggregator NeuroLink already speaks to\n (LiteLLM proxy, OpenRouter)?\n ├─ Yes → Tier 1 — zero code. → tier-1-aggregator-passthrough.md\n └─ No, it's a new backend.\n │\n Does it speak the OpenAI /v1/chat/completions wire format (Bearer\n auth, standard SSE) with NO behavioral quirks (no custom body\n mutation, no 400-retry dance, no nonstandard auth header)?\n ├─ Yes → Tier 2 — one catalog row, ~1 hour. → tier-2-catalog-entry.md\n └─ No.\n │\n Does it need custom wire-format handling but is still a normal\n HTTP+JSON API you can drive with a provider class (own SSE parser,\n own auth scheme, own error shapes)?\n ├─ Yes → Tier 3 — adapter-based native, days. → tier-3-adapter-native.md\n └─ No — non-HTTP protocol, SDK-mediated auth (e.g. AWS SigV4),\n or a genuinely bespoke multi-step lifecycle.\n → Tier 4 — full custom, justify it. → tier-4-full-custom.md\n \n\n | Tier | Example | Code required | Time |\n | -------------------------- | ---------------------------------------------------------------------------------- | ----------------------------------------------------------------- | --------------------------------- |\n | 1 — Aggregator passthrough | A new model id on an exi","hierarchy":{"lvl0":"Superpowers","lvl1":"200-Provider Onboarding Playbook Implementation Plan","lvl2":"Task 2: Tier overview + Tier 1 (aggregator passthrough)","lvl3":""}},
|
|
11306
|
-
{"objectID":"318a91e536ad7e3d3d18d0996bc46fe17fed514446c2ce34e7aa4a7cc925fa1b","title":"Task 3: Tier 2 — catalog entry","url":"/docs/superpowers/plans/2026-08-15-10-onboarding-playbook#task-3-tier-2-catalog-entry","content":"Files:\nCreate: docs/provider-integration/tiers/tier-2-catalog-entry.md\n\nInterfaces:\nConsumes: type OpenAICompatCatalogEntry and class ConfiguredOpenAICompatProvider (Plan 05), type ProviderDescriptor and PROVIDER_DESCRIPTORS (Plan 04).\nProduces: the checklist tools/scaffold-provider.ts (Task 8) prints for --tier=2 and that tools/verify-provider-onboarding.ts (Task 9) enforces.\n[ ] Write docs/provider-integration/tiers/tier-2-catalog-entry.md:\n\n typescript\n {\n provider: AIProviderName.CEREBRAS,\n defaultBaseURL: \"https://api.cerebras.ai/v1\",\n envBaseURLVar: \"CEREBRASBASEURL\",\n defaultModel: \"llama3.1-70b\",\n fallbackModels: [\"llama3.1-8b\"],\n },\n \n\n
|
|
11315
|
+
{"objectID":"318a91e536ad7e3d3d18d0996bc46fe17fed514446c2ce34e7aa4a7cc925fa1b","title":"Task 3: Tier 2 — catalog entry","url":"/docs/superpowers/plans/2026-08-15-10-onboarding-playbook#task-3-tier-2-catalog-entry","content":"Files:\nCreate: docs/provider-integration/tiers/tier-2-catalog-entry.md\n\nInterfaces:\nConsumes: type OpenAICompatCatalogEntry and class ConfiguredOpenAICompatProvider (Plan 05), type ProviderDescriptor and PROVIDER_DESCRIPTORS (Plan 04).\nProduces: the checklist tools/scaffold-provider.ts (Task 8) prints for --tier=2 and that tools/verify-provider-onboarding.ts (Task 9) enforces.\n[ ] Write docs/provider-integration/tiers/tier-2-catalog-entry.md:\n\n typescript\n {\n provider: AIProviderName.CEREBRAS,\n defaultBaseURL: \"https://api.cerebras.ai/v1\",\n envBaseURLVar: \"CEREBRASBASEURL\",\n defaultModel: \"llama3.1-70b\",\n fallbackModels: [\"llama3.1-8b\"],\n },\n typescript\n {\n name: AIProviderName.CEREBRAS,\n aliases: [\"cerebras\"] as const,\n credentialsKey: \"cerebras\",\n envVars: {\n apiKey: \"CEREBRASAPIKEY\",\n baseURL: \"CEREBRASBASEURL\",\n model: \"CEREBRAS_MODEL\",\n },\n defaultModel: \"llama3.1-70b\",\n toolSupport: \"native\",\n localRuntime: false,\n healthCheck: \"env-only\",\n },\n typescript\n cerebras?: {\n apiKey?: string;\n baseURL?: string;\n };\n typescript\n ProviderFactory.registerProvider(\n AIProviderName.CEREBRAS,\n async (\n modelName?: string,\n _providerName?: string,\n sdk?: NeuroLink,\n _region?: string,\n credentials?: UnknownRecord,\n ) => {\n const { ConfiguredOpenAICompatProvider } =\n await import(\"../providers/configuredOpenAICompat.js\");\n const { OPENAICOMPATCATALOG } =\n await import(\"../providers/openaiCompatCatalog.js\");\n const entry = OPENAICOMPATCATALOG.find(\n (e) => e.provider === AIProviderName.CEREBRAS,\n )!;\n const cerebrasCreds = credentials as NeurolinkCredentials[\"cerebras\"];\n return new ConfiguredOpenAICompatProvider(\n entry,\n modelName,\n sdk,\n cerebrasCreds,\n );\n },\n process.env.CEREBRAS_MODEL ?? \"llama3.1-70b\",\n [\"cerebras\"],\n );\n typescript\n const spec = { provider: \"cerebras\"","hierarchy":{"lvl0":"Superpowers","lvl1":"200-Provider Onboarding Playbook Implementation Plan","lvl2":"Task 3: Tier 2 — catalog entry","lvl3":""}},
|
|
11307
11316
|
{"objectID":"4e9c8dc3698df89e5554d462c28605bcdbbe265c419514dc69c3c9a3569c36bb","title":"Task 4: Tier 3 — adapter-based native","url":"/docs/superpowers/plans/2026-08-15-10-onboarding-playbook#task-4-tier-3-adapter-based-native","content":"Files:\nCreate: docs/provider-integration/tiers/tier-3-adapter-native.md\n\nInterfaces:\nConsumes: type ProviderErrorRule, classifyProviderError, DEFAULT_ERROR_RULES (Plan 07, src/lib/utils/errorClassifier.ts), type ProviderDescriptor / PROVIDER_DESCRIPTORS (Plan 04), BaseProvider (existing, src/lib/core/baseProvider.ts).\nProduces: the checklist tools/scaffold-provider.ts (Task 8) prints for --tier=3.\n[ ] Write docs/provider-integration/tiers/tier-3-adapter-native.md:\n\n typescript\n import { AIProviderName } from \"../constants/enums.js\";\n import { BaseProvider } from \"../core/baseProvider.js\";\n import { classifyProviderError } from \"../utils/errorClassifier.js\";\n import { DEFAULTERRORRULES } from \"../utils/errorClassifier.js\";\n import type {\n NeurolinkCredentials,\n ProviderErrorRule,\n StreamOptions,\n StreamResult,\n } from \"../types/index.js\";\n import type { NeuroLink } from \"../neurolink.js\";\n\n const ACMEERRORRULES: readonly ProviderErrorRule[] = [\n ...DEFAULTERRORRULES,\n // Add vendor-specific rules only where the vendor's error shape\n // deviates from the defaults, e.g.:\n // { status: 422, errorClass: \"invalid-model\" },\n ];\n\n export class AcmeProvider extends BaseProvider {\n constructor(\n modelName?: string,\n sdk?: NeuroLink,\n _region?: string,\n credentials?: NeurolinkCredentials[\"acme\"],\n ) {\n const apiKey = credentials?.apiKey?.trim() || process.env.ACMEAPIKEY;\n super(modelName ?? \"acme-default-model\", AIProviderName.ACME, sdk);\n // Store apiKey/baseURL on this, build the vendor's SDK client here.\n }\n\n formatProviderError(error: unknown): Error {\n // MUST return, never throw — Critical Rule 6.\n // classifyProviderError's real signature (Plan 07) is positional:\n // (error, rules, provider: string, modelName?: string) — NOT an\n // object third argument.\n return classifyProviderError(\n error,\n ACMEERRORRULES,\n \"acme\",\n this.modelName,\n ","hierarchy":{"lvl0":"Superpowers","lvl1":"200-Provider Onboarding Playbook Implementation Plan","lvl2":"Task 4: Tier 3 — adapter-based native","lvl3":""}},
|
|
11308
|
-
{"objectID":"725454c0764ffe3f9de679edd78863be7ce3cde9349f511b033a23631b55bcd0","title":"Task 5: Tier 4 — full custom","url":"/docs/superpowers/plans/2026-08-15-10-onboarding-playbook#task-5-tier-4-full-custom","content":"Files:\nCreate: docs/provider-integration/tiers/tier-4-full-custom.md\n\nInterfaces:\nConsumes: everything Tier 3 consumes, plus the existing src/lib/providers/amazonSagemaker.ts as the worked example.\nProduces: the checklist tools/scaffold-provider.ts (Task 8) prints for --tier=4, and the tier4Justification field tools/verify-provider-onboarding.ts (Task 9) requires in Tier-4 manifests.\n[ ] Write docs/provider-integration/tiers/tier-4-full-custom.md:\n\n json\n {\n \"provider\": \"acme-sdk\",\n \"tier\": 4,\n \"addedInPR\": \"https://github.com/juspay/neurolink/pull/\",\n \"addedDate\": \"2026-08-15\",\n \"filesTouched\": [\"...\"],\n \"mockedContractSection\": \"LLM acme-sdk\",\n \"manualTestStatus\": \"not-tested\",\n \"tier4Justification\": \"Auth is SDK-mediated request signing (proprietary HMAC scheme); cannot be replicated with plain fetch headers.\"\n }\n \n\n
|
|
11317
|
+
{"objectID":"725454c0764ffe3f9de679edd78863be7ce3cde9349f511b033a23631b55bcd0","title":"Task 5: Tier 4 — full custom","url":"/docs/superpowers/plans/2026-08-15-10-onboarding-playbook#task-5-tier-4-full-custom","content":"Files:\nCreate: docs/provider-integration/tiers/tier-4-full-custom.md\n\nInterfaces:\nConsumes: everything Tier 3 consumes, plus the existing src/lib/providers/amazonSagemaker.ts as the worked example.\nProduces: the checklist tools/scaffold-provider.ts (Task 8) prints for --tier=4, and the tier4Justification field tools/verify-provider-onboarding.ts (Task 9) requires in Tier-4 manifests.\n[ ] Write docs/provider-integration/tiers/tier-4-full-custom.md:\n\n json\n {\n \"provider\": \"acme-sdk\",\n \"tier\": 4,\n \"addedInPR\": \"https://github.com/juspay/neurolink/pull/\",\n \"addedDate\": \"2026-08-15\",\n \"filesTouched\": [\"...\"],\n \"mockedContractSection\": \"LLM acme-sdk\",\n \"manualTestStatus\": \"not-tested\",\n \"tier4Justification\": \"Auth is SDK-mediated request signing (proprietary HMAC scheme); cannot be replicated with plain fetch headers.\"\n }\n bash\n pnpm run check\n pnpm run lint\n pnpm run test:providers-mocked\n pnpm run build:cli && pnpm run cli --help\n pnpm run verify:provider-onboarding\n pnpm run build\n \n\n- [ ] Verify the file exists and mentions tier4Justification` (the field Task 9's tool checks for).\n[ ] Format and commit.","hierarchy":{"lvl0":"Superpowers","lvl1":"200-Provider Onboarding Playbook Implementation Plan","lvl2":"Task 5: Tier 4 — full custom","lvl3":""}},
|
|
11309
11318
|
{"objectID":"df98ed6d6cf1d00a9d892513c4457a942c970d9ba91fb8408896d3673b8f45c6","title":"Task 6: Provider manifest convention","url":"/docs/superpowers/plans/2026-08-15-10-onboarding-playbook#task-6-provider-manifest-convention","content":"Files:\nCreate: docs/provider-integration/manifests/README.md\nCreate: docs/provider-integration/manifests/_example-tier2-catalog.json\nCreate: docs/provider-integration/manifests/_example-tier3-adapter.json\n\nInterfaces:\nProduces: the ProviderManifest shape (documented here as plain JSON, formally typed as a local type ProviderManifest inside tools/verify-provider-onboarding.ts in Task 9 — deliberately not a src/lib/types/ type, see Global Constraints).\nConsumes: nothing from other plans.\n\nThe two example files are prefixed _example- so they can never collide\nwith a real provider's manifest filename (<provider>.json) and so\ntools/verify-provider-onboarding.ts (Task 9), which only looks up\n<enum-member>.json, never mistakes them for real entries.\n[ ] Create the manifests directory and write the README.\n\n \n\n docs/provider-integration/manifests/README.md:\n\n jsonc\n {\n // Must exactly equal the AIProviderName enum value.\n \"provider\": \"cerebras\",\n\n // 2, 3, or 4. (Tier 1 never gets a manifest — see tiers/tier-1-*.md.)\n \"tier\": 2,\n\n // Full PR URL. Leave \"\" until the PR exists, fill in before merge.\n \"addedInPR\": \"https://github.com/juspay/neurolink/pull/1234\",\n\n // YYYY-MM-DD.\n \"addedDate\": \"2026-08-15\",\n\n // Every file this provider's onboarding touched — used for PR review,\n // not machine-checked beyond \"the array exists\".\n \"filesTouched\": [\"src/lib/constants/enums.ts\", \"...\"],\n\n // Must match the section-name prefix used in\n // test/continuous-test-suite-providers-mocked.ts's record(results,\n // \\${section}: ...\\, ...) calls for this provider, e.g. \"LLM cerebras\".\n \"mockedContractSection\": \"LLM cerebras\",\n\n // One of: \"not-tested\" | \"manual-live-tested\" | \"ci-mocked-only\"\n \"manualTestStatus\": \"not-tested\",\n\n // REQUIRED when tier === 4 only. A sentence or two justifying why\n // this couldn't be Tier 2/3. See tiers/tier-4-full-custom.md.\n \"tier4Justification\": \"...\",\n }\n \n\n ## Two worked examples\n\n See ex","hierarchy":{"lvl0":"Superpowers","lvl1":"200-Provider Onboarding Playbook Implementation Plan","lvl2":"Task 6: Provider manifest convention","lvl3":""}},
|
|
11310
11319
|
{"objectID":"f992a1e7d532f86ebc84ec238899de126b887cd6a116619056101ff3fd928860","title":"Task 7: Rewire the existing docs index into the tiered flow","url":"/docs/superpowers/plans/2026-08-15-10-onboarding-playbook#task-7-rewire-the-existing-docs-index-into-the-tiered-flow","content":"Files:\nModify: docs/provider-integration/README.md (decision tree + document index)\nModify: docs/provider-integration/15-adding-llm-provider.md (replace stale 12-file-checklist content with a redirect)\nModify: docs/provider-integration/CHECKLIST.md (§A section, lines 24–71)\nModify: docs/provider-integration/06-testing.md (fix the stale ALL_PROVIDERS reference)\n\nInterfaces:\nConsumes: Tasks 1–6's new files (this task links to them).\nProduces: nothing new consumed by later tasks; this is the \"make the new docs discoverable\" step.\n[ ] Update docs/provider-integration/README.md's decision tree to route the LLM path through the new tiers, and add pointers to the ADRs/manifests. Replace the \"Quick decision tree\" LLM branch:\n\n Find this block (current lines 18–40):\n\n \n\n Replace with:\n\n \n\n And add two rows to the \"How-to guides\" table (after the CHECKLIST.md\n row, before SAFETY-PRIMITIVES.md):\n[ ] Replace docs/provider-integration/15-adding-llm-provider.md's content\n entirely with a short redirect (the old 12-file checklist describes a\n pre-redesign world where every provider needed its own subclass, its\n own providerConfig.ts factory, and 3 separate commandFactory.ts\n edit spots — all superseded by the tiers):\n[ ] Rewrite docs/provider-integration/CHECKLIST.md's §A section (the\n block from ## §A — New LLM provider (12 files) through the line\n before ## §B — New TTS provider (6 files)) to point at the tiers\n instead of repeating the stale 12-file list:\n[ ] Fix docs/provider-integration/06-testing.md's stale\n ALL_PROVIDERS reference. Find:\n\n \n\n Replace with:\n[ ] Verify no file in docs/provider-integration/ still references the\n removed ALL_PROVIDERS array or the stale 12-file checklist framing.\n[ ] Format and commit.","hierarchy":{"lvl0":"Superpowers","lvl1":"200-Provider Onboarding Playbook Implementation Plan","lvl2":"Task 7: Rewire the existing docs index into the tiered flow","lvl3":""}},
|
|
11311
11320
|
{"objectID":"65ff0f6bae8c31ee4879ea362c25bcdbea1e186ce128fd9f69c74f3ffe994248","title":"Task 8: Scaffolding tool — tools/scaffold-provider.ts","url":"/docs/superpowers/plans/2026-08-15-10-onboarding-playbook#task-8-scaffolding-tool-toolsscaffold-providerts","content":"Files:\nCreate: tools/scaffold-provider.ts\nModify: package.json (add scaffold:provider script)\n\nInterfaces:\nProduces: npx tsx tools/scaffold-provider.ts --name=<kebab> --tier=\\<1|2|3|4> --defaultModel=<id> [--baseURL=<url>] [--envVar=<ENV_NAME>] [--aliases=a,b,c] [--out=<dir>], writing generated snippet files to --out (default .scaffold-output/<name>/) and printing the manual checklist to stdout. Never edits real source files — output is copy-paste material for a human, reviewed before landing anywhere.\nConsumes: nothing at runtime from other plans (it generates code shaped like Plan 04/05/07's contracts, it doesn't import them).\n\nThis is a template-string generator with no external dependencies — no unit-test harness needed beyond \"run it and inspect the files it wrote\", per the plan-specific constraint that tools/** isn't type-checked by pnpm run check.\n[ ] Write tools/scaffold-provider.ts:\n[ ] Add the pnpm script. In package.json, next to the existing\n \"test:providers-mocked\" entry:\n[ ] Run the tool for a Tier 2 example and verify it produced the\n expected files.\n[ ] Run it once more for Tier 4 and confirm tier4Justification appears\n in the generated manifest (proves the tier-branching logic).\n[ ] Run it once more for Tier 1 and confirm no code-change artifacts are\n generated (proves the Tier-1 short-circuit in main() and\n manualChecklist()).\n[ ] Clean up the scratch output before committing (it's a local\n demonstration, not part of the repo) and add .scaffold-output/ to\n .gitignore.\n[ ] Format and commit.","hierarchy":{"lvl0":"Superpowers","lvl1":"200-Provider Onboarding Playbook Implementation Plan","lvl2":"Task 8: Scaffolding tool — tools/scaffold-provider.ts","lvl3":""}},
|