<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Henry Lin</title>
    <description>The latest articles on Forem by Henry Lin (@henry_lin_3ac6363747f45b4).</description>
    <link>https://forem.com/henry_lin_3ac6363747f45b4</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3446346%2F27539de0-e3e2-4103-a99b-86d7a0f03d57.png</url>
      <title>Forem: Henry Lin</title>
      <link>https://forem.com/henry_lin_3ac6363747f45b4</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/henry_lin_3ac6363747f45b4"/>
    <language>en</language>
    <item>
      <title>Hermes Agent 项目思维导图</title>
      <dc:creator>Henry Lin</dc:creator>
      <pubDate>Sun, 19 Apr 2026 13:38:57 +0000</pubDate>
      <link>https://forem.com/henry_lin_3ac6363747f45b4/hermes-agent-xiang-mu-si-wei-dao-tu-27i6</link>
      <guid>https://forem.com/henry_lin_3ac6363747f45b4/hermes-agent-xiang-mu-si-wei-dao-tu-27i6</guid>
      <description>&lt;h1&gt;
  
  
  Hermes Agent 项目思维导图
&lt;/h1&gt;

&lt;p&gt;这份文档用于导入 XMind 或其他支持 Markdown 层级导入的思维导图工具。主体内容尽量使用稳定的分级结构，减少长段解释，方便直接转换为脑图。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hermes Agent

&lt;ul&gt;
&lt;li&gt;项目定位&lt;/li&gt;
&lt;li&gt;自主型 AI Agent 运行时&lt;/li&gt;
&lt;li&gt;不只是聊天界面&lt;/li&gt;
&lt;li&gt;不只是 IDE copilot&lt;/li&gt;
&lt;li&gt;目标

&lt;ul&gt;
&lt;li&gt;调用工具完成任务&lt;/li&gt;
&lt;li&gt;跨会话保留长期能力&lt;/li&gt;
&lt;li&gt;跨平台运行&lt;/li&gt;
&lt;li&gt;支持自动化与扩展&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;典型场景

&lt;ul&gt;
&lt;li&gt;本地开发助手&lt;/li&gt;
&lt;li&gt;远程消息平台代理&lt;/li&gt;
&lt;li&gt;定时任务与监控&lt;/li&gt;
&lt;li&gt;企业内部系统接入&lt;/li&gt;
&lt;li&gt;研究与批处理&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;用户入口&lt;/li&gt;

&lt;li&gt;CLI

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;hermes&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;交互式主入口&lt;/li&gt;
&lt;li&gt;最完整的调试与观察界面&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Gateway

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;hermes gateway&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Telegram&lt;/li&gt;
&lt;li&gt;Discord&lt;/li&gt;
&lt;li&gt;Slack&lt;/li&gt;
&lt;li&gt;WhatsApp&lt;/li&gt;
&lt;li&gt;Signal&lt;/li&gt;
&lt;li&gt;其他平台适配器&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;ACP

&lt;ul&gt;
&lt;li&gt;编辑器集成&lt;/li&gt;
&lt;li&gt;VS Code&lt;/li&gt;
&lt;li&gt;Zed&lt;/li&gt;
&lt;li&gt;JetBrains&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;API Server / Python Library / Batch Runner

&lt;ul&gt;
&lt;li&gt;程序化调用&lt;/li&gt;
&lt;li&gt;轨迹批处理&lt;/li&gt;
&lt;li&gt;研究与训练相关入口&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;核心能力&lt;/li&gt;

&lt;li&gt;Tools

&lt;ul&gt;
&lt;li&gt;文件操作&lt;/li&gt;
&lt;li&gt;终端执行&lt;/li&gt;
&lt;li&gt;Web 搜索与抽取&lt;/li&gt;
&lt;li&gt;Browser 自动化&lt;/li&gt;
&lt;li&gt;Vision / TTS / Image Gen&lt;/li&gt;
&lt;li&gt;Memory&lt;/li&gt;
&lt;li&gt;Messaging&lt;/li&gt;
&lt;li&gt;Delegation&lt;/li&gt;
&lt;li&gt;Cron&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Toolsets

&lt;ul&gt;
&lt;li&gt;核心 toolset&lt;/li&gt;
&lt;li&gt;组合 toolset&lt;/li&gt;
&lt;li&gt;平台 toolset&lt;/li&gt;
&lt;li&gt;动态 toolset&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Skills

&lt;ul&gt;
&lt;li&gt;按需加载的流程知识&lt;/li&gt;
&lt;li&gt;本地 skills&lt;/li&gt;
&lt;li&gt;Skills Hub&lt;/li&gt;
&lt;li&gt;动态 slash commands&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Memory

&lt;ul&gt;
&lt;li&gt;跨会话事实信息&lt;/li&gt;
&lt;li&gt;MEMORY.md / USER.md&lt;/li&gt;
&lt;li&gt;外部 memory provider&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Context Files

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;AGENTS.md&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;SOUL.md&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.cursorrules&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.cursor/rules/*.mdc&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;MCP

&lt;ul&gt;
&lt;li&gt;外部工具接入&lt;/li&gt;
&lt;li&gt;stdio server&lt;/li&gt;
&lt;li&gt;HTTP server&lt;/li&gt;
&lt;li&gt;动态工具注册&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Cron

&lt;ul&gt;
&lt;li&gt;定时运行新 session&lt;/li&gt;
&lt;li&gt;delivery 到平台&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Delegation

&lt;ul&gt;
&lt;li&gt;子代理&lt;/li&gt;
&lt;li&gt;并行任务&lt;/li&gt;
&lt;li&gt;上下文隔离&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;核心运行系统&lt;/li&gt;

&lt;li&gt;AIAgent

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;run_agent.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;chat()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;run_conversation()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;同步 agent loop&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Prompt Builder

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;agent/prompt_builder.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;组装系统提示词&lt;/li&gt;
&lt;li&gt;注入 personality / memory / context / skills&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Prompt Caching

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;agent/prompt_caching.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;保持 prefix cache&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Context Compression

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;agent/context_compressor.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;长会话压缩&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Provider / Runtime Resolution

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;hermes_cli/runtime_provider.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;hermes_cli/auth.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;provider 选择&lt;/li&gt;
&lt;li&gt;credentials 解析&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Tool Dispatch

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;model_tools.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;schema 收集&lt;/li&gt;
&lt;li&gt;handle function call&lt;/li&gt;
&lt;li&gt;tool availability gating&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Session Storage

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;hermes_state.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;gateway/session.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;SQLite + FTS5&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Response Delivery

&lt;ul&gt;
&lt;li&gt;CLI display&lt;/li&gt;
&lt;li&gt;gateway delivery&lt;/li&gt;
&lt;li&gt;cron delivery&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;核心模块&lt;/li&gt;

&lt;li&gt;顶层核心文件

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;run_agent.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cli.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;model_tools.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;toolsets.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;hermes_state.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;batch_runner.py&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;
&lt;code&gt;agent/&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt;prompt builder&lt;/li&gt;
&lt;li&gt;context compressor&lt;/li&gt;
&lt;li&gt;prompt caching&lt;/li&gt;
&lt;li&gt;auxiliary client&lt;/li&gt;
&lt;li&gt;display&lt;/li&gt;
&lt;li&gt;skill commands&lt;/li&gt;
&lt;li&gt;trajectory&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;
&lt;code&gt;hermes_cli/&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;main.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;config.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;commands.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;setup.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tools_config.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;skills_config.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;model_switch.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;auth.py&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;
&lt;code&gt;tools/&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;registry.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;terminal_tool.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;file_tools.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;web_tools.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;browser_tool.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;code_execution_tool.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;delegate_tool.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mcp_tool.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;environments/&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;
&lt;code&gt;gateway/&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;run.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;session.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;delivery.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pairing.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;platforms/&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;
&lt;code&gt;cron/&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;jobs.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;scheduler.py&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;其他关键目录

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;acp_adapter/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;plugins/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;skills/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;optional-skills/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;website/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tests/&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;配置与状态体系&lt;/li&gt;

&lt;li&gt;&lt;code&gt;~/.hermes/config.yaml&lt;/code&gt;&lt;/li&gt;

&lt;li&gt;&lt;code&gt;~/.hermes/.env&lt;/code&gt;&lt;/li&gt;

&lt;li&gt;&lt;code&gt;~/.hermes/SOUL.md&lt;/code&gt;&lt;/li&gt;

&lt;li&gt;&lt;code&gt;~/.hermes/skills/&lt;/code&gt;&lt;/li&gt;

&lt;li&gt;&lt;code&gt;~/.hermes/sessions/&lt;/code&gt;&lt;/li&gt;

&lt;li&gt;&lt;code&gt;HERMES_HOME&lt;/code&gt;&lt;/li&gt;

&lt;li&gt;Profiles

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;hermes profile list&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;hermes profile create&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;hermes profile use&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;hermes profile show&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;关键规则&lt;/li&gt;

&lt;li&gt;Prompt cache 不应随意打破&lt;/li&gt;

&lt;li&gt;不要中途重建系统提示&lt;/li&gt;

&lt;li&gt;Toolset 不应在会话中随意变化&lt;/li&gt;

&lt;li&gt;profile-safe 路径规则

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;get_hermes_home()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;display_hermes_home()&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Tool / Skill / MCP 的选择边界

&lt;ul&gt;
&lt;li&gt;流程优先 skill&lt;/li&gt;
&lt;li&gt;外部系统优先 MCP&lt;/li&gt;
&lt;li&gt;原生底层能力再做 tool&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;测试不要写到真实 &lt;code&gt;~/.hermes&lt;/code&gt;
&lt;/li&gt;

&lt;li&gt;关键文件&lt;/li&gt;

&lt;li&gt;入口

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;run_agent.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cli.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;gateway/run.py&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;工具系统

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;model_tools.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;toolsets.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tools/registry.py&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;配置系统

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;hermes_cli/config.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;hermes_cli/main.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;hermes_constants.py&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;会话与状态

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;hermes_state.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;gateway/session.py&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;扩展系统

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;tools/mcp_tool.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;agent/skill_commands.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;hermes_cli/commands.py&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;关键流程&lt;/li&gt;

&lt;li&gt;CLI 请求流程

&lt;ul&gt;
&lt;li&gt;用户输入&lt;/li&gt;
&lt;li&gt;CLI&lt;/li&gt;
&lt;li&gt;AIAgent&lt;/li&gt;
&lt;li&gt;Prompt Builder&lt;/li&gt;
&lt;li&gt;Provider / Runtime Resolution&lt;/li&gt;
&lt;li&gt;Model API Call&lt;/li&gt;
&lt;li&gt;Tool Dispatch&lt;/li&gt;
&lt;li&gt;Built-in Tools / MCP Tools&lt;/li&gt;
&lt;li&gt;Session Storage&lt;/li&gt;
&lt;li&gt;CLI display&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Gateway 请求流程

&lt;ul&gt;
&lt;li&gt;平台消息&lt;/li&gt;
&lt;li&gt;Gateway&lt;/li&gt;
&lt;li&gt;会话解析与授权&lt;/li&gt;
&lt;li&gt;AIAgent&lt;/li&gt;
&lt;li&gt;Tool Dispatch&lt;/li&gt;
&lt;li&gt;Session Storage&lt;/li&gt;
&lt;li&gt;平台回传&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Cron 请求流程

&lt;ul&gt;
&lt;li&gt;Scheduler Tick&lt;/li&gt;
&lt;li&gt;新 session&lt;/li&gt;
&lt;li&gt;AIAgent&lt;/li&gt;
&lt;li&gt;Tool Dispatch&lt;/li&gt;
&lt;li&gt;Session Storage&lt;/li&gt;
&lt;li&gt;Delivery target&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;MCP 工具接入流程

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;mcp_servers&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;server connect&lt;/li&gt;
&lt;li&gt;tool discovery&lt;/li&gt;
&lt;li&gt;dynamic toolset&lt;/li&gt;
&lt;li&gt;model 可调用&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Tool 调用流程

&lt;ul&gt;
&lt;li&gt;schema collection&lt;/li&gt;
&lt;li&gt;model tool call&lt;/li&gt;
&lt;li&gt;&lt;code&gt;handle_function_call()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;registry dispatch&lt;/li&gt;
&lt;li&gt;tool result&lt;/li&gt;
&lt;li&gt;loop continuation&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;常用命令与观察点&lt;/li&gt;

&lt;li&gt;CLI

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;hermes&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;hermes setup&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;hermes model&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;hermes tools&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;hermes gateway&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;hermes cron&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Session Commands

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/model&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/usage&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/compress&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/tools&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/toolsets&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/skills&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/reload-mcp&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/background&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Debug

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;hermes doctor&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;hermes status&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/verbose&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;python -m pytest tests/ -q&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;/ul&gt;

</description>
    </item>
    <item>
      <title>Hermes Agent 核心运行系统调用流程--源码分析</title>
      <dc:creator>Henry Lin</dc:creator>
      <pubDate>Tue, 14 Apr 2026 12:44:22 +0000</pubDate>
      <link>https://forem.com/henry_lin_3ac6363747f45b4/hermes-agent-he-xin-yun-xing-xi-tong-diao-yong-liu-cheng-yuan-ma-fen-xi-1ojp</link>
      <guid>https://forem.com/henry_lin_3ac6363747f45b4/hermes-agent-he-xin-yun-xing-xi-tong-diao-yong-liu-cheng-yuan-ma-fen-xi-1ojp</guid>
      <description>&lt;h1&gt;
  
  
  Hermes Agent 核心运行系统调用流程
&lt;/h1&gt;

&lt;p&gt;本文基于当前仓库实现梳理 Hermes Agent 从入口层到结果交付的真实调用链，重点覆盖：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;核心运行系统 &lt;code&gt;AIAgent&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Prompt Builder / Prompt Caching / Context Compression&lt;/li&gt;
&lt;li&gt;Provider / Runtime Resolution&lt;/li&gt;
&lt;li&gt;Tool Dispatch&lt;/li&gt;
&lt;li&gt;Session Storage&lt;/li&gt;
&lt;li&gt;Response Delivery（CLI / gateway / cron）&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;不展开单个 tool 的内部业务逻辑，重点描述“谁调用谁、数据如何流动、哪些状态被缓存或持久化”。&lt;/p&gt;




&lt;h2&gt;
  
  
  1. 总体分层
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;入口层
  CLI: cli.py
  Gateway: gateway/run.py
  Cron: cron/scheduler.py
      ↓
运行时解析
  hermes_cli/runtime_provider.py
  hermes_cli/auth.py
      ↓
核心 Agent 初始化
  run_agent.py -&amp;gt; AIAgent.__init__()
      ↓
系统提示词装配
  AIAgent._build_system_prompt()
  agent/prompt_builder.py
      ↓
同步 agent loop
  AIAgent.run_conversation()
      ↓
模型响应二分
  无 tool_calls -&amp;gt; 最终响应
  有 tool_calls -&amp;gt; tool dispatch -&amp;gt; tool result 回填 -&amp;gt; 下一轮
      ↓
上下文管理
  agent/prompt_caching.py
  agent/context_compressor.py
      ↓
持久化
  hermes_state.py / gateway/session.py
      ↓
结果交付
  CLI Rich/TUI
  Gateway adapter.send(...)
  Cron output file + auto delivery
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  2. 三个入口如何进入 AIAgent
&lt;/h2&gt;

&lt;h3&gt;
  
  
  2.1 CLI 路径
&lt;/h3&gt;

&lt;p&gt;入口主要在 &lt;code&gt;cli.py&lt;/code&gt;：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;HermesCLI.chat()&lt;/code&gt; 先调用 &lt;code&gt;_ensure_runtime_credentials()&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;_ensure_runtime_credentials()&lt;/code&gt; 通过 &lt;code&gt;resolve_runtime_provider()&lt;/code&gt; 解析 provider、api_mode、base_url、api_key。&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;_init_agent()&lt;/code&gt; 在首次使用或路由变化时创建 &lt;code&gt;AIAgent(...)&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;HermesCLI.chat()&lt;/code&gt; 调用 &lt;code&gt;self.agent.run_conversation(...)&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;返回结果后，CLI 负责把 reasoning / response / TTS / streaming 内容显示到终端。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;关键点：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CLI 会在 provider、model、route、credential 变化时重建 agent，而不是复用旧 client。&lt;/li&gt;
&lt;li&gt;CLI 恢复会话时，会先从 &lt;code&gt;SessionDB&lt;/code&gt; 取历史消息，再交给 &lt;code&gt;AIAgent&lt;/code&gt; 继续运行。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;相关位置：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;cli.py:2169&lt;/code&gt; &lt;code&gt;_ensure_runtime_credentials()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cli.py:2269&lt;/code&gt; &lt;code&gt;_init_agent()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cli.py:6309&lt;/code&gt; &lt;code&gt;HermesCLI.chat()&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2.2 Gateway 路径
&lt;/h3&gt;

&lt;p&gt;入口主要在 &lt;code&gt;gateway/run.py&lt;/code&gt;：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;收到平台消息后，&lt;code&gt;SessionStore.get_or_create_session(source)&lt;/code&gt; 建立/获取会话。&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;build_session_context(...)&lt;/code&gt; 和 &lt;code&gt;build_session_context_prompt(...)&lt;/code&gt; 生成平台上下文。&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;session_store.load_transcript(session_id)&lt;/code&gt; 读取历史对话。&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;_run_agent(...)&lt;/code&gt; 内部解析 runtime、构造或复用 &lt;code&gt;AIAgent&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;调用 &lt;code&gt;agent.run_conversation(message, conversation_history=agent_history, ...)&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;将新消息写回 transcript / SQLite，并把最终结果返回给 adapter。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;关键点：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gateway 不把 session context 写进持久化的 system prompt，而是作为 &lt;code&gt;ephemeral_system_prompt&lt;/code&gt; 每轮临时注入，避免破坏 prompt cache 前缀。&lt;/li&gt;
&lt;li&gt;Gateway 会按 &lt;code&gt;session_key + agent config signature&lt;/code&gt; 缓存 &lt;code&gt;AIAgent&lt;/code&gt;，尽量复用同一个 agent 实例，保持 system prompt 和 tool schema 稳定。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;相关位置：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;gateway/run.py:2308&lt;/code&gt; 获取/创建 session&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gateway/run.py:2342&lt;/code&gt; 构造 context prompt&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gateway/run.py:2435&lt;/code&gt; 加载 transcript&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gateway/run.py:6647&lt;/code&gt; 创建/复用 &lt;code&gt;AIAgent&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gateway/run.py:6856&lt;/code&gt; 调用 &lt;code&gt;run_conversation()&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2.3 Cron 路径
&lt;/h3&gt;

&lt;p&gt;入口主要在 &lt;code&gt;cron/scheduler.py&lt;/code&gt; 的 &lt;code&gt;run_job(job)&lt;/code&gt;：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;构造 cron 专用 prompt（包含 skill 展开、cron 执行提示）。&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;resolve_runtime_provider()&lt;/code&gt; 解析运行时 provider。&lt;/li&gt;
&lt;li&gt;创建 &lt;code&gt;AIAgent(..., platform="cron", disabled_toolsets=["cronjob", "messaging", "clarify"], skip_memory=True)&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;在线程池里执行 &lt;code&gt;agent.run_conversation(prompt)&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;生成 markdown output 文档并保存到 &lt;code&gt;~/.hermes/cron/output/...&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;如配置了 &lt;code&gt;deliver&lt;/code&gt;，调用 &lt;code&gt;_deliver_result()&lt;/code&gt; 发送到目标平台。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;关键点：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;cron 是 headless 执行，不允许 clarify。&lt;/li&gt;
&lt;li&gt;cron 同样接入 &lt;code&gt;SessionDB&lt;/code&gt;，因此历史可被 &lt;code&gt;session_search&lt;/code&gt; 检索。&lt;/li&gt;
&lt;li&gt;cron 有“无活动超时”机制，不是简单 wall-clock timeout。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;相关位置：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;cron/scheduler.py:512&lt;/code&gt; &lt;code&gt;run_job()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cron/scheduler.py:623&lt;/code&gt; runtime 解析&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cron/scheduler.py:643&lt;/code&gt; 创建 &lt;code&gt;AIAgent&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cron/scheduler.py:678&lt;/code&gt; 调用 &lt;code&gt;run_conversation()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cron/scheduler.py:199&lt;/code&gt; &lt;code&gt;_deliver_result()&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  3. Provider / Runtime Resolution 调用链
&lt;/h2&gt;

&lt;p&gt;运行时解析由 &lt;code&gt;hermes_cli/runtime_provider.py&lt;/code&gt; 统一封装，CLI / gateway / cron 都走这里。&lt;/p&gt;

&lt;h3&gt;
  
  
  3.1 入口函数
&lt;/h3&gt;

&lt;p&gt;统一入口：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;resolve_runtime_provider(...)&lt;/code&gt; in &lt;code&gt;hermes_cli/runtime_provider.py:566&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;它返回一个 runtime dict，典型字段包括：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;provider&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;api_mode&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;base_url&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;api_key&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;command&lt;/code&gt; / &lt;code&gt;args&lt;/code&gt;（外部进程型 provider）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;credential_pool&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;requested_provider&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3.2 解析步骤
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;resolve_runtime_provider()&lt;/code&gt; 的主流程：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;resolve_requested_provider()&lt;/code&gt; 先决定“用户想要哪个 provider”。&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;_resolve_named_custom_runtime()&lt;/code&gt; 先尝试命名 custom provider。&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;resolve_provider()&lt;/code&gt; in &lt;code&gt;hermes_cli/auth.py&lt;/code&gt; 解析最终 provider 名称。&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;_resolve_explicit_runtime()&lt;/code&gt; 处理显式 api_key/base_url 覆盖。&lt;/li&gt;
&lt;li&gt;如有 credential pool，优先从 pool 取 runtime credential。&lt;/li&gt;
&lt;li&gt;按 provider 类型进入对应分支：

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;nous&lt;/code&gt; -&amp;gt; &lt;code&gt;resolve_nous_runtime_credentials()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;openai-codex&lt;/code&gt; -&amp;gt; &lt;code&gt;resolve_codex_runtime_credentials()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;copilot-acp&lt;/code&gt; -&amp;gt; &lt;code&gt;resolve_external_process_provider_credentials()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;anthropic&lt;/code&gt; -&amp;gt; 走 Anthropic token 解析&lt;/li&gt;
&lt;li&gt;API-key provider -&amp;gt; &lt;code&gt;resolve_api_key_provider_credentials()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;其他 -&amp;gt; &lt;code&gt;_resolve_openrouter_runtime()&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  3.3 &lt;code&gt;auth.py&lt;/code&gt; 的职责
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;hermes_cli/auth.py&lt;/code&gt; 主要负责：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;resolve_provider()&lt;/code&gt;：决定 provider 名称&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;resolve_codex_runtime_credentials()&lt;/code&gt;：读取/刷新 Codex token&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;resolve_nous_runtime_credentials()&lt;/code&gt;：刷新 Nous portal access token，并确保短期 inference key 可用&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;resolve_api_key_provider_credentials()&lt;/code&gt;：读取 API-key 类 provider 的密钥和 base_url&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;resolve_external_process_provider_credentials()&lt;/code&gt;：解析 &lt;code&gt;copilot-acp&lt;/code&gt; 这类本地子进程 provider&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;关键位置：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;hermes_cli/auth.py:790&lt;/code&gt; &lt;code&gt;resolve_provider()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;hermes_cli/auth.py:1174&lt;/code&gt; &lt;code&gt;resolve_codex_runtime_credentials()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;hermes_cli/auth.py:1683&lt;/code&gt; &lt;code&gt;resolve_nous_runtime_credentials()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;hermes_cli/auth.py:2084&lt;/code&gt; &lt;code&gt;resolve_api_key_provider_credentials()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;hermes_cli/auth.py:2122&lt;/code&gt; &lt;code&gt;resolve_external_process_provider_credentials()&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3.4 运行时解析的输出如何进入 AIAgent
&lt;/h3&gt;

&lt;p&gt;三个入口都会把 runtime dict 展开为 &lt;code&gt;AIAgent(...)&lt;/code&gt; 参数：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;api_key&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;base_url&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;provider&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;api_mode&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;command&lt;/code&gt; / &lt;code&gt;args&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;credential_pool&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;随后 &lt;code&gt;AIAgent.__init__()&lt;/code&gt; 决定使用哪类 client：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;anthropic_messages&lt;/code&gt; -&amp;gt; Anthropic native client&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;codex_responses&lt;/code&gt; -&amp;gt; Responses API / raw codex path&lt;/li&gt;
&lt;li&gt;其他 -&amp;gt; OpenAI-compatible client&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  4. AIAgent 初始化阶段
&lt;/h2&gt;

&lt;p&gt;核心类位于 &lt;code&gt;run_agent.py&lt;/code&gt;：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;AIAgent&lt;/code&gt; 定义：&lt;code&gt;run_agent.py:470&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;__init__()&lt;/code&gt;：&lt;code&gt;run_agent.py:487&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;run_conversation()&lt;/code&gt;：&lt;code&gt;run_agent.py:6801&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;chat()&lt;/code&gt;：&lt;code&gt;run_agent.py:9170&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4.1 初始化时完成的事情
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;AIAgent.__init__()&lt;/code&gt; 不是只做 client 构造，它会一次性初始化整套运行时状态：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;保存 model / provider / api_mode / iteration budget。&lt;/li&gt;
&lt;li&gt;基于 provider/base_url 判断实际 API 模式。&lt;/li&gt;
&lt;li&gt;创建底层 LLM client。&lt;/li&gt;
&lt;li&gt;调用 &lt;code&gt;get_tool_definitions(...)&lt;/code&gt; 加载当前会话可用工具。&lt;/li&gt;
&lt;li&gt;初始化 &lt;code&gt;SessionDB&lt;/code&gt; 会话行（如果传入了 &lt;code&gt;session_db&lt;/code&gt;）。&lt;/li&gt;
&lt;li&gt;初始化 todo store、memory store、memory provider plugin。&lt;/li&gt;
&lt;li&gt;初始化 context compressor。&lt;/li&gt;
&lt;li&gt;计算 prompt caching 开关。&lt;/li&gt;
&lt;li&gt;建立 &lt;code&gt;_cached_system_prompt&lt;/code&gt; 缓存槽。&lt;/li&gt;
&lt;li&gt;建立 session log 文件路径和 &lt;code&gt;_session_messages&lt;/code&gt; 缓冲区。&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  4.2 初始化时和本题流程直接相关的状态
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;self.tools&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt;来自 &lt;code&gt;model_tools.get_tool_definitions()&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;
&lt;code&gt;self.valid_tool_names&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt;当前会话真实可调用的工具名集合&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;
&lt;code&gt;self._cached_system_prompt&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt;会话级稳定 system prompt 快照&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;
&lt;code&gt;self.context_compressor&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt;长会话压缩器&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;
&lt;code&gt;self._session_db&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt;SQLite 会话存储&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;
&lt;code&gt;self._memory_store&lt;/code&gt; / &lt;code&gt;self._memory_manager&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt;memory 注入和外部 memory provider&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;
&lt;code&gt;self._use_prompt_caching&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt;是否启用 Anthropic/OpenRouter prompt cache 标记&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;




&lt;h2&gt;
  
  
  5. Prompt Builder：系统提示词如何被组装
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;AIAgent._build_system_prompt()&lt;/code&gt; 是总装函数，位于：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;run_agent.py:2609&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;真正的提示词拼装细节在：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;agent/prompt_builder.py&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5.1 组装顺序
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;_build_system_prompt()&lt;/code&gt; 的拼接顺序非常明确：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Agent identity&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;优先 &lt;code&gt;SOUL.md&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;否则 &lt;code&gt;DEFAULT_AGENT_IDENTITY&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;tool-aware guidance&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;仅当对应 tool 存在时才注入 memory/session_search/skills guidance&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Nous subscription prompt&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;tool-use enforcement&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;按模型名和 config 决定是否注入&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;调用方传入的 &lt;code&gt;system_message&lt;/code&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;内建 memory / user profile&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;外部 memory provider prompt block&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;skills system prompt&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;project context files&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;冻结时间戳 / session id / model / provider&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;platform hint&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  5.2 &lt;code&gt;prompt_builder.py&lt;/code&gt; 提供的核心能力
&lt;/h3&gt;

&lt;h4&gt;
  
  
  5.2.1 上下文文件发现与注入
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;build_context_files_prompt()&lt;/code&gt; 负责扫描并注入项目上下文文件：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;.hermes.md&lt;/code&gt; / &lt;code&gt;HERMES.md&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;AGENTS.md&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CLAUDE.md&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.cursorrules&lt;/code&gt; / &lt;code&gt;.cursor/rules/*.mdc&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;SOUL.md&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;关键特性：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;有 prompt injection 扫描：&lt;code&gt;_scan_context_content()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;有截断：&lt;code&gt;_truncate_content()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;有优先级：只取一种 project context 类型&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;关键位置：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;agent/prompt_builder.py:55&lt;/code&gt; &lt;code&gt;_scan_context_content()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;agent/prompt_builder.py:807&lt;/code&gt; &lt;code&gt;load_soul_md()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;agent/prompt_builder.py:920&lt;/code&gt; &lt;code&gt;build_context_files_prompt()&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  5.2.2 Skills 注入
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;build_skills_system_prompt()&lt;/code&gt; 会构建“可用技能索引”，供模型在系统提示词里看到。&lt;/p&gt;

&lt;p&gt;它有两层缓存：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;进程内 LRU cache&lt;/li&gt;
&lt;li&gt;磁盘 snapshot：&lt;code&gt;.skills_prompt_snapshot.json&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;注意：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;这是“skills 索引构建缓存”，不是模型 provider 的 prefix cache。&lt;/li&gt;
&lt;li&gt;它的目标是减少每次扫描 &lt;code&gt;skills/&lt;/code&gt; 目录的成本。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;关键位置：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;agent/prompt_builder.py:505&lt;/code&gt; &lt;code&gt;build_skills_system_prompt()&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5.3 会话级 system prompt 稳定策略
&lt;/h3&gt;

&lt;p&gt;Hermes 为了维持 prefix cache 命中，不会每轮都重建 system prompt。&lt;/p&gt;

&lt;p&gt;策略是：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;首轮调用时构建并缓存到 &lt;code&gt;self._cached_system_prompt&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;持续会话时，如果有 &lt;code&gt;SessionDB.system_prompt&lt;/code&gt;，优先复用库里的快照&lt;/li&gt;
&lt;li&gt;只有在 context compression 后才调用 &lt;code&gt;_invalidate_system_prompt()&lt;/code&gt; 并重建&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;相关位置：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;run_agent.py:6953&lt;/code&gt; 首轮构建/复用 system prompt&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;run_agent.py:2929&lt;/code&gt; &lt;code&gt;_invalidate_system_prompt()&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  6. Prompt Caching：prefix cache 如何保持稳定
&lt;/h2&gt;

&lt;p&gt;这一层涉及三种“缓存”，需要区分：&lt;/p&gt;

&lt;h3&gt;
  
  
  6.1 会话级 system prompt 缓存
&lt;/h3&gt;

&lt;p&gt;由 &lt;code&gt;AIAgent._cached_system_prompt&lt;/code&gt; 管理。&lt;/p&gt;

&lt;p&gt;作用：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;保证同一 session 内 system prompt 文本稳定&lt;/li&gt;
&lt;li&gt;避免 memory/context/skills 每轮重建后发生微小漂移&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  6.2 Skills prompt 构建缓存
&lt;/h3&gt;

&lt;p&gt;由 &lt;code&gt;agent/prompt_builder.py&lt;/code&gt; 内部管理。&lt;/p&gt;

&lt;p&gt;作用：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;加速 skills 索引生成&lt;/li&gt;
&lt;li&gt;不直接参与 provider prefix cache&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  6.3 Provider 级 prompt cache
&lt;/h3&gt;

&lt;p&gt;真正的 provider prefix cache 逻辑在：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;agent/prompt_caching.py&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;入口函数：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;apply_anthropic_cache_control()&lt;/code&gt;：&lt;code&gt;agent/prompt_caching.py:41&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;策略：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;最多放 4 个 &lt;code&gt;cache_control&lt;/code&gt; 断点&lt;/li&gt;
&lt;li&gt;system prompt 1 个&lt;/li&gt;
&lt;li&gt;最近 3 条非 system message 3 个&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;在 &lt;code&gt;run_conversation()&lt;/code&gt; 里，API 消息构造完成后，如果当前 session 启用了 prompt caching，则调用：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;run_agent.py:7239-7244&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;这就是当前仓库里“保持 prefix cache”的实际执行点。&lt;/p&gt;




&lt;h2&gt;
  
  
  7. &lt;code&gt;run_conversation()&lt;/code&gt; 的同步 agent loop
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;AIAgent.run_conversation()&lt;/code&gt; 是核心同步循环，整体是：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;准备消息
  ↓
拼 API payload
  ↓
调用模型
  ↓
有 tool_calls ?
  ├─ 否 -&amp;gt; 最终响应 -&amp;gt; 持久化 -&amp;gt; 返回
  └─ 是 -&amp;gt; 执行 tools -&amp;gt; tool result 写回 messages -&amp;gt; 下一轮
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  7.1 进入循环前的准备
&lt;/h3&gt;

&lt;p&gt;主要步骤：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;恢复 primary runtime（如果上轮触发了 fallback）。&lt;/li&gt;
&lt;li&gt;清洗用户输入中的 surrogate 字符。&lt;/li&gt;
&lt;li&gt;拷贝 &lt;code&gt;conversation_history&lt;/code&gt; 到本轮 &lt;code&gt;messages&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;去掉旧 budget warning。&lt;/li&gt;
&lt;li&gt;从历史中恢复 todo store。&lt;/li&gt;
&lt;li&gt;追加本轮 user message。&lt;/li&gt;
&lt;li&gt;复用或构建 &lt;code&gt;_cached_system_prompt&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;进行 preflight compression。&lt;/li&gt;
&lt;li&gt;从 memory provider / plugin hook 获取额外上下文。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;相关位置：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;run_agent.py:6833-6938&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;run_agent.py:6953-6991&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;run_agent.py:6994-7050&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;run_agent.py:7064-7085&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  7.2 单轮 API 调用前，如何拼 payload
&lt;/h3&gt;

&lt;p&gt;每次循环会把内部 &lt;code&gt;messages&lt;/code&gt; 转成 &lt;code&gt;api_messages&lt;/code&gt;：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;对当前 user message 注入 external memory / plugin context&lt;/li&gt;
&lt;li&gt;assistant message 里的 &lt;code&gt;reasoning&lt;/code&gt; 映射成 provider 能理解的字段&lt;/li&gt;
&lt;li&gt;移除内部字段：&lt;code&gt;reasoning&lt;/code&gt;、&lt;code&gt;finish_reason&lt;/code&gt;、&lt;code&gt;_thinking_prefill&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;对 strict provider 清理 Codex 专用 tool fields&lt;/li&gt;
&lt;li&gt;前置 system prompt&lt;/li&gt;
&lt;li&gt;注入 &lt;code&gt;prefill_messages&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;应用 Anthropic/OpenRouter prompt cache 标记&lt;/li&gt;
&lt;li&gt;做 tool_call/tool_result 完整性修复&lt;/li&gt;
&lt;li&gt;调用 &lt;code&gt;_build_api_kwargs()&lt;/code&gt; 产出 provider-specific kwargs&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;关键位置：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;run_agent.py:7169-7250&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;run_agent.py:5256&lt;/code&gt; &lt;code&gt;_build_api_kwargs()&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  7.3 &lt;code&gt;_build_api_kwargs()&lt;/code&gt; 如何分发到不同 API 形态
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;_build_api_kwargs()&lt;/code&gt; 按 &lt;code&gt;self.api_mode&lt;/code&gt; 分三路：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;anthropic_messages&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt;走 Anthropic adapter&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;codex_responses&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt;system prompt 变成 &lt;code&gt;instructions&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;history 变成 Responses &lt;code&gt;input&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;tools 转成 Responses schema&lt;/li&gt;
&lt;li&gt;带 &lt;code&gt;parallel_tool_calls=True&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;chat_completions&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt;标准 OpenAI-compatible &lt;code&gt;messages + tools&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;对 GPT-5 / Codex 会把第一条 &lt;code&gt;system&lt;/code&gt; role 改写成 &lt;code&gt;developer&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;关键位置：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;run_agent.py:5256-5330&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;run_agent.py:5367-5379&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  7.4 模型返回后，先做什么
&lt;/h3&gt;

&lt;p&gt;模型返回后会进入一系列规范化/防御逻辑：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;处理 incomplete / empty / reasoning-only 情况&lt;/li&gt;
&lt;li&gt;修正 hallucinated tool name&lt;/li&gt;
&lt;li&gt;校验 tool args JSON&lt;/li&gt;
&lt;li&gt;去重 tool calls&lt;/li&gt;
&lt;li&gt;限制同轮 &lt;code&gt;delegate_task&lt;/code&gt; 数量&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;然后才决定进入：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;tool 分支&lt;/li&gt;
&lt;li&gt;final response 分支&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;相关位置：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;run_agent.py:8590-8775&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;run_agent.py:8845-8977&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  7.5 &lt;code&gt;chat()&lt;/code&gt; 只是外层薄封装
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;AIAgent.chat()&lt;/code&gt; 只是：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;调 &lt;code&gt;run_conversation()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;取出 &lt;code&gt;result["final_response"]&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;位置：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;run_agent.py:9170&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  8. Tool Dispatch：schema 收集、availability gating、function call 分发
&lt;/h2&gt;

&lt;h3&gt;
  
  
  8.1 tool schema 收集
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;model_tools.py&lt;/code&gt; 在 import 时就会执行 &lt;code&gt;_discover_tools()&lt;/code&gt;：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;import &lt;code&gt;tools/*.py&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;每个 tool 模块通过 &lt;code&gt;registry.register(...)&lt;/code&gt; 自注册&lt;/li&gt;
&lt;li&gt;之后构建 &lt;code&gt;TOOL_TO_TOOLSET_MAP&lt;/code&gt; 和 &lt;code&gt;TOOLSET_REQUIREMENTS&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;位置：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;model_tools.py:132&lt;/code&gt; &lt;code&gt;_discover_tools()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;model_tools.py:170&lt;/code&gt; 调用 &lt;code&gt;_discover_tools()&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  8.2 &lt;code&gt;get_tool_definitions()&lt;/code&gt; 如何做 availability gating
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;get_tool_definitions(...)&lt;/code&gt; 负责给模型暴露“当前会话真实可见的 tools”。&lt;/p&gt;

&lt;p&gt;步骤：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;根据 &lt;code&gt;enabled_toolsets&lt;/code&gt; / &lt;code&gt;disabled_toolsets&lt;/code&gt; 解析 tool 名集合&lt;/li&gt;
&lt;li&gt;调 &lt;code&gt;registry.get_definitions(...)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;用每个 tool 的 &lt;code&gt;check_fn&lt;/code&gt; 做可用性过滤&lt;/li&gt;
&lt;li&gt;对 &lt;code&gt;execute_code&lt;/code&gt; 动态重建 schema，只列出当前 sandbox 中真实可用的 tools&lt;/li&gt;
&lt;li&gt;对 &lt;code&gt;browser_navigate&lt;/code&gt; 清理失效的 cross-tool 描述&lt;/li&gt;
&lt;li&gt;把最终可用 tool 名写入 &lt;code&gt;_last_resolved_tool_names&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;位置：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;model_tools.py:234&lt;/code&gt; &lt;code&gt;get_tool_definitions()&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  8.3 模型发出 tool_calls 后的调用链
&lt;/h3&gt;

&lt;p&gt;在 &lt;code&gt;run_conversation()&lt;/code&gt; 中，如果 &lt;code&gt;assistant_message.tool_calls&lt;/code&gt; 非空：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;先校验 tool name 和 JSON 参数&lt;/li&gt;
&lt;li&gt;生成 assistant message 并附加到 &lt;code&gt;messages&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;调 &lt;code&gt;_execute_tool_calls(...)&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;位置：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;run_agent.py:8590-8775&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;run_agent.py:5948&lt;/code&gt; &lt;code&gt;_execute_tool_calls()&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  8.4 并行与串行执行策略
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;_execute_tool_calls()&lt;/code&gt; 会根据 &lt;code&gt;_should_parallelize_tool_batch()&lt;/code&gt; 决定走：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;_execute_tool_calls_sequential()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;_execute_tool_calls_concurrent()&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;并行条件大致是：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;多个 tool call&lt;/li&gt;
&lt;li&gt;不包含 &lt;code&gt;clarify&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;只包含并行安全工具&lt;/li&gt;
&lt;li&gt;或 path-scoped tool 且目标路径不冲突&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;位置：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;run_agent.py:262&lt;/code&gt; &lt;code&gt;_should_parallelize_tool_batch()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;run_agent.py:5948&lt;/code&gt; &lt;code&gt;_execute_tool_calls()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;run_agent.py:6045&lt;/code&gt; &lt;code&gt;_execute_tool_calls_concurrent()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;run_agent.py:6261&lt;/code&gt; &lt;code&gt;_execute_tool_calls_sequential()&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  8.5 agent-level tool 与 registry-level tool 的分界
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;AIAgent._invoke_tool()&lt;/code&gt; 先拦截 agent 级工具：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;todo&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;session_search&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;memory&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;clarify&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;delegate_task&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;memory provider tools&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;其他工具才走：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;handle_function_call(...)&lt;/code&gt; in &lt;code&gt;model_tools.py&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;位置：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;run_agent.py:5971&lt;/code&gt; &lt;code&gt;_invoke_tool()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;model_tools.py:459&lt;/code&gt; &lt;code&gt;handle_function_call()&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  8.6 &lt;code&gt;handle_function_call()&lt;/code&gt; 做什么
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;handle_function_call()&lt;/code&gt; 是 registry 的同步分发入口：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;coerce_tool_args()&lt;/code&gt; 按 JSON Schema 纠正参数类型&lt;/li&gt;
&lt;li&gt;对 read/search loop 做计数重置&lt;/li&gt;
&lt;li&gt;执行 plugin &lt;code&gt;pre_tool_call&lt;/code&gt; hook&lt;/li&gt;
&lt;li&gt;&lt;code&gt;registry.dispatch(...)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;执行 plugin &lt;code&gt;post_tool_call&lt;/code&gt; hook&lt;/li&gt;
&lt;li&gt;返回 JSON string&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;注意：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;todo&lt;/code&gt; / &lt;code&gt;memory&lt;/code&gt; / &lt;code&gt;session_search&lt;/code&gt; / &lt;code&gt;delegate_task&lt;/code&gt; 在这里会返回“必须由 agent loop 处理”的 stub，因为它们依赖 agent-level state。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;位置：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;model_tools.py:372&lt;/code&gt; &lt;code&gt;coerce_tool_args()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;model_tools.py:459&lt;/code&gt; &lt;code&gt;handle_function_call()&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  9. Context Compression：长会话压缩如何接入主流程
&lt;/h2&gt;

&lt;p&gt;核心类：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;agent/context_compressor.py:53&lt;/code&gt; &lt;code&gt;ContextCompressor&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  9.1 初始化
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;AIAgent.__init__()&lt;/code&gt; 会创建 &lt;code&gt;self.context_compressor&lt;/code&gt;，传入：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;model&lt;/li&gt;
&lt;li&gt;provider&lt;/li&gt;
&lt;li&gt;base_url&lt;/li&gt;
&lt;li&gt;api_key&lt;/li&gt;
&lt;li&gt;context_length override&lt;/li&gt;
&lt;li&gt;threshold / protect_last_n / summary_model 等 config&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;位置：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;run_agent.py:1186&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  9.2 压缩触发点
&lt;/h3&gt;

&lt;p&gt;当前实现里至少有三类触发：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Preflight compression&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;本轮 API 还没发出，粗估请求已经超过阈值&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;正常循环中的 post-tool compression&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;本轮 tool 执行后，根据真实 token 使用量判断&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;上下文错误恢复&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;provider 返回 payload too large / context length exceeded 等错误时，进入压缩重试路径&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;本题主链里最核心的是前两种。&lt;/p&gt;

&lt;p&gt;位置：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;run_agent.py:6994&lt;/code&gt; preflight compression&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;run_agent.py:8827&lt;/code&gt; post-tool compression&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  9.3 &lt;code&gt;_compress_context()&lt;/code&gt; 的动作
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;_compress_context()&lt;/code&gt; 不是只改 &lt;code&gt;messages&lt;/code&gt;，它还会处理 session 边界。&lt;/p&gt;

&lt;p&gt;主流程：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;flush_memories()&lt;/code&gt; 先给模型一次机会把值得保留的信息写入 memory&lt;/li&gt;
&lt;li&gt;调用 &lt;code&gt;ContextCompressor.compress(messages, current_tokens=...)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;追加 todo snapshot&lt;/li&gt;
&lt;li&gt;&lt;code&gt;_invalidate_system_prompt()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;重建 system prompt&lt;/li&gt;
&lt;li&gt;若启用 &lt;code&gt;SessionDB&lt;/code&gt;：

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;end_session(old_session_id, "compression")&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;创建新 &lt;code&gt;session_id&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;create_session(parent_session_id=old_session_id)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;继承并自动编号 title&lt;/li&gt;
&lt;li&gt;&lt;code&gt;update_system_prompt(new_session_id, new_system_prompt)&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;更新压缩后的 token 估算&lt;/li&gt;
&lt;li&gt;重置 file read dedup cache&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;位置：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;run_agent.py:5853&lt;/code&gt; &lt;code&gt;_compress_context()&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  9.4 &lt;code&gt;ContextCompressor.compress()&lt;/code&gt; 的内部算法
&lt;/h3&gt;

&lt;p&gt;真实算法不是“简单保留头尾 + 做摘要”，而是：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;先裁剪老旧 tool result&lt;/li&gt;
&lt;li&gt;保护头部消息&lt;/li&gt;
&lt;li&gt;按 token budget 保护尾部消息&lt;/li&gt;
&lt;li&gt;对中间消息做结构化摘要&lt;/li&gt;
&lt;li&gt;修复 tool_call / tool_result 配对完整性&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;摘要模板包含：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Goal&lt;/li&gt;
&lt;li&gt;Constraints &amp;amp; Preferences&lt;/li&gt;
&lt;li&gt;Progress&lt;/li&gt;
&lt;li&gt;Key Decisions&lt;/li&gt;
&lt;li&gt;Relevant Files&lt;/li&gt;
&lt;li&gt;Next Steps&lt;/li&gt;
&lt;li&gt;Critical Context&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;位置：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;agent/context_compressor.py:155&lt;/code&gt; &lt;code&gt;_prune_old_tool_results()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;agent/context_compressor.py:253&lt;/code&gt; &lt;code&gt;_generate_summary()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;agent/context_compressor.py:565&lt;/code&gt; &lt;code&gt;compress()&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  10. Session Storage：SQLite + FTS5 与 gateway session index 的分工
&lt;/h2&gt;

&lt;p&gt;这里有两套相关但不重复的状态层。&lt;/p&gt;

&lt;h3&gt;
  
  
  10.1 &lt;code&gt;SessionDB&lt;/code&gt;：结构化、可检索的长期存储
&lt;/h3&gt;

&lt;p&gt;实现位于：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;hermes_state.py&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;核心设计：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SQLite&lt;/li&gt;
&lt;li&gt;WAL mode&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sessions&lt;/code&gt; 表 + &lt;code&gt;messages&lt;/code&gt; 表&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;messages_fts&lt;/code&gt; FTS5 虚表&lt;/li&gt;
&lt;li&gt;支持 parent_session_id 链接 compression continuation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;关键位置：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;hermes_state.py:41&lt;/code&gt; &lt;code&gt;sessions&lt;/code&gt; 表&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;hermes_state.py:71&lt;/code&gt; &lt;code&gt;messages&lt;/code&gt; 表&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;hermes_state.py:93&lt;/code&gt; FTS5 定义&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;hermes_state.py:115&lt;/code&gt; &lt;code&gt;SessionDB&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;主要接口：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;create_session()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;end_session()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;update_system_prompt()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;append_message()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;get_messages_as_conversation()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;search_messages()&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  10.2 &lt;code&gt;AIAgent&lt;/code&gt; 如何写入 &lt;code&gt;SessionDB&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;每次 turn 结束时调用：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;_persist_session()&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;它会做两件事：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;_save_session_log()&lt;/code&gt; 写 JSON session snapshot&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;_flush_messages_to_session_db()&lt;/code&gt; 把未刷新的消息增量写入 SQLite&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;_flush_messages_to_session_db()&lt;/code&gt; 用 &lt;code&gt;_last_flushed_db_idx&lt;/code&gt; 避免重复写入。&lt;/p&gt;

&lt;p&gt;位置：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;run_agent.py:1869&lt;/code&gt; &lt;code&gt;_persist_session()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;run_agent.py:1882&lt;/code&gt; &lt;code&gt;_flush_messages_to_session_db()&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  10.3 &lt;code&gt;SessionStore&lt;/code&gt;：gateway 的会话路由与 transcript 兼容层
&lt;/h3&gt;

&lt;p&gt;实现位于：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;gateway/session.py&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;它负责：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;根据 &lt;code&gt;SessionSource&lt;/code&gt; 生成 &lt;code&gt;session_key&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;管理 session reset policy&lt;/li&gt;
&lt;li&gt;维护 &lt;code&gt;SessionEntry&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;管理 transcript（SQLite + JSONL）&lt;/li&gt;
&lt;li&gt;生成 gateway 用的 session context prompt&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;关键位置：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;gateway/session.py:202&lt;/code&gt; &lt;code&gt;build_session_context_prompt()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gateway/session.py:692&lt;/code&gt; &lt;code&gt;get_or_create_session()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gateway/session.py:942&lt;/code&gt; &lt;code&gt;append_to_transcript()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gateway/session.py:970&lt;/code&gt; &lt;code&gt;rewrite_transcript()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gateway/session.py:1002&lt;/code&gt; &lt;code&gt;load_transcript()&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  10.4 &lt;code&gt;SessionDB&lt;/code&gt; 与 &lt;code&gt;SessionStore&lt;/code&gt; 的关系
&lt;/h3&gt;

&lt;p&gt;可以把两者理解成：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;SessionDB&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt;面向 agent / search / 压缩 continuation&lt;/li&gt;
&lt;li&gt;是结构化 SQLite 正式存储&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;
&lt;code&gt;SessionStore&lt;/code&gt;

&lt;ul&gt;
&lt;li&gt;面向 gateway 平台 session 生命周期&lt;/li&gt;
&lt;li&gt;维护 session_key 与当前 session_id 的映射&lt;/li&gt;
&lt;li&gt;同时保留 JSONL transcript 兼容层&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;也就是说：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;AIAgent&lt;/code&gt; 直接写 &lt;code&gt;SessionDB&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gateway&lt;/code&gt; 通过 &lt;code&gt;SessionStore&lt;/code&gt; 管理“当前聊天应该落在哪个 session_id 上”&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  11. Response Delivery：CLI、gateway、cron 三条出口
&lt;/h2&gt;

&lt;h3&gt;
  
  
  11.1 CLI display
&lt;/h3&gt;

&lt;p&gt;CLI 的交付不是简单 &lt;code&gt;print(final_response)&lt;/code&gt;，而是一套 callback + streaming UI：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;_init_agent()&lt;/code&gt; 给 &lt;code&gt;AIAgent&lt;/code&gt; 注入：

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;tool_progress_callback&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tool_start_callback&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tool_complete_callback&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;stream_delta_callback&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;thinking_callback&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;reasoning_callback&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;HermesCLI.chat()&lt;/code&gt; 在线程中执行 &lt;code&gt;agent.run_conversation(...)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;运行过程中：

&lt;ul&gt;
&lt;li&gt;streaming token 通过 &lt;code&gt;_stream_delta(...)&lt;/code&gt; 渲染&lt;/li&gt;
&lt;li&gt;reasoning 可单独显示&lt;/li&gt;
&lt;li&gt;tool progress 可实时显示&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;结束后：

&lt;ul&gt;
&lt;li&gt;若没走 streaming，则用 Rich &lt;code&gt;Panel(...)&lt;/code&gt; 包裹最终响应&lt;/li&gt;
&lt;li&gt;可选 TTS 播放&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;相关位置：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;cli.py:2340-2378&lt;/code&gt; 注入 callbacks&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cli.py:6481&lt;/code&gt; 调用 &lt;code&gt;run_conversation()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cli.py:6621-6644&lt;/code&gt; reasoning display&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cli.py:6645-6678&lt;/code&gt; 最终 response panel&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  11.2 Gateway delivery
&lt;/h3&gt;

&lt;p&gt;Gateway 的交付链分两段：&lt;/p&gt;

&lt;h4&gt;
  
  
  第一段：&lt;code&gt;_run_agent()&lt;/code&gt; 负责生成 agent 结果
&lt;/h4&gt;

&lt;p&gt;它会：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;构造/复用 &lt;code&gt;AIAgent&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;绑定 &lt;code&gt;tool_progress_callback&lt;/code&gt; / &lt;code&gt;step_callback&lt;/code&gt; / &lt;code&gt;stream_delta_callback&lt;/code&gt; / &lt;code&gt;status_callback&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;调 &lt;code&gt;run_conversation()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;处理 transcript 持久化&lt;/li&gt;
&lt;li&gt;更新 &lt;code&gt;SessionStore.last_prompt_tokens&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;返回最终 &lt;code&gt;response&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;关键位置：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;gateway/run.py:6647-6683&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;gateway/run.py:6856&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;gateway/run.py:2996-3078&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  第二段：平台 adapter 负责真正发送
&lt;/h4&gt;

&lt;p&gt;Gateway 外层收到 &lt;code&gt;_run_agent()&lt;/code&gt; 的返回值后，会：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;在普通模式下调用 &lt;code&gt;adapter.send(...)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;在 streaming 模式下由 stream consumer 边生成边发送&lt;/li&gt;
&lt;li&gt;如响应里包含 &lt;code&gt;MEDIA:&lt;/code&gt; 或本地文件路径，调用 &lt;code&gt;_deliver_media_from_response(...)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;如需要自动语音回复，走 &lt;code&gt;_send_voice_reply(...)&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;关键位置：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;gateway/run.py:7273&lt;/code&gt; queued message 场景下的 &lt;code&gt;adapter.send(...)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gateway/run.py:3080-3098&lt;/code&gt; already streamed 场景下的后处理&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gateway/run.py:4287&lt;/code&gt; &lt;code&gt;_send_voice_reply()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gateway/run.py:4345&lt;/code&gt; &lt;code&gt;_deliver_media_from_response()&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  11.3 Cron delivery
&lt;/h3&gt;

&lt;p&gt;cron 的结果交付分三步：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;run_job()&lt;/code&gt; 返回 &lt;code&gt;(success, output_doc, final_response, error)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;save_job_output()&lt;/code&gt; 先把 markdown 文档落盘&lt;/li&gt;
&lt;li&gt;如果需要对外发送，&lt;code&gt;_deliver_result(job, content, adapters, loop)&lt;/code&gt; 再做平台投递&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;code&gt;_deliver_result()&lt;/code&gt; 细节：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;先 &lt;code&gt;_resolve_delivery_target(job)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;优先使用 gateway live adapter（支持 E2EE 等）&lt;/li&gt;
&lt;li&gt;失败时 fallback 到 standalone &lt;code&gt;_send_to_platform(...)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;先抽取 &lt;code&gt;MEDIA:&lt;/code&gt; 标签，附件作为原生文件发送&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;位置：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;cron/scheduler.py:199&lt;/code&gt; &lt;code&gt;_deliver_result()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cron/scheduler.py:856-873&lt;/code&gt; tick 内触发保存与投递&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  12. 一条完整调用链示例
&lt;/h2&gt;

&lt;p&gt;下面用“gateway 收到一条普通文本消息”举例：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sequenceDiagram
    participant User
    participant Adapter
    participant Gateway as gateway/run.py
    participant Store as gateway/session.py
    participant Runtime as runtime_provider.py
    participant Agent as run_agent.py:AIAgent
    participant Prompt as agent/prompt_builder.py
    participant Tools as model_tools.py
    participant DB as hermes_state.py

    User-&amp;gt;&amp;gt;Adapter: 发送消息
    Adapter-&amp;gt;&amp;gt;Gateway: MessageEvent
    Gateway-&amp;gt;&amp;gt;Store: get_or_create_session(source)
    Gateway-&amp;gt;&amp;gt;Store: load_transcript(session_id)
    Gateway-&amp;gt;&amp;gt;Runtime: resolve_runtime_provider()
    Gateway-&amp;gt;&amp;gt;Agent: AIAgent(...)
    Agent-&amp;gt;&amp;gt;Tools: get_tool_definitions(...)
    Agent-&amp;gt;&amp;gt;DB: create_session(...) / update_system_prompt(...)
    Gateway-&amp;gt;&amp;gt;Agent: run_conversation(message, history)
    Agent-&amp;gt;&amp;gt;Prompt: _build_system_prompt()
    Prompt--&amp;gt;&amp;gt;Agent: system prompt
    Agent-&amp;gt;&amp;gt;Agent: 同步 loop，调用模型
    alt 模型返回 tool_calls
        Agent-&amp;gt;&amp;gt;Tools: handle_function_call(...) / agent-level tool
        Tools--&amp;gt;&amp;gt;Agent: tool result JSON
        Agent-&amp;gt;&amp;gt;DB: append_message(...)
        Agent-&amp;gt;&amp;gt;Agent: 下一轮 API 调用
    else 模型返回最终文本
        Agent-&amp;gt;&amp;gt;DB: flush messages / token counts
    end
    Agent--&amp;gt;&amp;gt;Gateway: {final_response, messages, tokens...}
    Gateway-&amp;gt;&amp;gt;Store: append_to_transcript(...) / update_session(...)
    Gateway-&amp;gt;&amp;gt;Adapter: send(response)
    Adapter--&amp;gt;&amp;gt;User: 最终消息
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  13. 本系统里最重要的几个“稳定性约束”
&lt;/h2&gt;

&lt;h3&gt;
  
  
  13.1 system prompt 必须尽量稳定
&lt;/h3&gt;

&lt;p&gt;这直接关系到：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Anthropic/OpenRouter prefix cache&lt;/li&gt;
&lt;li&gt;多轮会话成本&lt;/li&gt;
&lt;li&gt;gateway 复用 cached agent 的收益&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;因此：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;gateway 的动态上下文放到 &lt;code&gt;ephemeral_system_prompt&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;plugin context 放到 user message&lt;/li&gt;
&lt;li&gt;只有 compression 后才主动重建 system prompt&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  13.2 tool_call / tool_result 配对必须完整
&lt;/h3&gt;

&lt;p&gt;Hermes 在两个地方都做了防御：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API 调用前 &lt;code&gt;_sanitize_api_messages()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;compression 后 &lt;code&gt;ContextCompressor._sanitize_tool_pairs()&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;否则 Anthropic / OpenAI / strict provider 都可能拒绝请求。&lt;/p&gt;

&lt;h3&gt;
  
  
  13.3 session persistence 不是“最后一次统一保存”，而是多层增量保存
&lt;/h3&gt;

&lt;p&gt;当前实现同时维护：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JSON session snapshot&lt;/li&gt;
&lt;li&gt;SQLite messages/session rows&lt;/li&gt;
&lt;li&gt;gateway transcript JSONL 兼容层&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;目标是：即使中途中断、压缩、provider 异常，也尽量不丢会话。&lt;/p&gt;




&lt;h2&gt;
  
  
  14. 一句话总结
&lt;/h2&gt;

&lt;p&gt;Hermes 的核心运行系统可以概括为：&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;入口层先通过 &lt;code&gt;runtime_provider + auth&lt;/code&gt; 解析可执行 runtime，再由 &lt;code&gt;AIAgent&lt;/code&gt; 初始化稳定的 tool surface、system prompt 和 context compressor；随后 &lt;code&gt;run_conversation()&lt;/code&gt; 以同步 loop 反复执行“模型调用 -&amp;gt; tool dispatch -&amp;gt; tool result 回填”，并在整个过程中用 &lt;code&gt;SessionDB/SessionStore&lt;/code&gt; 持久化状态，最后由 CLI、gateway 或 cron 各自的 display/delivery 层把结果送到用户。&lt;/p&gt;
&lt;/blockquote&gt;

</description>
    </item>
    <item>
      <title>Hermes Agent 06. 技能、记忆与上下文文件</title>
      <dc:creator>Henry Lin</dc:creator>
      <pubDate>Mon, 13 Apr 2026 01:30:46 +0000</pubDate>
      <link>https://forem.com/henry_lin_3ac6363747f45b4/hermes-agent-06-ji-neng-ji-yi-yu-shang-xia-wen-wen-jian-38fd</link>
      <guid>https://forem.com/henry_lin_3ac6363747f45b4/hermes-agent-06-ji-neng-ji-yi-yu-shang-xia-wen-wen-jian-38fd</guid>
      <description>&lt;h1&gt;
  
  
  06. 技能、记忆与上下文文件
&lt;/h1&gt;

&lt;p&gt;如果说工具决定 Hermes “能不能做”，那么技能、记忆和上下文文件决定它“会不会持续做对”。&lt;/p&gt;

&lt;h2&gt;
  
  
  本章目标
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;理解 skill、memory、context file 的边界&lt;/li&gt;
&lt;li&gt;学会查找、安装和使用 skill&lt;/li&gt;
&lt;li&gt;学会用 &lt;code&gt;AGENTS.md&lt;/code&gt; 和 &lt;code&gt;SOUL.md&lt;/code&gt; 提升稳定性&lt;/li&gt;
&lt;li&gt;理解 prompt caching 与上下文注入的约束&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  适用读者
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;想长期高效使用 Hermes 的所有用户&lt;/li&gt;
&lt;li&gt;想把重复流程沉淀下来的进阶用户&lt;/li&gt;
&lt;li&gt;开发者&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  前置条件
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;已理解 CLI 和工具系统&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  核心概念
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Skill 是“怎么做”
&lt;/h3&gt;

&lt;p&gt;Skill 是按需加载的流程知识。它更像一份可执行的说明书，而不是一条记忆条目。&lt;/p&gt;

&lt;p&gt;适合做成 skill 的内容：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;固定工作流&lt;/li&gt;
&lt;li&gt;多步骤操作规范&lt;/li&gt;
&lt;li&gt;领域知识流程&lt;/li&gt;
&lt;li&gt;常见排错套路&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Memory 是“是什么”
&lt;/h3&gt;

&lt;p&gt;Memory 适合保存事实信息，例如：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;你的偏好&lt;/li&gt;
&lt;li&gt;环境事实&lt;/li&gt;
&lt;li&gt;常用项目位置&lt;/li&gt;
&lt;li&gt;团队约定&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;经验法则很简单：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;可复用流程放 skill&lt;/li&gt;
&lt;li&gt;长期事实放 memory&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Context File 是“默认注入的背景”
&lt;/h3&gt;

&lt;p&gt;Hermes 会自动读取某些上下文文件，例如：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;AGENTS.md&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;SOUL.md&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.cursor/*&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;这些文件会直接影响每次会话的系统上下文，所以质量和长度都很重要。&lt;/p&gt;

&lt;h2&gt;
  
  
  操作步骤
&lt;/h2&gt;

&lt;h3&gt;
  
  
  查看和使用 skill
&lt;/h3&gt;

&lt;p&gt;最常用的方式：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/skills
/skills search docker
/skills browse
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;技能安装后通常会直接变成 slash command，例如：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/plan 设计一个 REST API
/ascii-art Make a banner
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;CLI 外也可以：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;hermes skills list
hermes skills &lt;span class="nb"&gt;install &lt;/span&gt;official/research/arxiv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  自己创建 skill
&lt;/h3&gt;

&lt;p&gt;用户自定义 skill 放在：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;~/.hermes/skills/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;典型结构：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;~/.hermes/skills/my-category/my-skill/
└── SKILL.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;如果 skill 还需要参考文件、模板或脚本，也可以加 &lt;code&gt;references/&lt;/code&gt;、&lt;code&gt;templates/&lt;/code&gt;、&lt;code&gt;scripts/&lt;/code&gt;。&lt;/p&gt;

&lt;h3&gt;
  
  
  使用 memory
&lt;/h3&gt;

&lt;p&gt;Memory 用于跨会话保存信息。你可以直接要求 Hermes 记住某个事实，例如：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;记住：我们的 CI 用 GitHub Actions，主工作流文件是 deploy.yml。
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  写好 &lt;code&gt;AGENTS.md&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;对于代码项目，&lt;code&gt;AGENTS.md&lt;/code&gt; 非常重要。它适合写：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;架构约定&lt;/li&gt;
&lt;li&gt;测试方式&lt;/li&gt;
&lt;li&gt;代码规范&lt;/li&gt;
&lt;li&gt;禁止事项&lt;/li&gt;
&lt;li&gt;特定目录行为&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;它不是 README 的替代，而是“给 agent 的项目说明书”。&lt;/p&gt;

&lt;h3&gt;
  
  
  区分 &lt;code&gt;SOUL.md&lt;/code&gt; 和 &lt;code&gt;AGENTS.md&lt;/code&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;SOUL.md&lt;/code&gt;：定义 Hermes 的长期人格和表达倾向&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;AGENTS.md&lt;/code&gt;：定义当前项目或工作区的约束&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;一个偏“说话风格”，一个偏“做事规则”。&lt;/p&gt;

&lt;h2&gt;
  
  
  常见场景
&lt;/h2&gt;

&lt;h3&gt;
  
  
  场景 1：重复做同一种工作流
&lt;/h3&gt;

&lt;p&gt;如果某个任务总要 5 步以上，而且你会重复做，优先考虑做成 skill，而不是每次重写 prompt。&lt;/p&gt;

&lt;h3&gt;
  
  
  场景 2：希望 Hermes 一直遵守项目约定
&lt;/h3&gt;

&lt;p&gt;优先写 &lt;code&gt;AGENTS.md&lt;/code&gt;，而不是每次聊天都重新说一遍。&lt;/p&gt;

&lt;h3&gt;
  
  
  场景 3：希望 Hermes 长期记住偏好
&lt;/h3&gt;

&lt;p&gt;例如“回答尽量简洁”“默认用 pytest”“某仓库路径固定在某位置”，这些更适合进 memory。&lt;/p&gt;

&lt;h2&gt;
  
  
  常见问题与排错
&lt;/h2&gt;

&lt;h3&gt;
  
  
  为什么安装了 skill，当前会话却没看到
&lt;/h3&gt;

&lt;p&gt;有些 skill 需要新会话才能稳定进入 prompt。必要时重开会话或 &lt;code&gt;/reset&lt;/code&gt;。&lt;/p&gt;

&lt;h3&gt;
  
  
  为什么不建议把 &lt;code&gt;AGENTS.md&lt;/code&gt; 写得特别长
&lt;/h3&gt;

&lt;p&gt;因为它会被反复注入上下文，太长会拖慢会话、增加 token 消耗，并降低重点信息密度。&lt;/p&gt;

&lt;h3&gt;
  
  
  为什么 memory 改了但当前会话感觉没变
&lt;/h3&gt;

&lt;p&gt;memory 是跨会话生效的长期上下文。很多情况下写入后要到下一个会话，系统提示里才会以稳定方式体现出来。&lt;/p&gt;

&lt;h3&gt;
  
  
  什么是 prompt cache 不该被打破
&lt;/h3&gt;

&lt;p&gt;Hermes 很依赖稳定的系统提示前缀来命中缓存。频繁改系统提示、技能载入方式、上下文文件或模型，会降低缓存命中率，提高成本和延迟。&lt;/p&gt;

&lt;h2&gt;
  
  
  本章总结
&lt;/h2&gt;

&lt;p&gt;工具解决“做事”，skill、memory 和 context file 解决“长期稳定地做对”。高质量的长期使用，离不开这三者的正确分工。&lt;/p&gt;

&lt;h2&gt;
  
  
  下一步建议
&lt;/h2&gt;

&lt;p&gt;继续看 &lt;a href="//./07-mcp-and-extensions.md"&gt;MCP 与扩展能力&lt;/a&gt;，学习如何把 Hermes 接到外部系统。&lt;/p&gt;

</description>
      <category>hermesagent</category>
    </item>
    <item>
      <title>Hermes Agent 05. 工具与工具集</title>
      <dc:creator>Henry Lin</dc:creator>
      <pubDate>Mon, 13 Apr 2026 01:29:46 +0000</pubDate>
      <link>https://forem.com/henry_lin_3ac6363747f45b4/hermes-agent-05-gong-ju-yu-gong-ju-ji-5e1d</link>
      <guid>https://forem.com/henry_lin_3ac6363747f45b4/hermes-agent-05-gong-ju-yu-gong-ju-ji-5e1d</guid>
      <description>&lt;h1&gt;
  
  
  05. 工具与工具集
&lt;/h1&gt;

&lt;p&gt;这一章解释 Hermes 为什么能“做事”，以及你该如何控制它能做哪些事。&lt;/p&gt;

&lt;h2&gt;
  
  
  本章目标
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;理解 tool 与 toolset 的关系&lt;/li&gt;
&lt;li&gt;了解 Hermes 内置工具的大类能力&lt;/li&gt;
&lt;li&gt;学会按会话或平台启停工具&lt;/li&gt;
&lt;li&gt;学会区分 terminal、file、web、browser、execute_code、delegation 的适用场景&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  适用读者
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;所有认真使用 Hermes 的用户&lt;/li&gt;
&lt;li&gt;需要控制安全边界和执行能力的部署者&lt;/li&gt;
&lt;li&gt;开发者&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  前置条件
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;已理解 CLI 与配置系统&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  核心概念
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Tool 是能力单位，Toolset 是开关单位
&lt;/h3&gt;

&lt;p&gt;Hermes 内置工具注册在中央 registry 中，每个工具属于一个 toolset。你平时更常操作的是 toolset，而不是单个 tool。&lt;/p&gt;

&lt;p&gt;常见 toolset 包括：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;file&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;terminal&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;web&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;browser&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;skills&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;memory&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;code_execution&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;delegation&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cronjob&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  工具是否可用，取决于三个层面
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;该工具或 toolset 是否启用&lt;/li&gt;
&lt;li&gt;所需环境变量或依赖是否存在&lt;/li&gt;
&lt;li&gt;当前平台是否允许该能力&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;这意味着“文档里有这个工具”不等于“你当前会话里一定能用”。&lt;/p&gt;

&lt;h3&gt;
  
  
  内置工具的常见边界
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;file&lt;/code&gt;：适合读写搜索文本文件&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;terminal&lt;/code&gt;：适合执行 shell 命令和后台进程&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;web&lt;/code&gt;：适合搜索网页和抽取正文&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;browser&lt;/code&gt;：适合真正的页面交互、表单、按钮、复杂界面&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;execute_code&lt;/code&gt;：适合 3 步以上的机械化串联操作&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;delegate_task&lt;/code&gt;：适合上下文隔离、并行研究、独立子任务&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  操作步骤
&lt;/h2&gt;

&lt;h3&gt;
  
  
  查看当前 toolset
&lt;/h3&gt;

&lt;p&gt;CLI 内：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/toolsets
/tools list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;CLI 外：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;hermes tools
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  按会话启用指定 toolset
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;hermes chat &lt;span class="nt"&gt;--toolsets&lt;/span&gt; web,file,terminal
hermes chat &lt;span class="nt"&gt;--toolsets&lt;/span&gt; debugging
hermes chat &lt;span class="nt"&gt;--toolsets&lt;/span&gt; all
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;其中 &lt;code&gt;debugging&lt;/code&gt; 这类 composite toolset 会展开成多个核心 toolset。&lt;/p&gt;

&lt;h3&gt;
  
  
  在当前会话中禁用某个工具
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/tools disable browser
/tools enable browser
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;这对“想限制行为”或“怀疑某个工具在误导模型”时非常有用。&lt;/p&gt;

&lt;h3&gt;
  
  
  学会按任务选对能力层级
&lt;/h3&gt;

&lt;p&gt;优先顺序通常是：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;单次网页信息获取：&lt;code&gt;web&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;复杂网页交互：&lt;code&gt;browser&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;代码仓库文件理解：&lt;code&gt;file&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;实际跑命令、构建、测试：&lt;code&gt;terminal&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;批量顺序处理：&lt;code&gt;execute_code&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;并行或新上下文分析：&lt;code&gt;delegate_task&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  理解凭据型工具
&lt;/h3&gt;

&lt;p&gt;有些工具并不是默认可用，例如：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;web_search&lt;/code&gt; 需要 &lt;code&gt;EXA_API_KEY&lt;/code&gt;、&lt;code&gt;PARALLEL_API_KEY&lt;/code&gt;、&lt;code&gt;FIRECRAWL_API_KEY&lt;/code&gt; 或 &lt;code&gt;TAVILY_API_KEY&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;image_generate&lt;/code&gt; 需要 &lt;code&gt;FAL_KEY&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;homeassistant&lt;/code&gt; 需要 &lt;code&gt;HASS_TOKEN&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;如果环境变量没配好，工具会被排除或不可用。&lt;/p&gt;

&lt;h2&gt;
  
  
  常见场景
&lt;/h2&gt;

&lt;h3&gt;
  
  
  场景 1：代码分析
&lt;/h3&gt;

&lt;p&gt;优先用 &lt;code&gt;file&lt;/code&gt; 和 &lt;code&gt;terminal&lt;/code&gt;。如果只是查文件结构或读取文本，没必要打开 &lt;code&gt;browser&lt;/code&gt;。&lt;/p&gt;

&lt;h3&gt;
  
  
  场景 2：网页调研
&lt;/h3&gt;

&lt;p&gt;优先用 &lt;code&gt;web_search&lt;/code&gt; 和 &lt;code&gt;web_extract&lt;/code&gt;。只有在需要登录、点按钮、处理复杂页面时再切换到 &lt;code&gt;browser&lt;/code&gt;。&lt;/p&gt;

&lt;h3&gt;
  
  
  场景 3：十几个重复步骤的数据处理
&lt;/h3&gt;

&lt;p&gt;优先用 &lt;code&gt;execute_code&lt;/code&gt;，因为它能把工具调用和中间逻辑放进脚本里，避免主会话被中间结果淹没。&lt;/p&gt;

&lt;h3&gt;
  
  
  场景 4：三条研究线并行推进
&lt;/h3&gt;

&lt;p&gt;优先用 &lt;code&gt;delegate_task&lt;/code&gt;，让不同子代理分别处理不同问题，再回收摘要。&lt;/p&gt;

&lt;h2&gt;
  
  
  常见问题与排错
&lt;/h2&gt;

&lt;h3&gt;
  
  
  为什么我明明启用了 toolset，工具还是没出现
&lt;/h3&gt;

&lt;p&gt;最常见原因是该工具的 &lt;code&gt;check_fn&lt;/code&gt; 失败了，比如缺 API key、缺依赖、缺平台前提。&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;browser&lt;/code&gt; 和 &lt;code&gt;web&lt;/code&gt; 为什么要分开
&lt;/h3&gt;

&lt;p&gt;因为它们成本和能力完全不同。&lt;code&gt;web&lt;/code&gt; 更快、更便宜、更适合信息获取；&lt;code&gt;browser&lt;/code&gt; 更重，但能真实操作页面。&lt;/p&gt;

&lt;h3&gt;
  
  
  什么时候不该乱开全部工具
&lt;/h3&gt;

&lt;p&gt;当你需要安全边界、成本控制或更可预测的行为时。工具越多，模型的选择空间越大，行为也越难控。&lt;/p&gt;

&lt;h2&gt;
  
  
  本章总结
&lt;/h2&gt;

&lt;p&gt;Hermes 的执行力来自工具，但稳定性来自对工具的约束。真正高效的用法不是“什么都开”，而是为任务提供最小且足够的能力集合。&lt;/p&gt;

&lt;h2&gt;
  
  
  下一步建议
&lt;/h2&gt;

&lt;p&gt;继续看 &lt;a href="//./06-skills-memory-and-context.md"&gt;技能、记忆与上下文文件&lt;/a&gt;，理解 Hermes 如何长期保持方法和偏好。&lt;/p&gt;

</description>
      <category>hermesagent</category>
    </item>
    <item>
      <title>Hermes Agent 04. 配置体系与模型管理</title>
      <dc:creator>Henry Lin</dc:creator>
      <pubDate>Mon, 13 Apr 2026 01:29:19 +0000</pubDate>
      <link>https://forem.com/henry_lin_3ac6363747f45b4/hermes-agent-04-pei-zhi-ti-xi-yu-mo-xing-guan-li-4hkm</link>
      <guid>https://forem.com/henry_lin_3ac6363747f45b4/hermes-agent-04-pei-zhi-ti-xi-yu-mo-xing-guan-li-4hkm</guid>
      <description>&lt;h1&gt;
  
  
  04. 配置体系与模型管理
&lt;/h1&gt;

&lt;p&gt;Hermes 的强大很大程度上来自“入口统一，但后端可替换”。要把这一点用好，就必须掌握配置体系。&lt;/p&gt;

&lt;h2&gt;
  
  
  本章目标
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;理解 &lt;code&gt;config.yaml&lt;/code&gt; 与 &lt;code&gt;.env&lt;/code&gt; 的角色分工&lt;/li&gt;
&lt;li&gt;学会选择 provider 和模型&lt;/li&gt;
&lt;li&gt;理解 profile 的隔离价值&lt;/li&gt;
&lt;li&gt;学会管理常见配置项&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  适用读者
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;已经完成首次运行的用户&lt;/li&gt;
&lt;li&gt;想在不同场景下切换模型或部署多实例的用户&lt;/li&gt;
&lt;li&gt;需要排查配置问题的开发者&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  前置条件
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;已完成安装并能进入 CLI&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  核心概念
&lt;/h2&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;config.yaml&lt;/code&gt; 与 &lt;code&gt;.env&lt;/code&gt; 的分工
&lt;/h3&gt;

&lt;p&gt;你可以简单记成：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;config.yaml&lt;/code&gt;：结构化配置，控制行为和默认值&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.env&lt;/code&gt;：密钥、令牌、URL、环境变量&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;常见位置：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;~/.hermes/config.yaml&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;~/.hermes/.env&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  模型选择不是单一命令，而是一整套解析流程
&lt;/h3&gt;

&lt;p&gt;Hermes 会综合这些信息来决定最终的模型与 provider：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;当前会话显式指定&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;hermes model&lt;/code&gt; 保存的默认值&lt;/li&gt;
&lt;li&gt;&lt;code&gt;config.yaml&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.env&lt;/code&gt; 中的 provider 相关变量&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;这也是为什么“明明我填了 API key，但还是走了别的 provider”这类问题会出现。&lt;/p&gt;

&lt;h3&gt;
  
  
  Profile 是隔离实例，不是主题标签
&lt;/h3&gt;

&lt;p&gt;Profile 的作用是把配置、会话、技能、记忆、gateway 状态等全部隔离开。它适合：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;工作 / 私人分离&lt;/li&gt;
&lt;li&gt;不同 bot 实例分离&lt;/li&gt;
&lt;li&gt;测试环境 / 生产环境分离&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  操作步骤
&lt;/h2&gt;

&lt;h3&gt;
  
  
  查看和设置当前模型
&lt;/h3&gt;

&lt;p&gt;最直接的方式：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;hermes model
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;会话中也可以：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/model
/model claude-sonnet-4
/model openrouter:anthropic/claude-sonnet-4
/model custom:qwen-2.5
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  管理环境变量
&lt;/h3&gt;

&lt;p&gt;最基础的是 provider 凭据，例如：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;OPENROUTER_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;...
&lt;span class="nv"&gt;OPENAI_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;...
&lt;span class="nv"&gt;OPENAI_BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;...
&lt;span class="nv"&gt;ANTHROPIC_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;...
&lt;span class="nv"&gt;GLM_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;除模型相关之外，还有 web、browser、Gateway、MCP、memory provider 等能力依赖的变量。&lt;/p&gt;

&lt;h3&gt;
  
  
  管理 config.yaml
&lt;/h3&gt;

&lt;p&gt;常用方式：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;hermes config
hermes config get skills.config
hermes config &lt;span class="nb"&gt;set &lt;/span&gt;some.key value
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;你不需要一开始手改所有配置。很多场景下，用 &lt;code&gt;hermes setup&lt;/code&gt;、&lt;code&gt;hermes model&lt;/code&gt;、&lt;code&gt;hermes tools&lt;/code&gt;、&lt;code&gt;hermes skills&lt;/code&gt; 这类命令比直接编辑 YAML 更稳。&lt;/p&gt;

&lt;h3&gt;
  
  
  使用 profile
&lt;/h3&gt;

&lt;p&gt;先看当前有哪些 profile：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;hermes profile list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;创建和切换：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;hermes profile create work &lt;span class="nt"&gt;--clone&lt;/span&gt;
hermes profile use work
hermes profile show work
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;如果想回到默认实例：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;hermes profile use default
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  为不同场景建立不同默认值
&lt;/h3&gt;

&lt;p&gt;一个很实用的模式是：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;default&lt;/code&gt;：个人本地使用&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;work&lt;/code&gt;：工作环境，配置公司 MCP、企业平台和相关技能&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;bot&lt;/code&gt;：部署在服务器上的长期运行实例&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;这样能减少“在一个配置里堆所有用途”的混乱。&lt;/p&gt;

&lt;h2&gt;
  
  
  常见场景
&lt;/h2&gt;

&lt;h3&gt;
  
  
  场景 1：接多个 provider，按任务切换
&lt;/h3&gt;

&lt;p&gt;你可以默认使用一个通用 provider，然后在特定会话用 &lt;code&gt;/model&lt;/code&gt; 临时切换。Hermes 适合这种“一个工作流，多种模型”的使用方式。&lt;/p&gt;

&lt;h3&gt;
  
  
  场景 2：连接自建 OpenAI-compatible endpoint
&lt;/h3&gt;

&lt;p&gt;常见做法是配置：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;OPENAI_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;...
&lt;span class="nv"&gt;OPENAI_BASE_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://your-endpoint/v1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;然后在会话中选择：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/model custom:your-model-name
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  场景 3：把工作和私人使用完全隔离
&lt;/h3&gt;

&lt;p&gt;最推荐用 profile，而不是频繁替换同一个 &lt;code&gt;config.yaml&lt;/code&gt;。&lt;/p&gt;

&lt;h2&gt;
  
  
  常见问题与排错
&lt;/h2&gt;

&lt;h3&gt;
  
  
  为什么切换模型后表现变化很大
&lt;/h3&gt;

&lt;p&gt;除了模型本身变化，还可能是：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;provider 不同&lt;/li&gt;
&lt;li&gt;base URL 不同&lt;/li&gt;
&lt;li&gt;上下文缓存被打断&lt;/li&gt;
&lt;li&gt;会话中的工具使用策略发生变化&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  为什么我改了配置却没有马上感知
&lt;/h3&gt;

&lt;p&gt;有些改动影响新会话，有些改动影响当前会话，有些需要重新加载相关系统。比如 MCP 配置常常需要 &lt;code&gt;/reload-mcp&lt;/code&gt;。&lt;/p&gt;

&lt;h3&gt;
  
  
  什么时候要小心 prompt cache
&lt;/h3&gt;

&lt;p&gt;如果你频繁改系统提示、模型、上下文文件或技能加载方式，缓存命中会变差，成本和延迟都可能上升。不要把中途乱改配置当成常规工作流。&lt;/p&gt;

&lt;h2&gt;
  
  
  本章总结
&lt;/h2&gt;

&lt;p&gt;Hermes 的配置核心可以归纳为四件事：provider、model、tooling、profile。理解它们之后，你就能把 Hermes 从“能用”推进到“适合自己的使用方式”。&lt;/p&gt;

&lt;h2&gt;
  
  
  下一步建议
&lt;/h2&gt;

&lt;p&gt;继续看 &lt;a href="//./05-tools-and-toolsets.md"&gt;工具与工具集&lt;/a&gt;，理解 Hermes 的实际执行能力边界。&lt;/p&gt;

</description>
      <category>hermesagent</category>
    </item>
    <item>
      <title>Hermes Agent 03. 首次运行与 CLI 基础</title>
      <dc:creator>Henry Lin</dc:creator>
      <pubDate>Mon, 13 Apr 2026 01:28:47 +0000</pubDate>
      <link>https://forem.com/henry_lin_3ac6363747f45b4/hermes-agent-03-shou-ci-yun-xing-yu-cli-ji-chu-4g2j</link>
      <guid>https://forem.com/henry_lin_3ac6363747f45b4/hermes-agent-03-shou-ci-yun-xing-yu-cli-ji-chu-4g2j</guid>
      <description>&lt;h1&gt;
  
  
  03. 首次运行与 CLI 基础
&lt;/h1&gt;

&lt;p&gt;Hermes 的 CLI 是最重要的主入口。很多高级能力最终都要回到 CLI 里调试和观察，所以这一章建议认真读。&lt;/p&gt;

&lt;h2&gt;
  
  
  本章目标
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;学会启动 Hermes CLI 并完成一次基本对话&lt;/li&gt;
&lt;li&gt;掌握常用 slash commands&lt;/li&gt;
&lt;li&gt;学会恢复会话、切换模型、观察工具行为&lt;/li&gt;
&lt;li&gt;理解 CLI 与消息平台交互面的差异&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  适用读者
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;刚完成安装的新用户&lt;/li&gt;
&lt;li&gt;希望把 Hermes 当作主工作台的重度用户&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  前置条件
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;已完成安装&lt;/li&gt;
&lt;li&gt;至少有一个可用模型&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  核心概念
&lt;/h2&gt;

&lt;h3&gt;
  
  
  CLI 是最完整的交互面
&lt;/h3&gt;

&lt;p&gt;CLI 默认拥有最完整的观察能力和调试体验，包括：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;slash command 自动补全&lt;/li&gt;
&lt;li&gt;工具执行进度显示&lt;/li&gt;
&lt;li&gt;会话恢复&lt;/li&gt;
&lt;li&gt;中断与重定向&lt;/li&gt;
&lt;li&gt;本地图片粘贴&lt;/li&gt;
&lt;li&gt;背景会话&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  有两类命令需要区分
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;shell 命令：例如 &lt;code&gt;hermes status&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;会话内 slash commands：例如 &lt;code&gt;/model&lt;/code&gt;、&lt;code&gt;/usage&lt;/code&gt;、&lt;code&gt;/compress&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;你可以把前者理解为“启动或管理 Hermes”，把后者理解为“正在和 Hermes 对话时控制当前会话”。&lt;/p&gt;

&lt;h2&gt;
  
  
  操作步骤
&lt;/h2&gt;

&lt;h3&gt;
  
  
  启动 CLI
&lt;/h3&gt;

&lt;p&gt;最简单的方式就是：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;hermes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;进入后先尝试几条基础命令：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/help
/model
/usage
/toolsets
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  发出第一条有效请求
&lt;/h3&gt;

&lt;p&gt;不要一开始就发“你好”，更推荐给 Hermes 一个能触发真实能力的任务，例如：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;阅读当前目录结构并总结这个仓库的核心组成。
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;这样你能更快看到它是否会搜索文件、是否会调用工具、输出风格是否符合预期。&lt;/p&gt;

&lt;h3&gt;
  
  
  学会多行输入与中断
&lt;/h3&gt;

&lt;p&gt;CLI 支持多行输入，适合粘贴代码、traceback 和长提示。任务跑偏时可以按 &lt;code&gt;Ctrl+C&lt;/code&gt; 中断，再直接发新消息重定向。&lt;/p&gt;

&lt;h3&gt;
  
  
  掌握最常用的 slash commands
&lt;/h3&gt;

&lt;p&gt;下面这些是高频中的高频：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;/help&lt;/code&gt;：查看帮助&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/model [model]&lt;/code&gt;：查看或切换模型&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/new&lt;/code&gt; / &lt;code&gt;/reset&lt;/code&gt;：新会话&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/title [name]&lt;/code&gt;：给当前会话命名&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/resume [name]&lt;/code&gt;：恢复之前命名过的会话&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/usage&lt;/code&gt;：看 token、成本、上下文使用情况&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/compress&lt;/code&gt;：手动压缩上下文&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/verbose&lt;/code&gt;：切换工具输出显示级别&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/background &amp;lt;prompt&amp;gt;&lt;/code&gt;：在后台启动独立任务&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/tools [list|enable|disable]&lt;/code&gt;：查看或修改当前会话工具&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/skills&lt;/code&gt;：搜索、查看、安装技能&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  学会会话恢复
&lt;/h3&gt;

&lt;p&gt;CLI 外部可以用：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;hermes &lt;span class="nt"&gt;-c&lt;/span&gt;
hermes &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s2"&gt;"会话标题"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;CLI 内部可以用：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/resume 会话标题
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;如果你经常做连续任务，会话命名是非常值得养成的习惯。&lt;/p&gt;

&lt;h3&gt;
  
  
  观察工具行为
&lt;/h3&gt;

&lt;p&gt;执行复杂任务时，建议切换 &lt;code&gt;/verbose&lt;/code&gt;，观察 Hermes 是否：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;真正调用了你期望的工具&lt;/li&gt;
&lt;li&gt;在错误的地方浪费步骤&lt;/li&gt;
&lt;li&gt;因为权限、配置或工具缺失而被卡住&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;这比盲目重试更有效。&lt;/p&gt;

&lt;h2&gt;
  
  
  常见场景
&lt;/h2&gt;

&lt;h3&gt;
  
  
  场景 1：恢复昨天没做完的任务
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;hermes &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s2"&gt;"auth-refactor"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;或者进入 CLI 后：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/resume auth-refactor
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  场景 2：切换到更合适的模型
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/model
/model openrouter:anthropic/claude-sonnet-4
/model zai:glm-5
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;复杂推理任务和简单格式化任务，往往不该强行用同一个模型。&lt;/p&gt;

&lt;h3&gt;
  
  
  场景 3：让长任务后台运行
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/background 读取当前仓库，整理一份贡献指南并给出改进建议。
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;这样当前会话仍然可用，后台任务完成后会返回结果。&lt;/p&gt;

&lt;h2&gt;
  
  
  常见问题与排错
&lt;/h2&gt;

&lt;h3&gt;
  
  
  为什么我在 CLI 里看不到工具细节
&lt;/h3&gt;

&lt;p&gt;先执行 &lt;code&gt;/verbose&lt;/code&gt;，Hermes 会在不同显示级别之间切换。&lt;/p&gt;

&lt;h3&gt;
  
  
  为什么一个任务越聊越慢
&lt;/h3&gt;

&lt;p&gt;通常是上下文变长了。先看 &lt;code&gt;/usage&lt;/code&gt;，必要时执行 &lt;code&gt;/compress&lt;/code&gt;。&lt;/p&gt;

&lt;h3&gt;
  
  
  为什么同样的命令在消息平台里没有
&lt;/h3&gt;

&lt;p&gt;因为有些 slash commands 是 CLI-only，例如 &lt;code&gt;/tools&lt;/code&gt;、&lt;code&gt;/toolsets&lt;/code&gt;、&lt;code&gt;/browser&lt;/code&gt;、&lt;code&gt;/config&lt;/code&gt;、&lt;code&gt;/skills&lt;/code&gt; 等。CLI 和 Gateway 共享一部分命令，但并不完全一致。&lt;/p&gt;

&lt;h2&gt;
  
  
  本章总结
&lt;/h2&gt;

&lt;p&gt;CLI 是你理解 Hermes 行为、观察工具调用、调整模型与会话状态的最佳入口。只要你把 CLI 用顺，后面使用 Gateway、MCP、Cron 和开发扩展时都会轻松很多。&lt;/p&gt;

&lt;h2&gt;
  
  
  下一步建议
&lt;/h2&gt;

&lt;p&gt;继续看 &lt;a href="//./04-configuration-and-models.md"&gt;配置体系与模型管理&lt;/a&gt;，理解 Hermes 的配置到底怎么组织。&lt;/p&gt;

</description>
      <category>hermes</category>
      <category>hermesagent</category>
    </item>
    <item>
      <title>Hermes Agent 02. 安装与初始化</title>
      <dc:creator>Henry Lin</dc:creator>
      <pubDate>Sun, 12 Apr 2026 01:22:42 +0000</pubDate>
      <link>https://forem.com/henry_lin_3ac6363747f45b4/hermes-agent-02-an-zhuang-yu-chu-shi-hua-5bpn</link>
      <guid>https://forem.com/henry_lin_3ac6363747f45b4/hermes-agent-02-an-zhuang-yu-chu-shi-hua-5bpn</guid>
      <description>&lt;h1&gt;
  
  
  02. 安装与初始化
&lt;/h1&gt;

&lt;p&gt;这一章解决最实际的问题：怎样把 Hermes Agent 安装好、初始化好，并确认它真的可用。&lt;/p&gt;

&lt;h2&gt;
  
  
  本章目标
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;完成 Hermes Agent 安装&lt;/li&gt;
&lt;li&gt;理解 &lt;code&gt;~/.hermes&lt;/code&gt; 目录和关键配置文件&lt;/li&gt;
&lt;li&gt;完成第一次 &lt;code&gt;hermes setup&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;知道开发仓库与普通安装的差别&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  适用读者
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;新用户&lt;/li&gt;
&lt;li&gt;准备在本机或服务器上部署 Hermes 的用户&lt;/li&gt;
&lt;li&gt;准备修改仓库源码的开发者&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  前置条件
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Linux、macOS 或 WSL2 环境&lt;/li&gt;
&lt;li&gt;网络可访问安装依赖&lt;/li&gt;
&lt;li&gt;至少准备一个模型 provider 的 API key 或 OAuth 登录方式&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  核心概念
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Hermes 的默认家目录
&lt;/h3&gt;

&lt;p&gt;默认情况下，Hermes 的配置和状态文件都在 &lt;code&gt;~/.hermes/&lt;/code&gt; 下。最常见的文件是：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;~/.hermes/config.yaml&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;~/.hermes/.env&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;~/.hermes/SOUL.md&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;~/.hermes/skills/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;~/.hermes/sessions/&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;如果你使用 profile 或设置了 &lt;code&gt;HERMES_HOME&lt;/code&gt;，这些路径会被隔离到对应目录。&lt;/p&gt;

&lt;h3&gt;
  
  
  安装和开发是两条路径
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;普通使用者：用官方安装脚本最快&lt;/li&gt;
&lt;li&gt;仓库开发者：在仓库里建虚拟环境并安装 &lt;code&gt;.[all,dev]&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  操作步骤
&lt;/h2&gt;

&lt;h3&gt;
  
  
  方式一：官方安装脚本
&lt;/h3&gt;

&lt;p&gt;这是最简单的路径：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;安装完成后，重新加载 shell：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;source&lt;/span&gt; ~/.bashrc
&lt;span class="c"&gt;# 或者&lt;/span&gt;
&lt;span class="nb"&gt;source&lt;/span&gt; ~/.zshrc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;然后直接启动：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;hermes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  方式二：开发者从仓库安装
&lt;/h3&gt;

&lt;p&gt;如果你要修改这个仓库本身，建议使用下面的流程：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/NousResearch/hermes-agent.git
&lt;span class="nb"&gt;cd &lt;/span&gt;hermes-agent
uv venv venv &lt;span class="nt"&gt;--python&lt;/span&gt; 3.11
&lt;span class="nb"&gt;source &lt;/span&gt;venv/bin/activate
uv pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;".[all,dev]"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;如果你就在本仓库里工作，请记住 &lt;code&gt;AGENTS.md&lt;/code&gt; 给出的开发约束：运行 Python 相关命令前应先执行：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;source &lt;/span&gt;venv/bin/activate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  第一次执行 setup
&lt;/h3&gt;

&lt;p&gt;安装后建议立刻运行：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;hermes setup
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;你也可以分模块执行：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;hermes setup model
hermes setup terminal
hermes setup gateway
hermes setup tools
hermes setup agent
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;hermes setup&lt;/code&gt; 主要帮助你完成这些事情：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;选择 provider 和默认模型&lt;/li&gt;
&lt;li&gt;配置 terminal backend&lt;/li&gt;
&lt;li&gt;配置 gateway 平台&lt;/li&gt;
&lt;li&gt;配置工具&lt;/li&gt;
&lt;li&gt;初始化 agent 行为设置&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  准备 &lt;code&gt;.env&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Hermes 会从 &lt;code&gt;~/.hermes/.env&lt;/code&gt; 读取大量环境变量。最基础的是模型 provider：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;OPENROUTER_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;your_key_here
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;其他能力如 web、browser、TTS、Gateway、MCP 往往也需要额外变量。后面在配置章节会集中展开。&lt;/p&gt;

&lt;h3&gt;
  
  
  验证安装是否成功
&lt;/h3&gt;

&lt;p&gt;推荐依次跑下面几个命令：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;hermes version
hermes doctor
hermes status
hermes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;如果你能进入 CLI，并正常发出一条消息，说明基础安装已经通了。&lt;/p&gt;

&lt;h2&gt;
  
  
  常见场景
&lt;/h2&gt;

&lt;h3&gt;
  
  
  场景 1：在自己电脑上做本地助手
&lt;/h3&gt;

&lt;p&gt;最常见组合是：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;官方安装脚本&lt;/li&gt;
&lt;li&gt;默认 &lt;code&gt;~/.hermes&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;只先配置一个 provider&lt;/li&gt;
&lt;li&gt;暂时不启用 Gateway&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  场景 2：在服务器上长期运行
&lt;/h3&gt;

&lt;p&gt;更常见的组合是：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;安装后先配好 &lt;code&gt;hermes gateway&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;设置 allowlist&lt;/li&gt;
&lt;li&gt;配置 home channel&lt;/li&gt;
&lt;li&gt;再逐步加 cron 和 MCP&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  场景 3：准备参与仓库开发
&lt;/h3&gt;

&lt;p&gt;你应该优先用仓库安装方式，并且在运行测试、脚本和 Python 命令前先激活 &lt;code&gt;venv&lt;/code&gt;。&lt;/p&gt;

&lt;h2&gt;
  
  
  常见问题与排错
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Windows 能直接用吗
&lt;/h3&gt;

&lt;p&gt;官方不支持原生 Windows。推荐使用 WSL2。&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;hermes&lt;/code&gt; 命令找不到
&lt;/h3&gt;

&lt;p&gt;通常是安装后没有重新加载 shell，或者 &lt;code&gt;PATH&lt;/code&gt; 没更新。先尝试重新打开终端，或者 &lt;code&gt;source ~/.bashrc&lt;/code&gt; / &lt;code&gt;source ~/.zshrc&lt;/code&gt;。&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;hermes doctor&lt;/code&gt; 报 provider 未配置
&lt;/h3&gt;

&lt;p&gt;这通常不是安装失败，而是还没有可用的模型凭据。先配置 &lt;code&gt;~/.hermes/.env&lt;/code&gt;，或者运行 &lt;code&gt;hermes model&lt;/code&gt; / &lt;code&gt;hermes auth&lt;/code&gt; 完成认证。&lt;/p&gt;

&lt;h3&gt;
  
  
  我什么时候应该开始用 profile
&lt;/h3&gt;

&lt;p&gt;如果你已经知道自己会同时维护“工作助手”“私人助手”“机器人实例”这类多个隔离环境，那么在一开始就用 profile 会比后面迁移更省事。&lt;/p&gt;

&lt;h2&gt;
  
  
  本章总结
&lt;/h2&gt;

&lt;p&gt;安装 Hermes 并不难，真正重要的是把配置目录、初始化流程和 provider 凭据这三件事弄清楚。只要这一步稳住，后面 CLI、Gateway、工具和自动化就容易很多。&lt;/p&gt;

&lt;h2&gt;
  
  
  下一步建议
&lt;/h2&gt;

&lt;p&gt;继续看 &lt;a href="//./03-first-run-and-cli-basics.md"&gt;首次运行与 CLI 基础&lt;/a&gt;，把第一次真实使用跑通。&lt;/p&gt;

</description>
      <category>hermesagent</category>
    </item>
    <item>
      <title>Hermes Agent 01. 概览与架构</title>
      <dc:creator>Henry Lin</dc:creator>
      <pubDate>Sun, 12 Apr 2026 01:21:59 +0000</pubDate>
      <link>https://forem.com/henry_lin_3ac6363747f45b4/hermes-agent-01-gai-lan-yu-jia-gou-2kkm</link>
      <guid>https://forem.com/henry_lin_3ac6363747f45b4/hermes-agent-01-gai-lan-yu-jia-gou-2kkm</guid>
      <description>&lt;h1&gt;
  
  
  01. 概览与架构
&lt;/h1&gt;

&lt;p&gt;这一章帮助你先建立整体认知：Hermes Agent 到底是什么、适合做什么、和普通聊天助手有什么区别，以及仓库里最重要的几个系统是如何配合工作的。&lt;/p&gt;

&lt;h2&gt;
  
  
  本章目标
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;理解 Hermes Agent 的产品定位&lt;/li&gt;
&lt;li&gt;了解 CLI、Gateway、Tools、Skills、Memory、MCP、Cron 的关系&lt;/li&gt;
&lt;li&gt;判断 Hermes 是否适合你的使用场景&lt;/li&gt;
&lt;li&gt;建立后续阅读所需的整体地图&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  适用读者
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;第一次接触 Hermes Agent 的用户&lt;/li&gt;
&lt;li&gt;准备长期使用 Hermes 的进阶用户&lt;/li&gt;
&lt;li&gt;希望参与仓库开发的贡献者&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  前置条件
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;不需要任何安装经验&lt;/li&gt;
&lt;li&gt;建议对命令行、API key、配置文件有基本概念&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  核心概念
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Hermes Agent 不是“只能聊天”的助手
&lt;/h3&gt;

&lt;p&gt;Hermes 的核心价值在于“会调用工具、会保留长期上下文、能跨平台持续运行”。它不是单纯把一个模型包进聊天窗口，而是把模型、工具、记忆、技能、会话存储、多平台入口和自动化机制组合成一个可持续工作的 agent。&lt;/p&gt;

&lt;h3&gt;
  
  
  Hermes 的几块核心系统
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;CLI：终端里的交互式主入口，适合开发、调试、重度使用&lt;/li&gt;
&lt;li&gt;Gateway：把同一个 agent 能力接到 Telegram、Discord、Slack、WhatsApp、Signal 等平台&lt;/li&gt;
&lt;li&gt;Tools：模型真正执行动作的能力边界，例如终端执行、文件读写、网页搜索、浏览器控制&lt;/li&gt;
&lt;li&gt;Toolsets：对工具做分组和开关控制，决定某个平台或某次会话能用哪些工具&lt;/li&gt;
&lt;li&gt;Skills：按需加载的流程知识，适合保存“怎么做”&lt;/li&gt;
&lt;li&gt;Memory：跨会话保留的事实性信息，适合保存“是什么”&lt;/li&gt;
&lt;li&gt;Context Files：如 &lt;code&gt;AGENTS.md&lt;/code&gt;、&lt;code&gt;SOUL.md&lt;/code&gt; 等长期注入的上下文文件&lt;/li&gt;
&lt;li&gt;MCP：把外部系统通过统一协议暴露成 Hermes 可调用的工具&lt;/li&gt;
&lt;li&gt;Cron：让 Hermes 按计划自动运行任务，而不是等你每次手动发消息&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  一个典型的数据流
&lt;/h3&gt;

&lt;p&gt;当你在 CLI 或消息平台中发出请求时，大致会发生这些步骤：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;入口层接收消息&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;AIAgent&lt;/code&gt; 构造系统提示词和上下文&lt;/li&gt;
&lt;li&gt;模型决定直接回答，或者调用一个或多个工具&lt;/li&gt;
&lt;li&gt;工具结果回到 agent 循环中&lt;/li&gt;
&lt;li&gt;生成最终回复并保存到会话存储&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;这意味着 Hermes 的“智能”不只是模型本身，还来自整个执行回路。&lt;/p&gt;

&lt;h2&gt;
  
  
  操作步骤
&lt;/h2&gt;

&lt;h3&gt;
  
  
  第一步：记住 Hermes 的两个主入口
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;想在终端里工作，用 &lt;code&gt;hermes&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;想在聊天平台里工作，用 &lt;code&gt;hermes gateway ...&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;CLI 更适合：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;写代码&lt;/li&gt;
&lt;li&gt;看工具输出&lt;/li&gt;
&lt;li&gt;调试配置&lt;/li&gt;
&lt;li&gt;处理复杂任务&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Gateway 更适合：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;长期在线&lt;/li&gt;
&lt;li&gt;远程使用&lt;/li&gt;
&lt;li&gt;定时推送&lt;/li&gt;
&lt;li&gt;团队或多设备访问&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  第二步：理解“能力来自工具”
&lt;/h3&gt;

&lt;p&gt;Hermes 不会凭空浏览网页、修改文件或运行命令。它必须通过工具完成这些操作。你应当从一开始就建立这个判断标准：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;只是回答知识问题：可能不需要工具&lt;/li&gt;
&lt;li&gt;需要访问项目、网页、终端、外部系统：通常一定会用工具&lt;/li&gt;
&lt;li&gt;需要长期复用的流程：通常还会涉及 skill&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  第三步：理解“长期表现来自技能、记忆和上下文文件”
&lt;/h3&gt;

&lt;p&gt;同一个模型在 Hermes 里表现更稳定，往往不是因为模型突然变强，而是因为：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;你给了它合适的 &lt;code&gt;AGENTS.md&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;你把重复流程做成了 skill&lt;/li&gt;
&lt;li&gt;你让它把长期事实写进了 memory&lt;/li&gt;
&lt;li&gt;你没有频繁打断 prompt cache&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  常见场景
&lt;/h2&gt;

&lt;h3&gt;
  
  
  场景 1：本地开发助手
&lt;/h3&gt;

&lt;p&gt;你在项目根目录启动 &lt;code&gt;hermes&lt;/code&gt;，让它读 &lt;code&gt;AGENTS.md&lt;/code&gt;、搜索代码、跑测试、改文件。这个场景最依赖 CLI、terminal、file、toolset 和上下文文件。&lt;/p&gt;

&lt;h3&gt;
  
  
  场景 2：消息平台上的远程代理
&lt;/h3&gt;

&lt;p&gt;你把 Hermes 部署在一台服务器上，用 Telegram 或 Discord 与它对话，让它代你查信息、执行脚本、推送定时报告。这个场景最依赖 Gateway、allowlist、home channel 和 cron。&lt;/p&gt;

&lt;h3&gt;
  
  
  场景 3：连接企业内部系统
&lt;/h3&gt;

&lt;p&gt;你希望 Hermes 能访问公司文档、数据库、内部 API 或 GitHub 工作流，但不想给 Hermes core 写一堆新工具。这时通常应该优先考虑 MCP。&lt;/p&gt;

&lt;h2&gt;
  
  
  常见问题与排错
&lt;/h2&gt;

&lt;h3&gt;
  
  
  为什么说 Hermes 不等于 IDE copilot
&lt;/h3&gt;

&lt;p&gt;IDE copilot 更像“对当前编辑环境的增强”；Hermes 更像“拥有多种入口和工具的独立 agent 运行时”。它可以不在 IDE 里，不在你的本机上，甚至不在你当前打开的项目里。&lt;/p&gt;

&lt;h3&gt;
  
  
  为什么有时候 Hermes 看起来“不会做事”
&lt;/h3&gt;

&lt;p&gt;最常见的原因不是模型不够强，而是：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;对应工具没启用&lt;/li&gt;
&lt;li&gt;需要的 API key 没配置&lt;/li&gt;
&lt;li&gt;toolset 不包含该能力&lt;/li&gt;
&lt;li&gt;上下文不够清楚&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;这些问题在后续章节都会展开。&lt;/p&gt;

&lt;h2&gt;
  
  
  本章总结
&lt;/h2&gt;

&lt;p&gt;Hermes Agent 的核心不是某一个模型，而是一整套围绕 agent 循环组织起来的运行系统。后面所有章节，本质上都在回答三个问题：Hermes 能做什么、怎么让它做对、以及怎么让它长期稳定地做。&lt;/p&gt;

&lt;h2&gt;
  
  
  下一步建议
&lt;/h2&gt;

&lt;p&gt;继续看 &lt;a href="//./02-installation-and-setup.md"&gt;安装与初始化&lt;/a&gt;，把 Hermes 真正跑起来。&lt;/p&gt;

</description>
      <category>hermes</category>
      <category>hermesagent</category>
    </item>
    <item>
      <title>Hermes Agent 完整使用教程</title>
      <dc:creator>Henry Lin</dc:creator>
      <pubDate>Fri, 10 Apr 2026 06:48:14 +0000</pubDate>
      <link>https://forem.com/henry_lin_3ac6363747f45b4/hermes-agent-wan-zheng-shi-yong-jiao-cheng-371m</link>
      <guid>https://forem.com/henry_lin_3ac6363747f45b4/hermes-agent-wan-zheng-shi-yong-jiao-cheng-371m</guid>
      <description>&lt;h1&gt;
  
  
  Hermes Agent 完整使用教程
&lt;/h1&gt;

&lt;h2&gt;
  
  
  目录
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Hermes 是什么&lt;/li&gt;
&lt;li&gt;安装与初始化&lt;/li&gt;
&lt;li&gt;第一次进入 CLI&lt;/li&gt;
&lt;li&gt;配置、模型与 profile&lt;/li&gt;
&lt;li&gt;工具、toolset 与执行边界&lt;/li&gt;
&lt;li&gt;skill、memory 与上下文文件&lt;/li&gt;
&lt;li&gt;MCP 接入外部系统&lt;/li&gt;
&lt;li&gt;Gateway 与多平台使用&lt;/li&gt;
&lt;li&gt;cron、后台任务与自动化&lt;/li&gt;
&lt;li&gt;开发扩展&lt;/li&gt;
&lt;li&gt;调试、测试与排障&lt;/li&gt;
&lt;li&gt;最佳实践&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  1. Hermes 是什么
&lt;/h2&gt;

&lt;p&gt;Hermes Agent 不是单纯的聊天界面，也不是只能在 IDE 里工作的代码补全器。它更像一个统一的 agent 运行时：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;在 CLI 里，它可以读写文件、执行命令、管理会话、切换模型、调用工具&lt;/li&gt;
&lt;li&gt;在 Gateway 里，它可以通过 Telegram、Discord、Slack、WhatsApp、Signal 等平台长期在线&lt;/li&gt;
&lt;li&gt;通过 skill、memory 和 context file，它能把流程知识、事实信息和项目约束长期保留下来&lt;/li&gt;
&lt;li&gt;通过 MCP 和 plugins，它能对接外部系统&lt;/li&gt;
&lt;li&gt;通过 cron 和背景任务，它能定时、异步、持续地工作&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;你可以把 Hermes 的核心结构概括成下面几层：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;入口层：CLI、Gateway、ACP、batch runner&lt;/li&gt;
&lt;li&gt;agent 层：&lt;code&gt;AIAgent&lt;/code&gt; 和 prompt / provider / tool 调度&lt;/li&gt;
&lt;li&gt;执行层：tools、toolsets、terminal backend、browser backend、MCP&lt;/li&gt;
&lt;li&gt;持久层：sessions、memory、skills、profiles&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;这意味着 Hermes 的效果不仅取决于模型，还取决于工具可用性、上下文质量和你的使用方式。&lt;/p&gt;

&lt;h2&gt;
  
  
  2. 安装与初始化
&lt;/h2&gt;

&lt;h3&gt;
  
  
  普通安装
&lt;/h3&gt;

&lt;p&gt;最快的方式是官方安装脚本：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash
&lt;span class="nb"&gt;source&lt;/span&gt; ~/.bashrc
&lt;span class="c"&gt;# 或 source ~/.zshrc&lt;/span&gt;
hermes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;官方支持 Linux、macOS 和 WSL2。原生 Windows 不在推荐路径里。&lt;/p&gt;

&lt;h3&gt;
  
  
  仓库开发安装
&lt;/h3&gt;

&lt;p&gt;如果你打算直接修改仓库：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/NousResearch/hermes-agent.git
&lt;span class="nb"&gt;cd &lt;/span&gt;hermes-agent
uv venv venv &lt;span class="nt"&gt;--python&lt;/span&gt; 3.11
&lt;span class="nb"&gt;source &lt;/span&gt;venv/bin/activate
uv pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;".[all,dev]"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;对于这个仓库本身，&lt;code&gt;AGENTS.md&lt;/code&gt; 明确要求：运行 Python 相关命令前要先 &lt;code&gt;source venv/bin/activate&lt;/code&gt;。&lt;/p&gt;

&lt;h3&gt;
  
  
  初始化配置
&lt;/h3&gt;

&lt;p&gt;首次安装后建议运行：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;hermes setup
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;它会帮你处理：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;模型与 provider&lt;/li&gt;
&lt;li&gt;terminal backend&lt;/li&gt;
&lt;li&gt;gateway 平台&lt;/li&gt;
&lt;li&gt;tools&lt;/li&gt;
&lt;li&gt;agent 行为&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;默认配置目录是 &lt;code&gt;~/.hermes/&lt;/code&gt;，你最需要知道的文件通常是：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;~/.hermes/config.yaml&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;~/.hermes/.env&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;~/.hermes/SOUL.md&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;.env&lt;/code&gt; 里通常先配一个可用 provider，例如：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;OPENROUTER_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;...

智谱 glm 配置： 
base-url 写这个：
https://open.bigmodel.cn/api/coding/paas/v4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;安装验证建议用：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;hermes version
hermes doctor
hermes status
hermes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3. 第一次进入 CLI
&lt;/h2&gt;

&lt;p&gt;CLI 是最完整的主入口。推荐你第一次就用它，而不是先上消息平台。&lt;/p&gt;

&lt;p&gt;启动：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;hermes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;进入后先跑这几条：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/help
/model
/usage
/toolsets
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;然后给一个带动作的任务，而不是“你好”，例如：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;阅读当前目录结构并总结这个仓库的核心组成。
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;这样你能马上看到 Hermes 是否会用 file 或 terminal 工具。&lt;/p&gt;

&lt;h3&gt;
  
  
  你很快会常用到的命令
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;/new&lt;/code&gt; / &lt;code&gt;/reset&lt;/code&gt;：新会话&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/title&lt;/code&gt;：命名会话&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/resume&lt;/code&gt;：恢复命名会话&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/model&lt;/code&gt;：切换模型&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/usage&lt;/code&gt;：看 token、成本、上下文&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/compress&lt;/code&gt;：压缩上下文&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/verbose&lt;/code&gt;：观察工具输出&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/background &amp;lt;prompt&amp;gt;&lt;/code&gt;：后台启动独立任务&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/skills&lt;/code&gt;：搜索和安装 skill&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/tools list&lt;/code&gt;：看当前工具&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;CLI 外也别忘了：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;hermes &lt;span class="nt"&gt;-c&lt;/span&gt;
hermes &lt;span class="nt"&gt;-r&lt;/span&gt; &lt;span class="s2"&gt;"session-title"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;复杂任务建议尽早 &lt;code&gt;/title&lt;/code&gt;，否则后续恢复会话会很痛苦。&lt;/p&gt;

&lt;h2&gt;
  
  
  4. 配置、模型与 profile
&lt;/h2&gt;

&lt;p&gt;Hermes 的配置分两类：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;config.yaml&lt;/code&gt;：结构化行为配置&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.env&lt;/code&gt;：API key、base URL、平台 token、终端环境变量等&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;最常见的 provider 相关变量有：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;OPENROUTER_API_KEY&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;OPENAI_API_KEY&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;OPENAI_BASE_URL&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ANTHROPIC_API_KEY&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GLM_API_KEY&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;选择模型最直接的方式是：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;hermes model
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;会话中可以：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/model
/model openrouter:anthropic/claude-sonnet-4
/model zai:glm-5
/model custom:qwen-2.5
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  profile 为什么重要
&lt;/h3&gt;

&lt;p&gt;如果你有多个用途，强烈建议用 profile 隔离，而不是把所有配置堆在一个默认实例里。&lt;/p&gt;

&lt;p&gt;常见命令：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;hermes profile list
hermes profile create work &lt;span class="nt"&gt;--clone&lt;/span&gt;
hermes profile use work
hermes profile show work
hermes profile use default
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;profile 隔离的是整套 Hermes home，包括配置、技能、会话、memory、gateway 状态等。&lt;/p&gt;

&lt;h3&gt;
  
  
  关于 prompt cache
&lt;/h3&gt;

&lt;p&gt;Hermes 很依赖稳定的系统提示前缀来命中缓存。频繁改模型、系统提示、上下文文件、技能加载方式，会提高成本并降低会话稳定性。不要把“中途乱改配置”当作常态。&lt;/p&gt;

&lt;h2&gt;
  
  
  5. 工具、toolset 与执行边界
&lt;/h2&gt;

&lt;p&gt;Hermes 的执行力来自工具。每个工具属于一个 toolset，你平时更常控制的是 toolset。&lt;/p&gt;

&lt;p&gt;常见 toolset：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;file&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;terminal&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;web&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;browser&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;skills&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;memory&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;code_execution&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;delegation&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cronjob&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;查看当前会话可用能力：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/toolsets
/tools list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;从命令行按会话选择：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;hermes chat &lt;span class="nt"&gt;--toolsets&lt;/span&gt; web,file,terminal
hermes chat &lt;span class="nt"&gt;--toolsets&lt;/span&gt; debugging
hermes chat &lt;span class="nt"&gt;--toolsets&lt;/span&gt; all
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  怎样选对工具层级
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;读写搜索文件：&lt;code&gt;file&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;真正执行命令：&lt;code&gt;terminal&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;快速搜索网页或抽取正文：&lt;code&gt;web&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;点击按钮、填表单、真实页面交互：&lt;code&gt;browser&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;多步机械流程：&lt;code&gt;execute_code&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;并行子任务或新上下文分析：&lt;code&gt;delegate_task&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;高频误区是“什么都开、什么都用”，这会增加风险、成本和不可预测性。更好的方式是为任务提供最小且足够的能力集合。&lt;/p&gt;

&lt;h2&gt;
  
  
  6. skill、memory 与上下文文件
&lt;/h2&gt;

&lt;p&gt;Hermes 的长期稳定性主要来自三类东西：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;skill：如何做&lt;/li&gt;
&lt;li&gt;memory：是什么&lt;/li&gt;
&lt;li&gt;context file：默认背景和规则&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  使用 skill
&lt;/h3&gt;

&lt;p&gt;查看和安装：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/skills
/skills search docker
/skills browse
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;或：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;hermes skills list
hermes skills &lt;span class="nb"&gt;install &lt;/span&gt;official/research/arxiv
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;skill 安装后通常会直接变成 slash command，例如：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/plan 设计一个 REST API
/ascii-art Make a banner
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  使用 memory
&lt;/h3&gt;

&lt;p&gt;适合保存长期事实，例如：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;记住：我们的 CI 用 GitHub Actions，部署工作流是 deploy.yml。
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  使用 &lt;code&gt;AGENTS.md&lt;/code&gt; 和 &lt;code&gt;SOUL.md&lt;/code&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;AGENTS.md&lt;/code&gt;：项目规则、架构约束、测试要求&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;SOUL.md&lt;/code&gt;：Hermes 的长期风格和行为倾向&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;如果你总在重复同一批规则，就应该把它们写进 &lt;code&gt;AGENTS.md&lt;/code&gt;，而不是继续每次重说。&lt;/p&gt;

&lt;h3&gt;
  
  
  一个重要限制
&lt;/h3&gt;

&lt;p&gt;不要把 &lt;code&gt;AGENTS.md&lt;/code&gt; 写成百科全书。它会进入系统上下文，太长会增加成本并稀释重点。&lt;/p&gt;

&lt;h2&gt;
  
  
  7. MCP 接入外部系统
&lt;/h2&gt;

&lt;p&gt;MCP 适合把外部系统接成 Hermes 的工具。例如 GitHub、文件系统、内部 API、远程知识库。&lt;/p&gt;

&lt;p&gt;当前仓库和代码使用的配置键是：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;mcp_servers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="s"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;不是 &lt;code&gt;mcp.servers&lt;/code&gt;。&lt;/p&gt;

&lt;h3&gt;
  
  
  最小 stdio 示例
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;mcp_servers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;filesystem&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;npx"&lt;/span&gt;
    &lt;span class="na"&gt;args&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;-y"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;@modelcontextprotocol/server-filesystem"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/home/user/projects"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  最小 HTTP 示例
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;mcp_servers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;company_api&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://mcp.internal.example.com"&lt;/span&gt;
    &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;Authorization&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Bearer&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;***"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;改完配置后，记得：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/reload-mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  先过滤，再暴露
&lt;/h3&gt;

&lt;p&gt;非常推荐一开始就做白名单或黑名单控制：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;mcp_servers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;github&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;command&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;npx"&lt;/span&gt;
    &lt;span class="na"&gt;args&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;-y"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;@modelcontextprotocol/server-github"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
    &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;GITHUB_PERSONAL_ACCESS_TOKEN&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;***"&lt;/span&gt;
    &lt;span class="na"&gt;tools&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;include&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;list_issues&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;create_issue&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;search_code&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
      &lt;span class="na"&gt;prompts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
      &lt;span class="na"&gt;resources&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;判断标准可以记为：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;内置工具已经够用：优先内置工具&lt;/li&gt;
&lt;li&gt;只是流程复杂：优先 skill&lt;/li&gt;
&lt;li&gt;需要接外部系统：优先 MCP&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  8. Gateway 与多平台使用
&lt;/h2&gt;

&lt;p&gt;Hermes 可以通过 gateway 暴露到 Telegram、Discord、Slack、WhatsApp、Signal 等平台。&lt;/p&gt;

&lt;p&gt;核心命令：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;hermes gateway setup
hermes gateway run
hermes gateway start
hermes gateway stop
hermes gateway status
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;常见平台变量包括：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;TELEGRAM_BOT_TOKEN&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;DISCORD_BOT_TOKEN&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;SLACK_BOT_TOKEN&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;SLACK_APP_TOKEN&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  授权控制必须认真做
&lt;/h3&gt;

&lt;p&gt;不要轻易开放所有用户。优先配置：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;TELEGRAM_ALLOWED_USERS&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;DISCORD_ALLOWED_USERS&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GATEWAY_ALLOWED_USERS&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  home channel 很重要
&lt;/h3&gt;

&lt;p&gt;进入对应聊天后执行：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/sethome
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;cron 和后台结果才知道发去哪里。&lt;/p&gt;

&lt;p&gt;消息平台常见命令包括：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/new&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/status&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/model&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/personality&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/retry&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/undo&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/sethome&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/compress&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/title&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/resume&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/usage&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/reload-mcp&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/background&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;而 &lt;code&gt;/tools&lt;/code&gt;、&lt;code&gt;/toolsets&lt;/code&gt;、&lt;code&gt;/browser&lt;/code&gt; 之类通常更偏 CLI。&lt;/p&gt;

&lt;h2&gt;
  
  
  9. cron、后台任务与自动化
&lt;/h2&gt;

&lt;p&gt;Hermes 的 cron 是“在新 session 中运行一个 agent 任务”，而不是单纯执行系统计划任务。所以最关键的规则是：&lt;/p&gt;

&lt;p&gt;你的 prompt 必须完全自包含。&lt;/p&gt;

&lt;h3&gt;
  
  
  创建 job
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/cron add "0 9 * * 1" 生成每周 AI 摘要并发送到 home channel。
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;或：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;hermes cron create &lt;span class="s2"&gt;"0 9 * * 1"&lt;/span&gt; &lt;span class="s2"&gt;"生成每周 AI 摘要并发送到 home channel。"&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; &lt;span class="s2"&gt;"weekly-ai"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;常见管理：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/cron list
/cron run &amp;lt;job_id&amp;gt;
/cron pause &amp;lt;job_id&amp;gt;
/cron resume &amp;lt;job_id&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  背景任务
&lt;/h3&gt;

&lt;p&gt;如果只是想把当前任务异步化，而不是按时间重复执行：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/background 总结这个仓库的工具系统并写一份建议。
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  自动化设计的一个好模式
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;脚本负责抓数据、做机械步骤、保存状态&lt;/li&gt;
&lt;li&gt;agent 负责解释、筛选、总结&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;很多监控类任务还应该显式约定：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;如果没有变化，回复 [SILENT]。
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;这样不会把通知刷屏。&lt;/p&gt;

&lt;h2&gt;
  
  
  10. 开发扩展
&lt;/h2&gt;

&lt;p&gt;如果你要修改这个仓库，先记住关键结构：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;run_agent.py&lt;/code&gt;：AIAgent 核心循环&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cli.py&lt;/code&gt;：CLI&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gateway/run.py&lt;/code&gt;：Gateway&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;model_tools.py&lt;/code&gt;：工具发现和 dispatch&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;tools/registry.py&lt;/code&gt;：工具注册&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;toolsets.py&lt;/code&gt;：工具分组&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  新增 tool 的最小路径
&lt;/h3&gt;

&lt;p&gt;一般要动 3 个地方：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;code&gt;tools/your_tool.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;toolsets.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;model_tools.py&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;其中 handler 应返回 JSON 字符串，错误也应包装成 JSON。&lt;/p&gt;

&lt;h3&gt;
  
  
  新增 slash command
&lt;/h3&gt;

&lt;p&gt;一般要动：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;code&gt;hermes_cli/commands.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cli.py&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gateway/run.py&lt;/code&gt;（如果 Gateway 也支持）&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  profile-safe 规则
&lt;/h3&gt;

&lt;p&gt;不要硬编码 &lt;code&gt;~/.hermes&lt;/code&gt;。代码里应使用：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;get_hermes_home()&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;用户可见提示中应使用：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;display_hermes_home()&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  本仓库开发测试
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;source &lt;/span&gt;venv/bin/activate
python &lt;span class="nt"&gt;-m&lt;/span&gt; pytest tests/ &lt;span class="nt"&gt;-q&lt;/span&gt;
python &lt;span class="nt"&gt;-m&lt;/span&gt; pytest tests/test_model_tools.py &lt;span class="nt"&gt;-q&lt;/span&gt;
python &lt;span class="nt"&gt;-m&lt;/span&gt; pytest tests/gateway/ &lt;span class="nt"&gt;-q&lt;/span&gt;
python &lt;span class="nt"&gt;-m&lt;/span&gt; pytest tests/tools/ &lt;span class="nt"&gt;-q&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  11. 调试、测试与排障
&lt;/h2&gt;

&lt;p&gt;遇到问题时，先按层次判断：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;安装层：&lt;code&gt;hermes&lt;/code&gt; 能否启动&lt;/li&gt;
&lt;li&gt;provider 层：认证、API key、base URL&lt;/li&gt;
&lt;li&gt;tool 层：toolset 是否启用，依赖是否满足&lt;/li&gt;
&lt;li&gt;MCP 层：server 是否加载&lt;/li&gt;
&lt;li&gt;Gateway 层：token、allowlist、home channel&lt;/li&gt;
&lt;li&gt;上下文层：skills、memory、会话状态、prompt cache&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;通用命令：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;hermes doctor
hermes status
hermes version
hermes profile show &amp;lt;name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;CLI 内常用辅助：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/model
/usage
/toolsets
/tools list
/verbose
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;MCP 问题优先检查：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;mcp_servers&lt;/code&gt; 键名是否正确&lt;/li&gt;
&lt;li&gt;本地依赖命令是否存在&lt;/li&gt;
&lt;li&gt;是否执行了 &lt;code&gt;/reload-mcp&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;消息平台问题优先检查：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;token 是否正确&lt;/li&gt;
&lt;li&gt;allowlist 是否允许当前用户&lt;/li&gt;
&lt;li&gt;是否需要 mention&lt;/li&gt;
&lt;li&gt;home channel 是否配置&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;不要一上来就删整个 &lt;code&gt;~/.hermes&lt;/code&gt;。大多数问题都可以局部定位。&lt;/p&gt;

&lt;h2&gt;
  
  
  12. 最佳实践
&lt;/h2&gt;

&lt;p&gt;最后给你一套更稳的长期使用方式：&lt;/p&gt;

&lt;h3&gt;
  
  
  1. 第一条消息尽量把上下文给够
&lt;/h3&gt;

&lt;p&gt;不要只说“帮我修一下”。尽量直接给：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;文件路径&lt;/li&gt;
&lt;li&gt;错误信息&lt;/li&gt;
&lt;li&gt;期望结果&lt;/li&gt;
&lt;li&gt;约束条件&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. 复杂任务先命名会话
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/title auth-refactor
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;以后恢复就简单很多。&lt;/p&gt;

&lt;h3&gt;
  
  
  3. 重要规则写进 &lt;code&gt;AGENTS.md&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;不要依赖聊天记录记住所有项目约定。&lt;/p&gt;

&lt;h3&gt;
  
  
  4. 长会话定期看 &lt;code&gt;/usage&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;必要时 &lt;code&gt;/compress&lt;/code&gt;，不要等上下文快爆了才处理。&lt;/p&gt;

&lt;h3&gt;
  
  
  5. 选对执行方式
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;单一动作：直接工具&lt;/li&gt;
&lt;li&gt;多步机械流程：&lt;code&gt;execute_code&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;并行分析：&lt;code&gt;delegate_task&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;可复用流程：skill&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  6. 用 profile 管隔离
&lt;/h3&gt;

&lt;p&gt;工作、个人、bot、实验环境，最好分 profile，而不是混在一个实例里。&lt;/p&gt;

&lt;h3&gt;
  
  
  7. 对不可信代码使用隔离环境
&lt;/h3&gt;

&lt;p&gt;优先 Docker、Daytona 等，而不是默认本地 terminal。&lt;/p&gt;

&lt;h3&gt;
  
  
  8. 最小暴露原则
&lt;/h3&gt;

&lt;p&gt;toolset、MCP、Gateway 授权都遵循同一个原则：只开必须的，不要因为“以后可能用到”而默认暴露。&lt;/p&gt;

</description>
      <category>hermes</category>
      <category>hermesagent</category>
    </item>
    <item>
      <title>Hermes Agent 项目功能与通用使用场景分析</title>
      <dc:creator>Henry Lin</dc:creator>
      <pubDate>Wed, 08 Apr 2026 13:06:09 +0000</pubDate>
      <link>https://forem.com/henry_lin_3ac6363747f45b4/hermes-agent-xiang-mu-gong-neng-yu-tong-yong-shi-yong-chang-jing-fen-xi-2bi5</link>
      <guid>https://forem.com/henry_lin_3ac6363747f45b4/hermes-agent-xiang-mu-gong-neng-yu-tong-yong-shi-yong-chang-jing-fen-xi-2bi5</guid>
      <description>&lt;h1&gt;
  
  
  Hermes Agent 项目功能与通用使用场景分析
&lt;/h1&gt;

&lt;h2&gt;
  
  
  1. 项目定位
&lt;/h2&gt;

&lt;p&gt;Hermes Agent 是一个通用型 AI Agent 平台，不是单纯的聊天界面，也不是单一的代码助手。它把大模型推理、工具调用、终端执行、文件操作、网页检索、浏览器自动化、长期记忆、定时任务、多平台消息接入和外部系统扩展整合到一个统一框架里。&lt;/p&gt;

&lt;p&gt;从仓库结构和主干代码来看，它的目标不是“回答问题”本身，而是让模型具备持续执行任务的能力，并且能在不同入口、不同环境和不同工具集之间稳定运行。&lt;/p&gt;

&lt;p&gt;可以把它理解为三层系统：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Agent 执行层：负责会话循环、模型调用、工具调度、上下文压缩。&lt;/li&gt;
&lt;li&gt;平台能力层：负责 CLI、消息网关、状态存储、调度、配置、权限边界。&lt;/li&gt;
&lt;li&gt;扩展生态层：负责 skills、MCP、插件、自定义工具和多环境运行。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;所以，Hermes Agent 更接近一个“可运行的 Agent Operating Layer”，而不是一个普通的 LLM 应用。&lt;/p&gt;

&lt;h2&gt;
  
  
  2. 项目主干结构
&lt;/h2&gt;

&lt;p&gt;从代码组织看，几个核心模块职责很清楚：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;run_agent.py&lt;/code&gt;&lt;br&gt;
核心 &lt;code&gt;AIAgent&lt;/code&gt; 实现，负责主对话循环、工具调用、消息历史和最终响应。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;model_tools.py&lt;/code&gt;&lt;br&gt;
工具发现与分发层。仓库里的工具模块在导入时注册到统一 registry，Agent 再按 toolset 组装可用能力。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;tools/registry.py&lt;/code&gt;&lt;br&gt;
工具注册中心，负责 schema、handler、可用性检测和 dispatch。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;toolsets.py&lt;/code&gt;&lt;br&gt;
定义不同场景下的工具组合，比如 CLI、gateway、API server、ACP 等。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;cli.py&lt;/code&gt; 和 &lt;code&gt;hermes_cli/&lt;/code&gt;&lt;br&gt;
提供交互式终端 UI、slash command、模型切换、配置管理、setup、doctor、profile 等。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;gateway/&lt;/code&gt;&lt;br&gt;
提供 Telegram、Discord、Slack、WhatsApp、Signal、Email、Webhook 等消息平台入口。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;hermes_state.py&lt;/code&gt;&lt;br&gt;
使用 SQLite + WAL + FTS5 做会话持久化和全文检索。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;cron/&lt;/code&gt;&lt;br&gt;
提供定时任务能力，支持定时运行 agent 并把结果投递到配置的平台。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;tools/mcp_tool.py&lt;/code&gt;&lt;br&gt;
提供 MCP 接入，把外部系统能力注册成 Hermes 原生工具。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;acp_adapter/&lt;/code&gt;&lt;br&gt;
提供编辑器/ACP 集成能力。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;batch_runner.py&lt;/code&gt;、&lt;code&gt;environments/&lt;/code&gt;&lt;br&gt;
提供批处理、轨迹生成和研究/训练相关能力。&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;从规模上看，这已经是一个完整平台：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;tools/&lt;/code&gt; 下有大量独立工具模块。&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gateway/platforms/&lt;/code&gt; 下有多种消息平台适配器。&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;tests/&lt;/code&gt; 覆盖面很大，说明项目不是演示性质，而是实际维护中的系统。&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  3. 核心功能拆解
&lt;/h2&gt;

&lt;h2&gt;
  
  
  3.1 Agent 会话循环
&lt;/h2&gt;

&lt;p&gt;Hermes 的核心是 &lt;code&gt;AIAgent&lt;/code&gt; 的 tool-calling loop。基本模式是：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;模型接收消息和可用工具定义。&lt;/li&gt;
&lt;li&gt;模型决定是否调用工具。&lt;/li&gt;
&lt;li&gt;Hermes 执行工具，并把结果写回消息历史。&lt;/li&gt;
&lt;li&gt;循环直到模型产出最终答案，或者达到迭代限制。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;这个设计的意义在于，Hermes 不是只让模型“建议怎么做”，而是让模型“真的去做”：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;读取文件&lt;/li&gt;
&lt;li&gt;搜索代码&lt;/li&gt;
&lt;li&gt;执行命令&lt;/li&gt;
&lt;li&gt;查询网页&lt;/li&gt;
&lt;li&gt;调用浏览器&lt;/li&gt;
&lt;li&gt;写入结果&lt;/li&gt;
&lt;li&gt;再根据结果继续行动&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;这使它适合处理多步任务，而不是只做一轮问答。&lt;/p&gt;

&lt;h2&gt;
  
  
  3.2 工具注册与工具集
&lt;/h2&gt;

&lt;p&gt;Hermes 的工具系统是项目的核心之一。&lt;/p&gt;

&lt;p&gt;其特点是：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;工具模块独立存在，一个文件通常负责一个工具域。&lt;/li&gt;
&lt;li&gt;每个工具在导入时自注册到 &lt;code&gt;registry&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;Agent 不直接依赖具体工具，而是通过 toolset 组合决定当前会话能用什么。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;这带来几个好处：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;容易增删工具。&lt;/li&gt;
&lt;li&gt;可以按平台控制权限边界。&lt;/li&gt;
&lt;li&gt;不同入口可以有不同能力集合。&lt;/li&gt;
&lt;li&gt;外部工具可以以统一方式接入。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;从已有代码看，工具能力至少覆盖以下几类：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Web 搜索与网页抽取&lt;/li&gt;
&lt;li&gt;终端执行与进程管理&lt;/li&gt;
&lt;li&gt;文件读写、补丁和搜索&lt;/li&gt;
&lt;li&gt;浏览器自动化&lt;/li&gt;
&lt;li&gt;图像分析与生成&lt;/li&gt;
&lt;li&gt;会话搜索&lt;/li&gt;
&lt;li&gt;记忆与 TODO&lt;/li&gt;
&lt;li&gt;代码执行沙箱&lt;/li&gt;
&lt;li&gt;子代理委派&lt;/li&gt;
&lt;li&gt;定时任务&lt;/li&gt;
&lt;li&gt;跨平台消息发送&lt;/li&gt;
&lt;li&gt;Home Assistant&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;这意味着 Hermes 不是“只有 shell 的 agent”，而是一个多能力编排器。&lt;/p&gt;

&lt;h2&gt;
  
  
  3.3 终端与多执行环境
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;tools/terminal_tool.py&lt;/code&gt; 表明 Hermes 支持多种命令执行后端，而不局限于本机 shell。&lt;/p&gt;

&lt;p&gt;常见后端包括：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;local&lt;/li&gt;
&lt;li&gt;docker&lt;/li&gt;
&lt;li&gt;ssh&lt;/li&gt;
&lt;li&gt;modal&lt;/li&gt;
&lt;li&gt;daytona&lt;/li&gt;
&lt;li&gt;singularity&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;这使 Hermes 能适配不同部署模式：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;本地开发机&lt;/li&gt;
&lt;li&gt;远程服务器&lt;/li&gt;
&lt;li&gt;容器化执行环境&lt;/li&gt;
&lt;li&gt;云端弹性运行环境&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;对通用项目来说，这一点非常重要，因为很多 Agent 系统的问题不是“能不能推理”，而是“能不能在正确环境里做事”。Hermes 在这一层是有明确工程设计的。&lt;/p&gt;

&lt;h2&gt;
  
  
  3.4 CLI 交互系统
&lt;/h2&gt;

&lt;p&gt;Hermes 的 CLI 不是一个简单的 &lt;code&gt;input()&lt;/code&gt; 包装，而是一个完整的终端交互系统。&lt;/p&gt;

&lt;p&gt;它具备：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;多行输入&lt;/li&gt;
&lt;li&gt;slash command&lt;/li&gt;
&lt;li&gt;自动补全&lt;/li&gt;
&lt;li&gt;tool progress 展示&lt;/li&gt;
&lt;li&gt;会话切换和恢复&lt;/li&gt;
&lt;li&gt;模型切换&lt;/li&gt;
&lt;li&gt;配置修改&lt;/li&gt;
&lt;li&gt;交互式 setup&lt;/li&gt;
&lt;li&gt;doctor 诊断&lt;/li&gt;
&lt;li&gt;皮肤和显示层定制&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;这意味着 Hermes 可以作为“长期使用的本地 Agent 工作台”，而不是一次性的命令入口。&lt;/p&gt;

&lt;h2&gt;
  
  
  3.5 消息网关
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;gateway/&lt;/code&gt; 模块是 Hermes 与许多本地 agent 项目区别很大的地方。&lt;/p&gt;

&lt;p&gt;它支持把同一个 agent 接到多种消息平台上，包括：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Telegram&lt;/li&gt;
&lt;li&gt;Discord&lt;/li&gt;
&lt;li&gt;Slack&lt;/li&gt;
&lt;li&gt;WhatsApp&lt;/li&gt;
&lt;li&gt;Signal&lt;/li&gt;
&lt;li&gt;Email&lt;/li&gt;
&lt;li&gt;Webhook&lt;/li&gt;
&lt;li&gt;Home Assistant 等&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;这样带来的通用价值是：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Agent 不必绑定在终端里。&lt;/li&gt;
&lt;li&gt;用户可以从不同平台继续同一个工作流。&lt;/li&gt;
&lt;li&gt;自动任务结果可以直接投递到聊天平台。&lt;/li&gt;
&lt;li&gt;Agent 可以成为团队协作接口，而不是个人玩具。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;如果把 Hermes 放到服务器上，它更像一个“随处可用的个人/团队执行代理”。&lt;/p&gt;

&lt;h2&gt;
  
  
  3.6 会话持久化与检索
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;hermes_state.py&lt;/code&gt; 使用 SQLite + WAL + FTS5 管理 session 和 message。&lt;/p&gt;

&lt;p&gt;这不是轻量日志，而是明确的长期状态存储设计，提供：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;会话持久化&lt;/li&gt;
&lt;li&gt;历史消息恢复&lt;/li&gt;
&lt;li&gt;全文检索&lt;/li&gt;
&lt;li&gt;标题化与检索式恢复&lt;/li&gt;
&lt;li&gt;跨会话搜索&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;这类能力对长期使用的 Agent 非常关键，因为很多真正有价值的任务不是“当场回答”，而是：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;记住上次做到哪里&lt;/li&gt;
&lt;li&gt;找回过去解决过的问题&lt;/li&gt;
&lt;li&gt;在多个 session 中复用历史上下文&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Hermes 在这方面明显不是无状态聊天框架。&lt;/p&gt;

&lt;h2&gt;
  
  
  3.7 记忆与技能系统
&lt;/h2&gt;

&lt;p&gt;Hermes 还有两个比较有辨识度的方向：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;memory&lt;/li&gt;
&lt;li&gt;skills&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;memory 的作用偏向长期事实沉淀，比如偏好、约束、常用模式。&lt;/p&gt;

&lt;p&gt;skills 的作用偏向流程化知识沉淀，即：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;某类任务怎么做&lt;/li&gt;
&lt;li&gt;哪些步骤固定可复用&lt;/li&gt;
&lt;li&gt;某个工作流如何标准化&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;从仓库设计看，skills 不是装饰功能，而是平台的一部分：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CLI 和 gateway 里有对应命令&lt;/li&gt;
&lt;li&gt;prompt builder 会把相关指令纳入系统 prompt 逻辑&lt;/li&gt;
&lt;li&gt;skill 文件体系是长期工作流复用的重要机制&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;这使 Hermes 更接近“能积累经验的 agent”，而不是每轮都从零开始。&lt;/p&gt;

&lt;h2&gt;
  
  
  3.8 上下文压缩与长任务支持
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;agent/context_compressor.py&lt;/code&gt; 显示 Hermes 对长对话场景有明确支持：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;接近上下文上限时自动压缩&lt;/li&gt;
&lt;li&gt;旧工具输出裁剪&lt;/li&gt;
&lt;li&gt;结构化摘要&lt;/li&gt;
&lt;li&gt;保留头尾关键内容&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;这很重要，因为真实任务里，很多 Agent 失败不是因为模型不会，而是因为：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;对话太长&lt;/li&gt;
&lt;li&gt;工具输出太多&lt;/li&gt;
&lt;li&gt;历史信息失控&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Hermes 在工程上显式处理了这个问题，因此更适合长流程任务。&lt;/p&gt;

&lt;h2&gt;
  
  
  3.9 子代理与程序化工具调用
&lt;/h2&gt;

&lt;p&gt;Hermes 不只支持“一个 agent 干到底”，还支持：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;delegate_task&lt;/code&gt; 子代理委派&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;execute_code&lt;/code&gt; 程序化工具调用&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;子代理的意义是把复杂问题拆开，让多个上下文隔离的 agent 并行处理。&lt;/p&gt;

&lt;p&gt;程序化工具调用的意义是让模型先写一个 Python 脚本，再由脚本批量调用工具，通过 RPC 完成多步操作，减少模型回合数。&lt;/p&gt;

&lt;p&gt;这种设计很适合：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;需要并行调查多个问题&lt;/li&gt;
&lt;li&gt;需要对多个对象执行重复步骤&lt;/li&gt;
&lt;li&gt;需要压缩 token 成本&lt;/li&gt;
&lt;li&gt;需要将步骤型操作转成脚本化流程&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;这说明 Hermes 在“任务执行效率”上做过比较深的思考。&lt;/p&gt;

&lt;h2&gt;
  
  
  3.10 定时任务与后台自动化
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;cron/&lt;/code&gt; 模块使 Hermes 具备调度能力，而不是只能交互式运行。&lt;/p&gt;

&lt;p&gt;典型能力包括：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;定时运行 prompt&lt;/li&gt;
&lt;li&gt;触发数据收集脚本&lt;/li&gt;
&lt;li&gt;保存输出&lt;/li&gt;
&lt;li&gt;推送结果到聊天平台&lt;/li&gt;
&lt;li&gt;和 gateway 联动执行&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;这让 Hermes 具备“自动运行 agent job”的能力，适合做周期性报告、巡检、整理和提醒类任务。&lt;/p&gt;

&lt;h2&gt;
  
  
  3.11 MCP 与外部系统扩展
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;tools/mcp_tool.py&lt;/code&gt; 是 Hermes 变成“平台型系统”的关键。&lt;/p&gt;

&lt;p&gt;它允许：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;通过 stdio 或 HTTP 连接 MCP server&lt;/li&gt;
&lt;li&gt;自动发现工具&lt;/li&gt;
&lt;li&gt;把外部能力注入 Hermes 工具体系&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;这意味着 Hermes 不需要自己内置所有能力。它更像一个统一壳层，外部系统可以通过 MCP 接入，例如：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;公司内部 API&lt;/li&gt;
&lt;li&gt;数据平台&lt;/li&gt;
&lt;li&gt;Issue 系统&lt;/li&gt;
&lt;li&gt;文档系统&lt;/li&gt;
&lt;li&gt;工单系统&lt;/li&gt;
&lt;li&gt;DevOps 平台&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;这让 Hermes 的上限不再是仓库内置功能，而是可连接生态。&lt;/p&gt;

&lt;h2&gt;
  
  
  3.12 批处理与研究型能力
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;batch_runner.py&lt;/code&gt; 和相关环境目录说明 Hermes 还支持更偏研究/训练的能力：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;批量运行 agent&lt;/li&gt;
&lt;li&gt;保存 trajectory&lt;/li&gt;
&lt;li&gt;统计工具调用情况&lt;/li&gt;
&lt;li&gt;支持研究数据集驱动的运行方式&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;这部分对一般用户未必是核心入口，但对做 agent 评测、数据生成、研究实验的人来说很有价值。&lt;/p&gt;

&lt;h2&gt;
  
  
  4. 项目的通用能力画像
&lt;/h2&gt;

&lt;p&gt;如果把上面这些功能浓缩成一句话，Hermes 的通用能力画像是：&lt;/p&gt;

&lt;p&gt;“一个可长期运行、可跨平台接入、可调用多种工具、可持久化记忆与会话、可调度自动任务、可连接外部系统的通用 Agent 平台。”&lt;/p&gt;

&lt;p&gt;更具体一点，它擅长以下五类事情：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;把自然语言任务转成多步执行流程。&lt;/li&gt;
&lt;li&gt;把多种工具和外部系统统一成一个可调用层。&lt;/li&gt;
&lt;li&gt;把 agent 从终端扩展到聊天平台和后台任务。&lt;/li&gt;
&lt;li&gt;把历史会话、技能和记忆沉淀成长期资产。&lt;/li&gt;
&lt;li&gt;把一次性问答升级成持续运行的工作流。&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  5. 典型使用场景
&lt;/h2&gt;

&lt;p&gt;以下场景不依赖任何特定行业，基本都适用于通用团队或个人用户。&lt;/p&gt;

&lt;h2&gt;
  
  
  5.1 个人长期助手
&lt;/h2&gt;

&lt;p&gt;这是最直接的场景。&lt;/p&gt;

&lt;p&gt;Hermes 可以作为个人长期助手，承担：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;日常查询&lt;/li&gt;
&lt;li&gt;文件整理&lt;/li&gt;
&lt;li&gt;命令执行&lt;/li&gt;
&lt;li&gt;提醒和定时任务&lt;/li&gt;
&lt;li&gt;历史会话回顾&lt;/li&gt;
&lt;li&gt;在 Telegram/Slack 上继续同一会话&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;和普通聊天助手相比，它的优势在于：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;能执行动作&lt;/li&gt;
&lt;li&gt;能记忆历史&lt;/li&gt;
&lt;li&gt;能跨端继续&lt;/li&gt;
&lt;li&gt;能定时自动运行&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  5.2 开发与调试助手
&lt;/h2&gt;

&lt;p&gt;这是 Hermes 很强的适用面之一。&lt;/p&gt;

&lt;p&gt;它适合：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;阅读和搜索代码&lt;/li&gt;
&lt;li&gt;修改文件&lt;/li&gt;
&lt;li&gt;执行测试&lt;/li&gt;
&lt;li&gt;分析日志&lt;/li&gt;
&lt;li&gt;运行 shell 命令&lt;/li&gt;
&lt;li&gt;编写脚本&lt;/li&gt;
&lt;li&gt;使用子代理并行调查问题&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;尤其在大型代码库中，它比“只会生成代码的助手”更强，因为它能在本地环境真实执行和验证。&lt;/p&gt;

&lt;h2&gt;
  
  
  5.3 研究与资料整理助手
&lt;/h2&gt;

&lt;p&gt;Hermes 很适合承担资料型任务：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;搜索网页&lt;/li&gt;
&lt;li&gt;抽取网页内容&lt;/li&gt;
&lt;li&gt;汇总多来源信息&lt;/li&gt;
&lt;li&gt;生成摘要&lt;/li&gt;
&lt;li&gt;保存结果&lt;/li&gt;
&lt;li&gt;周期性监控某类主题变化&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;如果配合 cron 和消息推送，可以形成自动研究简报工作流。&lt;/p&gt;

&lt;h2&gt;
  
  
  5.4 运维与巡检助手
&lt;/h2&gt;

&lt;p&gt;通过 terminal、process、cron 和 messaging，Hermes 很适合做轻量运维助手：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;定时检查服务状态&lt;/li&gt;
&lt;li&gt;分析日志&lt;/li&gt;
&lt;li&gt;发现异常后推送消息&lt;/li&gt;
&lt;li&gt;执行标准化恢复动作&lt;/li&gt;
&lt;li&gt;汇总巡检结果&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;它不一定适合作为高风险生产控制核心，但很适合作为巡检、观察、汇报和半自动处置层。&lt;/p&gt;

&lt;h2&gt;
  
  
  5.5 团队协作 Agent
&lt;/h2&gt;

&lt;p&gt;由于 Hermes 有 gateway 和跨平台消息能力，它可以作为团队共享入口：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;成员通过 Slack/Telegram 直接发起任务&lt;/li&gt;
&lt;li&gt;Agent 拉取上下文并执行&lt;/li&gt;
&lt;li&gt;结果回传到团队频道&lt;/li&gt;
&lt;li&gt;定时任务自动发日报、周报、告警和摘要&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;这使它适合做团队内部的“智能机器人基础设施”。&lt;/p&gt;

&lt;h2&gt;
  
  
  5.6 文档与知识管理助手
&lt;/h2&gt;

&lt;p&gt;Hermes 也适合做知识型工作：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;搜索历史会话&lt;/li&gt;
&lt;li&gt;归纳结论&lt;/li&gt;
&lt;li&gt;生成知识文档&lt;/li&gt;
&lt;li&gt;维护标准操作流程&lt;/li&gt;
&lt;li&gt;把重复问题沉淀成 skills&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;相比只接数据库检索的知识机器人，它更强的地方在于它还能行动，能在整理知识时顺便验证、修正和生成产物。&lt;/p&gt;

&lt;h2&gt;
  
  
  5.7 自动化报告系统
&lt;/h2&gt;

&lt;p&gt;这是 Hermes 很自然的落地形式。&lt;/p&gt;

&lt;p&gt;例如：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;每天整理新闻摘要&lt;/li&gt;
&lt;li&gt;每周汇总项目状态&lt;/li&gt;
&lt;li&gt;每小时巡检服务健康度&lt;/li&gt;
&lt;li&gt;每晚生成工作进展报告&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;其关键能力来自：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;cron&lt;/li&gt;
&lt;li&gt;web / terminal / file 工具&lt;/li&gt;
&lt;li&gt;持久化会话&lt;/li&gt;
&lt;li&gt;messaging 投递&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  5.8 多系统统一入口
&lt;/h2&gt;

&lt;p&gt;如果一个组织已经有多个内部系统，Hermes 很适合作为统一自然语言入口。&lt;/p&gt;

&lt;p&gt;通过 MCP 或自定义工具，可以把这些系统统一接入：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;文档平台&lt;/li&gt;
&lt;li&gt;项目管理平台&lt;/li&gt;
&lt;li&gt;CI/CD&lt;/li&gt;
&lt;li&gt;工单系统&lt;/li&gt;
&lt;li&gt;内部 API&lt;/li&gt;
&lt;li&gt;知识库&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;这样用户就不必记住每个系统的入口和操作语法，而是通过 Hermes 统一调度。&lt;/p&gt;

&lt;h2&gt;
  
  
  6. 项目的工程价值
&lt;/h2&gt;

&lt;p&gt;Hermes 的工程价值主要体现在以下方面。&lt;/p&gt;

&lt;h2&gt;
  
  
  6.1 它不是玩具式 agent
&lt;/h2&gt;

&lt;p&gt;很多 agent 项目能 demo，但很难长期用。Hermes 明显考虑了长期运行问题：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;状态持久化&lt;/li&gt;
&lt;li&gt;工具分层&lt;/li&gt;
&lt;li&gt;多入口&lt;/li&gt;
&lt;li&gt;调度&lt;/li&gt;
&lt;li&gt;配置体系&lt;/li&gt;
&lt;li&gt;测试体系&lt;/li&gt;
&lt;li&gt;权限和环境边界&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  6.2 它强调统一入口
&lt;/h2&gt;

&lt;p&gt;CLI、gateway、ACP、API server、cron、MCP 这些模块放在一起，说明 Hermes 的设计目标不是单一产品，而是统一 agent runtime。&lt;/p&gt;

&lt;h2&gt;
  
  
  6.3 它强调可扩展性
&lt;/h2&gt;

&lt;p&gt;registry、toolset、MCP、skills、plugins 这些机制说明 Hermes 的重点之一是“扩展”，不是“把一切写死在主循环里”。&lt;/p&gt;

&lt;h2&gt;
  
  
  6.4 它强调长期记忆和复用
&lt;/h2&gt;

&lt;p&gt;session search、memory、skills、context compression 都在解决一个问题：&lt;/p&gt;

&lt;p&gt;如何让 agent 不只在当前轮聪明，而是在长期使用中变得更有连续性。&lt;/p&gt;

&lt;h2&gt;
  
  
  7. 适合解决的问题类型
&lt;/h2&gt;

&lt;p&gt;Hermes 特别适合下面这些任务：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;多步骤、需要工具执行的任务&lt;/li&gt;
&lt;li&gt;需要长期上下文的任务&lt;/li&gt;
&lt;li&gt;需要跨平台访问的任务&lt;/li&gt;
&lt;li&gt;需要周期性自动运行的任务&lt;/li&gt;
&lt;li&gt;需要连接多个系统的任务&lt;/li&gt;
&lt;li&gt;需要把经验沉淀成标准流程的任务&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;简单说，它适合“工作流型问题”，不只是“知识问答型问题”。&lt;/p&gt;

&lt;h2&gt;
  
  
  8. 不适合解决的问题类型
&lt;/h2&gt;

&lt;p&gt;虽然 Hermes 很强，但也有明确边界。&lt;/p&gt;

&lt;h2&gt;
  
  
  8.1 不适合极低延迟场景
&lt;/h2&gt;

&lt;p&gt;只要核心路径依赖大模型推理和多轮工具调用，就不适合：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;毫秒级交互&lt;/li&gt;
&lt;li&gt;超高频实时控制&lt;/li&gt;
&lt;li&gt;严格时延敏感链路&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  8.2 不适合强确定性核心逻辑
&lt;/h2&gt;

&lt;p&gt;Hermes 适合作为智能编排层，但不适合直接替代：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;严格规则引擎&lt;/li&gt;
&lt;li&gt;事务核心&lt;/li&gt;
&lt;li&gt;高风险审批最终裁决器&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  8.3 不适合无边界的高权限自动执行
&lt;/h2&gt;

&lt;p&gt;它可以执行命令、写文件、接外部系统，因此如果没有工具边界、审批机制和环境隔离，风险会很高。&lt;/p&gt;

&lt;p&gt;项目本身其实已经考虑到这点，所以才有：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;toolset&lt;/li&gt;
&lt;li&gt;approval&lt;/li&gt;
&lt;li&gt;environment backend&lt;/li&gt;
&lt;li&gt;profile&lt;/li&gt;
&lt;li&gt;配置隔离&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  9. 最适合的落地方式
&lt;/h2&gt;

&lt;p&gt;如果从通用使用角度评价，Hermes 最适合以下三种落地方式。&lt;/p&gt;

&lt;h2&gt;
  
  
  9.1 本地个人工作台
&lt;/h2&gt;

&lt;p&gt;适合开发者、研究者、重度终端用户。&lt;/p&gt;

&lt;p&gt;特点：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;直接用 CLI&lt;/li&gt;
&lt;li&gt;连本地代码和 shell&lt;/li&gt;
&lt;li&gt;有历史会话和技能沉淀&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  9.2 服务器上的长期运行 Agent
&lt;/h2&gt;

&lt;p&gt;适合希望让 agent 常驻运行的用户。&lt;/p&gt;

&lt;p&gt;特点：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;部署到 VPS 或云主机&lt;/li&gt;
&lt;li&gt;用 gateway 接 Telegram/Slack 等&lt;/li&gt;
&lt;li&gt;用 cron 定时执行任务&lt;/li&gt;
&lt;li&gt;用消息平台接收结果&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  9.3 组织内部的统一智能接口
&lt;/h2&gt;

&lt;p&gt;适合中大型团队。&lt;/p&gt;

&lt;p&gt;特点：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;通过 MCP 接入内部系统&lt;/li&gt;
&lt;li&gt;通过 gateway 提供统一入口&lt;/li&gt;
&lt;li&gt;通过 skill 和 memory 沉淀组织经验&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  10. 最终评价
&lt;/h2&gt;

&lt;p&gt;Hermes Agent 的核心价值不在于“模型本身多强”，而在于它把一个通用 agent 真正做成了可运行、可扩展、可持续使用的平台。&lt;/p&gt;

&lt;p&gt;如果只看通用功能，它最突出的点有四个：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;工具系统完整，能做真实任务执行。&lt;/li&gt;
&lt;li&gt;多入口统一，既能本地用，也能在消息平台和后台运行。&lt;/li&gt;
&lt;li&gt;长期状态能力强，支持会话、记忆、技能和上下文压缩。&lt;/li&gt;
&lt;li&gt;扩展性好，能通过 MCP 和自定义工具连接外部世界。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;因此，Hermes 最适合被理解为：&lt;/p&gt;

&lt;p&gt;“面向长期任务执行和多系统编排的通用 Agent 平台。”&lt;/p&gt;

&lt;p&gt;它不是最轻的方案，但如果目标是做一个真正能长期用、能接系统、能跑自动化、能在不同入口持续工作的 agent，Hermes 的设计是比较完整的。&lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>automation</category>
      <category>python</category>
    </item>
    <item>
      <title>第1章 什么是 QuantConnect/Lean</title>
      <dc:creator>Henry Lin</dc:creator>
      <pubDate>Sun, 22 Mar 2026 08:17:50 +0000</pubDate>
      <link>https://forem.com/henry_lin_3ac6363747f45b4/di-1zhang-shi-yao-shi-quantconnectlean-3g0j</link>
      <guid>https://forem.com/henry_lin_3ac6363747f45b4/di-1zhang-shi-yao-shi-quantconnectlean-3g0j</guid>
      <description>&lt;h1&gt;
  
  
  第1章 什么是 Lean？
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;本章介绍 Lean 量化交易引擎的基本概念、核心功能以及 Lean 与 Lean CLI 的区别。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  1.1 项目简介
&lt;/h2&gt;

&lt;p&gt;Lean 是 QuantConnect 开源的&lt;strong&gt;事件驱动算法交易平台&lt;/strong&gt;，专为量化交易开发者设计。它提供了完整的策略研究、历史回测、参数优化和实盘交易能力。&lt;/p&gt;

&lt;h3&gt;
  
  
  核心功能
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;功能模块&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;策略研究&lt;/td&gt;
&lt;td&gt;支持在 Jupyter Notebook 中进行数据探索和策略验证&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;历史回测&lt;/td&gt;
&lt;td&gt;基于历史数据模拟交易策略表现&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;参数优化&lt;/td&gt;
&lt;td&gt;自动搜索最优策略参数&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;实盘交易&lt;/td&gt;
&lt;td&gt;支持多家券商的实盘接入&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;多资产类别&lt;/td&gt;
&lt;td&gt;股票、期权、期货、外汇、加密货币等&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  支持的编程语言
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;C#&lt;/strong&gt; - 原生语言，性能最佳&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Python&lt;/strong&gt; - 通过 Python.NET 集成，生态丰富&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  1.2 Lean vs Lean CLI
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Lean Engine（本项目）
&lt;/h3&gt;

&lt;p&gt;Lean Engine 是核心交易引擎，包含：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Lean/
├── Engine/              # 核心引擎
├── Algorithm/           # 算法基类
├── Algorithm.CSharp/    # C# 示例策略
├── Algorithm.Python/    # Python 示例策略
├── Algorithm.Framework/ # 框架化模型
├── Common/              # 通用组件
├── Brokerages/          # 券商接口
└── Launcher/            # 程序入口
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Lean CLI（推荐用于策略开发）
&lt;/h3&gt;

&lt;p&gt;Lean CLI 是命令行工具，简化了 Lean 的使用：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 安装 CLI&lt;/span&gt;
pip &lt;span class="nb"&gt;install &lt;/span&gt;lean

&lt;span class="c"&gt;# 创建项目&lt;/span&gt;
lean project-create

&lt;span class="c"&gt;# 运行回测&lt;/span&gt;
lean backtest

&lt;span class="c"&gt;# 启动研究环境&lt;/span&gt;
lean research
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;何时使用哪个？&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;场景&lt;/th&gt;
&lt;th&gt;推荐工具&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;开发交易策略&lt;/td&gt;
&lt;td&gt;Lean CLI&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;贡献 Lean 源码&lt;/td&gt;
&lt;td&gt;Lean Engine&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;学习内部机制&lt;/td&gt;
&lt;td&gt;Lean Engine&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;快速验证想法&lt;/td&gt;
&lt;td&gt;Lean CLI&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  1.3 核心特性
&lt;/h2&gt;

&lt;h3&gt;
  
  
  事件驱动架构
&lt;/h3&gt;

&lt;p&gt;Lean 采用事件驱动架构，算法响应各种事件：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;AlgorithmImports&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MyAlgorithm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;QCAlgorithm&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;Initialize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="c1"&gt;# 初始化设置
&lt;/span&gt;        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;AddEquity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SPY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Resolution&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Minute&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;OnData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="c1"&gt;# 每个数据点触发
&lt;/span&gt;        &lt;span class="k"&gt;pass&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;OnOrderEvent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;orderEvent&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="c1"&gt;# 订单事件触发
&lt;/span&gt;        &lt;span class="k"&gt;pass&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;OnEndOfDay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;symbol&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="c1"&gt;# 每日收盘时触发
&lt;/span&gt;        &lt;span class="k"&gt;pass&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  多资产类别支持
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;资产类型&lt;/th&gt;
&lt;th&gt;Add 方法&lt;/th&gt;
&lt;th&gt;市场示例&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;股票&lt;/td&gt;
&lt;td&gt;&lt;code&gt;AddEquity()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;USA, China, India&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;外汇&lt;/td&gt;
&lt;td&gt;&lt;code&gt;AddForex()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;EURUSD, USDJPY&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;期货&lt;/td&gt;
&lt;td&gt;&lt;code&gt;AddFuture()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ES, NQ, CL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;期权&lt;/td&gt;
&lt;td&gt;&lt;code&gt;AddOption()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;SPY, AAPL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;加密货币&lt;/td&gt;
&lt;td&gt;&lt;code&gt;AddCrypto()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;BTCUSD, ETHUSD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CFD&lt;/td&gt;
&lt;td&gt;&lt;code&gt;AddCfd()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;各种差价合约&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;指数&lt;/td&gt;
&lt;td&gt;&lt;code&gt;AddIndex()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;SPX, VIX&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  模块化设计
&lt;/h3&gt;

&lt;p&gt;Lean 的每个组件都可以自定义：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────────────────┐
│              QCAlgorithm                    │
│  ┌──────────────────────────────────────┐  │
│  │  Alpha Model        (交易信号生成)    │  │
│  │  Portfolio Model    (组合构建)        │  │
│  │  Execution Model    (订单执行)        │  │
│  │  Risk Model         (风险控制)        │  │
│  │  Universe Model     (证券选择)        │  │
│  └──────────────────────────────────────┘  │
│                                             │
│  ┌──────────────────────────────────────┐  │
│  │  Brokerage          (券商接口)        │  │
│  │  Data Feed          (数据源)          │  │
│  │  Fill Model         (成交模型)        │  │
│  │  Fee Model          (手续费模型)      │  │
│  │  Slippage Model     (滑点模型)        │  │
│  └──────────────────────────────────────┘  │
└─────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  1.4 架构概览
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                        ┌─────────────┐
                        │   用户输入   │
                        └──────┬──────┘
                               │
                        ┌──────▼──────┐
                        │  Launcher   │
                        └──────┬──────┘
                               │
        ┌──────────────────────┼──────────────────────┐
        │                      │                      │
┌───────▼────────┐    ┌────────▼────────┐    ┌───────▼────────┐
│  Algorithm     │    │   Data Feed     │    │   Transaction  │
│  (策略逻辑)    │    │  (数据提供器)    │    │   (交易处理)    │
└───────┬────────┘    └────────┬────────┘    └───────┬────────┘
        │                      │                      │
        └──────────────────────┼──────────────────────┘
                               │
                        ┌──────▼──────┐
                        │   Results    │
                        │  (结果输出)   │
                        └─────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  1.5 本地与云端混合开发
&lt;/h2&gt;

&lt;p&gt;Lean 支持本地开发和云端部署的混合模式：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────┐         ┌─────────────┐
│  本地开发    │  &amp;lt;---&amp;gt;  │  云端平台    │
│  (Lean CLI) │         │(QuantConnect)│
└─────────────┘         └─────────────┘
     • 完整控制              • 数据获取
     • 调试方便              • 云计算资源
     • 数据隐私              • 策略分享
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  1.6 示例：第一个 Lean 算法
&lt;/h2&gt;

&lt;p&gt;下面是一个最简单的 Lean 算法示例：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;AlgorithmImports&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;HelloWorldAlgorithm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;QCAlgorithm&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
    最简单的 Lean 算法示例
    功能：买入并持有 SPY
    &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;Initialize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="c1"&gt;# 1. 设置回测时间范围
&lt;/span&gt;        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;SetStartDate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2023&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;    &lt;span class="c1"&gt;# 开始日期
&lt;/span&gt;        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;SetEndDate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2023&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;31&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;    &lt;span class="c1"&gt;# 结束日期
&lt;/span&gt;        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;SetCash&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;             &lt;span class="c1"&gt;# 初始资金
&lt;/span&gt;
        &lt;span class="c1"&gt;# 2. 添加证券
&lt;/span&gt;        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;AddEquity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SPY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Resolution&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Daily&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# 3. 设置benchmark
&lt;/span&gt;        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;SetBenchmark&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SPY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;OnData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="c1"&gt;# 4. 如果还没有持仓，买入SPY
&lt;/span&gt;        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Portfolio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Invested&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;SetHoldings&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SPY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="c1"&gt;# 使用100%资金买入
&lt;/span&gt;            &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Debug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Purchased SPY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
    </item>
    <item>
      <title># RD-Agent Tutorial - Chapter 3: Advanced Usage Techniques</title>
      <dc:creator>Henry Lin</dc:creator>
      <pubDate>Sun, 22 Mar 2026 02:29:59 +0000</pubDate>
      <link>https://forem.com/henry_lin_3ac6363747f45b4/-rd-agent-tutorial-chapter-3-advanced-usage-techniques-3opb</link>
      <guid>https://forem.com/henry_lin_3ac6363747f45b4/-rd-agent-tutorial-chapter-3-advanced-usage-techniques-3opb</guid>
      <description>&lt;h1&gt;
  
  
  RD-Agent Tutorial - Chapter 3: Advanced Usage Techniques
&lt;/h1&gt;

&lt;h2&gt;
  
  
  3.1 Quantitative Finance Agent Deep Dive
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Quantitative Finance Scenario Architecture
&lt;/h3&gt;

&lt;p&gt;RD-Agent's quantitative finance agent &lt;strong&gt;RD-Agent(Q)&lt;/strong&gt; is the industry's first data-driven multi-agent quantitative strategy development framework. It achieves full-stack quantitative research and development automation through coordinated factor-model joint optimization.&lt;/p&gt;

&lt;h4&gt;
  
  
  Core Architecture Design
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;graph TB
    A[Market Data] --&amp;gt; B[Data Preprocessing]
    B --&amp;gt; C[Factor Mining Agent]
    B --&amp;gt; D[Model Evolution Agent]
    C --&amp;gt; E[Factor Evaluation]
    D --&amp;gt; F[Model Evaluation]
    E --&amp;gt; G[Joint Optimization Agent]
    F --&amp;gt; G
    G --&amp;gt; H[Strategy Backtesting]
    H --&amp;gt; I[Performance Analysis]
    I --&amp;gt; J{Requirements Met?}
    J --&amp;gt;|No| K[Knowledge Feedback]
    K --&amp;gt; C
    K --&amp;gt; D
    J --&amp;gt;|Yes| L[Strategy Deployment]

    style C fill:#e1f5fe
    style D fill:#f3e5f5
    style G fill:#e8f5e8
    style H fill:#fff3e0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Qlib Framework Integration
&lt;/h4&gt;

&lt;p&gt;RD-Agent(Q) deeply integrates with Microsoft's &lt;strong&gt;Qlib&lt;/strong&gt; quantitative investment library, providing:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data Management:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🗃️ Standardized financial data format&lt;/li&gt;
&lt;li&gt;📈 Real-time and historical data interfaces&lt;/li&gt;
&lt;li&gt;🔄 Automatic data update mechanism&lt;/li&gt;
&lt;li&gt;🧹 Data cleaning and preprocessing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Backtesting Engine:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;📊 High-performance vectorized backtesting&lt;/li&gt;
&lt;li&gt;💰 Trading cost and slippage simulation&lt;/li&gt;
&lt;li&gt;📋 Multiple portfolio construction strategies&lt;/li&gt;
&lt;li&gt;📈 Risk metric calculation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Model Library:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🤖 Machine learning model integration&lt;/li&gt;
&lt;li&gt;📊 Traditional quantitative factors&lt;/li&gt;
&lt;li&gt;🧠 Deep learning models&lt;/li&gt;
&lt;li&gt;🔄 Model ensemble strategies&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Factor Mining and Optimization
&lt;/h3&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;rdagent fin_factor&lt;/code&gt; Explained
&lt;/h4&gt;

&lt;p&gt;The factor mining agent focuses on discovering and optimizing effective quantitative factors.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Startup Command:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Basic factor mining&lt;/span&gt;
rdagent fin_factor

&lt;span class="c"&gt;# Specify configuration file&lt;/span&gt;
rdagent fin_factor &lt;span class="nt"&gt;--config&lt;/span&gt; factor_config.yaml

&lt;span class="c"&gt;# Specify iteration count&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;FACTOR_MAX_LOOP&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;15
rdagent fin_factor
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Workflow:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Hypothesis Generation Phase&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;   &lt;span class="c1"&gt;# Generate factor hypotheses based on market theory and historical experience
&lt;/span&gt;   &lt;span class="n"&gt;factor_hypotheses&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
       &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;technical_indicator_momentum_factor&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
       &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;financial_quality_factor&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
       &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;market_sentiment_factor&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
       &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;macroeconomic_factor&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
   &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Factor Implementation Phase&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;   &lt;span class="c1"&gt;# Automatically generate factor calculation code
&lt;/span&gt;   &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MomentumFactor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
       &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;calculate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
           &lt;span class="c1"&gt;# Auto-generated momentum factor calculation logic
&lt;/span&gt;           &lt;span class="nf"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;close&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;close&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;shift&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Factor Evaluation Phase&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;   &lt;span class="c1"&gt;# Multi-dimensional factor evaluation
&lt;/span&gt;   &lt;span class="n"&gt;evaluation_metrics&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
       &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;IC&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.045&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;          &lt;span class="c1"&gt;# Information Coefficient
&lt;/span&gt;       &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;IC_IR&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;1.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;         &lt;span class="c1"&gt;# Information Ratio
&lt;/span&gt;       &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;rank_IC&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.038&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;     &lt;span class="c1"&gt;# Rank IC
&lt;/span&gt;       &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;turnover&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;      &lt;span class="c1"&gt;# Turnover rate
&lt;/span&gt;       &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;max_drawdown&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.15&lt;/span&gt;  &lt;span class="c1"&gt;# Maximum drawdown
&lt;/span&gt;   &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Factor Generation Strategies
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Technical Analysis Factors:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;technical_factors&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;momentum&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;price_momentum_5d&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;price_momentum_20d&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;volume_momentum&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;volatility_momentum&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;mean_reversion&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rsi_divergence&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bollinger_position&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;price_deviation&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;trend&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ma_trend&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;macd_signal&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;trend_strength&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Fundamental Factors:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;fundamental_factors&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;profitability&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;roe_trend&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;roa_improvement&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gross_margin_stability&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;growth&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;revenue_growth_consistency&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;eps_growth_quality&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cash_flow_growth&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;valuation&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pe_relative&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pb_sector_adjusted&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ev_ebitda_normalized&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Alternative Factors:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;alternative_factors&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sentiment&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;news_sentiment_score&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;social_media_buzz&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;analyst_revision_momentum&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;network&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;supply_chain_strength&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;industry_correlation&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;peer_performance_influence&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Factor Effectiveness Evaluation
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Evaluation Framework:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;FactorEvaluator&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;benchmark_data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;start_date&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;end_date&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;benchmark_data&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;start_date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;start_date&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;end_date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;end_date&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;evaluate_factor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;factor_values&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Comprehensive factor effectiveness evaluation&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
        &lt;span class="n"&gt;metrics&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

        &lt;span class="c1"&gt;# 1. Information Coefficient analysis
&lt;/span&gt;        &lt;span class="n"&gt;metrics&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;IC&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;calculate_IC&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;factor_values&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;metrics&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;IC_std&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;calculate_IC_stability&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;factor_values&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;metrics&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;IC_IR&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;metrics&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;IC&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;metrics&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;IC_std&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

        &lt;span class="c1"&gt;# 2. Monotonicity test
&lt;/span&gt;        &lt;span class="n"&gt;metrics&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;monotonicity&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test_monotonicity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;factor_values&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# 3. Turnover rate analysis
&lt;/span&gt;        &lt;span class="n"&gt;metrics&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;turnover&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;calculate_turnover&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;factor_values&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# 4. Backtesting performance
&lt;/span&gt;        &lt;span class="n"&gt;backtest_result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;backtest_factor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;factor_values&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;metrics&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;backtest_result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;metrics&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Model Evolution and Optimization
&lt;/h3&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;rdagent fin_model&lt;/code&gt; Explained
&lt;/h4&gt;

&lt;p&gt;The model evolution agent focuses on automated development and optimization of prediction models.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Supported Model Types:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model Category&lt;/th&gt;
&lt;th&gt;Specific Models&lt;/th&gt;
&lt;th&gt;Applicable Scenarios&lt;/th&gt;
&lt;th&gt;Features&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Linear Models&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;LinearRegression, Ridge, Lasso&lt;/td&gt;
&lt;td&gt;Simple fast prediction&lt;/td&gt;
&lt;td&gt;High interpretability&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Tree Models&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;XGBoost, LightGBM, CatBoost&lt;/td&gt;
&lt;td&gt;Tabular data modeling&lt;/td&gt;
&lt;td&gt;Feature importance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Neural Networks&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;MLP, TabNet, DeepFM&lt;/td&gt;
&lt;td&gt;Complex relationship modeling&lt;/td&gt;
&lt;td&gt;Non-linear fitting&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Time Series Models&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;LSTM, GRU, Transformer&lt;/td&gt;
&lt;td&gt;Sequence data prediction&lt;/td&gt;
&lt;td&gt;Time dependency&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ensemble Models&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Stacking, Voting, Blending&lt;/td&gt;
&lt;td&gt;Improve prediction accuracy&lt;/td&gt;
&lt;td&gt;Model fusion&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h4&gt;
  
  
  Model Architecture Search
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Automated Architecture Search:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ModelArchitectureSearch&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;search_space&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;n_layers&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;hidden_dims&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;128&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;256&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;512&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;dropout_rate&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.4&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;activation&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;relu&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tanh&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;gelu&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;optimizer&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;adam&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;adamw&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sgd&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;learning_rate&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0.001&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.01&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;search_best_architecture&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;train_data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;valid_data&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Search for optimal model architecture&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
        &lt;span class="n"&gt;best_config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
        &lt;span class="n"&gt;best_score&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;-inf&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generate_configurations&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
            &lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;build_model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;evaluate_model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;train_data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;valid_data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;best_score&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;best_score&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;score&lt;/span&gt;
                &lt;span class="n"&gt;best_config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;best_config&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;best_score&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Hyperparameter Optimization
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Multiple Optimization Algorithms:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;optuna&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;create_study&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;sklearn.model_selection&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;cross_val_score&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;HyperparameterOptimizer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;model_class&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;param_space&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;model_class&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model_class&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;param_space&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;param_space&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;optimize_with_optuna&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;X_train&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_train&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;n_trials&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Hyperparameter optimization using Optuna&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
        &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;objective&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;trial&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;param_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;param_range&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;param_space&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;param_range&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
                    &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;param_name&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;trial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;suggest_categorical&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                        &lt;span class="n"&gt;param_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;param_range&lt;/span&gt;
                    &lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="nf"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;param_range&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;tuple&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
                    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;param_range&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
                        &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;param_name&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;trial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;suggest_int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                            &lt;span class="n"&gt;param_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;param_range&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;param_range&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
                        &lt;span class="p"&gt;)&lt;/span&gt;
                    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                        &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;param_name&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;trial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;suggest_float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                            &lt;span class="n"&gt;param_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;param_range&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;param_range&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
                        &lt;span class="p"&gt;)&lt;/span&gt;

            &lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;model_class&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;scores&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;cross_val_score&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;X_train&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y_train&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cv&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;scores&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

        &lt;span class="n"&gt;study&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;create_study&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;direction&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;maximize&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;study&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;optimize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;objective&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;n_trials&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;n_trials&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;study&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;best_params&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;study&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;best_value&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Factor-Model Joint Optimization
&lt;/h3&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;rdagent fin_quant&lt;/code&gt; Explained
&lt;/h4&gt;

&lt;p&gt;The joint optimization agent is the core innovation of RD-Agent(Q), implementing collaborative evolution of factors and models.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Joint Optimization Strategies:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Alternating Optimization Strategy&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;   &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;AlternatingOptimization&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
       &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;factor_agent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;model_agent&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
           &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;factor_agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;factor_agent&lt;/span&gt;
           &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;model_agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model_agent&lt;/span&gt;

       &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;optimize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;max_iterations&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
           &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max_iterations&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
               &lt;span class="c1"&gt;# Fix model, optimize factors
&lt;/span&gt;               &lt;span class="n"&gt;new_factors&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;factor_agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;evolve_factors&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                   &lt;span class="n"&gt;current_model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;current_model&lt;/span&gt;
               &lt;span class="p"&gt;)&lt;/span&gt;

               &lt;span class="c1"&gt;# Fix factors, optimize model
&lt;/span&gt;               &lt;span class="n"&gt;new_model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;model_agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;evolve_model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                   &lt;span class="n"&gt;current_factors&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;new_factors&lt;/span&gt;
               &lt;span class="p"&gt;)&lt;/span&gt;

               &lt;span class="c1"&gt;# Evaluate joint performance
&lt;/span&gt;               &lt;span class="n"&gt;performance&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;evaluate_joint_performance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                   &lt;span class="n"&gt;new_factors&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;new_model&lt;/span&gt;
               &lt;span class="p"&gt;)&lt;/span&gt;

               &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;performance&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;best_performance&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                   &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update_best_solution&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;new_factors&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;new_model&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Multi-Objective Optimization Strategy&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;   &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MultiObjectiveOptimization&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
       &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
           &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;objectives&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
               &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;maximize_sharpe_ratio&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
               &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;minimize_max_drawdown&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
               &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;maximize_information_ratio&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
               &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;minimize_turnover&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
           &lt;span class="p"&gt;]&lt;/span&gt;

       &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;pareto_optimization&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;population&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
           &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Pareto front optimization&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
           &lt;span class="n"&gt;pareto_front&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

           &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;individual&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;population&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
               &lt;span class="n"&gt;is_dominated&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;
               &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;other&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;population&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                   &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dominates&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;other&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;individual&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
                       &lt;span class="n"&gt;is_dominated&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;
                       &lt;span class="k"&gt;break&lt;/span&gt;

               &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;is_dominated&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                   &lt;span class="n"&gt;pareto_front&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;individual&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

           &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;pareto_front&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Multi-Objective Optimization Algorithms
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;NSGA-II Implementation:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;NSGA2Optimizer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;population_size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;generations&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;population_size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;population_size&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;generations&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;generations&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;optimize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;factor_space&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;model_space&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="c1"&gt;# Initialize population
&lt;/span&gt;        &lt;span class="n"&gt;population&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;initialize_population&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;generation&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;generations&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="c1"&gt;# Evaluate fitness
&lt;/span&gt;            &lt;span class="n"&gt;fitness_values&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;evaluate_population&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;population&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

            &lt;span class="c1"&gt;# Non-dominated sorting
&lt;/span&gt;            &lt;span class="n"&gt;fronts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fast_non_dominated_sort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;population&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fitness_values&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

            &lt;span class="c1"&gt;# Select next generation
&lt;/span&gt;            &lt;span class="n"&gt;next_population&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;select_next_generation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="n"&gt;fronts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;population&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fitness_values&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;

            &lt;span class="c1"&gt;# Crossover and mutation
&lt;/span&gt;            &lt;span class="n"&gt;offspring&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;crossover_and_mutation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;next_population&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;population&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;offspring&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_pareto_front&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;population&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Collaborative Evolution Mechanism
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Knowledge Sharing Mechanism:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;KnowledgeSharing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;factor_knowledge_base&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;model_knowledge_base&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;interaction_patterns&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;share_factor_insights&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;factor_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;insights&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Share factor insights&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;factor_knowledge_base&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;factor_id&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;effectiveness&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;insights&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;ic_score&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;stability&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;insights&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;ic_std&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;best_models&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;insights&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;compatible_models&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;market_regimes&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;insights&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;effective_periods&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;share_model_insights&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;model_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;insights&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Share model insights&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;model_knowledge_base&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;model_id&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;architecture&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;insights&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;model_config&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;performance&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;insights&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;validation_score&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;best_factors&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;insights&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;important_features&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;hyperparameters&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;insights&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;optimal_params&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_recommendations&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;current_factors&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;current_model&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Get optimization recommendations&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
        &lt;span class="n"&gt;recommendations&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;factor_suggestions&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt;
            &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;model_suggestions&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt;
            &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;joint_strategies&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="c1"&gt;# Generate recommendations based on historical knowledge
&lt;/span&gt;        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;factor&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;current_factors&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;factor&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;factor_knowledge_base&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;knowledge&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;factor_knowledge_base&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;factor&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
                &lt;span class="n"&gt;recommendations&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;model_suggestions&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;extend&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                    &lt;span class="n"&gt;knowledge&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;best_models&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
                &lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;recommendations&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Financial Report Analysis
&lt;/h3&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;rdagent fin_factor_report&lt;/code&gt; Usage
&lt;/h4&gt;

&lt;p&gt;Automatically extracting quantitative factors from financial reports is a unique capability of RD-Agent.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Supported Report Types:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;📋 Annual Reports (10-K, Annual Report)&lt;/li&gt;
&lt;li&gt;📊 Quarterly Reports (10-Q, Quarterly Report)&lt;/li&gt;
&lt;li&gt;📰 News Announcements (8-K, Press Release)&lt;/li&gt;
&lt;li&gt;📈 Analyst Reports (Research Report)&lt;/li&gt;
&lt;li&gt;🏛️ Regulatory Filings (SEC Filings)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Usage Example:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Basic report analysis&lt;/span&gt;
rdagent fin_factor_report &lt;span class="nt"&gt;--report-folder&lt;/span&gt; ./financial_reports

&lt;span class="c"&gt;# Specify report type&lt;/span&gt;
rdagent fin_factor_report &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--report-folder&lt;/span&gt; ./reports &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--report-type&lt;/span&gt; annual &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--language&lt;/span&gt; zh

&lt;span class="c"&gt;# Batch processing&lt;/span&gt;
rdagent fin_factor_report &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--report-folder&lt;/span&gt; ./reports &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--batch-size&lt;/span&gt; 50 &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--parallel-workers&lt;/span&gt; 4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Report Parsing and Feature Extraction
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Text Preprocessing Pipeline:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ReportPreprocessor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nlp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;spacy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;en_core_web_sm&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;financial_terms&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load_financial_dictionary&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;preprocess_report&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;report_text&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Preprocess financial report&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
        &lt;span class="c1"&gt;# 1. Document cleaning
&lt;/span&gt;        &lt;span class="n"&gt;cleaned_text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;clean_document&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;report_text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# 2. Section segmentation
&lt;/span&gt;        &lt;span class="n"&gt;sections&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;extract_sections&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cleaned_text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# 3. Entity recognition
&lt;/span&gt;        &lt;span class="n"&gt;entities&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;extract_financial_entities&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sections&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# 4. Sentiment analysis
&lt;/span&gt;        &lt;span class="n"&gt;sentiment_scores&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;analyze_sentiment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sections&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;sections&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;sections&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;entities&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;entities&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;sentiment&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;sentiment_scores&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;metadata&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;extract_metadata&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;report_text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Factor Extraction Strategy:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;FinancialFactorExtractor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;factor_extractors&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;growth_factors&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;GrowthFactorExtractor&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;quality_factors&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;QualityFactorExtractor&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;sentiment_factors&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;SentimentFactorExtractor&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;risk_factors&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;RiskFactorExtractor&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;extract_factors&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;processed_report&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Extract factors from processed report&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
        &lt;span class="n"&gt;extracted_factors&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;factor_type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;extractor&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;factor_extractors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
            &lt;span class="n"&gt;factors&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;extractor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;extract&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;processed_report&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;extracted_factors&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;factor_type&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;factors&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;extracted_factors&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;GrowthFactorExtractor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;extract&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;report_data&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Extract growth factors&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
        &lt;span class="n"&gt;growth_factors&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

        &lt;span class="c1"&gt;# Revenue growth quality
&lt;/span&gt;        &lt;span class="n"&gt;revenue_mentions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find_revenue_discussions&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;report_data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;growth_factors&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;revenue_growth_quality&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;analyze_growth_quality&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;revenue_mentions&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# Market expansion strategy
&lt;/span&gt;        &lt;span class="n"&gt;expansion_mentions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find_expansion_discussions&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;report_data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;growth_factors&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;expansion_strategy_score&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;score_expansion_strategy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;expansion_mentions&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# R&amp;amp;D investment commitment
&lt;/span&gt;        &lt;span class="n"&gt;rd_mentions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find_rd_discussions&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;report_data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;growth_factors&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;rd_commitment_score&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;analyze_rd_commitment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;rd_mentions&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;growth_factors&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Sentiment Analysis and Signal Mining
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Multi-dimensional Sentiment Analysis:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;FinancialSentimentAnalyzer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sentiment_model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;pipeline&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sentiment-analysis&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ProsusAI/finbert&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;uncertainty_detector&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;UncertaintyDetector&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;forward_looking_detector&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ForwardLookingDetector&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;analyze_comprehensive_sentiment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text_sections&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Comprehensive sentiment analysis&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
        &lt;span class="n"&gt;sentiment_scores&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;section_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;text_sections&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
            &lt;span class="c1"&gt;# Basic sentiment analysis
&lt;/span&gt;            &lt;span class="n"&gt;basic_sentiment&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sentiment_model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

            &lt;span class="c1"&gt;# Uncertainty detection
&lt;/span&gt;            &lt;span class="n"&gt;uncertainty_score&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;uncertainty_detector&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;detect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

            &lt;span class="c1"&gt;# Forward-looking statement detection
&lt;/span&gt;            &lt;span class="n"&gt;forward_looking&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;forward_looking_detector&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;detect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

            &lt;span class="n"&gt;sentiment_scores&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;section_name&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;polarity&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;basic_sentiment&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;score&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
                &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;label&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;basic_sentiment&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;label&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
                &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;uncertainty&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;uncertainty_score&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;forward_looking&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;forward_looking&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;confidence&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;calculate_confidence&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                    &lt;span class="n"&gt;basic_sentiment&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;uncertainty_score&lt;/span&gt;
                &lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;sentiment_scores&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SignalGenerator&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;signal_weights&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;management_tone&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;financial_health&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;market_position&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;future_outlook&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.1&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;generate_trading_signals&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;factor_scores&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sentiment_scores&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Generate trading signals&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
        &lt;span class="n"&gt;composite_score&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;

        &lt;span class="c1"&gt;# Weighted composite score
&lt;/span&gt;        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;factor_type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;weight&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;signal_weights&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;factor_type&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;factor_scores&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;composite_score&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;factor_scores&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;factor_type&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;weight&lt;/span&gt;

        &lt;span class="c1"&gt;# Sentiment adjustment
&lt;/span&gt;        &lt;span class="n"&gt;sentiment_adjustment&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;calculate_sentiment_adjustment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;sentiment_scores&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;final_score&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;composite_score&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;sentiment_adjustment&lt;/span&gt;

        &lt;span class="c1"&gt;# Generate signal
&lt;/span&gt;        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;final_score&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mf"&gt;0.6&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;signal&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;STRONG_BUY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;final_score&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mf"&gt;0.3&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;signal&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;BUY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;final_score&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.3&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;signal&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;HOLD&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;final_score&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.6&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;signal&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SELL&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;signal&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;STRONG_SELL&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;signal&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;confidence&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;abs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;final_score&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;score&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;final_score&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;components&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;factor_score&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;composite_score&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;sentiment_adjustment&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;sentiment_adjustment&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3.2 CoSTEER Evolution Framework Deep Dive
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Evolution Framework Core Principles
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;CoSTEER&lt;/strong&gt; (Collaborative evolving STrategy for automatic data-cEntric dEvelopment fRamework) is RD-Agent's core evolution engine, implementing autonomous learning and continuous improvement for agents.&lt;/p&gt;

&lt;h4&gt;
  
  
  Collaborative Evolution Strategy Design
&lt;/h4&gt;

&lt;p&gt;The CoSTEER framework is based on the following core principles:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Multi-Agent Collaboration&lt;/strong&gt; - Different specialized agents work together&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Knowledge Accumulation&lt;/strong&gt; - Learn and improve from historical experience&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Adaptive Evolution&lt;/strong&gt; - Dynamically adjust strategies based on feedback&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RAG Enhancement&lt;/strong&gt; - Retrieval-augmented generation improves decision quality
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CoSTEER&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Developer&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Experiment&lt;/span&gt;&lt;span class="p"&gt;]):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;CoSTEER evolution framework core class&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;CoSTEERSettings&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;eva&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;RAGEvaluator&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;es&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;EvolvingStrategy&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;evolving_version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;with_knowledge&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;knowledge_self_gen&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;max_loop&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;settings&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;settings&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;max_loop&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;max_loop&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;max_loop&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="n"&gt;max_loop&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;knowledge_base_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;settings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;knowledge_base_path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;with_knowledge&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;with_knowledge&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;knowledge_self_gen&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;knowledge_self_gen&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;evolving_strategy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;es&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;evaluator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;eva&lt;/span&gt;

        &lt;span class="c1"&gt;# Initialize RAG system
&lt;/span&gt;        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rag_strategy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;_init_rag_strategy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;evolving_version&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Knowledge Management Mechanism
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Multi-level Knowledge Representation:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;KnowledgeManagementSystem&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;knowledge_layers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;factual_knowledge&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;FactualKnowledgeBase&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;procedural_knowledge&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;ProceduralKnowledgeBase&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;experiential_knowledge&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;ExperientialKnowledgeBase&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;meta_knowledge&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;MetaKnowledgeBase&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;store_knowledge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;knowledge_item&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Layered knowledge storage&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
        &lt;span class="n"&gt;knowledge_type&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;classify_knowledge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;knowledge_item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;knowledge_layers&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;knowledge_type&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;store&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;knowledge_item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;retrieve_relevant_knowledge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;query_context&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Retrieve relevant knowledge&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
        &lt;span class="n"&gt;relevant_knowledge&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;layer_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;knowledge_base&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;knowledge_layers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
            &lt;span class="n"&gt;relevant_items&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;knowledge_base&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="n"&gt;query_context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;similarity_threshold&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.7&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;relevant_knowledge&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;layer_name&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;relevant_items&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;synthesize_knowledge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;relevant_knowledge&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Knowledge Representation Format:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nd"&gt;@dataclass&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;KnowledgeItem&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Knowledge item data structure&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;knowledge_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;KnowledgeType&lt;/span&gt;
    &lt;span class="n"&gt;domain&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;confidence&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;
    &lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;
    &lt;span class="n"&gt;usage_count&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="n"&gt;success_rate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;to_embedding&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ndarray&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Convert to vector representation&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;embedding_model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;update_effectiveness&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;success&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Update knowledge effectiveness&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;usage_count&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;success&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;success_rate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;success_rate&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;usage_count&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;usage_count&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;success_rate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;success_rate&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;usage_count&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;usage_count&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Adaptive Optimization Algorithm
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Multi-Strategy Evolution Algorithm:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;AdaptiveEvolutionStrategy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;evolution_strategies&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;genetic_algorithm&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;GeneticAlgorithmStrategy&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;differential_evolution&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;DifferentialEvolutionStrategy&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;particle_swarm&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;ParticleSwarmStrategy&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;simulated_annealing&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;SimulatedAnnealingStrategy&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strategy_performance&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;adaptive_weights&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;evolve_population&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;population&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;generation&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Adaptive population evolution&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
        &lt;span class="c1"&gt;# Select evolution strategy
&lt;/span&gt;        &lt;span class="n"&gt;selected_strategies&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;select_strategies&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;generation&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;new_population&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;strategy_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;weight&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;selected_strategies&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
            &lt;span class="n"&gt;strategy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;evolution_strategies&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;strategy_name&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

            &lt;span class="c1"&gt;# Allocate population by weight
&lt;/span&gt;            &lt;span class="n"&gt;sub_population_size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;population&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;weight&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;sub_population&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;population&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="n"&gt;sub_population_size&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

            &lt;span class="c1"&gt;# Evolve sub-population
&lt;/span&gt;            &lt;span class="n"&gt;evolved_sub_pop&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;strategy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;evolve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sub_population&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;new_population&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;extend&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;evolved_sub_pop&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# Update strategy performance
&lt;/span&gt;        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update_strategy_performance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;new_population&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;generation&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;new_population&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;select_strategies&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;generation&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Select evolution strategy based on historical performance&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;generation&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="c1"&gt;# Uniform distribution in early stages
&lt;/span&gt;            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;evolution_strategies&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                   &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;evolution_strategies&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;()}&lt;/span&gt;

        &lt;span class="c1"&gt;# Adjust weights based on performance
&lt;/span&gt;        &lt;span class="n"&gt;total_performance&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strategy_performance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;values&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;performance&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;total_performance&lt;/span&gt;
            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;performance&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strategy_performance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Custom Evolution Strategies
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Strategy Configuration and Adjustment
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Configuration File Example:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="c1"&gt;# costeer_config.yaml&lt;/span&gt;
&lt;span class="na"&gt;costeer_settings&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;max_loop&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;
  &lt;span class="na"&gt;knowledge_base_path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;./knowledge_base"&lt;/span&gt;
  &lt;span class="na"&gt;new_knowledge_base_path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;./new_knowledge"&lt;/span&gt;
  &lt;span class="na"&gt;evolving_version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;

&lt;span class="na"&gt;evolution_strategy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;population_size&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;50&lt;/span&gt;
  &lt;span class="na"&gt;mutation_rate&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.1&lt;/span&gt;
  &lt;span class="na"&gt;crossover_rate&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.8&lt;/span&gt;
  &lt;span class="na"&gt;selection_method&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;tournament"&lt;/span&gt;
  &lt;span class="na"&gt;tournament_size&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;

&lt;span class="na"&gt;rag_settings&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;embedding_model&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text-embedding-3-small"&lt;/span&gt;
  &lt;span class="na"&gt;similarity_threshold&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.75&lt;/span&gt;
  &lt;span class="na"&gt;max_retrieved_docs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;
  &lt;span class="na"&gt;rerank_top_k&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;

&lt;span class="na"&gt;evaluation_settings&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;metrics&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;accuracy"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;f1_score"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;auc_roc"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
  &lt;span class="na"&gt;cross_validation_folds&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;
  &lt;span class="na"&gt;test_ratio&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.2&lt;/span&gt;

&lt;span class="na"&gt;knowledge_management&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;auto_cleanup&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
  &lt;span class="na"&gt;cleanup_threshold&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.3&lt;/span&gt;
  &lt;span class="na"&gt;knowledge_update_frequency&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;100&lt;/span&gt;
  &lt;span class="na"&gt;max_knowledge_items&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;10000&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Custom Evolution Strategy Implementation:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CustomEvolutionStrategy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;EvolvingStrategy&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Custom evolution strategy&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;super&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;population_size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;population_size&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mutation_rate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;mutation_rate&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;crossover_rate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;crossover_rate&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;initialize_population&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Initialize population&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
        &lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;population_size&lt;/span&gt;
        &lt;span class="n"&gt;population&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;individual&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_random_individual&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="n"&gt;population&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;individual&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;population&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;evolve_generation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;population&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fitness_scores&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Evolve one generation&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
        &lt;span class="n"&gt;new_population&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

        &lt;span class="c1"&gt;# Elite selection - preserve best individuals
&lt;/span&gt;        &lt;span class="n"&gt;elite_count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;population&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;elite_indices&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;argsort&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fitness_scores&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;elite_count&lt;/span&gt;&lt;span class="p"&gt;:]&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;idx&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;elite_indices&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;new_population&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;population&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;idx&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

        &lt;span class="c1"&gt;# Generate new individuals through crossover and mutation
&lt;/span&gt;        &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;new_population&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;population&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="c1"&gt;# Select parents
&lt;/span&gt;            &lt;span class="n"&gt;parent1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;tournament_selection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;population&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fitness_scores&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;parent2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;tournament_selection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;population&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fitness_scores&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

            &lt;span class="c1"&gt;# Crossover
&lt;/span&gt;            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;random&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;crossover_rate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;child1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;child2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;crossover&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;parent1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;parent2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;child1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;child2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;parent1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;parent2&lt;/span&gt;

            &lt;span class="c1"&gt;# Mutation
&lt;/span&gt;            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;random&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mutation_rate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;child1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mutate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;child1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;random&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mutation_rate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;child2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mutate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;child2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

            &lt;span class="n"&gt;new_population&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;extend&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;child1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;child2&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;new_population&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;population&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;crossover&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;parent1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;parent2&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Crossover operation&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
        &lt;span class="c1"&gt;# Implement specific crossover logic
&lt;/span&gt;        &lt;span class="c1"&gt;# Parameter crossover example here
&lt;/span&gt;        &lt;span class="n"&gt;child1_params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
        &lt;span class="n"&gt;child2_params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;parent1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parameters&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;random&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;child1_params&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;parent1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parameters&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
                &lt;span class="n"&gt;child2_params&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;parent2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parameters&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
            &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;child1_params&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;parent2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parameters&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
                &lt;span class="n"&gt;child2_params&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;parent1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parameters&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

        &lt;span class="n"&gt;child1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;parent1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;copy&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;child2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;parent2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;copy&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;child1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parameters&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;child1_params&lt;/span&gt;
        &lt;span class="n"&gt;child2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parameters&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;child2_params&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;child1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;child2&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;mutate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;individual&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Mutation operation&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
        &lt;span class="n"&gt;mutated&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;individual&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;copy&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;mutated&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parameters&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;random&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mutation_rate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;)):&lt;/span&gt;
                    &lt;span class="c1"&gt;# Gaussian mutation
&lt;/span&gt;                    &lt;span class="n"&gt;noise&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;normal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0.1&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nf"&gt;abs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
                    &lt;span class="n"&gt;mutated&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parameters&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;noise&lt;/span&gt;
                &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="nf"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
                    &lt;span class="c1"&gt;# String mutation (e.g., model names)
&lt;/span&gt;                    &lt;span class="n"&gt;mutated&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parameters&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mutate_string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;mutated&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Evaluator Customization
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Multi-Metric Evaluator:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MultiMetricEvaluator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;RAGEvaluator&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Multi-metric evaluator&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;metrics_config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="nf"&gt;super&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;metrics_config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;metrics_config&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;metric_weights&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;metrics_config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;weights&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{})&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;metric_calculators&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;_init_metric_calculators&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;evaluate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;experiment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Experiment&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Dict&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
        &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Multi-metric evaluation&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
        &lt;span class="n"&gt;metrics&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;metric_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;calculator&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;metric_calculators&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
            &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;calculator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;calculate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;experiment&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="n"&gt;metrics&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;metric_name&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;score&lt;/span&gt;
            &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;Exception&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;warning&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Metric &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;metric_name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; calculation failed: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="n"&gt;metrics&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;metric_name&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;

        &lt;span class="c1"&gt;# Calculate weighted composite score
&lt;/span&gt;        &lt;span class="n"&gt;weighted_score&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;_calculate_weighted_score&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;metrics&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;metrics&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;weighted_score&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;weighted_score&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;metrics&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_calculate_weighted_score&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;metrics&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Dict&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Calculate weighted composite score&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
        &lt;span class="n"&gt;total_score&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;
        &lt;span class="n"&gt;total_weight&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;

        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;metric_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;metrics&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;metric_name&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;metric_weights&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;weight&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;metric_weights&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;metric_name&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
                &lt;span class="n"&gt;total_score&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;score&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;weight&lt;/span&gt;
                &lt;span class="n"&gt;total_weight&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;weight&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;total_score&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;total_weight&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;total_weight&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CustomMetricCalculator&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Custom metric calculator&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;metric_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;calculation_func&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;callable&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;metric_name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;metric_name&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;calculation_func&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;calculation_func&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;calculate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;experiment&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Experiment&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Calculate metric value&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;calculation_func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;experiment&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Usage example
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;sharpe_ratio_calculator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;experiment&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Calculate Sharpe ratio&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;returns&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;experiment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_returns&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;returns&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;returns&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;std&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;returns&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mean&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;returns&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;std&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sqrt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;252&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;max_drawdown_calculator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;experiment&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Calculate maximum drawdown&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;cumulative_returns&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;experiment&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_returns&lt;/span&gt;&lt;span class="p"&gt;()).&lt;/span&gt;&lt;span class="nf"&gt;cumprod&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;running_max&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cumulative_returns&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;expanding&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;drawdown&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cumulative_returns&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;running_max&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;running_max&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;drawdown&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;  &lt;span class="c1"&gt;# Return positive value
&lt;/span&gt;
&lt;span class="c1"&gt;# Create custom evaluator
&lt;/span&gt;&lt;span class="n"&gt;metrics_config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;weights&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;sharpe_ratio&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;max_drawdown&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;information_ratio&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.3&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;evaluator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;MultiMetricEvaluator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;metrics_config&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;evaluator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_metric_calculator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;sharpe_ratio&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sharpe_ratio_calculator&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;evaluator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_metric_calculator&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;max_drawdown&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;max_drawdown_calculator&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Knowledge Base Management
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Knowledge Base Optimization Strategy:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;KnowledgeBaseManager&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Knowledge base manager&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;knowledge_store&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;embedding_cache&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;access_frequency&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;defaultdict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;last_access_time&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;add_knowledge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;knowledge_item&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;KnowledgeItem&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Add knowledge item&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
        &lt;span class="c1"&gt;# Check knowledge base size limit
&lt;/span&gt;        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;knowledge_store&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;max_items&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10000&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;_cleanup_knowledge&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;knowledge_store&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;knowledge_item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;knowledge_item&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;embedding_cache&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;knowledge_item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;knowledge_item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_embedding&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;last_access_time&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;knowledge_item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;query_knowledge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;top_k&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;similarity_threshold&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.7&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;KnowledgeItem&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
        &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Query relevant knowledge&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
        &lt;span class="n"&gt;query_embedding&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;_get_query_embedding&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;similarities&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;item_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;item_embedding&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;embedding_cache&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
            &lt;span class="n"&gt;similarity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;cosine_similarity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="n"&gt;query_embedding&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reshape&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                &lt;span class="n"&gt;item_embedding&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reshape&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;similarity&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;similarity_threshold&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;similarities&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;item_id&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;similarity&lt;/span&gt;
                &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;access_frequency&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;item_id&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
                &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;last_access_time&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;item_id&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

        &lt;span class="c1"&gt;# Sort by similarity and return top-k
&lt;/span&gt;        &lt;span class="n"&gt;sorted_items&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;similarities&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="n"&gt;reverse&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;
        &lt;span class="p"&gt;)[:&lt;/span&gt;&lt;span class="n"&gt;top_k&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;knowledge_store&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;item_id&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;item_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;sorted_items&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_cleanup_knowledge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Clean up knowledge base&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
        &lt;span class="n"&gt;cleanup_count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;knowledge_store&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# Clean 10%
&lt;/span&gt;
        &lt;span class="c1"&gt;# Composite score based on access frequency and time
&lt;/span&gt;        &lt;span class="n"&gt;scores&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
        &lt;span class="n"&gt;current_time&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;item_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;knowledge_item&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;knowledge_store&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
            &lt;span class="n"&gt;frequency_score&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;access_frequency&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;item_id&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
            &lt;span class="n"&gt;time_score&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="n"&gt;current_time&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;last_access_time&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;item_id&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
            &lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;days&lt;/span&gt;
            &lt;span class="n"&gt;effectiveness_score&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;knowledge_item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;success_rate&lt;/span&gt;

            &lt;span class="c1"&gt;# Composite score (high frequency, recent, effective = high score)
&lt;/span&gt;            &lt;span class="n"&gt;composite_score&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="n"&gt;frequency_score&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.4&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
                &lt;span class="n"&gt;effectiveness_score&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.4&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;
                &lt;span class="n"&gt;time_score&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.2&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;scores&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;item_id&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;composite_score&lt;/span&gt;

        &lt;span class="c1"&gt;# Remove lowest scored items
&lt;/span&gt;        &lt;span class="n"&gt;items_to_remove&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;scores&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="p"&gt;)[:&lt;/span&gt;&lt;span class="n"&gt;cleanup_count&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;item_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;items_to_remove&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;del&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;knowledge_store&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;item_id&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
            &lt;span class="k"&gt;del&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;embedding_cache&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;item_id&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
            &lt;span class="k"&gt;del&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;access_frequency&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;item_id&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
            &lt;span class="k"&gt;del&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;last_access_time&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;item_id&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

        &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Cleaned up &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;cleanup_count&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; knowledge items&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Multi-Agent Collaboration Mechanism
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Research Agent Responsibilities
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ResearchAgent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Research agent - responsible for hypothesis generation and strategy planning&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;knowledge_base&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;KnowledgeBase&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;knowledge_base&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;knowledge_base&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hypothesis_generator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;HypothesisGenerator&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strategy_planner&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;StrategyPlanner&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;generate_hypotheses&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;problem_context&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Hypothesis&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
        &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Generate research hypotheses&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
        &lt;span class="c1"&gt;# Retrieve relevant theories from knowledge base
&lt;/span&gt;        &lt;span class="n"&gt;relevant_knowledge&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;knowledge_base&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;problem_context&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;description&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# Generate hypotheses based on domain knowledge
&lt;/span&gt;        &lt;span class="n"&gt;hypotheses&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;knowledge_item&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;relevant_knowledge&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;hypothesis&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hypothesis_generator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generate_from_knowledge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="n"&gt;knowledge_item&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;problem_context&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;hypotheses&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hypothesis&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# Generate novel hypotheses
&lt;/span&gt;        &lt;span class="n"&gt;novel_hypotheses&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hypothesis_generator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generate_novel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;problem_context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;existing_hypotheses&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;hypotheses&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;hypotheses&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;extend&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;novel_hypotheses&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;rank_hypotheses&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hypotheses&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;plan_research_strategy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;hypothesis&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Hypothesis&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;ResearchPlan&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Plan research strategy&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strategy_planner&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_plan&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;hypothesis&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;hypothesis&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;available_resources&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_available_resources&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="n"&gt;time_constraints&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_time_constraints&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Development Agent Functions
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;DevelopmentAgent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Development agent - responsible for code implementation and testing validation&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;code_generator&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;CodeGenerator&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;validator&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;CodeValidator&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;code_generator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;code_generator&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;validator&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;validator&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;implementation_cache&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;implement_hypothesis&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;hypothesis&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Hypothesis&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Implementation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Implement research hypothesis&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
        &lt;span class="c1"&gt;# Generate implementation code
&lt;/span&gt;        &lt;span class="n"&gt;implementation_code&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;code_generator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generate_code&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;specification&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;hypothesis&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;specification&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;constraints&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;hypothesis&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;constraints&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# Validate code correctness
&lt;/span&gt;        &lt;span class="n"&gt;validation_result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;validator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;validate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;implementation_code&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;validation_result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;is_valid&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="c1"&gt;# Fix code issues
&lt;/span&gt;            &lt;span class="n"&gt;fixed_code&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;code_generator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fix_issues&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="n"&gt;implementation_code&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;validation_result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;issues&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;implementation_code&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fixed_code&lt;/span&gt;

        &lt;span class="c1"&gt;# Create implementation object
&lt;/span&gt;        &lt;span class="n"&gt;implementation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Implementation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;code&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;implementation_code&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;hypothesis&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;hypothesis&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;validation_result&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;validation_result&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# Cache implementation
&lt;/span&gt;        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;implementation_cache&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;hypothesis&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;implementation&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;implementation&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;optimize_implementation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;implementation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Implementation&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;feedback&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Feedback&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Implementation&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Optimize implementation based on feedback&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
        &lt;span class="n"&gt;optimization_suggestions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;analyze_feedback&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;feedback&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;optimized_code&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;code_generator&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;optimize_code&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;implementation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;code&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;optimization_suggestions&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;Implementation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;code&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;optimized_code&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;hypothesis&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;implementation&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hypothesis&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;parent_implementation&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;implementation&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Inter-Agent Communication Protocol
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;AgentCommunicationProtocol&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Inter-agent communication protocol&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;message_queue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;subscriptions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;defaultdict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;message_handlers&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;register_agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;agent_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Register agent&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;message_queue&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;agent_id&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
        &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set_communication_protocol&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;subscribe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;agent_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;message_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Subscribe to message type&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;subscriptions&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;message_type&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;agent_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;publish&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sender_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;message_type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Publish message&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
        &lt;span class="c1"&gt;# Add message metadata
&lt;/span&gt;        &lt;span class="n"&gt;full_message&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;sender&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;sender_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;type&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;message_type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;timestamp&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="c1"&gt;# Send to all subscribers
&lt;/span&gt;        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;subscriber_id&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;subscriptions&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;message_type&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;subscriber_id&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;sender_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="c1"&gt;# Don't send to self
&lt;/span&gt;                &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;message_queue&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;subscriber_id&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;full_message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_messages&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;agent_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
        &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Get agent&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;s messages&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
        &lt;span class="n"&gt;messages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;message_queue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;agent_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[])&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;message_queue&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;agent_id&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;  &lt;span class="c1"&gt;# Clear queue
&lt;/span&gt;        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;messages&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CollaborativeWorkflow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Collaborative workflow&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;agents&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;List&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;Agent&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;protocol&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;AgentCommunicationProtocol&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;agents&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;agents&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;protocol&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;protocol&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;workflow_state&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;WorkflowState&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;INITIALIZED&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;execute_collaborative_task&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;task&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;CollaborativeTask&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Execute collaborative task&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
        &lt;span class="c1"&gt;# Decompose task
&lt;/span&gt;        &lt;span class="n"&gt;subtasks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;decompose_task&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;task&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# Assign subtasks to suitable agents
&lt;/span&gt;        &lt;span class="n"&gt;task_assignments&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;assign_tasks&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;subtasks&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# Execute subtasks
&lt;/span&gt;        &lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;agent_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;assigned_tasks&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;task_assignments&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
            &lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;agents&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;agent_id&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
            &lt;span class="n"&gt;agent_results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;execute_tasks&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;assigned_tasks&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;agent_id&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;agent_results&lt;/span&gt;

        &lt;span class="c1"&gt;# Coordinate and integrate results
&lt;/span&gt;        &lt;span class="n"&gt;integrated_result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;integrate_results&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;integrated_result&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;coordinate_agents&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Coordinate agent activities&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
        &lt;span class="c1"&gt;# Process inter-agent messages
&lt;/span&gt;        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;agent_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;agents&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
            &lt;span class="n"&gt;messages&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;protocol&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_messages&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;agent_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;process_messages&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# Check if coordination is needed
&lt;/span&gt;        &lt;span class="n"&gt;coordination_needed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;check_coordination_needs&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;coordination_needed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;perform_coordination&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;strong&gt;This chapter demonstrates RD-Agent's advanced features and deep customization capabilities, including specialized functions of the quantitative finance agent, core mechanisms of the CoSTEER evolution framework, and implementation methods for multi-agent collaboration. The next chapter will demonstrate practical applications of these advanced features through real-world case studies.&lt;/strong&gt;&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
