Skip to content

Commit 1144657

Browse files
committed
automatically detect and join blocks of the same role
1 parent 64d2841 commit 1144657

File tree

2 files changed

+26
-6
lines changed

2 files changed

+26
-6
lines changed

src/Messages.php

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ public function messages(): array
1818
{
1919
return $this->messages;
2020
}
21+
2122
public function addUserTextMessage(string $text): self
2223
{
2324
return $this->addMessage(self::ROLE_USER, $text);
@@ -41,7 +42,7 @@ public function addUserImageMessage(string $url, ?string $text = null): self
4142
'media_type' => $mediaType
4243
],
4344
];
44-
$message = [ $imageMessage ];
45+
$message = [$imageMessage];
4546

4647
if ($text) {
4748
$textMessage = [
@@ -81,16 +82,31 @@ public function addMessage(string $role, string|array $content): self
8182
if ($block['type'] == 'text' && !array_key_exists('text', $block)) {
8283
throw new \InvalidArgumentException('Block text property is required for text type. Index: ' . $i);
8384
}
84-
if ($block['type'] == 'image' && (!array_key_exists('media_type', $block) || !array_key_exists('data', $block))) {
85-
throw new \InvalidArgumentException('Block media type and data property are required for image type. Index: ' . $i);
85+
if ($block['type'] == 'image' && (!array_key_exists('media_type', $block) || !array_key_exists(
86+
'data',
87+
$block
88+
))) {
89+
throw new \InvalidArgumentException(
90+
'Block media type and data property are required for image type. Index: ' . $i
91+
);
8692
}
8793
}
94+
} else {
95+
// let's standardize the way the blocks are passed
96+
$content = [
97+
[
98+
'type' => 'text',
99+
'text' => $content
100+
]
101+
];
88102
}
89103

90104
if (count($this->messages) > 0) {
91105
$lastMessage = $this->messages[count($this->messages) - 1];
92106
if ($lastMessage['role'] === $role) {
93-
throw new \InvalidArgumentException('Roles must alternate between "user" and "assistant". Message ' . count($this->messages) . ' has the same role as the previous message.');
107+
// merge messages of the same role
108+
$this->messages[count($this->messages) - 1]['content'] = array_merge($lastMessage['content'], $content);
109+
return $this;
94110
}
95111
}
96112

tests/MessagesTest.php

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,15 @@ public function test_can_add_object_text_message()
2727
$this->assertCount(1, $messages->messages());
2828
}
2929

30-
public function test_prevents_non_alternated_roles()
30+
public function test_joins_continuous_messages_with_the_same_role()
3131
{
3232
$messages = new Messages();
3333
$messages->addMessage(Messages::ROLE_USER, 'Hello');
34-
$this->expectExceptionMessage('Roles must alternate between "user" and "assistant".');
3534
$messages->addMessage(Messages::ROLE_USER, 'How are you?');
35+
$messages->addMessage(Messages::ROLE_ASSISTANT, 'I am fine');
36+
$result = $messages->messages();
37+
$this->assertCount(2, $result);
38+
$this->assertCount(2, $result[0]['content']);
39+
$this->assertCount(1, $result[1]['content']);
3640
}
3741
}

0 commit comments

Comments
 (0)