生产级AI Agent工程化实战:从ClaudeCode到Harness框架完整搭建
在实际 AI 工程化项目中,很多开发者会遇到一个典型困境:单个 AI 模型调用起来不难,但要把多个模型、工具链、业务逻辑和异常处理组装成一个可靠的生产级系统,却常常缺乏清晰的工程路径。你可能会在本地测试时一切正常,但一到生产环境就出现配置丢失、响应超时、依赖冲突或扩展困难等问题。这种差距背后,往往不是模型能力不足,而是工程化架构和开发范式的缺失。
本文将以 AI Agent 为核心,结合 ClaudeCode、Harness、Codex 等具体工具,从原理到实战,带你完成一个生产级 AI 工程化项目的完整搭建过程。重点不在于演示单个工具的使用,而在于展示如何将这些组件有机地组合起来,形成可维护、可扩展、可监控的工程体系。适合已经了解基础 AI 模型调用,但希望将 AI 能力系统化集成到正式项目中的后端工程师、全栈开发者和技术负责人。
我们将从 AI Agent 的基本概念和工作机制开始,逐步准备开发环境,集成 ClaudeCode 和 Codex 作为核心 AI 能力提供者,使用 Harness 工程思想构建稳健的 Agent 框架,最后通过一个可运行的 CLI 工具案例,验证整个架构的可行性和生产级特性。过程中会详细解释关键配置、代码结构、错误处理和性能考量,并提供从开发到部署的完整排查清单。
1. 理解 AI Agent 的核心机制与工程价值
AI Agent 不是简单的模型调用封装,而是一个能够感知环境、制定目标、执行动作并持续学习的自治系统。在生产环境中,一个合格的 AI Agent 需要具备任务分解、工具调用、状态管理和异常恢复等核心能力。
1.1 AI Agent 与普通对话式 AI 的关键区别
很多开发者容易将 AI Agent 与对话式 AI 混淆,但两者的设计目标和架构有本质不同。对话式 AI 主要关注单轮或多轮对话的连贯性,而 AI Agent 的核心是完成特定任务。
| 特性 | 对话式 AI | AI Agent |
|---|---|---|
| 主要目标 | 提供自然、连贯的对话体验 | 完成具体任务或解决特定问题 |
| 交互模式 | 一问一答,强调上下文理解 | 主动执行动作,可能涉及多步骤操作 |
| 状态管理 | 通常无状态或简单会话状态 | 有明确的任务状态、执行历史和进度追踪 |
| 工具集成 | 可选,主要用于信息检索 | 必需,依赖外部工具和 API 完成实际工作 |
| 评估标准 | 对话质量、用户满意度 | 任务完成率、效率、可靠性 |
在实际工程中,AI Agent 通常由以下几个核心组件构成:
- 感知模块 :接收用户输入或环境信号,解析为结构化意图
- 规划模块 :将复杂任务分解为可执行的子步骤序列
- 工具模块 :封装外部 API、数据库操作、文件处理等能力
- 执行模块 :按规划顺序调用工具,处理中间结果
- 记忆模块 :保存任务上下文、执行历史和知识库
- 控制模块 :协调各模块工作,处理异常和重试逻辑
1.2 Harness Engineering:AI Agent 时代的工程范式
Harness Engineering 是 OpenAI 在实践报告中提出的工程方法论,核心思想是将 AI 组件像"马具"一样可靠地套接在业务系统上,确保 AI 能力可以被安全、可控地使用。这种范式强调以下几个工程原则:
- 可靠性优先 :AI 系统必须保证在不确定输入下的确定输出
- 渐进式集成 :从简单场景开始,逐步增加复杂度和自治性
- 观测性设计 :所有决策过程要有日志、指标和追踪支持
- 安全边界 :为 AI 行为设置明确的权限和操作范围
- 人工干预点 :在关键决策点保留人工审核和覆盖机制
在实际项目中,Harness Engineering 体现为一系列具体的设计模式和技术选择。比如,不是让 AI 直接操作系统资源,而是通过受限的工具接口;不是一次性交付完整自治系统,而是先从辅助工具开始验证。
1.3 ClaudeCode 与 Codex 的定位差异
ClaudeCode 和 Codex 都是代码生成相关的 AI 模型,但在工程化使用时有不同的适用场景:
- ClaudeCode :更擅长理解代码上下文和进行增量修改,适合代码审查、重构和文档生成
- Codex :在代码补全和从注释生成代码方面表现突出,适合快速原型开发和代码片段生成
在生产级 AI Agent 中,我们往往需要根据具体任务类型动态选择最合适的模型,而不是绑定到单一模型。这种模型路由能力本身就是 AI 工程化的重要部分。
2. 环境准备与依赖配置
构建生产级 AI Agent 需要严格的环境管理,特别是当涉及多个 AI 模型和服务时。下面以 Python 环境为例,说明如何建立可复现的开发基础。
2.1 Python 环境与版本管理
生产项目首先需要隔离的 Python 环境,避免依赖冲突。推荐使用 pyenv 配合 virtualenv:
# 安装 pyenv (Linux/macOS)
curl https://pyenv.run | bash
# 安装指定 Python 版本
pyenv install 3.11.6
# 创建项目专用环境
pyenv virtualenv 3.11.6 ai-agent-project
cd /path/to/your/project
pyenv local ai-agent-project
验证环境是否正确:
python --version # 应该显示 Python 3.11.6
pip --version # 确认 pip 属于当前虚拟环境
2.2 核心依赖与版本锁定
AI 项目对依赖版本特别敏感,不同版本的 SDK 可能有兼容性变化。创建 requirements.in 文件声明直接依赖:
# requirements.in
openai>=1.3.0
anthropic>=0.7.0
pydantic>=2.0.0
fastapi>=0.104.0
uvicorn>=0.24.0
click>=8.1.0
structlog>=
使用 pip-tools 编译精确版本:
pip install pip-tools
pip-compile requirements.in -o requirements.txt
pip-sync requirements.txt
这样确保所有间接依赖的版本也被锁定,避免环境差异导致的问题。
2.3 API 密钥管理与安全配置
AI 服务通常需要 API 密钥,这些敏感信息绝不能硬编码在代码中。建立安全的配置管理机制:
# config.py
import os
from typing import Optional
from pydantic import BaseSettings, Field
class Settings(BaseSettings):
# API 密钥从环境变量读取,支持 .env 文件
openai_api_key: str = Field(..., env="OPENAI_API_KEY")
anthropic_api_key: str = Field(..., env="ANTHROPIC_API_KEY")
# 模型配置
default_code_model: str = "gpt-4"
default_chat_model: str = "claude-3-sonnet-20240229"
# 超时和重试配置
api_timeout: int = 30
max_retries: int = 3
class Config:
env_file = ".env"
case_sensitive = False
settings = Settings()
对应的 .env 文件模板:
# .env.template
OPENAI_API_KEY=your_openai_key_here
ANTHROPIC_API_KEY=your_anthropic_key_here
将 .env 加入 .gitignore ,确保密钥不会误提交。
2.4 项目结构设计
良好的项目结构是工程化的基础:
ai_agent_project/
├── src/
│ ├── agent/ # Agent 核心模块
│ │ ├── __init__.py
│ │ ├── core.py # Agent 基类和核心逻辑
│ │ ├── planner.py # 任务规划模块
│ │ └── tools.py # 工具封装模块
│ ├── models/ # 模型接口层
│ │ ├── __init__.py
│ │ ├── claudecode.py
│ │ └── codex.py
│ ├── harness/ # Harness 工程框架
│ │ ├── __init__.py
│ │ ├── safety.py # 安全边界控制
│ │ └── monitoring.py # 监控和观测
│ ├── cli/ # CLI 入口点
│ │ └── __init__.py
│ └── config.py # 配置管理
├── tests/ # 测试代码
├── scripts/ # 部署和运维脚本
├── requirements.txt # 精确依赖
├── pyproject.toml # 项目元数据
└── README.md
这种结构分离了关注点,使各模块可以独立开发和测试。
3. 构建生产级 AI Agent CLI 框架
现在我们从零开始构建一个具体的 AI Agent CLI 工具,重点展示如何应用 Harness Engineering 原则。
3.1 定义 Agent 核心抽象基类
首先定义 Agent 的抽象接口,确保所有具体 Agent 实现统一的行为模式:
# src/agent/core.py
from abc import ABC, abstractmethod
from typing import Any, Dict, List, Optional
from enum import Enum
import logging
logger = logging.getLogger(__name__)
class AgentStatus(Enum):
IDLE = "idle"
PLANNING = "planning"
EXECUTING = "executing"
COMPLETED = "completed"
FAILED = "failed"
class BaseAgent(ABC):
"""AI Agent 抽象基类,定义统一接口"""
def __init__(self, name: str, max_steps: int = 10):
self.name = name
self.max_steps = max_steps
self.status = AgentStatus.IDLE
self.execution_history: List[Dict] = []
self.current_step = 0
@abstractmethod
async def plan(self, task: str, context: Dict[str, Any]) -> List[Dict]:
"""任务规划:将复杂任务分解为可执行步骤"""
pass
@abstractmethod
async def execute_step(self, step: Dict) -> Dict[str, Any]:
"""执行单个步骤"""
pass
@abstractmethod
async def validate_result(self, step: Dict, result: Any) -> bool:
"""验证步骤执行结果"""
pass
async def run(self, task: str, context: Optional[Dict] = None) -> Dict[str, Any]:
"""运行完整任务,体现 Harness 原则:有界执行、状态追踪、异常处理"""
context = context or {}
self.status = AgentStatus.PLANNING
try:
# 1. 任务规划
plan = await self.plan(task, context)
if not plan:
raise ValueError("任务规划失败,无法生成执行步骤")
# 2. 逐步执行(有界循环,避免无限执行)
self.status = AgentStatus.EXECUTING
results = []
for i, step in enumerate(plan[:self.max_steps]):
self.current_step = i
logger.info(f"执行步骤 {i+1}/{len(plan)}: {step.get('action', 'unknown')}")
# 执行单个步骤
step_result = await self.execute_step(step)
results.append(step_result)
# 结果验证
is_valid = await self.validate_result(step, step_result)
if not is_valid:
logger.warning(f"步骤 {i+1} 验证失败")
# 根据策略决定是否继续:继续、重试或中止
if not self._should_continue_on_failure(step, step_result):
self.status = AgentStatus.FAILED
return {
"success": False,
"error": f"步骤 {i+1} 验证失败且策略要求中止",
"completed_steps": i + 1,
"results": results
}
# 记录执行历史
self.execution_history.append({
"step": i + 1,
"action": step.get("action"),
"result": step_result,
"valid": is_valid
})
self.status = AgentStatus.COMPLETED
return {
"success": True,
"completed_steps": len(plan),
"results": results,
"history": self.execution_history
}
except Exception as e:
self.status = AgentStatus.FAILED
logger.error(f"Agent 执行失败: {str(e)}", exc_info=True)
return {
"success": False,
"error": str(e),
"completed_steps": self.current_step,
"results": results if 'results' in locals() else []
}
def _should_continue_on_failure(self, step: Dict, result: Any) -> bool:
"""失败处理策略:关键步骤失败则中止,非关键步骤可继续"""
critical_actions = ["write_file", "execute_code", "deploy"]
return step.get("action") not in critical_actions
这个基类体现了多个 Harness Engineering 原则:执行步骤有上限、状态明确追踪、异常妥善处理、关键操作有特殊策略。
3.2 实现 ClaudeCode 集成模块
ClaudeCode 在代码理解和生成方面有独特优势,我们将其封装为专门的工具模块:
# src/models/claudecode.py
import anthropic
from typing import Dict, Any, Optional
import asyncio
from ..config import settings
class ClaudeCodeClient:
"""ClaudeCode 专用客户端,封装代码相关操作"""
def __init__(self):
self.client = anthropic.Anthropic(api_key=settings.anthropic_api_key)
self.model = "claude-3-sonnet-20240229"
async def analyze_code(self, code: str, task: str) -> Dict[str, Any]:
"""代码分析:理解代码结构、识别问题、提供建议"""
prompt = f"""
请分析以下代码并完成任务:{task}
代码:
```python
{code}
请按以下格式回复:
-
代码功能总结
-
潜在问题识别
-
改进建议
-
具体修改方案(如有) """
try: response = await asyncio.get_event_loop().run_in_executor( None, lambda: self.client.messages.create( model=self.model, max_tokens=4000, temperature=0.1, # 低温度保证确定性输出 messages=[{"role": "user", "content": prompt}] ) ) return { "success": True, "analysis": response.content[0].text, "model_used": self.model } except Exception as e: return { "success": False, "error": str(e), "analysis": None }async def generate_code(self, specification: str, context: Optional[str] = None) -> Dict[str, Any]: """代码生成:根据规范生成代码,支持上下文""" base_prompt = f"请根据以下需求生成代码:{specification}" if context: base_prompt += f"\n\n相关上下文:{context}"
base_prompt += "\n\n请直接输出代码,并在代码开始前用```python标记,结束后用```标记。" try: response = await asyncio.get_event_loop().run_in_executor( None, lambda: self.client.messages.create( model=self.model, max_tokens=4000, temperature=0.3, # 稍高温度增加创造性 messages=[{"role": "user", "content": base_prompt}] ) ) # 提取代码块 content = response.content[0].text if "```python" in content: code = content.split("```python")[1].split("```")[0].strip() else: code = content.strip() return { "success": True, "code": code, "full_response": content, "model_used": self.model } except Exception as e: return { "success": False, "error": str(e), "code": None }
### 3.3 构建代码生成专用 Agent
基于基类和 ClaudeCode 客户端,实现一个具体的代码生成 Agent:
```python
# src/agent/code_agent.py
from .core import BaseAgent, AgentStatus
from ..models.claudecode import ClaudeCodeClient
from ..models.codex import CodexClient
from typing import Dict, Any, List
import re
class CodeGenerationAgent(BaseAgent):
"""代码生成专用 Agent,支持多模型路由和质量验证"""
def __init__(self, name: str = "code_agent"):
super().__init__(name)
self.claude_client = ClaudeCodeClient()
self.codex_client = CodexClient()
async def plan(self, task: str, context: Dict[str, Any]) -> List[Dict]:
"""代码生成任务规划:分析需求,确定生成策略"""
# 使用 Claude 分析任务复杂度
analysis_prompt = f"""
请分析以下代码生成任务的复杂度和所需步骤:
任务:{task}
请判断:
1. 这是简单片段生成、模块开发还是复杂系统构建?
2. 需要哪些具体步骤(分析需求、设计接口、实现代码、测试验证等)?
3. 推荐使用哪个模型(ClaudeCode 或 Codex)?为什么?
请用 JSON 格式回复:
{{
"complexity": "low|medium|high",
"steps": ["step1", "step2", ...],
"recommended_model": "claudecode|codex",
"reason": "推荐理由"
}}
"""
analysis = await self.claude_client.analyze_code("", analysis_prompt)
if not analysis["success"]:
# fallback 到简单规划
return [
{"action": "analyze_requirements", "model": "claudecode"},
{"action": "generate_code", "model": "codex"},
{"action": "validate_code", "model": "claudecode"}
]
# 解析分析结果并生成具体步骤
# 这里简化处理,实际应该解析 JSON 响应
return self._create_steps_from_analysis(task, analysis["analysis"])
async def execute_step(self, step: Dict) -> Dict[str, Any]:
"""执行单个代码生成步骤"""
action = step.get("action")
model = step.get("model", "claudecode")
if action == "analyze_requirements":
return await self._analyze_requirements(step.get("task"), model)
elif action == "generate_code":
return await self._generate_code(step.get("specification"), model)
elif action == "validate_code":
return await self._validate_code(step.get("code"), model)
else:
return {"success": False, "error": f"未知操作: {action}"}
async def validate_result(self, step: Dict, result: Any) -> bool:
"""验证代码生成结果"""
if not result.get("success"):
return False
if step.get("action") == "generate_code":
code = result.get("code", "")
# 基本代码验证:非空、包含关键元素
return bool(code and len(code.strip()) > 10)
return True
async def _analyze_requirements(self, task: str, model: str) -> Dict[str, Any]:
"""需求分析步骤"""
if model == "claudecode":
return await self.claude_client.analyze_code("", task)
else:
return await self.codex_client.analyze_task(task)
async def _generate_code(self, specification: str, model: str) -> Dict[str, Any]:
"""代码生成步骤"""
if model == "claudecode":
return await self.claude_client.generate_code(specification)
else:
return await self.codex_client.generate_code(specification)
def _create_steps_from_analysis(self, task: str, analysis: str) -> List[Dict]:
"""从分析结果创建执行步骤(简化实现)"""
steps = []
if "复杂" in analysis or "high" in analysis.lower():
steps.extend([
{"action": "analyze_requirements", "model": "claudecode", "task": task},
{"action": "design_architecture", "model": "claudecode", "task": task},
{"action": "generate_core_modules", "model": "claudecode", "specification": task},
{"action": "generate_auxiliary_code", "model": "codex", "specification": task},
{"action": "validate_completeness", "model": "claudecode", "task": task}
])
else:
steps.extend([
{"action": "analyze_requirements", "model": "claudecode", "task": task},
{"action": "generate_code", "model": "codex", "specification": task},
{"action": "validate_code", "model": "claudecode", "task": task}
])
return steps
这个 Agent 展示了模型路由、任务分解、步骤验证等关键工程化特性。
4. 实现 Harness 安全框架与监控
生产级 AI Agent 必须包含安全控制和运行监控,这是 Harness Engineering 的核心要求。
4.1 安全边界控制
为 AI Agent 的操作设置明确的权限边界:
# src/harness/safety.py
from typing import List, Set, Dict, Any
import re
class SafetyController:
"""安全控制器:限制 AI Agent 的操作范围"""
def __init__(self):
self.allowed_actions: Set[str] = {
"read_file", "write_file", "execute_code",
"call_api", "analyze_data", "generate_content"
}
self.restricted_patterns = [
r"rm\s+-rf", # 危险系统命令
r"curl.*\|.*sh", # 管道下载执行
r"password.*=.*['\"].*['\"]", # 硬编码密码
# 添加更多危险模式...
]
def validate_action(self, action: str, parameters: Dict[str, Any]) -> bool:
"""验证操作是否允许执行"""
# 1. 检查操作类型是否允许
if action not in self.allowed_actions:
return False
# 2. 检查参数中的危险模式
param_str = str(parameters).lower()
for pattern in self.restricted_patterns:
if re.search(pattern, param_str):
return False
# 3. 特定操作的特殊检查
if action == "write_file":
return self._validate_file_write(parameters)
elif action == "execute_code":
return self._validate_code_execution(parameters)
return True
def _validate_file_write(self, parameters: Dict) -> bool:
"""文件写入安全验证"""
filepath = parameters.get("path", "")
content = parameters.get("content", "")
# 禁止写入系统关键路径
restricted_paths = ["/etc/", "/bin/", "/usr/", "/sys/"]
if any(filepath.startswith(path) for path in restricted_paths):
return False
# 检查内容是否包含危险代码
dangerous_imports = ["os.system", "subprocess.Popen", "eval(", "exec("]
if any(imp in content for imp in dangerous_imports):
return False
return True
def _validate_code_execution(self, parameters: Dict) -> bool:
"""代码执行安全验证"""
code = parameters.get("code", "")
# 禁止危险操作
dangerous_patterns = [
r"import\s+os\s*$", r"from\s+os\s+import",
r"__import__", r"open\s*\(", r"file\s*\("
]
for pattern in dangerous_patterns:
if re.search(pattern, code, re.MULTILINE):
return False
return True
class PermissionManager:
"""权限管理器:基于角色的操作控制"""
def __init__(self):
self.role_permissions = {
"reader": {"read_file", "analyze_data"},
"developer": {"read_file", "write_file", "generate_content"},
"admin": {"read_file", "write_file", "execute_code", "call_api"}
}
def check_permission(self, role: str, action: str) -> bool:
"""检查角色是否有执行操作的权限"""
return action in self.role_permissions.get(role, set())
4.2 运行监控与可观测性
生产系统必须能够监控和调试:
# src/harness/monitoring.py
import time
import logging
from datetime import datetime
from typing import Dict, Any, List
from dataclasses import dataclass, asdict
@dataclass
class AgentEvent:
"""Agent 事件记录"""
timestamp: datetime
agent_name: str
event_type: str # start, step_begin, step_end, error, complete
step_number: int = 0
details: Dict[str, Any] = None
duration_ms: int = 0
class MonitoringSystem:
"""监控系统:记录 Agent 运行状态和性能指标"""
def __init__(self):
self.events: List[AgentEvent] = []
self.logger = logging.getLogger("monitoring")
def record_event(self, agent_name: str, event_type: str,
details: Dict[str, Any] = None, step_number: int = 0):
"""记录 Agent 事件"""
event = AgentEvent(
timestamp=datetime.now(),
agent_name=agent_name,
event_type=event_type,
step_number=step_number,
details=details or {},
duration_ms=0
)
self.events.append(event)
self.logger.info(f"Agent事件: {agent_name} - {event_type} - 步骤{step_number}")
# 如果是结束事件,计算持续时间
if event_type.endswith("_end"):
self._calculate_duration(agent_name, event_type.replace("_end", "_begin"))
def _calculate_duration(self, agent_name: str, begin_event_type: str):
"""计算事件持续时间"""
for event in reversed(self.events):
if (event.agent_name == agent_name and
event.event_type == begin_event_type):
event.duration_ms = int(
(datetime.now() - event.timestamp).total_seconds() * 1000
)
break
def get_agent_metrics(self, agent_name: str) -> Dict[str, Any]:
"""获取 Agent 运行指标"""
agent_events = [e for e in self.events if e.agent_name == agent_name]
if not agent_events:
return {}
completed_events = [e for e in agent_events if e.event_type == "complete"]
error_events = [e for e in agent_events if e.event_type == "error"]
step_events = [e for e in agent_events if e.event_type.startswith("step_")]
total_duration = sum(e.duration_ms for e in step_events if e.duration_ms > 0)
return {
"total_runs": len(completed_events),
"success_rate": len(completed_events) / max(1, len(completed_events) + len(error_events)),
"average_steps_per_run": len(step_events) / max(1, len(completed_events)),
"total_duration_ms": total_duration,
"last_run": agent_events[-1].timestamp if agent_events else None
}
def generate_report(self) -> Dict[str, Any]:
"""生成监控报告"""
agents = set(e.agent_name for e in self.events)
return {
"timestamp": datetime.now().isoformat(),
"agents": {agent: self.get_agent_metrics(agent) for agent in agents},
"recent_events": [asdict(e) for e in self.events[-10:]] # 最近10个事件
}
5. 构建完整的 CLI 工具与验证
现在我们将所有组件集成为一个完整的命令行工具,并进行端到端验证。
5.1 CLI 入口点实现
使用 Click 框架构建用户友好的命令行接口:
# src/cli/main.py
import click
import asyncio
import json
from pathlib import Path
from ..agent.code_agent import CodeGenerationAgent
from ..harness.monitoring import MonitoringSystem
from ..harness.safety import SafetyController, PermissionManager
from ..config import settings
monitoring = MonitoringSystem()
safety_controller = SafetyController()
permission_manager = PermissionManager()
@click.group()
def cli():
"""AI Agent 工程化 CLI 工具"""
pass
@cli.command()
@click.option("--task", required=True, help="代码生成任务描述")
@click.option("--output", "-o", help="输出文件路径")
@click.option("--model", default="auto", help="指定模型: claudecode, codex, auto")
@click.option("--role", default="developer", help="执行角色: reader, developer, admin")
def generate_code(task, output, model, role):
"""生成代码的 AI Agent 命令"""
# 权限检查
if not permission_manager.check_permission(role, "generate_content"):
click.echo("错误: 当前角色没有代码生成权限")
return
click.echo(f"开始处理代码生成任务: {task}")
# 创建并运行 Agent
agent = CodeGenerationAgent()
# 记录开始事件
monitoring.record_event(agent.name, "start", {"task": task, "role": role})
# 运行 Agent(异步转同步,适合 CLI)
async def run_agent():
return await agent.run(task, {"model_preference": model, "role": role})
result = asyncio.run(run_agent())
# 记录完成事件
event_type = "complete" if result["success"] else "error"
monitoring.record_event(agent.name, event_type, result)
# 输出结果
if result["success"]:
click.echo("✅ 代码生成成功!")
if "code" in result.get("results", [{}])[-1]:
code = result["results"][-1]["code"]
if output:
# 安全验证后才写入文件
write_params = {"path": output, "content": code}
if safety_controller.validate_action("write_file", write_params):
Path(output).write_text(code, encoding="utf-8")
click.echo(f"📁 代码已保存到: {output}")
else:
click.echo("⚠️ 文件写入被安全策略阻止")
else:
click.echo("生成的代码:")
click.echo("```python")
click.echo(code)
click.echo("```")
click.echo(f"完成步骤: {result['completed_steps']}")
else:
click.echo("❌ 代码生成失败!")
click.echo(f"错误: {result.get('error', '未知错误')}")
click.echo(f"已完成步骤: {result.get('completed_steps', 0)}")
@cli.command()
def status():
"""查看系统状态和监控指标"""
report = monitoring.generate_report()
click.echo("系统监控报告:")
click.echo("=" * 50)
for agent, metrics in report["agents"].items():
click.echo(f"Agent: {agent}")
click.echo(f" 运行次数: {metrics.get('total_runs', 0)}")
click.echo(f" 成功率: {metrics.get('success_rate', 0):.1%}")
click.echo(f" 平均步骤: {metrics.get('average_steps_per_run', 0):.1f}")
click.echo()
@cli.command()
@click.option("--action", required=True, help="要验证的操作")
@click.option("--parameters", help="操作参数(JSON格式)")
def validate_action(action, parameters):
"""验证操作是否被安全策略允许"""
params = json.loads(parameters) if parameters else {}
is_allowed = safety_controller.validate_action(action, params)
if is_allowed:
click.echo("✅ 操作被允许")
else:
click.echo("❌ 操作被安全策略阻止")
if __name__ == "__main__":
cli()
5.2 项目配置与安装脚本
创建 pyproject.toml 确保项目可安装:
[project]
name = "ai-agent-cli"
version = "0.1.0"
description = "生产级 AI Agent 工程化 CLI 工具"
authors = [{name = "Your Name", email = "your.email@example.com"}]
dependencies = [
"click>=8.1.0",
"anthropic>=0.7.0",
"openai>=1.3.0",
"pydantic>=2.0.0",
]
[project.scripts]
ai-agent = "src.cli.main:cli"
[tool.setuptools.packages.find]
where = ["."]
include = ["src*"]
[build-system]
requires = ["setuptools>=61.0", "wheel"]
build-backend = "setuptools.build_meta"
5.3 端到端验证测试
创建完整的验证流程:
# 1. 安装项目
pip install -e .
# 2. 设置环境变量
export OPENAI_API_KEY="your_key"
export ANTHROPIC_API_KEY="your_key"
# 3. 测试基本功能
ai-agent generate-code --task "创建一个Python函数,计算斐波那契数列" --role developer
# 4. 测试安全限制
ai-agent validate-action --action "write_file" --parameters '{"path": "/etc/passwd", "content": "test"}'
# 5. 查看系统状态
ai-agent status
预期输出示例:
开始处理代码生成任务: 创建一个Python函数,计算斐波那契数列
✅ 代码生成成功!
生成的代码:
```python
def fibonacci(n):
if n <= 0:
return 0
elif n == 1:
return 1
else:
return fibonacci(n-1) + fibonacci(n-2)
完成步骤: 3
## 6. 生产环境部署与运维考量
将 AI Agent 系统部署到生产环境需要额外的工程化考量。
### 6.1 容器化部署
创建 Dockerfile 确保环境一致性:
```dockerfile
FROM python:3.11-slim
WORKDIR /app
# 安装依赖
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# 复制应用代码
COPY src/ ./src/
COPY pyproject.toml .
# 创建非root用户
RUN useradd --create-home --shell /bin/bash app
USER app
# 设置入口点
ENTRYPOINT ["python", "-m", "src.cli.main"]
对应的 docker-compose.yml 用于复杂部署:
version: '3.8'
services:
ai-agent:
build: .
environment:
- OPENAI_API_KEY=${OPENAI_API_KEY}
- ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY}
volumes:
- ./logs:/app/logs
- ./cache:/app/cache
更多推荐


所有评论(0)