ecf8d74815
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
64 lines
2.9 KiB
Markdown
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.
|