Skip to content

Commit 747b8da

Browse files
authored
fix(core): bound prompt cache session keys (#31062)
1 parent 1399323 commit 747b8da

2 files changed

Lines changed: 38 additions & 1 deletion

File tree

packages/core/src/session/runner/llm.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -211,9 +211,10 @@ export const layer = Layer.effect(
211211
const model = yield* models.resolve(session)
212212
const entries = yield* SessionHistory.entriesForRunner(db, session.id, system.baselineSeq)
213213
const context = entries.map((entry) => entry.message)
214+
const promptCacheKey = /^ses_[0-9a-f]{64}$/.test(session.id) ? session.id.slice(4) : session.id
214215
const request = LLM.request({
215216
model,
216-
providerOptions: { openai: { promptCacheKey: session.id } },
217+
providerOptions: { openai: { promptCacheKey } },
217218
system: [agent.info?.system, system.baseline]
218219
.filter((part): part is string => part !== undefined && part.length > 0)
219220
.map(SystemPart.make),

packages/core/test/session-runner.test.ts

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2824,6 +2824,42 @@ describe("SessionRunnerLLM", () => {
28242824
}),
28252825
)
28262826

2827+
it.effect("bounds external session prompt cache keys", () =>
2828+
Effect.gen(function* () {
2829+
yield* setup
2830+
const externalSessionID = SessionV2.ID.fromExternal({
2831+
namespace: "discord",
2832+
key: "thread-one",
2833+
})
2834+
const otherExternalSessionID = SessionV2.ID.fromExternal({
2835+
namespace: "discord",
2836+
key: "thread-two",
2837+
})
2838+
yield* insertSession(externalSessionID)
2839+
yield* insertSession(otherExternalSessionID)
2840+
const session = yield* SessionV2.Service
2841+
yield* session.prompt({
2842+
sessionID: externalSessionID,
2843+
prompt: new Prompt({ text: "Run external session" }),
2844+
resume: false,
2845+
})
2846+
yield* session.prompt({
2847+
sessionID: otherExternalSessionID,
2848+
prompt: new Prompt({ text: "Run other external session" }),
2849+
resume: false,
2850+
})
2851+
2852+
requests.length = 0
2853+
yield* session.resume(externalSessionID)
2854+
yield* session.resume(otherExternalSessionID)
2855+
2856+
const keys = requests.map((request) => request.providerOptions?.openai?.promptCacheKey)
2857+
expect(keys).toEqual([externalSessionID.slice(4), otherExternalSessionID.slice(4)])
2858+
expect(keys.every((key) => typeof key === "string" && key.length === 64)).toBe(true)
2859+
expect(keys[0]).not.toBe(keys[1])
2860+
}),
2861+
)
2862+
28272863
it.effect("fans out one failed run and allows a later retry", () =>
28282864
Effect.gen(function* () {
28292865
yield* setup

0 commit comments

Comments
 (0)