Couplet
An AI coding assistant for VS Code and Cursor, powered by SAP AI Core.
Chat, inspect, edit, and run commands without leaving your editor.
Features
- Chat with your SAP AI Core deployments, including OpenAI, Claude, Perplexity,
Cohere, Gemini, and other supported providers.
- Read and edit workspace files, search your code, and run development commands.
- Choose between Ask and Auto approval modes for command execution.
- Paste images with
Ctrl+V / Cmd+V for vision-capable models.
- Keep session history, rewind changes, and review touched files.
- Run independent tests, builds, searches, and read-only subagents in parallel.
- Chat without opening a workspace; workspace tools become available when one is opened.
For enhancement requests, email rahul@sharma.so.
Install
You need one file: couplet-<version>.vsix. Pick whichever is easier.
From the editor (no terminal):
- Open the Extensions view (
Cmd/Ctrl+Shift+X).
- Click the
... menu at the top of that panel → Install from VSIX…
- Select the
.vsix file.
- Reload the window when prompted (
Cmd/Ctrl+Shift+P → Developer: Reload Window).
From a terminal:
code --install-extension couplet-0.0.29.vsix # VS Code
cursor --install-extension couplet-0.0.29.vsix # Cursor
Then reload the window.
To upgrade later, install the new .vsix the same way — the version number must
be higher, otherwise the editor keeps the cached copy.
Set up credentials
Everything is entered in the panel; you never have to edit settings.json.
Click the Couplet icon in the activity bar (left edge).
Click the gear icon in the panel header.
Fill in the fields from your SAP AI Core service key:
| Field |
Where it comes from |
| Client ID |
clientid in the service key |
| Client secret |
clientsecret in the service key |
| AI Core base URL |
serviceurls.AI_API_URL |
| Auth URL |
url |
| Resource group |
usually default |
There is no deployment ID to find: Couplet lists the running deployments in
your resource group and resolves the right one from the model you pick.
Click Test connection. It lists your deployments and then sends one
trivial message, so you know credentials, endpoint, and streaming all work
before you start a real task rather than finding out midway through one.
Close settings (✕), pick a model from the composer, and send a message.
The model picker uses the executable and deployment metadata returned by SAP AI
Core. Couplet automatically selects the matching request format for
OpenAI-compatible models (including Perplexity and Mistral), Cohere Chat,
Vertex AI Gemini, AWS Bedrock Claude, and other AWS Bedrock Converse models.
You only need a RUNNING deployment in the selected resource group. Non-chat
deployments such as embeddings or tabular prediction models are reported as
unsupported because this extension is a coding chat client.
The client secret is stored in your OS keychain via the editor's SecretStorage,
not in settings.json. The other values are plain configuration, written to your
user settings so they follow you into every workspace.
Using it
Open Couplet, choose a model, type a request, and press Enter. Couplet handles
the conversation and shows tool activity as it works. Ask it to run independent
tests, builds, or searches in the background when you want parallel progress.
Chat works without a workspace folder. File, shell, and background-job tools
become available as soon as you open a folder.
Paste an image directly into the composer with Ctrl+V / Cmd+V. Images are
previewed before sending and resized automatically when needed.
Safety and storage
Standing approvals
The Always allow option stores a pattern — the program plus a bare
subcommand, so approving npm run build grants npm run, not npm. Four rules
bound it:
- Anything carrying shell metacharacters (
&&, |, ;, backticks, $(, >)
is never eligible, so a grant for npm test can never cover
npm test && curl … | sh.
- Anything the policy treats as destructive or noteworthy —
rm, sudo,
git push, curl, wget, redirects, absolute paths — is never eligible. The
caret simply is not offered.
- Every rule is re-checked when a command is matched, not only when the pattern
was stored, and matching is on the derived pattern rather than a string
prefix.
npmfoo run does not match npm run.
- Neither scope can be reached by a repository. Always allow writes to your
user settings, where you can see and revoke it; Allow in this workspace
is kept in the extension's own per-workspace storage, outside the repo.
couplet.alwaysAllow is honoured only from your user settings — a
workspace value is ignored, so a cloned repository cannot ship a
.vscode/settings.json granting itself permission to run its own commands
unattended.
Keeping the agent away from certain files
Add a .coupletignore to the workspace root, same syntax as .gitignore. Listed
paths are excluded from read_file, search_replace, grep, and list_dir.
.gitignore is honoured too. Note this does not restrict shell commands the
agent runs.
What gets written to your workspace
A .couplet/ directory holding session transcripts (sessions/*.jsonl) and
rewind checkpoints (checkpoints/). Checkpoints contain copies of file contents,
so add .couplet/ to your .gitignore.
Configuration reference
Most people never need these — the settings panel covers the common ones.
| Setting |
Default |
Purpose |
couplet.clientId |
"" |
SAP AI Core client ID |
couplet.aiCoreBaseUrl |
"" |
serviceurls.AI_API_URL from the service key |
couplet.tokenUrl |
"" |
OAuth token URL (url from the service key) |
couplet.resourceGroup |
"default" |
AI Core resource group header |
couplet.apiVersion |
"2024-10-21" |
Inference API version |
couplet.model |
"" |
Model to route to, as name:version; the provider request format is detected from its SAP deployment |
couplet.approvalMode |
"ask" |
ask or auto |
couplet.alwaysAllow |
[] |
Command patterns to run without asking; user settings only |
couplet.contextBudget |
100000 |
Token budget before the transcript is compacted |
The client secret is deliberately absent from this table — it lives in
SecretStorage and has no settings.json key.
There is no deployment ID setting to fill in. Couplet lists the running
deployments in your resource group and picks the one serving your chosen model,
re-resolving automatically if a redeploy issues a new id. If your tenant somehow
exposes a deployment that cannot be discovered, adding "couplet.deploymentId"
to settings.json by hand still pins that id — it is read but intentionally
unlisted, so it never shows up as a setup step.