La façon dont vous communiquez avec la passerelle Crew dépend de l'endroit où votre code s'exécute. Cette page fait correspondre chaque surface à l'API appropriée.
| Où votre code s'exécute | Utilisez |
|---|---|
| Page d'interface du tableau de bord (TypeScript / React) | Hooks @kirocrew/app-sdk (résolus par l'hôte à l'exécution) |
| Application Python, outil CLI ou service | Le paquet kirocrew-client — pip install kirocrew-client |
| Application Node.js / Electron | Appelez directement les points de terminaison REST/WebSocket de la Gateway via fetch() |
Il n'existe aucun paquet npm de client de passerelle TypeScript publié. Les noms de méthodes kirocrew-client ci-dessous décrivent la surface canonique de l'API Gateway — les mêmes points de terminaison que tout client (y compris fetch brut) utilise.
Les pages d'interface du tableau de bord importent des hooks à portée de permission depuis @kirocrew/app-sdk, résolus à l'exécution via la carte d'importation de l'hôte :
import { useAppApi, useAppEvents } from '@kirocrew/app-sdk' function MyPage() { const api = useAppApi() // permission-scoped GET/POST/PUT/PATCH/DELETE useAppEvents('notification', (e) => console.log(e)) // ... }
useAppApi() retourne un client dont les méthodes (get, post, put, patch, del) appellent les points de terminaison de la Gateway listés ci-dessous, à portée de votre liste d'autorisations permissions.api. Les chemins hors portée lancent une erreur. L'hôte injecte l'authentification automatiquement.
| Hook | Retourne | Objectif |
|---|---|---|
useAppApi() | AppApiClient | Client HTTP à portée de permission |
useAppEvents(event, cb) | () => void | S'abonner aux événements WebSocket; retourne une fonction de désabonnement |
useTheme() | Theme | Thème réactif (mode, accent, colorTheme) |
useAppInfo() | AppInfo | Métadonnées de l'application (nom, version, permissions) |
useNavigate() | (path) => void | Naviguer vers les routes Crew |
useNotify() | (text, opts?) => void | Afficher une notification toast |
useNavBadge() | (count) => void | Mettre à jour le compteur du badge de la barre latérale |
useChatLauncher() | LauncherFn | Naviguer vers le clavardage avec un agent et un message facultatifs |
Importez depuis @kirocrew/app-sdk/ui :
Card, CardTitle, Btn, SendBtn, Input, SearchInput, Badge, AimBadge, StatCard, Skeleton, ContentSkeleton, EmptyState, PageHeader, Toggle, InfoTip, SegmentedControl, MarkdownRenderer.
pip install kirocrew-client
Client asynchrone autonome utilisant aiohttp. Aucune dépendance au paquet principal Crew.
from kirocrew_client import CrewClient async with CrewClient(app_name="my-app") as mc: ok = await mc.ping() slots = await mc.list_slots() task_id = await mc.dispatch_agent_async("my-agent", "Analyze ticket T-123") result = await mc.get_task_result(task_id)
CrewClient( base_url="", # default: http://localhost:{KIROCREW_PORT or 5476} token="", # optional for localhost app_name="", # enables app-scoped storage + auto-auth timeout=30, # request timeout seconds max_retries=3, retry_base_delay=1.0, message_length_limit=40000, on_auth_expired=None, # async callback returning new token )
Lorsque app_name est défini et qu'aucune authentification explicite n'est fournie, le client lit automatiquement le secret de l'application depuis ~/.kiro/crew/apps/{name}/.app_secret et l'échange contre un jeton d'authentification à courte durée de vie via POST /api/apps/{name}/token.
Les noms de méthodes ci-dessous utilisent snake_case pour Python; les noms TypeScript sont indiqués pour la lisibilité. Les mêmes points de terminaison sont accessibles via fetch() brut depuis Node ou un navigateur.
| Nom TS | Python | Objectif |
|---|---|---|
authenticate() | authenticate() | Échanger le secret de l'application contre un jeton (appelé automatiquement si appName est défini) |
setToken(token) | set_token(token) | Définir manuellement le jeton d'authentification sur le HTTP et le WebSocket |
| Nom TS | Python | Objectif |
|---|---|---|
ping() | ping() | Vérifier l'accessibilité de la passerelle |
getStatus() | get_status() | Santé de la passerelle (version, temps de disponibilité, slots, fournisseur) |
getSystemInfo() | get_system_info() | Métriques du CPU, de la mémoire et du disque |
| Nom TS | Python | Objectif |
|---|---|---|
createSlot(name, agent?) | create_slot(name, agent="") | Créer une nouvelle session de clavardage |
listSlots() | list_slots() | Lister toutes les sessions actives |
deleteSlot(id) | delete_slot(id) | Supprimer une session |
getSlotHistory(id, limit?) | get_slot_history(id, limit=50) | Obtenir l'historique des messages d'un slot |
sendMessage(id, msg) | send_message(id, msg) | Envoyer un message (valide la longueur, vide automatiquement le contexte en attente) |
| Nom TS | Python | Objectif |
|---|---|---|
connect() | (auto) | Ouvrir la connexion WebSocket |
disconnect() | (auto) | Fermer la connexion WebSocket |
onChatChunk(slotId, cb) | subscribe | Diffuser les fragments de réponse pour un slot |
onChatDone(slotId, cb) | subscribe | Réponse terminée pour un slot |
onNotification(cb) | subscribe | Recevoir des notifications |
onToolCall(cb) | subscribe | Recevoir des événements d'appel d'outil |
onConnectionChange(cb) | subscribe | Changements d'état de connexion |
onRaw(cb) | subscribe | Tous les événements WebSocket analysés |
Toutes les méthodes d'abonnement retournent une fonction de désabonnement.
Types d'événements (liste partielle) : chat_chunk, chat_done, chat_message, chat_error, tool_call, notification, slots, slot_title, dashboard, log, refresh, approval, subagent_done, task_update, task_complete, proactive_notification, app_reload, error.
| Nom TS | Python | Objectif |
|---|---|---|
spawn(task, agent?) | spawn(task, agent="") | Générer un sous-agent en arrière-plan |
spawnMany(tasks, agents?) | spawn_many(tasks, agents=None) | Générer plusieurs sous-agents en parallèle |
listSubagents() | list_subagents() | Lister tous les sous-agents |
getSubagentStatus(id) | get_subagent_status(id) | Obtenir la sortie d'un sous-agent |
| Nom TS | Python | Objectif |
|---|---|---|
addCron(name, opts) | add_cron(name, **opts) | Créer une tâche planifiée |
listCrons() | list_crons() | Lister toutes les tâches cron |
updateCron(id, opts) | update_cron(id, **opts) | Mettre à jour une tâche cron |
removeCron(id) | remove_cron(id) | Supprimer une tâche cron |
pauseCron(id) | pause_cron(id) | Mettre en pause sans supprimer |
resumeCron(id) | resume_cron(id) | Reprendre une tâche mise en pause |
| Nom TS | Python | Objectif |
|---|---|---|
addLesson(rule, cat, scope?) | add_lesson(rule, cat, scope="") | Enregistrer une règle apprise |
listLessons() | list_lessons() | Lister toutes les leçons |
removeLesson(query) | remove_lesson(query) | Supprimer les leçons correspondantes |
| Nom TS | Python | Objectif |
|---|---|---|
sendNotification(text, opts?) | send_notification(text, **opts) | Envoyer via Slack ou le tableau de bord |
listNotifications() | list_notifications() | Lister les notifications |
ackNotifications() | ack_notifications() | Accuser réception de toutes |
| Nom TS | Python | Objectif |
|---|---|---|
approveAction(slot, task) | approve_action(slot, task) | Approuver une action d'outil en attente |
rejectAction(slot, task) | reject_action(slot, task) | Rejeter une action d'outil en attente |
resolveApproval(id, ok) | resolve_approval(id, ok) | Résoudre une approbation par ID |
getApprovalMode() | get_approval_mode() | Obtenir le mode d'approbation actuel |
setApprovalMode(mode) | set_approval_mode(mode) | Définir sur "auto" ou "interactive" |
| Nom TS | Python | Objectif |
|---|---|---|
listModels() | list_models() | Lister les modèles de langage disponibles |
setSlotModel(slotId, model) | set_slot_model(slot, model) | Définir le modèle pour un slot |
| Nom TS | Python | Objectif |
|---|---|---|
listMcpServers() | list_mcp_servers() | Lister les serveurs MCP enregistrés |
registerMcpServer(def) | register_mcp_server(name, cmd, args?, env?) | Enregistrer un serveur MCP |
removeMcpServer(name) | remove_mcp_server(name) | Supprimer un serveur MCP |
registerAppMcp(name, entry) | register_app_mcp(name, ...) | Écrire l'entrée MCP dans ~/.kiro/crew/mcp.json |
unregisterAppMcp(name) | unregister_app_mcp(name) | Supprimer l'entrée MCP |
| Nom TS | Python | Objectif |
|---|---|---|
dispatchAgent(agent, prompt) | dispatch_agent(agent, prompt) | Exécuter l'agent de façon synchrone |
dispatchAgentAsync(agent, prompt) | dispatch_agent_async(agent, prompt) | Exécuter en arrière-plan |
getTaskResult(taskId) | get_task_result(id) | Interroger l'état de la tâche |
| Nom TS | Objectif |
|---|---|
installAgentConfig(name, config) | Installer le JSON de l'agent dans ~/.kiro/agents/ (fusionne mcpServers) |
removeAgentConfig(name) | Supprimer la configuration de l'agent |
installSkill(name, srcDir) | Copier le répertoire du skill vers ~/.kiro/crew/skills/ |
removeSkill(name) | Supprimer le répertoire du skill |
Hooks dans la Gateway uniquement. Ces aides sont disponibles pour les points d'entrée backend.hooks.* qui s'exécutent à l'intérieur du processus de la Gateway. Les processus backend autonomes utilisant kirocrew-client ne reçoivent pas ce contexte.
Les hooks backend reçoivent deux aides sur leur contexte d'application :
| Méthode | Objectif |
|---|---|
ctx.scrub.outbound(text) | Expurger les identifiants et les URL d'exfiltration avant que le contenu ne quitte la machine; retourne le texte nettoyé et les comptes de suppressions |
ctx.audit.record(operation, outcome, resources="", error="") | Ajouter un événement de sécurité attribué à l'application sans exposer de substitution de l'appelant |
Appelez ctx.scrub.outbound avant qu'une application journalise ou transmette du contenu généré par le modèle. ctx.audit.record est au mieux et s'utilise pour les décisions d'accès, les autorisations, les refus et les mutations que l'application doit reconstruire ultérieurement.
Déclarez les extensions d'interface à l'exécution sous contributes dans app.json :
| Champ | Objectif |
|---|---|
contributes.panelTabs | Ajouter des onglets au panneau latéral depuis des modules dans le répertoire ui de l'application |
contributes.fileMenuItems | Ajouter des lignes à point de terminaison aux menus de fichiers, d'arborescence et de dossiers supportés |
contributes.sessionControls | Ajouter jusqu'à deux commandes actives dans le compositeur pour l'application |
L'hôte valide chaque déclaration et monte uniquement les applications activées. Consultez la référence du manifeste pour le schéma de champs complet et les limites.
Un serveur MCP avec interface routé via le stub de la Gateway hérite des couleurs, polices, rayons et ombres actifs du tableau de bord, et reçoit les changements de thème pendant qu'il est monté.
| Nom TS | Python | Objectif |
|---|---|---|
getGatewayConfig(key) | get_gateway_config(key) | Lire une section de configuration de la passerelle |
setGatewayConfig(key, value) | set_gateway_config(key, val) | Écrire une section de configuration de la passerelle |
| Nom TS | Python | Objectif |
|---|---|---|
getAppDataDir() | get_app_data_dir() → Path | Répertoire de données à portée de l'application |
getAppConfig() | get_app_config() | Lire la configuration de l'application via REST |
setAppConfig(config) | set_app_config(cfg) | Écrire la configuration de l'application via REST |
| Nom TS | Python | Objectif |
|---|---|---|
memorySearch(query, topK?) | memory_search(q, top_k=8) | Recherche sémantique en mémoire |
Contexte silencieux en arrière-plan — apparaît au prochain tour initié par l'utilisateur sans déclencher de réponse.
| Nom TS | Python | Objectif |
|---|---|---|
injectContext(slotId, content, opts?) | inject_context(slot, content, ...) | Injecter du contexte (slotId nul = mise en tampon locale) |
flushPendingContext(slotId) | flush_pending_context(slot) | Vider les entrées mises en tampon |
setDefaultSlot(slotId) | set_default_slot(slot) | Vidage automatique lors de sendMessage |
Options : { source?: string, ephemeral?: boolean, maxAge?: number }.
Pour les backends d'applications : vérifier qu'une requête a été signée par le proxy inverse de la passerelle.
| Fonction | Langage | Objectif |
|---|---|---|
verifyProxyRequest(req, appName, opts?) | Node.js | Vérifier le HMAC sur toute requête Node.js |
verify_proxy_request(request, app_name, ...) | Python | Vérifier le HMAC sur toute requête aiohttp / Django / FastAPI |
verify_proxy_request_raw(header, ...) | Python | Vérifier à partir d'une chaîne d'en-tête brute |
La signature est HMAC-SHA256(timestamp:method:/api/path[?query]:sha256(body)) avec le secret de l'application comme clé. Les horodatages doivent se situer dans une plage de ±60 s par rapport à maintenant. Utilise une comparaison à temps constant.
Pour les opérations de cycle de vie des applications au-delà des enveloppes du client :
| Méthode | Chemin | Objectif |
|---|---|---|
| GET | /api/apps | Lister toutes les applications installées |
| GET | /api/apps/registry | Lister les applications disponibles depuis le registre |
| GET | /api/apps/blob?repo=&path=&ref= | Proxy des images depuis le dépôt git d'une application du registre |
| POST | /api/apps/install | Installer depuis un chemin local |
| POST | /api/apps/register | Enregistrer une application autogérée |
| POST | /api/apps/registry/install | Installer depuis le registre |
| GET | /api/apps/{name} | Obtenir les détails de l'application |
| GET | /api/apps/{name}/manifest | Obtenir le manifeste de l'application |
| GET / PUT | /api/apps/{name}/config | Lire / écrire la configuration de l'application |
| POST | /api/apps/{name}/update | Mettre à jour l'application installée |
| POST | /api/apps/{name}/uninstall | Désinstaller l'application |
| POST | /api/apps/{name}/enable | Activer l'application |
| POST | /api/apps/{name}/disable | Désactiver l'application |
| POST | /api/apps/{name}/dev | Basculer le mode développement (corps {"enabled": bool}) |
| POST | /api/apps/{name}/open | Lancer l'application via openCommand |
| GET | /apps/{name}/ui/{path} | Servir les fichiers du module d'interface de l'application |
| * | /apps/{name}/api/{path} | Proxy inverse vers le backend de l'application (signé HMAC) |
kirocrew-client fournit également deux aides pour l'automatisation de l'installation.
Valider et sérialiser app.json :
from kirocrew_client import AppManifest m = AppManifest.from_dict({"name": "my-app", "version": "1.0.0", ...}) errors = m.validate() # list[str] — empty if valid data = m.to_dict()
Gérer l'installation de l'application via l'API REST de la Gateway :
from kirocrew_client import CrewClient, AppLifecycle async with CrewClient() as mc: lifecycle = AppLifecycle(mc) await lifecycle.install("/path/to/my-app") await lifecycle.enable("my-app") await lifecycle.disable("my-app") await lifecycle.uninstall("my-app") apps = await lifecycle.list()
Gérer le processus de la passerelle Crew (démarrage, arrêt, vérification de l'état) :
from kirocrew_client import GatewayManager gm = GatewayManager(port=5476) await gm.start() healthy = await gm.is_healthy() await gm.stop()
Toutes les erreurs de kirocrew-client sont des instances CrewError avec code, message, status, body.
| Code | Déclencheur | Réessayé? |
|---|---|---|
AUTH_REQUIRED | Connexion distante sans jeton | Non |
AUTH_EXPIRED | Réponse 401 / 403 | Non (appelle on_auth_expired si défini) |
VALIDATION_ERROR | Entrée invalide | Non |
NOT_FOUND | Réponse 404 | Non |
RATE_LIMITED | Réponse 429 | Oui (Retry-After ou repli) |
SERVER_ERROR | Réponse 5xx | Oui (repli exponentiel) |
NETWORK_ERROR | Délai d'attente ou échec de connexion | Oui (repli exponentiel) |
WS_DISCONNECTED | WebSocket non connecté | Non |
from kirocrew_client import CrewError try: await mc.send_message("slot-1", "hello") except CrewError as e: print(e.code, e.message, e.status)
Référence SDK / API