@renxqoo/renx-code 0.0.4 → 0.0.6

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.
Files changed (210) hide show
  1. package/README.md +82 -51
  2. package/bin/renx.cjs +16 -0
  3. package/package.json +2 -45
  4. package/src/agent/runtime/runtime.context-usage.test.ts +4 -5
  5. package/src/agent/runtime/runtime.error-handling.test.ts +4 -5
  6. package/src/agent/runtime/runtime.test.ts +7 -4
  7. package/src/agent/runtime/runtime.ts +3 -9
  8. package/src/agent/runtime/runtime.usage-forwarding.test.ts +4 -5
  9. package/src/agent/runtime/source-modules.test.ts +16 -35
  10. package/src/agent/runtime/source-modules.ts +17 -0
  11. package/vendor/agent-root/src/agent/ENTERPRISE_ACCEPTANCE_CHECKLIST.md +95 -0
  12. package/vendor/agent-root/src/agent/ENTERPRISE_REALTIME.html +1345 -0
  13. package/vendor/agent-root/src/agent/ENTERPRISE_REALTIME.md +1353 -0
  14. package/vendor/agent-root/src/agent/ERROR_CONTRACT.md +60 -0
  15. package/vendor/agent-root/src/agent/TEST_COVERAGE_ANALYSIS.md +278 -0
  16. package/vendor/agent-root/src/agent/__test__/error-contract.test.ts +72 -0
  17. package/vendor/agent-root/src/agent/__test__/types.test.ts +137 -0
  18. package/vendor/agent-root/src/agent/agent/__test__/abort-runtime.test.ts +83 -0
  19. package/vendor/agent-root/src/agent/agent/__test__/callback-safety.test.ts +34 -0
  20. package/vendor/agent-root/src/agent/agent/__test__/compaction.test.ts +323 -0
  21. package/vendor/agent-root/src/agent/agent/__test__/concurrency.test.ts +290 -0
  22. package/vendor/agent-root/src/agent/agent/__test__/error-normalizer.test.ts +377 -0
  23. package/vendor/agent-root/src/agent/agent/__test__/error.test.ts +212 -0
  24. package/vendor/agent-root/src/agent/agent/__test__/fault-injection.test.ts +295 -0
  25. package/vendor/agent-root/src/agent/agent/__test__/index.test.ts +3607 -0
  26. package/vendor/agent-root/src/agent/agent/__test__/logger.test.ts +35 -0
  27. package/vendor/agent-root/src/agent/agent/__test__/message-utils.test.ts +517 -0
  28. package/vendor/agent-root/src/agent/agent/__test__/telemetry.test.ts +97 -0
  29. package/vendor/agent-root/src/agent/agent/__test__/timeout-budget.test.ts +479 -0
  30. package/vendor/agent-root/src/agent/agent/__test__/tool-call-merge.test.ts +80 -0
  31. package/vendor/agent-root/src/agent/agent/__test__/tool-execution-ledger.test.ts +76 -0
  32. package/vendor/agent-root/src/agent/agent/__test__/write-buffer.test.ts +173 -0
  33. package/vendor/agent-root/src/agent/agent/__test__/write-file-session.test.ts +109 -0
  34. package/vendor/agent-root/src/agent/agent/abort-runtime.ts +71 -0
  35. package/vendor/agent-root/src/agent/agent/callback-safety.ts +33 -0
  36. package/vendor/agent-root/src/agent/agent/compaction.ts +291 -0
  37. package/vendor/agent-root/src/agent/agent/concurrency.ts +103 -0
  38. package/vendor/agent-root/src/agent/agent/error-normalizer.ts +190 -0
  39. package/vendor/agent-root/src/agent/agent/error.ts +198 -0
  40. package/vendor/agent-root/src/agent/agent/index.ts +1772 -0
  41. package/vendor/agent-root/src/agent/agent/logger.ts +65 -0
  42. package/vendor/agent-root/src/agent/agent/message-utils.ts +101 -0
  43. package/vendor/agent-root/src/agent/agent/stream-events.ts +61 -0
  44. package/vendor/agent-root/src/agent/agent/telemetry.ts +123 -0
  45. package/vendor/agent-root/src/agent/agent/timeout-budget.ts +227 -0
  46. package/vendor/agent-root/src/agent/agent/tool-call-merge.ts +111 -0
  47. package/vendor/agent-root/src/agent/agent/tool-execution-ledger.ts +164 -0
  48. package/vendor/agent-root/src/agent/agent/write-buffer.ts +188 -0
  49. package/vendor/agent-root/src/agent/agent/write-file-session.ts +238 -0
  50. package/vendor/agent-root/src/agent/app/__test__/agent-app-service.test.ts +1053 -0
  51. package/vendor/agent-root/src/agent/app/__test__/minimal-agent-application.test.ts +158 -0
  52. package/vendor/agent-root/src/agent/app/__test__/sqlite-agent-app-store.test.ts +437 -0
  53. package/vendor/agent-root/src/agent/app/agent-app-service.ts +748 -0
  54. package/vendor/agent-root/src/agent/app/contracts.ts +109 -0
  55. package/vendor/agent-root/src/agent/app/index.ts +5 -0
  56. package/vendor/agent-root/src/agent/app/minimal-agent-application.ts +151 -0
  57. package/vendor/agent-root/src/agent/app/ports.ts +72 -0
  58. package/vendor/agent-root/src/agent/app/sqlite-agent-app-store.ts +1182 -0
  59. package/vendor/agent-root/src/agent/app/sqlite-client.ts +177 -0
  60. package/vendor/agent-root/src/agent/docs/cli-app-layer/00-README.md +36 -0
  61. package/vendor/agent-root/src/agent/docs/cli-app-layer/01-scope-and-goals.md +33 -0
  62. package/vendor/agent-root/src/agent/docs/cli-app-layer/02-architecture-overview.md +40 -0
  63. package/vendor/agent-root/src/agent/docs/cli-app-layer/03-domain-model-and-contracts.md +91 -0
  64. package/vendor/agent-root/src/agent/docs/cli-app-layer/04-ports-and-interfaces.md +116 -0
  65. package/vendor/agent-root/src/agent/docs/cli-app-layer/05-run-orchestration-and-state-machine.md +52 -0
  66. package/vendor/agent-root/src/agent/docs/cli-app-layer/06-cli-commands-and-ux.md +53 -0
  67. package/vendor/agent-root/src/agent/docs/cli-app-layer/07-storage-design-local.md +52 -0
  68. package/vendor/agent-root/src/agent/docs/cli-app-layer/08-error-and-observability.md +40 -0
  69. package/vendor/agent-root/src/agent/docs/cli-app-layer/09-security-and-policy-boundary.md +19 -0
  70. package/vendor/agent-root/src/agent/docs/cli-app-layer/10-test-plan-and-acceptance.md +28 -0
  71. package/vendor/agent-root/src/agent/docs/cli-app-layer/11-implementation-phases.md +26 -0
  72. package/vendor/agent-root/src/agent/docs/cli-app-layer/12-open-questions-and-risks.md +30 -0
  73. package/vendor/agent-root/src/agent/docs/cli-app-layer/13-sqlite-schema-fields-and-rationale.md +567 -0
  74. package/vendor/agent-root/src/agent/docs/cli-app-layer/14-project-flow-mermaid.md +583 -0
  75. package/vendor/agent-root/src/agent/docs/cli-app-layer/15-openclaw-style-project-blueprint.md +972 -0
  76. package/vendor/agent-root/src/agent/error-contract.ts +154 -0
  77. package/vendor/agent-root/src/agent/prompts/system.ts +246 -0
  78. package/vendor/agent-root/src/agent/prompts/system1.ts +208 -0
  79. package/vendor/agent-root/src/agent/storage/__test__/file-history-store.test.ts +98 -0
  80. package/vendor/agent-root/src/agent/storage/file-history-store.ts +313 -0
  81. package/vendor/agent-root/src/agent/storage/file-storage-config.ts +94 -0
  82. package/vendor/agent-root/src/agent/storage/file-system.ts +31 -0
  83. package/vendor/agent-root/src/agent/storage/file-write-service.ts +21 -0
  84. package/vendor/agent-root/src/agent/tool/__test__/base-tool.test.ts +413 -0
  85. package/vendor/agent-root/src/agent/tool/__test__/bash-policy.test.ts +356 -0
  86. package/vendor/agent-root/src/agent/tool/__test__/bash.mocked-coverage.test.ts +375 -0
  87. package/vendor/agent-root/src/agent/tool/__test__/bash.test.ts +372 -0
  88. package/vendor/agent-root/src/agent/tool/__test__/error.test.ts +108 -0
  89. package/vendor/agent-root/src/agent/tool/__test__/file-edit-tool.test.ts +258 -0
  90. package/vendor/agent-root/src/agent/tool/__test__/file-history-tools.test.ts +121 -0
  91. package/vendor/agent-root/src/agent/tool/__test__/file-read-tool.test.ts +210 -0
  92. package/vendor/agent-root/src/agent/tool/__test__/glob.test.ts +139 -0
  93. package/vendor/agent-root/src/agent/tool/__test__/grep.mocked-coverage.test.ts +456 -0
  94. package/vendor/agent-root/src/agent/tool/__test__/grep.test.ts +192 -0
  95. package/vendor/agent-root/src/agent/tool/__test__/lsp.test.ts +300 -0
  96. package/vendor/agent-root/src/agent/tool/__test__/outside-workspace-confirmation.test.ts +214 -0
  97. package/vendor/agent-root/src/agent/tool/__test__/path-security.test.ts +336 -0
  98. package/vendor/agent-root/src/agent/tool/__test__/skill-loader.test.ts +494 -0
  99. package/vendor/agent-root/src/agent/tool/__test__/skill-parser.test.ts +543 -0
  100. package/vendor/agent-root/src/agent/tool/__test__/skill-tool.test.ts +172 -0
  101. package/vendor/agent-root/src/agent/tool/__test__/task-concurrency-and-version.test.ts +116 -0
  102. package/vendor/agent-root/src/agent/tool/__test__/task-create-get-list-update.test.ts +267 -0
  103. package/vendor/agent-root/src/agent/tool/__test__/task-create.test.ts +519 -0
  104. package/vendor/agent-root/src/agent/tool/__test__/task-errors.test.ts +225 -0
  105. package/vendor/agent-root/src/agent/tool/__test__/task-output-blocking.test.ts +223 -0
  106. package/vendor/agent-root/src/agent/tool/__test__/task-output.test.ts +184 -0
  107. package/vendor/agent-root/src/agent/tool/__test__/task-parent-abort.test.ts +287 -0
  108. package/vendor/agent-root/src/agent/tool/__test__/task-real-runner-adapter.test.ts +190 -0
  109. package/vendor/agent-root/src/agent/tool/__test__/task-run-lifecycle.test.ts +352 -0
  110. package/vendor/agent-root/src/agent/tool/__test__/task-store-runner-branches.test.ts +395 -0
  111. package/vendor/agent-root/src/agent/tool/__test__/task-store.test.ts +391 -0
  112. package/vendor/agent-root/src/agent/tool/__test__/task-subagent-config-integration.test.ts +176 -0
  113. package/vendor/agent-root/src/agent/tool/__test__/task-subagent-config.test.ts +68 -0
  114. package/vendor/agent-root/src/agent/tool/__test__/task-tools-core-edges.test.ts +630 -0
  115. package/vendor/agent-root/src/agent/tool/__test__/task-tools-runtime-edges.test.ts +732 -0
  116. package/vendor/agent-root/src/agent/tool/__test__/task-types.test.ts +494 -0
  117. package/vendor/agent-root/src/agent/tool/__test__/task-utils-branches.test.ts +175 -0
  118. package/vendor/agent-root/src/agent/tool/__test__/tool-manager.test.ts +505 -0
  119. package/vendor/agent-root/src/agent/tool/__test__/types.test.ts +55 -0
  120. package/vendor/agent-root/src/agent/tool/__test__/web-fetch.test.ts +244 -0
  121. package/vendor/agent-root/src/agent/tool/__test__/web-search.test.ts +290 -0
  122. package/vendor/agent-root/src/agent/tool/__test__/write-file.test.ts +368 -0
  123. package/vendor/agent-root/src/agent/tool/base-tool.ts +345 -0
  124. package/vendor/agent-root/src/agent/tool/bash-policy.ts +636 -0
  125. package/vendor/agent-root/src/agent/tool/bash.ts +688 -0
  126. package/vendor/agent-root/src/agent/tool/error.ts +131 -0
  127. package/vendor/agent-root/src/agent/tool/file-edit-tool.ts +264 -0
  128. package/vendor/agent-root/src/agent/tool/file-history-list.ts +103 -0
  129. package/vendor/agent-root/src/agent/tool/file-history-restore.ts +149 -0
  130. package/vendor/agent-root/src/agent/tool/file-read-tool.ts +211 -0
  131. package/vendor/agent-root/src/agent/tool/glob.ts +171 -0
  132. package/vendor/agent-root/src/agent/tool/grep.ts +496 -0
  133. package/vendor/agent-root/src/agent/tool/lsp.ts +481 -0
  134. package/vendor/agent-root/src/agent/tool/path-security.ts +117 -0
  135. package/vendor/agent-root/src/agent/tool/search/common.ts +153 -0
  136. package/vendor/agent-root/src/agent/tool/skill/index.ts +13 -0
  137. package/vendor/agent-root/src/agent/tool/skill/loader.ts +229 -0
  138. package/vendor/agent-root/src/agent/tool/skill/parser.ts +124 -0
  139. package/vendor/agent-root/src/agent/tool/skill/types.ts +27 -0
  140. package/vendor/agent-root/src/agent/tool/skill-tool.ts +143 -0
  141. package/vendor/agent-root/src/agent/tool/task-create.ts +186 -0
  142. package/vendor/agent-root/src/agent/tool/task-errors.ts +42 -0
  143. package/vendor/agent-root/src/agent/tool/task-get.ts +116 -0
  144. package/vendor/agent-root/src/agent/tool/task-graph.ts +78 -0
  145. package/vendor/agent-root/src/agent/tool/task-list.ts +141 -0
  146. package/vendor/agent-root/src/agent/tool/task-mock-runner-adapter.ts +232 -0
  147. package/vendor/agent-root/src/agent/tool/task-output.ts +223 -0
  148. package/vendor/agent-root/src/agent/tool/task-parent-abort.ts +115 -0
  149. package/vendor/agent-root/src/agent/tool/task-real-runner-adapter.ts +336 -0
  150. package/vendor/agent-root/src/agent/tool/task-runner-adapter.ts +55 -0
  151. package/vendor/agent-root/src/agent/tool/task-stop.ts +187 -0
  152. package/vendor/agent-root/src/agent/tool/task-store.ts +217 -0
  153. package/vendor/agent-root/src/agent/tool/task-subagent-config.ts +149 -0
  154. package/vendor/agent-root/src/agent/tool/task-types.ts +264 -0
  155. package/vendor/agent-root/src/agent/tool/task-update.ts +315 -0
  156. package/vendor/agent-root/src/agent/tool/task.ts +209 -0
  157. package/vendor/agent-root/src/agent/tool/tool-manager.ts +362 -0
  158. package/vendor/agent-root/src/agent/tool/tool-prompts.ts +242 -0
  159. package/vendor/agent-root/src/agent/tool/types.ts +116 -0
  160. package/vendor/agent-root/src/agent/tool/web-fetch.ts +227 -0
  161. package/vendor/agent-root/src/agent/tool/web-search.ts +208 -0
  162. package/vendor/agent-root/src/agent/tool/write-file.ts +497 -0
  163. package/vendor/agent-root/src/agent/types.ts +232 -0
  164. package/vendor/agent-root/src/agent/utils/__tests__/index.test.ts +18 -0
  165. package/vendor/agent-root/src/agent/utils/__tests__/message-utils.test.ts +610 -0
  166. package/vendor/agent-root/src/agent/utils/__tests__/message.test.ts +223 -0
  167. package/vendor/agent-root/src/agent/utils/__tests__/token.test.ts +42 -0
  168. package/vendor/agent-root/src/agent/utils/index.ts +16 -0
  169. package/vendor/agent-root/src/agent/utils/message.ts +171 -0
  170. package/vendor/agent-root/src/agent/utils/token.ts +28 -0
  171. package/vendor/agent-root/src/config/__tests__/load-config-to-env.test.ts +129 -0
  172. package/vendor/agent-root/src/config/__tests__/loader.test.ts +247 -0
  173. package/vendor/agent-root/src/config/__tests__/runtime.test.ts +88 -0
  174. package/vendor/agent-root/src/config/index.ts +54 -0
  175. package/vendor/agent-root/src/config/loader.ts +431 -0
  176. package/vendor/agent-root/src/config/paths.ts +30 -0
  177. package/vendor/agent-root/src/config/runtime.ts +163 -0
  178. package/vendor/agent-root/src/config/types.ts +70 -0
  179. package/vendor/agent-root/src/logger/index.ts +57 -0
  180. package/vendor/agent-root/src/logger/logger.ts +819 -0
  181. package/vendor/agent-root/src/logger/types.ts +150 -0
  182. package/vendor/agent-root/src/providers/__tests__/errors.test.ts +441 -0
  183. package/vendor/agent-root/src/providers/__tests__/index.test.ts +16 -0
  184. package/vendor/agent-root/src/providers/__tests__/openai-compatible.options.test.ts +318 -0
  185. package/vendor/agent-root/src/providers/__tests__/openai-compatible.test.ts +600 -0
  186. package/vendor/agent-root/src/providers/__tests__/registry.test.ts +449 -0
  187. package/vendor/agent-root/src/providers/__tests__/responses-adapter.test.ts +298 -0
  188. package/vendor/agent-root/src/providers/adapters/__tests__/anthropic.test.ts +354 -0
  189. package/vendor/agent-root/src/providers/adapters/__tests__/kimi.test.ts +58 -0
  190. package/vendor/agent-root/src/providers/adapters/__tests__/standard.test.ts +261 -0
  191. package/vendor/agent-root/src/providers/adapters/anthropic.ts +572 -0
  192. package/vendor/agent-root/src/providers/adapters/base.ts +131 -0
  193. package/vendor/agent-root/src/providers/adapters/kimi.ts +48 -0
  194. package/vendor/agent-root/src/providers/adapters/responses.ts +732 -0
  195. package/vendor/agent-root/src/providers/adapters/standard.ts +120 -0
  196. package/vendor/agent-root/src/providers/http/__tests__/client.timeout.test.ts +313 -0
  197. package/vendor/agent-root/src/providers/http/client.ts +289 -0
  198. package/vendor/agent-root/src/providers/http/stream-parser.ts +109 -0
  199. package/vendor/agent-root/src/providers/index.ts +76 -0
  200. package/vendor/agent-root/src/providers/kimi-headers.ts +177 -0
  201. package/vendor/agent-root/src/providers/openai-compatible.ts +387 -0
  202. package/vendor/agent-root/src/providers/registry/model-config.ts +230 -0
  203. package/vendor/agent-root/src/providers/registry/provider-factory.ts +123 -0
  204. package/vendor/agent-root/src/providers/registry.ts +135 -0
  205. package/vendor/agent-root/src/providers/types/api.ts +284 -0
  206. package/vendor/agent-root/src/providers/types/config.ts +58 -0
  207. package/vendor/agent-root/src/providers/types/errors.ts +323 -0
  208. package/vendor/agent-root/src/providers/types/index.ts +72 -0
  209. package/vendor/agent-root/src/providers/types/provider.ts +45 -0
  210. package/vendor/agent-root/src/providers/types/registry.ts +88 -0
@@ -0,0 +1,123 @@
1
+ /**
2
+ * Provider 工厂
3
+ *
4
+ * 负责创建 Provider 实例,将创建逻辑从 Registry 中分离
5
+ */
6
+
7
+ import { StandardAdapter } from '../adapters/standard';
8
+ import { AnthropicAdapter } from '../adapters/anthropic';
9
+ import { OpenAICompatibleProvider, OpenAICompatibleConfig } from '../openai-compatible';
10
+ import type { BaseProviderConfig, ModelId } from '../types';
11
+ import type { BaseAPIAdapter } from '../adapters/base';
12
+ import { MODEL_DEFINITIONS } from './model-config';
13
+ import { KimiAdapter } from '../adapters/kimi';
14
+ import { ResponsesAdapter } from '../adapters/responses';
15
+
16
+ /**
17
+ * Provider 工厂类
18
+ */
19
+ export class ProviderFactory {
20
+ /**
21
+ * 从环境变量创建 Provider
22
+ *
23
+ * @param modelId 模型唯一标识
24
+ * @param overrides 可选的配置覆盖
25
+ * @returns OpenAI Compatible Provider 实例
26
+ */
27
+ static createFromEnv(
28
+ modelId: ModelId,
29
+ overrides?: Partial<OpenAICompatibleConfig>
30
+ ): OpenAICompatibleProvider {
31
+ if (!modelId) {
32
+ throw new Error('ModelId is required.');
33
+ }
34
+
35
+ const modelConfig = MODEL_DEFINITIONS[modelId];
36
+ if (!modelConfig) {
37
+ throw new Error(`Unknown model: ${modelId}`);
38
+ }
39
+
40
+ const apiKey = process.env[modelConfig.envApiKey] || '';
41
+ const baseURL = process.env[modelConfig.envBaseURL] || modelConfig.baseURL;
42
+
43
+ // Config overrides take precedence over env vars / model defaults
44
+ const finalConfig: OpenAICompatibleConfig = {
45
+ apiKey: overrides?.apiKey ?? apiKey,
46
+ baseURL: overrides?.baseURL ?? baseURL,
47
+ model: overrides?.model ?? modelConfig.model,
48
+ temperature: overrides?.temperature ?? modelConfig.temperature ?? 0.1,
49
+ max_tokens: overrides?.max_tokens ?? modelConfig.max_tokens,
50
+ LLMMAX_TOKENS: overrides?.LLMMAX_TOKENS ?? modelConfig.LLMMAX_TOKENS,
51
+ timeout: overrides?.timeout,
52
+ maxRetries: overrides?.maxRetries,
53
+ logger: overrides?.logger,
54
+ organization: overrides?.organization,
55
+ chatCompletionsPath: overrides?.chatCompletionsPath ?? modelConfig.endpointPath,
56
+ enableStreamUsage: overrides?.enableStreamUsage,
57
+ tool_stream: overrides?.tool_stream ?? modelConfig.tool_stream,
58
+ thinking: overrides?.thinking ?? modelConfig.thinking,
59
+ model_reasoning_effort:
60
+ overrides?.model_reasoning_effort ?? modelConfig.model_reasoning_effort,
61
+ };
62
+
63
+ const adapter = ProviderFactory.createAdapter(modelId, finalConfig.logger);
64
+
65
+ return new OpenAICompatibleProvider(finalConfig, adapter);
66
+ }
67
+
68
+ /**
69
+ * 创建指定类型的 Provider
70
+ *
71
+ * @param modelId 模型唯一标识
72
+ * @param config Provider 配置
73
+ * @returns OpenAI Compatible Provider 实例
74
+ */
75
+ static create(modelId: ModelId, config: BaseProviderConfig): OpenAICompatibleProvider {
76
+ const modelConfig = MODEL_DEFINITIONS[modelId];
77
+ if (!modelConfig) {
78
+ throw new Error(`Unknown model: ${modelId}`);
79
+ }
80
+
81
+ const adapter = ProviderFactory.createAdapter(modelId, config.logger);
82
+ return new OpenAICompatibleProvider(config as OpenAICompatibleConfig, adapter);
83
+ }
84
+
85
+ /**
86
+ * 创建适配器
87
+ *
88
+ * @param modelId 模型唯一标识
89
+ * @returns API 适配器实例
90
+ */
91
+ static createAdapter(
92
+ modelId: ModelId,
93
+ logger?: OpenAICompatibleConfig['logger']
94
+ ): BaseAPIAdapter {
95
+ const modelConfig = MODEL_DEFINITIONS[modelId];
96
+ if (modelConfig.provider === 'anthropic') {
97
+ return new AnthropicAdapter({
98
+ defaultModel: modelConfig.model,
99
+ endpointPath: modelConfig.endpointPath || '/v1/messages',
100
+ logger,
101
+ });
102
+ }
103
+
104
+ if (modelConfig.provider === 'kimi') {
105
+ return new KimiAdapter({
106
+ defaultModel: modelConfig.model,
107
+ endpointPath: modelConfig.endpointPath || '/chat/completions',
108
+ });
109
+ }
110
+
111
+ if (modelConfig.endpointPath === '/responses') {
112
+ return new ResponsesAdapter({
113
+ defaultModel: modelConfig.model,
114
+ endpointPath: modelConfig.endpointPath,
115
+ });
116
+ }
117
+
118
+ return new StandardAdapter({
119
+ defaultModel: modelConfig.model,
120
+ endpointPath: modelConfig.endpointPath || '/chat/completions',
121
+ });
122
+ }
123
+ }
@@ -0,0 +1,135 @@
1
+ /**
2
+ * Provider Registry
3
+ *
4
+ * 模型级别的 Provider 工厂和注册表
5
+ * 支持从环境变量创建 Provider,以具体模型为单位
6
+ */
7
+
8
+ import { ProviderFactory } from './registry/provider-factory';
9
+ import { MODEL_DEFINITIONS } from './registry/model-config';
10
+ import type { ModelConfig, ModelId, ProviderType } from './types';
11
+
12
+ // 导出类型
13
+ export type { ProviderType, ModelId, ModelConfig } from './types';
14
+
15
+ // 导出模型配置
16
+ export { MODEL_DEFINITIONS as MODEL_CONFIGS } from './registry/model-config';
17
+
18
+ /**
19
+ * Provider Registry 类
20
+ *
21
+ * 简化为只负责查询和委托创建
22
+ */
23
+ export class ProviderRegistry {
24
+ /**
25
+ * 从环境变量创建 Provider(以模型为单位)
26
+ *
27
+ * @param modelId 模型唯一标识,如 'glm-4.7', 'minimax-2.1'
28
+ * @param config 可选的配置覆盖
29
+ *
30
+ * @example
31
+ * ```ts
32
+ * // 创建 GLM-4.7 实例
33
+ * const provider = ProviderRegistry.createFromEnv('glm-4.7');
34
+ *
35
+ * // 创建 MiniMax-2.1 实例,并覆盖温度
36
+ * const provider = ProviderRegistry.createFromEnv('minimax-2.1', { temperature: 0.5 });
37
+ * ```
38
+ */
39
+ static createFromEnv = ProviderFactory.createFromEnv;
40
+
41
+ /**
42
+ * 创建指定类型的 Provider
43
+ */
44
+ static create = ProviderFactory.create;
45
+
46
+ /**
47
+ * 获取所有模型配置
48
+ */
49
+ static listModels(): ModelConfig[] {
50
+ return Object.values(MODEL_DEFINITIONS).map((config) => ({
51
+ ...config,
52
+ apiKey: undefined,
53
+ }));
54
+ }
55
+
56
+ /**
57
+ * 获取指定厂商的所有模型
58
+ */
59
+ static listModelsByProvider(provider: ProviderType): ModelConfig[] {
60
+ return Object.values(MODEL_DEFINITIONS)
61
+ .filter((m) => m.provider === provider)
62
+ .map((config) => ({
63
+ ...config,
64
+ apiKey: undefined,
65
+ }));
66
+ }
67
+
68
+ /**
69
+ * 获取所有模型 ID
70
+ */
71
+ static getModelIds(): ModelId[] {
72
+ return Object.keys(MODEL_DEFINITIONS) as ModelId[];
73
+ }
74
+
75
+ /**
76
+ * 获取指定模型的配置
77
+ */
78
+ static getModelConfig(modelId: ModelId): ModelConfig {
79
+ const config = MODEL_DEFINITIONS[modelId];
80
+ if (!config) {
81
+ throw new Error(`Unknown model: ${modelId}`);
82
+ }
83
+ return { ...config, apiKey: undefined };
84
+ }
85
+
86
+ /**
87
+ * 获取模型显示名称
88
+ */
89
+ static getModelName(modelId: ModelId): string {
90
+ return MODEL_DEFINITIONS[modelId]?.name || modelId;
91
+ }
92
+
93
+ /**
94
+ * 获取所有支持的厂商类型
95
+ */
96
+ static getProviders(): ProviderType[] {
97
+ const providers = new Set<ProviderType>();
98
+ Object.values(MODEL_DEFINITIONS).forEach((m) => providers.add(m.provider));
99
+ return Array.from(providers);
100
+ }
101
+ }
102
+
103
+ // =============================================================================
104
+ // 便捷的模型访问器
105
+ // =============================================================================
106
+
107
+ export const Models = {
108
+ // GLM
109
+ get glm47(): ModelConfig {
110
+ return { ...MODEL_DEFINITIONS['glm-4.7'], apiKey: undefined };
111
+ },
112
+ get glm5(): ModelConfig {
113
+ return { ...MODEL_DEFINITIONS['glm-5'], apiKey: undefined };
114
+ },
115
+
116
+ // MiniMax
117
+ get minimax25(): ModelConfig {
118
+ return { ...MODEL_DEFINITIONS['minimax-2.5'], apiKey: undefined };
119
+ },
120
+
121
+ // Kimi
122
+ get kimiK25(): ModelConfig {
123
+ return { ...MODEL_DEFINITIONS['kimi-k2.5'], apiKey: undefined };
124
+ },
125
+
126
+ // DeepSeek
127
+ get deepseekReasoner(): ModelConfig {
128
+ return { ...MODEL_DEFINITIONS['deepseek-reasoner'], apiKey: undefined };
129
+ },
130
+
131
+ // Qwen
132
+ get qwen35Plus(): ModelConfig {
133
+ return { ...MODEL_DEFINITIONS['qwen3.5-plus'], apiKey: undefined };
134
+ },
135
+ };
@@ -0,0 +1,284 @@
1
+ /**
2
+ * LLM API 相关类型定义
3
+ *
4
+ * 统一的 API 类型定义,包含请求、响应、消息、工具调用等核心类型
5
+ */
6
+
7
+ /**
8
+ * 工具调用
9
+ */
10
+ export type ToolCall = {
11
+ id: string;
12
+ type: string;
13
+ index: number;
14
+ function: {
15
+ name: string;
16
+ arguments: string;
17
+ };
18
+ };
19
+
20
+ /**
21
+ * 消息角色类型
22
+ */
23
+ export type Role = 'system' | 'assistant' | 'user' | 'tool';
24
+
25
+ /**
26
+ * 多模态消息内容片段(OpenAI Chat Completions 风格)
27
+ */
28
+ export interface TextContentPart {
29
+ type: 'text';
30
+ text: string;
31
+ }
32
+
33
+ export interface ImageUrlContentPart {
34
+ type: 'image_url';
35
+ image_url: {
36
+ url: string;
37
+ detail?: 'auto' | 'low' | 'high';
38
+ };
39
+ }
40
+
41
+ export interface InputAudioContentPart {
42
+ type: 'input_audio';
43
+ input_audio: {
44
+ data: string;
45
+ format: 'wav' | 'mp3';
46
+ };
47
+ }
48
+
49
+ export interface InputVideoContentPart {
50
+ type: 'input_video';
51
+ input_video: {
52
+ url?: string;
53
+ file_id?: string;
54
+ data?: string;
55
+ format?: 'mp4' | 'mov' | 'webm';
56
+ };
57
+ }
58
+
59
+ export interface FileContentPart {
60
+ type: 'file';
61
+ file: {
62
+ file_id?: string;
63
+ file_data?: string;
64
+ filename?: string;
65
+ };
66
+ }
67
+
68
+ export type InputContentPart =
69
+ | TextContentPart
70
+ | ImageUrlContentPart
71
+ | InputAudioContentPart
72
+ | InputVideoContentPart
73
+ | FileContentPart;
74
+
75
+ /**
76
+ * 消息内容:纯文本或多模态数组
77
+ */
78
+ export type MessageContent = string | InputContentPart[];
79
+
80
+ /**
81
+ * Token 使用情况(统一类型,移除重复定义)
82
+ */
83
+ export interface Usage {
84
+ /** 用户 prompt 所包含的 token 数 */
85
+ prompt_tokens: number;
86
+ /** 模型 completion 产生的 token 数 */
87
+ completion_tokens: number;
88
+ /** 该请求中,所有 token 的数量(prompt + completion) */
89
+ total_tokens: number;
90
+ /** 用户 prompt 中未命中缓存的 token 数(可选,部分提供商支持) */
91
+ prompt_cache_miss_tokens?: number;
92
+ /** 用户 prompt 中命中缓存的 token 数(可选,部分提供商支持) */
93
+ prompt_cache_hit_tokens?: number;
94
+ [key: string]: unknown;
95
+ }
96
+
97
+ /**
98
+ * 流式输出选项
99
+ */
100
+ export interface StreamOptions {
101
+ /**
102
+ * 请求服务端在流结束时返回 usage 信息
103
+ * 兼容 OpenAI `stream_options.include_usage` 语义
104
+ */
105
+ include_usage?: boolean;
106
+ [key: string]: unknown;
107
+ }
108
+
109
+ /**
110
+ * 基础消息类型
111
+ */
112
+ export interface BaseLLMMessage {
113
+ /** 消息 ID */
114
+ content: MessageContent;
115
+ role: Role;
116
+ reasoning_content?: string;
117
+ [key: string]: unknown; // 添加索引签名以兼容 Record<string, unknown>
118
+ }
119
+
120
+ /**
121
+ * LLM 响应消息
122
+ */
123
+ export interface LLMResponseMessage extends BaseLLMMessage {
124
+ tool_calls?: ToolCall[];
125
+ }
126
+
127
+ /**
128
+ * LLM 请求消息
129
+ */
130
+ export interface LLMRequestMessage extends BaseLLMMessage {
131
+ tool_call_id?: string;
132
+ tool_calls?: ToolCall[];
133
+ }
134
+
135
+ /**
136
+ * 完成原因
137
+ * - stop: 正常完成
138
+ * - length: 达到 token 限制
139
+ * - content_filter: 内容过滤
140
+ * - tool_calls: 工具调用
141
+ * - abort: 请求被中断
142
+ */
143
+ export type FinishReason = 'stop' | 'length' | 'content_filter' | 'tool_calls' | 'abort' | null;
144
+
145
+ /**
146
+ * LLM 响应
147
+ */
148
+ export interface LLMResponse {
149
+ id: string;
150
+ object: string;
151
+ created: number;
152
+ model: string;
153
+ choices: Array<{
154
+ index: number;
155
+ message: LLMResponseMessage;
156
+ finish_reason?: FinishReason;
157
+ }>;
158
+ usage?: Usage;
159
+ [key: string]: unknown; // 添加索引签名以兼容 Record<string, unknown>
160
+ }
161
+
162
+ /**
163
+ * 流式错误对象(部分 OpenAI 兼容服务会在 SSE chunk 中返回)
164
+ */
165
+ export interface StreamChunkError {
166
+ code?: string | null;
167
+ param?: string | null;
168
+ message?: string;
169
+ type?: string;
170
+ [key: string]: unknown;
171
+ }
172
+
173
+ /**
174
+ * 流式响应块
175
+ */
176
+ export interface Chunk {
177
+ id?: string;
178
+ index: number;
179
+ choices?: Array<{
180
+ index: number;
181
+ delta: LLMResponseMessage;
182
+ finish_reason?: FinishReason;
183
+ }>;
184
+ usage?: Usage;
185
+ model?: string;
186
+ object?: string;
187
+ created?: number;
188
+ error?: StreamChunkError;
189
+ }
190
+
191
+ /**
192
+ * 流式回调函数
193
+ */
194
+ export type StreamCallback = (chunk: Chunk) => void;
195
+
196
+ /**
197
+ * 工具定义
198
+ */
199
+ export type Tool = {
200
+ type: string;
201
+ function: {
202
+ name: string;
203
+ description: string;
204
+ parameters: Record<string, unknown>;
205
+ };
206
+ };
207
+
208
+ /**
209
+ * LLM 生成选项(传给 generate 方法的可选参数)
210
+ */
211
+ export interface LLMGenerateOptions {
212
+ /** 模型名称(覆盖默认模型) */
213
+ model?: string;
214
+ /** 最大生成 token 数 */
215
+ max_tokens?: number;
216
+ /** 温度参数 */
217
+ temperature?: number;
218
+ /** 思考模式(部分 Provider 支持) */
219
+ thinking?: boolean;
220
+ /** 是否启用流式响应 */
221
+ stream?: boolean;
222
+ /** 是否启用工具流式输出(与 stream 一致的布尔语义) */
223
+ tool_stream?: boolean;
224
+ /** 推理强度(部分 Provider 支持) */
225
+ model_reasoning_effort?: 'low' | 'medium' | 'high';
226
+ /** 流式输出选项 */
227
+ stream_options?: StreamOptions;
228
+ /** 中止信号 */
229
+ abortSignal?: AbortSignal;
230
+ /** 工具列表 */
231
+ tools?: Tool[];
232
+ /** Prompt cache routing key for providers that support sticky prefix caching */
233
+ prompt_cache_key?: string;
234
+ /** Prompt cache retention hint for providers that support configurable cache retention */
235
+ prompt_cache_retention?: string;
236
+ /** Responses API continuation id for providers that support server-side chaining */
237
+ previous_response_id?: string;
238
+ [key: string]: unknown; // 添加索引签名以兼容 Record<string, unknown>
239
+ }
240
+
241
+ /**
242
+ * 完整的 LLM 请求(包含消息)
243
+ */
244
+ export interface LLMRequest extends LLMGenerateOptions {
245
+ /** 模型名称 */
246
+ model: string;
247
+ /** 对话消息列表 */
248
+ messages: LLMRequestMessage[];
249
+ }
250
+
251
+ /**
252
+ * Anthropic 流式事件类型
253
+ */
254
+ export interface AnthropicStreamEvent {
255
+ type: string;
256
+ message?: {
257
+ id: string;
258
+ type: 'message';
259
+ role: 'assistant';
260
+ content: Array<{ type: string; text?: string }>;
261
+ model: string;
262
+ stop_reason: string | null;
263
+ stop_sequence: string | null;
264
+ usage: { input_tokens: number; output_tokens: number };
265
+ };
266
+ index?: number;
267
+ content_block?: {
268
+ type: 'text' | 'image' | 'tool_use' | 'tool_result';
269
+ text?: string;
270
+ id?: string;
271
+ name?: string;
272
+ input?: Record<string, unknown>;
273
+ };
274
+ delta?: {
275
+ type: string;
276
+ text?: string;
277
+ stop_reason?: string;
278
+ partial_json?: string;
279
+ };
280
+ usage?: {
281
+ input_tokens: number;
282
+ output_tokens: number;
283
+ };
284
+ }
@@ -0,0 +1,58 @@
1
+ /**
2
+ * 配置相关类型定义
3
+ *
4
+ * 统一的配置类型,包括基础配置、Provider 配置和 OpenAI 兼容配置
5
+ */
6
+ import type { ChildLogger, Logger } from '../../logger';
7
+
8
+ export type ProviderLogger = Logger | ChildLogger;
9
+
10
+ /**
11
+ * 基础 API 配置接口
12
+ */
13
+ export interface BaseAPIConfig {
14
+ /** API 基础 URL */
15
+ baseURL: string;
16
+ /** 模型名称 */
17
+ model: string;
18
+ /** 最大生成 token 数 */
19
+ max_tokens: number;
20
+ /** 最大上下文 token 数 */
21
+ LLMMAX_TOKENS: number;
22
+ /** 温度参数 */
23
+ temperature: number;
24
+ /** 请求超时时间(毫秒) */
25
+ timeout?: number;
26
+ /** 最大重试次数(由上层重试策略使用) */
27
+ maxRetries?: number;
28
+ /** 可选日志器(建议注入 Agent 的 child logger) */
29
+ logger?: ProviderLogger;
30
+ }
31
+
32
+ /**
33
+ * Provider 基础配置
34
+ */
35
+ export interface BaseProviderConfig extends BaseAPIConfig {
36
+ /** API 密钥或凭证 */
37
+ apiKey: string;
38
+ /** 思考模式(部分 Provider 支持) */
39
+ thinking?: boolean;
40
+ /** 其他扩展字段 */
41
+ [key: string]: unknown;
42
+ }
43
+
44
+ /**
45
+ * OpenAI 兼容服务配置
46
+ */
47
+ export interface OpenAICompatibleConfig extends BaseProviderConfig {
48
+ /** 可选的组织 ID(部分提供商需要) */
49
+ organization?: string;
50
+ /** 聊天补全接口路径,默认为 '/chat/completions' */
51
+ chatCompletionsPath?: string;
52
+ /** 是否在流式请求中默认要求返回 usage(默认 true) */
53
+ enableStreamUsage?: boolean;
54
+ /** 默认是否启用工具流式输出(请求级可被 generate options 覆盖) */
55
+ tool_stream?: boolean;
56
+ /** 默认推理强度(请求级可被 generate options 覆盖) */
57
+ model_reasoning_effort?: 'low' | 'medium' | 'high';
58
+ }