From 01885232c3336d89115d3f2bc82bc4c7dfd4dce9 Mon Sep 17 00:00:00 2001 From: starmen1265 Date: Tue, 24 Mar 2026 02:10:04 +0800 Subject: [PATCH] =?UTF-8?q?=E8=87=AA=E5=8A=A8=E5=90=8C=E6=AD=A5:=202026-03?= =?UTF-8?q?-24=2002:10?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- agents/haonan/sessions/sessions.json | 245 +++-- .../workspace/memory/2026-03-23-1621.md | 107 +++ .../workspace/memory/2026-03-23.md | 20 + agents/ui-designer/sessions/sessions.json | 252 +++++- agents/ui-designer/workspace/MEMORY.md | 114 ++- .../workspace/memory/2026-03-23.md | 99 ++ cron/jobs.json | 160 +++- cron/jobs.json.bak | 157 +++- cron/scripts/stock-tracker.sh | 45 + .../81601882-e50a-4a8b-a8bc-e19b156b7b05.json | 24 + .../89181ed1-39cf-4f24-b4e5-2df4d7b6fd34.json | 24 + .../a74a559f-aea8-4d9d-8d4a-46402b208d15.json | 24 + .../be91d785-b914-42dc-9298-f57551587373.json | 21 + .../c7e6e651-ad7b-420f-ac5c-83a1ec63d809.json | 24 + .../e75bc319-49b7-4881-8609-1a78052d3a78.json | 24 + feishu/dedup/feishu-art.json | 42 +- feishu/dedup/feishu-worker.json | 25 +- identity/device-auth.json | 2 +- logs/commands.log | 1 + ...b86b6ddbfe44c21daea25107fbe92e7401099.json | 43 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 364 bytes .../__pycache__/__main__.cpython-312.pyc | Bin 0 -> 361 bytes .../__pycache__/cli.cpython-312.pyc | Bin 0 -> 9691 bytes .../auth/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 386 bytes .../__pycache__/zhihu_login.cpython-312.pyc | Bin 0 -> 11582 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 820 bytes .../__pycache__/config.cpython-312.pyc | Bin 0 -> 6012 bytes .../__pycache__/models.cpython-312.pyc | Bin 0 -> 7616 bytes .../__pycache__/proxy_pool.cpython-312.pyc | Bin 0 -> 9868 bytes .../__pycache__/zhihu_crawler.cpython-312.pyc | Bin 0 -> 26112 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 418 bytes .../stealth_config.cpython-312.pyc | Bin 0 -> 5516 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 29383 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 433 bytes .../bilibili_extractor.cpython-312.pyc | Bin 0 -> 32331 bytes .../markdown_converter.cpython-312.pyc | Bin 0 -> 2833 bytes .../zhihu_extractor.cpython-312.pyc | Bin 0 -> 19539 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1441 bytes .../__pycache__/config.cpython-312.pyc | Bin 0 -> 3362 bytes .../__pycache__/errors.cpython-312.pyc | Bin 0 -> 6314 bytes .../__pycache__/idempotency.cpython-312.pyc | Bin 0 -> 2930 bytes .../__pycache__/link_parser.cpython-312.pyc | Bin 0 -> 5842 bytes .../__pycache__/pipeline.cpython-312.pyc | Bin 0 -> 15199 bytes .../__pycache__/retry.cpython-312.pyc | Bin 0 -> 881 bytes .../__pycache__/schemas.cpython-312.pyc | Bin 0 -> 23514 bytes .../__pycache__/state.cpython-312.pyc | Bin 0 -> 6052 bytes skills/kb_workflow/pipeline/config.py | 4 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 878 bytes .../__pycache__/base.cpython-312.pyc | Bin 0 -> 4822 bytes .../__pycache__/bilibili.cpython-312.pyc | Bin 0 -> 19884 bytes .../__pycache__/zhihu.cpython-312.pyc | Bin 0 -> 20761 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1358 bytes .../__pycache__/analyze.cpython-312.pyc | Bin 0 -> 11426 bytes .../__pycache__/archive.cpython-312.pyc | Bin 0 -> 9623 bytes .../__pycache__/asr.cpython-312.pyc | Bin 0 -> 26963 bytes .../__pycache__/base.cpython-312.pyc | Bin 0 -> 2356 bytes .../__pycache__/download.cpython-312.pyc | Bin 0 -> 13319 bytes .../__pycache__/parse.cpython-312.pyc | Bin 0 -> 3092 bytes .../__pycache__/srt.cpython-312.pyc | Bin 0 -> 16497 bytes skills/kb_workflow/pipeline/processors/srt.py | 138 ++- .../srt/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 946 bytes .../srt/__pycache__/corrector.cpython-312.pyc | Bin 0 -> 5503 bytes .../srt/__pycache__/parser.cpython-312.pyc | Bin 0 -> 4718 bytes .../srt/__pycache__/segmenter.cpython-312.pyc | Bin 0 -> 3091 bytes .../semantic_engine.cpython-312.pyc | Bin 0 -> 29212 bytes skills/kb_workflow/srt/cache/__init__.py | 8 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 360 bytes .../semantic_cache.cpython-312.pyc | Bin 0 -> 6228 bytes .../kb_workflow/srt/cache/semantic_cache.py | 155 ++++ skills/kb_workflow/srt/semantic_engine.py | 853 ++++++++++++++++++ 70 files changed, 2348 insertions(+), 263 deletions(-) create mode 100644 agents/knowledge-base/workspace/memory/2026-03-23-1621.md create mode 100644 agents/knowledge-base/workspace/memory/2026-03-23.md create mode 100644 agents/ui-designer/workspace/memory/2026-03-23.md create mode 100644 cron/scripts/stock-tracker.sh create mode 100644 delivery-queue/81601882-e50a-4a8b-a8bc-e19b156b7b05.json create mode 100644 delivery-queue/89181ed1-39cf-4f24-b4e5-2df4d7b6fd34.json create mode 100644 delivery-queue/a74a559f-aea8-4d9d-8d4a-46402b208d15.json create mode 100644 delivery-queue/be91d785-b914-42dc-9298-f57551587373.json create mode 100644 delivery-queue/c7e6e651-ad7b-420f-ac5c-83a1ec63d809.json create mode 100644 delivery-queue/e75bc319-49b7-4881-8609-1a78052d3a78.json create mode 100644 skills/.planning/cache/semantic/96f61cfac06d59b7b306aeb1d4eb86b6ddbfe44c21daea25107fbe92e7401099.json create mode 100644 skills/kb_workflow/__pycache__/__init__.cpython-312.pyc create mode 100644 skills/kb_workflow/__pycache__/__main__.cpython-312.pyc create mode 100644 skills/kb_workflow/__pycache__/cli.cpython-312.pyc create mode 100644 skills/kb_workflow/auth/__pycache__/__init__.cpython-312.pyc create mode 100644 skills/kb_workflow/auth/__pycache__/zhihu_login.cpython-312.pyc create mode 100644 skills/kb_workflow/crawler/__pycache__/__init__.cpython-312.pyc create mode 100644 skills/kb_workflow/crawler/__pycache__/config.cpython-312.pyc create mode 100644 skills/kb_workflow/crawler/__pycache__/models.cpython-312.pyc create mode 100644 skills/kb_workflow/crawler/__pycache__/proxy_pool.cpython-312.pyc create mode 100644 skills/kb_workflow/crawler/__pycache__/zhihu_crawler.cpython-312.pyc create mode 100644 skills/kb_workflow/crawler/stealth/__pycache__/__init__.cpython-312.pyc create mode 100644 skills/kb_workflow/crawler/stealth/__pycache__/stealth_config.cpython-312.pyc create mode 100644 skills/kb_workflow/deep_analyzer/__pycache__/__init__.cpython-312.pyc create mode 100644 skills/kb_workflow/metadata/__pycache__/__init__.cpython-312.pyc create mode 100644 skills/kb_workflow/metadata/__pycache__/bilibili_extractor.cpython-312.pyc create mode 100644 skills/kb_workflow/metadata/__pycache__/markdown_converter.cpython-312.pyc create mode 100644 skills/kb_workflow/metadata/__pycache__/zhihu_extractor.cpython-312.pyc create mode 100644 skills/kb_workflow/pipeline/__pycache__/__init__.cpython-312.pyc create mode 100644 skills/kb_workflow/pipeline/__pycache__/config.cpython-312.pyc create mode 100644 skills/kb_workflow/pipeline/__pycache__/errors.cpython-312.pyc create mode 100644 skills/kb_workflow/pipeline/__pycache__/idempotency.cpython-312.pyc create mode 100644 skills/kb_workflow/pipeline/__pycache__/link_parser.cpython-312.pyc create mode 100644 skills/kb_workflow/pipeline/__pycache__/pipeline.cpython-312.pyc create mode 100644 skills/kb_workflow/pipeline/__pycache__/retry.cpython-312.pyc create mode 100644 skills/kb_workflow/pipeline/__pycache__/schemas.cpython-312.pyc create mode 100644 skills/kb_workflow/pipeline/__pycache__/state.cpython-312.pyc create mode 100644 skills/kb_workflow/pipeline/platforms/__pycache__/__init__.cpython-312.pyc create mode 100644 skills/kb_workflow/pipeline/platforms/__pycache__/base.cpython-312.pyc create mode 100644 skills/kb_workflow/pipeline/platforms/__pycache__/bilibili.cpython-312.pyc create mode 100644 skills/kb_workflow/pipeline/platforms/__pycache__/zhihu.cpython-312.pyc create mode 100644 skills/kb_workflow/pipeline/processors/__pycache__/__init__.cpython-312.pyc create mode 100644 skills/kb_workflow/pipeline/processors/__pycache__/analyze.cpython-312.pyc create mode 100644 skills/kb_workflow/pipeline/processors/__pycache__/archive.cpython-312.pyc create mode 100644 skills/kb_workflow/pipeline/processors/__pycache__/asr.cpython-312.pyc create mode 100644 skills/kb_workflow/pipeline/processors/__pycache__/base.cpython-312.pyc create mode 100644 skills/kb_workflow/pipeline/processors/__pycache__/download.cpython-312.pyc create mode 100644 skills/kb_workflow/pipeline/processors/__pycache__/parse.cpython-312.pyc create mode 100644 skills/kb_workflow/pipeline/processors/__pycache__/srt.cpython-312.pyc create mode 100644 skills/kb_workflow/srt/__pycache__/__init__.cpython-312.pyc create mode 100644 skills/kb_workflow/srt/__pycache__/corrector.cpython-312.pyc create mode 100644 skills/kb_workflow/srt/__pycache__/parser.cpython-312.pyc create mode 100644 skills/kb_workflow/srt/__pycache__/segmenter.cpython-312.pyc create mode 100644 skills/kb_workflow/srt/__pycache__/semantic_engine.cpython-312.pyc create mode 100644 skills/kb_workflow/srt/cache/__init__.py create mode 100644 skills/kb_workflow/srt/cache/__pycache__/__init__.cpython-312.pyc create mode 100644 skills/kb_workflow/srt/cache/__pycache__/semantic_cache.cpython-312.pyc create mode 100644 skills/kb_workflow/srt/cache/semantic_cache.py create mode 100644 skills/kb_workflow/srt/semantic_engine.py diff --git a/agents/haonan/sessions/sessions.json b/agents/haonan/sessions/sessions.json index fa5532e..9a9371d 100644 --- a/agents/haonan/sessions/sessions.json +++ b/agents/haonan/sessions/sessions.json @@ -51,12 +51,12 @@ "abortedLastRun": false, "chatType": "direct", "origin": { - "label": "feishu:oc_0", + "label": "feishu:ou_73cc4f75e3c953d7bf11f34f8c8c7618", "provider": "feishu", "surface": "feishu", "chatType": "direct", - "from": "feishu:oc_0", - "to": "oc_0", + "from": "feishu:ou_73cc4f75e3c953d7bf11f34f8c8c7618", + "to": "ou_73cc4f75e3c953d7bf11f34f8c8c7618", "accountId": "feishu-pm" }, "sessionFile": "/home/starmen1265/.openclaw/agents/haonan/sessions/e4845dbe-7d4d-41b6-adb5-b8a739e6520d.jsonl", @@ -715,8 +715,8 @@ "memoryFlushCompactionCount": 0 }, "agent:haonan:cron:41396aeb-6e3a-47b2-9bd3-9156a348c1dc": { - "sessionId": "ee02d903-76a0-4bfc-b79c-3485bfbd6b93", - "updatedAt": 1774202400005, + "sessionId": "8dafc963-2f86-4e58-865c-9775a4461dae", + "updatedAt": 1774288800004, "systemSent": true, "model": "glm-5", "contextTokens": 200000, @@ -757,11 +757,11 @@ "version": 0 }, "modelProvider": "zhipu", - "inputTokens": 10864, - "outputTokens": 433, - "totalTokens": 16922, + "inputTokens": 14609, + "outputTokens": 517, + "totalTokens": 17201, "totalTokensFresh": true, - "cacheRead": 39360, + "cacheRead": 52864, "cacheWrite": 0 }, "agent:haonan:cron:f03b184f-5f1d-4093-ae1b-fc9fe0b59eef": { @@ -807,9 +807,9 @@ "version": 0 }, "modelProvider": "zhipu", - "inputTokens": 93543, - "outputTokens": 12015, - "totalTokens": 39048, + "inputTokens": 89834, + "outputTokens": 4112, + "totalTokens": 30249, "deliveryContext": { "channel": "webchat" }, @@ -818,7 +818,7 @@ "sessionFile": "/home/starmen1265/.openclaw/agents/haonan/sessions/ccc40ca7-7876-4d82-ab84-7b790feddc19.jsonl", "abortedLastRun": false, "totalTokensFresh": true, - "cacheRead": 727060, + "cacheRead": 295587, "cacheWrite": 0 }, "agent:haonan:cron:3245fca7-045b-4977-8fab-020f6df2e453": { @@ -861,8 +861,8 @@ "cacheWrite": 0 }, "agent:haonan:cron:aa4d2de9-79be-4262-83ee-af8824793bfc": { - "sessionId": "c36026c9-d70c-48f5-8e92-c45bff98a7f4", - "updatedAt": 1774203000004, + "sessionId": "f28e191e-4a3e-42a3-a584-9b97234c8c6f", + "updatedAt": 1774289400006, "systemSent": true, "label": "Cron: openclaw-git-sync", "skillsSnapshot": { @@ -910,113 +910,6 @@ "cacheRead": 32768, "cacheWrite": 0 }, - "agent:haonan:cron:f03b184f-5f1d-4093-ae1b-fc9fe0b59eef:run:c36ad784-619d-457f-9e7f-3bac4119e782": { - "sessionId": "c36ad784-619d-457f-9e7f-3bac4119e782", - "updatedAt": 1774117200006, - "systemSent": true, - "model": "glm-4.7-FlashX", - "contextTokens": 200000, - "label": "Cron: capability-evolver-daily", - "skillsSnapshot": { - "prompt": "\n\nThe following skills provide specialized instructions for specific tasks.\nUse the read tool to load a skill's file when the task matches its description.\nWhen a skill file references a relative path, resolve it against the skill directory (parent of SKILL.md / dirname of the path) and use that absolute path in tool commands.\n\n\n \n capability-evolver\n A self-evolution engine for AI agents. Analyzes runtime history to identify improvements and applies protocol-constrained evolution.\n ~/.openclaw/skills/capability-evolver/SKILL.md\n \n \n clawlist\n MUST use for any multi-step project, long-running task, or infinite monitoring workflow. Plan, execute, track, and verify tasks with checkpoint validation. For projects, automation, and ongoing operations.\n ~/.openclaw/skills/clawlist/SKILL.md\n \n", - "skills": [ - { - "name": "capability-evolver" - }, - { - "name": "clawlist" - } - ], - "skillFilter": [ - "clawlist", - "capability-evolver", - "self-improving-agent" - ], - "resolvedSkills": [ - { - "name": "capability-evolver", - "description": "A self-evolution engine for AI agents. Analyzes runtime history to identify improvements and applies protocol-constrained evolution.", - "filePath": "/home/starmen1265/.openclaw/skills/capability-evolver/SKILL.md", - "baseDir": "/home/starmen1265/.openclaw/skills/capability-evolver", - "source": "openclaw-managed", - "disableModelInvocation": false - }, - { - "name": "clawlist", - "description": "MUST use for any multi-step project, long-running task, or infinite monitoring workflow. Plan, execute, track, and verify tasks with checkpoint validation. For projects, automation, and ongoing operations.", - "filePath": "/home/starmen1265/.openclaw/skills/clawlist/SKILL.md", - "baseDir": "/home/starmen1265/.openclaw/skills/clawlist", - "source": "openclaw-managed", - "disableModelInvocation": false - } - ], - "version": 0 - }, - "modelProvider": "zhipu", - "inputTokens": 93543, - "outputTokens": 12015, - "totalTokens": 39048, - "deliveryContext": { - "channel": "webchat" - }, - "lastChannel": "webchat", - "channel": "webchat", - "sessionFile": "/home/starmen1265/.openclaw/agents/haonan/sessions/ccc40ca7-7876-4d82-ab84-7b790feddc19.jsonl", - "abortedLastRun": false, - "totalTokensFresh": true, - "cacheRead": 727060, - "cacheWrite": 0 - }, - "agent:haonan:cron:41396aeb-6e3a-47b2-9bd3-9156a348c1dc:run:ee02d903-76a0-4bfc-b79c-3485bfbd6b93": { - "sessionId": "ee02d903-76a0-4bfc-b79c-3485bfbd6b93", - "updatedAt": 1774202400005, - "systemSent": true, - "model": "glm-5", - "contextTokens": 200000, - "label": "Cron: backup-openclaw-json", - "skillsSnapshot": { - "prompt": "\n\nThe following skills provide specialized instructions for specific tasks.\nUse the read tool to load a skill's file when the task matches its description.\nWhen a skill file references a relative path, resolve it against the skill directory (parent of SKILL.md / dirname of the path) and use that absolute path in tool commands.\n\n\n \n capability-evolver\n A self-evolution engine for AI agents. Analyzes runtime history to identify improvements and applies protocol-constrained evolution.\n ~/.openclaw/skills/capability-evolver/SKILL.md\n \n \n clawlist\n MUST use for any multi-step project, long-running task, or infinite monitoring workflow. Plan, execute, track, and verify tasks with checkpoint validation. For projects, automation, and ongoing operations.\n ~/.openclaw/skills/clawlist/SKILL.md\n \n", - "skills": [ - { - "name": "capability-evolver" - }, - { - "name": "clawlist" - } - ], - "skillFilter": [ - "clawlist", - "capability-evolver", - "self-improving-agent" - ], - "resolvedSkills": [ - { - "name": "capability-evolver", - "description": "A self-evolution engine for AI agents. Analyzes runtime history to identify improvements and applies protocol-constrained evolution.", - "filePath": "/home/starmen1265/.openclaw/skills/capability-evolver/SKILL.md", - "baseDir": "/home/starmen1265/.openclaw/skills/capability-evolver", - "source": "openclaw-managed", - "disableModelInvocation": false - }, - { - "name": "clawlist", - "description": "MUST use for any multi-step project, long-running task, or infinite monitoring workflow. Plan, execute, track, and verify tasks with checkpoint validation. For projects, automation, and ongoing operations.", - "filePath": "/home/starmen1265/.openclaw/skills/clawlist/SKILL.md", - "baseDir": "/home/starmen1265/.openclaw/skills/clawlist", - "source": "openclaw-managed", - "disableModelInvocation": false - } - ], - "version": 0 - }, - "modelProvider": "zhipu", - "inputTokens": 10864, - "outputTokens": 433, - "totalTokens": 16922, - "totalTokensFresh": true, - "cacheRead": 39360, - "cacheWrite": 0 - }, "agent:haonan:cron:aa4d2de9-79be-4262-83ee-af8824793bfc:run:c36026c9-d70c-48f5-8e92-c45bff98a7f4": { "sessionId": "c36026c9-d70c-48f5-8e92-c45bff98a7f4", "updatedAt": 1774203000004, @@ -1110,9 +1003,9 @@ "version": 0 }, "modelProvider": "zhipu", - "inputTokens": 93543, - "outputTokens": 12015, - "totalTokens": 39048, + "inputTokens": 89834, + "outputTokens": 4112, + "totalTokens": 30249, "deliveryContext": { "channel": "webchat" }, @@ -1121,7 +1014,107 @@ "sessionFile": "/home/starmen1265/.openclaw/agents/haonan/sessions/ccc40ca7-7876-4d82-ab84-7b790feddc19.jsonl", "abortedLastRun": false, "totalTokensFresh": true, - "cacheRead": 727060, + "cacheRead": 295587, + "cacheWrite": 0 + }, + "agent:haonan:cron:41396aeb-6e3a-47b2-9bd3-9156a348c1dc:run:8dafc963-2f86-4e58-865c-9775a4461dae": { + "sessionId": "8dafc963-2f86-4e58-865c-9775a4461dae", + "updatedAt": 1774288800004, + "systemSent": true, + "model": "glm-5", + "contextTokens": 200000, + "label": "Cron: backup-openclaw-json", + "skillsSnapshot": { + "prompt": "\n\nThe following skills provide specialized instructions for specific tasks.\nUse the read tool to load a skill's file when the task matches its description.\nWhen a skill file references a relative path, resolve it against the skill directory (parent of SKILL.md / dirname of the path) and use that absolute path in tool commands.\n\n\n \n capability-evolver\n A self-evolution engine for AI agents. Analyzes runtime history to identify improvements and applies protocol-constrained evolution.\n ~/.openclaw/skills/capability-evolver/SKILL.md\n \n \n clawlist\n MUST use for any multi-step project, long-running task, or infinite monitoring workflow. Plan, execute, track, and verify tasks with checkpoint validation. For projects, automation, and ongoing operations.\n ~/.openclaw/skills/clawlist/SKILL.md\n \n", + "skills": [ + { + "name": "capability-evolver" + }, + { + "name": "clawlist" + } + ], + "skillFilter": [ + "clawlist", + "capability-evolver", + "self-improving-agent" + ], + "resolvedSkills": [ + { + "name": "capability-evolver", + "description": "A self-evolution engine for AI agents. Analyzes runtime history to identify improvements and applies protocol-constrained evolution.", + "filePath": "/home/starmen1265/.openclaw/skills/capability-evolver/SKILL.md", + "baseDir": "/home/starmen1265/.openclaw/skills/capability-evolver", + "source": "openclaw-managed", + "disableModelInvocation": false + }, + { + "name": "clawlist", + "description": "MUST use for any multi-step project, long-running task, or infinite monitoring workflow. Plan, execute, track, and verify tasks with checkpoint validation. For projects, automation, and ongoing operations.", + "filePath": "/home/starmen1265/.openclaw/skills/clawlist/SKILL.md", + "baseDir": "/home/starmen1265/.openclaw/skills/clawlist", + "source": "openclaw-managed", + "disableModelInvocation": false + } + ], + "version": 0 + }, + "modelProvider": "zhipu", + "inputTokens": 14609, + "outputTokens": 517, + "totalTokens": 17201, + "totalTokensFresh": true, + "cacheRead": 52864, + "cacheWrite": 0 + }, + "agent:haonan:cron:aa4d2de9-79be-4262-83ee-af8824793bfc:run:f28e191e-4a3e-42a3-a584-9b97234c8c6f": { + "sessionId": "f28e191e-4a3e-42a3-a584-9b97234c8c6f", + "updatedAt": 1774289400006, + "systemSent": true, + "label": "Cron: openclaw-git-sync", + "skillsSnapshot": { + "prompt": "\n\nThe following skills provide specialized instructions for specific tasks.\nUse the read tool to load a skill's file when the task matches its description.\nWhen a skill file references a relative path, resolve it against the skill directory (parent of SKILL.md / dirname of the path) and use that absolute path in tool commands.\n\n\n \n capability-evolver\n A self-evolution engine for AI agents. Analyzes runtime history to identify improvements and applies protocol-constrained evolution.\n ~/.openclaw/skills/capability-evolver/SKILL.md\n \n \n clawlist\n MUST use for any multi-step project, long-running task, or infinite monitoring workflow. Plan, execute, track, and verify tasks with checkpoint validation. For projects, automation, and ongoing operations.\n ~/.openclaw/skills/clawlist/SKILL.md\n \n", + "skills": [ + { + "name": "capability-evolver" + }, + { + "name": "clawlist" + } + ], + "skillFilter": [ + "clawlist", + "capability-evolver", + "self-improving-agent" + ], + "resolvedSkills": [ + { + "name": "capability-evolver", + "description": "A self-evolution engine for AI agents. Analyzes runtime history to identify improvements and applies protocol-constrained evolution.", + "filePath": "/home/starmen1265/.openclaw/skills/capability-evolver/SKILL.md", + "baseDir": "/home/starmen1265/.openclaw/skills/capability-evolver", + "source": "openclaw-managed", + "disableModelInvocation": false + }, + { + "name": "clawlist", + "description": "MUST use for any multi-step project, long-running task, or infinite monitoring workflow. Plan, execute, track, and verify tasks with checkpoint validation. For projects, automation, and ongoing operations.", + "filePath": "/home/starmen1265/.openclaw/skills/clawlist/SKILL.md", + "baseDir": "/home/starmen1265/.openclaw/skills/clawlist", + "source": "openclaw-managed", + "disableModelInvocation": false + } + ], + "version": 0 + }, + "modelProvider": "zhipu", + "model": "glm-5", + "contextTokens": 200000, + "inputTokens": 966, + "outputTokens": 295, + "totalTokens": 17235, + "totalTokensFresh": true, + "cacheRead": 32768, "cacheWrite": 0 } } \ No newline at end of file diff --git a/agents/knowledge-base/workspace/memory/2026-03-23-1621.md b/agents/knowledge-base/workspace/memory/2026-03-23-1621.md new file mode 100644 index 0000000..c1ce7bf --- /dev/null +++ b/agents/knowledge-base/workspace/memory/2026-03-23-1621.md @@ -0,0 +1,107 @@ +# Session: 2026-03-23 16:21:53 UTC + +- **Session Key**: agent:knowledge-base:main +- **Session ID**: c6f06c72-ea29-4d72-8ba5-4830ca604107 +- **Source**: feishu + +## Conversation Summary + +user: Conversation info (untrusted metadata): +```json +{ + "message_id": "om_x100b53219b1e80f4c3403ec55bc0e66", + "sender_id": "ou_9351c287f42069fa30366ac641d24df7", + "sender": "张青", + "timestamp": "Mon 2026-03-23 23:33 GMT+8" +} +``` + +Sender (untrusted metadata): +```json +{ + "label": "张青 (ou_9351c287f42069fa30366ac641d24df7)", + "id": "ou_9351c287f42069fa30366ac641d24df7", + "name": "张青" +} +``` + +[message_id: om_x100b53219b1e80f4c3403ec55bc0e66] +张青: https://www.bilibili.com/video/BV1irAGz9EgZ/?t=10&spm_id_from=333.1007.tianma.2-3-6.click&vd_source=1deaab00c5de8885422a7a7690170eba 添加知识库 +assistant: 我来帮您处理这个B站视频的知识库添加任务。 + +首先让我获取视频信息并了解知识库的结构: +assistant: 蒋先生,我看到这是一个关于中东冲突(以色列-伊朗战争)的战况汇总视频,属于时事追踪类内容。 + +我建议在知识库中这样组织: +- **位置**:`20.领域/25-时事关注/中东冲突2026/` +- **理由**:这是正在发生的重大事件,适合作为持续关注的领域而非单纯的资源 + +现在为您创建知识库条目: +assistant: ✅ 已完成知识库添加 + +**创建内容**: +- **位置**:`20.领域/25-时事关注/中东冲突2026/战况汇总.md` +- **内容结构**: + - 完整时间线(3月1日-22日) + - 主要参与方梳理 + - 武器装备清单 + - 战略要地标注 + - 经济影响分析 + +这个系列视频适合作为持续追踪的时事领域,后续如有新的战况更新可以继续添加到这个文档中。 +user: Conversation info (untrusted metadata): +```json +{ + "message_id": "om_x100b532193c3c8a0c2c4ae55e5aa0d1", + "sender_id": "ou_9351c287f42069fa30366ac641d24df7", + "sender": "张青", + "timestamp": "Mon 2026-03-23 23:35 GMT+8" +} +``` + +Sender (untrusted metadata): +```json +{ + "label": "张青 (ou_9351c287f42069fa30366ac641d24df7)", + "id": "ou_9351c287f42069fa30366ac641d24df7", + "name": "张青" +} +``` + +[message_id: om_x100b532193c3c8a0c2c4ae55e5aa0d1] +张青: 怎么不用技能? +assistant: 您说得对!我应该使用 kb-系列技能来管理知识库。让我查看可用的技能: +assistant: 明白了!我应该使用 `kb_workflow` 技能来处理。让我先检查环境变量,然后用正确的方式处理: +assistant: ✅ **已使用 `kb_workflow` 技能完成知识库添加** + +### 处理流程 +1. **URL解析** → B站视频 BV1irAGz9EgZ +2. **内容下载** → 音频文件 (10:35) + 元数据 +3. **ASR识别** → Whisper 转录文本 +4. **智能分段** → 8个主题段落 +5. **深度分析** → AI 生成结构化内容 +6. **自动归档** → 知识库存储 + +### 生成文件 +- **归档位置**: + ``` + ~/work/zq/30.资源/AI分析/bilibili/ + 20260323_BV1irAGz9EgZ_【3月22日晚上_战况汇总】...analysis.md + ``` +- **中间文件**: + ``` + ~/work/intermediate/analysis/bilibili_BV1irAGz9EgZ/ + ├── bilibili_BV1irAGz9EgZ_metadata.json + ├── bilibili_BV1irAGz9EgZ.m4a + ├── bilibili_BV1irAGz9EgZ_whisper.txt + ├── bilibili_BV1irAGz9EgZ_whisper.srt + └── analysis.md + ``` + +### 内容亮点 +- 完整转录了10分35秒的视频内容 +- 智能分段为8个主题段落 +- 包含战况、武器装备、战略分析等关键信息 +- 已自动归档到知识库系统 + +下次添加知识库内容时,我会直接使用 `kb_workflow` 技能!📚 diff --git a/agents/knowledge-base/workspace/memory/2026-03-23.md b/agents/knowledge-base/workspace/memory/2026-03-23.md new file mode 100644 index 0000000..1be1b67 --- /dev/null +++ b/agents/knowledge-base/workspace/memory/2026-03-23.md @@ -0,0 +1,20 @@ +# 2026-03-23 记忆 + +## 知识库管理 + +### 添加中东冲突追踪(使用kb_workflow技能) +- **时间**:23:35 +- **用户**:张青 +- **内容**:用户要求添加B站视频到知识库 +- **视频**:【3月22日晚上 战况汇总】以色列核城市遭伊朗导弹打击 +- **技能**:使用 `kb_workflow` 技能进行完整处理 +- **处理流程**: + 1. ✅ URL解析(B站视频 BV1irAGz9EgZ) + 2. ✅ 内容下载(音频文件 m4a + 元数据) + 3. ✅ ASR语音识别(Whisper转录) + 4. ✅ SRT处理(分段和修正) + 5. ✅ 深度分析(AI分析生成结构化内容) + 6. ✅ 归档(保存到知识库) +- **归档位置**:`~/work/zq/30.资源/AI分析/bilibili/20260323_BV1irAGz9EgZ_【3月22日晚上_战况汇总】...analysis.md` +- **中间文件**:`~/work/intermediate/analysis/bilibili_BV1irAGz9EgZ/` +- **教训**:应该优先使用技能而非手动创建文件 diff --git a/agents/ui-designer/sessions/sessions.json b/agents/ui-designer/sessions/sessions.json index 5ea9fca..c107c77 100644 --- a/agents/ui-designer/sessions/sessions.json +++ b/agents/ui-designer/sessions/sessions.json @@ -1,7 +1,7 @@ { "agent:ui-designer:main": { - "sessionId": "60827bbf-d985-4a29-bd62-1783159bb38e", - "updatedAt": 1773937164358, + "sessionId": "e72c0831-24b6-41e1-ba9f-dbf74b3bdba4", + "updatedAt": 1774279437070, "systemSent": true, "abortedLastRun": false, "chatType": "direct", @@ -22,7 +22,7 @@ "to": "user:ou_9847ce84b960736c14554730b41e4957", "accountId": "feishu-art" }, - "sessionFile": "/home/starmen1265/.openclaw/agents/ui-designer/sessions/60827bbf-d985-4a29-bd62-1783159bb38e.jsonl", + "sessionFile": "/home/starmen1265/.openclaw/agents/ui-designer/sessions/e72c0831-24b6-41e1-ba9f-dbf74b3bdba4.jsonl", "compactionCount": 0, "skillsSnapshot": { "prompt": "\n\nThe following skills provide specialized instructions for specific tasks.\nUse the read tool to load a skill's file when the task matches its description.\nWhen a skill file references a relative path, resolve it against the skill directory (parent of SKILL.md / dirname of the path) and use that absolute path in tool commands.\n\n\n \n capability-evolver\n A self-evolution engine for AI agents. Analyzes runtime history to identify improvements and applies protocol-constrained evolution.\n ~/.openclaw/skills/capability-evolver/SKILL.md\n \n", @@ -51,8 +51,8 @@ "model": "glm-5", "systemPromptReport": { "source": "run", - "generatedAt": 1773937122951, - "sessionId": "60827bbf-d985-4a29-bd62-1783159bb38e", + "generatedAt": 1774279351890, + "sessionId": "e72c0831-24b6-41e1-ba9f-dbf74b3bdba4", "sessionKey": "agent:ui-designer:main", "provider": "zhipu", "model": "glm-5", @@ -64,8 +64,8 @@ "sandboxed": false }, "systemPrompt": { - "chars": 36876, - "projectContextChars": 24391, + "chars": 45313, + "projectContextChars": 32828, "nonProjectContextChars": 12485 }, "injectedWorkspaceFiles": [ @@ -301,6 +301,84 @@ "injectedChars": 616, "truncated": false }, + { + "path": "SELF_IMPROVEMENT_REMINDER.md", + "rawChars": 616, + "injectedChars": 616, + "truncated": false + }, + { + "path": "SELF_IMPROVEMENT_REMINDER.md", + "rawChars": 616, + "injectedChars": 616, + "truncated": false + }, + { + "path": "SELF_IMPROVEMENT_REMINDER.md", + "rawChars": 616, + "injectedChars": 616, + "truncated": false + }, + { + "path": "SELF_IMPROVEMENT_REMINDER.md", + "rawChars": 616, + "injectedChars": 616, + "truncated": false + }, + { + "path": "SELF_IMPROVEMENT_REMINDER.md", + "rawChars": 616, + "injectedChars": 616, + "truncated": false + }, + { + "path": "SELF_IMPROVEMENT_REMINDER.md", + "rawChars": 616, + "injectedChars": 616, + "truncated": false + }, + { + "path": "SELF_IMPROVEMENT_REMINDER.md", + "rawChars": 616, + "injectedChars": 616, + "truncated": false + }, + { + "path": "SELF_IMPROVEMENT_REMINDER.md", + "rawChars": 616, + "injectedChars": 616, + "truncated": false + }, + { + "path": "SELF_IMPROVEMENT_REMINDER.md", + "rawChars": 616, + "injectedChars": 616, + "truncated": false + }, + { + "path": "SELF_IMPROVEMENT_REMINDER.md", + "rawChars": 616, + "injectedChars": 616, + "truncated": false + }, + { + "path": "SELF_IMPROVEMENT_REMINDER.md", + "rawChars": 616, + "injectedChars": 616, + "truncated": false + }, + { + "path": "SELF_IMPROVEMENT_REMINDER.md", + "rawChars": 616, + "injectedChars": 616, + "truncated": false + }, + { + "path": "SELF_IMPROVEMENT_REMINDER.md", + "rawChars": 616, + "injectedChars": 616, + "truncated": false + }, { "path": "SELF_IMPROVEMENT_REMINDER.md", "rawChars": 616, @@ -528,13 +606,13 @@ ] } }, - "cacheRead": 23872, + "cacheRead": 80192, "cacheWrite": 0, "totalTokensFresh": true, "contextTokens": 200000, - "inputTokens": 311770, - "outputTokens": 332, - "totalTokens": 170338 + "inputTokens": 74653, + "outputTokens": 2299, + "totalTokens": 80601 }, "agent:ui-designer:cron:78b64c2f-7f91-47ff-9250-d13f546eb21f": { "sessionId": "03e44b46-c707-4a9f-bf3d-1818aafdcde2", @@ -573,5 +651,157 @@ "totalTokensFresh": true, "cacheRead": 441088, "cacheWrite": 0 + }, + "agent:ui-designer:cron:a1b2c3d4-e5f6-7890-abcd-ef1234567890": { + "sessionId": "0564cee8-7b1a-4cf6-9e93-df722d0cf77c", + "updatedAt": 1774251000040, + "systemSent": true, + "label": "Cron: 中国核建每日跟踪", + "skillsSnapshot": { + "prompt": "\n\nThe following skills provide specialized instructions for specific tasks.\nUse the read tool to load a skill's file when the task matches its description.\nWhen a skill file references a relative path, resolve it against the skill directory (parent of SKILL.md / dirname of the path) and use that absolute path in tool commands.\n\n\n \n capability-evolver\n A self-evolution engine for AI agents. Analyzes runtime history to identify improvements and applies protocol-constrained evolution.\n ~/.openclaw/skills/capability-evolver/SKILL.md\n \n", + "skills": [ + { + "name": "capability-evolver" + } + ], + "skillFilter": [ + "capability-evolver", + "self-improving-agent" + ], + "resolvedSkills": [ + { + "name": "capability-evolver", + "description": "A self-evolution engine for AI agents. Analyzes runtime history to identify improvements and applies protocol-constrained evolution.", + "filePath": "/home/starmen1265/.openclaw/skills/capability-evolver/SKILL.md", + "baseDir": "/home/starmen1265/.openclaw/skills/capability-evolver", + "source": "openclaw-managed", + "disableModelInvocation": false + } + ], + "version": 0 + }, + "modelProvider": "zhipu", + "model": "glm-5", + "contextTokens": 200000, + "inputTokens": 37382, + "outputTokens": 5786, + "totalTokens": 39901, + "totalTokensFresh": true, + "cacheRead": 722944, + "cacheWrite": 0 + }, + "agent:ui-designer:cron:a1b2c3d4-e5f6-7890-abcd-ef1234567890:run:0564cee8-7b1a-4cf6-9e93-df722d0cf77c": { + "sessionId": "0564cee8-7b1a-4cf6-9e93-df722d0cf77c", + "updatedAt": 1774251000040, + "systemSent": true, + "label": "Cron: 中国核建每日跟踪", + "skillsSnapshot": { + "prompt": "\n\nThe following skills provide specialized instructions for specific tasks.\nUse the read tool to load a skill's file when the task matches its description.\nWhen a skill file references a relative path, resolve it against the skill directory (parent of SKILL.md / dirname of the path) and use that absolute path in tool commands.\n\n\n \n capability-evolver\n A self-evolution engine for AI agents. Analyzes runtime history to identify improvements and applies protocol-constrained evolution.\n ~/.openclaw/skills/capability-evolver/SKILL.md\n \n", + "skills": [ + { + "name": "capability-evolver" + } + ], + "skillFilter": [ + "capability-evolver", + "self-improving-agent" + ], + "resolvedSkills": [ + { + "name": "capability-evolver", + "description": "A self-evolution engine for AI agents. Analyzes runtime history to identify improvements and applies protocol-constrained evolution.", + "filePath": "/home/starmen1265/.openclaw/skills/capability-evolver/SKILL.md", + "baseDir": "/home/starmen1265/.openclaw/skills/capability-evolver", + "source": "openclaw-managed", + "disableModelInvocation": false + } + ], + "version": 0 + }, + "modelProvider": "zhipu", + "model": "glm-5", + "contextTokens": 200000, + "inputTokens": 37382, + "outputTokens": 5786, + "totalTokens": 39901, + "totalTokensFresh": true, + "cacheRead": 722944, + "cacheWrite": 0 + }, + "agent:ui-designer:cron:b2c3d4e5-f6a7-8901-bcde-f12345678901": { + "sessionId": "db6b8b18-dd48-472b-bc40-f054e79c93c5", + "updatedAt": 1774251457953, + "systemSent": true, + "label": "Cron: 中国海油每日跟踪", + "skillsSnapshot": { + "prompt": "\n\nThe following skills provide specialized instructions for specific tasks.\nUse the read tool to load a skill's file when the task matches its description.\nWhen a skill file references a relative path, resolve it against the skill directory (parent of SKILL.md / dirname of the path) and use that absolute path in tool commands.\n\n\n \n capability-evolver\n A self-evolution engine for AI agents. Analyzes runtime history to identify improvements and applies protocol-constrained evolution.\n ~/.openclaw/skills/capability-evolver/SKILL.md\n \n", + "skills": [ + { + "name": "capability-evolver" + } + ], + "skillFilter": [ + "capability-evolver", + "self-improving-agent" + ], + "resolvedSkills": [ + { + "name": "capability-evolver", + "description": "A self-evolution engine for AI agents. Analyzes runtime history to identify improvements and applies protocol-constrained evolution.", + "filePath": "/home/starmen1265/.openclaw/skills/capability-evolver/SKILL.md", + "baseDir": "/home/starmen1265/.openclaw/skills/capability-evolver", + "source": "openclaw-managed", + "disableModelInvocation": false + } + ], + "version": 0 + }, + "modelProvider": "zhipu", + "model": "glm-4.7-FlashX", + "contextTokens": 200000, + "inputTokens": 28746, + "outputTokens": 1841, + "totalTokens": 37950, + "totalTokensFresh": true, + "cacheRead": 9204, + "cacheWrite": 0 + }, + "agent:ui-designer:cron:b2c3d4e5-f6a7-8901-bcde-f12345678901:run:db6b8b18-dd48-472b-bc40-f054e79c93c5": { + "sessionId": "db6b8b18-dd48-472b-bc40-f054e79c93c5", + "updatedAt": 1774251457953, + "systemSent": true, + "label": "Cron: 中国海油每日跟踪", + "skillsSnapshot": { + "prompt": "\n\nThe following skills provide specialized instructions for specific tasks.\nUse the read tool to load a skill's file when the task matches its description.\nWhen a skill file references a relative path, resolve it against the skill directory (parent of SKILL.md / dirname of the path) and use that absolute path in tool commands.\n\n\n \n capability-evolver\n A self-evolution engine for AI agents. Analyzes runtime history to identify improvements and applies protocol-constrained evolution.\n ~/.openclaw/skills/capability-evolver/SKILL.md\n \n", + "skills": [ + { + "name": "capability-evolver" + } + ], + "skillFilter": [ + "capability-evolver", + "self-improving-agent" + ], + "resolvedSkills": [ + { + "name": "capability-evolver", + "description": "A self-evolution engine for AI agents. Analyzes runtime history to identify improvements and applies protocol-constrained evolution.", + "filePath": "/home/starmen1265/.openclaw/skills/capability-evolver/SKILL.md", + "baseDir": "/home/starmen1265/.openclaw/skills/capability-evolver", + "source": "openclaw-managed", + "disableModelInvocation": false + } + ], + "version": 0 + }, + "modelProvider": "zhipu", + "model": "glm-4.7-FlashX", + "contextTokens": 200000, + "inputTokens": 28746, + "outputTokens": 1841, + "totalTokens": 37950, + "totalTokensFresh": true, + "cacheRead": 9204, + "cacheWrite": 0 } } \ No newline at end of file diff --git a/agents/ui-designer/workspace/MEMORY.md b/agents/ui-designer/workspace/MEMORY.md index 388abe3..85d4e8f 100644 --- a/agents/ui-designer/workspace/MEMORY.md +++ b/agents/ui-designer/workspace/MEMORY.md @@ -39,4 +39,116 @@ --- -*最后更新:2026-03-08* +## 中国核建每日跟踪职责 + +### 用户 +张青 (ou_9847ce84b960736c14554730b41e4957) + +### 执行时间 +- **周期**:每个交易日 +- **定时**:每日15:30(Asia/Shanghai,仅周一至周五) +- **Job ID**:a1b2c3d4-e5f6-7890-abcd-ef1234567890 + +### 跟踪内容 +1. **价格数据**:收盘价、涨跌幅、成交量 +2. **资金流向**:主力资金净流入/流出 +3. **技术分析**:支撑位/压力位判断 +4. **信号提醒**: + - 跌破支撑(15.24元 / 14.80元) + - 主力资金转正 + - 放量企稳/反弹 + +### 关键技术位 +- 支撑位:15.24元 → 14.80元 +- 压力位:15.79元 → 16.50元 + +### 报告输出 +- **飞书推送**:每日收盘后自动发送 +- **文档保存**:`~/work/zq/30.资源/股票跟踪/601611_tracking.md` + +### 开始跟踪 +- **日期**:2026-03-23 +- **初始价格**:15.48元(3月19日收盘) +- **初始状态**:下跌趋势中,主力连续流出 + +### 相关文件 +- 任务配置记录:`memory/2026-03-23.md` +- 跟踪记录:`~/work/zq/30.资源/股票跟踪/601611_tracking.md` +- 定时脚本:`~/.openclaw/cron/scripts/stock-tracker.sh` + +--- + +## 中国海油每日跟踪职责 + +### 用户 +张青 (ou_9847ce84b960736c14554730b41e4957) + +### 执行时间 +- **周期**:每个交易日 +- **定时**:每日15:30(Asia/Shanghai,仅周一至周五) +- **Job ID**:b2c3d4e5-f6a7-8901-bcde-f12345678901 + +### 跟踪内容 +1. **价格数据**:收盘价、涨跌幅、成交量 +2. **资金流向**:主力资金净流入/流出 +3. **技术分析**:支撑位/压力位判断 +4. **油价动态**:布伦特原油价格走势 +5. **信号提醒**: + - 突破前高(44.54元) + - 跌破支撑(40元 / 38元) + - 主力资金异动 + +### 关键技术位 +- 支撑位:40元 → 38元 +- 压力位:44.54元(前高) + +### 报告输出 +- **飞书推送**:每日收盘后自动发送 +- **文档保存**:`~/work/zq/30.资源/股票跟踪/600938_tracking.md` + +### 开始跟踪 +- **日期**:2026-03-23 +- **初始价格**:44.54元(3月9日高点) +- **初始状态**:强势上涨,年内涨幅43.84% + +### 相关文件 +- 任务配置记录:`memory/2026-03-23.md` +- 跟踪记录:`~/work/zq/30.资源/股票跟踪/600938_tracking.md` + +--- + +## 每日热点新闻追踪职责 + +### 用户 +张青 (ou_9847ce84b960736c14554730b41e4957) + +### 执行时间 +- **周期**:每日 +- **定时**:每日08:00(Asia/Shanghai) +- **Job ID**:c3d4e5f6-a7b8-9012-cdef-234567890123 + +### 追踪方向 + +#### 地缘政治 +1. **美国**:政治、经济、外交动态 +2. **日本**:政治、经济、外交动态 +3. **中东地区**:地区局势 +4. **俄乌战争**:最新进展 +5. **美以伊战争**:最新进展 + +#### 科技产业 +6. **AI大厂**:OpenAI、Google、Meta、百度、阿里、腾讯、字节等 +7. **中国航空航天**:火箭、卫星、载人航天、探月等 +8. **新能源**:电动车、电池、光伏、风电、储能等 +9. **军工**:国产武器、军售、国防政策等 + +### 报告输出 +- **飞书推送**:每日早上8点自动发送 +- **文档保存**:`~/work/zq/30.资源/新闻简报/YYYY-MM-DD.md` + +### 开始跟踪 +- **日期**:2026-03-23 + +--- + +*最后更新:2026-03-23* diff --git a/agents/ui-designer/workspace/memory/2026-03-23.md b/agents/ui-designer/workspace/memory/2026-03-23.md new file mode 100644 index 0000000..00e8c6f --- /dev/null +++ b/agents/ui-designer/workspace/memory/2026-03-23.md @@ -0,0 +1,99 @@ +# 2026-03-23 + +## 股票跟踪任务 + +### 中国核建(601611) + +**跟踪用户**:张青 + +**当前状态**(2026-03-23): +- 收盘价:15.48元(3月19日) +- 走势特征:连续下跌+缩量 +- 主力资金:连续净流出(3/18: -1.62亿, 3/19: -1.82亿) +- 技术位:支撑15.24元,压力15.79元 + +**跟踪重点**: +1. 是否跌破15.24元支撑位 +2. 主力资金是否转正 +3. 是否出现放量企稳信号 +4. 14.80-15.00元区间的介入机会 + +**报告频率**:每日收盘后(15:30,仅工作日) + +**报告方式**:飞书推送 + +--- + +## 上午分析记录 + +### 缩量下跌技术分析 +- 用户询问缩量下跌的含义 +- 解答了积极信号(卖压减弱、惜售)和消极信号(买盘乏力、可能阴跌) +- 强调需结合位置判断(高位/下跌趋势/低位) + +### 中国核建深度分析 +- 基本面:2025Q3营收739亿(-6.32%),净利润11亿(-23.96%) +- 技术面:跌破15.79支撑,考验15.24元 +- 行业面:核电黄金周期,装机规模全球第一 +- 估值:PB 0.89倍,处于历史低位 +- 建议:不急于抄底,等企稳信号 + +### 中国海油(600938) + +**跟踪用户**:张青 + +**当前状态**(2026-03-23): +- 最新高点:44.54元(3月9日,创上市新高) +- 今年涨幅:+43.84% +- 走势特征:强势上涨,地缘政治催化 +- 技术位:支撑40元/38元,压力44.54元(前高) + +**跟踪重点**: +1. 是否突破44.54元前高 +2. 是否跌破40元支撑 +3. 油价走势、地缘政治动态 +4. 主力资金流向变化 + +**报告频率**:每日收盘后(15:30,仅工作日) + +**报告方式**:飞书推送 + +**分析要点**: +- 基本面:2024年净利润1379亿(+11.4%),三桶油中唯一正增长 +- 成本优势:桶油成本28美元,全球领先 +- 分红政策:2025-2027年股息支付率≥45% +- 风险:地缘平息后油价可能回落,短期涨幅大 +- 建议:不追高,等回调至38-40元再介入 + +--- + +## 新闻追踪任务 + +### 每日热点新闻追踪 + +**设置时间**:2026-03-23 23:22 +**执行频率**:每日 08:00 +**推送方式**:飞书 + +**追踪方向**: + +**地缘政治**: +1. 美国 - 政治、经济、外交 +2. 日本 - 政治、经济、外交 +3. 中东地区 - 地区局势 +4. 俄乌战争 - 最新进展 +5. 美以伊战争 - 最新进展 + +**科技产业**: +6. AI大厂 - OpenAI/Google/Meta/百度/阿里/腾讯/字节 +7. 中国航空航天 - 火箭/卫星/载人航天/探月 +8. 新能源 - 电动车/电池/光伏/风电/储能 +9. 军工 - 国产武器/军售/国防政策 + +**输出**: +- 飞书推送 +- 保存到 `~/work/zq/30.资源/新闻简报/YYYY-MM-DD.md` + +--- + +*最后更新:2026-03-23 23:25* diff --git a/cron/jobs.json b/cron/jobs.json index edd53f4..59be1bb 100644 --- a/cron/jobs.json +++ b/cron/jobs.json @@ -7,7 +7,7 @@ "name": "backup-openclaw-json", "enabled": true, "createdAtMs": 1772261581796, - "updatedAtMs": 1774202421534, + "updatedAtMs": 1774288823638, "schedule": { "kind": "cron", "expr": "0 2 * * *", @@ -23,10 +23,10 @@ "mode": "announce" }, "state": { - "nextRunAtMs": 1774288800000, - "lastRunAtMs": 1774202400004, + "nextRunAtMs": 1774375200000, + "lastRunAtMs": 1774288800003, "lastStatus": "ok", - "lastDurationMs": 21530, + "lastDurationMs": 23635, "consecutiveErrors": 0, "lastRunStatus": "ok", "lastDelivered": true, @@ -59,7 +59,8 @@ "consecutiveErrors": 0, "lastRunStatus": "ok", "lastDeliveryStatus": "delivered", - "lastDelivered": true + "lastDelivered": true, + "runningAtMs": 1774289400003 }, "delivery": { "mode": "announce" @@ -71,7 +72,7 @@ "name": "capability-evolver-daily", "enabled": true, "createdAtMs": 1772550743528, - "updatedAtMs": 1774117800012, + "updatedAtMs": 1774203773939, "schedule": { "kind": "cron", "expr": "20 2 * * *", @@ -92,14 +93,16 @@ "to": "feishu-pm" }, "state": { - "nextRunAtMs": 1774203600000, - "lastRunAtMs": 1774117200004, - "lastStatus": "error", - "lastDurationMs": 600008, - "consecutiveErrors": 9, - "lastRunStatus": "error", - "lastDeliveryStatus": "unknown", - "runningAtMs": 1774203600003 + "nextRunAtMs": 1774290000000, + "lastRunAtMs": 1774203600004, + "lastStatus": "ok", + "lastDurationMs": 173935, + "consecutiveErrors": 0, + "lastRunStatus": "ok", + "lastDeliveryStatus": "not-delivered", + "lastError": "cron announce delivery failed", + "lastDelivered": false, + "lastDeliveryError": "cron announce delivery failed" } }, { @@ -109,7 +112,7 @@ "description": "每天凌晨2:30整理昨天的已完成任务到每日回顾", "enabled": true, "createdAtMs": 1741484880000, - "updatedAtMs": 1774117824773, + "updatedAtMs": 1774204228351, "schedule": { "kind": "cron", "expr": "30 2 * * *", @@ -127,11 +130,11 @@ "channel": "last" }, "state": { - "nextRunAtMs": 1774204200000, - "lastRunAtMs": 1774117802034, + "nextRunAtMs": 1774290600000, + "lastRunAtMs": 1774204200008, "lastRunStatus": "ok", "lastStatus": "ok", - "lastDurationMs": 22739, + "lastDurationMs": 28343, "lastDelivered": true, "lastDeliveryStatus": "delivered", "consecutiveErrors": 0 @@ -143,7 +146,7 @@ "name": "zq_workspace_sync", "enabled": true, "createdAtMs": 1772551807455, - "updatedAtMs": 1774118400007, + "updatedAtMs": 1774204800004, "schedule": { "expr": "40 2 * * *", "kind": "cron", @@ -156,8 +159,8 @@ "text": "执行 zq 工作区同步:bash ~/.openclaw/cron/scripts/zq_workspace_sync.sh" }, "state": { - "nextRunAtMs": 1774204800000, - "lastRunAtMs": 1774118400007, + "nextRunAtMs": 1774291200000, + "lastRunAtMs": 1774204800004, "lastStatus": "skipped", "lastDurationMs": 0, "consecutiveErrors": 0, @@ -173,7 +176,7 @@ "description": "每天早上8点整理与各个 AI 代理的对话记录", "enabled": true, "createdAtMs": 1772776369645, - "updatedAtMs": 1774137620376, + "updatedAtMs": 1774224025295, "schedule": { "kind": "cron", "expr": "0 8 * * *", @@ -191,11 +194,11 @@ "channel": "last" }, "state": { - "nextRunAtMs": 1774224000000, - "lastRunAtMs": 1774137600029, + "nextRunAtMs": 1774310400000, + "lastRunAtMs": 1774224000006, "lastRunStatus": "ok", "lastStatus": "ok", - "lastDurationMs": 20347, + "lastDurationMs": 25289, "lastDelivered": true, "lastDeliveryStatus": "delivered", "consecutiveErrors": 0 @@ -208,7 +211,7 @@ "description": "每天7点同步提醒到CalDAV日历", "enabled": true, "createdAtMs": 1772791528528, - "updatedAtMs": 1774134016722, + "updatedAtMs": 1774220419806, "schedule": { "kind": "cron", "expr": "0 7 * * *", @@ -226,11 +229,11 @@ "channel": "last" }, "state": { - "nextRunAtMs": 1774220400000, - "lastRunAtMs": 1774134000003, + "nextRunAtMs": 1774306800000, + "lastRunAtMs": 1774220400002, "lastRunStatus": "ok", "lastStatus": "ok", - "lastDurationMs": 16719, + "lastDurationMs": 19804, "lastDeliveryStatus": "delivered", "consecutiveErrors": 0, "lastDelivered": true @@ -271,6 +274,105 @@ "lastDeliveryStatus": "delivered", "consecutiveErrors": 1 } + }, + { + "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", + "agentId": "ui-designer", + "name": "中国核建每日跟踪", + "description": "每日收盘后跟踪中国核建(601611)股价走势", + "enabled": true, + "createdAtMs": 1774231320000, + "updatedAtMs": 1774251457902, + "schedule": { + "kind": "cron", + "expr": "30 15 * * 1-5", + "tz": "Asia/Shanghai" + }, + "sessionTarget": "isolated", + "wakeMode": "now", + "payload": { + "kind": "agentTurn", + "message": "执行中国核建(601611)每日跟踪任务:\n\n1. 通过web_search获取今日收盘价、涨跌幅、成交量、主力资金流向\n2. 对比昨日数据,分析走势变化\n3. 检查关键技术位:支撑15.24元/14.80元,压力15.79元/16.50元\n4. 判断是否出现:跌破支撑/主力回流/放量企稳等信号\n5. 将分析结果保存到~/work/zq/30.资源/股票跟踪/601611_tracking.md\n6. 推送飞书消息给用户\n\n如果今日休市,回复'今日休市'即可。" + }, + "delivery": { + "mode": "announce", + "channel": "feishu", + "to": "user:ou_9847ce84b960736c14554730b41e4957" + }, + "state": { + "nextRunAtMs": 1774337400000, + "lastRunAtMs": 1774251000004, + "lastRunStatus": "error", + "lastStatus": "error", + "lastDurationMs": 457898, + "lastError": "⚠️ ✉️ Message failed", + "lastDelivered": true, + "lastDeliveryStatus": "delivered", + "consecutiveErrors": 1 + } + }, + { + "id": "b2c3d4e5-f6a7-8901-bcde-f12345678901", + "agentId": "ui-designer", + "name": "中国海油每日跟踪", + "description": "每日收盘后跟踪中国海油(600938)股价走势", + "enabled": true, + "createdAtMs": 1774231920000, + "updatedAtMs": 1774252089426, + "schedule": { + "kind": "cron", + "expr": "30 15 * * 1-5", + "tz": "Asia/Shanghai" + }, + "sessionTarget": "isolated", + "wakeMode": "now", + "payload": { + "kind": "agentTurn", + "message": "执行中国海油(600938)每日跟踪任务:\n\n1. 通过web_search获取今日收盘价、涨跌幅、成交量、主力资金流向\n2. 对比昨日数据,分析走势变化\n3. 检查关键技术位:支撑40元/38元,压力44.54元(前高)\n4. 关注油价走势、地缘政治动态\n5. 判断是否出现:突破前高/跌破支撑/主力异动等信号\n6. 将分析结果保存到~/work/zq/30.资源/股票跟踪/600938_tracking.md\n7. 推送飞书消息给用户\n\n如果今日休市,回复'今日休市'即可。" + }, + "delivery": { + "mode": "announce", + "channel": "feishu", + "to": "user:ou_9847ce84b960736c14554730b41e4957" + }, + "state": { + "nextRunAtMs": 1774337400000, + "lastRunAtMs": 1774251457902, + "lastRunStatus": "ok", + "lastStatus": "ok", + "lastDurationMs": 631524, + "lastDelivered": true, + "lastDeliveryStatus": "delivered", + "consecutiveErrors": 0 + } + }, + { + "id": "c3d4e5f6-a7b8-9012-cdef-234567890123", + "agentId": "ui-designer", + "name": "每日热点新闻追踪", + "description": "每天早上8点追踪热点新闻并推送", + "enabled": true, + "createdAtMs": 1774274400000, + "updatedAtMs": 1774274400000, + "schedule": { + "kind": "cron", + "expr": "0 8 * * *", + "tz": "Asia/Shanghai" + }, + "sessionTarget": "isolated", + "wakeMode": "now", + "payload": { + "kind": "agentTurn", + "message": "执行每日热点新闻追踪任务:\n\n通过web_search搜索以下领域的最新新闻:\n\n**地缘政治**:\n1. 美国政治、经济、外交动态\n2. 日本政治、经济、外交动态\n3. 中东地区局势\n4. 俄乌战争最新进展\n5. 美以伊战争最新进展\n\n**科技产业**:\n6. 国内外AI大厂动态(OpenAI、Google、Meta、百度、阿里、腾讯、字节等)\n7. 中国航空航天进展(火箭、卫星、载人航天、探月等)\n8. 新能源行业动态(电动车、电池、光伏、风电、储能等)\n9. 军工行业动态(国产武器、军售、国防政策等)\n\n**输出要求**:\n- 每个领域筛选2-3条重要新闻\n- 标注新闻来源和时间\n- 简要说明新闻影响\n- 报告保存到~/work/zq/30.资源/新闻简报/YYYY-MM-DD.md\n- 推送飞书消息给用户" + }, + "delivery": { + "mode": "announce", + "channel": "feishu", + "to": "user:ou_9847ce84b960736c14554730b41e4957" + }, + "state": { + "nextRunAtMs": 1774310400000 + } } ] } \ No newline at end of file diff --git a/cron/jobs.json.bak b/cron/jobs.json.bak index 1a075a7..039b4f7 100644 --- a/cron/jobs.json.bak +++ b/cron/jobs.json.bak @@ -7,7 +7,7 @@ "name": "backup-openclaw-json", "enabled": true, "createdAtMs": 1772261581796, - "updatedAtMs": 1774202421534, + "updatedAtMs": 1774288823638, "schedule": { "kind": "cron", "expr": "0 2 * * *", @@ -23,10 +23,10 @@ "mode": "announce" }, "state": { - "nextRunAtMs": 1774288800000, - "lastRunAtMs": 1774202400004, + "nextRunAtMs": 1774375200000, + "lastRunAtMs": 1774288800003, "lastStatus": "ok", - "lastDurationMs": 21530, + "lastDurationMs": 23635, "consecutiveErrors": 0, "lastRunStatus": "ok", "lastDelivered": true, @@ -71,7 +71,7 @@ "name": "capability-evolver-daily", "enabled": true, "createdAtMs": 1772550743528, - "updatedAtMs": 1774117800012, + "updatedAtMs": 1774203773939, "schedule": { "kind": "cron", "expr": "20 2 * * *", @@ -92,14 +92,16 @@ "to": "feishu-pm" }, "state": { - "nextRunAtMs": 1774203600000, - "lastRunAtMs": 1774117200004, - "lastStatus": "error", - "lastDurationMs": 600008, - "consecutiveErrors": 9, - "lastRunStatus": "error", - "lastDeliveryStatus": "unknown", - "lastError": "cron: job execution timed out" + "nextRunAtMs": 1774290000000, + "lastRunAtMs": 1774203600004, + "lastStatus": "ok", + "lastDurationMs": 173935, + "consecutiveErrors": 0, + "lastRunStatus": "ok", + "lastDeliveryStatus": "not-delivered", + "lastError": "cron announce delivery failed", + "lastDelivered": false, + "lastDeliveryError": "cron announce delivery failed" } }, { @@ -109,7 +111,7 @@ "description": "每天凌晨2:30整理昨天的已完成任务到每日回顾", "enabled": true, "createdAtMs": 1741484880000, - "updatedAtMs": 1774117824773, + "updatedAtMs": 1774204228351, "schedule": { "kind": "cron", "expr": "30 2 * * *", @@ -127,11 +129,11 @@ "channel": "last" }, "state": { - "nextRunAtMs": 1774204200000, - "lastRunAtMs": 1774117802034, + "nextRunAtMs": 1774290600000, + "lastRunAtMs": 1774204200008, "lastRunStatus": "ok", "lastStatus": "ok", - "lastDurationMs": 22739, + "lastDurationMs": 28343, "lastDelivered": true, "lastDeliveryStatus": "delivered", "consecutiveErrors": 0 @@ -143,7 +145,7 @@ "name": "zq_workspace_sync", "enabled": true, "createdAtMs": 1772551807455, - "updatedAtMs": 1774118400007, + "updatedAtMs": 1774204800004, "schedule": { "expr": "40 2 * * *", "kind": "cron", @@ -156,8 +158,8 @@ "text": "执行 zq 工作区同步:bash ~/.openclaw/cron/scripts/zq_workspace_sync.sh" }, "state": { - "nextRunAtMs": 1774204800000, - "lastRunAtMs": 1774118400007, + "nextRunAtMs": 1774291200000, + "lastRunAtMs": 1774204800004, "lastStatus": "skipped", "lastDurationMs": 0, "consecutiveErrors": 0, @@ -173,7 +175,7 @@ "description": "每天早上8点整理与各个 AI 代理的对话记录", "enabled": true, "createdAtMs": 1772776369645, - "updatedAtMs": 1774137620376, + "updatedAtMs": 1774224025295, "schedule": { "kind": "cron", "expr": "0 8 * * *", @@ -191,11 +193,11 @@ "channel": "last" }, "state": { - "nextRunAtMs": 1774224000000, - "lastRunAtMs": 1774137600029, + "nextRunAtMs": 1774310400000, + "lastRunAtMs": 1774224000006, "lastRunStatus": "ok", "lastStatus": "ok", - "lastDurationMs": 20347, + "lastDurationMs": 25289, "lastDelivered": true, "lastDeliveryStatus": "delivered", "consecutiveErrors": 0 @@ -208,7 +210,7 @@ "description": "每天7点同步提醒到CalDAV日历", "enabled": true, "createdAtMs": 1772791528528, - "updatedAtMs": 1774134016722, + "updatedAtMs": 1774220419806, "schedule": { "kind": "cron", "expr": "0 7 * * *", @@ -226,11 +228,11 @@ "channel": "last" }, "state": { - "nextRunAtMs": 1774220400000, - "lastRunAtMs": 1774134000003, + "nextRunAtMs": 1774306800000, + "lastRunAtMs": 1774220400002, "lastRunStatus": "ok", "lastStatus": "ok", - "lastDurationMs": 16719, + "lastDurationMs": 19804, "lastDeliveryStatus": "delivered", "consecutiveErrors": 0, "lastDelivered": true @@ -271,6 +273,105 @@ "lastDeliveryStatus": "delivered", "consecutiveErrors": 1 } + }, + { + "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", + "agentId": "ui-designer", + "name": "中国核建每日跟踪", + "description": "每日收盘后跟踪中国核建(601611)股价走势", + "enabled": true, + "createdAtMs": 1774231320000, + "updatedAtMs": 1774251457902, + "schedule": { + "kind": "cron", + "expr": "30 15 * * 1-5", + "tz": "Asia/Shanghai" + }, + "sessionTarget": "isolated", + "wakeMode": "now", + "payload": { + "kind": "agentTurn", + "message": "执行中国核建(601611)每日跟踪任务:\n\n1. 通过web_search获取今日收盘价、涨跌幅、成交量、主力资金流向\n2. 对比昨日数据,分析走势变化\n3. 检查关键技术位:支撑15.24元/14.80元,压力15.79元/16.50元\n4. 判断是否出现:跌破支撑/主力回流/放量企稳等信号\n5. 将分析结果保存到~/work/zq/30.资源/股票跟踪/601611_tracking.md\n6. 推送飞书消息给用户\n\n如果今日休市,回复'今日休市'即可。" + }, + "delivery": { + "mode": "announce", + "channel": "feishu", + "to": "user:ou_9847ce84b960736c14554730b41e4957" + }, + "state": { + "nextRunAtMs": 1774337400000, + "lastRunAtMs": 1774251000004, + "lastRunStatus": "error", + "lastStatus": "error", + "lastDurationMs": 457898, + "lastError": "⚠️ ✉️ Message failed", + "lastDelivered": true, + "lastDeliveryStatus": "delivered", + "consecutiveErrors": 1 + } + }, + { + "id": "b2c3d4e5-f6a7-8901-bcde-f12345678901", + "agentId": "ui-designer", + "name": "中国海油每日跟踪", + "description": "每日收盘后跟踪中国海油(600938)股价走势", + "enabled": true, + "createdAtMs": 1774231920000, + "updatedAtMs": 1774252089426, + "schedule": { + "kind": "cron", + "expr": "30 15 * * 1-5", + "tz": "Asia/Shanghai" + }, + "sessionTarget": "isolated", + "wakeMode": "now", + "payload": { + "kind": "agentTurn", + "message": "执行中国海油(600938)每日跟踪任务:\n\n1. 通过web_search获取今日收盘价、涨跌幅、成交量、主力资金流向\n2. 对比昨日数据,分析走势变化\n3. 检查关键技术位:支撑40元/38元,压力44.54元(前高)\n4. 关注油价走势、地缘政治动态\n5. 判断是否出现:突破前高/跌破支撑/主力异动等信号\n6. 将分析结果保存到~/work/zq/30.资源/股票跟踪/600938_tracking.md\n7. 推送飞书消息给用户\n\n如果今日休市,回复'今日休市'即可。" + }, + "delivery": { + "mode": "announce", + "channel": "feishu", + "to": "user:ou_9847ce84b960736c14554730b41e4957" + }, + "state": { + "nextRunAtMs": 1774337400000, + "lastRunAtMs": 1774251457902, + "lastRunStatus": "ok", + "lastStatus": "ok", + "lastDurationMs": 631524, + "lastDelivered": true, + "lastDeliveryStatus": "delivered", + "consecutiveErrors": 0 + } + }, + { + "id": "c3d4e5f6-a7b8-9012-cdef-234567890123", + "agentId": "ui-designer", + "name": "每日热点新闻追踪", + "description": "每天早上8点追踪热点新闻并推送", + "enabled": true, + "createdAtMs": 1774274400000, + "updatedAtMs": 1774274400000, + "schedule": { + "kind": "cron", + "expr": "0 8 * * *", + "tz": "Asia/Shanghai" + }, + "sessionTarget": "isolated", + "wakeMode": "now", + "payload": { + "kind": "agentTurn", + "message": "执行每日热点新闻追踪任务:\n\n通过web_search搜索以下领域的最新新闻:\n\n**地缘政治**:\n1. 美国政治、经济、外交动态\n2. 日本政治、经济、外交动态\n3. 中东地区局势\n4. 俄乌战争最新进展\n5. 美以伊战争最新进展\n\n**科技产业**:\n6. 国内外AI大厂动态(OpenAI、Google、Meta、百度、阿里、腾讯、字节等)\n7. 中国航空航天进展(火箭、卫星、载人航天、探月等)\n8. 新能源行业动态(电动车、电池、光伏、风电、储能等)\n9. 军工行业动态(国产武器、军售、国防政策等)\n\n**输出要求**:\n- 每个领域筛选2-3条重要新闻\n- 标注新闻来源和时间\n- 简要说明新闻影响\n- 报告保存到~/work/zq/30.资源/新闻简报/YYYY-MM-DD.md\n- 推送飞书消息给用户" + }, + "delivery": { + "mode": "announce", + "channel": "feishu", + "to": "user:ou_9847ce84b960736c14554730b41e4957" + }, + "state": { + "nextRunAtMs": 1774310400000 + } } ] } \ No newline at end of file diff --git a/cron/scripts/stock-tracker.sh b/cron/scripts/stock-tracker.sh new file mode 100644 index 0000000..619c525 --- /dev/null +++ b/cron/scripts/stock-tracker.sh @@ -0,0 +1,45 @@ +#!/bin/bash +# 中国核建(601611)每日跟踪脚本 +# 用途:获取股价数据,保存到跟踪记录 + +STOCK_CODE="601611" +STOCK_NAME="中国核建" +TODAY=$(date +%Y-%m-%d) +LOG_DIR="$HOME/work/zq/30.资源/股票跟踪" +LOG_FILE="$LOG_DIR/${STOCK_CODE}_tracking.md" + +# 确保目录存在 +mkdir -p "$LOG_DIR" + +# 初始化日志文件(如果不存在) +if [ ! -f "$LOG_FILE" ]; then + cat > "$LOG_FILE" << EOF +# 中国核建(601611)跟踪记录 + +## 基本信息 +- 股票代码:601611 +- 股票名称:中国核建 +- 跟踪用户:张青 +- 开始跟踪:${TODAY} + +## 关键技术位 +- 支撑位:15.24元 / 14.80元 +- 压力位:15.79元 / 16.50元 + +## 跟踪重点 +1. 是否跌破支撑位 +2. 主力资金流向变化 +3. 放量企稳/反弹信号 +4. 14.80-15.00元介入机会 + +--- + +## 每日记录 + +EOF +fi + +# 输出日期标记(实际数据由 agent 通过 web_search 获取) +echo "触发股票跟踪任务: ${STOCK_NAME} (${STOCK_CODE})" +echo "日期: ${TODAY}" +echo "状态: pending" diff --git a/delivery-queue/81601882-e50a-4a8b-a8bc-e19b156b7b05.json b/delivery-queue/81601882-e50a-4a8b-a8bc-e19b156b7b05.json new file mode 100644 index 0000000..06c03ba --- /dev/null +++ b/delivery-queue/81601882-e50a-4a8b-a8bc-e19b156b7b05.json @@ -0,0 +1,24 @@ +{ + "id": "81601882-e50a-4a8b-a8bc-e19b156b7b05", + "enqueuedAt": 1774203652711, + "channel": "feishu", + "to": "ou_73cc4f75e3c953d7bf11f34f8c8c7618", + "accountId": "feishu-pm", + "payloads": [ + { + "text": "## Capability Evolver 每日报告\n\n**时间**: 2026年 03月 23日 星期一 02:20 CST\n**结果**: SUCCESS\n**意图**: REPAIR (修复)\n\n### 本次变更\n\n**影响范围**: 4 个修改,6 个新建\n\n**修改文件**:\n- `memory/evolution/evolution_solidify_state.json` (修改)\n- `memory/evolution/evolution_state.json` (修改)\n- `memory/evolution/memory_graph_state.json` (修改)\n- `memory/evolution/personality_state.json` (修改)\n\n**新建文件**:\n- `memory/evolution/gep_prompt_Cycle_#0018_run_1774203606866.json`\n- `memory/evolution/gep_prompt_Cycle_#0018_run_1774203606866.txt`\n\n**代码统计**:\n- 插入: 551 行\n- 删除: 14 行\n\n### 执行摘要\n\n本次 evolver 运行成功,主要修复了 session logs 检测和 fallback 行为的稳定性。\n\n**变更详情**: see `~/work/backup/evolver-output.txt` for full logs.", + "replyToTag": false, + "replyToCurrent": false, + "audioAsVoice": false + } + ], + "gifPlayback": false, + "mirror": { + "sessionKey": "agent:haonan:main", + "agentId": "haonan", + "text": "## Capability Evolver 每日报告\n\n**时间**: 2026年 03月 23日 星期一 02:20 CST\n**结果**: SUCCESS\n**意图**: REPAIR (修复)\n\n### 本次变更\n\n**影响范围**: 4 个修改,6 个新建\n\n**修改文件**:\n- `memory/evolution/evolution_solidify_state.json` (修改)\n- `memory/evolution/evolution_state.json` (修改)\n- `memory/evolution/memory_graph_state.json` (修改)\n- `memory/evolution/personality_state.json` (修改)\n\n**新建文件**:\n- `memory/evolution/gep_prompt_Cycle_#0018_run_1774203606866.json`\n- `memory/evolution/gep_prompt_Cycle_#0018_run_1774203606866.txt`\n\n**代码统计**:\n- 插入: 551 行\n- 删除: 14 行\n\n### 执行摘要\n\n本次 evolver 运行成功,主要修复了 session logs 检测和 fallback 行为的稳定性。\n\n**变更详情**: see `~/work/backup/evolver-output.txt` for full logs." + }, + "retryCount": 1, + "lastAttemptAt": 1774203652867, + "lastError": "Request failed with status code 400" +} \ No newline at end of file diff --git a/delivery-queue/89181ed1-39cf-4f24-b4e5-2df4d7b6fd34.json b/delivery-queue/89181ed1-39cf-4f24-b4e5-2df4d7b6fd34.json new file mode 100644 index 0000000..95bef82 --- /dev/null +++ b/delivery-queue/89181ed1-39cf-4f24-b4e5-2df4d7b6fd34.json @@ -0,0 +1,24 @@ +{ + "id": "89181ed1-39cf-4f24-b4e5-2df4d7b6fd34", + "enqueuedAt": 1774203674178, + "channel": "feishu", + "to": "ou_73cc4f75e3c953d7bf11f34f8c8c7618", + "accountId": "feishu-pm", + "payloads": [ + { + "text": "Capability Evolver 每日报告:\n时间:2026-03-23 02:20 CST\n结果:SUCCESS\n意图:REPAIR\n变更:4 修改 + 6 新建\n统计:+551 行,-14 行\n详情:查看 ~/work/backup/evolver-output.txt", + "replyToTag": false, + "replyToCurrent": false, + "audioAsVoice": false + } + ], + "gifPlayback": false, + "mirror": { + "sessionKey": "agent:haonan:main", + "agentId": "haonan", + "text": "Capability Evolver 每日报告:\n时间:2026-03-23 02:20 CST\n结果:SUCCESS\n意图:REPAIR\n变更:4 修改 + 6 新建\n统计:+551 行,-14 行\n详情:查看 ~/work/backup/evolver-output.txt" + }, + "retryCount": 1, + "lastAttemptAt": 1774203674333, + "lastError": "Request failed with status code 400" +} \ No newline at end of file diff --git a/delivery-queue/a74a559f-aea8-4d9d-8d4a-46402b208d15.json b/delivery-queue/a74a559f-aea8-4d9d-8d4a-46402b208d15.json new file mode 100644 index 0000000..46463d9 --- /dev/null +++ b/delivery-queue/a74a559f-aea8-4d9d-8d4a-46402b208d15.json @@ -0,0 +1,24 @@ +{ + "id": "a74a559f-aea8-4d9d-8d4a-46402b208d15", + "enqueuedAt": 1774203665200, + "channel": "feishu", + "to": "ou_73cc4f75e3c953d7bf11f34f8c8c7618", + "accountId": "feishu-pm", + "payloads": [ + { + "text": "## Capability Evolver 每日报告\n\n**时间**: 2026年 03月 23日 星期一 02:20 CST\n**结果**: SUCCESS\n**意图**: REPAIR (修复)\n\n### 本次变更\n\n**影响范围**: 4 个修改,6 个新建\n\n**修改文件**:\n- `memory/evolution/evolution_solidify_state.json` (修改)\n- `memory/evolution/evolution_state.json` (修改)\n- `memory/evolution/memory_graph_state.json` (修改)\n- `memory/evolution/personality_state.json` (修改)\n\n**新建文件**:\n- `memory/evolution/gep_prompt_Cycle_#0018_run_1774203606866.json`\n- `memory/evolution/gep_prompt_Cycle_#0018_run_1774203606866.txt`\n\n**代码统计**:\n- 插入: 551 行\n- 删除: 14 行\n\n### 执行摘要\n\n本次 evolver 运行成功,主要修复了 session logs 检测和 fallback 行为的稳定性。\n\n**变更详情**: see `~/work/backup/evolver-output.txt` for full logs.", + "replyToTag": false, + "replyToCurrent": false, + "audioAsVoice": false + } + ], + "gifPlayback": false, + "mirror": { + "sessionKey": "agent:haonan:main", + "agentId": "haonan", + "text": "## Capability Evolver 每日报告\n\n**时间**: 2026年 03月 23日 星期一 02:20 CST\n**结果**: SUCCESS\n**意图**: REPAIR (修复)\n\n### 本次变更\n\n**影响范围**: 4 个修改,6 个新建\n\n**修改文件**:\n- `memory/evolution/evolution_solidify_state.json` (修改)\n- `memory/evolution/evolution_state.json` (修改)\n- `memory/evolution/memory_graph_state.json` (修改)\n- `memory/evolution/personality_state.json` (修改)\n\n**新建文件**:\n- `memory/evolution/gep_prompt_Cycle_#0018_run_1774203606866.json`\n- `memory/evolution/gep_prompt_Cycle_#0018_run_1774203606866.txt`\n\n**代码统计**:\n- 插入: 551 行\n- 删除: 14 行\n\n### 执行摘要\n\n本次 evolver 运行成功,主要修复了 session logs 检测和 fallback 行为的稳定性。\n\n**变更详情**: see `~/work/backup/evolver-output.txt` for full logs." + }, + "retryCount": 1, + "lastAttemptAt": 1774203665371, + "lastError": "Request failed with status code 400" +} \ No newline at end of file diff --git a/delivery-queue/be91d785-b914-42dc-9298-f57551587373.json b/delivery-queue/be91d785-b914-42dc-9298-f57551587373.json new file mode 100644 index 0000000..cc2fb4d --- /dev/null +++ b/delivery-queue/be91d785-b914-42dc-9298-f57551587373.json @@ -0,0 +1,21 @@ +{ + "id": "be91d785-b914-42dc-9298-f57551587373", + "enqueuedAt": 1774203773787, + "channel": "feishu", + "to": "feishu-pm", + "accountId": "feishu-pm", + "payloads": [ + { + "text": "每日 capability-evolver 任务执行完成:\n\n## 每日报告\n\n**时间**: 2026年 03月 23日 星期一 02:20 CST\n**结果**: SUCCESS\n**意图**: REPAIR (修复)\n\n### 本次变更\n\n**影响范围**: 4 个修改,6 个新建\n\n**修改文件**:\n- `memory/evolution/evolution_solidify_state.json` (修改)\n- `memory/evolution/evolution_state.json` (修改)\n- `memory/evolution/memory_graph_state.json` (修改)\n- `memory/evolution/personality_state.json` (修改)\n\n**新建文件**:\n- `memory/evolution/gep_prompt_Cycle_#0018_run_1774203606866.json`\n- `memory/evolution/gep_prompt_Cycle_#0018_run_1774203606866.txt`\n\n**代码统计**:\n- 插入: 551 行\n- 删除: 14 行\n\n### 执行摘要\n\n本次 evolver 运行成功,主要修复了 session logs 检测和 fallback 行为的稳定性。\n\n**变更详情**: see `~/work/backup/evolver-output.txt` for full logs." + } + ], + "threadId": null, + "mirror": { + "sessionKey": "agent:haonan:main", + "agentId": "haonan", + "text": "每日 capability-evolver 任务执行完成:\n\n## 每日报告\n\n**时间**: 2026年 03月 23日 星期一 02:20 CST\n**结果**: SUCCESS\n**意图**: REPAIR (修复)\n\n### 本次变更\n\n**影响范围**: 4 个修改,6 个新建\n\n**修改文件**:\n- `memory/evolution/evolution_solidify_state.json` (修改)\n- `memory/evolution/evolution_state.json` (修改)\n- `memory/evolution/memory_graph_state.json` (修改)\n- `memory/evolution/personality_state.json` (修改)\n\n**新建文件**:\n- `memory/evolution/gep_prompt_Cycle_#0018_run_1774203606866.json`\n- `memory/evolution/gep_prompt_Cycle_#0018_run_1774203606866.txt`\n\n**代码统计**:\n- 插入: 551 行\n- 删除: 14 行\n\n### 执行摘要\n\n本次 evolver 运行成功,主要修复了 session logs 检测和 fallback 行为的稳定性。\n\n**变更详情**: see `~/work/backup/evolver-output.txt` for full logs." + }, + "retryCount": 1, + "lastAttemptAt": 1774203773932, + "lastError": "Request failed with status code 400" +} \ No newline at end of file diff --git a/delivery-queue/c7e6e651-ad7b-420f-ac5c-83a1ec63d809.json b/delivery-queue/c7e6e651-ad7b-420f-ac5c-83a1ec63d809.json new file mode 100644 index 0000000..c5e01f3 --- /dev/null +++ b/delivery-queue/c7e6e651-ad7b-420f-ac5c-83a1ec63d809.json @@ -0,0 +1,24 @@ +{ + "id": "c7e6e651-ad7b-420f-ac5c-83a1ec63d809", + "enqueuedAt": 1774252049059, + "channel": "feishu", + "to": "ou_f3d9fc3e3a1c4e5b8d7f6a2c9e1b4d3f", + "accountId": "feishu-art", + "payloads": [ + { + "text": "## 📊 中国海油 (600938) 每日跟踪 - 2026-03-23\n\n### 收盘数据\n- **最新价**: 42.10 元 (+0.45%)\n- **昨收**: 41.91 元\n- **最高/最低**: 43.20 / 41.72 元\n- **成交额**: 43.43 亿元\n\n### 技术位分析\n- 压力位: 44.54 元(前高,距离5.8%)\n- 支撑位: 40.00 元(距离5.0%)\n- 当前处于震荡区间中部\n\n### 油价动态 🛢️\n- 布伦特原油: 109.32 美元 (+2.51%)\n- ⚠️ 霍尔木兹海峡局势紧张,美以对伊朗军事打击\n- 油价触及110美元上方,地缘政治溢价明显\n\n### 信号判断\n✅ 油价利好 - 原油上涨支撑股价\n⚠️ 关注前高 - 44.54元存在压力\n❌ 未触及支撑位\n\n### 操作建议\n- 持仓观望,突破44.54元可考虑加仓\n- 跌破40元支撑需警惕\n- 中长期受益于高油价环境\n\n详细报告已保存至: `~/work/zq/30.资源/股票跟踪/600938_tracking.md`", + "replyToTag": false, + "replyToCurrent": false, + "audioAsVoice": false + } + ], + "gifPlayback": false, + "mirror": { + "sessionKey": "agent:ui-designer:main", + "agentId": "ui-designer", + "text": "## 📊 中国海油 (600938) 每日跟踪 - 2026-03-23\n\n### 收盘数据\n- **最新价**: 42.10 元 (+0.45%)\n- **昨收**: 41.91 元\n- **最高/最低**: 43.20 / 41.72 元\n- **成交额**: 43.43 亿元\n\n### 技术位分析\n- 压力位: 44.54 元(前高,距离5.8%)\n- 支撑位: 40.00 元(距离5.0%)\n- 当前处于震荡区间中部\n\n### 油价动态 🛢️\n- 布伦特原油: 109.32 美元 (+2.51%)\n- ⚠️ 霍尔木兹海峡局势紧张,美以对伊朗军事打击\n- 油价触及110美元上方,地缘政治溢价明显\n\n### 信号判断\n✅ 油价利好 - 原油上涨支撑股价\n⚠️ 关注前高 - 44.54元存在压力\n❌ 未触及支撑位\n\n### 操作建议\n- 持仓观望,突破44.54元可考虑加仓\n- 跌破40元支撑需警惕\n- 中长期受益于高油价环境\n\n详细报告已保存至: `~/work/zq/30.资源/股票跟踪/600938_tracking.md`" + }, + "retryCount": 1, + "lastAttemptAt": 1774252049242, + "lastError": "Request failed with status code 400" +} \ No newline at end of file diff --git a/delivery-queue/e75bc319-49b7-4881-8609-1a78052d3a78.json b/delivery-queue/e75bc319-49b7-4881-8609-1a78052d3a78.json new file mode 100644 index 0000000..33f18a4 --- /dev/null +++ b/delivery-queue/e75bc319-49b7-4881-8609-1a78052d3a78.json @@ -0,0 +1,24 @@ +{ + "id": "e75bc319-49b7-4881-8609-1a78052d3a78", + "enqueuedAt": 1774203670341, + "channel": "feishu", + "to": "ou_73cc4f75e3c953d7bf11f34f8c8c7618", + "accountId": "feishu-pm", + "payloads": [ + { + "text": "Capability Evolver 每日报告:\n时间:2026-03-23 02:20 CST\n结果:SUCCESS\n意图:REPAIR\n变更:4 修改 + 6 新建\n统计:+551 行,-14 行\n详情:查看 ~/work/backup/evolver-output.txt", + "replyToTag": false, + "replyToCurrent": false, + "audioAsVoice": false + } + ], + "gifPlayback": false, + "mirror": { + "sessionKey": "agent:haonan:main", + "agentId": "haonan", + "text": "Capability Evolver 每日报告:\n时间:2026-03-23 02:20 CST\n结果:SUCCESS\n意图:REPAIR\n变更:4 修改 + 6 新建\n统计:+551 行,-14 行\n详情:查看 ~/work/backup/evolver-output.txt" + }, + "retryCount": 1, + "lastAttemptAt": 1774203670490, + "lastError": "Request failed with status code 400" +} \ No newline at end of file diff --git a/feishu/dedup/feishu-art.json b/feishu/dedup/feishu-art.json index c9f86f8..ce32073 100644 --- a/feishu/dedup/feishu-art.json +++ b/feishu/dedup/feishu-art.json @@ -1,31 +1,15 @@ { - "om_x100b5480d5bba4b4b2c9a4e8bf5b189": 1773881784103, - "om_x100b54808ff17c90b374531d1cf7751": 1773882388481, - "om_x100b5481441a38a4b20013813040b59": 1773883566093, - "om_x100b54816cbffcb8b36dfe46fd84a26": 1773883944086, - "om_x100b54817240a0a0b49ad1ecc4230d1": 1773884361569, - "om_x100b548114fc64a4b34dda488c6c4cf": 1773884835671, - "om_x100b548129129490b4b1770d7f3efcc": 1773885054622, - "om_x100b5481243380b0b10b5bef1b92ca3": 1773885104561, - "om_x100b54813d7144bcb2da847227b06a8": 1773885244462, - "om_x100b548139e42d10b3ffcf9447ed48c": 1773885299355, - "om_x100b548133fa3ca4b219d22fcf41e18": 1773885396226, - "om_x100b5481ce0418a0b26dc9b2f68f007": 1773885453209, - "om_x100b548c9b6dcc78b49c9ec428e44f3": 1773899098605, - "om_x100b548ca39e00acc3362a9bf3873de": 1773899477853, - "om_x100b548d47a538b0c2c282968797cea": 1773899927180, - "om_x100b5489ba663ca0c4c8bc1d9b97937": 1773920075261, - "om_x100b548a50d788b8b2c1f705241dbc5": 1773920738205, - "om_x100b548a72e7f4a8b286f0d7e9aea31": 1773921219213, - "om_x100b548a83211ca8c44bcbf00eb049e": 1773923551363, - "om_x100b548a95d45530c29580a9d1bad9a": 1773923762295, - "om_x100b548b1fa8c8a4c42e95eb381a75c": 1773925655047, - "om_x100b54f49f9f20b0b2d58df353d8a5b": 1773931798109, - "om_x100b54f51931bca0c361d933da09d2b": 1773933952255, - "om_x100b54f52b61f0a4c3650d280bf0dad": 1773934171242, - "om_x100b54f53b8678b0c3188a42d675405": 1773934421286, - "om_x100b54f533291ca4c2cf74f54da005d": 1773934558803, - "om_x100b54f5b9ebf8a0c33674c32a8da6c": 1773936499279, - "om_x100b54f64c3844acc14333ab25a59e5": 1773936688149, - "om_x100b54f650ef80a0c2d3c76a3fbe9be": 1773937122637 + "om_x100b533c2cb598b0b38554196b869f8": 1774224936136, + "om_x100b533cf8e108b0b4cedda48be0a42": 1774226275419, + "om_x100b533c8a4b5938b4c45e3d07693ac": 1774226504992, + "om_x100b533c8622c874b392b1a60668c21": 1774226575556, + "om_x100b533d4fff4ca4b4a2d16c627a484": 1774227475867, + "om_x100b533d47fdc090b107d902ed3d741": 1774227603738, + "om_x100b533d45d7093cb34bee17b3c7147": 1774227634685, + "om_x100b533d608888f4b36b9b379cf2e96": 1774228196959, + "om_x100b533d79cfdc8cb321dd3f8ab07ea": 1774228336755, + "om_x100b533d77d348e8b21d6e461881c28": 1774228370751, + "om_x100b533aaa7174b8c32c20a830ba04e": 1774251596497, + "om_x100b533aa54ee080c3ab0e130b922fa": 1774251704904, + "om_x100b5321e5a3a4a0c14df59fcd6968d": 1774279351394 } diff --git a/feishu/dedup/feishu-worker.json b/feishu/dedup/feishu-worker.json index 0dbe8f3..2d53afd 100644 --- a/feishu/dedup/feishu-worker.json +++ b/feishu/dedup/feishu-worker.json @@ -1,21 +1,8 @@ { - "om_x100b54d455778d34c29e5078a416505": 1774059964188, - "om_x100b54ddcdff10a4c10c6a43f3a9b15": 1774098483703, - "om_x100b54ddcb8c98acc440146013bf3ea": 1774098516724, - "om_x100b54dda5ae30a4c103d63b161622d": 1774100150755, - "om_x100b54dda0515ca0c4914152b3fe790": 1774100202332, - "om_x100b54de4314e8a8c450f30e86836c8": 1774100702124, - "om_x100b54de5ee994a8c33ae7a7a33b818": 1774100738775, - "om_x100b54de791d60a4c312fc32c95a374": 1774101373675, - "om_x100b54de757c58a0c3edf82023ed91e": 1774101435678, - "om_x100b54dee46b58a0c45e5db8753fdf2": 1774103210881, - "om_x100b54dee22384a4c49132969d941d8": 1774103247433, - "om_x100b54deac3148a8c333c9c38b7ab7a": 1774104112330, - "om_x100b54deab3784a0c4d6583799df1cb": 1774104160071, - "om_x100b54deb098ccacc140f6982c07d66": 1774104549843, - "om_x100b54df4e8f54acc4c0085d75ba209": 1774104580600, - "om_x100b54df4c052ca0c3a0fbee838fa52": 1774104621124, - "om_x100b54df46cdc4a4c4ee1f9a5b25c4c": 1774104704546, - "om_x100b54df40aeb8a4c14f9ef86aba704": 1774104806595, - "om_x100b54df5937cca0c29c73fdc610d11": 1774104960174 + "om_x100b53219b1e80f4c3403ec55bc0e66": 1774280029816, + "om_x100b532193c3c8a0c2c4ae55e5aa0d1": 1774280145525, + "om_x100b5322c4c40ca4c3701e80050a2ca": 1774282913137, + "om_x100b5322c56c10acc4cd9e07359bb10": 1774282938532, + "om_x100b5322d34338a4c3797f179b05ab0": 1774283225420, + "om_x100b532287a368a0c4cc418c0192b3a": 1774283927392 } diff --git a/identity/device-auth.json b/identity/device-auth.json index daeb0a7..71da080 100644 --- a/identity/device-auth.json +++ b/identity/device-auth.json @@ -10,7 +10,7 @@ "operator.approvals", "operator.pairing" ], - "updatedAtMs": 1774203014332 + "updatedAtMs": 1774288823167 } } } diff --git a/logs/commands.log b/logs/commands.log index 736f397..be57c2c 100644 --- a/logs/commands.log +++ b/logs/commands.log @@ -67,3 +67,4 @@ {"timestamp":"2026-03-21T13:45:02.174Z","action":"new","sessionKey":"agent:knowledge-base:main","senderId":"ou_9351c287f42069fa30366ac641d24df7","source":"feishu"} {"timestamp":"2026-03-21T14:26:51.250Z","action":"new","sessionKey":"agent:knowledge-base:main","senderId":"ou_9351c287f42069fa30366ac641d24df7","source":"feishu"} {"timestamp":"2026-03-21T14:49:40.665Z","action":"new","sessionKey":"agent:knowledge-base:main","senderId":"ou_9351c287f42069fa30366ac641d24df7","source":"feishu"} +{"timestamp":"2026-03-23T16:21:53.453Z","action":"new","sessionKey":"agent:knowledge-base:main","senderId":"ou_9351c287f42069fa30366ac641d24df7","source":"feishu"} diff --git a/skills/.planning/cache/semantic/96f61cfac06d59b7b306aeb1d4eb86b6ddbfe44c21daea25107fbe92e7401099.json b/skills/.planning/cache/semantic/96f61cfac06d59b7b306aeb1d4eb86b6ddbfe44c21daea25107fbe92e7401099.json new file mode 100644 index 0000000..0fa2006 --- /dev/null +++ b/skills/.planning/cache/semantic/96f61cfac06d59b7b306aeb1d4eb86b6ddbfe44c21daea25107fbe92e7401099.json @@ -0,0 +1,43 @@ +{ + "video_type": "知识类", + "segments": [ + { + "title": "3月22日战况汇总:美以空袭与伊朗反击", + "content": "死定门晚上好继续汇报今天的全球局势 战争进入第二十三天 没以连军针对伊朗的多个军师基地和武器存储设施发动广泛的空袭 伊朗核设施再度遭遇一军空袭 伊朗则对等反击对以色列核设施所在的城市发动导弹打击 造成气劲为止最大规模的伤亡 录清离巴嫩的一军地面部对越来越多 总数达到了五个时 珍主党一次使用冰薄多管火箭炮 向以色列北部发起密集打击并造成大规模破坏 董王面临艰难绝则要么通过地面做弹冒险升级冲突 要么接触严重的经济损失 从而毁掉共和党在中期选举中的机会 为此他再次发出了经典的48小时最后通铁 要求伊朗立即开放霍尔木滋海峡 否则将摧毁伊朗所有发电站 伊朗则威胁摧毁美国在中东地区所有的能源基础设施 信息技术系统和海水淡化设施是与美国战斗到底 无在武装称其随时待密 一旦局势继续升级 红海和曼德海峡将被确保封锁 与此同时 福德号离开了红海 正在通过苏伊氏运河 准备退出战斗前往希拉维修 好在简单回顾之后 我们还是先看伊朗这边的情况 当地时间21日下午至22日凌晨 每以继续对伊朗多地发动广泛的轰炸 为于伊朗西部胡锡斯坦省 德资富尔附近的瓦克达地空军基地遭遇美以联军的盟链空习 现场拍摄的视频显示 航空炸弹爆炸后产生的激波清晰和剑 冒出的黑银高达上千米 同时伴随巨大的爆炸声 据以军称该地点是一处伊朗的导弹存储设施 但没有相关的证据可以证明这一点 据以军发布的声明 在过去的24小时 以此类空军对伊朗 与伊斯兰革命未对的弹道导弹生产设施及关键组建储存设施 国防部下属的导弹燃料生产设施 马勒克阿斯塔尔大学和弹道导弹正地操作人员等目标 发动多轮空习 声明称马勒克阿斯塔尔大学是伊朗军事工业与弹道导弹体系的研发机构 例属于伊朗国防部 此外以军还空习了位于伊朗中部的纳坦资游农搜工厂 所幸并未发生辅射洩漏", + "start_index": 0, + "end_index": 487 + }, + { + "title": null, + "content": "在不十二地区又一架美军的MQ9无人机被伊朗防空部队激落 看着MQ9被打下来 不免让我想起最近换新相机之后闲置的那台旧相机 所以这里想问一下私立门换新后就得都怎么处理 向往那台旧相机找转转上门回收了3100多 转转是一个很好的买家 不仅回收频类丰富而且变现特别快 向威丹运动相机无人机这种摄影器材 甚至是内存条组装机之类不好卖的小众频类 在弹纳都能随时换成钱 比起之前挂网上一直卖不出去 还得跟买家斗志斗友 转转特别适合我这种想快速变现又图神识的人 我听你们试过了 他们回收价格也很不错 像我之前那款Omica还卖了24000多呢 要我说有蓝的处理的钱质就直接卖给转转 钱到时候才是印道里", + "start_index": 488, + "end_index": 835 + }, + { + "title": "美军战果与伊朗防空伏击F-35战损分析", + "content": "据美国中央司令部司令布拉德库博上将发布的声明 过去两天美国陆军使用精确制导导弹 发起了美国陆军历史上最长的野战炮火打击 此次打击摧毁了伊朗的军事基础设施展示了美军无可疲敌的打击范围和致命性 他表示美军在三周内打击了超过8000个目标 包括120多艘伊朗军舰 这是自第二次世界大战以来在短短三周时间内 对敌方海军造成的最大规模消灭 然后开始吹噱美军在中东的反导系统 拦击了数千价伊朗无人机和导弹 为盟友撑起了可靠的保护散 美国中央司令部还发布了打击伊朗防空系统的画面 其中一段视频显示一套伊朗国产的马基德防空导弹系统被摧毁 据报道 此前击中F35的正式该防空系统发誓的导弹 这是一种安装在卡车上的战术及防空系统 设成紧约8公里 但具备高度激动性 而且采用被动探测系统 也就是说更难被发现 制在一定程度上解释了伊朗为何仁然保有防空能力 由于喪失至空权 伊朗只能采取伏击式防空 即防空导弹系统继续雷达通常处于关闭状态 仅在必要时短暂开机作战 因为一旦雷达开启就会被定位并迅速遭到打击 这些防空系统通常会被红外制导导弹 F35虽然对特定雷达副段隐身 但在红外热情相义的视角下就是个火把子 因为战机发动机产生的高温和周围的空气温度有着极大的区别 所以那家澳门的F35应该是被导弹近距离爆炸损坏的机体维布 但还是亮亮穿着飞回了沙特 美国军方撑起紧急迫降飞行员返回 但据美国国家公共电台五角大楼记者报道 被伊朗防空系统集中的F35战斗机飞行员身受弹骗伤 飞机硬着露在可遇见的未来将无法執行任务", + "start_index": 836, + "end_index": 1646 + }, + { + "title": "黎巴嫩地面战况与伊朗导弹报复打击迪莫纳", + "content": "尼巴嫩这边 一军持续增加入侵尼巴嫩南部的军队数量 据一军当地时间21日宣布 其D162是已完成部署尼巴嫩南部的准备工作 部署在尼巴嫩南部的一军数量即将达到五个时 目前第146时部署在尼巴嫩南部的西部地区 第91时和第36时在东部战区作战 第214时注查在多富山地区 以军称后续以军还将继续扩大在尼巴嫩南部的军队规模 并进一步扩大所谓的缓冲区 以区族边境上的珍主党威胁 此外以军还称当地时间31日夜间 一次列陆军第91时在尼巴嫩南部与珍主党发生激烈交火 并消灭了多名珍主党人员 一次列空军也在当天对被鲁特及尼巴嫩其他地区的珍主党 只会中心进行了空袭 当地时间21日下午至22日上午 为报复美艺队伊朗和射师以及其他地区的广泛空袭 并造成大规模上网 伊朗伊斯兰更应对继续发动真实沉默死行动的第71至73轮联合打击 使用了法塔克高超因素导弹 获拉姆沙克尔斯重型导弹 卡德尔和艾马德弹导弹等多种类型的先进导弹 目标是以色列南部城市迪莫纳及其中兵地区的军事设施和安全中心 美军在科威特的军事基地的 不久后以色列南部想起了密集防空警告都没导弹激重目标 其中迪莫纳受损最为严重 伊梅伊朗的导弹激重了迪莫纳的建筑群 造成大规模上网 视频可以看到 该导弹接连躲过了多梅蓝杰弹直奔目标 在即将靠近目标时速度明显加分 后续传出的爆炸点搜救视频也可以看到 该地区的建筑严重受损 周围的建筑几乎只剩沉重住 来自当地居民的监控显示 居民并未进入防空洞 爆炸产生的气烂果斜的碎片喷用进居民家中 据以色列媒体报导 正美导弹协待了数百公斤炸药 此次习近共造成超过100人数双 其中10亿人伤势严重 但依然没有人员伤亡的报告 内坦尼亚湖当天在其社交媒体账号上发文称 这是一个艰难的夜晚 以君泽表示 以色列的防空系统在习近期间被激活 但未能蓝杰部分导弹 军方将调查此事并从中吸取教训 聚吸迪莫纳是一座戒备森严的城市 因为该城市为以色列合设室所在地 导弹命中地点距离该合设室约12公里 除了迪莫纳副境的阿拉德也出现了类似的破坏景象 一枚淡到导弹几重该市 造成多动建筑物受損 至少84人数伤 其中10人伤势严重 以色列紧急运输直升机和救护车 持续将商员送往当地医院 贝尔泄霸的索罗坎医院因商员人数增加 宣布进入紧急状态 伊朗伊斯兰革命会队发言人称 打击以色列迪莫纳是对以色列空袭伊朗合设室的回忆 当天晚上大量人群勇上德黑兰的瓦列阿斯尔广场 慶祝革命会队对迪莫纳的打击 高湖革命会队航空航天部队指挥官的名字 并呼吁再次打击", + "start_index": 1647, + "end_index": 2909 + }, + { + "title": "真主党同步打击与欧洲对伊朗导弹射程的担忧", + "content": "与此同时 珍主党也在同步发起攻击 据珍主党当地时间21日晚上发布的声明 其使用火箭弹无人机和短层导弹对以色列北部发动密集打击 视频显示 珍主党一次使用兵堡多管火箭系统 像以色列北部多地发射火箭弹 后续据以色列方面发布的视频 火箭弹对以色列北部城镇麻阿洛特·塔尔西的建筑 造成严重破坏 至少5人被淡片激重受伤 此外火箭弹还激重了北部城市萨瓦德 造成一条道路和附近建筑轻微损坏 自从华尔街日报报到伊朗使用中城导弹攻击迭格加西亚基地后 引起了欧洲的恐慌 因为迭格加西亚基地距离伊朗近4000公里 这意味着伊朗的导弹涉成接近4000公里 只有冰导阿尔兰和葡萄牙三个欧洲国家 不在伊朗导弹的涉成范围内 以军也在21日继续天游加促 发布声明称 他们探责到了伊朗首次向印度洋发射了一枚远程导弹 其社城接近4000公里 这将对欧洲、亚洲和非洲等数十个国家构成威胁 不过剧土耳其阿纳多鲁通讯社报导 伊朗对印度洋迭格加西亚军事基地的导弹袭击不复有责任 也不是幕后黑手", + "start_index": 2910, + "end_index": 3493 + }, + { + "title": "美伊政治博弈与红海封锁态势", + "content": "眼看霍尔木茲海峡迟实为开放游价还是下不来 懂王极了再次在社交媒体上警告伊朗 如果伊朗在48小时内不完全开放霍尔木茲海峡 所有发电站首先摧毁其最大发电站 同时他还表示美国已经把伊朗从地图上抹去了 他们的领导层垮台了海军和空军都完蛋了 他们完全没有防御能力去还想跟我做交易 门都没有 伊朗伊斯兰革命维对则回应程 如果美国敢炸伊朗的发电站 那中东地区所有的能源设施信息技术系统 以及海水淡化场设施都将被摧毁 与此同时据中东观察加报导 狐赛武装称其随时代命 一旦局势继续升级 湾德海峡将被确保封锁 报道称霍尔沐资海峡被封锁后 沙特斯海弯主要产游国中 唯一能大规模将持有改造至红海 严补港出口的国家 此举成为其能源逼计划 但仅能部分环节供应冲击 无法替代霍尔沐资海峡 如果红海和湾德海峡也被呼撒武装封锁 那争究一滴游都运不出去了 此外在红海增加了数捉的福特号终于离开了红海 民用卫星拍摄的图像显示福特号航母边对正在通过苏伊氏运河进入地中海 包括福特号三搜区族建以及一搜补几件", + "start_index": 3494, + "end_index": 4107 + } + ], + "actual_segment_count": 6, + "version": "1.0" +} \ No newline at end of file diff --git a/skills/kb_workflow/__pycache__/__init__.cpython-312.pyc b/skills/kb_workflow/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7f6a9f7d7062b336cf5d34848180cd4a3e2da740 GIT binary patch literal 364 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 N(GJ*sLzyzE{{Lf5 z5d=Kq@d%~ywAEX?Pfu%?@NR*z$!&+y7W=gtgKly|{LJu`bn#;VtFe9m(%@w{DRjr(jyvW9WUG`c{ zn^JBvN}JAo@K6;@D@ov)Qj|V}xp#oY3CT?Lhoo=DLT8FiNL5IsDpK6i z$+8d$H3+3rOGjycJYB3G{Z&7<9e*zbu6F$TiXepFD1z}%0^s1ivo+h^oh5q@ZM)&= EU%$<9IsgCw literal 0 HcmV?d00001 diff --git a/skills/kb_workflow/auth/__pycache__/zhihu_login.cpython-312.pyc b/skills/kb_workflow/auth/__pycache__/zhihu_login.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2a6dae91d3a4053f44af3b80d7ede1910c48f82d GIT binary patch literal 11582 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 S`0nMAO%5JgoqoQXUHHEWdNO?g literal 0 HcmV?d00001 diff --git a/skills/kb_workflow/crawler/__pycache__/models.cpython-312.pyc b/skills/kb_workflow/crawler/__pycache__/models.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..33577f57dc5c6ef68e7a7b9a8d8f95967dbf1989 GIT binary patch literal 7616 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 E0oFgl&Hw-a literal 0 HcmV?d00001 diff --git a/skills/kb_workflow/crawler/__pycache__/proxy_pool.cpython-312.pyc b/skills/kb_workflow/crawler/__pycache__/proxy_pool.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..152d40641b718c1bb899fc1ec52d8101f11d78e4 GIT binary patch literal 9868 zcmbVSTTmQVdOkhVa~~LB5O+jNAX#IH0c=Y~7|E7}WlI)F2IRF!ytB=80|PxXY2 z7me4hJ(5nJIrsCQ@4p`XTUnWxK>AbZli2M>LVkrm%;Yc%yK7KbCIT5D0wdTYW`v<% z+lURmcF7*MkJuS(VyHOjUwH~PT=G9ivS|8N<@7j!>m1$e3jQ=B;?y{Vm zO>@)9q{PMf1V1ju#e~X@C1q|#9Oa@iKO@Bw<6*BCI$nzjqQb>fk{WBDrsJZ?#8_-R zCG%=5nK;JD$y7pUmy@Hh1e8^ymQM)YQ9e2~!^;8}O~$98el#Y<)HF8}QztkD7LY_v zpHWO)i^<6Z-NiLtj`5?CsKD}P^H<`=Vld#yA9RGLMk6>b27S_eTnhDgIY>s8{)6M% zxq}m`I^EOJ(e=dB;ZFF|)$?@s$)b(f}*w7e9uX`bhKMeI)sqNF*_#Y9Pn>bI%q7ASuKzn6(f0E}eB zb_L)!Vh2dEf=#f0$XXC^h)&TZIC`NsZFLH+58YO)Tl7Gy$7=NozPwhi=o9_*FcSLs ztv+Q!d0w9~u^d_h*ecWrmDkykfKV$`i5{Us@Q$%U@VaB9LZ}m}u|_P1ntf1Hnf8Y2 zH3Zvi`h|olr}+T@=}W5`Onqq+I%HYLg98xAf*&6@-IK&Jj1&!d$W9(_2|@W@%L6KMYYQ)^CHR8w*yY6wPH72!+>io{(G zG7!(q9Em_lPl648S-sQt5S!^31SSR1q@faAxl7zK)4xTshx0$%u;4rMAPNlFJu zu9>7fH6|rzI;fZx9YN#DTCfTCS z@bj)w1=P0s&5=?w&oNWK4`d9}o3Un6srto9CSl#;B-mjtq<&EnSi#Xi-XVhXr}n$X zEi)v|rrD4yBOCXOs1ybBjt$1A%rB4Uu|3ul(hYcW0st`qvYl$kI4@5j`_pUVQV9#B z7KeU;dpMVArZ)$($y2Z}ujKdb;Re3g552y&hr{8JTgMcVOtUAFGjae*6k?iFN{)|< zvgQIknt)|xA2b07tFZ@~3kqH<$I1KPV}Zwzex<-;G(Cw!uR^v!cKpOsb}R6sz)IJ; zyXnsZpYA{WuJpF_PGXVWbT@AM0=J&M@$5?Cp6}Q;cWAM1)8G85zv|Y&je%@)&)QS} z)cud$AD{hraP8Du$G--%js3s$59~OIzg@1y9aR)7#R3?j`l2v=2nB>;DX7Ry8kl)9 zAHL8V(*m@prV1pJ2pY?QLckKqYZeUIMJ=jX3iN#?5JSwn~325sRnd9O@x%R0LyCGx!jDXA-NO7K7?J6H=WvgO;q?%SXB9fqI34mK|L-tPU2)2n@3 zZBMVm-{8|*Rp-{L&TUk^wCLLQRb^`q--E7P8|9|${Vj`qH!mSmy?o>4Y(wWqwQIqT z%GO4*buVrD&*K7tYRXN(_bBhdZ2SVx0H0$ZYC=_-I}%CoaWN9nypc#eDWoJU`y-Jb zrg+I{aYZ6RG8&1@Z{>5V}1|P#O7&X5c^(>~CkHlbE-hSGvTv}L?uWwL71h~;r}pf&$DIoUOE0awwqAXBm)IQ62Tsz^vZ`iJ zUfHaFb>ZSt+XnmUE^Bujc;NLqE-`n8b_jmgs(0!4L0yew-yLO#z-MiE4?p@oaf?y- zXC+es?aEM9%8V8rg6%`QWhgsEhv=fFuv=g)Q`jLmKXh4rJfc^03vR2`BY5*#eYDkw zt!aO#ObbvxxD2!fOAEZKjHWXN_0bB9-``@hPU}ul4|g#Jh9ek|Sdr$yY*j42Ga1Tc z8QtVG8Q##6`nWtkw*=%|>%T_N%0mS#ABa?mlmCc4hK>XQFc2Hjcr!4@g zsd9>dir$`J6WKBF_Q2-?FHc~>4|50vJS^vR)>LRCZfNmC2q9PF5gY(TAA%W1yJ55+ zYRaJOfpR&N15oxtxgzZYpnB-tAyE0(K=|l4Nl~gt5@Z9P{WPv%1P;K7qF4lvoqGSe zo7K);J=1?tck4k4G+Wp) z1--7)t|$=v$T@xV9H%(zh+$O05sWb$LDxKt2L6!{*TEeujzJs@SuBFO9LN&}y=R6g zju;^d)S#FU*JOx9G#ejVrq<+ zVj0srriad13Z-lglx#gZdG+X1fn>8N7-Fb?q87qH$RVGEE$U2(k{h%gIJh!kNh^;S z?rtQO5X4zi-P8U)=vt`iK}&*-qedc`s@x5mbt&xL0~s}lYn#EJ@_l}^>+eo~aQgr3 zwxizdw#RN>Sb6f_{VfmiCp4GsI7!9#s;dj`4@C@W z(%o60JKo=`JnPc7|Ked^6h#|x|qT(7fne&+KLqtXD z(KKh>{Bgttl8UBD%aAo|2${21m}L||K#a_TtieB~s$HW9J-mPKZDuT_NR8+e*5K!py*quM!6S+#H&g(zb-rZ#A6pW&y&Gb81o-Us2?rHFnvmWMZGJSZs3Ns&*(6dE(8u@JrFi>6i( zf>g|zHnztSqnV&}_MB|}L+G#kJ!HUo)uf{O)*Cn8xH*sZ@WmS!vyI(r)oadd{j;0? z=k5nL;-fPg^(Pj~ z|2t6islRc%u4Vf`*LF+$o{KFj-?cj{ygS6{@qQV=d2!jV737#t*oNmj?f=~Ac>biT zASh)CY!(=OnV|Ear&6N2G?SZv2IgyFewP_6_MHcTA$O>jmt4y81z#23ElPz`DBD?r zVvZSSz?y|qVKTo%x(Kp*Jt~4i?#%yE<|_#QQ}!#R{_{AI`pF9S((v%*p~&UIORrr8 z_{$ir!ze7R*Q>)8w*b`i$BXa$4gs!{8B#_7e^=&x^g#p78DwZ{FPblJ=b9IP=-bWg zzk;+dq){;?kf+g)lA9m{wTMg{a%#4u0`9E-Xd=IW?a0LP8O+dT1V`~4d^FEA8X6G@ z;}(R8Dk(q0crdpm38|B5EaJ=j#=nNClnKZd$X+$sSG#=S_J!qv+XJhoHmbYsRlo8N zgFhen*~rho|FiFZd~xIWD~q1{zG{nmPp*Y%cqp7bc^=|J_5GXv0m{Z7dG5TiS^LaJ zus7@Py&tIh@w33V8-YVv_aSQh7BCWOR;oE)1)ca!fg%ONL53axy;U-pWI|Q2O@UJ( z2TJ!6>}U^z#PHJ%s4qD;i4D4XUzcIFAE^Y~1Jua|j&v92&j z19hguVMOfkk<~C-b)NScs*-ym%neP&rt`zZvCmr_R7yNEmeK@*I48d6V$* zm_xBrw8xNFeg=M`)c6eivG5(?1c|o9YB;C+IfQwLh)&eENrq^6F7$*vv1C9T5 zp=DoQ=tE`da?-4@92-XtKV;auX&@n<6e2kc6Hry|Ly+OwylH5 z*WqvViNzN_Z+&d5^~8GXiM7i0)}CKPKW_V%_D|Y3PG4R>cp2k&CKk>{u^eF6$#lo(2!^1kJ9K$DS7{t=j|K9q?e zTV|RnV>DK&^^5^t(*}l@4g(c=>`_vWT0vvP8cxBhoFw9lCxQ?s$!SlDIZ$eYuqO&3 z8ChL_chkeTzC3R`voCl3dDU4Qg0?THF+ZsYE=~p}Dqe)NALvL6me_{jmtDrNPl@Jj+)^uU$$;K2-PFGN<=1b&zUP3o zp#psi*5jr8iqFg#>6g193sshkSK@8Try$dO@WQMparln_NkPWzk1;P91Sp?${a}-j(4U z0-x2XhxpmGoAo>0P5Tm%wMI!VB{Z z?ZNyy74*|r>EYRa*ofxB*HC-~Mfs(<&=;3tqx8(0Q%z4}6Fu=+Y)08L9h>H2#YC{)-&?+|#gFyX9$E_cW|@Z+O}koO{k5X5Ui%9)ZtZhVd~&%u;NR T;P=a>Ifn5*gqRScAO8OV`nEn^ literal 0 HcmV?d00001 diff --git a/skills/kb_workflow/crawler/__pycache__/zhihu_crawler.cpython-312.pyc b/skills/kb_workflow/crawler/__pycache__/zhihu_crawler.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9728cab60b2c3f8f865f7e011cb79a89f2b84735 GIT binary patch literal 26112 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 vo6}VCA%_6df>ykqpv6 zhG{6HG=iW23_ZiN*94>R9^W}mg_|c*v!&oku1zvCy0+XTd8rC+DpM+#NNN|Jjz9fi zFbdmv*LST|UKZ^Utt!zFyA>n0QCWNZKSnpf(}Fv~cutqX{gr1Mk=s$f?GwUuMo2r{ zOKo!|@MBHbLDWIdLsv|NAmjzCJO%3;JlB$A>!^`jonK5Rc&sa~GC^zX*B8R##f;S2 zEOMc1oEcgRZhXV$1(=Xhm5z{c)vOOLw-328v6t?SwkICG0tn$dnEZqhL@VIodl(JS JL*ER1_7{2DH!2lcIotfTP80nGHp1 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 Zr`D{taKE#t);JWub1YtCQGCq8|1V&&n-Ty3 literal 0 HcmV?d00001 diff --git a/skills/kb_workflow/metadata/__pycache__/__init__.cpython-312.pyc b/skills/kb_workflow/metadata/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..34530a84c8f05035dfa1fd42f49766453c4a4ac0 GIT binary patch literal 433 zcmX@j%ge<81Z_D7Gnp6}7#@Q-Fu(+5eAWOmrZc24L@}f=rZD9&<}yVA6$9DKIn22% zQ7k|BVo9QcZ+=Q?PAV7Iv;GNB z_RUssdcJz*(@8zg=P!M-v+wz=mZz=F&!%p8*1HZU|FnPF)2{h1n)h~GBZj8auO@ci!#$QO5k!u%s^d5EI`6flkFCJe0)lN za(w(PA&>ze9G?m^1+4NGe-+3eBvFu7kiNv6ocQ>a44;8qhF{M58Tq-X`o$%QMY*YY zhDK(l`g-{Vsd>pciRJpm*_k;x#roMv@#RpT>*qp!t{)$tnU`4-AFo$X`HRCQ7aR_D zMLa+=LB1Zl*@|B2Y{L0K;gD AVgLXD literal 0 HcmV?d00001 diff --git a/skills/kb_workflow/metadata/__pycache__/bilibili_extractor.cpython-312.pyc b/skills/kb_workflow/metadata/__pycache__/bilibili_extractor.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2500454eea8a438d82efa7ebac4340eca6ae2de4 GIT binary patch literal 32331 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 Z(da6r%?ZL^#M9^|OPh7VUu4nX{(r*PW$OR{ literal 0 HcmV?d00001 diff --git a/skills/kb_workflow/metadata/__pycache__/markdown_converter.cpython-312.pyc b/skills/kb_workflow/metadata/__pycache__/markdown_converter.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1a149a52c40aa5d408c99cc3d61807cf40f29de8 GIT binary patch literal 2833 zcmb_eZEO=|9DlBN*LK}TVH@s6HqId6iL7GK7z7PY10Mz&m@jE!F1Oxobi4NE-IcMX zm_;Wmy0PL5-2hp|p_4I~FHyt|;%C2r)6ksyMSJb|WCaovKly*|dfk{K@qPiJKorfD!kl!9A1)0Kms8lKYltSBINKp2>eb;WQg+9 z1ahDqNTB+VKu>q8;AT`M zz!;yM%JzO@3|*LeV5)AR}qEFr5zTrSfdZMwh zk+l_`95v3LvJ^5e>}h6<$zkL5apUATg9SJ80WHEy*i1Hl%sP^lV0$pkO9jK3i<73V z0K}rWAm@mL->pZ0B#~CU69~Z}kOJ8bIXz9BqbF!fCWg2oPY+_9yLEDV%ga&n!G|`s zu(a+}14^(<(`i-fkwl#g^ZRvYn=C_ab(&X$f(T6I`$S#{hTA!d$<-Q>BvDiK(ts?8 zT&pApI#u1N@vV}mVojitb?6nGow#DT=p_NWa-f_jRg~IP>>cy>F5f;m1cB6eB_xJ7 zJ@VM2zDBuA3+oyI0B}w&lwsPIF(%B}--M)~h@i>mYP@yEbqUOe~9^K7x!EjLH zxMn)_o32@vuB_H8p1NJ?tn|5X2cJhB#NPqV!X|Jlf;OL!s$T*I2Otmm^upinwLRnUTQC5iO2}t zSuMbry^*-s!|DV>#jn2Scg&td!+`5 zio?J#%1V5&3P`lpHc+gX#)8~En4bmGi}F=ydDV36{}b|_&C9m_2O=HGi?U*J_@Ae;Ou_sO?6M#h+}Vc9~*Cz))jKR0<9Y#Ap~&~}T) z3kG$YmjR!Qfj5oBgfZ5idvDx|!W~{tA2%*c&-H(4#mh(>v3PFu4?_5i{!6(dQ+GJ^ zKXA;IhtSYSsoT8crVv5Qw!7zA$n&*@|^)UJ~-wR9Av%>fu)cIP;YmYaKfma$F+ zH-|U9mE` z{^bDe*#nWa9}h%5*~l)$A(AK%WLv(RC8~#`)K#o)xO#4hkvMUo@)Af z$7ee(J~z9$Ill8ZZ*{tUZGucZ`;I4H3rcUVLdz=?o8Rua>aHh=kwEIPO*WswmvJI8KlQ9H(ILRMugFQC7i0`V^U}tf=8nF7vw!BczJIEc(!& z4w`n~T;`%Z`HE8dq2Z=Hf=8<97JlUG*3h-%Yw`#lQ)_PHhouf{Vx77}f#kNTo2}fJ zE@(*8i~{(Hl#Q5RkT#w8+r8EL8&4{m;0#YowGIe`njn5gCBLHjU(r*4QQHZk_9nvA Gl>G-6et0(k literal 0 HcmV?d00001 diff --git a/skills/kb_workflow/metadata/__pycache__/zhihu_extractor.cpython-312.pyc b/skills/kb_workflow/metadata/__pycache__/zhihu_extractor.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..319deb14115b398ccc34faa59aa9baac78051e49 GIT binary patch literal 19539 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 Zr1-Hr;HpWT_z!~5vIiQLXoI=9{{eu%Q3(J5 literal 0 HcmV?d00001 diff --git a/skills/kb_workflow/pipeline/__pycache__/errors.cpython-312.pyc b/skills/kb_workflow/pipeline/__pycache__/errors.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7730d86f568512594da4ec18f035a317a697f524 GIT binary patch literal 6314 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 J@1V@4_+RokE-?TA literal 0 HcmV?d00001 diff --git a/skills/kb_workflow/pipeline/__pycache__/idempotency.cpython-312.pyc b/skills/kb_workflow/pipeline/__pycache__/idempotency.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f6ee342bcc65a68010e26942cb48d4e92f7456a0 GIT binary patch literal 2930 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 literal 0 HcmV?d00001 diff --git a/skills/kb_workflow/pipeline/__pycache__/retry.cpython-312.pyc b/skills/kb_workflow/pipeline/__pycache__/retry.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4a0020042af6ae3931bfa7a67d2cd60a3798de1a GIT binary patch literal 881 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 literal 0 HcmV?d00001 diff --git a/skills/kb_workflow/pipeline/config.py b/skills/kb_workflow/pipeline/config.py index 3422b5b..18c700b 100644 --- a/skills/kb_workflow/pipeline/config.py +++ b/skills/kb_workflow/pipeline/config.py @@ -62,6 +62,10 @@ class KBSettings(BaseSettings): overwrite_archives: bool = Field( default=False, description="覆盖已存在的归档文件(非交互模式)" ) + enable_semantic_segmentation: bool = Field( + default=True, + description="启用 LLM 语义分段(默认启用)" + ) @lru_cache diff --git a/skills/kb_workflow/pipeline/platforms/__pycache__/__init__.cpython-312.pyc b/skills/kb_workflow/pipeline/platforms/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b48fa67015986a6f597f04ab76bb88da736db13e GIT binary patch literal 878 zcmaiyF>ll`6oBnq?yd?gtSm@R0trrP6M>+^2@n(kLQqs8Sh85Y#A&RvW6SpSI5rmk z0b*xk<1aAt4^HaD#0FF>op93RsJiq?dGULG@A>n4{=TshAuk`qH~uw1=tpgI;_XI` zZu{RSl%o{oI1dDtK^owC-4i_-reU)VMPClm0Y>{M?|;VWa4{GS=|_yvo}jK!M#96K zYR8NPZ^82&*yEZBUa=^8U2+Rjw{T;J3qJARCZr`VXPdxW7LVd6dQ7vjs|s9d!K5!~!Ica;?3Nn1 zKh6|1W8-KG_L(Cs0C5Y=#_%lnnY>s)$5p$bA$s%bg-_E2@{j5hj!plo% zu35XfcC|P6uJxvGo!v7%pKQWf^}TvIT3ZeY$yG+k^6GR#=E_V9q2{q}CmeUPwDE*m z*5og*pBLFqtvP6U?VRX$^<*2InuQ8M$QN|v>Co|RQYy(3>!|VLy?JZPZ(YZ-Ve>XkN5}2lplNm literal 0 HcmV?d00001 diff --git a/skills/kb_workflow/pipeline/platforms/__pycache__/base.cpython-312.pyc b/skills/kb_workflow/pipeline/platforms/__pycache__/base.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3d602a87d305311092c70fb681d634f8253bcce4 GIT binary patch literal 4822 zcmcgwO>87b74G@9cXquSvf(EpgpwV}9yCApl0;~PR?3E)?#1U}~;$p-lH>A06KuF1Lb`1h@;=Sss?&%o=5lFP;s+z7> zRqyBfUcL73*VY;qJU{k-!yjI=tUuuo^VIa<{3Z;ZTCUZ%+>%@NOQUkXJgW37CH!6S ztD{=KHmdjQC97<`Wx3TSmRn=x4=U;U{>r4@T%kK9%X-(R(hJ3i?7B3POprYqGqUf~ zIBqoF72#vKAyCy1v}nH$Gc}m0tJxJ+W2;{IWtjEq?#i6prGi`yW>@EC8*{Ul^f{|; zV@~4oIZ`&u$)djRwL3hemM%sDTK|AtQcx1fT&Z_0*C! zx$8pkxi^8xWdV?r2m&O+5&6!&x5*ZwGHeklBzJrUgCHI=p@F2gxuc_>!vx_<$q|3d zf^6fvw-&_>d`EnP^#hN z`~xgbL_ju`?BNs!)a$$>gjyf%}uEM+y105zcR3ydG=`f*zPlNSle#8=%F=9Gtbe8bBK9n+w zd)@AMJnrCKf`1(+9BDA_J=i%p0hhuFCi2(=jJ0an>x1_(n^zI=0<(0CE+^#EyWL?p zV%=C$0hiIvjW^%ucESj=otahuQt>Icyy zyQ(L6k1R+iu6|qaBM#)ud;^4CkXw#OYUiAZg3fzkFCE0ZMJ|m|4_N|hvjPNvoeJKA!CR^^1mtsGGqRC ziey_M%>FGK=E8VUPBz6#J1tfu6u8C=ouS8E4#|7F@4SuWR3M?Ef%}LEc|nJwQ}nG;kWgS?u1#f++}OVH zdV71Pz4ON5&UWwX+r91Wf@~WsEWFqt#=8BKrKnyeaS+P6A`7*>1JG7?oN;dpYFQ4Y z9-RPXRH*~sOl%a%2^LPOOcdFE+FpkZL*Io2DdGD9irBcg<@{$2Y@L4ffp@}xktwUkKO$ERPpm}h$Wph&aVk!Iox z@N!y@6VKx(4%R3051ut&wEPx|7F|C>qAym@>MKm2ln3Dd$}n`5c~XmdXO?~L5};^xBZDc>^%2r?7AL0m4FBSW~gA}WWu6aHg`l)BP3A0k`p zSrs&2krh=gUc^`*8T#2~byg#%MrJ5Z;nb`ysSFTsCT-t2(t@> z9^ziQ4kCaw@dCU!fX~%c+r~@MwxtXI5<64ISGSsLZqiJQVN` z6-(fMQA8b^&tvl?Y`%;Q-bv~NrL|bapV;7S6#ojEC)Ts_7i+7t8&>_LS$VCt_VfLj z1>G<9pJR7kG4E%us?l|rif0ydA8x4b?6tG_qr>l>o&2uz9AE1dFq(Z$t#}z$I5P{n z53j54?D}*3r3GO$ds7KsO9i1rLFmq48FU{#c<(v(YQeKIj8coxj)Uf^_$u_%3LQ8C zX_>mFjx|hhH0Ky)deI%9u6{H1^G&eF_Yk#y}`Agj| OmDYah{MEu<9sf^jt5J~v literal 0 HcmV?d00001 diff --git a/skills/kb_workflow/pipeline/platforms/__pycache__/bilibili.cpython-312.pyc b/skills/kb_workflow/pipeline/platforms/__pycache__/bilibili.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f5cc284e0e2f23b974cb0bc2673f8bbffb9eb4a3 GIT binary patch literal 19884 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 br6Bp8oze_z?i-UPjep^Z|3%?1`HcS?g<9i# literal 0 HcmV?d00001 diff --git a/skills/kb_workflow/pipeline/processors/__pycache__/__init__.cpython-312.pyc b/skills/kb_workflow/pipeline/processors/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..773b3d5241b0d3b3950a6cc9b0e22ad74d62f904 GIT binary patch literal 1358 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 literal 0 HcmV?d00001 diff --git a/skills/kb_workflow/pipeline/processors/__pycache__/asr.cpython-312.pyc b/skills/kb_workflow/pipeline/processors/__pycache__/asr.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ffab7f9b2df028c7e801b2fe4b07b8d19400ebb9 GIT binary patch literal 26963 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 literal 0 HcmV?d00001 diff --git a/skills/kb_workflow/pipeline/processors/__pycache__/download.cpython-312.pyc b/skills/kb_workflow/pipeline/processors/__pycache__/download.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..10d008e6c604fe0b267a70d468b287e6b99ba45c GIT binary patch literal 13319 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 T(RkN**}z(t9KUBUCd2(NI@2x{ literal 0 HcmV?d00001 diff --git a/skills/kb_workflow/pipeline/processors/__pycache__/parse.cpython-312.pyc b/skills/kb_workflow/pipeline/processors/__pycache__/parse.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c8a08ba8c225cacf2fbf42e54824732d78fdc963 GIT binary patch literal 3092 zcmb_eO>7%Q6rQzr*N%UZP3k00o6v26rcPa(-yjtlXdysV+J?5M#S&e%-f^1yf;7J zyr20hnT#R$-Zs9}`+)j^GQlVK1b6!lAkHHV6_CbhA%inRg%C&Sun{)-0&fZhf$_W{ znvp_;(Si{*y9!;57LAx0FT~A6A;I{FkuAXh-BThnqSkjG+7&!MA^Tq3q9pHhi# zR~@-xsBXz7rXz3Ps~h@B_-Ez9j6PG%$f~8u_;r`4Mc0W1idng6TQ0U-*`2T8EK>?3 z`<{_?i_WIHx^3lRztYWSI4`bRmhCd3lL>jzLlru%8ea0~%Ttre)6Y*ny?@`q=Rh+t zja|jTt_%BjfRDYPTeEEQ1PuLS?6WFW*NZdhp{ffEC?@x+Yk&Yj>X=PtONKpn1Qx~z zR7;)4r0ApPw;{jdZVv--9${4A;5tJZR|spN056tIJumU8$wGh z;&iAMDz_Xn7^8iSEAwl4pI&O&pAOf;XWnrmfd&mDE$sg~TYkzfwX{$3HB^oUmhGOr z(pg@Pw{-$)b@xI|AbV;;IT?(!dzh`e%>`7AFG~U4?w108LhI~dLt8hXYC?bphid#0 zv<3~K7A~g(y><`Mfi@RVAWa8!y9epUHWyGJr4E1B_o=uf`l5BQt*vvef5Y}wEdpzH zILk$(MPa1Fd0?aqMmn77BKkl)Ey8VWzUu(Mu5(-B|8X;)h3B|TY~gDb+YmySW!g0v zay6p=o&r~+au1na6QeXvb(+T%O?A~>e#&5pO`g-;88*3VvrLZtq(UtYW4B7IyQX0~ z^7Ei?%c59YyA2si111Do6Y2yc!qr_pyD;#Q}~#PAX}(WiAt`II}F5lJuH7oibBsAG_R z+E7OzgU~E=1qJ zA{@SIxSqhaMR7D?s(FWQon9n-clPIJY!l}}gP7QQ@S*WX^EtbMt)ijM<(*mGFr57C zNoB58#_|=tf(_lm`PJ0z31yuYA7&Y+b()HnRz z@S@o49Xvn$?(qBNOV$PJTJO$9@n*btapK2*xtShm-ZS1D+SDA`+}t!m+mX>rCoY^= z>4^?>FFt!~07*@Tp^n>SwZ#Sfysi8({tezUX{K)4M zS0=8GHy%G!fBew()KoK-Zlt!=Q`;J;9re_X%ahkr58d1_w0K}eM13PL+U(zSUU^q( z4sC7>W$Q!P=HN(UaC?1lds`9=tt2CTu|@G#3MHgQeB_%rwO>2?wbahV$!~j7&Efk$ zDt%&qY%kwG{>AjwQe)!9`oxRNyALlPKDK=PMB}(#KdvtyD=%-HJr`+8{S7Homok^{ z`#g6gcXjl-w6_W8mA2NUtqp0kE{$Fmu1mR_J^hQxKOLGm-<*76a)LXU;R(f>(Beeh zfCemcQFuf|6~$6btSDYgQA}H_8k9~b%4=2CXpKY^MYD^FLTHXAqtIMIx1mL38*ONf zVhxQNhsMuY^jjz*L~r$>-t?J$EBwR40LcYf2Qz&n3k+SbRE533f`nFTPlSMl7YCsQ zn$SnBw`q;D^t<-4K(q6Sh~SKxgtKv4V-)BcLW`q@h{Wh3?cvk literal 0 HcmV?d00001 diff --git a/skills/kb_workflow/pipeline/processors/__pycache__/srt.cpython-312.pyc b/skills/kb_workflow/pipeline/processors/__pycache__/srt.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4896d41c0a2275915a441757b1648558c50fa0b0 GIT binary patch literal 16497 zcmbt*X?PP?mS~msU9u%x-d*0nGG5pr4iIc0Kmdotq?0(EsD(=y87)pp4p=Saku*u< zw9|-en9e4$G$w4$OfMvmW%`?$&V2K}{-j8G7WLo_-)m&UuQ-9c&d~42JEuw|$wr2} z9{F?KTlb!O?z!99?x}y*YE=aMo_GF}V`L3M`~_cxpOnv#*Z&t}4ihxdL(n8Ga*{4l zkBG#)*eUK2bE%|90;$9)bxC`qT%FV@bIE(;Twdl>xRgCgm#RnQQunA`njVcy+oR>` zj-G zsnh#YBd<^W`T(`f#_XXzd)*X3OdfsjFZ-W`_8h{=-#s%m_RDY1|5~-EmAZQDy~(%3 z96}z|H|IlF$A2;P>KHX(W4v~zl}oH%#%JB-aN55)Kdf2|&CZ;<^6_vg^!()M-(_2P z?R_r0+Xs!(IfP!)N_BKUNKJhbx%TRjENribVeGv=57U~?eRF;!b@0r!{lnO3X)87L z>N}I6@QiW5NL8xz5QjrBf-7fVNtGIsv8`zwz^dUE709Mmy_gTGmpU>g$^TNBf)8@5j z7S|$T6|i!f-2;O@RtdTL2YrwQIMc%(X3s9CXKyzUVc%wR+xqMbllkDcft;S7mr63&dMN1`P7KUyv1((jrOu?x=D0d0?z z*3yy#k{%hYqot6_X+152R57zfx}AZRL!FW?pcRm+=t5cvshT#@Do6qAKC(yKO;}8< zCU>I`TKS!y-o`nboPr;2^uKS9W9zAN$0mnAr)JDO?1*d6{4Vv`htzh*fZgeE+o?>S zlVe9y=MQox1e zsLenLE8k9S>7=eb_tMm-r?YjqvQ}6-T-tVO>c!tr?tfuhD+cO%(+ri{7&3SQ10t{gA9%h-9wvPJeu3w(K0v$#umSQ! znsJdtK)ip6FVp@+8a5~mNc$1ftY1*se@Rnx51PBv&lM57bZAk}o=mM(jY}5L;!~zbIaM$0Vtsx8Rs}n{cP?}4F zTYvldfQaegX3^+0xr&0izhma=VGeWw9kwZoC;(ku+7mksqk-7;WMaO%uoofog2M+`h98#GstNd*k1Uh@p#iR4@4`cU~qzZ z7Rs$#x6R;~zzw@Rz~v_o|NhFkU-8WN>X~z?gRi50A#{MLK&-8Iw|yqksq?R-PK^Sl z86=KeIrm)Z%`tu`xrz{UHTmZ7Rn6wIgW@$8#xy?vhW`>4ffxq)({Yk5o286! z>$1V!2htT(m2%LEb~)^HT2tXFyL}9Z!M-8XZMq$<0jIrV^E#&kltw7g3h371Qh>Ik zv^lK3TrDf@<;p-c^QKYw8w7AcXmUNImy@O%xfZK$k{186j?GlZ_RZ8D`w#_sUV8Qi z89UvaUJqu_X>ZvH${H;ovorpA_u4??r753>a=0Bnht28m+cQfB9pOORDSyT7u)w%9 zu-(@Q>aK-kDq;5grFaH1qCBSq+Q0ZV|7&ZF_;=?V==H2uid$e)z08>3^I8JWdN%YhKzd9a8%S%hZ3BYo=xxKH4Gb|Tu>D232fbBT?S)X~{TkT+ z5BrH5RfJMEERQKlMk^DF`O`8&(->8^T{PFd@^olZa>0^`1>0i_wnsIM7d3?kw+wHY z7Li8Fh2;+(FO5F3GuqfYEhY=>5+>K%i|3zvC$7VR76!C~vx-VhaeX(Y7yk==wf^~nJmIC14Zp`D_kU&GG(S|Q< zUvx*SH%}Puiy7|w8>|G>-t?}7<^5w}r{P{b@z2XTL>sllzpN~R=fCQe8&%?eEos~+ z75_;ph5Vni%8e_$mMS*P%ETh8Qs2rk*_F&F{7u0HYv{4CSl}e0V_L_ad)SwH3{w3L>iyDSJUHXkxf?g!AdLOz=Yq=N0jRON^0 zZ^%LmIk3tkC*?xRpv=AE|EH}m0%%wM_qDsj94T^ECu3Q{>L_zphgJpU(EB`LOxcwA zDj;K`cj!YcjDjTkh@c`MTTeXxYk~+WeHH;zKuKpTL*@~%Gn<5(Yzj7JUK;vavM@p} zpc48Fs$q?_u*T+~hOXnLSbHE^fG2e&JK~$QdFvP_DLh| zq=U*{Q6JGOdK~nUId>GUd7d5RCIiYtqLC^I5!45jZc#uM1W!@_t%D#KI)C{cCBY`z zIL8SyajPT=8bDUub8DB-UmjTzFbJH4<7u}xBl_I^?i(B@#l(*;?d$0_k%5_}W?0>to+*_=Cx+j%7%=uNkRzuwl) zwYd7(E2-x`;9dOLb`RQpgN%EYLjzRgv=eyh+$)oBznKGWb9i&zzo@Qf42yQbbNv2C zSAY8f8vQT6k$T~i)cI#qXV0nx&E8+Q9qv!i*2iw}>I5uBIhKJ%=~oJ7rq^GewvQ3i zJGj&5@Hy>Xum{2FM6+ z&LPB^V*{eCCI{Dp5A5yZV3+>HLEAm)?ky5l%Jt2(LocivEfF6WiL`wmtF*gmKD)zT zG7}$VgMPrshrt!4iNQ{V+b6I&C9K-R-E(mFN6cM_U6mafEAiR-ync1IWVK(@ELg^N zdNo|V$i0KTct6Ihg~kjXPNoyl2*xJ3N6a|OXDbNAYrM#Ldc+sh2fc2>UI=C#3{13&SwKHS9^vkKdzuwdYd zlwgqku`-x#SPO0*SgqB*4}2lLJ}b^3TWIY|Zw9z!;P3ueV|KW`9`v@rPGL~dg{uMR zuoZJsFtR-iYsiA~b7v`J7Gb?Ad&0nbfIdL9fH^;$ms?HV4CYn^xg2XskHAh_vx~|~ zFwYOMAPbP*jND*ZUACM9=GIuB#bNcqfN?XpfYu>q8Fc0?gokkCvMGZ~11nGO2ft~C zF`O<1`-bqo3s%Ziw1%fkXi`~tS#O-s*Lp}8lCbT9l$zc6L^$wg!3DE*H6h&$T4DPi1vxu)S* z)zPYnnia8{6=xM+u8h{Kh}Y~mbRVFuotIk`uj$}Qt7_kQ;>Z&dl}lokOU5_FD_4hA z0)0*IcaN35XN}e`8-FZX(vi?~0+!OM&}Jau;L|TYeY6QpRP`Zsv|?Gpusk{65;fE( zE9QMi7z-@n^;gVQqrS+a33JgsClNY8%%jO!p+s4P&Obxg}ZOctklpAIO+)B&rs}kkW)!Egv5m-xICqOc>T> zXSJ+tTs5)q-q^x>qiq|bC7TkO%}Jwq!q^ZqHbna4#zmp^NsVDbQy0_JU96xYW&Hfc zD^?~;Ym(&+$)eI}C84dqK}f+nVjv7g?7p zOTSb{t9FDpa(lHUW@;Iu&$y4f&-Nuu_vYKJSBw>~+b>pBM^qEk@))%|Ua=xs-UK5^ zmet)*%S^gyLZ;RI=Xa$O?=kmsYgqEXe(67(p5^{oD zrklVPb;KetruKsJ`Y1SlNMfX!zm&2l29H9E)Qgd;pMIK&qTqu@vYOMa*G4l$Bj`>- z{6#u)1y&#S0q+F;Dfb7$c~W^(wM)W`n_*H@|VuOQkb_rk?rx-G39aatGW z@ZaSbbc2e*lFUu%pl?^pO3;23;9T|4peuCoQWg~xi-H&OGW$M=@bL1gKpRxB5_HD0 zl76qp&1~QbdOZU}7AYqqnXO#O00fG#G!}(6U(ptX z>qo_rzJ#`Qnjn>p<24t{tKYfn$X$^K-dGjd`d2ZOfs52o!GQx~(HO(dn7TG;td44` z@x6GoBBpMD_lPQHTrgo=7&9)68y814i!bZTql)ssRs#wS_f0Qu&VP~=cS^;7luA2w z@)>6f&k}dG@Q@t_mj*6NpmCJ%<;K5jDd!qlnHvReQHd|rAj zb^7h8UybuIK36{d9B&QbijNQMx%&C5sW;x{FXi~w7`!2f|H(H$oP6s82!*(E?t|33 zZ>P?G0)bK3nBx1(1bSeDTlZ^L-+;?Nj?z@<@YSQ~@Cv{QHF}C-0W#$>uRqM(chHsut%Bp5Xj5bq-y3cQFJ78elH63$~G6Iud#{qtGwW4$Ij_i>T?k)MT z(;3g$kHN&vP(93$DnGWY|L@0O8<_`wHL^eB`Q}H2Pg>QV@m^<3vtBP+osDRLl`R%v z`f=fB{b=oMfjOjuFv-sVY_51f;n?4Ll5@;Xh^7L+zzd(u5IRCjOa&>GBcL+J66@#U z3NwJv4g;pa@v~V+dk0)+%K-^k-d+$rC|<0dJuFCR7#f3KLtYA@@$DDa)lq|Zm?2GZ zfr~7uVrT@iV}0p1A-EI$3Y1{?frRU_XjvKG4J&o+p&blcl(h?YF<|? z8}oj|%Nd#vV2(5YReKo+gsX7|m!#k0aA&Pzi<)OqYY`ZQW{yFw&gp^Grj0wa0zsBy zUu=oP3!x5qVjjRCwf8YU1sE?f2b}WskLQ2gQ0T9o$^V3LXYAd2WP)Ar047KgO4Ed* zET$-%P*5=iHD)?1i7KdsVl@albNNK^!dUUb@shJk;)o!4-IWP!bU5l`oPxBueIX3T|7ZxwkEI^d+M+ zQeq$JEd;)npC&~X4kZ<%_hpoKxWP(~f>zS1G6HUu>aq%ZzbbcZd|ptW^WH3G?sbB) zImWID$Y#l&{4{H6U1lETbKpYHd_Ku67sm9XdNR-jnVuAL^i&v7{3u*T+LXZslA2lR z%NQU5r4RQJ_Y+_kaX=YVxeH(%ncG$Y2Je}Kaez$AzmtjrsvkvHan24<2h@yd4t(Z- z`bXg_$-$=yXy(LM8qmzbCt_OYvb=J&`~VRUttW*2l^MHs4q7X?2*k=6=Oq6u<;3{X zRr&hPnwg-uR}UV8HAu_fM?1D{rE=JOR?odv0N+Wd=8=~wf$itjnrC;8(c@Dme{<#R zKV;hZ#Vsu@oH*koC>R5&L!UylwqL<{x7(@On`AABV)V4T>8OyxrIu|x5pYqztJ}CFs-g)XC!Fl=$9-yF@h(dE%9+HCU zQBZnVb4WA#aAZ&1us9@5DzpbR!Y6?66B zz@fk^PfwUzW9HT|f85*-abD@Zo*Laf+7m5mgy<~5URZXx;!wrt?lDEYU{OdW0A&f9 z7pLxuR<~!!F;yI1b!b&YHFjUzxFVzw8u%lPk+Nt}b3)MqSTjH!abs&paY1bahpVA% zwDJ9Q34LR-dj28JZP&jrQ?sptJj1z-~&V-<7j)t8F?aFx-_9#28awL2Lr=_ z(R(AEasB*|>OPdsg3IzLgEW*odC8hVvI;3>`gNt zBfJbrbNS(+Lqo7p$CoCkm2vY*n3#0WDRf6Dnk<5O?5hCF$AL#)F4PgO7y&zZ^(;WT4M-W0kFOtJ#H_!uOK{>b| z1_qy=!IxkZ$C;;wKb}1OBF~d=Cl}DH07L6n??4DT??=f(=jHo+C%msO-9R{o7U>{r zrvH2YFVpErI(>;tzd85$_qZs3JjJnkj^(iAOty;cIkq|vGOv*t#tN}-L2%#>i=HCV zOjQL;mEf2vndYZr=9kcjC41o>6Gr7lToBL6vxS%7#os)WE#xq`JdE@hG6=M$f8aT( zZuRH`p(n%ZM}}g$)jSvdg|2|KNN47}^3C3?cQcXDwrpJObpPYl|lRu z`?hWE-Q5(r9J!n&qw_cnAegRk#yswI2EE6uc;RB2m-)Pt8gHFBYFHAy)Gn6v&UQ_| z0?quDGnadoj6H=*j&lqGtdP)}!oK1ALu8W6JP{GaG_~*s=JC$qt&mY`LQlT9ELm(0 zcaM^zHKXfB%@HzE10u;BHCmz?OR~@yHikRGwo!5T;n34jMJ2bi7D?BRt{vcvUyKx0 z3Ex>hmhUUc$GJFdP@+5@Cl{^l*Ja?b>~RK;Ho=^N2OIz-ozcRBl`&jM2zMI}73jg| z6^_%8yQ#yEJs*R!(@en!pN|7T2NvTe4IcMn`1vPRKHf}mSp<2U;TkG4bruz~7LlSD z;Qb_LFo$@UaeQ>*<0E`vOICuPt5{??pfdqD>VObDzFA6z(&LCi3{fK-GQL!YVg7FT zFvMzQRaUFZL&H}Nkk?qPPY&9g=^DA!N_%?YOMs1txDFpSd~Cr7x}BMBe4vWMAVXkq zn?UdZAJ5)vcRHp~r;`$n$v~ZeQEWPJ4T)s*n1r)}bX*uQ;MA5=&CFWFwzGPaBISrxGUDrbH`fl=W zDRtdX7E4WkU8s{*ahs4M-crr{0Z7N`+cgLwL@<2}vUmnO&k$gMA4b3p60f9!d(XEU zRR8o9l5c1LtB^A>=v`nyoDd9p^%yiT*z%lk{#GHJA3lc04}UeU#;g!>A4h4Rf|Q7l8Yq03((dE&%4%4=K`dAW)CiI;#Xl zek=E_2=iNb=Y59UMnKzxpH+;^xT#phZ^kvuKf^2T8gDl|Ktzxv>=9D(eHlU4{e@8f zPeONzsJuj!{0Fh*Yhp=?SbB+A^B=^jOT^umh((u(6_=G|A@hW?ET$|QT^U!_@0Z<> QJtiZo!mGb0Fy%V^f26L;a{vGU literal 0 HcmV?d00001 diff --git a/skills/kb_workflow/pipeline/processors/srt.py b/skills/kb_workflow/pipeline/processors/srt.py index ecf7f7a..dcccf28 100644 --- a/skills/kb_workflow/pipeline/processors/srt.py +++ b/skills/kb_workflow/pipeline/processors/srt.py @@ -17,7 +17,7 @@ import json import logging from datetime import datetime from pathlib import Path -from typing import Dict, Any, List, Optional +from typing import Dict, Any, List, Optional, Union from kb_workflow.pipeline.config import get_settings from kb_workflow.pipeline.processors.base import BaseProcessor @@ -48,19 +48,70 @@ class SRTProcessor(BaseProcessor): def __init__( self, state_manager: Optional[WorkflowStateManager] = None, - enable_correction: bool = True + enable_correction: bool = True, + enable_semantic_segmentation: Optional[bool] = None, + enable_cache: bool = True ): """初始化 SRT 处理器 Args: state_manager: 状态管理器 enable_correction: 是否启用 ASR 纠错(默认 True) + enable_semantic_segmentation: 是否启用 LLM 语义分段(None 时从配置读取) + enable_cache: 是否启用缓存(默认 True,仅在启用语义分段时有效) """ super().__init__(state_manager) + + # 如果未明确指定,从配置读取 + if enable_semantic_segmentation is None: + settings = get_settings() + enable_semantic_segmentation = settings.enable_semantic_segmentation + logger.info( + f"SRTProcessor using config: " + f"semantic_segmentation={'enabled' if enable_semantic_segmentation else 'disabled'}" + ) + elif enable_semantic_segmentation: + logger.info("SRTProcessor using explicit parameter: semantic_segmentation=enabled") + else: + logger.info("SRTProcessor using explicit parameter: semantic_segmentation=disabled") + self.enable_correction = enable_correction - self.segmenter = SemanticSegmenter() + self.enable_semantic_segmentation = enable_semantic_segmentation + self.segmenter = None self.corrector = None + # 初始化分段器 + if enable_semantic_segmentation: + try: + from kb_workflow.srt.semantic_engine import SemanticSegmentationEngine + from kb_workflow.srt.semantic_engine import UnifiedSegmentationStrategy + from kb_workflow.deep_analyzer import SimpleAIClient + + # 创建 AI 客户端 + ai_client = SimpleAIClient() + if ai_client.api_key: + # 初始化缓存 + cache = None + if enable_cache: + from kb_workflow.srt.cache import SemanticCache + cache = SemanticCache() + + # 创建统一策略,传入 AI 客户端和缓存 + strategy = UnifiedSegmentationStrategy( + ai_client=ai_client, + cache=cache + ) + self.segmenter = SemanticSegmentationEngine(strategy=strategy) + logger.info(f"Semantic segmentation enabled (cache={'enabled' if cache else 'disabled'})") + else: + logger.info("AI API key not configured, using rule-based segmenter") + self.segmenter = SemanticSegmenter() + except Exception as e: + logger.warning(f"Failed to initialize semantic engine: {e}, using rule-based segmenter") + self.segmenter = SemanticSegmenter() + else: + self.segmenter = SemanticSegmenter() + # 延迟初始化纠错器 if enable_correction: try: @@ -102,27 +153,53 @@ class SRTProcessor(BaseProcessor): segments = parse_srt_file(Path(input_data.srt_file)) logger.info(f"Parsed {len(segments)} segments") - # Step 2: 语义分段 + # Step 2: 加载元数据(需要在分段之前加载,因为 LLM 分段需要元数据) + metadata = self._load_metadata(input_data.metadata_file) + + # Step 3: 语义分段 logger.info("Segmenting subtitles into paragraphs") - paragraphs = self.segmenter.segment(segments) + if self.enable_semantic_segmentation: + # 使用 LLM 语义分段 + from kb_workflow.srt.semantic_engine import SemanticSegmentationEngine + if isinstance(self.segmenter, SemanticSegmentationEngine): + # 返回 VideoSegment 列表(包含标题) + paragraphs = self.segmenter.segment(segments, metadata=metadata) + else: + # 规则分段返回纯文本列表 + paragraphs = self.segmenter.segment(segments) + else: + # 规则分段返回纯文本列表 + paragraphs = self.segmenter.segment(segments) logger.info(f"Generated {len(paragraphs)} paragraphs") - # Step 3: ASR 纠错(可选) + # Step 4: ASR 纠错(可选) corrected = False if self.corrector and paragraphs: logger.info("Applying ASR correction") corrected_paragraphs = [] for para in paragraphs: - corrected_para = self.corrector.correct(para) + # 处理 VideoSegment 或纯文本 + if hasattr(para, 'content'): + # VideoSegment 对象 + content = para.content + corrected_content = self.corrector.correct(content) + # 创建新的 VideoSegment 对象(假设不可变) + from kb_workflow.srt.semantic_engine import VideoSegment + corrected_para = VideoSegment( + title=para.title, + content=corrected_content, + start_index=para.start_index, + end_index=para.end_index + ) + else: + # 纯文本 + corrected_para = self.corrector.correct(para) corrected_paragraphs.append(corrected_para) if corrected_para != para: corrected = True paragraphs = corrected_paragraphs logger.info(f"ASR correction applied: {corrected}") - # Step 4: 加载元数据 - metadata = self._load_metadata(input_data.metadata_file) - # Step 5: 生成 Markdown logger.info(f"Generating Markdown: {input_data.output_file}") tags = self._extract_tags(paragraphs) @@ -133,6 +210,12 @@ class SRTProcessor(BaseProcessor): tags=tags ) + # 转换 VideoSegment 为纯文本(用于 SRTOutput) + if paragraphs and hasattr(paragraphs[0], 'content'): + paragraphs_text = [para.content if hasattr(para, 'content') else para for para in paragraphs] + else: + paragraphs_text = paragraphs + # 记录完成状态 if self.state_manager: state = self.state_manager.load() @@ -144,7 +227,7 @@ class SRTProcessor(BaseProcessor): return SRTOutput( success=True, output_file=str(input_data.output_file), - paragraphs=paragraphs, + paragraphs=paragraphs_text, tags=tags, corrected=corrected ) @@ -190,14 +273,14 @@ class SRTProcessor(BaseProcessor): return raw_metadata - def _extract_tags(self, paragraphs: List[str]) -> List[str]: + def _extract_tags(self, paragraphs: Union[List[str], List[Any]]) -> List[str]: """从段落中提取标签 简单实现:不使用 LLM,只返回默认标签。 未来可以增强为 LLM 提取。 Args: - paragraphs: 段落列表 + paragraphs: 段落列表(可以是纯文本或 VideoSegment 对象) Returns: 标签列表 @@ -210,7 +293,7 @@ class SRTProcessor(BaseProcessor): self, output_file: Path, metadata: Dict[str, Any], - paragraphs: List[str], + paragraphs: Union[List[str], List[Any]], # List[str] 或 List[VideoSegment] tags: List[str] ) -> None: """生成 Markdown 文件 @@ -230,12 +313,29 @@ class SRTProcessor(BaseProcessor): # 构建内容 content_parts = [frontmatter, ""] - # 直接添加内容,不生成摘要部分 - content_parts.append("## 内容") - content_parts.append("") - for para in paragraphs: - content_parts.append(para) + # 检查是否是 VideoSegment 类型(LLM 分段结果) + from kb_workflow.srt.semantic_engine import VideoSegment + is_semantic_segmentation = ( + paragraphs and + hasattr(paragraphs[0], 'title') and + hasattr(paragraphs[0], 'content') + ) + + if is_semantic_segmentation: + # LLM 语义分段:包含标题和内容 + for seg in paragraphs: + if seg.title: + content_parts.append(f"## {seg.title}") + content_parts.append("") + content_parts.append(seg.content) + content_parts.append("") + else: + # 规则分段:纯文本 + content_parts.append("## 内容") content_parts.append("") + for para in paragraphs: + content_parts.append(para) + content_parts.append("") # 写入文件 output_file.write_text('\n'.join(content_parts), encoding='utf-8') diff --git a/skills/kb_workflow/srt/__pycache__/__init__.cpython-312.pyc b/skills/kb_workflow/srt/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..91b3125e1404d02125ae9c8e786ae42cd68fa74a GIT binary patch literal 946 zcmZWnT}TvB6ux(6c4u7EH4#Z97<_V|b}Q(I2+P7CBMG;seYuS@<2vljj@%g$MMJ{G zz+fK=voNfL46&YiFnqA*UN-ANhJ32==Sj;T@TqfW-A(GioO|wk=Y03v@7#}7RWSrM zW_>Wfa0q>4o07pkwA~Z1Od=hnk&boF!Zw%YY(CA~LR!EmgLM7{PDgaXh<0;&WK>9t z15rindjMsr&RgS%`Rnz@X8!_oUJBNn^7F+UY7Oa_aOg4xlH{Mh>3^I&>%dubw= zxEJK-x0jy8j?1ie^VQ4sXZc`iPHyg1scTRLfX%lH-xu!(<74Y@-i45BWNahn717pI zr@ZlgX6xZph-nU`hUPg?xy7!d@P0)|MO^Cn)#Z?Mo0j2=sUnpUp*$p0fw>4c|8UB% z)tqN)`xyrH55ZAaO7y;vQ*A@TkXy1S1dL_(Hn>SN1oCB@fltyoowtyUhcQM&IK>d5 zj6^IDcbEf&OChfUN<-75UN|bYdCKYH5cp|fe*e6?Sdls?JCL%mDYzJm#h5LFq8*Aa z57x>(sw?LlS@k?>cJ+CNtVI2WY!~TwXtvvO`V$~cqAY4i^*>$~mNI(3y0ygCMyW%6 zi4Z0TAqr0=Nch{3%QTT?d9Nke14v`HFBDz_9xw}X<2UaKvzlV zDoKc$Gd)5Qy#szFAsNGCw;+VZfwT@jw*}k?S`{k`@un5AX-&Gg8kY-_41dP&tcXX~ zr1Pus#)8!NHFo6j+1Yb5#|nu{%XQ0Aq2b!+SbITe-vtKLp-8?+i0){F`1J?c2*oKr z#(&=kr!I`#kCsBp87#Ue|cULiX z<&HxP$U$He9ySSy?iA31i%%9fcjgI2a@I)jPHw3Ghnxx3o+ z1LZN(-kH7cd+uY;_nmX^UsF?!2*M%HO?PSrLU(XM4jL&#%>NED-N=P%k&AGtJVb-4 zRz={v+M}*jLrQwc22HJ|L0hXOkP6Z2`ZQU{LQ3oV38_?TP@(6MOVf^AT3Xw$PShG* zy4n=6MGq~8epRC0)U37{{eOp2Rn0DHvyWkDC+B0RmwYb2hc+5xH^!z(K0}vH0o3@w1nqzG@p48$K#@4#7g=-Ji~kofO{tKseS59gMShvo?ZHad^Ex z&cV5TUbfn%;`KWkao*wK^*b3K=X3fzPU&2vIB|Hyd>)j$5shjI_)#hs0Y8RxXYHav_xc*>QkHWt4YYS% z`H$C^miQWJuhZjbDrNV%Js!4n-)?)8kJ-1!NZIy7kS|$aGyqe`025*8_yS*H*WoXXNco_@S*fhM} zZudGGXuF*^+U*UZib39FxBtfP@FZGvcDu{xwA&f1=8OSHW*nvBNGC^`kYO>r+R>L} z{@0{RW0Jbz9)1SE5W5kM_YB2`+hW5XOJ^Am_X$HIvEdWK;HRLRvFjhkhL1p>#fm7M zJ!mH=oG^0g?q~>93N%;<9Td9ym#MwcI5TuL-f?lJFC+?MlR{1YCG?zOY-7P?{yWl5R^KQeym3Mkj?^`4o*^VIsXvNCaK^%8=>BrOsIC7xk`2p~J; zq!3U+DM9)OiRAGSvG7{7%Q#|ljgFpxQ9*c?}kOdUj(BrL0$sMVm6eZBH;x8 z;0F~5^9N}7v0hL*NyQ6u#Y}_!2T{$I+VJ3Mc~#e@Ke`6GxY(qNz6D+p z4qNv-u-~x&UtC#PSxG4dj@m>mR+Y7i+HGoRP9WW;D5gA`p;^C&gQ1F;l0h{)AKE_?=2LFY^zrm*GHDG<+jUsS(t;bhaM>9O>_U`fVY7gxdvBam@6T7gB zh~qPqvd8DGvx|~cA^>?37g(&|6eVF#ml)fUwfH>cbE$%!Yy(7X=pKbESv^noR-CCg zyD^%X{Z2(sdBjvOr$r`9XJtoaBxU6-Q%2|Zj_r}0pG}&!Lzm$8`_O6*az~!-A$!ed z%wMGZ2&$(t*NkVb33C&fMG;dG2(V;Lnb(Y)ah16!qAz+7)LK}A$eZ9X1E>v%g9<6s zC+w13#%X}KtiY}nShZdO??SI+Fb=4a0oSE!fnhH7Wm0y&Th#$|J@$^41({N6&?>}X zpGgdbh*{lAa*C5*pDwp7q%KW>d=DJ__ti38U?OpF(Nowd>KKV%?o$l@0&c$z>{k zmEu+BB0u4;L|tn*tKix=2y1u zsJ8Fiwd19oukhMEKBmFJN%lnaDj$UfFpogQ8@BFu(&8SE(Z2^7pK=+m-d2_O_qi5UAebYS0r2rN>D&X9A$%@?^wX zJYjt*_}p!4ZujfQU!SrTja!Q@{ru1B&$s-^@R!Xu%@Jo^#9B0A-5Y!^nwi_Z@%Y9Q zl@Zg*f8R3ae1%jX3s6+uQ5`9G^2*CsHb*w>jI4Nh(zFYJb9DQE<}}db8}?zC`aqSr zDg)ijF#Hs$Z?4FzdPaS7J%RJjXdqr<6BYOr0`$949cqOu4=6FQ1-%A`)=CD{0kQ=w z5Y&+_)f$A>zBgs?~X>A{(?!;Ab!3a($^Brh@Z z-$qNyE5QHCObo_}AA4Oe@7>Wi?~e8w8EpOF=Bjlx!fo2ch|Ga~Ql6~$xxFIxZKegT z;0-K1eZak&W_g{{56>xZ3nra=9SpA%xd7@@6ZHuLoF*5+MAvb9dA%%wPfySv?UK5} zSdC<~4N41(4TpThIF&BSpaH1mk>s4D*m(vzu_eI6z)LyEnjJJmGqQrZXckZlX($M8 ziJCIIxQ-pc=cDG#uGTNig;7iHl!Y3%P~q%Ji!GX$e_S_bfUft_kSQ~2vQC-u$4&V? zznCXD!lhx@wlb*c-mY#$iJ6`Ou4XfOp86`y&KMK2ydELv2M~-4ofO{B%;raTJte? zmIb#)bMmKh9v{zn{LG zy-jpDY^rK^5MCi{q-a-K^5nOqUoC$=c}?`Y7;MI&vuIH8a|na4DAL1-o&iCK$-)@$<|cKfK()Qw@U&m)Bu$66_+c<(eBI zWk{%H@LLdXsH3?TMPF0e28CP1hZ?*pQS7pHf1}?hJ^oZOKY=cwfQWqoqB%7|5cgDi zg8VuQ5v%T?w11%0w+(s0>?uRuxFN6SsR=`2oA$m|Lzueu-$#(lWf-m7hzLsmS6(wg NJoXh_gb8Us{{;eWx!eE% literal 0 HcmV?d00001 diff --git a/skills/kb_workflow/srt/__pycache__/parser.cpython-312.pyc b/skills/kb_workflow/srt/__pycache__/parser.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b6ff53897c10875b1d044e3e8b4d518d324719c3 GIT binary patch literal 4718 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 mIZ`p13r8;XI2DU-(V%@@boqr?bmjEJ|1Bzx>3_ z*7x9NpnQTYr+J>Yx-t|`S)EQRI@av!8TJF$kK0l$qI}dkA z@Po+anEmzukG}Qc$gX!-bojH^hcEDHA?x4EeCCHr(h&=f7s4Y;h%xn?%xNq20Ch4KKsnZna|rtg@wviR$QIGc>8n zrBO{pE|F6Ef76i1I`V(AuCg93`)ABrz>wjX{W4~kwaVW8!y8TE-JiA+&E#0e*d*x2 z5mMbIf`%A?=2Qh?j~m(NPK zeg`+hkX=xZKZOx}&{$~_O@Op)V~-8a;k`UikDp8V6i|J#N+rC3$?^2~D-}wG9djwI z)Y*kE3v!3l@Is;7!_)-xJT}fPwcHE*07%3`bK`=0pGN2lB=6F8>&rE+t%}Kj5`L7TAu zoTMcKdj*SwG@mK=X5K=7@qB+qF36JnMDL2d>mX6jpXgoDx{mJA;oho0aRm%4_BXXO z4Ok}iStbowX7*WT`V#S@BdUZsf1(?7j5Hd?EaVc342`mfG!GodnD+lQ0R`|%#xL&M5W7)0U{@0oP?Cti2Dr~ zPd3YYim80C&<~-{e4$B1AXX#5Zez<|jJT6#NLq5r(K!8nOCEg}dlIdEDT+Y>nFf29 zwt4MK4=nW+&A(w<0I#t0WgvA?bX4-cMOt_?QcC ziS=|-nf$@Q*Bs!Jh6y?@qH*qeE$npdC$DEj2FBz>T!bVq3a#AVyyDD5-58f}a=py{ zw$Tu_ZpNJ{lW|@6mu1SVkRm^Xaq&%1i5L>t`ZLi0+XPreY=ZE?r!0+A?zan+4qE2Z z4j{=Sc0h)_13G8kFwK!SKxtoUY1hlW`u^1AKJ)Th$vGVhJ8Ydxdh}h5K1-QTU&fC* z^+I~&{ZNJ!c0pEpqxg(vy$`&mSYw;Y{WBoBpX~pY3#hmYQiy8!QRXg4ITI=qcC@79 zkF`V#0Y~wDz$K#po_+{NDK{Hqi-A4Q6+K*v7t>!WKnOz~C0Gry5P@^d7NTUh61^u? zDgDmPO4>Xm%L3|vD~B|W4@&whC7sW9z0z-4@Z*L`uzPKjTBc|Fy-9p9aJ4e~GjdT;&u`KN5ip4dN9f1$4N@ zNMGn|iA;b&=q->c`8zL-xI1Sz90U3tVW;vU=|e;kk%`1VizKBC7;w$;arPq=d@^U! z8xqs7pAKTg2vbXOgBcPSh_w_D3Sv_jB>=grU&4RFY?(NSEI77;lNJjUfl7s+A5v-l zlqIN&zY|RVA|(EcVE9*ITAwiOJ0a&^h1LDS>RW~!Z{~m@r_Yenv8dlr(yY6as8gBS zUb!RS<4#Vl%G|N&j)0FpFKLQbWql9ZX;s$kHA$0I58Qc5HB+T)TYN{r#~r(BvP##H zeMi8@55G{UQ*=M*SrCVqjs@xj-S-nxGvjgaSKqtGX${5kO#D%Ij21Pa-z{cp!& BV2S_$ literal 0 HcmV?d00001 diff --git a/skills/kb_workflow/srt/cache/__init__.py b/skills/kb_workflow/srt/cache/__init__.py new file mode 100644 index 0000000..17f5bc0 --- /dev/null +++ b/skills/kb_workflow/srt/cache/__init__.py @@ -0,0 +1,8 @@ +"""语义分段缓存模块""" + +from kb_workflow.srt.cache.semantic_cache import ( + SemanticCache, + compute_content_hash +) + +__all__ = ['SemanticCache', 'compute_content_hash'] diff --git a/skills/kb_workflow/srt/cache/__pycache__/__init__.cpython-312.pyc b/skills/kb_workflow/srt/cache/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..84fdce032194181c5fa90176869544c085bbc646 GIT binary patch literal 360 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 literal 0 HcmV?d00001 diff --git a/skills/kb_workflow/srt/cache/semantic_cache.py b/skills/kb_workflow/srt/cache/semantic_cache.py new file mode 100644 index 0000000..d9a87d6 --- /dev/null +++ b/skills/kb_workflow/srt/cache/semantic_cache.py @@ -0,0 +1,155 @@ +"""语义分段缓存管理器 + +使用内容哈希(SHA256)作为缓存键,存储在本地文件系统。 + +功能: +- 计算内容的 SHA256 哈希作为缓存键 +- 缓存 SegmentationResult 到本地文件系统 +- 支持版本控制,便于未来格式变更 +- 错误容错,缓存失败不影响主流程 +""" + +from __future__ import annotations + +import hashlib +import json +import logging +from pathlib import Path +from typing import Optional + +from pydantic import ValidationError + +from kb_workflow.srt.semantic_engine import SegmentationResult + +logger = logging.getLogger(__name__) + + +def compute_content_hash(content: str) -> str: + """计算内容的 SHA256 哈希作为缓存键 + + Args: + content: 字幕内容 + + Returns: + SHA256 哈希值(64 字符的十六进制字符串) + + Examples: + >>> hash1 = compute_content_hash("相同内容") + >>> hash2 = compute_content_hash("相同内容") + >>> hash1 == hash2 + True + >>> len(hash1) + 64 + """ + return hashlib.sha256(content.encode('utf-8')).hexdigest() + + +class SemanticCache: + """语义分段结果缓存管理器 + + 使用内容哈希(SHA256)作为缓存键,存储在本地文件系统。 + + 缓存格式: + - 文件命名: {sha256_hash}.json + - 文件内容: JSON 格式的 SegmentationResult + version 字段 + - 缓存 TTL: 永久有效,手动清理 + + Attributes: + CACHE_VERSION: 缓存格式版本,用于未来兼容性 + DEFAULT_CACHE_DIR: 默认缓存目录 + + Examples: + >>> cache = SemanticCache() + >>> result = cache.get(subtitle_content) + >>> if result is None: + ... result = llm_segment(subtitle_content) + ... cache.set(subtitle_content, result) + """ + + CACHE_VERSION = "1.0" + DEFAULT_CACHE_DIR = Path(".planning/cache/semantic") + + def __init__(self, cache_dir: Optional[Path] = None): + """初始化缓存管理器 + + Args: + cache_dir: 缓存目录路径,默认为 .planning/cache/semantic/ + """ + self.cache_dir = cache_dir or self.DEFAULT_CACHE_DIR + self.logger = logging.getLogger(__name__) + + def get(self, content: str) -> Optional[SegmentationResult]: + """从缓存读取分段结果 + + Args: + content: 字幕内容 + + Returns: + 缓存的 SegmentationResult,如果不存在或读取失败则返回 None + + Examples: + >>> cache = SemanticCache() + >>> result = cache.get("字幕内容") + >>> if result: + ... print(f"从缓存读取: {result.video_type}") + """ + cache_key = compute_content_hash(content) + cache_file = self.cache_dir / f"{cache_key}.json" + + if not cache_file.exists(): + self.logger.debug(f"Cache miss: {cache_key}") + return None + + try: + data = json.loads(cache_file.read_text(encoding='utf-8')) + + # 验证版本 + if data.get('version') != self.CACHE_VERSION: + self.logger.warning( + f"Cache version mismatch: {data.get('version')} != {self.CACHE_VERSION}" + ) + return None + + # 移除 version 字段,转换为 SegmentationResult + data.pop('version', None) + result = SegmentationResult(**data) + + self.logger.debug(f"Cache hit: {cache_key}") + return result + + except (json.JSONDecodeError, IOError, ValidationError) as e: + self.logger.warning(f"Failed to load cache: {e}") + return None + + def set(self, content: str, result: SegmentationResult) -> None: + """保存分段结果到缓存 + + Args: + content: 字幕内容 + result: 分段结果 + + Examples: + >>> cache = SemanticCache() + >>> result = SegmentationResult(video_type="知识类", segments=[], actual_segment_count=0) + >>> cache.set("字幕内容", result) + """ + cache_key = compute_content_hash(content) + cache_file = self.cache_dir / f"{cache_key}.json" + + try: + # 确保目录存在 + self.cache_dir.mkdir(parents=True, exist_ok=True) + + # 序列化为 JSON,添加 version 字段 + data = result.model_dump() + data['version'] = self.CACHE_VERSION + + cache_file.write_text( + json.dumps(data, ensure_ascii=False, indent=2), + encoding='utf-8' + ) + + self.logger.debug(f"Cache saved: {cache_key}") + + except IOError as e: + self.logger.warning(f"Failed to save cache: {e}") diff --git a/skills/kb_workflow/srt/semantic_engine.py b/skills/kb_workflow/srt/semantic_engine.py new file mode 100644 index 0000000..6912d8c --- /dev/null +++ b/skills/kb_workflow/srt/semantic_engine.py @@ -0,0 +1,853 @@ +"""语义分段引擎 + +使用 LLM 实现智能视频字幕语义分段。 + +功能: +- 视频类型识别(知识类/故事类/访谈类/新闻类/vlog 等) +- 语义边界检测 +- 内容完整性保护 +- 主题标题生成 +- 可扩展的分段策略架构 +""" + +from __future__ import annotations + +import json +import logging +import re +from typing import List, Optional, Protocol + +import requests.exceptions +from pydantic import BaseModel, Field, field_validator, ValidationError + +logger = logging.getLogger(__name__) + + +# ============================================================================ +# AI Client Protocol +# ============================================================================ + +class AIClientProtocol(Protocol): + """AI 客户端协议(与 ASRCorrector 保持一致)""" + + def generate(self, prompt: str, max_tokens: int = 16000, + disable_reasoning: bool = False) -> str: + """生成文本""" + ... + + +# ============================================================================ +# Segmentation Strategy Pattern (Plan 13-06) +# ============================================================================ + +class SegmentationStrategy(Protocol): + """分段策略接口 + + 定义了分段策略的通用接口,支持未来扩展不同的分段策略。 + + Examples: + >>> strategy = UnifiedSegmentationStrategy() + >>> segments = strategy.segment(subtitle_segments, metadata) + + Note: + 遵守用户决策:Phase 13 实现统一策略,不区分视频类型。 + """ + + def segment( + self, + segments: List, + metadata: dict + ) -> List[Union[str, 'VideoSegment']]: + """对字幕分段进行语义分段 + + Args: + segments: 字幕分段列表(来自 parser.py 的 Segment 对象) + metadata: 视频元数据(title, duration 等) + + Returns: + 分段列表(可以是纯文本列表或 VideoSegment 对象列表) + """ + ... + + +class UnifiedSegmentationStrategy: + """统一分段策略 + + 适用于所有视频类型(知识类、故事类、访谈类等)。 + 视频类型仅用于 Prompt 上下文,不改变分段策略。 + + 遵守用户决策:无类型区分,使用统一 Prompt。 + + Attributes: + ai_client: AI 客户端(实现 AIClientProtocol) + """ + + def __init__( + self, + ai_client: Optional[AIClientProtocol] = None, + fallback_segmenter: Optional['SemanticSegmenter'] = None, + cache: Optional['SemanticCache'] = None + ): + """初始化统一分段策略 + + Args: + ai_client: AI 客户端实例,如果为 None 则尝试创建 SimpleAIClient + fallback_segmenter: 已弃用,保留仅为向后兼容 + cache: 缓存管理器,如果为 None 则不使用缓存 + """ + self.ai_client = ai_client + self.fallback_segmenter = fallback_segmenter + self.cache = cache + + # Lazy AI Client 初始化(与 ASRCorrector 相同模式) + if self.ai_client is None: + try: + from kb_workflow.deep_analyzer import SimpleAIClient + self.ai_client = SimpleAIClient() + if not self.ai_client.api_key: + logger.info("AI API key not configured") + self.ai_client = None + except Exception as e: + logger.warning(f"Failed to initialize AI client: {e}") + self.ai_client = None + + @staticmethod + def _is_recoverable_error(error: Exception) -> bool: + """判断错误是否可恢复 + + 可恢复错误:网络错误、超时、限流、服务器错误(500/502/503/504)、 + JSON 解析错误(JSONDecodeError, 非 ValidationError 的 ValueError) + 不可恢复错误:其他 HTTP 错误(4xx) + + 注意:Pydantic ValidationError(如标题超长)现在被视为可恢复错误, + 因为这是LLM生成内容的问题,应该允许重试。 + + Args: + error: 异常对象 + + Returns: + True 如果错误可恢复,False 否则 + """ + # 注意:ValidationError 现在被视为可恢复错误 + # 因为这可能是LLM偶然生成的内容问题,重试可能解决 + + # 网络层错误(可恢复) + if isinstance(error, requests.exceptions.ConnectionError): + return True + if isinstance(error, requests.exceptions.Timeout): + return True + + # JSON 解析错误(可恢复 - 可能是 LLM 输出格式问题) + if isinstance(error, (json.JSONDecodeError, ValueError)): + return True + + # HTTP 错误(根据状态码判断) + if isinstance(error, requests.exceptions.HTTPError): + status_code = error.response.status_code if hasattr(error, 'response') and error.response else None + if status_code in (429, 500, 502, 503, 504): + return True + # 其他 4xx 错误不可恢复 + return False + + # 其他错误不可恢复 + return False + + def segment( + self, + segments: List, + metadata: dict + ) -> List['VideoSegment']: + """对字幕分段进行语义分段 + + 使用统一的 LLM Prompt 进行语义分段,不区分视频类型。 + 视频类型仅用于 Prompt 上下文。 + + Args: + segments: 字幕分段列表(来自 parser.py 的 Segment 对象) + metadata: 视频元数据(title, duration 等) + + Returns: + VideoSegment 对象列表(包含标题和内容) + """ + # AI 不可用,直接报错 + if self.ai_client is None: + raise RuntimeError( + "AI客户端未配置,无法进行LLM语义分段。请检查AI_API_KEY环境变量。" + ) + + # 合并字幕文本 + content = " ".join(seg.text for seg in segments) + + # 检查缓存(Plan 14-05: 缓存集成) + if self.cache is not None: + cached_result = self.cache.get(content) + if cached_result is not None: + logger.info("Using cached segmentation result") + return cached_result.segments + + # 检查是否需要分块(Plan 14-04: 分块阈值 5000 字符) + if len(content) <= 5000: + # 短文本直接处理 + video_segments = self._segment_single_chunk(content, metadata, segments) + else: + # 长文本分块处理 + video_segments = self._segment_multiple_chunks(content, metadata, segments) + + # 保存到缓存(Plan 14-05: 缓存结果) + if self.cache is not None: + # 构建完整的 SegmentationResult + result = SegmentationResult( + video_type=self._infer_video_type(metadata), + segments=video_segments, + actual_segment_count=len(video_segments) + ) + self.cache.set(content, result) + logger.debug("Saved segmentation result to cache") + + return video_segments + + def _build_prompt(self, content: str, metadata: dict) -> str: + """构建语义分段 Prompt + + Args: + content: 字幕内容 + metadata: 视频元数据 + + Returns: + 构建好的 Prompt 字符串 + """ + # 推断视频类型 + video_type = self._infer_video_type(metadata) + title = metadata.get("title", "") or "" + + # 构建 Prompt + total_chars = len(content) + prompt = f"""你是一个专业的视频内容分析师。请将以下字幕内容按语义分段。 + +【视频信息】 +类型:{video_type} +标题:{title} +总字数:{total_chars}字 + +【字幕内容】 +{content} + +【分段要求】 +1. 建议将内容分为 5-8 个段落(可根据语义完整性灵活调整) +2. 每个段落约 1000-2000 字(为保持语义完整性可以突破此范围) +3. 在话题转换处创建新分段,不要混入不同话题的内容 +4. **重要**:保持句子完整性,分段边界应放在自然停顿处(句号。、问号?、感叹号!、省略号……等标点符号后) + - 基于语义停顿判断,不仅依赖标点符号 + - 保持内容的连贯性和可读性 +5. 保持论点完整性,不要在前提-结论结构中间截断 +6. 为主题/章节类型的分段生成简洁标题(最多30字),论点/观点类型分段不加标题 +7. **广告识别**:识别UP主的广告植入内容(包括但不限于"转转""京东""得物""淘宝""拼多多"等电商平台推广,以及其他明显的商业推广内容) + - 将广告内容单独分为一个段落 + - 广告段落的 title 必须设为"广告"或"推广" + - 不要将广告内容混入正常内容段落中 + +【输出格式】 +必须返回以下 JSON 格式(不要添加任何额外文本): +```json +{{ + "video_type": "{video_type}", + "segments": [ + {{ + "title": "分段标题(如果此分段不需要标题则设为 null)", + "content": "分段内容", + "start_index": 0, + "end_index": 123 + }} + ], + "actual_segment_count": 6 +}} +``` + +【注意事项】 +- 优先保证语义完整性,不要为了凑数而强行截断 +- 标题应简洁准确,如「机器学习概述」「梯度下降原理」 +- 如果某个分段无法生成合适的标题(如过渡性内容),将 title 设为 null +- **广告识别提示**:常见的广告植入特征包括: + * 突然话题转换到商品推荐 + * 提及"回收""卖""优惠""下单"等电商相关词汇 + * 提及具体品牌名称(如转转、京东、得物等) + * 说话风格明显变化(如口语化的推销语气) + * 内容与视频主题无关的商品推荐""" + return prompt + + def _infer_video_type(self, metadata: dict) -> str: + """从元数据推断视频类型 + + Args: + metadata: 视频元数据,包含 title, category, tags 等字段 + + Returns: + 推断出的视频类型,默认为"知识类" + + Examples: + >>> strategy = UnifiedSegmentationStrategy() + >>> strategy._infer_video_type({"title": "Python教程"}) + '知识类' + >>> strategy._infer_video_type({"category": "影视"}) + '故事类' + """ + if not metadata: + return DEFAULT_VIDEO_TYPE + + # 提取所有文本字段 + title = metadata.get("title", "") or "" + category = metadata.get("category", "") or "" + tags = metadata.get("tags", []) or [] + description = metadata.get("description", "") or "" + + # 合并所有文本用于匹配 + all_text = " ".join([title, category, description] + list(tags)) + + # 如果没有有效文本,返回默认类型 + if not all_text or all_text.isspace(): + return DEFAULT_VIDEO_TYPE + + # 按优先级匹配类型关键词 + for video_type, keywords in VIDEO_TYPE_KEYWORDS.items(): + for keyword in keywords: + if keyword in all_text: + logger.debug( + f"Detected video type '{video_type}' " + f"from keyword '{keyword}'" + ) + return video_type + + # 未匹配到任何类型,返回默认 + logger.debug("No specific video type detected, using default") + return DEFAULT_VIDEO_TYPE + + def _parse_result( + self, + llm_output: str, + fallback_segments: List + ) -> List[VideoSegment]: + """解析 LLM 输出并验证 + + Args: + llm_output: LLM 原始输出 + fallback_segments: 已弃用参数,保留仅为向后兼容 + + Returns: + VideoSegment 对象列表 + + Raises: + json.JSONDecodeError: JSON 解析失败 + ValueError: 无法提取 JSON + ValidationError: Pydantic 验证失败 + """ + # 提取 JSON + data = extract_json_from_llm_response(llm_output) + + # Pydantic 验证 + result = SegmentationResult(**data) + + logger.info( + f"LLM 分段成功: 类型={result.video_type}, " + f"分段数={result.actual_segment_count}" + ) + + return result.segments + + def _segment_single_chunk( + self, + content: str, + metadata: dict, + fallback_segments: List + ) -> List[VideoSegment]: + """处理单个文本块(不分块) + + Args: + content: 字幕内容 + metadata: 视频元数据 + fallback_segments: 降级时使用的原始分段 + + Returns: + VideoSegment 对象列表 + """ + # 构建 Prompt + prompt = self._build_prompt(content=content, metadata=metadata) + + # 调用 LLM,带重试逻辑(最多 2 次尝试) + max_attempts = 2 + last_error = None + last_llm_output = None + + for attempt in range(max_attempts): + try: + llm_output = self.ai_client.generate( + prompt, + max_tokens=8000, + disable_reasoning=True # 分段不需要思考模式 + ) + + # 解析和验证 + video_segments = self._parse_result( + llm_output, + fallback_segments=fallback_segments + ) + + logger.info(f"LLM semantic segmentation: {len(video_segments)} segments") + return video_segments + + except Exception as e: + is_recoverable = self._is_recoverable_error(e) + is_last_attempt = (attempt == max_attempts - 1) + + # 可恢复错误且不是最后一次尝试:重试 + if is_recoverable and not is_last_attempt: + logger.info( + f"LLM call failed (attempt {attempt + 1}/{max_attempts}): " + f"{type(e).__name__}: {e}, retrying..." + ) + continue + + # 最后一次尝试或不可恢复错误:直接抛出异常 + error_type = type(e).__name__ + + # 为 HTTPError 提取更详细的信息 + if isinstance(e, requests.exceptions.HTTPError) and hasattr(e, 'response') and e.response: + status_code = e.response.status_code + response_text = getattr(e.response, 'text', '') or '' + error_msg = f"HTTP {status_code}" + if response_text and isinstance(response_text, str): + error_msg += f" ({response_text[:100]})" + raise RuntimeError( + f"{error_type}: {error_msg}, LLM语义分段失败" + ) from e + else: + error_msg = str(e) if str(e) else error_type + raise RuntimeError( + f"{error_type}: {error_msg}, LLM语义分段失败" + ) from e + + def _segment_multiple_chunks( + self, + content: str, + metadata: dict, + fallback_segments: List + ) -> List[VideoSegment]: + """处理多个文本块(分块) + + Args: + content: 字幕内容 + metadata: 视频元数据 + fallback_segments: 降级时使用的原始分段 + + Returns: + VideoSegment 对象列表 + """ + logger.info(f"Content too long ({len(content)} chars), splitting into chunks") + + # 分块 + chunks = self._split_into_chunks(content, max_chunk_size=5000) + logger.info(f"Split into {len(chunks)} chunks") + + # 处理每个分块 + chunk_results = [] + for i, (chunk_text, offset) in enumerate(chunks, 1): + logger.info(f"Processing chunk {i}/{len(chunks)} (offset={offset}, length={len(chunk_text)})") + + # 构建该分块的 prompt + chunk_metadata = metadata.copy() + chunk_metadata['chunk_info'] = f"第 {i}/{len(chunks)} 块" + prompt = self._build_prompt(content=chunk_text, metadata=chunk_metadata) + + try: + # 调用 LLM + llm_output = self.ai_client.generate(prompt, max_tokens=8000, disable_reasoning=True) + segments = self._parse_result(llm_output, fallback_segments=fallback_segments) + chunk_results.append((segments, offset)) + logger.info(f"Chunk {i} segmented successfully: {len(segments)} segments") + except Exception as e: + # 分块处理失败,直接抛出异常 + raise RuntimeError( + f"分块 {i}/{len(chunks)} LLM语义分段失败: {type(e).__name__}: {e}" + ) from e + + # 合并结果 + return self._merge_segment_results(chunk_results) + + def _split_into_chunks(self, text: str, max_chunk_size: int = 5000) -> List[tuple[str, int]]: + """按句子边界分割文本为多个块 + + Args: + text: 待分割的文本 + max_chunk_size: 每块的最大字符数 + + Returns: + List of (chunk_text, offset) 元组,offset 是该块在原文中的起始位置 + """ + # 按句子分割 + sentences = [] + current = "" + for char in text: + current += char + if char in '。!?\n': + sentences.append(current) + current = "" + + # 添加最后一个不完整的句子 + if current: + sentences.append(current) + + # 分块 + chunks = [] + current_chunk = [] + current_length = 0 + current_offset = 0 + + for sentence in sentences: + sentence_len = len(sentence) + if current_length + sentence_len > max_chunk_size: + if current_chunk: + chunk_text = ''.join(current_chunk) + chunks.append((chunk_text, current_offset)) + current_offset += len(chunk_text) + current_chunk = [sentence] + current_length = sentence_len + else: + current_chunk.append(sentence) + current_length += sentence_len + + # 添加最后一个块 + if current_chunk: + chunk_text = ''.join(current_chunk) + chunks.append((chunk_text, current_offset)) + + return chunks + + def _merge_segment_results( + self, + chunk_results: List[tuple[List[VideoSegment], int]] + ) -> List[VideoSegment]: + """合并分块的分段结果 + + Args: + chunk_results: List of (segments, offset) 元组 + + Returns: + 合并后的分段列表,修正 start_index 和 end_index 为相对于原文的位置 + """ + all_segments = [] + + for segments, offset in chunk_results: + for seg in segments: + # 修正索引为相对于原文的位置 + corrected_seg = VideoSegment( + title=seg.title, + content=seg.content, + start_index=seg.start_index + offset, + end_index=seg.end_index + offset + ) + all_segments.append(corrected_seg) + + return all_segments + + def _fallback_chunk(self, chunk_text: str, offset: int) -> List[VideoSegment]: + """对单个分块使用规则分段(已弃用) + + 此方法已弃用,不再被调用。如被调用将抛出异常。 + + Args: + chunk_text: 分块文本 + offset: 该分块在原文中的起始位置 + + Returns: + VideoSegment 对象列表 + + Raises: + RuntimeError: 此方法已弃用 + """ + raise RuntimeError("_fallback_chunk 方法已弃用,LLM语义分段失败将直接抛出异常") + + # 转换为 VideoSegment,并设置正确的偏移量 + segments = [] + current_pos = offset + for para in paragraphs: + # 计算该分段在原文中的位置 + seg = VideoSegment( + title=None, + content=para, + start_index=current_pos, + end_index=current_pos + len(para) + ) + segments.append(seg) + current_pos += len(para) + + return segments + + +# ============================================================================ +# Pydantic Models +# ============================================================================ + + +def extract_json_from_llm_response(response: str) -> dict: + """从 LLM 响应中提取 JSON + + 处理以下情况: + - 纯 JSON + - 包裹在 ```json ``` 中的 JSON + - 前后包含额外说明文本的 JSON + + Args: + response: LLM 响应文本 + + Returns: + 解析后的 JSON 字典 + + Raises: + ValueError: 无法提取有效 JSON + """ + # 尝试直接解析 + try: + return json.loads(response.strip()) + except json.JSONDecodeError: + pass + + # 尝试提取 ```json ``` 代码块 + json_match = re.search(r'```json\s*(.*?)\s*```', response, re.DOTALL) + if json_match: + try: + return json.loads(json_match.group(1)) + except json.JSONDecodeError: + pass + + # 尝试提取任何 JSON 对象 + json_match = re.search(r'\{.*\}', response, re.DOTALL) + if json_match: + try: + return json.loads(json_match.group()) + except json.JSONDecodeError as e: + raise ValueError(f"无法从 LLM 响应中提取有效 JSON: {e}") + + raise ValueError("LLM 响应中未找到 JSON 内容") + +class VideoSegment(BaseModel): + """视频分段 + + Attributes: + title: 分段标题(可选) + content: 分段内容(必填) + start_index: 起始字幕索引 + end_index: 结束字幕索引 + """ + title: Optional[str] = Field( + None, + description="分段标题,简洁描述型(最多30字)" + ) + content: str = Field( + ..., + description="分段内容,合并后的字幕文本" + ) + start_index: int = Field( + ..., + ge=0, + description="在原文中的起始字符位置" + ) + end_index: int = Field( + ..., + ge=0, + description="在原文中的结束字符位置" + ) + + @field_validator('title') + @classmethod + def validate_title_length(cls, v: Optional[str]) -> Optional[str]: + """验证标题长度(最多30字)""" + if v is not None and len(v) > 30: + raise ValueError(f"标题长度不能超过30字,当前为{len(v)}字") + return v + + model_config = { + "json_schema_extra": { + "examples": [ + { + "title": "机器学习概述", + "content": "机器学习是人工智能的一个分支...", + "start_index": 1, + "end_index": 10 + } + ] + } + } + + +class SegmentationResult(BaseModel): + """分段结果 + + Attributes: + video_type: 视频类型(知识类/故事类/访谈类/新闻类/vlog 等) + segments: 分段列表 + actual_segment_count: 实际分段数量 + """ + video_type: str = Field( + ..., + description="识别出的视频类型" + ) + segments: List[VideoSegment] = Field( + default_factory=list, + description="分段列表" + ) + actual_segment_count: int = Field( + ..., + ge=0, + description="实际分段数量" + ) + + model_config = { + "json_schema_extra": { + "examples": [ + { + "video_type": "知识类", + "segments": [ + { + "title": "机器学习概述", + "content": "...", + "start_index": 1, + "end_index": 10 + } + ], + "actual_segment_count": 5 + } + ] + } + } + + +# ============================================================================ +# Video Type Detection +# ============================================================================ + +# 视频类型关键词映射 +VIDEO_TYPE_KEYWORDS = { + "知识类": [ + "教程", "课程", "教学", "入门", "基础", "进阶", "实战", + "编程", "开发", "技术", "学习", "教育", "培训", "讲座" + ], + "故事类": [ + "影视", "电影", "电视剧", "动漫", "动画", "小说", "故事", + "剧情", "短片", "纪录片" + ], + "访谈类": [ + "访谈", "对话", "采访", "专访", "聊天", "脱口秀", "播客" + ], + "新闻类": [ + "新闻", "报道", "资讯", "时事", "热点", "快讯" + ], + "vlog": [ + "vlog", "日常", "生活", "旅行", "美食", "探店", + "分享", "体验" + ] +} + +# 默认视频类型 +DEFAULT_VIDEO_TYPE = "知识类" + + +# ============================================================================ +# Semantic Segmentation Engine +# ============================================================================ + +class SemanticSegmentationEngine: + """语义分段引擎(使用策略架构) + + 使用策略模式实现可扩展的分段架构。 + + Attributes: + strategy: 分段策略(实现 SegmentationStrategy 接口) + + Examples: + >>> # 使用默认统一策略 + >>> engine = SemanticSegmentationEngine() + >>> paragraphs = engine.segment(segments, metadata) + + >>> # 使用自定义策略(未来扩展) + >>> custom_strategy = KnowledgeTypeStrategy() + >>> engine = SemanticSegmentationEngine(strategy=custom_strategy) + >>> paragraphs = engine.segment(segments, metadata) + + Note: + Plan 13-06: 实现可扩展策略架构,Phase 13 使用统一策略。 + """ + + def __init__( + self, + strategy: Optional[SegmentationStrategy] = None, + fallback_segmenter: Optional['SemanticSegmenter'] = None, + cache: Optional['SemanticCache'] = None + ): + """初始化语义分段引擎 + + Args: + strategy: 分段策略实例,如果为 None 则使用统一策略 + fallback_segmenter: 降级时使用的规则分段器(已弃用,保留兼容性) + cache: 缓存管理器 + """ + # 默认使用统一策略 + if strategy is None: + self.strategy = UnifiedSegmentationStrategy( + fallback_segmenter=fallback_segmenter, + cache=cache + ) + else: + self.strategy = strategy + + logger.debug( + f"SemanticSegmentationEngine initialized with strategy: " + f"{self.strategy.__class__.__name__}" + ) + + def _infer_video_type(self, metadata: dict) -> str: + """从元数据推断视频类型(代理到策略) + + Args: + metadata: 视频元数据 + + Returns: + 推断出的视频类型 + """ + # 如果策略有 _infer_video_type 方法,使用它 + if hasattr(self.strategy, '_infer_video_type'): + return self.strategy._infer_video_type(metadata) + # 否则返回默认类型 + return DEFAULT_VIDEO_TYPE + + def _build_prompt(self, content: str, metadata: dict) -> str: + """构建 Prompt(代理到策略) + + Args: + content: 字幕内容 + metadata: 视频元数据 + + Returns: + 构建好的 Prompt + """ + # 如果策略有 _build_prompt 方法,使用它 + if hasattr(self.strategy, '_build_prompt'): + return self.strategy._build_prompt(content, metadata) + # 否则返回基本 prompt + return f"Content: {content}\nMetadata: {metadata}" + + def segment( + self, + segments: List, + metadata: dict + ) -> List['VideoSegment']: + """对字幕分段进行语义分段 + + 使用当前配置的策略进行分段。 + + Args: + segments: 字幕分段列表(来自 parser.py 的 Segment 对象) + metadata: 视频元数据(title, duration 等) + + Returns: + VideoSegment 对象列表(包含标题和内容) + """ + return self.strategy.segment(segments, metadata)