Agent 核心 一中心
AgentRuntime · Controller · EventSink
全局唯一的 AgentRuntime 通过 agentRuntimeProvider 组装 Provider(LLM)、Registry(工具)、Controller(状态机)、Session、Skill 与 Memory 六类组件;
每个配置了 ai-assistant 的模块可用 AgentAssembly 获得隔离实例(Provider 共享,Registry/Session/Memory/Skill/Controller/Gate 隔离)。
渲染层只消费 Stream<AgentEvent> 事件流与 Controller 的 send / cancel / approve / reject。
事件流EventKind 全集:text / reasoning / toolDispatch / toolResult / turnDone / approvalRequest …
隔离策略LLM Provider 共享;Registry / Session / Memory / Skill / Gate 按模块隔离(命名空间 plugin:<id>/)
预设装配qa-basic / research-full / code-assistant(全工具 + 64K 上下文)
evg-base/lib/core/agent/ agent.dart · agent_runtime.dart · agent_factory.dart · controller/controller.dart
Skill 加载机制 skill/
SkillLoader · SkillIndex · RunSkillTool / ListSkillsTool
Skill 是带 YAML frontmatter 的 Markdown 指令文件(name / description / run_as / allowed_tools)。
SkillLoader 按搜索路径发现(plugins/<id>/skill/*.md、目录布局 <name>/SKILL.md、.greenix/skills/),
解析 frontmatter 后以 四层 scope 优先级(builtin > global > custom > project,同名校高优先级覆盖)进入 SkillIndex;
索引文本随 system prompt 注入「可用技能」段,模型经 run_skill 动态执行(inline 注入或 subagent 委派,受 allowed_tools 约束)。
市场「停用」状态经 .plugin_states.json 过滤,无需重启即生效。
frontmattername · description · mode · allowed_tools · run_as(inline | subagent)
索引注入SkillIndex.indexText() → system prompt「## 可用技能」
创作闭环skill-creator 经 skill_generator / skill_rewriter 生成与改写 Skill
evg-base/lib/core/agent/skill/skill.dart · tools/run_skill.dart
奥尔波特五维记忆架构 memory/
MemoryFacade · MemoryRouter · MemoryAgent(以源码为准:五层特质 + 三 scope)
记忆按 奥尔波特特质理论 分五层(groupMemoriesByAllport):首要特质(一个支配性形容词)· 中心特质(5–10 个核心形容词)·
次要特质(情境性偏好「在[情境]下,用户…」)· 用户需求(工作方式指导,含 why + how-to-apply)· 关键事实(时间锚定的客观事实)。
写入经 MemoryRouter 按 scope 路由:conversation / feature(内存)与 global(持久到 .greenix/memories/);
MemoryAgent 在后台用 LLM 提取特质与事实,支持矛盾 update、否定 forget,遵循「宁可漏记,不可错记」。
五层样例「实干家」·「勤奋、严谨」·「写代码偏好简洁」·「用户希望中文回答」·「[2026年6月] 大三学生」
三 scope 注入MemoryFacade.buildContext() 合并对话/功能/项目记忆 → system prompt
同步中心mergeMemories 直接拼接,同 name 跳过;索引 MEMORY.md 重建
evg-base/lib/core/agent/memory/ memory.dart · facade.dart · router.dart · memory_agent.dart
Agent Tool 插件原理 开发者模式
PluginBridge · PluginTool · PluginRunner
插件形态为 plugins/<id>/agent/<id>.py(.py 统一主路径,.exe 为 legacy 回退)+ 必写 manifest.json。
PluginBridge 启动时扫描发现,包装为 PluginTool 注册进 Registry(只读可并行、写工具串行)。
调用时参数经三种 arg 风格(stdin JSON / args+flag / args+positional)交给 PluginRunner(桌面子进程 / 安卓 Chaquopy 进程内),stdout 返回结果,非零退出码携带 stderr 回传。
manifest 还支持 runtime(python|native)、lifetime(once | resident 常驻后台)、preprocess(pdf_split)等字段。
manifest 必写name · description · schema(JSON Schema)· readOnly · argMode · argSpec
内置工具workspace / read_file / write_file / grep / web_search / data_query / python_runner / run_skill …
Registry 调度enable/disable 按名控制 · Gateway 四级权限 · 重复注册抛异常
evg-base/lib/core/agent/tools/plugin_bridge.dart · tool.dart · evg-base/plugins/<id>/agent/
工作区与视觉拓展 tools/
WorkspaceTool · 文件工具族 · vision 插件
工作区:WorkspaceTool 对接 module 的 WorkspaceDescriptor,根目录通常为 .greenix/workspaces/<moduleId>,
所有路径经 PathSandbox 防目录穿越;文件工具族覆盖 read_file(offset/limit/hex)、write_file(write / append / insert / replace_lines / delete_lines / replace_text)、grep、file_info、read_head/tail。
system prompt 注入「## 工作区」段告知绝对路径。视觉拓展:vision 插件提供 ocr(提取文字)/ describe(读图描述)/ generate(生图占位);
PDF/PPT 支持桌面 pymupdf,安卓经系统 PdfRenderer 预拆分为 pages_dir(preprocess: pdf_split);API 配置三级降级(config.json → CWD/PROJECT_ROOT → 环境变量)。
工作区声明module manifest「workspace: { enabled: true }」开启后才可访问
六种写动作write / append / insert / replace_lines / delete_lines / replace_text
视觉文件协议file_path 必须绝对路径(工作区绝对路径 + 相对子路径拼接)
evg-base/lib/core/agent/tools/ workspace_tool.dart · write_file.dart · read_file.dart · vision_pdf_preprocess.dart · evg-base/plugins/vision/
Agent 循环原理 感知 · 思考 · 行动 · 回写
Agent.run() 主循环 · maxSteps 上限 · 事件流
每轮对话进入 Agent.run():⓪ Compactor 检查上下文压实(soft 0.5 / compact 0.8 / force 0.95)→
① compose 构造 system prompt + 工具列表 + 记忆 + 会话历史 → ② Provider.chat 流式 LLM(reasoning / text / tool_calls)→
③ 记录 assistant 消息 → ④ 有工具调用则经 Gate(四级权限)→ StormBreaker(同一写工具连续失败 ≥3 压制)→ ToolHooks → Registry.call 执行并回写结果,
有工具调用则继续循环;无工具调用时 ⑤ FinalReadiness 校验必须产生可见回答(最多重试 3 次),通过后 turnDone。
全过程经 EventSink 发射 EventKind 全集事件流。
四道安全网Compactor(上下文)· Gate(权限)· StormBreaker(风暴抑制)· FinalReadiness(输出完整)
事件顺序turnStarted → reasoning → text/toolDispatch/toolResult → message → turnDone
记忆回写MemoryAgent 后台异步分析对话 → 特质 update/forget → 下轮 compose 时注入
evg-base/lib/core/agent/agent/agent.dart · compose.dart · gate.dart · compact/compact.dart
平台桥接 platform.*
AgentHttpServer · JS Bridge · 渲染层事件流
AgentHttpServer 以 REST + SSE 提供对话/会话/工具/记忆/技能端点,启动时写入 .agent_port 端口文件供插件与 Bridge 发现。
用户侧主路径为 HTML 插件:html-creator 创作 → module/index.html 由 html_modle WebView 加载 → 经 platform.ai.chat / platform.api.call 转发到 Agent 会话。
渲染层订阅 Stream<AgentEvent> 驱动 ChatMessage 流式 UI,Controller 提供 send / cancel / approve / reject;
Provider 为 DeepSeek 流式 API,AiUnavailableException 区分可恢复(自动退避重试)与需人工(无效 Key / 余额不足)。
端点速查/agent/chat/stream(SSE)· /agent/sessions · /agent/tools · /agent/memory · /agent/skills
JS Bridgeplatform.ai.chat(prompt, style) · platform.api.call(service, path, opts)
能力开关webSearchEnabledProvider · reasoningEffortProvider(off/low/medium/high/max)
evg-base/lib/core/agent/tools/agent_http_server.dart · event_serializers.dart · docs/agent-http-api.md