@zooique/memora 2.0.3 → 3.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1037 -0
- package/README.en.md +305 -272
- package/README.md +303 -260
- package/config.example.json +43 -0
- package/dist/agent/agent.d.ts +376 -408
- package/dist/agent/agent.d.ts.map +1 -1
- package/dist/agent/agent.js +1166 -926
- package/dist/agent/agent.js.map +1 -1
- package/dist/agent/assembler.d.ts +105 -43
- package/dist/agent/assembler.d.ts.map +1 -1
- package/dist/agent/assembler.js +543 -75
- package/dist/agent/assembler.js.map +1 -1
- package/dist/agent/budget.d.ts +131 -0
- package/dist/agent/budget.d.ts.map +1 -0
- package/dist/agent/budget.js +128 -0
- package/dist/agent/budget.js.map +1 -0
- package/dist/agent/builtinToolHandlers.d.ts +225 -38
- package/dist/agent/builtinToolHandlers.d.ts.map +1 -1
- package/dist/agent/builtinToolHandlers.js +748 -132
- package/dist/agent/builtinToolHandlers.js.map +1 -1
- package/dist/agent/builtinTools.d.ts +198 -7
- package/dist/agent/builtinTools.d.ts.map +1 -1
- package/dist/agent/builtinTools.js +646 -14
- package/dist/agent/builtinTools.js.map +1 -1
- package/dist/agent/compaction.d.ts +93 -0
- package/dist/agent/compaction.d.ts.map +1 -0
- package/dist/agent/compaction.js +192 -0
- package/dist/agent/compaction.js.map +1 -0
- package/dist/agent/constants.d.ts +137 -20
- package/dist/agent/constants.d.ts.map +1 -1
- package/dist/agent/constants.js +152 -20
- package/dist/agent/constants.js.map +1 -1
- package/dist/agent/contextManager.d.ts +119 -77
- package/dist/agent/contextManager.d.ts.map +1 -1
- package/dist/agent/contextManager.js +192 -135
- package/dist/agent/contextManager.js.map +1 -1
- package/dist/agent/contextPreparer.d.ts +78 -0
- package/dist/agent/contextPreparer.d.ts.map +1 -0
- package/dist/agent/contextPreparer.js +128 -0
- package/dist/agent/contextPreparer.js.map +1 -0
- package/dist/agent/duplicateInterceptor.d.ts +67 -0
- package/dist/agent/duplicateInterceptor.d.ts.map +1 -0
- package/dist/agent/duplicateInterceptor.js +82 -0
- package/dist/agent/duplicateInterceptor.js.map +1 -0
- package/dist/agent/guardRail.d.ts +166 -0
- package/dist/agent/guardRail.d.ts.map +1 -0
- package/dist/agent/guardRail.js +333 -0
- package/dist/agent/guardRail.js.map +1 -0
- package/dist/agent/loop.d.ts +716 -295
- package/dist/agent/loop.d.ts.map +1 -1
- package/dist/agent/loop.js +2178 -664
- package/dist/agent/loop.js.map +1 -1
- package/dist/agent/managers/archiveCoordinator.d.ts +14 -171
- package/dist/agent/managers/archiveCoordinator.d.ts.map +1 -1
- package/dist/agent/managers/archiveCoordinator.js +19 -287
- package/dist/agent/managers/archiveCoordinator.js.map +1 -1
- package/dist/agent/managers/chatLockManager.d.ts +20 -88
- package/dist/agent/managers/chatLockManager.d.ts.map +1 -1
- package/dist/agent/managers/chatLockManager.js +31 -103
- package/dist/agent/managers/chatLockManager.js.map +1 -1
- package/dist/agent/managers/dedupManager.d.ts +31 -115
- package/dist/agent/managers/dedupManager.d.ts.map +1 -1
- package/dist/agent/managers/dedupManager.js +48 -136
- package/dist/agent/managers/dedupManager.js.map +1 -1
- package/dist/agent/managers/goalConsistencyChecker.d.ts +42 -0
- package/dist/agent/managers/goalConsistencyChecker.d.ts.map +1 -0
- package/dist/agent/managers/goalConsistencyChecker.js +178 -0
- package/dist/agent/managers/goalConsistencyChecker.js.map +1 -0
- package/dist/agent/managers/llmCaller.d.ts +124 -0
- package/dist/agent/managers/llmCaller.d.ts.map +1 -0
- package/dist/agent/managers/llmCaller.js +417 -0
- package/dist/agent/managers/llmCaller.js.map +1 -0
- package/dist/agent/managers/llmJudgeHelper.d.ts +8 -25
- package/dist/agent/managers/llmJudgeHelper.d.ts.map +1 -1
- package/dist/agent/managers/llmJudgeHelper.js +7 -24
- package/dist/agent/managers/llmJudgeHelper.js.map +1 -1
- package/dist/agent/managers/loopMetrics.d.ts +58 -0
- package/dist/agent/managers/loopMetrics.d.ts.map +1 -0
- package/dist/agent/managers/loopMetrics.js +68 -0
- package/dist/agent/managers/loopMetrics.js.map +1 -0
- package/dist/agent/managers/memoryAdvisor.d.ts +27 -120
- package/dist/agent/managers/memoryAdvisor.d.ts.map +1 -1
- package/dist/agent/managers/memoryAdvisor.js +85 -207
- package/dist/agent/managers/memoryAdvisor.js.map +1 -1
- package/dist/agent/managers/memoryGovernance.d.ts +10 -42
- package/dist/agent/managers/memoryGovernance.d.ts.map +1 -1
- package/dist/agent/managers/memoryGovernance.js +19 -36
- package/dist/agent/managers/memoryGovernance.js.map +1 -1
- package/dist/agent/managers/memoryInspector.d.ts +59 -268
- package/dist/agent/managers/memoryInspector.d.ts.map +1 -1
- package/dist/agent/managers/memoryInspector.js +91 -442
- package/dist/agent/managers/memoryInspector.js.map +1 -1
- package/dist/agent/managers/roundSummaryGenerator.d.ts +56 -0
- package/dist/agent/managers/roundSummaryGenerator.d.ts.map +1 -0
- package/dist/agent/managers/roundSummaryGenerator.js +201 -0
- package/dist/agent/managers/roundSummaryGenerator.js.map +1 -0
- package/dist/agent/managers/sessionArchiver.d.ts +19 -68
- package/dist/agent/managers/sessionArchiver.d.ts.map +1 -1
- package/dist/agent/managers/sessionArchiver.js +76 -147
- package/dist/agent/managers/sessionArchiver.js.map +1 -1
- package/dist/agent/managers/sessionManager.d.ts +286 -57
- package/dist/agent/managers/sessionManager.d.ts.map +1 -1
- package/dist/agent/managers/sessionManager.js +846 -85
- package/dist/agent/managers/sessionManager.js.map +1 -1
- package/dist/agent/managers/sessionNamer.d.ts +35 -0
- package/dist/agent/managers/sessionNamer.d.ts.map +1 -0
- package/dist/agent/managers/sessionNamer.js +104 -0
- package/dist/agent/managers/sessionNamer.js.map +1 -0
- package/dist/agent/managers/streamAccumulator.d.ts +8 -33
- package/dist/agent/managers/streamAccumulator.d.ts.map +1 -1
- package/dist/agent/managers/streamAccumulator.js +4 -29
- package/dist/agent/managers/streamAccumulator.js.map +1 -1
- package/dist/agent/managers/textPolishManager.d.ts +8 -44
- package/dist/agent/managers/textPolishManager.d.ts.map +1 -1
- package/dist/agent/managers/textPolishManager.js +9 -41
- package/dist/agent/managers/textPolishManager.js.map +1 -1
- package/dist/agent/managers/toolCallHelpers.d.ts +105 -0
- package/dist/agent/managers/toolCallHelpers.d.ts.map +1 -0
- package/dist/agent/managers/toolCallHelpers.js +161 -0
- package/dist/agent/managers/toolCallHelpers.js.map +1 -0
- package/dist/agent/managers/workProjection.d.ts +55 -100
- package/dist/agent/managers/workProjection.d.ts.map +1 -1
- package/dist/agent/managers/workProjection.js +164 -268
- package/dist/agent/managers/workProjection.js.map +1 -1
- package/dist/agent/messageHistory.d.ts +134 -84
- package/dist/agent/messageHistory.d.ts.map +1 -1
- package/dist/agent/messageHistory.js +419 -133
- package/dist/agent/messageHistory.js.map +1 -1
- package/dist/agent/needsPlanning.d.ts +28 -0
- package/dist/agent/needsPlanning.d.ts.map +1 -0
- package/dist/agent/needsPlanning.js +68 -0
- package/dist/agent/needsPlanning.js.map +1 -0
- package/dist/agent/seed/index.d.ts +11 -0
- package/dist/agent/seed/index.d.ts.map +1 -0
- package/dist/agent/seed/index.js +10 -0
- package/dist/agent/seed/index.js.map +1 -0
- package/dist/agent/seed/orchestrator.d.ts +83 -0
- package/dist/agent/seed/orchestrator.d.ts.map +1 -0
- package/dist/agent/seed/orchestrator.js +260 -0
- package/dist/agent/seed/orchestrator.js.map +1 -0
- package/dist/agent/seed/prepare.d.ts +49 -0
- package/dist/agent/seed/prepare.d.ts.map +1 -0
- package/dist/agent/seed/prepare.js +107 -0
- package/dist/agent/seed/prepare.js.map +1 -0
- package/dist/agent/seed/types.d.ts +115 -0
- package/dist/agent/seed/types.d.ts.map +1 -0
- package/dist/agent/seed/types.js +15 -0
- package/dist/agent/seed/types.js.map +1 -0
- package/dist/agent/sessionStateMachine.d.ts +78 -0
- package/dist/agent/sessionStateMachine.d.ts.map +1 -0
- package/dist/agent/sessionStateMachine.js +182 -0
- package/dist/agent/sessionStateMachine.js.map +1 -0
- package/dist/agent/taskTableRenderer.d.ts +51 -0
- package/dist/agent/taskTableRenderer.d.ts.map +1 -0
- package/dist/agent/taskTableRenderer.js +115 -0
- package/dist/agent/taskTableRenderer.js.map +1 -0
- package/dist/agent/toolExecutor.d.ts +236 -10
- package/dist/agent/toolExecutor.d.ts.map +1 -1
- package/dist/agent/toolExecutor.js +932 -21
- package/dist/agent/toolExecutor.js.map +1 -1
- package/dist/agent/toolLedger.d.ts +120 -0
- package/dist/agent/toolLedger.d.ts.map +1 -0
- package/dist/agent/toolLedger.js +149 -0
- package/dist/agent/toolLedger.js.map +1 -0
- package/dist/agent/toolResultCache.d.ts +134 -0
- package/dist/agent/toolResultCache.d.ts.map +1 -0
- package/dist/agent/toolResultCache.js +243 -0
- package/dist/agent/toolResultCache.js.map +1 -0
- package/dist/agent/toolResultOffload.d.ts +59 -0
- package/dist/agent/toolResultOffload.d.ts.map +1 -0
- package/dist/agent/toolResultOffload.js +70 -0
- package/dist/agent/toolResultOffload.js.map +1 -0
- package/dist/agent/toolRunner.d.ts +59 -0
- package/dist/agent/toolRunner.d.ts.map +1 -0
- package/dist/agent/toolRunner.js +147 -0
- package/dist/agent/toolRunner.js.map +1 -0
- package/dist/agent/tracer.d.ts +99 -107
- package/dist/agent/tracer.d.ts.map +1 -1
- package/dist/agent/tracer.js +24 -69
- package/dist/agent/tracer.js.map +1 -1
- package/dist/agent/types.d.ts +510 -169
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/agent/types.js +2 -51
- package/dist/agent/types.js.map +1 -1
- package/dist/code-exec/codeExecutionProvider.d.ts +16 -0
- package/dist/code-exec/codeExecutionProvider.d.ts.map +1 -0
- package/dist/code-exec/codeExecutionProvider.js +57 -0
- package/dist/code-exec/codeExecutionProvider.js.map +1 -0
- package/dist/code-exec/types.d.ts +37 -0
- package/dist/code-exec/types.d.ts.map +1 -0
- package/dist/code-exec/types.js +12 -0
- package/dist/code-exec/types.js.map +1 -0
- package/dist/config/expandEnvVars.d.ts +22 -0
- package/dist/config/expandEnvVars.d.ts.map +1 -0
- package/dist/config/expandEnvVars.js +38 -0
- package/dist/config/expandEnvVars.js.map +1 -0
- package/dist/config/loader.d.ts +27 -98
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +110 -223
- package/dist/config/loader.js.map +1 -1
- package/dist/index.d.ts +67 -77
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +90 -69
- package/dist/index.js.map +1 -1
- package/dist/llm/abortSignal.d.ts +2 -3
- package/dist/llm/abortSignal.d.ts.map +1 -1
- package/dist/llm/abortSignal.js +2 -3
- package/dist/llm/abortSignal.js.map +1 -1
- package/dist/llm/factory.d.ts +22 -32
- package/dist/llm/factory.d.ts.map +1 -1
- package/dist/llm/factory.js +29 -46
- package/dist/llm/factory.js.map +1 -1
- package/dist/llm/openaiCompatible.d.ts +25 -40
- package/dist/llm/openaiCompatible.d.ts.map +1 -1
- package/dist/llm/openaiCompatible.js +179 -120
- package/dist/llm/openaiCompatible.js.map +1 -1
- package/dist/llm/provider.d.ts +29 -42
- package/dist/llm/provider.d.ts.map +1 -1
- package/dist/llm/provider.js +11 -10
- package/dist/llm/provider.js.map +1 -1
- package/dist/llm/types.d.ts +54 -11
- package/dist/llm/types.d.ts.map +1 -1
- package/dist/llm/types.js +0 -5
- package/dist/llm/types.js.map +1 -1
- package/dist/logging/logger.d.ts +8 -31
- package/dist/logging/logger.d.ts.map +1 -1
- package/dist/logging/logger.js +28 -215
- package/dist/logging/logger.js.map +1 -1
- package/dist/logging/loggerInterface.d.ts +9 -8
- package/dist/logging/loggerInterface.d.ts.map +1 -1
- package/dist/memory/gcService.d.ts +164 -0
- package/dist/memory/gcService.d.ts.map +1 -0
- package/dist/memory/gcService.js +215 -0
- package/dist/memory/gcService.js.map +1 -0
- package/dist/memory/governance.d.ts +11 -44
- package/dist/memory/governance.d.ts.map +1 -1
- package/dist/memory/governance.js +11 -64
- package/dist/memory/governance.js.map +1 -1
- package/dist/memory/inMemoryRoundStore.d.ts +124 -0
- package/dist/memory/inMemoryRoundStore.d.ts.map +1 -0
- package/dist/memory/inMemoryRoundStore.js +216 -0
- package/dist/memory/inMemoryRoundStore.js.map +1 -0
- package/dist/memory/inMemorySessionStore.d.ts +92 -0
- package/dist/memory/inMemorySessionStore.d.ts.map +1 -0
- package/dist/memory/inMemorySessionStore.js +219 -0
- package/dist/memory/inMemorySessionStore.js.map +1 -0
- package/dist/memory/inMemorySessionViewLoader.d.ts +89 -0
- package/dist/memory/inMemorySessionViewLoader.d.ts.map +1 -0
- package/dist/memory/inMemorySessionViewLoader.js +183 -0
- package/dist/memory/inMemorySessionViewLoader.js.map +1 -0
- package/dist/memory/inMemoryStorage.d.ts +25 -175
- package/dist/memory/inMemoryStorage.d.ts.map +1 -1
- package/dist/memory/inMemoryStorage.js +32 -221
- package/dist/memory/inMemoryStorage.js.map +1 -1
- package/dist/memory/keywordsTouch.d.ts +20 -0
- package/dist/memory/keywordsTouch.d.ts.map +1 -0
- package/dist/memory/keywordsTouch.js +25 -0
- package/dist/memory/keywordsTouch.js.map +1 -0
- package/dist/memory/lockManager.d.ts +2 -2
- package/dist/memory/lockManager.d.ts.map +1 -1
- package/dist/memory/lockManager.js +6 -8
- package/dist/memory/lockManager.js.map +1 -1
- package/dist/memory/projectManager.d.ts +30 -129
- package/dist/memory/projectManager.d.ts.map +1 -1
- package/dist/memory/projectManager.js +39 -189
- package/dist/memory/projectManager.js.map +1 -1
- package/dist/memory/projectRegistry.d.ts +14 -62
- package/dist/memory/projectRegistry.d.ts.map +1 -1
- package/dist/memory/projectRegistry.js +27 -111
- package/dist/memory/projectRegistry.js.map +1 -1
- package/dist/memory/roundStore.d.ts +629 -0
- package/dist/memory/roundStore.d.ts.map +1 -0
- package/dist/memory/roundStore.js +116 -0
- package/dist/memory/roundStore.js.map +1 -0
- package/dist/memory/sessionStore.d.ts +70 -61
- package/dist/memory/sessionStore.d.ts.map +1 -1
- package/dist/memory/sessionStore.js +23 -1
- package/dist/memory/sessionStore.js.map +1 -1
- package/dist/memory/sessionViewLoader.d.ts +141 -0
- package/dist/memory/sessionViewLoader.d.ts.map +1 -0
- package/dist/memory/sessionViewLoader.js +65 -0
- package/dist/memory/sessionViewLoader.js.map +1 -0
- package/dist/memory/sourceValidation.d.ts +10 -12
- package/dist/memory/sourceValidation.d.ts.map +1 -1
- package/dist/memory/sourceValidation.js +16 -32
- package/dist/memory/sourceValidation.js.map +1 -1
- package/dist/memory/storageInterface.d.ts +44 -150
- package/dist/memory/storageInterface.d.ts.map +1 -1
- package/dist/memory/types.d.ts +65 -164
- package/dist/memory/types.d.ts.map +1 -1
- package/dist/memory/types.js +81 -83
- package/dist/memory/types.js.map +1 -1
- package/dist/project-search/projectSearchProvider.d.ts +29 -0
- package/dist/project-search/projectSearchProvider.d.ts.map +1 -0
- package/dist/project-search/projectSearchProvider.js +57 -0
- package/dist/project-search/projectSearchProvider.js.map +1 -0
- package/dist/project-search/terms.d.ts +14 -0
- package/dist/project-search/terms.d.ts.map +1 -0
- package/dist/project-search/terms.js +68 -0
- package/dist/project-search/terms.js.map +1 -0
- package/dist/project-search/types.d.ts +139 -0
- package/dist/project-search/types.d.ts.map +1 -0
- package/dist/project-search/types.js +8 -0
- package/dist/project-search/types.js.map +1 -0
- package/dist/role-pack/capabilityMap.d.ts +28 -0
- package/dist/role-pack/capabilityMap.d.ts.map +1 -0
- package/dist/role-pack/capabilityMap.js +56 -0
- package/dist/role-pack/capabilityMap.js.map +1 -0
- package/dist/role-pack/constants.d.ts +21 -0
- package/dist/role-pack/constants.d.ts.map +1 -0
- package/dist/role-pack/constants.js +21 -0
- package/dist/role-pack/constants.js.map +1 -0
- package/dist/role-pack/rolePackManager.d.ts +269 -0
- package/dist/role-pack/rolePackManager.d.ts.map +1 -0
- package/dist/role-pack/rolePackManager.js +1082 -0
- package/dist/role-pack/rolePackManager.js.map +1 -0
- package/dist/role-pack/strategyKeys.d.ts +100 -0
- package/dist/role-pack/strategyKeys.d.ts.map +1 -0
- package/dist/role-pack/strategyKeys.js +184 -0
- package/dist/role-pack/strategyKeys.js.map +1 -0
- package/dist/role-pack/strategyResolver.d.ts +109 -0
- package/dist/role-pack/strategyResolver.d.ts.map +1 -0
- package/dist/role-pack/strategyResolver.js +304 -0
- package/dist/role-pack/strategyResolver.js.map +1 -0
- package/dist/role-pack/types.d.ts +237 -0
- package/dist/role-pack/types.d.ts.map +1 -0
- package/dist/role-pack/types.js +8 -0
- package/dist/role-pack/types.js.map +1 -0
- package/dist/role-pack/validator.d.ts +38 -0
- package/dist/role-pack/validator.d.ts.map +1 -0
- package/dist/role-pack/validator.js +436 -0
- package/dist/role-pack/validator.js.map +1 -0
- package/dist/security/pathGuard.d.ts +69 -72
- package/dist/security/pathGuard.d.ts.map +1 -1
- package/dist/security/pathGuard.js +151 -131
- package/dist/security/pathGuard.js.map +1 -1
- package/dist/skill/skillLayer3.d.ts +91 -0
- package/dist/skill/skillLayer3.d.ts.map +1 -0
- package/dist/skill/skillLayer3.js +104 -0
- package/dist/skill/skillLayer3.js.map +1 -0
- package/dist/skill/skillManager.d.ts +136 -19
- package/dist/skill/skillManager.d.ts.map +1 -1
- package/dist/skill/skillManager.js +312 -61
- package/dist/skill/skillManager.js.map +1 -1
- package/dist/skill/skillScriptRunner.d.ts +97 -0
- package/dist/skill/skillScriptRunner.d.ts.map +1 -0
- package/dist/skill/skillScriptRunner.js +271 -0
- package/dist/skill/skillScriptRunner.js.map +1 -0
- package/dist/skill/types.d.ts +73 -16
- package/dist/skill/types.d.ts.map +1 -1
- package/dist/skill/types.js +5 -1
- package/dist/skill/types.js.map +1 -1
- package/dist/utils/array.d.ts +5 -6
- package/dist/utils/array.d.ts.map +1 -1
- package/dist/utils/array.js +6 -6
- package/dist/utils/array.js.map +1 -1
- package/dist/utils/atomicWrite.d.ts +8 -0
- package/dist/utils/atomicWrite.d.ts.map +1 -0
- package/dist/utils/atomicWrite.js +31 -0
- package/dist/utils/atomicWrite.js.map +1 -0
- package/dist/utils/backgroundTask.d.ts +38 -0
- package/dist/utils/backgroundTask.d.ts.map +1 -0
- package/dist/utils/backgroundTask.js +117 -0
- package/dist/utils/backgroundTask.js.map +1 -0
- package/dist/utils/configResourceManager.d.ts +40 -72
- package/dist/utils/configResourceManager.d.ts.map +1 -1
- package/dist/utils/configResourceManager.js +78 -76
- package/dist/utils/configResourceManager.js.map +1 -1
- package/dist/utils/errors.d.ts +44 -69
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/errors.js +54 -71
- package/dist/utils/errors.js.map +1 -1
- package/dist/utils/eventEmitter.d.ts +104 -103
- package/dist/utils/eventEmitter.d.ts.map +1 -1
- package/dist/utils/eventEmitter.js +37 -45
- package/dist/utils/eventEmitter.js.map +1 -1
- package/dist/utils/fileSafe.d.ts +20 -0
- package/dist/utils/fileSafe.d.ts.map +1 -0
- package/dist/utils/fileSafe.js +56 -0
- package/dist/utils/fileSafe.js.map +1 -0
- package/dist/utils/frontmatter.d.ts +2 -3
- package/dist/utils/frontmatter.d.ts.map +1 -1
- package/dist/utils/frontmatter.js +2 -3
- package/dist/utils/frontmatter.js.map +1 -1
- package/dist/utils/hash.d.ts +12 -0
- package/dist/utils/hash.d.ts.map +1 -0
- package/dist/utils/hash.js +27 -0
- package/dist/utils/hash.js.map +1 -0
- package/dist/utils/http.d.ts +17 -0
- package/dist/utils/http.d.ts.map +1 -0
- package/dist/utils/http.js +29 -0
- package/dist/utils/http.js.map +1 -0
- package/dist/utils/json.d.ts +1 -1
- package/dist/utils/json.js +1 -1
- package/dist/utils/math.d.ts +25 -3
- package/dist/utils/math.d.ts.map +1 -1
- package/dist/utils/math.js +32 -16
- package/dist/utils/math.js.map +1 -1
- package/dist/utils/objects.d.ts +2 -3
- package/dist/utils/objects.d.ts.map +1 -1
- package/dist/utils/objects.js +2 -3
- package/dist/utils/objects.js.map +1 -1
- package/dist/utils/recallDefaults.d.ts +16 -0
- package/dist/utils/recallDefaults.d.ts.map +1 -0
- package/dist/utils/recallDefaults.js +16 -0
- package/dist/utils/recallDefaults.js.map +1 -0
- package/dist/utils/safeTimer.d.ts +8 -36
- package/dist/utils/safeTimer.d.ts.map +1 -1
- package/dist/utils/safeTimer.js +9 -37
- package/dist/utils/safeTimer.js.map +1 -1
- package/dist/utils/scanner.d.ts +97 -17
- package/dist/utils/scanner.d.ts.map +1 -1
- package/dist/utils/scanner.js +269 -47
- package/dist/utils/scanner.js.map +1 -1
- package/dist/utils/segmenter.d.ts +20 -19
- package/dist/utils/segmenter.d.ts.map +1 -1
- package/dist/utils/segmenter.js +230 -97
- package/dist/utils/segmenter.js.map +1 -1
- package/dist/utils/strings.d.ts +15 -32
- package/dist/utils/strings.d.ts.map +1 -1
- package/dist/utils/strings.js +25 -44
- package/dist/utils/strings.js.map +1 -1
- package/dist/utils/time.d.ts +37 -0
- package/dist/utils/time.d.ts.map +1 -1
- package/dist/utils/time.js +56 -0
- package/dist/utils/time.js.map +1 -1
- package/dist/utils/toError.d.ts +13 -1
- package/dist/utils/toError.d.ts.map +1 -1
- package/dist/utils/toError.js +18 -1
- package/dist/utils/toError.js.map +1 -1
- package/dist/web-fetch/fetchWebFetchProvider.d.ts +14 -0
- package/dist/web-fetch/fetchWebFetchProvider.d.ts.map +1 -0
- package/dist/web-fetch/fetchWebFetchProvider.js +69 -0
- package/dist/web-fetch/fetchWebFetchProvider.js.map +1 -0
- package/dist/web-fetch/types.d.ts +30 -0
- package/dist/web-fetch/types.d.ts.map +1 -0
- package/dist/web-fetch/types.js +7 -0
- package/dist/web-fetch/types.js.map +1 -0
- package/dist/web-fetch/webFetchProvider.d.ts +10 -0
- package/dist/web-fetch/webFetchProvider.d.ts.map +1 -0
- package/dist/web-fetch/webFetchProvider.js +28 -0
- package/dist/web-fetch/webFetchProvider.js.map +1 -0
- package/dist/web-search/fetchWebSearchProvider.d.ts +27 -0
- package/dist/web-search/fetchWebSearchProvider.d.ts.map +1 -0
- package/dist/web-search/fetchWebSearchProvider.js +199 -0
- package/dist/web-search/fetchWebSearchProvider.js.map +1 -0
- package/dist/web-search/types.d.ts +46 -0
- package/dist/web-search/types.d.ts.map +1 -0
- package/dist/web-search/types.js +2 -0
- package/dist/{persona → web-search}/types.js.map +1 -1
- package/dist/web-search/webSearchProvider.d.ts +10 -0
- package/dist/web-search/webSearchProvider.d.ts.map +1 -0
- package/dist/web-search/webSearchProvider.js +30 -0
- package/dist/web-search/webSearchProvider.js.map +1 -0
- package/docs/architecture/role-pack-authoring-guide.md +243 -0
- package/docs/architecture/role-pack-spec.md +767 -0
- package/docs/memora-api-reference.md +416 -476
- package/docs/memora-/346/216/245/345/205/245/346/214/207/345/215/227.md +841 -806
- package/docs/role-pack-/345/274/200/346/224/276/351/224/256/346/214/207/345/215/227.md +148 -0
- package/package.json +105 -100
- package/role-packs/README.md +41 -0
- package/role-packs/memora/345/212/251/346/211/213/manifest.json +12 -0
- package/role-packs/memora/345/212/251/346/211/213/persona.md +12 -0
- package/role-packs/memora/345/212/251/346/211/213/rules.md +4 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/manifest.json +44 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/persona.md +46 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/rules.md +15 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/character-sheet.md +34 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/core-extractor.md +37 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/craft-review.md +69 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/dialogue-craft.md +45 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/emotion-wave.md +46 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/empathy-craft.md +79 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/foreshadow.md +29 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/hotspot-mapping.md +121 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/idea-lever.md +42 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/logline-craft.md +47 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/longform-guard.md +64 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/need-finder.md +40 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/outline-expand.md +46 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/pacing-hook.md +34 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/polish-method.md +113 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/pov-discipline.md +79 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/project-init/SKILL.md +112 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/project-init/scripts/init-novel-project.mjs +441 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/relationship-web.md +47 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/scene-craft.md +46 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/story-bible.md +60 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/story-structure.md +36 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/style-weaver.md +109 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/three-layer-check.md +27 -0
- package/role-packs//345/205/261/351/270/243/345/260/217/350/257/264/345/256/266/skills/world-builder.md +41 -0
- package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/manifest.json +48 -0
- package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/persona.md +73 -0
- package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/rules.md +19 -0
- package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/skills/api-doc-writer.md +40 -0
- package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/skills/doc-planner.md +42 -0
- package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/skills/nutrient-search.md +28 -0
- package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/skills/seed-finder.md +28 -0
- package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/skills/ssot-audit.md +34 -0
- package/role-packs//347/231/275/350/257/235/346/226/271/346/241/210/350/256/276/350/256/241/345/270/210/skills/style-guide.md +40 -0
- package/dist/agent/guardrail.d.ts +0 -49
- package/dist/agent/guardrail.d.ts.map +0 -1
- package/dist/agent/guardrail.js +0 -59
- package/dist/agent/guardrail.js.map +0 -1
- package/dist/agent/managers/autoConfigRefiner.d.ts +0 -39
- package/dist/agent/managers/autoConfigRefiner.d.ts.map +0 -1
- package/dist/agent/managers/autoConfigRefiner.js +0 -146
- package/dist/agent/managers/autoConfigRefiner.js.map +0 -1
- package/dist/agent/managers/configManager.d.ts +0 -209
- package/dist/agent/managers/configManager.d.ts.map +0 -1
- package/dist/agent/managers/configManager.js +0 -331
- package/dist/agent/managers/configManager.js.map +0 -1
- package/dist/agent/managers/insightExtractor.d.ts +0 -139
- package/dist/agent/managers/insightExtractor.d.ts.map +0 -1
- package/dist/agent/managers/insightExtractor.js +0 -401
- package/dist/agent/managers/insightExtractor.js.map +0 -1
- package/dist/agent/managers/memoryDecayScheduler.d.ts +0 -239
- package/dist/agent/managers/memoryDecayScheduler.d.ts.map +0 -1
- package/dist/agent/managers/memoryDecayScheduler.js +0 -413
- package/dist/agent/managers/memoryDecayScheduler.js.map +0 -1
- package/dist/agent/managers/relationBuilder.d.ts +0 -131
- package/dist/agent/managers/relationBuilder.d.ts.map +0 -1
- package/dist/agent/managers/relationBuilder.js +0 -192
- package/dist/agent/managers/relationBuilder.js.map +0 -1
- package/dist/agent/personaMatcher.d.ts +0 -29
- package/dist/agent/personaMatcher.d.ts.map +0 -1
- package/dist/agent/personaMatcher.js +0 -60
- package/dist/agent/personaMatcher.js.map +0 -1
- package/dist/agent/userFactExtractor.d.ts +0 -25
- package/dist/agent/userFactExtractor.d.ts.map +0 -1
- package/dist/agent/userFactExtractor.js +0 -88
- package/dist/agent/userFactExtractor.js.map +0 -1
- package/dist/eval/evalRunner.d.ts +0 -94
- package/dist/eval/evalRunner.d.ts.map +0 -1
- package/dist/eval/evalRunner.js +0 -141
- package/dist/eval/evalRunner.js.map +0 -1
- package/dist/eval/evalTypes.d.ts +0 -148
- package/dist/eval/evalTypes.d.ts.map +0 -1
- package/dist/eval/evalTypes.js +0 -118
- package/dist/eval/evalTypes.js.map +0 -1
- package/dist/eval/scenarios.d.ts +0 -33
- package/dist/eval/scenarios.d.ts.map +0 -1
- package/dist/eval/scenarios.js +0 -109
- package/dist/eval/scenarios.js.map +0 -1
- package/dist/llm/embedding.d.ts +0 -79
- package/dist/llm/embedding.d.ts.map +0 -1
- package/dist/llm/embedding.js +0 -184
- package/dist/llm/embedding.js.map +0 -1
- package/dist/memory/hybridMerge.d.ts +0 -50
- package/dist/memory/hybridMerge.d.ts.map +0 -1
- package/dist/memory/hybridMerge.js +0 -51
- package/dist/memory/hybridMerge.js.map +0 -1
- package/dist/memory/inMemoryRelationStore.d.ts +0 -58
- package/dist/memory/inMemoryRelationStore.d.ts.map +0 -1
- package/dist/memory/inMemoryRelationStore.js +0 -80
- package/dist/memory/inMemoryRelationStore.js.map +0 -1
- package/dist/memory/loader.d.ts +0 -51
- package/dist/memory/loader.d.ts.map +0 -1
- package/dist/memory/loader.js +0 -100
- package/dist/memory/loader.js.map +0 -1
- package/dist/memory/recall.d.ts +0 -82
- package/dist/memory/recall.d.ts.map +0 -1
- package/dist/memory/recall.js +0 -157
- package/dist/memory/recall.js.map +0 -1
- package/dist/memory/relationStore.d.ts +0 -95
- package/dist/memory/relationStore.d.ts.map +0 -1
- package/dist/memory/relationStore.js +0 -2
- package/dist/memory/relationStore.js.map +0 -1
- package/dist/memory/store.d.ts +0 -71
- package/dist/memory/store.d.ts.map +0 -1
- package/dist/memory/store.js +0 -199
- package/dist/memory/store.js.map +0 -1
- package/dist/memory/userProfile.d.ts +0 -180
- package/dist/memory/userProfile.d.ts.map +0 -1
- package/dist/memory/userProfile.js +0 -381
- package/dist/memory/userProfile.js.map +0 -1
- package/dist/memory/vectorStore.d.ts +0 -179
- package/dist/memory/vectorStore.d.ts.map +0 -1
- package/dist/memory/vectorStore.js +0 -284
- package/dist/memory/vectorStore.js.map +0 -1
- package/dist/persona/personaManager.d.ts +0 -109
- package/dist/persona/personaManager.d.ts.map +0 -1
- package/dist/persona/personaManager.js +0 -315
- package/dist/persona/personaManager.js.map +0 -1
- package/dist/persona/types.d.ts +0 -32
- package/dist/persona/types.d.ts.map +0 -1
- package/dist/persona/types.js +0 -5
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LLM 调用族 — 模型触碰面(重试 / 任务类型路由 / 流式分类)
|
|
3
|
+
*
|
|
4
|
+
* 本族的 loop 私有 state 触点**全是「可注入的协作者」**(metrics / strategy / contextManager /
|
|
5
|
+
* tracer / opts),没有一个是「loop 自己的可变状态」,故经构造注入取值器(getter)取用即可,
|
|
6
|
+
* 属「换位置仍自治」;而工具编排本体(`executeToolCalls`,多处写 loop 状态)不在此族。
|
|
7
|
+
*
|
|
8
|
+
* ## 两条不可回退的纪律
|
|
9
|
+
*
|
|
10
|
+
* 1. **必须传 getter 而非快照**:`strategy` / `provider` 均为运行时可热切换
|
|
11
|
+
* (`setStrategy` 浅合并新对象、`setProvider` 改 `opts.provider`),且
|
|
12
|
+
* `strategy.errorHandling` 在**重试循环体内**被读 3 次——传快照会在重试中途读到旧值。
|
|
13
|
+
* 2. **`routeCache` 由 loop 持有并跨族共享**:它在**每轮 turn 入口**(`processUserInput`)
|
|
14
|
+
* 被 `clear()`,而 turn 内单轮问答查表即中——若改为本类实例字段且调用方逐次新建实例,
|
|
15
|
+
* **每轮都重算路由**(跨轮缓存失效),而缓存的语义是「单轮内复用,跨轮重置」。故 Map 归
|
|
16
|
+
* loop,本类只经读写回调操作它。
|
|
17
|
+
*/
|
|
18
|
+
import type { LlmProvider, Message, ChatOptions } from '../../llm/provider.js';
|
|
19
|
+
import type { ProviderRouter, TaskType, LlmChunk } from '../../llm/types.js';
|
|
20
|
+
import type { AgentChunk, TextChunkStage } from '../../agent/types.js';
|
|
21
|
+
import type { ITracer } from '../../agent/tracer.js';
|
|
22
|
+
import type { LoopMetrics } from '../../agent/managers/loopMetrics.js';
|
|
23
|
+
/** 上下文估算能力窄面(`ContextManager.estimateTokens`) */
|
|
24
|
+
export interface TokenEstimator {
|
|
25
|
+
estimateTokens(messages: readonly Message[]): number;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* 多模型路由所需的 loop 侧能力子集。
|
|
29
|
+
* 全部为**取值器 / 回调**而非值快照——保证热切换(`setProvider` / `setStrategy`)即时生效。
|
|
30
|
+
*/
|
|
31
|
+
export interface LlmCallerDeps {
|
|
32
|
+
/** 运行时指标容器(loop 持有,引用共享;搬走不影响计数正确性) */
|
|
33
|
+
readonly metrics: LoopMetrics;
|
|
34
|
+
/** 当前 L2 策略。**必须是 getter**:`errorHandling` 在重试循环内被读 3 次 */
|
|
35
|
+
readonly getStrategy: () => LlmCallerStrategyView;
|
|
36
|
+
/** 当前 Provider。**必须是 getter**:`setProvider` 为热切换 */
|
|
37
|
+
readonly getProvider: () => LlmProvider;
|
|
38
|
+
/** 任务类型路由回调;未注入时走固定 Provider */
|
|
39
|
+
readonly getProviderRouter: () => ProviderRouter | undefined;
|
|
40
|
+
/** 路由缓存读(Map 归 loop 持有,见文件头纪律 2) */
|
|
41
|
+
readonly getCachedProvider: (taskType: TaskType) => LlmProvider | undefined;
|
|
42
|
+
/** 路由缓存写 */
|
|
43
|
+
readonly setCachedProvider: (taskType: TaskType, provider: LlmProvider) => void;
|
|
44
|
+
/** 上下文管理器(token 估算) */
|
|
45
|
+
readonly contextManager: TokenEstimator;
|
|
46
|
+
/** 追踪器 */
|
|
47
|
+
readonly tracer: ITracer;
|
|
48
|
+
/** 本闭环是否已执行过工具。**必须是 getter**:同一 turn 内会被 set true */
|
|
49
|
+
readonly hasToolExecutedThisTurn: () => boolean;
|
|
50
|
+
}
|
|
51
|
+
/** `LlmCaller` 实际读取的策略字段(避免整体依赖 `L2RuntimeStrategy` 造成接口面膨胀) */
|
|
52
|
+
export interface LlmCallerStrategyView {
|
|
53
|
+
/** 出错处理:'stop' 立即抛出 / 'degrade' 降级为已生成文本 / 其余走重试 */
|
|
54
|
+
readonly errorHandling: string;
|
|
55
|
+
/** 'manual' → 强制低推理深度(provider 支持时) */
|
|
56
|
+
readonly multiStepReasoning: string;
|
|
57
|
+
/** 'fixed' → 跳过路由,固定用默认 Provider */
|
|
58
|
+
readonly providerRouting: string;
|
|
59
|
+
}
|
|
60
|
+
/** LLM 调用结果(loop 侧消费者:`_callAndRoute` / `handleToolCalls` / `handleAskUser` /
|
|
61
|
+
* `handleTextResponse`,均在本族之外,故为导出类型) */
|
|
62
|
+
export interface LlmCallResult {
|
|
63
|
+
fullContent: string;
|
|
64
|
+
toolCalls: Message['toolCalls'];
|
|
65
|
+
aborted: boolean;
|
|
66
|
+
/**
|
|
67
|
+
* 文本通道剥离缓冲:工具轮叙述文本(本闭环已执行过工具后的整条消息文本,
|
|
68
|
+
* 或收到 toolCalls 信号后后续/同条的 content)累积于此。结果路由据此发射
|
|
69
|
+
* narrate 事件,不进回答正文;纯文本闭环(无工具史)正文保持按流式实时 yield。
|
|
70
|
+
*/
|
|
71
|
+
pendingNarrate: string;
|
|
72
|
+
/**
|
|
73
|
+
* 本轮正文是否曾逐字流式 yield(工具闭环内延迟分类的消息未 yield → false)。
|
|
74
|
+
* 结果路由据此在纯文本/中断路径补发整段 text,避免缓冲文本对 UI 不可见。
|
|
75
|
+
*/
|
|
76
|
+
textStreamed: boolean;
|
|
77
|
+
/**
|
|
78
|
+
* 回抽:本闭环内逐字流式 yield 进正文区的**原文**(stage='answer')。
|
|
79
|
+
*
|
|
80
|
+
* 首轮(无工具史)消息级分类前无法预判工具轮 → 文本已实时流式进正文;一旦收到 toolCalls,
|
|
81
|
+
* 结果路由据此发 `narrate.withdrawn` 告知消费者「该段其实属过程叙述,先撤回再渲染」。
|
|
82
|
+
* 纯文本闭环(正文即最终交付)与工具闭环内延迟分类路径(未 yield)恒为空串。
|
|
83
|
+
*/
|
|
84
|
+
streamedText: string;
|
|
85
|
+
/**
|
|
86
|
+
* 末次 chat 尝试回传的 finish_reason(诊断分型证据)。
|
|
87
|
+
* `'length'` = 输出预算截断(思考/生成吃满上限),loop 据此把空响应判「截断型」;
|
|
88
|
+
* 中转不回传则 undefined = 按「瞬态型」降级(降级不劣化,维持现状文案)。
|
|
89
|
+
*/
|
|
90
|
+
finishReason?: LlmChunk['finishReason'];
|
|
91
|
+
/** 末次 chat 尝试的 thinking 字符数(reasoning_content 增量累计;无思考模型恒 0。重试重置,取末次口径) */
|
|
92
|
+
thinkingChars: number;
|
|
93
|
+
/** 收场前的 chat 尝试总数(1 = 首试即收场;空响应重试累加。重试属同一步内的多次尝试,非多个 step) */
|
|
94
|
+
attempts: number;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* 确定当前回合任务类型(多模型路由):含代码块→code;长文本(>500字符)→reasoning;其余→simple
|
|
98
|
+
*
|
|
99
|
+
* 纯函数(零 state 触点),独立导出便于单测与复用。
|
|
100
|
+
*/
|
|
101
|
+
export declare function determineTaskType(messages: readonly Message[]): TaskType;
|
|
102
|
+
/** LLM 调用执行器:多模型路由 + 指数退避重试 + 流式文本通道分类 */
|
|
103
|
+
export declare class LlmCaller {
|
|
104
|
+
private readonly deps;
|
|
105
|
+
constructor(deps: LlmCallerDeps);
|
|
106
|
+
/**
|
|
107
|
+
* 多模型路由:按任务类型选 Provider;单轮内缓存同一 taskType 结果,避免重复路由计算。
|
|
108
|
+
* 三分支收敛:strategy='fixed' → 默认 Provider;有 providerRouter → 路由 + 缓存;否则 fallback 默认。
|
|
109
|
+
*/
|
|
110
|
+
resolveProvider(safeMessages: readonly Message[]): LlmProvider;
|
|
111
|
+
/**
|
|
112
|
+
* 调用 LLM(带指数退避重试,仅在流式输出前失败时重试;流式已开始则直接上抛,因用户已看到部分结果)。
|
|
113
|
+
* 经 providerRouter 按任务类型路由到对应 Provider。
|
|
114
|
+
*/
|
|
115
|
+
callWithRetry(safeMessages: readonly Message[], chatOpts: ChatOptions, signal: AbortSignal | undefined, iteration: number,
|
|
116
|
+
/** 流式文本阶段标识(默认正常交付 'answer';自审查应答由调用方传 'self_review') */
|
|
117
|
+
stage?: TextChunkStage): AsyncGenerator<AgentChunk, LlmCallResult, unknown>;
|
|
118
|
+
/**
|
|
119
|
+
* 重试延迟 + abort 支持:发射 retry chunk,等待指数退避延迟(支持中途 abort);
|
|
120
|
+
* 调用方在延迟后自行检查 signal.aborted 决定是否退出重试循环
|
|
121
|
+
*/
|
|
122
|
+
waitForRetryWithAbort(attempt: number, lastError: Error | null, signal: AbortSignal | undefined): AsyncGenerator<AgentChunk, void, unknown>;
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=llmCaller.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llmCaller.d.ts","sourceRoot":"","sources":["../../../src/agent/managers/llmCaller.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,417 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LLM 调用族 — 模型触碰面(重试 / 任务类型路由 / 流式分类)
|
|
3
|
+
*
|
|
4
|
+
* 本族的 loop 私有 state 触点**全是「可注入的协作者」**(metrics / strategy / contextManager /
|
|
5
|
+
* tracer / opts),没有一个是「loop 自己的可变状态」,故经构造注入取值器(getter)取用即可,
|
|
6
|
+
* 属「换位置仍自治」;而工具编排本体(`executeToolCalls`,多处写 loop 状态)不在此族。
|
|
7
|
+
*
|
|
8
|
+
* ## 两条不可回退的纪律
|
|
9
|
+
*
|
|
10
|
+
* 1. **必须传 getter 而非快照**:`strategy` / `provider` 均为运行时可热切换
|
|
11
|
+
* (`setStrategy` 浅合并新对象、`setProvider` 改 `opts.provider`),且
|
|
12
|
+
* `strategy.errorHandling` 在**重试循环体内**被读 3 次——传快照会在重试中途读到旧值。
|
|
13
|
+
* 2. **`routeCache` 由 loop 持有并跨族共享**:它在**每轮 turn 入口**(`processUserInput`)
|
|
14
|
+
* 被 `clear()`,而 turn 内单轮问答查表即中——若改为本类实例字段且调用方逐次新建实例,
|
|
15
|
+
* **每轮都重算路由**(跨轮缓存失效),而缓存的语义是「单轮内复用,跨轮重置」。故 Map 归
|
|
16
|
+
* loop,本类只经读写回调操作它。
|
|
17
|
+
*/
|
|
18
|
+
import { NOOP_TRACER, TRACE_SPANS } from '../../agent/tracer.js';
|
|
19
|
+
import { LOOP_CONSTANTS } from '../../agent/constants.js';
|
|
20
|
+
import { filterCallableToolCalls, auditToolCallPairing } from '../../agent/managers/toolCallHelpers.js';
|
|
21
|
+
import { isAbortError } from '../../utils/errors.js';
|
|
22
|
+
import { toError } from '../../utils/toError.js';
|
|
23
|
+
import { sha256Fingerprint } from '../../utils/hash.js';
|
|
24
|
+
import { safeSetTimeout } from '../../utils/safeTimer.js';
|
|
25
|
+
import { logger } from '../../logging/logger.js';
|
|
26
|
+
/**
|
|
27
|
+
* 截断型空响应的换策略纠正提示(一次性注入消息尾):模型面向的协议级指令,
|
|
28
|
+
* 与 degrade 降级文案同为内联中文常量——非 UI 文案,不进 UIMessages(宿主可覆盖面不膨胀)。
|
|
29
|
+
*/
|
|
30
|
+
const TRUNCATION_RECOVERY_HINT = '上一次回复因思考耗尽输出预算被截断,请直接给出结论或工具调用';
|
|
31
|
+
/**
|
|
32
|
+
* 确定当前回合任务类型(多模型路由):含代码块→code;长文本(>500字符)→reasoning;其余→simple
|
|
33
|
+
*
|
|
34
|
+
* 纯函数(零 state 触点),独立导出便于单测与复用。
|
|
35
|
+
*/
|
|
36
|
+
export function determineTaskType(messages) {
|
|
37
|
+
// 从后向前取最近 N 条 user 消息作为检测窗口(多轮对话中真正含代码的请求可能不在最后一条)
|
|
38
|
+
const recentUserContents = [];
|
|
39
|
+
for (let i = messages.length - 1; i >= 0 && recentUserContents.length < LOOP_CONSTANTS.TASK_TYPE_WINDOW; i--) {
|
|
40
|
+
if (messages[i]?.role === 'user') {
|
|
41
|
+
recentUserContents.push(messages[i].content ?? '');
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
// 代码相关关键词检测:窗口内任一条含代码块标记 → code(避免含代码请求被后续追问稀释误判)
|
|
45
|
+
if (recentUserContents.some((c) => /```(?:ts|js|py|go|rust|java|css|html|sql)\b/i.test(c))) {
|
|
46
|
+
return 'code';
|
|
47
|
+
}
|
|
48
|
+
// 长文本复杂推理判定(以最近一条 user 消息反映当前轮意图;阈值归入 LOOP_CONSTANTS)
|
|
49
|
+
const lastContent = recentUserContents[0] ?? '';
|
|
50
|
+
if (lastContent.length > LOOP_CONSTANTS.REASONING_INPUT_CHARS) {
|
|
51
|
+
return 'reasoning';
|
|
52
|
+
}
|
|
53
|
+
return 'simple';
|
|
54
|
+
}
|
|
55
|
+
/** LLM 调用执行器:多模型路由 + 指数退避重试 + 流式文本通道分类 */
|
|
56
|
+
export class LlmCaller {
|
|
57
|
+
deps;
|
|
58
|
+
constructor(deps) {
|
|
59
|
+
this.deps = deps;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* 多模型路由:按任务类型选 Provider;单轮内缓存同一 taskType 结果,避免重复路由计算。
|
|
63
|
+
* 三分支收敛:strategy='fixed' → 默认 Provider;有 providerRouter → 路由 + 缓存;否则 fallback 默认。
|
|
64
|
+
*/
|
|
65
|
+
resolveProvider(safeMessages) {
|
|
66
|
+
if (this.deps.getStrategy().providerRouting === 'fixed') {
|
|
67
|
+
return this.deps.getProvider();
|
|
68
|
+
}
|
|
69
|
+
const router = this.deps.getProviderRouter();
|
|
70
|
+
if (router) {
|
|
71
|
+
const taskType = determineTaskType(safeMessages);
|
|
72
|
+
const cached = this.deps.getCachedProvider(taskType);
|
|
73
|
+
if (cached)
|
|
74
|
+
return cached;
|
|
75
|
+
const routed = router(taskType);
|
|
76
|
+
this.deps.setCachedProvider(taskType, routed);
|
|
77
|
+
return routed;
|
|
78
|
+
}
|
|
79
|
+
return this.deps.getProvider();
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* 调用 LLM(带指数退避重试,仅在流式输出前失败时重试;流式已开始则直接上抛,因用户已看到部分结果)。
|
|
83
|
+
* 经 providerRouter 按任务类型路由到对应 Provider。
|
|
84
|
+
*/
|
|
85
|
+
async *callWithRetry(safeMessages, chatOpts, signal, iteration,
|
|
86
|
+
/** 流式文本阶段标识(默认正常交付 'answer';自审查应答由调用方传 'self_review') */
|
|
87
|
+
stage = 'answer') {
|
|
88
|
+
const { metrics, contextManager, tracer } = this.deps;
|
|
89
|
+
let fullContent = '';
|
|
90
|
+
let toolCalls = undefined;
|
|
91
|
+
let streamStarted = false;
|
|
92
|
+
let lastError = null;
|
|
93
|
+
let aborted = false;
|
|
94
|
+
// 文本通道剥离:是否已进入「工具调用轮」(收到 toolCalls 信号后后续 text 均属叙述)
|
|
95
|
+
let isToolCallTurn = false;
|
|
96
|
+
// 叙述累积:工具轮 text(同条 content + 信号后的后续 content),route 时作为 narrate 发射
|
|
97
|
+
let pendingNarrate = '';
|
|
98
|
+
/** 本轮是否曾逐字流式 yield 过正文(纯文本闭环逐字;工具闭环延迟分类则全程 false) */
|
|
99
|
+
let textStreamed = false;
|
|
100
|
+
/** 回抽:已流式 yield 进正文的原文(供工具轮撤回;见 LlmCallResult.streamedText) */
|
|
101
|
+
let streamedText = '';
|
|
102
|
+
/** 末次 chat 尝试的 finish_reason(诊断分型证据:'length' = 输出预算截断) */
|
|
103
|
+
let finishReason = undefined;
|
|
104
|
+
/** 末次 chat 尝试的 thinking 字符数(诊断证据:截断型常伴随思考吃满输出预算) */
|
|
105
|
+
let thinkingChars = 0;
|
|
106
|
+
/** 实际进行过的 chat 尝试计数(attempt 为 for 作用域变量、出循环不可见;此计数器全程可读) */
|
|
107
|
+
let attemptsMade = 0;
|
|
108
|
+
/** 截断型换策略标记(粘性):空响应且 finish_reason='length' 后置真,后续尝试全程降推理深度 + 携带纠正提示 */
|
|
109
|
+
let truncatedRetry = false;
|
|
110
|
+
// 消息级延迟分类:本闭环已执行过工具(toolExecutedThisTurn)后,
|
|
111
|
+
// 后续 LLM 消息的文本整段缓冲到消息结束再分类——工具轮 → narrate(含信号前全文),
|
|
112
|
+
// 纯文本 → 由路由补发 text。单轮问答/首轮(无工具史)保持逐字流式,不受影响。
|
|
113
|
+
const deferTextToMessageEnd = this.deps.hasToolExecutedThisTurn();
|
|
114
|
+
// 将 AbortSignal 与超时传入 provider,确保 fetch 与 SSE 流读取能被及时中断(用户取消/超时)
|
|
115
|
+
const effectiveOpts = {
|
|
116
|
+
...chatOpts,
|
|
117
|
+
signal,
|
|
118
|
+
timeoutMs: LOOP_CONSTANTS.LLM_TIMEOUT_MS,
|
|
119
|
+
};
|
|
120
|
+
// multiStepReasoning='manual' → 强制低推理深度(若 Provider 支持)
|
|
121
|
+
if (this.deps.getStrategy().multiStepReasoning === 'manual') {
|
|
122
|
+
effectiveOpts.reasoning_effort = 'low';
|
|
123
|
+
}
|
|
124
|
+
// 多模型路由:按任务类型选 Provider(resolveProvider,含缓存)
|
|
125
|
+
const effectiveProvider = this.resolveProvider(safeMessages);
|
|
126
|
+
// LLM 调用 Span(涵盖重试循环)
|
|
127
|
+
const llmSpan = tracer.startSpan(TRACE_SPANS.LLM_CALL, {
|
|
128
|
+
model: effectiveProvider.name,
|
|
129
|
+
messageCount: safeMessages.length,
|
|
130
|
+
iteration,
|
|
131
|
+
});
|
|
132
|
+
llmSpan.setAttribute('inputTokens', contextManager.estimateTokens(safeMessages));
|
|
133
|
+
// 记录"模型看到了什么"的系统提示指纹(只记 hash 不记内容,可观测性职责;仅真实 Tracer 时计算避免热路径开销)
|
|
134
|
+
if (tracer !== NOOP_TRACER) {
|
|
135
|
+
const systemPrompt = safeMessages
|
|
136
|
+
.filter((m) => m.role === 'system')
|
|
137
|
+
.map((m) => m.content)
|
|
138
|
+
.join('\n');
|
|
139
|
+
llmSpan.setAttribute('systemPromptHash', sha256Fingerprint(systemPrompt));
|
|
140
|
+
}
|
|
141
|
+
// ─── 发送边界守卫 ───
|
|
142
|
+
// 坏批次(assistant.tool_calls 未成形)绝不上线路:在发往前拦截、fail-fast。
|
|
143
|
+
// 健康态散点已按构造保证成形,故此处**健康态恒零命中**;
|
|
144
|
+
// 命中 = 某散点回归(内核 bug 信号),须响亮暴露而非静默吞/重试(坏批次重试无益且掩盖根因),
|
|
145
|
+
// 故抛**非临时错误**,经 loop(processUserInput rethrow)外显到宿主出错面,止损本轮 token。
|
|
146
|
+
const pairingViolations = auditToolCallPairing(safeMessages);
|
|
147
|
+
if (pairingViolations.length > 0) {
|
|
148
|
+
metrics.llmPairingGuardFires++;
|
|
149
|
+
const cause = pairingViolations.map((v) => `${v.kind}:${v.toolCallId}`).join(', ');
|
|
150
|
+
logger.error({ violations: pairingViolations, messageCount: safeMessages.length }, `发送边界守卫拒绝:tool_call 批次成形违规(${cause}),将不发送本请求(= 构造期散点回归)`);
|
|
151
|
+
llmSpan.recordException(new Error(`发送边界守卫拒绝:${cause}`));
|
|
152
|
+
llmSpan.end();
|
|
153
|
+
throw new Error(`发送边界守卫拒绝:tool_call 批次成形违规(${cause})`);
|
|
154
|
+
}
|
|
155
|
+
for (let attempt = 0; attempt <= LOOP_CONSTANTS.MAX_LLM_RETRIES; attempt++) {
|
|
156
|
+
// 每次重试前检查是否已被取消(用户点击停止)
|
|
157
|
+
if (signal?.aborted) {
|
|
158
|
+
aborted = true;
|
|
159
|
+
break;
|
|
160
|
+
}
|
|
161
|
+
if (attempt > 0) {
|
|
162
|
+
yield* this.waitForRetryWithAbort(attempt, lastError, signal);
|
|
163
|
+
// 重试后重置流式状态,避免沿用上次的累积输出
|
|
164
|
+
fullContent = '';
|
|
165
|
+
toolCalls = undefined;
|
|
166
|
+
pendingNarrate = '';
|
|
167
|
+
streamedText = '';
|
|
168
|
+
isToolCallTurn = false;
|
|
169
|
+
// 诊断证据同口径重置:finishReason/thinkingChars 取末次尝试值(与结果路由读到的收场同源)
|
|
170
|
+
finishReason = undefined;
|
|
171
|
+
thinkingChars = 0;
|
|
172
|
+
if (signal?.aborted) {
|
|
173
|
+
aborted = true;
|
|
174
|
+
break;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
try {
|
|
178
|
+
attemptsMade++;
|
|
179
|
+
metrics.llmCallCount++;
|
|
180
|
+
metrics.totalInputTokens += contextManager.estimateTokens(safeMessages);
|
|
181
|
+
// 截断型换策略(双轨,方案 T2):①降推理深度已在下方 empty 分支随 truncatedRetry 置入
|
|
182
|
+
// effectiveOpts.reasoning_effort='low'(复用 multiStepReasoning='manual' 既有转达通道,
|
|
183
|
+
// provider 支持才生效);②纠正提示注入消息尾(提示保底——reasoning_effort 被中转无视
|
|
184
|
+
// 也不劣化,模型仍收到「直接给结论或工具调用」的指令)。**每请求恰一条**:requestMessages
|
|
185
|
+
// 每次从 safeMessages 重建、提示不进历史,多轮重试恒 1 条(一次性 = 不堆叠,非只注首次)。
|
|
186
|
+
const requestMessages = [...safeMessages]; // 浅拷贝为可变数组,避免类型断言(readonly → 可变)
|
|
187
|
+
if (truncatedRetry) {
|
|
188
|
+
requestMessages.push({ role: 'system', content: TRUNCATION_RECOVERY_HINT });
|
|
189
|
+
}
|
|
190
|
+
for await (const chunk of effectiveProvider.chat(requestMessages, effectiveOpts)) {
|
|
191
|
+
streamStarted = true;
|
|
192
|
+
if (signal?.aborted) {
|
|
193
|
+
aborted = true;
|
|
194
|
+
break;
|
|
195
|
+
}
|
|
196
|
+
// 捕获实际 API token 用量(Provider 支持 usage 时)
|
|
197
|
+
if (chunk.usage) {
|
|
198
|
+
metrics.actualInputTokens += chunk.usage.inputTokens;
|
|
199
|
+
metrics.actualOutputTokens += chunk.usage.outputTokens;
|
|
200
|
+
llmSpan.setAttribute('actualInputTokens', chunk.usage.inputTokens);
|
|
201
|
+
llmSpan.setAttribute('actualOutputTokens', chunk.usage.outputTokens);
|
|
202
|
+
}
|
|
203
|
+
// 诊断证据采集(末次口径):finish_reason 随尾 chunk 回传(末条覆盖为准),
|
|
204
|
+
// thinking 字符数按增量累计——空响应分型(截断/瞬态)的裁决依据
|
|
205
|
+
if (chunk.finishReason)
|
|
206
|
+
finishReason = chunk.finishReason;
|
|
207
|
+
if (chunk.thought)
|
|
208
|
+
thinkingChars += chunk.thought.length;
|
|
209
|
+
if (chunk.content) {
|
|
210
|
+
fullContent += chunk.content;
|
|
211
|
+
// 文本通道剥离:① 工具闭环内消息整段缓冲(deferTextToMessageEnd);
|
|
212
|
+
// ② 工具轮(已见 toolCalls 信号或同条携带)的文本归叙述缓冲,不进回答正文。
|
|
213
|
+
// ③ 纯文本闭环保持流式实时 yield(stage 供宿主自审查分段)。
|
|
214
|
+
if (deferTextToMessageEnd || isToolCallTurn || chunk.toolCalls?.length) {
|
|
215
|
+
pendingNarrate += chunk.content;
|
|
216
|
+
}
|
|
217
|
+
else {
|
|
218
|
+
textStreamed = true;
|
|
219
|
+
streamedText += chunk.content;
|
|
220
|
+
yield { type: 'text', content: chunk.content, stage };
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
// 模型思考内容(thought):实时透传展示,**永不拼入 fullContent**(CoT 防护,双轨隔离——
|
|
224
|
+
// 正文轨与记忆轨不碰 thought,仅展示轨消费)。增量片段,宿主自行累积。命名用 thought
|
|
225
|
+
// 避开多模型路由任务 TaskType='reasoning' 与 ProcessEvent 既有相位 'thinking'。
|
|
226
|
+
if (chunk.thought) {
|
|
227
|
+
yield { type: 'thought', content: chunk.thought };
|
|
228
|
+
}
|
|
229
|
+
// 工具意图预告:tool_call name 成形即透传,宿主提前渲染「准备中」工具行。
|
|
230
|
+
// 瞬态展示轨:不落 ProcessEvent(宿主侧据此不 emitEvent);id 可能为空串(provider 未发)
|
|
231
|
+
if (chunk.partialToolCall) {
|
|
232
|
+
yield {
|
|
233
|
+
type: 'tool_pending',
|
|
234
|
+
toolCallId: chunk.partialToolCall.id || undefined,
|
|
235
|
+
name: chunk.partialToolCall.name,
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
if (chunk.toolCalls) {
|
|
239
|
+
// 只收可发出的调用:模型偶发的「只有 id、无 function 载荷」条目若写入历史,下一次
|
|
240
|
+
// 请求必被服务端以 400 拒绝。丢弃在**写入历史之前**,故 assistant.tool_calls 与随后
|
|
241
|
+
// 逐项回填的 tool 消息仍同源同长(配对不变量不破);整批皆非法时 toolCalls 保持
|
|
242
|
+
// undefined,自然落回既有纯文本路径(无需新分支)。
|
|
243
|
+
const callable = filterCallableToolCalls(chunk.toolCalls);
|
|
244
|
+
if (callable.length > 0) {
|
|
245
|
+
toolCalls = [...(toolCalls ?? []), ...callable];
|
|
246
|
+
}
|
|
247
|
+
// 文本分流按**原始** chunk 置位:叙述归类不因丢弃而改变
|
|
248
|
+
isToolCallTurn = true;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
// 成功时累计输出 token
|
|
252
|
+
metrics.totalOutputTokens += contextManager.estimateTokens([
|
|
253
|
+
{ role: 'assistant', content: fullContent },
|
|
254
|
+
]);
|
|
255
|
+
// 空响应重试(真机空响应一次定生死,不入重试):
|
|
256
|
+
// 若 for await 正常结束后无论内容是否空都 `break` 跳出,空响应(200 但 0 token 的
|
|
257
|
+
// provider 瞬态抽风)直接落到 loop 的英文兜底文案,用户被迫重发——与「网络错误会重试」
|
|
258
|
+
// 不对称。此处在未耗尽重试次数时把「全空结果」视为一次失败,`continue` 走既有 retry
|
|
259
|
+
// 退避(attempt++ → waitForRetryWithAbort + 重置流式状态),给瞬态一次纠偏机会。
|
|
260
|
+
// 耗尽仍空则照常 break,交 loop 兜底。不把「模型拒绝/静默空」错当合法产出反复重试。
|
|
261
|
+
const isEmptyResponse = !aborted &&
|
|
262
|
+
!fullContent &&
|
|
263
|
+
!pendingNarrate &&
|
|
264
|
+
!streamedText &&
|
|
265
|
+
(!toolCalls || toolCalls.length === 0);
|
|
266
|
+
if (isEmptyResponse && attempt < LOOP_CONSTANTS.MAX_LLM_RETRIES) {
|
|
267
|
+
lastError = new Error('LLM 返回空响应');
|
|
268
|
+
// 截断型判定(末次 finish_reason):'length' = 思考/生成吃满输出预算——同参重试必再炸
|
|
269
|
+
// (真机 3 连空实证),换策略重试(双轨见上方 requestMessages 注释),粘性至收场;
|
|
270
|
+
// 无 finishReason(中转不回传)= 瞬态型 → 维持同参重试(降级不劣化)
|
|
271
|
+
if (finishReason === 'length') {
|
|
272
|
+
truncatedRetry = true;
|
|
273
|
+
effectiveOpts.reasoning_effort = 'low';
|
|
274
|
+
}
|
|
275
|
+
continue;
|
|
276
|
+
}
|
|
277
|
+
// 截断救回计数(诚实信号族,镜像 emptyResponseCount):曾判截断换策略、本次收场非空
|
|
278
|
+
// = 双轨救回成功——救回轮正文是真实产出(不影响成功收尾),但「曾发生截断」只在此留痕
|
|
279
|
+
// (empty_response 证据只在最终仍空时落)。每 call 恒 ≤1(粘性标记单调,成功即收场)。
|
|
280
|
+
// 早退路径(degrade 降级文案 / 抛错 / aborted)不经此点,不计入——降级文本非模型产出。
|
|
281
|
+
// aborted 显式排除(真机修正):`isEmptyResponse` 判据以 `!aborted` 为前提,用户中止时
|
|
282
|
+
// 它恒为 false ⇒ 「truncatedRetry && !isEmptyResponse」会把**用户放弃**误记为救回成功
|
|
283
|
+
//(真机 round-1790686368607:全程无正文/无工具产出却 recov=1)。救回 = 模型的真实产出,
|
|
284
|
+
// 中止 = 未有产出,两者分类互斥,故此处补 `!aborted` 兑现注释声明的纪律。
|
|
285
|
+
if (truncatedRetry && !aborted && !isEmptyResponse) {
|
|
286
|
+
metrics.truncationRecoveryCount++;
|
|
287
|
+
}
|
|
288
|
+
break;
|
|
289
|
+
}
|
|
290
|
+
catch (err) {
|
|
291
|
+
const e = toError(err);
|
|
292
|
+
lastError = e;
|
|
293
|
+
// AbortError 语义分裂(假中断守卫):
|
|
294
|
+
// - signal(宿主 / 插话控制器合并信号)已被 abort → 真实用户取消/插话,不重试直接退出
|
|
295
|
+
// - signal 未被 abort 却捕获 AbortError → provider/网络层内部中断(连接被抽断/代理异常),
|
|
296
|
+
// 并非用户取消;抛出以示「连接中断」,避免内核谎报为「用户取消了对话」。
|
|
297
|
+
if (isAbortError(err)) {
|
|
298
|
+
if (signal?.aborted) {
|
|
299
|
+
aborted = true;
|
|
300
|
+
break;
|
|
301
|
+
}
|
|
302
|
+
logger.warn({ err: e }, 'LLM 请求被非用户消原因 AbortError 中断(host signal 未 abort),判为连接中断');
|
|
303
|
+
llmSpan.recordException(e);
|
|
304
|
+
llmSpan.end();
|
|
305
|
+
throw e;
|
|
306
|
+
}
|
|
307
|
+
// errorHandling='stop' → 立即抛出,不重试(热切换安全:每处重读 getter)
|
|
308
|
+
if (this.deps.getStrategy().errorHandling === 'stop') {
|
|
309
|
+
llmSpan.recordException(e);
|
|
310
|
+
llmSpan.end();
|
|
311
|
+
throw lastError;
|
|
312
|
+
}
|
|
313
|
+
if (streamStarted) {
|
|
314
|
+
// 流式已开始输出,不能重试(用户已看到部分结果);'degrade' 降级为已生成文本
|
|
315
|
+
if (this.deps.getStrategy().errorHandling === 'degrade') {
|
|
316
|
+
logger.warn({ err: e }, 'LLM 流式中途失败,降级为已生成的文本内容');
|
|
317
|
+
llmSpan.end();
|
|
318
|
+
return {
|
|
319
|
+
fullContent,
|
|
320
|
+
pendingNarrate,
|
|
321
|
+
streamedText,
|
|
322
|
+
toolCalls: undefined,
|
|
323
|
+
aborted: false,
|
|
324
|
+
textStreamed,
|
|
325
|
+
finishReason,
|
|
326
|
+
thinkingChars,
|
|
327
|
+
attempts: attemptsMade,
|
|
328
|
+
};
|
|
329
|
+
}
|
|
330
|
+
llmSpan.recordException(e);
|
|
331
|
+
llmSpan.end();
|
|
332
|
+
throw lastError;
|
|
333
|
+
}
|
|
334
|
+
if (attempt >= LOOP_CONSTANTS.MAX_LLM_RETRIES) {
|
|
335
|
+
// 重试次数耗尽;'degrade' 降级为纯文本回复
|
|
336
|
+
if (this.deps.getStrategy().errorHandling === 'degrade') {
|
|
337
|
+
const degradedMsg = '抱歉,AI 服务暂时不可用,请稍后重试。';
|
|
338
|
+
logger.warn({ err: e }, 'LLM 重试耗尽,降级回复');
|
|
339
|
+
llmSpan.end();
|
|
340
|
+
return {
|
|
341
|
+
fullContent: degradedMsg,
|
|
342
|
+
pendingNarrate,
|
|
343
|
+
streamedText,
|
|
344
|
+
toolCalls: undefined,
|
|
345
|
+
aborted: false,
|
|
346
|
+
textStreamed,
|
|
347
|
+
finishReason,
|
|
348
|
+
thinkingChars,
|
|
349
|
+
attempts: attemptsMade,
|
|
350
|
+
};
|
|
351
|
+
}
|
|
352
|
+
llmSpan.recordException(e);
|
|
353
|
+
llmSpan.end();
|
|
354
|
+
throw lastError;
|
|
355
|
+
}
|
|
356
|
+
// 流式开始前失败可继续重试(超时/网络错误)
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
if (aborted) {
|
|
360
|
+
llmSpan.end();
|
|
361
|
+
return {
|
|
362
|
+
fullContent,
|
|
363
|
+
pendingNarrate,
|
|
364
|
+
streamedText,
|
|
365
|
+
toolCalls,
|
|
366
|
+
aborted: true,
|
|
367
|
+
textStreamed,
|
|
368
|
+
finishReason,
|
|
369
|
+
thinkingChars,
|
|
370
|
+
attempts: attemptsMade,
|
|
371
|
+
};
|
|
372
|
+
}
|
|
373
|
+
llmSpan.end();
|
|
374
|
+
return {
|
|
375
|
+
fullContent,
|
|
376
|
+
pendingNarrate,
|
|
377
|
+
streamedText,
|
|
378
|
+
toolCalls,
|
|
379
|
+
aborted: false,
|
|
380
|
+
textStreamed,
|
|
381
|
+
finishReason,
|
|
382
|
+
thinkingChars,
|
|
383
|
+
attempts: attemptsMade,
|
|
384
|
+
};
|
|
385
|
+
}
|
|
386
|
+
/**
|
|
387
|
+
* 重试延迟 + abort 支持:发射 retry chunk,等待指数退避延迟(支持中途 abort);
|
|
388
|
+
* 调用方在延迟后自行检查 signal.aborted 决定是否退出重试循环
|
|
389
|
+
*/
|
|
390
|
+
async *waitForRetryWithAbort(attempt, lastError, signal) {
|
|
391
|
+
const delay = LOOP_CONSTANTS.RETRY_BASE_DELAY_MS * Math.pow(2, attempt - 1);
|
|
392
|
+
logger.warn({ attempt, delay, error: lastError?.message }, 'LLM 调用失败,重试中');
|
|
393
|
+
yield {
|
|
394
|
+
type: 'retry',
|
|
395
|
+
attempt,
|
|
396
|
+
maxRetries: LOOP_CONSTANTS.MAX_LLM_RETRIES,
|
|
397
|
+
delayMs: delay,
|
|
398
|
+
error: lastError?.message ?? 'unknown error',
|
|
399
|
+
};
|
|
400
|
+
await new Promise((resolve) => {
|
|
401
|
+
if (signal?.aborted) {
|
|
402
|
+
resolve();
|
|
403
|
+
return;
|
|
404
|
+
}
|
|
405
|
+
const timeoutId = safeSetTimeout(() => {
|
|
406
|
+
signal?.removeEventListener('abort', onAbort);
|
|
407
|
+
resolve();
|
|
408
|
+
}, delay);
|
|
409
|
+
const onAbort = () => {
|
|
410
|
+
clearTimeout(timeoutId);
|
|
411
|
+
resolve();
|
|
412
|
+
};
|
|
413
|
+
signal?.addEventListener('abort', onAbort, { once: true });
|
|
414
|
+
});
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
//# sourceMappingURL=llmCaller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llmCaller.js","sourceRoot":"","sources":["../../../src/agent/managers/llmCaller.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,38 +1,21 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* LLM Judge
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* 用于 memoryInspector / memoryDecayScheduler / memoryAdvisor 三个 Manager 的 LLM 判断流程,
|
|
6
|
-
* 消除 3 处重复模式(ADR-017 枝叶层 2 次提取原则)。
|
|
7
|
-
*
|
|
8
|
-
* 设计要点:
|
|
9
|
-
* - 流式累积:与 TextPolishManager / SessionArchiver 同模式
|
|
10
|
-
* - 统一异常:parseLlmJson 返回 null 时抛 configError(统一 MemoraError 体系,避免裸 throw Error)
|
|
11
|
-
* - 类型参数化:调用方传入期望的返回类型 T
|
|
2
|
+
* LLM Judge 高阶辅助函数:封装"流式累积 → parseLlmJson → 判 null → 抛 configError"三件套。
|
|
3
|
+
* 由 memoryInspector / memoryAdvisor 复用,消除重复。
|
|
4
|
+
* 统一异常:解析失败抛 configError(MemoraError 体系);类型参数化,调用方指定返回类型 T。
|
|
12
5
|
*/
|
|
13
6
|
import type { LlmProvider, Message } from '../../llm/provider.js';
|
|
14
7
|
/** LLM Judge 调用选项(流式 + 超时 + 取消信号) */
|
|
15
8
|
export interface LlmJudgeOptions {
|
|
16
|
-
/**
|
|
9
|
+
/** 流式响应最大 token 数(控制单次调用成本) */
|
|
17
10
|
maxTokens: number;
|
|
18
|
-
/** LLM 调用超时(ms
|
|
11
|
+
/** LLM 调用超时(ms),超时中止请求 */
|
|
19
12
|
timeoutMs: number;
|
|
20
|
-
/**
|
|
13
|
+
/** 可选取消信号(与 timeoutMs 独立,任一触发即中止) */
|
|
21
14
|
signal?: AbortSignal;
|
|
22
15
|
}
|
|
23
16
|
/**
|
|
24
|
-
* 调用 LLM 流式累积响应并解析为 JSON 对象
|
|
25
|
-
*
|
|
26
|
-
* 三件套模式封装:
|
|
27
|
-
* 1. 流式累积 LLM 响应(chunk.content 拼接)
|
|
28
|
-
* 2. parseLlmJson 解析为对象 T(容错:剥离代码块、修复常见错误、正则兜底)
|
|
29
|
-
* 3. 解析失败抛 configError(统一 MemoraError 体系,附带排查建议)
|
|
30
|
-
*
|
|
31
|
-
* @param provider LLM Provider 实例(通常为 backgroundProvider)
|
|
32
|
-
* @param messages LLM 消息数组(system + user)
|
|
33
|
-
* @param options 调用选项(maxTokens / timeoutMs / signal)
|
|
34
|
-
* @param errorTitle 解析失败时抛出 configError 的标题(中文简短)
|
|
35
|
-
* @returns 解析后的对象(类型由调用方指定)
|
|
17
|
+
* 调用 LLM 流式累积响应并解析为 JSON 对象 T。
|
|
18
|
+
* 流式累积 → parseLlmJson(容错剥离代码块/修复错误/正则兜底)→ 解析失败抛 configError。
|
|
36
19
|
*/
|
|
37
20
|
export declare function judgeWithLlm<T extends object>(provider: LlmProvider, messages: Message[], options: LlmJudgeOptions, errorTitle: string): Promise<T>;
|
|
38
21
|
//# sourceMappingURL=llmJudgeHelper.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"llmJudgeHelper.d.ts","sourceRoot":"","sources":["../../../src/agent/managers/llmJudgeHelper.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"llmJudgeHelper.d.ts","sourceRoot":"","sources":["../../../src/agent/managers/llmJudgeHelper.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAK9D,qCAAqC;AACrC,MAAM,WAAW,eAAe;IAC9B,+BAA+B;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,0BAA0B;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,qCAAqC;IACrC,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAAC,CAAC,SAAS,MAAM,EACjD,QAAQ,EAAE,WAAW,EACrB,QAAQ,EAAE,OAAO,EAAE,EACnB,OAAO,EAAE,eAAe,EACxB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,CAAC,CAAC,CAoBZ"}
|