Accueil › IA locale › OpenCode en local
OpenCode, un agent de code qui reste chez moi.
Un modèle ne sait que lire du texte et en écrire. Pour qu'il lise vos fichiers, lance les tests ou cherche sur le web, il faut un programme autour de lui : le harness. J'installe et je teste OpenCode, un harness open source, entièrement sur mon serveur IA.
Aucun compte, aucune URL publique, aucun prompt qui part chez un tiers. Voici comment il fonctionne, comment je l'ai installé et ce que je vérifie.
- OpenCode
- Ollama
- Qwen3-Coder-Next
- SearXNG via MCP
- RTX 3090 Ti · 24 Go
- Ubuntu 24.04 LTS
Un harness, c'est quoi ?
Le modèle, c'est le cerveau. Le harness, ce sont ses mains et ses yeux : il décide ce que le modèle voit, quels outils il peut utiliser, et ce qu'il a le droit de toucher.
- Le harness · OpenCodeIl fait travailler le modèle
Il choisit le contexte envoyé, donne les outils, exécute les actions et relance tant que la tâche n'est pas finie.
outilsbouclepermissionsMCP - Le modèle · OllamaIl lit et il écrit
Il reçoit du texte, il rend du texte, ou une demande d'outil : « lis ce fichier », « lance les tests ».
Qwen3-Coder-NextQwen3API OpenAI - Le matériel · GPUIl fixe les limites
La VRAM décide de la taille du modèle et de la longueur du contexte qu'on peut lui donner.
RTX 3090 Ti24 GoOCuLink
- Même modèle, résultats différentsSur la même carte graphique, un modèle peut réussir une tâche dans un harness et la rater dans un autre. Ce qui change, c'est la façon dont on le fait travailler.
- En local, ça compte encore plusUn modèle local est plus petit et sa fenêtre de contexte plus courte qu'un grand service en ligne. Chaque jeton envoyé doit servir, et le harness doit le recadrer quand il s'égare.
- Pourquoi OpenCodeOpen source, dans le terminal, il accepte n'importe quelle API compatible OpenAI, donc Ollama. Il gère les outils, deux modes (préparer ou modifier) et les serveurs MCP. Et il tourne sans compte.
Comment l'agent travaille
Un agent de code, c'est une boucle. Le modèle ne touche jamais vos fichiers lui-même : il demande, OpenCode exécute, puis lui renvoie le résultat.
- Vous donnez une consigne« Ajoute la validation du DTO CreateOrder et fais passer les tests. »
- OpenCode prépare le contexteSes instructions, votre consigne, les fichiers déjà lus et la liste des outils disponibles partent vers le modèle.
- Le modèle demande un outilIl ne répond pas encore : il demande de lire
CreateOrder.cs, de chercher un nom ou de lancerdotnet test. - OpenCode exécute, avec votre accordLecture, modification ou commande, sur le projet. Chez moi, chaque modification et chaque commande attendent mon feu vert.
- Le résultat revient au modèleLe contenu du fichier ou la sortie des tests rejoint le contexte. Le modèle décide de la suite, jusqu'à la réponse finale.
Tout reste sur mon réseau
C'était la condition de départ : faire comme un grand assistant de code en ligne, mais sans que rien ne sorte de chez moi, sauf quand je le demande.
- Pas d'URL publiqueL'agent n'est pas exposé sur internet. Pour travailler à distance, je passe par un accès privé et protégé, et je lance OpenCode directement sur le serveur.
- Pas de compte, pas de partageOpenCode tourne sans inscription. Le partage de sessions est désactivé dans la configuration, les mises à jour automatiques aussi : rien ne change sans que je le décide.
- Le modèle chez moiOpenCode parle à Ollama par son API compatible OpenAI, sur
localhost. Les prompts et le code ne quittent pas la machine. - Le web, seulement si je dis ouiLa recherche passe par mon SearXNG, branché comme serveur MCP. La lecture d'une page (
webfetch) demande mon accord à chaque fois.
Le piège n° 1 : la fenêtre de contexte
À chaque tour, tout ce que le modèle doit savoir tient dans une fenêtre de taille fixe, réglée côté Ollama (num_ctx). Pour un simple chat, une petite fenêtre suffit. Pour un agent, elle déborde vite.
Fenêtre courte
Fenêtre relevée à 32k tout tient
Quand les appels d'outils échouent avec un modèle local, la documentation d'OpenCode conseille justement de relever num_ctx dans Ollama, autour de 16k à 32k. Plus de contexte, c'est aussi plus de VRAM : c'est là que les 24 Go de la 3090 Ti servent.
Mon installation, étape par étape
Sur le serveur IA, sous Ubuntu 24.04, avec Ollama et SearXNG déjà en place.
-
Installer OpenCode
Un binaire, installé par le script officiel. Aucun compte demandé : le fournisseur de modèles, c'est mon Ollama.
# Installation, sans compte$ curl -fsSL https://opencode.ai/install | bash$ opencode --version
-
Donner de la place au modèle
Une variante du modèle avec une fenêtre de 32k, pour que les instructions, les outils et les fichiers tiennent ensemble.
# Modelfile : même modèle, fenêtre de 32kFROM qwen3-coder-nextPARAMETER num_ctx 32768 $ ollama create qwen3-coder-next-32k -f Modelfile
-
Brancher OpenCode sur Ollama
Dans
~/.config/opencode/opencode.json: Ollama comme fournisseur, partage et mises à jour automatiques coupés, et une validation demandée avant chaque modification, commande ou lecture web.{ "$schema": "https://opencode.ai/config.json", "provider": { "ollama": { "npm": "@ai-sdk/openai-compatible", "name": "Ollama (local)", "options": { "baseURL": "http://localhost:11434/v1" }, "models": { "qwen3-coder-next-32k": { "name": "Qwen3-Coder-Next 32k", "limit": { "context": 32768, "output": 8192 } } } } }, "model": "ollama/qwen3-coder-next-32k", "share": "disabled", "autoupdate": false, "permission": { "edit": "ask", "bash": "ask", "webfetch": "ask" }}
-
Ajouter la recherche web
SearXNG devient un outil de l'agent grâce à un serveur MCP local. L'agent cherche sur mon moteur, sans pistage, sans clé d'API externe.
// Dans le même opencode.json"mcp": { "searxng": { "type": "local", "command": ["npx", "-y", "mcp-searxng"], "environment": { "SEARXNG_URL": "http://votre-searxng" } }}
-
Travailler à distance, sans rien exposer
Je me connecte au serveur par un accès privé, j'ouvre un terminal dans le projet et je lance l'agent. Je commence en mode plan, qui lit et propose sans rien modifier, puis je passe en mode build pour appliquer.
# Sur le serveur, dans le projet$ cd ~/projets/mon-api$ opencode # Tab : bascule entre plan (lecture) et build (modifications)
Ce que je vérifie
Les mêmes tâches pour chaque harness et chaque modèle, sur du code réel en C#, PHP, SQL et JavaScript. Une tâche est réussie quand le code compile et que les tests passent, pas quand l'outil dit « terminé ».
- Les appels d'outils tiennentLe modèle demande-t-il les bons outils, avec les bons paramètres, du premier coup ? C'est le premier point qui casse avec un modèle local.
- Les modifications sont justesLe bon fichier, au bon endroit, sans réécrire ce qui n'avait rien demandé. Chaque fichier touché sans raison coûte une relecture.
- Il sait s'arrêterAprès une erreur de compilation, il corrige, relance, puis s'arrête. Ni boucle infinie, ni « terminé » trop tôt.
- Plan, puis buildLe plan proposé en lecture seule est-il exploitable ? Le mode build le suit-il vraiment ?
- La recherche aide vraimentQuand il cherche une documentation sur SearXNG, en tire-t-il la bonne information, ou se contente-t-il du premier lien ?
- Le temps et la mémoireTemps jusqu'au résultat, VRAM occupée avec 32k de contexte. Un outil juste mais trop lent ne sera pas utilisé.
| Même modèle, trois harness | Aider | Continue.dev | OpenCode |
|---|---|---|---|
| Où il vit | Terminal | VS Code | Terminal |
| Façon de travailler | Un commit Git par modification | Chat, complétion, modifications guidées | Agent autonome avec outils, en boucle |
| Avant de modifier | Relecture du diff | Validation dans l'éditeur | Mode plan, puis accord par action |
| Outils externes | Limités | Contexte et MCP | MCP : SearXNG chez moi |
| Pour qui | Ceux qui vivent dans Git | Une équipe sous VS Code | Déléguer une tâche entière |
Aucun outil n'arrive dans mes recommandations avant d'être passé par ces tests. Pour un client, je refais l'exercice sur ses propres tâches et sur son matériel avant de conseiller un couple modèle et harness.
Votre agent de code, sur vos machines ?
Je vous installe la même chose : serveur IA, modèle testé sur vos tâches, harness réglé, accès distant sans rien exposer.