Day 04 / 5 · 文件地图

业务图开发 · 每个文件在哪、改什么

独立仓与 Monorepo 业务分层相同;差异在 server 形态和仓外注册文件。下文用 my-agent / my_agent 作示例名。

00

铁律:builder.py 与 nodes/ 平级

✅ 正确<pkg>/builder.py 组装图 · <pkg>/nodes/*.py 放节点函数 · <pkg>/state.py 放共享字段。
❌ 错误:在 nodes/builder.py 找装配逻辑——模板里不存在这个文件。

调用链:

cli.py / core.py / server.py
    └── 调 build_graph()          ← <pkg>/builder.py
            └── import run_node     ← <pkg>/nodes/run.py
A

路径 A · 独立仓完整目录

/path/to/my-agent/                 ← git 仓库根
├── pyproject.toml
├── .env
├── tests/test_smoke.py
└── my_agent/
    ├── builder.py              ← 组装 LangGraph(与 nodes/ 平级)
    ├── state.py
    ├── core.py                   ← run_agent + telemetry
    ├── cli.py
    ├── server.py
    ├── nodes/
    │   ├── __init__.py
    │   └── run.py              ← 节点业务逻辑(无 builder.py)
    ├── prompts/__init__.py
    ├── specialists/              ← 可选
    └── tools/                      ← 可选
你要做改这个文件(独立仓完整路径)
节点业务逻辑my-agent/my_agent/nodes/run.py(或多文件 nodes/scan.py …)
导出新节点my-agent/my_agent/nodes/__init__.py
串成图 add_node/edgemy-agent/my_agent/builder.py
节点间传什么字段my-agent/my_agent/state.py
System promptmy-agent/my_agent/prompts/__init__.py
Portal KPI 指标my-agent/my_agent/core.py(record_effect)
HTTP pod 入口my-agent/my_agent/server.py + 根 pyproject.toml 加 fastapi
冒烟测试my-agent/tests/test_smoke.py
包名 / CLI 命令名my-agent/pyproject.toml
B

路径 B · Monorepo 完整目录

gov-agents-platform/              ← monorepo 根
├── pyproject.toml                  ← workspace members 加 apps/my-agent
├── packages/gov-agents-server/src/gov_agents_server/main.py
│                                   ← AGENT_REGISTRY + AGENT_META
└── apps/my-agent/
    ├── pyproject.toml              ← BOM extras
    ├── evals/golden.jsonl          ← 评测样本(Monorepo 常有)
    ├── tests/test_smoke.py
    └── my_agent/
        ├── builder.py
        ├── state.py
        ├── server.py               ← build_v1_router(不是 legacy POST)
        ├── specialists.py 或 specialists/  ← 按 scaffold 而定
        └── nodes/ …                  ← 同独立仓
你要做改这个文件(Monorepo 完整路径)
注册 agent 到平台gov-agents-platform/pyproject.toml(members)
packages/gov-agents-server/src/gov_agents_server/main.py
业务图 / 节点 / stateapps/my-agent/my_agent/builder.py
apps/my-agent/my_agent/nodes/*.py
apps/my-agent/my_agent/state.py
标准 HTTP APIapps/my-agent/my_agent/server.py
Specialist + promptapps/my-agent/my_agent/specialists.pyspecialists/*.py
apps/my-agent/my_agent/prompts/*.md
评测样本apps/my-agent/evals/golden.jsonldata/eval_samples.jsonl
依赖 / BOMapps/my-agent/pyproject.toml
IDE MCP 暴露(可选)packages/gov-agents-mcp/src/gov_agents_mcp/schemas.py
01

state · builder · nodes 代码示例

my_agent/state.py

from typing import Annotated, TypedDict
from operator import add

class AgentState(TypedDict, total=False):
    input: str
    output: str
    retry_count: Annotated[int, add]

my_agent/nodes/run.py — 只写节点函数

from ai_trust_toolkit.llm import get_llm
from ..state import AgentState

def run_node(state: AgentState) -> AgentState:
    # 你的业务 ...
    return {"output": "..."}

my_agent/nodes/__init__.py

from .run import run_node
__all__ = ["run_node"]

my_agent/builder.py — 与 nodes/ 平级,负责串图

from langgraph.graph import END, StateGraph
from .nodes import run_node
from .state import AgentState

def build_graph():
    g = StateGraph(AgentState)
    g.add_node("run", run_node)
    g.set_entry_point("run")
    g.add_edge("run", END)
    return g.compile()
02

按需扩展的文件

场景文件位置改什么
调 GitLab / Quickwit / DB<pkg>/tools/xxx_client.py只读 client + 脱敏
多 LLM 视角并行<pkg>/specialists/xxx_sp.py@sp_node 或工厂节点
长 prompt<pkg>/prompts/*.mdprompts/__init__.py不要 inline 进 .py
Critic L1 规则<pkg>/nodes/critic_l1.py 或 builder 注入Monorepo 常见
自有业务库<pkg>/governance_store.py(新建)≠ telemetry 的 core.py
LLM 铁律:所有 <pkg>/**/*.py 里调模型走 from ai_trust_toolkit.llm import get_llm