AVAComplete
A minimal VS Code extension that provides editor inline autocomplete using any user-configured HTTP endpoint. No backend, no gateway, no login, no chat — just prefix/suffix completions.
Quick start
- Install dependencies:
bun install
- Build the extension:
bun run build
- Launch VS Code with the extension in development mode:
/Applications/Visual\ Studio\ Code.app/Contents/Resources/app/bin/code \
--extensionDevelopmentPath=/Path/To/AVAComplete \
/path/to/your/workspace
- Open VS Code settings and configure your endpoint (see Configuration).
Build scripts
| Script |
Description |
bun run typecheck |
Run TypeScript with --noEmit |
bun run build |
Bundle src/extension.ts into dist/extension.js |
bun run watch |
Watch mode for the extension bundle |
bun run package |
Typecheck + production bundle |
bun test |
Run the direct-client smoke tests |
Configuration
All settings live under the avacomplete namespace.
Required settings
| Setting |
Type |
Default |
Description |
avacomplete.endpoint.url |
string |
"" |
Full URL of the autocomplete endpoint |
avacomplete.endpoint.apiKey |
string |
"" |
API key sent as Authorization: Bearer ... |
avacomplete.endpoint.model |
string |
"" |
Model name passed in the request body |
Optional settings
| Setting |
Type |
Default |
Description |
avacomplete.endpoint.temperature |
number |
0.2 |
Sampling temperature |
avacomplete.endpoint.maxTokens |
number |
256 |
Maximum tokens to generate |
avacomplete.endpoint.requestTemplate |
string |
see below |
JSON request body template |
avacomplete.endpoint.responsePath |
string |
choices[0].text |
JSON path to the completion text |
avacomplete.endpoint.headers |
string |
"" |
Extra headers as a JSON object |
avacomplete.enableAutoTrigger |
boolean |
true |
Show suggestions automatically |
avacomplete.enableSmartInlineTaskKeybinding |
boolean |
false |
Enable Ctrl+L / Cmd+L manual trigger |
avacomplete.triggerMidWord |
boolean |
false |
Allow autocomplete to trigger while typing inside a word |
avacomplete.triggerInGitignoredFiles |
boolean |
true |
Allow autocomplete to trigger in files matched by .gitignore |
avacomplete.maxPrefixChars |
number \| null |
null |
Maximum characters of prefix sent to the model (null = whole document) |
avacomplete.maxSuffixChars |
number \| null |
null |
Maximum characters of suffix sent to the model (null = whole document) |
avacomplete.logLevel |
string |
INFO |
Log verbosity (DEBUG, INFO, WARN, ERROR, OFF) |
Applying settings
You can configure the extension in two ways:
Via settings.json (recommended for copy-pasting the examples below):
- Open the Command Palette (
Cmd+Shift+P / Ctrl+Shift+P)
- Run Preferences: Open User Settings (JSON)
- Paste the example JSON block inside the top-level object
Via the Settings UI:
- Open Settings (
Cmd+, / Ctrl+,)
- Search for
avacomplete
- Fill in the fields under AVAComplete > Endpoint
Request template
avacomplete.endpoint.requestTemplate is a JSON object. The following placeholders are replaced before the request is sent:
| Placeholder |
Type |
Description |
{prefix} |
string |
Text before the cursor |
{suffix} |
string |
Text after the cursor |
{context} |
string |
Extra context block when context.enabled is true, otherwise empty |
{model} |
string |
Value of endpoint.model |
{temperature} |
number |
Value of endpoint.temperature |
{maxTokens} |
number |
Value of endpoint.maxTokens |
Default template:
{
"prompt": "{context}{prefix}{suffix}",
"model": "{model}",
"temperature": "{temperature}",
"max_tokens": "{maxTokens}"
}
The extension parses the template as JSON, replaces placeholders, then serializes the result. Numeric placeholders must be written as string values ("{temperature}") so the JSON is valid; they are converted back to numbers before sending.
You can opt-in to sending the current selection, clipboard, and recent edits as extra context. This is useful when the backend expects the extra information to live inside the prefix section (e.g., the AVACode [PREFIX]/[SUFFIX] format).
Context settings
| Setting |
Type |
Default |
Description |
avacomplete.context.enabled |
boolean |
false |
Include selection, clipboard, and recent edits as context |
avacomplete.context.prefixTemplate |
string |
see below |
Template for the {context} block. Placeholders: {selection}, {clipboard}, {recentEdits} |
avacomplete.context.maxChars |
number |
1000 |
Maximum characters for recent edits |
avacomplete.context.maxSelectionChars |
number \| null |
null |
Maximum characters of the active selection (null = full selection) |
avacomplete.context.maxClipboardChars |
number \| null |
null |
Maximum characters of the clipboard (null = full clipboard) |
Default prefixTemplate:
### Recent context
- selection: {selection}
- clipboard: {clipboard}
- recent edits: {recentEdits}
Place the {context} placeholder where you want it inside your requestTemplate. For the AVACode backend, put it inside the [PREFIX] section:
{
"avacomplete.context.enabled": true,
"avacomplete.endpoint.requestTemplate": "{\"model\": \"{model}\", \"messages\": [{\"role\": \"user\", \"content\": \"[PREFIX]{context}{prefix}[SUFFIX]{suffix}\"}], \"temperature\": \"{temperature}\", \"max_tokens\": \"{maxTokens}\"}"
}
Response path
avacomplete.endpoint.responsePath tells the extension where the completion text lives in the JSON response. Use dot notation and bracket indexes.
| Provider style |
Response path |
| OpenAI Completions |
choices[0].text |
| OpenAI Chat Completions |
choices[0].message.content |
| Custom object |
completions[0].data.message |
Example configurations
AVACode (Aidia)
{
"avacomplete.endpoint.url": "https://ava-coding.aidia.it/v1/chat/completions",
"avacomplete.endpoint.apiKey": "aidia-xxxxxxxxxxxx",
"avacomplete.endpoint.model": "ava-autocomplete",
"avacomplete.endpoint.temperature": 0.2,
"avacomplete.endpoint.maxTokens": 1024,
"avacomplete.endpoint.requestTemplate": "{\"model\": \"{model}\", \"messages\": [{\"role\": \"user\", \"content\": \"[SUFFIX]{suffix}[PREFIX]{prefix}\"}], \"temperature\": \"{temperature}\", \"max_tokens\": \"{maxTokens}\"}",
"avacomplete.endpoint.responsePath": "choices[0].message.content"
}
The API key must start with aidia-. Replace the example key with your personal key.
Add {context} before prefix if you want to send extra context:
{
"avacomplete.context.enabled": true,
"avacomplete.endpoint.requestTemplate": "{\"model\": \"{model}\", \"messages\": [{\"role\": \"user\", \"content\": \"[SUFFIX]{suffix}[PREFIX]{context}{prefix}\"}], \"temperature\": \"{temperature}\", \"max_tokens\": \"{maxTokens}\"}"
}
OpenAI Completions
{
"avacomplete.endpoint.url": "https://api.openai.com/v1/completions",
"avacomplete.endpoint.apiKey": "sk-...",
"avacomplete.endpoint.model": "gpt-3.5-turbo-instruct",
"avacomplete.endpoint.temperature": 0.2,
"avacomplete.endpoint.maxTokens": 128,
"avacomplete.endpoint.requestTemplate": "{\"prompt\": \"{prefix}<|fim_middle|>{suffix}\", \"model\": \"{model}\", \"temperature\": \"{temperature}\", \"max_tokens\": \"{maxTokens}\"}",
"avacomplete.endpoint.responsePath": "choices[0].text"
}
OpenAI Chat Completions
{
"avacomplete.endpoint.url": "https://api.openai.com/v1/chat/completions",
"avacomplete.endpoint.apiKey": "sk-...",
"avacomplete.endpoint.model": "gpt-4o-mini",
"avacomplete.endpoint.requestTemplate": "{\"model\": \"{model}\", \"messages\": [{\"role\": \"system\", \"content\": \"Complete the code. Return only the missing code.\"}, {\"role\": \"user\", \"content\": \"Prefix:\n{prefix}\n\nSuffix:\n{suffix}\"}], \"temperature\": \"{temperature}\", \"max_tokens\": \"{maxTokens}\"}",
"avacomplete.endpoint.responsePath": "choices[0].message.content"
}
Ollama
{
"avacomplete.endpoint.url": "http://localhost:11434/api/generate",
"avacomplete.endpoint.model": "codellama:7b-code",
"avacomplete.endpoint.requestTemplate": "{\"model\": \"{model}\", \"prompt\": \"{prefix}<FIM>{suffix}\", \"stream\": false, \"options\": {\"temperature\": {temperature}}}",
"avacomplete.endpoint.responsePath": "response"
}
Commands
| Command |
Default keybinding |
Description |
avacomplete.generateSuggestions |
Ctrl+L / Cmd+L (when enabled) |
Manually trigger a suggestion |
avacomplete.cancelSuggestions |
Escape |
Hide the current suggestion |
avacomplete.reload |
none |
Reload settings and re-register the provider |
avacomplete.disable |
none |
Turn autocomplete off |
avacomplete.toggle |
none |
Enable or disable autocomplete |
avacomplete.openSettings |
none |
Open the autocomplete endpoint settings |
Status bar indicator
A status bar item named AVA appears at the bottom right of VS Code:
| Icon |
Meaning |
$(warning) AVA |
Endpoint not configured — click to open settings |
$(x) AVA |
Autocomplete disabled — click to enable |
$(check) AVA |
Autocomplete enabled — click to disable |
$(sync~spin) AVA |
Fetching a suggestion — click to cancel |
Hover over the item for a tooltip, and click it to toggle or open settings.
Packaging
To create a .vsix installable extension:
bun run build
npx @vscode/vsce package
Then install the generated .vsix from the VS Code extensions panel.
Troubleshooting
- No suggestions appear: Check that
endpoint.url, endpoint.model, and endpoint.apiKey are set. Open the Extension Host output channel for errors.
- Request fails with 4xx/5xx: Verify the
requestTemplate is valid JSON and matches what the endpoint expects. Test the response path against a sample response.
- VS Code complains about activation: Make sure
bun run build completed and dist/extension.js exists.
Scope notes
- Chat autocomplete, Agent Manager, telemetry, login flows, CLI/TUI autocomplete, and gateway routing were intentionally removed.
- Next Edit is not included in this minimal version; it can be added later as a separate provider.