skyloom 1.4.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 (225) hide show
  1. package/.github/workflows/ci.yml +36 -0
  2. package/CONVERSION_PLAN.md +191 -0
  3. package/README.md +67 -0
  4. package/dist/agents/dew.d.ts +15 -0
  5. package/dist/agents/dew.d.ts.map +1 -0
  6. package/dist/agents/dew.js +74 -0
  7. package/dist/agents/dew.js.map +1 -0
  8. package/dist/agents/fair.d.ts +15 -0
  9. package/dist/agents/fair.d.ts.map +1 -0
  10. package/dist/agents/fair.js +106 -0
  11. package/dist/agents/fair.js.map +1 -0
  12. package/dist/agents/fog.d.ts +15 -0
  13. package/dist/agents/fog.d.ts.map +1 -0
  14. package/dist/agents/fog.js +52 -0
  15. package/dist/agents/fog.js.map +1 -0
  16. package/dist/agents/frost.d.ts +15 -0
  17. package/dist/agents/frost.d.ts.map +1 -0
  18. package/dist/agents/frost.js +54 -0
  19. package/dist/agents/frost.js.map +1 -0
  20. package/dist/agents/rain.d.ts +15 -0
  21. package/dist/agents/rain.d.ts.map +1 -0
  22. package/dist/agents/rain.js +54 -0
  23. package/dist/agents/rain.js.map +1 -0
  24. package/dist/agents/snow.d.ts +27 -0
  25. package/dist/agents/snow.d.ts.map +1 -0
  26. package/dist/agents/snow.js +226 -0
  27. package/dist/agents/snow.js.map +1 -0
  28. package/dist/cli/main.d.ts +7 -0
  29. package/dist/cli/main.d.ts.map +1 -0
  30. package/dist/cli/main.js +402 -0
  31. package/dist/cli/main.js.map +1 -0
  32. package/dist/cli/mode.d.ts +17 -0
  33. package/dist/cli/mode.d.ts.map +1 -0
  34. package/dist/cli/mode.js +56 -0
  35. package/dist/cli/mode.js.map +1 -0
  36. package/dist/core/agent.d.ts +174 -0
  37. package/dist/core/agent.d.ts.map +1 -0
  38. package/dist/core/agent.js +1332 -0
  39. package/dist/core/agent.js.map +1 -0
  40. package/dist/core/agent_helpers.d.ts +51 -0
  41. package/dist/core/agent_helpers.d.ts.map +1 -0
  42. package/dist/core/agent_helpers.js +477 -0
  43. package/dist/core/agent_helpers.js.map +1 -0
  44. package/dist/core/bus.d.ts +99 -0
  45. package/dist/core/bus.d.ts.map +1 -0
  46. package/dist/core/bus.js +191 -0
  47. package/dist/core/bus.js.map +1 -0
  48. package/dist/core/cache.d.ts +63 -0
  49. package/dist/core/cache.d.ts.map +1 -0
  50. package/dist/core/cache.js +121 -0
  51. package/dist/core/cache.js.map +1 -0
  52. package/dist/core/checkpoint.d.ts +19 -0
  53. package/dist/core/checkpoint.d.ts.map +1 -0
  54. package/dist/core/checkpoint.js +120 -0
  55. package/dist/core/checkpoint.js.map +1 -0
  56. package/dist/core/circuit_breaker.d.ts +46 -0
  57. package/dist/core/circuit_breaker.d.ts.map +1 -0
  58. package/dist/core/circuit_breaker.js +99 -0
  59. package/dist/core/circuit_breaker.js.map +1 -0
  60. package/dist/core/config.d.ts +97 -0
  61. package/dist/core/config.d.ts.map +1 -0
  62. package/dist/core/config.js +281 -0
  63. package/dist/core/config.js.map +1 -0
  64. package/dist/core/constants.d.ts +78 -0
  65. package/dist/core/constants.d.ts.map +1 -0
  66. package/dist/core/constants.js +84 -0
  67. package/dist/core/constants.js.map +1 -0
  68. package/dist/core/factory.d.ts +63 -0
  69. package/dist/core/factory.d.ts.map +1 -0
  70. package/dist/core/factory.js +537 -0
  71. package/dist/core/factory.js.map +1 -0
  72. package/dist/core/icons.d.ts +28 -0
  73. package/dist/core/icons.d.ts.map +1 -0
  74. package/dist/core/icons.js +86 -0
  75. package/dist/core/icons.js.map +1 -0
  76. package/dist/core/index.d.ts +29 -0
  77. package/dist/core/index.d.ts.map +1 -0
  78. package/dist/core/index.js +54 -0
  79. package/dist/core/index.js.map +1 -0
  80. package/dist/core/llm.d.ts +121 -0
  81. package/dist/core/llm.d.ts.map +1 -0
  82. package/dist/core/llm.js +532 -0
  83. package/dist/core/llm.js.map +1 -0
  84. package/dist/core/logger.d.ts +57 -0
  85. package/dist/core/logger.d.ts.map +1 -0
  86. package/dist/core/logger.js +122 -0
  87. package/dist/core/logger.js.map +1 -0
  88. package/dist/core/mcp.d.ts +190 -0
  89. package/dist/core/mcp.d.ts.map +1 -0
  90. package/dist/core/mcp.js +822 -0
  91. package/dist/core/mcp.js.map +1 -0
  92. package/dist/core/mcp_server.d.ts +26 -0
  93. package/dist/core/mcp_server.d.ts.map +1 -0
  94. package/dist/core/mcp_server.js +211 -0
  95. package/dist/core/mcp_server.js.map +1 -0
  96. package/dist/core/memory.d.ts +190 -0
  97. package/dist/core/memory.d.ts.map +1 -0
  98. package/dist/core/memory.js +988 -0
  99. package/dist/core/memory.js.map +1 -0
  100. package/dist/core/middleware.d.ts +114 -0
  101. package/dist/core/middleware.d.ts.map +1 -0
  102. package/dist/core/middleware.js +248 -0
  103. package/dist/core/middleware.js.map +1 -0
  104. package/dist/core/pipelines.d.ts +87 -0
  105. package/dist/core/pipelines.d.ts.map +1 -0
  106. package/dist/core/pipelines.js +301 -0
  107. package/dist/core/pipelines.js.map +1 -0
  108. package/dist/core/profile.d.ts +23 -0
  109. package/dist/core/profile.d.ts.map +1 -0
  110. package/dist/core/profile.js +289 -0
  111. package/dist/core/profile.js.map +1 -0
  112. package/dist/core/router.d.ts +24 -0
  113. package/dist/core/router.d.ts.map +1 -0
  114. package/dist/core/router.js +111 -0
  115. package/dist/core/router.js.map +1 -0
  116. package/dist/core/schemas.d.ts +82 -0
  117. package/dist/core/schemas.d.ts.map +1 -0
  118. package/dist/core/schemas.js +200 -0
  119. package/dist/core/schemas.js.map +1 -0
  120. package/dist/core/semantic.d.ts +92 -0
  121. package/dist/core/semantic.d.ts.map +1 -0
  122. package/dist/core/semantic.js +175 -0
  123. package/dist/core/semantic.js.map +1 -0
  124. package/dist/core/skill.d.ts +68 -0
  125. package/dist/core/skill.d.ts.map +1 -0
  126. package/dist/core/skill.js +350 -0
  127. package/dist/core/skill.js.map +1 -0
  128. package/dist/core/tool.d.ts +99 -0
  129. package/dist/core/tool.d.ts.map +1 -0
  130. package/dist/core/tool.js +341 -0
  131. package/dist/core/tool.js.map +1 -0
  132. package/dist/core/tool_router.d.ts +29 -0
  133. package/dist/core/tool_router.d.ts.map +1 -0
  134. package/dist/core/tool_router.js +172 -0
  135. package/dist/core/tool_router.js.map +1 -0
  136. package/dist/core/workspace.d.ts +48 -0
  137. package/dist/core/workspace.d.ts.map +1 -0
  138. package/dist/core/workspace.js +179 -0
  139. package/dist/core/workspace.js.map +1 -0
  140. package/dist/plugins/loader.d.ts +17 -0
  141. package/dist/plugins/loader.d.ts.map +1 -0
  142. package/dist/plugins/loader.js +96 -0
  143. package/dist/plugins/loader.js.map +1 -0
  144. package/dist/skills/loader.d.ts +9 -0
  145. package/dist/skills/loader.d.ts.map +1 -0
  146. package/dist/skills/loader.js +78 -0
  147. package/dist/skills/loader.js.map +1 -0
  148. package/dist/tools/builtin.d.ts +10 -0
  149. package/dist/tools/builtin.d.ts.map +1 -0
  150. package/dist/tools/builtin.js +414 -0
  151. package/dist/tools/builtin.js.map +1 -0
  152. package/dist/tools/computer.d.ts +12 -0
  153. package/dist/tools/computer.d.ts.map +1 -0
  154. package/dist/tools/computer.js +326 -0
  155. package/dist/tools/computer.js.map +1 -0
  156. package/dist/tools/delegate.d.ts +10 -0
  157. package/dist/tools/delegate.d.ts.map +1 -0
  158. package/dist/tools/delegate.js +45 -0
  159. package/dist/tools/delegate.js.map +1 -0
  160. package/dist/web/server.d.ts +5 -0
  161. package/dist/web/server.d.ts.map +1 -0
  162. package/dist/web/server.js +647 -0
  163. package/dist/web/server.js.map +1 -0
  164. package/dist/web/tts.d.ts +33 -0
  165. package/dist/web/tts.d.ts.map +1 -0
  166. package/dist/web/tts.js +69 -0
  167. package/dist/web/tts.js.map +1 -0
  168. package/package.json +60 -0
  169. package/scripts/install.js +48 -0
  170. package/scripts/link.js +10 -0
  171. package/setup.bat +79 -0
  172. package/skill-test-ty2fOA/test.md +10 -0
  173. package/src/agents/dew.ts +70 -0
  174. package/src/agents/fair.ts +102 -0
  175. package/src/agents/fog.ts +48 -0
  176. package/src/agents/frost.ts +50 -0
  177. package/src/agents/rain.ts +50 -0
  178. package/src/agents/snow.ts +239 -0
  179. package/src/cli/main.ts +405 -0
  180. package/src/cli/mode.ts +58 -0
  181. package/src/core/agent.ts +1506 -0
  182. package/src/core/agent_helpers.ts +461 -0
  183. package/src/core/bus.ts +221 -0
  184. package/src/core/cache.ts +153 -0
  185. package/src/core/checkpoint.ts +94 -0
  186. package/src/core/circuit_breaker.ts +119 -0
  187. package/src/core/config.ts +341 -0
  188. package/src/core/constants.ts +95 -0
  189. package/src/core/factory.ts +627 -0
  190. package/src/core/icons.ts +53 -0
  191. package/src/core/index.ts +31 -0
  192. package/src/core/llm.ts +724 -0
  193. package/src/core/logger.ts +144 -0
  194. package/src/core/mcp.ts +953 -0
  195. package/src/core/mcp_server.ts +176 -0
  196. package/src/core/memory.ts +1169 -0
  197. package/src/core/middleware.ts +350 -0
  198. package/src/core/pipelines.ts +424 -0
  199. package/src/core/profile.ts +255 -0
  200. package/src/core/router.ts +124 -0
  201. package/src/core/schemas.ts +282 -0
  202. package/src/core/semantic.ts +211 -0
  203. package/src/core/skill.ts +342 -0
  204. package/src/core/tool.ts +427 -0
  205. package/src/core/tool_router.ts +193 -0
  206. package/src/core/workspace.ts +150 -0
  207. package/src/plugins/loader.ts +66 -0
  208. package/src/skills/loader.ts +46 -0
  209. package/src/sql.js.d.ts +29 -0
  210. package/src/tools/builtin.ts +382 -0
  211. package/src/tools/computer.ts +269 -0
  212. package/src/tools/delegate.ts +49 -0
  213. package/src/web/server.ts +634 -0
  214. package/src/web/tts.ts +93 -0
  215. package/tests/bus.test.ts +121 -0
  216. package/tests/icons.test.ts +45 -0
  217. package/tests/router.test.ts +86 -0
  218. package/tests/schemas.test.ts +51 -0
  219. package/tests/semantic.test.ts +83 -0
  220. package/tests/setup.ts +10 -0
  221. package/tests/skill.test.ts +172 -0
  222. package/tests/tool.test.ts +108 -0
  223. package/tests/tool_router.test.ts +71 -0
  224. package/tsconfig.json +37 -0
  225. package/vitest.config.ts +17 -0
@@ -0,0 +1,532 @@
1
+ "use strict";
2
+ /**
3
+ * LLM abstraction layer with LiteLLM-compatible routing, retry, fallback, cost tracking, and budget control.
4
+ *
5
+ * Provides unified interface for multiple LLM providers (OpenAI, Anthropic, DeepSeek, etc.)
6
+ * with automatic fallback chains, prompt caching for Anthropic, and cost estimation.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.LLMClient = void 0;
10
+ exports.estimateCost = estimateCost;
11
+ const cache_1 = require("./cache");
12
+ /**
13
+ * Split model string into provider and model name (e.g., "anthropic/claude-3-opus" → ["anthropic", "claude-3-opus"]).
14
+ */
15
+ function splitProvider(model) {
16
+ if (!model.includes("/")) {
17
+ return [null, model];
18
+ }
19
+ const [head, ...rest] = model.split("/");
20
+ const provider = head.toLowerCase();
21
+ const knownProviders = getKnownProviders();
22
+ if (knownProviders.has(provider)) {
23
+ return [provider, rest.join("/")];
24
+ }
25
+ return [null, model];
26
+ }
27
+ /**
28
+ * Get set of known provider ID prefixes.
29
+ */
30
+ function getKnownProviders() {
31
+ return new Set([
32
+ "openai",
33
+ "azure",
34
+ "anthropic",
35
+ "deepseek",
36
+ "ollama",
37
+ "groq",
38
+ "mistral",
39
+ "cohere",
40
+ "together_ai",
41
+ "openrouter",
42
+ "gemini",
43
+ "vertex_ai",
44
+ ]);
45
+ }
46
+ /**
47
+ * Get provider-to-env-var mapping.
48
+ */
49
+ function getProviderEnvMap() {
50
+ const envMap = new Map([
51
+ ["openai", "OPENAI_API_KEY"],
52
+ ["anthropic", "ANTHROPIC_API_KEY"],
53
+ ["deepseek", "DEEPSEEK_API_KEY"],
54
+ ["groq", "GROQ_API_KEY"],
55
+ ["mistral", "MISTRAL_API_KEY"],
56
+ ["cohere", "COHERE_API_KEY"],
57
+ ["openrouter", "OPENROUTER_API_KEY"],
58
+ ["gemini", "GEMINI_API_KEY"],
59
+ ]);
60
+ return envMap;
61
+ }
62
+ /**
63
+ * Check if model targets Anthropic's API.
64
+ */
65
+ function isAnthropicModel(model) {
66
+ const lowered = model.toLowerCase();
67
+ if (lowered.startsWith("anthropic/") || lowered.startsWith("claude")) {
68
+ return true;
69
+ }
70
+ const [provider] = splitProvider(model);
71
+ return provider === "anthropic";
72
+ }
73
+ /**
74
+ * Check if model targets DeepSeek's API.
75
+ */
76
+ function isDeepseekModel(model) {
77
+ const [provider, stripped] = splitProvider(model);
78
+ const lowered = model.toLowerCase();
79
+ return (provider === "deepseek" ||
80
+ lowered.startsWith("deepseek") ||
81
+ stripped.startsWith("deepseek"));
82
+ }
83
+ /**
84
+ * Check if DeepSeek model supports tool calls.
85
+ * Reasoning models are not reliable function-call models.
86
+ */
87
+ function deepseekSupportsTools(model) {
88
+ const lowered = model.toLowerCase();
89
+ return !["reasoner", "-r1", "/r1"].some((part) => lowered.includes(part));
90
+ }
91
+ /**
92
+ * Filter models by tool compatibility.
93
+ */
94
+ function toolCompatibleModels(primary, models, needsTools) {
95
+ if (!needsTools) {
96
+ return models;
97
+ }
98
+ const compatible = models.filter((m) => !isDeepseekModel(m) || deepseekSupportsTools(m));
99
+ if (compatible.length > 0) {
100
+ return compatible;
101
+ }
102
+ if (isDeepseekModel(primary)) {
103
+ return ["deepseek/deepseek-chat"];
104
+ }
105
+ return models;
106
+ }
107
+ /**
108
+ * Apply Anthropic ephemeral cache markers to messages and tools.
109
+ *
110
+ * Anthropic charges full input tokens for repeated identical prefixes.
111
+ * Adding `cache_control: {"type": "ephemeral"}` to system prompt and tools
112
+ * enables 5-minute KV cache, reducing input cost ~80% on subsequent turns.
113
+ */
114
+ function _applyAnthropicCacheControl(model, messages, toolSchemas) {
115
+ if (!isAnthropicModel(model)) {
116
+ return [messages, toolSchemas];
117
+ }
118
+ // Process messages to add cache_control to system message
119
+ const newMessages = [];
120
+ let cachedSystem = false;
121
+ for (const msg of messages) {
122
+ if (!cachedSystem &&
123
+ msg.role === "system" &&
124
+ typeof msg.content === "string") {
125
+ const content = msg.content;
126
+ if (content) {
127
+ newMessages.push({
128
+ role: "system",
129
+ content: [
130
+ {
131
+ type: "text",
132
+ text: content,
133
+ cache_control: { type: "ephemeral" },
134
+ },
135
+ ],
136
+ });
137
+ cachedSystem = true;
138
+ continue;
139
+ }
140
+ }
141
+ if (!cachedSystem &&
142
+ msg.role === "system" &&
143
+ Array.isArray(msg.content)) {
144
+ const content = msg.content;
145
+ if (content.length > 0) {
146
+ const newBlocks = content.map((block) => ({ ...block }));
147
+ const lastBlock = newBlocks[newBlocks.length - 1];
148
+ newBlocks[newBlocks.length - 1] = {
149
+ ...lastBlock,
150
+ cache_control: { type: "ephemeral" },
151
+ };
152
+ newMessages.push({
153
+ ...msg,
154
+ content: newBlocks,
155
+ });
156
+ cachedSystem = true;
157
+ continue;
158
+ }
159
+ }
160
+ newMessages.push(msg);
161
+ }
162
+ // Add cache_control to tool schemas
163
+ let newTools = null;
164
+ if (toolSchemas && toolSchemas.length > 0) {
165
+ newTools = toolSchemas.map((t) => ({ ...t }));
166
+ const lastTool = newTools[newTools.length - 1];
167
+ newTools[newTools.length - 1] = {
168
+ ...lastTool,
169
+ cache_control: { type: "ephemeral" },
170
+ };
171
+ }
172
+ return [newMessages, newTools];
173
+ }
174
+ /**
175
+ * Estimate token count for mixed CJK/English text.
176
+ * CJK characters ~2 tokens each, non-CJK ~4 chars per token.
177
+ */
178
+ function _estimateTokens(text) {
179
+ // Count CJK characters (simplified check)
180
+ const cjkRegex = /[\u4E00-\u9FFF\u3040-\u309F\uAC00-\uD7AF]/g;
181
+ const cjkCount = (text.match(cjkRegex) || []).length;
182
+ const otherCount = text.length - cjkCount;
183
+ return Math.max(1, cjkCount * 2 + Math.floor(otherCount / 4));
184
+ }
185
+ /**
186
+ * Cost per 1K tokens (input / output) — USD.
187
+ */
188
+ const MODEL_COST_ESTIMATES = new Map([
189
+ ["gpt-4o", [0.0025, 0.01]],
190
+ ["gpt-4o-mini", [0.00015, 0.0006]],
191
+ ["gpt-4.1", [0.002, 0.008]],
192
+ ["gpt-4.1-mini", [0.0004, 0.0016]],
193
+ ["gpt-4.1-nano", [0.0001, 0.0004]],
194
+ ["o3", [0.01, 0.04]],
195
+ ["o4-mini", [0.0011, 0.0044]],
196
+ ["claude-sonnet-4-6", [0.003, 0.015]],
197
+ ["claude-opus-4-7", [0.005, 0.025]],
198
+ ["claude-haiku-4-5", [0.0008, 0.004]],
199
+ ["deepseek-chat", [0.00027, 0.0011]],
200
+ ["deepseek-reasoner", [0.00055, 0.00219]],
201
+ ["deepseek-v4-flash", [0.00014, 0.00028]],
202
+ ["deepseek-v4-pro", [0.00174, 0.00348]],
203
+ ["deepseek/deepseek-chat", [0.00027, 0.0011]],
204
+ ["deepseek/deepseek-reasoner", [0.00055, 0.00219]],
205
+ ["deepseek/deepseek-v4-flash", [0.00014, 0.00028]],
206
+ ["deepseek/deepseek-v4-pro", [0.00174, 0.00348]],
207
+ ["gemini/gemini-2.5-flash", [0.0003, 0.0025]],
208
+ ["gemini/gemini-2.5-pro", [0.00125, 0.01]],
209
+ ["ollama/llama3", [0.0, 0.0]],
210
+ ["ollama/qwen2.5", [0.0, 0.0]],
211
+ ]);
212
+ /**
213
+ * Fallback chains for model availability.
214
+ */
215
+ const FALLBACK_CHAINS = new Map([
216
+ ["gpt-4o", ["gpt-4o-mini"]],
217
+ ["gpt-4o-mini", ["gpt-4o"]],
218
+ ["gpt-4.1", ["gpt-4.1-mini", "gpt-4o-mini"]],
219
+ ["gpt-4.1-mini", ["gpt-4o-mini"]],
220
+ ["gpt-4.1-nano", ["gpt-4.1-mini"]],
221
+ ["o3", ["o4-mini", "gpt-4.1"]],
222
+ ["o4-mini", ["gpt-4.1-mini"]],
223
+ ["claude-sonnet-4-6", ["claude-haiku-4-5", "gpt-4.1-mini"]],
224
+ ["claude-opus-4-7", ["claude-sonnet-4-6", "gpt-4.1"]],
225
+ ["claude-haiku-4-5", ["gpt-4.1-mini"]],
226
+ ["deepseek-chat", ["deepseek/deepseek-chat", "gpt-4.1-mini"]],
227
+ ["deepseek-reasoner", ["deepseek/deepseek-chat", "gpt-4.1-mini"]],
228
+ ["deepseek-v4-flash", ["deepseek/deepseek-chat", "gpt-4.1-mini"]],
229
+ ["deepseek-v4-pro", ["deepseek-v4-flash", "deepseek/deepseek-chat", "gpt-4.1-mini"]],
230
+ ["deepseek/deepseek-chat", ["gpt-4.1-mini"]],
231
+ ["deepseek/deepseek-reasoner", ["deepseek/deepseek-chat", "gpt-4.1-mini"]],
232
+ ["deepseek/deepseek-v4-flash", ["deepseek/deepseek-chat", "gpt-4.1-mini"]],
233
+ ["deepseek/deepseek-v4-pro", [
234
+ "deepseek/deepseek-v4-flash",
235
+ "deepseek/deepseek-chat",
236
+ "gpt-4.1-mini",
237
+ ]],
238
+ ["gemini/gemini-2.5-flash", ["gemini/gemini-2.5-pro", "gpt-4.1-mini"]],
239
+ ["gemini/gemini-2.5-pro", ["gpt-4.1"]],
240
+ ]);
241
+ /**
242
+ * HTTP status codes that are considered transient errors (worth retrying).
243
+ */
244
+ const RETRYABLE_STATUSES = new Set([408, 425, 429, 500, 502, 503, 504]);
245
+ /**
246
+ * Check if an exception is worth retrying.
247
+ */
248
+ function isTransientError(err) {
249
+ if (err instanceof Error) {
250
+ const status = err.status_code || err.http_status || 0;
251
+ if (status && RETRYABLE_STATUSES.has(status)) {
252
+ return true;
253
+ }
254
+ if (err.name === "TimeoutError") {
255
+ return true;
256
+ }
257
+ const errName = err.constructor.name.toLowerCase();
258
+ return [
259
+ "ratelimiterror",
260
+ "apitimeouterror",
261
+ "apiconnectionerror",
262
+ "serviceunavailableerror",
263
+ "internalservererror",
264
+ "timeout",
265
+ ].includes(errName);
266
+ }
267
+ return false;
268
+ }
269
+ /**
270
+ * Estimate cost for LLM API call.
271
+ */
272
+ function estimateCost(model, promptTokens, completionTokens) {
273
+ const costs = MODEL_COST_ESTIMATES.get(model) || [0.001, 0.002];
274
+ return ((promptTokens / 1000) * costs[0] + (completionTokens / 1000) * costs[1]);
275
+ }
276
+ /**
277
+ * Format user-facing error message for LLM failures.
278
+ */
279
+ function formatUserFacingError(model, err) {
280
+ const text = err instanceof Error ? err.message : String(err);
281
+ const lowered = text.toLowerCase();
282
+ const [provider] = splitProvider(model);
283
+ // Missing API key
284
+ if (lowered.includes("api_key") ||
285
+ lowered.includes("authentication") ||
286
+ lowered.includes("unauthorized")) {
287
+ const envMap = getProviderEnvMap();
288
+ const envVar = envMap.get(provider || "") || "the appropriate *_API_KEY";
289
+ const configured = Array.from(envMap.entries())
290
+ .filter(([, e]) => process.env[e])
291
+ .map(([p]) => p)
292
+ .join(", ");
293
+ const hint = configured
294
+ ? `已配置: ${configured}。`
295
+ : "未配置任何 API key。";
296
+ return (`❌ ${model} 调用失败:缺少或无效的 API key。\n` +
297
+ `请确认 \`${envVar}\` 已设置,或运行 \`sky init\` 重新配置。${hint}`);
298
+ }
299
+ if (lowered.includes("rate limit") || text.includes("429")) {
300
+ return `❌ ${model} 速率受限,请稍后重试。`;
301
+ }
302
+ if (lowered.includes("timeout")) {
303
+ return `❌ ${model} 请求超时,请稍后重试或调高超时时间。`;
304
+ }
305
+ if (lowered.includes("model") &&
306
+ (lowered.includes("not found") || lowered.includes("does not exist"))) {
307
+ return (`❌ ${model} 不是该 provider 的有效模型 ID。\n` +
308
+ `请运行配置检查或 \`sky init\` 重新选择。`);
309
+ }
310
+ // Content filtering / safety
311
+ if ([
312
+ "content exists risk",
313
+ "content_policy",
314
+ "content_filter",
315
+ "content_filtered",
316
+ "safety",
317
+ "blocked by safety",
318
+ "responsibleaipolicyviolation",
319
+ "policy_violation",
320
+ ].some((kw) => lowered.includes(kw))) {
321
+ const short = text.split("\n")[0].slice(0, 200);
322
+ return (`❌ ${model} 拒绝该请求 (内容审核):${short}\n` +
323
+ `原因:provider 的内容安全过滤判定此次提问/上下文敏感。\n` +
324
+ `建议:\n` +
325
+ ` - 换一个 provider(如 OpenAI / Anthropic)\n` +
326
+ ` - 把敏感关键词改写得更通用后重发`);
327
+ }
328
+ // Bad request / malformed sequence
329
+ if ([
330
+ "bad request",
331
+ "invalid_request",
332
+ "tool_calls",
333
+ "tool messages",
334
+ ].some((kw) => lowered.includes(kw)) ||
335
+ err instanceof Error && err.constructor.name.toLowerCase().includes("badrequest")) {
336
+ const short = text.split("\n")[0].slice(0, 200);
337
+ return (`❌ ${model} 调用失败 (Bad Request):${short}\n` +
338
+ `会话消息序列可能损坏,请清理后重试。`);
339
+ }
340
+ const short = text.split("\n")[0].slice(0, 200) || (err instanceof Error ? err.name : "Unknown error");
341
+ return `❌ ${model} 调用失败:${short}`;
342
+ }
343
+ /**
344
+ * Unified LLM client with retry, fallback chains, caching, cost tracking, and budget control.
345
+ */
346
+ class LLMClient {
347
+ constructor(config, toolRegistry, costLimit = null) {
348
+ this.usageStats = new Map();
349
+ this.totalCost = 0;
350
+ this.log = null;
351
+ this.config = config;
352
+ this._toolRegistry = toolRegistry;
353
+ this._cache = new cache_1.LLMCache(256, 120);
354
+ this.costLimit = costLimit;
355
+ }
356
+ /**
357
+ * Set logger instance for event tracking.
358
+ */
359
+ setLogger(log) {
360
+ this.log = log;
361
+ }
362
+ /**
363
+ * Get model for a specific agent or default.
364
+ */
365
+ getModel(agentName) {
366
+ if (agentName) {
367
+ const agentCfg = this.config.agents?.[agentName];
368
+ if (agentCfg?.model) {
369
+ return String(agentCfg.model);
370
+ }
371
+ }
372
+ return this.config.llm?.defaultModel || "gpt-4o";
373
+ }
374
+ /**
375
+ * Get max retries from config.
376
+ */
377
+ _getRetries() {
378
+ return this.config.llm?.maxRetries ?? 2;
379
+ }
380
+ /**
381
+ * Track token usage and cost.
382
+ */
383
+ trackUsage(agentName, model, promptTokens, completionTokens) {
384
+ const key = agentName || "default";
385
+ if (!this.usageStats.has(key)) {
386
+ this.usageStats.set(key, {
387
+ prompt_tokens: 0,
388
+ completion_tokens: 0,
389
+ calls: 0,
390
+ cost: 0,
391
+ });
392
+ }
393
+ const stats = this.usageStats.get(key);
394
+ stats.prompt_tokens += promptTokens;
395
+ stats.completion_tokens += completionTokens;
396
+ stats.calls += 1;
397
+ const cost = estimateCost(model, promptTokens, completionTokens);
398
+ stats.cost += cost;
399
+ this.totalCost += cost;
400
+ }
401
+ /**
402
+ * Check if cost limit exceeded.
403
+ */
404
+ checkBudget() {
405
+ if (this.costLimit !== null && this.totalCost >= this.costLimit) {
406
+ throw new Error(`Cost limit exceeded: $${this.totalCost.toFixed(4)} >= $${this.costLimit.toFixed(4)}`);
407
+ }
408
+ }
409
+ /**
410
+ * Check if API key is available for model.
411
+ */
412
+ hasKeyForModel(model) {
413
+ let [provider] = splitProvider(model);
414
+ if (!provider) {
415
+ const lowered = model.toLowerCase();
416
+ for (const p of getKnownProviders()) {
417
+ if (lowered.includes(p)) {
418
+ provider = p;
419
+ break;
420
+ }
421
+ }
422
+ }
423
+ if (!provider) {
424
+ return true; // Can't determine; don't skip
425
+ }
426
+ const envMap = getProviderEnvMap();
427
+ const envVar = envMap.get(provider) || `${provider.toUpperCase()}_API_KEY`;
428
+ return !!process.env[envVar];
429
+ }
430
+ /**
431
+ * Get usage statistics.
432
+ */
433
+ getUsageStats() {
434
+ return new Map(this.usageStats);
435
+ }
436
+ /**
437
+ * Get total cost.
438
+ */
439
+ getTotalCost() {
440
+ return this.totalCost;
441
+ }
442
+ /**
443
+ * Reset usage statistics and cost.
444
+ */
445
+ resetUsageStats() {
446
+ this.usageStats.clear();
447
+ this.totalCost = 0;
448
+ }
449
+ /**
450
+ * Complete a prompt (dummy implementation).
451
+ *
452
+ * Note: Full implementation requires integrating with an actual LLM API provider.
453
+ * This is a placeholder that shows the structure and interface.
454
+ */
455
+ async complete(messages, agentName, tools, stream = false, overrides) {
456
+ this.checkBudget();
457
+ const ov = overrides || {};
458
+ const rawModel = ov.model;
459
+ const model = typeof rawModel === "string" ? rawModel : this.getModel(agentName);
460
+ // Build fallback chain
461
+ const fallbackModels = FALLBACK_CHAINS.get(model)?.filter((m) => this.hasKeyForModel(m)) || [];
462
+ const modelsToTry = toolCompatibleModels(model, [model, ...fallbackModels], !!tools);
463
+ // Try each model in sequence
464
+ let lastError = null;
465
+ for (const attemptModel of modelsToTry) {
466
+ try {
467
+ this.checkBudget();
468
+ return await this.completeWithRetry(attemptModel, messages, agentName, tools, stream, overrides);
469
+ }
470
+ catch (e) {
471
+ lastError = e instanceof Error ? e : new Error(String(e));
472
+ this.log?.warn("llm_fallback", {
473
+ model: attemptModel,
474
+ agent: agentName,
475
+ error: lastError.message,
476
+ });
477
+ continue;
478
+ }
479
+ }
480
+ // All models failed
481
+ return {
482
+ content: formatUserFacingError(model, lastError),
483
+ toolCalls: [],
484
+ model,
485
+ usage: { promptTokens: 0, completionTokens: 0 },
486
+ cost: 0,
487
+ truncated: false,
488
+ };
489
+ }
490
+ /**
491
+ * Complete with retry logic (placeholder).
492
+ */
493
+ async completeWithRetry(model, _messages, _agentName, _tools, _stream = false, overrides) {
494
+ // This is a placeholder. Real implementation would:
495
+ // 1. Validate cache
496
+ // 2. Call actual LLM API (OpenAI, Anthropic, etc.)
497
+ // 3. Apply Anthropic cache control if needed
498
+ // 4. Handle retry logic with exponential backoff
499
+ // 5. Track usage and cost
500
+ // 6. Cache results if appropriate
501
+ const _temperature = overrides?.temperature ?? 0.7;
502
+ const _maxTokens = overrides?.maxTokens ?? 2000;
503
+ // For now, return a dummy response
504
+ return {
505
+ content: "Placeholder response from LLM",
506
+ toolCalls: [],
507
+ model,
508
+ usage: { promptTokens: 100, completionTokens: 50 },
509
+ cost: estimateCost(model, 100, 50),
510
+ truncated: false,
511
+ };
512
+ }
513
+ /**
514
+ * Stream a completion (placeholder).
515
+ */
516
+ async *stream(_messages, _agentName) {
517
+ // Placeholder implementation
518
+ yield "Streaming response...";
519
+ }
520
+ /**
521
+ * Stream completion with tool awareness (placeholder).
522
+ */
523
+ async *streamWithTools(_messages, _agentName, _tools, _toolRegistry, _overrides) {
524
+ // Placeholder implementation
525
+ yield {
526
+ type: "content",
527
+ text: "Tool-aware streaming response...",
528
+ };
529
+ }
530
+ }
531
+ exports.LLMClient = LLMClient;
532
+ //# sourceMappingURL=llm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm.js","sourceRoot":"","sources":["../../src/core/llm.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Structured logging for Skyloom.
3
+ *
4
+ * Usage:
5
+ * const log = getLogger("fog");
6
+ * log.info("chat_request", { userMessage: "hello", agent: "fog" });
7
+ */
8
+ export declare enum LogLevel {
9
+ DEBUG = 0,
10
+ INFO = 1,
11
+ WARN = 2,
12
+ ERROR = 3
13
+ }
14
+ export interface LogEntry {
15
+ ts: string;
16
+ level: string;
17
+ logger: string;
18
+ msg: string;
19
+ request_id?: string;
20
+ [key: string]: unknown;
21
+ }
22
+ /**
23
+ * Logger instance for structured logging
24
+ */
25
+ export declare class Logger {
26
+ private name;
27
+ private minLevel;
28
+ constructor(name: string, minLevel?: LogLevel);
29
+ private formatEntry;
30
+ private output;
31
+ debug(msg: string, extra?: Record<string, unknown>): void;
32
+ info(msg: string, extra?: Record<string, unknown>): void;
33
+ warn(msg: string, extra?: Record<string, unknown>): void;
34
+ error(msg: string, extra?: Record<string, unknown>): void;
35
+ setLevel(level: LogLevel): void;
36
+ }
37
+ /**
38
+ * Get or create a logger for a component
39
+ */
40
+ export declare function getLogger(name: string): Logger;
41
+ /**
42
+ * Set the global request ID for tracing
43
+ */
44
+ export declare function setRequestId(id: string | null): void;
45
+ /**
46
+ * Get the current request ID
47
+ */
48
+ export declare function getRequestId(): string | null;
49
+ /**
50
+ * Set the global default log level
51
+ */
52
+ export declare function setDefaultLogLevel(level: LogLevel): void;
53
+ /**
54
+ * Get the current default log level
55
+ */
56
+ export declare function getDefaultLogLevel(): LogLevel;
57
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/core/logger.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,oBAAY,QAAQ;IAClB,KAAK,IAAI;IACT,IAAI,IAAI;IACR,IAAI,IAAI;IACR,KAAK,IAAI;CACV;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,qBAAa,MAAM;IACjB,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,QAAQ,CAAW;gBAEf,IAAI,EAAE,MAAM,EAAE,QAAQ,GAAE,QAAwB;IAK5D,OAAO,CAAC,WAAW;IAgBnB,OAAO,CAAC,MAAM;IAwBd,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAIlD,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAIjD,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAIjD,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAIlD,QAAQ,CAAC,KAAK,EAAE,QAAQ;CAGzB;AASD;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAK9C;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,QAE7C;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,GAAG,IAAI,CAE5C;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,QAAQ,QAKjD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,QAAQ,CAE7C"}