InfiniAI Provider for VS Code
InfiniAI Provider for VS Code registers InfiniAI as a stable VS Code language model provider and adds an @infiniai diagnostics participant. It uses only public VS Code APIs and does not depend on the standalone github.copilot-chat extension or Copilot private/proposed APIs.
Usage
- Install the extension from the VS Code Marketplace.
- Open VS Code Chat and use the model picker.
- Choose Manage Models..., then add models from the InfiniAI provider.
- Pick the Standard or Coding plan when prompted.
- Enter the matching InfiniAI API key. The key is stored in VS Code Secret Storage.
- Select an InfiniAI model from the model picker.
You can also use @infiniai in Chat for diagnostics:
@infiniai /doctor checks configuration, key presence, endpoint settings, cache state, and the last sanitized provider error.
@infiniai /models lists discovered models and route capabilities from the local cache.
@infiniai /models refresh refreshes model discovery before listing models.
@infiniai /test runs a minimal cancellable health request against the selected/default route.
The participant is diagnostic only. It is not a replacement chat assistant.
Requirements
- VS Code
^1.117.0
- A valid InfiniAI API key from infiniai.ai
- Node.js and npm for local development
The extension uses VS Code's built-in Chat and language model provider APIs. No standalone Copilot Chat extension is required.
Development
This repository uses npm as the only package manager.
npm ci
npm run lint
npx prettier --check .
npm run compile
npm test
npm run build
To run the extension locally:
- Open this repository in VS Code
1.117+.
- Press
F5 to launch the Extension Development Host.
- In the development host, use the model picker to add InfiniAI models or run
@infiniai /doctor.
Activation And Logging
The manifest keeps activation lazy. VS Code automatically activates the extension when its stable language model provider or chat participant contribution is needed, or when infiniai.setApikey is invoked.
Logs are written to a VS Code LogOutputChannel named InfiniAI. The extension redacts secrets, prompts, tool results, image data, auth headers, and full response bodies.
Useful log fields include request id, model id, provider transport, endpoint host/path, HTTP status, retry attempt, elapsed time, streamed bytes, and finish reason.
Configuration
Common settings:
infiniai.plan: Select "standard" or "coding". If unset, routing defaults to "standard" and the key-entry flow prompts for a plan.
infiniai.baseUrl: OpenAI-compatible Standard Plan base URL.
infiniai.anthropic.baseUrl: Anthropic-compatible Standard Plan base URL.
infiniai.coding.baseUrl: OpenAI-compatible Coding Plan base URL.
infiniai.coding.anthropic.baseUrl: Anthropic-compatible Coding Plan base URL.
infiniai.modelDiscoveryUrl: Optional absolute URL for model discovery. Empty uses the selected InfiniAI plan default.
infiniai.modelCacheTtlMs: Model discovery cache TTL in milliseconds. Set 0 to refresh every request.
infiniai.modelRoutes: Optional model routing overrides. Each item supports pattern, transport ("openai", "anthropic", or "vertex"), and optional baseUrl.
infiniai.imageInputModels: Force-enable image input for matching model IDs. Supports * wildcards.
infiniai.disableImageInputModels: Force-disable image input for matching model IDs. Supports * wildcards.
infiniai.retry: Retry policy for retryable network and HTTP failures.
infiniai.delay: Fixed delay between requests, in milliseconds.
Routing precedence:
- User
infiniai.modelRoutes pattern match.
- Explicit InfiniAI model metadata.
- Provider-owned catalog metadata.
- Conservative OpenAI-compatible fallback.
Transport behavior:
- OpenAI-compatible routes call
/chat/completions.
- Anthropic routes call
/v1/messages with x-api-key and anthropic-version.
- Vertex routes call
:streamGenerateContent using the Vertex adapter.
Unsupported endpoint families fail with a clear provider error instead of silently falling back.
Commands
infiniai.setApikey: Set, update, or delete the Standard or Coding plan API key.
Chat participant commands:
@infiniai /doctor
@infiniai /models
@infiniai /models refresh
@infiniai /test
Stable API Policy
This extension intentionally avoids:
enabledApiProposals
src/vscode.proposed.*.d.ts
- Copilot private commands or extension IDs
configurationSchema
modelConfiguration
chatParticipantAdditions
defaultChatParticipant
languageModelProxy
LanguageModelThinkingPart
Debugging
If InfiniAI models do not appear:
- Run
@infiniai /doctor.
- Check the
InfiniAI output channel.
- Confirm that the correct plan key is stored with
infiniai.setApikey.
- Check
infiniai.modelDiscoveryUrl and route overrides.
- Run
Developer: Reload Window and retry model discovery.
Troubleshooting
Upgrade From An Older Version
VS Code may leave older extension version folders on disk, but it scans installed extensions by identifier and loads the latest valid version. Old proposed API files or old source files should not affect this release because the VSIX packages only compiled runtime files from out/.
Persistent VS Code state can still affect upgraded installs:
- API keys in Secret Storage are preserved:
infiniai.apiKey and infiniai.codingApiKey.
- User/workspace settings are preserved, including
infiniai.plan, base URLs, infiniai.modelDiscoveryUrl, and infiniai.modelRoutes.
- Already-open windows may keep the old extension host running until reload.
After upgrading, run:
@infiniai /doctor
@infiniai /models refresh
If the diagnostics show an unexpected endpoint, plan, or route override, reset the corresponding infiniai.* setting and reload the window.
No Models Appear
Check these in order:
- Run
InfiniAI: Set InfiniAI API Key and confirm the key is stored for the active plan.
- Run
@infiniai /doctor and verify the active plan, key presence, discovery endpoint, and last error.
- Clear
infiniai.modelDiscoveryUrl unless you intentionally use a custom discovery endpoint.
- Temporarily clear
infiniai.modelRoutes to rule out a bad route override.
- Run
Developer: Reload Window, then @infiniai /models refresh.
Requests Fail For Anthropic Or Vertex Routes
Route overrides are exact product behavior. If a route is forced to anthropic, the extension sends /v1/messages; if it is forced to vertex, the extension sends :streamGenerateContent. Make sure the configured baseUrl matches the selected transport.
For a quick isolation test, remove the matching item from infiniai.modelRoutes and let the extension fall back to model metadata or the OpenAI-compatible route.
Logs Need To Be Shared
Use the InfiniAI output channel, but redact before sharing. Logs are designed to avoid API keys, prompts, tool results, image data, auth headers, and full response bodies. Still review them for organization-specific endpoint names or model IDs.
Contributing
Issues and pull requests are welcome:
See CONTRIBUTE.md for architecture and release guardrails.
License
MIT License