Corriger les appels d'outils XML bruts des modèles Ollama dans OpenCode
Cet article porte sur le changement de la taille de contexte par défaut d'un modèle local servi par Ollama. Le but : donner à votre modèle une fenêtre de contexte assez grande pour qu'il cesse de tronquer vos invites et puisse formater correctement les appels d'outils.
Quand vous voyez du texte brut comme <function=explore> ou des balises XML affichées dans OpenCode, le modèle produit du texte simple au lieu de retourner un appel d'outil JSON structuré.
Cela arrive avec Ollama et les modèles Qwen parce qu'Ollama utilise par défaut une fenêtre de contexte de 2 048 ou 4 096 jetons (num_ctx). OpenCode envoie de grandes invites système et des schémas d'outils ; quand la fenêtre de contexte se remplit, Ollama tronque silencieusement l'invite. Résultat : Qwen perd les instructions système sur le format des outils et se rabat sur l'affichage du texte de fonction brut.
L'étape 1 : créer une variante de modèle avec un contexte étendu
Créez une variante de modèle personnalisée dans Ollama qui étend la longueur du contexte à 16 384 ou 32 768 jetons.
- Créez un fichier nommé
Modelfiledans votre terminal :
FROM qwen3-coder
PARAMETER num_ctx 32768
PARAMETER temperature 0.2
Remplacez qwen3-coder par le nom exact de votre modèle de base s'il est différent, comme qwen2.5-coder:7b. Pour une vue d'ensemble plus large sur la configuration des modèles et des Modelfiles Ollama, consultez notre guide complet d'Ollama.
- Construisez la variante de modèle mise à jour :
ollama create qwen3-coder-32k -f Modelfile
Exécutez `ollama list` pour voir vos modèles installés et utilisez le nom exact du modèle Qwen que vous avez déjà téléchargé.
Que fait la température 0.2 ?
Dans Ollama, définir PARAMETER temperature 0.2 dans un Modelfile contrôle l'aléatoire et la créativité des réponses du modèle.
La température fonctionne sur une échelle allant généralement de 0.0 à 1.0 (mais elle peut aller plus haut) :
- Température basse (0.2) : rend le modèle très concentré, déterministe et prévisible. À 0.2, le modèle sélectionne presque toujours les mots statistiquement les plus probables. Cela minimise la variation créative, les écarts hors sujet et les hallucinations.
- Température haute (0.7 à 1.0+) : rend le modèle plus créatif, diversifié et imprévisible, en choisissant des mots moins probables pour introduire de la variété.
Pourquoi 0.2 est idéal pour les tâches de codage et d'agent
Le codage et le travail d'agent sont les meilleurs cas d'usage pour une température basse. Les appels d'outils structurés, les schémas JSON et les noms de fonctions doivent être émis exactement comme définis, donc le déterminisme est une force, pas une limite :
- Des appels d'outils fiables. Une température basse évite que le modèle improvise la syntaxe des appels d'outils, ce qui est tout l'intérêt de la correction décrite dans cet article.
- Une sortie reproductible. La même invite produit le même résultat, ce qui compte quand on compare des exécutions ou qu'on débogue un pipeline.
- Moins d'hallucinations. Avec moins de latitude créative, le modèle reste sur le code et les instructions de son contexte au lieu d'inventer des fonctions ou des arguments.
- Un code plus propre. L'édition et le refactoring bénéficient des jetons les plus probables et conventionnels plutôt que de surprises stylistiques.
Réservez les températures plus élevées au brainstorming, à l'écriture créative ou au jeu de rôle, là où la variété est l'objectif. Pour tout ce qui doit compiler, s'exécuter ou être analysé, gardez 0.2.
L'étape 2 : activer les outils dans OpenCode
Ouvrez ou créez votre fichier de configuration OpenCode dans ~/.config/opencode/opencode.json (ou opencode.jsonc) et assurez-vous que "tools": true est explicitement déclaré pour votre nouveau modèle :
{
"$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-32k": {
"name": "Qwen Coder 32K",
"tools": true
}
}
}
}
}
L'étape 3 : vider le cache OpenCode et relancer
Videz les sessions de fournisseur en cache qui pourraient conserver des invites système tronquées :
rm -rf ~/.cache/opencode
Lancez OpenCode avec Ollama :
ollama launch opencode --model qwen3-coder-32k
ou exécutez opencode directement depuis votre dossier de projet.
Alternative : forcer les instructions du prompt système
Si le modèle affiche encore des balises XML brutes après l'augmentation de la longueur du contexte, ajoutez des instructions système explicites à votre Modelfile pour forcer le respect des schémas d'outils standard :
FROM qwen3-coder
PARAMETER num_ctx 32768
PARAMETER temperature 0.2
SYSTEM """
You are an AI programming assistant.
When executing environment tools (such as explore, edit, or bash), ALWAYS use the exact tool call schema provided in the system prompt.
Do not output raw XML tags like <function=explore> or plain text function calls. Execute tool calls directly.
"""
Reconstruisez le modèle avec ollama create qwen3-coder-32k -f Modelfile et redémarrez OpenCode.
Conclusion
La cause principale est presque toujours une fenêtre de contexte tronquée. Étendre num_ctx restaure les instructions d'outils dont le modèle a besoin pour retourner du JSON structuré au lieu de texte brut.