AI工程化实战:从Agent Harness架构到生产级AI Agent系统开发
最近在AI工程化领域,很多开发者都遇到了一个共同的问题:虽然市面上有很多AI工具和框架,但真正能够构建生产级AI Agent系统的实战教程却很少。特别是当涉及到ClaudeCode、Harness Engineering、Codex等核心组件时,往往只能找到零散的使用说明,缺乏系统性的架构分析和工程实践指导。
本文基于《御舆:解码Agent Harness》的核心思想,结合最新的AI工程化实践,为你带来一套完整的AI Agent开发实战教程。无论你是刚接触AI Agent的新手,还是希望深入理解生产级AI Agent架构的高级开发者,都能从本文中获得实用的知识和可落地的解决方案。
1. AI工程化与Agent Harness核心概念
1.1 什么是AI工程化
AI工程化是将人工智能技术系统化、标准化地应用到实际生产环境的过程。它不仅仅是使用AI模型,更重要的是构建可维护、可扩展、安全可靠的AI系统。在当前的AI开发中,工程化能力已经成为区分业余爱好者和专业开发者的关键因素。
传统的AI应用开发往往停留在模型调用层面,而AI工程化则涵盖了数据流水线、模型服务、监控告警、权限管理、性能优化等完整生命周期。这就好比从简单的工具使用升级到完整的系统工程。
1.2 Agent Harness架构解析
Agent Harness是AI Agent的运行时框架,相当于智能体系统的"骨架"。根据《御舆:解码Agent Harness》的分析,一个完整的Agent Harness包含以下核心组件:
- 对话循环 :Agent的心跳,采用while(true)异步生成器模式驱动整个系统运转
- 工具系统 :Agent的双手,提供50+种工具调用能力
- 权限管线 :Agent的护栏,四阶段权限验证确保系统安全
- 上下文管理 :智能的工作记忆处理,支持四级渐进压缩策略
- 钩子系统 :生命周期扩展点,26个事件支持深度定制
这种架构设计使得Agent Harness能够承载复杂的AI智能体应用,就像古代的马车舆架承载整个车体一样,为AI Agent提供稳定可靠的运行基础。
1.3 ClaudeCode在AI工程化中的定位
ClaudeCode作为Anthropic推出的AI编程助手,其背后的架构体现了现代AI工程化的最佳实践。它不仅仅是代码补全工具,更是一个完整的AI Agent系统,具备工具调用、权限管理、上下文感知等高级能力。
理解ClaudeCode的架构设计,对于构建自己的AI Agent系统具有重要参考价值。其采用的Bun + React/Ink + Zod v4技术栈,以及异步生成器、依赖注入等设计模式,都是值得学习的工程实践。
2. 环境准备与开发工具链
2.1 基础环境配置
构建AI Agent系统首先需要合适的环境。推荐使用以下技术栈:
# 检查Node.js版本(推荐18.0以上)
node --version
# 安装Bun(替代Node.js的现代JavaScript运行时)
curl -fsSL https://bun.sh/install | bash
# 验证安装
bun --version
# 创建项目目录
mkdir ai-agent-project
cd ai-agent-project
bun init -y
2.2 核心依赖配置
在package.json中添加必要的依赖项:
{
"name": "ai-agent-project",
"version": "1.0.0",
"scripts": {
"dev": "bun run --watch src/index.ts",
"build": "bun build src/index.ts --outdir dist",
"test": "bun test"
},
"dependencies": {
"@anthropic-ai/claude-code": "^1.0.0",
"zod": "^4.0.0",
"ink": "^4.0.0",
"react": "^18.0.0"
},
"devDependencies": {
"@types/bun": "^1.0.0",
"typescript": "^5.0.0"
},
"type": "module"
}
2.3 开发环境验证
创建基础项目结构并进行环境验证:
// src/index.ts
import { claudeCode } from '@anthropic-ai/claude-code';
import { z } from 'zod';
// 简单的环境验证函数
async function validateEnvironment() {
console.log('🔧 验证开发环境...');
try {
// 检查Zod schema验证
const testSchema = z.object({ name: z.string() });
testSchema.parse({ name: 'test' });
console.log('✅ Zod schema验证通过');
// 检查基础异步操作
await Promise.resolve();
console.log('✅ 异步操作支持正常');
console.log('🎉 环境验证完成,可以开始AI Agent开发!');
} catch (error) {
console.error('❌ 环境验证失败:', error);
}
}
validateEnvironment();
运行验证脚本:
bun run src/index.ts
3. AI Agent核心架构深度解析
3.1 对话循环:Agent的心跳机制
对话循环是AI Agent的核心驱动机制,采用异步生成器模式实现持续的交互处理:
// src/core/dialog-loop.ts
interface DialogEvent {
type: 'user_input' | 'tool_call' | 'system_message' | 'context_update' | 'completion';
data: any;
timestamp: number;
}
class DialogLoop {
private isRunning = false;
private eventQueue: DialogEvent[] = [];
async *run(): AsyncGenerator<DialogEvent> {
this.isRunning = true;
while (this.isRunning) {
if (this.eventQueue.length > 0) {
const event = this.eventQueue.shift()!;
yield event;
// 处理不同类型的事件
await this.handleEvent(event);
} else {
// 队列为空时短暂等待
await new Promise(resolve => setTimeout(resolve, 100));
}
}
}
private async handleEvent(event: DialogEvent): Promise<void> {
switch (event.type) {
case 'user_input':
await this.processUserInput(event.data);
break;
case 'tool_call':
await this.executeTool(event.data);
break;
case 'context_update':
await this.updateContext(event.data);
break;
}
}
private async processUserInput(input: string): Promise<void> {
// 用户输入处理逻辑
console.log('处理用户输入:', input);
}
private async executeTool(toolCall: any): Promise<void> {
// 工具执行逻辑
console.log('执行工具调用:', toolCall);
}
private async updateContext(context: any): Promise<void> {
// 上下文更新逻辑
console.log('更新上下文:', context);
}
addEvent(event: DialogEvent): void {
this.eventQueue.push(event);
}
stop(): void {
this.isRunning = false;
}
}
3.2 工具系统设计与实现
工具系统是AI Agent与外部世界交互的关键组件,需要支持安全、并发的工具调用:
// src/core/tool-system.ts
interface Tool<I = any, O = any, P = any> {
name: string;
description: string;
parameters: z.ZodSchema<P>;
execute: (input: I, params: P) => Promise<O>;
readOnly?: boolean;
destructive?: boolean;
concurrencySafe?: boolean;
}
class ToolRegistry {
private tools: Map<string, Tool> = new Map();
private concurrentOperations: Map<string, number> = new Map();
registerTool(tool: Tool): void {
if (this.tools.has(tool.name)) {
throw new Error(`工具 ${tool.name} 已注册`);
}
this.tools.set(tool.name, tool);
this.concurrentOperations.set(tool.name, 0);
}
async executeTool(name: string, input: any, params: any): Promise<any> {
const tool = this.tools.get(name);
if (!tool) {
throw new Error(`工具 ${name} 未找到`);
}
// 参数验证
const validatedParams = tool.parameters.parse(params);
// 并发控制
if (!tool.concurrencySafe) {
const currentOps = this.concurrentOperations.get(name) || 0;
if (currentOps > 0) {
throw new Error(`工具 ${name} 不支持并发执行`);
}
this.concurrentOperations.set(name, currentOps + 1);
}
try {
const result = await tool.execute(input, validatedParams);
return result;
} finally {
if (!tool.concurrencySafe) {
const currentOps = this.concurrentOperations.get(name) || 1;
this.concurrentOperations.set(name, Math.max(0, currentOps - 1));
}
}
}
getTool(name: string): Tool | undefined {
return this.tools.get(name);
}
listTools(): Tool[] {
return Array.from(this.tools.values());
}
}
// 示例工具实现
const fileReadTool: Tool<string, string, { encoding: string }> = {
name: 'read_file',
description: '读取文件内容',
parameters: z.object({
encoding: z.string().default('utf-8')
}),
readOnly: true,
concurrencySafe: true,
execute: async (filePath: string, params: { encoding: string }) => {
// 实际的文件读取逻辑
const content = `模拟读取文件: ${filePath}`;
return content;
}
};
3.3 权限管线的四阶段验证
权限管线确保AI Agent的操作安全可控,采用四阶段验证机制:
// src/core/permission-pipeline.ts
interface PermissionRequest {
tool: string;
operation: string;
parameters: any;
context: any;
}
interface PermissionResult {
allowed: boolean;
reason?: string;
constraints?: any;
}
class PermissionPipeline {
private stages = [
'syntax_validation',
'semantic_validation',
'policy_check',
'runtime_constraints'
];
async checkPermission(request: PermissionRequest): Promise<PermissionResult> {
let currentStage = 0;
// 阶段1: 语法验证
if (!await this.validateSyntax(request)) {
return { allowed: false, reason: '语法验证失败' };
}
currentStage++;
// 阶段2: 语义验证
if (!await this.validateSemantics(request)) {
return { allowed: false, reason: '语义验证失败' };
}
currentStage++;
// 阶段3: 策略检查
const policyResult = await this.checkPolicy(request);
if (!policyResult.allowed) {
return policyResult;
}
currentStage++;
// 阶段4: 运行时约束
const constraintResult = await this.checkRuntimeConstraints(request);
if (!constraintResult.allowed) {
return constraintResult;
}
return { allowed: true };
}
private async validateSyntax(request: PermissionRequest): Promise<boolean> {
// 语法验证逻辑
return request.tool && request.operation;
}
private async validateSemantics(request: PermissionRequest): Promise<boolean> {
// 语义验证逻辑
return true;
}
private async checkPolicy(request: PermissionRequest): Promise<PermissionResult> {
// 策略检查逻辑
const dangerousOperations = ['delete', 'format', 'shutdown'];
if (dangerousOperations.includes(request.operation)) {
return {
allowed: false,
reason: '危险操作需要额外授权',
constraints: { requires_approval: true }
};
}
return { allowed: true };
}
private async checkRuntimeConstraints(request: PermissionRequest): Promise<PermissionResult> {
// 运行时约束检查
return { allowed: true };
}
}
4. ClaudeCode架构实战应用
4.1 ClaudeCode工具集成模式
ClaudeCode提供了丰富的工具调用能力,以下是如何集成到自定义Agent的示例:
// src/integrations/claude-code.ts
import { claudeCode } from '@anthropic-ai/claude-code';
class ClaudeCodeIntegration {
private codeClient: any;
constructor(apiKey: string) {
this.codeClient = claudeCode.init({ apiKey });
}
async analyzeCode(code: string, context: any = {}): Promise<any> {
const prompt = `
请分析以下代码,提供改进建议和安全检查:
\`\`\`typescript
${code}
\`\`\`
上下文信息:${JSON.stringify(context)}
`;
try {
const response = await this.codeClient.complete({
prompt,
max_tokens: 1000,
temperature: 0.2
});
return this.parseAnalysisResponse(response);
} catch (error) {
console.error('ClaudeCode分析失败:', error);
throw error;
}
}
private parseAnalysisResponse(response: any): any {
// 解析ClaudeCode的响应
return {
suggestions: response.choices?.[0]?.text || '',
securityIssues: [],
performanceTips: []
};
}
async generateCode(description: string, language: string = 'typescript'): Promise<string> {
const prompt = `
根据以下描述生成${language}代码:
${description}
要求:
1. 代码要符合最佳实践
2. 包含必要的错误处理
3. 添加适当的注释
`;
const response = await this.codeClient.complete({
prompt,
max_tokens: 1500,
temperature: 0.3
});
return response.choices?.[0]?.text || '';
}
}
4.2 Harness工程化配置管理
生产级AI Agent需要完善的配置管理系统:
// src/core/config-manager.ts
import { z } from 'zod';
import { readFileSync, existsSync } from 'fs';
const ConfigSchema = z.object({
ai: z.object({
provider: z.enum(['claude', 'openai', 'local']),
apiKey: z.string().optional(),
model: z.string().default('claude-3-sonnet'),
temperature: z.number().min(0).max(1).default(0.3),
maxTokens: z.number().positive().default(2000)
}),
security: z.object({
enablePermissions: z.boolean().default(true),
maxConcurrentTools: z.number().positive().default(5),
allowedDomains: z.array(z.string()).default([])
}),
performance: z.object({
cacheEnabled: z.boolean().default(true),
timeoutMs: z.number().positive().default(30000),
retryAttempts: z.number().min(0).max(5).default(3)
})
});
type AppConfig = z.infer<typeof ConfigSchema>;
class ConfigManager {
private config: AppConfig;
private configPath: string;
constructor(configPath: string = './config.json') {
this.configPath = configPath;
this.config = this.loadConfig();
}
private loadConfig(): AppConfig {
// 配置加载优先级:环境变量 > 配置文件 > 默认值
const baseConfig: any = {};
// 从配置文件加载
if (existsSync(this.configPath)) {
try {
const fileConfig = JSON.parse(readFileSync(this.configPath, 'utf-8'));
Object.assign(baseConfig, fileConfig);
} catch (error) {
console.warn('配置文件加载失败,使用默认配置:', error);
}
}
// 环境变量覆盖
if (process.env.AI_PROVIDER) {
baseConfig.ai = baseConfig.ai || {};
baseConfig.ai.provider = process.env.AI_PROVIDER;
}
if (process.env.AI_API_KEY) {
baseConfig.ai = baseConfig.ai || {};
baseConfig.ai.apiKey = process.env.AI_API_KEY;
}
// 验证配置
return ConfigSchema.parse(baseConfig);
}
getConfig(): AppConfig {
return this.config;
}
updateConfig(updates: Partial<AppConfig>): void {
this.config = ConfigSchema.parse({ ...this.config, ...updates });
}
getAIConfig() {
return this.config.ai;
}
getSecurityConfig() {
return this.config.security;
}
getPerformanceConfig() {
return this.config.performance;
}
}
5. 完整AI Agent系统实战
5.1 项目结构设计
构建完整的AI Agent项目需要合理的目录结构:
ai-agent-system/
├── src/
│ ├── core/ # 核心架构
│ │ ├── dialog-loop.ts
│ │ ├── tool-system.ts
│ │ ├── permission-pipeline.ts
│ │ └── config-manager.ts
│ ├── integrations/ # 第三方集成
│ │ ├── claude-code.ts
│ │ └── codex.ts
│ ├── tools/ # 工具实现
│ │ ├── file-tools.ts
│ │ ├── network-tools.ts
│ │ └── code-tools.ts
│ ├── agents/ # Agent实现
│ │ ├── base-agent.ts
│ │ ├── coding-agent.ts
│ │ └── research-agent.ts
│ └── index.ts # 入口文件
├── config/
│ ├── default.json # 默认配置
│ └── production.json # 生产配置
├── tests/ # 测试文件
├── docs/ # 文档
└── package.json
5.2 基础Agent实现
// src/agents/base-agent.ts
import { DialogLoop } from '../core/dialog-loop';
import { ToolRegistry } from '../core/tool-system';
import { PermissionPipeline } from '../core/permission-pipeline';
import { ConfigManager } from '../core/config-manager';
abstract class BaseAgent {
protected dialogLoop: DialogLoop;
protected toolRegistry: ToolRegistry;
protected permissionPipeline: PermissionPipeline;
protected config: ConfigManager;
protected context: Map<string, any> = new Map();
constructor(configPath?: string) {
this.config = new ConfigManager(configPath);
this.dialogLoop = new DialogLoop();
this.toolRegistry = new ToolRegistry();
this.permissionPipeline = new PermissionPipeline();
this.initializeTools();
this.setupEventHandlers();
}
protected abstract initializeTools(): void;
protected abstract setupEventHandlers(): void;
async start(): Promise<void> {
console.log('🚀 启动AI Agent...');
// 启动对话循环
for await (const event of this.dialogLoop.run()) {
await this.handleAgentEvent(event);
}
}
protected async handleAgentEvent(event: any): Promise<void> {
// 基础事件处理逻辑
switch (event.type) {
case 'user_input':
await this.processUserMessage(event.data);
break;
case 'tool_call':
await this.executeToolCall(event.data);
break;
case 'system_message':
await this.processSystemMessage(event.data);
break;
}
}
protected async processUserMessage(message: string): Promise<void> {
// 用户消息处理模板方法
console.log(`处理用户消息: ${message}`);
}
protected async executeToolCall(toolCall: any): Promise<void> {
// 工具调用执行
const permission = await this.permissionPipeline.checkPermission({
tool: toolCall.name,
operation: toolCall.operation,
parameters: toolCall.parameters,
context: Object.fromEntries(this.context)
});
if (!permission.allowed) {
throw new Error(`权限拒绝: ${permission.reason}`);
}
const result = await this.toolRegistry.executeTool(
toolCall.name,
toolCall.input,
toolCall.parameters
);
this.dialogLoop.addEvent({
type: 'tool_result',
data: { toolCall, result },
timestamp: Date.now()
});
}
protected async processSystemMessage(message: any): Promise<void> {
// 系统消息处理
console.log('处理系统消息:', message);
}
stop(): void {
this.dialogLoop.stop();
console.log('🛑 AI Agent已停止');
}
}
5.3 代码生成Agent实战
// src/agents/coding-agent.ts
import { BaseAgent } from './base-agent';
import { ClaudeCodeIntegration } from '../integrations/claude-code';
class CodingAgent extends BaseAgent {
private claudeCode: ClaudeCodeIntegration;
constructor(apiKey: string, configPath?: string) {
super(configPath);
this.claudeCode = new ClaudeCodeIntegration(apiKey);
}
protected initializeTools(): void {
// 注册代码相关工具
this.toolRegistry.registerTool({
name: 'generate_code',
description: '根据描述生成代码',
parameters: z.object({
language: z.string().default('typescript'),
style: z.enum(['functional', 'oop', 'procedural']).default('functional')
}),
execute: async (description: string, params: any) => {
return await this.claudeCode.generateCode(description, params.language);
}
});
this.toolRegistry.registerTool({
name: 'analyze_code',
description: '代码分析和优化建议',
parameters: z.object({
checkSecurity: z.boolean().default(true),
checkPerformance: z.boolean().default(true)
}),
execute: async (code: string, params: any) => {
return await this.claudeCode.analyzeCode(code, params);
}
});
}
protected setupEventHandlers(): void {
// 设置代码生成特定的事件处理器
}
protected async processUserMessage(message: string): Promise<void> {
if (message.includes('生成代码') || message.includes('写一个')) {
// 提取代码生成需求
const codeDescription = this.extractCodeDescription(message);
const generatedCode = await this.claudeCode.generateCode(codeDescription);
this.dialogLoop.addEvent({
type: 'completion',
data: { type: 'code_generation', content: generatedCode },
timestamp: Date.now()
});
}
}
private extractCodeDescription(message: string): string {
// 简单的需求提取逻辑
return message.replace(/生成代码|写一个/g, '').trim();
}
}
6. 生产环境部署与优化
6.1 性能优化策略
生产级AI Agent需要关注性能优化:
// src/optimization/performance-optimizer.ts
class PerformanceOptimizer {
private cache: Map<string, { data: any; timestamp: number }> = new Map();
private cacheTtl: number = 5 * 60 * 1000; // 5分钟缓存
async withCache<T>(key: string, operation: () => Promise<T>): Promise<T> {
const cached = this.cache.get(key);
if (cached && Date.now() - cached.timestamp < this.cacheTtl) {
console.log('缓存命中:', key);
return cached.data;
}
const result = await operation();
this.cache.set(key, { data: result, timestamp: Date.now() });
return result;
}
async withRetry<T>(
operation: () => Promise<T>,
maxAttempts: number = 3,
delayMs: number = 1000
): Promise<T> {
let lastError: Error;
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
try {
return await operation();
} catch (error) {
lastError = error as Error;
console.warn(`操作失败,第${attempt}次重试:`, error);
if (attempt < maxAttempts) {
await new Promise(resolve => setTimeout(resolve, delayMs * attempt));
}
}
}
throw lastError!;
}
// 并发控制
createConcurrencyLimiter(limit: number) {
let active = 0;
const queue: Array<() => void> = [];
return async <T>(fn: () => Promise<T>): Promise<T> => {
if (active >= limit) {
await new Promise<void>(resolve => queue.push(resolve));
}
active++;
try {
return await fn();
} finally {
active--;
if (queue.length > 0) {
queue.shift()!();
}
}
};
}
}
6.2 监控与日志系统
// src/monitoring/logger.ts
interface LogEntry {
level: 'info' | 'warn' | 'error' | 'debug';
message: string;
timestamp: Date;
context?: any;
agentId?: string;
sessionId?: string;
}
class Logger {
private static instance: Logger;
private logs: LogEntry[] = [];
private maxLogs: number = 10000;
static getInstance(): Logger {
if (!Logger.instance) {
Logger.instance = new Logger();
}
return Logger.instance;
}
info(message: string, context?: any): void {
this.addLog('info', message, context);
}
warn(message: string, context?: any): void {
this.addLog('warn', message, context);
}
error(message: string, context?: any): void {
this.addLog('error', message, context);
}
private addLog(level: LogEntry['level'], message: string, context?: any): void {
const entry: LogEntry = {
level,
message,
timestamp: new Date(),
context
};
this.logs.push(entry);
// 限制日志数量
if (this.logs.length > this.maxLogs) {
this.logs = this.logs.slice(-this.maxLogs);
}
// 控制台输出(生产环境可以关闭)
console[level](`[${entry.timestamp.toISOString()}] ${level.toUpperCase()}: ${message}`, context || '');
}
getLogs(filter?: { level?: LogEntry['level']; since?: Date }): LogEntry[] {
let filtered = this.logs;
if (filter?.level) {
filtered = filtered.filter(log => log.level === filter.level);
}
if (filter?.since) {
filtered = filtered.filter(log => log.timestamp >= filter.since!);
}
return filtered;
}
clear(): void {
this.logs = [];
}
}
7. 常见问题与解决方案
7.1 权限配置问题
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 工具调用被拒绝 | 权限策略配置过严 | 检查security.enablePermissions设置,适当放宽策略 |
| 并发工具执行失败 | 并发限制设置过低 | 调整security.maxConcurrentTools参数 |
| API调用超时 | 网络问题或配置超时时间过短 | 检查网络连接,增加performance.timeoutMs |
7.2 性能优化问题
// 性能问题诊断工具
class PerformanceDiagnostic {
static async measurePerformance<T>(
operation: () => Promise<T>,
operationName: string
): Promise<{ result: T; duration: number }> {
const start = performance.now();
const result = await operation();
const duration = performance.now() - start;
Logger.getInstance().info(`操作 ${operationName} 耗时: ${duration}ms`);
if (duration > 1000) {
Logger.getInstance().warn(`操作 ${operationName} 执行较慢`, { duration });
}
return { result, duration };
}
static analyzeMemoryUsage(): NodeJS.MemoryUsage {
const usage = process.memoryUsage();
Logger.getInstance().info('内存使用情况', {
heapUsed: `${Math.round(usage.heapUsed / 1024 / 1024)}MB`,
heapTotal: `${Math.round(usage.heapTotal / 1024 / 1024)}MB`,
external: `${Math.round(usage.external / 1024 / 1024)}MB`
});
return usage;
}
}
7.3 配置管理最佳实践
- 环境隔离 :为开发、测试、生产环境使用不同的配置文件
- 敏感信息管理 :API密钥等敏感信息使用环境变量而非配置文件
- 配置验证 :使用Zod等工具进行配置schema验证
- 热重载支持 :实现配置热重载,避免重启服务
// 配置热重载实现
class HotConfigManager extends ConfigManager {
private watcher: any;
constructor(configPath: string) {
super(configPath);
this.setupFileWatcher();
}
private setupFileWatcher(): void {
if (typeof require !== 'undefined') {
const fs = require('fs');
this.watcher = fs.watch(this.configPath, (eventType: string) => {
if (eventType === 'change') {
console.log('配置文件变更,重新加载...');
this.reloadConfig();
}
});
}
}
private reloadConfig(): void {
try {
const oldConfig = this.config;
this.config = this.loadConfig();
this.emitConfigChange(oldConfig, this.config);
} catch (error) {
console.error('配置重载失败:', error);
}
}
private emitConfigChange(oldConfig: AppConfig, newConfig: AppConfig): void {
// 通知相关组件配置变更
Logger.getInstance().info('配置已更新');
}
destroy(): void {
if (this.watcher) {
this.watcher.close();
}
}
}
通过本文的完整实战教程,你应该已经掌握了AI工程化的核心概念和Agent Harness的架构设计。从基础的环境搭建到完整的生产级系统实现,这些知识将帮助你在实际项目中构建可靠、高效的AI Agent系统。
关键是要理解架构设计背后的原理,而不仅仅是API的使用。只有这样,才能根据具体业务需求进行定制和优化,真正发挥AI工程化的价值。建议从简单的代码生成Agent开始实践,逐步扩展到更复杂的多Agent协作系统。
更多推荐


所有评论(0)