Files
Stéphane Tailland ecf8d74815 Finish the rename in the prose
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-31 15:06:44 +02:00

64 lines
2.9 KiB
Markdown

# Assistant — orchestrating agent
**Framework:** LangGraph · **Mode:** conversational · **Client id:** `classic-models-agent-assistant`
The single entry point for users. Understands the request, delegates to
specialists over A2A, composes the answer.
## Scopes
**None.** This agent has no MCP server and no domain scope, by design. It is the
component that sees raw user text, therefore the prompt-injection target, and it
must be structurally incapable of exfiltrating data. If you find yourself
wanting to give it a domain scope, the work belongs in a specialist instead.
## What it calls
Every other agent, over A2A: Ventes, Catalogue, Support, the supply agent,
Recouvrement. It calls them in parallel when the request allows.
Example: *"can we ship order 10248?"* → Ventes (order contents) and
the supply agent (stock) concurrently, then compose.
## Why LangGraph here
The orchestrator is where the routing logic is worth making explicit. A graph
states which specialist is consulted when, and where the composition happens —
useful when a request fans out and the answers must be reconciled.
## Watch out
LangGraph's `MultiServerMCPClient` fixes its headers at construction and
rebuilding it loses in-memory checkpoints (langchain-mcp-adapters #172, #194,
#235). This agent has no MCP servers, so it is not affected — but do not copy an
MCP pattern from here into a specialist.
**"No scopes at all" was too absolute.** The agent has to reason, so it holds
`llm-proxy-audience` as well as one audience per specialist. Inference is not a
domain. What the rule means, and what the realm enforces, is that no *domain*
audience is reachable from here.
`Answer.needs_the_user` is the other thing not to lose: a specialist that parks
a decision must have its message relayed unchanged. Paraphrasing a proposed
write hides what is about to happen, and approving it here would move the
decision to the component with the weakest standing to make it.
## Before writing code
Read `classic-models-agent-platform/CLAUDE.md` first. It holds the identity
model, the MCP and LLM endpoints, the token-exchange recipe and the known
blockers. This file only covers what is specific to this agent.
## Non-negotiables
- **Inference goes through the estate's LLM endpoint**, `https://llm-dev.sttlab.local/llm/v1/chat/completions`.
Calling a model provider directly bypasses the rate limits and prompt guards.
- **One client per conversation turn**, built with freshly exchanged tokens.
Here that is the A2A client and the graph itself: both carry the user's token.
- **Never name the middleware.** The agent talks to URLs that honour a contract.
Write "the MCP server", "the LLM endpoint", "the gateway" — never a product
name, in code, comments, commits or docs.
- **A2A calls return answers, not data.** Expose narrow decision-shaped skills,
never a generic `query`.
- Deliverables in English.