@actalk/inkos-core 1.3.6 → 1.3.7
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/dist/agent/agent-session.d.ts +7 -7
- package/dist/agent/agent-session.d.ts.map +1 -1
- package/dist/agent/agent-session.js +392 -63
- package/dist/agent/agent-session.js.map +1 -1
- package/dist/agent/agent-system-prompt.d.ts.map +1 -1
- package/dist/agent/agent-system-prompt.js +20 -16
- package/dist/agent/agent-system-prompt.js.map +1 -1
- package/dist/agent/agent-tools.d.ts +4 -1
- package/dist/agent/agent-tools.d.ts.map +1 -1
- package/dist/agent/agent-tools.js +81 -64
- package/dist/agent/agent-tools.js.map +1 -1
- package/dist/agents/architect.d.ts +18 -20
- package/dist/agents/architect.d.ts.map +1 -1
- package/dist/agents/architect.js +513 -632
- package/dist/agents/architect.js.map +1 -1
- package/dist/agents/chapter-analyzer.d.ts.map +1 -1
- package/dist/agents/chapter-analyzer.js +10 -6
- package/dist/agents/chapter-analyzer.js.map +1 -1
- package/dist/agents/composer.d.ts +1 -13
- package/dist/agents/composer.d.ts.map +1 -1
- package/dist/agents/composer.js +297 -290
- package/dist/agents/composer.js.map +1 -1
- package/dist/agents/consolidator.d.ts +17 -1
- package/dist/agents/consolidator.d.ts.map +1 -1
- package/dist/agents/consolidator.js +44 -6
- package/dist/agents/consolidator.js.map +1 -1
- package/dist/agents/continuity.d.ts +4 -1
- package/dist/agents/continuity.d.ts.map +1 -1
- package/dist/agents/continuity.js +111 -21
- package/dist/agents/continuity.js.map +1 -1
- package/dist/agents/length-normalizer.d.ts.map +1 -1
- package/dist/agents/length-normalizer.js +1 -4
- package/dist/agents/length-normalizer.js.map +1 -1
- package/dist/agents/planner-context.d.ts +54 -0
- package/dist/agents/planner-context.d.ts.map +1 -0
- package/dist/agents/planner-context.js +245 -0
- package/dist/agents/planner-context.js.map +1 -0
- package/dist/agents/planner-prompts.d.ts +36 -0
- package/dist/agents/planner-prompts.d.ts.map +1 -0
- package/dist/agents/planner-prompts.js +350 -0
- package/dist/agents/planner-prompts.js.map +1 -0
- package/dist/agents/planner.d.ts +39 -11
- package/dist/agents/planner.d.ts.map +1 -1
- package/dist/agents/planner.js +212 -195
- package/dist/agents/planner.js.map +1 -1
- package/dist/agents/polisher.d.ts +33 -0
- package/dist/agents/polisher.d.ts.map +1 -0
- package/dist/agents/polisher.js +122 -0
- package/dist/agents/polisher.js.map +1 -0
- package/dist/agents/post-write-validator.d.ts +1 -0
- package/dist/agents/post-write-validator.d.ts.map +1 -1
- package/dist/agents/post-write-validator.js +13 -0
- package/dist/agents/post-write-validator.js.map +1 -1
- package/dist/agents/reviser.d.ts +6 -2
- package/dist/agents/reviser.d.ts.map +1 -1
- package/dist/agents/reviser.js +379 -98
- package/dist/agents/reviser.js.map +1 -1
- package/dist/agents/rules-reader.d.ts +15 -2
- package/dist/agents/rules-reader.d.ts.map +1 -1
- package/dist/agents/rules-reader.js +49 -6
- package/dist/agents/rules-reader.js.map +1 -1
- package/dist/agents/state-validator.d.ts +9 -1
- package/dist/agents/state-validator.d.ts.map +1 -1
- package/dist/agents/state-validator.js +37 -1
- package/dist/agents/state-validator.js.map +1 -1
- package/dist/agents/writer-prompts.d.ts +1 -0
- package/dist/agents/writer-prompts.d.ts.map +1 -1
- package/dist/agents/writer-prompts.js +272 -29
- package/dist/agents/writer-prompts.js.map +1 -1
- package/dist/agents/writer.d.ts +12 -3
- package/dist/agents/writer.d.ts.map +1 -1
- package/dist/agents/writer.js +77 -107
- package/dist/agents/writer.js.map +1 -1
- package/dist/index.d.ts +20 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +19 -5
- package/dist/index.js.map +1 -1
- package/dist/interaction/book-session-store.d.ts.map +1 -1
- package/dist/interaction/book-session-store.js +84 -69
- package/dist/interaction/book-session-store.js.map +1 -1
- package/dist/interaction/events.d.ts +2 -2
- package/dist/interaction/project-tools.d.ts +1 -0
- package/dist/interaction/project-tools.d.ts.map +1 -1
- package/dist/interaction/project-tools.js +51 -3
- package/dist/interaction/project-tools.js.map +1 -1
- package/dist/interaction/session-transcript-legacy.d.ts +4 -0
- package/dist/interaction/session-transcript-legacy.d.ts.map +1 -0
- package/dist/interaction/session-transcript-legacy.js +100 -0
- package/dist/interaction/session-transcript-legacy.js.map +1 -0
- package/dist/interaction/session-transcript-restore.d.ts +17 -0
- package/dist/interaction/session-transcript-restore.d.ts.map +1 -0
- package/dist/interaction/session-transcript-restore.js +493 -0
- package/dist/interaction/session-transcript-restore.js.map +1 -0
- package/dist/interaction/session-transcript-schema.d.ts +402 -0
- package/dist/interaction/session-transcript-schema.d.ts.map +1 -0
- package/dist/interaction/session-transcript-schema.js +59 -0
- package/dist/interaction/session-transcript-schema.js.map +1 -0
- package/dist/interaction/session-transcript.d.ts +14 -0
- package/dist/interaction/session-transcript.d.ts.map +1 -0
- package/dist/interaction/session-transcript.js +152 -0
- package/dist/interaction/session-transcript.js.map +1 -0
- package/dist/interaction/session.d.ts +10 -10
- package/dist/interaction/session.d.ts.map +1 -1
- package/dist/interaction/session.js +5 -3
- package/dist/interaction/session.js.map +1 -1
- package/dist/llm/provider.d.ts +6 -9
- package/dist/llm/provider.d.ts.map +1 -1
- package/dist/llm/provider.js +255 -63
- package/dist/llm/provider.js.map +1 -1
- package/dist/llm/providers/endpoints/ai360.d.ts +10 -0
- package/dist/llm/providers/endpoints/ai360.d.ts.map +1 -0
- package/dist/llm/providers/endpoints/ai360.js +34 -0
- package/dist/llm/providers/endpoints/ai360.js.map +1 -0
- package/dist/llm/providers/endpoints/anthropic.d.ts +12 -0
- package/dist/llm/providers/endpoints/anthropic.d.ts.map +1 -0
- package/dist/llm/providers/endpoints/anthropic.js +72 -0
- package/dist/llm/providers/endpoints/anthropic.js.map +1 -0
- package/dist/llm/providers/endpoints/astronCodingPlan.d.ts +16 -0
- package/dist/llm/providers/endpoints/astronCodingPlan.d.ts.map +1 -0
- package/dist/llm/providers/endpoints/astronCodingPlan.js +16 -0
- package/dist/llm/providers/endpoints/astronCodingPlan.js.map +1 -0
- package/dist/llm/providers/endpoints/baichuan.d.ts +10 -0
- package/dist/llm/providers/endpoints/baichuan.d.ts.map +1 -0
- package/dist/llm/providers/endpoints/baichuan.js +20 -0
- package/dist/llm/providers/endpoints/baichuan.js.map +1 -0
- package/dist/llm/providers/endpoints/bailian.d.ts +25 -0
- package/dist/llm/providers/endpoints/bailian.d.ts.map +1 -0
- package/dist/llm/providers/endpoints/bailian.js +42 -0
- package/dist/llm/providers/endpoints/bailian.js.map +1 -0
- package/dist/llm/providers/endpoints/bailianCodingPlan.d.ts +10 -0
- package/dist/llm/providers/endpoints/bailianCodingPlan.d.ts.map +1 -0
- package/dist/llm/providers/endpoints/bailianCodingPlan.js +22 -0
- package/dist/llm/providers/endpoints/bailianCodingPlan.js.map +1 -0
- package/dist/llm/providers/endpoints/custom.d.ts +16 -0
- package/dist/llm/providers/endpoints/custom.d.ts.map +1 -0
- package/dist/llm/providers/endpoints/custom.js +15 -0
- package/dist/llm/providers/endpoints/custom.js.map +1 -0
- package/dist/llm/providers/endpoints/deepseek.d.ts +17 -0
- package/dist/llm/providers/endpoints/deepseek.d.ts.map +1 -0
- package/dist/llm/providers/endpoints/deepseek.js +20 -0
- package/dist/llm/providers/endpoints/deepseek.js.map +1 -0
- package/dist/llm/providers/endpoints/giteeai.d.ts +10 -0
- package/dist/llm/providers/endpoints/giteeai.d.ts.map +1 -0
- package/dist/llm/providers/endpoints/giteeai.js +33 -0
- package/dist/llm/providers/endpoints/giteeai.js.map +1 -0
- package/dist/llm/providers/endpoints/githubCopilot.d.ts +10 -0
- package/dist/llm/providers/endpoints/githubCopilot.d.ts.map +1 -0
- package/dist/llm/providers/endpoints/githubCopilot.js +35 -0
- package/dist/llm/providers/endpoints/githubCopilot.js.map +1 -0
- package/dist/llm/providers/endpoints/glmCodingPlan.d.ts +9 -0
- package/dist/llm/providers/endpoints/glmCodingPlan.d.ts.map +1 -0
- package/dist/llm/providers/endpoints/glmCodingPlan.js +21 -0
- package/dist/llm/providers/endpoints/glmCodingPlan.js.map +1 -0
- package/dist/llm/providers/endpoints/google.d.ts +12 -0
- package/dist/llm/providers/endpoints/google.d.ts.map +1 -0
- package/dist/llm/providers/endpoints/google.js +41 -0
- package/dist/llm/providers/endpoints/google.js.map +1 -0
- package/dist/llm/providers/endpoints/hunyuan.d.ts +10 -0
- package/dist/llm/providers/endpoints/hunyuan.d.ts.map +1 -0
- package/dist/llm/providers/endpoints/hunyuan.js +34 -0
- package/dist/llm/providers/endpoints/hunyuan.js.map +1 -0
- package/dist/llm/providers/endpoints/infiniai.d.ts +10 -0
- package/dist/llm/providers/endpoints/infiniai.d.ts.map +1 -0
- package/dist/llm/providers/endpoints/infiniai.js +64 -0
- package/dist/llm/providers/endpoints/infiniai.js.map +1 -0
- package/dist/llm/providers/endpoints/internlm.d.ts +10 -0
- package/dist/llm/providers/endpoints/internlm.d.ts.map +1 -0
- package/dist/llm/providers/endpoints/internlm.js +20 -0
- package/dist/llm/providers/endpoints/internlm.js.map +1 -0
- package/dist/llm/providers/endpoints/kimiCodingPlan.d.ts +9 -0
- package/dist/llm/providers/endpoints/kimiCodingPlan.d.ts.map +1 -0
- package/dist/llm/providers/endpoints/kimiCodingPlan.js +17 -0
- package/dist/llm/providers/endpoints/kimiCodingPlan.js.map +1 -0
- package/dist/llm/providers/endpoints/longcat.d.ts +9 -0
- package/dist/llm/providers/endpoints/longcat.d.ts.map +1 -0
- package/dist/llm/providers/endpoints/longcat.js +18 -0
- package/dist/llm/providers/endpoints/longcat.js.map +1 -0
- package/dist/llm/providers/endpoints/minimax.d.ts +15 -0
- package/dist/llm/providers/endpoints/minimax.d.ts.map +1 -0
- package/dist/llm/providers/endpoints/minimax.js +26 -0
- package/dist/llm/providers/endpoints/minimax.js.map +1 -0
- package/dist/llm/providers/endpoints/minimaxCodingPlan.d.ts +9 -0
- package/dist/llm/providers/endpoints/minimaxCodingPlan.d.ts.map +1 -0
- package/dist/llm/providers/endpoints/minimaxCodingPlan.js +21 -0
- package/dist/llm/providers/endpoints/minimaxCodingPlan.js.map +1 -0
- package/dist/llm/providers/endpoints/mistral.d.ts +11 -0
- package/dist/llm/providers/endpoints/mistral.d.ts.map +1 -0
- package/dist/llm/providers/endpoints/mistral.js +31 -0
- package/dist/llm/providers/endpoints/mistral.js.map +1 -0
- package/dist/llm/providers/endpoints/modelscope.d.ts +10 -0
- package/dist/llm/providers/endpoints/modelscope.d.ts.map +1 -0
- package/dist/llm/providers/endpoints/modelscope.js +22 -0
- package/dist/llm/providers/endpoints/modelscope.js.map +1 -0
- package/dist/llm/providers/endpoints/moonshot.d.ts +12 -0
- package/dist/llm/providers/endpoints/moonshot.d.ts.map +1 -0
- package/dist/llm/providers/endpoints/moonshot.js +29 -0
- package/dist/llm/providers/endpoints/moonshot.js.map +1 -0
- package/dist/llm/providers/endpoints/newapi.d.ts +14 -0
- package/dist/llm/providers/endpoints/newapi.d.ts.map +1 -0
- package/dist/llm/providers/endpoints/newapi.js +14 -0
- package/dist/llm/providers/endpoints/newapi.js.map +1 -0
- package/dist/llm/providers/endpoints/ollama.d.ts +12 -0
- package/dist/llm/providers/endpoints/ollama.d.ts.map +1 -0
- package/dist/llm/providers/endpoints/ollama.js +63 -0
- package/dist/llm/providers/endpoints/ollama.js.map +1 -0
- package/dist/llm/providers/endpoints/openai.d.ts +12 -0
- package/dist/llm/providers/endpoints/openai.d.ts.map +1 -0
- package/dist/llm/providers/endpoints/openai.js +67 -0
- package/dist/llm/providers/endpoints/openai.js.map +1 -0
- package/dist/llm/providers/endpoints/opencodeCodingPlan.d.ts +9 -0
- package/dist/llm/providers/endpoints/opencodeCodingPlan.d.ts.map +1 -0
- package/dist/llm/providers/endpoints/opencodeCodingPlan.js +23 -0
- package/dist/llm/providers/endpoints/opencodeCodingPlan.js.map +1 -0
- package/dist/llm/providers/endpoints/openrouter.d.ts +15 -0
- package/dist/llm/providers/endpoints/openrouter.d.ts.map +1 -0
- package/dist/llm/providers/endpoints/openrouter.js +74 -0
- package/dist/llm/providers/endpoints/openrouter.js.map +1 -0
- package/dist/llm/providers/endpoints/ppio.d.ts +15 -0
- package/dist/llm/providers/endpoints/ppio.d.ts.map +1 -0
- package/dist/llm/providers/endpoints/ppio.js +73 -0
- package/dist/llm/providers/endpoints/ppio.js.map +1 -0
- package/dist/llm/providers/endpoints/qiniu.d.ts +10 -0
- package/dist/llm/providers/endpoints/qiniu.d.ts.map +1 -0
- package/dist/llm/providers/endpoints/qiniu.js +24 -0
- package/dist/llm/providers/endpoints/qiniu.js.map +1 -0
- package/dist/llm/providers/endpoints/sensenova.d.ts +10 -0
- package/dist/llm/providers/endpoints/sensenova.d.ts.map +1 -0
- package/dist/llm/providers/endpoints/sensenova.js +37 -0
- package/dist/llm/providers/endpoints/sensenova.js.map +1 -0
- package/dist/llm/providers/endpoints/siliconcloud.d.ts +14 -0
- package/dist/llm/providers/endpoints/siliconcloud.d.ts.map +1 -0
- package/dist/llm/providers/endpoints/siliconcloud.js +114 -0
- package/dist/llm/providers/endpoints/siliconcloud.js.map +1 -0
- package/dist/llm/providers/endpoints/spark.d.ts +14 -0
- package/dist/llm/providers/endpoints/spark.d.ts.map +1 -0
- package/dist/llm/providers/endpoints/spark.js +21 -0
- package/dist/llm/providers/endpoints/spark.js.map +1 -0
- package/dist/llm/providers/endpoints/stepfun.d.ts +10 -0
- package/dist/llm/providers/endpoints/stepfun.d.ts.map +1 -0
- package/dist/llm/providers/endpoints/stepfun.js +27 -0
- package/dist/llm/providers/endpoints/stepfun.js.map +1 -0
- package/dist/llm/providers/endpoints/tencentcloud.d.ts +10 -0
- package/dist/llm/providers/endpoints/tencentcloud.d.ts.map +1 -0
- package/dist/llm/providers/endpoints/tencentcloud.js +17 -0
- package/dist/llm/providers/endpoints/tencentcloud.js.map +1 -0
- package/dist/llm/providers/endpoints/volcengine.d.ts +10 -0
- package/dist/llm/providers/endpoints/volcengine.d.ts.map +1 -0
- package/dist/llm/providers/endpoints/volcengine.js +44 -0
- package/dist/llm/providers/endpoints/volcengine.js.map +1 -0
- package/dist/llm/providers/endpoints/volcengineCodingPlan.d.ts +19 -0
- package/dist/llm/providers/endpoints/volcengineCodingPlan.d.ts.map +1 -0
- package/dist/llm/providers/endpoints/volcengineCodingPlan.js +25 -0
- package/dist/llm/providers/endpoints/volcengineCodingPlan.js.map +1 -0
- package/dist/llm/providers/endpoints/wenxin.d.ts +10 -0
- package/dist/llm/providers/endpoints/wenxin.d.ts.map +1 -0
- package/dist/llm/providers/endpoints/wenxin.js +98 -0
- package/dist/llm/providers/endpoints/wenxin.js.map +1 -0
- package/dist/llm/providers/endpoints/xai.d.ts +11 -0
- package/dist/llm/providers/endpoints/xai.d.ts.map +1 -0
- package/dist/llm/providers/endpoints/xai.js +25 -0
- package/dist/llm/providers/endpoints/xai.js.map +1 -0
- package/dist/llm/providers/endpoints/xiaomimimo.d.ts +12 -0
- package/dist/llm/providers/endpoints/xiaomimimo.d.ts.map +1 -0
- package/dist/llm/providers/endpoints/xiaomimimo.js +16 -0
- package/dist/llm/providers/endpoints/xiaomimimo.js.map +1 -0
- package/dist/llm/providers/endpoints/zeroone.d.ts +10 -0
- package/dist/llm/providers/endpoints/zeroone.d.ts.map +1 -0
- package/dist/llm/providers/endpoints/zeroone.js +26 -0
- package/dist/llm/providers/endpoints/zeroone.js.map +1 -0
- package/dist/llm/providers/endpoints/zhipu.d.ts +12 -0
- package/dist/llm/providers/endpoints/zhipu.d.ts.map +1 -0
- package/dist/llm/providers/endpoints/zhipu.js +51 -0
- package/dist/llm/providers/endpoints/zhipu.js.map +1 -0
- package/dist/llm/providers/index.d.ts +5 -0
- package/dist/llm/providers/index.d.ts.map +1 -0
- package/dist/llm/providers/index.js +67 -0
- package/dist/llm/providers/index.js.map +1 -0
- package/dist/llm/providers/lookup.d.ts +16 -0
- package/dist/llm/providers/lookup.d.ts.map +1 -0
- package/dist/llm/providers/lookup.js +68 -0
- package/dist/llm/providers/lookup.js.map +1 -0
- package/dist/llm/providers/probe.d.ts +11 -0
- package/dist/llm/providers/probe.d.ts.map +1 -0
- package/dist/llm/providers/probe.js +24 -0
- package/dist/llm/providers/probe.js.map +1 -0
- package/dist/llm/providers/types.d.ts +71 -0
- package/dist/llm/providers/types.d.ts.map +1 -0
- package/dist/llm/providers/types.js +9 -0
- package/dist/llm/providers/types.js.map +1 -0
- package/dist/llm/providers/verify.d.ts +27 -0
- package/dist/llm/providers/verify.d.ts.map +1 -0
- package/dist/llm/providers/verify.js +77 -0
- package/dist/llm/providers/verify.js.map +1 -0
- package/dist/llm/secrets.d.ts.map +1 -1
- package/dist/llm/secrets.js +27 -2
- package/dist/llm/secrets.js.map +1 -1
- package/dist/llm/service-presets.d.ts +13 -3
- package/dist/llm/service-presets.d.ts.map +1 -1
- package/dist/llm/service-presets.js +78 -42
- package/dist/llm/service-presets.js.map +1 -1
- package/dist/llm/service-resolver.d.ts +1 -1
- package/dist/llm/service-resolver.d.ts.map +1 -1
- package/dist/llm/service-resolver.js +13 -0
- package/dist/llm/service-resolver.js.map +1 -1
- package/dist/models/book-rules.d.ts +23 -1
- package/dist/models/book-rules.d.ts.map +1 -1
- package/dist/models/book-rules.js +54 -2
- package/dist/models/book-rules.js.map +1 -1
- package/dist/models/input-governance.d.ts +20 -244
- package/dist/models/input-governance.d.ts.map +1 -1
- package/dist/models/input-governance.js +7 -51
- package/dist/models/input-governance.js.map +1 -1
- package/dist/models/project.d.ts +29 -28
- package/dist/models/project.d.ts.map +1 -1
- package/dist/models/project.js +11 -9
- package/dist/models/project.js.map +1 -1
- package/dist/models/runtime-state.d.ts +120 -0
- package/dist/models/runtime-state.d.ts.map +1 -1
- package/dist/models/runtime-state.js +12 -0
- package/dist/models/runtime-state.js.map +1 -1
- package/dist/pipeline/agent.d.ts.map +1 -1
- package/dist/pipeline/agent.js +59 -10
- package/dist/pipeline/agent.js.map +1 -1
- package/dist/pipeline/chapter-review-cycle.d.ts +11 -4
- package/dist/pipeline/chapter-review-cycle.d.ts.map +1 -1
- package/dist/pipeline/chapter-review-cycle.js +156 -73
- package/dist/pipeline/chapter-review-cycle.js.map +1 -1
- package/dist/pipeline/chapter-truth-validation.d.ts +2 -1
- package/dist/pipeline/chapter-truth-validation.d.ts.map +1 -1
- package/dist/pipeline/chapter-truth-validation.js +1 -1
- package/dist/pipeline/chapter-truth-validation.js.map +1 -1
- package/dist/pipeline/persisted-governed-plan.d.ts +1 -0
- package/dist/pipeline/persisted-governed-plan.d.ts.map +1 -1
- package/dist/pipeline/persisted-governed-plan.js +181 -66
- package/dist/pipeline/persisted-governed-plan.js.map +1 -1
- package/dist/pipeline/runner.d.ts +20 -17
- package/dist/pipeline/runner.d.ts.map +1 -1
- package/dist/pipeline/runner.js +359 -84
- package/dist/pipeline/runner.js.map +1 -1
- package/dist/state/manager.d.ts.map +1 -1
- package/dist/state/manager.js +44 -4
- package/dist/state/manager.js.map +1 -1
- package/dist/state/memory-db.d.ts +6 -0
- package/dist/state/memory-db.d.ts.map +1 -1
- package/dist/state/memory-db.js.map +1 -1
- package/dist/state/runtime-state-store.d.ts.map +1 -1
- package/dist/state/runtime-state-store.js +4 -1
- package/dist/state/runtime-state-store.js.map +1 -1
- package/dist/state/state-projections.d.ts +3 -1
- package/dist/state/state-projections.d.ts.map +1 -1
- package/dist/state/state-projections.js +58 -15
- package/dist/state/state-projections.js.map +1 -1
- package/dist/utils/book-id.d.ts +4 -0
- package/dist/utils/book-id.d.ts.map +1 -0
- package/dist/utils/book-id.js +27 -0
- package/dist/utils/book-id.js.map +1 -0
- package/dist/utils/chapter-cadence.js +1 -0
- package/dist/utils/chapter-cadence.js.map +1 -1
- package/dist/utils/chapter-memo-parser.d.ts +19 -0
- package/dist/utils/chapter-memo-parser.d.ts.map +1 -0
- package/dist/utils/chapter-memo-parser.js +114 -0
- package/dist/utils/chapter-memo-parser.js.map +1 -0
- package/dist/utils/config-loader.d.ts +7 -11
- package/dist/utils/config-loader.d.ts.map +1 -1
- package/dist/utils/config-loader.js +13 -253
- package/dist/utils/config-loader.js.map +1 -1
- package/dist/utils/context-assembly.d.ts +24 -0
- package/dist/utils/context-assembly.d.ts.map +1 -0
- package/dist/utils/context-assembly.js +77 -0
- package/dist/utils/context-assembly.js.map +1 -0
- package/dist/utils/effective-llm-config.d.ts +34 -0
- package/dist/utils/effective-llm-config.d.ts.map +1 -0
- package/dist/utils/effective-llm-config.js +417 -0
- package/dist/utils/effective-llm-config.js.map +1 -0
- package/dist/utils/governed-working-set.js +1 -1
- package/dist/utils/governed-working-set.js.map +1 -1
- package/dist/utils/hook-ledger-validator.d.ts +82 -0
- package/dist/utils/hook-ledger-validator.d.ts.map +1 -0
- package/dist/utils/hook-ledger-validator.js +225 -0
- package/dist/utils/hook-ledger-validator.js.map +1 -0
- package/dist/utils/hook-lifecycle.d.ts +5 -0
- package/dist/utils/hook-lifecycle.d.ts.map +1 -1
- package/dist/utils/hook-lifecycle.js +32 -0
- package/dist/utils/hook-lifecycle.js.map +1 -1
- package/dist/utils/hook-policy.d.ts +0 -17
- package/dist/utils/hook-policy.d.ts.map +1 -1
- package/dist/utils/hook-policy.js +0 -30
- package/dist/utils/hook-policy.js.map +1 -1
- package/dist/utils/hook-promotion.d.ts +83 -0
- package/dist/utils/hook-promotion.d.ts.map +1 -0
- package/dist/utils/hook-promotion.js +241 -0
- package/dist/utils/hook-promotion.js.map +1 -0
- package/dist/utils/hook-stale-detection.d.ts +51 -0
- package/dist/utils/hook-stale-detection.d.ts.map +1 -0
- package/dist/utils/hook-stale-detection.js +125 -0
- package/dist/utils/hook-stale-detection.js.map +1 -0
- package/dist/utils/llm-endpoint-auth.d.ts +5 -0
- package/dist/utils/llm-endpoint-auth.d.ts.map +1 -0
- package/dist/utils/llm-endpoint-auth.js +36 -0
- package/dist/utils/llm-endpoint-auth.js.map +1 -0
- package/dist/utils/llm-env.d.ts +14 -0
- package/dist/utils/llm-env.d.ts.map +1 -0
- package/dist/utils/llm-env.js +53 -0
- package/dist/utils/llm-env.js.map +1 -0
- package/dist/utils/memory-retrieval.d.ts +23 -1
- package/dist/utils/memory-retrieval.d.ts.map +1 -1
- package/dist/utils/memory-retrieval.js +45 -2
- package/dist/utils/memory-retrieval.js.map +1 -1
- package/dist/utils/narrative-control.d.ts +16 -0
- package/dist/utils/narrative-control.d.ts.map +1 -0
- package/dist/utils/narrative-control.js +131 -0
- package/dist/utils/narrative-control.js.map +1 -0
- package/dist/utils/path-safety.d.ts +2 -0
- package/dist/utils/path-safety.d.ts.map +1 -0
- package/dist/utils/path-safety.js +11 -0
- package/dist/utils/path-safety.js.map +1 -0
- package/dist/utils/planning-materials.d.ts +35 -0
- package/dist/utils/planning-materials.d.ts.map +1 -0
- package/dist/utils/planning-materials.js +123 -0
- package/dist/utils/planning-materials.js.map +1 -0
- package/dist/utils/proxy-fetch.d.ts +9 -0
- package/dist/utils/proxy-fetch.d.ts.map +1 -0
- package/dist/utils/proxy-fetch.js +31 -0
- package/dist/utils/proxy-fetch.js.map +1 -0
- package/dist/utils/runtime-writer.d.ts +14 -0
- package/dist/utils/runtime-writer.d.ts.map +1 -0
- package/dist/utils/runtime-writer.js +21 -0
- package/dist/utils/runtime-writer.js.map +1 -0
- package/dist/utils/spot-fix-patches.d.ts +7 -0
- package/dist/utils/spot-fix-patches.d.ts.map +1 -1
- package/dist/utils/spot-fix-patches.js +109 -36
- package/dist/utils/spot-fix-patches.js.map +1 -1
- package/dist/utils/story-markdown.d.ts.map +1 -1
- package/dist/utils/story-markdown.js +104 -6
- package/dist/utils/story-markdown.js.map +1 -1
- package/dist/utils/writing-methodology.d.ts +10 -0
- package/dist/utils/writing-methodology.d.ts.map +1 -0
- package/dist/utils/writing-methodology.js +163 -0
- package/dist/utils/writing-methodology.js.map +1 -0
- package/package.json +3 -2
- package/dist/utils/hook-agenda.d.ts +0 -21
- package/dist/utils/hook-agenda.d.ts.map +0 -1
- package/dist/utils/hook-agenda.js +0 -95
- package/dist/utils/hook-agenda.js.map +0 -1
package/dist/llm/provider.js
CHANGED
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
import { streamSimple as piStreamSimple, stream as piStream, completeSimple as piCompleteSimple, complete as piComplete, } from "@mariozechner/pi-ai";
|
|
2
2
|
import { resolveServicePreset } from "./service-presets.js";
|
|
3
|
+
import { getEndpoint } from "./providers/index.js";
|
|
4
|
+
import { lookupModel } from "./providers/lookup.js";
|
|
5
|
+
import { fetchWithProxy } from "../utils/proxy-fetch.js";
|
|
6
|
+
const INKOS_USER_AGENT = "InkOS/1.3.5";
|
|
7
|
+
const UNKNOWN_MODEL_FALLBACK_MAX_TOKENS = 8192 * 3;
|
|
8
|
+
const TRANSIENT_LLM_RETRIES = 2;
|
|
9
|
+
function mergeUserAgent(headers) {
|
|
10
|
+
return { "User-Agent": INKOS_USER_AGENT, ...(headers ?? {}) };
|
|
11
|
+
}
|
|
3
12
|
export function createStreamMonitor(onProgress, intervalMs = 30000) {
|
|
4
13
|
let totalChars = 0;
|
|
5
14
|
let chineseChars = 0;
|
|
@@ -36,14 +45,11 @@ export function createStreamMonitor(onProgress, intervalMs = 30000) {
|
|
|
36
45
|
}
|
|
37
46
|
// === Factory ===
|
|
38
47
|
export function createLLMClient(config) {
|
|
48
|
+
// C1 (v2.0.0):config.maxTokens / maxTokensCap 已删除;defaults.maxTokens 完全从 modelCard 推导。
|
|
49
|
+
const _earlyCard = lookupModel(config.service ?? "custom", config.model);
|
|
39
50
|
const defaults = {
|
|
40
51
|
temperature: config.temperature ?? 0.7,
|
|
41
|
-
|
|
42
|
-
maxTokens: config.maxTokens ?? 8192,
|
|
43
|
-
// cap: 只在用户显式配 maxTokensCap 时生效;默认 null = 不封顶 per-call。
|
|
44
|
-
// **禁止**改成 `config.maxTokens ?? null` —— 那样会让 architect 的 per-call
|
|
45
|
-
// 16384 被用户 config.maxTokens=8192 自动裁剪,基础设定输出会被截断。
|
|
46
|
-
maxTokensCap: config.maxTokensCap ?? null,
|
|
52
|
+
maxTokens: _earlyCard?.maxOutput ?? UNKNOWN_MODEL_FALLBACK_MAX_TOKENS,
|
|
47
53
|
thinkingBudget: config.thinkingBudget ?? 0,
|
|
48
54
|
extra: config.extra ?? {},
|
|
49
55
|
};
|
|
@@ -52,22 +58,47 @@ export function createLLMClient(config) {
|
|
|
52
58
|
// --- Build pi-ai Model object ---
|
|
53
59
|
const serviceName = config.service ?? "custom";
|
|
54
60
|
const preset = resolveServicePreset(serviceName);
|
|
55
|
-
const
|
|
56
|
-
const
|
|
61
|
+
const inkosProvider = getEndpoint(serviceName);
|
|
62
|
+
const modelCard = lookupModel(serviceName, config.model);
|
|
63
|
+
const piApi = resolvePiApi(serviceName, config.apiFormat, (inkosProvider?.api ?? preset?.api));
|
|
64
|
+
const baseUrl = config.baseUrl || inkosProvider?.baseUrl || preset?.baseUrl || "";
|
|
57
65
|
const extraHeaders = config.headers ?? parseEnvHeaders();
|
|
66
|
+
const compat = piApi === "openai-completions"
|
|
67
|
+
? resolveProviderCompat(inkosProvider, baseUrl)
|
|
68
|
+
: undefined;
|
|
58
69
|
const provider = config.provider === "anthropic" ? "anthropic" : "openai";
|
|
70
|
+
// pi-ai provider 字段:大多数情况 pi-ai 会按 baseUrl 自动嗅探(openrouter.ai / api.z.ai /
|
|
71
|
+
// api.x.ai / deepseek.com / anthropic.com 等)。这里只列 pi-ai 嗅探不到、需要显式指定的少数情况。
|
|
72
|
+
let piProvider;
|
|
73
|
+
if (inkosProvider?.id === "google")
|
|
74
|
+
piProvider = "google";
|
|
75
|
+
else if (inkosProvider?.id === "zhipu")
|
|
76
|
+
piProvider = "zai";
|
|
77
|
+
else if (inkosProvider?.id === "openrouter")
|
|
78
|
+
piProvider = "openrouter";
|
|
79
|
+
else if (inkosProvider?.id === "githubCopilot")
|
|
80
|
+
piProvider = "githubCopilot";
|
|
81
|
+
else if (inkosProvider?.api === "anthropic-messages")
|
|
82
|
+
piProvider = "anthropic";
|
|
83
|
+
else
|
|
84
|
+
piProvider = provider;
|
|
59
85
|
const piModel = {
|
|
60
|
-
id: config.model,
|
|
86
|
+
id: modelCard?.deploymentName ?? config.model,
|
|
61
87
|
name: config.model,
|
|
62
88
|
api: piApi,
|
|
63
|
-
provider,
|
|
89
|
+
provider: piProvider,
|
|
64
90
|
baseUrl,
|
|
91
|
+
// 注意:piModel.reasoning 是"激活 reasoning 模式"标志(会让 pi-ai 把 system 改成 developer role 等),
|
|
92
|
+
// 不是"模型能力"标签。只有用户显式配了 thinkingBudget > 0 才启用 reasoning mode。
|
|
93
|
+
// 千万不要从 lobe abilities.reasoning 自动推导,否则 Moonshot 这类不支持 developer role 的服务
|
|
94
|
+
// 会把 content 吃掉,只返回 reasoning_content(见 R4 bug 1 诊断)。
|
|
65
95
|
reasoning: (config.thinkingBudget ?? 0) > 0,
|
|
66
96
|
input: ["text"],
|
|
67
97
|
cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
|
|
68
|
-
contextWindow: 128_000,
|
|
69
|
-
maxTokens:
|
|
98
|
+
contextWindow: modelCard?.contextWindowTokens ?? 128_000,
|
|
99
|
+
maxTokens: modelCard?.maxOutput ?? UNKNOWN_MODEL_FALLBACK_MAX_TOKENS,
|
|
70
100
|
...(extraHeaders ? { headers: extraHeaders } : {}),
|
|
101
|
+
...(compat ? { compat } : {}),
|
|
71
102
|
};
|
|
72
103
|
return {
|
|
73
104
|
provider,
|
|
@@ -75,6 +106,7 @@ export function createLLMClient(config) {
|
|
|
75
106
|
configSource: config.configSource,
|
|
76
107
|
apiFormat,
|
|
77
108
|
stream,
|
|
109
|
+
proxyUrl: config.proxyUrl,
|
|
78
110
|
_piModel: piModel,
|
|
79
111
|
_apiKey: config.apiKey,
|
|
80
112
|
defaults,
|
|
@@ -86,6 +118,13 @@ function resolvePiApi(serviceName, apiFormat, presetApi) {
|
|
|
86
118
|
}
|
|
87
119
|
return (presetApi ?? "openai-completions");
|
|
88
120
|
}
|
|
121
|
+
function resolveProviderCompat(provider, baseUrl) {
|
|
122
|
+
const compat = {
|
|
123
|
+
...(provider?.compat ?? {}),
|
|
124
|
+
...(baseUrl.includes("generativelanguage.googleapis.com") ? { supportsStore: false } : {}),
|
|
125
|
+
};
|
|
126
|
+
return Object.keys(compat).length > 0 ? compat : undefined;
|
|
127
|
+
}
|
|
89
128
|
function parseEnvHeaders() {
|
|
90
129
|
const raw = process.env.INKOS_LLM_HEADERS;
|
|
91
130
|
if (!raw)
|
|
@@ -128,27 +167,28 @@ function stripReservedKeys(extra) {
|
|
|
128
167
|
}
|
|
129
168
|
// === Fixed-Temperature Model Clamp ===
|
|
130
169
|
//
|
|
131
|
-
// 部分 thinking 模型(如 Moonshot kimi-k2.5、kimi-thinking
|
|
132
|
-
// temperature === 1
|
|
133
|
-
//
|
|
134
|
-
//
|
|
135
|
-
//
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
}
|
|
170
|
+
// 部分 thinking 模型(如 Moonshot kimi-k2.5/k2.6、kimi-k2-thinking)的 API
|
|
171
|
+
// 硬要求 temperature === 1,其他值会被直接 400 拒绝(Moonshot 返回
|
|
172
|
+
// `invalid temperature: only 1 is allowed for this model`)。
|
|
173
|
+
//
|
|
174
|
+
// inkos 让 writer/validator/architect 各自带 per-call 温度(0.1~1.5),
|
|
175
|
+
// 所以 provider 层统一夹制:如果 bank 里模型卡标了 temperature 字段,
|
|
176
|
+
// 就把 per-call 温度 clamp 到那个值,并对每个模型名打一次 warning。
|
|
177
|
+
//
|
|
178
|
+
// 这个字段只表达"服务端硬约束",普通模型不要标,避免误伤 per-call 调参。
|
|
141
179
|
const warnedFixedTemperatureModels = new Set();
|
|
142
|
-
function clampTemperatureForModel(model, requested) {
|
|
143
|
-
|
|
180
|
+
function clampTemperatureForModel(service, model, requested) {
|
|
181
|
+
const card = service ? lookupModel(service, model) : undefined;
|
|
182
|
+
if (card?.temperature === undefined)
|
|
144
183
|
return requested;
|
|
145
|
-
|
|
146
|
-
|
|
184
|
+
const locked = card.temperature;
|
|
185
|
+
if (requested === locked)
|
|
186
|
+
return locked;
|
|
147
187
|
if (!warnedFixedTemperatureModels.has(model)) {
|
|
148
188
|
warnedFixedTemperatureModels.add(model);
|
|
149
|
-
console.warn(`[inkos] 模型 "${model}"
|
|
189
|
+
console.warn(`[inkos] 模型 "${model}" API 要求 temperature=${locked},已 clamp(原值 ${requested})`);
|
|
150
190
|
}
|
|
151
|
-
return
|
|
191
|
+
return locked;
|
|
152
192
|
}
|
|
153
193
|
// 仅测试用:清空 warning 去重集合。
|
|
154
194
|
export function __resetFixedTemperatureWarnings() {
|
|
@@ -161,11 +201,24 @@ function wrapLLMError(error, context) {
|
|
|
161
201
|
? `\n (baseUrl: ${context.baseUrl}, model: ${context.model})`
|
|
162
202
|
: "";
|
|
163
203
|
if (msg.includes("400")) {
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
204
|
+
// 抽上游 error body 的 message / reason / code(和下方 5xx 一致),让真实错因浮到用户面前
|
|
205
|
+
let detail = "";
|
|
206
|
+
if (error && typeof error === "object") {
|
|
207
|
+
const err = error;
|
|
208
|
+
const bodyLike = err.error ?? err.body;
|
|
209
|
+
if (bodyLike && typeof bodyLike === "object") {
|
|
210
|
+
const b = bodyLike;
|
|
211
|
+
if (b.message)
|
|
212
|
+
detail = b.type ? `${b.type}: ${b.message}` : b.message;
|
|
213
|
+
else if (b.reason)
|
|
214
|
+
detail = b.reason;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
return new Error(`API 返回 400(请求参数错误)。${detail ? `上游详情:${detail}。\n` : ""}` +
|
|
218
|
+
`常见原因:\n` +
|
|
219
|
+
` 1. temperature / max_tokens 超出模型约束(如 Moonshot kimi-k2.X 强制 temperature=1)\n` +
|
|
220
|
+
` 2. 模型名称不正确或未上架\n` +
|
|
221
|
+
` 3. 消息格式不兼容(部分服务不支持 system role 或 developer role)${ctxLine}`);
|
|
169
222
|
}
|
|
170
223
|
if (msg.includes("403")) {
|
|
171
224
|
return new Error(`API 返回 403 (请求被拒绝)。可能原因:\n` +
|
|
@@ -180,15 +233,99 @@ function wrapLLMError(error, context) {
|
|
|
180
233
|
if (msg.includes("429")) {
|
|
181
234
|
return new Error(`API 返回 429 (请求过多)。请稍后重试,或检查 API 配额。${ctxLine}`);
|
|
182
235
|
}
|
|
183
|
-
if (msg.includes("Connection error")
|
|
236
|
+
if (msg.includes("Connection error")
|
|
237
|
+
|| msg.includes("ECONNREFUSED")
|
|
238
|
+
|| msg.includes("ENOTFOUND")
|
|
239
|
+
|| msg.includes("fetch failed")
|
|
240
|
+
|| msg.includes("terminated")
|
|
241
|
+
|| msg.includes("UND_ERR_SOCKET")
|
|
242
|
+
|| msg.includes("ECONNRESET")
|
|
243
|
+
|| msg.includes("ETIMEDOUT")
|
|
244
|
+
|| msg.includes("EPIPE")) {
|
|
184
245
|
return new Error(`无法连接到 API 服务。可能原因:\n` +
|
|
185
246
|
` 1. baseUrl 地址不正确(当前:${context?.baseUrl ?? "未知"})\n` +
|
|
186
247
|
` 2. 网络不通或被防火墙拦截\n` +
|
|
187
248
|
` 3. API 服务暂时不可用\n` +
|
|
188
249
|
` 建议:检查 INKOS_LLM_BASE_URL 是否包含完整路径(如 /v1)`);
|
|
189
250
|
}
|
|
251
|
+
// R4 Bug 2: 5xx "status code (no body)" — 尝试从 OpenAI SDK APIError 里抽 body 给用户看具体原因
|
|
252
|
+
// (如 PPIO 的 {"code":500,"reason":"MODEL_NOT_AVAILABLE","message":"model not available"})
|
|
253
|
+
if (msg.includes("status code") && msg.includes("no body")) {
|
|
254
|
+
let detail = "";
|
|
255
|
+
if (error && typeof error === "object") {
|
|
256
|
+
const err = error;
|
|
257
|
+
const bodyLike = err.error ?? err.body;
|
|
258
|
+
if (bodyLike && typeof bodyLike === "object") {
|
|
259
|
+
const b = bodyLike;
|
|
260
|
+
if (b.reason)
|
|
261
|
+
detail = `${b.reason}${b.message ? `: ${b.message}` : ""}`;
|
|
262
|
+
else if (b.message)
|
|
263
|
+
detail = b.message;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
return new Error(`API 返回 5xx(上游服务异常)。${detail ? `上游详情:${detail}。` : ""}\n` +
|
|
267
|
+
`可能原因:\n` +
|
|
268
|
+
` 1. 模型在 /models 列表但 inference 未上架(如 PPIO 返回 MODEL_NOT_AVAILABLE)\n` +
|
|
269
|
+
` 2. 服务端临时故障,稍后重试\n` +
|
|
270
|
+
` 3. 当前 apikey 无权限调用该模型${ctxLine}`);
|
|
271
|
+
}
|
|
190
272
|
return error instanceof Error ? error : new Error(msg);
|
|
191
273
|
}
|
|
274
|
+
function collectErrorText(error, depth = 0) {
|
|
275
|
+
if (depth > 4 || error === null || error === undefined)
|
|
276
|
+
return "";
|
|
277
|
+
const parts = [String(error)];
|
|
278
|
+
if (error instanceof Error) {
|
|
279
|
+
parts.push(error.name, error.message);
|
|
280
|
+
const cause = error.cause;
|
|
281
|
+
if (cause)
|
|
282
|
+
parts.push(collectErrorText(cause, depth + 1));
|
|
283
|
+
}
|
|
284
|
+
else if (typeof error === "object") {
|
|
285
|
+
const err = error;
|
|
286
|
+
if (err.name)
|
|
287
|
+
parts.push(String(err.name));
|
|
288
|
+
if (err.message)
|
|
289
|
+
parts.push(String(err.message));
|
|
290
|
+
if (err.code)
|
|
291
|
+
parts.push(String(err.code));
|
|
292
|
+
if (err.cause)
|
|
293
|
+
parts.push(collectErrorText(err.cause, depth + 1));
|
|
294
|
+
}
|
|
295
|
+
return parts.join("\n");
|
|
296
|
+
}
|
|
297
|
+
function isTransientLLMTransportError(error) {
|
|
298
|
+
const text = collectErrorText(error);
|
|
299
|
+
return [
|
|
300
|
+
"terminated",
|
|
301
|
+
"UND_ERR_SOCKET",
|
|
302
|
+
"ECONNRESET",
|
|
303
|
+
"ETIMEDOUT",
|
|
304
|
+
"EPIPE",
|
|
305
|
+
"socket hang up",
|
|
306
|
+
"other side closed",
|
|
307
|
+
"network socket disconnected",
|
|
308
|
+
].some((needle) => text.includes(needle));
|
|
309
|
+
}
|
|
310
|
+
async function withTransientLLMRetry(run, options) {
|
|
311
|
+
const enabled = options?.enabled ?? true;
|
|
312
|
+
let lastError;
|
|
313
|
+
for (let attempt = 0; attempt <= TRANSIENT_LLM_RETRIES; attempt++) {
|
|
314
|
+
try {
|
|
315
|
+
return await run();
|
|
316
|
+
}
|
|
317
|
+
catch (error) {
|
|
318
|
+
lastError = error;
|
|
319
|
+
if (!enabled
|
|
320
|
+
|| attempt >= TRANSIENT_LLM_RETRIES
|
|
321
|
+
|| error instanceof PartialResponseError
|
|
322
|
+
|| !isTransientLLMTransportError(error)) {
|
|
323
|
+
throw error;
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
throw lastError;
|
|
328
|
+
}
|
|
192
329
|
function shouldUseNativeCustomTransport(client) {
|
|
193
330
|
return client.configSource === "studio"
|
|
194
331
|
&& client.service === "custom"
|
|
@@ -231,6 +368,35 @@ function buildResponsesInput(messages) {
|
|
|
231
368
|
content: [{ type: "input_text", text: message.content }],
|
|
232
369
|
}));
|
|
233
370
|
}
|
|
371
|
+
function hasSystemMessages(messages) {
|
|
372
|
+
return messages.some((message) => message.role === "system" && message.content.trim().length > 0);
|
|
373
|
+
}
|
|
374
|
+
function foldSystemMessagesIntoFirstUser(messages) {
|
|
375
|
+
const system = joinSystemPrompt(messages);
|
|
376
|
+
const nonSystemMessages = messages.filter((message) => message.role !== "system");
|
|
377
|
+
if (!system)
|
|
378
|
+
return [...nonSystemMessages];
|
|
379
|
+
const firstUserIndex = nonSystemMessages.findIndex((message) => message.role === "user");
|
|
380
|
+
const prefix = `System instructions:\n${system}\n\nUser request:\n`;
|
|
381
|
+
if (firstUserIndex < 0) {
|
|
382
|
+
return [{ role: "user", content: `System instructions:\n${system}` }, ...nonSystemMessages];
|
|
383
|
+
}
|
|
384
|
+
return nonSystemMessages.map((message, index) => index === firstUserIndex
|
|
385
|
+
? { ...message, content: `${prefix}${message.content}` }
|
|
386
|
+
: message);
|
|
387
|
+
}
|
|
388
|
+
function isSystemRoleUnsupportedErrorText(text) {
|
|
389
|
+
const normalized = text.toLowerCase();
|
|
390
|
+
const mentionsSystemRole = normalized.includes("system") && normalized.includes("role");
|
|
391
|
+
if (!mentionsSystemRole)
|
|
392
|
+
return false;
|
|
393
|
+
return normalized.includes("unsupported")
|
|
394
|
+
|| normalized.includes("not support")
|
|
395
|
+
|| normalized.includes("does not support")
|
|
396
|
+
|| normalized.includes("invalid")
|
|
397
|
+
|| normalized.includes("不支持")
|
|
398
|
+
|| normalized.includes("不允许");
|
|
399
|
+
}
|
|
234
400
|
async function readErrorResponse(res) {
|
|
235
401
|
const text = await res.text().catch(() => "");
|
|
236
402
|
try {
|
|
@@ -273,17 +439,26 @@ function parseSseEvents(buffer) {
|
|
|
273
439
|
}
|
|
274
440
|
return { events, rest };
|
|
275
441
|
}
|
|
276
|
-
function
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
return content
|
|
442
|
+
function extractOpenAITextPart(value) {
|
|
443
|
+
if (typeof value === "string")
|
|
444
|
+
return value;
|
|
445
|
+
if (Array.isArray(value)) {
|
|
446
|
+
return value
|
|
282
447
|
.map((item) => typeof item?.text === "string" ? item.text : typeof item?.content === "string" ? item.content : "")
|
|
283
448
|
.join("");
|
|
284
449
|
}
|
|
285
450
|
return "";
|
|
286
451
|
}
|
|
452
|
+
function extractChatContent(json) {
|
|
453
|
+
const message = json?.choices?.[0]?.message;
|
|
454
|
+
return extractOpenAITextPart(message?.content) || extractOpenAITextPart(message?.reasoning_content);
|
|
455
|
+
}
|
|
456
|
+
function extractChatDeltaContent(json) {
|
|
457
|
+
return extractOpenAITextPart(json?.choices?.[0]?.delta?.content);
|
|
458
|
+
}
|
|
459
|
+
function extractChatDeltaReasoningContent(json) {
|
|
460
|
+
return extractOpenAITextPart(json?.choices?.[0]?.delta?.reasoning_content);
|
|
461
|
+
}
|
|
287
462
|
function extractResponsesContent(json) {
|
|
288
463
|
const output = Array.isArray(json?.output) ? json.output : [];
|
|
289
464
|
return output
|
|
@@ -321,9 +496,10 @@ async function chatCompletionViaCustomAnthropicCompatible(client, model, message
|
|
|
321
496
|
const system = joinSystemPrompt(messages);
|
|
322
497
|
if (system)
|
|
323
498
|
payload.system = system;
|
|
324
|
-
const response = await
|
|
499
|
+
const response = await fetchWithProxy(`${baseUrl.replace(/\/$/, "")}/messages`, {
|
|
325
500
|
method: "POST",
|
|
326
501
|
headers: {
|
|
502
|
+
"User-Agent": INKOS_USER_AGENT,
|
|
327
503
|
"x-api-key": client._apiKey ?? "",
|
|
328
504
|
"anthropic-version": "2023-06-01",
|
|
329
505
|
"Content-Type": "application/json",
|
|
@@ -331,7 +507,7 @@ async function chatCompletionViaCustomAnthropicCompatible(client, model, message
|
|
|
331
507
|
...(client._piModel?.headers ?? {}),
|
|
332
508
|
},
|
|
333
509
|
body: JSON.stringify(payload),
|
|
334
|
-
});
|
|
510
|
+
}, client.proxyUrl);
|
|
335
511
|
if (!response.ok) {
|
|
336
512
|
throw wrapLLMError(new Error(await readErrorResponse(response)), errorCtx);
|
|
337
513
|
}
|
|
@@ -397,7 +573,7 @@ async function chatCompletionViaCustomAnthropicCompatible(client, model, message
|
|
|
397
573
|
}
|
|
398
574
|
return { content, usage };
|
|
399
575
|
}
|
|
400
|
-
async function chatCompletionViaCustomOpenAICompatible(client, model, messages, resolved, onStreamProgress, onTextDelta) {
|
|
576
|
+
async function chatCompletionViaCustomOpenAICompatible(client, model, messages, resolved, onStreamProgress, onTextDelta, allowSystemRoleFallback = true) {
|
|
401
577
|
if (client.provider === "anthropic") {
|
|
402
578
|
return chatCompletionViaCustomAnthropicCompatible(client, model, messages, resolved, onStreamProgress, onTextDelta);
|
|
403
579
|
}
|
|
@@ -419,11 +595,11 @@ async function chatCompletionViaCustomOpenAICompatible(client, model, messages,
|
|
|
419
595
|
const instructions = joinSystemPrompt(messages);
|
|
420
596
|
if (instructions)
|
|
421
597
|
payload.instructions = instructions;
|
|
422
|
-
const response = await
|
|
598
|
+
const response = await fetchWithProxy(`${baseUrl.replace(/\/$/, "")}/responses`, {
|
|
423
599
|
method: "POST",
|
|
424
600
|
headers,
|
|
425
601
|
body: JSON.stringify(payload),
|
|
426
|
-
});
|
|
602
|
+
}, client.proxyUrl);
|
|
427
603
|
if (!response.ok) {
|
|
428
604
|
throw wrapLLMError(new Error(await readErrorResponse(response)), errorCtx);
|
|
429
605
|
}
|
|
@@ -503,13 +679,17 @@ async function chatCompletionViaCustomOpenAICompatible(client, model, messages,
|
|
|
503
679
|
if (client.stream) {
|
|
504
680
|
payload.stream_options = { include_usage: true };
|
|
505
681
|
}
|
|
506
|
-
const response = await
|
|
682
|
+
const response = await fetchWithProxy(`${baseUrl.replace(/\/$/, "")}/chat/completions`, {
|
|
507
683
|
method: "POST",
|
|
508
684
|
headers,
|
|
509
685
|
body: JSON.stringify(payload),
|
|
510
|
-
});
|
|
686
|
+
}, client.proxyUrl);
|
|
511
687
|
if (!response.ok) {
|
|
512
|
-
|
|
688
|
+
const detail = await readErrorResponse(response);
|
|
689
|
+
if (allowSystemRoleFallback && hasSystemMessages(messages) && isSystemRoleUnsupportedErrorText(detail)) {
|
|
690
|
+
return chatCompletionViaCustomOpenAICompatible(client, model, foldSystemMessagesIntoFirstUser(messages), resolved, onStreamProgress, onTextDelta, false);
|
|
691
|
+
}
|
|
692
|
+
throw wrapLLMError(new Error(detail), errorCtx);
|
|
513
693
|
}
|
|
514
694
|
if (!client.stream) {
|
|
515
695
|
const json = await response.json();
|
|
@@ -532,6 +712,7 @@ async function chatCompletionViaCustomOpenAICompatible(client, model, messages,
|
|
|
532
712
|
const decoder = new TextDecoder();
|
|
533
713
|
let buffer = "";
|
|
534
714
|
let content = "";
|
|
715
|
+
let reasoningContent = "";
|
|
535
716
|
let usage = { promptTokens: 0, completionTokens: 0, totalTokens: 0 };
|
|
536
717
|
try {
|
|
537
718
|
while (true) {
|
|
@@ -545,12 +726,19 @@ async function chatCompletionViaCustomOpenAICompatible(client, model, messages,
|
|
|
545
726
|
if (!event.data || event.data === "[DONE]")
|
|
546
727
|
continue;
|
|
547
728
|
const json = JSON.parse(event.data);
|
|
548
|
-
const delta = json
|
|
549
|
-
if (
|
|
729
|
+
const delta = extractChatDeltaContent(json);
|
|
730
|
+
if (delta) {
|
|
550
731
|
content += delta;
|
|
551
732
|
monitor.onChunk(delta);
|
|
552
733
|
onTextDelta?.(delta);
|
|
553
734
|
}
|
|
735
|
+
else {
|
|
736
|
+
const reasoningDelta = extractChatDeltaReasoningContent(json);
|
|
737
|
+
if (reasoningDelta) {
|
|
738
|
+
reasoningContent += reasoningDelta;
|
|
739
|
+
monitor.onChunk(reasoningDelta);
|
|
740
|
+
}
|
|
741
|
+
}
|
|
554
742
|
if (json?.usage) {
|
|
555
743
|
usage = {
|
|
556
744
|
promptTokens: json.usage.prompt_tokens ?? usage.promptTokens,
|
|
@@ -564,28 +752,32 @@ async function chatCompletionViaCustomOpenAICompatible(client, model, messages,
|
|
|
564
752
|
finally {
|
|
565
753
|
monitor.stop();
|
|
566
754
|
}
|
|
567
|
-
|
|
755
|
+
const finalContent = content || reasoningContent;
|
|
756
|
+
if (!finalContent) {
|
|
568
757
|
throw wrapLLMError(new Error("LLM returned empty response from stream"), errorCtx);
|
|
569
758
|
}
|
|
570
|
-
return { content, usage };
|
|
759
|
+
return { content: finalContent, usage };
|
|
571
760
|
}
|
|
572
761
|
// === Simple Chat (used by all agents via BaseAgent.chat()) ===
|
|
573
762
|
export async function chatCompletion(client, model, messages, options) {
|
|
574
|
-
|
|
575
|
-
const cap = client.defaults.maxTokensCap;
|
|
763
|
+
// C1 (v2.0.0):删除 maxTokensCap 机制。per-call 显式传的 maxTokens 永远不被裁剪。
|
|
576
764
|
const resolved = {
|
|
577
|
-
temperature: clampTemperatureForModel(model, options?.temperature ?? client.defaults.temperature),
|
|
578
|
-
maxTokens:
|
|
765
|
+
temperature: clampTemperatureForModel(client.service, model, options?.temperature ?? client.defaults.temperature),
|
|
766
|
+
maxTokens: options?.maxTokens ?? client.defaults.maxTokens,
|
|
579
767
|
extra: client.defaults.extra,
|
|
580
768
|
};
|
|
581
769
|
const onStreamProgress = options?.onStreamProgress;
|
|
582
770
|
const onTextDelta = options?.onTextDelta;
|
|
583
771
|
const errorCtx = { baseUrl: client._piModel?.baseUrl ?? "(unknown)", model };
|
|
584
772
|
try {
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
773
|
+
return await withTransientLLMRetry(async () => {
|
|
774
|
+
if (shouldUseNativeCustomTransport(client)) {
|
|
775
|
+
return chatCompletionViaCustomOpenAICompatible(client, model, messages, resolved, onStreamProgress, onTextDelta);
|
|
776
|
+
}
|
|
777
|
+
return chatCompletionViaPiAi(client, model, messages, resolved, onStreamProgress, onTextDelta);
|
|
778
|
+
},
|
|
779
|
+
// Retrying after UI text deltas have been emitted can duplicate visible text.
|
|
780
|
+
{ enabled: !onTextDelta });
|
|
589
781
|
}
|
|
590
782
|
catch (error) {
|
|
591
783
|
// Stream interrupted but partial content is usable — return truncated response
|
|
@@ -602,7 +794,7 @@ export async function chatCompletion(client, model, messages, options) {
|
|
|
602
794
|
export async function chatWithTools(client, model, messages, tools, options) {
|
|
603
795
|
try {
|
|
604
796
|
const resolved = {
|
|
605
|
-
temperature: clampTemperatureForModel(model, options?.temperature ?? client.defaults.temperature),
|
|
797
|
+
temperature: clampTemperatureForModel(client.service, model, options?.temperature ?? client.defaults.temperature),
|
|
606
798
|
maxTokens: options?.maxTokens ?? client.defaults.maxTokens,
|
|
607
799
|
};
|
|
608
800
|
return await chatWithToolsViaPiAi(client, model, messages, tools, resolved);
|
|
@@ -716,7 +908,7 @@ async function chatCompletionViaPiAi(client, model, messages, resolved, onStream
|
|
|
716
908
|
temperature: resolved.temperature,
|
|
717
909
|
maxTokens: resolved.maxTokens,
|
|
718
910
|
apiKey: client._apiKey,
|
|
719
|
-
headers: piModel.headers,
|
|
911
|
+
headers: mergeUserAgent(piModel.headers),
|
|
720
912
|
};
|
|
721
913
|
if (!client.stream) {
|
|
722
914
|
const response = await piCompleteSimple(piModel, context, streamOpts);
|
|
@@ -803,7 +995,7 @@ async function chatWithToolsViaPiAi(client, model, messages, tools, resolved) {
|
|
|
803
995
|
temperature: resolved.temperature,
|
|
804
996
|
maxTokens: resolved.maxTokens,
|
|
805
997
|
apiKey: client._apiKey,
|
|
806
|
-
headers: piModel.headers,
|
|
998
|
+
headers: mergeUserAgent(piModel.headers),
|
|
807
999
|
};
|
|
808
1000
|
if (!client.stream) {
|
|
809
1001
|
const response = await piComplete(piModel, context, streamOpts);
|