Intégrer Apollia via le contrat de pilotage
Ce guide s'adresse aux équipes qui embarquent un runtime Apollia dans un produit. Il couvre le contrat que votre application hôte pilote : l'API HTTP, sa garantie de stabilité, l'authentification et les clients générés. Il suppose que vous savez faire tourner un daemon Apollia et que vous voulez le raccorder à une application.
Si vous voulez simplement voir le flux fonctionner une fois, commencez par Piloter Apollia depuis votre produit.
Le contrat
Un runtime Apollia expose ses capacités via une API HTTP sous /api/v1 :
soumettre des tâches, ouvrir des sessions de chat, diffuser des résultats en
continu, consulter le journal d'audit et administrer le runtime.
Le daemon lancé par apollia-os start écoute sur un socket Unix et sur
127.0.0.1:7771. Le TCP est lié à chaque démarrage ; --port ne fait que
choisir le numéro.
L'API est décrite par une spécification OpenAPI 3.1 générée à partir du code source du runtime : elle ne peut donc pas diverger du code. Le runtime la sert à cette adresse :
GET /api/v1/openapi.json
Une copie versionnée existe aussi dans clients/openapi.json. Pour une vue
navigable de chaque opération, consultez la
référence de l'API HTTP, générée à
partir de cette même spécification.
Garantie de stabilité
/api/v1 est le contrat versionné, et le document OpenAPI de chaque version
le décrit exactement. Avant la 1.0, une version peut encore retirer ou changer
une opération de v1, et chacun de ces changements est listé avec sa migration
sous « Breaking changes and migration » dans le journal des modifications. La
0.3.0 a retiré les routes des projets (dont PUT /api/v1/sessions/{id}/project
et GET /api/v1/projects/{id}/sessions, et le champ project de
POST /api/v1/sessions), la route des approbations résolues et
PUT /api/v1/onboarding/profile. Lisez cette section avant de mettre à jour le
runtime sous une intégration.
Authentification
Choisissez la surface adaptée à votre déploiement :
- Socket Unix : confiance locale. L'accès est régi par les permissions du système de fichiers, aucun jeton n'est requis. À utiliser quand l'hôte et le runtime partagent la même machine et le même périmètre de confiance.
- TCP sur
127.0.0.1: authentifié par jeton. Chaque requête doit porter l'en-têteAuthorization: Bearer <token>. Au premier démarrage, quand[api] require_tokenest activé (c'est le comportement par défaut), le daemon génère un jeton et l'écrit dans~/.apollia/api-tokenavec des permissions réservées au propriétaire. Votre hôte lit ce fichier et transmet le jeton.
Le runtime que l'application desktop embarque se lie lui aussi aux deux
surfaces : le socket Unix, et un port TCP sur 127.0.0.1 ([api] port, 7771
par défaut) où le jeton est exigé.
Utiliser un client généré
Deux clients de pilotage côté hôte sont générés à partir de la spécification
OpenAPI et vivent sous clients/. Les deux sont générés, pas écrits à la
main, ce qui les maintient synchronisés avec le contrat. Ne modifiez jamais un
fichier généré à la main : changez le runtime, puis régénérez.
| Client | Chemin | Chaîne d'outils |
|---|---|---|
| TypeScript | clients/ts | types openapi-typescript plus openapi-fetch |
| Python | clients/python | openapi-python-client |
Aucun des deux n'est publié sur un registre, il n'existe donc pas de commande
d'installation pour l'un ou pour l'autre. Les deux se consomment depuis une
copie du dépôt. @apollia/runtime-client déclare comme point d'entrée ses
propres sources TypeScript : dépendez de clients/ts par chemin (une dépendance
file:, ou une entrée d'espace de travail) et laissez votre bundler le
compiler ; il tire openapi-fetch. clients/python est généré avec --meta none : il ne porte donc pas de
pyproject.toml et pip install n'a rien à lire. Placez son répertoire parent
sur PYTHONPATH ou copiez clients/python/apollia_runtime_client dans votre
projet, et installez httpx et attrs vous-même.
TypeScript
import { readFileSync } from "node:fs";
import { homedir } from "node:os";
import { createApolliaClient } from "@apollia/runtime-client";
const token = readFileSync(`${homedir()}/.apollia/api-token`, "utf8").trim();
const apollia = createApolliaClient({ token }); // baseUrl vaut 127.0.0.1:7771 par défaut
const health = await apollia.GET("/api/v1/health");
const submit = await apollia.POST("/api/v1/tasks", {
body: {
agent_id: "coach",
input: { parts: [{ type: "text", text: "hello from the host" }] },
},
});
Chaque opération est typée contre le contrat, si bien que la forme des
requêtes et des réponses est vérifiée à la compilation. agent_id nomme un
agent installé ; coach est celui que construit
Votre premier agent.
Python
import pathlib
from apollia_runtime_client import AuthenticatedClient
from apollia_runtime_client.api.tasks import submit_task, get_task
from apollia_runtime_client.models import SubmitTaskRequest, SubmitTaskRequestInput
token = (pathlib.Path.home() / ".apollia" / "api-token").read_text().strip()
client = AuthenticatedClient(base_url="http://127.0.0.1:7771", token=token)
resp = submit_task.sync(client=client, body=SubmitTaskRequest(
agent_id="coach",
input_=SubmitTaskRequestInput.from_dict(
{"parts": [{"type": "text", "text": "hello"}]}
),
))
task = get_task.sync(id=resp.task_id, client=client)
Diffuser les résultats en continu
Au-delà du modèle soumettre-puis-interroger, le contrat expose des flux
d'événements serveur (server-sent events) pour les traitements longs : la
sortie d'une tâche à GET /api/v1/tasks/{id}/stream et la sortie d'une
session de chat à GET /api/v1/sessions/{id}/stream. GET /api/v1/events
diffuse le bus d'événements du runtime tout entier, pour un hôte qui suit chaque
exécution plutôt qu'une seule. Consultez la
référence de l'API HTTP pour la
forme de leurs événements.
Régénérer les clients
Quand le contrat du runtime change, actualisez les clients à partir de la spécification :
# À partir de la spécification versionnée :
bash clients/regen.sh
# Ou actualisez d'abord la spécification depuis un daemon en cours d'exécution :
bash clients/regen.sh --from-daemon
Voir aussi
- Intégrer Apollia par fédération (MCP + REST) pour le schéma d'intégration en sidecar.
- Auditer et vérifier une exécution pour le flux de responsabilisation autour de ce que votre intégration exécute.
- La référence de l'API HTTP, la référence CLI et la référence SDK.