@vellumai/assistant 0.10.3-dev.202606292252.adea010 → 0.10.3-dev.202606300318.cf23f52

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 (60) hide show
  1. package/openapi.yaml +134 -0
  2. package/package.json +1 -1
  3. package/src/__tests__/agent-loop-compaction-events.test.ts +1 -0
  4. package/src/__tests__/agent-loop-compaction-strip.test.ts +2 -0
  5. package/src/__tests__/agent-loop-exit-reason.test.ts +2 -0
  6. package/src/__tests__/agent-loop-regrowth-guard.test.ts +8 -0
  7. package/src/__tests__/agent-loop.test.ts +1 -0
  8. package/src/__tests__/conversation-agent-loop.test.ts +39 -1
  9. package/src/__tests__/conversation-runtime-assembly.test.ts +6 -6
  10. package/src/__tests__/device-id.test.ts +38 -1
  11. package/src/__tests__/history-repair-hook.test.ts +1 -1
  12. package/src/__tests__/llm-request-log-source-clickhouse.test.ts +1 -0
  13. package/src/__tests__/memory-retrieval-hook.test.ts +1 -1
  14. package/src/__tests__/plugin-import-boundary-guard.test.ts +7 -0
  15. package/src/__tests__/title-generate-hook.test.ts +1 -1
  16. package/src/agent/loop.ts +190 -135
  17. package/src/api/index.ts +4 -0
  18. package/src/api/responses/llm-request-log-entry.ts +41 -0
  19. package/src/config/bundled-skills/app-builder/SKILL.md +2 -0
  20. package/src/config/llm-resolver.ts +17 -0
  21. package/src/config/schemas/__tests__/memory-v3.test.ts +11 -11
  22. package/src/config/schemas/memory-v3.ts +10 -10
  23. package/src/daemon/conversation-agent-loop-handlers.ts +58 -8
  24. package/src/daemon/conversation-agent-loop.ts +31 -13
  25. package/src/daemon/conversation-runtime-assembly.ts +10 -8
  26. package/src/daemon/conversation.ts +1 -0
  27. package/src/daemon/turn-latency-tracker.test.ts +137 -0
  28. package/src/daemon/turn-latency-tracker.ts +134 -0
  29. package/src/ipc/__tests__/inject-local-actor-header.test.ts +33 -0
  30. package/src/ipc/assistant-server.ts +37 -38
  31. package/src/messaging/providers/slack/render.test.ts +166 -4
  32. package/src/messaging/providers/slack/render.ts +289 -36
  33. package/src/persistence/llm-request-log-source-clickhouse.ts +4 -0
  34. package/src/persistence/llm-request-log-store.ts +25 -2
  35. package/src/persistence/migrations/310-llm-request-log-latency-breakdown.ts +37 -0
  36. package/src/persistence/schema/infrastructure.ts +8 -0
  37. package/src/persistence/steps.ts +2 -0
  38. package/src/plugin-api/types.ts +9 -13
  39. package/src/plugins/defaults/image-fallback/__tests__/image-fallback.test.ts +23 -9
  40. package/src/plugins/defaults/image-fallback/hooks/user-prompt-submit.ts +2 -3
  41. package/src/plugins/defaults/image-fallback/src/caption-blocks.ts +7 -14
  42. package/src/plugins/defaults/memory/hooks/post-compact.ts +3 -4
  43. package/src/plugins/defaults/memory/hooks/user-prompt-submit.ts +5 -4
  44. package/src/{tools/memory/register.test.ts → plugins/defaults/memory/tools.test.ts} +7 -7
  45. package/src/{tools/memory/register.ts → plugins/defaults/memory/tools.ts} +17 -8
  46. package/src/plugins/defaults/memory/v3/__tests__/orchestrate.test.ts +20 -9
  47. package/src/plugins/defaults/memory/v3/__tests__/shadow-integration.test.ts +16 -6
  48. package/src/plugins/defaults/memory/v3/__tests__/shadow-plugin.test.ts +56 -9
  49. package/src/plugins/defaults/memory/v3/hot-set.test.ts +1 -1
  50. package/src/plugins/defaults/memory/v3/orchestrate.ts +2 -2
  51. package/src/plugins/defaults/memory/v3/shadow-plugin.ts +17 -14
  52. package/src/runtime/__tests__/agent-wake.test.ts +95 -24
  53. package/src/runtime/agent-wake.ts +40 -6
  54. package/src/runtime/routes/__tests__/wake-conversation-routes.test.ts +89 -0
  55. package/src/runtime/routes/conversation-query-routes.ts +24 -1
  56. package/src/runtime/routes/platform-routes.ts +3 -0
  57. package/src/runtime/routes/types.ts +7 -0
  58. package/src/runtime/routes/wake-conversation-routes.ts +18 -2
  59. package/src/tools/tool-manifest.ts +1 -1
  60. package/src/util/device-id.ts +52 -12
package/openapi.yaml CHANGED
@@ -8527,6 +8527,49 @@ paths:
8527
8527
  - type: "null"
8528
8528
  additionalProperties: false
8529
8529
  - type: "null"
8530
+ latency:
8531
+ anyOf:
8532
+ - type: object
8533
+ properties:
8534
+ phases:
8535
+ type: array
8536
+ items:
8537
+ type: object
8538
+ properties:
8539
+ key:
8540
+ type: string
8541
+ label:
8542
+ type: string
8543
+ ms:
8544
+ type: number
8545
+ required:
8546
+ - key
8547
+ - label
8548
+ - ms
8549
+ additionalProperties: false
8550
+ ttftMs:
8551
+ anyOf:
8552
+ - type: number
8553
+ - type: "null"
8554
+ totalToFirstTokenMs:
8555
+ anyOf:
8556
+ - type: number
8557
+ - type: "null"
8558
+ providerDurationMs:
8559
+ anyOf:
8560
+ - type: number
8561
+ - type: "null"
8562
+ firstTokenKind:
8563
+ anyOf:
8564
+ - type: string
8565
+ enum:
8566
+ - thinking
8567
+ - text
8568
+ - type: "null"
8569
+ required:
8570
+ - phases
8571
+ additionalProperties: false
8572
+ - type: "null"
8530
8573
  required:
8531
8574
  - id
8532
8575
  - createdAt
@@ -15521,6 +15564,49 @@ paths:
15521
15564
  - type: "null"
15522
15565
  additionalProperties: false
15523
15566
  - type: "null"
15567
+ latency:
15568
+ anyOf:
15569
+ - type: object
15570
+ properties:
15571
+ phases:
15572
+ type: array
15573
+ items:
15574
+ type: object
15575
+ properties:
15576
+ key:
15577
+ type: string
15578
+ label:
15579
+ type: string
15580
+ ms:
15581
+ type: number
15582
+ required:
15583
+ - key
15584
+ - label
15585
+ - ms
15586
+ additionalProperties: false
15587
+ ttftMs:
15588
+ anyOf:
15589
+ - type: number
15590
+ - type: "null"
15591
+ totalToFirstTokenMs:
15592
+ anyOf:
15593
+ - type: number
15594
+ - type: "null"
15595
+ providerDurationMs:
15596
+ anyOf:
15597
+ - type: number
15598
+ - type: "null"
15599
+ firstTokenKind:
15600
+ anyOf:
15601
+ - type: string
15602
+ enum:
15603
+ - thinking
15604
+ - text
15605
+ - type: "null"
15606
+ required:
15607
+ - phases
15608
+ additionalProperties: false
15609
+ - type: "null"
15524
15610
  required:
15525
15611
  - id
15526
15612
  - createdAt
@@ -18145,6 +18231,49 @@ paths:
18145
18231
  - type: "null"
18146
18232
  additionalProperties: false
18147
18233
  - type: "null"
18234
+ latency:
18235
+ anyOf:
18236
+ - type: object
18237
+ properties:
18238
+ phases:
18239
+ type: array
18240
+ items:
18241
+ type: object
18242
+ properties:
18243
+ key:
18244
+ type: string
18245
+ label:
18246
+ type: string
18247
+ ms:
18248
+ type: number
18249
+ required:
18250
+ - key
18251
+ - label
18252
+ - ms
18253
+ additionalProperties: false
18254
+ ttftMs:
18255
+ anyOf:
18256
+ - type: number
18257
+ - type: "null"
18258
+ totalToFirstTokenMs:
18259
+ anyOf:
18260
+ - type: number
18261
+ - type: "null"
18262
+ providerDurationMs:
18263
+ anyOf:
18264
+ - type: number
18265
+ - type: "null"
18266
+ firstTokenKind:
18267
+ anyOf:
18268
+ - type: string
18269
+ enum:
18270
+ - thinking
18271
+ - text
18272
+ - type: "null"
18273
+ required:
18274
+ - phases
18275
+ additionalProperties: false
18276
+ - type: "null"
18148
18277
  required:
18149
18278
  - id
18150
18279
  - createdAt
@@ -20315,6 +20444,10 @@ paths:
20315
20444
  type: boolean
20316
20445
  hasWebhookSecret:
20317
20446
  type: boolean
20447
+ clientInstallationId:
20448
+ anyOf:
20449
+ - type: string
20450
+ - type: "null"
20318
20451
  available:
20319
20452
  type: boolean
20320
20453
  organizationId:
@@ -20346,6 +20479,7 @@ paths:
20346
20479
  - assistantId
20347
20480
  - hasAssistantApiKey
20348
20481
  - hasWebhookSecret
20482
+ - clientInstallationId
20349
20483
  - available
20350
20484
  - organizationId
20351
20485
  - userId
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vellumai/assistant",
3
- "version": "0.10.3-dev.202606292252.adea010",
3
+ "version": "0.10.3-dev.202606300318.cf23f52",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "exports": {
@@ -150,6 +150,7 @@ describe("AgentLoop compaction start/end event pair", () => {
150
150
  onEvent: (event) => {
151
151
  events.push(event);
152
152
  },
153
+ modelProfileKey: "balanced",
153
154
  resolveContextWindow: () => ({
154
155
  maxInputTokens: 10,
155
156
  overflowRecovery: { enabled: true, safetyMarginRatio: 0 },
@@ -167,6 +167,7 @@ describe("AgentLoop compaction summarizer input", () => {
167
167
  onEvent: (event) => {
168
168
  events.push(event);
169
169
  },
170
+ modelProfileKey: "balanced",
170
171
  resolveContextWindow: () => ({
171
172
  maxInputTokens: 10,
172
173
  overflowRecovery: { enabled: true, safetyMarginRatio: 0 },
@@ -221,6 +222,7 @@ describe("AgentLoop compaction summarizer input", () => {
221
222
  onEvent: (event) => {
222
223
  events.push(event);
223
224
  },
225
+ modelProfileKey: "balanced",
224
226
  resolveContextWindow: () => ({
225
227
  maxInputTokens: 10,
226
228
  overflowRecovery: { enabled: true, safetyMarginRatio: 0 },
@@ -460,6 +460,7 @@ describe("AgentLoop exit-reason instrumentation", () => {
460
460
  messages: [userMessage],
461
461
  onEvent: () => {},
462
462
  trust: { sourceChannel: "vellum", trustClass: "unknown" },
463
+ modelProfileKey: "balanced",
463
464
  resolveContextWindow: () => ({
464
465
  maxInputTokens: 10,
465
466
  overflowRecovery: { enabled: false, safetyMarginRatio: 0 },
@@ -500,6 +501,7 @@ describe("AgentLoop exit-reason instrumentation", () => {
500
501
  onEvent: (event) => {
501
502
  events.push(event);
502
503
  },
504
+ modelProfileKey: "balanced",
503
505
  resolveContextWindow: () => ({
504
506
  maxInputTokens: 10,
505
507
  overflowRecovery: { enabled: true, safetyMarginRatio: 0 },
@@ -148,6 +148,7 @@ async function runOnce(args: {
148
148
  onEvent: (event) => {
149
149
  events.push(event);
150
150
  },
151
+ modelProfileKey: "balanced",
151
152
  resolveContextWindow: () => ({
152
153
  maxInputTokens: 10,
153
154
  overflowRecovery: { enabled: true, safetyMarginRatio: 0 },
@@ -215,6 +216,7 @@ describe("AgentLoop budget-gate regrowth guard", () => {
215
216
  onEvent: (event) => {
216
217
  events.push(event);
217
218
  },
219
+ modelProfileKey: "balanced",
218
220
  resolveContextWindow: () => ({
219
221
  maxInputTokens: 10,
220
222
  overflowRecovery: { enabled: true, safetyMarginRatio: 0 },
@@ -249,6 +251,7 @@ describe("AgentLoop budget-gate regrowth guard", () => {
249
251
  requestId: "req",
250
252
  messages: [userMessage],
251
253
  onEvent: () => {},
254
+ modelProfileKey: "balanced",
252
255
  resolveContextWindow: () => ({
253
256
  maxInputTokens: 10,
254
257
  overflowRecovery: { enabled: true, safetyMarginRatio: 0 },
@@ -310,6 +313,7 @@ describe("AgentLoop budget-gate per-turn proactive-futility suppression", () =>
310
313
  onEvent: (event) => {
311
314
  events.push(event);
312
315
  },
316
+ modelProfileKey: "balanced",
313
317
  resolveContextWindow: () => ({
314
318
  maxInputTokens: 10,
315
319
  overflowRecovery: { enabled: true, safetyMarginRatio: 0 },
@@ -369,6 +373,7 @@ describe("AgentLoop budget-gate per-turn proactive-futility suppression", () =>
369
373
  onEvent: (e) => {
370
374
  events.push(e);
371
375
  },
376
+ modelProfileKey: "balanced",
372
377
  resolveContextWindow: () => ({
373
378
  maxInputTokens: 10,
374
379
  overflowRecovery: { enabled: true, safetyMarginRatio: 0 },
@@ -411,6 +416,7 @@ describe("AgentLoop budget-gate per-turn proactive-futility suppression", () =>
411
416
  onEvent: (e) => {
412
417
  turn1.push(e);
413
418
  },
419
+ modelProfileKey: "balanced",
414
420
  resolveContextWindow: () => ({
415
421
  maxInputTokens: 10,
416
422
  overflowRecovery: { enabled: true, safetyMarginRatio: 0 },
@@ -428,6 +434,7 @@ describe("AgentLoop budget-gate per-turn proactive-futility suppression", () =>
428
434
  onEvent: (e) => {
429
435
  turn2.push(e);
430
436
  },
437
+ modelProfileKey: "balanced",
431
438
  resolveContextWindow: () => ({
432
439
  maxInputTokens: 10,
433
440
  overflowRecovery: { enabled: true, safetyMarginRatio: 0 },
@@ -483,6 +490,7 @@ describe("AgentLoop budget-gate per-turn proactive-futility suppression", () =>
483
490
  onEvent: (e) => {
484
491
  events.push(e);
485
492
  },
493
+ modelProfileKey: "balanced",
486
494
  resolveContextWindow: () => ({
487
495
  maxInputTokens: 10,
488
496
  overflowRecovery: { enabled: true, safetyMarginRatio: 0 },
@@ -204,6 +204,7 @@ describe("AgentLoop", () => {
204
204
  trust: { sourceChannel: "vellum", trustClass: "unknown" },
205
205
  requestId: "req-1",
206
206
  callSite: "mainAgent",
207
+ modelProfileKey: "balanced",
207
208
  resolveContextWindow: () => ({
208
209
  maxInputTokens,
209
210
  overflowRecovery: { enabled: false, safetyMarginRatio: 0 },
@@ -32,6 +32,8 @@ const conversationDiskViewRealSnapshot = {
32
32
  ) as Record<string, unknown>),
33
33
  };
34
34
  let mockUiConfig: { userTimezone?: string; detectedTimezone?: string } = {};
35
+ let mockLlmProfiles: Record<string, unknown> = {};
36
+ let mockLlmActiveProfile: string | undefined;
35
37
 
36
38
  // ── Module mocks (must precede imports of the module under test) ─────
37
39
 
@@ -80,8 +82,9 @@ mock.module("../config/loader.js", () => ({
80
82
  },
81
83
  },
82
84
  },
83
- profiles: {},
85
+ profiles: mockLlmProfiles,
84
86
  callSites: {},
87
+ activeProfile: mockLlmActiveProfile,
85
88
  pricingOverrides: [],
86
89
  },
87
90
  rateLimit: { maxRequestsPerMinute: 0 },
@@ -835,6 +838,8 @@ function makeCompactionResult(
835
838
 
836
839
  beforeEach(() => {
837
840
  mockUiConfig = {};
841
+ mockLlmProfiles = {};
842
+ mockLlmActiveProfile = undefined;
838
843
  mockEstimateTokens = 1000;
839
844
  mockReducerStepFn = null;
840
845
  mockOverflowAction = "fail_gracefully";
@@ -903,6 +908,39 @@ beforeEach(() => {
903
908
 
904
909
  describe("session-agent-loop", () => {
905
910
  describe("user-prompt-submit hook failures", () => {
911
+ test("passes the effective profile to hooks even when it was already announced", async () => {
912
+ mockLlmProfiles = {
913
+ balanced: {
914
+ label: "Balanced",
915
+ model: "accounts/fireworks/models/glm-5p2",
916
+ },
917
+ quality: { label: "Quality", model: "claude-opus-4-8" },
918
+ };
919
+ mockLlmActiveProfile = "quality";
920
+ const observedProfileKeys: string[] = [];
921
+ registerPlugin({
922
+ manifest: {
923
+ name: "test-observe-model-profile",
924
+ version: "1.0.0",
925
+ },
926
+ hooks: {
927
+ "user-prompt-submit": async (ctx: UserPromptSubmitContext) => {
928
+ observedProfileKeys.push(ctx.modelProfileKey);
929
+ },
930
+ },
931
+ });
932
+
933
+ const ctx = makeCtx({
934
+ inferenceProfile: "balanced",
935
+ lastNotifiedInferenceProfile: "balanced",
936
+ providerResponses: [textResponse("ok")],
937
+ });
938
+
939
+ await runAgentLoopImpl(ctx, "hello", "msg-1", () => {});
940
+
941
+ expect(observedProfileKeys).toEqual(["balanced"]);
942
+ });
943
+
906
944
  test("logs and continues with prior hook mutations", async () => {
907
945
  registerPlugin({
908
946
  manifest: {
@@ -1104,7 +1104,7 @@ describe("applyRuntimeInjections — injection mode", () => {
1104
1104
  requestId: "reinject-req",
1105
1105
  conversationId: "injection-mode-conv",
1106
1106
  isNonInteractive: false,
1107
- modelProfileKey: null,
1107
+ modelProfileKey: "balanced",
1108
1108
  };
1109
1109
  await postCompact(postCompactCtx);
1110
1110
  const result = postCompactCtx.history;
@@ -1628,16 +1628,16 @@ describe("resolveTurnInboundActorContext", () => {
1628
1628
 
1629
1629
  describe("resolveTurnModelProfileLabel", () => {
1630
1630
  /**
1631
- * A null key means the active profile is unchanged since the last notified
1632
- * one, so there is no `model_profile` line to render this turn.
1631
+ * A null notice key means there is no `model_profile` line to render this
1632
+ * turn.
1633
1633
  */
1634
- test("returns null when the profile key is null", () => {
1635
- // GIVEN a turn whose profile is unchanged since the last notification
1634
+ test("returns null when the profile notice key is null", () => {
1635
+ // GIVEN a turn without a profile notice to render
1636
1636
  const llm = LLMSchema.parse({
1637
1637
  default: { provider: "anthropic", model: "claude-sonnet-4-7" },
1638
1638
  });
1639
1639
 
1640
- // WHEN the label is resolved for a null key
1640
+ // WHEN the label is resolved for a null notice key
1641
1641
  const label = resolveTurnModelProfileLabel(null, "mainAgent", llm);
1642
1642
 
1643
1643
  // THEN there is no profile line to inject
@@ -19,7 +19,11 @@ mock.module("../util/logger.js", () => ({
19
19
  }),
20
20
  }));
21
21
 
22
- import { getDeviceId, resetDeviceIdCache } from "../util/device-id.js";
22
+ import {
23
+ getDeviceId,
24
+ getExistingDeviceId,
25
+ resetDeviceIdCache,
26
+ } from "../util/device-id.js";
23
27
 
24
28
  const originalVellumEnvironment = process.env.VELLUM_ENVIRONMENT;
25
29
  const originalXdgConfigHome = process.env.XDG_CONFIG_HOME;
@@ -179,3 +183,36 @@ describe("getDeviceId VELLUM_DEVICE_ID precedence", () => {
179
183
  expect(getDeviceId()).not.toBe("env-id");
180
184
  });
181
185
  });
186
+
187
+ describe("getExistingDeviceId", () => {
188
+ beforeEach(() => {
189
+ delete process.env.IS_CONTAINERIZED;
190
+ process.env.VELLUM_ENVIRONMENT = "dev";
191
+ process.env.XDG_CONFIG_HOME = tempDir;
192
+ });
193
+
194
+ test("returns null without creating device.json when no id exists", () => {
195
+ const expectedPath = join(tempDir, "vellum-dev", "device.json");
196
+
197
+ expect(getExistingDeviceId()).toBeNull();
198
+ expect(existsSync(expectedPath)).toBe(false);
199
+ });
200
+
201
+ test("reads an existing device.json id", () => {
202
+ const dir = join(tempDir, "vellum-dev");
203
+ mkdirSync(dir, { recursive: true });
204
+ writeFileSync(
205
+ join(dir, "device.json"),
206
+ JSON.stringify({ deviceId: "file-id" }),
207
+ );
208
+
209
+ expect(getExistingDeviceId()).toBe("file-id");
210
+ });
211
+
212
+ test("returns the env override without writing device.json", () => {
213
+ process.env.VELLUM_DEVICE_ID = "env-id";
214
+
215
+ expect(getExistingDeviceId()).toBe("env-id");
216
+ expect(readdirSync(tempDir)).toEqual([]);
217
+ });
218
+ });
@@ -72,7 +72,7 @@ function makeCtx(messages: Message[]): UserPromptSubmitContext {
72
72
  conversationId: "conv-test",
73
73
  userMessageId: "msg-test",
74
74
  requestId: "req-test",
75
- modelProfileKey: null,
75
+ modelProfileKey: "balanced",
76
76
  isNonInteractive: false,
77
77
  prompt: "",
78
78
  originalMessages: messages,
@@ -106,6 +106,7 @@ describe("ClickHouseLlmRequestLogSource", () => {
106
106
  createdAt: 1778465138786,
107
107
  agentLoopExitReason: "no_tool_calls",
108
108
  callSite: "mainAgent",
109
+ latencyBreakdown: null,
109
110
  });
110
111
  });
111
112
 
@@ -158,7 +158,7 @@ function makeHookCtx(
158
158
  latestMessages: [],
159
159
  requestId: "req-test",
160
160
  isNonInteractive: false,
161
- modelProfileKey: null,
161
+ modelProfileKey: "balanced",
162
162
  prompt: "",
163
163
  originalMessages: [],
164
164
  ...overrides,
@@ -130,6 +130,8 @@ const BASELINE: Record<string, readonly string[]> = {
130
130
  "../../../daemon/pkb-context-tracker.js",
131
131
  "../../../daemon/pkb-reminder-builder.js",
132
132
  "../../../daemon/trust-context.js",
133
+ "../../../memory/context-search/agent-runner.js",
134
+ "../../../memory/context-search/types.js",
133
135
  "../../../memory/graph/bootstrap.js",
134
136
  "../../../memory/graph/consolidation.js",
135
137
  "../../../memory/graph/conversation-graph-memory.js",
@@ -138,6 +140,8 @@ const BASELINE: Record<string, readonly string[]> = {
138
140
  "../../../memory/graph/graph-search.js",
139
141
  "../../../memory/graph/narrative.js",
140
142
  "../../../memory/graph/pattern-scan.js",
143
+ "../../../memory/graph/tool-handlers.js",
144
+ "../../../memory/graph/tools.js",
141
145
  "../../../memory/job-handlers/backfill.js",
142
146
  "../../../memory/job-handlers/embedding.js",
143
147
  "../../../memory/job-handlers/index-maintenance.js",
@@ -152,7 +156,10 @@ const BASELINE: Record<string, readonly string[]> = {
152
156
  "../../../memory/v2/consolidation-job.js",
153
157
  "../../../memory/v2/static-context.js",
154
158
  "../../../memory/v2/sweep-job.js",
159
+ "../../../permissions/types.js",
155
160
  "../../../persistence/jobs-store.js",
161
+ "../../../runtime/capabilities.js",
162
+ "../../../tools/types.js",
156
163
  "../../../types.js",
157
164
  "../../../util/logger.js",
158
165
  "../../../util/platform.js",
@@ -109,7 +109,7 @@ function makeCtx(
109
109
  conversationId: "conv-1",
110
110
  userMessageId: "msg-1",
111
111
  requestId: "req-1",
112
- modelProfileKey: null,
112
+ modelProfileKey: "balanced",
113
113
  isNonInteractive: false,
114
114
  prompt: "first message",
115
115
  originalMessages: messages,