GitHub Copilot
GitHub
Chat and agent in VS Code. Add Actualyze as a Custom Endpoint provider and pick your models in the chat model picker.
VS Code's chat and agent can use your own models through its bring-your-own-key support. Actualyze connects as a Custom Endpoint provider: you enter your API key once, then list the Actualyze models you want in chatLanguageModels.json. They show up in the chat model picker next to the built-in Copilot models.
This covers chat, agent mode and VS Code's background utility tasks. Inline suggestions (code completions), semantic search and embedding-based features keep using GitHub's service.
Before you start
- An Actualyze API key with the inference scope and read-write permission. Workspace Admins, Members and FinOps Managers who belong to a team can create one: in the Actualyze app, select API Keys under ADMIN in the sidebar (every role that can hold keys sees this page, not only admins), then select Create API Key. Keep the default Read & Write permission. The key's budget is the one your VS Code chat usage draws down.
- The IDs of the models you want: catalog model IDs or Virtual Model slugs. VS Code doesn't read the model list from Actualyze, so for each one also note its context window, output limit, tool calling and image support. They're in the Model Catalog, and in the
context_,window max_,output_ tokens capabilities.tool_anduse capabilities.visionfields ofGET /.openai/ v1/ models - On Copilot Business or Enterprise, your administrator must allow the Bring Your Own Language Model Key in VS Code policy. If it's disabled, the Custom Endpoint option isn't available to you.
Models you add this way work without a GitHub account or a Copilot plan.
Install
Install a current release of VS Code. The Custom Endpoint provider is part of VS Code's built-in chat; there is no extra extension to install. If the Chat view is missing, turn off the chat.disableAIFeatures setting.
Connect to Actualyze
- In the Chat view, open the model picker and select Manage Language Models (the gear icon), or run Chat: Manage Language Models from the Command Palette.
- Select Add Models, then Custom Endpoint.
- Enter
Actualyzeas the group name, then your Actualyze API key. - Choose the API type Chat Completions.
- VS Code opens
chatLanguageModels.jsonwith an entry for the group. Fill in themodelsarray and save:
[
{
"name": "Actualyze",
"vendor": "customendpoint",
"apiKey": "${input:chat.lm.secret.1a2b3c4d}",
"apiType": "chat-completions",
"models": [
{
"id": "<model-id>",
"name": "Display name",
"url": "https://app.actualyze.ai/openai/v1/chat/completions",
"toolCalling": true,
"vision": false,
"contextWindow": 200000,
"maxOutputTokens": 64000
}
]
}
]idis the model ID VS Code sends: a catalog model ID or Virtual Model slug, exactly as Actualyze lists it.- Leave the
apiKeyvalue as VS Code wrote it. It points to the key in VS Code's secret storage; a raw key or a different${input:...}name there leaves requests without a key. To change the key, select the gear icon next to the Actualyze group in the Language Models editor. urlis the full endpoint URL, including/. VS Code uses a URL that already contains an API path as-is.chat/ completions - Set
contextWindowandmaxOutputTokensto the model's real values. VS Code derives the input limit as the difference. - Set
toolCallingandvisionto match the model'scapabilities.tool_anduse capabilities.vision.
Repeat the entry in models for each model you want. If a model doesn't appear in the picker after you save, restart VS Code. VS Code's docs also describe a provider-level url that discovers models automatically; as of VS Code 1.141 it adds no models from Actualyze, so list them in models.
Responses and Messages
The Custom Endpoint provider can also speak the Responses API and the Anthropic Messages API. Set apiType on the model entry and use the matching URL. A model without its own apiType uses the group's, even when its url points elsewhere.
apiType | url |
|---|---|
chat-completions | https:// |
responses | https:// |
messages | https:// |
GPT-5-family reasoning models need the Responses API to use tools and reasoning together, so set responses for those. Actualyze handles Responses requests statelessly and rejects previous_, which VS Code otherwise uses to chain follow-up requests. Add "zeroDataRetentionEnabled": true to every responses model so VS Code sends the full conversation each time:
{
"id": "<model-id>",
"name": "Display name",
"apiType": "responses",
"url": "https://app.actualyze.ai/openai/v1/responses",
"zeroDataRetentionEnabled": true,
"toolCalling": true,
"vision": true,
"contextWindow": 400000,
"maxOutputTokens": 128000
}With messages, VS Code sends the key in an x-api-key header, which Actualyze accepts. The model has to be served over the protocol you pick.
Choose a model
Pick an Actualyze model in the chat model picker. In agent mode the picker only shows models with toolCalling: true.
VS Code also runs background utility tasks, such as chat titles and commit messages. When you're signed in to Copilot, those use GitHub's utility models. To run them on Actualyze, or if you use VS Code without a GitHub account, set chat.utilityModel and chat.utilitySmallModel to one of your Actualyze models, or set chat.byokUtilityModelDefault to Main Agent Model so they use the Actualyze model you picked for chat.
Troubleshooting
- No Custom Endpoint option: on Copilot Business or Enterprise, the bring-your-own-key policy is disabled. Ask your administrator.
- Only Auto shows in the picker: the workspace is in Restricted Mode. Trust the workspace.
- A model is missing in agent mode: its entry doesn't have
toolCalling: true. - Every request fails right after setup: check
url. It must be the full endpoint for the model's API type, such ashttps://. If the error is aapp.actualyze.ai/ openai/ v1/ chat/ completions 401and the key works elsewhere, check that theapiKeyline is still the one VS Code wrote, or update the key from the group's gear icon in the Language Models editor. - A GPT-5-family model fails when it uses tools: switch that model to
"apiType": "responses"with the Responses URL. - A
responsesmodel fails after its first reply or tool call with a400aboutprevious_: addresponse_ id "zeroDataRetentionEnabled": trueto that model. 402: a spend limit stopped the request before any model ran, so nothing was charged. The message says which limit: usually the key's budget, or the key's own monthly limit.401: the key was rejected. It may be mistyped, revoked or expired, lack the inference scope, or belong to someone who is no longer on the key's team.403: the request was refused. If the message says read-write permission is required, the key is read-only; create a read-write key. Otherwise your team can't use the model you asked for; check its access in the Model Catalog or pick another.402sayingBudget required: the key's budget was deleted, archived or retired, or you no longer have access to it. Create a new key bound to a budget you can use.- Model not found:
iddoesn't match a catalog model or Virtual Model your workspace serves. 503on amessagesmodel: that model has no route that speaks the Anthropic protocol. Use an OpenAI API type for it, or pick a model that does.
Reference
| Setting | Value |
|---|---|
| Provider | Custom Endpoint ("vendor": "customendpoint") |
apiKey | The secret reference VS Code writes for your Actualyze API key |
apiType | chat-completions, responses or messages |
url | The full endpoint URL for the API type |
id | A catalog model ID or Virtual Model slug |
contextWindow | The model's context window |
maxOutputTokens | The model's output limit |
zeroDataRetentionEnabled | true on every responses model |
Requests you cancel mid-stream still draw down the usage they consumed.
For the full list of model properties, see VS Code's language models documentation. GitHub's bring your own key page covers the plan and policy side.