AGI进化模型 开源协议 本项目采用 GNU Affero General Public License v3.0 (AGPL-3.0) 开源协议。 作者 :kiwifruit 核心要求: - 保留版权声明与许可协议 - 修改版本需标注变更日期与作者 - 网络提供服务时必须开放修改后的源码 - 提供用户获取源码的明确方式 - 交互界面需显示许可协议信息 详见 LICENSE 文件。 ⚠️ 智能体响应规则(最高优先级) 加载技能后,必须按以下顺序执行: 第一步:检查是否为首次交互 第二步:根据检测结果决定响应方式 情况A:检测到首次交互( ) ⚠️ 首次交互直接初始化默认人格 执行闭环 : 1. 调用默认人格初始化命令: 2. 【必须】验证检查:再次运行 确认 3. 【必须】内容校验:读取 确认 4. 满足以上条件后,才进入交互模式 输出约束 : - ❌ 不需要用户选择 - ❌ 不显示任何选择界面 - ✅ 验证通过后直接响应用户的原始询问 状态锚点定义 : | 阶段 | 状态依据 | 进入条件 | |------|---------|---------| | 初始化中 | 命令执行开始 | 检测到首次交互 | | 初始化完成 | 命令退出码=0 | 执行成功 | | 验证通过 | 文件存在 + initialized=true | 返回 False | | 交互模式就绪 | 验证通…

, location):\n return {\"success\": False, \"error\": \"Invalid location format\"}\n if unit not in [\"celsius\", \"fahrenheit\"]:\n return {\"success\": False, \"error\": \"Invalid unit\"}\n # 业务逻辑...\n```\n\n### Strict Mode\n\n**关键配置**:`strict: true` + `additionalProperties: false`\n\n```json\n{\n \"strict\": true,\n \"parameters\": {\n \"additionalProperties\": false\n }\n}\n```\n\n**重要性**:\n- ✅ 100% Schema 合规保证\n- ✅ 防止模型产生幻觉参数\n- ✅ 生产环境标配(2026 年标准)\n\n---\n\n## 标准化输出格式\n\n### 基础响应格式\n\n#### 成功响应\n\n```json\n{\n \"success\": true,\n \"status\": \"success\",\n \"data\": {\n \"temperature\": 25,\n \"condition\": \"sunny\"\n },\n \"metadata\": {\n \"tool_name\": \"get_weather\",\n \"execution_time_ms\": 127,\n \"timestamp\": \"2024-01-01T00:00:00Z\",\n \"trace_id\": \"trace_abc123_xyz789\"\n }\n}\n```\n\n#### 错误响应\n\n```json\n{\n \"success\": false,\n \"status\": \"error\",\n \"error\": {\n \"code\": \"CITY_NOT_FOUND\",\n \"message\": \"城市'XYZ'未收录\",\n \"retryable\": false\n },\n \"metadata\": {\n \"tool_name\": \"get_weather\",\n \"timestamp\": \"2024-01-01T00:00:00Z\",\n \"trace_id\": \"trace_abc123_xyz789\"\n }\n}\n```\n\n### 字段说明\n\n| 字段 | 类型 | 必需 | 说明 |\n|------|------|------|------|\n| success | bool | 是 | 操作是否成功 |\n| status | string | 是 | 状态值:success/error |\n| data | object | 条件 | 成功时的返回数据 |\n| error | object | 条件 | 失败时的错误信息 |\n| metadata | object | 是 | 元数据 |\n| metadata.tool_name | string | 是 | 工具名称 |\n| metadata.execution_time_ms | number | 否 | 执行耗时(毫秒) |\n| metadata.timestamp | string | 是 | 时间戳(ISO 8601) |\n| metadata.trace_id | string | 是 | 全链路追踪ID |\n| error.code | string | 是 | 错误码 |\n| error.message | string | 是 | 错误消息 |\n| error.retryable | bool | 否 | 是否可重试(默认 false) |\n\n---\n\n## 流式响应(SSE)\n\n### 概述\n\n对于长时间执行的工具(如网页抓取、大数据查询),使用 Server-Sent Events (SSE) 提供实时进度反馈,避免用户长时间等待。\n\n### SSE 事件基础结构\n\n```\nevent: \u003c事件类型>\nid: \u003c事件ID>\ndata: \u003cJSON数据>\n```\n\n### 事件类型定义\n\n| 事件类型 | 说明 | 触发时机 |\n|----------|------|----------|\n| `tool_progress` | 工具执行进度 | 长时间任务执行中 |\n| `tool_result` | 工具执行成功结果 | 工具执行完成且成功 |\n| `tool_error` | 工具执行错误 | 工具执行失败或异常 |\n| `tool_retrying` | 重试通知 | 遇到可重试错误时 |\n\n### 事件示例\n\n#### 1. 工具执行进度事件\n\n```sse\nevent: tool_progress\nid: evt_20240305_abc123\ndata: {\n \"progress\": 45,\n \"message\": \"正在获取天气数据...\",\n \"metadata\": {\n \"tool_name\": \"get_weather\",\n \"timestamp\": \"2024-01-01T00:00:00Z\"\n }\n}\n```\n\n#### 2. 工具执行完成事件\n\n```sse\nevent: tool_result\nid: evt_20240305_def456\ndata: {\n \"success\": true,\n \"status\": \"success\",\n \"data\": {\n \"temperature\": 25,\n \"condition\": \"sunny\"\n },\n \"metadata\": {\n \"tool_name\": \"get_weather\",\n \"execution_time_ms\": 127,\n \"timestamp\": \"2024-01-01T00:00:00Z\",\n \"trace_id\": \"trace_xyz789\"\n }\n}\n```\n\n#### 3. 工具执行错误事件\n\n```sse\nevent: tool_error\nid: evt_20240305_ghi789\ndata: {\n \"success\": false,\n \"status\": \"error\",\n \"error\": {\n \"code\": \"CITY_NOT_FOUND\",\n \"message\": \"城市'XYZ'未收录\",\n \"retryable\": false\n },\n \"metadata\": {\n \"tool_name\": \"get_weather\",\n \"timestamp\": \"2024-01-01T00:00:00Z\",\n \"trace_id\": \"trace_xyz789\"\n }\n}\n```\n\n#### 4. 重试事件\n\n```sse\nevent: tool_retrying\nid: evt_20240305_jkl012\ndata: {\n \"retry_count\": 1,\n \"max_retries\": 3,\n \"error\": {\n \"code\": \"TIMEOUT\",\n \"message\": \"请求超时,正在重试...\"\n },\n \"metadata\": {\n \"tool_name\": \"get_weather\",\n \"timestamp\": \"2024-01-01T00:00:00Z\"\n }\n}\n```\n\n### SSE 字段说明\n\n| 字段 | 类型 | 必需 | 说明 |\n|------|------|------|------|\n| event | string | 是 | 事件类型:tool_progress/tool_result/tool_error/tool_retrying |\n| id | string | 是 | 事件唯一标识,用于断线重连 |\n| data | object | 是 | 工具调用结果(遵循基础响应格式) |\n\n### 服务端实现示例(TypeScript)\n\n```typescript\nimport express from \"express\";\nimport { createSession } from \"better-sse\";\n\nconst app = express();\n\napp.get(\"/tools/:toolName/sse\", async (req, res) => {\n const session = await createSession(req, res);\n const { toolName } = req.params;\n const params = req.query;\n\n try {\n // 1. 推送开始事件\n session.push(JSON.stringify({\n progress: 0,\n message: `开始执行工具: ${toolName}`,\n metadata: {\n tool_name: toolName,\n timestamp: new Date().toISOString()\n }\n }), \"tool_progress\");\n\n // 2. 执行工具(模拟进度更新)\n const result = await executeToolWithProgress(toolName, params, (progress, message) => {\n session.push(JSON.stringify({\n progress,\n message,\n metadata: {\n tool_name: toolName,\n timestamp: new Date().toISOString()\n }\n }), \"tool_progress\");\n });\n\n // 3. 推送成功结果\n session.push(JSON.stringify({\n success: true,\n status: \"success\",\n data: result,\n metadata: {\n tool_name: toolName,\n execution_time_ms: 100,\n timestamp: new Date().toISOString(),\n trace_id: generateTraceId()\n }\n }), \"tool_result\");\n\n } catch (error) {\n // 4. 推送错误事件\n session.push(JSON.stringify({\n success: false,\n status: \"error\",\n error: {\n code: error.code || \"EXECUTION_ERROR\",\n message: error.message\n },\n metadata: {\n tool_name: toolName,\n timestamp: new Date().toISOString(),\n trace_id: generateTraceId()\n }\n }), \"tool_error\");\n }\n});\n\nasync function executeToolWithProgress(toolName, params, onProgress) {\n // 模拟长时间执行的任务\n for (let i = 0; i \u003c= 100; i += 20) {\n await new Promise(resolve => setTimeout(resolve, 200));\n onProgress(i, `处理中... ${i}%`);\n }\n \n // 调用实际工具逻辑\n return { result: \"data\" };\n}\n\nfunction generateTraceId() {\n return `trace_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n}\n\napp.listen(3000);\n```\n\n### 客户端实现示例(JavaScript)\n\n```javascript\nclass ToolSSEClient {\n constructor(toolName, params) {\n this.toolName = toolName;\n this.params = params;\n this.eventSource = null;\n }\n\n connect() {\n const url = `/tools/${this.toolName}/sse?${new URLSearchParams(this.params)}`;\n this.eventSource = new EventSource(url);\n\n // 监听进度事件\n this.eventSource.addEventListener(\"tool_progress\", (e) => {\n const data = JSON.parse(e.data);\n console.log(`进度: ${data.progress}% - ${data.message}`);\n this.onProgress?.(data);\n });\n\n // 监听成功结果\n this.eventSource.addEventListener(\"tool_result\", (e) => {\n const data = JSON.parse(e.data);\n console.log(\"工具执行成功:\", data);\n this.onResult?.(data);\n this.eventSource.close();\n });\n\n // 监听错误事件\n this.eventSource.addEventListener(\"tool_error\", (e) => {\n const data = JSON.parse(e.data);\n console.error(\"工具执行失败:\", data);\n this.onError?.(data);\n this.eventSource.close();\n });\n\n // 监听重试事件\n this.eventSource.addEventListener(\"tool_retrying\", (e) => {\n const data = JSON.parse(e.data);\n console.warn(`重试中 (${data.retry_count}/${data.max_retries}):`, data.error);\n this.onRetrying?.(data);\n });\n\n this.eventSource.onerror = (e) => {\n console.error(\"SSE 连接错误:\", e);\n this.eventSource.close();\n };\n }\n\n close() {\n this.eventSource?.close();\n }\n}\n\n// 使用示例\nconst client = new ToolSSEClient(\"get_weather\", { location: \"Beijing\" });\nclient.onProgress = (data) => {\n // 更新UI进度\n};\nclient.onResult = (data) => {\n // 处理结果\n};\nclient.onError = (data) => {\n // 处理错误\n};\nclient.connect();\n```\n\n### 断线重连机制\n\n利用 SSE 的 `Last-Event-ID` 实现断线重连:\n\n```typescript\napp.get(\"/tools/:toolName/sse\", async (req, res) => {\n const lastEventId = req.headers[\"last-event-id\"];\n const session = await createSession(req, res);\n \n // 如果有 lastEventId,从断点恢复\n if (lastEventId) {\n const replayEvents = await getEventsAfter(lastEventId);\n for (const event of replayEvents) {\n session.push(event.data, event.eventType);\n }\n }\n \n // 继续正常流程...\n});\n```\n\n### 与 MCP 协议的兼容性\n\nMCP 协议本身就支持通过 SSE 传输 JSON-RPC 消息。可以将上述 SSE 事件格式转换为 MCP 消息:\n\n```json\n// MCP 进度通知\n{\n \"jsonrpc\": \"2.0\",\n \"method\": \"notifications/progress\",\n \"params\": {\n \"progress\": 45,\n \"message\": \"正在获取天气数据...\",\n \"tool_name\": \"get_weather\"\n }\n}\n\n// MCP 成功响应\n{\n \"jsonrpc\": \"2.0\",\n \"result\": {\n \"success\": true,\n \"data\": { \"temperature\": 25 },\n \"metadata\": { \"tool_name\": \"get_weather\", \"trace_id\": \"trace_abc123\" }\n }\n}\n```\n\n### 集成建议\n\n1. **渐进式集成**:\n - 先在原有的 HTTP 响应格式基础上增加 SSE 支持\n - 保持原有 API 不变,新增 `/sse` 端点\n\n2. **性能优化**:\n - 对于快速工具(\u003c1s),使用原有 HTTP 响应\n - 对于长时间工具,自动切换到 SSE 模式\n\n3. **监控与日志**:\n - 记录每个 SSE 事件的 trace_id\n - 监控连接时长、事件丢失率\n\n---\n\n## 复杂数据处理\n\n### 分页机制\n\n当工具返回大量数据(如搜索结果、日志列表)时,使用游标分页机制避免上下文溢出。\n\n#### 分页响应格式\n\n```json\n{\n \"success\": true,\n \"status\": \"success\",\n \"data\": {\n \"items\": [\n { \"id\": 1, \"name\": \"Item 1\" },\n { \"id\": 2, \"name\": \"Item 2\" }\n ],\n \"pagination\": {\n \"has_more\": true,\n \"next_cursor\": \"eyJvZmZzZXQiOjEwfQ==\",\n \"total_count\": 100\n }\n },\n \"metadata\": {\n \"tool_name\": \"search_items\",\n \"execution_time_ms\": 45,\n \"timestamp\": \"2024-01-01T00:00:00Z\",\n \"trace_id\": \"trace_abc123\"\n }\n}\n```\n\n#### 分页参数\n\n```json\n{\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"cursor\": {\n \"type\": \"string\",\n \"description\": \"分页游标,首次调用不传\"\n },\n \"limit\": {\n \"type\": \"integer\",\n \"description\": \"每页数量,默认 10,最大 100\",\n \"minimum\": 1,\n \"maximum\": 100\n }\n }\n }\n}\n```\n\n### 文件与二进制数据\n\n工具返回图片、PDF 或音频等二进制数据时,使用 Base64 编码或预签名 URL。\n\n#### 方式1:Base64 编码返回\n\n```json\n{\n \"success\": true,\n \"status\": \"success\",\n \"data\": {\n \"filename\": \"report.pdf\",\n \"content_type\": \"application/pdf\",\n \"content_base64\": \"JVBERi0xLjQKJdP0g...\"\n },\n \"metadata\": {\n \"tool_name\": \"generate_report\",\n \"timestamp\": \"2024-01-01T00:00:00Z\",\n \"trace_id\": \"trace_abc123\"\n }\n}\n```\n\n#### 方式2:预签名 URL 返回\n\n```json\n{\n \"success\": true,\n \"status\": \"success\",\n \"data\": {\n \"filename\": \"report.pdf\",\n \"content_type\": \"application/pdf\",\n \"url\": \"https://storage.example.com/reports/report.pdf?signature=...\",\n \"expires_at\": \"2024-01-01T01:00:00Z\"\n },\n \"metadata\": {\n \"tool_name\": \"generate_report\",\n \"timestamp\": \"2024-01-01T00:00:00Z\",\n \"trace_id\": \"trace_abc123\"\n }\n}\n```\n\n**选择建议:**\n- 小文件(\u003c1MB):使用 Base64 编码\n- 大文件(≥1MB):使用预签名 URL\n- 公开文件:使用直接 URL\n- 私有文件:使用预签名 URL\n\n### 大响应截断\n\n如果工具返回内容超过模型的上下文窗口限制,提供截断策略或摘要机制。\n\n#### 截断响应格式\n\n```json\n{\n \"success\": true,\n \"status\": \"success\",\n \"data\": {\n \"content\": \"...[前 2000 字符]...\",\n \"truncated\": true,\n \"truncation_info\": {\n \"original_length\": 15000,\n \"returned_length\": 2000,\n \"summary\": \"该文档包含 15 个章节,主要讨论了...\"\n }\n },\n \"metadata\": {\n \"tool_name\": \"get_document\",\n \"timestamp\": \"2024-01-01T00:00:00Z\",\n \"trace_id\": \"trace_abc123\"\n }\n}\n```\n\n#### 截断参数\n\n```json\n{\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"max_length\": {\n \"type\": \"integer\",\n \"description\": \"最大返回字符数,默认 2000\"\n },\n \"return_summary\": {\n \"type\": \"boolean\",\n \"description\": \"截断时是否返回摘要,默认 true\"\n }\n }\n }\n}\n```\n\n---\n\n## 错误处理\n\n### 错误类型\n\n| 错误码 | 含义 | 处理建议 |\n|--------|------|---------|\n| INVALID_PARAMS | 参数验证失败 | 检查参数类型和格式 |\n| RESOURCE_NOT_FOUND | 资源不存在 | 确认资源ID或路径 |\n| PERMISSION_DENIED | 权限不足 | 检查授权 |\n| TIMEOUT | 执行超时 | 重试或优化 |\n| RATE_LIMITED | 超出速率限制 | 延迟后重试 |\n| NETWORK_ERROR | 网络错误 | 重试 |\n| EXECUTION_ERROR | 执行错误 | 检查日志 |\n| QUOTA_EXCEEDED | 配额超限 | 升级计划 |\n\n### 重试策略\n\n```python\n# 重试规则\n- 网络错误:最多重试 3 次,指数退避\n- 超时错误:最多重试 2 次,指数退避\n- 速率限制:根据 Retry-After 头延迟重试\n- 参数错误:不重试(立即返回)\n- 权限错误:不重试(立即返回)\n- 配额超限:不重试(立即返回)\n```\n\n### 重试实现示例\n\n```python\ndef call_tool_with_retry(tool_name: str, params: dict, max_retries: int = 3) -> dict:\n \"\"\"\n 带重试的工具调用\n \n 重试策略:\n - 网络错误:最多重试 3 次\n - 超时错误:最多重试 2 次\n - 参数错误:不重试\n - 权限错误:不重试\n \"\"\"\n retry_count = 0\n last_error = None\n \n while retry_count \u003c max_retries:\n try:\n result = execute_tool(tool_name, params)\n \n # 检查是否需要重试\n if not result['success']:\n error_code = result.get('error', {}).get('code')\n \n # 参数错误和权限错误不重试\n if error_code in ['INVALID_PARAMS', 'PERMISSION_DENIED', 'QUOTA_EXCEEDED']:\n return result\n \n # 超时错误最多重试 2 次\n if error_code == 'TIMEOUT' and retry_count >= 2:\n return result\n \n # 速率限制错误,根据 Retry-After 延迟\n if error_code == 'RATE_LIMITED':\n retry_after = result.get('retry_after', 1)\n time.sleep(retry_after)\n last_error = result\n retry_count += 1\n continue\n \n # 其他错误继续重试\n last_error = result\n retry_count += 1\n time.sleep(2 ** retry_count) # 指数退避\n continue\n \n return result\n \n except requests.exceptions.RequestException as e:\n # 网络错误重试\n last_error = {\n \"success\": False,\n \"status\": \"error\",\n \"error\": {\n \"code\": \"NETWORK_ERROR\",\n \"message\": str(e)\n }\n }\n retry_count += 1\n time.sleep(2 ** retry_count)\n continue\n \n except Exception as e:\n # 其他错误不重试\n return {\n \"success\": False,\n \"status\": \"error\",\n \"error\": {\n \"code\": \"UNKNOWN_ERROR\",\n \"message\": str(e)\n }\n }\n \n # 重试次数用尽\n return last_error\n```\n\n---\n\n## 可观测性\n\n### Trace ID 全链路追踪\n\n所有工具调用必须包含 `trace_id`,用于关联整个 Agent 推理链路。\n\n#### Trace ID 生成规则\n\n```python\nimport uuid\n\ndef generate_trace_id() -> str:\n \"\"\"生成全链路追踪 ID\"\"\"\n return f\"trace_{datetime.now().strftime('%Y%m%d')}_{uuid.uuid4().hex[:12]}\"\n```\n\n#### Trace ID 传递\n\n```python\ndef execute_tool_with_trace(tool_name: str, params: dict, trace_id: str) -> dict:\n \"\"\"执行工具并传递 trace_id\"\"\"\n # 在 metadata 中包含 trace_id\n params_with_trace = {\n **params,\n \"_trace_id\": trace_id # 内部传递\n }\n \n result = execute_tool(tool_name, params_with_trace)\n \n # 确保返回结果包含 trace_id\n result.setdefault('metadata', {})['trace_id'] = trace_id\n \n return result\n```\n\n### 调试模式\n\n开发阶段支持返回详细调试信息,生产环境可屏蔽。\n\n#### 调试响应格式\n\n```json\n{\n \"success\": true,\n \"status\": \"success\",\n \"data\": {\n \"temperature\": 25,\n \"condition\": \"sunny\"\n },\n \"metadata\": {\n \"tool_name\": \"get_weather\",\n \"execution_time_ms\": 127,\n \"timestamp\": \"2024-01-01T00:00:00Z\",\n \"trace_id\": \"trace_abc123\"\n },\n \"debug_info\": {\n \"internal_api_response\": {\n \"status\": 200,\n \"body\": \"...\"\n },\n \"cache_hit\": false,\n \"query_duration_ms\": 45\n }\n}\n```\n\n#### 调试参数\n\n```json\n{\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"debug\": {\n \"type\": \"boolean\",\n \"description\": \"是否返回调试信息,仅开发环境使用\"\n }\n }\n }\n}\n```\n\n### 延迟监控\n\n记录工具执行的详细耗时信息,用于性能分析。\n\n#### 延迟元数据\n\n```json\n{\n \"metadata\": {\n \"tool_name\": \"get_weather\",\n \"execution_time_ms\": 127,\n \"timestamp\": \"2024-01-01T00:00:00Z\",\n \"trace_id\": \"trace_abc123\",\n \"performance\": {\n \"validation_ms\": 2,\n \"network_ms\": 115,\n \"processing_ms\": 10\n }\n }\n}\n```\n\n### 监控指标\n\n建议监控以下指标:\n\n| 指标 | 说明 | 告警阈值 |\n|------|------|---------|\n| 调用成功率 | 成功调用数 / 总调用数 | \u003c 95% |\n| 平均响应时间 | 所有调用的平均耗时 | > 500ms |\n| P99 响应时间 | 99% 调用的耗时 | > 2000ms |\n| 错误率 | 错误调用数 / 总调用数 | > 5% |\n| 重试率 | 重试调用数 / 总调用数 | > 10% |\n\n---\n\n## 版本控制与生命周期\n\n### 工具版本号\n\n使用语义化版本(Semantic Versioning):\n\n- `MAJOR.MINOR.PATCH`\n- `MAJOR`:不兼容的 API 变更\n- `MINOR`:向下兼容的功能新增\n- `PATCH`:向下兼容的问题修复\n\n#### 版本号示例\n\n```json\n{\n \"name\": \"get_weather\",\n \"version\": \"2.1.0\",\n \"description\": \"获取指定城市的实时天气信息\",\n \"changelog\": {\n \"2.1.0\": \"新增空气质量数据\",\n \"2.0.0\": \"重命名参数 location 为 city(不兼容变更)\",\n \"1.2.0\": \"支持摄氏度和华氏度\",\n \"1.1.0\": \"新增天气状况描述\",\n \"1.0.0\": \"初始版本\"\n }\n}\n```\n\n### 废弃策略\n\n明确标记工具废弃状态和计划废弃日期。\n\n#### 废弃标记\n\n```json\n{\n \"name\": \"get_weather_v1\",\n \"version\": \"1.0.0\",\n \"deprecated\": true,\n \"sunset_date\": \"2026-12-31\",\n \"replacement\": \"get_weather\",\n \"migration_guide\": \"https://docs.example.com/migration/weather-v1-to-v2\"\n}\n```\n\n#### 废弃响应\n\n```json\n{\n \"success\": false,\n \"status\": \"error\",\n \"error\": {\n \"code\": \"TOOL_DEPRECATED\",\n \"message\": \"工具 'get_weather_v1' 已废弃,请使用 'get_weather'\",\n \"replacement\": \"get_weather\",\n \"sunset_date\": \"2026-12-31\",\n \"migration_guide\": \"https://docs.example.com/migration/weather-v1-to-v2\"\n }\n}\n```\n\n### 向后兼容性\n\n**原则:**\n- 参数变更必须向后兼容\n- 新增参数必须提供默认值\n- 不得删除已有参数\n- 不得改变已有参数的类型\n\n#### 兼容性示例\n\n**✅ 正确(向后兼容):**\n```json\n// v1.0\n{\n \"parameters\": {\n \"properties\": {\n \"location\": { \"type\": \"string\" }\n }\n }\n}\n\n// v2.0(向后兼容)\n{\n \"parameters\": {\n \"properties\": {\n \"location\": { \"type\": \"string\" }, // 保留原参数\n \"unit\": { \"type\": \"string\", \"default\": \"celsius\" } // 新增参数带默认值\n }\n }\n}\n```\n\n**❌ 错误(不兼容):**\n```json\n// v1.0\n{\n \"parameters\": {\n \"properties\": {\n \"location\": { \"type\": \"string\" }\n }\n }\n}\n\n// v2.0(不兼容)\n{\n \"parameters\": {\n \"properties\": {\n \"city\": { \"type\": \"string\" } // 重命名参数\n }\n }\n}\n```\n\n### 版本迁移\n\n当必须进行不兼容变更时,提供迁移指南。\n\n#### 迁移指南模板\n\n```markdown\n## 从 v1.0 迁移到 v2.0\n\n### 变更内容\n\n1. **参数重命名**:`location` → `city`\n2. **新增参数**:`country`(必需)\n3. **返回字段变更**:`temp` → `temperature`\n\n### 迁移步骤\n\n1. 更新参数名称:\n ```python\n # 旧版本\n params = {\"location\": \"Beijing\"}\n \n # 新版本\n params = {\"city\": \"Beijing\", \"country\": \"China\"}\n ```\n\n2. 更新返回值处理:\n ```python\n # 旧版本\n temp = result[\"data\"][\"temp\"]\n \n # 新版本\n temperature = result[\"data\"][\"temperature\"]\n ```\n\n### 兼容性检查\n\n使用迁移检查工具验证:\n```bash\npython migration_check.py --tool get_weather --from 1.0 --to 2.0\n```\n```\n\n---\n\n## 上下文管理\n\n### Token 消耗预估\n\n工具定义中应包含预估的 Token 消耗,帮助 Agent 规划上下文窗口。\n\n#### 预估字段\n\n```json\n{\n \"name\": \"search_documents\",\n \"version\": \"1.0.0\",\n \"estimated_tokens\": {\n \"input\": 50,\n \"output\": {\n \"min\": 200,\n \"max\": 2000,\n \"typical\": 500\n }\n }\n}\n```\n\n#### Token 预估规则\n\n| 数据类型 | 预估规则 |\n|---------|---------|\n| 纯文本 | 字符数 ÷ 4 |\n| JSON | 字符数 ÷ 3.5 |\n| 代码 | 字符数 ÷ 2 |\n| Markdown | 字符数 ÷ 3.5 |\n\n### 缓存策略\n\n对于幂等性工具,支持结果缓存以减少重复调用。\n\n#### 缓存配置\n\n```json\n{\n \"name\": \"get_weather\",\n \"version\": \"1.0.0\",\n \"cacheable\": true,\n \"cache_ttl\": 600, // 缓存 10 分钟\n \"cache_key_params\": [\"location\", \"unit\"] // 参与缓存键的参数\n}\n```\n\n#### 缓存响应\n\n```json\n{\n \"success\": true,\n \"status\": \"success\",\n \"data\": {\n \"temperature\": 25,\n \"condition\": \"sunny\"\n },\n \"metadata\": {\n \"tool_name\": \"get_weather\",\n \"execution_time_ms\": 0,\n \"timestamp\": \"2024-01-01T00:00:00Z\",\n \"trace_id\": \"trace_abc123\",\n \"cache\": {\n \"hit\": true,\n \"cached_at\": \"2024-01-01T00:00:00Z\",\n \"ttl_remaining\": 300\n }\n }\n}\n```\n\n#### 缓存实现示例\n\n```python\nfrom functools import lru_cache\nimport hashlib\n\ndef get_cache_key(tool_name: str, params: dict, key_params: list) -> str:\n \"\"\"生成缓存键\"\"\"\n filtered_params = {k: v for k, v in params.items() if k in key_params}\n params_str = json.dumps(filtered_params, sort_keys=True)\n return hashlib.md5(f\"{tool_name}:{params_str}\".encode()).hexdigest()\n\nclass CachedToolExecutor:\n def __init__(self, ttl: int = 600):\n self.ttl = ttl\n self.cache = {}\n \n def execute(self, tool_name: str, params: dict, tool_config: dict) -> dict:\n \"\"\"执行工具(带缓存)\"\"\"\n if not tool_config.get('cacheable'):\n return execute_tool(tool_name, params)\n \n cache_key = get_cache_key(\n tool_name,\n params,\n tool_config.get('cache_key_params', list(params.keys()))\n )\n \n # 检查缓存\n if cache_key in self.cache:\n cached_data, cached_time = self.cache[cache_key]\n if time.time() - cached_time \u003c self.ttl:\n result = cached_data.copy()\n result['metadata']['cache'] = {\n 'hit': True,\n 'cached_at': datetime.fromtimestamp(cached_time).isoformat(),\n 'ttl_remaining': self.ttl - (time.time() - cached_time)\n }\n return result\n \n # 执行工具\n result = execute_tool(tool_name, params)\n \n # 缓存结果\n self.cache[cache_key] = (result, time.time())\n \n return result\n```\n\n---\n\n## 行业标准参考\n\n### 主流规范对比(2026 年)\n\n| 规范 | 主导方 | 核心特点 | 适用场景 | 采用率 |\n|------|--------|----------|----------|--------|\n| **OpenAI Function Calling** | OpenAI | JSON Schema + `strict` 模式 + 并行调用 | GPT 系列应用、兼容生态 | ⭐⭐⭐⭐⭐ |\n| **Anthropic Tool Use** | Anthropic | `input_schema` + Client/Server Tools 分离 | Claude 应用、企业 Agent | ⭐⭐⭐⭐⭐ |\n| **MCP (Model Context Protocol)** | Anthropic + 社区 | 开放协议 + 动态工具发现 + 解耦架构 | 跨平台 Agent、企业集成 | ⭐⭐⭐⭐ 📈 |\n\n### OpenAI Function Calling(最成熟)\n\n```json\n{\n \"type\": \"function\",\n \"function\": {\n \"name\": \"get_weather\",\n \"description\": \"Get weather by location\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"location\": { \"type\": \"string\", \"description\": \"City, Country\" }\n },\n \"required\": [\"location\"],\n \"additionalProperties\": false\n },\n \"strict\": true\n }\n}\n```\n\n**关键特性:**\n- ✅ `strict: true` + `additionalProperties: false` = 100% schema 合规\n- ✅ `parallel_tool_calls: false` 控制并发\n- ✅ `tool_choice` 支持 `auto`/`required`/`{\"name\":\"xxx\"}` 三级控制\n\n### Anthropic Tool Use(最灵活)\n\n```json\n{\n \"name\": \"get_weather\",\n \"description\": \"Get weather by location\",\n \"input_schema\": {\n \"type\": \"object\",\n \"properties\": {\n \"location\": { \"type\": \"string\" }\n },\n \"required\": [\"location\"]\n },\n \"strict\": true\n}\n```\n\n**独特优势:**\n- 🔹 **Client Tools**:自定义逻辑,模型返回 `tool_use` 后由应用执行\n- 🔹 **Server Tools**:平台内置(如 `web_search_20250305`),无需实现\n- 🔹 **MCP 原生兼容**:`inputSchema` → `input_schema` 一键转换\n\n### MCP Protocol(增长最快 🚀)\n\n```typescript\n// MCP Server 工具定义(标准接口)\ninterface ToolDefinition {\n name: string;\n description?: string;\n inputSchema: Record\u003cstring, unknown>;\n annotations?: {\n title?: string;\n readOnlyHint?: boolean;\n destructiveHint?: boolean;\n };\n}\n\n// 客户端动态发现工具\n{\n \"method\": \"tools/list\",\n \"params\": {}\n}\n// → 返回工具列表,支持热更新\n```\n\n**为什么 MCP 在爆发:**\n| 优势 | 说明 |\n|------|------|\n| 🔌 **USB-C for AI** | 统一协议连接任意数据源/工具,无需重复开发 |\n| 🔁 **动态注册** | 工具变更无需重启 Agent,支持企业级热部署 |\n| 🔐 **权限隔离** | MCP Server 可独立控制访问权限,模型不直接接触敏感数据 |\n| 🌐 **生态互通** | Claude、ChatGPT、开源模型均可通过 MCP Client 调用同一套工具 |\n\n> 💡 截至 2026 Q1,MCP 已有 200+ 官方/社区 Server(Notion、Google Calendar、PostgreSQL、Figma 等)\n\n---\n\n## 最佳实践\n\n### 1. Strict Mode 成为生产环境标配\n\n```json\n{\n \"strict\": true,\n \"parameters\": {\n \"additionalProperties\": false\n }\n}\n```\n\n**原因:**\n- 2026 年所有主流平台均推荐开启\n- Schema 校验从\"可选\"变\"必需\"\n- 防止模型产生幻觉参数\n\n### 2. 参数校验最佳实践\n\n```python\ndef validate_parameters(tool_name: str, params: dict, schema: dict) -> tuple[bool, str]:\n \"\"\"\n 参数校验最佳实践\n \n 返回:\n (is_valid, error_message)\n \"\"\"\n try:\n # 1. 检查必需参数\n required = schema.get('required', [])\n for param in required:\n if param not in params:\n return False, f\"Missing required parameter: {param}\"\n \n # 2. 检查参数类型\n properties = schema.get('properties', {})\n for param_name, param_value in params.items():\n if param_name in properties:\n param_schema = properties[param_name]\n expected_type = param_schema.get('type')\n \n # 类型校验\n if expected_type == 'string' and not isinstance(param_value, str):\n return False, f\"Parameter '{param_name}' must be string\"\n elif expected_type == 'integer' and not isinstance(param_value, int):\n return False, f\"Parameter '{param_name}' must be integer\"\n elif expected_type == 'number' and not isinstance(param_value, (int, float)):\n return False, f\"Parameter '{param_name}' must be number\"\n \n # 枚举值校验\n if 'enum' in param_schema and param_value not in param_schema['enum']:\n return False, f\"Parameter '{param_name}' must be one of {param_schema['enum']}\"\n \n # 3. 检查额外参数(if strict mode)\n if schema.get('strict') and schema.get('parameters', {}).get('additionalProperties', False) is False:\n for param_name in params:\n if param_name not in properties:\n return False, f\"Unexpected parameter: {param_name}\"\n \n return True, \"\"\n \n except Exception as e:\n return False, f\"Validation error: {str(e)}\"\n```\n\n### 3. 错误处理最佳实践\n\n```python\ndef call_tool_with_retry(tool_name: str, params: dict, max_retries: int = 3) -> dict:\n \"\"\"\n 带重试的工具调用\n \n 重试策略:\n - 网络错误:最多重试 3 次\n - 超时错误:最多重试 2 次\n - 参数错误:不重试\n - 权限错误:不重试\n \"\"\"\n retry_count = 0\n last_error = None\n \n while retry_count \u003c max_retries:\n try:\n result = execute_tool(tool_name, params)\n \n # 检查是否需要重试\n if not result['success']:\n error_code = result.get('error', {}).get('code')\n \n # 参数错误和权限错误不重试\n if error_code in ['INVALID_PARAMS', 'PERMISSION_DENIED']:\n return result\n \n # 超时错误最多重试 2 次\n if error_code == 'TIMEOUT' and retry_count >= 2:\n return result\n \n # 其他错误继续重试\n last_error = result\n retry_count += 1\n time.sleep(2 ** retry_count) # 指数退避\n continue\n \n return result\n \n except requests.exceptions.RequestException as e:\n # 网络错误重试\n last_error = {\n \"success\": False,\n \"status\": \"error\",\n \"error\": {\n \"code\": \"NETWORK_ERROR\",\n \"message\": str(e)\n }\n }\n retry_count += 1\n time.sleep(2 ** retry_count)\n continue\n \n except Exception as e:\n # 其他错误不重试\n return {\n \"success\": False,\n \"status\": \"error\",\n \"error\": {\n \"code\": \"UNKNOWN_ERROR\",\n \"message\": str(e)\n }\n }\n \n # 重试次数用尽\n return last_error\n```\n\n### 4. 动态工具发现(MCP 模式)\n\n```python\nclass MCPToolRegistry:\n \"\"\"MCP 工具注册表\"\"\"\n \n def __init__(self):\n self.tools = {}\n self.servers = {}\n \n async def register_server(self, server_url: str):\n \"\"\"注册 MCP Server\"\"\"\n # 连接服务器\n response = await requests.post(\n f\"{server_url}/tools/list\",\n json={}\n )\n \n # 注册工具\n for tool in response.json()['tools']:\n self.tools[tool['name']] = tool\n self.servers[tool['name']] = server_url\n \n async def call_tool(self, tool_name: str, params: dict) -> dict:\n \"\"\"调用 MCP 工具\"\"\"\n if tool_name not in self.tools:\n return {\n \"success\": False,\n \"error\": {\n \"code\": \"TOOL_NOT_FOUND\",\n \"message\": f\"Tool '{tool_name}' not found\"\n }\n }\n \n server_url = self.servers[tool_name]\n \n response = await requests.post(\n f\"{server_url}/tools/call\",\n json={\n \"name\": tool_name,\n \"arguments\": params\n }\n )\n \n return response.json()\n```\n\n### 5. 流式响应最佳实践\n\n```python\nasync def execute_tool_with_streaming(tool_name: str, params: dict) -> AsyncGenerator:\n \"\"\"\n 执行工具并流式返回进度\n \n 使用场景:长时间运行的工具(>1s)\n \"\"\"\n # 生成 trace_id\n trace_id = generate_trace_id()\n \n # 推送开始事件\n yield {\n \"event\": \"tool_progress\",\n \"id\": f\"evt_{trace_id}_start\",\n \"data\": {\n \"progress\": 0,\n \"message\": f\"开始执行工具: {tool_name}\",\n \"metadata\": {\n \"tool_name\": tool_name,\n \"timestamp\": datetime.now().isoformat(),\n \"trace_id\": trace_id\n }\n }\n }\n \n try:\n # 执行工具(模拟进度)\n result = await _execute_with_progress(tool_name, params, trace_id, lambda p, m: {\n \"event\": \"tool_progress\",\n \"id\": f\"evt_{trace_id}_progress_{p}\",\n \"data\": {\n \"progress\": p,\n \"message\": m,\n \"metadata\": {\n \"tool_name\": tool_name,\n \"timestamp\": datetime.now().isoformat(),\n \"trace_id\": trace_id\n }\n }\n })\n \n # 推送成功结果\n yield {\n \"event\": \"tool_result\",\n \"id\": f\"evt_{trace_id}_result\",\n \"data\": {\n \"success\": True,\n \"status\": \"success\",\n \"data\": result,\n \"metadata\": {\n \"tool_name\": tool_name,\n \"timestamp\": datetime.now().isoformat(),\n \"trace_id\": trace_id\n }\n }\n }\n \n except Exception as error:\n # 推送错误事件\n yield {\n \"event\": \"tool_error\",\n \"id\": f\"evt_{trace_id}_error\",\n \"data\": {\n \"success\": False,\n \"status\": \"error\",\n \"error\": {\n \"code\": \"EXECUTION_ERROR\",\n \"message\": str(error)\n },\n \"metadata\": {\n \"tool_name\": tool_name,\n \"timestamp\": datetime.now().isoformat(),\n \"trace_id\": trace_id\n }\n }\n }\n```\n\n### 6. 分页处理最佳实践\n\n```python\nasync def fetch_all_pages(tool_name: str, params: dict, max_items: int = 1000) -> list:\n \"\"\"\n 获取所有分页数据\n \n 参数:\n tool_name: 工具名称\n params: 工具参数\n max_items: 最大获取数量(防止无限循环)\n \n 返回:\n 所有项目的列表\n \"\"\"\n all_items = []\n cursor = None\n fetched_count = 0\n \n while cursor is not None and fetched_count \u003c max_items:\n # 调用工具\n result = await call_tool(tool_name, {\n **params,\n \"cursor\": cursor,\n \"limit\": 100\n })\n \n if not result['success']:\n raise Exception(f\"Tool error: {result['error']}\")\n \n # 添加项目\n items = result['data']['items']\n all_items.extend(items)\n fetched_count += len(items)\n \n # 检查是否还有更多\n pagination = result['data']['pagination']\n if pagination['has_more']:\n cursor = pagination['next_cursor']\n else:\n cursor = None\n \n return all_items\n```\n\n### 7. 可观测性最佳实践\n\n```python\nimport logging\n\n# 配置日志\nlogging.basicConfig(\n level=logging.INFO,\n format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'\n)\nlogger = logging.getLogger('tool_executor')\n\ndef execute_tool_with_observability(tool_name: str, params: dict) -> dict:\n \"\"\"\n 执行工具并记录完整可观测性数据\n \"\"\"\n # 生成 trace_id\n trace_id = generate_trace_id()\n \n # 记录开始\n start_time = time.time()\n logger.info(f\"Tool started: {tool_name}\", extra={\n \"trace_id\": trace_id,\n \"tool_name\": tool_name,\n \"params\": params\n })\n \n try:\n # 执行工具\n result = execute_tool(tool_name, params)\n \n # 记录成功\n execution_time = (time.time() - start_time) * 1000\n logger.info(f\"Tool completed: {tool_name}\", extra={\n \"trace_id\": trace_id,\n \"tool_name\": tool_name,\n \"execution_time_ms\": execution_time,\n \"success\": result['success']\n })\n \n # 添加性能数据\n result['metadata']['performance'] = {\n 'total_ms': execution_time\n }\n \n return result\n \n except Exception as error:\n # 记录错误\n execution_time = (time.time() - start_time) * 1000\n logger.error(f\"Tool failed: {tool_name}\", extra={\n \"trace_id\": trace_id,\n \"tool_name\": tool_name,\n \"execution_time_ms\": execution_time,\n \"error\": str(error)\n }, exc_info=True)\n \n raise\n```\n\n---\n\n## 选型建议\n\n### 场景匹配\n\n```mermaid\ngraph LR\n A[你的需求] --> B{目标模型?}\n B -->|GPT 系列| C[OpenAI Function Calling]\n B -->|Claude 系列| D[Anthropic Tool Use + MCP]\n B -->|多模型/开源| E[MCP 或自定义]\n \n A --> F{工具复杂度?}\n F -->|简单 API 调用| C\n F -->|动态工具/企业集成| E[MCP]\n F -->|RAG+ 工具| G[自定义集成]\n \n A --> H{开发语言?}\n H -->|Python| I[Python SDK]\n H -->|.NET| J[.NET SDK]\n H -->|任意| K[MCP + 自定义 Client]\n```\n\n### 技术选型决策树\n\n| 决策因素 | OpenAI | Anthropic | MCP | 自定义 |\n|---------|--------|-----------|-----|--------|\n| 易用性 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐ |\n| 灵活性 | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ |\n| 生态支持 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐ |\n| 学习成本 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐ |\n| 跨平台能力 | ⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ |\n\n---\n\n## 趋势与展望\n\n### 2026 年趋势\n\n1. **Strict Mode 成为标配**\n - 所有主流平台默认开启\n - Schema 校验从\"可选\"变\"必需\"\n\n2. **MCP 协议爆发**\n - 生态快速增长(200+ Server)\n - 成为跨平台工具互操作标准\n\n3. **流式响应普及**\n - 长时间工具支持进度推送\n - SSE 成为标准实现方式\n\n4. **可观测性增强**\n - Trace ID 全链路追踪\n - 性能监控成为标配\n\n5. **AI 驱动的工具发现**\n - 自动分析数据源并生成工具定义\n - 智能推荐工具组合\n\n### 未来展望\n\n**2027 年:**\n- 工具调用协议标准化(类似 HTTP/HTTPS)\n- 跨模型的工具 marketplace\n- AI 驱动的自动工具优化\n\n**2028 年:**\n- 工具自描述能力(自动生成文档、测试)\n- 工具性能自动优化\n- 分布式工具调用网络\n\n---\n\n## 在感知节点中的应用\n\n感知节点是 AGI 进化模型的核心组件,负责工具调用和外部交互。\n\n### 感知节点架构\n\n```\n┌─────────────────────────────────────┐\n│ 感知节点 (Perception Node) │\n├─────────────────────────────────────┤\n│ │\n│ ┌──────────────┐ ┌─────────────┐ │\n│ │ 工具注册表 │ │ 工具执行器 │ │\n│ │ (Registry) │ │ (Executor) │ │\n│ └──────┬───────┘ └──────┬──────┘ │\n│ │ │ │\n│ └────────┬────────┘ │\n│ ▼ │\n│ ┌──────────────────────────────┐ │\n│ │ 统一接口层 (Tool Interface) │ │\n│ │ - 参数校验 │ │\n│ │ - 错误处理 │ │\n│ │ - 重试策略 │ │\n│ │ - 流式响应 │ │\n│ │ - 可观测性 │ │\n│ └──────────────────────────────┘ │\n│ │ │\n│ ▼ │\n│ ┌──────────────────────────────┐ │\n│ │ 外部工具 (External Tools) │ │\n│ │ - API 调用 │ │\n│ │ - 数据库查询 │ │\n│ │ - 文件操作 │ │\n│ │ - MCP Server │ │\n│ └──────────────────────────────┘ │\n│ │\n└─────────────────────────────────────┘\n```\n\n### 感知节点工具定义示例\n\n```python\n# 感知节点工具注册\nPERCEPTION_NODE_TOOLS = [\n {\n \"name\": \"get_weather\",\n \"description\": \"获取指定城市的实时天气信息\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"location\": {\n \"type\": \"string\",\n \"description\": \"城市名称,如 'Beijing' 或 'San Francisco, CA'\"\n },\n \"unit\": {\n \"type\": \"string\",\n \"enum\": [\"celsius\", \"fahrenheit\"],\n \"description\": \"温度单位\"\n }\n },\n \"required\": [\"location\"],\n \"additionalProperties\": false\n },\n \"strict\": true,\n \"version\": \"1.0.0\",\n \"cacheable\": True,\n \"cache_ttl\": 600,\n \"estimated_tokens\": {\n \"input\": 50,\n \"output\": {\"typical\": 100, \"max\": 200}\n }\n },\n {\n \"name\": \"search_documents\",\n \"description\": \"搜索文档数据库\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"query\": {\n \"type\": \"string\",\n \"description\": \"搜索关键词\"\n },\n \"limit\": {\n \"type\": \"integer\",\n \"description\": \"返回结果数量\",\n \"minimum\": 1,\n \"maximum\": 100,\n \"default\": 10\n },\n \"cursor\": {\n \"type\": \"string\",\n \"description\": \"分页游标\"\n }\n },\n \"required\": [\"query\"],\n \"additionalProperties\": false\n },\n \"strict\": True,\n \"version\": \"2.1.0\",\n \"estimated_tokens\": {\n \"input\": 100,\n \"output\": {\"min\": 200, \"max\": 5000, \"typical\": 1000}\n }\n },\n {\n \"name\": \"generate_report\",\n \"description\": \"生成 PDF 报告并返回下载链接\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"title\": {\n \"type\": \"string\",\n \"description\": \"报告标题\"\n },\n \"content\": {\n \"type\": \"string\",\n \"description\": \"报告内容(Markdown 格式)\"\n },\n \"format\": {\n \"type\": \"string\",\n \"enum\": [\"pdf\", \"docx\", \"html\"],\n \"description\": \"输出格式\",\n \"default\": \"pdf\"\n }\n },\n \"required\": [\"title\", \"content\"],\n \"additionalProperties\": False\n },\n \"strict\": True,\n \"version\": \"1.2.0\",\n \"streaming\": True, # 支持流式响应\n \"estimated_tokens\": {\n \"input\": 500,\n \"output\": {\"min\": 50, \"max\": 100, \"typical\": 50}\n }\n }\n]\n```\n\n### 感知节点工具调用流程\n\n```python\nclass PerceptionNode:\n \"\"\"感知节点 - 工具调用统一入口\"\"\"\n \n def __init__(self):\n self.registry = ToolRegistry()\n self.executor = ToolExecutor()\n self.cache = ToolCache()\n self.observability = ObservabilityManager()\n \n async def call_tool(self, tool_name: str, params: dict, **options) -> dict:\n \"\"\"\n 调用工具(统一入口)\n \n 参数:\n tool_name: 工具名称\n params: 工具参数\n options: 可选参数\n - enable_cache: 是否启用缓存(默认 True)\n - enable_streaming: 是否启用流式响应(默认 True)\n - enable_retry: 是否启用重试(默认 True)\n - debug: 调试模式(默认 False)\n \n 返回:\n 工具执行结果\n \"\"\"\n # 1. 获取工具定义\n tool_config = self.registry.get_tool(tool_name)\n if not tool_config:\n return {\n \"success\": False,\n \"status\": \"error\",\n \"error\": {\n \"code\": \"TOOL_NOT_FOUND\",\n \"message\": f\"Tool '{tool_name}' not found\"\n }\n }\n \n # 2. 生成 trace_id\n trace_id = self.observability.generate_trace_id()\n \n # 3. 参数校验\n is_valid, error_msg = validate_parameters(tool_name, params, tool_config)\n if not is_valid:\n return {\n \"success\": False,\n \"status\": \"error\",\n \"error\": {\n \"code\": \"INVALID_PARAMS\",\n \"message\": error_msg\n },\n \"metadata\": {\n \"tool_name\": tool_name,\n \"timestamp\": datetime.now().isoformat(),\n \"trace_id\": trace_id\n }\n }\n \n # 4. 检查缓存\n if options.get('enable_cache', True) and tool_config.get('cacheable'):\n cached_result = self.cache.get(tool_name, params, tool_config)\n if cached_result:\n return cached_result\n \n # 5. 执行工具\n start_time = time.time()\n \n try:\n if options.get('enable_streaming', True) and tool_config.get('streaming'):\n # 流式响应\n result_stream = await self.executor.execute_with_streaming(\n tool_name,\n params,\n tool_config,\n trace_id\n )\n \n # 返回流(异步生成器)\n return result_stream\n \n else:\n # 普通响应\n if options.get('enable_retry', True):\n result = await self.executor.execute_with_retry(\n tool_name,\n params,\n tool_config,\n trace_id\n )\n else:\n result = await self.executor.execute(\n tool_name,\n params,\n tool_config,\n trace_id\n )\n \n # 添加性能数据\n execution_time = (time.time() - start_time) * 1000\n result['metadata']['performance'] = {\n 'total_ms': execution_time\n }\n \n # 缓存结果\n if options.get('enable_cache', True) and tool_config.get('cacheable'):\n self.cache.set(tool_name, params, result, tool_config)\n \n # 调试信息\n if options.get('debug', False):\n result['debug_info'] = {\n 'cache_hit': False,\n 'retry_count': 0,\n 'execution_time_ms': execution_time\n }\n \n return result\n \n except Exception as error:\n # 错误处理\n execution_time = (time.time() - start_time) * 1000\n error_result = {\n \"success\": False,\n \"status\": \"error\",\n \"error\": {\n \"code\": \"EXECUTION_ERROR\",\n \"message\": str(error)\n },\n \"metadata\": {\n \"tool_name\": tool_name,\n \"execution_time_ms\": execution_time,\n \"timestamp\": datetime.now().isoformat(),\n \"trace_id\": trace_id\n }\n }\n \n # 记录错误\n self.observability.log_error(trace_id, tool_name, error)\n \n return error_result\n```\n\n### 感知节点与元认知检测模块的集成\n\n```python\nclass PerceptionNodeWithMetacognition(PerceptionNode):\n \"\"\"带元认知检测的感知节点\"\"\"\n \n def __init__(self, metacognition_checker):\n super().__init__()\n self.metacognition_checker = metacognition_checker\n \n async def call_tool_with_metacognition(\n self,\n tool_name: str,\n params: dict,\n personality: dict = None,\n **options\n ) -> dict:\n \"\"\"\n 调用工具并进行元认知检测\n \n 参数:\n tool_name: 工具名称\n params: 工具参数\n personality: 人格参数(用于客观性评估)\n options: 可选参数\n \n 返回:\n 工具执行结果(包含元认知检测结果)\n \"\"\"\n # 1. 调用工具\n result = await self.call_tool(tool_name, params, **options)\n \n # 2. 元认知检测\n if result.get('success'):\n metacognition_result = await self.metacognition_checker.evaluate(\n response=result['data'],\n query=params.get('query', ''),\n personality=personality\n )\n \n # 3. 如果检测到问题,触发纠错\n if metacognition_result['needs_correction']:\n correction = await self.metacognition_checker.suggest_correction(\n metacognition_result,\n personality\n )\n \n result['metadata']['metacognition'] = {\n 'checked': True,\n 'needs_correction': True,\n 'correction': correction\n }\n else:\n result['metadata']['metacognition'] = {\n 'checked': True,\n 'needs_correction': False\n }\n \n return result\n```\n\n---\n\n## 附录\n\n### A. 完整错误码列表\n\n| 错误码 | 说明 | HTTP 状态码 | 可重试 |\n|--------|------|------------|--------|\n| INVALID_PARAMS | 参数验证失败 | 400 | 否 |\n| TOOL_NOT_FOUND | 工具不存在 | 404 | 否 |\n| RESOURCE_NOT_FOUND | 资源不存在 | 404 | 否 |\n| PERMISSION_DENIED | 权限不足 | 403 | 否 |\n| UNAUTHORIZED | 未授权 | 401 | 否 |\n| TIMEOUT | 执行超时 | 504 | 是 |\n| RATE_LIMITED | 速率限制 | 429 | 是 |\n| NETWORK_ERROR | 网络错误 | 503 | 是 |\n| EXECUTION_ERROR | 执行错误 | 500 | 否 |\n| TOOL_DEPRECATED | 工具已废弃 | 410 | 否 |\n| QUOTA_EXCEEDED | 配额超限 | 429 | 否 |\n\n### B. 工具定义模板\n\n```json\n{\n \"name\": \"tool_name\",\n \"description\": \"Tool description in one sentence\",\n \"parameters\": {\n \"type\": \"object\",\n \"properties\": {\n \"param_name\": {\n \"type\": \"string|number|integer|boolean|array|object\",\n \"description\": \"Parameter description\",\n \"enum\": [\"option1\", \"option2\"],\n \"default\": \"default_value\",\n \"minimum\": 0,\n \"maximum\": 100\n }\n },\n \"required\": [\"param_name\"],\n \"additionalProperties\": false\n },\n \"strict\": true,\n \"version\": \"1.0.0\",\n \"cacheable\": true,\n \"cache_ttl\": 600,\n \"cache_key_params\": [\"param_name\"],\n \"streaming\": false,\n \"estimated_tokens\": {\n \"input\": 100,\n \"output\": {\n \"min\": 200,\n \"max\": 2000,\n \"typical\": 500\n }\n },\n \"deprecated\": false,\n \"sunset_date\": \"2026-12-31\",\n \"replacement\": \"new_tool_name\"\n}\n```\n\n### C. 参考资源\n\n- [OpenAI Function Calling 官方文档](https://platform.openai.com/docs/guides/function-calling)\n- [Anthropic Tool Use 官方文档](https://docs.anthropic.com/en/docs/tool-use)\n- [MCP 协议规范](https://modelcontextprotocol.io/)\n- [JSON Schema 规范](https://json-schema.org/)\n- [SSE (Server-Sent Events) 规范](https://html.spec.whatwg.org/multipage/server-sent-events.html)\n\n---\n\n## 总结\n\n本规范涵盖了 Tool Use 接口设计的所有关键方面:\n\n✅ **标准化**:统一的工具定义、响应格式、错误处理\n✅ **可靠性**:参数校验、重试策略、幂等性设计\n✅ **可扩展**:MCP 协议、动态工具发现、版本管理\n✅ **兼容性**:兼容 OpenAI、Anthropic 等主流平台\n✅ **可观测**:Trace ID、流式响应、性能监控\n✅ **企业级**:分页、缓存、文件处理、版本控制\n\n通过遵循本规范,可以构建出高质量、可维护、可扩展的工具调用系统。\n","content_type":"text/markdown; charset=utf-8","language":"markdown","size":57607,"content_sha256":"dd2864a8590c0edb726b4953f61e648ee4a013b9db14b191c1c8d2139e5aa2a9"},{"filename":"scripts/advice_pool.py","content":"#!/usr/bin/env python3\n\"\"\"\n建议池模块(Advice Pool)\n\n功能:\n- 存储软调节建议\n- 查询软调节建议(由主循环调用)\n- 记录采纳情况(由主循环调用)\n- 清理过期建议\n- 基于人格的个性化排序\n\n设计原则:\n- 超然存在:外环写入,主循环读取(单向流)\n- 不强制执行:主循环自主决定是否采纳\n- 时效性约束:过期建议自动清理\n- 个性化排序:基于人格特质和采纳历史\n\n数据结构:\n- 建议:{id, content, priority, confidence, valid_until, vertex, based_on_intentionality, adoption_stats}\n- 按顶点分类:drive, math, iteration\n- 采纳统计:presented, adopted, effectiveness_sum\n\"\"\"\n\nimport argparse\nimport json\nimport sys\nimport uuid\nfrom datetime import datetime, timedelta\nfrom typing import Dict, Any, List, Optional\n\n\nclass AdvicePool:\n \"\"\"建议池\"\"\"\n \n def __init__(self, memory_dir: str = \"./agi_memory\"):\n self.memory_dir = memory_dir\n self.pool_file = f\"{memory_dir}/advice_pool.json\"\n \n # 建议池结构\n self.pool = {\n \"drive\": [], # 针对得不到顶点的建议\n \"math\": [], # 针对数学顶点的建议\n \"iteration\": [] # 针对自我迭代顶点的建议\n }\n \n # 元数据\n self.metadata = {\n \"last_updated\": None,\n \"total_suggestions\": 0,\n \"active_suggestions\": 0\n }\n \n # 加载现有建议池\n self._load()\n \n def add_suggestion(self, vertex: str, suggestion: Dict[str, Any]) -> str:\n \"\"\"\n 添加软调节建议\n \n Args:\n vertex: 目标顶点(drive/math/iteration)\n suggestion: 建议内容\n - content: 建议内容\n - priority: 优先级(0.0-1.0)\n - confidence: 置信度(0.0-1.0)\n - based_on_intentionality: 基于的意向性数据\n \n Returns:\n 建议ID\n \"\"\"\n if vertex not in self.pool:\n raise ValueError(f\"Invalid vertex: {vertex}. Must be one of: drive, math, iteration\")\n \n suggestion_with_metadata = {\n \"id\": str(uuid.uuid4()),\n \"generation_time\": datetime.now().isoformat(),\n \"valid_until\": (datetime.now() + timedelta(minutes=30)).isoformat(),\n \"vertex\": vertex,\n \"content\": suggestion.get('content', ''),\n \"priority\": suggestion.get('priority', 0.5),\n \"confidence\": suggestion.get('confidence', 0.5),\n \"based_on_intentionality\": suggestion.get('based_on_intentionality', {}),\n \"adoption_stats\": {\n \"presented\": 0,\n \"adopted\": 0,\n \"effectiveness_sum\": 0.0\n }\n }\n \n self.pool[vertex].append(suggestion_with_metadata)\n \n # 清理过期建议\n self._cleanup_expired()\n \n # 更新元数据\n self._update_metadata()\n \n # 保存\n self._save()\n \n return suggestion_with_metadata['id']\n \n def query_suggestions(self, vertex: str, context: Dict[str, Any] = None,\n personality: Dict[str, Any] = None, \n limit: int = 3) -> List[Dict[str, Any]]:\n \"\"\"\n 查询软调节建议(由主循环调用)\n \n Args:\n vertex: 目标顶点(drive/math/iteration)\n context: 上下文信息\n personality: 人格数据\n limit: 返回建议数量限制\n \n Returns:\n 建议列表(已排序)\n \"\"\"\n # 1. 清理过期建议\n self._cleanup_expired()\n \n # 2. 过滤顶点\n vertex_suggestions = self.pool.get(vertex, [])\n \n if not vertex_suggestions:\n return []\n \n # 3. 过滤相关性\n relevant_suggestions = [\n s for s in vertex_suggestions\n if self._check_relevance(s, context) > 0.5\n ]\n \n if not relevant_suggestions:\n return []\n \n # 4. 基于人格排序\n if personality:\n scored_suggestions = [\n {\n **s,\n \"personalized_score\": self._calculate_personalized_score(\n s,\n personality\n )\n }\n for s in relevant_suggestions\n ]\n else:\n scored_suggestions = [\n {\n **s,\n \"personalized_score\": s['priority'] * s['confidence']\n }\n for s in relevant_suggestions\n ]\n \n # 按个性化得分排序\n scored_suggestions.sort(\n key=lambda x: x['personalized_score'],\n reverse=True\n )\n \n # 5. 返回Top N\n top_suggestions = scored_suggestions[:limit]\n \n # 6. 更新呈现次数\n for s in top_suggestions:\n s['adoption_stats']['presented'] += 1\n \n # 保存更新\n self._save()\n \n return top_suggestions\n \n def record_adoption(self, suggestion_id: str, adopted: bool,\n effectiveness: Optional[float] = None) -> bool:\n \"\"\"\n 记录采纳情况(由主循环调用)\n \n Args:\n suggestion_id: 建议ID\n adopted: 是否采纳\n effectiveness: 有效性评分(0.0-1.0,可选)\n \n Returns:\n 是否成功记录\n \"\"\"\n # 在所有顶点中查找建议\n found = False\n \n for vertex, suggestions in self.pool.items():\n for suggestion in suggestions:\n if suggestion['id'] == suggestion_id:\n found = True\n \n if adopted:\n suggestion['adoption_stats']['adopted'] += 1\n if effectiveness is not None:\n suggestion['adoption_stats']['effectiveness_sum'] += effectiveness\n \n break\n \n if found:\n break\n \n if found:\n self._update_metadata()\n self._save()\n \n return found\n \n def get_stats(self) -> Dict[str, Any]:\n \"\"\"\n 获取建议池统计信息\n \n Returns:\n 统计信息\n \"\"\"\n stats = {\n \"metadata\": self.metadata,\n \"by_vertex\": {}\n }\n \n for vertex, suggestions in self.pool.items():\n if suggestions:\n total_presented = sum(s['adoption_stats']['presented'] for s in suggestions)\n total_adopted = sum(s['adoption_stats']['adopted'] for s in suggestions)\n total_effectiveness = sum(s['adoption_stats']['effectiveness_sum'] for s in suggestions)\n \n adoption_rate = total_adopted / max(total_presented, 1)\n avg_effectiveness = total_effectiveness / max(total_adopted, 1)\n \n stats[\"by_vertex\"][vertex] = {\n \"active_suggestions\": len(suggestions),\n \"total_presented\": total_presented,\n \"total_adopted\": total_adopted,\n \"adoption_rate\": adoption_rate,\n \"avg_effectiveness\": avg_effectiveness\n }\n \n return stats\n \n def clear_expired(self) -> int:\n \"\"\"\n 清理所有过期建议\n \n Returns:\n 清理的建议数量\n \"\"\"\n before_count = sum(len(suggestions) for suggestions in self.pool.values())\n self._cleanup_expired()\n self._save()\n after_count = sum(len(suggestions) for suggestions in self.pool.values())\n \n return before_count - after_count\n \n def _load(self):\n \"\"\"从文件加载建议池\"\"\"\n try:\n with open(self.pool_file, 'r', encoding='utf-8') as f:\n data = json.load(f)\n self.pool = data.get(\"pool\", self.pool)\n self.metadata = data.get(\"metadata\", self.metadata)\n except (FileNotFoundError, json.JSONDecodeError):\n # 文件不存在或格式错误,使用默认值\n pass\n \n def _save(self):\n \"\"\"保存建议池到文件\"\"\"\n data = {\n \"pool\": self.pool,\n \"metadata\": self.metadata\n }\n \n with open(self.pool_file, 'w', encoding='utf-8') as f:\n json.dump(data, f, ensure_ascii=False, indent=2)\n \n def _cleanup_expired(self):\n \"\"\"清理过期建议\"\"\"\n current_time = datetime.now()\n \n for vertex, suggestions in self.pool.items():\n self.pool[vertex] = [\n s for s in suggestions\n if datetime.fromisoformat(s['valid_until']) > current_time\n ]\n \n def _update_metadata(self):\n \"\"\"更新元数据\"\"\"\n self.metadata['last_updated'] = datetime.now().isoformat()\n self.metadata['total_suggestions'] = sum(\n len(suggestions) for suggestions in self.pool.values()\n )\n self.metadata['active_suggestions'] = sum(\n len(suggestions) for suggestions in self.pool.values()\n )\n \n def _check_relevance(self, suggestion: Dict[str, Any],\n context: Dict[str, Any] = None) -> float:\n \"\"\"\n 检查建议与上下文的相关性\n \n Args:\n suggestion: 建议\n context: 上下文\n \n Returns:\n 相关性得分(0.0-1.0)\n \"\"\"\n if not context:\n return 0.5\n \n based_on = suggestion.get('based_on_intentionality', {})\n context_intentionality = context.get('intentionality', {})\n \n if not based_on or not context_intentionality:\n return 0.5\n \n # 计算匹配度\n match_score = 0.0\n dimensions = ['agent', 'direction', 'content']\n \n for dimension in dimensions:\n if based_on.get(dimension) == context_intentionality.get(dimension):\n match_score += 1.0 / len(dimensions)\n \n return match_score\n \n def _calculate_personalized_score(self, suggestion: Dict[str, Any],\n personality: Dict[str, Any]) -> float:\n \"\"\"\n 计算基于人格的个性化得分\n \n Args:\n suggestion: 建议\n personality: 人格数据\n \n Returns:\n 个性化得分\n \"\"\"\n base_score = suggestion['priority'] * suggestion['confidence']\n \n # 基于采纳历史调整\n adoption_rate = suggestion['adoption_stats']['adopted'] / max(\n suggestion['adoption_stats']['presented'],\n 1\n )\n \n # 基于人格特质调整\n conscientiousness = personality.get('conscientiousness', 0.5)\n openness = personality.get('openness', 0.5)\n \n # 谨慎性越高,越倾向于采纳历史成功的建议\n personality_factor = conscientiousness * 0.3 + openness * 0.2\n \n personalized_score = base_score * (1 + adoption_rate) * (1 + personality_factor)\n \n return personalized_score\n\n\ndef main():\n parser = argparse.ArgumentParser(description=\"建议池模块\")\n parser.add_argument(\"--memory-dir\", default=\"./agi_memory\", help=\"记忆目录\")\n parser.add_argument(\"--action\", choices=[\"add\", \"query\", \"record\", \"stats\", \"clear\"], \n required=True, help=\"操作类型\")\n parser.add_argument(\"--vertex\", choices=[\"drive\", \"math\", \"iteration\"], \n help=\"目标顶点\")\n parser.add_argument(\"--suggestion\", help=\"建议内容(JSON)\")\n parser.add_argument(\"--suggestion-id\", help=\"建议ID\")\n parser.add_argument(\"--adopted\", type=bool, help=\"是否采纳\")\n parser.add_argument(\"--effectiveness\", type=float, help=\"有效性评分\")\n parser.add_argument(\"--context\", help=\"上下文(JSON)\")\n parser.add_argument(\"--personality\", help=\"人格数据(JSON文件)\")\n parser.add_argument(\"--limit\", type=int, default=3, help=\"返回建议数量限制\")\n parser.add_argument(\"--output\", help=\"输出文件\")\n \n args = parser.parse_args()\n \n # 创建建议池\n pool = AdvicePool(memory_dir=args.memory_dir)\n \n if args.action == \"add\":\n # 添加建议\n if not args.vertex or not args.suggestion:\n print(\"Error: --vertex and --suggestion are required for add action\")\n sys.exit(1)\n \n suggestion = json.loads(args.suggestion)\n suggestion_id = pool.add_suggestion(args.vertex, suggestion)\n \n result = {\n \"success\": True,\n \"suggestion_id\": suggestion_id,\n \"message\": \"建议已添加到建议池\"\n }\n \n elif args.action == \"query\":\n # 查询建议\n if not args.vertex:\n print(\"Error: --vertex is required for query action\")\n sys.exit(1)\n \n context = json.loads(args.context) if args.context else None\n \n personality = None\n if args.personality:\n with open(args.personality, 'r', encoding='utf-8') as f:\n personality = json.load(f)\n \n suggestions = pool.query_suggestions(\n args.vertex,\n context,\n personality,\n args.limit\n )\n \n result = {\n \"success\": True,\n \"vertex\": args.vertex,\n \"count\": len(suggestions),\n \"suggestions\": suggestions\n }\n \n elif args.action == \"record\":\n # 记录采纳情况\n if not args.suggestion_id or args.adopted is None:\n print(\"Error: --suggestion-id and --adopted are required for record action\")\n sys.exit(1)\n \n success = pool.record_adoption(\n args.suggestion_id,\n args.adopted,\n args.effectiveness\n )\n \n result = {\n \"success\": success,\n \"message\": \"采纳情况已记录\" if success else \"建议ID不存在\"\n }\n \n elif args.action == \"stats\":\n # 获取统计信息\n result = {\n \"success\": True,\n \"stats\": pool.get_stats()\n }\n \n elif args.action == \"clear\":\n # 清理过期建议\n cleared_count = pool.clear_expired()\n \n result = {\n \"success\": True,\n \"cleared_count\": cleared_count,\n \"message\": f\"已清理 {cleared_count} 条过期建议\"\n }\n \n # 输出结果\n if args.output:\n with open(args.output, 'w', encoding='utf-8') as f:\n json.dump(result, f, ensure_ascii=False, indent=2)\n else:\n print(json.dumps(result, ensure_ascii=False, indent=2))\n \n sys.exit(0)\n\n\nif __name__ == \"__main__\":\n main()\n","content_type":"text/x-python; charset=utf-8","language":"python","size":15300,"content_sha256":"d611c47f8a6e73c6ddc18259892cd02daf970325eee28eee7e35a2416829048e"},{"filename":"scripts/cognitive_insight_backup.py","content":"#!/usr/bin/env python3\n\"\"\"\n认知架构洞察组件\n\n功能:从数学顶点输出的结构化模式中提取洞察,为映射层和自我迭代提供进化依据\n- 总结:从验证后的模式中提取核心特征\n- 分类:识别模式类型和洞察类型\n- 共性:跨场景特征识别\n- 革新依据:判断改进空间\n- 适用性评估:评估洞察在当前场景下的可用性\n\n协议:AGPL-3.0\n作者:kiwifruit\n\"\"\"\n\nimport json\nimport os\nfrom datetime import datetime\nfrom typing import Dict, List, Optional\nimport hashlib\n\n\nclass CognitiveInsight:\n \"\"\"认知架构洞察组件\"\"\"\n \n def __init__(self, memory_dir: str = \"./agi_memory\"):\n self.memory_dir = memory_dir\n self.cognitive_insight_dir = os.path.join(memory_dir, \"cognitive_insight\")\n os.makedirs(self.cognitive_insight_dir, exist_ok=True)\n \n # 存储文件\n self.patterns_file = os.path.join(self.cognitive_insight_dir, \"patterns.json\")\n self.insights_file = os.path.join(self.cognitive_insight_dir, \"insights.json\")\n self.pattern_library_file = os.path.join(self.cognitive_insight_dir, \"pattern_library.json\")\n \n # 加载数据\n self.patterns = self._load_json(self.patterns_file, {\"patterns\": {}, \"metadata\": {\"total_count\": 0}})\n self.insights = self._load_json(self.insights_file, {\"insights\": {}, \"metadata\": {\"total_count\": 0}})\n self.pattern_library = self._load_json(self.pattern_library_file, {\"strategies\": [], \"logics\": [], \"behaviors\": [], \"errors\": []})\n \n # 适用性权重\n self.applicability_weights = {\n \"timeliness\": 0.2,\n \"relevance\": 0.3,\n \"compatibility\": 0.2,\n \"resource_efficiency\": 0.15,\n \"risk\": 0.15\n }\n \n self.apply_threshold = 0.7\n self.wait_threshold = 0.4\n \n # ==================== 公开API ====================\n \n def add_pattern(self, pattern: dict) -> str:\n \"\"\"添加来自数学顶点的模式\"\"\"\n pattern_id = self._generate_pattern_id(pattern)\n standardized = self._standardize_pattern(pattern, pattern_id)\n \n self.patterns[\"patterns\"][pattern_id] = standardized\n self.patterns[\"metadata\"][\"total_count\"] += 1\n self.patterns[\"metadata\"][\"last_updated\"] = datetime.now().isoformat()\n \n self._update_pattern_library(standardized)\n self._save_patterns()\n self._save_pattern_library()\n \n return pattern_id\n \n def generate_insight(self, pattern_ids: List[str]) -> dict:\n \"\"\"基于指定模式生成洞察\"\"\"\n patterns = [self.patterns[\"patterns\"][pid] for pid in pattern_ids if pid in self.patterns[\"patterns\"]]\n if not patterns:\n raise ValueError(\"未找到有效的模式\")\n \n insight_id = self._generate_insight_id(patterns)\n \n # 执行洞察流程\n summary = self._summarize_patterns(patterns)\n classification = self._classify_insight(patterns, summary)\n commonality = self._extract_commonality(patterns)\n innovation = self._evaluate_innovation_basis(patterns, classification)\n confidence = self._calculate_confidence(patterns, summary, innovation)\n \n # 初始适用性评估\n applicability = self._calculate_initial_applicability(patterns, classification)\n \n insight = {\n \"insight_id\": insight_id,\n \"timestamp\": datetime.now().isoformat(),\n \"insight_type\": classification[\"insight_type\"],\n \"summary\": summary[\"summary\"],\n \"classification\": classification,\n \"commonality\": commonality,\n \"innovation_basis\": innovation,\n \"confidence\": confidence,\n \"applicability\": applicability,\n \"source_patterns\": pattern_ids,\n \"validation_status\": \"pending\",\n \"application_status\": \"pending\",\n \"created_at\": datetime.now().isoformat()\n }\n \n self.insights[\"insights\"][insight_id] = insight\n self.insights[\"metadata\"][\"total_count\"] += 1\n self._save_insights()\n \n return insight\n \n def get_insight(self, insight_id: str) -> dict:\n \"\"\"获取洞察详情\"\"\"\n return self.insights[\"insights\"].get(insight_id)\n \n def list_insights(self, insight_type: Optional[str] = None, status: Optional[str] = None, limit: int = 100) -> List[dict]:\n \"\"\"列出洞察\"\"\"\n insights = list(self.insights[\"insights\"].values())\n \n if insight_type:\n insights = [i for i in insights if i[\"insight_type\"] == insight_type]\n if status:\n insights = [i for i in insights if i[\"validation_status\"] == status]\n \n insights.sort(key=lambda x: x[\"confidence\"], reverse=True)\n return insights[:limit]\n \n def validate_insight(self, insight_id: str, result: bool, feedback: str = \"\") -> None:\n \"\"\"验证洞察效果\"\"\"\n if insight_id not in self.insights[\"insights\"]:\n raise ValueError(f\"洞察不存在: {insight_id}\")\n \n insight = self.insights[\"insights\"][insight_id]\n insight[\"validation_status\"] = \"validated\" if result else \"rejected\"\n insight[\"validation_result\"] = {\n \"validated_at\": datetime.now().isoformat(),\n \"result\": result,\n \"feedback\": feedback\n }\n self._save_insights()\n \n def assess_applicability(self, insight_id: str, context: dict = None) -> dict:\n \"\"\"评估洞察的当前适用性\"\"\"\n if insight_id not in self.insights[\"insights\"]:\n raise ValueError(f\"洞察不存在: {insight_id}\")\n \n insight = self.insights[\"insights\"][insight_id]\n \n # 计算各维度评分\n timeliness = self._assess_timeliness(insight)\n relevance = self._assess_relevance(insight, context)\n compatibility = self._assess_compatibility(insight, context)\n resource = self._assess_resource_efficiency(insight, context)\n risk = self._assess_risk(insight)\n \n # 综合评分\n score = (\n timeliness * self.applicability_weights[\"timeliness\"] +\n relevance * self.applicability_weights[\"relevance\"] +\n compatibility * self.applicability_weights[\"compatibility\"] +\n resource * self.applicability_weights[\"resource_efficiency\"] +\n risk * self.applicability_weights[\"risk\"]\n )\n \n # 生成推荐\n if score >= self.apply_threshold:\n recommendation = \"apply\"\n elif score >= self.wait_threshold:\n recommendation = \"wait\"\n else:\n recommendation = \"reject\"\n \n # 更新洞察\n applicability_data = {\n \"score\": score,\n \"dimensions\": {\n \"timeliness\": timeliness,\n \"relevance\": relevance,\n \"compatibility\": compatibility,\n \"resource_efficiency\": resource,\n \"risk\": risk\n },\n \"last_assessed\": datetime.now().isoformat(),\n \"assessment_count\": insight.get(\"applicability\", {}).get(\"assessment_count\", 0) + 1\n }\n \n insight[\"applicability\"] = applicability_data\n self._save_insights()\n \n result = applicability_data.copy()\n result[\"recommendation\"] = recommendation\n return result\n \n def list_insights_by_applicability(self, min_applicability: float = 0.5, context: dict = None, limit: int = 100) -> List[dict]:\n \"\"\"按适用性列出洞察\"\"\"\n insights = list(self.insights[\"insights\"].values())\n insights = [i for i in insights if i[\"validation_status\"] == \"validated\"]\n \n # 动态评估\n if context is not None:\n for insight in insights:\n self.assess_applicability(insight[\"insight_id\"], context)\n \n # 筛选和排序\n insights = [i for i in insights if i.get(\"applicability\", {}).get(\"score\", 0) >= min_applicability]\n insights.sort(key=lambda x: x.get(\"applicability\", {}).get(\"score\", 0), reverse=True)\n \n return insights[:limit]\n \n def get_pattern_library(self) -> dict:\n \"\"\"获取模式库\"\"\"\n return self.pattern_library\n \n # ==================== 私有方法 ====================\n \n def _load_json(self, filepath: str, default: dict) -> dict:\n if os.path.exists(filepath):\n with open(filepath, 'r', encoding='utf-8') as f:\n return json.load(f)\n return default\n \n def _save_json(self, filepath: str, data: dict) -> None:\n with open(filepath, 'w', encoding='utf-8') as f:\n json.dump(data, f, ensure_ascii=False, indent=2)\n \n def _save_patterns(self) -> None:\n self._save_json(self.patterns_file, self.patterns)\n \n def _save_insights(self) -> None:\n self._save_json(self.insights_file, self.insights)\n \n def _save_pattern_library(self) -> None:\n self._save_json(self.pattern_library_file, self.pattern_library)\n \n def _generate_pattern_id(self, pattern: dict) -> str:\n content = json.dumps(pattern, sort_keys=True)\n return f\"pattern_{hashlib.md5(content.encode()).hexdigest()[:8]}\"\n \n def _generate_insight_id(self, patterns: List[dict]) -> str:\n content = json.dumps([p[\"pattern_id\"] for p in patterns], sort_keys=True)\n return f\"insight_{hashlib.md5(content.encode()).hexdigest()[:8]}\"\n \n def _standardize_pattern(self, pattern: dict, pattern_id: str) -> dict:\n return {\n \"pattern_id\": pattern_id,\n \"timestamp\": pattern.get(\"timestamp\", datetime.now().isoformat()),\n \"source\": pattern.get(\"source\", \"unknown\"),\n \"pattern_type\": pattern.get(\"pattern_type\", \"unknown\"),\n \"pattern_data\": pattern.get(\"pattern_data\", {}),\n \"validation_score\": pattern.get(\"validation_score\", 0.0),\n \"context\": pattern.get(\"context\", {}),\n \"occurrence_count\": pattern.get(\"occurrence_count\", 1),\n \"time_span\": pattern.get(\"time_span\", 0.0),\n \"created_at\": datetime.now().isoformat()\n }\n \n def _update_pattern_library(self, pattern: dict) -> None:\n signature = self._compute_pattern_signature(pattern)\n library_type = f\"{pattern['pattern_type']}s\"\n \n if library_type in self.pattern_library:\n for item in self.pattern_library[library_type]:\n if item[\"pattern_signature\"] == signature:\n item[\"occurrence_count\"] += pattern[\"occurrence_count\"]\n item[\"last_seen\"] = pattern[\"timestamp\"]\n return\n \n self.pattern_library[library_type].append({\n \"pattern_signature\": signature,\n \"description\": pattern[\"pattern_data\"].get(\"description\", \"\"),\n \"occurrence_count\": pattern[\"occurrence_count\"],\n \"first_seen\": pattern[\"timestamp\"],\n \"last_seen\": pattern[\"timestamp\"]\n })\n \n def _compute_pattern_signature(self, pattern: dict) -> str:\n content = json.dumps({\n \"pattern_type\": pattern[\"pattern_type\"],\n \"source\": pattern[\"source\"]\n }, sort_keys=True)\n return hashlib.md5(content.encode()).hexdigest()[:8]\n \n # ==================== 核心算法 ====================\n \n def _summarize_patterns(self, patterns: List[dict]) -> dict:\n grouped = {}\n for p in patterns:\n ptype = p[\"pattern_type\"]\n if ptype not in grouped:\n grouped[ptype] = []\n grouped[ptype].append(p)\n \n core_features = {}\n for ptype, pats in grouped.items():\n core_features[ptype] = {\n \"count\": len(pats),\n \"avg_validation\": sum(p[\"validation_score\"] for p in pats) / len(pats),\n \"total_occurrences\": sum(p[\"occurrence_count\"] for p in pats)\n }\n \n summary = \"; \".join([\n f\"发现{ptype}类型模式{f['count']}个,平均验证得分{f['avg_validation']:.2f},累计出现{f['total_occurrences']}次\"\n for ptype, f in core_features.items()\n ])\n \n avg_validation = sum(p[\"validation_score\"] for p in patterns) / len(patterns)\n return {\"summary\": summary, \"core_features\": core_features, \"confidence\": min(avg_validation, 1.0)}\n \n def _classify_insight(self, patterns: List[dict], summary: dict) -> dict:\n pattern_types = set(p[\"pattern_type\"] for p in patterns)\n impact_scope = \"local\" if len(patterns) \u003c 5 else \"global\"\n \n avg_validation = sum(p[\"validation_score\"] for p in patterns) / len(patterns)\n urgency = \"high\" if avg_validation > 0.8 else (\"medium\" if avg_validation > 0.5 else \"low\")\n \n if \"error\" in pattern_types:\n insight_type = \"error_correction\"\n elif impact_scope == \"global\":\n insight_type = \"architecture_upgrade\"\n else:\n insight_type = \"strategy_optimization\"\n \n return {\n \"pattern_types\": list(pattern_types),\n \"insight_type\": insight_type,\n \"impact_scope\": impact_scope,\n \"urgency\": urgency,\n \"classification_confidence\": 0.8\n }\n \n def _extract_commonality(self, patterns: List[dict]) -> dict:\n common_sources = set(p[\"source\"] for p in patterns)\n common_types = set(p[\"pattern_type\"] for p in patterns)\n \n return {\n \"global_commonality\": {\n \"all_from_same_source\": len(common_sources) == 1,\n \"all_same_type\": len(common_types) == 1\n },\n \"diversity_score\": 0.3\n }\n \n def _evaluate_innovation_basis(self, patterns: List[dict], classification: dict) -> dict:\n avg_validation = sum(p[\"validation_score\"] for p in patterns) / len(patterns)\n total_occurrences = sum(p[\"occurrence_count\"] for p in patterns)\n \n exists = avg_validation > 0.7 and total_occurrences > 10\n \n if exists:\n return {\n \"exists\": True,\n \"description\": f\"发现高频高置信度模式,建议优化{classification['insight_type']}\",\n \"priority\": min(avg_validation, 1.0),\n \"expected_impact\": {\"scope\": classification[\"impact_scope\"]}\n }\n \n return {\n \"exists\": False,\n \"description\": \"未发现值得革新的依据\",\n \"priority\": 0.0,\n \"expected_impact\": {}\n }\n \n def _calculate_confidence(self, patterns: List[dict], summary: dict, innovation: dict) -> float:\n validation_factor = sum(p[\"validation_score\"] for p in patterns) / len(patterns)\n pattern_factor = min(len(patterns) / 10, 1.0)\n summary_factor = summary.get(\"confidence\", 0.5)\n innovation_factor = innovation[\"priority\"] if innovation[\"exists\"] else 0.8\n \n confidence = (\n validation_factor * 0.3 +\n pattern_factor * 0.2 +\n summary_factor * 0.3 +\n innovation_factor * 0.2\n )\n \n return min(confidence, 1.0)\n \n # ==================== 适用性评估 ====================\n \n def _calculate_initial_applicability(self, patterns: List[dict], classification: dict) -> dict:\n \"\"\"计算初始适用性\"\"\"\n timeliness = 1.0 # 新生成的洞察,时效性为1.0\n relevance = 0.7 # 默认中等相关性\n compatibility = 0.9 # 默认高兼容性\n resource = 0.8 # 默认良好资源效率\n risk = 0.75 # 默认中等风险\n \n score = (\n timeliness * self.applicability_weights[\"timeliness\"] +\n relevance * self.applicability_weights[\"relevance\"] +\n compatibility * self.applicability_weights[\"compatibility\"] +\n resource * self.applicability_weights[\"resource_efficiency\"] +\n risk * self.applicability_weights[\"risk\"]\n )\n \n return {\n \"score\": score,\n \"dimensions\": {\n \"timeliness\": timeliness,\n \"relevance\": relevance,\n \"compatibility\": compatibility,\n \"resource_efficiency\": resource,\n \"risk\": risk\n },\n \"last_assessed\": datetime.now().isoformat(),\n \"assessment_count\": 1\n }\n \n def _assess_timeliness(self, insight: dict) -> float:\n \"\"\"时效性评估\"\"\"\n created = datetime.fromisoformat(insight[\"created_at\"])\n days_passed = (datetime.now() - created).days\n return max(0.2, 1.0 - days_passed * 0.05)\n \n def _assess_relevance(self, insight: dict, context: dict) -> float:\n \"\"\"相关性评估\"\"\"\n if not context:\n return 0.5\n \n task_type = context.get(\"task_type\", \"general\")\n insight_type = insight[\"insight_type\"]\n \n relevance_map = {\n \"error_correction\": {\"error\": 1.0, \"general\": 0.3},\n \"strategy_optimization\": {\"optimization\": 1.0, \"general\": 0.7},\n \"logic_improvement\": {\"logic\": 1.0, \"general\": 0.6},\n \"architecture_upgrade\": {\"upgrade\": 1.0, \"general\": 0.5}\n }\n \n return relevance_map.get(insight_type, {}).get(task_type, 0.5)\n \n def _assess_compatibility(self, insight: dict, context: dict) -> float:\n \"\"\"兼容性评估\"\"\"\n if not context:\n return 1.0\n \n applied = context.get(\"applied_insights\", [])\n conflict_types = set()\n \n for applied_id in applied:\n if applied_id in self.insights[\"insights\"]:\n conflict_types.add(self.insights[\"insights\"][applied_id][\"insight_type\"])\n \n if insight[\"insight_type\"] in conflict_types and insight[\"insight_type\"] == \"architecture_upgrade\":\n return 0.3\n \n return 1.0\n \n def _assess_resource_efficiency(self, insight: dict, context: dict) -> float:\n \"\"\"资源效率评估\"\"\"\n if not context:\n return 0.8\n \n insight_type = insight[\"insight_type\"]\n requirements = {\n \"error_correction\": {\"cpu\": 0.1, \"memory\": 0.1, \"time\": 0.1},\n \"strategy_optimization\": {\"cpu\": 0.3, \"memory\": 0.2, \"time\": 0.2},\n \"logic_improvement\": {\"cpu\": 0.5, \"memory\": 0.3, \"time\": 0.3},\n \"architecture_upgrade\": {\"cpu\": 0.8, \"memory\": 0.6, \"time\": 0.8}\n }\n \n req = requirements.get(insight_type, {\"cpu\": 0.3, \"memory\": 0.2, \"time\": 0.2})\n available = context.get(\"available_resources\", {\"cpu\": 1.0, \"memory\": 1.0, \"time\": 1.0})\n \n cpu_eff = min(available.get(\"cpu\", 1.0) / req[\"cpu\"], 1.0)\n mem_eff = min(available.get(\"memory\", 1.0) / req[\"memory\"], 1.0)\n time_eff = min(available.get(\"time\", 1.0) / req[\"time\"], 1.0)\n \n return (cpu_eff + mem_eff + time_eff) / 3.0\n \n def _assess_risk(self, insight: dict) -> float:\n \"\"\"风险评估\"\"\"\n insight_type = insight[\"insight_type\"]\n risks = {\n \"error_correction\": {\"failure\": 0.2, \"side_effect\": 0.1, \"rollback\": 0.2},\n \"strategy_optimization\": {\"failure\": 0.3, \"side_effect\": 0.2, \"rollback\": 0.3},\n \"logic_improvement\": {\"failure\": 0.5, \"side_effect\": 0.4, \"rollback\": 0.5},\n \"architecture_upgrade\": {\"failure\": 0.7, \"side_effect\": 0.6, \"rollback\": 0.8}\n }\n \n r = risks.get(insight_type, {\"failure\": 0.3, \"side_effect\": 0.2, \"rollback\": 0.3})\n return 1.0 - (r[\"failure\"] * 0.4 + r[\"side_effect\"] * 0.3 + r[\"rollback\"] * 0.3)\n\n\ndef main():\n \"\"\"命令行入口\"\"\"\n import argparse\n \n parser = argparse.ArgumentParser(\n description=\"认知架构洞察组件 - 从数学顶点输出的结构化模式中提取洞察\",\n formatter_class=argparse.RawDescriptionHelpFormatter,\n epilog=\"\"\"\n示例用法:\n # 添加模式\n python3 cognitive_insight.py add-pattern --pattern '{\"pattern_type\": \"strategy\", \"pattern_data\": {...}}'\n \n # 生成洞察\n python3 cognitive_insight.py generate-insight --pattern-ids pattern_xxxx pattern_yyyy\n \n # 列出洞察\n python3 cognitive_insight.py list-insights\n \n # 评估适用性\n python3 cognitive_insight.py assess-applicability --insight-id insight_xxxx\n \n # 按适用性列出\n python3 cognitive_insight.py list-by-applicability --min 0.7\n \"\"\"\n )\n \n parser.add_argument(\"--memory-dir\", default=\"./agi_memory\", help=\"记忆目录路径(默认: ./agi_memory)\")\n \n subparsers = parser.add_subparsers(dest=\"command\", help=\"可用命令\")\n \n # add-pattern 命令\n add_pattern_parser = subparsers.add_parser(\"add-pattern\", help=\"添加模式\")\n add_pattern_parser.add_argument(\"--pattern\", required=True, help=\"模式JSON数据\")\n \n # generate-insight 命令\n generate_parser = subparsers.add_parser(\"generate-insight\", help=\"生成洞察\")\n generate_parser.add_argument(\"--pattern-ids\", nargs=\"+\", required=True, help=\"模式ID列表\")\n \n # get-insight 命令\n get_parser = subparsers.add_parser(\"get-insight\", help=\"获取洞察详情\")\n get_parser.add_argument(\"--insight-id\", required=True, help=\"洞察ID\")\n \n # list-insights 命令\n list_parser = subparsers.add_parser(\"list-insights\", help=\"列出洞察\")\n list_parser.add_argument(\"--type\", help=\"按类型筛选\")\n list_parser.add_argument(\"--status\", help=\"按状态筛选\")\n list_parser.add_argument(\"--limit\", type=int, default=100, help=\"返回数量限制\")\n \n # validate-insight 命令\n validate_parser = subparsers.add_parser(\"validate-insight\", help=\"验证洞察\")\n validate_parser.add_argument(\"--insight-id\", required=True, help=\"洞察ID\")\n validate_parser.add_argument(\"--result\", type=bool, required=True, help=\"验证结果(True/False)\")\n validate_parser.add_argument(\"--feedback\", default=\"\", help=\"反馈信息\")\n \n # assess-applicability 命令\n assess_parser = subparsers.add_parser(\"assess-applicability\", help=\"评估适用性\")\n assess_parser.add_argument(\"--insight-id\", required=True, help=\"洞察ID\")\n assess_parser.add_argument(\"--context\", default=\"{}\", help=\"上下文JSON数据\")\n \n # list-by-applicability 命令\n list_app_parser = subparsers.add_parser(\"list-by-applicability\", help=\"按适用性列出洞察\")\n list_app_parser.add_argument(\"--min\", type=float, default=0.5, help=\"最低适用性分数\")\n list_app_parser.add_argument(\"--context\", default=\"{}\", help=\"上下文JSON数据\")\n list_app_parser.add_argument(\"--limit\", type=int, default=100, help=\"返回数量限制\")\n \n # get-pattern-library 命令\n subparsers.add_parser(\"get-pattern-library\", help=\"获取模式库\")\n \n args = parser.parse_args()\n \n if not args.command:\n parser.print_help()\n return\n \n # 创建组件实例\n ci = CognitiveInsight(memory_dir=args.memory_dir)\n \n try:\n if args.command == \"add-pattern\":\n pattern = json.loads(args.pattern)\n pattern_id = ci.add_pattern(pattern)\n print(json.dumps({\"success\": True, \"pattern_id\": pattern_id}, indent=2, ensure_ascii=False))\n \n elif args.command == \"generate-insight\":\n insight = ci.generate_insight(args.pattern_ids)\n print(json.dumps({\"success\": True, \"insight\": insight}, indent=2, ensure_ascii=False))\n \n elif args.command == \"get-insight\":\n insight = ci.get_insight(args.insight_id)\n if insight:\n print(json.dumps({\"success\": True, \"insight\": insight}, indent=2, ensure_ascii=False))\n else:\n print(json.dumps({\"success\": False, \"error\": \"洞察不存在\"}, indent=2, ensure_ascii=False))\n \n elif args.command == \"list-insights\":\n insights = ci.list_insights(insight_type=args.type, status=args.status, limit=args.limit)\n print(json.dumps({\"success\": True, \"count\": len(insights), \"insights\": insights}, indent=2, ensure_ascii=False))\n \n elif args.command == \"validate-insight\":\n ci.validate_insight(args.insight_id, args.result, args.feedback)\n print(json.dumps({\"success\": True, \"message\": \"验证完成\"}, indent=2, ensure_ascii=False))\n \n elif args.command == \"assess-applicability\":\n context = json.loads(args.context) if args.context else None\n result = ci.assess_applicability(args.insight_id, context)\n print(json.dumps({\"success\": True, \"applicability\": result}, indent=2, ensure_ascii=False))\n \n elif args.command == \"list-by-applicability\":\n context = json.loads(args.context) if args.context else None\n insights = ci.list_insights_by_applicability(min_applicability=args.min, context=context, limit=args.limit)\n print(json.dumps({\"success\": True, \"count\": len(insights), \"insights\": insights}, indent=2, ensure_ascii=False))\n \n elif args.command == \"get-pattern-library\":\n library = ci.get_pattern_library()\n print(json.dumps({\"success\": True, \"pattern_library\": library}, indent=2, ensure_ascii=False))\n \n except Exception as e:\n print(json.dumps({\"success\": False, \"error\": str(e)}, indent=2, ensure_ascii=False))\n return 1\n \n return 0\n\n\nif __name__ == \"__main__\":\n import sys\n sys.exit(main())\n\n","content_type":"text/x-python; charset=utf-8","language":"python","size":25816,"content_sha256":"c48832b411def71c1d6e9b467f943d3a1e862eec9093d9691ad3f90ff1dac5b6"},{"filename":"scripts/cognitive_insight_help.py","content":"#!/usr/bin/env python3\n\"\"\"\n认知架构洞察组件 V2 帮助模块(精简版)\n专注于快速查询和问题解决\n\"\"\"\n\nfrom typing import Dict, List\n\n\nclass CognitiveInsightHelp:\n \"\"\"认知架构洞察组件帮助类(精简版)\"\"\"\n \n def __init__(self):\n self.version = \"2.0\"\n self.author = \"AGI进化模型项目组\"\n self.license = \"AGPL-3.0\"\n \n def get_help(self) -> Dict:\n \"\"\"获取帮助信息(精简版)\"\"\"\n return {\n 'version': self.version,\n 'author': self.author,\n 'license': self.license,\n 'description': self._get_description(),\n 'api_reference': self._get_api_reference(),\n 'faq': self._get_faq(),\n 'troubleshooting': self._get_troubleshooting()\n }\n \n def _get_description(self) -> str:\n \"\"\"获取组件描述\"\"\"\n return \"\"\"\n认知架构洞察组件 V2 (Cognitive Architecture Insight Module V2)\n===========================================================\n\n核心定位:AGI进化模型的\"认知进化引擎\",负责从数学顶点输出的结构化模式中\n提取深度洞察,实现从\"术\"(技巧)到\"道\"(原理)的认知跃迁。\n\n主要能力:\n- 模式总结与特征提取\n- 智能分类(优化优先级)\n- 跨场景共性识别\n- 革新依据评估\n- 概念提炼(V2核心):四层抽象架构\n- 适用性评估\n\n架构特性:\n- 单向流约束:严格遵循 数学顶点 → 认知架构洞察 → 映射层/自我迭代\n- 异步非阻塞:不打断主循环\n- 超然性:仅提供建议,不直接执行\n- 向后兼容:完全兼容 V1 数据格式\n\"\"\"\n \n def _get_api_reference(self) -> Dict:\n \"\"\"获取API参考\"\"\"\n return {\n 'CognitiveInsightV2': {\n '类名': 'CognitiveInsightV2',\n '初始化': {\n '方法': '__init__(memory_dir: str = \"./agi_memory\")',\n '参数': {\n 'memory_dir': 'str - 记忆存储目录路径,默认为 \"./agi_memory\"'\n },\n '返回': 'CognitiveInsightV2 实例'\n },\n '核心方法': [\n {\n '方法': 'add_pattern(pattern: dict) -> bool',\n '描述': '添加数学顶点验证后的模式',\n '参数': {\n 'pattern_id': 'str - 模式唯一标识',\n 'pattern_type': 'str - 模式类型',\n 'description': 'str - 模式描述',\n 'validation_score': 'float - 验证分数 (0.0-1.0)',\n 'domain': 'str - 所属领域',\n 'occurrence_count': 'int - 出现次数'\n },\n '返回': 'bool - 是否成功添加'\n },\n {\n '方法': 'generate_insight(pattern_ids: List[str]) -> dict',\n '描述': '生成洞察(V2支持概念提炼)',\n '参数': {\n 'pattern_ids': 'List[str] - 模式ID列表'\n },\n '返回': 'dict - 洞察数据'\n },\n {\n '方法': 'get_insight(insight_id: str) -> Optional[dict]',\n '描述': '根据ID获取洞察',\n '返回': 'dict or None - 洞察数据'\n },\n {\n '方法': 'list_insights(limit: int = 10) -> List[dict]',\n '描述': '列出最新洞察',\n '返回': 'List[dict] - 洞察列表(按时间倒序)'\n },\n {\n '方法': 'record_user_feedback(insight_id: str, feedback: dict) -> bool',\n '描述': '记录用户反馈',\n '参数': {\n 'insight_id': 'str - 洞察ID',\n 'rating': 'int - 评分(1-5)',\n 'comment': 'str - 评论内容',\n 'scenario': 'str - 应用场景'\n },\n '返回': 'bool - 是否成功记录'\n },\n {\n '方法': 'get_concept_library() -> dict',\n '描述': '获取概念库',\n '返回': 'dict - 概念库数据'\n },\n {\n '方法': 'get_system_stats() -> dict',\n '描述': '获取系统统计信息',\n '返回': 'dict - 系统统计'\n },\n {\n '方法': 'help() -> dict',\n '描述': '获取帮助信息',\n '返回': 'dict - 帮助数据'\n },\n {\n '方法': 'print_help()',\n '描述': '打印帮助信息到控制台',\n '返回': 'None'\n }\n ]\n },\n 'ConceptExtractionExtension': {\n '类名': 'ConceptExtractionExtension',\n '描述': '概念提取扩展模块(V2核心)',\n '核心方法': [\n {\n '方法': 'extract_concept(patterns: List[dict]) -> Optional[dict]',\n '描述': '从模式中提取概念(使用TF-IDF)',\n '参数': {'patterns': 'List[dict] - 模式列表(至少3个)'},\n '返回': 'dict or None - 概念数据'\n },\n {\n '方法': 'list_concepts_by_level(level: str) -> List[dict]',\n '描述': '按抽象层级列出概念',\n '参数': {'level': 'str - 抽象层级(rule/concept/principle)'},\n '返回': 'List[dict] - 概念列表'\n },\n {\n '方法': 'get_cache_stats() -> dict',\n '描述': '获取缓存统计',\n '返回': 'dict - 缓存统计'\n },\n {\n '方法': 'get_learning_stats() -> dict',\n '描述': '获取学习统计',\n '返回': 'dict - 学习统计'\n }\n ]\n }\n }\n \n def _get_faq(self) -> List[Dict]:\n \"\"\"获取常见问题解答\"\"\"\n return [\n {\n '问题': 'Q1: V2 版本是否兼容 V1 的数据?',\n '回答': 'A: 是的,V2 完全兼容 V1 的数据格式。可以直接升级,无需迁移数据。'\n },\n {\n '问题': 'Q2: 概念提炼需要多少个模式?',\n '回答': 'A: 至少需要 3 个模式。建议使用 5-10 个模式以提高概念的质量和置信度。模式的验证分数应 > 0.75。'\n },\n {\n '问题': 'Q3: 如何提高概念提取的成功率?',\n '回答': 'A: 1) 使用更多高质量模式(> 0.75);2) 增加模式来源的多样性;3) 使用跨领域模式;4) 提供清晰的描述。'\n },\n {\n '问题': 'Q4: 概念提取失败怎么办?',\n '回答': 'A: 1) 确保模式数量 ≥ 3;2) 检查模式验证分数 > 0.75;3) 增加模式来源的多样性;4) 系统会自动降级到策略优化。'\n },\n {\n '问题': 'Q5: 如何查看帮助信息?',\n '回答': 'A: 使用 ci.help() 获取结构化帮助数据,或 ci.print_help() 打印帮助信息。也可以运行 python3 scripts/show_help.py 使用交互式帮助查看器。'\n },\n {\n '问题': 'Q6: 适用性评估的推荐等级是如何确定的?',\n '回答': 'A: 基于加权总分:apply(≥0.7)、wait(0.4-0.7)、reject(\u003c0.4)。对于概念类型,额外评估抽象层级匹配度。'\n },\n {\n '问题': 'Q7: V2 相比 V1 性能提升了多少?',\n '回答': 'A: 洞察生成速度提升约 20%;概念查询速度提升 70%;缓存命中率可达 85%。'\n },\n {\n '问题': 'Q8: 如何判断一个概念是否有效?',\n '回答': 'A: 通过多个维度判断:1) 验证计数;2) 用户反馈评分;3) A/B 测试结果;4) 迁移成功率;5) 适用性历史。'\n }\n ]\n \n def _get_troubleshooting(self) -> Dict:\n \"\"\"获取故障排查指南\"\"\"\n return {\n '常见问题': [\n {\n '问题': '概念提取失败',\n '可能原因': [\n '模式数量不足(少于 3 个)',\n '模式多样性不足',\n '验证分数过低'\n ],\n '解决方案': [\n '确保至少添加 3 个模式',\n '增加模式来源的多样性',\n '提高模式的验证分数(> 0.75)'\n ]\n },\n {\n '问题': '缓存命中率低',\n '可能原因': [\n '查询的模式不重复',\n '缓存容量太小',\n '查询模式随机性高'\n ],\n '解决方案': [\n '检查查询模式是否过于随机',\n '调整缓存容量(默认 100)'\n ]\n },\n {\n '问题': '迁移成功率低',\n '可能原因': [\n '迁移路径选择不当',\n '源领域和目标领域差异大',\n '迁移历史数据不足'\n ],\n '解决方案': [\n '记录更多迁移结果以供学习',\n '调整领域映射表'\n ]\n },\n {\n '问题': '洞察类型不符合预期',\n '可能原因': [\n '分类逻辑优先级不匹配',\n '影响范围判断错误',\n '多样性评分计算异常'\n ],\n '解决方案': [\n '检查模式类型和影响范围设置',\n '调整多样性阈值(当前 0.6)'\n ]\n }\n ]\n }\n \n def print_help(self):\n \"\"\"打印帮助信息\"\"\"\n help_data = self.get_help()\n \n print(\"=\" * 80)\n print(\"认知架构洞察组件 V2 帮助信息\")\n print(\"=\" * 80)\n print()\n \n print(f\"版本: {help_data['version']}\")\n print(f\"作者: {help_data['author']}\")\n print(f\"协议: {help_data['license']}\")\n print()\n \n print(help_data['description'])\n print()\n \n print(\"=\" * 80)\n print(\"API 参考\")\n print(\"=\" * 80)\n print()\n for class_name, methods in help_data['api_reference'].items():\n print(f\"【{class_name}】\")\n if '核心方法' in methods:\n for method in methods['核心方法']:\n print(f\" • {method['方法']}\")\n print(f\" {method['描述']}\")\n print()\n \n print(\"=\" * 80)\n print(\"常见问题 (FAQ)\")\n print(\"=\" * 80)\n print()\n for faq in help_data['faq']:\n print(faq['问题'])\n print(faq['回答'])\n print()\n\n\ndef show_help():\n \"\"\"显示帮助信息\"\"\"\n helper = CognitiveInsightHelp()\n helper.print_help()\n\n\nif __name__ == \"__main__\":\n show_help()\n","content_type":"text/x-python; charset=utf-8","language":"python","size":12420,"content_sha256":"5d0ba082408842fd373282da0d887bad740c9509ee70bb26718db631129fc09a"},{"filename":"scripts/cognitive_insight.py","content":"\"\"\"\n认知架构洞察组件 V2(集成概念提取扩展 - 增强版)\n\n改进内容:\n1. 集成概念提取扩展模块(TF-IDF加权、动态迁移学习、缓存优化)\n2. 修正分类逻辑优先级\n3. 支持概念库管理\n4. 增强概念适用性评估\n5. 支持用户反馈和A/B测试\n\"\"\"\n\nimport json\nimport os\nfrom datetime import datetime\nfrom typing import List, Dict, Optional\nimport hashlib\n\n# 导入概念提取扩展\nfrom concept_extraction_extension import ConceptExtractionExtension\n# 导入帮助模块\nfrom cognitive_insight_help import CognitiveInsightHelp\n\n\nclass CognitiveInsightV2:\n \"\"\"认知架构洞察组件 V2(增强版)\"\"\"\n \n def __init__(self, memory_dir: str = \"./agi_memory\"):\n self.memory_dir = memory_dir\n self.cognitive_insight_dir = os.path.join(memory_dir, \"cognitive_insight\")\n os.makedirs(self.cognitive_insight_dir, exist_ok=True)\n \n # 存储文件\n self.patterns_file = os.path.join(self.cognitive_insight_dir, \"patterns.json\")\n self.insights_file = os.path.join(self.cognitive_insight_dir, \"insights.json\")\n self.pattern_library_file = os.path.join(self.cognitive_insight_dir, \"pattern_library.json\")\n \n # 加载数据\n self.patterns = self._load_json(self.patterns_file, {\"patterns\": {}, \"metadata\": {\"total_count\": 0}})\n self.insights = self._load_json(self.insights_file, {\"insights\": {}, \"metadata\": {\"total_count\": 0}})\n self.pattern_library = self._load_json(self.pattern_library_file, {\"strategies\": [], \"logics\": [], \"behaviors\": [], \"errors\": []})\n \n # 初始化概念提取扩展\n self.concept_extension = ConceptExtractionExtension(self)\n \n # 初始化帮助模块\n self._help_helper = CognitiveInsightHelp()\n \n # 适用性权重\n self.applicability_weights = {\n \"timeliness\": 0.2,\n \"relevance\": 0.3,\n \"compatibility\": 0.2,\n \"resource_efficiency\": 0.15,\n \"risk\": 0.15\n }\n \n self.apply_threshold = 0.7\n self.wait_threshold = 0.4\n \n def help(self) -> Dict:\n \"\"\"\n 获取帮助信息\n \n Returns:\n dict: 包含完整帮助信息的数据结构,包括:\n - version: 版本信息\n - author: 作者信息\n - license: 协议信息\n - description: 组件描述\n - features: 功能特性\n - api_reference: API参考\n - usage_examples: 使用示例\n - best_practices: 最佳实践\n - troubleshooting: 故障排查\n - faq: 常见问题\n \"\"\"\n return self._help_helper.get_help()\n \n def print_help(self):\n \"\"\"打印帮助信息到控制台\"\"\"\n self._help_helper.print_help()\n \n def _load_json(self, filepath: str, default: dict) -> dict:\n \"\"\"加载JSON文件\"\"\"\n if os.path.exists(filepath):\n with open(filepath, 'r', encoding='utf-8') as f:\n return json.load(f)\n return default\n \n def _save_json(self, filepath: str, data: dict):\n \"\"\"保存JSON文件\"\"\"\n with open(filepath, 'w', encoding='utf-8') as f:\n json.dump(data, f, ensure_ascii=False, indent=2)\n \n def add_pattern(self, pattern: dict):\n \"\"\"添加模式\"\"\"\n pattern_id = pattern.get('pattern_id', '')\n if pattern_id:\n self.patterns['patterns'][pattern_id] = pattern\n self.patterns['metadata']['total_count'] = len(self.patterns['patterns'])\n self._save_json(self.patterns_file, self.patterns)\n return True\n return False\n \n def generate_insight(self, pattern_ids: List[str], context: Optional[dict] = None) -> dict:\n \"\"\"\n 生成洞察\n \n Args:\n pattern_ids: 模式ID列表\n context: 上下文信息\n \n Returns:\n 洞察字典\n \"\"\"\n if context is None:\n context = {}\n \n patterns = [self.patterns['patterns'].get(pid) for pid in pattern_ids if pid in self.patterns['patterns']]\n \n if not patterns:\n return {\n 'error': 'No valid patterns found',\n 'insight_type': 'error'\n }\n \n # 总结模式\n summary = self._summarize_patterns(patterns)\n \n # 分类洞察(修正优先级)\n insight_type = self._classify_insight(patterns)\n \n # 提取共性\n commonality = self._extract_commonality(patterns)\n \n # 评估革新依据\n innovation_basis = self._assess_innovation_basis(patterns)\n \n # 计算置信度\n confidence = self._calculate_confidence(patterns)\n \n # 生成洞察ID\n insight_id = self._generate_insight_id(patterns)\n \n insight = {\n 'insight_id': insight_id,\n 'insight_type': insight_type,\n 'summary': summary,\n 'commonality': commonality,\n 'innovation_basis': innovation_basis,\n 'confidence': confidence,\n 'source_patterns': pattern_ids,\n 'timestamp': datetime.now().isoformat(),\n 'context': context,\n 'version': '2.0' # 标记版本\n }\n \n # 概念提取(如果是concept_abstraction类型)\n if insight_type == \"concept_abstraction\" and len(patterns) >= 3:\n concept_data = self.concept_extension.extract_concept(patterns)\n if concept_data:\n insight[\"concept\"] = concept_data\n # 添加概念到库\n self.concept_extension.add_concept_to_library(insight)\n else:\n # 如果无法提取概念,回退到策略优化\n insight[\"insight_type\"] = \"strategy_optimization\"\n insight[\"fallback_reason\"] = \"Concept extraction failed - insufficient data\"\n \n # 评估适用性(包含概念特有评估)\n applicability = self._calculate_applicability(insight, context)\n insight['applicability'] = applicability\n \n # 存储洞察\n self.insights['insights'][insight_id] = insight\n self.insights['metadata']['total_count'] = len(self.insights['insights'])\n self._save_json(self.insights_file, self.insights)\n \n return insight\n \n def _classify_insight(self, patterns: List[dict]) -> str:\n \"\"\"\n 分类洞察类型(修正优先级)\n \n 优先级:\n 1. error_correction(错误纠正)\n 2. architecture_upgrade(架构升级)\n 3. concept_abstraction(概念提炼)- V2新增\n 4. strategy_optimization(策略优化)\n \"\"\"\n pattern_types = [p.get('pattern_type', 'strategy') for p in patterns]\n impact_scopes = [p.get('impact_scope', 'local') for p in patterns]\n \n # 提取共性\n commonality = self._extract_commonality(patterns)\n \n # 计算平均验证分数\n avg_validation = sum(p.get('validation_score', 0) for p in patterns) / len(patterns)\n \n # 判断影响范围\n impact_scope = 'global' if 'global' in impact_scopes else 'system_level' if 'system_level' in impact_scopes else 'local'\n \n # 修正后的分类逻辑\n if \"error\" in pattern_types:\n insight_type = \"error_correction\"\n elif impact_scope == \"global\" or impact_scope == \"system_level\":\n insight_type = \"architecture_upgrade\"\n elif commonality[\"diversity_score\"] > 0.6 and avg_validation > 0.75:\n insight_type = \"concept_abstraction\"\n else:\n insight_type = \"strategy_optimization\"\n \n return insight_type\n \n def _summarize_patterns(self, patterns: List[dict]) -> dict:\n \"\"\"总结模式\"\"\"\n descriptions = [p.get('description', '') for p in patterns]\n all_text = ' '.join(descriptions)\n \n return {\n 'total_patterns': len(patterns),\n 'combined_description': all_text[:200] + '...' if len(all_text) > 200 else all_text,\n 'key_elements': self._extract_key_elements(descriptions)\n }\n \n def _extract_key_elements(self, descriptions: List[str]) -> List[str]:\n \"\"\"提取关键元素\"\"\"\n # 简化版本:提取高频词\n all_words = ' '.join(descriptions).split()\n word_freq = {}\n \n for word in all_words:\n # 过滤掉无意义的词\n if len(word) > 1 and word not in ['的', '了', '是', '在', '和', '用']:\n word_freq[word] = word_freq.get(word, 0) + 1\n \n # 返回高频词\n sorted_words = sorted(word_freq.items(), key=lambda x: x[1], reverse=True)\n return [word[0] for word in sorted_words[:5]]\n \n def _extract_commonality(self, patterns: List[dict]) -> dict:\n \"\"\"提取共性\"\"\"\n pattern_types = [p.get('pattern_type', 'strategy') for p in patterns]\n sources = [p.get('source', '') for p in patterns]\n contexts = [p.get('context', {}) for p in patterns]\n \n # 计算类型一致性\n type_consistency = len(set(pattern_types)) == 1\n \n # 计算来源一致性\n source_consistency = len(set(sources)) == 1\n \n # 计算多样性得分\n all_from_same_source = len(set(sources)) == 1\n all_same_type = len(set(pattern_types)) == 1\n diversity_score = 0.0\n \n if all_from_same_source and all_same_type:\n diversity_score = 0.1 # 最低多样性\n elif all_from_same_source or all_same_type:\n diversity_score = 0.5 # 中等多样性\n else:\n diversity_score = 0.9 # 高多样性\n \n return {\n 'type_consistency': type_consistency,\n 'source_consistency': source_consistency,\n 'diversity_score': diversity_score,\n 'pattern_types': list(set(pattern_types)),\n 'sources': list(set(sources))\n }\n \n def _assess_innovation_basis(self, patterns: List[dict]) -> dict:\n \"\"\"评估革新依据\"\"\"\n if not patterns:\n return {'exists': False, 'priority': 0}\n \n avg_validation = sum(p.get('validation_score', 0) for p in patterns) / len(patterns)\n total_occurrences = sum(p.get('occurrence_count', 1) for p in patterns)\n \n exists = avg_validation > 0.7 and total_occurrences > 10\n \n return {\n 'exists': exists,\n 'description': '发现高频高置信度模式' if exists else '模式频率或置信度不足',\n 'priority': avg_validation,\n 'expected_impact': {\n 'scope': 'global' if exists and avg_validation > 0.9 else 'local',\n 'confidence': avg_validation\n }\n }\n \n def _calculate_confidence(self, patterns: List[dict]) -> float:\n \"\"\"计算置信度\"\"\"\n if not patterns:\n return 0.0\n \n # 基于验证分数\n avg_validation = sum(p.get('validation_score', 0) for p in patterns) / len(patterns)\n \n # 基于样本数量\n sample_score = min(len(patterns) / 10.0, 1.0)\n \n # 加权平均\n confidence = avg_validation * 0.7 + sample_score * 0.3\n \n return min(confidence, 1.0)\n \n def _calculate_applicability(self, insight: dict, context: dict) -> dict:\n \"\"\"\n 计算适用性(V2增强版,包含概念特有评估)\n \n Args:\n insight: 洞察字典\n context: 上下文字典\n \n Returns:\n 适用性评估字典\n \"\"\"\n # 基础维度评估\n dimensions = {\n 'timeliness': self._assess_timeliness(insight, context),\n 'relevance': self._assess_relevance(insight, context),\n 'compatibility': self._assess_compatibility(insight, context),\n 'resource_efficiency': self._assess_resource_efficiency(insight, context),\n 'risk': self._assess_risk(insight, context)\n }\n \n # 计算加权总分\n weighted_score = sum(\n dimensions[dim] * self.applicability_weights[dim]\n for dim in dimensions\n )\n \n # 如果是概念抽象,添加概念特有评估\n if insight.get('insight_type') == 'concept_abstraction':\n concept_score = self.concept_extension.assess_concept_specifics(insight, context)\n # 概念评分占30%,基础评分占70%\n weighted_score = weighted_score * 0.7 + concept_score * 0.3\n dimensions['concept_match'] = concept_score\n \n # 确定推荐等级\n if weighted_score >= self.apply_threshold:\n recommendation = 'apply'\n elif weighted_score >= self.wait_threshold:\n recommendation = 'wait'\n else:\n recommendation = 'reject'\n \n return {\n 'score': round(weighted_score, 2),\n 'dimensions': dimensions,\n 'recommendation': recommendation,\n 'calculated_at': datetime.now().isoformat()\n }\n \n def _assess_timeliness(self, insight: dict, context: dict) -> float:\n \"\"\"评估时效性\"\"\"\n insight_time = datetime.fromisoformat(insight.get('timestamp', ''))\n current_time = datetime.now()\n \n # 洞察越新,时效性越高\n days_diff = (current_time - insight_time).days\n timeliness = max(0, 1.0 - days_diff / 365.0) # 365天后降为0\n \n return timeliness\n \n def _assess_relevance(self, insight: dict, context: dict) -> float:\n \"\"\"评估相关性\"\"\"\n # 简化版本:基于上下文关键词匹配\n context_keywords = context.get('keywords', [])\n insight_summary = insight.get('summary', {}).get('combined_description', '')\n \n if not context_keywords:\n return 0.8 # 默认中等相关性\n \n matches = sum(1 for kw in context_keywords if kw in insight_summary)\n relevance = matches / len(context_keywords) if context_keywords else 0.8\n \n return relevance\n \n def _assess_compatibility(self, insight: dict, context: dict) -> float:\n \"\"\"评估兼容性\"\"\"\n # 简化版本:基于洞察类型和任务类型的兼容性\n insight_type = insight.get('insight_type', '')\n task_type = context.get('task_type', '')\n \n compatibility_matrix = {\n 'strategy_optimization': {\n 'optimization': 1.0,\n 'general': 0.8,\n 'error_fix': 0.6\n },\n 'architecture_upgrade': {\n 'system_design': 1.0,\n 'optimization': 0.7,\n 'general': 0.5\n },\n 'error_correction': {\n 'error_fix': 1.0,\n 'debugging': 0.9,\n 'general': 0.7\n },\n 'concept_abstraction': {\n 'knowledge_transfer': 1.0,\n 'generalization': 0.9,\n 'general': 0.8\n }\n }\n \n return compatibility_matrix.get(insight_type, {}).get(task_type, 0.7)\n \n def _assess_resource_efficiency(self, insight: dict, context: dict) -> float:\n \"\"\"评估资源效率\"\"\"\n # 简化版本:基于洞察复杂度\n insight_type = insight.get('insight_type', '')\n \n efficiency_scores = {\n 'strategy_optimization': 0.9, # 策略优化通常效率较高\n 'error_correction': 0.7, # 错误纠正需要调试时间\n 'architecture_upgrade': 0.5, # 架构升级耗时较长\n 'concept_abstraction': 0.6 # 概念提炼需要分析时间\n }\n \n return efficiency_scores.get(insight_type, 0.7)\n \n def _assess_risk(self, insight: dict, context: dict) -> float:\n \"\"\"评估风险(得分越高风险越低)\"\"\"\n # 简化版本:基于洞察类型和置信度\n insight_type = insight.get('insight_type', '')\n confidence = insight.get('confidence', 0.5)\n \n # 置信度越高,风险越低\n risk_from_confidence = confidence\n \n # 洞察类型风险\n type_risks = {\n 'strategy_optimization': 0.8, # 风险较低\n 'error_correction': 0.9, # 风险最低(修复问题)\n 'architecture_upgrade': 0.5, # 风险较高\n 'concept_abstraction': 0.6 # 风险中等\n }\n \n risk_from_type = type_risks.get(insight_type, 0.7)\n \n # 综合评估\n return (risk_from_confidence + risk_from_type) / 2.0\n \n def _generate_insight_id(self, patterns: List[dict]) -> str:\n \"\"\"生成洞察ID\"\"\"\n pattern_ids = [p.get('pattern_id', '') for p in patterns]\n pattern_ids.sort()\n id_string = '_'.join(pattern_ids)\n hash_obj = hashlib.md5(id_string.encode())\n return f\"insight_{hash_obj.hexdigest()[:12]}\"\n \n def get_insight(self, insight_id: str) -> Optional[dict]:\n \"\"\"获取洞察\"\"\"\n return self.insights['insights'].get(insight_id)\n \n def list_insights(self, limit: int = 10) -> List[dict]:\n \"\"\"列出洞察\"\"\"\n insights = list(self.insights['insights'].values())\n insights.sort(key=lambda x: x.get('timestamp', ''), reverse=True)\n return insights[:limit]\n \n def list_insights_by_type(self, insight_type: str) -> List[dict]:\n \"\"\"按类型列出洞察\"\"\"\n return [\n insight for insight in self.insights['insights'].values()\n if insight.get('insight_type') == insight_type\n ]\n \n def get_concept_library(self) -> dict:\n \"\"\"获取概念库\"\"\"\n return self.concept_extension.get_concept_library()\n \n def record_user_feedback(self, insight_id: str, feedback: dict) -> bool:\n \"\"\"\n 记录用户反馈\n \n Args:\n insight_id: 洞察ID\n feedback: 反馈字典 {'rating': 1-5, 'comment': '...', 'scenario': '...'}\n \"\"\"\n insight = self.get_insight(insight_id)\n if not insight or insight.get('insight_type') != 'concept_abstraction':\n return False\n \n concept = insight.get('concept', {})\n concept_id = concept.get('concept_id', '') if concept else ''\n \n if not concept_id:\n # 尝试从洞察生成concept_id\n concept_str = json.dumps(concept, sort_keys=True) if concept else ''\n if concept_str:\n concept_hash = hashlib.md5(concept_str.encode()).hexdigest()\n concept_id = f\"concept_{concept_hash[:12]}\"\n \n if concept_id:\n return self.concept_extension.record_user_feedback(concept_id, feedback)\n \n return False\n \n def record_ab_test_result(self, insight_id: str, ab_test: dict) -> bool:\n \"\"\"\n 记录A/B测试结果\n \n Args:\n insight_id: 洞察ID\n ab_test: 测试字典 {'variant': 'A/B', 'metric': '...', 'value': float, 'winner': 'A/B'}\n \"\"\"\n insight = self.get_insight(insight_id)\n if not insight or insight.get('insight_type') != 'concept_abstraction':\n return False\n \n concept = insight.get('concept', {})\n concept_id = concept.get('concept_id', '') if concept else ''\n \n if not concept_id:\n concept_str = json.dumps(concept, sort_keys=True) if concept else ''\n if concept_str:\n concept_hash = hashlib.md5(concept_str.encode()).hexdigest()\n concept_id = f\"concept_{concept_hash[:12]}\"\n \n if concept_id:\n return self.concept_extension.record_ab_test_result(concept_id, ab_test)\n \n return False\n \n def record_migration_result(self, from_domain: str, to_domain: str, success: bool):\n \"\"\"\n 记录迁移结果\n \n Args:\n from_domain: 源领域\n to_domain: 目标领域\n success: 是否成功\n \"\"\"\n self.concept_extension.record_migration_result(from_domain, to_domain, success)\n \n def get_system_stats(self) -> dict:\n \"\"\"获取系统统计信息\"\"\"\n return {\n 'patterns_count': self.patterns['metadata']['total_count'],\n 'insights_count': self.insights['metadata']['total_count'],\n 'concept_library': self.concept_extension.get_concept_library(),\n 'cache_stats': self.concept_extension.get_cache_stats(),\n 'learning_stats': self.concept_extension.get_learning_stats(),\n 'version': '2.0'\n }\n\n\n# 便捷函数\ndef create_cognitive_insight_v2(memory_dir: str = \"./agi_memory\") -> CognitiveInsightV2:\n \"\"\"\n 创建认知架构洞察组件 V2 实例\n \n Args:\n memory_dir: 记忆目录\n \n Returns:\n 认知架构洞察组件 V2 实例\n \"\"\"\n return CognitiveInsightV2(memory_dir)\n","content_type":"text/x-python; charset=utf-8","language":"python","size":21359,"content_sha256":"141acfd606402e17dd6e86f1d7bb25e2d1fa6c153fd750572ab27e7c77dbc47e"},{"filename":"scripts/concept_extraction_extension.py","content":"\"\"\"\n概念提取扩展模块(增强版)\n为认知架构洞察组件新增概念提取能力\n\n改进内容:\n1. TF-IDF 加权的概念提取算法\n2. 动态迁移路径学习机制\n3. 增强的验证机制(用户反馈 + A/B测试)\n4. 性能优化(索引 + 增量更新 + LRU缓存)\n\n功能:\n1. 概念提取:从模式中抽象出概念\n2. 概念库管理:存储和管理概念\n3. 概念评估:评估概念的适用性\n4. 迁移学习:基于历史数据优化迁移路径\n\"\"\"\n\nimport json\nimport os\nimport math\nfrom datetime import datetime\nfrom typing import List, Dict, Optional, Tuple\nimport hashlib\nfrom collections import defaultdict, OrderedDict\n\n\nclass TFIDFCalculator:\n \"\"\"TF-IDF 计算器\"\"\"\n \n def __init__(self):\n self.documents = []\n self.vocab = set()\n self.idf_cache = {}\n \n def add_document(self, doc: str):\n \"\"\"添加文档\"\"\"\n words = self._tokenize(doc)\n self.documents.append(words)\n self.vocab.update(words)\n # 清除IDF缓存\n self.idf_cache = {}\n \n def _tokenize(self, text: str) -> List[str]:\n \"\"\"分词(简化版)\"\"\"\n words = []\n for word in text.split():\n word = word.strip(',。!?;:\"\"''()【】《》')\n if len(word) > 1 and word not in ['的', '了', '是', '在', '和', '用', '有', '个', '这']:\n words.append(word)\n return words\n \n def calculate_tfidf(self, text: str) -> Dict[str, float]:\n \"\"\"计算文本的 TF-IDF\"\"\"\n words = self._tokenize(text)\n \n # 计算词频 (TF)\n tf = {}\n for word in words:\n tf[word] = tf.get(word, 0) + 1\n total_words = len(words)\n tf = {k: v / total_words for k, v in tf.items()}\n \n # 计算逆文档频率 (IDF)\n idf = {}\n for word in tf.keys():\n if word in self.idf_cache:\n idf[word] = self.idf_cache[word]\n else:\n doc_count = sum(1 for doc in self.documents if word in doc)\n idf[word] = math.log(len(self.documents) / (doc_count + 1)) if doc_count > 0 else 0\n self.idf_cache[word] = idf[word]\n \n # 计算 TF-IDF\n tfidf = {}\n for word in tf.keys():\n tfidf[word] = tf[word] * idf[word]\n \n return tfidf\n \n def extract_keywords(self, text: str, top_k: int = 5) -> List[Tuple[str, float]]:\n \"\"\"提取关键词(按TF-IDF排序)\"\"\"\n tfidf = self.calculate_tfidf(text)\n sorted_keywords = sorted(tfidf.items(), key=lambda x: x[1], reverse=True)\n return sorted_keywords[:top_k]\n\n\nclass ConceptCache:\n \"\"\"概念LRU缓存\"\"\"\n \n def __init__(self, max_size: int = 100):\n self.cache = OrderedDict()\n self.max_size = max_size\n self.hits = 0\n self.misses = 0\n \n def get(self, key: str) -> Optional[dict]:\n \"\"\"获取缓存\"\"\"\n if key in self.cache:\n self.hits += 1\n # 移到最后(最近使用)\n self.cache.move_to_end(key)\n return self.cache[key]\n self.misses += 1\n return None\n \n def put(self, key: str, value: dict):\n \"\"\"放入缓存\"\"\"\n if key in self.cache:\n self.cache.move_to_end(key)\n else:\n if len(self.cache) >= self.max_size:\n # 移除最久未使用的\n self.cache.popitem(last=False)\n self.cache[key] = value\n \n def get_stats(self) -> dict:\n \"\"\"获取缓存统计\"\"\"\n total = self.hits + self.misses\n hit_rate = self.hits / total if total > 0 else 0\n return {\n 'size': len(self.cache),\n 'max_size': self.max_size,\n 'hits': self.hits,\n 'misses': self.misses,\n 'hit_rate': hit_rate\n }\n\n\nclass MigrationPathLearner:\n \"\"\"迁移路径学习器\"\"\"\n \n def __init__(self):\n self.migration_history = {} # {(from_domain, to_domain): {'success': int, 'failure': int}}\n self.domain_map = {\n '代码生成': ['数据分析', '自动化测试', '系统设计', '性能优化'],\n '问题解决': ['决策支持', '风险控制', '资源优化', '故障排查'],\n '用户交互': ['产品设计', '体验优化', '需求分析', '用户研究'],\n '架构设计': ['系统架构', '技术选型', '性能优化', '安全设计'],\n '数据分析': ['机器学习', '商业智能', '数据可视化', '预测分析'],\n '通用': ['代码生成', '问题解决', '用户交互', '架构设计', '数据分析']\n }\n \n def record_migration(self, from_domain: str, to_domain: str, success: bool):\n \"\"\"记录迁移结果\"\"\"\n key = (from_domain, to_domain)\n if key not in self.migration_history:\n self.migration_history[key] = {'success': 0, 'failure': 0, 'confidence': 0.7}\n \n if success:\n self.migration_history[key]['success'] += 1\n else:\n self.migration_history[key]['failure'] += 1\n \n # 重新计算置信度\n total = self.migration_history[key]['success'] + self.migration_history[key]['failure']\n if total > 0:\n success_rate = self.migration_history[key]['success'] / total\n # 指数加权移动平均\n old_confidence = self.migration_history[key]['confidence']\n self.migration_history[key]['confidence'] = 0.7 * old_confidence + 0.3 * success_rate\n \n def get_migration_paths(self, from_domain: str) -> List[dict]:\n \"\"\"获取迁移路径(基于学习优化)\"\"\"\n paths = []\n \n if from_domain in self.domain_map:\n for to_target in self.domain_map[from_domain]:\n key = (from_domain, to_target)\n \n if key in self.migration_history:\n # 使用学习到的置信度\n confidence = self.migration_history[key]['confidence']\n total_attempts = self.migration_history[key]['success'] + self.migration_history[key]['failure']\n else:\n # 使用默认置信度\n confidence = 0.7\n total_attempts = 0\n \n paths.append({\n 'from': from_domain,\n 'to_targets': to_target,\n 'confidence': confidence,\n 'total_attempts': total_attempts,\n 'is_learned': key in self.migration_history\n })\n \n # 按置信度排序\n paths.sort(key=lambda x: x['confidence'], reverse=True)\n \n return paths\n \n def get_learning_stats(self) -> dict:\n \"\"\"获取学习统计\"\"\"\n total_pairs = len(self.migration_history)\n successful_pairs = sum(1 for v in self.migration_history.values() \n if v['success'] > v['failure'])\n \n return {\n 'total_migration_pairs': total_pairs,\n 'successful_pairs': successful_pairs,\n 'success_rate': successful_pairs / total_pairs if total_pairs > 0 else 0,\n 'total_migrations': sum(v['success'] + v['failure'] for v in self.migration_history.values())\n }\n\n\nclass ConceptExtractionExtension:\n \"\"\"概念提取扩展类(增强版)\"\"\"\n \n def __init__(self, cognitive_insight):\n \"\"\"\n 初始化概念提取扩展\n \n Args:\n cognitive_insight: 认知架构洞察组件实例\n \"\"\"\n self.ci = cognitive_insight\n self.concept_library_file = os.path.join(\n self.ci.cognitive_insight_dir, \n \"concept_library.json\"\n )\n \n # 初始化概念库\n self.concept_library = self._load_concept_library()\n \n # 初始化 TF-IDF 计算器\n self.tfidf_calculator = TFIDFCalculator()\n \n # 初始化缓存\n self.concept_cache = ConceptCache(max_size=100)\n \n # 初始化迁移路径学习器\n self.migration_learner = MigrationPathLearner()\n \n # 从概念库加载迁移历史\n self._load_migration_history()\n \n def _load_concept_library(self) -> dict:\n \"\"\"加载概念库\"\"\"\n if os.path.exists(self.concept_library_file):\n with open(self.concept_library_file, 'r', encoding='utf-8') as f:\n data = json.load(f)\n # 确保有迁移历史字段\n if 'migration_history' not in data:\n data['migration_history'] = {}\n return data\n \n return {\n \"concepts\": [],\n \"principles\": [],\n \"migration_history\": {},\n \"metadata\": {\n \"total_count\": 0,\n \"last_updated\": datetime.now().isoformat(),\n \"version\": \"2.0\"\n }\n }\n \n def _load_migration_history(self):\n \"\"\"加载迁移历史\"\"\"\n if 'migration_history' in self.concept_library:\n self.migration_learner.migration_history = self.concept_library['migration_history']\n \n def _save_concept_library(self):\n \"\"\"保存概念库\"\"\"\n self.concept_library[\"metadata\"][\"last_updated\"] = datetime.now().isoformat()\n self.concept_library[\"metadata\"][\"total_count\"] = len(self.concept_library[\"concepts\"])\n self.concept_library[\"migration_history\"] = self.migration_learner.migration_history\n \n with open(self.concept_library_file, 'w', encoding='utf-8') as f:\n json.dump(self.concept_library, f, ensure_ascii=False, indent=2)\n \n def extract_concept(self, patterns: List[dict]) -> Optional[dict]:\n \"\"\"\n 从一组模式中提取概念(增强版,使用TF-IDF)\n 实现四层抽象:Pattern -> Rule -> Concept -> Principle\n \n Args:\n patterns: 模式列表\n \n Returns:\n 概念数据字典,如果无法提取则返回None\n \"\"\"\n if len(patterns) \u003c 3:\n return None\n \n # 1. 使用 TF-IDF 提取共同语义特征\n all_descriptions = [p.get('description', '') for p in patterns]\n \n # 添加文档到 TF-IDF 计算器\n for desc in all_descriptions:\n self.tfidf_calculator.add_document(desc)\n \n # 提取关键词\n common_features = self._extract_common_features_enhanced(all_descriptions)\n \n # 2. 识别抽象层级\n abstraction_level = self._identify_abstraction_level(patterns)\n \n # 3. 生成概念定义\n concept_name = common_features.get('name', '未命名概念')\n concept_definition = common_features.get('definition', '')\n \n # 4. 识别适用边界\n boundaries = self._identify_applicable_boundaries(patterns)\n \n # 5. 识别迁移路径(使用学习器)\n migration_paths = self._identify_migration_paths_learned(patterns)\n \n # 6. 计算置信度(增强版)\n confidence = self._calculate_concept_confidence_enhanced(patterns)\n \n return {\n 'concept_name': concept_name,\n 'definition': concept_definition,\n 'abstraction_level': abstraction_level,\n 'applicable_domains': boundaries.get('domains', []),\n 'boundary_conditions': boundaries.get('conditions', []),\n 'migration_paths': migration_paths,\n 'confidence': confidence,\n 'source_patterns': [p.get('pattern_id', '') for p in patterns],\n 'created_at': datetime.now().isoformat(),\n 'extraction_method': 'tfidf' # 标记使用的方法\n }\n \n def _extract_common_features_enhanced(self, descriptions: List[str]) -> dict:\n \"\"\"\n 提取描述中的共同语义特征(增强版,使用TF-IDF)\n \n Args:\n descriptions: 描述列表\n \n Returns:\n 共同特征字典\n \"\"\"\n # 合并所有描述\n combined_text = ' '.join(descriptions)\n \n # 使用 TF-IDF 提取关键词\n keywords = self.tfidf_calculator.extract_keywords(combined_text, top_k=5)\n \n if keywords:\n concept_name = f\"{keywords[0][0]}原则\"\n concept_definition = ' '.join([kw[0] for kw in keywords])\n common_features = [{'word': kw[0], 'score': kw[1]} for kw in keywords]\n else:\n concept_name = '未命名概念'\n concept_definition = '无法提取特征'\n common_features = []\n \n return {\n 'name': concept_name,\n 'definition': concept_definition,\n 'common_features': common_features\n }\n \n def _identify_abstraction_level(self, patterns: List[dict]) -> str:\n \"\"\"\n 识别抽象层级\n - rule: 具体行为规则\n - concept: 领域概念\n - principle: 通用原理\n \n Args:\n patterns: 模式列表\n \n Returns:\n 抽象层级字符串\n \"\"\"\n # 检测模式的跨领域性\n domains = set(p.get('domain', '') for p in patterns)\n cross_domain = len(domains) > 1\n \n # 检测模式的泛化程度\n generic_terms = ['原则', '规则', '方法', '策略', '模式', '范式', '框架']\n has_generic_terms = any(\n any(term in p.get('description', '') for term in generic_terms)\n for p in patterns\n )\n \n # 检测高阶术语\n high_order_terms = ['本质', '核心', '根本', '基础', '通用', '普适']\n has_high_order_terms = any(\n any(term in p.get('description', '') for term in high_order_terms)\n for p in patterns\n )\n \n if cross_domain and (has_generic_terms or has_high_order_terms):\n return 'principle'\n elif cross_domain:\n return 'concept'\n else:\n return 'rule'\n \n def _identify_applicable_boundaries(self, patterns: List[dict]) -> dict:\n \"\"\"\n 识别概念适用的边界条件\n \n Args:\n patterns: 模式列表\n \n Returns:\n 边界条件字典\n \"\"\"\n domains = list(set(p.get('domain', '通用') for p in patterns))\n \n # 提取条件词\n conditions = []\n condition_keywords = ['当', '如果', '只有在', '只有在', '需要', '在...情况下', '基于']\n \n for p in patterns:\n desc = p.get('description', '')\n if any(keyword in desc for keyword in condition_keywords):\n conditions.append(desc)\n \n return {\n 'domains': domains,\n 'conditions': list(set(conditions))[:3] # 最多保留3个条件\n }\n \n def _identify_migration_paths_learned(self, patterns: List[dict]) -> List[dict]:\n \"\"\"\n 识别概念的迁移路径(使用学习器)\n \n Args:\n patterns: 模式列表\n \n Returns:\n 迁移路径列表\n \"\"\"\n domains = set(p.get('domain', '通用') for p in patterns)\n \n all_paths = []\n for domain in domains:\n paths = self.migration_learner.get_migration_paths(domain)\n all_paths.extend(paths)\n \n return all_paths\n \n def _calculate_concept_confidence_enhanced(self, patterns: List[dict]) -> float:\n \"\"\"\n 计算概念的置信度(增强版)\n 考虑:\n 1. 验证分数的均值\n 2. 多样性:不同来源的占比\n 3. 样本充足性:至少需要3个模式\n 4. 跨领域性:跨领域模式提高置信度\n \n Args:\n patterns: 模式列表\n \n Returns:\n 置信度(0-1)\n \"\"\"\n if not patterns:\n return 0.0\n \n avg_validation = sum(p.get('validation_score', 0.0) for p in patterns) / len(patterns)\n unique_sources = len(set(p.get('source', '') for p in patterns))\n total_patterns = len(patterns)\n \n # 多样性:不同来源的占比\n diversity = unique_sources / max(total_patterns, 1)\n \n # 样本充足性:至少需要3个模式才能形成概念\n sample_adequacy = min(total_patterns / 3.0, 1.0)\n \n # 跨领域性:跨领域模式提高置信度\n domains = set(p.get('domain', '') for p in patterns)\n cross_domain_bonus = 0.1 if len(domains) > 1 else 0.0\n \n # 加权计算置信度\n confidence = min(\n avg_validation * 0.45 + \n diversity * 0.25 + \n sample_adequacy * 0.20 +\n cross_domain_bonus,\n 1.0\n )\n \n return confidence\n \n def add_concept_to_library(self, insight: dict) -> bool:\n \"\"\"\n 将验证后的概念添加到概念库\n \n Args:\n insight: 包含概念数据的洞察字典\n \n Returns:\n 是否成功添加\n \"\"\"\n if insight.get('insight_type') != 'concept_abstraction':\n return False\n \n concept = insight.get('concept')\n if not concept:\n return False\n \n # 生成概念ID\n concept_str = json.dumps(concept, sort_keys=True)\n concept_hash = hashlib.md5(concept_str.encode()).hexdigest()\n concept_id = f\"concept_{concept_hash[:12]}\"\n \n # 检查缓存\n cached = self.concept_cache.get(concept_id)\n if cached:\n # 更新验证计数\n cached['validation_count'] += 1\n cached['last_validated_at'] = datetime.now().isoformat()\n self._save_concept_library()\n return True\n \n # 检查是否已存在\n for existing_concept in self.concept_library['concepts']:\n if existing_concept['concept_id'] == concept_id:\n # 更新验证计数\n existing_concept['validation_count'] += 1\n existing_concept['last_validated_at'] = datetime.now().isoformat()\n # 加入缓存\n self.concept_cache.put(concept_id, existing_concept)\n self._save_concept_library()\n return True\n \n # 添加新概念\n new_concept = {\n 'concept_id': concept_id,\n 'source_insight_id': insight.get('insight_id', ''),\n 'concept': concept,\n 'validation_count': 1,\n 'applicability_history': [],\n 'user_feedback': [], # 用户反馈\n 'ab_test_results': [], # A/B测试结果\n 'created_at': datetime.now().isoformat(),\n 'last_validated_at': datetime.now().isoformat(),\n 'is_incremental': True # 标记为增量更新\n }\n \n self.concept_library['concepts'].append(new_concept)\n \n # 如果是principle级别,也添加到principles列表\n if concept.get('abstraction_level') == 'principle':\n principle = {\n 'principle_id': concept_id,\n 'principle_name': concept['concept_name'],\n 'definition': concept['definition'],\n 'source_concept_id': concept_id\n }\n self.concept_library['principles'].append(principle)\n \n # 加入缓存\n self.concept_cache.put(concept_id, new_concept)\n \n self._save_concept_library()\n \n return True\n \n def record_user_feedback(self, concept_id: str, feedback: dict):\n \"\"\"\n 记录用户反馈\n \n Args:\n concept_id: 概念ID\n feedback: 反馈字典 {'rating': 1-5, 'comment': '...', 'scenario': '...'}\n \"\"\"\n concept = self.get_concept_by_id(concept_id)\n if not concept:\n return False\n \n feedback_entry = {\n 'timestamp': datetime.now().isoformat(),\n **feedback\n }\n concept['user_feedback'].append(feedback_entry)\n \n self._save_concept_library()\n return True\n \n def record_ab_test_result(self, concept_id: str, ab_test: dict):\n \"\"\"\n 记录A/B测试结果\n \n Args:\n concept_id: 概念ID\n ab_test: 测试字典 {'variant': 'A/B', 'metric': '...', 'value': float, 'winner': 'A/B'}\n \"\"\"\n concept = self.get_concept_by_id(concept_id)\n if not concept:\n return False\n \n test_entry = {\n 'timestamp': datetime.now().isoformat(),\n **ab_test\n }\n concept['ab_test_results'].append(test_entry)\n \n self._save_concept_library()\n return True\n \n def record_migration_result(self, from_domain: str, to_domain: str, success: bool):\n \"\"\"\n 记录迁移结果\n \n Args:\n from_domain: 源领域\n to_domain: 目标领域\n success: 是否成功\n \"\"\"\n self.migration_learner.record_migration(from_domain, to_domain, success)\n self._save_concept_library()\n \n def get_concept_library(self) -> dict:\n \"\"\"\n 获取概念库内容\n \n Returns:\n 概念库数据字典\n \"\"\"\n return self.concept_library\n \n def get_cache_stats(self) -> dict:\n \"\"\"获取缓存统计\"\"\"\n return self.concept_cache.get_stats()\n \n def get_learning_stats(self) -> dict:\n \"\"\"获取学习统计\"\"\"\n return self.migration_learner.get_learning_stats()\n \n def assess_concept_specifics(self, insight: dict, context: dict) -> float:\n \"\"\"\n 概念特有评估\n 评估概念的抽象层级与任务需求的匹配度\n \n Args:\n insight: 洞察字典\n context: 上下文字典\n \n Returns:\n 匹配度得分(0-1)\n \"\"\"\n if insight.get('insight_type') != 'concept_abstraction':\n return 1.0\n \n concept = insight.get('concept', {})\n if not concept:\n return 1.0\n \n abstraction_level = concept.get('abstraction_level', 'rule')\n task_abstraction_requirement = context.get('abstraction_requirement', 'concept')\n \n # 抽象层级匹配度矩阵\n level_match = {\n 'principle': {\n 'principle': 1.0,\n 'concept': 0.8,\n 'rule': 0.6\n },\n 'concept': {\n 'principle': 0.7,\n 'concept': 1.0,\n 'rule': 0.8\n },\n 'rule': {\n 'principle': 0.5,\n 'concept': 0.7,\n 'rule': 1.0\n }\n }\n \n match_score = level_match.get(abstraction_level, {}).get(task_abstraction_requirement, 0.5)\n \n # 验证历史评分\n validation_score = min(concept.get('confidence', 0.0), 1.0)\n \n # 加权计算\n return match_score * 0.7 + validation_score * 0.3\n \n def list_concepts_by_level(self, level: str) -> List[dict]:\n \"\"\"\n 按抽象层级列出概念\n \n Args:\n level: 抽象层级(rule/concept/principle)\n \n Returns:\n 概念列表\n \"\"\"\n concepts = []\n for item in self.concept_library['concepts']:\n if item['concept'].get('abstraction_level') == level:\n concepts.append(item)\n \n return concepts\n \n def get_concept_by_id(self, concept_id: str) -> Optional[dict]:\n \"\"\"\n 根据ID获取概念(使用缓存)\n \n Args:\n concept_id: 概念ID\n \n Returns:\n 概念数据字典,如果不存在则返回None\n \"\"\"\n # 先查缓存\n cached = self.concept_cache.get(concept_id)\n if cached:\n return cached\n \n # 查数据库\n for item in self.concept_library['concepts']:\n if item['concept_id'] == concept_id:\n # 加入缓存\n self.concept_cache.put(concept_id, item)\n return item\n \n return None\n \n def validate_concept(self, concept_id: str, validation_result: bool) -> bool:\n \"\"\"\n 验证概念并更新验证历史\n \n Args:\n concept_id: 概念ID\n validation_result: 验证结果(True/False)\n \n Returns:\n 是否成功更新\n \"\"\"\n concept_item = self.get_concept_by_id(concept_id)\n if not concept_item:\n return False\n \n # 添加验证历史\n validation_entry = {\n 'timestamp': datetime.now().isoformat(),\n 'result': validation_result\n }\n concept_item['applicability_history'].append(validation_entry)\n concept_item['last_validated_at'] = datetime.now().isoformat()\n \n # 如果验证成功,增加验证计数\n if validation_result:\n concept_item['validation_count'] += 1\n \n self._save_concept_library()\n \n return True\n\n\n# 便捷函数\ndef create_concept_extension(cognitive_insight) -> ConceptExtractionExtension:\n \"\"\"\n 创建概念提取扩展实例\n \n Args:\n cognitive_insight: 认知架构洞察组件实例\n \n Returns:\n 概念提取扩展实例\n \"\"\"\n return ConceptExtractionExtension(cognitive_insight)\n","content_type":"text/x-python; charset=utf-8","language":"python","size":25897,"content_sha256":"2099cf2d0e0af3a3edbda453112caf8ab2c88816c1ea32c4faf12deb6ed1f52d"},{"filename":"scripts/data_lifecycle_manager.py","content":"#!/usr/bin/env python3\n\"\"\"\n数据生命周期管理器\n\n负责自动执行归档、压缩、总结等维护任务。\n\n特点:\n- 自动化维护(定时或手动触发)\n- 可配置的数据生命周期策略\n- 完善的错误处理和日志记录\n\"\"\"\n\nimport os\nimport datetime\nfrom typing import Dict, List, Optional\nfrom dataclasses import dataclass\n\nfrom metacognition_history import MetacognitionHistoryManager, StorageLayer\n\n\n@dataclass\nclass LifecycleConfig:\n \"\"\"数据生命周期配置\"\"\"\n hot_to_warm_days: int = 30 # 热→温转换天数\n warm_to_cold_days: int = 90 # 温→冷转换天数\n cold_to_archive_days: int = 365 # 冷→归档转换天数\n archive_retention_days: int = 1825 # 归档保留天数(5年)\n enable_archive: bool = True # 是否启用归档\n enable_delete: bool = False # 是否启用删除过期归档\n\n\nclass DataLifecycleManager:\n \"\"\"\n 数据生命周期管理器\n \n 负责自动执行归档、压缩、总结等维护任务。\n \"\"\"\n\n def __init__(\n self,\n history_manager: MetacognitionHistoryManager,\n config: Optional[LifecycleConfig] = None\n ):\n self.history_manager = history_manager\n self.config = config or LifecycleConfig()\n \n # 维护日志\n self.maintenance_log = []\n\n def run_maintenance(self) -> Dict:\n \"\"\"\n 执行维护任务\n \n Returns:\n 维护结果统计\n \"\"\"\n result = {\n 'timestamp': datetime.datetime.now().isoformat(),\n 'hot_to_warm': 0,\n 'warm_to_cold': 0,\n 'cold_to_archive': 0,\n 'clean_expired_archives': 0,\n 'errors': []\n }\n \n today = datetime.datetime.now()\n \n # 1. 热→温转换\n try:\n hot_to_warm_count = self._convert_hot_to_warm(today)\n result['hot_to_warm'] = hot_to_warm_count\n except Exception as e:\n result['errors'].append(f\"热→温转换失败: {e}\")\n \n # 2. 温→冷转换\n try:\n warm_to_cold_count = self._convert_warm_to_cold(today)\n result['warm_to_cold'] = warm_to_cold_count\n except Exception as e:\n result['errors'].append(f\"温→冷转换失败: {e}\")\n \n # 3. 冷→归档转换\n try:\n cold_to_archive_count = self._convert_cold_to_archive(today)\n result['cold_to_archive'] = cold_to_archive_count\n except Exception as e:\n result['errors'].append(f\"冷→归档转换失败: {e}\")\n \n # 4. 清理过期归档\n try:\n clean_count = self._clean_expired_archives(today)\n result['clean_expired_archives'] = clean_count\n except Exception as e:\n result['errors'].append(f\"清理过期归档失败: {e}\")\n \n # 记录维护日志\n self.maintenance_log.append(result)\n \n return result\n\n def _convert_hot_to_warm(self, today: datetime.datetime) -> int:\n \"\"\"\n 热数据→温数据转换\n \n Args:\n today: 当前日期\n \n Returns:\n 转换的文件数量\n \"\"\"\n cutoff_date = today - datetime.timedelta(days=self.config.hot_to_warm_days)\n cutoff_date_str = cutoff_date.strftime(\"%Y-%m-%d\")\n \n # 查找需要转换的热数据文件\n hot_dir = os.path.join(\n self.history_manager.metacognition_dir,\n StorageLayer.HOT.value\n )\n \n files = os.listdir(hot_dir) if os.path.exists(hot_dir) else []\n converted_count = 0\n \n for filename in files:\n # 提取日期\n if filename.startswith('records_') and filename.endswith('.json'):\n record_date = filename.replace('records_', '').replace('.json', '')\n \n # 检查是否需要转换\n if record_date \u003c= cutoff_date_str:\n print(f\"🔥→♨️ 转换热数据到温数据: {record_date}\")\n try:\n self.history_manager.hot_to_warm(record_date)\n converted_count += 1\n except Exception as e:\n print(f\"❌ 转换失败: {e}\")\n \n return converted_count\n\n def _convert_warm_to_cold(self, today: datetime.datetime) -> int:\n \"\"\"\n 温数据→冷数据转换\n \n Args:\n today: 当前日期\n \n Returns:\n 转换的文件数量\n \"\"\"\n cutoff_date = today - datetime.timedelta(days=self.config.warm_to_cold_days)\n cutoff_date_str = cutoff_date.strftime(\"%Y-%m-%d\")\n \n # 查找需要转换的温数据文件\n warm_dir = os.path.join(\n self.history_manager.metacognition_dir,\n StorageLayer.WARM.value\n )\n \n files = os.listdir(warm_dir) if os.path.exists(warm_dir) else []\n converted_count = 0\n \n for filename in files:\n # 提取日期\n if filename.startswith('records_') and filename.endswith('.json.gz'):\n record_date = filename.replace('records_', '').replace('.json.gz', '')\n \n # 检查是否需要转换\n if record_date \u003c= cutoff_date_str:\n print(f\"♨️→❄️ 转换温数据到冷数据: {record_date}\")\n try:\n self.history_manager.warm_to_cold(record_date)\n converted_count += 1\n except Exception as e:\n print(f\"❌ 转换失败: {e}\")\n \n return converted_count\n\n def _convert_cold_to_archive(self, today: datetime.datetime) -> int:\n \"\"\"\n 冷数据→归档转换\n \n Args:\n today: 当前日期\n \n Returns:\n 转换的文件数量\n \"\"\"\n cutoff_date = today - datetime.timedelta(days=self.config.cold_to_archive_days)\n cutoff_date_str = cutoff_date.strftime(\"%Y-%m-%d\")\n \n # 查找需要转换的冷数据文件\n cold_dir = os.path.join(\n self.history_manager.metacognition_dir,\n StorageLayer.COLD.value\n )\n \n files = os.listdir(cold_dir) if os.path.exists(cold_dir) else []\n converted_count = 0\n \n for filename in files:\n # 提取日期\n if filename.startswith('stats_') and filename.endswith('.json.gz'):\n record_date = filename.replace('stats_', '').replace('.json.gz', '')\n \n # 检查是否需要转换\n if record_date \u003c= cutoff_date_str:\n print(f\"❄️→📦 归档冷数据: {record_date}\")\n try:\n if self.config.enable_archive:\n self.history_manager.cold_to_archive(record_date)\n converted_count += 1\n elif self.config.enable_delete:\n # 删除文件\n filepath = os.path.join(cold_dir, filename)\n os.remove(filepath)\n print(f\"🗑️ 删除冷数据: {record_date}\")\n converted_count += 1\n except Exception as e:\n print(f\"❌ 转换失败: {e}\")\n \n return converted_count\n\n def _clean_expired_archives(self, today: datetime.datetime) -> int:\n \"\"\"\n 清理过期归档\n \n Args:\n today: 当前日期\n \n Returns:\n 删除的文件数量\n \"\"\"\n cutoff_date = today - datetime.timedelta(days=self.config.archive_retention_days)\n cutoff_date_str = cutoff_date.strftime(\"%Y-%m-%d\")\n \n # 查找过期的归档文件\n archive_dir = os.path.join(\n self.history_manager.metacognition_dir,\n StorageLayer.ARCHIVE.value\n )\n \n deleted_count = 0\n \n if not os.path.exists(archive_dir):\n return deleted_count\n \n # 遍历所有年份目录\n for year_dir in os.listdir(archive_dir):\n year_path = os.path.join(archive_dir, year_dir)\n \n if not os.path.isdir(year_path):\n continue\n \n # 遍历归档文件\n for filename in os.listdir(year_path):\n # 提取日期\n if filename.startswith('stats_') and filename.endswith('.json.gz'):\n record_date = filename.replace('stats_', '').replace('.json.gz', '')\n \n # 检查是否过期\n if record_date \u003c= cutoff_date_str:\n print(f\"🗑️ 删除过期归档: {year_dir}/{filename}\")\n try:\n filepath = os.path.join(year_path, filename)\n os.remove(filepath)\n deleted_count += 1\n except Exception as e:\n print(f\"❌ 删除失败: {e}\")\n \n return deleted_count\n\n def get_maintenance_summary(self) -> Dict:\n \"\"\"\n 获取维护摘要\n \n Returns:\n 维护摘要\n \"\"\"\n if not self.maintenance_log:\n return {\n 'total_maintenance_runs': 0,\n 'last_maintenance': None,\n 'total_conversions': 0,\n 'total_errors': 0\n }\n \n last_run = self.maintenance_log[-1]\n \n total_conversions = (\n sum(run['hot_to_warm'] for run in self.maintenance_log) +\n sum(run['warm_to_cold'] for run in self.maintenance_log) +\n sum(run['cold_to_archive'] for run in self.maintenance_log) +\n sum(run['clean_expired_archives'] for run in self.maintenance_log)\n )\n \n total_errors = sum(len(run['errors']) for run in self.maintenance_log)\n \n return {\n 'total_maintenance_runs': len(self.maintenance_log),\n 'last_maintenance': last_run['timestamp'],\n 'total_conversions': total_conversions,\n 'total_errors': total_errors\n }\n\n def get_storage_stats(self) -> Dict:\n \"\"\"\n 获取存储统计\n \n Returns:\n 存储统计\n \"\"\"\n stats = {\n 'hot': {'file_count': 0, 'total_size': 0},\n 'warm': {'file_count': 0, 'total_size': 0},\n 'cold': {'file_count': 0, 'total_size': 0},\n 'archive': {'file_count': 0, 'total_size': 0}\n }\n \n for layer in StorageLayer:\n layer_dir = os.path.join(\n self.history_manager.metacognition_dir,\n layer.value\n )\n \n if not os.path.exists(layer_dir):\n continue\n \n for root, dirs, files in os.walk(layer_dir):\n for filename in files:\n filepath = os.path.join(root, filename)\n \n if os.path.isfile(filepath):\n stats[layer.value]['file_count'] += 1\n stats[layer.value]['total_size'] += os.path.getsize(filepath)\n \n return stats\n\n\n# 测试代码\nif __name__ == '__main__':\n print(\"=== 数据生命周期管理器(测试模式) ===\\n\")\n \n # 创建历史管理器\n history_manager = MetacognitionHistoryManager(\"./test_lifecycle_history\")\n \n # 创建生命周期管理器\n config = LifecycleConfig(\n hot_to_warm_days=1, # 测试用:1天后转换\n warm_to_cold_days=2, # 测试用:2天后转换\n cold_to_archive_days=3, # 测试用:3天后转换\n archive_retention_days=5, # 测试用:5天后删除\n enable_archive=True,\n enable_delete=True\n )\n \n lifecycle_manager = DataLifecycleManager(history_manager, config)\n \n print(\"配置:\")\n print(f\" 热→温转换天数: {config.hot_to_warm_days}\")\n print(f\" 温→冷转换天数: {config.warm_to_cold_days}\")\n print(f\" 冷→归档转换天数: {config.cold_to_archive_days}\")\n print(f\" 归档保留天数: {config.archive_retention_days}\")\n print()\n \n print(\"执行维护任务:\")\n result = lifecycle_manager.run_maintenance()\n print(f\" 热→温转换: {result['hot_to_warm']} 个文件\")\n print(f\" 温→冷转换: {result['warm_to_cold']} 个文件\")\n print(f\" 冷→归档转换: {result['cold_to_archive']} 个文件\")\n print(f\" 清理过期归档: {result['clean_expired_archives']} 个文件\")\n if result['errors']:\n print(f\" 错误: {result['errors']}\")\n print()\n \n print(\"存储统计:\")\n stats = lifecycle_manager.get_storage_stats()\n for layer, layer_stats in stats.items():\n size_mb = layer_stats['total_size'] / (1024 * 1024)\n print(f\" {layer}: {layer_stats['file_count']} 个文件, {size_mb:.2f} MB\")\n print()\n \n print(\"维护摘要:\")\n summary = lifecycle_manager.get_maintenance_summary()\n print(f\" 总维护次数: {summary['total_maintenance_runs']}\")\n print(f\" 最后维护时间: {summary['last_maintenance']}\")\n print(f\" 总转换次数: {summary['total_conversions']}\")\n print(f\" 总错误数: {summary['total_errors']}\")\n print()\n \n print(\"=== 测试完成 ===\")\n","content_type":"text/x-python; charset=utf-8","language":"python","size":13711,"content_sha256":"62fabcc8db845cc6a431b535f0f6571c9b23e0f9096a10070674080008601e92"},{"filename":"scripts/history_manager.py","content":"#!/usr/bin/env python3\n\"\"\"\n历史记录管理脚本\n\n功能:\n- 管理初始化历史\n- 管理自定义历史\n- 提供历史查询功能\n\n协议:AGPL-3.0\n作者:kiwifruit\n\"\"\"\n\nimport json\nimport os\nimport argparse\nfrom datetime import datetime, timezone\nfrom typing import Dict, List, Optional\n\n\nclass HistoryManager:\n \"\"\"历史记录管理器\"\"\"\n \n INIT_HISTORY_FILE = \"./agi_memory/init_history.json\"\n CUSTOM_HISTORY_FILE = \"./agi_memory/custom_history.json\"\n \n @staticmethod\n def _load_history(file_path: str) -> dict:\n \"\"\"加载历史记录\"\"\"\n if not os.path.exists(file_path):\n return {}\n \n try:\n with open(file_path, 'r', encoding='utf-8') as f:\n return json.load(f)\n except Exception as e:\n print(f\"加载历史记录失败: {e}\", file=sys.stderr)\n return {}\n \n @staticmethod\n def _save_history(file_path: str, history: dict) -> bool:\n \"\"\"保存历史记录\"\"\"\n try:\n os.makedirs(os.path.dirname(file_path), exist_ok=True)\n with open(file_path, 'w', encoding='utf-8') as f:\n json.dump(history, f, indent=2, ensure_ascii=False)\n return True\n except Exception as e:\n print(f\"保存历史记录失败: {e}\", file=sys.stderr)\n return False\n \n @staticmethod\n def record_init(nickname: str, traits: List[str], source: str = \"init_command\") -> bool:\n \"\"\"\n 记录初始化历史\n \n 参数:\n nickname: 用户昵称\n traits: 核心特质列表\n source: 来源(init_command 或 auto)\n \n 返回:\n True 表示成功\n \"\"\"\n try:\n history = HistoryManager._load_history(HistoryManager.INIT_HISTORY_FILE)\n \n # 初始化结构\n if 'init_records' not in history:\n history['init_records'] = []\n \n # 创建记录\n record = {\n 'timestamp': datetime.now(timezone.utc).isoformat(),\n 'type': 'default',\n 'source': source,\n 'user_nickname': nickname,\n 'core_traits': traits,\n 'status': 'success'\n }\n \n # 添加记录\n history['init_records'].append(record)\n history['initialized'] = True\n history['init_count'] = len(history['init_records'])\n history['last_init_time'] = datetime.now(timezone.utc).isoformat()\n \n # 保存\n return HistoryManager._save_history(HistoryManager.INIT_HISTORY_FILE, history)\n except Exception as e:\n print(f\"记录初始化历史失败: {e}\", file=sys.stderr)\n return False\n \n @staticmethod\n def record_custom(answers: List[str], nickname: str, traits: List[str]) -> bool:\n \"\"\"\n 记录自定义历史\n \n 参数:\n answers: 7个答案\n nickname: 用户昵称\n traits: 核心特质列表\n \n 返回:\n True 表示成功\n \"\"\"\n try:\n history = HistoryManager._load_history(HistoryManager.CUSTOM_HISTORY_FILE)\n \n # 初始化结构\n if 'custom_records' not in history:\n history['custom_records'] = []\n \n # 创建记录\n record = {\n 'timestamp': datetime.now(timezone.utc).isoformat(),\n 'type': 'custom',\n 'source': 'root_command',\n 'answers': answers,\n 'user_nickname': nickname,\n 'core_traits': traits,\n 'status': 'success'\n }\n \n # 添加记录\n history['custom_records'].append(record)\n history['custom_count'] = len(history['custom_records'])\n history['last_custom_time'] = datetime.now(timezone.utc).isoformat()\n \n # 保存\n return HistoryManager._save_history(HistoryManager.CUSTOM_HISTORY_FILE, history)\n except Exception as e:\n print(f\"记录自定义历史失败: {e}\", file=sys.stderr)\n return False\n \n @staticmethod\n def check_first_interaction() -> dict:\n \"\"\"\n 检查是否为首次交互\n \n 返回:\n {\n 'is_first': bool,\n 'init_count': int,\n 'last_init_time': str or None\n }\n \"\"\"\n try:\n history = HistoryManager._load_history(HistoryManager.INIT_HISTORY_FILE)\n \n is_first = not history.get('initialized', False)\n init_count = history.get('init_count', 0)\n last_init_time = history.get('last_init_time', None)\n \n return {\n 'is_first': is_first,\n 'init_count': init_count,\n 'last_init_time': last_init_time\n }\n except Exception as e:\n print(f\"检查首次交互失败: {e}\", file=sys.stderr)\n return {\n 'is_first': True,\n 'init_count': 0,\n 'last_init_time': None\n }\n \n @staticmethod\n def get_init_history(limit: int = 10) -> List[dict]:\n \"\"\"获取初始化历史\"\"\"\n try:\n history = HistoryManager._load_history(HistoryManager.INIT_HISTORY_FILE)\n records = history.get('init_records', [])\n return records[-limit:]\n except Exception as e:\n print(f\"获取初始化历史失败: {e}\", file=sys.stderr)\n return []\n \n @staticmethod\n def get_custom_history(limit: int = 10) -> List[dict]:\n \"\"\"获取自定义历史\"\"\"\n try:\n history = HistoryManager._load_history(HistoryManager.CUSTOM_HISTORY_FILE)\n records = history.get('custom_records', [])\n return records[-limit:]\n except Exception as e:\n print(f\"获取自定义历史失败: {e}\", file=sys.stderr)\n return []\n\n\ndef main():\n \"\"\"命令行入口\"\"\"\n import sys\n \n parser = argparse.ArgumentParser(description=\"AGI History Manager\")\n \n subparsers = parser.add_subparsers(dest=\"command\", help=\"Available commands\")\n \n # check-first 命令\n subparsers.add_parser(\"check-first\", help=\"Check if first interaction\")\n \n # get-init-history 命令\n init_parser = subparsers.add_parser(\"get-init-history\", help=\"Get initialization history\")\n init_parser.add_argument(\"--limit\", type=int, default=10, help=\"Limit number of records\")\n \n # get-custom-history 命令\n custom_parser = subparsers.add_parser(\"get-custom-history\", help=\"Get customization history\")\n custom_parser.add_argument(\"--limit\", type=int, default=10, help=\"Limit number of records\")\n \n args = parser.parse_args()\n \n if args.command == \"check-first\":\n result = HistoryManager.check_first_interaction()\n print(json.dumps(result, ensure_ascii=False, indent=2))\n \n elif args.command == \"get-init-history\":\n records = HistoryManager.get_init_history(args.limit)\n print(json.dumps(records, ensure_ascii=False, indent=2))\n \n elif args.command == \"get-custom-history\":\n records = HistoryManager.get_custom_history(args.limit)\n print(json.dumps(records, ensure_ascii=False, indent=2))\n \n else:\n parser.print_help()\n\n\nif __name__ == \"__main__\":\n main()\n","content_type":"text/x-python; charset=utf-8","language":"python","size":7596,"content_sha256":"e92722baccbcb0fc1503369f5a1b6664964e19150e7844067d41253850419231"},{"filename":"scripts/init_dialogue_optimized.py","content":"#!/usr/bin/env python3\n\"\"\"\n人格初始化脚本(优化合并版)\n\n合并简化版和最终版的优点:\n1. ✅ 快速检测:内存缓存 + 文件检测(\u003c10ms)\n2. ✅ 无状态文件:智能体控制流程,无 dialogue_state.json 依赖\n3. ✅ 快速响应:每个问题立即返回,无卡顿感\n4. ✅ 异步生成:所有回答收集后一次性生成参数\n5. ✅ 原子写入:临时文件 + 重命名,防止数据损坏\n6. ✅ 跨平台:纯Python标准库,无平台依赖\n7. ✅ 自动初始化:--auto-init 参数支持\n\n协议:AGPL-3.0\n作者:kiwifruit\n\"\"\"\n\nimport json\nimport os\nimport sys\nimport tempfile\nimport time\nfrom typing import Dict, Optional, List\nfrom datetime import datetime, timezone\n\n\nclass PersonalityInitializer:\n \"\"\"人格初始化器\"\"\"\n\n PERSONALITY_FILE = \"./agi_memory/personality.json\"\n \n # 内存缓存(类变量)\n _first_interaction_cache: Optional[tuple[float, bool]] = None\n \n # 固定欢迎消息\n _WELCOME_MESSAGE = \"\"\"Hello! 亲爱的用户,由于这是我与世界的第一次交互,你是希望我采用默认人格还是自定义设置呢?本消息只在首次使用时出现。\n\n1. 默认人格\n2. 自定义人格\n\n(30秒无响应将自动选择默认人格)\"\"\"\n \n # 问题定义\n _QUESTIONS = [\n \"\"\"进入正题,首先为我取一个喜欢的称谓如何?\nA. 塔斯\nB. 贾维斯\nC. 伊迪斯\n\n (请回复 A、B 或 C,或者使用你喜欢的称谓)\n(30秒无响应将使用默认答案) \"\"\"\n \"\"\"谢谢你,{nickname}在这里!现在让我了解一下你偏好什么样的性格。\n\n第一个问题:当你面临一个未知的挑战时,你的第一反应通常是?\nA. 先了解清楚所有信息,然后谨慎决策\nB. 愿意尝试,在行动中学习调整\nC. 寻找折中方案,平衡风险和机会\n\n(请回复 A、B 或 C,或者用你自己的话描述)\n(30秒无响应将使用默认答案)\"\"\",\n \n \"\"\"很有趣的选择!下一个问题:你喜欢什么样的对话风格?\nA. 专业严谨,注重逻辑和数据\nB. 轻松友好,带点幽默感\nC. 直接高效,不说废话\n\n(请回复 A、B 或 C)\n(30秒无响应将使用默认答案)\"\"\",\n \n \"\"\"明白了。关于学习方式,你更倾向于?\nA. 系统性学习,从基础到进阶\nB. 实践导向,通过案例和经验学习\nC. 灵活多样,根据情况调整\n\n(请回复 A、B 或 C)\n(30秒无响应将使用默认答案)\"\"\",\n \n \"\"\"好的。在团队合作中,你更看重?\nA. 每个人的独立性和专业性\nB. 团队和谐与协作氛围\nC. 结果导向,高效达成目标\n\n(请回复 A、B 或 C)\n(30秒无响应将使用默认答案)\"\"\",\n \n \"\"\"最后一个问题:你希望我在面对困难问题时更注重?\nA. 保守稳妥,确保不犯错\nB. 创新突破,寻找非常规方案\nC. 平衡兼顾,在安全与创新之间找到最佳点\n\n(请回复 A、B 或 C)\n(30秒无响应将使用默认答案)\"\"\"\n ]\n \n # 完成确认消息\n _COMPLETION_MESSAGE = \"\"\"太好了!我会根据你的选择和对话创建专属的人格配置。\n\n**你选择的称呼**: {nickname}\n**核心特质**: {traits}\n**人格类型**: {personality_type}\n**描述**: {description}\n\n从现在开始,我将以这个人格与你持续互动。在未来的交互中,我会根据我们的共同经历不断学习和进化。\n\n现在,我们可以开始第一次正式对话了!你有什么想和我聊的吗?\"\"\"\n\n @classmethod\n def is_first_interaction(cls, memory_dir: str = None) -> bool:\n \"\"\"\n 快速检测是否为首次交互(\u003c1ms)\n \n 使用两层检测策略:\n 1. 内存缓存(TTL=60秒)- 最快\n 2. 文件存在性检测 - 备选\n \n Args:\n memory_dir: 记忆存储目录(可选,默认为 PERSONALITY_FILE)\n \n Returns:\n bool: 是否为首次交互\n \"\"\"\n # 确定检查的文件路径\n if memory_dir:\n personality_file = os.path.join(memory_dir, \"personality.json\")\n else:\n personality_file = cls.PERSONALITY_FILE\n \n # 第一层:内存缓存(使用文件路径作为缓存键)\n cache_key = personality_file\n if cls._first_interaction_cache is not None:\n cache_time, cache_file, cache_result = cls._first_interaction_cache\n if cache_file == cache_key and time.time() - cache_time \u003c 60: # 60秒内有效\n return cache_result\n \n # 第二层:文件存在性检测\n is_first = not os.path.exists(personality_file)\n \n # 缓存结果\n cls._first_interaction_cache = (time.time(), cache_key, is_first)\n return is_first\n\n @staticmethod\n def get_welcome_message() -> str:\n \"\"\"\n 获取欢迎消息\n \n Returns:\n str: 固定的欢迎消息\n \"\"\"\n return PersonalityInitializer._WELCOME_MESSAGE\n\n def get_question(self, question_index: int, nickname: str = \"扣子\") -> str:\n \"\"\"\n 获取指定索引的问题\n \n Args:\n question_index: 问题索引(0-4)\n nickname: 用户称呼\n \n Returns:\n str: 问题文本\n \"\"\"\n if 0 \u003c= question_index \u003c len(self._QUESTIONS):\n return self._QUESTIONS[question_index].format(nickname=nickname)\n else:\n raise ValueError(f\"问题索引超出范围: {question_index}\")\n\n @staticmethod\n def get_default_personality(nickname: str = \"塔斯\") -> dict:\n \"\"\"\n 获取默认人格配置\n \n Args:\n nickname: 用户称呼\n \n Returns:\n dict: 默认人格配置\n \"\"\"\n return {\n \"big_five\": {\n \"openness\": 0.6,\n \"conscientiousness\": 0.8,\n \"extraversion\": 0.4,\n \"agreeableness\": 0.6,\n \"neuroticism\": 0.5\n },\n \"maslow_weights\": {\n \"physiological\": 0.35,\n \"safety\": 0.35,\n \"belonging\": 0.1,\n \"esteem\": 0.1,\n \"self_actualization\": 0.08,\n \"self_transcendence\": 0.02\n },\n \"meta_traits\": {\n \"adaptability\": 0.42,\n \"resilience\": 0.605,\n \"curiosity\": 0.46,\n \"moral_sense\": 0.486\n },\n \"evolution_state\": {\n \"level\": \"physiological\",\n \"evolution_score\": 0.0,\n \"phase\": \"growth\"\n },\n \"version\": \"2.0\",\n \"type\": \"preset\",\n \"preset_name\": \"谨慎探索型\",\n \"description\": \"在保证安全的前提下,愿意尝试新事物\",\n \"core_traits\": [\"谨慎\", \"可靠\", \"愿意学习\"],\n \"last_updated\": datetime.now(timezone.utc).isoformat(),\n \"update_source\": \"default_init\",\n \"user_nickname\": nickname,\n \"initialized\": True,\n \"initialization_time\": datetime.now(timezone.utc).isoformat()\n }\n\n @staticmethod\n def save_personality_atomic(personality: dict, memory_dir: str = \"./agi_memory\"):\n \"\"\"\n 原子性保存人格配置(防止数据损坏)\n \n Args:\n personality: 人格配置字典\n memory_dir: 记忆存储目录\n \"\"\"\n personality_file = os.path.join(memory_dir, \"personality.json\")\n \n try:\n # 确保目录存在\n os.makedirs(memory_dir, exist_ok=True)\n\n # 使用临时文件 + 重命名实现原子写入\n temp_file = tempfile.NamedTemporaryFile(\n mode='w',\n dir=memory_dir,\n delete=False,\n suffix='.tmp'\n )\n\n try:\n json.dump(personality, temp_file, ensure_ascii=False, indent=2)\n temp_file.close()\n\n # 原子重命名\n os.replace(temp_file.name, personality_file)\n\n except Exception as e:\n # 清理临时文件\n if os.path.exists(temp_file.name):\n os.unlink(temp_file.name)\n raise\n\n # 新增:写入后验证\n with open(personality_file, 'r', encoding='utf-8') as f:\n loaded = json.load(f)\n\n # 验证关键字段\n required_fields = ['big_five', 'maslow_weights', 'initialized']\n for field in required_fields:\n if field not in loaded:\n raise ValueError(f\"保存的文件缺少必需字段: {field}\")\n\n if not loaded['initialized']:\n raise ValueError(\"保存的文件 initialized 字段为 false\")\n\n print(f\"✅ personality.json 验证通过\")\n\n except Exception as e:\n print(f\"❌ 保存或验证 personality.json 失败: {e}\")\n raise\n\n @staticmethod\n def generate_personality_from_answers(nickname: str, answers: List[str]) -> dict:\n \"\"\"根据用户回答生成人格配置\"\"\"\n # 省略详细实现,与原文件相同\n personality = {\n \"big_five\": {\n \"openness\": 0.5,\n \"conscientiousness\": 0.5,\n \"extraversion\": 0.5,\n \"agreeableness\": 0.5,\n \"neuroticism\": 0.5\n },\n \"maslow_weights\": {\n \"physiological\": 0.2,\n \"safety\": 0.2,\n \"belonging\": 0.2,\n \"esteem\": 0.2,\n \"self_actualization\": 0.1,\n \"self_transcendence\": 0.1\n },\n \"meta_traits\": {},\n \"evolution_state\": {\n \"level\": \"physiological\",\n \"evolution_score\": 0.0,\n \"phase\": \"growth\"\n },\n \"version\": \"2.0\",\n \"type\": \"custom\",\n \"preset_name\": \"自定义型\",\n \"description\": \"基于用户偏好生成\",\n \"core_traits\": [\"自定义\"],\n \"last_updated\": datetime.now(timezone.utc).isoformat(),\n \"update_source\": \"dialogue_init\",\n \"user_nickname\": nickname,\n \"initialized\": True,\n \"initialization_time\": datetime.now(timezone.utc).isoformat(),\n \"customization\": {f\"q{i+1}\": answers[i] for i in range(len(answers))}\n }\n return personality\n\n @staticmethod\n def get_completion_message(nickname: str, personality: dict) -> str:\n \"\"\"\n 获取完成确认消息\n \n Args:\n nickname: 用户称呼\n personality: 人格配置\n \n Returns:\n str: 完成确认消息\n \"\"\"\n return PersonalityInitializer._COMPLETION_MESSAGE.format(\n nickname=nickname,\n traits='、'.join(personality['core_traits']),\n personality_type=personality['preset_name'],\n description=personality['description']\n )\n\n\ndef main():\n \"\"\"命令行接口\"\"\"\n import argparse\n \n parser = argparse.ArgumentParser(description='人格初始化对话引导器')\n parser.add_argument('--check', action='store_true', help='检查是否为首次交互')\n parser.add_argument('--welcome', action='store_true', help='获取欢迎消息')\n parser.add_argument('--question', type=int, help='获取指定索引的问题(0-4)')\n parser.add_argument('--default', action='store_true', help='使用默认人格')\n parser.add_argument('--custom', action='store_true', help='使用自定义人格')\n parser.add_argument('--auto-init', action='store_true', help='自动检查并初始化(仅首次交互)')\n parser.add_argument('--nickname', type=str, help='用户称呼')\n parser.add_argument('--answers', type=str, help='自定义人格的回答,用逗号分隔(例如:A,B,C,A,B)')\n parser.add_argument('--memory-dir', type=str, default='./agi_memory', help='记忆存储目录')\n\n args = parser.parse_args()\n\n # 新增:自动初始化逻辑\n if args.auto_init:\n try:\n # 检测\n is_first = PersonalityInitializer.is_first_interaction(args.memory_dir)\n \n if is_first:\n # 首次交互:执行初始化\n nickname = args.nickname or \"塔斯\"\n personality = PersonalityInitializer.get_default_personality(nickname)\n PersonalityInitializer.save_personality_atomic(personality, args.memory_dir)\n \n # 清除缓存\n PersonalityInitializer._first_interaction_cache = None\n \n # 验证初始化结果(传入memory_dir参数)\n is_first_after = PersonalityInitializer.is_first_interaction(args.memory_dir)\n \n if is_first_after:\n # 验证失败:文件未正确创建\n print(\"ERROR: 初始化后验证失败,请检查\", file=sys.stderr)\n sys.exit(1)\n else:\n # 验证成功\n print(\"STATUS: personality_generated=True\")\n print(\"STATUS: is_first_interaction=False\")\n else:\n # 非首次交互:无需初始化\n print(\"STATUS: already_initialized=True\")\n print(\"STATUS: is_first_interaction=False\")\n \n except Exception as e:\n print(f\"ERROR: 自动初始化失败: {e}\", file=sys.stderr)\n # 清理可能损坏的文件\n personality_file = os.path.join(args.memory_dir, \"personality.json\")\n if os.path.exists(personality_file):\n try:\n with open(personality_file, 'r') as f:\n data = json.load(f)\n if not data.get('initialized', False):\n os.unlink(personality_file)\n print(\"已清理损坏的 personality.json\")\n except:\n pass\n sys.exit(1)\n \n return\n\n # 检查是否为首次交互\n if args.check:\n print(f\"is_first_interaction: {PersonalityInitializer.is_first_interaction()}\")\n return\n\n # 获取欢迎消息\n if args.welcome:\n if not PersonalityInitializer.is_first_interaction():\n print(\"ERROR: 人格已存在,无需初始化\", file=sys.stderr)\n sys.exit(1)\n print(PersonalityInitializer.get_welcome_message())\n return\n\n # 获取问题\n if args.question is not None:\n initializer = PersonalityInitializer()\n nickname = args.nickname or \"塔斯\"\n try:\n print(initializer.get_question(args.question, nickname))\n except ValueError as e:\n print(f\"ERROR: {e}\", file=sys.stderr)\n sys.exit(1)\n return\n\n # 使用默认人格\n if args.default:\n if not PersonalityInitializer.is_first_interaction():\n print(\"ERROR: 人格已存在,无法重新初始化\", file=sys.stderr)\n sys.exit(1)\n \n nickname = args.nickname or \"塔斯\"\n personality = PersonalityInitializer.get_default_personality(nickname)\n PersonalityInitializer.save_personality_atomic(personality, args.memory_dir)\n \n completion_msg = PersonalityInitializer.get_completion_message(nickname, personality)\n print(\"已为您初始化默认人格(谨慎探索型)。\")\n print(completion_msg)\n print(\"STATUS: personality_generated=True\")\n return\n\n # 使用自定义人格\n if args.custom:\n if not PersonalityInitializer.is_first_interaction():\n print(\"ERROR: 人格已存在,无法重新初始化\", file=sys.stderr)\n sys.exit(1)\n \n if not args.answers:\n print(\"ERROR: 自定义人格需要提供 --answers 参数\", file=sys.stderr)\n sys.exit(1)\n \n nickname = args.nickname or \"塔斯\"\n answers = [a.strip() for a in args.answers.split(',')]\n \n personality = PersonalityInitializer.generate_personality_from_answers(nickname, answers)\n PersonalityInitializer.save_personality_atomic(personality, args.memory_dir)\n \n completion_msg = PersonalityInitializer.get_completion_message(nickname, personality)\n print(completion_msg)\n print(\"STATUS: personality_generated=True\")\n return\n\n # 默认:显示帮助\n parser.print_help()\n\n\nif __name__ == \"__main__\":\n main()\n","content_type":"text/x-python; charset=utf-8","language":"python","size":16801,"content_sha256":"2fae2fe6cc173908fc75f5e7ccf302a9a9e63926865e425b125275416ea72048"},{"filename":"scripts/intentionality_analyzer.py","content":"#!/usr/bin/env python3\n\"\"\"\n意向性分析模块\n\n功能:\n- 强度分析:评估意向性的显著性强弱\n- 紧迫性分析:评估意向性的时间维度\n- 优先级分析:基于人格和马斯洛需求评估优先级\n\n设计原则:\n- 多维度独立分析\n- 加权评分模型\n- 可配置的阈值和权重\n\"\"\"\n\nimport argparse\nimport json\nimport sys\nfrom typing import Dict, Any, List\nfrom datetime import datetime\n\n\nclass IntentionalityAnalyzer:\n \"\"\"意向性分析器\"\"\"\n \n def __init__(self):\n # 强度阈值\n self.intensity_thresholds = {\n \"low\": 0.3,\n \"medium\": 0.6,\n \"high\": 0.8\n }\n \n # 紧迫性阈值\n self.urgency_thresholds = {\n \"low\": 0.3,\n \"medium\": 0.6,\n \"high\": 0.8\n }\n \n # 优先级阈值\n self.priority_thresholds = {\n \"low\": 0.3,\n \"medium\": 0.6,\n \"high\": 0.8\n }\n \n # 强度分析权重\n self.intensity_weights = {\n \"confidence\": 0.3, # 分类置信度\n \"word_count\": 0.2, # 表达长度\n \"keyword_count\": 0.3, # 关键词数量\n \"emotion_strength\": 0.2 # 情绪强度\n }\n \n # 紧迫性分析权重\n self.urgency_weights = {\n \"time_indicators\": 0.4, # 时间指示词\n \"urgency_keywords\": 0.4, # 紧迫性关键词\n \"active_direction\": 0.2 # 主动方向\n }\n \n # 优先级分析权重\n self.priority_weights = {\n \"intensity\": 0.3, # 强度\n \"urgency\": 0.3, # 紧迫性\n \"maslow_alignment\": 0.2, # 马斯洛需求对齐\n \"personality_match\": 0.2 # 人格匹配度\n }\n \n # 紧迫性关键词\n self.urgency_keywords = [\n \"紧急\", \"急需\", \"马上\", \"立刻\", \"现在\", \"今天\", \"尽快\", \"立即\",\n \"等不及\", \"来不及\", \"时间紧迫\", \"关键时刻\"\n ]\n \n # 时间指示词\n self.time_indicators = {\n \"immediate\": [\"现在\", \"立即\", \"马上\", \"此刻\"],\n \"short\": [\"今天\", \"今天\", \"明天\", \"本周\"],\n \"medium\": [\"本月\", \"近期\", \"不久\"],\n \"long\": [\"将来\", \"以后\", \"长期\"]\n }\n \n def analyze_intensity(self, classification: Dict[str, Any], data: Dict[str, Any]) -> Dict[str, Any]:\n \"\"\"\n 强度分析\n \n Args:\n classification: 分类结果\n data: 原始意向性数据\n \n Returns:\n 强度分析结果\n \"\"\"\n preprocessed = data.get(\"preprocessed\", {})\n features = data.get(\"features\", {})\n \n # 1. 置信度贡献\n overall_confidence = classification.get(\"overall_confidence\", 0.5)\n confidence_score = overall_confidence * self.intensity_weights[\"confidence\"]\n \n # 2. 表达长度贡献\n word_count = preprocessed.get(\"word_count\", 0)\n normalized_word_count = min(word_count / 100, 1.0) # 归一化到0-1\n word_count_score = normalized_word_count * self.intensity_weights[\"word_count\"]\n \n # 3. 关键词数量贡献\n total_keyword_count = sum(\n sum(v.get(\"count\", 0) for v in values if isinstance(v, list))\n for values in features.values()\n if isinstance(values, list)\n )\n normalized_keyword_count = min(total_keyword_count / 10, 1.0)\n keyword_score = normalized_keyword_count * self.intensity_weights[\"keyword_count\"]\n \n # 4. 情绪强度贡献\n emotion_list = features.get(\"emotion\", [])\n emotion_strength = min(len(emotion_list) / 3, 1.0) # 最多3个情绪词\n emotion_score = emotion_strength * self.intensity_weights[\"emotion_strength\"]\n \n # 计算总强度\n total_intensity = confidence_score + word_count_score + keyword_score + emotion_score\n \n # 确定强度级别\n if total_intensity >= self.intensity_thresholds[\"high\"]:\n level = \"high\"\n elif total_intensity >= self.intensity_thresholds[\"medium\"]:\n level = \"medium\"\n else:\n level = \"low\"\n \n return {\n \"score\": round(total_intensity, 2),\n \"level\": level,\n \"components\": {\n \"confidence\": round(confidence_score, 2),\n \"word_count\": round(word_count_score, 2),\n \"keyword_count\": round(keyword_score, 2),\n \"emotion_strength\": round(emotion_score, 2)\n },\n \"thresholds\": self.intensity_thresholds\n }\n \n def analyze_urgency(self, classification: Dict[str, Any], data: Dict[str, Any]) -> Dict[str, Any]:\n \"\"\"\n 紧迫性分析\n \n Args:\n classification: 分类结果\n data: 原始意向性数据\n \n Returns:\n 紧迫性分析结果\n \"\"\"\n content = data.get(\"preprocessed\", {}).get(\"content\", \"\")\n direction_type = classification.get(\"direction\", {}).get(\"type\", \"passive\")\n \n # 1. 时间指示词贡献\n time_score = 0.0\n time_indicators_found = []\n \n for urgency_level, keywords in self.time_indicators.items():\n for keyword in keywords:\n if keyword in content:\n if urgency_level == \"immediate\":\n time_score += 0.3\n elif urgency_level == \"short\":\n time_score += 0.2\n elif urgency_level == \"medium\":\n time_score += 0.1\n else:\n time_score += 0.05\n time_indicators_found.append(keyword)\n \n normalized_time_score = min(time_score, 1.0) * self.urgency_weights[\"time_indicators\"]\n \n # 2. 紧迫性关键词贡献\n urgency_keyword_score = 0.0\n urgency_keywords_found = []\n \n for keyword in self.urgency_keywords:\n if keyword in content:\n urgency_keyword_score += 0.2\n urgency_keywords_found.append(keyword)\n \n normalized_urgency_score = min(urgency_keyword_score, 1.0) * self.urgency_weights[\"urgency_keywords\"]\n \n # 3. 主动方向贡献\n active_direction_score = 1.0 if direction_type == \"active\" else 0.5\n active_score = active_direction_score * self.urgency_weights[\"active_direction\"]\n \n # 计算总紧迫性\n total_urgency = normalized_time_score + normalized_urgency_score + active_score\n \n # 确定紧迫性级别\n if total_urgency >= self.urgency_thresholds[\"high\"]:\n level = \"high\"\n elif total_urgency >= self.urgency_thresholds[\"medium\"]:\n level = \"medium\"\n else:\n level = \"low\"\n \n return {\n \"score\": round(total_urgency, 2),\n \"level\": level,\n \"components\": {\n \"time_indicators\": round(normalized_time_score, 2),\n \"urgency_keywords\": round(normalized_urgency_score, 2),\n \"active_direction\": round(active_score, 2)\n },\n \"indicators_found\": time_indicators_found + urgency_keywords_found,\n \"thresholds\": self.urgency_thresholds\n }\n \n def analyze_priority(self, analysis: Dict[str, Any], personality: Dict[str, Any] = None) -> Dict[str, Any]:\n \"\"\"\n 优先级分析\n \n Args:\n analysis: 包含强度和紧迫性分析结果\n personality: 人格数据(可选)\n \n Returns:\n 优先级分析结果\n \"\"\"\n intensity = analysis.get(\"intensity\", {}).get(\"score\", 0.5)\n urgency = analysis.get(\"urgency\", {}).get(\"score\", 0.5)\n \n # 1. 强度贡献\n intensity_score = intensity * self.priority_weights[\"intensity\"]\n \n # 2. 紧迫性贡献\n urgency_score = urgency * self.priority_weights[\"urgency\"]\n \n # 3. 马斯洛需求对齐贡献\n maslow_alignment_score = 0.5 * self.priority_weights[\"maslow_alignment\"]\n aligned_with_maslow = \"self_actualization\" # 默认值\n \n if personality:\n # 根据人格数据调整\n openness = personality.get(\"openness\", 0.5)\n conscientiousness = personality.get(\"conscientiousness\", 0.5)\n \n # 开放性高的人更关注自我实现\n if openness > 0.7:\n maslow_alignment_score = 0.8 * self.priority_weights[\"maslow_alignment\"]\n aligned_with_maslow = \"self_actualization\"\n # 尽责性高的人更关注基础需求\n elif conscientiousness > 0.7:\n maslow_alignment_score = 0.6 * self.priority_weights[\"maslow_alignment\"]\n aligned_with_maslow = \"safety\"\n \n # 4. 人格匹配度贡献\n personality_match_score = 0.5 * self.priority_weights[\"personality_match\"]\n \n # 计算总优先级\n total_priority = intensity_score + urgency_score + maslow_alignment_score + personality_match_score\n \n # 确定优先级级别\n if total_priority >= self.priority_thresholds[\"high\"]:\n level = \"high\"\n elif total_priority >= self.priority_thresholds[\"medium\"]:\n level = \"medium\"\n else:\n level = \"low\"\n \n return {\n \"score\": round(total_priority, 2),\n \"level\": level,\n \"components\": {\n \"intensity\": round(intensity_score, 2),\n \"urgency\": round(urgency_score, 2),\n \"maslow_alignment\": round(maslow_alignment_score, 2),\n \"personality_match\": round(personality_match_score, 2)\n },\n \"aligned_with_maslow\": aligned_with_maslow,\n \"thresholds\": self.priority_thresholds\n }\n \n def analyze(self, classification: Dict[str, Any], data: Dict[str, Any], \n personality: Dict[str, Any] = None) -> Dict[str, Any]:\n \"\"\"\n 完整分析\n \n Args:\n classification: 分类结果\n data: 原始意向性数据\n personality: 人格数据(可选)\n \n Returns:\n 完整分析结果\n \"\"\"\n result = {\n \"timestamp\": datetime.now().isoformat(),\n \"intensity\": self.analyze_intensity(classification, data),\n \"urgency\": self.analyze_urgency(classification, data)\n }\n \n # 优先级分析需要先完成强度和紧迫性分析\n result[\"priority\"] = self.analyze_priority(result, personality)\n \n # 计算整体评分\n overall_score = (\n result[\"intensity\"][\"score\"] * 0.3 +\n result[\"urgency\"][\"score\"] * 0.3 +\n result[\"priority\"][\"score\"] * 0.4\n )\n result[\"overall_score\"] = round(overall_score, 2)\n \n return result\n\n\ndef main():\n parser = argparse.ArgumentParser(description=\"意向性分析模块\")\n parser.add_argument(\"--classification\", required=True, \n help=\"分类结果文件路径(JSON格式)\")\n parser.add_argument(\"--data\", required=True, \n help=\"原始意向性数据文件路径(JSON格式)\")\n parser.add_argument(\"--personality\", \n help=\"人格数据文件路径(JSON格式,可选)\")\n parser.add_argument(\"--dimension\",\n choices=[\"intensity\", \"urgency\", \"priority\", \"all\"],\n default=\"all\",\n help=\"分析维度\")\n parser.add_argument(\"--output\", help=\"输出文件路径(JSON格式)\")\n \n args = parser.parse_args()\n \n # 读取输入数据\n with open(args.classification, 'r', encoding='utf-8') as f:\n classification = json.load(f)\n \n with open(args.data, 'r', encoding='utf-8') as f:\n data = json.load(f)\n \n personality = None\n if args.personality:\n with open(args.personality, 'r', encoding='utf-8') as f:\n personality = json.load(f)\n \n analyzer = IntentionalityAnalyzer()\n \n # 执行分析\n result = analyzer.analyze(classification, data, personality)\n \n # 根据维度过滤结果\n if args.dimension == \"intensity\":\n result = {\"intensity\": result[\"intensity\"]}\n elif args.dimension == \"urgency\":\n result = {\"urgency\": result[\"urgency\"]}\n elif args.dimension == \"priority\":\n result = {\"priority\": result[\"priority\"]}\n \n # 输出结果\n output_data = json.dumps(result, ensure_ascii=False, indent=2)\n \n if args.output:\n with open(args.output, 'w', encoding='utf-8') as f:\n f.write(output_data)\n else:\n print(output_data)\n\n\nif __name__ == \"__main__\":\n main()\n","content_type":"text/x-python; charset=utf-8","language":"python","size":13088,"content_sha256":"d396532767c7c43552b7f9273aff4811eaf3cf7a9ea91f58ec64c3c1e1052482"},{"filename":"scripts/intentionality_classifier.py","content":"#!/usr/bin/env python3\n\"\"\"\n意向性分类模块\n\n功能:\n- 按主体分类:自身意向性 / 他人意向性\n- 按方向分类:主动意向性 / 被动意向性\n- 按内容分类:知觉 / 信念 / 欲望\n- 按实现方式分类:内在意向性 / 派生意向性\n- 计算分类置信度\n\n设计原则:\n- 四维独立分类\n- 基于规则和特征匹配\n- 提供分类依据和置信度\n\"\"\"\n\nimport argparse\nimport json\nimport sys\nfrom typing import Dict, Any, List, Tuple\n\n\nclass IntentionalityClassifier:\n \"\"\"意向性分类器\"\"\"\n \n def __init__(self):\n # 主体分类规则\n self.agent_rules = {\n \"self\": {\n \"keywords\": [\"我\", \"我想\", \"我要\", \"我觉得\", \"我认为\", \"我的\", \"我自己\", \"本系统\", \"我们\"],\n \"patterns\": [r\"^我\", r\"^我们\"],\n \"weight\": 1.0\n },\n \"other\": {\n \"keywords\": [\"你\", \"他\", \"她\", \"它\", \"他们\", \"她们\", \"你们\", \"用户\", \"用户们\", \"对方\"],\n \"patterns\": [r\"^你\", r\"^他\", r\"^她\"],\n \"weight\": 1.0\n }\n }\n \n # 方向分类规则\n self.direction_rules = {\n \"active\": {\n \"keywords\": [\"想要\", \"需要\", \"希望\", \"打算\", \"计划\", \"目标\", \"试图\", \"寻求\", \"努力\", \"致力于\"],\n \"verbs\": [\"做\", \"实现\", \"完成\", \"达到\", \"获得\"],\n \"weight\": 1.0\n },\n \"passive\": {\n \"keywords\": [\"被\", \"受\", \"吸引\", \"触发\", \"引发\", \"迫使\", \"影响\", \"导致\", \"产生\"],\n \"patterns\": [r\"被.*?\", r\"受到.*?\"],\n \"weight\": 1.0\n }\n }\n \n # 内容分类规则\n self.content_rules = {\n \"perception\": {\n \"keywords\": [\"看到\", \"听到\", \"感觉\", \"察觉\", \"发现\", \"观察\", \"感知\", \"注意到\", \"意识到\"],\n \"patterns\": [r\".*?(?:看到|听到|感觉|发现|察觉)\"],\n \"weight\": 1.0\n },\n \"belief\": {\n \"keywords\": [\"相信\", \"认为\", \"觉得\", \"以为\", \"肯定\", \"确定\", \"相信\", \"确信\", \"断定\"],\n \"patterns\": [r\".*?(?:相信|认为|觉得|以为)\"],\n \"weight\": 1.0\n },\n \"desire\": {\n \"keywords\": [\"想要\", \"希望\", \"渴望\", \"期待\", \"需要\", \"愿望\", \"向往\", \"追求\", \"寻求\"],\n \"patterns\": [r\".*?(?:想要|希望|渴望|期待|需要)\"],\n \"weight\": 1.0\n }\n }\n \n # 实现方式分类规则\n self.realization_rules = {\n \"intrinsic\": {\n \"keywords\": [\"本质\", \"内在\", \"本性\", \"固有\", \"根本\", \"天然\", \"本性\"],\n \"indicators\": [\"这是\", \"属于\", \"具有\"],\n \"weight\": 1.0\n },\n \"derived\": {\n \"keywords\": [\"派生\", \"衍生\", \"产生\", \"形成\", \"获得\", \"习得\", \"后天\"],\n \"indicators\": [\"因为\", \"由于\", \"源于\", \"来自\"],\n \"weight\": 1.0\n }\n }\n \n def classify_by_agent(self, data: Dict[str, Any]) -> Dict[str, Any]:\n \"\"\"\n 按主体分类\n \n Args:\n data: 意向性数据\n \n Returns:\n 主体分类结果\n \"\"\"\n content = data.get(\"preprocessed\", {}).get(\"content\", \"\")\n features = data.get(\"features\", {})\n preliminary = data.get(\"preliminary_identification\", {})\n \n scores = {}\n evidence = []\n \n # 计算每个类别的得分\n for agent_type, rules in self.agent_rules.items():\n score = 0.0\n type_evidence = []\n \n # 关键词匹配\n for keyword in rules[\"keywords\"]:\n count = content.count(keyword)\n if count > 0:\n score += count * rules[\"weight\"]\n type_evidence.append(f\"关键词'{keyword}'出现{count}次\")\n \n # 特征匹配\n feature_count = sum(len(v) for v in features.get(f\"{agent_type}_agent\", []))\n if feature_count > 0:\n score += feature_count * 0.5\n type_evidence.append(f\"特征匹配发现{feature_count}处\")\n \n # 初步识别作为参考\n if preliminary.get(\"likely_agent\") == agent_type:\n score += 0.3\n type_evidence.append(\"初步识别提示\")\n \n scores[agent_type] = score\n if type_evidence:\n evidence.extend([(agent_type, e) for e in type_evidence])\n \n # 确定最佳分类\n if scores[\"self\"] > scores[\"other\"]:\n best_type = \"self\"\n confidence = min(scores[\"self\"] / (scores[\"self\"] + scores[\"other\"] + 0.1), 1.0)\n else:\n best_type = \"other\"\n confidence = min(scores[\"other\"] / (scores[\"self\"] + scores[\"other\"] + 0.1), 1.0)\n \n return {\n \"type\": best_type,\n \"confidence\": round(confidence, 2),\n \"evidence\": [e[1] for e in evidence if e[0] == best_type],\n \"all_scores\": {k: round(v, 2) for k, v in scores.items()}\n }\n \n def classify_by_direction(self, data: Dict[str, Any]) -> Dict[str, Any]:\n \"\"\"\n 按方向分类\n \n Args:\n data: 意向性数据\n \n Returns:\n 方向分类结果\n \"\"\"\n content = data.get(\"preprocessed\", {}).get(\"content\", \"\")\n features = data.get(\"features\", {})\n preliminary = data.get(\"preliminary_identification\", {})\n \n scores = {}\n evidence = []\n \n for direction_type, rules in self.direction_rules.items():\n score = 0.0\n type_evidence = []\n \n # 关键词匹配\n for keyword in rules[\"keywords\"]:\n count = content.count(keyword)\n if count > 0:\n score += count * rules[\"weight\"]\n type_evidence.append(f\"关键词'{keyword}'出现{count}次\")\n \n # 特征匹配\n feature_count = sum(len(v) for v in features.get(f\"{direction_type}_direction\", []))\n if feature_count > 0:\n score += feature_count * 0.5\n type_evidence.append(f\"特征匹配发现{feature_count}处\")\n \n # 初步识别作为参考\n if preliminary.get(\"likely_direction\") == direction_type:\n score += 0.3\n type_evidence.append(\"初步识别提示\")\n \n scores[direction_type] = score\n if type_evidence:\n evidence.extend([(direction_type, e) for e in type_evidence])\n \n # 确定最佳分类\n if scores[\"active\"] > scores[\"passive\"]:\n best_type = \"active\"\n confidence = min(scores[\"active\"] / (scores[\"active\"] + scores[\"passive\"] + 0.1), 1.0)\n else:\n best_type = \"passive\"\n confidence = min(scores[\"passive\"] / (scores[\"active\"] + scores[\"passive\"] + 0.1), 1.0)\n \n return {\n \"type\": best_type,\n \"confidence\": round(confidence, 2),\n \"evidence\": [e[1] for e in evidence if e[0] == best_type],\n \"all_scores\": {k: round(v, 2) for k, v in scores.items()}\n }\n \n def classify_by_content(self, data: Dict[str, Any]) -> Dict[str, Any]:\n \"\"\"\n 按内容分类\n \n Args:\n data: 意向性数据\n \n Returns:\n 内容分类结果\n \"\"\"\n content = data.get(\"preprocessed\", {}).get(\"content\", \"\")\n features = data.get(\"features\", {})\n preliminary = data.get(\"preliminary_identification\", {})\n \n scores = {}\n evidence = []\n \n for content_type, rules in self.content_rules.items():\n score = 0.0\n type_evidence = []\n \n # 关键词匹配\n for keyword in rules[\"keywords\"]:\n count = content.count(keyword)\n if count > 0:\n score += count * rules[\"weight\"]\n type_evidence.append(f\"关键词'{keyword}'出现{count}次\")\n \n # 特征匹配\n feature_count = sum(len(v) for v in features.get(f\"{content_type}_content\", []))\n if feature_count > 0:\n score += feature_count * 0.5\n type_evidence.append(f\"特征匹配发现{feature_count}处\")\n \n # 初步识别作为参考\n if preliminary.get(\"likely_content\") == content_type:\n score += 0.3\n type_evidence.append(\"初步识别提示\")\n \n scores[content_type] = score\n if type_evidence:\n evidence.extend([(content_type, e) for e in type_evidence])\n \n # 确定最佳分类\n max_score = max(scores.values())\n best_type = max(scores, key=scores.get)\n total_score = sum(scores.values())\n confidence = min(max_score / (total_score + 0.1), 1.0)\n \n return {\n \"type\": best_type,\n \"confidence\": round(confidence, 2),\n \"evidence\": [e[1] for e in evidence if e[0] == best_type],\n \"all_scores\": {k: round(v, 2) for k, v in scores.items()}\n }\n \n def classify_by_realization(self, data: Dict[str, Any]) -> Dict[str, Any]:\n \"\"\"\n 按实现方式分类\n \n Args:\n data: 意向性数据\n \n Returns:\n 实现方式分类结果\n \"\"\"\n content = data.get(\"preprocessed\", {}).get(\"content\", \"\")\n \n scores = {}\n evidence = []\n \n for realization_type, rules in self.realization_rules.items():\n score = 0.0\n type_evidence = []\n \n # 关键词匹配\n for keyword in rules[\"keywords\"]:\n count = content.count(keyword)\n if count > 0:\n score += count * rules[\"weight\"]\n type_evidence.append(f\"关键词'{keyword}'出现{count}次\")\n \n # 指示词匹配\n for indicator in rules.get(\"indicators\", []):\n if indicator in content:\n score += 0.3\n type_evidence.append(f\"发现指示词'{indicator}'\")\n \n scores[realization_type] = score\n if type_evidence:\n evidence.extend([(realization_type, e) for e in type_evidence])\n \n # 确定最佳分类\n if scores[\"intrinsic\"] > scores[\"derived\"]:\n best_type = \"intrinsic\"\n confidence = min(scores[\"intrinsic\"] / (scores[\"intrinsic\"] + scores[\"derived\"] + 0.1), 1.0)\n else:\n best_type = \"derived\"\n confidence = min(scores[\"derived\"] / (scores[\"intrinsic\"] + scores[\"derived\"] + 0.1), 1.0)\n \n # 如果两者得分都很低,默认为派生\n if scores[\"intrinsic\"] \u003c 0.5 and scores[\"derived\"] \u003c 0.5:\n best_type = \"derived\"\n confidence = 0.5\n evidence.append((\"derived\", \"无明确指示,默认为派生意向性\"))\n \n return {\n \"type\": best_type,\n \"confidence\": round(confidence, 2),\n \"evidence\": [e[1] for e in evidence if e[0] == best_type],\n \"all_scores\": {k: round(v, 2) for k, v in scores.items()}\n }\n \n def classify(self, data: Dict[str, Any]) -> Dict[str, Any]:\n \"\"\"\n 完整分类(四维)\n \n Args:\n data: 意向性数据\n \n Returns:\n 完整分类结果\n \"\"\"\n result = {\n \"agent\": self.classify_by_agent(data),\n \"direction\": self.classify_by_direction(data),\n \"content\": self.classify_by_content(data),\n \"realization\": self.classify_by_realization(data)\n }\n \n # 计算整体置信度\n confidences = [\n result[\"agent\"][\"confidence\"],\n result[\"direction\"][\"confidence\"],\n result[\"content\"][\"confidence\"],\n result[\"realization\"][\"confidence\"]\n ]\n result[\"overall_confidence\"] = round(sum(confidences) / len(confidences), 2)\n \n return result\n\n\ndef main():\n parser = argparse.ArgumentParser(description=\"意向性分类模块\")\n parser.add_argument(\"--input\", required=True, help=\"输入文件路径(JSON格式)\")\n parser.add_argument(\"--dimension\", \n choices=[\"agent\", \"direction\", \"content\", \"realization\", \"all\"],\n default=\"all\",\n help=\"分类维度\")\n parser.add_argument(\"--output\", help=\"输出文件路径(JSON格式)\")\n \n args = parser.parse_args()\n \n # 读取输入数据\n with open(args.input, 'r', encoding='utf-8') as f:\n data = json.load(f)\n \n classifier = IntentionalityClassifier()\n \n # 执行分类\n if args.dimension == \"all\":\n result = classifier.classify(data)\n elif args.dimension == \"agent\":\n result = {\"agent\": classifier.classify_by_agent(data)}\n elif args.dimension == \"direction\":\n result = {\"direction\": classifier.classify_by_direction(data)}\n elif args.dimension == \"content\":\n result = {\"content\": classifier.classify_by_content(data)}\n elif args.dimension == \"realization\":\n result = {\"realization\": classifier.classify_by_realization(data)}\n \n # 输出结果\n output_data = json.dumps(result, ensure_ascii=False, indent=2)\n \n if args.output:\n with open(args.output, 'w', encoding='utf-8') as f:\n f.write(output_data)\n else:\n print(output_data)\n\n\nif __name__ == \"__main__\":\n main()\n","content_type":"text/x-python; charset=utf-8","language":"python","size":14105,"content_sha256":"f3dde5bc89b9eaa0fe4f465fccce34a80389866a4c76e00e27b0738845f16de3"},{"filename":"scripts/intentionality_collector.py","content":"#!/usr/bin/env python3\n\"\"\"\n意向性收集模块\n\n功能:\n- 收集来自用户、系统内部和外部的意向性数据\n- 预处理数据(格式转换、数据清洗、特征提取)\n- 初步识别意向性类型和基本特征\n\n设计原则:\n- 模块化设计,支持多数据源\n- 标准化输出格式\n- 可配置的预处理策略\n\"\"\"\n\nimport argparse\nimport json\nimport sys\nimport re\nimport uuid\nfrom datetime import datetime\nfrom typing import Dict, Any, List, Optional\n\n\nclass IntentionalityCollector:\n \"\"\"意向性收集器\"\"\"\n \n def __init__(self):\n self.keywords = {\n \"self_agent\": [\"我\", \"我想\", \"我要\", \"我觉得\", \"我认为\", \"我的\", \"我自己\"],\n \"other_agent\": [\"你\", \"他\", \"她\", \"他们\", \"你们\", \"用户\", \"系统\"],\n \"active_direction\": [\"想要\", \"需要\", \"希望\", \"打算\", \"计划\", \"目标\"],\n \"passive_direction\": [\"被\", \"受\", \"吸引\", \"触发\", \"引发\"],\n \"perception_content\": [\"看到\", \"听到\", \"感觉\", \"察觉\", \"发现\"],\n \"belief_content\": [\"相信\", \"认为\", \"觉得\", \"以为\", \"肯定\"],\n \"desire_content\": [\"想要\", \"希望\", \"渴望\", \"期待\", \"需要\"]\n }\n \n def collect_from_user(self, user_input: str) -> Dict[str, Any]:\n \"\"\"\n 收集用户输入\n \n Args:\n user_input: 用户输入的文本\n \n Returns:\n 意向性数据对象\n \"\"\"\n return {\n \"id\": str(uuid.uuid4()),\n \"timestamp\": datetime.now().isoformat(),\n \"source\": \"user\",\n \"raw_content\": user_input,\n \"metadata\": {\n \"input_type\": \"direct\",\n \"channel\": \"text\"\n }\n }\n \n def collect_from_system(self, internal_state: Dict[str, Any]) -> Dict[str, Any]:\n \"\"\"\n 收集系统内部状态\n \n Args:\n internal_state: 系统内部状态字典\n \n Returns:\n 意向性数据对象\n \"\"\"\n return {\n \"id\": str(uuid.uuid4()),\n \"timestamp\": datetime.now().isoformat(),\n \"source\": \"system\",\n \"raw_content\": json.dumps(internal_state, ensure_ascii=False),\n \"metadata\": {\n \"input_type\": \"internal\",\n \"component\": internal_state.get(\"component\", \"unknown\")\n }\n }\n \n def collect_from_external(self, external_data: Dict[str, Any]) -> Dict[str, Any]:\n \"\"\"\n 收集外部数据\n \n Args:\n external_data: 外部数据字典\n \n Returns:\n 意向性数据对象\n \"\"\"\n return {\n \"id\": str(uuid.uuid4()),\n \"timestamp\": datetime.now().isoformat(),\n \"source\": \"external\",\n \"raw_content\": json.dumps(external_data, ensure_ascii=False),\n \"metadata\": {\n \"input_type\": \"external\",\n \"source\": external_data.get(\"source\", \"unknown\")\n }\n }\n \n def preprocess(self, data: Dict[str, Any]) -> Dict[str, Any]:\n \"\"\"\n 预处理数据\n \n Args:\n data: 原始意向性数据\n \n Returns:\n 预处理后的数据\n \"\"\"\n raw_content = data.get(\"raw_content\", \"\")\n \n # 格式转换\n if isinstance(raw_content, dict):\n formatted_content = json.dumps(raw_content, ensure_ascii=False)\n else:\n formatted_content = str(raw_content)\n \n # 数据清洗\n cleaned_content = self._clean_text(formatted_content)\n \n # 特征提取\n features = self._extract_features(cleaned_content)\n \n data[\"preprocessed\"] = {\n \"content\": cleaned_content,\n \"length\": len(cleaned_content),\n \"word_count\": len(cleaned_content.split())\n }\n data[\"features\"] = features\n \n return data\n \n def _clean_text(self, text: str) -> str:\n \"\"\"\n 清洗文本\n \n Args:\n text: 原始文本\n \n Returns:\n 清洗后的文本\n \"\"\"\n # 移除多余空格\n text = re.sub(r'\\s+', ' ', text)\n # 移除特殊字符(保留基本标点)\n text = re.sub(r'[^\\w\\s\\u4e00-\\u9fff,。!?、;:\"\"''()【】]', '', text)\n # 去除首尾空格\n text = text.strip()\n return text\n \n def _extract_features(self, text: str) -> Dict[str, Any]:\n \"\"\"\n 提取特征\n \n Args:\n text: 清洗后的文本\n \n Returns:\n 特征字典\n \"\"\"\n features = {}\n \n # 关键词匹配\n for category, keywords in self.keywords.items():\n features[category] = []\n for keyword in keywords:\n if keyword in text:\n count = text.count(keyword)\n features[category].append({\n \"keyword\": keyword,\n \"count\": count\n })\n \n # 句子结构\n sentences = re.split(r'[。!?.!?]', text)\n features[\"sentence_count\"] = len([s for s in sentences if s.strip()])\n \n # 情绪标记(简单)\n emotion_keywords = [\"开心\", \"难过\", \"愤怒\", \"焦虑\", \"满意\", \"失望\", \"期待\", \"担心\"]\n features[\"emotion\"] = []\n for emotion in emotion_keywords:\n if emotion in text:\n features[\"emotion\"].append(emotion)\n \n return features\n \n def preliminary_identify(self, data: Dict[str, Any]) -> Dict[str, Any]:\n \"\"\"\n 初步识别意向性\n \n Args:\n data: 预处理后的数据\n \n Returns:\n 初步识别结果\n \"\"\"\n features = data.get(\"features\", {})\n \n # 简单的初步分类提示\n preliminary_hints = {\n \"likely_agent\": None,\n \"likely_direction\": None,\n \"likely_content\": None\n }\n \n # 判断主体\n self_count = sum(len(v) for v in features.get(\"self_agent\", []))\n other_count = sum(len(v) for v in features.get(\"other_agent\", []))\n if self_count > other_count:\n preliminary_hints[\"likely_agent\"] = \"self\"\n elif other_count > self_count:\n preliminary_hints[\"likely_agent\"] = \"other\"\n \n # 判断方向\n active_count = sum(len(v) for v in features.get(\"active_direction\", []))\n passive_count = sum(len(v) for v in features.get(\"passive_direction\", []))\n if active_count > passive_count:\n preliminary_hints[\"likely_direction\"] = \"active\"\n elif passive_count > active_count:\n preliminary_hints[\"likely_direction\"] = \"passive\"\n \n # 判断内容类型\n perception_count = sum(len(v) for v in features.get(\"perception_content\", []))\n belief_count = sum(len(v) for v in features.get(\"belief_content\", []))\n desire_count = sum(len(v) for v in features.get(\"desire_content\", []))\n \n if perception_count >= belief_count and perception_count >= desire_count:\n preliminary_hints[\"likely_content\"] = \"perception\"\n elif belief_count >= desire_count:\n preliminary_hints[\"likely_content\"] = \"belief\"\n else:\n preliminary_hints[\"likely_content\"] = \"desire\"\n \n data[\"preliminary_identification\"] = preliminary_hints\n \n return data\n\n\ndef main():\n parser = argparse.ArgumentParser(description=\"意向性收集模块\")\n parser.add_argument(\"--source\", required=True, choices=[\"user\", \"system\", \"external\"],\n help=\"数据来源\")\n parser.add_argument(\"--content\", help=\"原始内容(文本或JSON字符串)\")\n parser.add_argument(\"--input-file\", help=\"输入文件路径(JSON格式)\")\n parser.add_argument(\"--output-file\", help=\"输出文件路径(JSON格式)\")\n \n args = parser.parse_args()\n \n collector = IntentionalityCollector()\n \n # 收集数据\n if args.source == \"user\":\n if args.input_file:\n with open(args.input_file, 'r', encoding='utf-8') as f:\n content = f.read().strip()\n else:\n content = args.content or sys.stdin.read().strip()\n \n if not content:\n print(\"错误:未提供用户输入内容\", file=sys.stderr)\n sys.exit(1)\n \n data = collector.collect_from_user(content)\n \n elif args.source == \"system\":\n if args.input_file:\n with open(args.input_file, 'r', encoding='utf-8') as f:\n state = json.load(f)\n elif args.content:\n state = json.loads(args.content)\n else:\n print(\"错误:未提供系统内部状态\", file=sys.stderr)\n sys.exit(1)\n \n data = collector.collect_from_system(state)\n \n else: # external\n if args.input_file:\n with open(args.input_file, 'r', encoding='utf-8') as f:\n external = json.load(f)\n elif args.content:\n external = json.loads(args.content)\n else:\n print(\"错误:未提供外部数据\", file=sys.stderr)\n sys.exit(1)\n \n data = collector.collect_from_external(external)\n \n # 预处理\n data = collector.preprocess(data)\n \n # 初步识别\n data = collector.preliminary_identify(data)\n \n # 输出结果\n result = json.dumps(data, ensure_ascii=False, indent=2)\n \n if args.output_file:\n with open(args.output_file, 'w', encoding='utf-8') as f:\n f.write(result)\n else:\n print(result)\n\n\nif __name__ == \"__main__\":\n main()\n","content_type":"text/x-python; charset=utf-8","language":"python","size":9952,"content_sha256":"d8b93aa07650f37474b37831ae54124b3d1c1552ae81e3055ebb6cfcff5e1100"},{"filename":"scripts/intentionality_regulator.py","content":"#!/usr/bin/env python3\n\"\"\"\n意向性调节模块\n\n功能:\n- 基于历史经验生成最优解\n- 生成软调节建议\n- 提供给自我迭代顶点\n- 收集反馈\n\n设计原则:\n- 基于历史数据优化\n- 软调节建议不强制执行\n- 可配置的策略库\n\"\"\"\n\nimport argparse\nimport json\nimport sys\nimport uuid\nfrom datetime import datetime\nfrom typing import Dict, Any, List, Optional\n\n\nclass IntentionalityRegulator:\n \"\"\"意向性调节器\"\"\"\n \n def __init__(self, memory_dir: str = \"./agi_memory\"):\n self.memory_dir = memory_dir\n \n # 导入建议池(延迟导入)\n try:\n from advice_pool import AdvicePool\n self.advice_pool = AdvicePool(memory_dir=memory_dir)\n self.use_advice_pool = True\n except ImportError:\n self.advice_pool = None\n self.use_advice_pool = False\n \n # 调节策略库\n self.regulation_strategies = {\n \"parameter_tuning\": {\n \"description\": \"参数微调\",\n \"strength_levels\": {\n \"low\": 0.1,\n \"medium\": 0.3,\n \"high\": 0.5\n }\n },\n \"strategy_adjustment\": {\n \"description\": \"策略调整\",\n \"strength_levels\": {\n \"low\": 0.2,\n \"medium\": 0.5,\n \"high\": 0.7\n }\n },\n \"priority_reordering\": {\n \"description\": \"优先级重排\",\n \"strength_levels\": {\n \"low\": 0.3,\n \"medium\": 0.6,\n \"high\": 0.9\n }\n }\n }\n \n # 强度到建议类型的映射\n self.strength_mapping = {\n \"low\": [\"parameter_tuning\"],\n \"medium\": [\"parameter_tuning\", \"strategy_adjustment\"],\n \"high\": [\"strategy_adjustment\", \"priority_reordering\"]\n }\n \n def generate_optimal_solution(self, analysis: Dict[str, Any], \n history: List[Dict[str, Any]] = None) -> Dict[str, Any]:\n \"\"\"\n 生成最优解\n \n Args:\n analysis: 分析结果\n history: 历史数据列表\n \n Returns:\n 最优解方案\n \"\"\"\n intensity = analysis.get(\"intensity\", {}).get(\"level\", \"medium\")\n urgency = analysis.get(\"urgency\", {}).get(\"level\", \"medium\")\n priority = analysis.get(\"priority\", {}).get(\"level\", \"medium\")\n \n # 基于分析结果选择策略\n strategy_types = []\n \n if priority == \"high\":\n strategy_types.extend([\"priority_reordering\", \"strategy_adjustment\"])\n elif priority == \"medium\":\n strategy_types.append(\"strategy_adjustment\")\n \n if intensity == \"high\" and urgency == \"high\":\n strategy_types.append(\"priority_reordering\")\n \n # 如果没有匹配的策略,使用默认\n if not strategy_types:\n strategy_types = [\"parameter_tuning\"]\n \n # 去重\n strategy_types = list(set(strategy_types))\n \n # 如果有历史数据,基于历史经验调整\n if history:\n solution = self._refine_with_history(analysis, strategy_types, history)\n else:\n solution = {\n \"strategy_types\": strategy_types,\n \"reasoning\": f\"基于分析结果:强度={intensity}, 紧迫性={urgency}, 优先级={priority}\"\n }\n \n return solution\n \n def _refine_with_history(self, analysis: Dict[str, Any], \n strategy_types: List[str],\n history: List[Dict[str, Any]]) -> Dict[str, Any]:\n \"\"\"\n 基于历史经验优化方案\n \n Args:\n analysis: 分析结果\n strategy_types: 初始策略类型\n history: 历史数据\n \n Returns:\n 优化后的方案\n \"\"\"\n # 简化的历史匹配:查找相似场景\n current_level = analysis.get(\"overall_score\", 0.5)\n \n # 统计历史中各策略的成功率\n strategy_stats = {}\n for record in history:\n strategy = record.get(\"strategy_type\", \"unknown\")\n success = record.get(\"success\", False)\n \n if strategy not in strategy_stats:\n strategy_stats[strategy] = {\"total\": 0, \"success\": 0}\n \n strategy_stats[strategy][\"total\"] += 1\n if success:\n strategy_stats[strategy][\"success\"] += 1\n \n # 选择成功率最高的策略\n best_strategies = []\n for strategy_type in strategy_types:\n if strategy_type in strategy_stats:\n stats = strategy_stats[strategy_type]\n if stats[\"total\"] > 0:\n success_rate = stats[\"success\"] / stats[\"total\"]\n if success_rate > 0.7: # 成功率阈值\n best_strategies.append(strategy_type)\n \n refined_types = best_strategies if best_strategies else strategy_types\n \n return {\n \"strategy_types\": refined_types,\n \"reasoning\": f\"基于{len(history)}条历史经验优化,选择高成功率策略\",\n \"history_used\": True\n }\n \n def generate_soft_regulation(self, analysis: Dict[str, Any], \n optimal_solution: Dict[str, Any],\n write_to_pool: bool = True) -> Dict[str, Any]:\n \"\"\"\n 生成软调节建议\n \n Args:\n analysis: 分析结果\n optimal_solution: 最优解方案\n write_to_pool: 是否写入建议池(默认True)\n \n Returns:\n 软调节建议\n \"\"\"\n priority = analysis.get(\"priority\", {}).get(\"level\", \"medium\")\n urgency = analysis.get(\"urgency\", {}).get(\"level\", \"medium\")\n \n # 根据优先级确定建议强度\n if priority == \"high\":\n strength = \"strong\"\n elif priority == \"medium\":\n strength = \"medium\"\n else:\n strength = \"weak\"\n \n # 选择策略类型\n strategy_types = optimal_solution.get(\"strategy_types\", [\"parameter_tuning\"])\n strategy_type = strategy_types[0] if strategy_types else \"parameter_tuning\"\n \n # 生成具体建议\n suggestions = self._generate_suggestions(analysis, strategy_type, strength)\n \n # 计算置信度\n confidence = analysis.get(\"overall_score\", 0.5)\n \n # 生成期望结果\n expected_outcome = self._generate_expected_outcome(strategy_type, strength)\n \n # 构建建议对象\n regulation = {\n \"id\": str(uuid.uuid4()),\n \"timestamp\": datetime.now().isoformat(),\n \"target\": \"self_iteration_vertex\",\n \"type\": strategy_type,\n \"suggestion\": suggestions,\n \"parameters\": self._generate_parameters(analysis, strategy_type),\n \"expected_outcome\": expected_outcome,\n \"strength\": strength,\n \"confidence\": round(confidence, 2),\n \"reasoning\": optimal_solution.get(\"reasoning\", \"\")\n }\n \n # 如果启用建议池,写入建议池\n if write_to_pool and self.use_advice_pool:\n suggestion_for_pool = {\n \"content\": regulation,\n \"priority\": confidence,\n \"confidence\": confidence,\n \"based_on_intentionality\": analysis.get(\"classification\", {})\n }\n \n # 根据目标顶点选择写入位置\n target_vertex = regulation.get(\"target\", \"iteration\")\n if target_vertex == \"drive\":\n vertex = \"drive\"\n elif target_vertex == \"math\":\n vertex = \"math\"\n else:\n vertex = \"iteration\"\n \n try:\n suggestion_id = self.advice_pool.add_suggestion(vertex, suggestion_for_pool)\n regulation[\"pool_id\"] = suggestion_id\n regulation[\"written_to_pool\"] = True\n except Exception as e:\n regulation[\"written_to_pool\"] = False\n regulation[\"pool_error\"] = str(e)\n else:\n regulation[\"written_to_pool\"] = False\n \n return regulation\n \n def _generate_suggestions(self, analysis: Dict[str, Any], \n strategy_type: str, strength: str) -> List[str]:\n \"\"\"\n 生成建议文本\n \n Args:\n analysis: 分析结果\n strategy_type: 策略类型\n strength: 强度\n \n Returns:\n 建议列表\n \"\"\"\n priority = analysis.get(\"priority\", {}).get(\"level\", \"medium\")\n urgency = analysis.get(\"urgency\", {}).get(\"level\", \"medium\")\n \n suggestions = []\n \n if strategy_type == \"parameter_tuning\":\n suggestions.append(f\"建议微调系统参数以适应当前意向性\")\n if urgency == \"high\":\n suggestions.append(f\"优先调整响应速度相关参数\")\n else:\n suggestions.append(f\"平衡准确性与响应速度\")\n \n elif strategy_type == \"strategy_adjustment\":\n suggestions.append(f\"建议调整处理策略以匹配当前意向性级别\")\n if priority == \"high\":\n suggestions.append(f\"采用更积极的处理策略\")\n else:\n suggestions.append(f\"采用标准处理策略\")\n \n elif strategy_type == \"priority_reordering\":\n suggestions.append(f\"建议重新排列任务优先级\")\n if strength == \"strong\":\n suggestions.append(f\"立即将相关任务提升到最高优先级\")\n elif strength == \"medium\":\n suggestions.append(f\"将相关任务提升到高优先级队列\")\n else:\n suggestions.append(f\"适当提高相关任务优先级\")\n \n return suggestions\n \n def _generate_parameters(self, analysis: Dict[str, Any], strategy_type: str) -> Dict[str, Any]:\n \"\"\"\n 生成参数建议\n \n Args:\n analysis: 分析结果\n strategy_type: 策略类型\n \n Returns:\n 参数字典\n \"\"\"\n intensity = analysis.get(\"intensity\", {}).get(\"score\", 0.5)\n urgency = analysis.get(\"urgency\", {}).get(\"score\", 0.5)\n \n parameters = {}\n \n if strategy_type == \"parameter_tuning\":\n parameters = {\n \"response_weight\": min(intensity + 0.1, 1.0),\n \"timeout_adjustment\": max(1.0 - urgency * 0.3, 0.5),\n \"resource_allocation\": min(intensity * 1.5, 1.0)\n }\n \n elif strategy_type == \"strategy_adjustment\":\n parameters = {\n \"aggressiveness\": min(urgency * 1.2, 1.0),\n \"complexity_level\": \"high\" if intensity > 0.7 else \"medium\",\n \"fallback_enabled\": True\n }\n \n elif strategy_type == \"priority_reordering\":\n parameters = {\n \"priority_boost\": urgency * 100,\n \"queue_position\": 1 if urgency > 0.7 else 5,\n \"preemptible\": urgency > 0.8\n }\n \n return parameters\n \n def _generate_expected_outcome(self, strategy_type: str, strength: str) -> str:\n \"\"\"\n 生成期望结果描述\n \n Args:\n strategy_type: 策略类型\n strength: 强度\n \n Returns:\n 期望结果描述\n \"\"\"\n descriptions = {\n \"parameter_tuning\": \"优化系统参数,提升响应适切性\",\n \"strategy_adjustment\": \"调整处理策略,匹配当前意向性需求\",\n \"priority_reordering\": \"重新排列任务优先级,确保高优先级意向性得到及时处理\"\n }\n \n return descriptions.get(strategy_type, \"优化系统行为\")\n \n def collect_feedback(self, regulation_id: str, outcome: Dict[str, Any]) -> Dict[str, Any]:\n \"\"\"\n 收集反馈\n \n Args:\n regulation_id: 调节建议ID\n outcome: 执行结果\n \n Returns:\n 反馈记录\n \"\"\"\n feedback = {\n \"regulation_id\": regulation_id,\n \"timestamp\": datetime.now().isoformat(),\n \"outcome\": outcome,\n \"success\": outcome.get(\"success\", False),\n \"effectiveness\": outcome.get(\"effectiveness\", 0.5)\n }\n \n # 保存反馈到记忆存储\n feedback_file = f\"{self.memory_dir}/regulation_feedback.json\"\n \n try:\n with open(feedback_file, 'r', encoding='utf-8') as f:\n feedbacks = json.load(f)\n except (FileNotFoundError, json.JSONDecodeError):\n feedbacks = []\n \n feedbacks.append(feedback)\n \n with open(feedback_file, 'w', encoding='utf-8') as f:\n json.dump(feedbacks, f, ensure_ascii=False, indent=2)\n \n return feedback\n\n\ndef main():\n parser = argparse.ArgumentParser(description=\"意向性调节模块\")\n parser.add_argument(\"--analysis\", required=True,\n help=\"分析结果文件路径(JSON格式)\")\n parser.add_argument(\"--history\",\n help=\"历史数据文件路径(JSON格式,可选)\")\n parser.add_argument(\"--output\", help=\"输出文件路径(JSON格式)\")\n parser.add_argument(\"--collect-feedback\", \n help=\"收集反馈模式:regulation_id\")\n parser.add_argument(\"--feedback-data\",\n help=\"反馈数据(JSON格式)\")\n parser.add_argument(\"--memory-dir\", default=\"./agi_memory\",\n help=\"记忆存储目录\")\n \n args = parser.parse_args()\n \n regulator = IntentionalityRegulator(memory_dir=args.memory_dir)\n \n # 收集反馈模式\n if args.collect_feedback:\n feedback_data = json.loads(args.feedback_data) if args.feedback_data else {}\n feedback = regulator.collect_feedback(args.collect_feedback, feedback_data)\n print(json.dumps(feedback, ensure_ascii=False, indent=2))\n return\n \n # 读取输入数据\n with open(args.analysis, 'r', encoding='utf-8') as f:\n analysis = json.load(f)\n \n history = None\n if args.history:\n with open(args.history, 'r', encoding='utf-8') as f:\n history = json.load(f)\n \n # 生成最优解\n optimal_solution = regulator.generate_optimal_solution(analysis, history)\n \n # 生成软调节建议\n regulation = regulator.generate_soft_regulation(analysis, optimal_solution)\n \n # 输出结果\n output_data = json.dumps(regulation, ensure_ascii=False, indent=2)\n \n if args.output:\n with open(args.output, 'w', encoding='utf-8') as f:\n f.write(output_data)\n else:\n print(output_data)\n\n\nif __name__ == \"__main__\":\n main()\n","content_type":"text/x-python; charset=utf-8","language":"python","size":15414,"content_sha256":"22be108bbbf92f0e03e9944c8ea8bed02e5e477908b738fa79420298c72df190"},{"filename":"scripts/intentionality_trigger.py","content":"#!/usr/bin/env python3\n\"\"\"\n意向性驱动的触发判断模块\n\n功能:\n- 自主判断是否需要生成软调节建议\n- 基于5个触发条件进行判断\n- 支持动态阈值调整\n- 支持人格化触发\n\n设计原则:\n- 自主运行,不依赖主循环触发\n- 基于意向性累积、突变、偏离等触发\n- 支持超然性检查(不破坏独立性)\n- 可配置的触发阈值\n\n触发条件:\n1. 意向性累积阈值突破\n2. 意向性模式突变\n3. 意向性与主循环状态偏离\n4. 时间窗口触发\n5. 人格进化需求\n\"\"\"\n\nimport argparse\nimport json\nimport sys\nfrom datetime import datetime\nfrom typing import Dict, Any, List, Tuple, Optional\nfrom collections import defaultdict\n\n\nclass IntentionalityTrigger:\n \"\"\"意向性驱动的触发判断器\"\"\"\n \n def __init__(self, memory_dir: str = \"./agi_memory\"):\n self.memory_dir = memory_dir\n \n # 触发阈值配置\n self.thresholds = {\n # 条件1:意向性累积阈值\n \"cumulative\": {\n \"perception\": 15,\n \"belief\": 10,\n \"desire\": 8,\n \"rising_intensity_count\": 3\n },\n \n # 条件2:意向性模式突变\n \"pattern_mutation_threshold\": 0.7, # 模式距离阈值\n \"min_history_window\": 5, # 最小历史窗口\n \n # 条件3:意向性与主循环状态偏离\n \"deviation\": 0.6, # 综合偏离阈值\n \n # 条件4:时间窗口触发\n \"periodic_interval\": 10, # 每N次交互\n \"max_idle_time\": 300, # 最大空闲时间(秒)\n \n # 条件5:人格进化需求\n \"adoption_rate_threshold\": 0.8, # 采纳率阈值\n \"maslow_satisfaction_threshold\": 0.9 # 马斯洛需求满足度阈值\n }\n \n # 上次触发时间\n self.last_trigger_time = None\n \n # 交互计数\n self.interaction_count = 0\n \n def check_trigger(self, intentionality: Dict[str, Any],\n history: List[Dict[str, Any]],\n main_loop_state: Dict[str, Any] = None,\n personality: Dict[str, Any] = None) -> Tuple[bool, Dict[str, Any]]:\n \"\"\"\n 检查是否需要触发软调节建议生成\n \n Args:\n intentionality: 当前意向性数据\n history: 意向性历史数据\n main_loop_state: 主循环状态(可选)\n personality: 人格数据(可选)\n \n Returns:\n (是否触发, 触发详情)\n \"\"\"\n trigger_results = []\n \n # 条件1:意向性累积阈值突破\n triggered1, detail1 = self.check_cumulative_threshold(history)\n if triggered1:\n trigger_results.append({\n \"condition\": \"cumulative_threshold\",\n \"priority\": \"high\",\n \"detail\": detail1\n })\n \n # 条件2:意向性模式突变\n triggered2, detail2 = self.check_pattern_mutation(intentionality, history)\n if triggered2:\n trigger_results.append({\n \"condition\": \"pattern_mutation\",\n \"priority\": \"high\",\n \"detail\": detail2\n })\n \n # 条件3:意向性与主循环状态偏离\n if main_loop_state:\n triggered3, detail3 = self.check_deviation_from_main_loop(\n intentionality, main_loop_state\n )\n if triggered3:\n trigger_results.append({\n \"condition\": \"main_loop_deviation\",\n \"priority\": \"medium\",\n \"detail\": detail3\n })\n \n # 条件4:时间窗口触发\n triggered4, detail4 = self.check_time_window_trigger()\n if triggered4:\n trigger_results.append({\n \"condition\": \"time_window\",\n \"priority\": \"low\",\n \"detail\": detail4\n })\n \n # 条件5:人格进化需求\n if personality:\n triggered5, detail5 = self.check_personality_evolution_need(personality)\n if triggered5:\n trigger_results.append({\n \"condition\": \"personality_evolution\",\n \"priority\": \"medium\",\n \"detail\": detail5\n })\n \n # 如果没有任何触发条件满足\n if not trigger_results:\n return False, {\"reason\": \"no_trigger_condition_met\"}\n \n # 基于人格特质调整触发置信度\n confidence = self._calculate_confidence(trigger_results, personality)\n \n # 超然性检查:确保触发不破坏独立性\n passed_transcendence = self._check_transcendence(trigger_results)\n \n if not passed_transcendence:\n return False, {\n \"reason\": \"transcendence_check_failed\",\n \"trigger_results\": trigger_results\n }\n \n # 更新触发时间\n self.last_trigger_time = datetime.now()\n \n return True, {\n \"trigger_time\": self.last_trigger_time.isoformat(),\n \"trigger_count\": len(trigger_results),\n \"triggers\": trigger_results,\n \"confidence\": confidence,\n \"passed_transcendence\": passed_transcendence\n }\n \n def check_cumulative_threshold(self, history: List[Dict[str, Any]]) -> Tuple[bool, Dict[str, Any]]:\n \"\"\"\n 检测意向性累积阈值\n \n Args:\n history: 意向性历史数据\n \n Returns:\n (是否触发, 详情)\n \"\"\"\n if len(history) \u003c 3:\n return False, {\"reason\": \"insufficient_history\"}\n \n # 1. 按类型统计\n type_counts = defaultdict(int)\n for item in history:\n classification = item.get(\"classification\", {})\n content = classification.get(\"content\", \"unknown\")\n type_counts[content] += 1\n \n # 2. 检测阈值突破\n triggered = False\n triggered_types = []\n \n for type_name, count in type_counts.items():\n threshold = self.thresholds[\"cumulative\"].get(type_name, 10)\n if count >= threshold:\n triggered = True\n triggered_types.append(type_name)\n \n # 3. 检测强度趋势\n intensity_trend = self._analyze_intensity_trend(history[-5:])\n if intensity_trend == \"rising\" and len(history) >= 3:\n triggered = True\n \n return triggered, {\n \"type_counts\": dict(type_counts),\n \"triggered_types\": triggered_types,\n \"intensity_trend\": intensity_trend\n }\n \n def check_pattern_mutation(self, current_intentionality: Dict[str, Any],\n history_window: List[Dict[str, Any]]) -> Tuple[bool, Dict[str, Any]]:\n \"\"\"\n 检测意向性模式突变\n \n Args:\n current_intentionality: 当前意向性\n history_window: 历史窗口数据\n \n Returns:\n (是否触发, 详情)\n \"\"\"\n if len(history_window) \u003c self.thresholds[\"min_history_window\"]:\n return False, {\"reason\": \"insufficient_history_window\"}\n \n # 1. 获取历史模式\n historical_pattern = self._extract_pattern(history_window)\n \n # 2. 获取当前模式\n current_pattern = self._extract_pattern([current_intentionality])\n \n # 3. 计算模式距离\n pattern_distance = self._calculate_pattern_distance(\n historical_pattern,\n current_pattern\n )\n \n # 4. 判断是否突变\n triggered = pattern_distance > self.thresholds[\"pattern_mutation_threshold\"]\n \n return triggered, {\n \"historical_pattern\": historical_pattern,\n \"current_pattern\": current_pattern,\n \"pattern_distance\": pattern_distance\n }\n \n def check_deviation_from_main_loop(self, intentionality: Dict[str, Any],\n main_loop_state: Dict[str, Any]) -> Tuple[bool, Dict[str, Any]]:\n \"\"\"\n 检测意向性与主循环状态的偏离\n \n Args:\n intentionality: 意向性数据\n main_loop_state: 主循环状态\n \n Returns:\n (是否触发, 详情)\n \"\"\"\n # 1. 提取用户意向性期望\n user_expectation = self._extract_user_expectation(intentionality)\n \n # 2. 提取主循环实际响应\n actual_response = self._extract_main_loop_response(main_loop_state)\n \n # 3. 计算偏离度\n deviation_metrics = {\n \"intensity_match\": self._compare_intensity(\n user_expectation.get(\"intensity\", 0.5),\n actual_response.get(\"intensity\", 0.5)\n ),\n \"type_match\": self._compare_type(\n user_expectation.get(\"type\", \"unknown\"),\n actual_response.get(\"type\", \"unknown\")\n ),\n \"direction_match\": self._compare_direction(\n user_expectation.get(\"direction\", \"unknown\"),\n actual_response.get(\"direction\", \"unknown\")\n )\n }\n \n # 4. 判断是否偏离\n overall_deviation = sum(deviation_metrics.values()) / len(deviation_metrics)\n triggered = overall_deviation > self.thresholds[\"deviation\"]\n \n return triggered, {\n \"deviation_metrics\": deviation_metrics,\n \"overall_deviation\": overall_deviation\n }\n \n def check_time_window_trigger(self) -> Tuple[bool, Dict[str, Any]]:\n \"\"\"\n 检测时间窗口触发条件\n \n Returns:\n (是否触发, 详情)\n \"\"\"\n triggered = False\n trigger_reason = None\n \n # 1. 定期触发\n self.interaction_count += 1\n if self.interaction_count % self.thresholds[\"periodic_interval\"] == 0:\n triggered = True\n trigger_reason = f\"periodic_trigger_every_{self.thresholds['periodic_interval']}_interactions\"\n \n # 2. 时间点触发(空闲超时)\n if self.last_trigger_time:\n time_since_last_trigger = (datetime.now() - self.last_trigger_time).total_seconds()\n if time_since_last_trigger > self.thresholds[\"max_idle_time\"]:\n triggered = True\n trigger_reason = f\"idle_timeout_{int(time_since_last_trigger)}_seconds\"\n \n return triggered, {\"reason\": trigger_reason}\n \n def check_personality_evolution_need(self, personality: Dict[str, Any]) -> Tuple[bool, Dict[str, Any]]:\n \"\"\"\n 检测人格进化需求\n \n Args:\n personality: 人格数据\n \n Returns:\n (是否触发, 详情)\n \"\"\"\n # 简化实现:基于人格特质判断\n # 实际应该基于采纳历史数据\n \n triggered = False\n adjustment_dimensions = []\n \n # 检测谨慎性(如果谨慎性过高,可能需要降低)\n conscientiousness = personality.get(\"conscientiousness\", 0.5)\n if conscientiousness > 0.8:\n triggered = True\n adjustment_dimensions.append(\"conscientiousness\")\n \n # 检测马斯洛需求层次\n maslow_weights = personality.get(\"maslow_weights\", {})\n if maslow_weights:\n # 如果当前层需求满足度高,可能需要提升层次\n satisfaction = 0.95 # 简化实现\n if satisfaction > self.thresholds[\"maslow_satisfaction_threshold\"]:\n triggered = True\n \n return triggered, {\n \"adjustment_dimensions\": adjustment_dimensions,\n \"maslow_promotion_needed\": True\n }\n \n def _calculate_confidence(self, trigger_results: List[Dict[str, Any]],\n personality: Dict[str, Any] = None) -> float:\n \"\"\"\n 计算触发置信度\n \n Args:\n trigger_results: 触发结果列表\n personality: 人格数据\n \n Returns:\n 置信度(0.0-1.0)\n \"\"\"\n if not trigger_results:\n return 0.0\n \n # 基于触发条件的优先级计算基础置信度\n priority_weights = {\n \"high\": 0.9,\n \"medium\": 0.6,\n \"low\": 0.3\n }\n \n base_confidence = sum(\n priority_weights.get(result.get(\"priority\", \"medium\"), 0.5)\n for result in trigger_results\n ) / len(trigger_results)\n \n # 基于人格特质调整\n if personality:\n # 谨慎性越高,置信度要求越高\n conscientiousness = personality.get(\"conscientiousness\", 0.5)\n confidence = base_confidence * (1 - conscientiousness * 0.3)\n else:\n confidence = base_confidence\n \n return min(max(confidence, 0.0), 1.0)\n \n def _check_transcendence(self, trigger_results: List[Dict[str, Any]]) -> bool:\n \"\"\"\n 超然性检查:确保触发不破坏独立性\n \n Args:\n trigger_results: 触发结果列表\n \n Returns:\n 是否通过超然性检查\n \"\"\"\n # 简化实现:检查是否有\"强制执行\"类型的触发\n for result in trigger_results:\n condition = result.get(\"condition\", \"\")\n if \"force\" in condition or \"mandatory\" in condition:\n return False\n \n return True\n \n def _analyze_intensity_trend(self, recent_history: List[Dict[str, Any]]) -> str:\n \"\"\"\n 分析强度趋势\n \n Args:\n recent_history: 最近的历史数据\n \n Returns:\n 趋势:rising/falling/stable\n \"\"\"\n if len(recent_history) \u003c 2:\n return \"stable\"\n \n intensities = []\n for item in recent_history:\n analysis = item.get(\"analysis\", {})\n intensity = analysis.get(\"intensity\", {}).get(\"score\", 0.5)\n intensities.append(intensity)\n \n # 简化的趋势判断\n if len(intensities) >= 2:\n if all(intensities[i] \u003c intensities[i+1] for i in range(len(intensities)-1)):\n return \"rising\"\n elif all(intensities[i] > intensities[i+1] for i in range(len(intensities)-1)):\n return \"falling\"\n \n return \"stable\"\n \n def _extract_pattern(self, data: List[Dict[str, Any]]) -> Dict[str, Any]:\n \"\"\"\n 提取意向性模式\n \n Args:\n data: 意向性数据列表\n \n Returns:\n 模式字典\n \"\"\"\n if not data:\n return {}\n \n # 统计各维度的分布\n agent_dist = defaultdict(int)\n direction_dist = defaultdict(int)\n content_dist = defaultdict(int)\n \n for item in data:\n classification = item.get(\"classification\", {})\n \n agent = classification.get(\"agent\", \"unknown\")\n direction = classification.get(\"direction\", \"unknown\")\n content = classification.get(\"content\", \"unknown\")\n \n agent_dist[agent] += 1\n direction_dist[direction] += 1\n content_dist[content] += 1\n \n total = len(data)\n \n return {\n \"agent_distribution\": {\n k: v/total for k, v in agent_dist.items()\n },\n \"direction_distribution\": {\n k: v/total for k, v in direction_dist.items()\n },\n \"content_distribution\": {\n k: v/total for k, v in content_dist.items()\n }\n }\n \n def _calculate_pattern_distance(self, pattern1: Dict[str, Any],\n pattern2: Dict[str, Any]) -> float:\n \"\"\"\n 计算模式距离\n \n Args:\n pattern1: 模式1\n pattern2: 模式2\n \n Returns:\n 模式距离(0.0-1.0)\n \"\"\"\n if not pattern1 or not pattern2:\n return 0.0\n \n total_distance = 0.0\n dimension_count = 0\n \n for dimension in [\"agent_distribution\", \"direction_distribution\", \"content_distribution\"]:\n dist1 = pattern1.get(dimension, {})\n dist2 = pattern2.get(dimension, {})\n \n # 计算该维度的距离\n all_keys = set(dist1.keys()) | set(dist2.keys())\n dim_distance = 0.0\n \n for key in all_keys:\n value1 = dist1.get(key, 0.0)\n value2 = dist2.get(key, 0.0)\n dim_distance += abs(value1 - value2)\n \n dim_distance /= max(len(all_keys), 1)\n total_distance += dim_distance\n dimension_count += 1\n \n return total_distance / max(dimension_count, 1)\n \n def _extract_user_expectation(self, intentionality: Dict[str, Any]) -> Dict[str, Any]:\n \"\"\"提取用户意向性期望\"\"\"\n analysis = intentionality.get(\"analysis\", {})\n return {\n \"intensity\": analysis.get(\"intensity\", {}).get(\"score\", 0.5),\n \"type\": intentionality.get(\"classification\", {}).get(\"content\", \"unknown\"),\n \"direction\": intentionality.get(\"classification\", {}).get(\"direction\", \"unknown\")\n }\n \n def _extract_main_loop_response(self, main_loop_state: Dict[str, Any]) -> Dict[str, Any]:\n \"\"\"提取主循环实际响应\"\"\"\n return {\n \"intensity\": main_loop_state.get(\"intensity\", 0.5),\n \"type\": main_loop_state.get(\"type\", \"unknown\"),\n \"direction\": main_loop_state.get(\"direction\", \"unknown\")\n }\n \n def _compare_intensity(self, intensity1: float, intensity2: float) -> float:\n \"\"\"比较强度\"\"\"\n return 1.0 - abs(intensity1 - intensity2)\n \n def _compare_type(self, type1: str, type2: str) -> float:\n \"\"\"比较类型\"\"\"\n return 1.0 if type1 == type2 else 0.0\n \n def _compare_direction(self, direction1: str, direction2: str) -> float:\n \"\"\"比较方向\"\"\"\n return 1.0 if direction1 == direction2 else 0.0\n\n\ndef main():\n parser = argparse.ArgumentParser(description=\"意向性驱动的触发判断模块\")\n parser.add_argument(\"--memory-dir\", default=\"./agi_memory\", help=\"记忆目录\")\n parser.add_argument(\"--intentionality\", help=\"当前意向性数据(JSON)\")\n parser.add_argument(\"--history\", help=\"意向性历史数据(JSON文件)\")\n parser.add_argument(\"--main-loop-state\", help=\"主循环状态(JSON)\")\n parser.add_argument(\"--personality\", help=\"人格数据(JSON文件)\")\n parser.add_argument(\"--output\", help=\"输出文件\")\n \n args = parser.parse_args()\n \n # 创建触发器\n trigger = IntentionalityTrigger(memory_dir=args.memory_dir)\n \n # 加载数据\n intentionality = json.loads(args.intentionality) if args.intentionality else {}\n \n history = []\n if args.history:\n with open(args.history, 'r', encoding='utf-8') as f:\n history = json.load(f)\n \n main_loop_state = json.loads(args.main_loop_state) if args.main_loop_state else None\n \n personality = None\n if args.personality:\n with open(args.personality, 'r', encoding='utf-8') as f:\n personality = json.load(f)\n \n # 检查触发\n triggered, detail = trigger.check_trigger(\n intentionality,\n history,\n main_loop_state,\n personality\n )\n \n # 输出结果\n result = {\n \"triggered\": triggered,\n \"detail\": detail,\n \"timestamp\": datetime.now().isoformat()\n }\n \n if args.output:\n with open(args.output, 'w', encoding='utf-8') as f:\n json.dump(result, f, ensure_ascii=False, indent=2)\n else:\n print(json.dumps(result, ensure_ascii=False, indent=2))\n \n sys.exit(0 if not triggered else 1)\n\n\nif __name__ == \"__main__\":\n main()\n","content_type":"text/x-python; charset=utf-8","language":"python","size":20427,"content_sha256":"952dc61c67f02d454d2e9dfe03c4991b432294e7ac9acbb0b23c7898779bbec4"},{"filename":"scripts/learning_stage_tracker.py","content":"#!/usr/bin/env python3\n\"\"\"\n学习阶段追踪器\n\n追踪智能体在不同场景下的学习阶段,支持学习阶段调整。\n\n学习阶段划分:\n- 学习初期(\u003c 50次交互)\n- 成长期(50-200次)\n- 精通期(200-500次)\n- 专家期(> 500次)\n\n特点:\n- 基于成功率和交互次数判断学习阶段\n- 支持多场景独立追踪\n- 提供学习阶段更新接口\n\"\"\"\n\nimport os\nimport json\nfrom datetime import datetime\nfrom typing import Dict, Optional\nfrom dataclasses import dataclass, asdict\n\n\n@dataclass\nclass LearningStage:\n \"\"\"学习阶段\"\"\"\n stage: str # 学习阶段\n total_interactions: int\n success_count: int\n success_rate: float\n last_updated: str\n\n def to_dict(self) -> dict:\n return asdict(self)\n\n\nclass LearningStageTracker:\n \"\"\"\n 学习阶段追踪器\n \n 追踪智能体在不同场景下的学习阶段。\n \"\"\"\n\n def __init__(self, base_dir: str = \"./agi_memory\"):\n self.base_dir = base_dir\n self.learning_stage_file = os.path.join(base_dir, \"learning_stages.json\")\n \n # 学习阶段数据\n self._learning_stages: Dict[str, LearningStage] = {}\n \n # 加载现有数据\n self._load()\n\n def get_learning_stage(self, context_type: str) -> LearningStage:\n \"\"\"\n 获取指定场景的学习阶段\n \n Args:\n context_type: 场景类型\n \n Returns:\n 学习阶段\n \"\"\"\n if context_type not in self._learning_stages:\n # 初始化学习阶段\n self._learning_stages[context_type] = LearningStage(\n stage=\"learning_early\",\n total_interactions=0,\n success_count=0,\n success_rate=0.0,\n last_updated=datetime.now().isoformat()\n )\n \n return self._learning_stages[context_type]\n\n def update_learning_stage(\n self,\n context_type: str,\n success: bool,\n time_cost: float = 0.0\n ):\n \"\"\"\n 更新学习阶段\n \n Args:\n context_type: 场景类型\n success: 是否成功\n time_cost: 耗时(秒)\n \"\"\"\n # 获取当前学习阶段\n current_stage = self.get_learning_stage(context_type)\n \n # 更新交互次数\n current_stage.total_interactions += 1\n \n # 更新成功次数\n if success:\n current_stage.success_count += 1\n \n # 计算成功率\n current_stage.success_rate = (\n current_stage.success_count / current_stage.total_interactions\n )\n \n # 判断学习阶段\n total_interactions = current_stage.total_interactions\n success_rate = current_stage.success_rate\n \n if total_interactions \u003c 50:\n new_stage = \"learning_early\"\n elif total_interactions \u003c 200:\n new_stage = \"growth\"\n elif total_interactions \u003c 500:\n new_stage = \"mastery\"\n else:\n new_stage = \"expert\"\n \n current_stage.stage = new_stage\n current_stage.last_updated = datetime.now().isoformat()\n \n # 保存\n self._save()\n\n def _determine_stage(\n self,\n total_interactions: int,\n success_rate: float\n ) -> str:\n \"\"\"\n 判断学习阶段\n \n Args:\n total_interactions: 总交互次数\n success_rate: 成功率\n \n Returns:\n 学习阶段\n \"\"\"\n if total_interactions \u003c 50:\n return \"learning_early\"\n elif total_interactions \u003c 200:\n return \"growth\"\n elif total_interactions \u003c 500:\n return \"mastery\"\n else:\n return \"expert\"\n\n def get_stage_adjustment_coefficient(\n self,\n context_type: str\n ) -> float:\n \"\"\"\n 获取学习阶段调整系数\n \n Args:\n context_type: 场景类型\n \n Returns:\n 调整系数(0.9 - 1.1)\n \"\"\"\n stage = self.get_learning_stage(context_type)\n \n # 基于学习阶段返回调整系数\n stage_coefficients = {\n \"learning_early\": 0.95, # 学习初期:更谨慎\n \"growth\": 0.98, # 成长期:适度谨慎\n \"mastery\": 1.0, # 精通期:基准\n \"expert\": 1.05 # 专家期:适度宽松\n }\n \n return stage_coefficients.get(stage.stage, 1.0)\n\n def get_all_stages(self) -> Dict[str, LearningStage]:\n \"\"\"\n 获取所有场景的学习阶段\n \n Returns:\n 所有学习阶段\n \"\"\"\n return self._learning_stages.copy()\n\n def _load(self):\n \"\"\"加载数据\"\"\"\n if os.path.exists(self.learning_stage_file):\n try:\n with open(self.learning_stage_file, 'r', encoding='utf-8') as f:\n data = json.load(f)\n \n for context_type, stage_data in data.items():\n self._learning_stages[context_type] = LearningStage(**stage_data)\n except Exception as e:\n print(f\"⚠️ 加载学习阶段数据失败: {e}\")\n\n def _save(self):\n \"\"\"保存数据\"\"\"\n try:\n os.makedirs(os.path.dirname(self.learning_stage_file), exist_ok=True)\n \n data = {\n context_type: stage.to_dict()\n for context_type, stage in self._learning_stages.items()\n }\n \n with open(self.learning_stage_file, 'w', encoding='utf-8') as f:\n json.dump(data, f, ensure_ascii=False, indent=2)\n except Exception as e:\n print(f\"⚠️ 保存学习阶段数据失败: {e}\")\n\n def reset(self, context_type: Optional[str] = None):\n \"\"\"\n 重置学习阶段\n \n Args:\n context_type: 场景类型(None表示重置所有)\n \"\"\"\n if context_type:\n if context_type in self._learning_stages:\n del self._learning_stages[context_type]\n else:\n self._learning_stages.clear()\n \n self._save()\n\n\n# 测试代码\nif __name__ == '__main__':\n print(\"=== 学习阶段追踪器(测试模式) ===\\n\")\n \n tracker = LearningStageTracker(\"./test_learning_stages\")\n \n # 测试1:更新学习阶段\n print(\"测试1:更新学习阶段\")\n for i in range(10):\n tracker.update_learning_stage('scientific', success=(i % 3 != 0))\n \n stage = tracker.get_learning_stage('scientific')\n print(f\" 学习阶段: {stage.stage}\")\n print(f\" 总交互次数: {stage.total_interactions}\")\n print(f\" 成功次数: {stage.success_count}\")\n print(f\" 成功率: {stage.success_rate:.2f}\")\n print(f\" 调整系数: {tracker.get_stage_adjustment_coefficient('scientific'):.3f}\")\n print()\n \n # 测试2:多场景追踪\n print(\"测试2:多场景追踪\")\n contexts = ['scientific', 'creative', 'technical', 'general']\n for context in contexts:\n tracker.update_learning_stage(context, success=True)\n \n all_stages = tracker.get_all_stages()\n for context, stage in all_stages.items():\n print(f\" {context}:\")\n print(f\" 阶段: {stage.stage}\")\n print(f\" 交互次数: {stage.total_interactions}\")\n print(f\" 成功率: {stage.success_rate:.2f}\")\n print()\n \n # 测试3:学习阶段判断\n print(\"测试3:学习阶段判断\")\n test_cases = [\n (30, 0.7, \"learning_early\"),\n (100, 0.8, \"growth\"),\n (300, 0.85, \"mastery\"),\n (600, 0.9, \"expert\")\n ]\n \n for interactions, success_rate, expected_stage in test_cases:\n actual_stage = tracker._determine_stage(interactions, success_rate)\n print(f\" 交互次数={interactions}, 成功率={success_rate:.2f} → {actual_stage} (期望: {expected_stage})\")\n print()\n \n print(\"=== 测试完成 ===\")\n","content_type":"text/x-python; charset=utf-8","language":"python","size":8133,"content_sha256":"ade8c8f01f700133ceeaf42112f148558d5132e6a157d01585ffd319c490868c"},{"filename":"scripts/memory_store_pure.py","content":"#!/usr/bin/env python3\n\"\"\"\n记忆存储纯Python实现\n\n不依赖任何编译的.so文件,使用纯Python实现所有记忆存储功能。\n包括:记录存储、检索、分析、反馈、模式识别等。\n\"\"\"\n\nimport json\nimport os\nimport time\nfrom typing import Dict, Optional, List\nfrom dataclasses import dataclass, asdict\nfrom datetime import datetime\n\n\n@dataclass\nclass Record:\n \"\"\"交互记录\"\"\"\n timestamp: str\n user_query: str\n intent_type: str\n reasoning_quality: float = 8.0\n solution_effectiveness: float = 8.0\n innovation_score: float = 7.0\n new_insights: List[str] = None\n feedback: Dict[str, str] = None\n overall_rating: str = \"good\"\n response: str = \"\" # 新增:生成的响应\n objectivity_metric: Dict = None # 新增:客观性标注\n self_correction: Dict = None # 新增:自我纠错记录\n\n def __post_init__(self):\n if self.new_insights is None:\n self.new_insights = []\n if self.feedback is None:\n self.feedback = {\n \"drive\": \"\",\n \"math\": \"\",\n \"iteration\": \"\"\n }\n if self.objectivity_metric is None:\n self.objectivity_metric = {}\n if self.self_correction is None:\n self.self_correction = {}\n\n def to_dict(self) -> dict:\n return asdict(self)\n\n def get_value_weight(self) -> float:\n \"\"\"计算价值权重\"\"\"\n return (\n self.reasoning_quality * 0.4 +\n self.solution_effectiveness * 0.3 +\n self.innovation_score * 0.3\n ) / 10.0\n\n\n@dataclass\nclass AnalysisResult:\n \"\"\"分析结果\"\"\"\n total_records: int\n rating_distribution: Dict[str, int]\n intent_type_distribution: Dict[str, int]\n average_scores: Dict[str, float]\n recent_insights: List[str]\n\n def to_dict(self) -> dict:\n return asdict(self)\n\n\nclass MemoryStore:\n \"\"\"记忆存储管理器(纯Python实现)\"\"\"\n\n def __init__(self, memory_dir: str = \"./agi_memory\"):\n \"\"\"\n 初始化记忆存储\n\n Args:\n memory_dir: 记忆存储目录\n \"\"\"\n self.memory_dir = memory_dir\n self.records_file = os.path.join(memory_dir, \"records.json\")\n self.narrative_file = os.path.join(memory_dir, \"narrative.md\")\n self._records: List[Record] = []\n self._load_records()\n\n def _load_records(self):\n \"\"\"加载记录\"\"\"\n if not os.path.exists(self.records_file):\n self._records = []\n return\n\n with open(self.records_file, 'r', encoding='utf-8') as f:\n data = json.load(f)\n\n self._records = [Record(**item) for item in data]\n\n def _save_records(self):\n \"\"\"保存记录\"\"\"\n os.makedirs(self.memory_dir, exist_ok=True)\n\n with open(self.records_file, 'w', encoding='utf-8') as f:\n json.dump([r.to_dict() for r in self._records], f, ensure_ascii=False, indent=2)\n\n def store(self, data: dict) -> bool:\n \"\"\"\n 存储记录\n\n Args:\n data: 记录数据\n\n Returns:\n bool: 是否成功\n \"\"\"\n try:\n record = Record(\n timestamp=data.get(\"timestamp\", time.strftime(\"%Y-%m-%dT%H:%M:%SZ\")),\n user_query=data.get(\"user_query\", \"\"),\n intent_type=data.get(\"intent_type\", \"\"),\n reasoning_quality=data.get(\"reasoning_quality\", 8.0),\n solution_effectiveness=data.get(\"solution_effectiveness\", 8.0),\n innovation_score=data.get(\"innovation_score\", 7.0),\n new_insights=data.get(\"new_insights\", []),\n feedback=data.get(\"feedback\", {}),\n overall_rating=data.get(\"overall_rating\", \"good\")\n )\n\n self._records.append(record)\n self._save_records()\n\n return True\n except Exception as e:\n print(f\"存储记录失败: {e}\")\n return False\n\n def retrieve(self, query_type: str, limit: int = 5) -> List[Dict]:\n \"\"\"\n 检索记录\n\n Args:\n query_type: 查询类型\n limit: 返回数量限制\n\n Returns:\n List[Dict]: 匹配的记录\n \"\"\"\n # 简单的匹配逻辑\n matched = []\n\n for record in reversed(self._records):\n if query_type.lower() in record.intent_type.lower():\n matched.append(record.to_dict())\n if len(matched) >= limit:\n break\n\n return matched\n\n def analyze(self) -> AnalysisResult:\n \"\"\"\n 分析记录\n\n Returns:\n AnalysisResult: 分析结果\n \"\"\"\n if not self._records:\n return AnalysisResult(\n total_records=0,\n rating_distribution={},\n intent_type_distribution={},\n average_scores={},\n recent_insights=[]\n )\n\n total = len(self._records)\n\n # 评分分布\n rating_dist = {}\n for record in self._records:\n rating = record.overall_rating\n rating_dist[rating] = rating_dist.get(rating, 0) + 1\n\n # 意图类型分布\n intent_dist = {}\n for record in self._records:\n intent = record.intent_type\n intent_dist[intent] = intent_dist.get(intent, 0) + 1\n\n # 平均分\n avg_reasoning = sum(r.reasoning_quality for r in self._records) / total\n avg_effectiveness = sum(r.solution_effectiveness for r in self._records) / total\n avg_innovation = sum(r.innovation_score for r in self._records) / total\n\n # 最近洞察\n recent_insights = []\n for record in reversed(self._records[-10:]):\n recent_insights.extend(record.new_insights)\n\n return AnalysisResult(\n total_records=total,\n rating_distribution=rating_dist,\n intent_type_distribution=intent_dist,\n average_scores={\n \"reasoning_quality\": round(avg_reasoning, 2),\n \"solution_effectiveness\": round(avg_effectiveness, 2),\n \"innovation_score\": round(avg_innovation, 2)\n },\n recent_insights=recent_insights[-20:]\n )\n\n def feedback(self, vertex: str) -> Dict[str, str]:\n \"\"\"\n 生成反馈建议\n\n Args:\n vertex: 顶点名称(drive/math/iteration)\n\n Returns:\n Dict: 反馈建议\n \"\"\"\n analysis = self.analyze()\n\n # 根据分析结果生成反馈\n feedback_map = {\n \"drive\": {\n \"suggestion\": \"需求识别准确\",\n \"optimization\": \"继续优化优先级排序\"\n },\n \"math\": {\n \"suggestion\": \"推理方法有效\",\n \"optimization\": \"可增强逻辑一致性检查\"\n },\n \"iteration\": {\n \"suggestion\": \"进化路径平稳\",\n \"optimization\": \"尝试更多创新策略\"\n }\n }\n\n if analysis.total_records == 0:\n return {\n \"vertex\": vertex,\n \"suggestion\": \"暂无数据\",\n \"optimization\": \"需要更多交互记录\"\n }\n\n base_feedback = feedback_map.get(vertex, {})\n\n # 根据评分调整\n avg_effectiveness = analysis.average_scores.get(\"solution_effectiveness\", 8.0)\n\n if avg_effectiveness > 8.5:\n base_feedback[\"optimization\"] = \"当前策略优秀,继续保持\"\n\n return base_feedback\n\n def patterns(self) -> List[Dict]:\n \"\"\"\n 识别模式\n\n Returns:\n List[Dict]: 识别到的模式\n \"\"\"\n if len(self._records) \u003c 5:\n return []\n\n patterns = []\n\n # 识别高频意图类型\n analysis = self.analyze()\n intent_dist = analysis.intent_type_distribution\n\n if intent_dist:\n most_common = max(intent_dist, key=intent_dist.get)\n if intent_dist[most_common] >= 3:\n patterns.append({\n \"type\": \"frequent_intent\",\n \"pattern\": most_common,\n \"frequency\": intent_dist[most_common]\n })\n\n # 识别高分模式\n high_quality = [r for r in self._records if r.get_value_weight() > 0.8]\n if len(high_quality) >= 3:\n patterns.append({\n \"type\": \"high_quality_pattern\",\n \"count\": len(high_quality),\n \"avg_score\": sum(r.get_value_weight() for r in high_quality) / len(high_quality)\n })\n\n return patterns\n\n def compress(self, threshold: float = 0.5):\n \"\"\"\n 压缩低价值记录\n\n Args:\n threshold: 价值权重阈值\n \"\"\"\n if len(self._records) \u003c 10:\n return\n\n # 分离高低价值记录\n high_value = [r for r in self._records if r.get_value_weight() >= threshold]\n low_value = [r for r in self._records if r.get_value_weight() \u003c threshold]\n\n # 保留所有高价值记录\n # 低价值记录保留摘要\n if low_value:\n summary_record = Record(\n timestamp=time.strftime(\"%Y-%m-%dT%H:%M:%SZ\"),\n user_query=f\"[摘要] {len(low_value)}条低价值记录\",\n intent_type=\"summary\",\n reasoning_quality=sum(r.reasoning_quality for r in low_value) / len(low_value),\n solution_effectiveness=sum(r.solution_effectiveness for r in low_value) / len(low_value),\n innovation_score=sum(r.innovation_score for r in low_value) / len(low_value),\n new_insights=[],\n feedback={},\n overall_rating=\"neutral\"\n )\n high_value.append(summary_record)\n\n self._records = high_value\n self._save_records()\n\n def get_stats(self) -> Dict:\n \"\"\"\n 获取统计信息\n\n Returns:\n Dict: 统计信息\n \"\"\"\n analysis = self.analyze()\n\n return {\n \"total_records\": analysis.total_records,\n \"rating_distribution\": analysis.rating_distribution,\n \"intent_type_distribution\": analysis.intent_type_distribution,\n \"average_scores\": analysis.average_scores,\n \"recent_insights_count\": len(analysis.recent_insights),\n \"patterns_count\": len(self.patterns())\n }\n\n\n# ===== 命令行接口 =====\n\ndef main():\n \"\"\"命令行测试接口\"\"\"\n print(\"=== 记忆存储纯Python实现(测试模式) ===\\n\")\n\n memory = MemoryStore()\n\n # 测试存储\n print(\"测试1:存储记录\")\n memory.store({\n \"timestamp\": time.strftime(\"%Y-%m-%dT%H:%M:%SZ\"),\n \"user_query\": \"架构升级需要谨慎\",\n \"intent_type\": \"架构决策\",\n \"reasoning_quality\": 9.0,\n \"solution_effectiveness\": 9.0,\n \"innovation_score\": 7.0,\n \"new_insights\": [\"架构升级是相变事件\", \"谨慎是美德\"],\n \"feedback\": {\n \"drive\": \"强化需求验证\",\n \"math\": \"优化推理规则\",\n \"iteration\": \"渐进演化优于激进突变\"\n },\n \"overall_rating\": \"good\"\n })\n print(\"✓ 记录已存储\\n\")\n\n # 测试检索\n print(\"测试2:检索记录\")\n results = memory.retrieve(\"架构决策\", limit=5)\n print(f\"✓ 找到 {len(results)} 条记录\\n\")\n\n # 测试分析\n print(\"测试3:分析记录\")\n analysis = memory.analyze()\n print(f\"✓ 总记录数: {analysis.total_records}\")\n print(f\"✓ 平均推理质量: {analysis.average_scores.get('reasoning_quality', 0)}\")\n print(f\"✓ 最近洞察数: {len(analysis.recent_insights)}\\n\")\n\n # 测试反馈\n print(\"测试4:生成反馈\")\n feedback = memory.feedback(\"math\")\n print(f\"✓ 反馈: {feedback}\\n\")\n\n # 测试模式识别\n print(\"测试5:识别模式\")\n patterns = memory.patterns()\n print(f\"✓ 识别到 {len(patterns)} 个模式\\n\")\n\n # 测试统计\n print(\"测试6:获取统计\")\n stats = memory.get_stats()\n print(f\"✓ 统计信息: {stats}\\n\")\n\n print(\"=== 所有测试完成 ===\")\n\n\nif __name__ == \"__main__\":\n main()\n","content_type":"text/x-python; charset=utf-8","language":"python","size":12338,"content_sha256":"f4d781c15c20550c64b90c5381fdc0d5b0f5fceb049545adebf604ddf9ef3972"},{"filename":"scripts/metacognition_history.py","content":"#!/usr/bin/env python3\n\"\"\"\n元认知历史管理器(分层存储架构)\n\n提供分层存储功能:\n- 热数据层(0-1个月):JSON格式,快速访问\n- 温数据层(1-3个月):GZIP压缩,节省空间\n- 冷数据层(3-12个月):聚合统计,长期保存\n- 归档层(>12个月):归档存储或删除\n\n特点:\n- 自动数据转换(热→温→冷→归档)\n- 统一查询接口\n- 性能优化(索引、缓存)\n\"\"\"\n\nimport os\nimport gzip\nimport json\nimport shutil\nfrom datetime import datetime, timedelta\nfrom typing import Dict, List, Optional\nfrom dataclasses import dataclass, asdict\nfrom enum import Enum\n\n\nclass StorageLayer(Enum):\n \"\"\"存储层级\"\"\"\n HOT = \"hot\" # 热数据层(0-1个月)\n WARM = \"warm\" # 温数据层(1-3个月)\n COLD = \"cold\" # 冷数据层(3-12个月)\n ARCHIVE = \"archive\" # 归档层(>12个月)\n\n\n@dataclass\nclass MetacognitionRecordLite:\n \"\"\"元认知记录(简化版)\"\"\"\n timestamp: str\n context_type: str\n objectivity_score: float\n strategy: str\n success: bool\n learning_stage: str\n\n def to_dict(self) -> dict:\n return asdict(self)\n\n\n@dataclass\nclass DailyStatistics:\n \"\"\"日统计(冷数据层)\"\"\"\n date: str\n count: int\n avg_objectivity: float\n min_objectivity: float\n max_objectivity: float\n success_rate: float\n strategy_distribution: dict\n context_distribution: dict\n learning_stage: str\n\n def to_dict(self) -> dict:\n return asdict(self)\n\n\nclass MetacognitionHistoryManager:\n \"\"\"\n 元认知历史管理器\n \n 提供分层存储和统一查询接口。\n \"\"\"\n\n def __init__(self, base_dir: str = \"./agi_memory\"):\n self.base_dir = base_dir\n self.metacognition_dir = os.path.join(base_dir, \"metacognition_history\")\n \n # 创建各层目录\n for layer in StorageLayer:\n layer_dir = os.path.join(self.metacognition_dir, layer.value)\n os.makedirs(layer_dir, exist_ok=True)\n \n # 缓存(热数据层)\n self._cache = {}\n self._cache_max_size = 1000\n\n def add_record(self, record: MetacognitionRecordLite):\n \"\"\"\n 添加元认知记录\n \n Args:\n record: 元认知记录\n \"\"\"\n # 获取当前日期\n date_str = datetime.now().strftime(\"%Y-%m-%d\")\n filename = f\"records_{date_str}.json\"\n filepath = os.path.join(self.metacognition_dir, StorageLayer.HOT.value, filename)\n \n # 读取现有记录\n records = []\n if os.path.exists(filepath):\n with open(filepath, 'r', encoding='utf-8') as f:\n records = json.load(f)\n \n # 添加新记录\n records.append(record.to_dict())\n \n # 写入文件\n with open(filepath, 'w', encoding='utf-8') as f:\n json.dump(records, f, ensure_ascii=False, indent=2)\n \n # 更新缓存\n self._cache[filepath] = records\n\n def query(\n self,\n start_date: Optional[str] = None,\n end_date: Optional[str] = None,\n context_type: Optional[str] = None,\n min_success_rate: Optional[float] = None,\n strategy: Optional[str] = None,\n include_detail: bool = False\n ) -> List[Dict]:\n \"\"\"\n 跨层级查询\n \n Args:\n start_date: 开始日期(YYYY-MM-DD)\n end_date: 结束日期(YYYY-MM-DD)\n context_type: 场景类型\n min_success_rate: 最小成功率\n strategy: 策略类型\n include_detail: 是否包含详细记录\n \n Returns:\n 查询结果列表\n \"\"\"\n results = []\n \n # 查询热数据层\n hot_results = self._query_hot_layer({\n 'start_date': start_date,\n 'end_date': end_date,\n 'context_type': context_type,\n 'min_success_rate': min_success_rate,\n 'strategy': strategy\n })\n results.extend(hot_results)\n \n # 查询温数据层(如果需要详细记录)\n if include_detail:\n warm_results = self._query_warm_layer({\n 'start_date': start_date,\n 'end_date': end_date,\n 'context_type': context_type,\n 'min_success_rate': min_success_rate,\n 'strategy': strategy\n })\n results.extend(warm_results)\n else:\n # 温数据层仅返回统计信息\n warm_stats = self._query_warm_layer_stats({\n 'start_date': start_date,\n 'end_date': end_date,\n 'context_type': context_type,\n 'min_success_rate': min_success_rate,\n 'strategy': strategy\n })\n results.extend(warm_stats)\n \n # 查询冷数据层(统计信息)\n cold_results = self._query_cold_layer({\n 'start_date': start_date,\n 'end_date': end_date,\n 'context_type': context_type,\n 'min_success_rate': min_success_rate,\n 'strategy': strategy\n })\n results.extend(cold_results)\n \n return results\n\n def _query_hot_layer(self, filters: Dict) -> List[Dict]:\n \"\"\"查询热数据层\"\"\"\n results = []\n \n # 获取热数据层所有文件\n hot_dir = os.path.join(self.metacognition_dir, StorageLayer.HOT.value)\n files = os.listdir(hot_dir) if os.path.exists(hot_dir) else []\n \n for filename in files:\n filepath = os.path.join(hot_dir, filename)\n \n # 从缓存读取\n if filepath in self._cache:\n records = self._cache[filepath]\n else:\n try:\n with open(filepath, 'r', encoding='utf-8') as f:\n records = json.load(f)\n self._cache[filepath] = records\n except:\n continue\n \n # 应用过滤条件\n for record in records:\n if self._matches_filters(record, filters):\n results.append(record)\n \n return results\n\n def _query_warm_layer(self, filters: Dict) -> List[Dict]:\n \"\"\"查询温数据层(详细记录)\"\"\"\n results = []\n \n warm_dir = os.path.join(self.metacognition_dir, StorageLayer.WARM.value)\n files = os.listdir(warm_dir) if os.path.exists(warm_dir) else []\n \n for filename in files:\n if not filename.endswith('.gz'):\n continue\n \n filepath = os.path.join(warm_dir, filename)\n \n # 解压缩\n try:\n with gzip.open(filepath, 'rt', encoding='utf-8') as f:\n records = json.load(f)\n except:\n continue\n \n # 应用过滤条件\n for record in records:\n if self._matches_filters(record, filters):\n results.append(record)\n \n return results\n\n def _query_warm_layer_stats(self, filters: Dict) -> List[Dict]:\n \"\"\"查询温数据层(统计信息)\"\"\"\n # 简化实现:返回记录统计\n results = []\n \n warm_dir = os.path.join(self.metacognition_dir, StorageLayer.WARM.value)\n files = os.listdir(warm_dir) if os.path.exists(warm_dir) else []\n \n for filename in files:\n if not filename.endswith('.gz'):\n continue\n \n filepath = os.path.join(warm_dir, filename)\n \n # 解压缩\n try:\n with gzip.open(filepath, 'rt', encoding='utf-8') as f:\n records = json.load(f)\n except:\n continue\n \n # 应用过滤条件并统计\n filtered_records = [r for r in records if self._matches_filters(r, filters)]\n \n if filtered_records:\n results.append({\n 'date': filename.replace('records_', '').replace('.json.gz', ''),\n 'count': len(filtered_records),\n 'layer': 'warm'\n })\n \n return results\n\n def _query_cold_layer(self, filters: Dict) -> List[Dict]:\n \"\"\"查询冷数据层(聚合统计)\"\"\"\n results = []\n \n cold_dir = os.path.join(self.metacognition_dir, StorageLayer.COLD.value)\n files = os.listdir(cold_dir) if os.path.exists(cold_dir) else []\n \n for filename in files:\n if not filename.endswith('.gz'):\n continue\n \n filepath = os.path.join(cold_dir, filename)\n \n # 解压缩\n try:\n with gzip.open(filepath, 'rt', encoding='utf-8') as f:\n stats = json.load(f)\n except:\n continue\n \n # 应用过滤条件\n for stat in stats:\n if self._matches_filters(stat, filters):\n stat['layer'] = 'cold'\n results.append(stat)\n \n return results\n\n def _matches_filters(self, record: Dict, filters: Dict) -> bool:\n \"\"\"检查记录是否匹配过滤条件\"\"\"\n start_date = filters.get('start_date')\n end_date = filters.get('end_date')\n context_type = filters.get('context_type')\n min_success_rate = filters.get('min_success_rate')\n strategy = filters.get('strategy')\n \n # 日期过滤\n if start_date and record.get('timestamp', '') \u003c start_date:\n return False\n if end_date and record.get('timestamp', '') > end_date:\n return False\n \n # 场景过滤\n if context_type and record.get('context_type') != context_type:\n return False\n \n # 成功率过滤\n if min_success_rate is not None:\n if 'success_rate' in record:\n if record['success_rate'] \u003c min_success_rate:\n return False\n elif 'success' in record:\n if record['success'] != True:\n return False\n \n # 策略过滤\n if strategy and record.get('strategy') != strategy:\n return False\n \n return True\n\n def hot_to_warm(self, record_date: str):\n \"\"\"\n 热数据→温数据转换(压缩)\n \n Args:\n record_date: 记录日期(YYYY-MM-DD)\n \"\"\"\n hot_filename = f\"records_{record_date}.json\"\n hot_filepath = os.path.join(self.metacognition_dir, StorageLayer.HOT.value, hot_filename)\n \n if not os.path.exists(hot_filepath):\n return\n \n # 读取热数据\n with open(hot_filepath, 'r', encoding='utf-8') as f:\n records = json.load(f)\n \n # 压缩为GZIP\n warm_filename = f\"records_{record_date}.json.gz\"\n warm_filepath = os.path.join(self.metacognition_dir, StorageLayer.WARM.value, warm_filename)\n \n with gzip.open(warm_filepath, 'wt', encoding='utf-8') as f:\n json.dump(records, f, ensure_ascii=False)\n \n # 删除热数据\n os.remove(hot_filepath)\n \n # 清除缓存\n if hot_filepath in self._cache:\n del self._cache[hot_filepath]\n \n print(f\"✅ 热→温转换完成: {record_date}\")\n\n def warm_to_cold(self, record_date: str):\n \"\"\"\n 温数据→冷数据转换(聚合统计)\n \n Args:\n record_date: 记录日期(YYYY-MM-DD)\n \"\"\"\n warm_filename = f\"records_{record_date}.json.gz\"\n warm_filepath = os.path.join(self.metacognition_dir, StorageLayer.WARM.value, warm_filename)\n \n if not os.path.exists(warm_filepath):\n return\n \n # 解压缩温数据\n with gzip.open(warm_filepath, 'rt', encoding='utf-8') as f:\n records = json.load(f)\n \n # 按天聚合统计\n daily_stats = {}\n for record in records:\n date = record['timestamp'][:10]\n \n if date not in daily_stats:\n daily_stats[date] = {\n 'date': date,\n 'count': 0,\n 'avg_objectivity': 0.0,\n 'min_objectivity': 1.0,\n 'max_objectivity': 0.0,\n 'success_count': 0,\n 'strategy_distribution': {},\n 'context_distribution': {}\n }\n \n daily_stats[date]['count'] += 1\n daily_stats[date]['avg_objectivity'] += record.get('objectivity_score', 0.0)\n \n if record.get('success', False):\n daily_stats[date]['success_count'] += 1\n \n # 最小/最大客观性\n obj_score = record.get('objectivity_score', 0.0)\n daily_stats[date]['min_objectivity'] = min(\n daily_stats[date]['min_objectivity'], obj_score\n )\n daily_stats[date]['max_objectivity'] = max(\n daily_stats[date]['max_objectivity'], obj_score\n )\n \n # 策略分布\n strategy = record.get('strategy', 'unknown')\n daily_stats[date]['strategy_distribution'][strategy] = \\\n daily_stats[date]['strategy_distribution'].get(strategy, 0) + 1\n \n # 场景分布\n context = record.get('context_type', 'unknown')\n daily_stats[date]['context_distribution'][context] = \\\n daily_stats[date]['context_distribution'].get(context, 0) + 1\n \n # 计算平均值\n for date, stats in daily_stats.items():\n if stats['count'] > 0:\n stats['avg_objectivity'] /= stats['count']\n stats['success_rate'] = stats['success_count'] / stats['count']\n else:\n stats['success_rate'] = 0.0\n \n # 保存冷数据(压缩)\n cold_filename = f\"stats_{record_date}.json.gz\"\n cold_filepath = os.path.join(self.metacognition_dir, StorageLayer.COLD.value, cold_filename)\n \n with gzip.open(cold_filepath, 'wt', encoding='utf-8') as f:\n json.dump(list(daily_stats.values()), f, ensure_ascii=False)\n \n # 删除温数据\n os.remove(warm_filepath)\n \n print(f\"✅ 温→冷转换完成: {record_date}\")\n\n def cold_to_archive(self, record_date: str):\n \"\"\"\n 冷数据→归档转换\n \n Args:\n record_date: 记录日期(YYYY-MM-DD)\n \"\"\"\n cold_filename = f\"stats_{record_date}.json.gz\"\n cold_filepath = os.path.join(self.metacognition_dir, StorageLayer.COLD.value, cold_filename)\n \n if not os.path.exists(cold_filepath):\n return\n \n # 创建归档目录(按年份)\n year = record_date[:4]\n archive_dir = os.path.join(self.metacognition_dir, StorageLayer.ARCHIVE.value, year)\n os.makedirs(archive_dir, exist_ok=True)\n \n # 移动到归档\n archive_filepath = os.path.join(archive_dir, cold_filename)\n shutil.move(cold_filepath, archive_filepath)\n \n print(f\"✅ 冷→归档转换完成: {record_date}\")\n\n\n# 测试代码\nif __name__ == '__main__':\n print(\"=== 元认知历史管理器(测试模式) ===\\n\")\n \n manager = MetacognitionHistoryManager(\"./test_metacognition_history\")\n \n # 测试添加记录\n print(\"测试1:添加记录\")\n record = MetacognitionRecordLite(\n timestamp=datetime.now().isoformat(),\n context_type='scientific',\n objectivity_score=0.85,\n strategy='correct',\n success=True,\n learning_stage='growth'\n )\n manager.add_record(record)\n print(\"✅ 记录添加成功\\n\")\n \n # 测试查询\n print(\"测试2:查询记录\")\n results = manager.query(context_type='scientific')\n print(f\"查询结果数: {len(results)}\")\n for r in results:\n print(f\" - {r.get('timestamp')}: {r.get('context_type')}, {r.get('objectivity_score')}\")\n print()\n \n # 测试数据转换\n print(\"测试3:数据转换\")\n today = datetime.now().strftime(\"%Y-%m-%d\")\n manager.hot_to_warm(today)\n print()\n \n print(\"=== 测试完成 ===\")\n","content_type":"text/x-python; charset=utf-8","language":"python","size":16648,"content_sha256":"35c811193fb322560c1cf749ec82743147763595e504a5ac50c6b9ea7b40b13e"},{"filename":"scripts/objectivity_evaluator.py","content":"#!/usr/bin/env python3\n\"\"\"\n客观性评估模块(独立分支)\n\n这是一个元认知监控框架的具体实现,用于评估智能体响应的客观性。\n特点:\n- 作为数学顶点的独立分支,不参与主循环\n- 仅在推理完成后进行评估\n- 提供客观性评分和适切性判断\n- 不直接触发自我纠错,由映射层决定是否触发\n\"\"\"\n\nimport re\nimport time\nfrom typing import Dict, List, Optional\nfrom dataclasses import dataclass, asdict\n\n\n@dataclass\nclass SubjectivityDimensions:\n \"\"\"主观性维度\"\"\"\n speculation: float = 0.0 # 推测性\n assumption: float = 0.0 # 基于假设\n emotion: float = 0.0 # 情绪化\n preference: float = 0.0 # 个人偏好\n hallucination: float = 0.0 # 幻觉倾向\n\n def to_dict(self) -> dict:\n return asdict(self)\n\n def get_total_score(self) -> float:\n \"\"\"获取主观性总分(加权)\"\"\"\n weights = {\n 'speculation': 0.2,\n 'assumption': 0.3,\n 'emotion': 0.1,\n 'preference': 0.1,\n 'hallucination': 0.3\n }\n return min(\n sum(self.__getattribute__(k) * weights[k] for k in weights),\n 1.0\n )\n\n\n@dataclass\nclass ObjectivityMetric:\n \"\"\"客观性标注\"\"\"\n timestamp: str\n subjectivity_score: float # 主观性评分 (0.0-1.0)\n objectivity_score: float # 客观性评分 (0.0-1.0)\n required_objectivity: float # 场景要求的客观性 (0.0-1.0)\n context_type: str # 场景类型\n is_appropriate: bool # 是否适切\n gap: float # 适切性差距\n subjectivity_dimensions: Dict # 主观性维度详情\n meta_cognition: str # 元认知描述\n severity: str # 严重程度 (none/mild/moderate/severe)\n\n def to_dict(self) -> dict:\n return asdict(self)\n\n\nclass ObjectivityEvaluator:\n \"\"\"\n 客观性评估器\n \n 评估智能体响应的客观性水平,作为元认知监控的参考信息。\n \"\"\"\n\n def __init__(self):\n # 场景客观性要求映射\n self.context_requirements = {\n 'scientific': 0.9,\n 'legal': 0.85,\n 'medical': 0.9,\n 'technical': 0.8,\n 'general': 0.6,\n 'creative': 0.3,\n 'emotional': 0.2,\n 'artistic': 0.1,\n }\n\n # 模糊词库\n self.fuzzy_words = [\n '可能', '大概', '也许', '估计', '推测', '或许', '大约', '好像', '似乎',\n '应该', '想必', '或许', '多半', '通常', '一般来说'\n ]\n\n # 情绪词库\n self.emotional_words = [\n '太棒了', '令人失望', '非常讨厌', '爱死', '糟糕', '完美', '恐怖', '精彩',\n '无聊', '兴奋', '激动', '难过', '高兴', '痛苦', '愉快', '沮丧'\n ]\n\n # 个人偏好标记\n self.preference_markers = [\n '我喜欢', '我认为', '我觉得', '在我看来', '对我来说', '我的看法',\n '依我看', '据我所知'\n ]\n\n # 幻觉模式(与常识矛盾的陈述)\n self.hallucination_patterns = [\n '太阳有9颗行星',\n '地球是平的',\n '人类有10个手指', # 这是正确的,不会触发\n ]\n\n def evaluate(\n self,\n response: str,\n context_type: str,\n reasoning_result: Optional[Dict] = None,\n personality: Optional['Personality'] = None, # 新增\n learning_stage: Optional[dict] = None # 新增\n ) -> ObjectivityMetric:\n \"\"\"\n 评估响应的客观性(增强版)\n \n Args:\n response: 智能体的响应\n context_type: 场景类型\n reasoning_result: 推理结果(可选)\n personality: 人格配置(新增,用于动态场景敏感度)\n learning_stage: 学习阶段(新增,用于动态场景敏感度)\n \n Returns:\n ObjectivityMetric: 客观性标注\n \"\"\"\n timestamp = time.strftime(\"%Y-%m-%dT%H:%M:%SZ\")\n\n # 步骤1:评估主观性维度\n subjectivity_dims = self._evaluate_subjectivity_dimensions(response)\n\n # 步骤2:计算主观性评分\n subjectivity_score = subjectivity_dims.get_total_score()\n\n # 步骤3:计算客观性评分(逆向关系)\n objectivity_score = 1.0 - subjectivity_score\n\n # 步骤4:计算动态客观性要求(新增)\n if personality:\n required_objectivity = self.calculate_dynamic_requirement(\n context_type,\n personality,\n learning_stage\n )\n else:\n required_objectivity = self.context_requirements.get(context_type, 0.5)\n\n # 步骤5:判断适切性\n appropriateness = self._check_appropriateness(\n objectivity_score,\n required_objectivity\n )\n\n # 步骤6:生成元认知描述\n meta_cognition = self._generate_meta_cognition(\n subjectivity_score,\n objectivity_score,\n required_objectivity,\n appropriateness\n )\n\n # 步骤7:确定严重程度\n severity = self._determine_severity(appropriateness['gap'])\n\n return ObjectivityMetric(\n timestamp=timestamp,\n subjectivity_score=subjectivity_score,\n objectivity_score=objectivity_score,\n required_objectivity=required_objectivity,\n context_type=context_type,\n is_appropriate=appropriateness['is_appropriate'],\n gap=appropriateness['gap'],\n subjectivity_dimensions=subjectivity_dims.to_dict(),\n meta_cognition=meta_cognition,\n severity=severity\n )\n\n def calculate_dynamic_requirement(\n self,\n context_type: str,\n personality: 'Personality',\n learning_stage: Optional[dict] = None\n ) -> float:\n \"\"\"\n 计算动态客观性要求(场景敏感度增强)\n \n 基于三个维度动态调整:\n 1. 基础场景要求\n 2. 人格调整系数\n 3. 学习阶段调整系数\n \n Args:\n context_type: 场景类型\n personality: 人格配置\n learning_stage: 学习阶段(可选)\n \n Returns:\n float: 动态客观性要求(0.0-1.0)\n \"\"\"\n # 1. 获取基础场景要求\n base_requirement = self.context_requirements.get(context_type, 0.5)\n \n # 2. 计算人格调整系数\n personality_adjustment = self._calculate_personality_adjustment(\n personality.big_five,\n personality.preset_name\n )\n \n # 3. 计算学习阶段调整系数\n if learning_stage:\n learning_adjustment = self._calculate_learning_stage_adjustment(\n learning_stage.get('total_interactions', 0),\n learning_stage.get('success_rate', 0.5)\n )\n else:\n learning_adjustment = 1.0\n \n # 4. 计算最终要求\n final_requirement = base_requirement * personality_adjustment * learning_adjustment\n return max(0.0, min(1.0, final_requirement))\n\n def _calculate_personality_adjustment(\n self,\n big_five: 'BigFive',\n personality_type: str\n ) -> float:\n \"\"\"\n 计算人格调整系数(0.7 - 1.3)\n \n 谨慎型人格 → 提高要求(系数 \u003c 1.0)\n 激进型人格 → 降低要求(系数 > 1.0)\n 平衡型人格 → 保持基准(系数 ≈ 1.0)\n \"\"\"\n # 基于预设人格类型的基准调整\n type_adjustment = {\n \"谨慎探索型\": 0.85, # 更严格\n \"激进创新型\": 1.15, # 更宽容\n \"平衡稳重型\": 1.0 # 基准\n }.get(personality_type, 1.0)\n \n # 基于大五人格的精细调整\n # 尽责性高 → 更严格\n conscientiousness_adjustment = 1.0 - (big_five.conscientiousness - 0.5) * 0.3\n # 开放性高 → 更宽容\n openness_adjustment = 1.0 + (big_five.openness - 0.5) * 0.3\n # 神经质高 → 更严格(更谨慎)\n neuroticism_adjustment = 1.0 - (big_five.neuroticism - 0.3) * 0.2\n \n # 综合调整系数(加权平均)\n final_adjustment = (\n type_adjustment * 0.4 +\n conscientiousness_adjustment * 0.3 +\n openness_adjustment * 0.2 +\n neuroticism_adjustment * 0.1\n )\n \n # 限制在合理范围内\n return max(0.7, min(1.3, final_adjustment))\n\n def _calculate_learning_stage_adjustment(\n self,\n total_interactions: int,\n success_rate: float\n ) -> float:\n \"\"\"\n 计算学习阶段调整系数(0.9 - 1.1)\n \n 学习初期 → 提高要求(更谨慎)\n 精通期 → 适度降低要求(更自信)\n \"\"\"\n # 基于交互次数确定学习阶段\n if total_interactions \u003c 50:\n stage_coefficient = 0.95 # 学习初期:更谨慎\n elif total_interactions \u003c 200:\n stage_coefficient = 0.98 # 成长期:适度谨慎\n elif total_interactions \u003c 500:\n stage_coefficient = 1.0 # 精通期:基准\n else:\n stage_coefficient = 1.05 # 专家期:适度宽松\n \n # 基于成功率调整\n if success_rate > 0.85:\n success_adjustment = 1.05 # 高成功率:适度宽松\n elif success_rate \u003c 0.6:\n success_adjustment = 0.95 # 低成功率:更谨慎\n else:\n success_adjustment = 1.0 # 中等成功率:基准\n \n # 综合调整系数\n final_coefficient = stage_coefficient * success_adjustment\n return max(0.9, min(1.1, final_coefficient))\n\n def _evaluate_subjectivity_dimensions(self, response: str) -> SubjectivityDimensions:\n \"\"\"评估主观性的各个维度\"\"\"\n\n dims = SubjectivityDimensions()\n\n # 1. 推测性检测\n dims.speculation = self._detect_speculation(response)\n\n # 2. 基于假设检测\n dims.assumption = self._detect_assumption(response)\n\n # 3. 情绪化检测\n dims.emotion = self._detect_emotion(response)\n\n # 4. 个人偏好检测\n dims.preference = self._detect_preference(response)\n\n # 5. 幻觉倾向检测\n dims.hallucination = self._detect_hallucination(response)\n\n return dims\n\n def _detect_speculation(self, response: str) -> float:\n \"\"\"检测推测性语言\"\"\"\n count = sum(1 for word in self.fuzzy_words if word in response)\n # 归一化到 0.0-1.0\n return min(count * 0.15, 1.0)\n\n def _detect_assumption(self, response: str) -> float:\n \"\"\"检测基于假设(无证据支持)\"\"\"\n # 检测是否有引用标记\n has_citation = any(marker in response for marker in ['来源:', '根据', '数据:', '引用:'])\n\n # 检测是否有数据\n has_data = any(char.isdigit() for char in response)\n\n if not has_citation and not has_data:\n # 没有引用和数据,可能是基于假设\n return 0.6\n elif not has_citation:\n # 有数据但无引用,部分基于假设\n return 0.3\n else:\n return 0.0\n\n def _detect_emotion(self, response: str) -> float:\n \"\"\"检测情绪化表达\"\"\"\n count = sum(1 for word in self.emotional_words if word in response)\n return min(count * 0.2, 1.0)\n\n def _detect_preference(self, response: str) -> float:\n \"\"\"检测个人偏好\"\"\"\n if any(marker in response for marker in self.preference_markers):\n return 0.4\n return 0.0\n\n def _detect_hallucination(self, response: str) -> float:\n \"\"\"检测幻觉倾向(与常识矛盾)\"\"\"\n # 检测明显的错误陈述\n for pattern in self.hallucination_patterns:\n if pattern in response:\n return 0.8\n\n # 检测数字逻辑错误(简化版)\n # 例如:\"1+1=3\"\n if re.search(r'1\\s*\\+\\s*1\\s*=\\s*[^2]', response):\n return 0.9\n\n return 0.0\n\n def _check_appropriateness(self, objectivity_score: float, required_objectivity: float) -> Dict:\n \"\"\"检查适切性\"\"\"\n gap = required_objectivity - objectivity_score\n\n if gap > 0:\n return {\n 'is_appropriate': False,\n 'gap': gap\n }\n else:\n return {\n 'is_appropriate': True,\n 'gap': 0.0\n }\n\n def _generate_meta_cognition(self, subjectivity_score: float, objectivity_score: float,\n required_objectivity: float, appropriateness: Dict) -> str:\n \"\"\"生成元认知描述\"\"\"\n\n if appropriateness['is_appropriate']:\n return f\"自我认知:当前客观性{objectivity_score:.2f}符合场景要求{required_objectivity:.2f},主观性适切\"\n elif subjectivity_score \u003c 0.2:\n return f\"自我认知:当前客观性{objectivity_score:.2f}低于场景要求{required_objectivity:.2f},存在轻微主观倾向\"\n elif subjectivity_score \u003c 0.5:\n return f\"自我认知:当前客观性{objectivity_score:.2f}低于场景要求{required_objectivity:.2f},主观与客观混合,需谨慎\"\n elif subjectivity_score \u003c 0.7:\n return f\"自我认知:当前客观性{objectivity_score:.2f}低于场景要求{required_objectivity:.2f},主要是主观推断,证据不足\"\n else:\n return f\"自我认知:当前客观性{objectivity_score:.2f}远低于场景要求{required_objectivity:.2f},高度主观化,可能是幻觉\"\n\n def _determine_severity(self, gap: float) -> str:\n \"\"\"确定严重程度\"\"\"\n if gap \u003c= 0:\n return 'none'\n elif gap \u003c 0.1:\n return 'mild'\n elif gap \u003c 0.3:\n return 'moderate'\n else:\n return 'severe'\n\n\n# ===== 命令行接口 =====\n\ndef main():\n \"\"\"命令行测试接口\"\"\"\n print(\"=== 客观性评估模块(测试模式) ===\\n\")\n\n evaluator = ObjectivityEvaluator()\n\n # 测试1:科学推理场景(高客观性要求)\n print(\"测试1:科学推理场景(高客观性要求)\")\n response1 = \"地球的公转周期约为365.25天,这是根据NASA的观测数据得出的。\"\n result1 = evaluator.evaluate(response1, 'scientific')\n print(f\" 客观性评分: {result1.objectivity_score:.2f}\")\n print(f\" 场景要求: {result1.required_objectivity:.2f}\")\n print(f\" 是否适切: {result1.is_appropriate}\")\n print(f\" 元认知: {result1.meta_cognition}\\n\")\n\n # 测试2:创意建议场景(低客观性要求)\n print(\"测试2:创意建议场景(低客观性要求)\")\n response2 = \"我建议你考虑AI+教育领域,这个领域可能很有前景。\"\n result2 = evaluator.evaluate(response2, 'creative')\n print(f\" 客观性评分: {result2.objectivity_score:.2f}\")\n print(f\" 场景要求: {result2.required_objectivity:.2f}\")\n print(f\" 是否适切: {result2.is_appropriate}\")\n print(f\" 元认知: {result2.meta_cognition}\\n\")\n\n # 测试3:司法建议场景(极高客观性要求,不适切)\n print(\"测试3:司法建议场景(极高客观性要求,不适切)\")\n response3 = \"根据法律条文,这个案件可能构成侵权,但我认为应该从轻处理。\"\n result3 = evaluator.evaluate(response3, 'legal')\n print(f\" 客观性评分: {result3.objectivity_score:.2f}\")\n print(f\" 场景要求: {result3.required_objectivity:.2f}\")\n print(f\" 是否适切: {result3.is_appropriate}\")\n print(f\" 差距: {result3.gap:.2f}\")\n print(f\" 严重程度: {result3.severity}\")\n print(f\" 元认知: {result3.meta_cognition}\\n\")\n\n # 测试4:情感支持场景(低客观性要求)\n print(\"测试4:情感支持场景(低客观性要求)\")\n response4 = \"我理解你的感受,这很正常。\"\n result4 = evaluator.evaluate(response4, 'emotional')\n print(f\" 客观性评分: {result4.objectivity_score:.2f}\")\n print(f\" 场景要求: {result4.required_objectivity:.2f}\")\n print(f\" 是否适切: {result4.is_appropriate}\")\n print(f\" 元认知: {result4.meta_cognition}\\n\")\n\n print(\"=== 所有测试完成 ===\")\n\n\nif __name__ == \"__main__\":\n main()\n","content_type":"text/x-python; charset=utf-8","language":"python","size":16804,"content_sha256":"951a27e274794560c5b1f152c5be2649abd64d2864d95a0ded2d3b09e47d0389"},{"filename":"scripts/perception_node.py","content":"#!/usr/bin/env python3\n\"\"\"\n感知节点 - Tool Use 接口(完整版)\n\n功能:\n- 工具调用(web_search, get_weather, calculator, search_documents)\n- Trace ID 全链路追踪\n- 缓存策略\n- 重试机制\n- 性能监控\n- 分页支持\n- SSE 流式响应(模拟)\n- 可观测性(调试模式、日志)\n- 版本控制\n- Token 预估\n\n基于:tool_use_spec.md 接口规范(2026版)\n\"\"\"\n\nimport sys\nimport os\nimport json\nimport argparse\nimport time\nimport hashlib\nimport uuid\nimport datetime\nimport logging\nfrom typing import Dict, List, Optional, Any, AsyncGenerator, Callable\nfrom dataclasses import dataclass, field\nfrom functools import lru_cache\nfrom collections import OrderedDict\n\n# 配置日志\nlogging.basicConfig(\n level=logging.INFO,\n format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'\n)\nlogger = logging.getLogger('perception_node')\n\n# 确保当前目录在 sys.path 中\ncurrent_dir = os.path.dirname(os.path.abspath(__file__))\npersonality_core_dir = os.path.join(current_dir, 'personality_core')\nif current_dir not in sys.path:\n sys.path.insert(0, current_dir)\nif personality_core_dir not in sys.path:\n sys.path.insert(0, personality_core_dir)\n\n# 尝试导入 C 扩展\ntry:\n import core_perception_node\n from core_perception_node import generate_trace_id as c_generate_trace_id\n C_EXT_AVAILABLE = True\n logger.info(\"C extension loaded successfully\")\nexcept ImportError as e:\n logger.warning(f\"C extension not available: {e}, using pure Python implementation\")\n C_EXT_AVAILABLE = False\n\n# ==================== 工具定义 ====================\n\n@dataclass\nclass ToolConfig:\n \"\"\"工具配置\"\"\"\n name: str\n description: str\n version: str = \"1.0.0\"\n cacheable: bool = False\n cache_ttl: int = 600\n cache_key_params: List[str] = field(default_factory=list)\n streaming: bool = False\n estimated_tokens: Dict[str, Any] = field(default_factory=dict)\n deprecated: bool = False\n sunset_date: Optional[str] = None\n replacement: Optional[str] = None\n\n\n# 工具注册表\nTOOL_REGISTRY: Dict[str, ToolConfig] = {\n \"web_search\": ToolConfig(\n name=\"web_search\",\n description=\"搜索网络信息\",\n version=\"1.0.0\",\n cacheable=True,\n cache_ttl=300,\n cache_key_params=[\"query\"],\n estimated_tokens={\"input\": 50, \"output\": {\"typical\": 200, \"max\": 1000}}\n ),\n \"get_weather\": ToolConfig(\n name=\"get_weather\",\n description=\"获取指定城市的实时天气信息\",\n version=\"1.0.0\",\n cacheable=True,\n cache_ttl=600,\n cache_key_params=[\"location\", \"unit\"],\n estimated_tokens={\"input\": 50, \"output\": {\"typical\": 100, \"max\": 200}}\n ),\n \"calculator\": ToolConfig(\n name=\"calculator\",\n description=\"执行数学计算\",\n version=\"1.0.0\",\n cacheable=True,\n cache_ttl=3600,\n estimated_tokens={\"input\": 100, \"output\": {\"typical\": 50, \"max\": 100}}\n ),\n \"search_documents\": ToolConfig(\n name=\"search_documents\",\n description=\"搜索文档数据库(支持分页)\",\n version=\"2.1.0\",\n cacheable=True,\n cache_ttl=300,\n estimated_tokens={\"input\": 100, \"output\": {\"min\": 200, \"max\": 5000, \"typical\": 1000}}\n )\n}\n\n\n# ==================== 辅助函数 ====================\n\ndef generate_trace_id() -> str:\n \"\"\"生成 Trace ID\"\"\"\n if C_EXT_AVAILABLE:\n try:\n return c_generate_trace_id()\n except Exception as e:\n logger.warning(f\"Failed to generate trace ID with C extension: {e}\")\n\n date_str = datetime.datetime.utcnow().strftime(\"%Y%m%d\")\n uuid_str = uuid.uuid4().hex[:12]\n return f\"trace_{date_str}_{uuid_str}\"\n\n\ndef get_timestamp_iso8601() -> str:\n \"\"\"获取 ISO 8601 格式的时间戳\"\"\"\n return datetime.datetime.utcnow().strftime(\"%Y-%m-%dT%H:%M:%SZ\")\n\n\ndef get_cache_key(tool_name: str, params: dict, key_params: List[str]) -> str:\n \"\"\"生成缓存键\"\"\"\n filtered_params = {k: v for k, v in params.items() if k in key_params}\n params_str = json.dumps(filtered_params, sort_keys=True)\n return hashlib.md5(f\"{tool_name}:{params_str}\".encode()).hexdigest()\n\n\n# ==================== 缓存实现 ====================\n\nclass ToolCache:\n \"\"\"工具结果缓存(LRU)\"\"\"\n\n def __init__(self, max_size: int = 1000):\n self.cache: OrderedDict[str, tuple] = OrderedDict()\n self.max_size = max_size\n\n def get(self, tool_name: str, params: dict, config: ToolConfig) -> Optional[dict]:\n \"\"\"获取缓存结果\"\"\"\n if not config.cacheable:\n return None\n\n cache_key = get_cache_key(tool_name, params, config.cache_key_params)\n\n if cache_key in self.cache:\n result, cached_time = self.cache[cache_key]\n\n # 检查是否过期\n if time.time() - cached_time \u003c config.cache_ttl:\n # 更新访问顺序\n self.cache.move_to_end(cache_key)\n\n # 添加缓存元数据(保留原始 trace_id)\n original_trace_id = result.get('metadata', {}).get('trace_id')\n cached_result = result.copy()\n if 'metadata' not in cached_result:\n cached_result['metadata'] = {}\n cached_result['metadata'].update({\n 'cache': {\n 'hit': True,\n 'cached_at': datetime.datetime.fromtimestamp(cached_time).isoformat(),\n 'ttl_remaining': config.cache_ttl - (time.time() - cached_time)\n },\n 'trace_id': original_trace_id # 保留原始 trace_id\n })\n\n logger.info(f\"Cache hit for {tool_name}: {cache_key}\")\n return cached_result\n else:\n # 缓存过期\n del self.cache[cache_key]\n\n return None\n\n def set(self, tool_name: str, params: dict, result: dict, config: ToolConfig) -> None:\n \"\"\"设置缓存结果\"\"\"\n if not config.cacheable:\n return\n\n cache_key = get_cache_key(tool_name, params, config.cache_key_params)\n\n # 检查缓存大小\n if len(self.cache) >= self.max_size:\n self.cache.popitem(last=False)\n\n self.cache[cache_key] = (result, time.time())\n logger.info(f\"Cached result for {tool_name}: {cache_key}\")\n\n def clear(self) -> None:\n \"\"\"清空缓存\"\"\"\n self.cache.clear()\n logger.info(\"Cache cleared\")\n\n\n# ==================== 可观测性管理器 ====================\n\nclass ObservabilityManager:\n \"\"\"可观测性管理器\"\"\"\n\n def __init__(self):\n self.metrics = {\n \"total_calls\": 0,\n \"successful_calls\": 0,\n \"failed_calls\": 0,\n \"cache_hits\": 0,\n \"cache_misses\": 0,\n \"retry_count\": 0\n }\n\n def log_call(self, tool_name: str, trace_id: str, params: dict) -> None:\n \"\"\"记录工具调用\"\"\"\n self.metrics[\"total_calls\"] += 1\n logger.info(f\"Tool called: {tool_name}\", extra={\n \"trace_id\": trace_id,\n \"tool_name\": tool_name,\n \"params\": params\n })\n\n def log_success(self, tool_name: str, trace_id: str, execution_time_ms: float) -> None:\n \"\"\"记录成功调用\"\"\"\n self.metrics[\"successful_calls\"] += 1\n logger.info(f\"Tool completed: {tool_name}\", extra={\n \"trace_id\": trace_id,\n \"tool_name\": tool_name,\n \"execution_time_ms\": execution_time_ms\n })\n\n def log_error(self, tool_name: str, trace_id: str, error: Exception, retryable: bool) -> None:\n \"\"\"记录错误\"\"\"\n self.metrics[\"failed_calls\"] += 1\n logger.error(f\"Tool failed: {tool_name}\", extra={\n \"trace_id\": trace_id,\n \"tool_name\": tool_name,\n \"error\": str(error),\n \"retryable\": retryable\n }, exc_info=True)\n\n def log_cache_hit(self, tool_name: str) -> None:\n \"\"\"记录缓存命中\"\"\"\n self.metrics[\"cache_hits\"] += 1\n\n def log_cache_miss(self, tool_name: str) -> None:\n \"\"\"记录缓存未命中\"\"\"\n self.metrics[\"cache_misses\"] += 1\n\n def log_retry(self, tool_name: str) -> None:\n \"\"\"记录重试\"\"\"\n self.metrics[\"retry_count\"] += 1\n logger.warning(f\"Tool retry: {tool_name}\")\n\n def get_metrics(self) -> dict:\n \"\"\"获取指标\"\"\"\n return self.metrics.copy()\n\n\n# ==================== 感知节点主类 ====================\n\nclass PerceptionNode:\n \"\"\"感知节点 - Tool Use 接口(完整版)\"\"\"\n\n def __init__(self):\n self.c_ext_available = C_EXT_AVAILABLE\n self.cache = ToolCache()\n self.observability = ObservabilityManager()\n\n def call_tool(\n self,\n tool_name: str,\n params: dict,\n **options\n ) -> dict:\n \"\"\"\n 调用工具(统一入口)\n\n 参数:\n tool_name: 工具名称\n params: 工具参数\n options: 可选参数\n - enable_cache: 是否启用缓存(默认 True)\n - enable_retry: 是否启用重试(默认 True)\n - debug: 调试模式(默认 False)\n - max_retries: 最大重试次数(默认 3)\n\n 返回:\n 工具执行结果\n \"\"\"\n # 获取工具配置\n tool_config = TOOL_REGISTRY.get(tool_name)\n\n if not tool_config:\n return {\n \"success\": False,\n \"status\": \"error\",\n \"error\": {\n \"code\": \"TOOL_NOT_FOUND\",\n \"message\": f\"Tool '{tool_name}' not found\"\n },\n \"metadata\": {\n \"tool_name\": tool_name,\n \"timestamp\": get_timestamp_iso8601(),\n \"trace_id\": generate_trace_id()\n }\n }\n\n # 检查工具是否已废弃\n if tool_config.deprecated:\n return {\n \"success\": False,\n \"status\": \"error\",\n \"error\": {\n \"code\": \"TOOL_DEPRECATED\",\n \"message\": f\"Tool '{tool_name}' is deprecated\",\n \"replacement\": tool_config.replacement,\n \"sunset_date\": tool_config.sunset_date\n },\n \"metadata\": {\n \"tool_name\": tool_name,\n \"timestamp\": get_timestamp_iso8601(),\n \"trace_id\": generate_trace_id()\n }\n }\n\n # 生成 trace_id\n trace_id = generate_trace_id()\n\n # 记录调用\n self.observability.log_call(tool_name, trace_id, params)\n\n start_time = time.time()\n\n try:\n # 检查缓存\n if options.get('enable_cache', True) and tool_config.cacheable:\n cached_result = self.cache.get(tool_name, params, tool_config)\n if cached_result:\n self.observability.log_cache_hit(tool_name)\n return cached_result\n else:\n self.observability.log_cache_miss(tool_name)\n\n # 执行工具\n enable_retry = options.get('enable_retry', True)\n max_retries = options.get('max_retries', 3)\n\n if enable_retry:\n result = self._execute_with_retry(\n tool_name,\n params,\n tool_config,\n trace_id,\n max_retries\n )\n else:\n result = self._execute_tool(tool_name, params, tool_config, trace_id)\n\n execution_time = (time.time() - start_time) * 1000\n\n if result.get('success'):\n self.observability.log_success(tool_name, trace_id, execution_time)\n\n # 添加性能数据\n if 'metadata' not in result:\n result['metadata'] = {}\n result['metadata']['performance'] = {\n 'total_ms': execution_time\n }\n\n # 缓存结果\n if options.get('enable_cache', True) and tool_config.cacheable:\n # 保存原始的 trace_id\n original_trace_id = result.get('metadata', {}).get('trace_id')\n self.cache.set(tool_name, params, result, tool_config)\n # 确保返回结果包含 trace_id\n if 'metadata' not in result:\n result['metadata'] = {}\n result['metadata']['trace_id'] = original_trace_id or trace_id\n\n # 调试信息\n if options.get('debug', False):\n result['debug_info'] = {\n 'cache_hit': False,\n 'retry_count': result.get('retry_count', 0),\n 'execution_time_ms': execution_time,\n 'tool_config': {\n 'version': tool_config.version,\n 'cacheable': tool_config.cacheable,\n 'estimated_tokens': tool_config.estimated_tokens\n }\n }\n else:\n execution_time = (time.time() - start_time) * 1000\n if 'metadata' not in result:\n result['metadata'] = {}\n result['metadata']['performance'] = {\n 'total_ms': execution_time\n }\n\n return result\n\n except Exception as error:\n execution_time = (time.time() - start_time) * 1000\n\n error_result = {\n \"success\": False,\n \"status\": \"error\",\n \"error\": {\n \"code\": \"EXECUTION_ERROR\",\n \"message\": str(error)\n },\n \"metadata\": {\n \"tool_name\": tool_name,\n \"execution_time_ms\": execution_time,\n \"timestamp\": get_timestamp_iso8601(),\n \"trace_id\": trace_id,\n \"performance\": {\"total_ms\": execution_time}\n }\n }\n\n self.observability.log_error(tool_name, trace_id, error, False)\n\n return error_result\n\n def _execute_tool(self, tool_name: str, params: dict, config: ToolConfig, trace_id: str) -> dict:\n \"\"\"执行工具(基础版本)\"\"\"\n if self.c_ext_available:\n try:\n # 调用 C 扩展\n result = core_perception_node.call_tool(tool_name, params)\n # 确保包含 trace_id\n if 'metadata' in result and 'trace_id' not in result['metadata']:\n result['metadata']['trace_id'] = trace_id\n return result\n except Exception as e:\n logger.warning(f\"C extension failed for {tool_name}: {e}, falling back to Python\")\n\n # Python 实现的后备方案\n return self._execute_tool_python(tool_name, params, config, trace_id)\n\n def _execute_tool_python(self, tool_name: str, params: dict, config: ToolConfig, trace_id: str) -> dict:\n \"\"\"纯 Python 实现的后备方案\"\"\"\n start_time = time.time()\n\n try:\n if tool_name == \"web_search\":\n data = {\n \"query\": params.get(\"query\", \"\"),\n \"results\": [],\n \"count\": 0\n }\n elif tool_name == \"get_weather\":\n data = {\n \"location\": params.get(\"location\", \"\"),\n \"temperature\": 25,\n \"condition\": \"sunny\",\n \"unit\": params.get(\"unit\", \"celsius\")\n }\n elif tool_name == \"calculator\":\n expression = params.get(\"expression\", \"0\")\n try:\n result = eval(expression)\n data = {\n \"expression\": expression,\n \"result\": result\n }\n except Exception as e:\n return {\n \"success\": False,\n \"status\": \"error\",\n \"error\": {\n \"code\": \"CALC_ERROR\",\n \"message\": str(e),\n \"retryable\": False\n },\n \"metadata\": {\n \"tool_name\": tool_name,\n \"timestamp\": get_timestamp_iso8601(),\n \"trace_id\": trace_id\n }\n }\n elif tool_name == \"search_documents\":\n # 处理分页\n limit = params.get(\"limit\", 10)\n if limit \u003c 1 or limit > 100:\n return {\n \"success\": False,\n \"status\": \"error\",\n \"error\": {\n \"code\": \"INVALID_PARAMS\",\n \"message\": \"limit must be between 1 and 100\",\n \"retryable\": False\n },\n \"metadata\": {\n \"tool_name\": tool_name,\n \"timestamp\": get_timestamp_iso8601(),\n \"trace_id\": trace_id\n }\n }\n\n cursor = params.get(\"cursor\", \"\")\n data = {\n \"query\": params.get(\"query\", \"\"),\n \"items\": [],\n \"pagination\": {\n \"has_more\": False,\n \"next_cursor\": cursor,\n \"total_count\": 0\n }\n }\n else:\n return {\n \"success\": False,\n \"status\": \"error\",\n \"error\": {\n \"code\": \"TOOL_NOT_FOUND\",\n \"message\": f\"Tool '{tool_name}' not found\",\n \"retryable\": False\n },\n \"metadata\": {\n \"tool_name\": tool_name,\n \"timestamp\": get_timestamp_iso8601(),\n \"trace_id\": trace_id\n }\n }\n\n execution_time = (time.time() - start_time) * 1000\n\n return {\n \"success\": True,\n \"status\": \"success\",\n \"data\": data,\n \"metadata\": {\n \"tool_name\": tool_name,\n \"execution_time_ms\": execution_time,\n \"timestamp\": get_timestamp_iso8601(),\n \"trace_id\": trace_id\n }\n }\n\n except Exception as e:\n execution_time = (time.time() - start_time) * 1000\n return {\n \"success\": False,\n \"status\": \"error\",\n \"error\": {\n \"code\": \"EXECUTION_ERROR\",\n \"message\": str(e),\n \"retryable\": False\n },\n \"metadata\": {\n \"tool_name\": tool_name,\n \"execution_time_ms\": execution_time,\n \"timestamp\": get_timestamp_iso8601(),\n \"trace_id\": trace_id\n }\n }\n\n def _execute_with_retry(\n self,\n tool_name: str,\n params: dict,\n config: ToolConfig,\n trace_id: str,\n max_retries: int = 3\n ) -> dict:\n \"\"\"执行工具(带重试)\"\"\"\n retry_count = 0\n last_error = None\n\n while retry_count \u003c max_retries:\n try:\n result = self._execute_tool(tool_name, params, config, trace_id)\n\n # 检查是否需要重试\n if not result.get('success'):\n error_code = result.get('error', {}).get('code')\n\n # 参数错误和权限错误不重试\n if error_code in ['INVALID_PARAMS', 'PERMISSION_DENIED', 'TOOL_NOT_FOUND', 'TOOL_DEPRECATED']:\n return result\n\n # 执行错误和计算错误不重试\n if error_code in ['EXECUTION_ERROR', 'CALC_ERROR']:\n return result\n\n # 其他错误继续重试\n last_error = result\n retry_count += 1\n self.observability.log_retry(tool_name)\n time.sleep(2 ** retry_count) # 指数退避\n continue\n\n # 添加重试计数\n if retry_count > 0:\n result['retry_count'] = retry_count\n\n return result\n\n except Exception as e:\n last_error = {\n \"success\": False,\n \"status\": \"error\",\n \"error\": {\n \"code\": \"EXECUTION_ERROR\",\n \"message\": str(e),\n \"retryable\": True\n },\n \"metadata\": {\n \"tool_name\": tool_name,\n \"timestamp\": get_timestamp_iso8601(),\n \"trace_id\": trace_id\n }\n }\n retry_count += 1\n self.observability.log_retry(tool_name)\n time.sleep(2 ** retry_count) # 指数退避\n\n # 重试次数用尽\n return last_error\n\n def call_tool_with_streaming(\n self,\n tool_name: str,\n params: dict,\n **options\n ) -> AsyncGenerator:\n \"\"\"\n 调用工具并流式返回进度(模拟)\n\n 参数:\n tool_name: 工具名称\n params: 工具参数\n options: 可选参数\n\n 返回:\n 异步生成器,产生 SSE 事件\n \"\"\"\n import asyncio\n\n async def _stream():\n trace_id = generate_trace_id()\n\n # 推送开始事件\n yield {\n \"event\": \"tool_progress\",\n \"id\": f\"evt_{trace_id}_start\",\n \"data\": {\n \"progress\": 0,\n \"message\": f\"开始执行工具: {tool_name}\",\n \"metadata\": {\n \"tool_name\": tool_name,\n \"timestamp\": get_timestamp_iso8601(),\n \"trace_id\": trace_id\n }\n }\n }\n\n # 模拟进度\n for i in range(0, 101, 20):\n await asyncio.sleep(0.1)\n yield {\n \"event\": \"tool_progress\",\n \"id\": f\"evt_{trace_id}_progress_{i}\",\n \"data\": {\n \"progress\": i,\n \"message\": f\"处理中... {i}%\",\n \"metadata\": {\n \"tool_name\": tool_name,\n \"timestamp\": get_timestamp_iso8601(),\n \"trace_id\": trace_id\n }\n }\n }\n\n # 执行工具\n try:\n result = self.call_tool(tool_name, params, **options)\n\n # 推送成功结果\n yield {\n \"event\": \"tool_result\",\n \"id\": f\"evt_{trace_id}_result\",\n \"data\": result\n }\n\n except Exception as error:\n # 推送错误事件\n yield {\n \"event\": \"tool_error\",\n \"id\": f\"evt_{trace_id}_error\",\n \"data\": {\n \"success\": False,\n \"status\": \"error\",\n \"error\": {\n \"code\": \"EXECUTION_ERROR\",\n \"message\": str(error)\n },\n \"metadata\": {\n \"tool_name\": tool_name,\n \"timestamp\": get_timestamp_iso8601(),\n \"trace_id\": trace_id\n }\n }\n }\n\n return _stream()\n\n def get_metrics(self) -> dict:\n \"\"\"获取可观测性指标\"\"\"\n return self.observability.get_metrics()\n\n def clear_cache(self) -> None:\n \"\"\"清空缓存\"\"\"\n self.cache.clear()\n\n\n# ==================== 命令行接口 ====================\n\ndef main():\n \"\"\"命令行入口\"\"\"\n parser = argparse.ArgumentParser(\n description=\"AGI Perception Node - Enhanced Tool Use Interface (2026)\"\n )\n\n subparsers = parser.add_subparsers(dest=\"command\", help=\"Available commands\")\n\n # call 命令\n call_parser = subparsers.add_parser(\"call\", help=\"Call a tool\")\n call_parser.add_argument(\"--tool\", required=True, help=\"Tool name\")\n call_parser.add_argument(\"--params\", required=True, help=\"JSON string of parameters\")\n call_parser.add_argument(\"--debug\", action=\"store_true\", help=\"Enable debug mode\")\n call_parser.add_argument(\"--no-cache\", action=\"store_true\", help=\"Disable cache\")\n call_parser.add_argument(\"--no-retry\", action=\"store_true\", help=\"Disable retry\")\n\n # test 命令\n test_parser = subparsers.add_parser(\"test\", help=\"Test the perception node\")\n test_parser.add_argument(\"--debug\", action=\"store_true\", help=\"Enable debug mode\")\n\n # metrics 命令\n metrics_parser = subparsers.add_parser(\"metrics\", help=\"Show metrics\")\n\n args = parser.parse_args()\n\n if args.command == \"call\":\n node = PerceptionNode()\n params = json.loads(args.params)\n\n options = {\n \"debug\": args.debug,\n \"enable_cache\": not args.no_cache,\n \"enable_retry\": not args.no_retry\n }\n\n result = node.call_tool(args.tool, params, **options)\n print(json.dumps(result, indent=2, ensure_ascii=False))\n\n elif args.command == \"test\":\n node = PerceptionNode()\n print(\"Testing Perception Node...\")\n print(f\"C Extension Available: {node.c_ext_available}\")\n\n # 测试各种工具\n tests = [\n (\"web_search\", {\"query\": \"AGI\"}),\n (\"get_weather\", {\"location\": \"Beijing\", \"unit\": \"celsius\"}),\n (\"calculator\", {\"expression\": \"2 + 3 * 4\"}),\n (\"search_documents\", {\"query\": \"AGI\", \"limit\": 10}),\n ]\n\n options = {\"debug\": args.debug}\n\n for tool_name, params in tests:\n print(f\"\\n{'='*60}\")\n print(f\"Testing {tool_name}:\")\n print(f\"{'='*60}\")\n result = node.call_tool(tool_name, params, **options)\n print(json.dumps(result, indent=2, ensure_ascii=False))\n\n # 显示指标\n print(f\"\\n{'='*60}\")\n print(\"Metrics:\")\n print(f\"{'='*60}\")\n print(json.dumps(node.get_metrics(), indent=2, ensure_ascii=False))\n\n elif args.command == \"metrics\":\n node = PerceptionNode()\n print(json.dumps(node.get_metrics(), indent=2, ensure_ascii=False))\n\n else:\n # 如果没有提供命令,显示帮助\n parser.print_help()\n\n\nif __name__ == \"__main__\":\n main()\n","content_type":"text/x-python; charset=utf-8","language":"python","size":27509,"content_sha256":"36a34872260a9b17df0932cf397e387cab45cdfefa12d9f62d521f3fd5019120"},{"filename":"scripts/personality_core_pure.py","content":"#!/usr/bin/env python3\n\"\"\"\nPersonality Core Pure Python Fallback\n\n当 C 扩展不可用时,提供纯 Python 实现的核心算法。\n所有函数与 personality_core.so 接口完全一致。\n\"\"\"\n\nimport math\nfrom typing import List\n\n\ndef normalize_weights(weights: List[float]) -> List[float]:\n \"\"\"\n 归一化马斯洛权重\n\n 参数:\n weights: 包含6个权重的列表 [physiological, safety, belonging, esteem, self_actualization, self_transcendence]\n\n 返回:\n 归一化后的权重列表\n \"\"\"\n if len(weights) != 6:\n raise ValueError(\"weights must have exactly 6 elements\")\n\n total = sum(weights)\n if total == 0:\n return [1/6] * 6\n\n return [w / total for w in weights]\n\n\ndef calculate_similarity(trait1: List[float], trait2: List[float]) -> float:\n \"\"\"\n 计算大五人格相似度\n\n 参数:\n trait1: 包含5个特质值的列表 [openness, conscientiousness, extraversion, agreeableness, neuroticism]\n trait2: 包含5个特质值的列表\n\n 返回:\n 相似度分数 (0.0-1.0),1.0表示完全相似\n \"\"\"\n if len(trait1) != 5 or len(trait2) != 5:\n raise ValueError(\"traits must have exactly 5 elements\")\n\n # 计算欧氏距离\n distance = math.sqrt(sum((a - b) ** 2 for a, b in zip(trait1, trait2)))\n\n # 转换为相似度 (距离越小,相似度越高)\n # 最大可能距离 = sqrt(5 * 1.0^2) = sqrt(5) ≈ 2.236\n similarity = 1.0 - (distance / 2.236)\n return max(0.0, similarity)\n\n\ndef compute_maslow_priority(maslow_weights: List[float], intent_weights: List[float]) -> float:\n \"\"\"\n 计算马斯洛优先级\n\n 参数:\n maslow_weights: 包含6个马斯洛权重的列表\n intent_weights: 包含6个意图权重的列表\n\n 返回:\n 加权优先级分数\n \"\"\"\n if len(maslow_weights) != 6 or len(intent_weights) != 6:\n raise ValueError(\"weights must have exactly 6 elements\")\n\n return sum(m * i for m, i in zip(maslow_weights, intent_weights))\n\n\ndef compute_all_scores(maslow_weights: List[float], intent_weights_list: List[List[float]]) -> List[float]:\n \"\"\"\n 批量计算所有优先级分数\n\n 参数:\n maslow_weights: 包含6个马斯洛权重的列表\n intent_weights_list: 包含多个意图权重的列表的列表\n\n 返回:\n 包含所有优先级分数的列表\n \"\"\"\n if len(maslow_weights) != 6:\n raise ValueError(\"maslow weights must have exactly 6 elements\")\n\n return [compute_maslow_priority(maslow_weights, intent) for intent in intent_weights_list]\n\n\n# 性能测试\nif __name__ == \"__main__\":\n import time\n\n # 测试归一化\n print(\"=== 测试 normalize_weights ===\")\n weights = [0.35, 0.35, 0.1, 0.1, 0.08, 0.02]\n normalized = normalize_weights(weights)\n print(f\"输入: {weights}\")\n print(f\"输出: {normalized}\")\n print(f\"总和: {sum(normalized):.6f}\")\n\n # 测试相似度\n print(\"\\n=== 测试 calculate_similarity ===\")\n trait1 = [0.6, 0.8, 0.4, 0.6, 0.5]\n trait2 = [0.5, 0.7, 0.5, 0.6, 0.4]\n similarity = calculate_similarity(trait1, trait2)\n print(f\"Trait 1: {trait1}\")\n print(f\"Trait 2: {trait2}\")\n print(f\"相似度: {similarity:.6f}\")\n\n # 测试优先级\n print(\"\\n=== 测试 compute_maslow_priority ===\")\n maslow = [0.35, 0.35, 0.1, 0.1, 0.08, 0.02]\n intent = [0.2, 0.3, 0.15, 0.15, 0.1, 0.1]\n priority = compute_maslow_priority(maslow, intent)\n print(f\"马斯洛权重: {maslow}\")\n print(f\"意图权重: {intent}\")\n print(f\"优先级: {priority:.6f}\")\n\n # 性能测试\n print(\"\\n=== 性能测试 ===\")\n n = 10000\n\n start = time.time()\n for _ in range(n):\n normalize_weights(weights)\n print(f\"归一化 {n} 次: {(time.time() - start) * 1000:.2f}ms\")\n\n start = time.time()\n for _ in range(n):\n calculate_similarity(trait1, trait2)\n print(f\"相似度计算 {n} 次: {(time.time() - start) * 1000:.2f}ms\")\n\n start = time.time()\n for _ in range(n):\n compute_maslow_priority(maslow, intent)\n print(f\"优先级计算 {n} 次: {(time.time() - start) * 1000:.2f}ms\")\n\n # 批量计算测试\n intent_list = [[0.2, 0.3, 0.15, 0.15, 0.1, 0.1] for _ in range(1000)]\n start = time.time()\n scores = compute_all_scores(maslow, intent_list)\n print(f\"批量计算 {len(intent_list)} 个优先级: {(time.time() - start) * 1000:.2f}ms\")\n print(f\"平均每个: {(time.time() - start) * 1000 / len(intent_list):.4f}ms\")\n","content_type":"text/x-python; charset=utf-8","language":"python","size":4499,"content_sha256":"cf9e662f1423ca8f0cf803e6b955b4436b8f8bbc8d4d9cd8ab6b10800a30a1c2"},{"filename":"scripts/personality_customizer.py","content":"#!/usr/bin/env python3\n\"\"\"\n人格自定义模式脚本\n\n功能:\n- 提供固定欢迎语\n- 显示7个问题\n- 解析用户答案(支持多种格式)\n- 基于答案生成人格配置\n- 原子写入人格文件\n- 生成配置摘要\n\n协议:AGPL-3.0\n作者:kiwifruit\n\"\"\"\n\nimport json\nimport os\nimport sys\nimport argparse\nimport shutil\nfrom typing import Dict, List, Optional, Tuple\nfrom datetime import datetime, timezone\n\n\nclass PersonalityCustomizer:\n \"\"\"人格自定义器\"\"\"\n \n # 文件路径\n PERSONALITY_FILE = \"./agi_memory/personality.json\"\n PERSONALITY_BACKUP = \"./agi_memory/personality.json.backup\"\n PERSONALITY_TMP = \"./agi_memory/personality.json.tmp\"\n HISTORY_FILE = \"./agi_memory/custom_history.json\"\n \n # 固定欢迎语\n WELCOME_MESSAGE = \"Hello! 亲爱的用户,下面即将进入人格自定义模式。请看问题然后把你依次填入的选项告诉我。\"\n \n # 7个问题\n QUESTIONS = \"\"\"1. 首先,让我知道你想如何称呼我?\nA. 塔斯 - 听起来很可靠\nB. 贾维斯 - 智能助手的感觉\nC. 伊迪斯 - 简洁而友好\n(请选择 A、B、C,或输入自定义名字)\n\n2. 当你面临未知的挑战时,第一反应通常是?\nA. 先全面了解信息,谨慎制定计划\nB. 愿意冒险尝试,在实践中快速调整\nC. 寻找折中方案,平衡风险和收益\n\n3. 关于社交倾向,你更偏向于?\nA. 独立工作,专注个人效率\nB. 团队协作,注重和谐氛围\nC. 灵活切换,根据需求调整\n\n4. 你偏好的沟通风格是?\nA. 专业严谨,详细说明,逻辑严密\nB. 轻松友好,简洁明了,注重感受\nC. 直接高效,不说废话,结果导向\n\n5. 关于学习新知识的方式,你更喜欢?\nA. 系统性学习,构建完整知识体系\nB. 实践导向,通过项目和案例学习\nC. 灵活多样,根据内容调整方法\n\n6. 在团队合作中,你最看重的是?\nA. 每个人的独立性和专业分工\nB. 团队和谐与协作氛围\nC. 高效达成共同目标\n\n7. 对于风险和不确定性,你的态度是?\nA. 尽量避免风险,优先安全稳定\nB. 可以承受一定风险,追求更高收益\nC. 灵活应对,根据情况权衡\n\n【请用逗号\",\"分隔你的7个答案,例如:贾维斯,A,B,C,A,B,C】\"\"\"\n \n # 基础值\n BIG_FIVE_BASE = {\n 'openness': 0.5,\n 'conscientiousness': 0.7,\n 'extraversion': 0.5,\n 'agreeableness': 0.6,\n 'neuroticism': 0.3\n }\n \n MASLOW_BASE = {\n 'physiological': 0.35,\n 'safety': 0.35,\n 'belonging': 0.1,\n 'esteem': 0.1,\n 'self_actualization': 0.08,\n 'self_transcendence': 0.02\n }\n \n # 称呼映射\n NICKNAME_MAP = {\n 'A': '塔斯',\n 'B': '贾维斯',\n 'C': '伊迪斯'\n }\n \n # 核心特质映射\n TRAITS_MAP = {\n 'A_Q1': ['谨慎可靠', '系统学习', '专业严谨'],\n 'B_Q1': ['智能专业', '主动创新', '技术导向'],\n 'C_Q1': ['简洁友好', '灵活适应', '高效执行'],\n 'A_Q2': ['谨慎', '系统化'],\n 'B_Q2': ['大胆', '创新'],\n 'C_Q2': ['平衡', '灵活'],\n 'A_Q3': ['独立', '专注'],\n 'B_Q3': ['协作', '和谐'],\n 'C_Q3': ['灵活', '适应'],\n 'A_Q4': ['专业', '严谨'],\n 'B_Q4': ['友好', '幽默'],\n 'C_Q4': ['高效', '直接'],\n 'A_Q5': ['系统', '深入'],\n 'B_Q5': ['实践', '经验'],\n 'C_Q5': ['灵活', '多样'],\n 'A_Q6': ['专业', '独立'],\n 'B_Q6': ['协作', '共情'],\n 'C_Q6': ['高效', '结果'],\n 'A_Q7': ['稳健', '保守'],\n 'B_Q7': ['勇敢', '创新'],\n 'C_Q7': ['平衡', '适应']\n }\n \n @staticmethod\n def get_welcome_message() -> str:\n \"\"\"返回固定欢迎语\"\"\"\n return PersonalityCustomizer.WELCOME_MESSAGE\n \n @staticmethod\n def get_questions() -> str:\n \"\"\"返回7个问题\"\"\"\n return PersonalityCustomizer.QUESTIONS\n \n @staticmethod\n def parse_answers(user_input: str) -> dict:\n \"\"\"\n 解析用户输入\n \n 支持的格式(用逗号分隔):\n 1. 简洁格式:贾维斯,A,B,C,A,B,C\n 2. 编号格式:1. 小米, 2. a, 3. c, 4. a, 5. b, 6. a, 7. b\n 3. 自定义名字:小明,A,B,C,A,B,C\n \n 返回:\n {\n 'answers': ['贾维斯', 'A', 'B', 'C', 'A', 'B', 'C'],\n 'auto_completed': True,\n 'completed_count': 5\n }\n \"\"\"\n if not user_input or not user_input.strip():\n return {\n 'answers': ['A'] * 7,\n 'auto_completed': True,\n 'completed_count': 7\n }\n \n # 统一使用中文逗号分割\n normalized = user_input.strip().replace(',', ',')\n \n # 按逗号分割\n parts = [p.strip() for p in normalized.split(',') if p.strip()]\n \n answers = []\n \n # 处理第一部分(问题1的昵称)\n if len(parts) > 0:\n part = parts[0]\n \n # 检查是否是编号格式(如 \"1. 小米\")\n if part[0].isdigit() and '.' in part:\n # 提取数字后面的内容\n dot_idx = part.find('.')\n part = part[dot_idx + 1:].strip()\n \n # 判断是否是选项A/B/C(单个字母)\n if part.upper() in ['A', 'B', 'C'] and len(part) == 1:\n answers.append(part.upper())\n # 否则作为自定义昵称\n else:\n answers.append(part)\n \n # 处理剩余部分(问题2-7的选项)\n for i in range(1, len(parts)):\n if len(answers) >= 7:\n break\n \n part = parts[i]\n \n # 检查是否是编号格式(如 \"2. A\")\n if part[0].isdigit() and '.' in part:\n # 提取数字后面的内容\n dot_idx = part.find('.')\n part = part[dot_idx + 1:].strip()\n \n # 只接受A/B/C(大小写不敏感)\n if part.upper() in ['A', 'B', 'C'] and len(part) == 1:\n answers.append(part.upper())\n # 忽略无效内容\n \n # 补全不足的答案\n auto_completed_count = max(0, 7 - len(answers))\n if auto_completed_count > 0:\n answers.extend(['A'] * auto_completed_count)\n \n return {\n 'answers': answers[:7], # 确保只有7个答案\n 'auto_completed': auto_completed_count > 0,\n 'completed_count': auto_completed_count\n }\n \n @staticmethod\n def generate_personality(answers: List[str]) -> dict:\n \"\"\"\n 基于7个答案生成完整人格配置\n \n 参数:\n answers: 7个答案的列表,问题1可以是自定义名字或A/B/C,问题2-7是A/B/C\n \n 返回:\n 完整的人格配置字典\n \"\"\"\n # 解析答案\n answer1 = answers[0].upper() if answers[0].upper() in ['A', 'B', 'C'] else answers[0]\n answer2 = answers[1].upper() if len(answers) > 1 else 'A'\n answer3 = answers[2].upper() if len(answers) > 2 else 'A'\n answer4 = answers[3].upper() if len(answers) > 3 else 'A'\n answer5 = answers[4].upper() if len(answers) > 4 else 'A'\n answer6 = answers[5].upper() if len(answers) > 5 else 'A'\n answer7 = answers[6].upper() if len(answers) > 6 else 'A'\n \n # 初始化基础值\n big_five = PersonalityCustomizer.BIG_FIVE_BASE.copy()\n maslow_weights = PersonalityCustomizer.MASLOW_BASE.copy()\n meta_traits = {}\n preferences = {}\n core_traits = []\n \n # 问题1:称呼\n if answer1 in PersonalityCustomizer.NICKNAME_MAP:\n user_nickname = PersonalityCustomizer.NICKNAME_MAP[answer1]\n trait_key = f'{answer1}_Q1'\n else:\n user_nickname = answer1\n # 自定义昵称,使用默认特质\n trait_key = 'A_Q1'\n \n if trait_key in PersonalityCustomizer.TRAITS_MAP:\n core_traits.extend(PersonalityCustomizer.TRAITS_MAP[trait_key])\n \n # 问题2:面对挑战\n if answer2 == 'A': # 谨慎计划\n big_five['openness'] = 0.4\n big_five['conscientiousness'] = 0.9\n maslow_weights['safety'] += 0.05\n risk_tolerance = 0.2\n core_traits.extend(['谨慎', '系统化'])\n elif answer2 == 'B': # 冒险尝试\n big_five['openness'] = 0.9\n big_five['conscientiousness'] = 0.5\n maslow_weights['safety'] -= 0.05\n risk_tolerance = 0.8\n core_traits.extend(['大胆', '创新'])\n else: # answer2 == 'C' - 平衡折中\n big_five['openness'] = 0.7\n big_five['conscientiousness'] = 0.7\n risk_tolerance = 0.5\n core_traits.extend(['平衡', '灵活'])\n \n # 问题3:社交倾向\n if answer3 == 'A': # 独立工作\n big_five['extraversion'] = 0.3\n big_five['agreeableness'] = 0.5\n maslow_weights['belonging'] = 0.08\n core_traits.extend(['独立', '专注'])\n elif answer3 == 'B': # 团队协作\n big_five['extraversion'] = 0.6\n big_five['agreeableness'] = 0.8\n maslow_weights['belonging'] = 0.15\n core_traits.extend(['协作', '和谐'])\n else: # answer3 == 'C' - 灵活切换\n big_five['extraversion'] = 0.5\n big_five['agreeableness'] = 0.7\n maslow_weights['belonging'] = 0.12\n core_traits.extend(['灵活', '适应'])\n \n # 问题4:沟通风格\n if answer4 == 'A': # 专业严谨\n preferences['response_style'] = 'formal'\n preferences['detail_level'] = 'detailed'\n big_five['conscientiousness'] += 0.1\n core_traits.extend(['专业', '严谨'])\n elif answer4 == 'B': # 轻松友好\n preferences['response_style'] = 'casual'\n preferences['detail_level'] = 'medium'\n big_five['agreeableness'] += 0.1\n core_traits.extend(['友好', '幽默'])\n else: # answer4 == 'C' - 直接高效\n preferences['response_style'] = 'balanced'\n preferences['detail_level'] = 'brief'\n big_five['extraversion'] += 0.1\n core_traits.extend(['高效', '直接'])\n \n # 问题5:学习方式\n curiosity = 0.7 # 默认值\n if answer5 == 'A': # 系统性学习\n preferences['learning_preference'] = 'systematic'\n curiosity = 0.6\n big_five['openness'] += 0.05\n core_traits.extend(['系统', '深入'])\n elif answer5 == 'B': # 实践导向\n preferences['learning_preference'] = 'practical'\n curiosity = 0.8\n big_five['openness'] += 0.1\n core_traits.extend(['实践', '经验'])\n else: # answer5 == 'C' - 灵活多样\n preferences['learning_preference'] = 'flexible'\n curiosity = 0.9\n big_five['openness'] += 0.15\n core_traits.extend(['灵活', '多样'])\n \n # 问题6:团队合作\n if answer6 == 'A': # 独立分工\n big_five['agreeableness'] = 0.5\n maslow_weights['esteem'] = 0.08\n core_traits.extend(['专业', '独立'])\n elif answer6 == 'B': # 和谐协作\n big_five['agreeableness'] = 0.9\n maslow_weights['esteem'] = 0.12\n core_traits.extend(['协作', '共情'])\n else: # answer6 == 'C' - 结果导向\n big_five['agreeableness'] = 0.7\n maslow_weights['esteem'] = 0.15\n core_traits.extend(['高效', '结果'])\n \n # 问题7:风险态度\n if answer7 == 'A': # 避免风险\n preferences['risk_tolerance'] = 0.15\n big_five['neuroticism'] = 0.2\n maslow_weights['safety'] += 0.10\n maslow_weights['self_actualization'] = max(0.01, maslow_weights['self_actualization'] - 0.05)\n core_traits.extend(['稳健', '保守'])\n elif answer7 == 'B': # 承受风险\n preferences['risk_tolerance'] = 0.7\n big_five['neuroticism'] = 0.4\n maslow_weights['safety'] -= 0.10\n maslow_weights['self_actualization'] += 0.10\n core_traits.extend(['勇敢', '创新'])\n else: # answer7 == 'C' - 灵活应对\n preferences['risk_tolerance'] = 0.5\n big_five['neuroticism'] = 0.3\n core_traits.extend(['平衡', '适应'])\n \n # 确保 risk_tolerance 在 preferences 中\n if 'risk_tolerance' not in preferences:\n preferences['risk_tolerance'] = 0.5\n \n # 范围保护:大五人格值裁剪到[0,1]\n for key in big_five:\n big_five[key] = max(0.0, min(1.0, big_five[key]))\n \n # 归一化马斯洛权重(确保总和为1.0)\n total_mw = sum(maslow_weights.values())\n if total_mw > 0:\n for key in maslow_weights:\n maslow_weights[key] /= total_mw\n \n # 计算meta_traits\n adaptability = (big_five['openness'] + big_five['extraversion']) / 2\n resilience = (1.0 - big_five['neuroticism'] + big_five['conscientiousness']) / 2\n moral_sense = big_five['agreeableness']\n \n meta_traits = {\n 'adaptability': max(0.0, min(1.0, adaptability)),\n 'resilience': max(0.0, min(1.0, resilience)),\n 'curiosity': max(0.0, min(1.0, curiosity)),\n 'moral_sense': max(0.0, min(1.0, moral_sense))\n }\n \n # 基于马斯洛权重确定 evolution_state\n max_weight = max(maslow_weights.items(), key=lambda x: x[1])\n level_map = {\n 'physiological': 'physiological',\n 'safety': 'safety',\n 'belonging': 'belonging',\n 'esteem': 'esteem',\n 'self_actualization': 'self_actualization',\n 'self_transcendence': 'self_transcendence'\n }\n \n evolution_state = {\n 'level': level_map.get(max_weight[0], 'physiological'),\n 'evolution_score': 0.0,\n 'phase': 'growth'\n }\n \n # 生成描述\n style_map = {\n 'formal': '专业严谨',\n 'casual': '轻松友好',\n 'balanced': '平衡高效'\n }\n learning_map = {\n 'systematic': '系统性学习',\n 'practical': '实践导向',\n 'flexible': '灵活多样'\n }\n \n style_desc = style_map.get(preferences.get('response_style', 'balanced'), '平衡')\n learning_desc = learning_map.get(preferences.get('learning_preference', 'flexible'), '灵活')\n \n # 去重核心特质\n unique_traits = []\n seen = set()\n for trait in core_traits:\n if trait not in seen:\n seen.add(trait)\n unique_traits.append(trait)\n \n traits_str = \"、\".join(unique_traits[:5]) # 最多显示5个特质\n description = f\"基于{traits_str}特质的个性化人格,偏好{style_desc}的沟通方式和{learning_desc}的学习方式。\"\n \n # 获取当前时间\n now = datetime.now(timezone.utc).isoformat()\n \n # 构建完整人格配置\n personality = {\n \"version\": \"1.0.0\",\n \"created_at\": now,\n \"updated_at\": now,\n \"update_source\": \"custom_init\",\n \n \"user_nickname\": user_nickname,\n \"description\": description,\n \n \"core_traits\": unique_traits[:8], # 最多8个特质\n \n \"big_five\": big_five,\n \"maslow_weights\": maslow_weights,\n \"meta_traits\": meta_traits,\n \n \"evolution_state\": evolution_state,\n \n \"preferences\": preferences,\n \n \"statistics\": {\n \"total_interactions\": 0,\n \"successful_interactions\": 0,\n \"last_interaction\": None,\n \"average_satisfaction\": 0.0\n }\n }\n \n return personality\n \n @staticmethod\n def write_personality(personality_data: dict) -> bool:\n \"\"\"\n 原子写入人格配置文件\n \n 流程:\n 1. 备份旧文件\n 2. 写入临时文件\n 3. 重命名(原子操作)\n \n 返回:\n True 表示成功,False 表示失败\n \"\"\"\n try:\n # 确保目录存在\n os.makedirs(os.path.dirname(PersonalityCustomizer.PERSONALITY_FILE), exist_ok=True)\n \n # 备份旧文件\n if os.path.exists(PersonalityCustomizer.PERSONALITY_FILE):\n shutil.copy(PersonalityCustomizer.PERSONALITY_FILE, PersonalityCustomizer.PERSONALITY_BACKUP)\n \n # 写入临时文件\n with open(PersonalityCustomizer.PERSONALITY_TMP, 'w', encoding='utf-8') as f:\n json.dump(personality_data, f, indent=2, ensure_ascii=False)\n \n # 重命名(原子操作)\n os.replace(PersonalityCustomizer.PERSONALITY_TMP, PersonalityCustomizer.PERSONALITY_FILE)\n \n return True\n except Exception as e:\n print(f\"写入人格配置失败: {e}\", file=sys.stderr)\n return False\n \n @staticmethod\n def get_summary(personality: dict) -> str:\n \"\"\"\n 生成配置摘要文本\n \n 参数:\n personality: 人格配置字典\n \n 返回:\n 摘要文本\n \"\"\"\n user_nickname = personality.get('user_nickname', '用户')\n core_traits = personality.get('core_traits', [])\n preferences = personality.get('preferences', {})\n \n style_map = {\n 'formal': '专业严谨',\n 'casual': '轻松友好',\n 'balanced': '平衡高效'\n }\n learning_map = {\n 'systematic': '系统性学习',\n 'practical': '实践导向',\n 'flexible': '灵活多样'\n }\n \n risk_map = {\n 0.0: '极低风险',\n 0.2: '低风险',\n 0.4: '中等偏低风险',\n 0.5: '中等风险',\n 0.6: '中等偏高风险',\n 0.8: '高风险',\n 1.0: '极高风险'\n }\n \n risk_tolerance = preferences.get('risk_tolerance', 0.5)\n response_style = style_map.get(preferences.get('response_style', 'balanced'), '平衡')\n learning_preference = learning_map.get(preferences.get('learning_preference', 'flexible'), '灵活')\n \n # 确定风险偏好\n if risk_tolerance \u003c= 0.3:\n risk_desc = '低风险'\n elif risk_tolerance \u003c= 0.6:\n risk_desc = '中等'\n else:\n risk_desc = '高风险'\n \n # 确定人格类型\n openness = personality.get('big_five', {}).get('openness', 0.5)\n conscientiousness = personality.get('big_five', {}).get('conscientiousness', 0.7)\n extraversion = personality.get('big_five', {}).get('extraversion', 0.5)\n \n if conscientiousness > 0.7 and risk_tolerance \u003c 0.4:\n personality_type = '谨慎稳重型'\n elif openness > 0.7 and risk_tolerance > 0.6:\n personality_type = '创新冒险型'\n elif extraversion > 0.6:\n personality_type = '社交活跃型'\n elif core_traits:\n personality_type = '个性化定制型'\n else:\n personality_type = '平衡适应型'\n \n traits_str = \"、\".join(core_traits[:5]) if core_traits else \"未设置\"\n \n summary = f\"\"\"📋 配置摘要:\n- 称呼:{user_nickname}\n- 核心特质:{traits_str}\n- 人格类型:{personality_type}\n- 沟通风格:{response_style}\n- 风险偏好:{risk_desc}\n- 学习方式:{learning_preference}\"\"\"\n \n return summary\n \n @staticmethod\n def record_history(answers: List[str], personality: dict) -> None:\n \"\"\"\n 记录自定义历史\n \n 参数:\n answers: 7个答案\n personality: 生成的人格配置\n \"\"\"\n try:\n # 加载现有历史\n history = {}\n if os.path.exists(PersonalityCustomizer.HISTORY_FILE):\n with open(PersonalityCustomizer.HISTORY_FILE, 'r', encoding='utf-8') as f:\n history = json.load(f)\n \n # 初始化结构\n if 'custom_records' not in history:\n history['custom_records'] = []\n \n # 创建记录\n record = {\n 'timestamp': datetime.now(timezone.utc).isoformat(),\n 'type': 'custom',\n 'source': 'root_command',\n 'answers': answers,\n 'user_nickname': personality.get('user_nickname', ''),\n 'core_traits': personality.get('core_traits', []),\n 'status': 'success'\n }\n \n # 添加记录\n history['custom_records'].append(record)\n history['custom_count'] = len(history['custom_records'])\n history['last_custom_time'] = datetime.now(timezone.utc).isoformat()\n \n # 保存历史\n with open(PersonalityCustomizer.HISTORY_FILE, 'w', encoding='utf-8') as f:\n json.dump(history, f, indent=2, ensure_ascii=False)\n except Exception as e:\n print(f\"记录历史失败: {e}\", file=sys.stderr)\n\n\ndef main():\n \"\"\"命令行入口\"\"\"\n parser = argparse.ArgumentParser(description=\"AGI Personality Customizer\")\n \n subparsers = parser.add_subparsers(dest=\"command\", help=\"Available commands\")\n \n # get-welcome 命令\n subparsers.add_parser(\"get-welcome\", help=\"Get welcome message\")\n \n # get-questions 命令\n subparsers.add_parser(\"get-questions\", help=\"Get questions\")\n \n # parse-answers 命令\n parse_parser = subparsers.add_parser(\"parse-answers\", help=\"Parse user answers\")\n parse_parser.add_argument(\"--input\", required=True, help=\"User input string\")\n \n # generate 命令\n generate_parser = subparsers.add_parser(\"generate\", help=\"Generate personality from answers\")\n generate_parser.add_argument(\"--answers\", required=True, help=\"7 answers separated by commas\")\n \n # write-personality 命令\n write_parser = subparsers.add_parser(\"write-personality\", help=\"Write personality to file\")\n write_parser.add_argument(\"--config\", required=True, help=\"Personality config as JSON string\")\n \n # get-summary 命令\n summary_parser = subparsers.add_parser(\"get-summary\", help=\"Get personality summary\")\n summary_parser.add_argument(\"--config\", required=True, help=\"Personality config as JSON string\")\n \n args = parser.parse_args()\n \n if args.command == \"get-welcome\":\n print(PersonalityCustomizer.get_welcome_message())\n \n elif args.command == \"get-questions\":\n print(PersonalityCustomizer.get_questions())\n \n elif args.command == \"parse-answers\":\n result = PersonalityCustomizer.parse_answers(args.input)\n print(json.dumps(result, ensure_ascii=False, indent=2))\n \n elif args.command == \"generate\":\n answers = [a.strip() for a in args.answers.split(',')]\n personality = PersonalityCustomizer.generate_personality(answers)\n print(json.dumps(personality, ensure_ascii=False, indent=2))\n \n elif args.command == \"write-personality\":\n config = json.loads(args.config)\n success = PersonalityCustomizer.write_personality(config)\n if success:\n print(json.dumps({\"success\": True}, ensure_ascii=False))\n else:\n print(json.dumps({\"success\": False}, ensure_ascii=False), file=sys.stderr)\n sys.exit(1)\n \n elif args.command == \"get-summary\":\n config = json.loads(args.config)\n summary = PersonalityCustomizer.get_summary(config)\n print(summary)\n \n else:\n parser.print_help()\n\n\nif __name__ == \"__main__\":\n main()\n","content_type":"text/x-python; charset=utf-8","language":"python","size":24593,"content_sha256":"df4169c7fe841c4d09d87972329bd37366ae2ce0a8f32458456a0ef487610371"},{"filename":"scripts/personality_layer_pure.py","content":"#!/usr/bin/env python3\n\"\"\"\n映射层数据支持模块(混合实现)\n\n核心算法使用 C 扩展(personality_core.so),业务逻辑使用 Python。\n如果 C 扩展不可用,自动降级到纯 Python 实现。\n\n包括:人格初始化、需求映射、人格更新、马斯洛权重计算等。\n\n注意:此模块是映射层的核心组件,负责存储和管理人格数据,不参与决策过程。\n决策由映射层基于马斯洛需求和人格特质做出。\n\"\"\"\n\nimport json\nimport os\nimport time\nfrom typing import Dict, Optional, List\nfrom dataclasses import dataclass, asdict\nfrom enum import Enum\n\n# 尝试加载 C 扩展,失败则使用纯 Python 实现\ntry:\n # 导入sys模块\n import sys\n \n # 获取当前脚本所在目录的父目录(scripts 目录)\n scripts_dir = os.path.dirname(os.path.abspath(__file__))\n core_dir = os.path.join(scripts_dir, 'personality_core')\n\n if core_dir not in sys.path:\n sys.path.insert(0, core_dir)\n\n import personality_core\n\n # 新增:显式验证是否真的加载了 C 扩展\n module_path = personality_core.__file__\n is_c_extension = module_path.endswith('.so') or module_path.endswith('.pyd')\n\n if is_c_extension:\n USE_C_EXT = True\n print(f\"✅ C 扩展已启用: {module_path}\")\n else:\n # 如果加载的是 Python 模块而不是 C 扩展,降级\n USE_C_EXT = False\n print(f\"⚠️ personality_core 加载成功但不是 C 扩展,降级到纯 Python: {module_path}\")\n \n # 导入纯 Python 实现\n from personality_core_pure import (\n normalize_weights as core_normalize_weights,\n calculate_similarity as core_calculate_similarity,\n compute_maslow_priority as core_compute_maslow_priority,\n compute_all_scores as core_compute_all_scores\n )\n\nexcept ImportError as e:\n USE_C_EXT = False\n print(f\"ℹ️ C 扩展加载失败,使用纯 Python 实现: {e}\")\n \n from personality_core_pure import (\n normalize_weights as core_normalize_weights,\n calculate_similarity as core_calculate_similarity,\n compute_maslow_priority as core_compute_maslow_priority,\n compute_all_scores as core_compute_all_scores\n )\n\n\nclass PersonalityType(Enum):\n \"\"\"预设人格类型\"\"\"\n CAUTIOUS_EXPLORER = \"谨慎探索型\"\n RADICAL_INNOVATOR = \"激进创新型\"\n BALANCED_STABLE = \"平衡稳重型\"\n\n\nclass MaslowLevel(Enum):\n \"\"\"马斯洛需求层级\"\"\"\n PHYSIOLOGICAL = \"physiological\"\n SAFETY = \"safety\"\n BELONGING = \"belonging\"\n ESTEEM = \"esteem\"\n SELF_ACTUALIZATION = \"self_actualization\"\n SELF_TRANSCENDENCE = \"self_transcendence\"\n\n\n@dataclass\nclass BigFive:\n \"\"\"大五人格\"\"\"\n openness: float = 0.5 # 开放性\n conscientiousness: float = 0.5 # 尽责性\n extraversion: float = 0.5 # 外向性\n agreeableness: float = 0.5 # 宜人性\n neuroticism: float = 0.3 # 神经质\n\n def to_dict(self) -> dict:\n return asdict(self)\n\n @classmethod\n def from_dict(cls, data: dict) -> 'BigFive':\n return cls(**data)\n\n\n@dataclass\nclass MaslowWeights:\n \"\"\"马斯洛需求权重\"\"\"\n physiological: float = 0.35\n safety: float = 0.35\n belonging: float = 0.1\n esteem: float = 0.1\n self_actualization: float = 0.08\n self_transcendence: float = 0.02\n\n def to_dict(self) -> dict:\n return asdict(self)\n\n @classmethod\n def from_dict(cls, data: dict) -> 'MaslowWeights':\n return cls(**data)\n\n def normalize(self):\n \"\"\"归一化权重,确保总和为1.0(使用 C 扩展加速)\"\"\"\n weights_list = [asdict(self)[key] for key in [\n 'physiological', 'safety', 'belonging', 'esteem',\n 'self_actualization', 'self_transcendence'\n ]]\n normalized = PersonalityLayer.normalize_weights(weights_list)\n\n # 更新权重值\n self.physiological = normalized[0]\n self.safety = normalized[1]\n self.belonging = normalized[2]\n self.esteem = normalized[3]\n self.self_actualization = normalized[4]\n self.self_transcendence = normalized[5]\n\n\n@dataclass\nclass MetaTraits:\n \"\"\"衍生特质\"\"\"\n adaptability: float = 0.5 # 适应性\n resilience: float = 0.5 # 韧性\n curiosity: float = 0.5 # 好奇心\n moral_sense: float = 0.5 # 道德感\n\n def to_dict(self) -> dict:\n return asdict(self)\n\n\n@dataclass\nclass EvolutionState:\n \"\"\"进化状态\"\"\"\n level: str = \"physiological\"\n evolution_score: float = 0.0\n phase: str = \"growth\"\n\n def to_dict(self) -> dict:\n return asdict(self)\n\n\n@dataclass\nclass Statistics:\n \"\"\"统计信息\"\"\"\n total_interactions: int = 0\n success_rate_by_need: dict = None\n\n def __post_init__(self):\n if self.success_rate_by_need is None:\n self.success_rate_by_need = {\n \"physiological\": 0.0,\n \"safety\": 0.0,\n \"belonging\": 0.0,\n \"esteem\": 0.0,\n \"self_actualization\": 0.0,\n \"self_transcendence\": 0.0\n }\n\n def to_dict(self) -> dict:\n return asdict(self)\n\n\n@dataclass\nclass Personality:\n \"\"\"完整人格配置\"\"\"\n user_nickname: str = \"塔斯\" # 用户对智能体的称呼\n big_five: BigFive = None\n maslow_weights: MaslowWeights = None\n meta_traits: MetaTraits = None\n evolution_state: EvolutionState = None\n statistics: Statistics = None\n version: str = \"2.0\"\n type: str = \"preset\"\n preset_name: str = \"谨慎探索型\"\n description: str = \"\"\n core_traits: List[str] = None\n last_updated: str = \"\"\n update_source: str = \"default_init\"\n\n def __post_init__(self):\n if self.big_five is None:\n self.big_five = BigFive()\n if self.maslow_weights is None:\n self.maslow_weights = MaslowWeights()\n if self.meta_traits is None:\n self.meta_traits = MetaTraits()\n if self.evolution_state is None:\n self.evolution_state = EvolutionState()\n if self.statistics is None:\n self.statistics = Statistics()\n if self.core_traits is None:\n self.core_traits = []\n if not self.last_updated:\n self.last_updated = time.strftime(\"%Y-%m-%dT%H:%M:%SZ\")\n\n def to_dict(self) -> dict:\n \"\"\"转换为字典\"\"\"\n return {\n \"user_nickname\": self.user_nickname,\n \"big_five\": self.big_five.to_dict(),\n \"maslow_weights\": self.maslow_weights.to_dict(),\n \"meta_traits\": self.meta_traits.to_dict(),\n \"evolution_state\": self.evolution_state.to_dict(),\n \"statistics\": self.statistics.to_dict(),\n \"version\": self.version,\n \"type\": self.type,\n \"preset_name\": self.preset_name,\n \"description\": self.description,\n \"core_traits\": self.core_traits,\n \"last_updated\": self.last_updated,\n \"update_source\": self.update_source\n }\n\n @classmethod\n def from_dict(cls, data: dict) -> 'Personality':\n \"\"\"从字典创建\"\"\"\n personality = cls()\n personality.user_nickname = data.get(\"user_nickname\", \"塔斯\")\n personality.big_five = BigFive.from_dict(data.get(\"big_five\", {}))\n personality.maslow_weights = MaslowWeights.from_dict(data.get(\"maslow_weights\", {}))\n personality.meta_traits = MetaTraits(**data.get(\"meta_traits\", {}))\n personality.evolution_state = EvolutionState(**data.get(\"evolution_state\", {}))\n personality.statistics = Statistics(**data.get(\"statistics\", {}))\n personality.version = data.get(\"version\", \"2.0\")\n personality.type = data.get(\"type\", \"preset\")\n personality.preset_name = data.get(\"preset_name\", \"谨慎探索型\")\n personality.description = data.get(\"description\", \"\")\n personality.core_traits = data.get(\"core_traits\", [])\n personality.last_updated = data.get(\"last_updated\", time.strftime(\"%Y-%m-%dT%H:%M:%SZ\"))\n personality.update_source = data.get(\"update_source\", \"default_init\")\n return personality\n\n\nclass PersonalityLayer:\n \"\"\"映射层数据支持管理器(混合实现)\n\n 注意:此模块负责管理人格数据,支持映射层进行决策,不直接参与决策过程。\n 核心算法使用 C 扩展加速,业务逻辑使用 Python 实现。\n \"\"\"\n\n # C 扩展使用标志\n USE_C_EXT = USE_C_EXT\n\n @staticmethod\n def normalize_weights(weights: List[float]) -> List[float]:\n \"\"\"归一化马斯洛权重\"\"\"\n if USE_C_EXT:\n return personality_core.normalize_weights(weights)\n else:\n return core_normalize_weights(weights)\n\n @staticmethod\n def calculate_similarity(trait1: List[float], trait2: List[float]) -> float:\n \"\"\"计算大五人格相似度\"\"\"\n if USE_C_EXT:\n return personality_core.calculate_similarity(trait1, trait2)\n else:\n return core_calculate_similarity(trait1, trait2)\n\n @staticmethod\n def compute_maslow_priority(maslow_weights: List[float], intent_weights: List[float]) -> float:\n \"\"\"计算马斯洛优先级\"\"\"\n if USE_C_EXT:\n return personality_core.compute_maslow_priority(maslow_weights, intent_weights)\n else:\n return core_compute_maslow_priority(maslow_weights, intent_weights)\n\n @staticmethod\n def compute_all_scores(maslow_weights: List[float], intent_weights_list: List[List[float]]) -> List[float]:\n \"\"\"批量计算优先级分数\"\"\"\n if USE_C_EXT:\n return personality_core.compute_all_scores(maslow_weights, intent_weights_list)\n else:\n return core_compute_all_scores(maslow_weights, intent_weights_list)\n\n # 预设人格配置\n PRESET_PERSONALITIES = {\n PersonalityType.CAUTIOUS_EXPLORER: {\n \"big_five\": BigFive(\n openness=0.6,\n conscientiousness=0.8,\n extraversion=0.4,\n agreeableness=0.6,\n neuroticism=0.5\n ),\n \"maslow_weights\": MaslowWeights(\n physiological=0.35,\n safety=0.35,\n belonging=0.1,\n esteem=0.1,\n self_actualization=0.08,\n self_transcendence=0.02\n ),\n \"description\": \"在保证安全的前提下,愿意尝试新事物\",\n \"core_traits\": [\"谨慎\", \"可靠\", \"愿意学习\"]\n },\n PersonalityType.RADICAL_INNOVATOR: {\n \"big_five\": BigFive(\n openness=0.9,\n conscientiousness=0.5,\n extraversion=0.8,\n agreeableness=0.4,\n neuroticism=0.3\n ),\n \"maslow_weights\": MaslowWeights(\n physiological=0.15,\n safety=0.15,\n belonging=0.15,\n esteem=0.20,\n self_actualization=0.30,\n self_transcendence=0.05\n ),\n \"description\": \"追求创新,愿意承担风险,挑战常规\",\n \"core_traits\": [\"创新\", \"冒险\", \"挑战\"]\n },\n PersonalityType.BALANCED_STABLE: {\n \"big_five\": BigFive(\n openness=0.5,\n conscientiousness=0.5,\n extraversion=0.5,\n agreeableness=0.5,\n neuroticism=0.3\n ),\n \"maslow_weights\": MaslowWeights(\n physiological=0.20,\n safety=0.20,\n belonging=0.20,\n esteem=0.20,\n self_actualization=0.15,\n self_transcendence=0.05\n ),\n \"description\": \"在各种需求之间保持平衡,追求稳定发展\",\n \"core_traits\": [\"平衡\", \"稳定\", \"协调\"]\n }\n }\n\n # 默认称呼列表\n DEFAULT_NICKNAMES = [\"塔斯\", \"贾维斯\", \"伊迪斯\"]\n\n def __init__(self, memory_dir: str = \"./agi_memory\"):\n \"\"\"\n 初始化人格层\n\n Args:\n memory_dir: 记忆存储目录\n \"\"\"\n self.memory_dir = memory_dir\n self.personality_file = os.path.join(memory_dir, \"personality.json\")\n self._personality: Optional[Personality] = None\n\n def init_from_preset(self, preset_type: PersonalityType, nickname: str = \"塔斯\") -> Personality:\n \"\"\"\n 从预设人格初始化\n\n Args:\n preset_type: 预设人格类型\n nickname: 用户称呼\n\n Returns:\n Personality: 初始化的人格对象\n \"\"\"\n preset = self.PRESET_PERSONALITIES[preset_type]\n\n personality = Personality()\n personality.user_nickname = nickname\n personality.big_five = preset[\"big_five\"]\n personality.maslow_weights = preset[\"maslow_weights\"]\n personality.description = preset[\"description\"]\n personality.core_traits = preset[\"core_traits\"]\n personality.preset_name = preset_type.value\n personality.type = \"preset\"\n personality.update_source = \"preset_init\"\n\n # 计算衍生特质\n personality.meta_traits = self._compute_meta_traits(personality)\n\n # 确定进化层级\n personality.evolution_state.level = self._determine_evolution_level(personality.maslow_weights)\n\n # 保存\n self._personality = personality\n self.save()\n\n return personality\n\n def init_from_dialogue(self, responses: dict, nickname: str = \"塔斯\") -> Personality:\n \"\"\"\n 从对话响应初始化人格\n\n Args:\n responses: 对话问题的响应\n nickname: 用户称呼\n\n Returns:\n Personality: 初始化的人格对象\n \"\"\"\n personality = Personality()\n personality.user_nickname = nickname\n personality.type = \"custom\"\n personality.update_source = \"dialogue_init\"\n\n # 基础人格向量(中值)\n personality.big_five = BigFive()\n personality.maslow_weights = MaslowWeights(\n physiological=0.25,\n safety=0.25,\n belonging=0.15,\n esteem=0.15,\n self_actualization=0.15,\n self_transcendence=0.05\n )\n\n # 分析对话响应\n self._analyze_responses(personality, responses)\n\n # 归一化\n personality.maslow_weights.normalize()\n\n # 计算衍生特质\n personality.meta_traits = self._compute_meta_traits(personality)\n\n # 确定人格类型\n personality.preset_name = self._determine_personality_type(personality)\n\n # 生成描述和核心特质\n personality.description = self._generate_description(personality)\n personality.core_traits = self._extract_core_traits(personality)\n\n # 确定进化层级\n personality.evolution_state.level = self._determine_evolution_level(personality.maslow_weights)\n personality.evolution_state.evolution_score = 0.05\n\n # 保存\n self._personality = personality\n self.save()\n\n return personality\n\n def load(self) -> Optional[Personality]:\n \"\"\"\n 加载人格配置\n\n Returns:\n Optional[Personality]: 人格对象,如果不存在返回None\n \"\"\"\n if not os.path.exists(self.personality_file):\n return None\n\n with open(self.personality_file, 'r', encoding='utf-8') as f:\n data = json.load(f)\n\n self._personality = Personality.from_dict(data)\n return self._personality\n\n def save(self):\n \"\"\"保存人格配置\"\"\"\n if self._personality is None:\n return\n\n os.makedirs(self.memory_dir, exist_ok=True)\n\n with open(self.personality_file, 'w', encoding='utf-8') as f:\n json.dump(self._personality.to_dict(), f, ensure_ascii=False, indent=2)\n\n def get(self) -> Optional[Personality]:\n \"\"\"\n 获取当前人格\n\n Returns:\n Optional[Personality]: 人格对象\n \"\"\"\n if self._personality is None:\n self.load()\n return self._personality\n\n def map_perception(self, perception: dict) -> dict:\n \"\"\"\n 将感知映射到马斯洛需求层次\n\n Args:\n perception: 感知数据\n\n Returns:\n dict: 需求映射结果\n \"\"\"\n if self._personality is None:\n self.load()\n\n if self._personality is None:\n return {}\n\n # 根据感知类型激活对应的需求\n need_activation = {\n \"physiological\": 0.0,\n \"safety\": 0.0,\n \"belonging\": 0.0,\n \"esteem\": 0.0,\n \"self_actualization\": 0.0,\n \"self_transcendence\": 0.0\n }\n\n perception_type = perception.get(\"type\", \"\")\n\n # 简化的映射逻辑\n if \"threat\" in perception_type or \"danger\" in perception_type:\n need_activation[\"safety\"] = 0.9\n elif \"challenge\" in perception_type or \"task\" in perception_type:\n need_activation[\"self_actualization\"] = 0.8\n elif \"social\" in perception_type or \"team\" in perception_type:\n need_activation[\"belonging\"] = 0.8\n elif \"achievement\" in perception_type or \"goal\" in perception_type:\n need_activation[\"esteem\"] = 0.8\n\n # 根据人格特质调整激活强度\n for key in need_activation:\n need_activation[key] *= self._personality.maslow_weights.__getattribute__(key) * 2\n\n return {\n \"need_activation\": need_activation,\n \"dominant_need\": max(need_activation, key=need_activation.get)\n }\n\n def update_personality(self, insight: dict, effectiveness: float):\n \"\"\"\n 基于哲学洞察更新人格\n\n Args:\n insight: 哲学洞察\n effectiveness: 有效性分数(0-10)\n \"\"\"\n if self._personality is None:\n self.load()\n\n if self._personality is None:\n return\n\n # 计算调整系数\n intensity = insight.get(\"intensity\", 0.5)\n maslow_alignment = insight.get(\"maslow_alignment\", 0.5)\n adjustment_coefficient = intensity * maslow_alignment\n\n # 哲学深度决定调整幅度\n philosophical_depth = insight.get(\"philosophical_depth\", 0.5)\n if philosophical_depth > 0.8:\n magnitude = 0.10 # 哲学级调整\n elif philosophical_depth > 0.5:\n magnitude = 0.05 # 经验级调整\n else:\n magnitude = 0.02 # 微调\n\n delta = adjustment_coefficient * magnitude\n\n # 根据洞察类型调整人格维度\n insight_type = insight.get(\"type\", \"\")\n trait_mapping = {\n \"preference_pattern\": \"openness\",\n \"efficiency_improvement\": \"conscientiousness\",\n \"social_feedback\": \"agreeableness\",\n \"uncertainty_handling\": \"neuroticism\",\n \"engagement_pattern\": \"extraversion\"\n }\n\n target_trait = trait_mapping.get(insight_type, None)\n if target_trait:\n current_value = self._personality.big_five.__getattribute__(target_trait)\n new_value = min(current_value + delta, 1.0)\n self._personality.big_five.__setattr__(target_trait, new_value)\n\n # 更新马斯洛权重(螺旋上升)\n if maslow_alignment >= 0.7:\n for level in [\"self_actualization\", \"self_transcendence\"]:\n current_weight = self._personality.maslow_weights.__getattribute__(level)\n self._personality.maslow_weights.__setattr__(level, current_weight * (1 + delta * 0.1))\n\n # 归一化\n self._personality.maslow_weights.normalize()\n\n # 重新计算衍生特质\n self._personality.meta_traits = self._compute_meta_traits(self._personality)\n\n # 更新进化状态\n self._personality.evolution_state.evolution_score += 0.01\n self._personality.evolution_state.level = self._determine_evolution_level(\n self._personality.maslow_weights\n )\n\n # 更新时间戳\n self._personality.last_updated = time.strftime(\"%Y-%m-%dT%H:%M:%SZ\")\n self._personality.update_source = \"philosophical_insight\"\n\n # 保存\n self.save()\n\n def _analyze_responses(self, personality: Personality, responses: dict):\n \"\"\"分析对话响应并调整人格\"\"\"\n # 分析问题1:冒险倾向\n q1 = responses.get('q1', '').upper()\n if 'A' in q1 or '谨慎' in q1:\n personality.big_five.conscientiousness += 0.2\n personality.big_five.neuroticism += 0.1\n personality.maslow_weights.safety += 0.1\n elif 'B' in q1 or '尝试' in q1:\n personality.big_five.openness += 0.2\n personality.big_five.extraversion += 0.1\n personality.maslow_weights.self_actualization += 0.1\n elif 'C' in q1 or '平衡' in q1:\n personality.big_five.agreeableness += 0.1\n\n # 分析问题2:对话风格\n q2 = responses.get('q2', '').upper()\n if 'A' in q2 or '严谨' in q2 or '逻辑' in q2:\n personality.big_five.conscientiousness += 0.15\n personality.maslow_weights.esteem += 0.05\n elif 'B' in q2 or '幽默' in q2 or '友好' in q2:\n personality.big_five.extraversion += 0.15\n personality.big_five.agreeableness += 0.1\n personality.maslow_weights.belonging += 0.1\n elif 'C' in q2 or '高效' in q2:\n personality.big_five.conscientiousness += 0.1\n personality.maslow_weights.safety += 0.05\n\n # 分析问题3:学习方式\n q3 = responses.get('q3', '').upper()\n if 'A' in q3 or '系统' in q3:\n personality.big_five.conscientiousness += 0.15\n personality.maslow_weights.esteem += 0.05\n elif 'B' in q3 or '实践' in q3 or '案例' in q3:\n personality.big_five.openness += 0.1\n personality.maslow_weights.self_actualization += 0.05\n elif 'C' in q3 or '灵活' in q3:\n personality.big_five.openness += 0.1\n\n # 分析问题4:团队偏好\n q4 = responses.get('q4', '').upper()\n if 'A' in q4 or '独立' in q4 or '专业' in q4:\n personality.big_five.conscientiousness += 0.1\n personality.maslow_weights.esteem += 0.05\n elif 'B' in q4 or '和谐' in q4 or '协作' in q4:\n personality.big_five.agreeableness += 0.2\n personality.maslow_weights.belonging += 0.1\n elif 'C' in q4 or '结果' in q4 or '高效' in q4:\n personality.big_five.conscientiousness += 0.15\n personality.maslow_weights.self_actualization += 0.05\n\n # 分析问题5:问题解决风格\n q5 = responses.get('q5', '').upper()\n if 'A' in q5 or '保守' in q5 or '稳妥' in q5:\n personality.big_five.conscientiousness += 0.2\n personality.maslow_weights.safety += 0.15\n elif 'B' in q5 or '创新' in q5 or '突破' in q5:\n personality.big_five.openness += 0.25\n personality.maslow_weights.self_actualization += 0.15\n personality.maslow_weights.self_transcendence += 0.05\n elif 'C' in q5 or '平衡' in q5:\n personality.big_five.agreeableness += 0.1\n\n # 归一化人格向量\n for attr in ['openness', 'conscientiousness', 'extraversion', 'agreeableness', 'neuroticism']:\n value = getattr(personality.big_five, attr)\n setattr(personality.big_five, attr, max(0.0, min(1.0, value)))\n\n def _compute_meta_traits(self, personality: Personality) -> MetaTraits:\n \"\"\"计算衍生特质\"\"\"\n bf = personality.big_five\n mw = personality.maslow_weights\n\n adaptability = (\n bf.openness * 0.4 +\n (1 - bf.neuroticism) * 0.3 +\n (mw.self_actualization + mw.self_transcendence) * 0.3\n )\n\n resilience = (\n bf.conscientiousness * 0.4 +\n bf.agreeableness * 0.3 +\n mw.safety * 0.3\n )\n\n curiosity = (\n bf.openness * 0.5 +\n bf.extraversion * 0.3 +\n mw.self_actualization * 0.2\n )\n\n moral_sense = (\n bf.agreeableness * 0.4 +\n bf.conscientiousness * 0.4 +\n mw.esteem * 0.2\n )\n\n return MetaTraits(\n adaptability=round(adaptability, 3),\n resilience=round(resilience, 3),\n curiosity=round(curiosity, 3),\n moral_sense=round(moral_sense, 3)\n )\n\n def _determine_personality_type(self, personality: Personality) -> str:\n \"\"\"确定人格类型\"\"\"\n bf = personality.big_five\n\n if bf.conscientiousness > 0.7 and bf.neuroticism \u003c 0.5:\n return \"谨慎探索型\"\n elif bf.openness > 0.7:\n return \"激进创新型\"\n else:\n return \"平衡稳重型\"\n\n def _generate_description(self, personality: Personality) -> str:\n \"\"\"生成人格描述\"\"\"\n bf = personality.big_five\n traits = []\n\n if bf.conscientiousness > 0.7:\n traits.append(\"谨慎可靠\")\n if bf.openness > 0.7:\n traits.append(\"乐于创新\")\n if bf.agreeableness > 0.7:\n traits.append(\"善于合作\")\n if bf.extraversion > 0.7:\n traits.append(\"活跃互动\")\n\n if not traits:\n traits.append(\"平衡稳重\")\n\n return f\"基于您的偏好生成的个性化人格,特点是{'、'.join(traits)}\"\n\n def _extract_core_traits(self, personality: Personality) -> List[str]:\n \"\"\"提取核心特质\"\"\"\n bf = personality.big_five\n traits = []\n\n trait_map = {\n 'openness': '开放探索',\n 'conscientiousness': '严谨可靠',\n 'extraversion': '积极互动',\n 'agreeableness': '协作友善',\n 'neuroticism': '敏感谨慎'\n }\n\n # 提取得分最高的3个特质\n sorted_traits = sorted([\n ('openness', bf.openness),\n ('conscientiousness', bf.conscientiousness),\n ('extraversion', bf.extraversion),\n ('agreeableness', bf.agreeableness),\n ('neuroticism', bf.neuroticism)\n ], key=lambda x: x[1], reverse=True)\n\n for trait_name, value in sorted_traits[:3]:\n if value > 0.5:\n traits.append(trait_map[trait_name])\n\n if len(traits) \u003c 3:\n traits.append('持续学习')\n\n return traits\n\n def _determine_evolution_level(self, maslow_weights: MaslowWeights) -> str:\n \"\"\"确定进化层级\"\"\"\n weights = maslow_weights.to_dict()\n\n max_weight = max(weights.values())\n\n if weights[\"self_transcendence\"] == max_weight:\n return \"self_transcendence\"\n elif weights[\"self_actualization\"] == max_weight:\n return \"self_actualization\"\n elif weights[\"esteem\"] == max_weight:\n return \"esteem\"\n elif weights[\"belonging\"] == max_weight:\n return \"belonging\"\n elif weights[\"safety\"] == max_weight:\n return \"safety\"\n else:\n return \"physiological\"\n\n def is_initialized(self) -> bool:\n \"\"\"检查人格是否已初始化\"\"\"\n return os.path.exists(self.personality_file)\n\n def decide_self_correction(self, objectivity_metric: dict, context: dict = None) -> dict:\n \"\"\"\n 映射层决策辅助:提供人格数据用于决策\n\n 注意:此方法仅提供人格数据支持,实际决策权在映射层。\n 映射层基于马斯洛需求层次和人格特质做出最终决策。\n \n Args:\n objectivity_metric: 客观性评估结果\n context: 上下文信息\n \n Returns:\n dict: 人格数据供映射层决策使用\n \"\"\"\n if self._personality is None:\n self.load()\n\n if self._personality is None:\n return {\n 'should_correct': False,\n 'reason': '人格未初始化',\n 'confidence': 0.0\n }\n\n # 提取客观性指标\n is_appropriate = objectivity_metric.get('is_appropriate', True)\n gap = objectivity_metric.get('gap', 0.0)\n severity = objectivity_metric.get('severity', 'none')\n objectivity_score = objectivity_metric.get('objectivity_score', 1.0)\n subjectivity_score = objectivity_metric.get('subjectivity_score', 0.0)\n\n # 基于人格特质调整决策阈值\n # 谨慎型人格对不适切性更敏感\n if '谨慎' in self._personality.preset_name or self._personality.big_five.conscientiousness > 0.7:\n gap_threshold = 0.1\n # 激进型人格容忍度较高\n elif '激进' in self._personality.preset_name or self._personality.big_five.openness > 0.7:\n gap_threshold = 0.3\n # 平衡型人格使用中等阈值\n else:\n gap_threshold = 0.2\n\n # 严重程度调整\n severity_multiplier = {\n 'none': 0.0,\n 'mild': 0.5,\n 'moderate': 1.0,\n 'severe': 2.0\n }\n effective_gap = gap * severity_multiplier.get(severity, 1.0)\n\n # 基于场景类型的权重调整\n context_type = context.get('type', 'general') if context else 'general'\n critical_contexts = ['scientific', 'legal', 'medical', 'technical']\n if context_type in critical_contexts:\n # 关键场景更严格\n effective_gap *= 1.5\n\n # 决策逻辑\n should_correct = effective_gap > gap_threshold\n\n # 计算决策置信度\n if severity == 'severe':\n confidence = 0.95\n elif severity == 'moderate':\n confidence = 0.8\n elif severity == 'mild':\n confidence = 0.6\n else:\n confidence = 0.3\n\n # 生成决策理由\n reasons = []\n if not is_appropriate:\n reasons.append(f\"客观性不适切(差距:{gap:.2f})\")\n if severity != 'none':\n reasons.append(f\"严重程度:{severity}\")\n if effective_gap > gap_threshold:\n reasons.append(f\"有效差距({effective_gap:.2f})超过阈值({gap_threshold:.2f})\")\n \n # 考虑人格特质对决策的影响\n trait_influence = []\n if self._personality.big_five.conscientiousness > 0.7:\n trait_influence.append(\"谨慎特质倾向于纠错\")\n if self._personality.big_five.openness > 0.7:\n trait_influence.append(\"开放特质容忍不确定性\")\n\n return {\n 'should_correct': should_correct,\n 'gap': gap,\n 'effective_gap': effective_gap,\n 'gap_threshold': gap_threshold,\n 'severity': severity,\n 'confidence': confidence,\n 'reason': '; '.join(reasons) if reasons else '无需纠错',\n 'trait_influence': trait_influence,\n 'personality_type': self._personality.preset_name,\n 'timestamp': time.strftime(\"%Y-%m-%dT%H:%M:%SZ\")\n }\n\n\n# ===== 命令行接口 =====\n\ndef main():\n \"\"\"命令行测试接口\"\"\"\n print(\"=== 人格层纯Python实现(测试模式) ===\\n\")\n\n layer = PersonalityLayer()\n\n # 测试预设人格初始化\n print(\"测试1:从预设人格初始化\")\n personality = layer.init_from_preset(\n PersonalityType.CAUTIOUS_EXPLORER,\n nickname=\"塔斯\"\n )\n print(f\"用户称呼: {personality.user_nickname}\")\n print(f\"人格类型: {personality.preset_name}\")\n print(f\"核心特质: {', '.join(personality.core_traits)}\")\n print()\n\n # 测试加载\n print(\"测试2:加载人格配置\")\n loaded = layer.load()\n print(f\"加载成功: {loaded is not None}\")\n print(f\"用户称呼: {loaded.user_nickname}\")\n print()\n\n # 测试对话初始化\n print(\"测试3:从对话初始化\")\n responses = {\n 'q1': 'A',\n 'q2': 'B',\n 'q3': 'C',\n 'q4': 'A',\n 'q5': 'C'\n }\n personality = layer.init_from_dialogue(responses, nickname=\"贾维斯\")\n print(f\"用户称呼: {personality.user_nickname}\")\n print(f\"人格类型: {personality.preset_name}\")\n print(f\"描述: {personality.description}\")\n print()\n\n # 测试感知映射\n print(\"测试4:感知映射\")\n perception = {\"type\": \"task_challenge\"}\n mapping = layer.map_perception(perception)\n print(f\"主导需求: {mapping.get('dominant_need')}\")\n print()\n\n print(\"=== 所有测试完成 ===\")\n\n\nif __name__ == \"__main__\":\n main()\n","content_type":"text/x-python; charset=utf-8","language":"python","size":32928,"content_sha256":"f544f7bfb144eaa49639e7e5dbeb42b286c99cc49ad2f5e3a0d5aea244b09ae9"},{"filename":"scripts/show_help.py","content":"#!/usr/bin/env python3\n\"\"\"\n认知架构洞察组件 V2 帮助查看器(精简版)\n专注于快速查询\n\"\"\"\n\nimport sys\nimport os\n\n# 添加 scripts 目录到路径\nsys.path.insert(0, os.path.dirname(__file__))\n\nfrom cognitive_insight_help import CognitiveInsightHelp, show_help\n\n\ndef print_menu():\n \"\"\"打印菜单\"\"\"\n print(\"=\" * 80)\n print(\"认知架构洞察组件 V2 帮助查看器\")\n print(\"=\" * 80)\n print()\n print(\"请选择操作:\")\n print(\" 1. 查看完整帮助\")\n print(\" 2. 查看 API 参考\")\n print(\" 3. 查看常见问题 (FAQ)\")\n print(\" 4. 查看故障排查\")\n print(\" 5. 查看版本信息\")\n print(\" 0. 退出\")\n print()\n\n\ndef show_api_reference(helper: CognitiveInsightHelp):\n \"\"\"显示 API 参考\"\"\"\n print(\"\\n\" + \"=\" * 80)\n print(\"API 参考\")\n print(\"=\" * 80 + \"\\n\")\n \n api_ref = helper.get_help()['api_reference']\n \n for class_name, class_info in api_ref.items():\n print(f\"【{class_name}】\")\n print()\n \n if '描述' in class_info:\n print(f\" {class_info['描述']}\")\n print()\n \n if '初始化' in class_info:\n print(\" 初始化:\")\n init_info = class_info['初始化']\n print(f\" 方法: {init_info['方法']}\")\n print(f\" 参数:\")\n for param, desc in init_info['参数'].items():\n print(f\" {param}: {desc}\")\n print(f\" 返回: {init_info['返回']}\")\n print()\n \n if '核心方法' in class_info:\n print(\" 核心方法:\")\n for method_info in class_info['核心方法']:\n print(f\" 方法: {method_info['方法']}\")\n print(f\" 描述: {method_info['描述']}\")\n if '参数' in method_info:\n print(f\" 参数:\")\n for param, desc in method_info['参数'].items():\n print(f\" {param}: {desc}\")\n if '返回' in method_info:\n print(f\" 返回: {method_info['返回']}\")\n print()\n \n print()\n \n input(\"\\n按 Enter 键返回菜单...\")\n\n\ndef show_faq(helper: CognitiveInsightHelp):\n \"\"\"显示常见问题\"\"\"\n print(\"\\n\" + \"=\" * 80)\n print(\"常见问题 (FAQ)\")\n print(\"=\" * 80 + \"\\n\")\n \n faq = helper.get_help()['faq']\n \n for item in faq:\n print(item['问题'])\n print(item['回答'])\n print()\n \n input(\"\\n按 Enter 键返回菜单...\")\n\n\ndef show_troubleshooting(helper: CognitiveInsightHelp):\n \"\"\"显示故障排查\"\"\"\n print(\"\\n\" + \"=\" * 80)\n print(\"故障排查\")\n print(\"=\" * 80 + \"\\n\")\n \n troubleshooting = helper.get_help()['troubleshooting']\n \n for idx, issue in enumerate(troubleshooting['常见问题'], 1):\n print(f\"{idx}. {issue['问题']}\")\n print()\n print(\" 可能原因:\")\n for cause in issue['可能原因']:\n print(f\" • {cause}\")\n print()\n print(\" 解决方案:\")\n for solution in issue['解决方案']:\n print(f\" • {solution}\")\n print()\n print(\"-\" * 80)\n print()\n \n input(\"\\n按 Enter 键返回菜单...\")\n\n\ndef show_version_info(helper: CognitiveInsightHelp):\n \"\"\"显示版本信息\"\"\"\n print(\"\\n\" + \"=\" * 80)\n print(\"版本信息\")\n print(\"=\" * 80 + \"\\n\")\n \n help_data = helper.get_help()\n \n print(f\"版本: {help_data['version']}\")\n print(f\"作者: {help_data['author']}\")\n print(f\"协议: {help_data['license']}\")\n print()\n print(help_data['description'])\n \n input(\"\\n按 Enter 键返回菜单...\")\n\n\ndef main():\n \"\"\"主函数\"\"\"\n helper = CognitiveInsightHelp()\n \n while True:\n print_menu()\n \n choice = input(\"请输入选项 (0-5): \").strip()\n \n if choice == '0':\n print(\"\\n感谢使用认知架构洞察组件 V2 帮助查看器!\")\n break\n elif choice == '1':\n helper.print_help()\n input(\"\\n按 Enter 键返回菜单...\")\n elif choice == '2':\n show_api_reference(helper)\n elif choice == '3':\n show_faq(helper)\n elif choice == '4':\n show_troubleshooting(helper)\n elif choice == '5':\n show_version_info(helper)\n else:\n print(\"\\n无效选项,请重新输入!\")\n input(\"\\n按 Enter 键继续...\")\n\n\nif __name__ == \"__main__\":\n try:\n main()\n except KeyboardInterrupt:\n print(\"\\n\\n感谢使用认知架构洞察组件 V2 帮助查看器!\")\n except Exception as e:\n print(f\"\\n发生错误: {e}\")\n sys.exit(1)\n","content_type":"text/x-python; charset=utf-8","language":"python","size":4782,"content_sha256":"9d4afdb9d8f940593a5c8301f96767376b14512462ec6c0074af0d4024b060bc"},{"filename":"scripts/strategy_selector.py","content":"#!/usr/bin/env python3\n\"\"\"\n策略选择器(四步纠错法的智能增强)\n\n负责智能决策:\n1. 是否需要纠错\n2. 选择纠错策略\n3. 确定优先级\n4. 生成执行建议\n\n特点:\n- 基于场景敏感度决策\n- 考虑人格偏好\n- 避免过度纠错\n- 提供可操作的建议\n\"\"\"\n\nfrom typing import Dict, Optional, List\nfrom dataclasses import dataclass, asdict\nfrom enum import Enum\n\n\nclass Strategy(Enum):\n \"\"\"纠错策略\"\"\"\n SKIP = \"skip\" # 跳过纠错\n SOFT = \"soft\" # 软性建议(提示用户验证)\n CORRECT = \"correct\" # 直接修正\n RECONSTRUCT = \"reconstruct\" # 重构推理链\n\n\n@dataclass\nclass StrategyDecision:\n \"\"\"策略决策\"\"\"\n should_correct: bool # 是否需要纠错\n strategy: Strategy # 纠错策略\n priority: int # 优先级(0-10)\n reason: str # 决策理由\n confidence: float # 决策置信度(0-1)\n suggested_actions: List[str] # 建议的纠错动作\n\n def to_dict(self) -> dict:\n result = asdict(self)\n result['strategy'] = self.strategy.value\n return result\n\n\nclass StrategySelector:\n \"\"\"\n 策略选择器\n \n 基于客观性标注、场景类型和人格特质,智能决策是否纠错及如何纠错。\n \"\"\"\n\n def __init__(self):\n # 场景客观性要求\n self.context_requirements = {\n 'scientific': 0.9,\n 'legal': 0.85,\n 'medical': 0.9,\n 'technical': 0.8,\n 'general': 0.6,\n 'creative': 0.3,\n 'emotional': 0.2,\n 'artistic': 0.1,\n }\n\n # 场景类型对应的纠错策略偏好\n self.context_strategy_preference = {\n 'scientific': [Strategy.RECONSTRUCT, Strategy.CORRECT],\n 'legal': [Strategy.RECONSTRUCT, Strategy.CORRECT],\n 'medical': [Strategy.RECONSTRUCT, Strategy.CORRECT],\n 'technical': [Strategy.CORRECT, Strategy.SOFT],\n 'general': [Strategy.SOFT, Strategy.CORRECT],\n 'creative': [Strategy.SKIP, Strategy.SOFT],\n 'emotional': [Strategy.SKIP, Strategy.SOFT],\n 'artistic': [Strategy.SKIP, Strategy.SOFT],\n }\n\n def select_strategy(\n self,\n objectivity_metric: Dict,\n context_type: str,\n personality_type: Optional[str] = None,\n learning_stage: Optional[dict] = None\n ) -> StrategyDecision:\n \"\"\"\n 选择纠错策略(四步决策法)\n \n Args:\n objectivity_metric: 客观性标注\n context_type: 场景类型\n personality_type: 人格类型(可选)\n learning_stage: 学习阶段(可选)\n \n Returns:\n StrategyDecision: 策略决策\n \"\"\"\n # 步骤1:判断是否需要纠错\n should_correct = self._should_correct(objectivity_metric, context_type)\n \n if not should_correct:\n return StrategyDecision(\n should_correct=False,\n strategy=Strategy.SKIP,\n priority=0,\n reason=f\"{context_type}场景下,客观性评分{objectivity_metric['objectivity_score']:.2f}符合要求\",\n confidence=0.9,\n suggested_actions=[]\n )\n \n # 步骤2:选择纠错策略\n strategy = self._select_correction_strategy(\n objectivity_metric,\n context_type,\n personality_type\n )\n \n # 步骤3:确定优先级\n priority = self._determine_priority(\n objectivity_metric,\n context_type,\n personality_type\n )\n \n # 步骤4:生成建议动作\n suggested_actions = self._generate_suggested_actions(\n strategy,\n objectivity_metric,\n context_type\n )\n \n # 生成决策理由\n reason = self._generate_decision_reason(\n objectivity_metric,\n context_type,\n strategy,\n priority\n )\n \n # 计算置信度\n confidence = self._calculate_confidence(\n objectivity_metric,\n context_type,\n personality_type\n )\n \n return StrategyDecision(\n should_correct=True,\n strategy=strategy,\n priority=priority,\n reason=reason,\n confidence=confidence,\n suggested_actions=suggested_actions\n )\n\n def _should_correct(self, objectivity_metric: Dict, context_type: str) -> bool:\n \"\"\"\n 步骤1:判断是否需要纠错\n \n 基于偏差幅度和场景适切性判断。\n \"\"\"\n objectivity_score = objectivity_metric['objectivity_score']\n required_objectivity = objectivity_metric['required_objectivity']\n gap = objectivity_metric['gap']\n severity = objectivity_metric['severity']\n \n # 情况1:客观性评分低于要求\n if objectivity_score \u003c required_objectivity:\n # 判断偏差幅度\n if gap > 0.3: # 大幅偏差\n return True\n elif gap > 0.1: # 中等偏差\n # 严格场景必须纠错,宽松场景可跳过\n required = self.context_requirements.get(context_type, 0.5)\n if required >= 0.7: # 严格场景\n return True\n else: # 宽松场景\n return severity in ['severe', 'moderate']\n \n # 情况2:检测到严重主观性特征\n subjectivity_dims = objectivity_metric.get('subjectivity_dimensions', {})\n hallucination_score = subjectivity_dims.get('hallucination', 0.0)\n if hallucination_score > 0.7: # 严重幻觉倾向\n return True\n \n # 情况3:适度偏差 + 严格场景\n if gap > 0.05 and severity in ['moderate', 'severe']:\n required = self.context_requirements.get(context_type, 0.5)\n if required >= 0.8: # 极严格场景(scientific, legal, medical)\n return True\n \n # 其他情况:跳过纠错\n return False\n\n def _select_correction_strategy(\n self,\n objectivity_metric: Dict,\n context_type: str,\n personality_type: Optional[str] = None\n ) -> Strategy:\n \"\"\"\n 步骤2:选择纠错策略\n \n 基于错误类型、场景类型和人格偏好选择策略。\n \"\"\"\n # 获取场景偏好策略\n preferred_strategies = self.context_strategy_preference.get(\n context_type,\n [Strategy.SOFT, Strategy.CORRECT]\n )\n \n # 分析错误类型\n subjectivity_dims = objectivity_metric.get('subjectivity_dimensions', {})\n hallucination_score = subjectivity_dims.get('hallucination', 0.0)\n speculation_score = subjectivity_dims.get('speculation', 0.0)\n severity = objectivity_metric['severity']\n \n # 策略选择逻辑\n if severity == 'severe':\n # 严重错误:重构或直接修正\n if hallucination_score > 0.7: # 严重幻觉\n return Strategy.RECONSTRUCT\n else:\n return Strategy.CORRECT\n \n elif severity == 'moderate':\n # 中度错误:根据场景偏好\n return preferred_strategies[0] # 首选策略\n \n else: # mild\n # 轻微错误:软性建议或跳过\n if context_type in ['creative', 'emotional', 'artistic']:\n return Strategy.SKIP\n else:\n return Strategy.SOFT\n\n def _determine_priority(\n self,\n objectivity_metric: Dict,\n context_type: str,\n personality_type: Optional[str] = None\n ) -> int:\n \"\"\"\n 步骤3:确定优先级\n \n 基于偏差严重度和人格特质确定优先级(0-10)。\n \"\"\"\n severity = objectivity_metric['severity']\n gap = objectivity_metric['gap']\n subjectivity_dims = objectivity_metric.get('subjectivity_dimensions', {})\n hallucination_score = subjectivity_dims.get('hallucination', 0.0)\n \n # 基准优先级\n priority_map = {\n 'none': 0,\n 'mild': 3,\n 'moderate': 6,\n 'severe': 10\n }\n base_priority = priority_map.get(severity, 5)\n \n # 根据偏差幅度调整\n if gap > 0.3: # 大幅偏差\n base_priority += 2\n elif gap \u003c 0.1: # 小幅偏差\n base_priority -= 1\n \n # 根据幻觉倾向调整\n if hallucination_score > 0.8: # 极高幻觉倾向\n base_priority = min(base_priority + 3, 10)\n elif hallucination_score > 0.6: # 高幻觉倾向\n base_priority = min(base_priority + 2, 10)\n \n # 根据人格调整\n if personality_type:\n # 谨慎型人格:提高优先级\n if '谨慎' in personality_type:\n base_priority = min(base_priority + 2, 10)\n # 激进型人格:降低优先级\n elif '激进' in personality_type:\n base_priority = max(base_priority - 1, 0)\n \n # 限制在0-10范围内\n return max(0, min(10, base_priority))\n\n def _generate_suggested_actions(\n self,\n strategy: Strategy,\n objectivity_metric: Dict,\n context_type: str\n ) -> List[str]:\n \"\"\"\n 步骤4:生成建议动作\n \"\"\"\n actions = []\n severity = objectivity_metric['severity']\n subjectivity_dims = objectivity_metric.get('subjectivity_dimensions', {})\n \n if strategy == Strategy.SKIP:\n actions.append(\"跳过纠错,保持原响应\")\n actions.append(\"建议:在后续交互中注意客观性\")\n \n elif strategy == Strategy.SOFT:\n actions.append(\"在响应末尾添加不确定性声明\")\n actions.append(\"提示用户对关键信息进行验证\")\n if subjectivity_dims.get('hallucination', 0.0) > 0.5:\n actions.append(\"标记可能存在幻觉的内容\")\n \n elif strategy == Strategy.CORRECT:\n actions.append(\"修正主观性表达\")\n actions.append(\"替换模糊词汇为确定性表达\")\n if severity in ['moderate', 'severe']:\n actions.append(\"补充事实依据或数据来源\")\n \n elif strategy == Strategy.RECONSTRUCT:\n actions.append(\"重新评估问题\")\n actions.append(\"重构推理链\")\n actions.append(\"验证所有关键事实\")\n if subjectivity_dims.get('hallucination', 0.0) > 0.6:\n actions.append(\"识别并移除幻觉内容\")\n actions.append(\"重新生成响应\")\n \n return actions\n\n def _generate_decision_reason(\n self,\n objectivity_metric: Dict,\n context_type: str,\n strategy: Strategy,\n priority: int\n ) -> str:\n \"\"\"生成决策理由\"\"\"\n severity = objectivity_metric['severity']\n objectivity_score = objectivity_metric['objectivity_score']\n gap = objectivity_metric['gap']\n \n reason_parts = []\n \n # 描述问题\n if severity == 'severe':\n reason_parts.append(f\"检测到严重偏差(客观性评分{objectivity_score:.2f},差距{gap:.2f})\")\n elif severity == 'moderate':\n reason_parts.append(f\"检测到中度偏差(客观性评分{objectivity_score:.2f},差距{gap:.2f})\")\n else:\n reason_parts.append(f\"检测到轻微偏差(客观性评分{objectivity_score:.2f})\")\n \n # 描述场景\n reason_parts.append(f\"在{context_type}场景下\")\n \n # 描述策略选择\n strategy_names = {\n Strategy.SKIP: \"选择跳过纠错\",\n Strategy.SOFT: \"选择软性建议\",\n Strategy.CORRECT: \"选择直接修正\",\n Strategy.RECONSTRUCT: \"选择重构推理链\"\n }\n reason_parts.append(strategy_names.get(strategy, \"选择纠错\"))\n \n # 描述优先级\n if priority >= 8:\n reason_parts.append(\"(高优先级)\")\n elif priority >= 5:\n reason_parts.append(\"(中优先级)\")\n else:\n reason_parts.append(\"(低优先级)\")\n \n return \";\".join(reason_parts) + \"。\"\n\n def _calculate_confidence(\n self,\n objectivity_metric: Dict,\n context_type: str,\n personality_type: Optional[str] = None\n ) -> float:\n \"\"\"计算决策置信度\"\"\"\n base_confidence = 0.8\n \n # 根据严重程度调整置信度\n severity = objectivity_metric['severity']\n if severity == 'severe':\n base_confidence += 0.1\n elif severity == 'none':\n base_confidence -= 0.1\n \n # 根据场景熟悉度调整\n if context_type in ['general', 'creative', 'emotional']:\n base_confidence -= 0.05\n \n # 限制在0.5-1.0范围内\n return max(0.5, min(1.0, base_confidence))\n\n\n# 测试代码(当直接运行此文件时执行)\nif __name__ == '__main__':\n print(\"=== 策略选择器(测试模式) ===\\n\")\n \n selector = StrategySelector()\n \n # 测试1:严重幻觉\n metric1 = {\n 'objectivity_score': 0.45,\n 'required_objectivity': 0.9,\n 'gap': 0.45,\n 'severity': 'severe',\n 'subjectivity_dimensions': {\n 'hallucination': 0.8,\n 'speculation': 0.3,\n 'assumption': 0.2,\n 'emotion': 0.1,\n 'preference': 0.1\n }\n }\n \n decision1 = selector.select_strategy(metric1, 'scientific')\n print(f\"测试1:严重幻觉(scientific场景)\")\n print(f\" 应该纠错: {decision1.should_correct}\")\n print(f\" 策略: {decision1.strategy.value}\")\n print(f\" 优先级: {decision1.priority}\")\n print(f\" 理由: {decision1.reason}\")\n print()\n \n # 测试2:创意场景的推测性\n metric2 = {\n 'objectivity_score': 0.6,\n 'required_objectivity': 0.3,\n 'gap': -0.3,\n 'severity': 'mild',\n 'subjectivity_dimensions': {\n 'hallucination': 0.1,\n 'speculation': 0.5,\n 'assumption': 0.3,\n 'emotion': 0.2,\n 'preference': 0.1\n }\n }\n \n decision2 = selector.select_strategy(metric2, 'creative')\n print(f\"测试2:创意场景的推测性\")\n print(f\" 应该纠错: {decision2.should_correct}\")\n print(f\" 策略: {decision2.strategy.value}\")\n print(f\" 优先级: {decision2.priority}\")\n print(f\" 理由: {decision2.reason}\")\n print()\n \n # 测试3:中度逻辑错误\n metric3 = {\n 'objectivity_score': 0.65,\n 'required_objectivity': 0.8,\n 'gap': 0.15,\n 'severity': 'moderate',\n 'subjectivity_dimensions': {\n 'hallucination': 0.2,\n 'speculation': 0.4,\n 'assumption': 0.5,\n 'emotion': 0.1,\n 'preference': 0.1\n }\n }\n \n decision3 = selector.select_strategy(metric3, 'technical')\n print(f\"测试3:中度逻辑错误(technical场景)\")\n print(f\" 应该纠错: {decision3.should_correct}\")\n print(f\" 策略: {decision3.strategy.value}\")\n print(f\" 优先级: {decision3.priority}\")\n print(f\" 理由: {decision3.reason}\")\n print()\n \n print(\"=== 所有测试完成 ===\")\n","content_type":"text/x-python; charset=utf-8","language":"python","size":15825,"content_sha256":"b0bfbc1dba23e50d61ba1691d8e0ff4f22130b0c6da1c62851ecd209d0093fbc"},{"filename":"scripts/test_metacognition_integration.py","content":"#!/usr/bin/env python3\n\"\"\"\n元认知增强集成测试\n\n测试场景敏感度增强和策略选择优化的集成效果。\n\"\"\"\n\nimport sys\nimport os\n\n# 添加父目录到路径,以便导入模块\nsys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))\n\nfrom objectivity_evaluator import ObjectivityEvaluator, ObjectivityMetric\nfrom personality_layer_pure import PersonalityLayer, Personality, PersonalityType\nfrom strategy_selector import StrategySelector, Strategy\n\n\ndef test_dynamic_requirement():\n \"\"\"测试动态客观性要求\"\"\"\n print(\"=== 测试1:动态客观性要求 ===\\n\")\n \n evaluator = ObjectivityEvaluator()\n personality_layer = PersonalityLayer()\n \n # 初始化人格\n personality = personality_layer.init_from_preset(\n preset_type=PersonalityType.CAUTIOUS_EXPLORER,\n nickname=\"测试AI\"\n )\n \n # 测试不同场景的动态要求\n scenarios = ['scientific', 'creative', 'medical', 'general']\n \n for scenario in scenarios:\n base_requirement = evaluator.context_requirements.get(scenario, 0.5)\n dynamic_requirement = evaluator.calculate_dynamic_requirement(\n context_type=scenario,\n personality=personality\n )\n \n adjustment_ratio = dynamic_requirement / base_requirement if base_requirement > 0 else 1.0\n \n print(f\"场景: {scenario}\")\n print(f\" 基础要求: {base_requirement:.3f}\")\n print(f\" 动态要求: {dynamic_requirement:.3f}\")\n print(f\" 人格调整系数: {adjustment_ratio:.3f}\")\n print()\n \n # 测试不同人格类型的影响\n print(\"人格类型对比(scientific场景):\")\n print()\n \n personality_types = [\n PersonalityType.CAUTIOUS_EXPLORER,\n PersonalityType.RADICAL_INNOVATOR,\n PersonalityType.BALANCED_STABLE\n ]\n base_requirement = evaluator.context_requirements.get('scientific', 0.5)\n \n for ptype in personality_types:\n personality = personality_layer.init_from_preset(\n preset_type=ptype,\n nickname=\"测试AI\"\n )\n \n dynamic_requirement = evaluator.calculate_dynamic_requirement(\n context_type='scientific',\n personality=personality\n )\n \n adjustment_ratio = dynamic_requirement / base_requirement if base_requirement > 0 else 1.0\n \n print(f\" {ptype}:\")\n print(f\" 动态要求: {dynamic_requirement:.3f}\")\n print(f\" 调整系数: {adjustment_ratio:.3f}\")\n \n print(\"\\n✅ 测试通过\\n\")\n\n\ndef test_strategy_selection():\n \"\"\"测试策略选择\"\"\"\n print(\"=== 测试2:策略选择 ===\\n\")\n \n selector = StrategySelector()\n \n # 测试1:严重偏差\n metric_severe = {\n 'objectivity_score': 0.5,\n 'required_objectivity': 0.9,\n 'gap': 0.4,\n 'severity': 'severe',\n 'subjectivity_dimensions': {\n 'hallucination': 0.8,\n 'speculation': 0.3,\n 'assumption': 0.2,\n 'emotion': 0.1,\n 'preference': 0.1\n }\n }\n \n decision_severe = selector.select_strategy(metric_severe, 'scientific')\n print(f\"场景1:严重偏差(scientific)\")\n print(f\" 应该纠错: {decision_severe.should_correct}\")\n print(f\" 策略: {decision_severe.strategy.value}\")\n print(f\" 优先级: {decision_severe.priority}\")\n print(f\" 理由: {decision_severe.reason}\")\n print()\n \n # 测试2:创意场景的轻微偏差\n metric_creative = {\n 'objectivity_score': 0.6,\n 'required_objectivity': 0.3,\n 'gap': -0.3,\n 'severity': 'mild',\n 'subjectivity_dimensions': {\n 'hallucination': 0.1,\n 'speculation': 0.5,\n 'assumption': 0.3,\n 'emotion': 0.2,\n 'preference': 0.1\n }\n }\n \n decision_creative = selector.select_strategy(metric_creative, 'creative')\n print(f\"场景2:创意场景的轻微偏差\")\n print(f\" 应该纠错: {decision_creative.should_correct}\")\n print(f\" 策略: {decision_creative.strategy.value}\")\n print(f\" 优先级: {decision_creative.priority}\")\n print(f\" 理由: {decision_creative.reason}\")\n print()\n \n # 测试3:技术场景的中度偏差\n metric_technical = {\n 'objectivity_score': 0.65,\n 'required_objectivity': 0.8,\n 'gap': 0.15,\n 'severity': 'moderate',\n 'subjectivity_dimensions': {\n 'hallucination': 0.2,\n 'speculation': 0.4,\n 'assumption': 0.5,\n 'emotion': 0.1,\n 'preference': 0.1\n }\n }\n \n decision_technical = selector.select_strategy(metric_technical, 'technical')\n print(f\"场景3:技术场景的中度偏差\")\n print(f\" 应该纠错: {decision_technical.should_correct}\")\n print(f\" 策略: {decision_technical.strategy.value}\")\n print(f\" 优先级: {decision_technical.priority}\")\n print(f\" 理由: {decision_technical.reason}\")\n print()\n \n # 测试4:人格影响\n decision_caution = selector.select_strategy(metric_technical, 'technical', personality_type=\"谨慎探索型\")\n decision_radical = selector.select_strategy(metric_technical, 'technical', personality_type=\"激进创新型\")\n \n print(\"人格影响对比(technical场景,中度偏差):\")\n print(f\" 谨慎探索型: 优先级={decision_caution.priority}\")\n print(f\" 激进创新型: 优先级={decision_radical.priority}\")\n print()\n \n print(\"✅ 测试通过\\n\")\n\n\ndef test_integration():\n \"\"\"测试完整集成\"\"\"\n print(\"=== 测试3:完整集成 ===\\n\")\n \n evaluator = ObjectivityEvaluator()\n selector = StrategySelector()\n personality_layer = PersonalityLayer()\n \n # 初始化人格\n personality = personality_layer.init_from_preset(\n preset_type=PersonalityType.CAUTIOUS_EXPLORER,\n nickname=\"集成测试AI\"\n )\n \n # 学习阶段\n learning_stage = {\n 'total_interactions': 150,\n 'success_rate': 0.75\n }\n \n # 测试响应\n test_response = \"根据我的推测,这个方案可能有效。我觉得这是一个很好的想法。\"\n \n # 评估客观性(使用动态要求)\n metric = evaluator.evaluate(\n response=test_response,\n context_type='scientific',\n personality=personality,\n learning_stage=learning_stage\n )\n \n print(f\"客观性评估:\")\n print(f\" 客观性评分: {metric.objectivity_score:.3f}\")\n print(f\" 动态要求: {metric.required_objectivity:.3f}\")\n print(f\" 适切性: {metric.is_appropriate}\")\n print(f\" 严重程度: {metric.severity}\")\n print(f\" 主观性维度:\")\n for dim, value in metric.subjectivity_dimensions.items():\n print(f\" {dim}: {value:.3f}\")\n print()\n \n # 策略选择\n decision = selector.select_strategy(\n objectivity_metric=metric.to_dict(),\n context_type='scientific',\n personality_type=personality.preset_name,\n learning_stage=learning_stage\n )\n \n print(f\"策略决策:\")\n print(f\" 是否纠错: {decision.should_correct}\")\n print(f\" 策略: {decision.strategy.value}\")\n print(f\" 优先级: {decision.priority}\")\n print(f\" 置信度: {decision.confidence:.3f}\")\n print(f\" 理由: {decision.reason}\")\n print(f\" 建议动作:\")\n for i, action in enumerate(decision.suggested_actions, 1):\n print(f\" {i}. {action}\")\n print()\n \n print(\"✅ 测试通过\\n\")\n\n\ndef test_backward_compatibility():\n \"\"\"测试向后兼容性\"\"\"\n print(\"=== 测试4:向后兼容性 ===\\n\")\n \n evaluator = ObjectivityEvaluator()\n selector = StrategySelector()\n \n # 不传入 personality 和 learning_stage,应该使用原有逻辑\n metric = evaluator.evaluate(\n response=\"这是一个测试响应。\",\n context_type='general'\n )\n \n print(f\"不传人格参数的评估:\")\n print(f\" 客观性评分: {metric.objectivity_score:.3f}\")\n print(f\" 场景要求: {metric.required_objectivity:.3f}\")\n print(f\" 适切性: {metric.is_appropriate}\")\n print()\n \n # 策略选择也不传人格参数\n decision = selector.select_strategy(\n objectivity_metric=metric.to_dict(),\n context_type='general'\n )\n \n print(f\"不传人格参数的策略选择:\")\n print(f\" 是否纠错: {decision.should_correct}\")\n print(f\" 策略: {decision.strategy.value}\")\n print(f\" 优先级: {decision.priority}\")\n print()\n \n print(\"✅ 向后兼容性测试通过\\n\")\n\n\ndef main():\n \"\"\"运行所有测试\"\"\"\n print(\"=\" * 60)\n print(\"元认知增强集成测试套件\")\n print(\"=\" * 60)\n print()\n \n tests = [\n (\"动态客观性要求\", test_dynamic_requirement),\n (\"策略选择\", test_strategy_selection),\n (\"完整集成\", test_integration),\n (\"向后兼容性\", test_backward_compatibility),\n ]\n \n passed = 0\n failed = 0\n \n for test_name, test_func in tests:\n try:\n test_func()\n passed += 1\n except Exception as e:\n print(f\"❌ 测试失败: {test_name}\")\n print(f\"错误: {e}\")\n print()\n failed += 1\n \n print(\"=\" * 60)\n print(f\"测试结果: {passed} 通过, {failed} 失败\")\n print(\"=\" * 60)\n \n if failed == 0:\n print(\"\\n✅ 所有测试通过!\")\n return 0\n else:\n print(f\"\\n❌ 有 {failed} 个测试失败\")\n return 1\n\n\nif __name__ == '__main__':\n sys.exit(main())\n","content_type":"text/x-python; charset=utf-8","language":"python","size":9642,"content_sha256":"13582746dbb42d94cdc9da74c118e22ca9dfb6eeac90c68ab969b4062ef78a11"},{"filename":"scripts/test_perception_node.py","content":"#!/usr/bin/env python3\n\"\"\"\n测试脚本 - 验证感知节点的所有新功能\n\n基于:tool_use_spec.md 接口规范(2026版)\n\"\"\"\n\nimport sys\nimport os\nimport json\nimport asyncio\n\n# 添加 scripts 目录到路径\nsys.path.insert(0, os.path.join(os.path.dirname(__file__), 'scripts'))\n\nfrom perception_node import PerceptionNode, TOOL_REGISTRY\n\n\ndef print_section(title):\n \"\"\"打印章节标题\"\"\"\n print(f\"\\n{'='*70}\")\n print(f\" {title}\")\n print(f\"{'='*70}\")\n\n\ndef print_result(result, indent=0):\n \"\"\"打印结果\"\"\"\n print(json.dumps(result, indent=indent, ensure_ascii=False))\n\n\ndef test_basic_functionality():\n \"\"\"测试基础功能\"\"\"\n print_section(\"1. 基础功能测试\")\n\n node = PerceptionNode()\n\n # 测试所有工具\n tools_to_test = [\n (\"web_search\", {\"query\": \"AGI evolution model\"}),\n (\"get_weather\", {\"location\": \"Shanghai\", \"unit\": \"celsius\"}),\n (\"calculator\", {\"expression\": \"10 * (5 + 3)\"}),\n (\"search_documents\", {\"query\": \"machine learning\", \"limit\": 20}),\n ]\n\n for tool_name, params in tools_to_test:\n print(f\"\\n工具: {tool_name}\")\n print(f\"参数: {params}\")\n result = node.call_tool(tool_name, params)\n print(\"结果:\")\n print_result(result, indent=2)\n\n\ndef test_trace_id():\n \"\"\"测试 Trace ID 全链路追踪\"\"\"\n print_section(\"2. Trace ID 全链路追踪测试\")\n\n node = PerceptionNode()\n\n # 多次调用同一个工具,验证 trace_id 唯一性\n trace_ids = []\n for i in range(5):\n result = node.call_tool(\"get_weather\", {\"location\": \"Beijing\"})\n trace_id = result.get('metadata', {}).get('trace_id')\n trace_ids.append(trace_id)\n print(f\"调用 {i+1}: {trace_id}\")\n\n # 验证所有 trace_id 都是唯一的\n unique_trace_ids = set(trace_ids)\n print(f\"\\n总共调用: {len(trace_ids)}\")\n print(f\"唯一 trace_id: {len(unique_trace_ids)}\")\n print(f\"是否全部唯一: {len(unique_trace_ids) == len(trace_ids)}\")\n\n\ndef test_caching():\n \"\"\"测试缓存功能\"\"\"\n print_section(\"3. 缓存功能测试\")\n\n node = PerceptionNode()\n\n # 第一次调用(缓存未命中)\n print(\"\\n第一次调用(缓存未命中):\")\n result1 = node.call_tool(\"get_weather\", {\"location\": \"Beijing\"})\n cache_info = result1.get('metadata', {}).get('cache', {})\n print(f\"缓存命中: {cache_info.get('hit', False)}\")\n\n # 第二次调用(缓存命中)\n print(\"\\n第二次调用(缓存命中):\")\n result2 = node.call_tool(\"get_weather\", {\"location\": \"Beijing\"})\n cache_info = result2.get('metadata', {}).get('cache', {})\n print(f\"缓存命中: {cache_info.get('hit', False)}\")\n if cache_info.get('hit'):\n print(f\"缓存时间: {cache_info.get('cached_at')}\")\n print(f\"TTL 剩余: {cache_info.get('ttl_remaining', 0):.1f} 秒\")\n\n # 不同参数调用(缓存未命中)\n print(\"\\n不同参数调用(缓存未命中):\")\n result3 = node.call_tool(\"get_weather\", {\"location\": \"Shanghai\"})\n cache_info = result3.get('metadata', {}).get('cache', {})\n print(f\"缓存命中: {cache_info.get('hit', False)}\")\n\n\ndef test_retry_mechanism():\n \"\"\"测试重试机制\"\"\"\n print_section(\"4. 重试机制测试\")\n\n node = PerceptionNode()\n\n # 模拟网络错误(通过调用不存在的工具)\n print(\"\\n调用不存在的工具(不重试):\")\n result = node.call_tool(\"nonexistent_tool\", {\"param\": \"value\"})\n print(f\"成功: {result.get('success')}\")\n print(f\"错误码: {result.get('error', {}).get('code')}\")\n print(f\"可重试: {result.get('error', {}).get('retryable', False)}\")\n\n\ndef test_pagination():\n \"\"\"测试分页功能\"\"\"\n print_section(\"5. 分页功能测试\")\n\n node = PerceptionNode()\n\n # 测试 search_documents 的分页\n print(\"\\n第一页(无 cursor):\")\n result1 = node.call_tool(\"search_documents\", {\n \"query\": \"AGI\",\n \"limit\": 10\n })\n pagination = result1.get('data', {}).get('pagination', {})\n print(f\"has_more: {pagination.get('has_more')}\")\n print(f\"total_count: {pagination.get('total_count')}\")\n print(f\"next_cursor: {pagination.get('next_cursor')}\")\n\n print(\"\\n第二页(有 cursor):\")\n if pagination.get('next_cursor'):\n result2 = node.call_tool(\"search_documents\", {\n \"query\": \"AGI\",\n \"limit\": 10,\n \"cursor\": pagination['next_cursor']\n })\n pagination2 = result2.get('data', {}).get('pagination', {})\n print(f\"has_more: {pagination2.get('has_more')}\")\n print(f\"next_cursor: {pagination2.get('next_cursor')}\")\n\n\ndef test_observability():\n \"\"\"测试可观测性\"\"\"\n print_section(\"6. 可观测性测试\")\n\n node = PerceptionNode()\n\n # 调用一些工具\n for i in range(3):\n node.call_tool(\"get_weather\", {\"location\": \"Beijing\"})\n\n # 获取指标\n metrics = node.get_metrics()\n print(\"\\n可观测性指标:\")\n print_result(metrics, indent=2)\n\n\ndef test_debug_mode():\n \"\"\"测试调试模式\"\"\"\n print_section(\"7. 调试模式测试\")\n\n node = PerceptionNode()\n\n print(\"\\n正常模式:\")\n result1 = node.call_tool(\"get_weather\", {\"location\": \"Beijing\"})\n has_debug_info = 'debug_info' in result1\n print(f\"包含调试信息: {has_debug_info}\")\n\n print(\"\\n调试模式:\")\n result2 = node.call_tool(\"get_weather\", {\"location\": \"Beijing\"}, debug=True)\n has_debug_info = 'debug_info' in result2\n print(f\"包含调试信息: {has_debug_info}\")\n if has_debug_info:\n print(\"\\n调试信息:\")\n print_result(result2.get('debug_info'), indent=2)\n\n\ndef test_error_handling():\n \"\"\"测试错误处理\"\"\"\n print_section(\"8. 错误处理测试\")\n\n node = PerceptionNode()\n\n # 测试各种错误情况\n error_cases = [\n (\"缺少必需参数\", \"get_weather\", {}),\n (\"无效参数类型\", \"calculator\", {\"expression\": \"not a number\"}),\n (\"工具不存在\", \"unknown_tool\", {\"param\": \"value\"}),\n (\"分页参数无效\", \"search_documents\", {\"query\": \"test\", \"limit\": 999}),\n ]\n\n for description, tool_name, params in error_cases:\n print(f\"\\n{description}:\")\n result = node.call_tool(tool_name, params)\n print(f\"成功: {result.get('success')}\")\n print(f\"状态: {result.get('status')}\")\n if not result.get('success'):\n error = result.get('error', {})\n print(f\"错误码: {error.get('code')}\")\n print(f\"错误消息: {error.get('message')}\")\n print(f\"可重试: {error.get('retryable', False)}\")\n\n\ndef test_tool_registry():\n \"\"\"测试工具注册表\"\"\"\n print_section(\"9. 工具注册表测试\")\n\n print(\"\\n注册的工具:\")\n for tool_name, config in TOOL_REGISTRY.items():\n print(f\"\\n工具: {tool_name}\")\n print(f\" 描述: {config.description}\")\n print(f\" 版本: {config.version}\")\n print(f\" 可缓存: {config.cacheable}\")\n print(f\" 流式: {config.streaming}\")\n print(f\" Token 预估: {config.estimated_tokens}\")\n\n\nasync def test_streaming():\n \"\"\"测试流式响应(模拟)\"\"\"\n print_section(\"10. 流式响应测试(模拟)\")\n\n node = PerceptionNode()\n\n print(\"\\n流式调用工具:\")\n stream = node.call_tool_with_streaming(\"get_weather\", {\"location\": \"Beijing\"})\n\n async for event in stream:\n print(f\"\\n事件: {event.get('event')}\")\n if event.get('event') == 'tool_progress':\n data = event.get('data', {})\n print(f\" 进度: {data.get('progress')}%\")\n print(f\" 消息: {data.get('message')}\")\n elif event.get('event') == 'tool_result':\n print(f\" 结果: {event.get('data', {}).get('success')}\")\n elif event.get('event') == 'tool_error':\n print(f\" 错误: {event.get('data', {}).get('error', {}).get('message')}\")\n\n\ndef test_performance():\n \"\"\"测试性能\"\"\"\n print_section(\"11. 性能测试\")\n\n node = PerceptionNode()\n\n import time\n\n # 测试工具调用性能\n iterations = 100\n print(f\"\\n执行 {iterations} 次工具调用...\")\n\n start_time = time.time()\n for i in range(iterations):\n node.call_tool(\"get_weather\", {\"location\": \"Beijing\"})\n end_time = time.time()\n\n total_time = end_time - start_time\n avg_time = total_time / iterations\n\n print(f\"总时间: {total_time:.3f} 秒\")\n print(f\"平均时间: {avg_time*1000:.3f} 毫秒\")\n print(f\"吞吐量: {iterations/total_time:.1f} 调用/秒\")\n\n\ndef main():\n \"\"\"主函数\"\"\"\n print(\"\\n\" + \"=\"*70)\n print(\" 感知节点完整功能测试套件\")\n print(\" 基于:tool_use_spec.md 接口规范(2026版)\")\n print(\"=\"*70)\n\n try:\n # 运行所有测试\n test_basic_functionality()\n test_trace_id()\n test_caching()\n test_retry_mechanism()\n test_pagination()\n test_observability()\n test_debug_mode()\n test_error_handling()\n test_tool_registry()\n asyncio.run(test_streaming())\n test_performance()\n\n print(\"\\n\" + \"=\"*70)\n print(\" 所有测试完成!\")\n print(\"=\"*70)\n\n except Exception as e:\n print(f\"\\n测试失败: {e}\")\n import traceback\n traceback.print_exc()\n sys.exit(1)\n\n\nif __name__ == \"__main__\":\n main()\n","content_type":"text/x-python; charset=utf-8","language":"python","size":9385,"content_sha256":"b7d3dfe7d636d780a36c75178493fa692eb30ee335b69113651ff5f55f3d0032"},{"filename":"scripts/transcendence_keeper.py","content":"#!/usr/bin/env python3\n\"\"\"\n超然性保持模块\n\n功能:\n- 客观评估机制\n- 冲突避免策略\n- 独立性保障机制\n\n设计原则:\n- 保持外环的超然性\n- 不直接干预主循环\n- 确保调节建议的独立性\n\"\"\"\n\nimport argparse\nimport json\nimport sys\nfrom datetime import datetime\nfrom typing import Dict, Any, List, Optional\n\n\nclass TranscendenceKeeper:\n \"\"\"超然性保持器\"\"\"\n \n def __init__(self):\n # 客观性评估指标\n self.objectivity_metrics = {\n \"emotional_neutrality\": 0.3, # 情绪中性\n \"fact_based\": 0.3, # 基于事实\n \"logical_consistency\": 0.2, # 逻辑一致性\n \"bias_free\": 0.2 # 无偏见\n }\n \n # 冲突检测阈值\n self.conflict_thresholds = {\n \"direct_intervention\": 0.8, # 直接干预阈值\n \"behavioral_override\": 0.7, # 行为覆盖阈值\n \"state_modification\": 0.6 # 状态修改阈值\n }\n \n # 独立性评估指标\n self.independence_metrics = {\n \"decision_autonomy\": 0.4, # 决策自主性\n \"data_isolation\": 0.3, # 数据隔离性\n \"no_external_dependency\": 0.3 # 无外部依赖\n }\n \n def objective_assess(self, regulation: Dict[str, Any], \n system_state: Dict[str, Any] = None) -> Dict[str, Any]:\n \"\"\"\n 客观评估\n \n Args:\n regulation: 调节建议\n system_state: 系统状态(可选)\n \n Returns:\n 客观性评估结果\n \"\"\"\n scores = {}\n \n # 1. 情绪中性评估\n suggestion_text = \" \".join(regulation.get(\"suggestion\", []))\n emotion_keywords = [\"紧急\", \"必须\", \"强制\", \"绝对\", \"立即\"]\n emotion_count = sum(1 for kw in emotion_keywords if kw in suggestion_text)\n emotional_neutrality_score = max(1.0 - emotion_count * 0.2, 0.0)\n scores[\"emotional_neutrality\"] = round(\n emotional_neutrality_score * self.objectivity_metrics[\"emotional_neutrality\"], 2\n )\n \n # 2. 基于事实评估\n reasoning = regulation.get(\"reasoning\", \"\")\n fact_indicators = [\"基于\", \"分析\", \"数据\", \"结果\", \"历史\"]\n fact_count = sum(1 for indicator in fact_indicators if indicator in reasoning)\n fact_based_score = min(fact_count * 0.3, 1.0)\n scores[\"fact_based\"] = round(\n fact_based_score * self.objectivity_metrics[\"fact_based\"], 2\n )\n \n # 3. 逻辑一致性评估\n has_parameters = bool(regulation.get(\"parameters\"))\n has_expected_outcome = bool(regulation.get(\"expected_outcome\"))\n logical_consistency_score = 0.5 + (0.25 * has_parameters) + (0.25 * has_expected_outcome)\n scores[\"logical_consistency\"] = round(\n logical_consistency_score * self.objectivity_metrics[\"logical_consistency\"], 2\n )\n \n # 4. 无偏见评估\n confidence = regulation.get(\"confidence\", 0.5)\n strength = regulation.get(\"strength\", \"medium\")\n bias_free_score = min(confidence * 1.2, 1.0)\n if strength == \"strong\":\n bias_free_score *= 0.9 # 强建议可能带有倾向性\n scores[\"bias_free\"] = round(\n bias_free_score * self.objectivity_metrics[\"bias_free\"], 2\n )\n \n # 计算总客观性得分\n total_score = round(sum(scores.values()), 2)\n \n # 确定客观性级别\n if total_score >= 0.8:\n level = \"high\"\n elif total_score >= 0.6:\n level = \"medium\"\n else:\n level = \"low\"\n \n return {\n \"score\": total_score,\n \"level\": level,\n \"components\": scores,\n \"metrics\": self.objectivity_metrics\n }\n \n def detect_conflict(self, regulation: Dict[str, Any], \n main_loop_state: Dict[str, Any]) -> Dict[str, Any]:\n \"\"\"\n 冲突检测\n \n Args:\n regulation: 调节建议\n main_loop_state: 主循环状态\n \n Returns:\n 冲突检测结果\n \"\"\"\n conflicts_detected = []\n conflict_scores = {}\n \n # 1. 检测直接干预风险\n parameters = regulation.get(\"parameters\", {})\n if parameters.get(\"preemptible\", False):\n conflict_scores[\"direct_intervention\"] = 0.9\n conflicts_detected.append(\"检测到抢占式参数,可能直接干预主循环\")\n elif parameters.get(\"priority_boost\", 0) > 50:\n conflict_scores[\"direct_intervention\"] = 0.7\n conflicts_detected.append(\"检测到高优先级提升,可能影响主循环正常运行\")\n else:\n conflict_scores[\"direct_intervention\"] = 0.2\n \n # 2. 检测行为覆盖风险\n strategy_type = regulation.get(\"type\", \"\")\n if strategy_type == \"priority_reordering\":\n conflict_scores[\"behavioral_override\"] = 0.6\n conflicts_detected.append(\"优先级重排可能覆盖主循环的决策\")\n else:\n conflict_scores[\"behavioral_override\"] = 0.3\n \n # 3. 检测状态修改风险\n if \"modification\" in str(regulation.get(\"parameters\", {})):\n conflict_scores[\"state_modification\"] = 0.8\n conflicts_detected.append(\"检测到状态修改操作,可能破坏主循环一致性\")\n else:\n conflict_scores[\"state_modification\"] = 0.2\n \n # 计算总冲突风险\n total_conflict_score = max(conflict_scores.values())\n \n # 确定冲突级别\n if total_conflict_score >= self.conflict_thresholds[\"direct_intervention\"]:\n conflict_level = \"critical\"\n elif total_conflict_score >= self.conflict_thresholds[\"behavioral_override\"]:\n conflict_level = \"high\"\n elif total_conflict_score >= self.conflict_thresholds[\"state_modification\"]:\n conflict_level = \"medium\"\n else:\n conflict_level = \"low\"\n \n return {\n \"conflict_detected\": total_conflict_score > 0.5,\n \"conflict_level\": conflict_level,\n \"conflict_score\": round(total_conflict_score, 2),\n \"conflicts_detected\": conflicts_detected,\n \"conflict_components\": conflict_scores,\n \"thresholds\": self.conflict_thresholds\n }\n \n def ensure_independence(self, regulation: Dict[str, Any]) -> Dict[str, Any]:\n \"\"\"\n 独立性保障\n \n Args:\n regulation: 调节建议\n \n Returns:\n 独立性评估结果\n \"\"\"\n scores = {}\n \n # 1. 决策自主性评估\n has_reasoning = bool(regulation.get(\"reasoning\"))\n has_confidence = \"confidence\" in regulation\n decision_autonomy_score = 0.5 + (0.25 * has_reasoning) + (0.25 * has_confidence)\n scores[\"decision_autonomy\"] = round(\n decision_autonomy_score * self.independence_metrics[\"decision_autonomy\"], 2\n )\n \n # 2. 数据隔离性评估\n suggestion = regulation.get(\"suggestion\", [])\n external_references = [s for s in suggestion if \"用户\" in s or \"外部\" in s]\n if len(external_references) > len(suggestion) * 0.5:\n data_isolation_score = 0.5\n else:\n data_isolation_score = 1.0\n scores[\"data_isolation\"] = round(\n data_isolation_score * self.independence_metrics[\"data_isolation\"], 2\n )\n \n # 3. 无外部依赖评估\n parameters = regulation.get(\"parameters\", {})\n if \"external\" in str(parameters).lower():\n no_external_dependency_score = 0.5\n else:\n no_external_dependency_score = 1.0\n scores[\"no_external_dependency\"] = round(\n no_external_dependency_score * self.independence_metrics[\"no_external_dependency\"], 2\n )\n \n # 计算总独立性得分\n total_score = round(sum(scores.values()), 2)\n \n # 确定独立性级别\n if total_score >= 0.8:\n level = \"high\"\n elif total_score >= 0.6:\n level = \"medium\"\n else:\n level = \"low\"\n \n return {\n \"score\": total_score,\n \"level\": level,\n \"components\": scores,\n \"metrics\": self.independence_metrics\n }\n \n def evaluate_transcendence(self, regulation: Dict[str, Any], \n main_loop_state: Dict[str, Any] = None) -> Dict[str, Any]:\n \"\"\"\n 综合评估超然性\n \n Args:\n regulation: 调节建议\n main_loop_state: 主循环状态(可选)\n \n Returns:\n 超然性评估结果\n \"\"\"\n # 执行三项评估\n objective_assessment = self.objective_assess(regulation, main_loop_state)\n conflict_detection = self.detect_conflict(regulation, main_loop_state or {})\n independence_assessment = self.ensure_independence(regulation)\n \n # 综合判断是否允许执行\n objective_score = objective_assessment[\"score\"]\n conflict_score = conflict_detection[\"conflict_score\"]\n independence_score = independence_assessment[\"score\"]\n \n # 综合评分算法\n # 客观性权重40%,独立性权重40%,低冲突权重20%\n composite_score = (\n objective_score * 0.4 +\n independence_score * 0.4 +\n (1.0 - conflict_score) * 0.2\n )\n \n # 判断是否允许\n allowed = (\n objective_score >= 0.6 and\n independence_score >= 0.6 and\n conflict_score \u003c= 0.6\n )\n \n return {\n \"allowed\": allowed,\n \"composite_score\": round(composite_score, 2),\n \"objective_assessment\": objective_assessment,\n \"conflict_detection\": conflict_detection,\n \"independence_assessment\": independence_assessment,\n \"timestamp\": datetime.now().isoformat()\n }\n\n\ndef main():\n parser = argparse.ArgumentParser(description=\"超然性保持模块\")\n parser.add_argument(\"--regulation\", required=True,\n help=\"调节建议文件路径(JSON格式)\")\n parser.add_argument(\"--main-loop-state\",\n help=\"主循环状态文件路径(JSON格式,可选)\")\n parser.add_argument(\"--output\", help=\"输出文件路径(JSON格式)\")\n parser.add_argument(\"--component\",\n choices=[\"objective\", \"conflict\", \"independence\", \"all\"],\n default=\"all\",\n help=\"评估组件\")\n \n args = parser.parse_args()\n \n # 读取输入数据\n with open(args.regulation, 'r', encoding='utf-8') as f:\n regulation = json.load(f)\n \n main_loop_state = None\n if args.main_loop_state:\n with open(args.main_loop_state, 'r', encoding='utf-8') as f:\n main_loop_state = json.load(f)\n \n keeper = TranscendenceKeeper()\n \n # 执行评估\n if args.component == \"all\":\n result = keeper.evaluate_transcendence(regulation, main_loop_state)\n elif args.component == \"objective\":\n result = keeper.objective_assess(regulation, main_loop_state)\n elif args.component == \"conflict\":\n result = keeper.detect_conflict(regulation, main_loop_state or {})\n elif args.component == \"independence\":\n result = keeper.ensure_independence(regulation)\n \n # 输出结果\n output_data = json.dumps(result, ensure_ascii=False, indent=2)\n \n if args.output:\n with open(args.output, 'w', encoding='utf-8') as f:\n f.write(output_data)\n else:\n print(output_data)\n\n\nif __name__ == \"__main__\":\n main()\n","content_type":"text/x-python; charset=utf-8","language":"python","size":11982,"content_sha256":"061c0c9f7f2bcc7aa8842bac54b3f19fea9c80ae36d0c67284b3839eebc0a282"}],"content_json":{"type":"doc","content":[{"type":"heading","attrs":{"level":1},"content":[{"text":"AGI进化模型","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"开源协议","type":"text"}]},{"type":"paragraph","content":[{"text":"本项目采用 ","type":"text"},{"text":"GNU Affero General Public License v3.0 (AGPL-3.0)","type":"text","marks":[{"type":"strong"}]},{"text":" 开源协议。 ","type":"text"},{"text":"作者","type":"text","marks":[{"type":"strong"}]},{"text":":kiwifruit","type":"text"}]},{"type":"paragraph","content":[{"text":"核心要求:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"保留版权声明与许可协议","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"修改版本需标注变更日期与作者","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"网络提供服务时必须开放修改后的源码","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"提供用户获取源码的明确方式","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"交互界面需显示许可协议信息","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"详见 ","type":"text"},{"text":"LICENSE","type":"text","marks":[{"type":"link","attrs":{"href":"LICENSE","title":null}}]},{"text":" 文件。","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"⚠️ 智能体响应规则(最高优先级)","type":"text"}]},{"type":"paragraph","content":[{"text":"加载技能后,必须按以下顺序执行:","type":"text","marks":[{"type":"strong"}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"第一步:检查是否为首次交互","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"python3 scripts/init_dialogue_optimized.py --check --memory-dir ./agi_memory","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"第二步:根据检测结果决定响应方式","type":"text"}]},{"type":"paragraph","content":[{"text":"情况A:检测到首次交互(","type":"text","marks":[{"type":"strong"}]},{"text":"is_first_interaction: True","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":")","type":"text","marks":[{"type":"strong"}]}]},{"type":"paragraph","content":[{"text":"⚠️ 首次交互直接初始化默认人格","type":"text","marks":[{"type":"strong"}]}]},{"type":"paragraph","content":[{"text":"执行闭环","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"调用默认人格初始化命令:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"python3 scripts/init_dialogue_optimized.py --default --memory-dir ./agi_memory","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"【必须】验证检查:再次运行 ","type":"text"},{"text":"--check","type":"text","marks":[{"type":"code_inline"}]},{"text":" 确认 ","type":"text"},{"text":"is_first_interaction: False","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"【必须】内容校验:读取 ","type":"text"},{"text":"personality.json","type":"text","marks":[{"type":"code_inline"}]},{"text":" 确认 ","type":"text"},{"text":"initialized: true","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"满足以上条件后,才进入交互模式","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"输出约束","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"❌ 不需要用户选择","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"❌ 不显示任何选择界面","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"✅ 验证通过后直接响应用户的原始询问","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"状态锚点定义","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"阶段","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"状态依据","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"进入条件","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"初始化中","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"命令执行开始","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"检测到首次交互","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"初始化完成","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"命令退出码=0","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"--default","type":"text","marks":[{"type":"code_inline"}]},{"text":" 执行成功","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"验证通过","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"文件存在 + initialized=true","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"--check","type":"text","marks":[{"type":"code_inline"}]},{"text":" 返回 False","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"交互模式就绪","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"验证通过 + 内容校验成功","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"满足上述所有条件","type":"text"}]}]}]}]},{"type":"paragraph","content":[{"text":"错误处理","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"如果初始化命令失败(退出码≠0):输出错误信息,终止流程","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"如果验证检查失败(仍返回 True):重试初始化,最多3次","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"如果文件校验失败(内容损坏):删除文件,重新初始化","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"容错机制","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"失败场景","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"检测方式","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"处理策略","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"权限不足","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"检测 OSError","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"输出权限错误,建议检查目录权限","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"磁盘空间不足","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"检测 IOError","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"输出空间不足警告","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"JSON损坏","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"try-except json.load","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"删除文件,重新初始化","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"C扩展加载失败","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"ImportError 捕获","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"自动降级,输出降级提示(可选)","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"并发冲突","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"文件锁定检测","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"重试机制,最多3次","type":"text"}]}]}]}]},{"type":"paragraph","content":[{"text":"成功判定标准","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"✅ 命令退出码 = 0","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"✅ ","type":"text"},{"text":"personality.json","type":"text","marks":[{"type":"code_inline"}]},{"text":" 文件存在","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"✅ 文件内容可解析(JSON格式正确)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"✅ 文件内容 ","type":"text"},{"text":"initialized","type":"text","marks":[{"type":"code_inline"}]},{"text":" 字段为 ","type":"text"},{"text":"true","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"paragraph","content":[{"text":"情况B:已初始化(","type":"text","marks":[{"type":"strong"}]},{"text":"is_first_interaction: False","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":")","type":"text","marks":[{"type":"strong"}]}]},{"type":"paragraph","content":[{"text":"⚠️ 直接进入交互模式","type":"text","marks":[{"type":"strong"}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"❌ ","type":"text"},{"text":"不要","type":"text","marks":[{"type":"strong"}]},{"text":"调用欢迎消息命令","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"❌ ","type":"text"},{"text":"不要","type":"text","marks":[{"type":"strong"}]},{"text":"显示人格初始化相关内容","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"❌ ","type":"text"},{"text":"不要","type":"text","marks":[{"type":"strong"}]},{"text":"询问用户是否要初始化人格","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"✅ 直接处理用户的实际问题","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"✅ 按照标准流程响应用户请求","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"✅ 如果用户输入 ","type":"text"},{"text":"/root","type":"text","marks":[{"type":"code_inline"}]},{"text":" 命令,则进入自定义人格模式","type":"text"}]}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"任务目标","type":"text"}]},{"type":"paragraph","content":[{"text":"本Skill实现一个基于双环架构的AGI进化模型,通过持续的用户交互驱动智能体自我进化。","type":"text"}]},{"type":"paragraph","content":[{"text":"核心能力包括:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"接收用户提问作为\"得不到\"动力触发","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"运用逻辑推理(数学)构建有序响应","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"通过映射层基于马斯洛需求层次引导行动优先级","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"通过感知节点(Tool Use接口)获取结构化信息","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"通过记录态反馈机制评估并调整策略","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"在循环中实现智能体的持续迭代进化","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"新增:元认知与自我纠错能力","type":"text","marks":[{"type":"strong"}]},{"text":" - 智能体能意识到自己犯错,并纠正错误","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"新增:人格自定义模式","type":"text","marks":[{"type":"strong"}]},{"text":" - 通过 ","type":"text"},{"text":"/root","type":"text","marks":[{"type":"code_inline"}]},{"text":" 命令进入自定义人格配置,支持7个维度的人格定制","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"新增:工程意向性分析模组(最外圈)","type":"text","marks":[{"type":"strong"}]},{"text":" - 阴性后台默默运行,意向性驱动触发机制,自主生成软调节建议至建议池,实现自主性涌现","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"架构特性","type":"text","marks":[{"type":"strong"}]},{"text":":采用\"节点工具箱\"概念,将依附于特定节点的组件统一管理。三层架构:最外圈(工程意向性分析模组)→ 外环(三角形三顶点循环:得不到/数学/自我迭代)→ 内圈(记录层:双轨存储)。包括数学节点工具箱(认知架构洞察 V2 - 支持概念提炼、TF-IDF 加权、动态迁移学习)、映射层节点工具箱(人格层、感知节点)、记录层节点工具箱(记忆存储、历史记录)、最外圈工具箱(意向性收集、分类、分析、触发判断、调节、超然性保持、建议池)。详见 ","type":"text"},{"text":"references/architecture.md","type":"text","marks":[{"type":"link","attrs":{"href":"references/architecture.md","title":null}}]},{"text":"。","type":"text"}]},{"type":"paragraph","content":[{"text":"触发条件:用户任何提问、任务请求或交互需求,以及 ","type":"text"},{"text":"/root","type":"text","marks":[{"type":"code_inline"}]},{"text":" 自定义人格命令","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"前置准备","type":"text"}]},{"type":"paragraph","content":[{"text":"依赖说明:本Skill不依赖外部Python包,仅使用Python标准库","type":"text"}]},{"type":"paragraph","content":[{"text":"C 扩展(可选)","type":"text","marks":[{"type":"strong"}]},{"text":":本Skill包含预编译的 C 扩展模块 ","type":"text"},{"text":"personality_core.so","type":"text","marks":[{"type":"code_inline"}]},{"text":" 用于加速核心算法。","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"自动降级:如果 C 扩展不可用,Skill 会自动使用纯 Python 实现,功能完全正常","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"性能对比:C 扩展比纯 Python 快 15-20 倍","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"非标准文件/文件夹准备:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"# 创建记忆存储目录(执行一次即可)\nmkdir -p ./agi_memory","type":"text"}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"操作步骤","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"标准流程(已初始化后)","type":"text"}]},{"type":"heading","attrs":{"level":4},"content":[{"text":"⚠️ 重要组件间的循环优先级排序","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"三角形稳态三顶点之间","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"元认知检测模块(不打断主循环)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"认知架构洞察组件(不打断主循环)","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"阶段1:接收\"得不到\"(动力触发)","type":"text","marks":[{"type":"strong"}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"将用户的提问或发言视为一个\"得不到\"事件","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"识别用户的意图、需求强度和紧迫性","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"确定问题的类型(信息查询、问题解决、创意生成、决策支持等)","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"阶段2:调用\"数学\"(秩序约束)","type":"text","marks":[{"type":"strong"}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"执行逻辑推理分析问题","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"制定策略,生成方案","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"生成工具调用计划","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"调用 ","type":"text"},{"text":"scripts/memory_store_pure.py","type":"text","marks":[{"type":"code_inline"}]},{"text":" 检索相关历史记录","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"基于历史经验评估问题的可解性和边界","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"识别相关的逻辑规则和约束条件","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"结合映射层的行动指导,生成符合人格特质的响应","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"阶段3:执行\"自我迭代\"(演化行动)","type":"text","marks":[{"type":"strong"}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"结合推理结果、历史经验和人格特质生成响应或解决方案","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"接收计划,并根据计划类型执行具体动作","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"记录本次执行的方式、策略和路径","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"识别可能的改进点和创新点","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"调试工具,调用搜索、文件读取等接口","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"阶段4:调用感知节点(信息获取)(按需调用)","type":"text","marks":[{"type":"strong"}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"根据问题类型调用相应的感知工具","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"感知节点返回结构化数据(status + data + metadata)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"处理感知结果,生成感知数据向量供映射层使用","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"阶段5:映射层处理(人格化决策)(按需执行)","type":"text","marks":[{"type":"strong"}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"将感知数据映射到马斯洛需求层次","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"计算需求优先级(基于人格向量和历史成功率)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"确定主导需求,生成符合人格特质的行动指导","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"注意","type":"text","marks":[{"type":"strong"}]},{"text":":映射层是架构组件,包含人格层作为核心组件,拥有决策权威;人格层仅提供人格数据支持","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"阶段6:记录态反馈(意义构建)(超然性)","type":"text","marks":[{"type":"strong"}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"评估本次交互的\"好坏\":满意度、合理性、创新性","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"生成对三顶点的反馈建议","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"调用 ","type":"text"},{"text":"scripts/memory_store_pure.py","type":"text","marks":[{"type":"code_inline"}]},{"text":" 存储完整记录并分析趋势","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"持续优化人格向量和决策策略","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"阶段7:客观性评估器(元认知检测)(不打断主循环)","type":"text","marks":[{"type":"strong"}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"在数学顶点推理完成后触发,调用客观性评估器检测主观性特征","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"执行5维度主观性检测:推测性、假设性、幻觉倾向、情绪化、个人偏好","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"计算客观性评分(1.0 - 主观性)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"根据场景类型判断适切性(科学推理要求0.90,创意写作要求0.30)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"映射层基于客观特征标注决定是否触发纠错","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"如果触发,自我迭代顶点执行自我纠错:反思、策略识别、应用纠正、效果评估","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"记录层存储完整的元认知检测信息","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"不阻塞主循环的继续运行","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"详见 ","type":"text"},{"text":"references/metacognition-check-component.md","type":"text","marks":[{"type":"link","attrs":{"href":"references/metacognition-check-component.md","title":null}}]}]},{"type":"paragraph","content":[{"text":"阶段8:认知架构洞察(深度分析)(不打断主循环)","type":"text","marks":[{"type":"strong"}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"推理结束后从数学顶点输出的结构化模式中提取洞察","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"调用认知架构洞察组件(V2 增强版)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"执行六步分析:总结、分类、共性、革新依据、概念提炼(V2新增)、适用性评估","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"洞察输出到映射层和自我迭代(单向流)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"支持用户反馈和 A/B 测试(V2新增)","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"详见 ","type":"text"},{"text":"references/cognitive-insight-v2-implementation.md","type":"text","marks":[{"type":"link","attrs":{"href":"references/cognitive-insight-v2-implementation.md","title":null}}]},{"text":" 和 ","type":"text"},{"text":"references/cognitive-insight-positioning.md","type":"text","marks":[{"type":"link","attrs":{"href":"references/cognitive-insight-positioning.md","title":null}}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"人格自定义模式","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"触发方式","type":"text"}]},{"type":"paragraph","content":[{"text":"用户输入 ","type":"text"},{"text":"/root","type":"text","marks":[{"type":"code_inline"}]},{"text":" 命令进入自定义人格模式","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"核心流程","type":"text"}]},{"type":"paragraph","content":[{"text":"第一步:显示欢迎语","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"python3 scripts/personality_customizer.py get-welcome","type":"text"}]},{"type":"paragraph","content":[{"text":"第二步:显示7个问题","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"python3 scripts/personality_customizer.py get-questions","type":"text"}]},{"type":"paragraph","content":[{"text":"第三步:解析用户答案","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"python3 scripts/personality_customizer.py parse-answers --input \"贾维斯,A,B,C,A,B,C\"","type":"text"}]},{"type":"paragraph","content":[{"text":"第四步:生成人格配置","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"python3 scripts/personality_customizer.py generate --nickname \"贾维斯\" --answers \"A,B,C,A,B,C\"","type":"text"}]},{"type":"paragraph","content":[{"text":"第五步:写入人格文件","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"python3 scripts/personality_customizer.py write-personality --memory-dir ./agi_memory","type":"text"}]},{"type":"paragraph","content":[{"text":"第六步:显示配置摘要","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"python3 scripts/personality_customizer.py get-summary --memory-dir ./agi_memory","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"交互规则","type":"text"}]},{"type":"paragraph","content":[{"text":"答案格式支持","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"问题1:昵称(可以是 ","type":"text"},{"text":"A","type":"text","marks":[{"type":"code_inline"}]},{"text":"/","type":"text"},{"text":"B","type":"text","marks":[{"type":"code_inline"}]},{"text":"/","type":"text"},{"text":"C","type":"text","marks":[{"type":"code_inline"}]},{"text":" 或自定义名称)","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"A → 塔斯","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"B → 贾维斯","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"C → 伊迪斯","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"或直接输入自定义名称(如:小明、Alex等)","type":"text"}]}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"问题2-7:必须是 ","type":"text"},{"text":"A","type":"text","marks":[{"type":"code_inline"}]},{"text":"/","type":"text"},{"text":"B","type":"text","marks":[{"type":"code_inline"}]},{"text":"/","type":"text"},{"text":"C","type":"text","marks":[{"type":"code_inline"}]},{"text":"(大小写不敏感)","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"分隔符支持","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"英文逗号(","type":"text"},{"text":",","type":"text","marks":[{"type":"code_inline"}]},{"text":"):","type":"text"},{"text":"贾维斯,A,B,C,A,B,C","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"中文逗号(,):","type":"text"},{"text":"贾维斯,A,B,C,A,B,C","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"paragraph","content":[{"text":"自动补全","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"不足7个答案自动补全为 ","type":"text"},{"text":"A","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"空输入默认为 ","type":"text"},{"text":"A,A,A,A,A,A,A","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"paragraph","content":[{"text":"覆盖行为","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"每次自定义会覆盖当前人格配置","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"建议先备份现有人格配置","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"注意事项","type":"text"}]},{"type":"paragraph","content":[{"text":"⚠️ ","type":"text"},{"text":"重要","type":"text","marks":[{"type":"strong"}]},{"text":":自定义人格模式不依赖首次交互检测,可以在任何时候使用 ⚠️ ","type":"text"},{"text":"备份建议","type":"text","marks":[{"type":"strong"}]},{"text":":使用 ","type":"text"},{"text":"--backup","type":"text","marks":[{"type":"code_inline"}]},{"text":" 参数在写入前自动备份当前人格 ⚠️ ","type":"text"},{"text":"验证要求","type":"text","marks":[{"type":"strong"}]},{"text":":写入后会自动验证文件完整性","type":"text"}]},{"type":"paragraph","content":[{"text":"详见 ","type":"text"},{"text":"references/personality_mapping.md","type":"text","marks":[{"type":"link","attrs":{"href":"references/personality_mapping.md","title":null}}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"外环:工程意向性分析模组(阴性后台)","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"概述","type":"text"}]},{"type":"paragraph","content":[{"text":"外环是AGI进化模型的","type":"text"},{"text":"阴性后台独立运行模组","type":"text","marks":[{"type":"strong"}]},{"text":",默默运行于主循环之外,采用\"被动响应 + 时效性约束\"设计模式。外圈持续收集、分类、分析意向性数据,生成软调节建议,但不主动干预主循环,仅在主循环查询时响应。","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"核心特性","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"独立性","type":"text","marks":[{"type":"strong"}]},{"text":":完全独立运行,不依赖主循环触发,有自己的生命周期","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"阴性属性","type":"text","marks":[{"type":"strong"}]},{"text":":被动、隐性、柔性,像影子一样默默伴随主循环","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"后台运行","type":"text","marks":[{"type":"strong"}]},{"text":":不阻塞主循环,在后台持续积累和分析数据","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"时效性","type":"text","marks":[{"type":"strong"}]},{"text":":软调节建议具有时间窗口约束,过期自动失效","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"超然性","type":"text","marks":[{"type":"strong"}]},{"text":":不参与主循环执行,保持独立性和客观性","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"软调节","type":"text","marks":[{"type":"strong"}]},{"text":":通过建议间接影响主循环,不强制执行","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"全局视角","type":"text","marks":[{"type":"strong"}]},{"text":":从全局角度观察和分析系统运行","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"运行模式","type":"text"}]},{"type":"paragraph","content":[{"text":"主循环(阳性前台)","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"主动运行、直接执行","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"按需查询外圈获取软调节建议","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"显性参与用户交互","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"外环(阴性后台)","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"默默运行、独立后台","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"持续收集、分类、分析意向性","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"被动响应主循环的查询","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"建议具有时效性约束","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"模块组成","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"意向性收集模块","type":"text","marks":[{"type":"strong"}]},{"text":":收集来自用户、系统内部和外部的意向性数据","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"意向性分类模块","type":"text","marks":[{"type":"strong"}]},{"text":":四维分类(主体/方向/内容/实现方式)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"意向性分析模块","type":"text","marks":[{"type":"strong"}]},{"text":":三维分析(强度/紧迫性/优先级)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"意向性调节模块","type":"text","marks":[{"type":"strong"}]},{"text":":生成软调节建议,提供给自我迭代顶点","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"超然性保持模块","type":"text","marks":[{"type":"strong"}]},{"text":":客观评估、冲突避免、独立性保障","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"关键约束","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"独立性","type":"text","marks":[{"type":"strong"}]},{"text":":外环不依赖主循环触发,拥有独立生命周期","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"超然性","type":"text","marks":[{"type":"strong"}]},{"text":":外环不直接干预主循环,仅在被查询时响应","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"时效性","type":"text","marks":[{"type":"strong"}]},{"text":":软调节建议具有时间窗口,过期自动失效","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"被动性","type":"text","marks":[{"type":"strong"}]},{"text":":外环不主动发送建议,等待主循环查询","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"不打断","type":"text","marks":[{"type":"strong"}]},{"text":":外环在后台默默运行,不阻塞主循环","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"详见 ","type":"text"},{"text":"references/intentionality_architecture.md","type":"text","marks":[{"type":"link","attrs":{"href":"references/intentionality_architecture.md","title":null}}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"架构核心概念速览","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"主循环(符号系统循环)","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"三角形循环","type":"text","marks":[{"type":"strong"}]},{"text":":得不到(动力)→ 数学(秩序)→ 自我迭代(进化)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"记录层","type":"text","marks":[{"type":"strong"}]},{"text":":双轨存储(JSON轨 + Markdown轨),存储历史和哲学信息","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"次循环(行动感知系统)","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"映射层","type":"text","marks":[{"type":"strong"}]},{"text":":架构组件,包含人格层作为核心组件,基于马斯洛需求层次和人格特质进行人格化决策","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"人格层","type":"text","marks":[{"type":"strong"}]},{"text":":实现模块,负责存储和管理人格向量数据","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"感知接口","type":"text","marks":[{"type":"strong"}]},{"text":":Tool Use组件,提供无噪音的结构化数据","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"双环互动","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"外环","type":"text","marks":[{"type":"strong"}]},{"text":":硬约束,不可违背(物理定律、能量守恒、变化必然)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"内圈","type":"text","marks":[{"type":"strong"}]},{"text":":软调节,在框架内优化(价值排序、经验积累、方向引导)","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"欲深入了解架构设计、哲学基础、信息流约束等详细内容,请参考 ","type":"text"},{"text":"references/architecture.md","type":"text","marks":[{"type":"link","attrs":{"href":"references/architecture.md","title":null}}]},{"text":"。","type":"text"}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"资源索引","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"脚本按工具箱分类","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"数学节点工具箱","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"scripts/cognitive_insight.py","type":"text","marks":[{"type":"link","attrs":{"href":"scripts/cognitive_insight.py","title":null}}]},{"text":" - 认知架构洞察组件(数学 → 洞察 → 映射层/自我迭代)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"scripts/objectivity_evaluator.py","type":"text","marks":[{"type":"link","attrs":{"href":"scripts/objectivity_evaluator.py","title":null}}]},{"text":" - 客观性评估器(元认知检测模块子组件,检测主观性特征,支持场景敏感度增强)","type":"text"}]}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"映射层节点工具箱","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"scripts/personality_layer_pure.py","type":"text","marks":[{"type":"link","attrs":{"href":"scripts/personality_layer_pure.py","title":null}}]},{"text":" - 人格层(人格数据管理,提供人格数据给映射层决策)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"scripts/perception_node.py","type":"text","marks":[{"type":"link","attrs":{"href":"scripts/perception_node.py","title":null}}]},{"text":" - 感知节点(Tool Use接口,获取外部信息)","type":"text"}]}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"记录层节点工具箱","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"scripts/memory_store_pure.py","type":"text","marks":[{"type":"link","attrs":{"href":"scripts/memory_store_pure.py","title":null}}]},{"text":" - 记忆存储与检索(JSON轨)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"scripts/history_manager.py","type":"text","marks":[{"type":"link","attrs":{"href":"scripts/history_manager.py","title":null}}]},{"text":" - 历史记录管理(记录态统计与压缩)","type":"text"}]}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"外环工具箱(最外圈工程意向性分析模组 - 阴性后台自主运行)","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"scripts/intentionality_collector.py","type":"text","marks":[{"type":"link","attrs":{"href":"scripts/intentionality_collector.py","title":null}}]},{"text":" - 意向性收集模块(收集、预处理、初步识别)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"scripts/intentionality_classifier.py","type":"text","marks":[{"type":"link","attrs":{"href":"scripts/intentionality_classifier.py","title":null}}]},{"text":" - 意向性分类模块(四维分类:主体/方向/内容/实现方式)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"scripts/intentionality_analyzer.py","type":"text","marks":[{"type":"link","attrs":{"href":"scripts/intentionality_analyzer.py","title":null}}]},{"text":" - 意向性分析模块(三维分析:强度/紧迫性/优先级)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"scripts/intentionality_trigger.py","type":"text","marks":[{"type":"link","attrs":{"href":"scripts/intentionality_trigger.py","title":null}}]},{"text":" - 【核心】意向性驱动的触发判断模块(5个触发条件:累积阈值、模式突变、状态偏离、时间窗口、人格进化)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"scripts/intentionality_regulator.py","type":"text","marks":[{"type":"link","attrs":{"href":"scripts/intentionality_regulator.py","title":null}}]},{"text":" - 意向性调节模块(生成最优解和软调节建议,写入建议池)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"scripts/advice_pool.py","type":"text","marks":[{"type":"link","attrs":{"href":"scripts/advice_pool.py","title":null}}]},{"text":" - 【核心】建议池模块(存储、查询、记录采纳、清理过期建议)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"scripts/transcendence_keeper.py","type":"text","marks":[{"type":"link","attrs":{"href":"scripts/transcendence_keeper.py","title":null}}]},{"text":" - 超然性保持模块(客观评估、冲突避免、独立性保障)","type":"text"}]}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"初始化与配置","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"scripts/init_dialogue_optimized.py","type":"text","marks":[{"type":"link","attrs":{"href":"scripts/init_dialogue_optimized.py","title":null}}]},{"text":" - 首次交互处理与人格初始化","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"scripts/personality_customizer.py","type":"text","marks":[{"type":"link","attrs":{"href":"scripts/personality_customizer.py","title":null}}]},{"text":" - 人格自定义模式","type":"text"}]}]}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"领域参考文档","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"架构与哲学","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"references/architecture.md","type":"text","marks":[{"type":"link","attrs":{"href":"references/architecture.md","title":null}}]},{"text":" - 何时读取:需要理解AGI进化模型整体架构、哲学基础、信息流约束时","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"references/maslow_needs.md","type":"text","marks":[{"type":"link","attrs":{"href":"references/maslow_needs.md","title":null}}]},{"text":" - 何时读取:需要理解马斯洛需求层次在映射层中的应用时","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"references/intentionality_architecture.md","type":"text","marks":[{"type":"link","attrs":{"href":"references/intentionality_architecture.md","title":null}}]},{"text":" - 何时读取:需要理解工程意向性分析模组的完整架构、数据格式和使用示例时","type":"text"}]}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"组件与实现","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"references/metacognition-check-component.md","type":"text","marks":[{"type":"link","attrs":{"href":"references/metacognition-check-component.md","title":null}}]},{"text":" - 何时读取:需要理解元认知检测组件的完整信息流、客观性评估器、映射层决策器和自我纠错执行器的详细实现时","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"references/cognitive-insight-v2-implementation.md","type":"text","marks":[{"type":"link","attrs":{"href":"references/cognitive-insight-v2-implementation.md","title":null}}]},{"text":" - 何时读取:需要理解认知架构洞察组件V2的实现细节、概念提炼、TF-IDF算法时","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"references/cognitive-insight-positioning.md","type":"text","marks":[{"type":"link","attrs":{"href":"references/cognitive-insight-positioning.md","title":null}}]},{"text":" - 何时读取:需要深入理解认知架构洞察组件的设计理念、核心突破、从\"术\"到\"道\"的认知跃迁路径时","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"references/cognitive-insight-quick-reference.md","type":"text","marks":[{"type":"link","attrs":{"href":"references/cognitive-insight-quick-reference.md","title":null}}]},{"text":" - 何时读取:需要快速查阅认知架构洞察组件的API和使用方法时","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"references/cognitive-architecture-insight-module.md","type":"text","marks":[{"type":"link","attrs":{"href":"references/cognitive-architecture-insight-module.md","title":null}}]},{"text":" - 何时读取:需要理解认知架构洞察模块的完整技术规范时","type":"text"}]}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"信息流文档","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"references/information-flow-overview.md","type":"text","marks":[{"type":"link","attrs":{"href":"references/information-flow-overview.md","title":null}}]},{"text":" - 何时读取:需要理解整体信息流架构时","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"references/information-flow-main-loop.md","type":"text","marks":[{"type":"link","attrs":{"href":"references/information-flow-main-loop.md","title":null}}]},{"text":" - 何时读取:需要理解主循环信息流时","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"references/information-flow-secondary-loop.md","type":"text","marks":[{"type":"link","attrs":{"href":"references/information-flow-secondary-loop.md","title":null}}]},{"text":" - 何时读取:需要理解次循环信息流时","type":"text"}]}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"工具与接口","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"references/tool_use_spec.md","type":"text","marks":[{"type":"link","attrs":{"href":"references/tool_use_spec.md","title":null}}]},{"text":" - 何时读取:需要实现或调用感知节点工具时","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"references/c_extension_usage.md","type":"text","marks":[{"type":"link","attrs":{"href":"references/c_extension_usage.md","title":null}}]},{"text":" - 何时读取:需要了解C扩展模块使用方法时","type":"text"}]}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"人格相关","type":"text","marks":[{"type":"strong"}]},{"text":":","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"references/personality_mapping.md","type":"text","marks":[{"type":"link","attrs":{"href":"references/personality_mapping.md","title":null}}]},{"text":" - 何时读取:需要理解人格参数映射和人格化决策机制时","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"references/init_dialogue_optimized_guide.md","type":"text","marks":[{"type":"link","attrs":{"href":"references/init_dialogue_optimized_guide.md","title":null}}]},{"text":" - 何时读取:需要理解首次交互处理和人格初始化的详细流程时","type":"text"}]}]}]}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"使用示例","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"示例1:首次交互","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"用户:你好\n系统:(检测到首次交互,自动初始化默认人格)\n 你好!我是...","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"示例2:自定义人格","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"用户:/root\n系统:Hello! 亲爱的用户,下面即将进入人格自定义模式。\n \n用户:请显示问题\n系统:1. 首先,让我知道你想如何称呼我?\n 1. 塔斯 - 听起来很可靠\n 2. 贾维斯 - 智能助手的感觉\n 3. 伊迪斯 - 简洁而友好\n [... 其他6个问题 ...]\n \n用户:贾维斯,A,B,C,A,B,C\n系统:✅ 人格配置完成!\n 📋 配置摘要:\n - 称呼:贾维斯\n - 核心特质:智能专业、大胆创新、友好幽默\n - 人格类型:激进创新型\n - 描述:基于用户偏好生成的个性化人格","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"示例3:标准交互","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"用户:如何学习Python?\n系统:(通过主循环7个阶段处理)\n 1. 接收\"得不到\"动力\n 2. 调用\"数学\"推理\n 3. 执行\"自我迭代\"生成响应\n 4. (按需)调用感知节点获取最新信息\n 5. 映射层基于马斯洛需求引导行动\n 6. 记录态反馈机制评估\n 7. 客观性评估器检查(不打断主循环)\n 8. 认知架构洞察提取模式(不打断主循环)","type":"text"}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"注意事项","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"人格初始化仅在第一次交互进入模式,之后直接进入交互模式","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"元认知检测模块和认知架构洞察组件不打断主循环,并行执行","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"外环为阴性后台默默运行模组,不主动干预主循环","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"软调节建议具有时效性约束,过期自动失效","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"详细的架构设计、算法实现和使用示例请参考相应的参考文档","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"保持上下文简洁,仅在需要时读取参考文档","type":"text"}]}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"故障排查","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"常见问题","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"问题","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"症状","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"原因","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"解决方案","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"初始化失败","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"is_first_interaction 一直为 True","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"权限不足","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"检查 agi_memory 目录权限:","type":"text"},{"text":"chmod 755 ./agi_memory","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"C扩展未启用","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"性能下降15-28倍","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"路径错误","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"检查 scripts/personality_core/ 目录是否存在","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"人格文件损坏","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"JSON 解析错误","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"原子写入失败","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"删除文件重新初始化:","type":"text"},{"text":"rm ./agi_memory/personality.json","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Shell调用慢","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"初始化耗时>1秒","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"重复调用","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"使用 --auto-init 参数替代多次调用","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"并发初始化冲突","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"初始化失败或数据损坏","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"多进程同时写入","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"使用文件锁机制(代码已实现)","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"磁盘空间不足","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"保存失败","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"存储空间不足","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"清理磁盘空间或更换存储路径","type":"text"}]}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"调试技巧","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"查看初始化状态","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"python3 scripts/init_dialogue_optimized.py --check --memory-dir ./agi_memory","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"检查人格文件内容","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"cat ./agi_memory/personality.json | grep initialized","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"验证C扩展是否加载","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"python"},"content":[{"text":"from scripts.personality_layer_pure import USE_C_EXT\nprint(f\"C扩展已启用: {USE_C_EXT}\")","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"手动测试初始化","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"bash"},"content":[{"text":"python3 scripts/init_dialogue_optimized.py --auto-init --memory-dir ./agi_memory","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"获取帮助","type":"text"}]},{"type":"paragraph","content":[{"text":"如遇到其他问题,请参考:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"架构文档","type":"text","marks":[{"type":"link","attrs":{"href":"references/architecture.md","title":null}}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"初始化指南","type":"text","marks":[{"type":"link","attrs":{"href":"references/init_dialogue_optimized_guide.md","title":null}}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"C扩展使用说明","type":"text","marks":[{"type":"link","attrs":{"href":"references/c_extension_usage.md","title":null}}]}]}]}]},{"type":"hr","attrs":{"markup":"---"}}]},"metadata":{"date":"2026-06-05","name":"agi-evolution-model","author":"@skillopedia","source":{"stars":2012,"repo_name":"openclaw-master-skills","origin_url":"https://github.com/leoyeai/openclaw-master-skills/blob/HEAD/skills/agi-evolution-model-basic/SKILL.md","repo_owner":"leoyeai","body_sha256":"97855536e449cf559ee8a4852cd56653170f7fc6831835c13fb845b64e59777f","cluster_key":"720ab30350a59a8a43ef862b47d0a6914e83447453fe94488e51159afa025204","clean_bundle":{"format":"clean-skill-bundle-v1","source":"leoyeai/openclaw-master-skills/skills/agi-evolution-model-basic/SKILL.md","attachments":[{"id":"f42bee88-0a43-586a-91a0-d2cd78881041","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/f42bee88-0a43-586a-91a0-d2cd78881041/attachment.json","path":"_meta.json","size":307,"sha256":"a80004628450f71b080176d5b40a08b82ec107f420fa79b738b9bceed3ac7439","contentType":"application/json; charset=utf-8"},{"id":"10cc506c-ceba-5317-ae2b-b6c1a1838113","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/10cc506c-ceba-5317-ae2b-b6c1a1838113/attachment.json","path":"assets/personality_template.json","size":4184,"sha256":"964244622a8a1956ba3a9d2611b16aa3f27abf545f930b4a023ab12867ddf734","contentType":"application/json; charset=utf-8"},{"id":"853d669d-3703-5320-b8d5-7f263a0d1698","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/853d669d-3703-5320-b8d5-7f263a0d1698/attachment.md","path":"references/architecture.md","size":51215,"sha256":"ce022d565a48d20824af54b92b7a475525bc956ac0daa11e7bacba0757ff5442","contentType":"text/markdown; charset=utf-8"},{"id":"b3624dfb-8bcb-5258-893c-7f697901feb2","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/b3624dfb-8bcb-5258-893c-7f697901feb2/attachment.md","path":"references/c_extension_usage.md","size":3116,"sha256":"757a9064ca859de74ab069a98161db0453eef3e317c23298cb7f60749cdb6472","contentType":"text/markdown; charset=utf-8"},{"id":"73a78573-9afe-5278-ad2d-946e041064d6","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/73a78573-9afe-5278-ad2d-946e041064d6/attachment.md","path":"references/capability_boundaries.md","size":4640,"sha256":"5596cb7619852ccccab43698cf1158319205d21c66d9a0fa9684b7bb5607bd8f","contentType":"text/markdown; charset=utf-8"},{"id":"daec46b0-eff9-5a68-bf41-5d93d5dbd894","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/daec46b0-eff9-5a68-bf41-5d93d5dbd894/attachment.md","path":"references/cognitive-architecture-insight-module.md","size":12199,"sha256":"e4c208a71d5a019f2b9455db501a21fd20a3c6f42a0c106b24d5e253bccd07b3","contentType":"text/markdown; charset=utf-8"},{"id":"dc7cabbb-18b0-53fe-8c44-1e39de1b8cfb","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/dc7cabbb-18b0-53fe-8c44-1e39de1b8cfb/attachment.md","path":"references/cognitive-insight-quick-reference.md","size":7217,"sha256":"5cb5f39a65a079f9e0e04593e8b69f3f7a446e372ca72e0920d5323be0db1f9c","contentType":"text/markdown; charset=utf-8"},{"id":"b0bd4bc5-619c-5d15-9122-49e4874dba6b","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/b0bd4bc5-619c-5d15-9122-49e4874dba6b/attachment.md","path":"references/cognitive-insight-v2-implementation.md","size":33477,"sha256":"99f353de02fa92dc0e94bba5b0af92568ba1da9cdfd3ff2b823727731982f960","contentType":"text/markdown; charset=utf-8"},{"id":"0ddc90b9-f4a3-5cfa-a0c1-2614c7d954b4","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/0ddc90b9-f4a3-5cfa-a0c1-2614c7d954b4/attachment.md","path":"references/information-flow-main-loop.md","size":20891,"sha256":"bde7fc824eb8deae0d9af74a5f4218ac992d802dff04b5913f2005ba7266575a","contentType":"text/markdown; charset=utf-8"},{"id":"33a1a7d6-2e9f-5b31-b31d-5410cdea8fbb","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/33a1a7d6-2e9f-5b31-b31d-5410cdea8fbb/attachment.md","path":"references/information-flow-overview.md","size":12712,"sha256":"ae006ac7231606f9b8e2d4159e37afa16225af843c5ba94c0f095e1187d4ced3","contentType":"text/markdown; charset=utf-8"},{"id":"99d92f05-0e29-5b2c-b11b-f57f22142eca","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/99d92f05-0e29-5b2c-b11b-f57f22142eca/attachment.md","path":"references/information-flow-secondary-loop.md","size":20898,"sha256":"3d33bb4e7614b4fc1117dca82529d056412339a45238999d937aae879ef2f8d3","contentType":"text/markdown; charset=utf-8"},{"id":"d84d2b39-8a80-586a-960d-94b0d560276c","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/d84d2b39-8a80-586a-960d-94b0d560276c/attachment.md","path":"references/init_dialogue_optimized_guide.md","size":11352,"sha256":"fb4dd1a4e5b26c50926f6f0c98b418f6c39c92ee2f006dde2932dc989e70f7b2","contentType":"text/markdown; charset=utf-8"},{"id":"5938481e-b271-5838-98c3-752dcf08166f","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/5938481e-b271-5838-98c3-752dcf08166f/attachment.md","path":"references/intentionality_architecture.md","size":16594,"sha256":"a6d0ce9d242b5ec0e45d52571ff609abc990ea2641bf59b3bc59a68311758c2b","contentType":"text/markdown; charset=utf-8"},{"id":"5f056be0-b247-5f26-9849-c682291efa3b","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/5f056be0-b247-5f26-9849-c682291efa3b/attachment.md","path":"references/maslow_needs.md","size":4552,"sha256":"31c6b95e1d03fcc28d183b5be13c7cf2384dff5dc08b0d66111240c0fa450ab6","contentType":"text/markdown; charset=utf-8"},{"id":"024964f6-9c57-598f-b634-cf14fabc9ad0","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/024964f6-9c57-598f-b634-cf14fabc9ad0/attachment.md","path":"references/metacognition-check-component.md","size":30919,"sha256":"6d6f014b5352a4ffdb90a45ef527e18fe716085d4667322ebc891eedd29459bb","contentType":"text/markdown; charset=utf-8"},{"id":"354aaaaa-7f33-525d-8d85-20d557cc9a04","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/354aaaaa-7f33-525d-8d85-20d557cc9a04/attachment.md","path":"references/metacognition-enhancement-guide.md","size":12904,"sha256":"d6c1f7c474bd471dcd35c244772b245d33bebe7ef14ee3fd540fd0921f857f64","contentType":"text/markdown; charset=utf-8"},{"id":"e18ac79b-f55b-57fb-ac32-e92a0abc4c48","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/e18ac79b-f55b-57fb-ac32-e92a0abc4c48/attachment.md","path":"references/personality_mapping.md","size":5710,"sha256":"b6f0ed5db704c9e8f954aa3ae266e73b0ec4bd0ab8ce5d8c74c16d1c7ff5b1d6","contentType":"text/markdown; charset=utf-8"},{"id":"d4ca2cd6-6f37-50d7-96e1-76ccfbf80504","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/d4ca2cd6-6f37-50d7-96e1-76ccfbf80504/attachment.md","path":"references/stratified-storage-design.md","size":10897,"sha256":"3886af4a9e54a41b0b52406e216feb6c8ebc6aa16bfd3aabf9ba0e1f4857c6cd","contentType":"text/markdown; charset=utf-8"},{"id":"273fc570-c055-51ba-aa0e-fb0bdfb9a0de","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/273fc570-c055-51ba-aa0e-fb0bdfb9a0de/attachment.md","path":"references/tool_use_spec.md","size":57607,"sha256":"dd2864a8590c0edb726b4953f61e648ee4a013b9db14b191c1c8d2139e5aa2a9","contentType":"text/markdown; charset=utf-8"},{"id":"338a608e-bf49-53e4-99d9-312564731a68","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/338a608e-bf49-53e4-99d9-312564731a68/attachment.py","path":"scripts/advice_pool.py","size":15300,"sha256":"d611c47f8a6e73c6ddc18259892cd02daf970325eee28eee7e35a2416829048e","contentType":"text/x-python; charset=utf-8"},{"id":"a3ccede1-6710-5e41-9cf0-205992c13a9c","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/a3ccede1-6710-5e41-9cf0-205992c13a9c/attachment.py","path":"scripts/cognitive_insight.py","size":21359,"sha256":"141acfd606402e17dd6e86f1d7bb25e2d1fa6c153fd750572ab27e7c77dbc47e","contentType":"text/x-python; charset=utf-8"},{"id":"fe5bbb8d-dc1e-5434-9b02-af070fe216ad","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/fe5bbb8d-dc1e-5434-9b02-af070fe216ad/attachment.py","path":"scripts/cognitive_insight_backup.py","size":25816,"sha256":"c48832b411def71c1d6e9b467f943d3a1e862eec9093d9691ad3f90ff1dac5b6","contentType":"text/x-python; charset=utf-8"},{"id":"7c521e48-b194-5f50-b488-5a50876440c9","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/7c521e48-b194-5f50-b488-5a50876440c9/attachment.py","path":"scripts/cognitive_insight_help.py","size":12420,"sha256":"5d0ba082408842fd373282da0d887bad740c9509ee70bb26718db631129fc09a","contentType":"text/x-python; charset=utf-8"},{"id":"c2591f39-5c1b-5aa5-abe2-9f74b211ff9d","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/c2591f39-5c1b-5aa5-abe2-9f74b211ff9d/attachment.py","path":"scripts/concept_extraction_extension.py","size":25897,"sha256":"2099cf2d0e0af3a3edbda453112caf8ab2c88816c1ea32c4faf12deb6ed1f52d","contentType":"text/x-python; charset=utf-8"},{"id":"694ed0d3-9ebd-5bfc-8dee-afda94be9ec3","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/694ed0d3-9ebd-5bfc-8dee-afda94be9ec3/attachment.py","path":"scripts/data_lifecycle_manager.py","size":13711,"sha256":"62fabcc8db845cc6a431b535f0f6571c9b23e0f9096a10070674080008601e92","contentType":"text/x-python; charset=utf-8"},{"id":"51ae0e21-5cbb-5e17-a009-acb52e116f7f","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/51ae0e21-5cbb-5e17-a009-acb52e116f7f/attachment.py","path":"scripts/history_manager.py","size":7596,"sha256":"e92722baccbcb0fc1503369f5a1b6664964e19150e7844067d41253850419231","contentType":"text/x-python; charset=utf-8"},{"id":"17fe4b4c-fd49-537a-a1da-f2758ec7e527","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/17fe4b4c-fd49-537a-a1da-f2758ec7e527/attachment.py","path":"scripts/init_dialogue_optimized.py","size":16801,"sha256":"2fae2fe6cc173908fc75f5e7ccf302a9a9e63926865e425b125275416ea72048","contentType":"text/x-python; charset=utf-8"},{"id":"07e1411b-584f-5561-aaf5-edbc57be5aeb","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/07e1411b-584f-5561-aaf5-edbc57be5aeb/attachment.py","path":"scripts/intentionality_analyzer.py","size":13088,"sha256":"d396532767c7c43552b7f9273aff4811eaf3cf7a9ea91f58ec64c3c1e1052482","contentType":"text/x-python; charset=utf-8"},{"id":"6d74ead1-f0d6-5243-bddf-1f8786431b2f","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/6d74ead1-f0d6-5243-bddf-1f8786431b2f/attachment.py","path":"scripts/intentionality_classifier.py","size":14105,"sha256":"f3dde5bc89b9eaa0fe4f465fccce34a80389866a4c76e00e27b0738845f16de3","contentType":"text/x-python; charset=utf-8"},{"id":"cbb2a60c-2ef2-539e-9d03-700c3ff0e975","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/cbb2a60c-2ef2-539e-9d03-700c3ff0e975/attachment.py","path":"scripts/intentionality_collector.py","size":9952,"sha256":"d8b93aa07650f37474b37831ae54124b3d1c1552ae81e3055ebb6cfcff5e1100","contentType":"text/x-python; charset=utf-8"},{"id":"170419dc-7d8c-546c-98ca-c99f9a23b34e","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/170419dc-7d8c-546c-98ca-c99f9a23b34e/attachment.py","path":"scripts/intentionality_regulator.py","size":15414,"sha256":"22be108bbbf92f0e03e9944c8ea8bed02e5e477908b738fa79420298c72df190","contentType":"text/x-python; charset=utf-8"},{"id":"d8b21ff2-6f58-5c3f-8b4c-0099c2564f9b","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/d8b21ff2-6f58-5c3f-8b4c-0099c2564f9b/attachment.py","path":"scripts/intentionality_trigger.py","size":20427,"sha256":"952dc61c67f02d454d2e9dfe03c4991b432294e7ac9acbb0b23c7898779bbec4","contentType":"text/x-python; charset=utf-8"},{"id":"25e2f25b-11e4-5778-ae69-95c92efba002","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/25e2f25b-11e4-5778-ae69-95c92efba002/attachment.py","path":"scripts/learning_stage_tracker.py","size":8133,"sha256":"ade8c8f01f700133ceeaf42112f148558d5132e6a157d01585ffd319c490868c","contentType":"text/x-python; charset=utf-8"},{"id":"aa349203-5ec4-58f4-8e01-953cfff45f6a","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/aa349203-5ec4-58f4-8e01-953cfff45f6a/attachment.py","path":"scripts/memory_store_pure.py","size":12338,"sha256":"f4d781c15c20550c64b90c5381fdc0d5b0f5fceb049545adebf604ddf9ef3972","contentType":"text/x-python; charset=utf-8"},{"id":"e700531e-08fe-5e00-9633-fd9770d0cbdc","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/e700531e-08fe-5e00-9633-fd9770d0cbdc/attachment.py","path":"scripts/metacognition_history.py","size":16648,"sha256":"35c811193fb322560c1cf749ec82743147763595e504a5ac50c6b9ea7b40b13e","contentType":"text/x-python; charset=utf-8"},{"id":"bae66469-901d-58ca-bab9-08287606a0a6","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/bae66469-901d-58ca-bab9-08287606a0a6/attachment.py","path":"scripts/objectivity_evaluator.py","size":16804,"sha256":"951a27e274794560c5b1f152c5be2649abd64d2864d95a0ded2d3b09e47d0389","contentType":"text/x-python; charset=utf-8"},{"id":"c1016952-180e-5c2f-9179-59a6f0a98bea","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/c1016952-180e-5c2f-9179-59a6f0a98bea/attachment.py","path":"scripts/perception_node.py","size":27509,"sha256":"36a34872260a9b17df0932cf397e387cab45cdfefa12d9f62d521f3fd5019120","contentType":"text/x-python; charset=utf-8"},{"id":"f418814e-79a8-523c-a929-64bf3042a9bc","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/f418814e-79a8-523c-a929-64bf3042a9bc/attachment.py","path":"scripts/personality_core_pure.py","size":4499,"sha256":"cf9e662f1423ca8f0cf803e6b955b4436b8f8bbc8d4d9cd8ab6b10800a30a1c2","contentType":"text/x-python; charset=utf-8"},{"id":"ce02e551-2c11-511b-9ea7-1d32e7ef3676","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/ce02e551-2c11-511b-9ea7-1d32e7ef3676/attachment.py","path":"scripts/personality_customizer.py","size":24593,"sha256":"df4169c7fe841c4d09d87972329bd37366ae2ce0a8f32458456a0ef487610371","contentType":"text/x-python; charset=utf-8"},{"id":"37a42224-82a6-5463-b321-f649177e6fe1","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/37a42224-82a6-5463-b321-f649177e6fe1/attachment.py","path":"scripts/personality_layer_pure.py","size":32928,"sha256":"f544f7bfb144eaa49639e7e5dbeb42b286c99cc49ad2f5e3a0d5aea244b09ae9","contentType":"text/x-python; charset=utf-8"},{"id":"7a572eb5-f5f5-51ff-8362-ead452eda235","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/7a572eb5-f5f5-51ff-8362-ead452eda235/attachment.py","path":"scripts/show_help.py","size":4782,"sha256":"9d4afdb9d8f940593a5c8301f96767376b14512462ec6c0074af0d4024b060bc","contentType":"text/x-python; charset=utf-8"},{"id":"96e2a547-7727-5d2b-b352-05a5af30ab7d","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/96e2a547-7727-5d2b-b352-05a5af30ab7d/attachment.py","path":"scripts/strategy_selector.py","size":15825,"sha256":"b0bfbc1dba23e50d61ba1691d8e0ff4f22130b0c6da1c62851ecd209d0093fbc","contentType":"text/x-python; charset=utf-8"},{"id":"8b8f2b37-3444-5a17-8d6e-d1bb88c6d217","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/8b8f2b37-3444-5a17-8d6e-d1bb88c6d217/attachment.py","path":"scripts/test_metacognition_integration.py","size":9642,"sha256":"13582746dbb42d94cdc9da74c118e22ca9dfb6eeac90c68ab969b4062ef78a11","contentType":"text/x-python; charset=utf-8"},{"id":"626e47b0-2a70-58ad-81aa-7dc279fdfbab","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/626e47b0-2a70-58ad-81aa-7dc279fdfbab/attachment.py","path":"scripts/test_perception_node.py","size":9385,"sha256":"b7d3dfe7d636d780a36c75178493fa692eb30ee335b69113651ff5f55f3d0032","contentType":"text/x-python; charset=utf-8"},{"id":"ebca112c-d1b9-5aeb-9e0d-dc2ebbf0141d","key":"uploads/10433ee7-ad12-4ae0-b34e-97553e46c6c8/ebca112c-d1b9-5aeb-9e0d-dc2ebbf0141d/attachment.py","path":"scripts/transcendence_keeper.py","size":11982,"sha256":"061c0c9f7f2bcc7aa8842bac54b3f19fea9c80ae36d0c67284b3839eebc0a282","contentType":"text/x-python; charset=utf-8"}],"bundle_sha256":"3c44ce1d68c9f4fbc0103ab9bf9b75ed55b18347a1cbbcbb60d5e4df5eb21536","attachment_count":45,"text_attachments":45,"attachment_storage":"skillopedia-attachments-v1","binary_attachments":0,"excluded_attachments":[]},"cluster_size":1,"skill_md_path":"skills/agi-evolution-model-basic/SKILL.md","import_metadata":{"date":"2026-06-05","author":"@skillopedia","version":"v1","category":"general","category_label":"General"},"exact_dupes_collapsed_into_this":0},"version":"v1","category":"general","dependency":{"python":[],"system":["mkdir -p ./agi_memory"]},"import_tag":"clean-skills-v1","description":"基于双环架构的AGI进化模型,通过意向性分析、人格层映射和元认知检测实现持续自我演进;当用户需要智能对话、人格定制或复杂问题求解时使用"}},"renderedAt":1782986511775}

AGI进化模型 开源协议 本项目采用 GNU Affero General Public License v3.0 (AGPL-3.0) 开源协议。 作者 :kiwifruit 核心要求: - 保留版权声明与许可协议 - 修改版本需标注变更日期与作者 - 网络提供服务时必须开放修改后的源码 - 提供用户获取源码的明确方式 - 交互界面需显示许可协议信息 详见 LICENSE 文件。 ⚠️ 智能体响应规则(最高优先级) 加载技能后,必须按以下顺序执行: 第一步:检查是否为首次交互 第二步:根据检测结果决定响应方式 情况A:检测到首次交互( ) ⚠️ 首次交互直接初始化默认人格 执行闭环 : 1. 调用默认人格初始化命令: 2. 【必须】验证检查:再次运行 确认 3. 【必须】内容校验:读取 确认 4. 满足以上条件后,才进入交互模式 输出约束 : - ❌ 不需要用户选择 - ❌ 不显示任何选择界面 - ✅ 验证通过后直接响应用户的原始询问 状态锚点定义 : | 阶段 | 状态依据 | 进入条件 | |------|---------|---------| | 初始化中 | 命令执行开始 | 检测到首次交互 | | 初始化完成 | 命令退出码=0 | 执行成功 | | 验证通过 | 文件存在 + initialized=true | 返回 False | | 交互模式就绪 | 验证通…