Intégration de Reasonix 1.x avec DeepSeek V4 : Guide pratique du sélecteur de modèles ACP
Intégration de Reasonix 1.x avec DeepSeek V4 : Guide pratique du sélecteur de modèles ACP
Cet article explique comment basculer Reasonix 1.x, un provider CLI ACP local, vers DeepSeek V4 dans HagiCode. L’essentiel ne réside pas dans “l’intégration” mais dans le changement sémantique majeur entre Reasonix 1.x et 0.x — les paramètres de démarrage ont été réduits à un seul
-model, les identifiants et les politiques ont tous été déplacés versreasonix.toml. Nous allons détailler pas à pas les pièges évités et le chemin de validation.
Contexte
Récemment, quelqu’un a posé une question assez précise : comment intégrer Reasonix 1.x avec deepseek v4 dans HagiCode.
Au premier abord, cela ressemble à un problème de configuration, mais en examinant le code, on découvre qu’il s’agit en fait d’une migration sémantique CLI. Reasonix est un CLI ACP (Agent Communication Protocol) local dans l’écosystème multi Agent Provider de HagiCode. Sa position dans l’architecture à trois couches de HagiCode est claire :
- HagiCode.Libs —
ReasonixProvider,ReasonixOptions, encapsulant le démarrage de processusreasonix acp, la poignée de main ACP, et le mappage des notifications streaming. - hagicode-core —
ReasonixCliProvideradaptateur fin,AIProviderType.ReasonixCli = 12,ReasonixGrain, mappage des paramètres Hero, surveillance de santé. - web — types OpenAPI, mappage visuel, formulaire de configuration Hero, textes multilingues.
L’ensemble de la chaîne d’intégration a déjà été déployé dans la proposition archivée openspec/changes/archive/2026-06-06-integrate-reasonix-agent-provider. La question n’est donc plus “comment intégrer Reasonix dans le système”, mais “une fois intégré, comment basculer le modèle vers DeepSeek V4”.
Le point de basculement clé réside dans le changement sémantique fondamental du bootstrap ACP entre Reasonix 1.x et 0.x. Ce changement détermine directement comment configurer DeepSeek V4. Après tout, une fois la sémantique changée, même si la surface reste similaire, ce n’est plus la même chose.
Suspense mis en suspens : pour rationaliser cette complexité de multi provider et multi modèles, HagiCode a réalisé un design de “conservation des champs, migration sémantique” dans la couche d’adaptation Reasonix, dont j’expliquerai plus tard les raisons de ce choix.
À propos de HagiCode
La solution partagée dans cet article provient de notre expérience pratique dans le projet HagiCode.
HagiCode est un projet d’assistant de code IA qui prend en charge plusieurs Agent Provider locaux/distantes. Le code est open source sur HagiCode-org/site.
Analyse
1.x a réduit les paramètres de démarrage à un seul
Regardons directement ReasonixProvider.BuildCommandArguments :
internal virtual IReadOnlyList<string> BuildCommandArguments(ReasonixOptions options){ var arguments = new List<string> { "acp" }; // Reasonix 1.x reduced ACP bootstrap to a transport-scoped provider selector. AppendOption(arguments, "-model", options.Model); foreach (var argument in NormalizeExtraArguments(options.ExtraArguments)) arguments.Add(argument); return arguments;}Ce commentaire est la clé : 1.x a convergé le démarrage ACP en un “sélecteur de provider scoped par transport”. En langage humain — le seul flag qui a encore du sens au démarrage, c’est -model.
Tous ces vieux flags de l’ère 0.x ont été explicitement filtrés :
private static readonly HashSet<string> FilteredBootstrapFlags = new(StringComparer.OrdinalIgnoreCase){ "-model", "-m", "--model", "-dir", "--dir", "-effort", "--effort", "-budget", "--budget", "-transcript", "--transcript", "-mcp", "--mcp", "-mcp-prefix", "--mcp-prefix", "-yolo", "--yolo", "--dangerously-skip-permissions", "--no-proxy"};Les tests unitaires prouvent également ce point. On passe un tas de legacy flags, la ligne de commande résultante est propre, sans erreur, mais ils sont silencieusement ignorés :
arguments.ShouldBe([ "acp", "-model", "deepseek-v4-flash"]);Les champs ReasonixOptions sont toujours là, mais la sémantique a changé
Il y a ici un design particulièrement intéressant. Dans ReasonixOptions, les champs Effort, BudgetUsd, TranscriptPath, EnableYolo, McpServerSpecs, McpPrefix sont tous conservés, mais chaque commentaire indique honnêtement “Reasonix 1.x ACP no longer accepts … so this value is currently ignored”.
C’est le modèle typique de conservation des champs, migration sémantique : le contrat de l’appelant n’est pas rompu (le code 0.x continue à compiler, peut passer des valeurs), mais à l’exécution ces valeurs sont silencieusement ignorées. Les choses de type policy (permissions, plugins MCP, proxy) sont exigées d’être déplacées vers reasonix.toml.
Pour faire une analogie, c’est comme si l’interrupteur de votre lampe était toujours sur le mur, mais l’électricien a changé le circuit, maintenant l’interrupteur est décoratif, le vrai contrôle lumineux a été déplacé vers le panneau de maison connectée. L’interrupteur n’a pas changé, appuyer dessus ne génère pas d’erreur, mais la lumière ne s’allume pas.
Donc l’action centrale pour intégrer DeepSeek V4 se résume à une phrase : passer l’id du modèle via le sélecteur -model, configurer les identifiants/endpoint dans reasonix.toml.
Comment DeepSeek V4 entre
Dans les tests et README de HagiCode, la série DeepSeek est l’utilisation standard via le champ Model :
var reasonixOptions = new ReasonixOptions{ WorkingDirectory = "/path/to/repo", Model = "deepseek-flash", SessionId = "reasonix-session-123"};Dans les tests, Model = "deepseek-v4-flash" apparaît de manière répétée, correspondant à la ligne de commande générée reasonix acp -model deepseek-v4-flash. L’id de modèle spécifique (deepseek-v4-flash, deepseek-flash, etc.) dépend de votre version Reasonix 1.x installée et des alias de provider enregistrés dans reasonix.toml — après tout, Reasonix lui-même sait le mieux si les alias sont vrais ou faux.
Le répertoire de travail et la reprise de session passent par ACP, pas par les flags CLI
C’est le deuxième changement sémantique de 1.x, qui peut être déroutant. À l’ère 0.x, on utilisait --dir pour spécifier le répertoire de travail, 1.x l’a changé pour passer par session/new / session/load dans le protocole ACP :
var sessionHandle = await sessionClient.StartSessionAsync( workingDirectory, options.SessionId, model: null, // Le choix du modèle est entièrement décidé par -model au démarrage startupCts.Token);Notez que le paramètre model de StartSessionAsync passe null — le choix du modèle est entièrement décidé par -model au démarrage, le niveau session ne surcharge plus le modèle. SessionId reste toujours une indication de continuité native du provider, utilisée uniquement pour reprendre la session.
Solution
Relions l’analyse ci-dessus en un chemin exécutable, en quatre étapes.
Première étape : installer le CLI reasonix
Reasonix est un provider d’installation locale, IsPubliclyInstallable: false, ne peut pas être installé via npm public. Mettez d’abord l’exécutable reasonix dans PATH. Après installation, vérifiez avec la console intégrée HagiCode.Libs :
# Exécuter le scénario Ping, effectuer la poignée de main reasonix acp et rapporter la versiondotnet run --project src/HagiCode.Libs.Reasonix.Console -- --test-provider reasonixSi la poignée de main échoue, c’est probablement l’un des deux cas : soit reasonix n’est pas trouvé dans PATH, soit reasonix.toml n’est pas configuré. Il n’y a pas d’autres raisons.
Deuxième étape : configurer les identifiants DeepSeek V4 dans reasonix.toml
1.x n’accepte plus les flags de démarrage comme --api-key, --base-url, l’endpoint du provider de modèle, la clé, la politique de proxy doivent tous être écrits dans reasonix.toml. Le contenu de configuration comprend approximativement :
- L’endpoint API de DeepSeek V4
- La clé API de DeepSeek
- L’alias que vous voulez exposer au sélecteur
-model(par exempledeepseek-v4-flash)
Les noms de champs spécifiques dépendent de la documentation de votre version Reasonix installée. Côté HagiCode, on ne fait que passer -model deepseek-v4-flash, quant à la façon dont cet alias est résolu en modèle réel, c’est l’affaire de Reasonix — la frontière des responsabilités est bien tracée, personne ne dépasse.
Troisième étape : configurer ProviderConfiguration de HagiCode
La priorité de résolution de ReasonixCliProvider.ResolveModel du backend est : request.Model en priorité, sinon _config.Model :
private string? ResolveModel(AIRequest request){ var model = string.IsNullOrWhiteSpace(request.Model) ? _config.Model : request.Model; return string.IsNullOrWhiteSpace(model) ? null : model.Trim();}Donc dans appsettings ou la configuration runtime, définissez le Model du provider comme l’alias DeepSeek V4 :
{ "AIProvider": { "Providers": { "ReasonixCli": { "Type": "ReasonixCli", "Model": "deepseek-v4-flash", "Settings": {} } } }}Il y a un piège particulièrement facile : dans Settings, on ne peut mettre que des clés dans la liste blanche :
private static readonly IReadOnlyList<string> SupportedSettingKeys =[ "effort", "budgetUsd", "transcriptPath", "enableYolo", "arguments", "startupTimeoutMs", "reasoning"];ValidateConfigurationOverrides rejettera directement les clés hors liste blanche. Et ces clés sont en grande partie ignorées dans 1.x (correspondant aux champs ignorés dans ReasonixOptions), donc ne mettez jamais les identifiants DeepSeek dans Settings, ce n’est pas leur place, les identifiants vont à reasonix.toml.
Quatrième étape : utiliser la console pour la validation de bout en bout
Une fois configuré, utilisez directement la console Reasonix dédiée pour exécuter la suite complète, en spécifiant explicitement le modèle comme DeepSeek V4 :
# Suite par défaut : quatre scénarios Ping / Simple Prompt / Complex Prompt / Session Resumedotnet run --project src/HagiCode.Libs.Reasonix.Console -- \ --test-provider-full --model deepseek-v4-flash --repo .Les quatre scénarios tous verts, indique que le sélecteur de modèle, la poignée de main ACP, les notifications streaming, la reprise de session sont tous connectés. Verts, et on est rassurés.
Pratique
Comment remplir le formulaire de configuration Hero
Si vous utilisez l’interface professionnelle Hero de HagiCode au lieu de modifier directement appsettings, après avoir sélectionné Reasonix dans HeroCliEquipmentForm, les champs du formulaire sont :
- binary : par défaut
reasonix - model : remplir
deepseek-v4-flash(le champ clé pour basculer vers DeepSeek V4) - effort : none / low / medium / high (1.x ignore, mais l’UI le conserve)
- budgetUsd : nombre (1.x ignore)
- transcriptPath : texte (1.x ignore)
- enableYolo : booléen (1.x ignore, les permissions vont au toml)
- arguments : paramètres supplémentaires passés à ACP
- startupTimeoutMs : par défaut 15000
Ce qui affecte vraiment le comportement de DeepSeek V4 n’est en fait qu’un seul champ model, le reste n’est que décor dans 1.x. C’est aussi l’incarnation du design “conservation des champs, migration sémantique” de HagiCode dans l’UI — le formulaire ne brise pas les habitudes des anciens utilisateurs, mais les champs effectifs convergent.
Liaison et reprise de session
ReasonixCliProvider utilise ConcurrentDictionary<string, string> pour maintenir les liaisons de session, la clé de liaison est calculée à partir de sessionId, répertoire de travail, chemin exécutable et modèle :
var bindingKey = NormalizedAcpCliAdapter.BuildBindingKey( effectiveRequest.CessionId, options.WorkingDirectory, options.ExecutablePath, options.Model);Cela signifie que si la même session change de modèle en cours de route, la clé de liaison change, elle sera traitée comme nouvelle session. Donc après avoir intégré DeepSeek V4, maintenez l’alias de modèle stable pendant tout le cycle de vie de la session, sinon la reprise sera interrompue. Je l’ai testé et appris à mes dépens, je m’en souviens encore.
Surveillance et dégradation
Reasonix utilise la stratégie Provider (pas Grain) dans AgentCliMonitoringRegistry, après tout il peut ne pas être installé :
new AgentCliMonitoringDescriptor{ CliId = "reasonix", DisplayName = "Reasonix", ProviderType = AIProviderType.ReasonixCli, Strategy = Provider, // ping-based, découverte via PATH ExecutableCandidates = ["reasonix"]}Le contrôle de santé frontend affichera si Reasonix est disponible. Si reasonix n’est pas dans PATH, l’UI doit dégrader gracieusement en “indisponible” — cette logique est déjà intégrée, pas besoin de s’inquiéter.
Quelques points d’attention pratiques
- Authenticité des alias de modèle :
deepseek-v4-flashdoit être un alias réellement enregistré dansreasonix.toml, sinon la poignée de main ACP passe mais l’envoi de prompt échouera. Vérifiez d’abord avec la console avant de passer à Hero, ne cherchez pas à économiser du temps. - N’utilisez pas
argumentspour passer les legacy flag :NormalizeExtraArgumentsfiltrera--effort,--budgetetc., passer est inutile, purement futile. - Les identifiants sont seulement dans toml : clé API, endpoint, proxy, plugins MCP tous dans
reasonix.toml, la liste blanche Settings côté HagiCode n’a pas ces champs du tout. - startupTimeoutMs ajustable : si le démarrage à froid de DeepSeek V4 est lent, augmentez
startupTimeoutMsdu défaut 15000, ce champ est reconnu en 1.x. - Le système économique va au bucket claude : le frontend
resolveEconomicSystemByExecutorTypemappe Reasonix au bucket'claude', purement affichage, n’affecte pas la facturation.
Un chemin de validation minimal
Si vous voulez juste confirmer le plus rapidement possible que DeepSeek V4 fonctionne, sans toucher l’UI Hero :
- Installer reasonix, configurer
reasonix.toml(endpoint DeepSeek + clé + alias) ReasonixCli.Model = "deepseek-v4-flash"dansappsettings- Exécuter
dotnet run --project src/HagiCode.Libs.Reasonix.Console -- --test-provider-full --model deepseek-v4-flash - Les quatre scénarios tous verts, intégration terminée
Conclusion
Revenons à la question initiale — “comment intégrer reasonix 1.x pour utiliser deepseek v4”.
La réponse se résume à une phrase : passer l’alias de modèle via le sélecteur -model, configurer les identifiants et politiques dans reasonix.toml, ne comptez pas sur les flags CLI.
Mais derrière cette phrase se cache une convergence sémantique assez radicale de Reasonix 1.x : les paramètres de démarrage réduits à seulement -model, le répertoire de travail et la reprise de session déplacés dans le protocole ACP, toutes les politiques descendues vers toml. La couche d’adaptation HagiCode n’a pas résisté à ce changement, mais a choisi la route douce “conservation des champs, migration sémantique” — l’ancien code continue à compiler, peut passer des valeurs, silencieusement ignoré à l’exécution, convergeant les interrupteurs effectifs vers un seul -model.
L’avantage de ce compromis est une migration fluide, le coût est que la documentation doit être claire — c’est aussi le sens de cet article. Souvenez-vous de trois choses :
- Le modèle passe par
-model, DeepSeek V4 c’est-model deepseek-v4-flash - Les identifiants passent par toml, ne les mettez pas dans Settings
- Ne changez pas de modèle dans la session, la clé de liaison change, la reprise est interrompue
HagiCode a choisi de concevoir ainsi la couche d’adaptation Reasonix, essentiellement parce qu’elle doit accueillir simultanément plusieurs providers, plusieurs versions de modèles, plusieurs formes de déploiement. Cette complexité multilingue, multi-plateforme est précisément la raison directe pour laquelle nous avons affiné à plusieurs reprises la stratégie d’adaptation provider dans HagiCode.
Références
- Implémentation du Provider Reasonix :
repos/Hagicode.Libs/src/HagiCode.Libs.Providers/Reasonix/ReasonixProvider.cs - Sémantique des champs Reasonix Options :
repos/Hagicode.Libs/src/HagiCode.Libs.Providers/Reasonix/ReasonixOptions.cs - Adaptateur fin backend :
repos/hagicode-core/src/PCode.ClaudeHelper/AI/Providers/ReasonixCliProvider.cs - Archive de proposition d’intégration :
openspec/changes/archive/2026-06-06-integrate-reasonix-agent-provider - Spec backend :
openspec/specs/reasonix-backend-integration/spec.md - Tests unitaires (incluant les cas deepseek-v4-flash) :
repos/Hagicode.Libs/tests/HagiCode.Libs.Providers.Tests/ReasonixProviderTests.cs - Site officiel HagiCode : hagicode.com
Conclusion
Autour de “Intégration de Reasonix 1.x avec DeepSeek V4 : Guide pratique du sélecteur de modèles ACP”, une façon plus sûre de progresser est d’abord faire passer progressivement les configurations clés, les frontières de dépendances et les chemins de déploiement, puis compléter les détails d’optimisation.
Une fois les objectifs, les étapes et les points de validation clairs, ce type de solution peut généralement entrer plus facilement dans la livraison réelle.
开始使用 HagiCode
一次安装,几分钟上手
HagiCode for Windows 在 Microsoft Store 免费提供。打开商店即可安装并保持更新;也可以先对比各版本与定价,再决定从哪个渠道开始。