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 utilisateur 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 utilisateur 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 à 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 LLM 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 |
| 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 serveurs dorsaux d'application : 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 utilisateur de l'application |
| * | /apps/{name}/api/{path} | Proxy inverse vers le serveur dorsal 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