mozi-bot 1.0.0

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 (259) hide show
  1. package/LICENSE +190 -0
  2. package/README.md +467 -0
  3. package/dist/agents/agent.d.ts +118 -0
  4. package/dist/agents/agent.d.ts.map +1 -0
  5. package/dist/agents/agent.js +686 -0
  6. package/dist/agents/agent.js.map +1 -0
  7. package/dist/agents/compaction.d.ts +78 -0
  8. package/dist/agents/compaction.d.ts.map +1 -0
  9. package/dist/agents/compaction.js +350 -0
  10. package/dist/agents/compaction.js.map +1 -0
  11. package/dist/agents/failover-error.d.ts +42 -0
  12. package/dist/agents/failover-error.d.ts.map +1 -0
  13. package/dist/agents/failover-error.js +171 -0
  14. package/dist/agents/failover-error.js.map +1 -0
  15. package/dist/agents/index.d.ts +10 -0
  16. package/dist/agents/index.d.ts.map +1 -0
  17. package/dist/agents/index.js +10 -0
  18. package/dist/agents/index.js.map +1 -0
  19. package/dist/agents/model-fallback.d.ts +54 -0
  20. package/dist/agents/model-fallback.d.ts.map +1 -0
  21. package/dist/agents/model-fallback.js +227 -0
  22. package/dist/agents/model-fallback.js.map +1 -0
  23. package/dist/agents/session-store.d.ts +53 -0
  24. package/dist/agents/session-store.d.ts.map +1 -0
  25. package/dist/agents/session-store.js +217 -0
  26. package/dist/agents/session-store.js.map +1 -0
  27. package/dist/agents/system-prompt.d.ts +29 -0
  28. package/dist/agents/system-prompt.d.ts.map +1 -0
  29. package/dist/agents/system-prompt.js +299 -0
  30. package/dist/agents/system-prompt.js.map +1 -0
  31. package/dist/channels/common/base.d.ts +40 -0
  32. package/dist/channels/common/base.d.ts.map +1 -0
  33. package/dist/channels/common/base.js +23 -0
  34. package/dist/channels/common/base.js.map +1 -0
  35. package/dist/channels/common/index.d.ts +21 -0
  36. package/dist/channels/common/index.d.ts.map +1 -0
  37. package/dist/channels/common/index.js +66 -0
  38. package/dist/channels/common/index.js.map +1 -0
  39. package/dist/channels/dingtalk/api.d.ts +30 -0
  40. package/dist/channels/dingtalk/api.d.ts.map +1 -0
  41. package/dist/channels/dingtalk/api.js +149 -0
  42. package/dist/channels/dingtalk/api.js.map +1 -0
  43. package/dist/channels/dingtalk/events.d.ts +80 -0
  44. package/dist/channels/dingtalk/events.d.ts.map +1 -0
  45. package/dist/channels/dingtalk/events.js +92 -0
  46. package/dist/channels/dingtalk/events.js.map +1 -0
  47. package/dist/channels/dingtalk/index.d.ts +51 -0
  48. package/dist/channels/dingtalk/index.d.ts.map +1 -0
  49. package/dist/channels/dingtalk/index.js +231 -0
  50. package/dist/channels/dingtalk/index.js.map +1 -0
  51. package/dist/channels/dingtalk/stream.d.ts +31 -0
  52. package/dist/channels/dingtalk/stream.d.ts.map +1 -0
  53. package/dist/channels/dingtalk/stream.js +116 -0
  54. package/dist/channels/dingtalk/stream.js.map +1 -0
  55. package/dist/channels/feishu/api.d.ts +33 -0
  56. package/dist/channels/feishu/api.d.ts.map +1 -0
  57. package/dist/channels/feishu/api.js +120 -0
  58. package/dist/channels/feishu/api.js.map +1 -0
  59. package/dist/channels/feishu/events.d.ts +87 -0
  60. package/dist/channels/feishu/events.d.ts.map +1 -0
  61. package/dist/channels/feishu/events.js +163 -0
  62. package/dist/channels/feishu/events.js.map +1 -0
  63. package/dist/channels/feishu/index.d.ts +46 -0
  64. package/dist/channels/feishu/index.d.ts.map +1 -0
  65. package/dist/channels/feishu/index.js +207 -0
  66. package/dist/channels/feishu/index.js.map +1 -0
  67. package/dist/channels/feishu/websocket.d.ts +32 -0
  68. package/dist/channels/feishu/websocket.d.ts.map +1 -0
  69. package/dist/channels/feishu/websocket.js +121 -0
  70. package/dist/channels/feishu/websocket.js.map +1 -0
  71. package/dist/channels/index.d.ts +9 -0
  72. package/dist/channels/index.d.ts.map +1 -0
  73. package/dist/channels/index.js +9 -0
  74. package/dist/channels/index.js.map +1 -0
  75. package/dist/cli/index.d.ts +6 -0
  76. package/dist/cli/index.d.ts.map +1 -0
  77. package/dist/cli/index.js +468 -0
  78. package/dist/cli/index.js.map +1 -0
  79. package/dist/commands/index.d.ts +54 -0
  80. package/dist/commands/index.d.ts.map +1 -0
  81. package/dist/commands/index.js +171 -0
  82. package/dist/commands/index.js.map +1 -0
  83. package/dist/config/index.d.ts +201 -0
  84. package/dist/config/index.d.ts.map +1 -0
  85. package/dist/config/index.js +261 -0
  86. package/dist/config/index.js.map +1 -0
  87. package/dist/gateway/index.d.ts +5 -0
  88. package/dist/gateway/index.d.ts.map +1 -0
  89. package/dist/gateway/index.js +5 -0
  90. package/dist/gateway/index.js.map +1 -0
  91. package/dist/gateway/server.d.ts +42 -0
  92. package/dist/gateway/server.d.ts.map +1 -0
  93. package/dist/gateway/server.js +235 -0
  94. package/dist/gateway/server.js.map +1 -0
  95. package/dist/hooks/index.d.ts +168 -0
  96. package/dist/hooks/index.d.ts.map +1 -0
  97. package/dist/hooks/index.js +148 -0
  98. package/dist/hooks/index.js.map +1 -0
  99. package/dist/index.d.ts +18 -0
  100. package/dist/index.d.ts.map +1 -0
  101. package/dist/index.js +29 -0
  102. package/dist/index.js.map +1 -0
  103. package/dist/memory/index.d.ts +94 -0
  104. package/dist/memory/index.d.ts.map +1 -0
  105. package/dist/memory/index.js +282 -0
  106. package/dist/memory/index.js.map +1 -0
  107. package/dist/plugins/index.d.ts +57 -0
  108. package/dist/plugins/index.d.ts.map +1 -0
  109. package/dist/plugins/index.js +103 -0
  110. package/dist/plugins/index.js.map +1 -0
  111. package/dist/providers/anthropic-compatible.d.ts +48 -0
  112. package/dist/providers/anthropic-compatible.d.ts.map +1 -0
  113. package/dist/providers/anthropic-compatible.js +380 -0
  114. package/dist/providers/anthropic-compatible.js.map +1 -0
  115. package/dist/providers/base.d.ts +26 -0
  116. package/dist/providers/base.d.ts.map +1 -0
  117. package/dist/providers/base.js +58 -0
  118. package/dist/providers/base.js.map +1 -0
  119. package/dist/providers/custom-openai.d.ts +66 -0
  120. package/dist/providers/custom-openai.d.ts.map +1 -0
  121. package/dist/providers/custom-openai.js +255 -0
  122. package/dist/providers/custom-openai.js.map +1 -0
  123. package/dist/providers/dashscope.d.ts +15 -0
  124. package/dist/providers/dashscope.d.ts.map +1 -0
  125. package/dist/providers/dashscope.js +237 -0
  126. package/dist/providers/dashscope.js.map +1 -0
  127. package/dist/providers/deepseek.d.ts +10 -0
  128. package/dist/providers/deepseek.d.ts.map +1 -0
  129. package/dist/providers/deepseek.js +57 -0
  130. package/dist/providers/deepseek.js.map +1 -0
  131. package/dist/providers/index.d.ts +33 -0
  132. package/dist/providers/index.d.ts.map +1 -0
  133. package/dist/providers/index.js +142 -0
  134. package/dist/providers/index.js.map +1 -0
  135. package/dist/providers/kimi.d.ts +10 -0
  136. package/dist/providers/kimi.d.ts.map +1 -0
  137. package/dist/providers/kimi.js +83 -0
  138. package/dist/providers/kimi.js.map +1 -0
  139. package/dist/providers/minimax.d.ts +20 -0
  140. package/dist/providers/minimax.d.ts.map +1 -0
  141. package/dist/providers/minimax.js +252 -0
  142. package/dist/providers/minimax.js.map +1 -0
  143. package/dist/providers/modelscope.d.ts +15 -0
  144. package/dist/providers/modelscope.d.ts.map +1 -0
  145. package/dist/providers/modelscope.js +237 -0
  146. package/dist/providers/modelscope.js.map +1 -0
  147. package/dist/providers/openai-compatible.d.ts +57 -0
  148. package/dist/providers/openai-compatible.d.ts.map +1 -0
  149. package/dist/providers/openai-compatible.js +193 -0
  150. package/dist/providers/openai-compatible.js.map +1 -0
  151. package/dist/providers/stepfun.d.ts +10 -0
  152. package/dist/providers/stepfun.d.ts.map +1 -0
  153. package/dist/providers/stepfun.js +125 -0
  154. package/dist/providers/stepfun.js.map +1 -0
  155. package/dist/providers/zhipu.d.ts +15 -0
  156. package/dist/providers/zhipu.d.ts.map +1 -0
  157. package/dist/providers/zhipu.js +247 -0
  158. package/dist/providers/zhipu.js.map +1 -0
  159. package/dist/sessions/index.d.ts +6 -0
  160. package/dist/sessions/index.d.ts.map +1 -0
  161. package/dist/sessions/index.js +6 -0
  162. package/dist/sessions/index.js.map +1 -0
  163. package/dist/sessions/store.d.ts +45 -0
  164. package/dist/sessions/store.d.ts.map +1 -0
  165. package/dist/sessions/store.js +268 -0
  166. package/dist/sessions/store.js.map +1 -0
  167. package/dist/sessions/types.d.ts +110 -0
  168. package/dist/sessions/types.d.ts.map +1 -0
  169. package/dist/sessions/types.js +6 -0
  170. package/dist/sessions/types.js.map +1 -0
  171. package/dist/tools/builtin/apply-patch.d.ts +8 -0
  172. package/dist/tools/builtin/apply-patch.d.ts.map +1 -0
  173. package/dist/tools/builtin/apply-patch.js +272 -0
  174. package/dist/tools/builtin/apply-patch.js.map +1 -0
  175. package/dist/tools/builtin/bash.d.ts +25 -0
  176. package/dist/tools/builtin/bash.d.ts.map +1 -0
  177. package/dist/tools/builtin/bash.js +212 -0
  178. package/dist/tools/builtin/bash.js.map +1 -0
  179. package/dist/tools/builtin/browser.d.ts +12 -0
  180. package/dist/tools/builtin/browser.d.ts.map +1 -0
  181. package/dist/tools/builtin/browser.js +693 -0
  182. package/dist/tools/builtin/browser.js.map +1 -0
  183. package/dist/tools/builtin/filesystem.d.ts +29 -0
  184. package/dist/tools/builtin/filesystem.d.ts.map +1 -0
  185. package/dist/tools/builtin/filesystem.js +484 -0
  186. package/dist/tools/builtin/filesystem.js.map +1 -0
  187. package/dist/tools/builtin/image.d.ts +13 -0
  188. package/dist/tools/builtin/image.d.ts.map +1 -0
  189. package/dist/tools/builtin/image.js +126 -0
  190. package/dist/tools/builtin/image.js.map +1 -0
  191. package/dist/tools/builtin/index.d.ts +30 -0
  192. package/dist/tools/builtin/index.d.ts.map +1 -0
  193. package/dist/tools/builtin/index.js +55 -0
  194. package/dist/tools/builtin/index.js.map +1 -0
  195. package/dist/tools/builtin/process-registry.d.ts +71 -0
  196. package/dist/tools/builtin/process-registry.d.ts.map +1 -0
  197. package/dist/tools/builtin/process-registry.js +172 -0
  198. package/dist/tools/builtin/process-registry.js.map +1 -0
  199. package/dist/tools/builtin/process-tool.d.ts +8 -0
  200. package/dist/tools/builtin/process-tool.d.ts.map +1 -0
  201. package/dist/tools/builtin/process-tool.js +279 -0
  202. package/dist/tools/builtin/process-tool.js.map +1 -0
  203. package/dist/tools/builtin/subagent.d.ts +33 -0
  204. package/dist/tools/builtin/subagent.d.ts.map +1 -0
  205. package/dist/tools/builtin/subagent.js +185 -0
  206. package/dist/tools/builtin/subagent.js.map +1 -0
  207. package/dist/tools/builtin/system.d.ts +11 -0
  208. package/dist/tools/builtin/system.d.ts.map +1 -0
  209. package/dist/tools/builtin/system.js +144 -0
  210. package/dist/tools/builtin/system.js.map +1 -0
  211. package/dist/tools/builtin/web.d.ts +9 -0
  212. package/dist/tools/builtin/web.d.ts.map +1 -0
  213. package/dist/tools/builtin/web.js +87 -0
  214. package/dist/tools/builtin/web.js.map +1 -0
  215. package/dist/tools/common.d.ts +45 -0
  216. package/dist/tools/common.d.ts.map +1 -0
  217. package/dist/tools/common.js +129 -0
  218. package/dist/tools/common.js.map +1 -0
  219. package/dist/tools/index.d.ts +8 -0
  220. package/dist/tools/index.d.ts.map +1 -0
  221. package/dist/tools/index.js +8 -0
  222. package/dist/tools/index.js.map +1 -0
  223. package/dist/tools/registry.d.ts +33 -0
  224. package/dist/tools/registry.d.ts.map +1 -0
  225. package/dist/tools/registry.js +174 -0
  226. package/dist/tools/registry.js.map +1 -0
  227. package/dist/tools/types.d.ts +58 -0
  228. package/dist/tools/types.d.ts.map +1 -0
  229. package/dist/tools/types.js +11 -0
  230. package/dist/tools/types.js.map +1 -0
  231. package/dist/types/index.d.ts +280 -0
  232. package/dist/types/index.d.ts.map +1 -0
  233. package/dist/types/index.js +34 -0
  234. package/dist/types/index.js.map +1 -0
  235. package/dist/utils/index.d.ts +35 -0
  236. package/dist/utils/index.d.ts.map +1 -0
  237. package/dist/utils/index.js +114 -0
  238. package/dist/utils/index.js.map +1 -0
  239. package/dist/utils/logger.d.ts +24 -0
  240. package/dist/utils/logger.d.ts.map +1 -0
  241. package/dist/utils/logger.js +94 -0
  242. package/dist/utils/logger.js.map +1 -0
  243. package/dist/web/index.d.ts +7 -0
  244. package/dist/web/index.d.ts.map +1 -0
  245. package/dist/web/index.js +7 -0
  246. package/dist/web/index.js.map +1 -0
  247. package/dist/web/static.d.ts +12 -0
  248. package/dist/web/static.d.ts.map +1 -0
  249. package/dist/web/static.js +1260 -0
  250. package/dist/web/static.js.map +1 -0
  251. package/dist/web/types.d.ts +95 -0
  252. package/dist/web/types.d.ts.map +1 -0
  253. package/dist/web/types.js +5 -0
  254. package/dist/web/types.js.map +1 -0
  255. package/dist/web/websocket.d.ts +58 -0
  256. package/dist/web/websocket.d.ts.map +1 -0
  257. package/dist/web/websocket.js +371 -0
  258. package/dist/web/websocket.js.map +1 -0
  259. package/package.json +89 -0
@@ -0,0 +1,171 @@
1
+ /**
2
+ * 故障转移错误类型
3
+ */
4
+ /** 故障转移错误 */
5
+ export class FailoverError extends Error {
6
+ reason;
7
+ provider;
8
+ model;
9
+ status;
10
+ code;
11
+ constructor(message, params) {
12
+ super(message, { cause: params.cause });
13
+ this.name = "FailoverError";
14
+ this.reason = params.reason;
15
+ this.provider = params.provider;
16
+ this.model = params.model;
17
+ this.status = params.status;
18
+ this.code = params.code;
19
+ }
20
+ }
21
+ /** 检查是否为故障转移错误 */
22
+ export function isFailoverError(err) {
23
+ return err instanceof FailoverError;
24
+ }
25
+ /** 超时相关的错误提示 */
26
+ const TIMEOUT_HINT_RE = /timeout|timed out|deadline exceeded|context deadline exceeded/i;
27
+ const ABORT_TIMEOUT_RE = /request was aborted|request aborted/i;
28
+ /** 检查是否为超时错误 */
29
+ export function isTimeoutError(err) {
30
+ if (!err || typeof err !== "object")
31
+ return false;
32
+ const name = err.name ?? "";
33
+ if (name === "TimeoutError")
34
+ return true;
35
+ const message = err.message ?? "";
36
+ if (TIMEOUT_HINT_RE.test(message))
37
+ return true;
38
+ if (name === "AbortError" && ABORT_TIMEOUT_RE.test(message))
39
+ return true;
40
+ const cause = err.cause;
41
+ if (cause && isTimeoutError(cause))
42
+ return true;
43
+ return false;
44
+ }
45
+ /** 获取错误状态码 */
46
+ function getStatusCode(err) {
47
+ if (!err || typeof err !== "object")
48
+ return undefined;
49
+ const status = err.status ??
50
+ err.statusCode;
51
+ if (typeof status === "number")
52
+ return status;
53
+ if (typeof status === "string" && /^\d+$/.test(status))
54
+ return Number(status);
55
+ return undefined;
56
+ }
57
+ /** 获取错误代码 */
58
+ function getErrorCode(err) {
59
+ if (!err || typeof err !== "object")
60
+ return undefined;
61
+ const code = err.code;
62
+ return typeof code === "string" ? code : undefined;
63
+ }
64
+ /** 获取错误消息 */
65
+ function getErrorMessage(err) {
66
+ if (err instanceof Error)
67
+ return err.message;
68
+ if (typeof err === "string")
69
+ return err;
70
+ if (err && typeof err === "object") {
71
+ const message = err.message;
72
+ if (typeof message === "string")
73
+ return message;
74
+ }
75
+ return String(err);
76
+ }
77
+ /** 从错误消息分类故障原因 */
78
+ function classifyFailoverReason(message) {
79
+ const lower = message.toLowerCase();
80
+ if (lower.includes("billing") || lower.includes("quota") || lower.includes("insufficient")) {
81
+ return "billing";
82
+ }
83
+ if (lower.includes("rate limit") || lower.includes("too many requests")) {
84
+ return "rate_limit";
85
+ }
86
+ if (lower.includes("unauthorized") || lower.includes("invalid api key") || lower.includes("authentication")) {
87
+ return "auth";
88
+ }
89
+ if (lower.includes("timeout") || lower.includes("timed out")) {
90
+ return "timeout";
91
+ }
92
+ if (lower.includes("bad request") || lower.includes("invalid")) {
93
+ return "format";
94
+ }
95
+ if (lower.includes("unavailable") || lower.includes("overloaded")) {
96
+ return "unavailable";
97
+ }
98
+ return null;
99
+ }
100
+ /** 从错误推断故障原因 */
101
+ export function resolveFailoverReasonFromError(err) {
102
+ if (isFailoverError(err))
103
+ return err.reason;
104
+ const status = getStatusCode(err);
105
+ if (status === 402)
106
+ return "billing";
107
+ if (status === 429)
108
+ return "rate_limit";
109
+ if (status === 401 || status === 403)
110
+ return "auth";
111
+ if (status === 408)
112
+ return "timeout";
113
+ if (status === 400)
114
+ return "format";
115
+ if (status === 503)
116
+ return "unavailable";
117
+ const code = getErrorCode(err)?.toUpperCase() ?? "";
118
+ if (["ETIMEDOUT", "ESOCKETTIMEDOUT", "ECONNRESET", "ECONNABORTED"].includes(code)) {
119
+ return "timeout";
120
+ }
121
+ if (isTimeoutError(err))
122
+ return "timeout";
123
+ const message = getErrorMessage(err);
124
+ return classifyFailoverReason(message);
125
+ }
126
+ /** 描述故障转移错误 */
127
+ export function describeFailoverError(err) {
128
+ if (isFailoverError(err)) {
129
+ return {
130
+ message: err.message,
131
+ reason: err.reason,
132
+ status: err.status,
133
+ code: err.code,
134
+ };
135
+ }
136
+ return {
137
+ message: getErrorMessage(err),
138
+ reason: resolveFailoverReasonFromError(err) ?? undefined,
139
+ status: getStatusCode(err),
140
+ code: getErrorCode(err),
141
+ };
142
+ }
143
+ /** 将普通错误转换为故障转移错误 */
144
+ export function coerceToFailoverError(err, context) {
145
+ if (isFailoverError(err))
146
+ return err;
147
+ const reason = resolveFailoverReasonFromError(err);
148
+ if (!reason)
149
+ return null;
150
+ return new FailoverError(getErrorMessage(err), {
151
+ reason,
152
+ provider: context?.provider,
153
+ model: context?.model,
154
+ status: getStatusCode(err),
155
+ code: getErrorCode(err),
156
+ cause: err instanceof Error ? err : undefined,
157
+ });
158
+ }
159
+ /** 根据原因获取建议的状态码 */
160
+ export function resolveFailoverStatus(reason) {
161
+ switch (reason) {
162
+ case "billing": return 402;
163
+ case "rate_limit": return 429;
164
+ case "auth": return 401;
165
+ case "timeout": return 408;
166
+ case "format": return 400;
167
+ case "unavailable": return 503;
168
+ default: return undefined;
169
+ }
170
+ }
171
+ //# sourceMappingURL=failover-error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"failover-error.js","sourceRoot":"","sources":["../../src/agents/failover-error.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Agent 模块导出
3
+ */
4
+ export * from "./agent.js";
5
+ export * from "./compaction.js";
6
+ export * from "./failover-error.js";
7
+ export * from "./model-fallback.js";
8
+ export * from "./system-prompt.js";
9
+ export * from "./session-store.js";
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/agents/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Agent 模块导出
3
+ */
4
+ export * from "./agent.js";
5
+ export * from "./compaction.js";
6
+ export * from "./failover-error.js";
7
+ export * from "./model-fallback.js";
8
+ export * from "./system-prompt.js";
9
+ export * from "./session-store.js";
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/agents/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * 模型故障转移系统
3
+ */
4
+ import type { ProviderId, MoziConfig } from "../types/index.js";
5
+ import { type FailoverReason } from "./failover-error.js";
6
+ /** 故障尝试记录 */
7
+ export interface FallbackAttempt {
8
+ provider: string;
9
+ model: string;
10
+ error: string;
11
+ reason?: FailoverReason;
12
+ status?: number;
13
+ code?: string;
14
+ }
15
+ /** 检查是否在冷却中 */
16
+ export declare function isInCooldown(provider: string, model?: string): boolean;
17
+ /** 设置冷却 */
18
+ export declare function setCooldown(provider: string, reason: FailoverReason, model?: string): void;
19
+ /** 清除冷却 */
20
+ export declare function clearCooldown(provider: string, model?: string): void;
21
+ /** 清除所有冷却 */
22
+ export declare function clearAllCooldowns(): void;
23
+ /** 带模型故障转移执行 */
24
+ export declare function runWithModelFallback<T>(params: {
25
+ config?: MoziConfig;
26
+ provider: ProviderId;
27
+ model: string;
28
+ fallbacks?: Array<{
29
+ provider: ProviderId;
30
+ model: string;
31
+ }>;
32
+ run: (provider: ProviderId, model: string) => Promise<T>;
33
+ onError?: (attempt: {
34
+ provider: string;
35
+ model: string;
36
+ error: unknown;
37
+ attempt: number;
38
+ total: number;
39
+ }) => void | Promise<void>;
40
+ retryDelay?: number;
41
+ maxRetries?: number;
42
+ }): Promise<{
43
+ result: T;
44
+ provider: ProviderId;
45
+ model: string;
46
+ attempts: FallbackAttempt[];
47
+ }>;
48
+ /** 简化的重试执行 */
49
+ export declare function runWithRetry<T>(fn: () => Promise<T>, options?: {
50
+ maxRetries?: number;
51
+ retryDelay?: number;
52
+ onError?: (error: unknown, attempt: number) => void;
53
+ }): Promise<T>;
54
+ //# sourceMappingURL=model-fallback.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-fallback.d.ts","sourceRoot":"","sources":["../../src/agents/model-fallback.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEhE,OAAO,EAML,KAAK,cAAc,EACpB,MAAM,qBAAqB,CAAC;AAY7B,aAAa;AACb,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAqBD,eAAe;AACf,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAStE;AAED,WAAW;AACX,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAO1F;AAED,WAAW;AACX,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAGpE;AAED,aAAa;AACb,wBAAgB,iBAAiB,IAAI,IAAI,CAExC;AAoED,gBAAgB;AAChB,wBAAsB,oBAAoB,CAAC,CAAC,EAAE,MAAM,EAAE;IACpD,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,QAAQ,EAAE,UAAU,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,UAAU,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC3D,GAAG,EAAE,CAAC,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;IACzD,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE;QAClB,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,OAAO,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,MAAM,CAAC;KACf,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GAAG,OAAO,CAAC;IACV,MAAM,EAAE,CAAC,CAAC;IACV,QAAQ,EAAE,UAAU,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,eAAe,EAAE,CAAC;CAC7B,CAAC,CAkHD;AAED,cAAc;AACd,wBAAsB,YAAY,CAAC,CAAC,EAClC,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,OAAO,CAAC,EAAE;IACR,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACrD,GACA,OAAO,CAAC,CAAC,CAAC,CAsBZ"}
@@ -0,0 +1,227 @@
1
+ /**
2
+ * 模型故障转移系统
3
+ */
4
+ import { getProvider, getAllProviders } from "../providers/index.js";
5
+ import { isFailoverError, coerceToFailoverError, describeFailoverError, isTimeoutError, } from "./failover-error.js";
6
+ import { getChildLogger } from "../utils/logger.js";
7
+ import { delay } from "../utils/index.js";
8
+ const logger = getChildLogger("failover");
9
+ /** 冷却时间记录 */
10
+ const cooldownMap = new Map();
11
+ /** 冷却时间 (毫秒) */
12
+ const COOLDOWN_DURATION = {
13
+ billing: 3600000, // 1 小时
14
+ rate_limit: 60000, // 1 分钟
15
+ auth: 300000, // 5 分钟
16
+ timeout: 30000, // 30 秒
17
+ format: 0, // 不冷却
18
+ unavailable: 60000, // 1 分钟
19
+ unknown: 10000, // 10 秒
20
+ };
21
+ /** 获取冷却键 */
22
+ function getCooldownKey(provider, model) {
23
+ return model ? `${provider}:${model}` : provider;
24
+ }
25
+ /** 检查是否在冷却中 */
26
+ export function isInCooldown(provider, model) {
27
+ const key = getCooldownKey(provider, model);
28
+ const until = cooldownMap.get(key);
29
+ if (!until)
30
+ return false;
31
+ if (Date.now() >= until) {
32
+ cooldownMap.delete(key);
33
+ return false;
34
+ }
35
+ return true;
36
+ }
37
+ /** 设置冷却 */
38
+ export function setCooldown(provider, reason, model) {
39
+ const duration = COOLDOWN_DURATION[reason] ?? COOLDOWN_DURATION.unknown;
40
+ if (duration <= 0)
41
+ return;
42
+ const key = getCooldownKey(provider, model);
43
+ cooldownMap.set(key, Date.now() + duration);
44
+ logger.debug({ provider, model, reason, durationMs: duration }, "Set cooldown");
45
+ }
46
+ /** 清除冷却 */
47
+ export function clearCooldown(provider, model) {
48
+ const key = getCooldownKey(provider, model);
49
+ cooldownMap.delete(key);
50
+ }
51
+ /** 清除所有冷却 */
52
+ export function clearAllCooldowns() {
53
+ cooldownMap.clear();
54
+ }
55
+ /** 检查是否为中止错误 (不应重试) */
56
+ function isAbortError(err) {
57
+ if (!err || typeof err !== "object")
58
+ return false;
59
+ if (isFailoverError(err))
60
+ return false;
61
+ const name = err.name ?? "";
62
+ return name === "AbortError";
63
+ }
64
+ /** 检查是否应该重新抛出中止错误 */
65
+ function shouldRethrowAbort(err) {
66
+ return isAbortError(err) && !isTimeoutError(err);
67
+ }
68
+ /** 解析故障转移候选列表 */
69
+ function resolveFallbackCandidates(params) {
70
+ const candidates = [];
71
+ const seen = new Set();
72
+ const addCandidate = (provider, model) => {
73
+ const key = `${provider}:${model}`;
74
+ if (seen.has(key))
75
+ return;
76
+ seen.add(key);
77
+ // 检查提供商是否可用
78
+ if (!getProvider(provider))
79
+ return;
80
+ candidates.push({ provider, model });
81
+ };
82
+ // 首选
83
+ addCandidate(params.provider, params.model);
84
+ // 指定的回退列表
85
+ if (params.fallbacks) {
86
+ for (const fb of params.fallbacks) {
87
+ addCandidate(fb.provider, fb.model);
88
+ }
89
+ }
90
+ // 默认回退: 同提供商的其他模型
91
+ const primaryProvider = getProvider(params.provider);
92
+ if (primaryProvider) {
93
+ for (const modelDef of primaryProvider.getModels()) {
94
+ if (modelDef.id !== params.model) {
95
+ addCandidate(params.provider, modelDef.id);
96
+ }
97
+ }
98
+ }
99
+ // 默认回退: 其他提供商
100
+ const otherProviders = getAllProviders().filter((p) => p.id !== params.provider);
101
+ for (const provider of otherProviders) {
102
+ const firstModel = provider.getModels()[0];
103
+ if (firstModel) {
104
+ addCandidate(provider.id, firstModel.id);
105
+ }
106
+ }
107
+ return candidates;
108
+ }
109
+ /** 带模型故障转移执行 */
110
+ export async function runWithModelFallback(params) {
111
+ const candidates = resolveFallbackCandidates({
112
+ config: params.config,
113
+ provider: params.provider,
114
+ model: params.model,
115
+ fallbacks: params.fallbacks,
116
+ });
117
+ if (candidates.length === 0) {
118
+ throw new Error(`No available providers for ${params.provider}/${params.model}`);
119
+ }
120
+ const attempts = [];
121
+ let lastError;
122
+ const retryDelay = params.retryDelay ?? 1000;
123
+ const maxRetries = params.maxRetries ?? 1;
124
+ for (let i = 0; i < candidates.length; i++) {
125
+ const candidate = candidates[i];
126
+ // 检查冷却
127
+ if (isInCooldown(candidate.provider, candidate.model)) {
128
+ logger.debug({ ...candidate }, "Skipping candidate in cooldown");
129
+ attempts.push({
130
+ provider: candidate.provider,
131
+ model: candidate.model,
132
+ error: "Provider is in cooldown",
133
+ reason: "rate_limit",
134
+ });
135
+ continue;
136
+ }
137
+ // 重试循环
138
+ for (let retry = 0; retry <= maxRetries; retry++) {
139
+ try {
140
+ logger.debug({ ...candidate, attempt: i + 1, retry }, "Trying candidate");
141
+ const result = await params.run(candidate.provider, candidate.model);
142
+ return {
143
+ result,
144
+ provider: candidate.provider,
145
+ model: candidate.model,
146
+ attempts,
147
+ };
148
+ }
149
+ catch (err) {
150
+ // 检查是否应该重新抛出
151
+ if (shouldRethrowAbort(err))
152
+ throw err;
153
+ // 转换为故障转移错误
154
+ const failoverErr = coerceToFailoverError(err, {
155
+ provider: candidate.provider,
156
+ model: candidate.model,
157
+ });
158
+ if (!failoverErr && !isFailoverError(err)) {
159
+ // 不是可恢复的错误
160
+ throw err;
161
+ }
162
+ lastError = failoverErr ?? err;
163
+ const described = describeFailoverError(lastError);
164
+ // 记录尝试
165
+ if (retry === maxRetries) {
166
+ attempts.push({
167
+ provider: candidate.provider,
168
+ model: candidate.model,
169
+ error: described.message,
170
+ reason: described.reason,
171
+ status: described.status,
172
+ code: described.code,
173
+ });
174
+ }
175
+ // 设置冷却
176
+ if (described.reason) {
177
+ setCooldown(candidate.provider, described.reason, candidate.model);
178
+ }
179
+ // 通知错误
180
+ await params.onError?.({
181
+ provider: candidate.provider,
182
+ model: candidate.model,
183
+ error: lastError,
184
+ attempt: i + 1,
185
+ total: candidates.length,
186
+ });
187
+ logger.warn({ ...candidate, error: described.message, reason: described.reason, retry }, "Candidate failed");
188
+ // 重试延迟
189
+ if (retry < maxRetries) {
190
+ await delay(retryDelay * (retry + 1));
191
+ }
192
+ }
193
+ }
194
+ }
195
+ // 所有候选都失败
196
+ if (attempts.length <= 1 && lastError) {
197
+ throw lastError;
198
+ }
199
+ const summary = attempts
200
+ .map((a) => `${a.provider}/${a.model}: ${a.error}${a.reason ? ` (${a.reason})` : ""}`)
201
+ .join(" | ");
202
+ throw new Error(`All models failed (${attempts.length}): ${summary}`, {
203
+ cause: lastError instanceof Error ? lastError : undefined,
204
+ });
205
+ }
206
+ /** 简化的重试执行 */
207
+ export async function runWithRetry(fn, options) {
208
+ const maxRetries = options?.maxRetries ?? 3;
209
+ const retryDelay = options?.retryDelay ?? 1000;
210
+ let lastError;
211
+ for (let attempt = 1; attempt <= maxRetries; attempt++) {
212
+ try {
213
+ return await fn();
214
+ }
215
+ catch (err) {
216
+ if (shouldRethrowAbort(err))
217
+ throw err;
218
+ lastError = err;
219
+ options?.onError?.(err, attempt);
220
+ if (attempt < maxRetries) {
221
+ await delay(retryDelay * attempt);
222
+ }
223
+ }
224
+ }
225
+ throw lastError;
226
+ }
227
+ //# sourceMappingURL=model-fallback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-fallback.js","sourceRoot":"","sources":["../../src/agents/model-fallback.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * 会话存储 - 支持内存和文件系统持久化
3
+ */
4
+ import type { ChatMessage, SessionStoreConfig } from "../types/index.js";
5
+ /** 会话数据 */
6
+ export interface SessionData {
7
+ messages: ChatMessage[];
8
+ summary?: string;
9
+ lastUpdate: number;
10
+ totalTokensUsed: number;
11
+ metadata?: Record<string, unknown>;
12
+ }
13
+ /** 会话存储接口 */
14
+ export interface SessionStore {
15
+ get(key: string): SessionData | undefined;
16
+ set(key: string, data: SessionData): void;
17
+ delete(key: string): boolean;
18
+ has(key: string): boolean;
19
+ keys(): string[];
20
+ clear(): void;
21
+ }
22
+ export declare class MemorySessionStore implements SessionStore {
23
+ private store;
24
+ private ttlMs;
25
+ constructor(ttlMs?: number);
26
+ get(key: string): SessionData | undefined;
27
+ set(key: string, data: SessionData): void;
28
+ delete(key: string): boolean;
29
+ has(key: string): boolean;
30
+ keys(): string[];
31
+ clear(): void;
32
+ private cleanup;
33
+ }
34
+ export declare class FileSessionStore implements SessionStore {
35
+ private directory;
36
+ private ttlMs;
37
+ private cache;
38
+ private cacheMaxAge;
39
+ constructor(directory?: string, ttlMs?: number);
40
+ private ensureDirectory;
41
+ private keyToFilename;
42
+ get(key: string): SessionData | undefined;
43
+ set(key: string, data: SessionData): void;
44
+ delete(key: string): boolean;
45
+ private deleteFile;
46
+ has(key: string): boolean;
47
+ keys(): string[];
48
+ clear(): void;
49
+ private cleanup;
50
+ }
51
+ /** 创建会话存储 */
52
+ export declare function createSessionStore(config?: SessionStoreConfig): SessionStore;
53
+ //# sourceMappingURL=session-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-store.d.ts","sourceRoot":"","sources":["../../src/agents/session-store.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAKzE,WAAW;AACX,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,aAAa;AACb,MAAM,WAAW,YAAY;IAC3B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAAC;IAC1C,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,IAAI,CAAC;IAC1C,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAC7B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAC1B,IAAI,IAAI,MAAM,EAAE,CAAC;IACjB,KAAK,IAAI,IAAI,CAAC;CACf;AAID,qBAAa,kBAAmB,YAAW,YAAY;IACrD,OAAO,CAAC,KAAK,CAAkC;IAC/C,OAAO,CAAC,KAAK,CAAS;gBAEV,KAAK,SAAW;IAM5B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IASzC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,IAAI;IAIzC,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAI5B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIzB,IAAI,IAAI,MAAM,EAAE;IAKhB,KAAK,IAAI,IAAI;IAIb,OAAO,CAAC,OAAO;CAQhB;AAiBD,qBAAa,gBAAiB,YAAW,YAAY;IACnD,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,KAAK,CAA8D;IAC3E,OAAO,CAAC,WAAW,CAAU;gBAEjB,SAAS,CAAC,EAAE,MAAM,EAAE,KAAK,SAAW;IAShD,OAAO,CAAC,eAAe;IAOvB,OAAO,CAAC,aAAa;IAMrB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAmCzC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,IAAI;IA0BzC,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAK5B,OAAO,CAAC,UAAU;IAalB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIzB,IAAI,IAAI,MAAM,EAAE;IAWhB,KAAK,IAAI,IAAI;IAab,OAAO,CAAC,OAAO;CA6BhB;AAID,aAAa;AACb,wBAAgB,kBAAkB,CAAC,MAAM,CAAC,EAAE,kBAAkB,GAAG,YAAY,CAS5E"}