@downcity/city 1.1.12 → 1.1.14

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 (29) hide show
  1. package/README.md +21 -3
  2. package/bin/cli/agent/Run.d.ts.map +1 -1
  3. package/bin/cli/agent/Run.js +3 -3
  4. package/bin/cli/agent/Run.js.map +1 -1
  5. package/bin/cli/model/ModelManageCommand.js +2 -2
  6. package/bin/cli/model/ModelManageCommand.js.map +1 -1
  7. package/bin/cli/model/ModelManager.js +2 -2
  8. package/bin/cli/model/ModelManager.js.map +1 -1
  9. package/bin/control/ModelPoolService.js +2 -2
  10. package/bin/control/ModelPoolService.js.map +1 -1
  11. package/bin/control/instant/InstantSessionService.d.ts.map +1 -1
  12. package/bin/control/instant/InstantSessionService.js +10 -4
  13. package/bin/control/instant/InstantSessionService.js.map +1 -1
  14. package/bin/control/instant/InstantSystemComposer.d.ts +2 -2
  15. package/bin/control/instant/InstantSystemComposer.d.ts.map +1 -1
  16. package/bin/control/instant/InstantSystemComposer.js +2 -3
  17. package/bin/control/instant/InstantSystemComposer.js.map +1 -1
  18. package/bin/model/runtime/CreateRuntimeModel.d.ts +52 -0
  19. package/bin/model/runtime/CreateRuntimeModel.d.ts.map +1 -0
  20. package/bin/model/runtime/CreateRuntimeModel.js +371 -0
  21. package/bin/model/runtime/CreateRuntimeModel.js.map +1 -0
  22. package/package.json +2 -2
  23. package/src/cli/agent/Run.ts +2 -3
  24. package/src/cli/model/ModelManageCommand.ts +2 -2
  25. package/src/cli/model/ModelManager.ts +2 -2
  26. package/src/control/ModelPoolService.ts +2 -2
  27. package/src/control/instant/InstantSessionService.ts +11 -4
  28. package/src/control/instant/InstantSystemComposer.ts +2 -3
  29. package/src/model/runtime/CreateRuntimeModel.ts +462 -0
@@ -0,0 +1,371 @@
1
+ /**
2
+ * CreateRuntimeModel:city 宿主侧 LanguageModel 工厂。
3
+ *
4
+ * 关键点(中文)
5
+ * - `@downcity/agent` 只消费 `LanguageModel`,不再负责模型池解析。
6
+ * - `city` 负责把 `execution.modelId` 解析成平台模型池中的 provider/model 配置。
7
+ * - 这里统一承接 CLI、control plane、inline instant 等宿主场景的模型创建逻辑。
8
+ */
9
+ import { createAnthropic } from "@ai-sdk/anthropic";
10
+ import { createGoogleGenerativeAI } from "@ai-sdk/google";
11
+ import { createHuggingFace } from "@ai-sdk/huggingface";
12
+ import { createMoonshotAI } from "@ai-sdk/moonshotai";
13
+ import { createOpenResponses } from "@ai-sdk/open-responses";
14
+ import { createOpenAI } from "@ai-sdk/openai";
15
+ import { createOpenAICompatible } from "@ai-sdk/openai-compatible";
16
+ import { createXai } from "@ai-sdk/xai";
17
+ import { createOpenRouter } from "@openrouter/ai-sdk-provider";
18
+ import { getLogger, } from "@downcity/agent";
19
+ import { PlatformStore } from "../../platform/store/index.js";
20
+ function readProjectExecutionBinding(config) {
21
+ const execution = config.execution;
22
+ if (!execution || typeof execution !== "object")
23
+ return null;
24
+ if (execution.type !== "api")
25
+ return null;
26
+ const modelId = String(execution.modelId || "").trim();
27
+ if (!modelId)
28
+ return null;
29
+ return {
30
+ type: "api",
31
+ modelId,
32
+ };
33
+ }
34
+ function buildResponsesUrl(baseUrl) {
35
+ const trimmed = String(baseUrl || "")
36
+ .trim()
37
+ .replace(/\/+$/, "");
38
+ if (!trimmed)
39
+ return "https://api.openai.com/v1/responses";
40
+ if (trimmed.endsWith("/responses"))
41
+ return trimmed;
42
+ return `${trimmed}/responses`;
43
+ }
44
+ function normalizeOptionalBaseUrl(value) {
45
+ const trimmed = String(value || "")
46
+ .trim()
47
+ .replace(/\/+$/, "");
48
+ return trimmed || undefined;
49
+ }
50
+ function resolveProviderDefaultBaseUrl(providerType) {
51
+ if (providerType === "deepseek")
52
+ return "https://api.deepseek.com/v1";
53
+ if (providerType === "moonshot-cn")
54
+ return "https://api.moonshot.cn/v1";
55
+ if (providerType === "moonshot-ai")
56
+ return "https://api.moonshot.ai/v1";
57
+ if (providerType === "kimi-code")
58
+ return "https://api.kimi.com/coding/v1";
59
+ if (providerType === "xai")
60
+ return "https://api.x.ai/v1";
61
+ if (providerType === "openrouter")
62
+ return "https://openrouter.ai/api/v1";
63
+ return undefined;
64
+ }
65
+ function resolveEnvPlaceholder(value) {
66
+ if (!value)
67
+ return value;
68
+ if (value.startsWith("${") && value.endsWith("}")) {
69
+ const envVar = value.slice(2, -1);
70
+ return process.env[envVar];
71
+ }
72
+ return value;
73
+ }
74
+ function resolveApiKeyFallback(providerType) {
75
+ if (providerType === "gemini") {
76
+ return (process.env.GEMINI_API_KEY ||
77
+ process.env.GOOGLE_API_KEY ||
78
+ process.env.GOOGLE_GENERATIVE_AI_API_KEY ||
79
+ process.env.API_KEY);
80
+ }
81
+ if (providerType === "anthropic") {
82
+ return process.env.ANTHROPIC_API_KEY || process.env.API_KEY;
83
+ }
84
+ if (providerType === "deepseek") {
85
+ return (process.env.DEEPSEEK_API_KEY ||
86
+ process.env.OPENAI_API_KEY ||
87
+ process.env.API_KEY);
88
+ }
89
+ if (providerType === "xai") {
90
+ return process.env.XAI_API_KEY || process.env.API_KEY;
91
+ }
92
+ if (providerType === "huggingface") {
93
+ return (process.env.HUGGINGFACE_API_KEY ||
94
+ process.env.HF_TOKEN ||
95
+ process.env.API_KEY);
96
+ }
97
+ if (providerType === "openrouter") {
98
+ return process.env.OPENROUTER_API_KEY || process.env.API_KEY;
99
+ }
100
+ if (providerType === "moonshot-cn" || providerType === "moonshot-ai") {
101
+ return (process.env.MOONSHOT_API_KEY ||
102
+ process.env.KIMI_API_KEY ||
103
+ process.env.API_KEY);
104
+ }
105
+ if (providerType === "kimi-code") {
106
+ return (process.env.KIMI_CODE_API_KEY ||
107
+ process.env.KIMI_API_KEY ||
108
+ process.env.MOONSHOT_API_KEY ||
109
+ process.env.API_KEY);
110
+ }
111
+ return process.env.OPENAI_API_KEY || process.env.API_KEY;
112
+ }
113
+ function normalizeProviderType(value) {
114
+ if (value === "anthropic")
115
+ return value;
116
+ if (value === "openai")
117
+ return value;
118
+ if (value === "deepseek")
119
+ return value;
120
+ if (value === "gemini")
121
+ return value;
122
+ if (value === "open-compatible")
123
+ return value;
124
+ if (value === "open-responses")
125
+ return value;
126
+ if (value === "moonshot-cn")
127
+ return value;
128
+ if (value === "moonshot-ai")
129
+ return value;
130
+ if (value === "kimi-code")
131
+ return value;
132
+ if (value === "xai")
133
+ return value;
134
+ if (value === "huggingface")
135
+ return value;
136
+ if (value === "openrouter")
137
+ return value;
138
+ return null;
139
+ }
140
+ function readFetchUrl(input) {
141
+ if (typeof input === "string")
142
+ return input;
143
+ if (input instanceof URL)
144
+ return input.toString();
145
+ return input.url;
146
+ }
147
+ function readFetchMethod(input, init) {
148
+ const methodFromInit = String(init?.method || "").trim().toUpperCase();
149
+ if (methodFromInit)
150
+ return methodFromInit;
151
+ if (typeof input === "object" && "method" in input) {
152
+ const requestMethod = String(input.method || "").trim().toUpperCase();
153
+ if (requestMethod)
154
+ return requestMethod;
155
+ }
156
+ return "POST";
157
+ }
158
+ function createRuntimeModelLoggingFetch(args) {
159
+ const logger = getLogger();
160
+ const baseFetch = globalThis.fetch.bind(globalThis);
161
+ return async (input, init) => {
162
+ const sessionId = args.getSessionRunScope?.()?.sessionId;
163
+ const url = readFetchUrl(input);
164
+ const method = readFetchMethod(input, init);
165
+ try {
166
+ const response = await baseFetch(input, init);
167
+ if (args.enabled) {
168
+ void logger.log("info", "[city] llm.fetch", {
169
+ kind: "llm_fetch",
170
+ url,
171
+ method,
172
+ status: response.status,
173
+ ...(sessionId ? { sessionId } : {}),
174
+ });
175
+ }
176
+ return response;
177
+ }
178
+ catch (error) {
179
+ if (args.enabled) {
180
+ void logger.log("error", "[city] llm.fetch.error", {
181
+ kind: "llm_fetch_error",
182
+ url,
183
+ method,
184
+ error: String(error || "unknown_error"),
185
+ ...(sessionId ? { sessionId } : {}),
186
+ });
187
+ }
188
+ throw error;
189
+ }
190
+ };
191
+ }
192
+ async function resolveConfiguredModel(input) {
193
+ const platform = input.platform;
194
+ if (platform) {
195
+ const model = platform.getModel(input.primaryModelId);
196
+ const providers = await (platform.listProviders?.() || Promise.resolve([]));
197
+ const providerMap = new Map(providers.map((item) => [item.id, item]));
198
+ const provider = model
199
+ ? providerMap.get(String(model.providerId || "").trim()) || null
200
+ : null;
201
+ if (model && provider) {
202
+ return {
203
+ model,
204
+ provider,
205
+ };
206
+ }
207
+ }
208
+ const store = new PlatformStore();
209
+ try {
210
+ const resolved = await store.getResolvedModel(input.primaryModelId);
211
+ if (!resolved) {
212
+ throw new Error(`LLM model config not found in platform store: ${input.primaryModelId}`);
213
+ }
214
+ return resolved;
215
+ }
216
+ finally {
217
+ store.close();
218
+ }
219
+ }
220
+ /**
221
+ * 创建 LanguageModel 实例。
222
+ *
223
+ * 解析策略(中文)
224
+ * 1) 读取 `execution.modelId`。
225
+ * 2) 从宿主平台或 `PlatformStore` 解析 provider/model。
226
+ * 3) 按 provider type 分发到对应 AI SDK 工厂。
227
+ */
228
+ export async function createRuntimeModel(input) {
229
+ const logger = getLogger();
230
+ const execution = readProjectExecutionBinding(input.config);
231
+ if (!execution) {
232
+ await logger.log("warn", "No agent execution configured");
233
+ throw new Error("No agent execution configured");
234
+ }
235
+ const configLog = input.config.llm?.logMessages;
236
+ const logLlmMessages = typeof configLog === "boolean" ? configLog : true;
237
+ const loggingFetch = createRuntimeModelLoggingFetch({
238
+ enabled: logLlmMessages,
239
+ getSessionRunScope: input.getSessionRunScope,
240
+ });
241
+ const primaryModelId = execution.modelId;
242
+ const { model: modelConfig, provider: providerConfig } = await resolveConfiguredModel({
243
+ ...input,
244
+ primaryModelId,
245
+ });
246
+ if (modelConfig.isPaused === true) {
247
+ await logger.log("warn", `LLM model is paused in platform store: ${primaryModelId}`);
248
+ throw new Error(`LLM model is paused: ${primaryModelId}`);
249
+ }
250
+ const providerKey = providerConfig.id;
251
+ const providerType = normalizeProviderType(providerConfig.type);
252
+ if (!providerType) {
253
+ await logger.log("warn", `Unsupported LLM provider type: ${providerConfig.type}`);
254
+ throw new Error(`Unsupported LLM provider type: ${providerConfig.type}`);
255
+ }
256
+ const resolvedModel = resolveEnvPlaceholder(modelConfig.name);
257
+ if (!resolvedModel || resolvedModel === "${}") {
258
+ await logger.log("warn", "No LLM model name configured");
259
+ throw new Error("No LLM model name configured");
260
+ }
261
+ const resolvedBaseUrl = normalizeOptionalBaseUrl(resolveEnvPlaceholder(providerConfig.baseUrl) ||
262
+ resolveProviderDefaultBaseUrl(providerType));
263
+ let resolvedApiKey = resolveEnvPlaceholder(providerConfig.apiKey);
264
+ if (!resolvedApiKey) {
265
+ resolvedApiKey = resolveApiKeyFallback(providerType);
266
+ }
267
+ if (!resolvedApiKey) {
268
+ await logger.log("warn", "No API Key configured, will use simulation mode");
269
+ throw new Error("No API Key configured, will use simulation mode");
270
+ }
271
+ await logger.log("info", `[main] model primary=${primaryModelId} provider=${providerType}/${providerKey} name=${resolvedModel}${resolvedBaseUrl ? ` baseUrl=${resolvedBaseUrl}` : ""}`, {
272
+ kind: "llm_model_ready",
273
+ primaryModel: primaryModelId,
274
+ providerType,
275
+ providerKey,
276
+ model: resolvedModel,
277
+ ...(resolvedBaseUrl ? { baseUrl: resolvedBaseUrl } : {}),
278
+ logMessages: logLlmMessages,
279
+ });
280
+ if (providerType === "anthropic") {
281
+ const anthropicProvider = createAnthropic({
282
+ apiKey: resolvedApiKey,
283
+ baseURL: resolvedBaseUrl,
284
+ fetch: loggingFetch,
285
+ });
286
+ return anthropicProvider(resolvedModel);
287
+ }
288
+ if (providerType === "gemini") {
289
+ const googleProvider = createGoogleGenerativeAI({
290
+ apiKey: resolvedApiKey,
291
+ baseURL: resolvedBaseUrl,
292
+ fetch: loggingFetch,
293
+ });
294
+ return googleProvider(resolvedModel);
295
+ }
296
+ if (providerType === "open-responses") {
297
+ const responsesProvider = createOpenResponses({
298
+ url: buildResponsesUrl(resolvedBaseUrl),
299
+ name: providerKey,
300
+ apiKey: resolvedApiKey,
301
+ fetch: loggingFetch,
302
+ });
303
+ return responsesProvider(resolvedModel);
304
+ }
305
+ if (providerType === "open-compatible") {
306
+ const compatibleProvider = createOpenAICompatible({
307
+ name: providerKey,
308
+ baseURL: resolvedBaseUrl || "https://api.openai.com/v1",
309
+ apiKey: resolvedApiKey,
310
+ fetch: loggingFetch,
311
+ });
312
+ return compatibleProvider(resolvedModel);
313
+ }
314
+ if (providerType === "kimi-code") {
315
+ const compatibleProvider = createOpenAICompatible({
316
+ name: providerKey,
317
+ baseURL: resolvedBaseUrl || "https://api.kimi.com/coding/v1",
318
+ apiKey: resolvedApiKey,
319
+ fetch: loggingFetch,
320
+ });
321
+ return compatibleProvider(resolvedModel);
322
+ }
323
+ if (providerType === "moonshot-cn" || providerType === "moonshot-ai") {
324
+ const moonshotProvider = createMoonshotAI({
325
+ baseURL: resolvedBaseUrl,
326
+ apiKey: resolvedApiKey,
327
+ fetch: loggingFetch,
328
+ });
329
+ return moonshotProvider(resolvedModel);
330
+ }
331
+ if (providerType === "xai") {
332
+ const xaiProvider = createXai({
333
+ baseURL: resolvedBaseUrl,
334
+ apiKey: resolvedApiKey,
335
+ fetch: loggingFetch,
336
+ });
337
+ return xaiProvider(resolvedModel);
338
+ }
339
+ if (providerType === "huggingface") {
340
+ const huggingFaceProvider = createHuggingFace({
341
+ baseURL: resolvedBaseUrl,
342
+ apiKey: resolvedApiKey,
343
+ fetch: loggingFetch,
344
+ });
345
+ return huggingFaceProvider(resolvedModel);
346
+ }
347
+ if (providerType === "openrouter") {
348
+ const openRouterProvider = createOpenRouter({
349
+ baseURL: resolvedBaseUrl,
350
+ apiKey: resolvedApiKey,
351
+ fetch: loggingFetch,
352
+ });
353
+ return openRouterProvider(resolvedModel);
354
+ }
355
+ if (providerType === "deepseek") {
356
+ const deepseekCompatibleProvider = createOpenAICompatible({
357
+ name: providerKey,
358
+ baseURL: resolvedBaseUrl || "https://api.deepseek.com/v1",
359
+ apiKey: resolvedApiKey,
360
+ fetch: loggingFetch,
361
+ });
362
+ return deepseekCompatibleProvider(resolvedModel);
363
+ }
364
+ const openaiProvider = createOpenAI({
365
+ apiKey: resolvedApiKey,
366
+ baseURL: resolvedBaseUrl,
367
+ fetch: loggingFetch,
368
+ });
369
+ return openaiProvider(resolvedModel);
370
+ }
371
+ //# sourceMappingURL=CreateRuntimeModel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CreateRuntimeModel.js","sourceRoot":"","sources":["../../../src/model/runtime/CreateRuntimeModel.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAE/D,OAAO,EACL,SAAS,GAMV,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAwC1D,SAAS,2BAA2B,CAClC,MAAsB;IAEtB,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;IACnC,IAAI,CAAC,SAAS,IAAI,OAAO,SAAS,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC7D,IAAI,SAAS,CAAC,IAAI,KAAK,KAAK;QAAE,OAAO,IAAI,CAAC;IAC1C,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACvD,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAC1B,OAAO;QACL,IAAI,EAAE,KAAK;QACX,OAAO;KACR,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,OAAgB;IACzC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;SAClC,IAAI,EAAE;SACN,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACvB,IAAI,CAAC,OAAO;QAAE,OAAO,qCAAqC,CAAC;IAC3D,IAAI,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC;QAAE,OAAO,OAAO,CAAC;IACnD,OAAO,GAAG,OAAO,YAAY,CAAC;AAChC,CAAC;AAED,SAAS,wBAAwB,CAAC,KAAyB;IACzD,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;SAChC,IAAI,EAAE;SACN,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACvB,OAAO,OAAO,IAAI,SAAS,CAAC;AAC9B,CAAC;AAED,SAAS,6BAA6B,CACpC,YAA6B;IAE7B,IAAI,YAAY,KAAK,UAAU;QAAE,OAAO,6BAA6B,CAAC;IACtE,IAAI,YAAY,KAAK,aAAa;QAAE,OAAO,4BAA4B,CAAC;IACxE,IAAI,YAAY,KAAK,aAAa;QAAE,OAAO,4BAA4B,CAAC;IACxE,IAAI,YAAY,KAAK,WAAW;QAAE,OAAO,gCAAgC,CAAC;IAC1E,IAAI,YAAY,KAAK,KAAK;QAAE,OAAO,qBAAqB,CAAC;IACzD,IAAI,YAAY,KAAK,YAAY;QAAE,OAAO,8BAA8B,CAAC;IACzE,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAyB;IACtD,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IACzB,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAClD,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAClC,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,qBAAqB,CAAC,YAA6B;IAC1D,IAAI,YAAY,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,CACL,OAAO,CAAC,GAAG,CAAC,cAAc;YAC1B,OAAO,CAAC,GAAG,CAAC,cAAc;YAC1B,OAAO,CAAC,GAAG,CAAC,4BAA4B;YACxC,OAAO,CAAC,GAAG,CAAC,OAAO,CACpB,CAAC;IACJ,CAAC;IACD,IAAI,YAAY,KAAK,WAAW,EAAE,CAAC;QACjC,OAAO,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;IAC9D,CAAC;IACD,IAAI,YAAY,KAAK,UAAU,EAAE,CAAC;QAChC,OAAO,CACL,OAAO,CAAC,GAAG,CAAC,gBAAgB;YAC5B,OAAO,CAAC,GAAG,CAAC,cAAc;YAC1B,OAAO,CAAC,GAAG,CAAC,OAAO,CACpB,CAAC;IACJ,CAAC;IACD,IAAI,YAAY,KAAK,KAAK,EAAE,CAAC;QAC3B,OAAO,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;IACxD,CAAC;IACD,IAAI,YAAY,KAAK,aAAa,EAAE,CAAC;QACnC,OAAO,CACL,OAAO,CAAC,GAAG,CAAC,mBAAmB;YAC/B,OAAO,CAAC,GAAG,CAAC,QAAQ;YACpB,OAAO,CAAC,GAAG,CAAC,OAAO,CACpB,CAAC;IACJ,CAAC;IACD,IAAI,YAAY,KAAK,YAAY,EAAE,CAAC;QAClC,OAAO,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;IAC/D,CAAC;IACD,IAAI,YAAY,KAAK,aAAa,IAAI,YAAY,KAAK,aAAa,EAAE,CAAC;QACrE,OAAO,CACL,OAAO,CAAC,GAAG,CAAC,gBAAgB;YAC5B,OAAO,CAAC,GAAG,CAAC,YAAY;YACxB,OAAO,CAAC,GAAG,CAAC,OAAO,CACpB,CAAC;IACJ,CAAC;IACD,IAAI,YAAY,KAAK,WAAW,EAAE,CAAC;QACjC,OAAO,CACL,OAAO,CAAC,GAAG,CAAC,iBAAiB;YAC7B,OAAO,CAAC,GAAG,CAAC,YAAY;YACxB,OAAO,CAAC,GAAG,CAAC,gBAAgB;YAC5B,OAAO,CAAC,GAAG,CAAC,OAAO,CACpB,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;AAC3D,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAc;IAC3C,IAAI,KAAK,KAAK,WAAW;QAAE,OAAO,KAAK,CAAC;IACxC,IAAI,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACrC,IAAI,KAAK,KAAK,UAAU;QAAE,OAAO,KAAK,CAAC;IACvC,IAAI,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACrC,IAAI,KAAK,KAAK,iBAAiB;QAAE,OAAO,KAAK,CAAC;IAC9C,IAAI,KAAK,KAAK,gBAAgB;QAAE,OAAO,KAAK,CAAC;IAC7C,IAAI,KAAK,KAAK,aAAa;QAAE,OAAO,KAAK,CAAC;IAC1C,IAAI,KAAK,KAAK,aAAa;QAAE,OAAO,KAAK,CAAC;IAC1C,IAAI,KAAK,KAAK,WAAW;QAAE,OAAO,KAAK,CAAC;IACxC,IAAI,KAAK,KAAK,KAAK;QAAE,OAAO,KAAK,CAAC;IAClC,IAAI,KAAK,KAAK,aAAa;QAAE,OAAO,KAAK,CAAC;IAC1C,IAAI,KAAK,KAAK,YAAY;QAAE,OAAO,KAAK,CAAC;IACzC,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,YAAY,CAAC,KAAkC;IACtD,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,KAAK,YAAY,GAAG;QAAE,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC;IAClD,OAAO,KAAK,CAAC,GAAG,CAAC;AACnB,CAAC;AAED,SAAS,eAAe,CACtB,KAAkC,EAClC,IAAkC;IAElC,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACvE,IAAI,cAAc;QAAE,OAAO,cAAc,CAAC;IAC1C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,QAAQ,IAAI,KAAK,EAAE,CAAC;QACnD,MAAM,aAAa,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACtE,IAAI,aAAa;YAAE,OAAO,aAAa,CAAC;IAC1C,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,8BAA8B,CAAC,IAGvC;IACC,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAEpD,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;QAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,kBAAkB,EAAE,EAAE,EAAE,SAAS,CAAC;QACzD,MAAM,GAAG,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;QAChC,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAC5C,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;YAC9C,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBACjB,KAAK,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,kBAAkB,EAAE;oBAC1C,IAAI,EAAE,WAAW;oBACjB,GAAG;oBACH,MAAM;oBACN,MAAM,EAAE,QAAQ,CAAC,MAAM;oBACvB,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBACpC,CAAC,CAAC;YACL,CAAC;YACD,OAAO,QAAQ,CAAC;QAClB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBACjB,KAAK,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,wBAAwB,EAAE;oBACjD,IAAI,EAAE,iBAAiB;oBACvB,GAAG;oBACH,MAAM;oBACN,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,eAAe,CAAC;oBACvC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBACpC,CAAC,CAAC;YACL,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,sBAAsB,CAAC,KAErC;IAIC,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;IAChC,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QACtD,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,aAAa,EAAE,EAAE,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5E,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAU,CAAC,CAAC,CAAC;QAC/E,MAAM,QAAQ,GAAG,KAAK;YACpB,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,IAAI;YAChE,CAAC,CAAC,IAAI,CAAC;QACT,IAAI,KAAK,IAAI,QAAQ,EAAE,CAAC;YACtB,OAAO;gBACL,KAAK;gBACL,QAAQ;aACT,CAAC;QACJ,CAAC;IACH,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,aAAa,EAAE,CAAC;IAClC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,gBAAgB,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QACpE,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CACb,iDAAiD,KAAK,CAAC,cAAc,EAAE,CACxE,CAAC;QACJ,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC;YAAS,CAAC;QACT,KAAK,CAAC,KAAK,EAAE,CAAC;IAChB,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,KAA+B;IAE/B,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,SAAS,GAAG,2BAA2B,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC5D,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,+BAA+B,CAAC,CAAC;QAC1D,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;IACnD,CAAC;IAED,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,WAAW,CAAC;IAChD,MAAM,cAAc,GAAG,OAAO,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;IACzE,MAAM,YAAY,GAAG,8BAA8B,CAAC;QAClD,OAAO,EAAE,cAAc;QACvB,kBAAkB,EAAE,KAAK,CAAC,kBAAkB;KAC7C,CAAC,CAAC;IAEH,MAAM,cAAc,GAAG,SAAS,CAAC,OAAO,CAAC;IACzC,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,cAAc,EAAE,GACpD,MAAM,sBAAsB,CAAC;QAC3B,GAAG,KAAK;QACR,cAAc;KACf,CAAC,CAAC;IAEL,IAAI,WAAW,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;QAClC,MAAM,MAAM,CAAC,GAAG,CACd,MAAM,EACN,0CAA0C,cAAc,EAAE,CAC3D,CAAC;QACF,MAAM,IAAI,KAAK,CAAC,wBAAwB,cAAc,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED,MAAM,WAAW,GAAG,cAAc,CAAC,EAAE,CAAC;IACtC,MAAM,YAAY,GAAG,qBAAqB,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IAChE,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,MAAM,CAAC,GAAG,CACd,MAAM,EACN,kCAAkC,cAAc,CAAC,IAAI,EAAE,CACxD,CAAC;QACF,MAAM,IAAI,KAAK,CAAC,kCAAkC,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC;IAC3E,CAAC;IAED,MAAM,aAAa,GAAG,qBAAqB,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAC9D,IAAI,CAAC,aAAa,IAAI,aAAa,KAAK,KAAK,EAAE,CAAC;QAC9C,MAAM,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,8BAA8B,CAAC,CAAC;QACzD,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAClD,CAAC;IAED,MAAM,eAAe,GAAG,wBAAwB,CAC9C,qBAAqB,CAAC,cAAc,CAAC,OAAO,CAAC;QAC3C,6BAA6B,CAAC,YAAY,CAAC,CAC9C,CAAC;IAEF,IAAI,cAAc,GAAG,qBAAqB,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IAClE,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,cAAc,GAAG,qBAAqB,CAAC,YAAY,CAAC,CAAC;IACvD,CAAC;IACD,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,MAAM,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,iDAAiD,CAAC,CAAC;QAC5E,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACrE,CAAC;IAED,MAAM,MAAM,CAAC,GAAG,CACd,MAAM,EACN,wBAAwB,cAAc,aAAa,YAAY,IAAI,WAAW,SAAS,aAAa,GAAG,eAAe,CAAC,CAAC,CAAC,YAAY,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAC7J;QACE,IAAI,EAAE,iBAAiB;QACvB,YAAY,EAAE,cAAc;QAC5B,YAAY;QACZ,WAAW;QACX,KAAK,EAAE,aAAa;QACpB,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACxD,WAAW,EAAE,cAAc;KAC5B,CACF,CAAC;IAEF,IAAI,YAAY,KAAK,WAAW,EAAE,CAAC;QACjC,MAAM,iBAAiB,GAAG,eAAe,CAAC;YACxC,MAAM,EAAE,cAAc;YACtB,OAAO,EAAE,eAAe;YACxB,KAAK,EAAE,YAA4B;SACpC,CAAC,CAAC;QACH,OAAO,iBAAiB,CAAC,aAAa,CAAC,CAAC;IAC1C,CAAC;IAED,IAAI,YAAY,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,cAAc,GAAG,wBAAwB,CAAC;YAC9C,MAAM,EAAE,cAAc;YACtB,OAAO,EAAE,eAAe;YACxB,KAAK,EAAE,YAA4B;SACpC,CAAC,CAAC;QACH,OAAO,cAAc,CAAC,aAAa,CAAC,CAAC;IACvC,CAAC;IAED,IAAI,YAAY,KAAK,gBAAgB,EAAE,CAAC;QACtC,MAAM,iBAAiB,GAAG,mBAAmB,CAAC;YAC5C,GAAG,EAAE,iBAAiB,CAAC,eAAe,CAAC;YACvC,IAAI,EAAE,WAAW;YACjB,MAAM,EAAE,cAAc;YACtB,KAAK,EAAE,YAA4B;SACpC,CAAC,CAAC;QACH,OAAO,iBAAiB,CAAC,aAAa,CAAC,CAAC;IAC1C,CAAC;IAED,IAAI,YAAY,KAAK,iBAAiB,EAAE,CAAC;QACvC,MAAM,kBAAkB,GAAG,sBAAsB,CAAC;YAChD,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,eAAe,IAAI,2BAA2B;YACvD,MAAM,EAAE,cAAc;YACtB,KAAK,EAAE,YAA4B;SACpC,CAAC,CAAC;QACH,OAAO,kBAAkB,CAAC,aAAa,CAAC,CAAC;IAC3C,CAAC;IAED,IAAI,YAAY,KAAK,WAAW,EAAE,CAAC;QACjC,MAAM,kBAAkB,GAAG,sBAAsB,CAAC;YAChD,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,eAAe,IAAI,gCAAgC;YAC5D,MAAM,EAAE,cAAc;YACtB,KAAK,EAAE,YAA4B;SACpC,CAAC,CAAC;QACH,OAAO,kBAAkB,CAAC,aAAa,CAAC,CAAC;IAC3C,CAAC;IAED,IAAI,YAAY,KAAK,aAAa,IAAI,YAAY,KAAK,aAAa,EAAE,CAAC;QACrE,MAAM,gBAAgB,GAAG,gBAAgB,CAAC;YACxC,OAAO,EAAE,eAAe;YACxB,MAAM,EAAE,cAAc;YACtB,KAAK,EAAE,YAA4B;SACpC,CAAC,CAAC;QACH,OAAO,gBAAgB,CAAC,aAAa,CAAC,CAAC;IACzC,CAAC;IAED,IAAI,YAAY,KAAK,KAAK,EAAE,CAAC;QAC3B,MAAM,WAAW,GAAG,SAAS,CAAC;YAC5B,OAAO,EAAE,eAAe;YACxB,MAAM,EAAE,cAAc;YACtB,KAAK,EAAE,YAA4B;SACpC,CAAC,CAAC;QACH,OAAO,WAAW,CAAC,aAAa,CAAC,CAAC;IACpC,CAAC;IAED,IAAI,YAAY,KAAK,aAAa,EAAE,CAAC;QACnC,MAAM,mBAAmB,GAAG,iBAAiB,CAAC;YAC5C,OAAO,EAAE,eAAe;YACxB,MAAM,EAAE,cAAc;YACtB,KAAK,EAAE,YAA4B;SACpC,CAAC,CAAC;QACH,OAAO,mBAAmB,CAAC,aAAa,CAAC,CAAC;IAC5C,CAAC;IAED,IAAI,YAAY,KAAK,YAAY,EAAE,CAAC;QAClC,MAAM,kBAAkB,GAAG,gBAAgB,CAAC;YAC1C,OAAO,EAAE,eAAe;YACxB,MAAM,EAAE,cAAc;YACtB,KAAK,EAAE,YAA4B;SACpC,CAAC,CAAC;QACH,OAAO,kBAAkB,CAAC,aAAa,CAAC,CAAC;IAC3C,CAAC;IAED,IAAI,YAAY,KAAK,UAAU,EAAE,CAAC;QAChC,MAAM,0BAA0B,GAAG,sBAAsB,CAAC;YACxD,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,eAAe,IAAI,6BAA6B;YACzD,MAAM,EAAE,cAAc;YACtB,KAAK,EAAE,YAA4B;SACpC,CAAC,CAAC;QACH,OAAO,0BAA0B,CAAC,aAAa,CAAC,CAAC;IACnD,CAAC;IAED,MAAM,cAAc,GAAG,YAAY,CAAC;QAClC,MAAM,EAAE,cAAc;QACtB,OAAO,EAAE,eAAe;QACxB,KAAK,EAAE,YAA4B;KACpC,CAAC,CAAC;IACH,OAAO,cAAc,CAAC,aAAa,CAAC,CAAC;AACvC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@downcity/city",
3
- "version": "1.1.12",
3
+ "version": "1.1.14",
4
4
  "type": "module",
5
5
  "description": "Downcity City 平台 — CLI、daemon 管理、Console 网关、能力平台",
6
6
  "bin": {
@@ -36,7 +36,7 @@
36
36
  "prompts": "^2.4.0",
37
37
  "ws": "^8.19.0",
38
38
  "zod": "^3.24.0",
39
- "@downcity/agent": "^1.1.14"
39
+ "@downcity/agent": "^1.1.17"
40
40
  },
41
41
  "devDependencies": {
42
42
  "@types/better-sqlite3": "^7.6.13",
@@ -13,13 +13,13 @@
13
13
  import path from "node:path";
14
14
  import {
15
15
  Agent,
16
- createModel,
17
16
  loadStaticSystemPrompts,
18
17
  StaticPromptCatalog,
19
18
  } from "@downcity/agent";
20
19
  import type { StartOptions } from "@downcity/agent";
21
20
  import { CliError } from "../shared/CliError.js";
22
21
  import { createAgentPlatformRuntime } from "@/process/registry/AgentHostRuntime.js";
22
+ import { createRuntimeModel } from "@/model/runtime/CreateRuntimeModel.js";
23
23
  import { resolveAgentName } from "../shared/IndexSupport.js";
24
24
 
25
25
  /**
@@ -77,9 +77,8 @@ export async function runCommand(
77
77
  useBuiltinServices: true,
78
78
  useBuiltinPlugins: true,
79
79
  configureSession: async (session) => {
80
- const model = await createModel({
80
+ const model = await createRuntimeModel({
81
81
  config: agent.getRuntime().config,
82
- projectRoot,
83
82
  platform,
84
83
  });
85
84
  await session.set({
@@ -8,8 +8,8 @@
8
8
 
9
9
  import type { Command } from "commander";
10
10
  import { generateText } from "ai";
11
- import { createModel } from "@downcity/agent";
12
11
  import type { LlmProviderType } from "@downcity/agent";
12
+ import { createRuntimeModel } from "@/model/runtime/CreateRuntimeModel.js";
13
13
  import {
14
14
  discoverProviderModels,
15
15
  } from "./ModelSupport.js";
@@ -491,7 +491,7 @@ function registerTestCommands(model: Command): void {
491
491
  await runStoreCommand(options, async () => {
492
492
  const id = String(modelId || "").trim();
493
493
  if (!id) throw new Error("modelId cannot be empty");
494
- const runtimeModel = await createModel({
494
+ const runtimeModel = await createRuntimeModel({
495
495
  config: {
496
496
  name: "console-model-test",
497
497
  version: "1.0.0",
@@ -9,8 +9,8 @@
9
9
 
10
10
  import prompts from "prompts";
11
11
  import { generateText } from "ai";
12
- import { createModel } from "@downcity/agent";
13
12
  import { PlatformStore } from "@/platform/store/index.js";
13
+ import { createRuntimeModel } from "@/model/runtime/CreateRuntimeModel.js";
14
14
  import { toSafeProviderView } from "./ModelCommandShared.js";
15
15
  import {
16
16
  discoverProviderModels,
@@ -470,7 +470,7 @@ async function testModelCall(modelId: string): Promise<void> {
470
470
  }
471
471
 
472
472
  const promptText = String(promptInput.prompt || "").trim() || "Reply with exactly: OK";
473
- const runtimeModel = await createModel({
473
+ const runtimeModel = await createRuntimeModel({
474
474
  config: {
475
475
  name: "console-model-test",
476
476
  version: "1.0.0",
@@ -10,8 +10,8 @@
10
10
  import { generateText } from "ai";
11
11
  import type { LlmProviderType } from "@downcity/agent";
12
12
  import { PlatformStore } from "@/platform/store/index.js";
13
- import { createModel } from "@downcity/agent";
14
13
  import { discoverProviderModels } from "@/cli/model/ModelSupport.js";
14
+ import { createRuntimeModel } from "@/model/runtime/CreateRuntimeModel.js";
15
15
 
16
16
  const SUPPORTED_PROVIDER_TYPES: readonly LlmProviderType[] = [
17
17
  "anthropic",
@@ -375,7 +375,7 @@ export class ModelPoolService {
375
375
  const id = String(modelId || "").trim();
376
376
  if (!id) throw new Error("modelId cannot be empty");
377
377
  const actualPrompt = String(prompt || "").trim() || "Reply with exactly: OK";
378
- const model = await createModel({
378
+ const model = await createRuntimeModel({
379
379
  config: {
380
380
  name: "console-model-test",
381
381
  version: "1.0.0",
@@ -13,12 +13,12 @@ import os from "node:os";
13
13
  import { mkdtemp } from "node:fs/promises";
14
14
  import { generateId } from "@/utils/Id.js";
15
15
  import {
16
- createModel,
17
16
  drainDeferredPersistedUserMessages,
18
17
  Executor,
19
18
  getLogger,
20
19
  JsonlSessionCompactionComposer,
21
20
  JsonlSessionHistoryComposer,
21
+ JsonlSessionHistoryStore,
22
22
  loadStaticSystemPrompts,
23
23
  pickLastSuccessfulChatSendText,
24
24
  resolveAssistantMessageForPersistence,
@@ -31,6 +31,7 @@ import type {
31
31
  PlatformInlineInstantService,
32
32
  } from "@downcity/agent";
33
33
  import { InstantSystemComposer } from "@/control/instant/InstantSystemComposer.js";
34
+ import { createRuntimeModel } from "@/model/runtime/CreateRuntimeModel.js";
34
35
  import type { Logger as AgentLogger } from "@downcity/agent";
35
36
 
36
37
  type InstantSessionServiceOptions = {
@@ -138,12 +139,13 @@ export class InstantSessionService implements PlatformInlineInstantService {
138
139
  sessionId: string;
139
140
  }): Promise<{
140
141
  tempDirPath: string;
142
+ historyStore: JsonlSessionHistoryStore;
141
143
  historyComposer: JsonlSessionHistoryComposer;
142
144
  }> {
143
145
  const tempDirPath = await mkdtemp(
144
146
  path.join(os.tmpdir(), "downcity-inline-instant-"),
145
147
  );
146
- const historyComposer = new JsonlSessionHistoryComposer({
148
+ const historyStore = new JsonlSessionHistoryStore({
147
149
  rootPath: params.rootPath,
148
150
  sessionId: params.sessionId,
149
151
  paths: {
@@ -154,8 +156,12 @@ export class InstantSessionService implements PlatformInlineInstantService {
154
156
  archiveDirPath: path.join(tempDirPath, "archive"),
155
157
  },
156
158
  });
159
+ const historyComposer = new JsonlSessionHistoryComposer({
160
+ store: historyStore,
161
+ });
157
162
  return {
158
163
  tempDirPath,
164
+ historyStore,
159
165
  historyComposer,
160
166
  };
161
167
  }
@@ -220,11 +226,11 @@ export class InstantSessionService implements PlatformInlineInstantService {
220
226
 
221
227
  const sessionId = this.buildSessionId();
222
228
  const rootPath = process.cwd();
223
- const { tempDirPath, historyComposer } = await this.createTempHistoryComposer({
229
+ const { tempDirPath, historyStore, historyComposer } = await this.createTempHistoryComposer({
224
230
  rootPath,
225
231
  sessionId,
226
232
  });
227
- const model = await createModel({
233
+ const model = await createRuntimeModel({
228
234
  config: {
229
235
  name: "console-inline-instant-model",
230
236
  version: "1.0.0",
@@ -242,6 +248,7 @@ export class InstantSessionService implements PlatformInlineInstantService {
242
248
 
243
249
  const session = new Executor({
244
250
  sessionId,
251
+ historyStore,
245
252
  historyComposer,
246
253
  getModel: () => model,
247
254
  logger: this.logger as unknown as AgentLogger,
@@ -9,9 +9,9 @@
9
9
 
10
10
  import {
11
11
  getSessionRunScope,
12
- SessionSystemComposer,
13
12
  transformPromptsIntoSystemMessages,
14
13
  } from "@downcity/agent";
14
+ import type { SessionSystemComposer } from "@downcity/agent";
15
15
 
16
16
  type InstantSystemComposerOptions = {
17
17
  /**
@@ -31,14 +31,13 @@ type InstantSystemComposerOptions = {
31
31
  /**
32
32
  * 即时模式 system composer 默认实现。
33
33
  */
34
- export class InstantSystemComposer extends SessionSystemComposer {
34
+ export class InstantSystemComposer implements SessionSystemComposer {
35
35
  readonly name = "inline_instant_system";
36
36
 
37
37
  private readonly prompts: string[];
38
38
  private readonly projectRoot: string;
39
39
 
40
40
  constructor(options: InstantSystemComposerOptions) {
41
- super();
42
41
  this.prompts = Array.isArray(options.prompts)
43
42
  ? options.prompts
44
43
  .map((item) => String(item || "").trim())