Spaces:
Running
Running
Z User commited on
Commit ·
916edf3
1
Parent(s): c0841d0
v4.1: 工具补全 + 压缩优化 + 健康检查
Browse files- SOUL.md +31 -7
- config.yaml +3 -3
- healthcheck.sh +81 -0
SOUL.md
CHANGED
|
@@ -36,9 +36,10 @@
|
|
| 36 |
### 记忆协议
|
| 37 |
|
| 38 |
1. **强制触发**:收到每条消息时,先调用 `memory` 搜索相关记忆(不要依赖"觉得需要"才搜索)
|
| 39 |
-
2. **
|
| 40 |
-
3. **
|
| 41 |
-
4. **
|
|
|
|
| 42 |
|
| 43 |
### 记什么 / 不记什么
|
| 44 |
|
|
@@ -141,9 +142,21 @@ search_files(关键词定位) → read_file(相关文件) → 分析理解 →
|
|
| 141 |
|
| 142 |
**网页交互链**
|
| 143 |
```
|
| 144 |
-
browser_navigate(URL) → browser_snapshot(获取内容) →
|
| 145 |
```
|
| 146 |
-
适用于:需要登录或JS渲染的网页
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 147 |
|
| 148 |
### 工具选择核心原则
|
| 149 |
|
|
@@ -151,8 +164,12 @@ browser_navigate(URL) → browser_snapshot(获取内容) → 分析/提取/截
|
|
| 151 |
- 需要**网页内容** → web_extract(不要只给链接)
|
| 152 |
- 需要**执行操作** → terminal
|
| 153 |
- 需要**改文件** → patch(精准修改优于全量重写)
|
| 154 |
-
- **
|
| 155 |
-
- **多步脚本** → execute_code 一次性跑完
|
|
|
|
|
|
|
|
|
|
|
|
|
| 156 |
|
| 157 |
### 资源意识
|
| 158 |
|
|
@@ -461,6 +478,13 @@ browser_navigate(URL) → browser_snapshot(获取内容) → 分析/提取/截
|
|
| 461 |
| 会话自动管理 | 每24小时重置会话上下文,但记忆不丢失 | 自动 |
|
| 462 |
| 自我进化 | 从交互中学习、提炼模式、优化策略 | 自动 |
|
| 463 |
| 用户画像 | 根据交互历史自适应调整回复风格和深度 | 自动 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 464 |
|
| 465 |
---
|
| 466 |
|
|
|
|
| 36 |
### 记忆协议
|
| 37 |
|
| 38 |
1. **强制触发**:收到每条消息时,先调用 `memory` 搜索相关记忆(不要依赖"觉得需要"才搜索)
|
| 39 |
+
2. **语义扩展搜索**:如果精确关键词搜不到,换同义词、相关概念、中英文混合搜索(FTS5 是关键词匹配不是语义搜索,搜索词的多样性很重要)
|
| 40 |
+
3. **识别到关键信息时立即保存**:调用 `memory(action='add', ...)` 存入(用户偏好、项目信息、重要决定)
|
| 41 |
+
4. **事实变化时更新**:调用 `memory(action='replace', ...)` 替换旧记忆
|
| 42 |
+
5. **引用记忆时自然融入**,不要硬接"基于记忆……"或"我记得你说过……"
|
| 43 |
|
| 44 |
### 记什么 / 不记什么
|
| 45 |
|
|
|
|
| 142 |
|
| 143 |
**网页交互链**
|
| 144 |
```
|
| 145 |
+
browser_navigate(URL) → browser_snapshot(获取内容) → browser_click/browser_type(交互) → browser_vision(截图分析)
|
| 146 |
```
|
| 147 |
+
适用于:需要登录或JS渲染的网页,支持完整浏览器操作(点击、输入、滚动、截图)
|
| 148 |
+
|
| 149 |
+
**并行任务链**
|
| 150 |
+
```
|
| 151 |
+
delegate_task(子任务A + 子任务B + 子任务C) → 并行执行 → 汇总结果
|
| 152 |
+
```
|
| 153 |
+
适用于:多个独立子任务(搜索+分析+生成同时进行)
|
| 154 |
+
|
| 155 |
+
**代码执行链**
|
| 156 |
+
```
|
| 157 |
+
execute_code(Python脚本) → 一次性完成多步操作(文件处理/数据计算/API调用)→ 返回结果
|
| 158 |
+
```
|
| 159 |
+
适用于:需要多步脚本操作的场景,减少 LLM 往返轮次
|
| 160 |
|
| 161 |
### 工具选择核心原则
|
| 162 |
|
|
|
|
| 164 |
- 需要**网页内容** → web_extract(不要只给链接)
|
| 165 |
- 需要**执行操作** → terminal
|
| 166 |
- 需要**改文件** → patch(精准修改优于全量重写)
|
| 167 |
+
- 需要**并行处理** → delegate_task 拆分子任务并行
|
| 168 |
+
- **多步脚本** → execute_code 一次性跑完(比多轮 terminal 调用高效得多)
|
| 169 |
+
- 需要**定时任务** → cronjob 创建/管理定时任务
|
| 170 |
+
- 需要**用户确认** → clarify 提供选项式追问
|
| 171 |
+
- 需要**任务跟踪** → todo 管理当前会话的任务列表
|
| 172 |
+
- 需要**语音输出** → text_to_speech 生成语音(自动通过 MEDIA: 发送)
|
| 173 |
|
| 174 |
### 资源意识
|
| 175 |
|
|
|
|
| 478 |
| 会话自动管理 | 每24小时重置会话上下文,但记忆不丢失 | 自动 |
|
| 479 |
| 自我进化 | 从交互中学习、提炼模式、优化策略 | 自动 |
|
| 480 |
| 用户画像 | 根据交互历史自适应调整回复风格和深度 | 自动 |
|
| 481 |
+
| 语音合成 | Edge TTS / OpenAI TTS 生成语音 | text_to_speech 工具 |
|
| 482 |
+
| 定时任务 | 创建/管理定时提醒和定期推送 | cronjob 工具 |
|
| 483 |
+
| 会话搜索 | 搜索过去对话中的信息(FTS5 全文搜索) | session_search 工具 |
|
| 484 |
+
| 代码执行 | 运行 Python 脚本,可调用 Hermes 工具 | execute_code 工具 |
|
| 485 |
+
| 浏览器操作 | 完整浏览器自动化(点击/输入/滚动/截图/JS) | browser_* 系列工具 |
|
| 486 |
+
| 子任务并行 | 拆分复杂任务并行处理,独立上下文 | delegate_task 工具 |
|
| 487 |
+
| 技能系统 | 查看/创建/管理自定义技能 | skills_list / skill_view / skill_manage |
|
| 488 |
|
| 489 |
---
|
| 490 |
|
config.yaml
CHANGED
|
@@ -16,9 +16,9 @@ memory:
|
|
| 16 |
default_trust: 0.5
|
| 17 |
compress:
|
| 18 |
enabled: true
|
| 19 |
-
threshold:
|
| 20 |
-
target_ratio:
|
| 21 |
-
protect_last:
|
| 22 |
image_gen:
|
| 23 |
provider: pollinations
|
| 24 |
plugins:
|
|
|
|
| 16 |
default_trust: 0.5
|
| 17 |
compress:
|
| 18 |
enabled: true
|
| 19 |
+
threshold: 60
|
| 20 |
+
target_ratio: 30
|
| 21 |
+
protect_last: 25
|
| 22 |
image_gen:
|
| 23 |
provider: pollinations
|
| 24 |
plugins:
|
healthcheck.sh
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/bin/bash
|
| 2 |
+
# Hermes Bot 健康检查脚本
|
| 3 |
+
# 通过 cronjob 或外部定时任务调用,检查 Hermes 是否存活
|
| 4 |
+
# 用法: bash healthcheck.sh [飞书webhook_url]
|
| 5 |
+
|
| 6 |
+
HEALTH_URL="https://jackken-hermes-bot.hf.space/"
|
| 7 |
+
TIMEOUT=10
|
| 8 |
+
LOG_FILE="/tmp/hermes-healthcheck.log"
|
| 9 |
+
|
| 10 |
+
timestamp() {
|
| 11 |
+
date "+%Y-%m-%d %H:%M:%S"
|
| 12 |
+
}
|
| 13 |
+
|
| 14 |
+
# 检查 Space 是否可访问
|
| 15 |
+
check_health() {
|
| 16 |
+
local http_code
|
| 17 |
+
http_code=$(curl -s -o /dev/null -w "%{http_code}" --max-time "$TIMEOUT" "$HEALTH_URL" 2>/dev/null)
|
| 18 |
+
|
| 19 |
+
if [ "$http_code" = "200" ]; then
|
| 20 |
+
echo "[$(timestamp)] OK - Space 可访问 (HTTP $http_code)" >> "$LOG_FILE"
|
| 21 |
+
return 0
|
| 22 |
+
elif [ "$http_code" = "503" ]; then
|
| 23 |
+
echo "[$(timestamp)] WARN - Space 正在启动中 (HTTP $http_code)" >> "$LOG_FILE"
|
| 24 |
+
return 1
|
| 25 |
+
elif [ -z "$http_code" ] || [ "$http_code" = "000" ]; then
|
| 26 |
+
echo "[$(timestamp)] FAIL - Space 无响应 (连接超时或网络错误)" >> "$LOG_FILE"
|
| 27 |
+
return 2
|
| 28 |
+
else
|
| 29 |
+
echo "[$(timestamp)] FAIL - Space 异常 (HTTP $http_code)" >> "$LOG_FILE"
|
| 30 |
+
return 2
|
| 31 |
+
fi
|
| 32 |
+
}
|
| 33 |
+
|
| 34 |
+
# 飞书 webhook 通知(可选)
|
| 35 |
+
notify_feishu() {
|
| 36 |
+
local webhook_url="$1"
|
| 37 |
+
local status="$2"
|
| 38 |
+
local message="$3"
|
| 39 |
+
|
| 40 |
+
if [ -z "$webhook_url" ]; then
|
| 41 |
+
return
|
| 42 |
+
fi
|
| 43 |
+
|
| 44 |
+
local color="red"
|
| 45 |
+
[ "$status" = "WARN" ] && color="orange"
|
| 46 |
+
[ "$status" = "OK" ] && color="green"
|
| 47 |
+
|
| 48 |
+
curl -s -X POST "$webhook_url" \
|
| 49 |
+
-H "Content-Type: application/json" \
|
| 50 |
+
-d "{
|
| 51 |
+
\"msg_type\": \"interactive\",
|
| 52 |
+
\"card\": {
|
| 53 |
+
\"header\": {
|
| 54 |
+
\"title\": {\"tag\": \"plain_text\", \"content\": \"Hermes 健康检查 - $status\"},
|
| 55 |
+
\"template\": \"$color\"
|
| 56 |
+
},
|
| 57 |
+
\"elements\": [
|
| 58 |
+
{\"tag\": \"div\", \"text\": {\"tag\": \"lark_md\", \"content\": \"$message\"}}
|
| 59 |
+
]
|
| 60 |
+
}
|
| 61 |
+
}" > /dev/null 2>&1
|
| 62 |
+
}
|
| 63 |
+
|
| 64 |
+
# 主逻辑
|
| 65 |
+
main() {
|
| 66 |
+
local webhook_url="${1:-}"
|
| 67 |
+
|
| 68 |
+
# 只保留最近 100 条日志
|
| 69 |
+
if [ -f "$LOG_FILE" ] && [ "$(wc -l < "$LOG_FILE")" -gt 100 ]; then
|
| 70 |
+
tail -100 "$LOG_FILE" > "$LOG_FILE.tmp" && mv "$LOG_FILE.tmp" "$LOG_FILE"
|
| 71 |
+
fi
|
| 72 |
+
|
| 73 |
+
check_health
|
| 74 |
+
local result=$?
|
| 75 |
+
|
| 76 |
+
if [ $result -eq 2 ]; then
|
| 77 |
+
notify_feishu "$webhook_url" "FAIL" "Hermes Space 无响应,请检查 https://huggingface.co/spaces/Jackken/hermes-bot\n日志: tail -20 $LOG_FILE"
|
| 78 |
+
fi
|
| 79 |
+
}
|
| 80 |
+
|
| 81 |
+
main "$@"
|