fix:移动一些文件

This commit is contained in:
SengokuCola
2025-05-13 18:42:25 +08:00
parent fed71bccad
commit 334211cba1
5 changed files with 2 additions and 170 deletions

View File

@@ -1,170 +0,0 @@
import os
import argparse
from src.chat.focus_chat.cycle_analyzer import CycleAnalyzer
def print_section(title: str, width: int = 80):
"""打印分隔线和标题"""
print("\n" + "=" * width)
print(f" {title} ".center(width, "="))
print("=" * width)
def list_streams_cmd(analyzer: CycleAnalyzer, args: argparse.Namespace):
"""列出所有聊天流"""
print_section("所有聊天流")
streams = analyzer.list_streams()
if not streams:
print("没有找到任何聊天流记录。")
return
for i, stream_id in enumerate(streams):
count = analyzer.get_stream_cycle_count(stream_id)
print(f"[{i + 1}] {stream_id} - {count} 个循环")
def analyze_stream_cmd(analyzer: CycleAnalyzer, args: argparse.Namespace):
"""分析指定聊天流的循环信息"""
stream_id = args.stream_id
print_section(f"聊天流 {stream_id} 分析")
stats = analyzer.analyze_stream_cycles(stream_id)
if "error" in stats:
print(f"错误: {stats['error']}")
return
print("基本统计:")
print(f" 总循环数: {stats['总循环数']}")
print(f" 总耗时: {stats['总耗时']}")
print(f" 平均耗时: {stats['平均耗时']}")
print("\n动作统计:")
for action, count in stats["动作统计"].items():
if count > 0:
percent = (count / stats["总循环数"]) * 100
print(f" {action}: {count} ({percent:.1f}%)")
if stats.get("工具使用次数"):
print("\n工具使用次数:")
for tool, count in stats["工具使用次数"].items():
print(f" {tool}: {count}")
def list_cycles_cmd(analyzer: CycleAnalyzer, args: argparse.Namespace):
"""列出指定聊天流的循环"""
stream_id = args.stream_id
limit = args.limit if args.limit > 0 else -1
print_section(f"聊天流 {stream_id} 的循环列表")
cycles = analyzer.get_stream_cycles(stream_id)
if not cycles:
print("没有找到任何循环记录。")
return
if limit > 0:
cycles = cycles[-limit:] # 取最新的limit个
print(f"显示最新的 {limit} 个循环 (共 {len(cycles)} 个):")
else:
print(f"共找到 {len(cycles)} 个循环:")
for i, filepath in enumerate(cycles):
filename = os.path.basename(filepath)
cycle_id = filename.split("_")[1]
timestamp = filename.split("_", 2)[2].split(".")[0]
print(f"[{i + 1}] 循环ID: {cycle_id}, 时间: {timestamp}, 文件: {filename}")
def view_cycle_cmd(analyzer: CycleAnalyzer, args: argparse.Namespace):
"""查看指定循环的详细信息"""
stream_id = args.stream_id
cycle_index = args.cycle_index - 1 # 转换为0-based索引
cycles = analyzer.get_stream_cycles(stream_id)
if not cycles:
print(f"错误: 聊天流 {stream_id} 没有找到任何循环记录。")
return
if cycle_index < 0 or cycle_index >= len(cycles):
print(f"错误: 循环索引 {args.cycle_index} 超出范围 (1-{len(cycles)})。")
return
filepath = cycles[cycle_index]
filename = os.path.basename(filepath)
print_section(f"循环详情: {filename}")
content = analyzer.get_cycle_content(filepath)
print(content)
def latest_cycles_cmd(analyzer: CycleAnalyzer, args: argparse.Namespace):
"""查看所有聊天流中最新的几个循环"""
count = args.count if args.count > 0 else 10
print_section(f"最新的 {count} 个循环")
latest_cycles = analyzer.get_latest_cycles(count)
if not latest_cycles:
print("没有找到任何循环记录。")
return
for i, (stream_id, filepath) in enumerate(latest_cycles):
filename = os.path.basename(filepath)
cycle_id = filename.split("_")[1]
timestamp = filename.split("_", 2)[2].split(".")[0]
print(f"[{i + 1}] 聊天流: {stream_id}, 循环ID: {cycle_id}, 时间: {timestamp}")
# 可以选择性添加提取基本信息的功能
with open(filepath, "r", encoding="utf-8") as f:
for line in f:
if line.startswith("动作:"):
action = line.strip()
print(f" {action}")
break
print()
def main():
parser = argparse.ArgumentParser(description="HeartFC循环信息查看工具")
subparsers = parser.add_subparsers(dest="command", help="子命令")
# 分析聊天流
analyze_parser = subparsers.add_parser("analyze", help="分析指定聊天流的循环信息")
analyze_parser.add_argument("stream_id", help="聊天流ID")
# 列出聊天流的循环
list_cycles_parser = subparsers.add_parser("list-cycles", help="列出指定聊天流的循环")
list_cycles_parser.add_argument("stream_id", help="聊天流ID")
list_cycles_parser.add_argument("-l", "--limit", type=int, default=-1, help="显示最新的N个循环")
# 查看指定循环
view_parser = subparsers.add_parser("view", help="查看指定循环的详细信息")
view_parser.add_argument("stream_id", help="聊天流ID")
view_parser.add_argument("cycle_index", type=int, help="循环索引从1开始")
# 查看最新循环
latest_parser = subparsers.add_parser("latest", help="查看所有聊天流中最新的几个循环")
latest_parser.add_argument("-c", "--count", type=int, default=10, help="显示的数量")
args = parser.parse_args()
analyzer = CycleAnalyzer()
if args.command == "list-streams":
list_streams_cmd(analyzer, args)
elif args.command == "analyze":
analyze_stream_cmd(analyzer, args)
elif args.command == "list-cycles":
list_cycles_cmd(analyzer, args)
elif args.command == "view":
view_cycle_cmd(analyzer, args)
elif args.command == "latest":
latest_cycles_cmd(analyzer, args)
else:
parser.print_help()
if __name__ == "__main__":
main()

View File

@@ -1,159 +0,0 @@
# HeartFC_chat 工作原理文档
HeartFC_chat 是一个基于心流理论的聊天系统通过模拟人类的思维过程和情感变化来实现自然的对话交互。系统采用Plan-Replier-Sender循环机制实现了智能化的对话决策和生成。
## 核心工作流程
### 1. 消息处理与存储 (HeartFCProcessor)
[代码位置: src/plugins/focus_chat/heartflow_processor.py]
消息处理器负责接收和预处理消息,主要完成以下工作:
```mermaid
graph TD
A[接收原始消息] --> B[解析为MessageRecv对象]
B --> C[消息缓冲处理]
C --> D[过滤检查]
D --> E[存储到数据库]
```
核心实现:
- 消息处理入口:`process_message()` [行号: 38-215]
- 消息解析和缓冲:`message_buffer.start_caching_messages()` [行号: 63]
- 过滤检查:`_check_ban_words()`, `_check_ban_regex()` [行号: 196-215]
- 消息存储:`storage.store_message()` [行号: 108]
### 2. 对话管理循环 (HeartFChatting)
[代码位置: src/plugins/focus_chat/focus_chat.py]
HeartFChatting是系统的核心组件实现了完整的对话管理循环
```mermaid
graph TD
A[Plan阶段] -->|决策是否回复| B[Replier阶段]
B -->|生成回复内容| C[Sender阶段]
C -->|发送消息| D[等待新消息]
D --> A
```
#### Plan阶段 [行号: 282-386]
- 主要函数:`_planner()`
- 功能实现:
* 获取观察信息:`observation.observe()` [行号: 297]
* 思维处理:`sub_mind.do_thinking_before_reply()` [行号: 301]
* LLM决策使用`PLANNER_TOOL_DEFINITION`进行动作规划 [行号: 13-42]
#### Replier阶段 [行号: 388-416]
- 主要函数:`_replier_work()`
- 调用生成器:`gpt_instance.generate_response()` [行号: 394]
- 处理生成结果和错误情况
#### Sender阶段 [行号: 418-450]
- 主要函数:`_sender()`
- 发送实现:
* 创建消息:`_create_thinking_message()` [行号: 452-477]
* 发送回复:`_send_response_messages()` [行号: 479-525]
* 处理表情:`_handle_emoji()` [行号: 527-567]
### 3. 回复生成机制 (HeartFCGenerator)
[代码位置: src/plugins/focus_chat/heartFC_generator.py]
回复生成器负责产生高质量的回复内容:
```mermaid
graph TD
A[获取上下文信息] --> B[构建提示词]
B --> C[调用LLM生成]
C --> D[后处理优化]
D --> E[返回回复集]
```
核心实现:
- 生成入口:`generate_response()` [行号: 39-67]
* 情感调节:`arousal_multiplier = MoodManager.get_instance().get_arousal_multiplier()` [行号: 47]
* 模型生成:`_generate_response_with_model()` [行号: 69-95]
* 响应处理:`_process_response()` [行号: 97-106]
### 4. 提示词构建系统 (HeartFlowPromptBuilder)
[代码位置: src/plugins/focus_chat/heartflow_prompt_builder.py]
提示词构建器支持两种工作模式HeartFC_chat专门使用Focus模式而Normal模式是为normal_chat设计的
#### 专注模式 (Focus Mode) - HeartFC_chat专用
- 实现函数:`_build_prompt_focus()` [行号: 116-141]
- 特点:
* 专注于当前对话状态和思维
* 更强的目标导向性
* 用于HeartFC_chat的Plan-Replier-Sender循环
* 简化的上下文处理,专注于决策
#### 普通模式 (Normal Mode) - Normal_chat专用
- 实现函数:`_build_prompt_normal()` [行号: 143-215]
- 特点:
* 用于normal_chat的常规对话
* 完整的个性化处理
* 关系系统集成
* 知识库检索:`get_prompt_info()` [行号: 217-591]
HeartFC_chat的Focus模式工作流程
```mermaid
graph TD
A[获取结构化信息] --> B[获取当前思维状态]
B --> C[构建专注模式提示词]
C --> D[用于Plan阶段决策]
D --> E[用于Replier阶段生成]
```
## 智能特性
### 1. 对话决策机制
- LLM决策工具定义`PLANNER_TOOL_DEFINITION` [focus_chat.py 行号: 13-42]
- 决策执行:`_planner()` [focus_chat.py 行号: 282-386]
- 考虑因素:
* 上下文相关性
* 情感状态
* 兴趣程度
* 对话时机
### 2. 状态管理
[代码位置: src/plugins/focus_chat/focus_chat.py]
- 状态机实现:`HeartFChatting`类 [行号: 44-567]
- 核心功能:
* 初始化:`_initialize()` [行号: 89-112]
* 循环控制:`_run_pf_loop()` [行号: 192-281]
* 状态转换:`_handle_loop_completion()` [行号: 166-190]
### 3. 回复生成策略
[代码位置: src/plugins/focus_chat/heartFC_generator.py]
- 温度调节:`current_model.temperature = global_config.llm_normal["temp"] * arousal_multiplier` [行号: 48]
- 生成控制:`_generate_response_with_model()` [行号: 69-95]
- 响应处理:`_process_response()` [行号: 97-106]
## 系统配置
### 关键参数
- LLM配置`model_normal` [heartFC_generator.py 行号: 32-37]
- 过滤规则:`_check_ban_words()`, `_check_ban_regex()` [heartflow_processor.py 行号: 196-215]
- 状态控制:`INITIAL_DURATION = 60.0` [focus_chat.py 行号: 11]
### 优化建议
1. 调整LLM参数`temperature``max_tokens`
2. 优化提示词模板:`init_prompt()` [heartflow_prompt_builder.py 行号: 8-115]
3. 配置状态转换条件
4. 维护过滤规则
## 注意事项
1. 系统稳定性
- 异常处理各主要函数都包含try-except块
- 状态检查:`_processing_lock`确保并发安全
- 循环控制:`_loop_active``_loop_task`管理
2. 性能优化
- 缓存使用:`message_buffer`系统
- LLM调用优化批量处理和复用
- 异步处理:使用`asyncio`
3. 质量控制
- 日志记录:使用`get_module_logger()`
- 错误追踪:详细的异常记录
- 响应监控:完整的状态跟踪

View File

@@ -310,6 +310,7 @@ class PromptBuilder:
message_txt=None,
sender_name="某人",
in_mind_reply=None,
target_message=None,
) -> Optional[str]:
if build_mode == "normal":
return await self._build_prompt_normal(chat_stream, message_txt or "", sender_name)
@@ -322,6 +323,7 @@ class PromptBuilder:
chat_stream,
sender_name,
in_mind_reply,
target_message,
)
return None