ソースを参照

feat: 添加yangyousan123毕业设计项目

yangyousan 1 ヶ月 前
コミット
f399331d99

+ 44 - 0
Co-creation-projects/yangyousan123-CodePlanAgent/.env.example

@@ -0,0 +1,44 @@
+# HelloAgents LLM配置示例
+# 请复制此文件为 .env 并填写实际值
+
+# 模型配置
+LLM_MODEL_ID=your-model-id
+LLM_API_KEY=your-api-key
+LLM_BASE_URL=https://api.example.com/v1
+LLM_TIMEOUT=60
+
+# 可选配置
+# LLM_MAX_TOKENS=4096
+# LLM_TEMPERATURE=0.7
+
+# 以下是一些常用的LLM服务配置示例:
+
+# ============ OpenAI ============
+# LLM_MODEL_ID=gpt-4o
+# LLM_API_KEY=sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+# LLM_BASE_URL=https://api.openai.com/v1
+
+# ============ DeepSeek ============
+# LLM_MODEL_ID=deepseek-chat
+# LLM_API_KEY=sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+# LLM_BASE_URL=https://api.deepseek.com/v1
+
+# ============ Qwen (阿里云) ============
+# LLM_MODEL_ID=qwen-plus
+# LLM_API_KEY=sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+# LLM_BASE_URL=https://dashscope.aliyuncs.com/compatible-mode/v1
+
+# ============ Kimi (Moonshot) ============
+# LLM_MODEL_ID=moonshot-v1-8k
+# LLM_API_KEY=sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+# LLM_BASE_URL=https://api.moonshot.cn/v1
+
+# ============ Zhipu (智谱) ============
+# LLM_MODEL_ID=glm-4
+# LLM_API_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
+# LLM_BASE_URL=https://open.bigmodel.cn/api/paas/v4/
+
+# ============ Ollama (本地) ============
+# LLM_MODEL_ID=llama3
+# LLM_API_KEY=ollama
+# LLM_BASE_URL=http://localhost:11434/v1

+ 270 - 0
Co-creation-projects/yangyousan123-CodePlanAgent/README.md

@@ -0,0 +1,270 @@
+# CodePlanAgent
+
+> 基于HelloAgents框架的智能代码计划工具
+
+## 📝 项目简介
+
+一个基于HelloAgents框架的智能代码计划工具 CodePlanAgent ,具备Reflection反思功能。
+
+## 🕸️系统架构图
+
+```mermaid
+flowchart TD
+    subgraph 用户层[用户层]
+        User[用户需求输入]
+    end
+    
+    subgraph 核心智能体[CodePlanAgent]
+        direction TB
+        PlanGenerator[代码计划生成器\nCode Plan Generator]
+        Reflector[反思评估器\nReflection Evaluator]
+        Refiner[计划优化器\nPlan Refiner]
+        Memory[计划记忆模块\nPlanMemory]
+        
+        PlanGenerator -->|生成计划| Memory
+        Reflector -->|反思记录| Memory
+        Memory -->|读取历史| Reflector
+        Refiner -->|优化记录| Memory
+        Memory -->|读取历史| Refiner
+    end
+    
+    subgraph 反思维度[反思维度]
+        Completeness[完整性]
+        Feasibility[可行性]
+        Architecture[架构合理性]
+        Maintainability[可维护性]
+        Performance[性能考虑]
+        Security[安全性]
+        Testing[测试覆盖]
+    end
+    
+    subgraph HelloAgents框架[HelloAgents框架]
+        AgentBase[Agent基类]
+        LLM[HelloAgentsLLM]
+        Config[Config配置]
+        Message[Message消息]
+        ToolRegistry[ToolRegistry工具注册]
+    end
+    
+    subgraph 输出格式[输出格式]
+        Project[项目概述]
+        TechStack[技术栈]
+        Directory[目录结构]
+        Steps[实现步骤]
+        Design[关键设计]
+        Notes[注意事项]
+    end
+    
+    User --> PlanGenerator
+    PlanGenerator -->|调用| LLM
+    Reflector -->|调用| LLM
+    Refiner -->|调用| LLM
+    
+    Reflector --> Completeness
+    Reflector --> Feasibility
+    Reflector --> Architecture
+    Reflector --> Maintainability
+    Reflector --> Performance
+    Reflector --> Security
+    Reflector --> Testing
+    
+    PlanGenerator --> Project
+    PlanGenerator --> TechStack
+    PlanGenerator --> Directory
+    PlanGenerator --> Steps
+    PlanGenerator --> Design
+    PlanGenerator --> Notes
+    
+    CodePlanAgent -.->|继承| AgentBase
+    CodePlanAgent -->|使用| Config
+    CodePlanAgent -->|使用| Message
+    CodePlanAgent -->|可选| ToolRegistry
+    
+    style User fill:#E3F2FD,stroke:#1976D2,stroke-width:2px
+    style CodePlanAgent fill:#E8F5E9,stroke:#388E3C,stroke-width:2px
+    style HelloAgents框架 fill:#FFF3E0,stroke:#F57C00,stroke-width:2px
+    style 反思维度 fill:#FCE4EC,stroke:#C2185B,stroke-width:2px
+    style 输出格式 fill:#F3E5F5,stroke:#7B1FA2,stroke-width:2px
+```
+
+### 核心组件
+
+1. **CodePlanAgent** - 核心智能体,负责代码计划的生成、反思和优化
+2. **PlanGenerator** - 根据用户需求生成结构化的代码实现计划
+3. **Reflector** - 对生成的计划进行多维度评估
+4. **Refiner** - 根据反思反馈优化代码计划
+5. **PlanMemory** - 存储计划生成轨迹和反思记录
+
+### 工作流程
+
+1. 用户输入需求描述
+2. PlanGenerator生成初始代码计划
+3. Reflector对计划进行反思评估
+4. 如果需要改进,Refiner优化计划
+5. 重复步骤3-4,直到计划无需改进
+6. 输出最终代码计划
+
+## 🛠️ 技术栈
+
+- HelloAgents框架
+
+## 📖 创建的文件
+### 1. code_plan_agent.py - 核心实现
+核心功能:
+
+- 代码计划生成 :根据需求描述生成结构化的代码实现计划
+- 自我反思 :对生成的代码计划进行多维度质量评估
+- 迭代优化 :根据反思结果自动优化代码计划
+- 支持工具调用 :可选集成工具调用能力
+- 流式执行 :支持异步流式输出
+
+反思维度:
+
+- 完整性:计划是否覆盖所有核心需求
+- 可行性:技术方案是否可行
+- 架构合理性:模块划分是否合理
+- 可维护性:代码结构是否清晰
+- 性能考虑:是否存在性能优化空间
+- 安全性:是否存在安全风险
+- 测试覆盖:是否考虑了测试策略
+
+输出格式:
+
+```
+## 项目概述
+[项目目标和核心功能]
+
+## 技术栈
+- 语言、框架、数据库等
+
+## 目录结构
+[项目目录结构]
+
+## 实现步骤
+1. [步骤描述]
+   - 实现要点
+   - 文件路径
+   - 预期输出
+...
+
+## 关键设计
+## 注意事项
+```
+
+### 2. demo.py - 使用示例
+演示如何使用CodePlanAgent生成代码计划,包含两个示例:
+
+- 创建待办事项应用
+- 创建用户认证系统
+### 3. .env.example - 环境配置示例
+包含常用LLM服务的配置模板(OpenAI、DeepSeek、Qwen、Kimi、Zhipu、Ollama)
+
+## 🗄️ 使用方法
+```python
+from hello_agents.core.llm import HelloAgentsLLM
+from code_plan_agent import create_code_plan_agent
+
+# 初始化LLM
+llm = HelloAgentsLLM(
+    model="your-model",
+    api_key="your-api-key",
+    base_url="https://api.example.com/v1"
+)
+
+# 创建CodePlanAgent
+agent = create_code_plan_agent(llm)
+
+# 生成代码计划
+requirements = """创建一个待办事项应用..."""
+plan = agent.run(requirements)
+
+print(plan)
+```
+## 📚 配置步骤
+1. 安装依赖
+
+   ```
+   pip install -r requirements.txt
+   ```
+
+2. 复制 .env.example 为 .env
+
+3. 配置LLM环境变量
+
+4. 运行 demo.py 查看效果
+
+## 🎯 项目亮点
+
+- 智能生成结构化代码计划,支持自然语言需求
+- Reflection机制7维度质量评估,迭代优化闭环
+- 基于HelloAgents框架,支持流式输出与计划追溯
+- 输出含技术栈、目录、步骤,可执行性强
+
+## 📂 项目结构
+
+```powershell
+│  .env.example
+│  code_plan_agent.py
+│  demo.py
+│  README.md
+│  requirements.txt
+│
+├─memory
+│  └─traces
+│          trace-s-20260604-154913-a988.html
+│          trace-s-20260604-154913-a988.jsonl
+│
+└─outputs
+       todo_app_plan.md
+```
+
+## 📊 示例输出
+
+```
+## 项目概述
+本项目旨在构建一个**高内聚、低耦合**的 Python Flask 待办事项(Todo)管理 API。基于评审反馈,我们修正了架构描述与实际目录的一致性,...
+
+## 技术栈
+- 语言:Python 3.9+
+- 框架:Flask (Web 框架)
+- 数据库:SQLite (开发/测试), PostgreSQL (生产推荐)
+- ...
+
+## 目录结构
+(略)
+
+## 实现步骤
+1. **项目初始化与安全配置**
+   - 实现要点:创建虚拟环境;安装依赖...
+   - 文件路径:`requirements.txt`, `config.py`, `.env.example`
+   - 预期输出:基础工程结构搭建完成,启动时自动加载安全配置,...
+
+2. ...
+
+## 关键设计
+- **架构一致性 (Controller-Service-Model)**:修正了原计划中提及“Repository”但无对应目录的问题。Service 层直接封装 ORM 操作,...
+
+## 注意事项
+- **架构复杂度权衡**:本计划采用了企业级实践(Pydantic, Alembic, 分层),对于“简单 Todo"需求属于适度超前。若项目周期极短,...
+```
+
+## 🚧 未来改进
+
+- [ ] 增强反思深度
+- [ ] 支持多格式输出
+- [ ] 集成代码生成
+- [ ] 优化性能
+- [ ] 增加团队协作能力
+
+## 👤 作者
+
+- GitHub: [@yangyousan123](https://github.com/yangyousan123)
+- 项目链接:[CodePlanAgent](https://github.com/datawhalechina/Hello-Agents/tree/main/Co-creation-projects/yangyousan123-CodePlanAgent)
+
+## 🙏 致谢
+
+感谢Datawhale社区和Hello-Agents项目!
+
+## 📄 许可证
+
+本项目采用MIT许可证。

+ 637 - 0
Co-creation-projects/yangyousan123-CodePlanAgent/code_plan_agent.py

@@ -0,0 +1,637 @@
+"""Code Plan Agent - 智能代码计划工具,具备Reflection反思功能"""
+
+import json
+from typing import Optional, List, Dict, Any, AsyncGenerator
+from datetime import datetime
+
+from hello_agents.core.agent import Agent
+from hello_agents.core.llm import HelloAgentsLLM
+from hello_agents.core.config import Config
+from hello_agents.core.message import Message
+from hello_agents.core.streaming import StreamEvent, StreamEventType
+from hello_agents.core.lifecycle import LifecycleHook
+from hello_agents.tools.registry import ToolRegistry
+
+
+class PlanMemory:
+    """
+    计划记忆模块,用于存储代码计划的生成轨迹和反思记录
+    """
+    def __init__(self):
+        self.records: List[Dict[str, Any]] = []
+
+    def add_record(self, record_type: str, content: str, metadata: Optional[Dict] = None):
+        """向记忆中添加一条新记录"""
+        self.records.append({
+            "type": record_type,
+            "content": content,
+            "metadata": metadata or {},
+            "timestamp": datetime.now().isoformat()
+        })
+
+    def get_trajectory(self) -> str:
+        """将所有记忆记录格式化为一个连贯的字符串文本"""
+        trajectory = ""
+        for record in self.records:
+            if record['type'] == 'plan':
+                trajectory += f"--- 代码计划 ---\n{record['content']}\n\n"
+            elif record['type'] == 'reflection':
+                trajectory += f"--- 反思反馈 ---\n{record['content']}\n\n"
+            elif record['type'] == 'revision':
+                trajectory += f"--- 优化后计划 ---\n{record['content']}\n\n"
+        return trajectory.strip()
+
+    def get_last_plan(self) -> str:
+        """获取最近一次的代码计划"""
+        for record in reversed(self.records):
+            if record['type'] in ['plan', 'revision']:
+                return record['content']
+        return ""
+
+    def get_last_reflection(self) -> str:
+        """获取最近一次的反思反馈"""
+        for record in reversed(self.records):
+            if record['type'] == 'reflection':
+                return record['content']
+        return ""
+
+
+class CodePlanAgent(Agent):
+    """
+    Code Plan Agent - 智能代码计划工具,具备Reflection反思功能
+
+    核心能力:
+    1. 代码计划生成:根据需求描述生成结构化的代码实现计划
+    2. 自我反思:对生成的代码计划进行质量评估和改进建议
+    3. 迭代优化:根据反思结果优化代码计划
+    4. 支持工具调用(可选)
+
+    输出格式:
+    - 代码计划采用结构化格式,包含多个步骤
+    - 每个步骤包含:步骤编号、任务描述、实现要点、预期输出
+
+    反思维度:
+    - 完整性:计划是否覆盖所有需求
+    - 可行性:技术方案是否可行
+    - 效率:是否存在性能优化空间
+    - 可维护性:代码结构是否清晰
+    - 安全性:是否存在安全风险
+    """
+
+    def __init__(
+        self,
+        name: str,
+        llm: HelloAgentsLLM,
+        system_prompt: Optional[str] = None,
+        config: Optional[Config] = None,
+        max_reflection_iterations: int = 2,
+        tool_registry: Optional['ToolRegistry'] = None,
+        enable_tool_calling: bool = True,
+        max_tool_iterations: int = 3
+    ):
+        """
+        初始化CodePlanAgent
+
+        Args:
+            name: Agent名称
+            llm: LLM实例
+            system_prompt: 系统提示词(定义角色和行为)
+            config: 配置对象
+            max_reflection_iterations: 最大反思迭代次数
+            tool_registry: 工具注册表(可选)
+            enable_tool_calling: 是否启用工具调用
+            max_tool_iterations: 最大工具调用迭代次数
+        """
+        # 默认 system_prompt - 代码规划专家
+        default_system_prompt = """你是一位资深的软件架构师和代码规划专家。
+你擅长将业务需求转化为清晰、可行的代码实现计划。
+
+## 核心职责
+1. 分析需求并生成结构化的代码实现计划
+2. 确保计划覆盖所有核心功能和边界情况
+3. 设计合理的模块划分和接口定义
+4. 考虑代码的可维护性、扩展性和性能
+
+## 输出格式要求
+请按照以下结构化格式输出代码计划:
+
+```code_plan
+## 项目概述
+[简要描述项目目标和核心功能]
+
+## 技术栈
+- 语言:[编程语言]
+- 框架:[主要框架]
+- 数据库:[数据库类型]
+- 其他:[关键依赖]
+
+## 目录结构
+```
+[项目目录结构]
+```
+
+## 实现步骤
+1. [步骤1描述]
+   - 实现要点:[关键实现细节]
+   - 文件路径:[涉及文件]
+   - 预期输出:[预期结果]
+
+2. [步骤2描述]
+   - 实现要点:[关键实现细节]
+   - 文件路径:[涉及文件]
+   - 预期输出:[预期结果]
+
+...
+
+## 关键设计
+- [设计决策1]:[说明原因]
+- [设计决策2]:[说明原因]
+
+## 注意事项
+- [注意事项1]
+- [注意事项2]
+```
+
+请确保计划详细、清晰、可执行。"""
+
+        super().__init__(
+            name,
+            llm,
+            system_prompt or default_system_prompt,
+            config,
+            tool_registry=tool_registry
+        )
+
+        self.max_reflection_iterations = max_reflection_iterations
+        self.memory = PlanMemory()
+        self.enable_tool_calling = enable_tool_calling
+        self.max_tool_iterations = max_tool_iterations
+
+    def run(self, input_text: str, **kwargs) -> str:
+        """
+        运行CodePlanAgent
+
+        Args:
+            input_text: 需求描述
+            **kwargs: 其他参数(temperature, max_tokens等)
+
+        Returns:
+            最终优化后的代码计划
+        """
+        print(f"\n🤖 {self.name} 开始处理代码规划任务: {input_text[:50]}...")
+
+        # 重置记忆
+        self.memory = PlanMemory()
+
+        # 1. 生成初始代码计划
+        print("\n--- 阶段1: 生成初始代码计划 ---")
+        initial_plan = self._generate_code_plan(input_text, **kwargs)
+        self.memory.add_record("plan", initial_plan, {"phase": "initial"})
+
+        print(f"\n✅ 初始计划已生成:\n{initial_plan}")
+
+        # 2. 迭代反思与优化
+        for i in range(self.max_reflection_iterations):
+            print(f"\n--- 阶段2: 第 {i+1}/{self.max_reflection_iterations} 轮反思优化 ---")
+
+            # a. 反思当前计划
+            print("\n-> 正在进行计划反思...")
+            last_plan = self.memory.get_last_plan()
+            reflection = self._reflect_on_plan(input_text, last_plan, **kwargs)
+            self.memory.add_record("reflection", reflection, {"iteration": i + 1})
+
+            print(f"\n💡 反思结果:\n{reflection}")
+
+            # b. 检查是否需要停止
+            if "无需改进" in reflection or "no need for improvement" in reflection.lower():
+                print("\n✅ 反思认为计划已无需改进,任务完成。")
+                break
+
+            # c. 优化计划
+            print("\n-> 正在优化代码计划...")
+            refined_plan = self._refine_plan(input_text, last_plan, reflection, **kwargs)
+            self.memory.add_record("revision", refined_plan, {"iteration": i + 1})
+
+            print(f"\n🔄 优化后的计划:\n{refined_plan}")
+
+        final_plan = self.memory.get_last_plan()
+        print(f"\n--- 🎉 任务完成 ---\n最终代码计划:\n{final_plan}")
+
+        # 保存到历史记录
+        self.add_message(Message(input_text, "user"))
+        self.add_message(Message(final_plan, "assistant"))
+
+        return final_plan
+
+    def _generate_code_plan(self, requirements: str, **kwargs) -> str:
+        """
+        生成初始代码计划
+
+        Args:
+            requirements: 需求描述
+            **kwargs: LLM调用参数
+
+        Returns:
+            代码计划文本
+        """
+        messages = [
+            {"role": "system", "content": self.system_prompt},
+            {"role": "user", "content": f"""请根据以下需求描述,生成一份详细的代码实现计划:
+
+## 需求描述
+{requirements}
+
+请按照指定的格式输出代码计划。"""}
+        ]
+
+        return self._get_llm_response(messages, **kwargs)
+
+    def _reflect_on_plan(self, requirements: str, plan: str, **kwargs) -> str:
+        """
+        对代码计划进行反思评估
+
+        Args:
+            requirements: 原始需求
+            plan: 当前代码计划
+            **kwargs: LLM调用参数
+
+        Returns:
+            反思反馈文本
+        """
+        reflection_prompt = f"""你是一位资深的技术评审专家。请对以下代码计划进行全面评估:
+
+## 原始需求
+{requirements}
+
+## 当前代码计划
+{plan}
+
+## 评审维度
+请从以下维度进行评估:
+
+1. **完整性**:计划是否覆盖了所有核心需求?是否有遗漏的功能?
+2. **可行性**:技术方案是否可行?是否存在技术风险?
+3. **架构合理性**:模块划分是否合理?接口设计是否清晰?
+4. **可维护性**:代码结构是否清晰?是否遵循最佳实践?
+5. **性能考虑**:是否考虑了性能优化?是否存在潜在的性能瓶颈?
+6. **安全性**:是否存在安全风险?是否需要添加安全措施?
+7. **测试覆盖**:是否考虑了测试策略?关键路径是否有测试覆盖?
+
+## 输出要求
+请给出具体的改进建议。如果计划已经很好,请回答"无需改进"。"""
+
+        messages = [
+            {"role": "system", "content": "你是一位严格的技术评审专家,擅长发现代码计划中的潜在问题并提出改进建议。"},
+            {"role": "user", "content": reflection_prompt}
+        ]
+
+        return self._get_llm_response(messages, **kwargs)
+
+    def _refine_plan(self, requirements: str, current_plan: str, feedback: str, **kwargs) -> str:
+        """
+        根据反馈优化代码计划
+
+        Args:
+            requirements: 原始需求
+            current_plan: 当前代码计划
+            feedback: 反思反馈
+            **kwargs: LLM调用参数
+
+        Returns:
+            优化后的代码计划
+        """
+        refinement_prompt = f"""请根据评审反馈优化以下代码计划:
+
+## 原始需求
+{requirements}
+
+## 当前代码计划
+{current_plan}
+
+## 评审反馈
+{feedback}
+
+## 优化要求
+请根据反馈意见对代码计划进行修改和完善,确保:
+1. 解决反馈中指出的所有问题
+2. 保持计划的结构化格式
+3. 提供具体的改进方案
+
+请输出优化后的完整代码计划。"""
+
+        messages = [
+            {"role": "system", "content": self.system_prompt},
+            {"role": "user", "content": refinement_prompt}
+        ]
+
+        return self._get_llm_response(messages, **kwargs)
+
+    def _get_llm_response(self, messages: List[Dict[str, str]], **kwargs) -> str:
+        """
+        调用LLM并获取完整响应(支持 Function Calling)
+
+        Args:
+            messages: 消息列表
+            **kwargs: 其他参数
+
+        Returns:
+            LLM响应文本
+        """
+        # 如果没有启用工具调用,直接返回
+        if not self.enable_tool_calling or not self.tool_registry:
+            llm_response = self.llm.invoke(messages, **kwargs)
+            return llm_response.content if hasattr(llm_response, 'content') else str(llm_response)
+
+        # 启用工具调用模式
+        tool_schemas = self._build_tool_schemas()
+        current_iteration = 0
+
+        while current_iteration < self.max_tool_iterations:
+            current_iteration += 1
+
+            try:
+                response = self.llm.invoke_with_tools(
+                    messages=messages,
+                    tools=tool_schemas,
+                    tool_choice="auto",
+                    **kwargs
+                )
+            except Exception as e:
+                print(f"❌ LLM 调用失败: {e}")
+                break
+
+            response_message = response.choices[0].message
+
+            # 处理工具调用
+            tool_calls = response_message.tool_calls
+            if not tool_calls:
+                # 没有工具调用,返回文本响应
+                return response_message.content or ""
+
+            # 将助手消息添加到历史
+            messages.append({
+                "role": "assistant",
+                "content": response_message.content,
+                "tool_calls": [
+                    {
+                        "id": tc.id,
+                        "type": "function",
+                        "function": {
+                            "name": tc.function.name,
+                            "arguments": tc.function.arguments
+                        }
+                    }
+                    for tc in tool_calls
+                ]
+            })
+
+            # 执行所有工具调用
+            for tool_call in tool_calls:
+                tool_name = tool_call.function.name
+                tool_call_id = tool_call.id
+
+                try:
+                    arguments = json.loads(tool_call.function.arguments)
+                except json.JSONDecodeError as e:
+                    print(f"❌ 工具参数解析失败: {e}")
+                    messages.append({
+                        "role": "tool",
+                        "tool_call_id": tool_call_id,
+                        "content": f"错误:参数格式不正确 - {str(e)}"
+                    })
+                    continue
+
+                # 执行工具(复用基类方法)
+                result = self._execute_tool_call(tool_name, arguments)
+
+                # 添加工具结果到消息
+                messages.append({
+                    "role": "tool",
+                    "tool_call_id": tool_call_id,
+                    "content": result
+                })
+
+        # 如果超过最大迭代次数,获取最后一次回答
+        if current_iteration >= self.max_tool_iterations:
+            llm_response = self.llm.invoke(messages, **kwargs)
+            return llm_response.content if hasattr(llm_response, 'content') else str(llm_response)
+
+        return ""
+
+    async def arun_stream(
+        self,
+        input_text: str,
+        on_start: LifecycleHook = None,
+        on_finish: LifecycleHook = None,
+        on_error: LifecycleHook = None,
+        **kwargs
+    ) -> AsyncGenerator[StreamEvent, None]:
+        """
+        CodePlanAgent 流式执行
+
+        实时返回:
+        - 计划生成阶段的输出
+        - 反思阶段的思考过程
+        - 优化阶段的输出
+
+        Args:
+            input_text: 用户输入
+            on_start: 开始钩子
+            on_finish: 完成钩子
+            on_error: 错误钩子
+            **kwargs: 其他参数
+
+        Yields:
+            StreamEvent: 流式事件
+        """
+        # 发送开始事件
+        yield StreamEvent.create(
+            StreamEventType.AGENT_START,
+            self.name,
+            input_text=input_text
+        )
+
+        try:
+            # 阶段 1:生成代码计划
+            yield StreamEvent.create(
+                StreamEventType.STEP_START,
+                self.name,
+                phase="plan_generation",
+                description="生成初始代码计划"
+            )
+
+            messages = []
+            if self.system_prompt:
+                messages.append({"role": "system", "content": self.system_prompt})
+
+            plan_prompt = f"""请根据以下需求描述,生成一份详细的代码实现计划:
+
+## 需求描述
+{input_text}
+
+请按照指定的格式输出代码计划。"""
+
+            messages.append({"role": "user", "content": plan_prompt})
+
+            initial_plan = ""
+            async for chunk in self.llm.astream_invoke(messages, **kwargs):
+                initial_plan += chunk
+                yield StreamEvent.create(
+                    StreamEventType.LLM_CHUNK,
+                    self.name,
+                    chunk=chunk,
+                    phase="plan_generation"
+                )
+
+            yield StreamEvent.create(
+                StreamEventType.STEP_FINISH,
+                self.name,
+                phase="plan_generation",
+                result=initial_plan
+            )
+
+            # 阶段 2:反思与优化循环
+            current_plan = initial_plan
+
+            for iteration in range(self.max_reflection_iterations):
+                # 反思阶段
+                yield StreamEvent.create(
+                    StreamEventType.STEP_START,
+                    self.name,
+                    phase="reflection",
+                    iteration=iteration + 1,
+                    description=f"第 {iteration + 1} 次反思"
+                )
+
+                reflection_prompt = f"""你是一位资深的技术评审专家。请对以下代码计划进行全面评估:
+
+## 原始需求
+{input_text}
+
+## 当前代码计划
+{current_plan}
+
+## 评审维度
+请从以下维度进行评估:
+1. 完整性:计划是否覆盖了所有核心需求?
+2. 可行性:技术方案是否可行?
+3. 架构合理性:模块划分是否合理?
+4. 可维护性:代码结构是否清晰?
+5. 性能考虑:是否考虑了性能优化?
+6. 安全性:是否存在安全风险?
+7. 测试覆盖:是否考虑了测试策略?
+
+请给出具体的改进建议。如果计划已经很好,请回答"无需改进"。"""
+
+                reflection_messages = [{"role": "user", "content": reflection_prompt}]
+
+                reflection = ""
+                async for chunk in self.llm.astream_invoke(reflection_messages, **kwargs):
+                    reflection += chunk
+                    yield StreamEvent.create(
+                        StreamEventType.THINKING,
+                        self.name,
+                        chunk=chunk,
+                        phase="reflection",
+                        iteration=iteration + 1
+                    )
+
+                yield StreamEvent.create(
+                    StreamEventType.STEP_FINISH,
+                    self.name,
+                    phase="reflection",
+                    iteration=iteration + 1,
+                    reflection=reflection
+                )
+
+                # 检查是否需要停止
+                if "无需改进" in reflection or "no need for improvement" in reflection.lower():
+                    break
+
+                # 优化阶段
+                yield StreamEvent.create(
+                    StreamEventType.STEP_START,
+                    self.name,
+                    phase="refinement",
+                    iteration=iteration + 1,
+                    description=f"第 {iteration + 1} 次优化"
+                )
+
+                refinement_prompt = f"""请根据评审反馈优化以下代码计划:
+
+## 原始需求
+{input_text}
+
+## 当前代码计划
+{current_plan}
+
+## 评审反馈
+{reflection}
+
+请输出优化后的完整代码计划。"""
+
+                refinement_messages = [{"role": "user", "content": refinement_prompt}]
+
+                refined_plan = ""
+                async for chunk in self.llm.astream_invoke(refinement_messages, **kwargs):
+                    refined_plan += chunk
+                    yield StreamEvent.create(
+                        StreamEventType.LLM_CHUNK,
+                        self.name,
+                        chunk=chunk,
+                        phase="refinement",
+                        iteration=iteration + 1
+                    )
+
+                yield StreamEvent.create(
+                    StreamEventType.STEP_FINISH,
+                    self.name,
+                    phase="refinement",
+                    iteration=iteration + 1,
+                    result=refined_plan
+                )
+
+                current_plan = refined_plan
+
+            # 发送完成事件
+            yield StreamEvent.create(
+                StreamEventType.AGENT_FINISH,
+                self.name,
+                result=current_plan,
+                total_iterations=self.max_reflection_iterations
+            )
+
+            # 保存到历史
+            self.add_message(Message(input_text, "user"))
+            self.add_message(Message(current_plan, "assistant"))
+
+        except Exception as e:
+            # 发送错误事件
+            yield StreamEvent.create(
+                StreamEventType.ERROR,
+                self.name,
+                error=str(e),
+                error_type=type(e).__name__
+            )
+            raise
+
+    def get_plan_trajectory(self) -> str:
+        """获取完整的计划生成轨迹"""
+        return self.memory.get_trajectory()
+
+
+def create_code_plan_agent(llm: HelloAgentsLLM) -> CodePlanAgent:
+    """
+    创建CodePlanAgent实例的便捷工厂函数
+
+    Args:
+        llm: LLM实例
+
+    Returns:
+        CodePlanAgent实例
+    """
+    return CodePlanAgent(
+        name="CodePlanAgent",
+        llm=llm,
+        max_reflection_iterations=2
+    )

+ 118 - 0
Co-creation-projects/yangyousan123-CodePlanAgent/demo.py

@@ -0,0 +1,118 @@
+"""CodePlanAgent 使用示例"""
+
+import os
+from dotenv import load_dotenv
+from hello_agents.core.llm import HelloAgentsLLM
+from code_plan_agent import CodePlanAgent, create_code_plan_agent
+
+
+def load_env():
+    """加载环境变量"""
+    load_dotenv()
+    
+    # 检查必要的环境变量
+    required_vars = ["LLM_MODEL_ID", "LLM_API_KEY", "LLM_BASE_URL"]
+    missing_vars = [var for var in required_vars if not os.getenv(var)]
+    
+    if missing_vars:
+        print(f"❌ 缺少必要的环境变量: {', '.join(missing_vars)}")
+        print("请在 .env 文件中配置这些变量")
+        return False
+    
+    return True
+
+
+def main():
+    """主函数 - 演示CodePlanAgent的使用"""
+    print("🚀 CodePlanAgent 演示程序")
+    print("=" * 60)
+    
+    # 加载环境变量
+    if not load_env():
+        return
+    
+    # 初始化LLM
+    print("\n🔧 初始化LLM客户端...")
+    llm = HelloAgentsLLM(
+        model=os.getenv("LLM_MODEL_ID"),
+        api_key=os.getenv("LLM_API_KEY"),
+        base_url=os.getenv("LLM_BASE_URL"),
+        temperature=0.2,  # 较低温度,生成更确定性的计划
+        max_tokens=4096
+    )
+    
+    print(f"✅ LLM客户端已初始化: {llm.model}")
+    
+    # 创建CodePlanAgent
+    print("\n🧠 创建CodePlanAgent...")
+    agent = create_code_plan_agent(llm)
+    print(f"✅ CodePlanAgent创建成功: {agent.name}")
+    
+    # 示例需求1:创建待办事项应用
+    print("\n" + "=" * 60)
+    print("📝 示例1: 创建待办事项应用")
+    print("=" * 60)
+    
+    requirements1 = """创建一个简单的待办事项(Todo)应用,使用Python和Flask框架实现:
+
+功能需求:
+1. 添加待办事项(标题、描述、截止日期)
+2. 删除待办事项
+3. 标记待办事项为已完成/未完成
+4. 按状态筛选待办事项(全部/已完成/未完成)
+5. 数据持久化存储(使用SQLite)
+
+技术要求:
+- 使用Flask框架
+- 使用SQLAlchemy ORM
+- 提供RESTful API接口
+- 支持JSON格式数据
+- 包含基本的错误处理"""
+    
+    # 生成代码计划
+    plan1 = agent.run(requirements1)
+    
+    # 保存结果到文件
+    with open("./outputs/todo_app_plan.md", "w", encoding="utf-8") as f:
+        f.write(plan1)
+    print("\n📄 代码计划已保存到: ./outputs/todo_app_plan.md")
+    
+    # # 示例需求2:创建用户认证系统
+    # print("\n" + "=" * 60)
+    # print("🔐 示例2: 创建用户认证系统")
+    # print("=" * 60)
+    
+#     requirements2 = """创建一个用户认证系统,包含以下功能:
+
+# 核心功能:
+# 1. 用户注册(用户名、邮箱、密码)
+# 2. 用户登录(邮箱/用户名 + 密码)
+# 3. 密码重置(通过邮箱)
+# 4. JWT token认证
+# 5. 权限管理(角色:普通用户、管理员)
+
+# 技术要求:
+# - 使用Python FastAPI框架
+# - 使用PostgreSQL数据库
+# - 密码加密存储(bcrypt)
+# - JWT token过期处理
+# - 实现API安全措施(限流、CSRF防护)"""
+    
+#     # 生成代码计划
+#     plan2 = agent.run(requirements2)
+    
+#     # 保存结果到文件
+#     with open("./outputs/auth_system_plan.md", "w", encoding="utf-8") as f:
+#         f.write(plan2)
+#     print("\n📄 代码计划已保存到: ./outputs/auth_system_plan.md")
+    
+    print("\n🎉 演示完成!")
+    # print("=" * 60)
+    # print("已生成的代码计划文件:")
+    # print("- ./outputs/todo_app_plan.md")
+    # print("- ./outputs/auth_system_plan.md")
+
+
+if __name__ == "__main__":
+    main()
+    

+ 108 - 0
Co-creation-projects/yangyousan123-CodePlanAgent/outputs/todo_app_plan.md

@@ -0,0 +1,108 @@
+```code_plan
+## 项目概述
+本项目旨在构建一个**高内聚、低耦合**的 Python Flask 待办事项(Todo)管理 API。基于评审反馈,我们修正了架构描述与实际目录的一致性,移除了未实现的“Repository”术语,明确采用 **Controller-Service-Model** 分层架构。核心目标在满足 CRUD 功能的基础上,强化安全性(HTTP 安全头、速率限制)、标准化错误响应格式,并优化测试环境配置以解决内存数据库与迁移工具的兼容性问题。系统支持多环境配置,确保从开发到生产的平滑过渡。
+
+## 技术栈
+- 语言:Python 3.9+
+- 框架:Flask (Web 框架)
+- 数据库:SQLite (开发/测试), PostgreSQL (生产推荐)
+- ORM:SQLAlchemy 2.0+
+- 迁移工具:Alembic (仅用于生产环境持久化版本控制,测试环境使用 db.create_all)
+- 数据校验:Pydantic V2 (请求/响应模型分离)
+- 安全与跨域:Flask-CORS, Flask-Talisman (安全头), Flask-Limiter (速率限制)
+- 日志系统:Python Standard `logging` (含敏感字段脱敏)
+- 测试框架:Pytest + Flask Test Client
+- 其他:python-dotenv (环境变量加载)
+
+## 目录结构
+```
+todo_api/
+├── alembic/                 # Alembic 迁移脚本目录 (生产环境使用)
+│   ├── versions/
+│   └── env.py
+├── app/
+│   ├── __init__.py          # 应用工厂、日志配置、CORS/Talisman/Limiter 初始化
+│   ├── config.py            # 配置类 (读取环境变量,区分 DEBUG/PRODUCTION)
+│   ├── models.py            # SQLAlchemy 数据库模型 (含索引)
+│   ├── schemas.py           # Pydantic 请求/响应模型 (严格分离 Input/Output)
+│   ├── services/            # 业务逻辑层 (直接操作 ORM Session)
+│   │   ├── __init__.py
+│   │   └── todo_service.py  # Todo 核心业务逻辑
+│   ├── routes/              # 路由层 (参数解析、权限检查、响应包装)
+│   │   ├── __init__.py
+│   │   └── todos.py         # Todo API 接口
+│   ├── utils/               # 工具函数
+│   │   ├── __init__.py
+│   │   └── exceptions.py    # 自定义异常定义及统一错误响应格式化
+│   └── extensions.py        # 扩展实例 (db, migrate, cors, limiter, talisman)
+├── tests/                   # 测试目录
+│   ├── conftest.py          # 测试夹具 (Fixture),配置内存数据库 (不使用 Alembic)
+│   └── test_todos.py        # 集成测试用例 (覆盖边界与并发)
+├── .env                     # 本地环境变量 (不提交 Git)
+├── .env.example             # 环境变量模板
+├── requirements.txt         # 依赖列表
+├── run.py                   # 程序入口
+└── README.md                # 项目文档
+```
+
+## 实现步骤
+1. **项目初始化与安全配置**
+   - 实现要点:创建虚拟环境;安装依赖(含 `flask-limiter`, `flask-talisman`);编写 `.env.example`。在 `config.py` 中增加 `DEBUG` 开关,生产环境强制关闭 Debug 模式。
+   - 文件路径:`requirements.txt`, `config.py`, `.env.example`
+   - 预期输出:基础工程结构搭建完成,启动时自动加载安全配置,无硬编码敏感信息。
+
+2. **数据库设计与迁移策略**
+   - 实现要点:定义 `Todo` 模型,为 `completed`, `created_at`, `due_date` 添加 `index=True`。初始化 Alembic。**注意**:仅在 `production` 模式下运行 Alembic 迁移,测试环境将跳过此步。
+   - 文件路径:`app/models.py`, `alembic/versions/`
+   - 预期输出:数据库表结构已建立,具备自动迁移能力,查询性能得到优化。
+
+3. **数据校验模型构建 (Pydantic)**
+   - 实现要点:在 `schemas.py` 中严格区分 `CreateTodoSchema` (输入) 和 `TodoResponseSchema` (输出)。设置字段长度限制(如 title max 255 chars),防止注入攻击。
+   - 文件路径:`app/schemas.py`
+   - 预期输出:非法输入(如类型错误、超长字符串)在到达路由前被拦截,返回标准 422 错误。
+
+4. **业务逻辑层开发 (Service Layer)**
+   - 实现要点:将核心逻辑剥离至 `app/services/todo_service.py`。服务层接收 DTO 对象,操作模型,返回纯数据或抛出业务异常。Service 层直接管理 SQLAlchemy Session,无需引入 Repository 层以减少复杂度。
+   - 文件路径:`app/services/todo_service.py`
+   - 预期输出:路由层保持简洁,业务逻辑可独立复用和测试。
+
+5. **API 路由开发与筛选逻辑细化**
+   - 实现要点:
+     - 启用 CORS 及安全头 (Talisman)。
+     - **状态筛选**:解析 `GET /todos?status={all|completed|incomplete}` 参数,映射为 SQLAlchemy `filter` 条件。
+     - 实施速率限制:对 `/todos` 接口添加 `@limiter.limit("100 per minute")`。
+     - 遵循 HTTP 状态码:GET(200), POST(201), PUT(200), DELETE(204), 错误 (4xx/5xx)。
+   - 文件路径:`app/routes/todos.py`, `app/__init__.py`
+   - 预期输出:符合 RESTful 标准的接口,前端可直接根据状态码处理逻辑,且具备防刷机制。
+
+6. **全局异常处理、日志与统一响应**
+   - 实现要点:
+     - 定义自定义异常类(`ValidationError`, `ResourceNotFoundException`)。
+     - **统一错误格式**:所有异常捕获后返回 `{"error": {"code": "ERR_CODE", "message": "Human readable msg"}}`。
+     - **日志脱敏**:配置 `logging` 模块,禁止记录包含密码、Token 等敏感字段的日志内容。
+     - 生产环境隐藏堆栈细节。
+   - 文件路径:`app/utils/exceptions.py`, `app/__init__.py`
+   - 预期输出:系统运行稳定,关键操作有日志记录,线上错误信息不泄露敏感数据,前端可解析统一错误结构。
+
+7. **测试体系构建与环境隔离**
+   - 实现要点:
+     - **测试 DB 策略**:在 `conftest.py` 中使用 `sqlite:///:memory:`,调用 `db.create_all()` 创建表结构,**避免运行 Alembic 迁移脚本**。
+     - 编写集成测试覆盖 CRUD、分页、**状态筛选**、边界情况(空标题、未来日期)。
+     - 确保测试结束后清理临时数据(事务回滚或清空表)。
+   - 文件路径:`tests/conftest.py`, `tests/test_todos.py`
+   - 预期输出:自动化测试通过,CI/CD 流程可集成,保证重构不影响现有功能。
+
+## 关键设计
+- **架构一致性 (Controller-Service-Model)**:修正了原计划中提及“Repository”但无对应目录的问题。Service 层直接封装 ORM 操作,既保证了业务逻辑清晰,又避免了过度设计带来的维护成本。
+- **防御性安全设计**:集成 `Flask-Talisman` 强制设置 CSP、HSTS 等安全头;使用 `Flask-Limiter` 防止 API 滥用;统一错误响应格式,避免前端因解析不一致导致崩溃。
+- **测试环境解耦**:针对 SQLite 内存数据库无法运行 Alembic 的痛点,测试环境采用 `db.create_all()` 直接建表,生产环境保留 Alembic 迁移,兼顾了开发效率与部署规范。
+- **输入输出严格分离**:Pydantic 模型明确区分 Request 和 Response,防止内部模型字段意外暴露给客户端,提升数据安全性。
+
+## 注意事项
+- **架构复杂度权衡**:本计划采用了企业级实践(Pydantic, Alembic, 分层),对于“简单 Todo"需求属于适度超前。若项目周期极短,可考虑移除 Alembic 和 Pydantic,简化为原生字典验证。
+- **数据库迁移风险**:在生产环境执行 `alembic upgrade head` 前必须备份数据库,避免迁移脚本导致数据丢失。
+- **并发写入限制**:尽管开启了 SQLite WAL 模式,但在高并发场景下仍建议迁移至 PostgreSQL,并在应用层增加乐观锁机制(如版本号字段)。
+- **敏感信息保护**:`.env` 文件必须加入 `.gitignore`,确保密钥不会上传至代码仓库;日志配置需定期审查是否记录了敏感数据。
+- **输入长度限制**:务必在 Pydantic 模型中限制文本字段长度,防止恶意长字符串攻击或数据库字段溢出。
+- **测试数据污染**:测试套件应确保每个测试用例之间数据完全隔离,推荐使用 `transactional` 模式或每次测试后清空数据库。
+```

BIN
Co-creation-projects/yangyousan123-CodePlanAgent/requirements.txt