<?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>DEV Community: Henry Lin</title>
    <description>The latest articles on DEV Community by Henry Lin (@henry_lin_3ac6363747f45b4).</description>
    <link>https://dev.to/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>DEV Community: Henry Lin</title>
      <link>https://dev.to/henry_lin_3ac6363747f45b4</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/henry_lin_3ac6363747f45b4"/>
    <language>en</language>
    <item>
      <title>用hermes agent开发的每日市场简报</title>
      <dc:creator>Henry Lin</dc:creator>
      <pubDate>Sat, 23 May 2026 13:59:22 +0000</pubDate>
      <link>https://dev.to/henry_lin_3ac6363747f45b4/yong-hermes-agentkai-fa-de-mei-ri-shi-chang-jian-bao-3c0h</link>
      <guid>https://dev.to/henry_lin_3ac6363747f45b4/yong-hermes-agentkai-fa-de-mei-ri-shi-chang-jian-bao-3c0h</guid>
      <description>&lt;p&gt;第一次开发token消耗900K左右，后面复用，只需要调用脚本生成，不需要再消耗token。&lt;/p&gt;

&lt;h1&gt;
  
  
  📊 每日市场简报
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;2026-05-21（周四）&lt;/strong&gt;  ·  共 5501 只股票&lt;/p&gt;

&lt;p&gt;全市场成交额 &lt;strong&gt;35,072.80亿&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  一、涨跌概览
&lt;/h2&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;
&lt;strong&gt;695&lt;/strong&gt; (12.6%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;下跌家数&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;4773&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;平盘家数&lt;/td&gt;
&lt;td&gt;33&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;涨停数&lt;/td&gt;
&lt;td&gt;🔴 &lt;strong&gt;40&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;跌停数&lt;/td&gt;
&lt;td&gt;🟢 &lt;strong&gt;46&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;涨跌比&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.15:1&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  二、成交额 TOP10
&lt;/h2&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;th&gt;名称&lt;/th&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;1&lt;/td&gt;
&lt;td&gt;688008.SH&lt;/td&gt;
&lt;td&gt;澜起科技&lt;/td&gt;
&lt;td&gt;306.55亿&lt;/td&gt;
&lt;td&gt;+1.89%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;603986.SH&lt;/td&gt;
&lt;td&gt;兆易创新&lt;/td&gt;
&lt;td&gt;281.99亿&lt;/td&gt;
&lt;td&gt;-2.95%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;300308.SZ&lt;/td&gt;
&lt;td&gt;中际旭创&lt;/td&gt;
&lt;td&gt;243.95亿&lt;/td&gt;
&lt;td&gt;-4.21%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;600584.SH&lt;/td&gt;
&lt;td&gt;长电科技&lt;/td&gt;
&lt;td&gt;213.24亿&lt;/td&gt;
&lt;td&gt;+0.94%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;688981.SH&lt;/td&gt;
&lt;td&gt;中芯国际&lt;/td&gt;
&lt;td&gt;206.02亿&lt;/td&gt;
&lt;td&gt;-4.92%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;688256.SH&lt;/td&gt;
&lt;td&gt;寒武纪-U&lt;/td&gt;
&lt;td&gt;205.30亿&lt;/td&gt;
&lt;td&gt;-5.25%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;002281.SZ&lt;/td&gt;
&lt;td&gt;光迅科技&lt;/td&gt;
&lt;td&gt;199.59亿&lt;/td&gt;
&lt;td&gt;-8.08%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;002384.SZ&lt;/td&gt;
&lt;td&gt;东山精密&lt;/td&gt;
&lt;td&gt;193.85亿&lt;/td&gt;
&lt;td&gt;-7.19%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;000988.SZ&lt;/td&gt;
&lt;td&gt;华工科技&lt;/td&gt;
&lt;td&gt;193.22亿&lt;/td&gt;
&lt;td&gt;-5.79%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;300502.SZ&lt;/td&gt;
&lt;td&gt;新易盛&lt;/td&gt;
&lt;td&gt;192.60亿&lt;/td&gt;
&lt;td&gt;-3.74%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  三、行业涨跌排名
&lt;/h2&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;th&gt;均涨幅&lt;/th&gt;
&lt;th&gt;上涨&lt;/th&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;1&lt;/td&gt;
&lt;td&gt;空运&lt;/td&gt;
&lt;td&gt;+1.98%&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;公共交通&lt;/td&gt;
&lt;td&gt;+0.93%&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;银行&lt;/td&gt;
&lt;td&gt;+0.17%&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;18&lt;/td&gt;
&lt;td&gt;42&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;白酒&lt;/td&gt;
&lt;td&gt;+0.10%&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;路桥&lt;/td&gt;
&lt;td&gt;-0.01%&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;水运&lt;/td&gt;
&lt;td&gt;-0.03%&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;证券&lt;/td&gt;
&lt;td&gt;-0.14%&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;31&lt;/td&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;摩托车&lt;/td&gt;
&lt;td&gt;-0.24%&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;玻璃&lt;/td&gt;
&lt;td&gt;-0.32%&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;汽车整车&lt;/td&gt;
&lt;td&gt;-0.35%&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;生物制药&lt;/td&gt;
&lt;td&gt;-0.47%&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;80&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;旅游服务&lt;/td&gt;
&lt;td&gt;-0.57%&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;港口&lt;/td&gt;
&lt;td&gt;-0.58%&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;酒店餐饮&lt;/td&gt;
&lt;td&gt;-0.67%&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;机场&lt;/td&gt;
&lt;td&gt;-0.78%&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;红黄酒&lt;/td&gt;
&lt;td&gt;-0.90%&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;17&lt;/td&gt;
&lt;td&gt;旅游景点&lt;/td&gt;
&lt;td&gt;-0.91%&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;18&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;18&lt;/td&gt;
&lt;td&gt;汽车配件&lt;/td&gt;
&lt;td&gt;-0.91%&lt;/td&gt;
&lt;td&gt;81&lt;/td&gt;
&lt;td&gt;174&lt;/td&gt;
&lt;td&gt;258&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;td&gt;保险&lt;/td&gt;
&lt;td&gt;-0.94%&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;纺织机械&lt;/td&gt;
&lt;td&gt;-1.13%&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;td&gt;火力发电&lt;/td&gt;
&lt;td&gt;-1.26%&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;26&lt;/td&gt;
&lt;td&gt;31&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;公路&lt;/td&gt;
&lt;td&gt;-1.30%&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;td&gt;铁路&lt;/td&gt;
&lt;td&gt;-1.48%&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;td&gt;水力发电&lt;/td&gt;
&lt;td&gt;-1.49%&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;17&lt;/td&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;25&lt;/td&gt;
&lt;td&gt;家用电器&lt;/td&gt;
&lt;td&gt;-1.51%&lt;/td&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;td&gt;66&lt;/td&gt;
&lt;td&gt;91&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;26&lt;/td&gt;
&lt;td&gt;电器连锁&lt;/td&gt;
&lt;td&gt;-1.65%&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;27&lt;/td&gt;
&lt;td&gt;普钢&lt;/td&gt;
&lt;td&gt;-1.67%&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;td&gt;26&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;28&lt;/td&gt;
&lt;td&gt;机床制造&lt;/td&gt;
&lt;td&gt;-1.69%&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;29&lt;/td&gt;
&lt;td&gt;工程机械&lt;/td&gt;
&lt;td&gt;-1.77%&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;29&lt;/td&gt;
&lt;td&gt;38&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;td&gt;化学制药&lt;/td&gt;
&lt;td&gt;-1.80%&lt;/td&gt;
&lt;td&gt;25&lt;/td&gt;
&lt;td&gt;120&lt;/td&gt;
&lt;td&gt;147&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;31&lt;/td&gt;
&lt;td&gt;园区开发&lt;/td&gt;
&lt;td&gt;-1.81%&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;32&lt;/td&gt;
&lt;td&gt;中成药&lt;/td&gt;
&lt;td&gt;-1.88%&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;63&lt;/td&gt;
&lt;td&gt;68&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;33&lt;/td&gt;
&lt;td&gt;医疗保健&lt;/td&gt;
&lt;td&gt;-1.93%&lt;/td&gt;
&lt;td&gt;27&lt;/td&gt;
&lt;td&gt;153&lt;/td&gt;
&lt;td&gt;181&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;34&lt;/td&gt;
&lt;td&gt;水泥&lt;/td&gt;
&lt;td&gt;-2.06%&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;35&lt;/td&gt;
&lt;td&gt;多元金融&lt;/td&gt;
&lt;td&gt;-2.11%&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;36&lt;/td&gt;
&lt;td&gt;机械基件&lt;/td&gt;
&lt;td&gt;-2.23%&lt;/td&gt;
&lt;td&gt;34&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;134&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;37&lt;/td&gt;
&lt;td&gt;服饰&lt;/td&gt;
&lt;td&gt;-2.26%&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;54&lt;/td&gt;
&lt;td&gt;64&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;38&lt;/td&gt;
&lt;td&gt;特种钢&lt;/td&gt;
&lt;td&gt;-2.26%&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;39&lt;/td&gt;
&lt;td&gt;造纸&lt;/td&gt;
&lt;td&gt;-2.29%&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;28&lt;/td&gt;
&lt;td&gt;34&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;40&lt;/td&gt;
&lt;td&gt;仓储物流&lt;/td&gt;
&lt;td&gt;-2.31%&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;43&lt;/td&gt;
&lt;td&gt;46&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;41&lt;/td&gt;
&lt;td&gt;日用化工&lt;/td&gt;
&lt;td&gt;-2.33%&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;18&lt;/td&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;42&lt;/td&gt;
&lt;td&gt;汽车服务&lt;/td&gt;
&lt;td&gt;-2.33%&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;43&lt;/td&gt;
&lt;td&gt;农业综合&lt;/td&gt;
&lt;td&gt;-2.34%&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;40&lt;/td&gt;
&lt;td&gt;42&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;44&lt;/td&gt;
&lt;td&gt;新型电力&lt;/td&gt;
&lt;td&gt;-2.35%&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;25&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;45&lt;/td&gt;
&lt;td&gt;食品&lt;/td&gt;
&lt;td&gt;-2.43%&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;87&lt;/td&gt;
&lt;td&gt;93&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;46&lt;/td&gt;
&lt;td&gt;医药商业&lt;/td&gt;
&lt;td&gt;-2.44%&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;37&lt;/td&gt;
&lt;td&gt;37&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;47&lt;/td&gt;
&lt;td&gt;百货&lt;/td&gt;
&lt;td&gt;-2.44%&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;32&lt;/td&gt;
&lt;td&gt;35&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;48&lt;/td&gt;
&lt;td&gt;水务&lt;/td&gt;
&lt;td&gt;-2.45%&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;49&lt;/td&gt;
&lt;td&gt;家居用品&lt;/td&gt;
&lt;td&gt;-2.49%&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;63&lt;/td&gt;
&lt;td&gt;71&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;饲料&lt;/td&gt;
&lt;td&gt;-2.54%&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;51&lt;/td&gt;
&lt;td&gt;元器件&lt;/td&gt;
&lt;td&gt;-2.56%&lt;/td&gt;
&lt;td&gt;58&lt;/td&gt;
&lt;td&gt;242&lt;/td&gt;
&lt;td&gt;300&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;52&lt;/td&gt;
&lt;td&gt;纺织&lt;/td&gt;
&lt;td&gt;-2.58%&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;36&lt;/td&gt;
&lt;td&gt;42&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;53&lt;/td&gt;
&lt;td&gt;石油加工&lt;/td&gt;
&lt;td&gt;-2.59%&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;54&lt;/td&gt;
&lt;td&gt;渔业&lt;/td&gt;
&lt;td&gt;-2.61%&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;55&lt;/td&gt;
&lt;td&gt;小金属&lt;/td&gt;
&lt;td&gt;-2.67%&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;56&lt;/td&gt;
&lt;td&gt;64&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;56&lt;/td&gt;
&lt;td&gt;铝&lt;/td&gt;
&lt;td&gt;-2.70%&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;26&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;57&lt;/td&gt;
&lt;td&gt;啤酒&lt;/td&gt;
&lt;td&gt;-2.71%&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;58&lt;/td&gt;
&lt;td&gt;轻工机械&lt;/td&gt;
&lt;td&gt;-2.74%&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;59&lt;/td&gt;
&lt;td&gt;黄金&lt;/td&gt;
&lt;td&gt;-2.86%&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;60&lt;/td&gt;
&lt;td&gt;农药化肥&lt;/td&gt;
&lt;td&gt;-2.91%&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;55&lt;/td&gt;
&lt;td&gt;58&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;61&lt;/td&gt;
&lt;td&gt;影视音像&lt;/td&gt;
&lt;td&gt;-2.92%&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;35&lt;/td&gt;
&lt;td&gt;35&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;62&lt;/td&gt;
&lt;td&gt;乳制品&lt;/td&gt;
&lt;td&gt;-2.95%&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;63&lt;/td&gt;
&lt;td&gt;煤炭开采&lt;/td&gt;
&lt;td&gt;-2.97%&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;25&lt;/td&gt;
&lt;td&gt;26&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;64&lt;/td&gt;
&lt;td&gt;农用机械&lt;/td&gt;
&lt;td&gt;-3.00%&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;65&lt;/td&gt;
&lt;td&gt;超市连锁&lt;/td&gt;
&lt;td&gt;-3.02%&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;66&lt;/td&gt;
&lt;td&gt;林业&lt;/td&gt;
&lt;td&gt;-3.06%&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;67&lt;/td&gt;
&lt;td&gt;出版业&lt;/td&gt;
&lt;td&gt;-3.07%&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;29&lt;/td&gt;
&lt;td&gt;29&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;68&lt;/td&gt;
&lt;td&gt;建筑工程&lt;/td&gt;
&lt;td&gt;-3.12%&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;121&lt;/td&gt;
&lt;td&gt;128&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;69&lt;/td&gt;
&lt;td&gt;电器仪表&lt;/td&gt;
&lt;td&gt;-3.14%&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;92&lt;/td&gt;
&lt;td&gt;106&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;70&lt;/td&gt;
&lt;td&gt;航空&lt;/td&gt;
&lt;td&gt;-3.16%&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;49&lt;/td&gt;
&lt;td&gt;52&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;71&lt;/td&gt;
&lt;td&gt;电信运营&lt;/td&gt;
&lt;td&gt;-3.17%&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;72&lt;/td&gt;
&lt;td&gt;文教休闲&lt;/td&gt;
&lt;td&gt;-3.23%&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;50&lt;/td&gt;
&lt;td&gt;51&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;73&lt;/td&gt;
&lt;td&gt;矿物制品&lt;/td&gt;
&lt;td&gt;-3.24%&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;td&gt;35&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;74&lt;/td&gt;
&lt;td&gt;环境保护&lt;/td&gt;
&lt;td&gt;-3.26%&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;108&lt;/td&gt;
&lt;td&gt;120&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;75&lt;/td&gt;
&lt;td&gt;其他商业&lt;/td&gt;
&lt;td&gt;-3.26%&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;76&lt;/td&gt;
&lt;td&gt;供气供热&lt;/td&gt;
&lt;td&gt;-3.31%&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;42&lt;/td&gt;
&lt;td&gt;45&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;77&lt;/td&gt;
&lt;td&gt;塑料&lt;/td&gt;
&lt;td&gt;-3.36%&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;71&lt;/td&gt;
&lt;td&gt;78&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;78&lt;/td&gt;
&lt;td&gt;种植业&lt;/td&gt;
&lt;td&gt;-3.43%&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;79&lt;/td&gt;
&lt;td&gt;广告包装&lt;/td&gt;
&lt;td&gt;-3.44%&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;49&lt;/td&gt;
&lt;td&gt;54&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;80&lt;/td&gt;
&lt;td&gt;运输设备&lt;/td&gt;
&lt;td&gt;-3.47%&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;47&lt;/td&gt;
&lt;td&gt;48&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;81&lt;/td&gt;
&lt;td&gt;化纤&lt;/td&gt;
&lt;td&gt;-3.47%&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;33&lt;/td&gt;
&lt;td&gt;34&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;82&lt;/td&gt;
&lt;td&gt;互联网&lt;/td&gt;
&lt;td&gt;-3.52%&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;76&lt;/td&gt;
&lt;td&gt;80&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;83&lt;/td&gt;
&lt;td&gt;专用机械&lt;/td&gt;
&lt;td&gt;-3.53%&lt;/td&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;td&gt;254&lt;/td&gt;
&lt;td&gt;280&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;84&lt;/td&gt;
&lt;td&gt;商贸代理&lt;/td&gt;
&lt;td&gt;-3.54%&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;85&lt;/td&gt;
&lt;td&gt;船舶&lt;/td&gt;
&lt;td&gt;-3.55%&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;86&lt;/td&gt;
&lt;td&gt;铜&lt;/td&gt;
&lt;td&gt;-3.56%&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;17&lt;/td&gt;
&lt;td&gt;18&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;87&lt;/td&gt;
&lt;td&gt;铅锌&lt;/td&gt;
&lt;td&gt;-3.59%&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;88&lt;/td&gt;
&lt;td&gt;IT设备&lt;/td&gt;
&lt;td&gt;-3.67%&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;73&lt;/td&gt;
&lt;td&gt;78&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;89&lt;/td&gt;
&lt;td&gt;电气设备&lt;/td&gt;
&lt;td&gt;-3.69%&lt;/td&gt;
&lt;td&gt;38&lt;/td&gt;
&lt;td&gt;303&lt;/td&gt;
&lt;td&gt;342&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;90&lt;/td&gt;
&lt;td&gt;批发业&lt;/td&gt;
&lt;td&gt;-3.71%&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;91&lt;/td&gt;
&lt;td&gt;软件服务&lt;/td&gt;
&lt;td&gt;-3.77%&lt;/td&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;td&gt;256&lt;/td&gt;
&lt;td&gt;279&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;92&lt;/td&gt;
&lt;td&gt;全国地产&lt;/td&gt;
&lt;td&gt;-3.80%&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;25&lt;/td&gt;
&lt;td&gt;26&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;93&lt;/td&gt;
&lt;td&gt;染料涂料&lt;/td&gt;
&lt;td&gt;-3.84%&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;td&gt;34&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;94&lt;/td&gt;
&lt;td&gt;钢加工&lt;/td&gt;
&lt;td&gt;-3.84%&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;95&lt;/td&gt;
&lt;td&gt;其他建材&lt;/td&gt;
&lt;td&gt;-3.84%&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;29&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;96&lt;/td&gt;
&lt;td&gt;陶瓷&lt;/td&gt;
&lt;td&gt;-3.93%&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;97&lt;/td&gt;
&lt;td&gt;房产服务&lt;/td&gt;
&lt;td&gt;-3.97%&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;98&lt;/td&gt;
&lt;td&gt;化工原料&lt;/td&gt;
&lt;td&gt;-4.00%&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;238&lt;/td&gt;
&lt;td&gt;255&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;99&lt;/td&gt;
&lt;td&gt;化工机械&lt;/td&gt;
&lt;td&gt;-4.08%&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;13&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;焦炭加工&lt;/td&gt;
&lt;td&gt;-4.13%&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;101&lt;/td&gt;
&lt;td&gt;综合类&lt;/td&gt;
&lt;td&gt;-4.14%&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;td&gt;19&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;102&lt;/td&gt;
&lt;td&gt;橡胶&lt;/td&gt;
&lt;td&gt;-4.19%&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;17&lt;/td&gt;
&lt;td&gt;17&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;103&lt;/td&gt;
&lt;td&gt;装修装饰&lt;/td&gt;
&lt;td&gt;-4.20%&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;24&lt;/td&gt;
&lt;td&gt;25&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;104&lt;/td&gt;
&lt;td&gt;商品城&lt;/td&gt;
&lt;td&gt;-4.28%&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;105&lt;/td&gt;
&lt;td&gt;区域地产&lt;/td&gt;
&lt;td&gt;-4.38%&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;42&lt;/td&gt;
&lt;td&gt;44&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;106&lt;/td&gt;
&lt;td&gt;通信设备&lt;/td&gt;
&lt;td&gt;-4.69%&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;124&lt;/td&gt;
&lt;td&gt;135&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;107&lt;/td&gt;
&lt;td&gt;石油贸易&lt;/td&gt;
&lt;td&gt;-4.76%&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;108&lt;/td&gt;
&lt;td&gt;软饮料&lt;/td&gt;
&lt;td&gt;-4.83%&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;109&lt;/td&gt;
&lt;td&gt;石油开采&lt;/td&gt;
&lt;td&gt;-5.36%&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;td&gt;21&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;110&lt;/td&gt;
&lt;td&gt;半导体&lt;/td&gt;
&lt;td&gt;-5.76%&lt;/td&gt;
&lt;td&gt;17&lt;/td&gt;
&lt;td&gt;176&lt;/td&gt;
&lt;td&gt;193&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  四、主力资金动向
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🔥 净流入 TOP5
&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;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;1&lt;/td&gt;
&lt;td&gt;002050.SZ&lt;/td&gt;
&lt;td&gt;三花智控&lt;/td&gt;
&lt;td&gt;3.00亿&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;688008.SH&lt;/td&gt;
&lt;td&gt;澜起科技&lt;/td&gt;
&lt;td&gt;1.99亿&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;300274.SZ&lt;/td&gt;
&lt;td&gt;阳光电源&lt;/td&gt;
&lt;td&gt;1.91亿&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;600745.SH&lt;/td&gt;
&lt;td&gt;闻泰科技&lt;/td&gt;
&lt;td&gt;1.35亿&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;300059.SZ&lt;/td&gt;
&lt;td&gt;东方财富&lt;/td&gt;
&lt;td&gt;1.03亿&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  💧 净流出 TOP5
&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;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;1&lt;/td&gt;
&lt;td&gt;000725.SZ&lt;/td&gt;
&lt;td&gt;京东方Ａ&lt;/td&gt;
&lt;td&gt;-4.86亿&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;603986.SH&lt;/td&gt;
&lt;td&gt;兆易创新&lt;/td&gt;
&lt;td&gt;-3.08亿&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;600522.SH&lt;/td&gt;
&lt;td&gt;中天科技&lt;/td&gt;
&lt;td&gt;-2.57亿&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;601138.SH&lt;/td&gt;
&lt;td&gt;工业富联&lt;/td&gt;
&lt;td&gt;-2.18亿&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;002384.SZ&lt;/td&gt;
&lt;td&gt;东山精密&lt;/td&gt;
&lt;td&gt;-1.87亿&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  五、特殊形态统计
&lt;/h2&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;&lt;strong&gt;32&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;连板（连续涨停）&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;8&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;阳包阴&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;60&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;连涨≥3天&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;142&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&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;名称&lt;/th&gt;
&lt;th&gt;连板天数&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;603779.SH&lt;/td&gt;
&lt;td&gt;威龙股份&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;7连板&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;603316.SH&lt;/td&gt;
&lt;td&gt;诚邦股份&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;4连板&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;000518.SZ&lt;/td&gt;
&lt;td&gt;*ST四环&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;2连板&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;002442.SZ&lt;/td&gt;
&lt;td&gt;龙星科技&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;2连板&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;003004.SZ&lt;/td&gt;
&lt;td&gt;*ST声迅&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;2连板&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;300069.SZ&lt;/td&gt;
&lt;td&gt;金利华电&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;2连板&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;301139.SZ&lt;/td&gt;
&lt;td&gt;元道通信&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;2连板&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;600611.SH&lt;/td&gt;
&lt;td&gt;大众交通&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;2连板&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  🌅 阳包阴个股（TOP20）
&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;th&gt;涨跌幅&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;920100.BJ&lt;/td&gt;
&lt;td&gt;三协电机&lt;/td&gt;
&lt;td&gt;+14.18%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;301488.SZ&lt;/td&gt;
&lt;td&gt;豪恩汽电&lt;/td&gt;
&lt;td&gt;+10.64%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;600936.SH&lt;/td&gt;
&lt;td&gt;北投科技&lt;/td&gt;
&lt;td&gt;+10.08%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;600156.SH&lt;/td&gt;
&lt;td&gt;华升股份&lt;/td&gt;
&lt;td&gt;+10.04%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;600360.SH&lt;/td&gt;
&lt;td&gt;*ST华微&lt;/td&gt;
&lt;td&gt;+10.03%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;002888.SZ&lt;/td&gt;
&lt;td&gt;惠威科技&lt;/td&gt;
&lt;td&gt;+10.00%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;002940.SZ&lt;/td&gt;
&lt;td&gt;昂利康&lt;/td&gt;
&lt;td&gt;+10.00%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;603373.SH&lt;/td&gt;
&lt;td&gt;安邦护卫&lt;/td&gt;
&lt;td&gt;+9.99%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;600578.SH&lt;/td&gt;
&lt;td&gt;京能电力&lt;/td&gt;
&lt;td&gt;+9.95%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;000404.SZ&lt;/td&gt;
&lt;td&gt;长虹华意&lt;/td&gt;
&lt;td&gt;+8.46%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;001331.SZ&lt;/td&gt;
&lt;td&gt;胜通能源&lt;/td&gt;
&lt;td&gt;+7.86%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;603037.SH&lt;/td&gt;
&lt;td&gt;凯众股份&lt;/td&gt;
&lt;td&gt;+6.82%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;300276.SZ&lt;/td&gt;
&lt;td&gt;三丰智能&lt;/td&gt;
&lt;td&gt;+6.60%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;600481.SH&lt;/td&gt;
&lt;td&gt;双良节能&lt;/td&gt;
&lt;td&gt;+6.56%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;603040.SH&lt;/td&gt;
&lt;td&gt;新坐标&lt;/td&gt;
&lt;td&gt;+6.31%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;603693.SH&lt;/td&gt;
&lt;td&gt;江苏新能&lt;/td&gt;
&lt;td&gt;+6.29%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;001270.SZ&lt;/td&gt;
&lt;td&gt;*ST铖昌&lt;/td&gt;
&lt;td&gt;+6.19%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;601127.SH&lt;/td&gt;
&lt;td&gt;赛力斯&lt;/td&gt;
&lt;td&gt;+6.14%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;002471.SZ&lt;/td&gt;
&lt;td&gt;中超控股&lt;/td&gt;
&lt;td&gt;+5.71%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;002284.SZ&lt;/td&gt;
&lt;td&gt;亚太股份&lt;/td&gt;
&lt;td&gt;+5.65%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  📈 连涨≥3天个股（TOP10）
&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;th&gt;3日累计涨幅&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;301020.SZ&lt;/td&gt;
&lt;td&gt;密封科技&lt;/td&gt;
&lt;td&gt;+32.53%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;603316.SH&lt;/td&gt;
&lt;td&gt;诚邦股份&lt;/td&gt;
&lt;td&gt;+30.02%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;603779.SH&lt;/td&gt;
&lt;td&gt;威龙股份&lt;/td&gt;
&lt;td&gt;+29.99%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;001259.SZ&lt;/td&gt;
&lt;td&gt;利仁科技&lt;/td&gt;
&lt;td&gt;+29.28%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;605288.SH&lt;/td&gt;
&lt;td&gt;凯迪股份&lt;/td&gt;
&lt;td&gt;+28.65%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;688585.SH&lt;/td&gt;
&lt;td&gt;上纬新材&lt;/td&gt;
&lt;td&gt;+28.29%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;688610.SH&lt;/td&gt;
&lt;td&gt;埃科光电&lt;/td&gt;
&lt;td&gt;+27.44%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;300152.SZ&lt;/td&gt;
&lt;td&gt;ST新动力&lt;/td&gt;
&lt;td&gt;+25.67%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;301322.SZ&lt;/td&gt;
&lt;td&gt;绿通科技&lt;/td&gt;
&lt;td&gt;+25.19%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;300715.SZ&lt;/td&gt;
&lt;td&gt;凯伦股份&lt;/td&gt;
&lt;td&gt;+25.10%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;p&gt;&lt;em&gt;由 Hermes Quant 每日市场简报生成器自动生成&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;生成时间: 2026-05-23 21:39:23&lt;/em&gt;&lt;/p&gt;

</description>
      <category>hermes</category>
      <category>agents</category>
    </item>
    <item>
      <title>第 1 章：什么是 FreqAI / 安装与首次运行</title>
      <dc:creator>Henry Lin</dc:creator>
      <pubDate>Sun, 17 May 2026 07:21:23 +0000</pubDate>
      <link>https://dev.to/henry_lin_3ac6363747f45b4/di-1-zhang-shi-yao-shi-freqai-an-zhuang-yu-shou-ci-yun-xing-1535</link>
      <guid>https://dev.to/henry_lin_3ac6363747f45b4/di-1-zhang-shi-yao-shi-freqai-an-zhuang-yu-shou-ci-yun-xing-1535</guid>
      <description>&lt;h1&gt;
  
  
  第 1 章：什么是 FreqAI / 安装与首次运行
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;对应官方文档：&lt;a href="https://www.freqtrade.io/en/stable/freqai/" rel="noopener noreferrer"&gt;https://www.freqtrade.io/en/stable/freqai/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  学习目标
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;用一句话说清 FreqAI 解决什么问题&lt;/li&gt;
&lt;li&gt;理解 FreqAI 的"训练—预测—再训练"循环&lt;/li&gt;
&lt;li&gt;完成 FreqAI 依赖安装&lt;/li&gt;
&lt;li&gt;跑通一个&lt;strong&gt;最小&lt;/strong&gt;可运行的 LightGBM 回归示例，看到 backtest 报告&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  1.1 FreqAI 是什么
&lt;/h2&gt;

&lt;p&gt;官方原话：&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;FreqAI is a software designed to &lt;strong&gt;automate a variety of tasks associated with training a predictive machine learning model&lt;/strong&gt; to generate market forecasts given a set of input features.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;人话版：&lt;strong&gt;FreqAI 是给 Freqtrade 策略加上"机器学习预测能力"的官方框架&lt;/strong&gt;。你只要在策略里写几个钩子说明"我要用哪些特征、要预测什么"，FreqAI 就自动负责：&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;code&gt;&amp;amp;-&lt;/code&gt; 开头）回填到 dataframe&lt;/li&gt;
&lt;li&gt;按时间窗口&lt;strong&gt;自动再训练&lt;/strong&gt;适应市场漂移&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;你在策略里像用普通 indicator 一样使用预测列就行。&lt;/p&gt;

&lt;h2&gt;
  
  
  1.2 FreqAI 的工作循环
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌──────────────────────────────────────────────────────────────────┐
│  Freqtrade Pair Dataframe (OHLCV + base indicators)              │
└──────────────────────────────────────────────────────────────────┘
                          │
                          ▼
┌──────────────────────────────────────────────────────────────────┐
│  Strategy hooks (你写的):                                        │
│    feature_engineering_expand_all   ──▶ %- 特征（按period展开） │
│    feature_engineering_expand_basic ──▶ %- 特征（不随period展开）│
│    feature_engineering_standard     ──▶ %- 特征（最终统一处理） │
│    set_freqai_targets               ──▶ &amp;amp;- 标签（必须）          │
└──────────────────────────────────────────────────────────────────┘
                          │
                          ▼
┌──────────────────────────────────────────────────────────────────┐
│  FreqAI 引擎自动完成：                                           │
│    1. 按 train_period_days 切训练窗口                            │
│    2. 标准化 / 异常值检测 / PCA（可选）                          │
│    3. 调用模型 fit() 训练                                        │
│    4. 保存模型到 user_data/models/&amp;lt;identifier&amp;gt;/                  │
│    5. 在 backtest_period_days 范围内做 predict() 回填到 df       │
└──────────────────────────────────────────────────────────────────┘
                          │
                          ▼
┌──────────────────────────────────────────────────────────────────┐
│  策略 populate_entry_trend / populate_exit_trend：               │
│    用 df["&amp;amp;-s_close"] 或 df["do_predict"] 当作普通指标使用       │
└──────────────────────────────────────────────────────────────────┘
                          │
                          ▼
                       下单 / 平仓
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;%-&lt;/code&gt; 前缀&lt;/strong&gt;：模型用作输入的特征&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;&amp;amp;-&lt;/code&gt; 前缀&lt;/strong&gt;：模型要预测的目标（label）&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;无前缀&lt;/strong&gt;：中间计算列，不进入模型&lt;/li&gt;
&lt;li&gt;窗口每滚动 &lt;code&gt;backtest_period_days&lt;/code&gt; 天就&lt;strong&gt;重新训练一次&lt;/strong&gt;（实盘里改用 &lt;code&gt;live_retrain_hours&lt;/code&gt;）&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  1.3 安装
&lt;/h2&gt;

&lt;p&gt;FreqAI 不在 Freqtrade 默认依赖里，需要单独装：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;conda activate freqtrade

&lt;span class="c"&gt;# 进入你的 freqtrade 源码或安装目录&lt;/span&gt;
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements-freqai.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;这会装上：&lt;code&gt;lightgbm&lt;/code&gt;、&lt;code&gt;catboost&lt;/code&gt;、&lt;code&gt;xgboost&lt;/code&gt;、&lt;code&gt;scikit-learn&lt;/code&gt;、&lt;code&gt;datasieve&lt;/code&gt; 等。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Docker 用户改用镜像 &lt;code&gt;freqtradeorg/freqtrade:stable_freqai&lt;/code&gt; 即可。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;第 7 章的强化学习需要额外的 &lt;code&gt;requirements-freqai-rl.txt&lt;/code&gt;（含 &lt;code&gt;stable-baselines3&lt;/code&gt; 与 &lt;code&gt;torch&lt;/code&gt;，大约 700MB，按需安装）。&lt;/p&gt;

&lt;h2&gt;
  
  
  1.4 最小可运行示例
&lt;/h2&gt;

&lt;p&gt;我们要做的事情非常简单：&lt;strong&gt;预测未来 12 根 5m K 线的平均收盘价相对当前 close 的偏移&lt;/strong&gt;。本质是一个回归问题，预测出来的值约等于 "未来一小时的预期回报率"。&lt;/p&gt;

&lt;p&gt;策略文件：&lt;a href="//examples/ch01/FreqaiHelloStrategy.py"&gt;&lt;code&gt;examples/ch01/FreqaiHelloStrategy.py&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;配置文件：&lt;a href="//examples/ch01/config_ch01.json"&gt;&lt;code&gt;examples/ch01/config_ch01.json&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  1.4.1 策略代码精读
&lt;/h3&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;FreqaiHelloStrategy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;IStrategy&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;timeframe&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;5m&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="n"&gt;can_short&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;
    &lt;span class="n"&gt;process_only_new_candles&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;
    &lt;span class="n"&gt;startup_candle_count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;40&lt;/span&gt;           &lt;span class="c1"&gt;# &amp;gt;= indicator_periods_candles 最大值 * 2
&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;feature_engineering_expand_all&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;dataframe&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;period&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="c1"&gt;# 每个 period（10, 20）都会被自动展开一遍
&lt;/span&gt;        &lt;span class="n"&gt;dataframe&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;%-rsi-period_&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;period&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="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;RSI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dataframe&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timeperiod&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;period&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;dataframe&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;%-ema-period_&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;period&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="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ta&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;EMA&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dataframe&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timeperiod&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;period&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;dataframe&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;set_freqai_targets&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;dataframe&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kwargs&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="c1"&gt;# 必须实现：定义 &amp;amp;- 开头的列作为预测目标
&lt;/span&gt;        &lt;span class="n"&gt;horizon&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;freqai_info&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;feature_parameters&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_period_candles&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;dataframe&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;amp;-s_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="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;dataframe&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="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;horizon&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;rolling&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;horizon&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;dataframe&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="mi"&gt;1&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;dataframe&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;populate_indicators&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;dataframe&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="c1"&gt;# 把 freqai 引擎接进来——这是必须的一行
&lt;/span&gt;        &lt;span class="n"&gt;dataframe&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;freqai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dataframe&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;metadata&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;return&lt;/span&gt; &lt;span class="n"&gt;dataframe&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;populate_entry_trend&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;dataframe&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="c1"&gt;# 预测值 &amp;gt; 0 且预测置信度 ok 就开多
&lt;/span&gt;        &lt;span class="n"&gt;dataframe&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dataframe&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;amp;-s_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;&amp;gt;&lt;/span&gt; &lt;span class="mf"&gt;0.002&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dataframe&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;do_predict&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="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;enter_long&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="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;dataframe&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;populate_exit_trend&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;dataframe&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;dataframe&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;dataframe&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;&amp;amp;-s_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;&amp;lt;&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;exit_long&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="mi"&gt;1&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;dataframe&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;code&gt;do_predict&lt;/code&gt;：FreqAI 自动加在 dataframe 上的"这一行预测是否有效"标记（1 表示在 DI 阈值内可信）&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;&amp;amp;-s_close&lt;/code&gt;：你定义的 label 在推理阶段会被同名列自动覆盖为预测值&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  1.4.2 配置文件精读
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;config_ch01.json&lt;/code&gt; 的 &lt;code&gt;freqai&lt;/code&gt; 块：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"freqai"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"enabled"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"identifier"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ch01_hello"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"train_period_days"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"backtest_period_days"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"live_retrain_hours"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"purge_old_models"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"feature_parameters"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"include_timeframes"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"5m"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"include_corr_pairlist"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"label_period_candles"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"include_shifted_candles"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"indicator_periods_candles"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"data_split_parameters"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"test_size"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&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="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"shuffle"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"model_training_parameters"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"n_estimators"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;最小可运行配置：单时间框架、无相关币种、两个指标周期。&lt;/p&gt;

&lt;h2&gt;
  
  
  1.5 运行命令
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;conda activate freqtrade

&lt;span class="c"&gt;# 1. 预下载数据（带 35 天 buffer，给 train_period_days=15 + startup=40 留余地）&lt;/span&gt;
freqtrade download-data &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--exchange&lt;/span&gt; binance &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--pairs&lt;/span&gt; BTC/USDT ETH/USDT &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--timeframes&lt;/span&gt; 5m &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--timerange&lt;/span&gt; 20240501-20240801

&lt;span class="c"&gt;# 2. 跑回测&lt;/span&gt;
freqtrade backtesting &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--config&lt;/span&gt; freqai-tutorial/examples/ch01/config_ch01.json &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--strategy&lt;/span&gt; FreqaiHelloStrategy &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--strategy-path&lt;/span&gt; freqai-tutorial/examples/ch01 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--freqaimodel&lt;/span&gt; LightGBMRegressor &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--timerange&lt;/span&gt; 20240601-20240731
&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 console"&gt;&lt;code&gt;&lt;span class="go"&gt;=========== FREQAI ENABLED ===========
Found XX historical candles for BTC/USDT 5m
Training model for BTC/USDT
&lt;/span&gt;&lt;span class="c"&gt;...
&lt;/span&gt;&lt;span class="go"&gt;============================ BACKTESTING REPORT ============================
| Pair        | Entries | Avg Profit % | ... |
| BTC/USDT    | XX      | X.XX         | ... |
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;只要看到 "Training model for ..." 与最终的 BACKTESTING REPORT 表格，就说明跑通了。&lt;/p&gt;

&lt;h2&gt;
  
  
  1.6 常见错误
&lt;/h2&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;th&gt;解决&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;KeyError: 'freqai'&lt;/code&gt; 或 &lt;code&gt;freqai_info is None&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;配置里没启用 freqai 块&lt;/td&gt;
&lt;td&gt;检查 &lt;code&gt;freqai.enabled: true&lt;/code&gt;，且 &lt;code&gt;freqaimodel&lt;/code&gt; 命令行参数已传&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;No model found in user_data/models/&amp;lt;identifier&amp;gt;/...&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;训练窗口不够 / 数据没下载完&lt;/td&gt;
&lt;td&gt;把 &lt;code&gt;--timerange&lt;/code&gt; 起点往后挪到 &lt;code&gt;train_period_days + startup&lt;/code&gt; 之后&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;KeyError: '&amp;amp;-s_close'&lt;/code&gt; 在 populate_entry_trend&lt;/td&gt;
&lt;td&gt;忘了在 populate_indicators 里调 &lt;code&gt;self.freqai.start(...)&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;加上那一行&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Cannot use VolumePairList with FreqAI&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;用了动态币池&lt;/td&gt;
&lt;td&gt;改成静态 &lt;code&gt;StaticPairList&lt;/code&gt; 或 &lt;code&gt;ShufflePairList&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  1.7 验证情况
&lt;/h2&gt;

&lt;p&gt;✅ 本章示例在 &lt;code&gt;conda activate freqtrade&lt;/code&gt; 环境下完整跑通了 backtesting（见教程仓库 README）。如果你的环境跑不起来，多半是数据没下全或 freqtrade 版本太老（建议 ≥ 2024.x）。&lt;/p&gt;

&lt;h2&gt;
  
  
  1.8 小结与下一章
&lt;/h2&gt;

&lt;p&gt;你已经会跑一个最小 FreqAI 策略了。但很多配置字段是直接照抄的，第 2 章会&lt;strong&gt;逐项&lt;/strong&gt;拆解 &lt;code&gt;freqai&lt;/code&gt; 块每个字段的含义，让你能根据自己的需求改配置。&lt;/p&gt;

</description>
      <category>freqai</category>
    </item>
    <item>
      <title>为什么长期做量化，一定要先搭建自己的“数据中台”</title>
      <dc:creator>Henry Lin</dc:creator>
      <pubDate>Tue, 12 May 2026 11:24:30 +0000</pubDate>
      <link>https://dev.to/henry_lin_3ac6363747f45b4/wei-shi-yao-chang-qi-zuo-liang-hua-ding-yao-xian-da-jian-zi-ji-de-shu-ju-zhong-tai--44bm</link>
      <guid>https://dev.to/henry_lin_3ac6363747f45b4/wei-shi-yao-chang-qi-zuo-liang-hua-ding-yao-xian-da-jian-zi-ji-de-shu-ju-zhong-tai--44bm</guid>
      <description>&lt;h1&gt;
  
  
  为什么长期做量化，一定要先搭建自己的数据中台
&lt;/h1&gt;

&lt;p&gt;很多人做量化，第一步就开始研究策略。&lt;/p&gt;

&lt;p&gt;今天学一个 MACD，明天学一个 AI 选股，后天开始回测。结果半年后，策略越来越多，代码越来越乱，数据越来越碎，整个系统根本没法扩展。&lt;/p&gt;

&lt;p&gt;尤其是个人开发者、独立量化团队，经常会踩一个坑：&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;把量化系统当成了策略工程，而不是数据工程。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;但说实话，真正长期跑得起来的量化系统，重心其实不在策略上，而在数据层。&lt;/p&gt;




&lt;h1&gt;
  
  
  为什么数据底座这么重要？
&lt;/h1&gt;

&lt;p&gt;量化系统本质上就是数据驱动。所有策略、因子、回测、AI 模型、风控、选股，全都建在数据之上。&lt;/p&gt;

&lt;p&gt;数据层一旦出问题，后面什么都跟着乱：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;指标没法统一，同一个 PE 不同来源数值不一样&lt;/li&gt;
&lt;li&gt;股票代码混乱，有的表叫 code，有的叫 symbol，有的叫 ts_code&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;很多人刚开始只有几十只股票的数据，觉得 CSV 就够了。但做半年以后你会发现，日线、分钟线、基本面、财报、资金流、技术指标、因子库、AI 特征、新闻舆情、宏观数据……数据量增长得比你想的快得多。这时候如果没有统一的数据管理方式，后面几乎没法维护。&lt;/p&gt;




&lt;h1&gt;
  
  
  一个成熟量化系统需要哪些数据？
&lt;/h1&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;                    ┌─────────────────────┐
                    │    数据中台 / DataHub │
                    └─────────────────────┘
                               │
 ┌────────────────────────────────────────────────────────┐
 │                                                        │
 │ • daily_history   (日线行情 OHLCV)                      │
 │ • daily_basic    (基本面 PE/PB/换手率)                  │
 │ • moneyflow      (资金流向)                             │
 │ • stk_factor     (技术指标 MACD/KDJ/RSI)                │
 │ • stock_basic    (股票基础信息)                         │
 │ • balance_sheet  (资产负债表)                           │
 │ • income_statement (利润表)                             │
 │ • cash_flow      (现金流量表)                           │
 │                                                        │
 └────────────────────────────────────────────────────────┘
                               │
        ┌──────────────────────────────────┐
        │                                  │
        │  因子系统 / 回测 / AI / 策略引擎   │
        │                                  │
        └──────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  为什么建议一开始就搭？
&lt;/h1&gt;

&lt;p&gt;有开发者会说："我策略还没跑通，先不用那么复杂吧。"&lt;/p&gt;

&lt;p&gt;这想法挺正常的，但后期再重构数据层，代价真的很大。&lt;/p&gt;

&lt;p&gt;量化有个特点：数据只会越来越多。你今天可能只有 500 只股票的日线，但早晚要加全市场、分钟线、Tick、期货、ETF、美股、港股、AI 特征、另类数据。&lt;/p&gt;

&lt;p&gt;如果一开始没设计好数据结构，后面大概率会遇到：表结构崩坏、查询变慢、指标重复计算、Redis 缓存失控、CSV 满天飞、Python 脚本互相依赖改一个挂一片。等你想整理的时候，已经理不清了。&lt;/p&gt;




&lt;h1&gt;
  
  
  量化的核心其实不是策略，是数据复用
&lt;/h1&gt;

&lt;p&gt;大部分刚入门的人觉得策略最重要。但实际上，成熟的量化团队花在数据一致性、数据清洗、数据标准化、因子复用、特征工程上的精力，远比调参多。&lt;/p&gt;

&lt;p&gt;原因很简单：一份数据可以反复用。&lt;/p&gt;

&lt;p&gt;比如同一份 &lt;code&gt;daily_history&lt;/code&gt;，动量策略用得着，AI 训练用得着，因子分析用得着，行业轮动用得着，回测用得着，择时用得着，可视化展示用得着，选股器也用得着。&lt;/p&gt;

&lt;p&gt;所以长期来看，真正有价值的是持续积累的数据资产，不是某一个短期能赚钱的策略。策略会过时，数据不会。&lt;/p&gt;




&lt;h1&gt;
  
  
  推荐的数据中台设计思路
&lt;/h1&gt;

&lt;h2&gt;
  
  
  1. 原始数据层（ODS）
&lt;/h2&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;ods_daily_history
ods_moneyflow
ods_financial
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;核心原则就是三条：可追溯、不污染、永远保留原始源数据。&lt;/p&gt;

&lt;h2&gt;
  
  
  2. 标准化层（DWD）
&lt;/h2&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;ts_code
trade_date
open
high
low
close
volume
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;这一层要解决的问题就是命名不一致——有的表叫 code，有的叫 symbol，有的叫 stock_code，到后面你会疯掉。统一规范非常重要。&lt;/p&gt;

&lt;h2&gt;
  
  
  3. 因子层（DWS）
&lt;/h2&gt;

&lt;p&gt;这里放计算后的东西：技术指标、Alpha 因子、AI 特征、行业特征、横截面特征。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;factor_momentum_20
factor_turnover_ratio
factor_pe_rank
factor_volume_breakout
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  4. 策略层（ADS）
&lt;/h2&gt;

&lt;p&gt;直接给回测、AI 模型、选股器、前端接口用的。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;top_factors_daily
strategy_signals
stock_scores
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  AI 和量化的关系
&lt;/h1&gt;

&lt;p&gt;AI 深度介入量化已经是大趋势了。但 AI 有个硬需求：它要吃数据，而且是干净、结构化、能对齐的数据。&lt;/p&gt;

&lt;p&gt;没有稳定的数据底座，特征工程做不了，时序训练做不了，多周期融合做不了，Walk-Forward 做不了，因子挖掘做不了，AutoML 也做不了。&lt;/p&gt;

&lt;p&gt;我见过不少人，最后卡住的不是策略能力，是数据根本接不起来。&lt;/p&gt;




&lt;h1&gt;
  
  
  个人开发者推荐的技术架构
&lt;/h1&gt;

&lt;p&gt;个人或者小团队没必要上来就搞 Hadoop。以下这些够用了：&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;数据存储：&lt;/strong&gt; PostgreSQL / ClickHouse / DuckDB / Parquet&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;缓存层：&lt;/strong&gt; Redis&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;任务调度：&lt;/strong&gt; Airflow / Celery / Cron&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;数据处理：&lt;/strong&gt; Python + Pandas + Polars&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;因子计算：&lt;/strong&gt; TA-Lib / vectorbt / Qlib&lt;/p&gt;




&lt;h1&gt;
  
  
  两条不同的路
&lt;/h1&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;而把数据当核心资产的人，路径大概是这样：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;数据底座 → 因子平台 → 回测框架 → AI 特征工程 → 自动选股 → 多策略组合 → 风控系统 → 实盘交易
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;区别就在于你把数据当成附属品，还是当成核心资产。&lt;/p&gt;




&lt;h1&gt;
  
  
  总结
&lt;/h1&gt;

&lt;p&gt;长期做量化，与其急着写策略、做回测、研究 AI，不如先把数据中台搭起来。&lt;/p&gt;

&lt;p&gt;策略会失效，市场会变，模型会过时。但数据资产会一直积累，越往后越值钱。&lt;/p&gt;

&lt;p&gt;量化这件事，拼到最后，壁垒往往不是什么策略秘密，而是你手里有没有一套长期积累、持续迭代的数据底座。&lt;/p&gt;

</description>
    </item>
    <item>
      <title>US Stock Screener</title>
      <dc:creator>Henry Lin</dc:creator>
      <pubDate>Wed, 06 May 2026 00:44:39 +0000</pubDate>
      <link>https://dev.to/henry_lin_3ac6363747f45b4/us-stock-screener-4jpf</link>
      <guid>https://dev.to/henry_lin_3ac6363747f45b4/us-stock-screener-4jpf</guid>
      <description>&lt;h1&gt;
  
  
  US Stock Screener
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Access address
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://usstockscreener-production-6b89.up.railway.app/" rel="noopener noreferrer"&gt;https://usstockscreener-production-6b89.up.railway.app/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A daily US stock screener built with FastAPI + React. Fetches a curated tech/value stock pool via yfinance, computes daily technical patterns and rolling indicators into a single &lt;code&gt;data.parquet&lt;/code&gt; snapshot, and serves a full-featured filter/sort/research UI with &lt;strong&gt;real-time data support&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Features
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Main Screener
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pattern filters&lt;/strong&gt; — single/double/triple candlestick patterns, MA trend patterns, volume/volatility signals, momentum signals&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Numeric filters&lt;/strong&gt; — range conditions on any continuous metric (PE, ROE, market cap, etc.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Preset strategies&lt;/strong&gt; — one-click strategy presets combining multiple filters&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sortable table&lt;/strong&gt; — sort by any column; paginated results&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Signal score&lt;/strong&gt; — composite ranking score shown per stock&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Watchlist
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Star any stock to add it to your watchlist (persisted via &lt;code&gt;localStorage&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Watchlist-only mode&lt;/strong&gt; — filter the table to show only starred stocks&lt;/li&gt;
&lt;li&gt;Watchlist bar shows count and quick actions&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Stock Research Page (&lt;code&gt;/stock/:symbol&lt;/code&gt;)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Price chart with candlestick + volume&lt;/li&gt;
&lt;li&gt;Technical indicators panel (MA, volatility, drawdown)&lt;/li&gt;
&lt;li&gt;Financials panel (PE, PB, ROE, margins, growth)&lt;/li&gt;
&lt;li&gt;Pattern history panel — win-rate and average return for triggered patterns&lt;/li&gt;
&lt;li&gt;Previous / next navigation within current filtered results&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Compare Page (&lt;code&gt;/compare&lt;/code&gt;)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Select 2–5 stocks via checkboxes in the screener or "Add to Compare" on research pages&lt;/li&gt;
&lt;li&gt;Side-by-side metric table across 7 categories: Overview, Price Momentum, Valuation, Profitability, Growth, Financial Health, Risk&lt;/li&gt;
&lt;li&gt;Best value highlighted green, worst highlighted red per metric row&lt;/li&gt;
&lt;li&gt;Selection persists across page navigations (sessionStorage), resets on filter/sort change&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Pattern Stats Page (&lt;code&gt;/pattern-stats&lt;/code&gt;)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Historical win-rate and average return for every pattern signal in the stock pool&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>datascience</category>
      <category>python</category>
      <category>react</category>
      <category>showdev</category>
    </item>
    <item>
      <title>美股日线选股器</title>
      <dc:creator>Henry Lin</dc:creator>
      <pubDate>Wed, 06 May 2026 00:42:30 +0000</pubDate>
      <link>https://dev.to/henry_lin_3ac6363747f45b4/mei-gu-ri-xian-xuan-gu-qi-3nln</link>
      <guid>https://dev.to/henry_lin_3ac6363747f45b4/mei-gu-ri-xian-xuan-gu-qi-3nln</guid>
      <description>&lt;h1&gt;
  
  
  美股日线选股器
&lt;/h1&gt;

&lt;p&gt;访问地址：&lt;a href="https://usstockscreener-production-6b89.up.railway.app/" rel="noopener noreferrer"&gt;https://usstockscreener-production-6b89.up.railway.app/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;基于 FastAPI + React 构建的美股每日选股工具。通过 yfinance 拉取精选科技/价值股票池，计算日线技术形态与滚动指标，生成 &lt;code&gt;data.parquet&lt;/code&gt; 快照文件，并提供功能完整的筛选、排序与研究页面，支持&lt;strong&gt;实时数据显示&lt;/strong&gt;。&lt;/p&gt;




&lt;h2&gt;
  
  
  功能介绍
&lt;/h2&gt;

&lt;h3&gt;
  
  
  主页选股器
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;形态筛选&lt;/strong&gt; — 单日/双日/三日 K 线形态，均线趋势形态，量能/波动率信号，动量信号&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;数值筛选&lt;/strong&gt; — 对任意连续指标（PE、ROE、市值等）设置范围条件&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;预设策略&lt;/strong&gt; — 一键应用组合多个筛选条件的策略预设&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;可排序表格&lt;/strong&gt; — 按任意列排序，支持分页&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;综合评分&lt;/strong&gt; — 每只股票显示合成信号评分&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  观察列表
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;点击星标将股票加入观察列表（通过 &lt;code&gt;localStorage&lt;/code&gt; 持久化）&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;仅看观察列表模式&lt;/strong&gt; — 过滤表格只展示已收藏的股票&lt;/li&gt;
&lt;li&gt;观察列表栏显示数量及快捷操作&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  个股研究页（&lt;code&gt;/stock/:symbol&lt;/code&gt;）
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;K 线图 + 成交量图表&lt;/li&gt;
&lt;li&gt;技术指标面板（均线、波动率、最大回撤）&lt;/li&gt;
&lt;li&gt;财务指标面板（PE、PB、ROE、利润率、增长率）&lt;/li&gt;
&lt;li&gt;形态历史面板 — 展示每个触发形态的历史胜率与平均收益&lt;/li&gt;
&lt;li&gt;在当前筛选结果内前后翻页导航&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  对比页（&lt;code&gt;/compare&lt;/code&gt;）
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;在选股器勾选复选框或在研究页点击"添加对比"，最多选取 5 只股票进行对比&lt;/li&gt;
&lt;li&gt;7 大类别横向对比指标：综合、价格动量、估值、盈利能力、成长性、财务健康、风险&lt;/li&gt;
&lt;li&gt;每行最优值标绿、最差值标红&lt;/li&gt;
&lt;li&gt;选择状态跨页保留（sessionStorage），切换筛选/排序条件时自动清空&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  形态统计页（&lt;code&gt;/pattern-stats&lt;/code&gt;）
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;展示股票池中每个形态信号的历史胜率与平均收益&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  页面使用说明
&lt;/h2&gt;

&lt;h3&gt;
  
  
  主页选股器
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;左侧&lt;strong&gt;筛选面板&lt;/strong&gt;点击形态标签进行筛选，激活的筛选条件显示在顶部标签栏&lt;/li&gt;
&lt;li&gt;点击&lt;strong&gt;数值筛选&lt;/strong&gt;图标可对 PE、ROE、市值等连续指标设置范围&lt;/li&gt;
&lt;li&gt;点击&lt;strong&gt;预设策略&lt;/strong&gt;按钮一键应用组合策略&lt;/li&gt;
&lt;li&gt;表格列头可点击排序，底部分页切换&lt;/li&gt;
&lt;li&gt;点击&lt;strong&gt;星标（☆）&lt;/strong&gt;将股票加入观察列表&lt;/li&gt;
&lt;li&gt;勾选&lt;strong&gt;复选框&lt;/strong&gt;将股票加入对比列表（最多 5 只）&lt;/li&gt;
&lt;li&gt;选满 2 只后，顶部出现&lt;strong&gt;比较(N)→&lt;/strong&gt; 按钮，底部出现&lt;strong&gt;对比栏&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  实时数据功能
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;顶部状态栏显示当前数据源类型（FREE/PREMIUM）和延迟状态&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;点击任意股票行进入研究页&lt;/li&gt;
&lt;li&gt;顶部可切换到上一只/下一只（在当前筛选结果内）&lt;/li&gt;
&lt;li&gt;点击&lt;strong&gt;添加对比&lt;/strong&gt;将该股加入对比列表&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  对比页
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;选好 2–5 只股票后，点击对比栏的&lt;strong&gt;查看对比 →&lt;/strong&gt; 或顶部 &lt;strong&gt;比较(N)→&lt;/strong&gt; 进入&lt;/li&gt;
&lt;li&gt;逐行对比 17 项指标，绿色为同行最优，红色为同行最差&lt;/li&gt;
&lt;li&gt;点击&lt;strong&gt;重新选择&lt;/strong&gt;清空列表并返回主页&lt;/li&gt;
&lt;/ul&gt;




</description>
    </item>
    <item>
      <title>Hermes Agent 项目思维导图</title>
      <dc:creator>Henry Lin</dc:creator>
      <pubDate>Sun, 19 Apr 2026 13:38:57 +0000</pubDate>
      <link>https://dev.to/henry_lin_3ac6363747f45b4/hermes-agent-xiang-mu-si-wei-dao-tu-27i6</link>
      <guid>https://dev.to/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://dev.to/henry_lin_3ac6363747f45b4/hermes-agent-he-xin-yun-xing-xi-tong-diao-yong-liu-cheng-yuan-ma-fen-xi-1ojp</link>
      <guid>https://dev.to/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://dev.to/henry_lin_3ac6363747f45b4/hermes-agent-06-ji-neng-ji-yi-yu-shang-xia-wen-wen-jian-38fd</link>
      <guid>https://dev.to/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://dev.to/henry_lin_3ac6363747f45b4/hermes-agent-05-gong-ju-yu-gong-ju-ji-5e1d</link>
      <guid>https://dev.to/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://dev.to/henry_lin_3ac6363747f45b4/hermes-agent-04-pei-zhi-ti-xi-yu-mo-xing-guan-li-4hkm</link>
      <guid>https://dev.to/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://dev.to/henry_lin_3ac6363747f45b4/hermes-agent-03-shou-ci-yun-xing-yu-cli-ji-chu-4g2j</link>
      <guid>https://dev.to/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://dev.to/henry_lin_3ac6363747f45b4/hermes-agent-02-an-zhuang-yu-chu-shi-hua-5bpn</link>
      <guid>https://dev.to/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>
  </channel>
</rss>
