diff --git a/package.json b/package.json index 1aa5821..5287915 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@ztimson/ai-utils", - "version": "0.1.20", + "version": "0.1.21", "description": "AI Utility library", "author": "Zak Timson", "license": "MIT", diff --git a/src/antrhopic.ts b/src/antrhopic.ts index cb70719..42117c2 100644 --- a/src/antrhopic.ts +++ b/src/antrhopic.ts @@ -1,5 +1,5 @@ import {Anthropic as anthropic} from '@anthropic-ai/sdk'; -import {findByProp, objectMap, JSONSanitize, JSONAttemptParse} from '@ztimson/utils'; +import {findByProp, objectMap, JSONSanitize, JSONAttemptParse, deepCopy} from '@ztimson/utils'; import {Ai} from './ai.ts'; import {LLMMessage, LLMRequest} from './llm.ts'; import {AbortablePromise, LLMProvider} from './provider.ts'; @@ -52,6 +52,7 @@ export class Anthropic extends LLMProvider { const controller = new AbortController(); const response = new Promise(async (res, rej) => { let history = this.fromStandard([...options.history || [], {role: 'user', content: message, timestamp: Date.now()}]); + const original = deepCopy(history); if(options.compress) history = await this.ai.llm.compress(history, options.compress.max, options.compress.min, options); const requestParams: any = { model: options.model || this.model, @@ -109,6 +110,7 @@ export class Anthropic extends LLMProvider { const toolCalls = resp.content.filter((c: any) => c.type === 'tool_use'); if(toolCalls.length && !controller.signal.aborted) { history.push({role: 'assistant', content: resp.content}); + original.push({role: 'assistant', content: resp.content}); const results = await Promise.all(toolCalls.map(async (toolCall: any) => { const tool = options.tools?.find(findByProp('name', toolCall.name)); if(!tool) return {tool_use_id: toolCall.id, is_error: true, content: 'Tool not found'}; @@ -120,11 +122,12 @@ export class Anthropic extends LLMProvider { } })); history.push({role: 'user', content: results}); + original.push({role: 'user', content: results}); requestParams.messages = history; } } while (!controller.signal.aborted && resp.content.some((c: any) => c.type === 'tool_use')); if(options.stream) options.stream({done: true}); - res(this.toStandard([...history, {role: 'assistant', content: assistantMessages.join('\n\n'), timestamp: Date.now()}])); + res(this.toStandard([...original, {role: 'assistant', content: assistantMessages.join('\n\n'), timestamp: Date.now()}])); }); return Object.assign(response, {abort: () => controller.abort()});