Quickstart Arclith¶
Ce guide montre comment démarrer un projet concret avec Arclith, puis comment le faire évoluer par adapter sans modifier le code métier.
Arclith doit rester une brique hexagonale stable:
- le domaine et les cas d'usage portent le métier;
- les adapters inbound exposent le métier via API, MCP, bus ou CLI;
- les adapters outbound branchent MongoDB, DuckDB, cache, LLM, tracing ou secrets;
- la CLI assemble ces briques et met a jour la configuration.
Prérequis¶
- Python 3.13
uvgit
Installer la CLI depuis le repository:
| Bash | |
|---|---|
Pour partir d'un projet vide de métier, utiliser init, puis ajouter explicitement les fichiers
du cœur:
| Bash | |
|---|---|
Chaque commande mutante réussie enrichit arclith.recipe.yaml. Ce fichier
versionné conserve les décisions de scaffolding sans remplacer Git et sans
stocker de secret. Consulter la timeline avec arclith-cli history, puis lire
le guide Recettes Arclith CLI pour le dry-run et le replay.
Pour tester une branche de développement avant merge:
| Bash | |
|---|---|
1. Créer un projet concret¶
Exemple: un service pantry-agent qui gère une entité Ingredient.
| Bash | |
|---|---|
Le premier uv sync crée uv.lock pour le projet généré. Ensuite, les commandes
uv run --frozen ... peuvent être utilisées pour garantir que l'environnement reste
strictement conforme au lockfile.
Le projet généré suit le layout canonique:
| Text Only | |
|---|---|
2. Lancer API, MCP et probes¶
En développement, le mode all lance l'API, MCP HTTP et les probes.
| Bash | |
|---|---|
Par convention:
- API FastAPI:
http://127.0.0.1:8100 - MCP HTTP:
http://127.0.0.1:8101 - probes:
http://127.0.0.1:9000
Vérifier l'état:
| Bash | |
|---|---|
Créer puis lire une ressource:
3. Changer ou ajouter un adapter outbound¶
Pour ajouter seulement du cœur métier, sans CRUD ni adapter automatique :
| Bash | |
|---|---|
add-entity ajoute un squelette guidé sans import inutilisé. add-usecase
propose les entités détectées en interactif ; en mode direct, --entity,
--new-entity et --no-entity rendent le choix explicite et sont mutuellement
exclusifs. Les fichiers générés montrent le pattern
Command/Query -> UseCase -> Entity/Result, mais les champs, invariants et
appels aux ports restent du code métier à écrire dans le projet. Lire le
deep dive scaffold CLI pour les exemples complets.
L'adapter actif est déclaré dans:
| Text Only | |
|---|---|
Exemple:
Pour ajouter ou remplacer un adapter de repository:
La sortie JSON expose les garanties de chaque adapter repository. Utiliser la matrice de choix repository pour comparer runtime, multi-processus, transactions, stratégie de schéma, usages et limites avant de modifier l'adapter actif.
Le wizard détecte les entités dans src/<package>/domain/models/, pose les questions nécessaires,
génère les fichiers de l'adapter et met à jour la configuration.
Le même flux peut être joué en mode direct:
| Bash | |
|---|---|
MongoDB¶
Le wizard MongoDB doit produire une configuration scoped:
| Text Only | |
|---|---|
Exemple attendu:
L'URI reste un secret et ne doit pas être commitée. En local, utiliser secrets.yaml ou une variable
d'environnement selon la recette active.
DuckDB¶
Exemple:
MariaDB¶
Installer l'extra dans le projet qui utilise cet adapter:
| Bash | |
|---|---|
Génération directe:
| Bash | |
|---|---|
Exemple de configuration générée:
| YAML | |
|---|---|
Le mot de passe ou l'URL complète doivent rester dans un resolver de secrets, par exemple
config/secrets.yaml, env ou Vault.
4. Ajouter un autre inbound sans toucher au métier¶
Le même service applicatif peut être exposé par plusieurs adapters:
- FastAPI pour HTTP;
- FastMCP pour les outils MCP;
command-bus/rabbitmqpour un worker RabbitMQ.
La règle à conserver: l'inbound transforme le protocole en appel de cas d'usage. Il ne contient pas le métier.
5. Cas agent IA¶
Pour un agent, le cœur doit rester testable sans LLM:
| Text Only | |
|---|---|
Le LLM est un adapter outbound derrière un port. Il traduit une demande naturelle en données structurées, mais n'exécute pas directement le métier.
Exemple de ports applicatifs cibles:
IntentInterpreterPort: transforme une phrase en commande structurée;RepositoryPort: persiste les entités;TracePort: envoie les traces LangSmith ou autre;EventBusPort: publie des événements si besoin.
LangGraph local comme banc de test¶
Arclith ne génère pas d'UI dédiée pour tester un agent. Le chemin standard est un adapter
agent/langgraph testé via l'Agent Server local. LangGraph Studio et LangSmith sont utiles pour
inspecter les conversations quand internet et la clé sont disponibles, mais ils ne sont pas requis
pour valider un run local:
| Bash | |
|---|---|
Ajouter LangSmith séparément uniquement lorsque les traces distantes sont souhaitées:
| Bash | |
|---|---|
Tester sans Studio:
| Bash | |
|---|---|
Pour les commandes complètes LM Studio, threads et inspection de state, lire Validation IA locale.
L'adapter agent/langgraph génère langgraph.json, config/adapters/inbound/langgraph.yaml et
src/<package>/adapters/inbound/langgraph/agent.py. Le projet n'a plus qu'à modifier ce fichier
pour définir l'état, les nœuds et les transitions de son agent. Comme fastapi et fastmcp,
LangGraph est configuré par son nom produit dans AppConfig.langgraph, sans clé générique
adapters.agent.
Le flux attendu est: utilisateur ou canal conversationnel -> LangGraph Agent Server -> agent.py ->
ports et use cases applicatifs. Les nodes peuvent utiliser un LLMPort configuré par llm/* et les
traces via observability/*, sans appeler les repositories directement.
L'adapter observability/langsmith génère config/adapters/outbound/langsmith.yaml, ajoute
langsmith à observability.enabled, ajoute l'extra optionnel correspondant et écrit uniquement
les valeurs non secrètes dans .env.example. La CLI ne demande et n'écrit jamais la clé API.
Définir LANGSMITH_API_KEY dans l'environnement runtime ou un secret manager avant de lancer un
service avec cet adapter activé. Sans LangSmith, ne pas l'ajouter à observability.enabled: aucun
client, buffer ou appel réseau n'est alors créé.
L'adapter llm/lmstudio génère config/adapters/outbound/lm.yaml, chargé dans
AppConfig.adapters.lm. L'interpréteur d'intention applicatif consomme ensuite un LLMPort;
LangGraph ne fait qu'orchestrer les nœuds et injecter l'adapter outbound.
Pour llm/openai, choisir explicitement le modèle et garder la clé hors du dépôt: la CLI mappe
adapters.lm.api_key vers OPENAI_API_KEY via config/secrets.yaml, puis la valeur réelle vient de
.env local gitignoré, de l'environnement runtime ou d'un resolver Vault.
Utiliser llm/anthropic pour Claude via le provider Anthropic; garder llm/openai pour OpenAI,
LM Studio ou tout endpoint OpenAI-compatible avec base_url.
Le langgraph.json généré pointe vers .env pour que le serveur local charge les variables LangSmith.
Les tests conversationnels et traces agent se font ensuite dans LangSmith Studio.
Pour un parcours complet depuis un projet vide, avec création d'entité, API FastAPI, adapter LangGraph, LangSmith et LLM local LM Studio, suivre:
6. Construire l'image runtime¶
Les projets créés avec arclith-cli init incluent un Dockerfile runtime. Pour un projet existant:
| Bash | |
|---|---|
La même image démarre les transports par argument:
| Bash | |
|---|---|
Pour bus, ajouter d'abord command-bus/rabbitmq et implémenter le runner MODE=bus dans
main.py. Pour agent, ajouter agent/langgraph; arclith-run agent utilise langgraph.json ou
ARCLITH_AGENT_COMMAND.
Les secrets restent hors image: utiliser l'environnement runtime, Docker secrets, Vault ou fichiers
montés. Le .dockerignore généré exclut .env, secrets.yaml et les clés privées.
7. Valider avant commit¶
| Bash | |
|---|---|
Le sample officiel _sample sert de banc de test pour les évolutions Arclith. Avant de publier
Arclith, vérifier aussi:
Terminal 1:
Terminal 2:
Reference¶
- Sample fonctionnel:
../_sample - CLI:
cli/README.md - Capacités standardisées:
docs/capabilities.md - Tutoriel Docker:
docs/runtime-docker.md - Architecture:
arclith/docs/architecture.md - Decisions:
docs/decisions.md