fix(session): improve session compaction (#23870)
This commit is contained in:
parent
fa8b7bc4d2
commit
574b2c2170
6 changed files with 561 additions and 83 deletions
|
|
@ -319,6 +319,12 @@ export const ToolStateCompleted = Schema.Struct({
|
|||
.pipe(withStatics((s) => ({ zod: zod(s) })))
|
||||
export type ToolStateCompleted = Types.DeepMutable<Schema.Schema.Type<typeof ToolStateCompleted>>
|
||||
|
||||
function truncateToolOutput(text: string, maxChars?: number) {
|
||||
if (!maxChars || text.length <= maxChars) return text
|
||||
const omitted = text.length - maxChars
|
||||
return `${text.slice(0, maxChars)}\n[Tool output truncated for compaction: omitted ${omitted} chars]`
|
||||
}
|
||||
|
||||
export const ToolStateError = Schema.Struct({
|
||||
status: Schema.Literal("error"),
|
||||
input: Schema.Record(Schema.String, Schema.Any),
|
||||
|
|
@ -700,7 +706,7 @@ function providerMeta(metadata: Record<string, any> | undefined) {
|
|||
export const toModelMessagesEffect = Effect.fnUntraced(function* (
|
||||
input: WithParts[],
|
||||
model: Provider.Model,
|
||||
options?: { stripMedia?: boolean },
|
||||
options?: { stripMedia?: boolean; toolOutputMaxChars?: number },
|
||||
) {
|
||||
const result: UIMessage[] = []
|
||||
const toolNames = new Set<string>()
|
||||
|
|
@ -839,7 +845,9 @@ export const toModelMessagesEffect = Effect.fnUntraced(function* (
|
|||
if (part.type === "tool") {
|
||||
toolNames.add(part.tool)
|
||||
if (part.state.status === "completed") {
|
||||
const outputText = part.state.time.compacted ? "[Old tool result content cleared]" : part.state.output
|
||||
const outputText = part.state.time.compacted
|
||||
? "[Old tool result content cleared]"
|
||||
: truncateToolOutput(part.state.output, options?.toolOutputMaxChars)
|
||||
const attachments = part.state.time.compacted || options?.stripMedia ? [] : (part.state.attachments ?? [])
|
||||
|
||||
// For providers that don't support media in tool results, extract media files
|
||||
|
|
@ -955,7 +963,7 @@ export const toModelMessagesEffect = Effect.fnUntraced(function* (
|
|||
export function toModelMessages(
|
||||
input: WithParts[],
|
||||
model: Provider.Model,
|
||||
options?: { stripMedia?: boolean },
|
||||
options?: { stripMedia?: boolean; toolOutputMaxChars?: number },
|
||||
): Promise<ModelMessage[]> {
|
||||
return Effect.runPromise(toModelMessagesEffect(input, model, options).pipe(Effect.provide(EffectLogger.layer)))
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue