Skip to content

Commit

Permalink
fix (@ai-sdk/anthropic): combine tool and user messages, combine syst…
Browse files Browse the repository at this point in the history
…em messages (#2067)
  • Loading branch information
lgrammel committed Jun 24, 2024
1 parent 9aefeaa commit 0480083
Show file tree
Hide file tree
Showing 3 changed files with 314 additions and 43 deletions.
5 changes: 5 additions & 0 deletions .changeset/gold-pumpkins-invent.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@ai-sdk/anthropic': patch
---

fix (@ai-sdk/anthropic): combine tool and user messages, combine system messages
170 changes: 170 additions & 0 deletions packages/anthropic/src/convert-to-anthropic-messages-prompt.test.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,43 @@
import { convertToAnthropicMessagesPrompt } from './convert-to-anthropic-messages-prompt';

describe('system messages', () => {
it('should convert a single system message into an anthropic system message', async () => {
const result = await convertToAnthropicMessagesPrompt({
prompt: [
{
role: 'system',
content: 'This is a system message',
},
],
});

expect(result).toEqual({
messages: [],
system: 'This is a system message',
});
});

it('should convert multiple system messages into an anthropic system message separated by a newline', async () => {
const result = await convertToAnthropicMessagesPrompt({
prompt: [
{
role: 'system',
content: 'This is a system message',
},
{
role: 'system',
content: 'This is another system message',
},
],
});

expect(result).toEqual({
messages: [],
system: 'This is a system message\nThis is another system message',
});
});
});

describe('user messages', () => {
it('should download images for user image parts with URLs', async () => {
const result = await convertToAnthropicMessagesPrompt({
Expand Down Expand Up @@ -84,3 +122,135 @@ describe('user messages', () => {
});
});
});

describe('tool messages', () => {
it('should convert a single tool result into an anthropic user message', async () => {
const result = await convertToAnthropicMessagesPrompt({
prompt: [
{
role: 'tool',
content: [
{
type: 'tool-result',
toolName: 'tool-1',
toolCallId: 'tool-call-1',
result: { test: 'This is a tool message' },
},
],
},
],
});

expect(result).toEqual({
messages: [
{
role: 'user',
content: [
{
type: 'tool_result',
tool_use_id: 'tool-call-1',
is_error: undefined,
content: JSON.stringify({ test: 'This is a tool message' }),
},
],
},
],
system: undefined,
});
});

it('should convert multiple tool results into an anthropic user message', async () => {
const result = await convertToAnthropicMessagesPrompt({
prompt: [
{
role: 'tool',
content: [
{
type: 'tool-result',
toolName: 'tool-1',
toolCallId: 'tool-call-1',
result: { test: 'This is a tool message' },
},
{
type: 'tool-result',
toolName: 'tool-2',
toolCallId: 'tool-call-2',
result: { something: 'else' },
},
],
},
],
});

expect(result).toEqual({
messages: [
{
role: 'user',
content: [
{
type: 'tool_result',
tool_use_id: 'tool-call-1',
is_error: undefined,
content: JSON.stringify({ test: 'This is a tool message' }),
},
{
type: 'tool_result',
tool_use_id: 'tool-call-2',
is_error: undefined,
content: JSON.stringify({ something: 'else' }),
},
],
},
],
system: undefined,
});
});

it('should combine user and tool messages', async () => {
const result = await convertToAnthropicMessagesPrompt({
prompt: [
{
role: 'tool',
content: [
{
type: 'tool-result',
toolName: 'tool-1',
toolCallId: 'tool-call-1',
result: { test: 'This is a tool message' },
},
],
},
{
role: 'user',
content: [
{
type: 'text',
text: 'This is a user message',
},
],
},
],
});

expect(result).toEqual({
messages: [
{
role: 'user',
content: [
{
type: 'tool_result',
tool_use_id: 'tool-call-1',
is_error: undefined,
content: JSON.stringify({ test: 'This is a tool message' }),
},
{
type: 'text',
text: 'This is a user message',
},
],
},
],
system: undefined,
});
});
});
Loading

0 comments on commit 0480083

Please sign in to comment.