Skills Framework (Français)
Agent Skills et Omni Skills
Section intitulée « Agent Skills et Omni Skills »OmniRoute dispose de deux systèmes de compétences distincts, mais complémentaires :
| Dimension | Omni Skills (ce document) | Agent Skills |
|---|---|---|
| Objectif | Injection d’outils LLM + exécution dans un bac à sable | Catalogue SKILL.md permettant aux agents externes de découvrir et d’utiliser les compétences |
| Source de vérité | src/lib/skills/ + marketplace |
src/lib/agentSkills/ + répertoire skills/ |
| Mode d’exécution | Injectées dans les requêtes sortantes, exécutées lors des événements d’appel d’outil | Catalogue Markdown statique + points de terminaison de découverte REST/MCP/A2A |
| Utilisateurs | OmniRoute lui-même (routage combiné, appels LLM entrants) | Agents externes, clients MCP, orchestrateurs A2A |
| Nombre | Variable (déterminé par la marketplace) | 45 entrées de catalogue (23 API + 21 CLI + 1 configuration) |
| Format | SkillDefinition avec schéma d’outil + gestionnaire |
Frontmatter SKILL.md + corps Markdown |
| Découverte | REST /api/skills/* + outils MCP omniroute_skills_* |
REST /api/agent-skills/* + outils MCP omniroute_agent_skills_* + list-capabilities A2A |
Les Omni Skills constituent le moteur d’exécution — elles définissent ce qu’OmniRoute peut faire lorsqu’un LLM invoque un outil.
Les Agent Skills constituent le catalogue de documentation — elles expliquent aux agents externes comment utiliser l’API REST et la CLI d’OmniRoute, au moyen de fichiers SKILL.md structurés pouvant être directement intégrés aux prompts des agents.
Pour en savoir plus sur le catalogue Agent Skills, le générateur, les outils MCP et la compétence A2A, consultez docs/frameworks/AGENT-SKILLS.md.
Concepts
Section intitulée « Concepts »Sources des compétences
Section intitulée « Sources des compétences »Trois sources de compétences coexistent dans le même registre :
- Compétences intégrées (
src/lib/skills/builtins.ts) — fournies avec OmniRoute. Elles couvrent les cas courants :file_read,file_write— espace de travail en bac à sable propre à chaque clé API sous<DATA_DIR>/skills/workspaces/<hashed-key>/http_request— requêtes HTTP sortantes viasafeOutboundFetchavecguard: "public-only"web_search— fournisseur de recherche interchangeable avec mise en cache (executeWebSearch)eval_code— exécution denodeoupythondans un bac à sable Dockerexecute_command— commande shell exécutée dans un bac à sable Dockerbrowser— infrastructure reposant sur Playwright, désactivée par défaut (builtin/browser.ts)
- SkillsMP (la marketplace OmniRoute) — récupérées depuis
https://skillsmp.com/api/v1/skills/search. NécessiteskillsmpApiKeydans les paramètres. - SkillsSH (catalogue communautaire
skills.sh) — récupérées depuishttps://skills.sh/api/search. Aucune authentification requise ; le contenu SKILL.md est récupéré depuis les fichiers bruts de GitHub.
Un unique « fournisseur actif » détermine le catalogue depuis lequel le tableau de bord effectue les installations (src/lib/skills/providerSettings.ts). Changez-le sous Paramètres → Mémoire et compétences. Valeur par défaut : skillsmp.
Identité des compétences
Section intitulée « Identité des compétences »Les compétences sont indexées par name@version dans le registre en mémoire (src/lib/skills/registry.ts). La version doit respecter semver (^\d+\.\d+\.\d+$). resolveVersion() prend en charge les contraintes ^, ~, >, >=, <, <=, == et les correspondances exactes.
Mode des compétences
Section intitulée « Mode des compétences »Chaque compétence possède un mode d’exécution qui détermine quand elle est injectée :
| Mode | Comportement |
|---|---|
on |
Toujours injectée sous forme de définition d’outil |
off |
Jamais injectée, jamais exécutable |
auto |
Évaluée par rapport à la requête entrante ; injectée uniquement si le score ≥ AUTO_MIN_SCORE (3 par défaut) |
auto est le mode par défaut des compétences installées depuis la marketplace. La combinaison enabled=true et mode="off" signifie « enregistrée mais inactive » — basculer enabled via l’ancienne colonne met également à jour mode afin que les anciens chemins de code restent cohérents (src/app/api/skills/[id]/route.ts).
Statut (exécutions)
Section intitulée « Statut (exécutions) »Les exécutions de compétences sont suivies dans la table skill_executions avec les statuts suivants (src/lib/skills/types.ts) :
enum SkillStatus { PENDING = "pending", RUNNING = "running", SUCCESS = "success", ERROR = "error", TIMEOUT = "timeout",}Cache du registre
Section intitulée « Cache du registre »SkillRegistry est un singleton doté d’un cache avec une durée de vie de 60 secondes (registry.ts:14). loadFromDatabase() est idempotente et déduplique les appels simultanés via pendingLoad. Toute écriture (register/unregister/unregisterById) invalide le cache. Recherchez les versions au moyen de getSkillVersions(name) et resolveVersion(name, constraint).
Injection adaptée au fournisseur
Section intitulée « Injection adaptée au fournisseur »injectSkills() dans src/lib/skills/injection.ts est le point d’entrée qui transforme les compétences enregistrées en définitions d’outils propres à chaque fournisseur :
- OpenAI —
{ type: "function", function: { name, description, parameters } } - Anthropic —
{ name, description, input_schema } - Google (Gemini) —
{ name, description, parameters }
Le nom de l’outil est encodé sous la forme name@version afin que le gestionnaire puisse sélectionner la bonne version lorsque le modèle le rappelle.
Évaluation AUTO
Section intitulée « Évaluation AUTO »Lorsque mode="auto", chaque compétence candidate est évaluée par rapport au contexte de la requête (scoreAutoSkill() dans injection.ts) :
| Signal | Points |
|---|---|
| Le nom de la compétence apparaît tel quel dans le contexte | +6 |
| Chaque jeton du nom correspond à un jeton du contexte | +2 |
| Chaque sous-chaîne d’une étiquette correspond au contexte | +3 |
| Chaque jeton de la description correspond au contexte | +1 |
| Le motif d’arrière-plan correspond à un jeton du nom | +2 par jeton |
| Le motif d’arrière-plan correspond à une étiquette | +2 par jeton |
| L’indication du fournisseur dans les étiquettes correspond au fournisseur de la requête | +2 / −2 |
Les AUTO_MAX_SKILLS = 5 meilleures compétences ayant un score >= AUTO_MIN_SCORE = 3 sont injectées. Les égalités sont départagées par installCount (ordre décroissant), puis par nom alphabétique (injection.ts:225-235).
Interception des appels d’outils
Section intitulée « Interception des appels d’outils »handleToolCallExecution() dans src/lib/skills/interception.ts est invoquée par le gestionnaire de discussion après que le fournisseur en amont a renvoyé une réponse contenant un appel d’outil :
extractToolCalls()lit les structures propres à chaque fournisseur (OpenAItool_calls/ Responsesfunction_call, Anthropictool_use, GeminifunctionCalls).- Les alias d’outils intégrés (par exemple,
omniroute_web_search→web_search) sont d’abord résolus. Les gestionnaires intégrés s’exécutent directement. - Tout le reste est acheminé via
skillExecutor.execute(name@version, args, { apiKeyId, sessionId }). - Les résultats sont réinsérés dans la réponse — éléments
tool_results, élémentsfunction_call_outputou blocs Anthropictool_result, selon le cas.
customSkillExecutionEnabled dans le contexte d’exécution peut être défini sur false afin de n’autoriser que l’interception intégrée (utilisé par les chemins de requête qui désactivent explicitement les gestionnaires définis par l’utilisateur).
Bac à sable Docker
Section intitulée « Bac à sable Docker »Les chemins de code non intégrés (eval_code, execute_command) s’exécutent dans Docker via SandboxRunner (src/lib/skills/sandbox.ts). Chaque conteneur est lancé avec :
--rm --network none|bridge --cap-drop ALL--security-opt no-new-privileges --pids-limit 100--cpus <cpuLimit/1000> --memory <memoryLimit>m--tmpfs /tmp:rw,noexec,nosuid,size=64m--tmpfs /workspace:rw,noexec,nosuid,size=64m--read-only (lorsque readOnly=true)Valeurs par défaut (SandboxRunner.DEFAULT_CONFIG) :
| Champ | Valeur par défaut | Remarques |
|---|---|---|
cpuLimit |
100 (= 0,1 CPU) | Divisé par 1000 avant d’être transmis à --cpus |
memoryLimit |
256 MB | Limite stricte |
timeout |
30000 ms | Arrêt progressif via SIGTERM + docker kill |
networkEnabled |
false |
Devient --network none |
readOnly |
true |
FS racine en lecture seule ; /tmp et /workspace sont des tmpfs |
SandboxRunner.kill(id) et killAll() sont exposées pour l’arrêt ; les conteneurs en cours d’exécution sont suivis dans runningContainers: Map<string, ChildProcess>.
Variables d’environnement du bac à sable
Section intitulée « Variables d’environnement du bac à sable »Configurées via process.env dans src/lib/skills/builtins.ts :
| Variable d’environnement | Valeur par défaut | Objectif |
|---|---|---|
SKILLS_MAX_FILE_BYTES |
1048576 (1 MB) |
Limite pour file_read et file_write |
SKILLS_MAX_HTTP_RESPONSE_BYTES |
256000 |
Limite pour le corps de la réponse de http_request |
SKILLS_MAX_SANDBOX_OUTPUT_CHARS |
100000 |
Limite pour stdout/stderr renvoyés à l’appelant |
SKILLS_SANDBOX_TIMEOUT_MS |
10000 |
Délai d’expiration par défaut des commandes isolées ; plafonné à 60 s |
SKILLS_SANDBOX_NETWORK_ENABLED |
false |
Contrôle principal des sorties réseau. Définissez sur 1 ou true pour autoriser l’activation par appel |
SKILLS_ALLOWED_SANDBOX_IMAGES |
(voir ci-dessous) | Liste d’images Docker autorisées, séparées par des virgules |
Images autorisées par défaut : alpine:3.20, node:22-alpine, python:3.12-alpine. Tout ajout via SKILLS_ALLOWED_SANDBOX_IMAGES est fusionné avec les valeurs par défaut ; les images inconnues sont rejetées par normalizeImage().
Remarque : il n’existe aucune variable d’environnement
SKILLS_EXECUTION_TIMEOUT_MSdistincte. Le délai d’expiration du gestionnaire hors bac à sable est codé en dur à 30 s dansSkillExecutor(executor.ts:13), mais peut être remplacé à l’exécution viaskillExecutor.setTimeout(ms).
Isolation de l’espace de travail
Section intitulée « Isolation de l’espace de travail »file_read et file_write résolvent chaque chemin relativement à un espace de travail propre à chaque clé d’API situé dans <DATA_DIR>/skills/workspaces/<sha256(apiKeyId).slice(0,24)>/. La traversée de chemins (..) et les segments interdits (.env, .git, .ssh, .omniroute, .codex, secrets) sont rejetés avant toute E/S disque.
Renforcement de la sécurité HTTP
Section intitulée « Renforcement de la sécurité HTTP »http_request (builtins.ts:257) :
- Liste des méthodes autorisées :
GET, HEAD, POST, PUT, PATCH, DELETE - En-têtes sortants bloqués :
host, connection, content-length, cookie, set-cookie, authorization, proxy-authorization - Redirections désactivées (
allowRedirect: false) - Acheminement via
safeOutboundFetchavecguard: "public-only"(plages privées et de bouclage bloquées) - Réponse tronquée à
SKILLS_MAX_HTTP_RESPONSE_BYTES; le client reçoittruncated: true
Exécuteur hybride (aperçu)
Section intitulée « Exécuteur hybride (aperçu) »src/lib/skills/hybrid.ts définit un HybridExecutor qui choisit entre une exécution direct (dans le processus) et sandbox pour chaque appel, avec un mécanisme de nouvelle tentative autoUpgrade en cas d’expiration du délai ou d’erreur de mémoire. Les implémentations intégrées directExecutor / sandboxRunner sont des stubs (executeDirect, executeInSandbox renvoient des objets temporaires) — considérez ce module comme un contrat en cours de construction. L’exécution réelle passe toujours par skillExecutor + SandboxRunner.
Stockage
Section intitulée « Stockage »Le schéma est défini dans deux migrations :
src/lib/db/migrations/016_create_skills.sql— tables de baseskillsetskill_executions, avec des index sur(api_key_id, name)et(skill_id, status, created_at).src/lib/db/migrations/027_skill_mode_and_metadata.sql— ajoutemode,source_provider,tags(JSON),install_countàskills.
skill_executions.status est soumis à une contrainte au niveau de la base de données : CHECK(status IN ('pending', 'running', 'success', 'error', 'timeout')).
API REST
Section intitulée « API REST »Tous les endpoints se trouvent sous src/app/api/skills/. Les endpoints de gestion (/api/skills, /api/skills/[id], /api/skills/install) nécessitent une authentification de gestion via requireManagementAuth(). Les flux de marketplace et d’installation utilisent la fonction plus légère isAuthenticated() (session ou clé API).
| Endpoint | Méthode | Objectif |
| ——————————— | —— | ———————————————————————— | — | ———————— | –––– | —————— |
| /api/skills | GET | Répertorier les skills enregistrés. Prend en charge ?q=, ?mode=on | off | auto, ?source=skillsmp | skillssh | local, pagination |
| /api/skills/[id] | PUT | Mettre à jour enabled ou mode |
| /api/skills/[id] | DELETE | Désinscrire par identifiant |
| /api/skills/install | POST | Installer un skill personnalisé (code du gestionnaire + schéma) |
| /api/skills/marketplace | GET | Rechercher dans le catalogue SkillsMP (renvoie les choix populaires par défaut lorsque q est vide) |
| /api/skills/marketplace/install | POST | Installer un skill SkillsMP (nécessite que le fournisseur actif soit skillsmp) |
| /api/skills/skillssh | GET | Rechercher dans le catalogue skills.sh (?q=&limit=, limité à 100) |
| /api/skills/skillssh/install | POST | Installer un skill skills.sh (nécessite que le fournisseur actif soit skillssh) |
| /api/skills/executions | GET | Historique d’exécution paginé (?apiKeyId=) |
| /api/skills/executions | POST | Exécuter ponctuellement un skill enregistré |
L’endpoint POST /api/skills/executions renvoie une réponse HTTP 503 avec { error: "Skills execution is disabled..." } lorsque settings.skillsEnabled === false (executor.ts:42-45). Les opérateurs peuvent modifier le commutateur principal depuis Paramètres → IA.
Exemple : installer un skill personnalisé
Section intitulée « Exemple : installer un skill personnalisé »curl -X POST http://localhost:20128/api/skills/install \ -H "Authorization: Bearer $OMNIROUTE_MGMT_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "name": "reverse-text", "version": "1.0.0", "description": "Reverses a string", "schema": { "input": { "type": "object", "properties": { "text": { "type": "string" } }, "required": ["text"] }, "output": { "type": "object", "properties": { "reversed": { "type": "string" } } } }, "handlerCode": "echo-handler", "apiKeyId": "your-api-key-id" }'La chaîne handlerCode est une recherche par nom de gestionnaire — et non du code exécutable. L’exécuteur l’associe via skillExecutor.registerHandler(name, fn) (executor.ts:25). Les installations depuis le marketplace stockent le texte SKILL.md dans ce champ à titre de documentation et acheminent l’exécution par l’intermédiaire d’appels d’outils générés par le modèle. Le code source arbitraire fourni par l’utilisateur n’est pas évalué avec eval.
Outils MCP
Section intitulée « Outils MCP »Quatre outils MCP encapsulent l’interface des compétences (open-sse/mcp-server/tools/skillTools.ts). Ils sont enregistrés automatiquement au démarrage du serveur MCP.
| Outil | Description |
|---|---|
omniroute_skills_list |
Répertorie les compétences, avec filtres facultatifs : apiKeyId, name, enabled |
omniroute_skills_enable |
Active/désactive une compétence via skillId |
omniroute_skills_execute |
Exécute une compétence avec une charge utile d’entrée |
omniroute_skills_executions |
Historique récent des exécutions (50 par défaut, 100 au maximum) |
Consultez MCP-SERVER.md pour la configuration du transport et l’attribution des portées.
Intégration A2A
Section intitulée « Intégration A2A »src/lib/skills/a2a.ts exporte le descripteur de compétence A2A memory_aware_routing et une fonction utilitaire registerA2ASkill(registry). Les compétences A2A personnalisées se trouvent dans src/lib/a2a/skills/ et sont distribuées via A2A_SKILL_HANDLERS (src/lib/a2a/taskExecution.ts). Consultez A2A-SERVER.md pour connaître le cycle de vie complet des tâches.
Ajout d’une nouvelle compétence intégrée
Section intitulée « Ajout d’une nouvelle compétence intégrée »- Définissez le gestionnaire dans
src/lib/skills/builtins.ts(ou dans un fichier voisin soussrc/lib/skills/builtin/). Signature :(input, { apiKeyId, sessionId }) => Promise<output>. - Chemin d’exécution en bac à sable ? Appelez
sandboxRunner.run(image, command, env, sandboxConfig({...})). UtiliseznormalizeImage()avec la liste d’autorisation. - Chemin du système de fichiers ? Faites-le toujours passer par
resolveWorkspacePath(input, context)avant d’accéder au disque. - Appel réseau ? Utilisez
safeOutboundFetchavecguard: "public-only"; assainissez les en-têtes viasanitizeHeaders(). - Enregistrez-la en ajoutant l’entrée à
builtinSkills(ou en appelant une fonction de typeregisterBrowserSkill(executor)au démarrage). - Configurez les alias des outils intégrés (facultatif) dans
BUILTIN_TOOL_ALIASES(interception.ts:23) si le modèle en amont émet un nom différent. - Tests dans
src/lib/skills/__tests__/(Vitest).
Ajout d’une compétence personnalisée (non intégrée)
Section intitulée « Ajout d’une compétence personnalisée (non intégrée) »- Enregistrez le gestionnaire au démarrage du processus :
skillExecutor.registerHandler("my-handler", async (input, ctx) => { ... });
- Insérez la compétence via
POST /api/skills/install(le champhandlerCodedoit correspondre au nom du gestionnaire enregistré). - Basculez
modesuronouautoviaPUT /api/skills/[id].
Conseils opérationnels
Section intitulée « Conseils opérationnels »- Interrupteur principal :
settings.skillsEnabled = falsebloque toute exécution et renvoie une réponse HTTP503sur/api/skills/executions. Le registre continue à se charger. - Verrouillage des sorties réseau : laissez
SKILLS_SANDBOX_NETWORK_ENABLEDnon défini (valeur par défaut) pour une exécution en bac à sable totalement isolée du réseau. La valeurnetworkEnabled: truepar appel nécessite toujours l’activation de l’interrupteur principal. - Autorisation d’images spécifiques : définissez
SKILLS_ALLOWED_SANDBOX_IMAGES="myorg/sandbox:1.0,node:22-alpine"pour étendre la liste d’autorisation. - Audit des exécutions :
/dashboard/skills/executionsetomniroute_skills_executionsinterrogent tous deuxskill_executions. Les exécutions réussies incluentdurationMs; les échecs incluenterrorMessage. - Invalidation du cache : appelez
skillRegistry.invalidateCache()après des modifications manuelles de la base de données ; sinon, attendez 60 s. - Espace de travail anonyme : lorsque
apiKeyIdest vide, tous les appels sont hachés vers le même espace de travail"anonymous"— le code tenant compte du partage doit toujours transmettre une clé réelle.
Cycle de vie de l’exécution (v3.8.16+)
Section intitulée « Cycle de vie de l’exécution (v3.8.16+) »Le SkillExecutor (src/lib/skills/executor.ts) est un singleton qui gère chaque invocation de compétence. Comprendre son cycle de vie est essentiel pour déboguer les délais d’expiration, les nouvelles tentatives et l’état d’exécution.
Le cycle de vie en 5 étapes
Section intitulée « Le cycle de vie en 5 étapes » execute() appelé │ ▼ ┌─────────────┐ │ PENDING │ ← en file d’attente, pas encore démarré (ligne créée en BDD) └──────┬──────┘ │ démarrage du gestionnaire ▼ ┌─────────────┐ │ RUNNING │ ← gestionnaire invoqué avec un délai d’expiration └──────┬──────┘ │ ┌────┴────┬──────────┬──────────┐ │ │ │ │ ▼ ▼ ▼ ▼ SUCCESS ERROR TIMEOUT (aucun autre chemin — arrêté par le parent) │ │ │ └────┬────┴──────────┘ │ ▼ Ligne de BDD mise à jour avec le statut, la sortie et durationMsConfiguration par défaut
Section intitulée « Configuration par défaut »| Paramètre | Valeur par défaut | Configurable via |
|---|---|---|
timeout |
30000 (30 s) |
skillExecutor.setTimeout(ms) |
maxRetries |
3 |
skillExecutor.setMaxRetries(count) |
Important : l’exécuteur est un singleton — appeler
setTimeout()affecte globalement toutes les invocations suivantes. Les délais d’expiration propres à chaque compétence ne sont actuellement pas pris en charge ; si vous avez besoin de délais différents selon la compétence, lancez des processus séparés ou créez un fork de l’exécuteur.
Valeurs de statut
Section intitulée « Valeurs de statut »Depuis src/lib/skills/types.ts :
enum SkillStatus { PENDING = "pending", // En file d’attente, pas encore démarré RUNNING = "running", // Gestionnaire invoqué SUCCESS = "success", // Le gestionnaire a renvoyé une sortie valide ERROR = "error", // Le gestionnaire a levé une exception TIMEOUT = "timeout", // Dépassement du délai d’expiration de l’exécuteur}Remarque : le statut
TIMEOUTest défini dans l’énumération, mais n’est pas réellement écrit dans la BDD par l’implémentation actuelle de l’exécuteur — les délais d’expiration apparaissent commeERRORavec le message"Skill execution timed out". Le statut de l’énumération est réservé à un usage futur.
Inspection des exécutions
Section intitulée « Inspection des exécutions »import { skillExecutor } from "omniroute/skills/executor";
// Obtenir une exécution spécifique par son IDconst exec = skillExecutor.getExecution("exec-uuid-123");if (exec) { console.log(`${exec.skillName}: ${exec.status} in ${exec.durationMs}ms`);}
// Répertorier les exécutions récentes pour une clé d’APIconst recent = skillExecutor.listExecutions("api-key-id", 50, 0);for (const e of recent) { console.log(`${e.skillName} → ${e.status} (${e.durationMs}ms)`);}
// Compter le nombre total d’exécutionsconst total = skillExecutor.countExecutions("api-key-id");Comportement des nouvelles tentatives
Section intitulée « Comportement des nouvelles tentatives »Le paramètre maxRetries est stocké, mais n’est pas actuellement utilisé par la méthode execute() de l’exécuteur — celle-ci n’effectue qu’une seule tentative. La valeur maxRetries est exposée en vue d’une implémentation future et pour les hooks qui souhaitent la lire.
Pour le moment, les nouvelles tentatives doivent être implémentées dans le gestionnaire de la compétence lui-même. Les compétences
intégrées sont enregistrées auprès de l’exécuteur (par exemple, registerBuiltinSkills(executor)
/ registerBrowserSkill(executor) dans src/lib/skills/builtin/) ; tout gestionnaire
que vous enregistrez peut encapsuler sa propre boucle de nouvelles tentatives :
// dans un gestionnaire de compétenceasync function handler(input, ctx) { const maxRetries = 3; let lastError: Error | null = null;
for (let attempt = 1; attempt <= maxRetries; attempt++) { try { return await fetchSomething(input); } catch (err) { lastError = err as Error; if (attempt < maxRetries) { await new Promise((r) => setTimeout(r, 1000 * attempt)); } } } throw lastError;}SkillMode en détail
Section intitulée « SkillMode en détail »L’énumération SkillMode (src/lib/skills/types.ts) détermine quand et comment les compétences sont invoquées :
enum SkillMode { AUTO = "auto", // Le LLM décide quand appeler la compétence MANUAL = "manual", // Invoquée uniquement à la demande explicite de l’utilisateur HYBRID = "hybrid", // Évaluation AUTO + remplacement manuel}Remarque : Le code source définit
SkillMode(AUTO/MANUAL/HYBRID), tandis que le champSkill.modeutilise une structure différente ("on" | "off" | "auto"). Ils sont liés, mais ne sont pas identiques —SkillModeconcerne la politique de l’exécuteur, tandis queSkill.modeconcerne l’activation de chaque compétence.
Quand utiliser chaque mode
Section intitulée « Quand utiliser chaque mode »| Mode | Comportement du LLM | Cas d’utilisation |
|---|---|---|
AUTO |
Le LLM peut appeler la compétence lorsqu’il le juge nécessaire | Compétences à usage général (lecture de fichiers, requêtes HTTP) |
MANUAL |
Le LLM ne peut pas appeler la compétence ; seul un appel explicite à l’API executeSkill l’invoque |
Opérations sensibles (écritures en base de données, paiements) |
HYBRID |
Le LLM peut suggérer la compétence ; l’utilisateur doit confirmer | Compétences ayant des effets de bord, mais qui ne sont pas dangereuses |
Évaluation AUTO
Section intitulée « Évaluation AUTO »Lorsque le mode AUTO est actif, chaque compétence candidate est évaluée par rapport au contexte de la requête
par scoreAutoSkill() dans src/lib/skills/injection.ts — un système additif
de points entiers (correspondance du nom de la compétence, chevauchement des jetons du nom/des étiquettes/de la description,
indices liés aux raisons d’arrière-plan, bonus/pénalité liés aux indications du fournisseur). Les
AUTO_MAX_SKILLS = 5 meilleures compétences ayant un score >= AUTO_MIN_SCORE = 3 sont injectées comme
outils appelables, les égalités étant départagées par installCount, puis par nom. Consultez le tableau complet des points
dans Génération du schéma des outils → Évaluation AUTO, plus haut dans ce
document ; il n’existe aucun seuil décimal de type 0.6 ni aucune évaluation dans registry.ts.
Catalogue des compétences intégrées
Section intitulée « Catalogue des compétences intégrées »OmniRoute est fourni avec un ensemble sélectionné de compétences intégrées dans src/lib/skills/builtin/. Les plus courantes sont les suivantes :
Compétence d’automatisation du navigateur
Section intitulée « Compétence d’automatisation du navigateur »La compétence de navigateur (src/lib/skills/builtin/browser.ts) fournit une automatisation de navigateur sans interface graphique via Playwright/Puppeteer. Elle est implémentée, mais ne figure pas dans le catalogue de compétences par défaut — pour l’utiliser, installez séparément le plugin d’extension de navigateur.
// À activer dans votre configurationconst config: SkillConfig = { enabled: true, mode: SkillMode.MANUAL, // Toujours exiger une invocation explicite allowedSkills: ["browser"], timeout: 60000, // 60 s pour le chargement des pages maxRetries: 1,};Autres catégories intégrées
Section intitulée « Autres catégories intégrées »| Catégorie | Compétences | Mode |
|---|---|---|
| E/S de fichiers | file_read, file_write |
AUTO |
| HTTP | http_request |
AUTO |
| Recherche | web_search |
AUTO |
| Exécution de code | eval_code (JavaScript/Python en bac à sable) |
HYBRID |
| Système | execute_command (exécution CLI en bac à sable) |
MANUAL |
Ajout d’une compétence personnalisée
Section intitulée « Ajout d’une compétence personnalisée »Consultez SDK de plugin et intégration des compétences pour savoir comment ajouter une compétence personnalisée via le système de plugins.
Voir aussi
Section intitulée « Voir aussi »- MCP-SERVER.md — enregistrement des outils MCP et transports
- A2A-SERVER.md — cycle de vie des tâches A2A et répartition des compétences
- USER_GUIDE.md — introduction destinée aux utilisateurs
- ARCHITECTURE.md — pipeline de requêtes et cartographie des composants
- Source :
src/lib/skills/,src/app/api/skills/,open-sse/mcp-server/tools/skillTools.ts - Tests :
src/lib/skills/__tests__/integration.test.ts
HagiCode
HagiCode est un espace de développement agentique qui associe workflows structurés, exécution multi-agent et vues Hero Dungeon.
Transformez vos idées en logiciels utiles grâce à un workflow agentique plus intelligent, rapide et agréable.

- SmartDes workflows structurés transforment une intention en parcours exécutable, de l’idée à la livraison.
- EfficientLes workflows multi-agents font avancer recherche, réalisation et revue en parallèle.
- FunHero Dungeon rend les longues sessions de code plus visuelles et collaboratives.