Skip to content

Commit 7f640dc

Browse files
committed
move support for file_id to OpenAI only
1 parent be481e6 commit 7f640dc

File tree

7 files changed

+49
-27
lines changed

7 files changed

+49
-27
lines changed

Diff for: docs/input-modalities/documents.md

+3-2
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ use Prism\Enums\Provider;
4141
use Prism\Prism\Prism;
4242
use Prism\Prism\ValueObjects\Messages\UserMessage;
4343
use Prism\Prism\ValueObjects\Messages\Support\Document;
44+
use Prism\Prism\ValueObjects\Messages\Support\OpenAIFile;
4445

4546
Prism::text()
4647
->using(Provider::Anthropic, 'claude-3-5-sonnet-20241022')
@@ -63,9 +64,9 @@ Prism::text()
6364
]),
6465
// Or from a file_id
6566
new UserMessage('Here is the document from file_id', [
66-
Document::fromFileId('file-lsfgSXyV2xEb8gw8fYjXU6'),
67+
new OpenAIFile('file-lsfgSXyV2xEb8gw8fYjXU6'),
6768
]),
6869
])
6970
->generate();
7071

71-
```
72+
```

Diff for: src/Providers/OpenAI/Maps/MessageMap.php

+18-4
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
use Prism\Prism\ValueObjects\Messages\AssistantMessage;
1010
use Prism\Prism\ValueObjects\Messages\Support\Document;
1111
use Prism\Prism\ValueObjects\Messages\Support\Image;
12+
use Prism\Prism\ValueObjects\Messages\Support\OpenAIFile;
1213
use Prism\Prism\ValueObjects\Messages\SystemMessage;
1314
use Prism\Prism\ValueObjects\Messages\ToolResultMessage;
1415
use Prism\Prism\ValueObjects\Messages\UserMessage;
@@ -84,6 +85,7 @@ protected function mapUserMessage(UserMessage $message): void
8485
['type' => 'text', 'text' => $message->text()],
8586
...self::mapImageParts($message->images()),
8687
...self::mapDocumentParts($message->documents()),
88+
...self::mapFileParts($message->files()),
8789
],
8890
];
8991
}
@@ -111,22 +113,34 @@ protected static function mapImageParts(array $images): array
111113
protected static function mapDocumentParts(array $documents): array
112114
{
113115
return array_map(function (Document $document): array {
114-
if (! in_array($document->dataFormat, ['base64', 'file_id'])) {
116+
if ($document->dataFormat !== 'base64') {
115117
throw new \InvalidArgumentException("OpenAI does not support $document->dataFormat documents.");
116118
}
117119

118120
return [
119121
'type' => 'file',
120-
'file' => $document->dataFormat === 'base64' ? [
122+
'file' => [
121123
'file_data' => sprintf('data:%s;base64,%s', $document->mimeType, $document->document), // @phpstan-ignore argument.type
122124
'filename' => $document->documentTitle,
123-
] : [
124-
'file_id' => $document->document,
125125
],
126126
];
127127
}, $documents);
128128
}
129129

130+
/**
131+
* @param OpenAIFile[] $files
132+
* @return array<int, mixed>
133+
*/
134+
protected static function mapFileParts(array $files): array
135+
{
136+
return array_map(fn (OpenAIFile $file): array => [
137+
'type' => 'file',
138+
'file' => [
139+
'file_id' => $file->fileId,
140+
],
141+
], $files);
142+
}
143+
130144
protected function mapAssistantMessage(AssistantMessage $message): void
131145
{
132146
$toolCalls = array_map(fn (ToolCall $toolCall): array => [

Diff for: src/ValueObjects/Messages/Support/Document.php

-9
Original file line numberDiff line numberDiff line change
@@ -134,15 +134,6 @@ public static function fromUrl(string $url, ?string $title = null, ?string $cont
134134
);
135135
}
136136

137-
public static function fromFileId(string $fileId): self
138-
{
139-
return new self(
140-
document: $fileId,
141-
mimeType: null,
142-
dataFormat: 'file_id',
143-
);
144-
}
145-
146137
public function isUrl(): bool
147138
{
148139
return $this->dataFormat === 'url';

Diff for: src/ValueObjects/Messages/Support/OpenAIFile.php

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Prism\Prism\ValueObjects\Messages\Support;
6+
7+
readonly class OpenAIFile
8+
{
9+
public function __construct(public string $fileId) {}
10+
}

Diff for: src/ValueObjects/Messages/UserMessage.php

+14-1
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,15 @@
88
use Prism\Prism\Contracts\Message;
99
use Prism\Prism\ValueObjects\Messages\Support\Document;
1010
use Prism\Prism\ValueObjects\Messages\Support\Image;
11+
use Prism\Prism\ValueObjects\Messages\Support\OpenAIFile;
1112
use Prism\Prism\ValueObjects\Messages\Support\Text;
1213

1314
class UserMessage implements Message
1415
{
1516
use HasProviderMeta;
1617

1718
/**
18-
* @param array<int, Text|Image|Document> $additionalContent
19+
* @param array<int, Text|Image|Document|OpenAIFile> $additionalContent
1920
*/
2021
public function __construct(
2122
protected readonly string $content,
@@ -58,4 +59,16 @@ public function documents(): array
5859
->where(fn ($part): bool => $part instanceof Document)
5960
->toArray();
6061
}
62+
63+
/**
64+
* Note: Prism currently only supports previously uploaded Files with OpenAI.
65+
*
66+
* @return OpenAIFile[]
67+
*/
68+
public function files(): array
69+
{
70+
return collect($this->additionalContent)
71+
->where(fn ($part): bool => $part instanceof OpenAIFile)
72+
->toArray();
73+
}
6174
}

Diff for: tests/Providers/OpenAI/MessageMapTest.php

+4-3
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
use Prism\Prism\ValueObjects\Messages\AssistantMessage;
99
use Prism\Prism\ValueObjects\Messages\Support\Document;
1010
use Prism\Prism\ValueObjects\Messages\Support\Image;
11+
use Prism\Prism\ValueObjects\Messages\Support\OpenAIFile;
1112
use Prism\Prism\ValueObjects\Messages\SystemMessage;
1213
use Prism\Prism\ValueObjects\Messages\ToolResultMessage;
1314
use Prism\Prism\ValueObjects\Messages\UserMessage;
@@ -204,11 +205,11 @@
204205
->toContain(base64_encode(file_get_contents('tests/Fixtures/test-pdf.pdf')));
205206
});
206207

207-
it('maps user messages with file_id documents', function (): void {
208-
$messageMap = new MessageMap(
208+
it('maps previously uploaded files', function (): void {
209+
$messageMap = new \Prism\Prism\Providers\OpenAi\Maps\MessageMap(
209210
messages: [
210211
new UserMessage('Here is the document', [
211-
Document::fromFileId('previously-uploaded-file-id'),
212+
new OpenAIFile('previously-uploaded-file-id'),
212213
]),
213214
],
214215
systemPrompts: []

Diff for: tests/ValueObjects/Messages/Support/DocumentTest.php

-8
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,3 @@
3030
expect($document->documentTitle)->toBe('title');
3131
expect($document->documentContext)->toBe('context');
3232
});
33-
34-
it('can create a document from file_id', function (): void {
35-
$document = Document::fromFileId('the-file-id');
36-
37-
expect($document->document)->toBe('the-file-id');
38-
expect($document->mimeType)->toBeNull();
39-
expect($document->dataFormat)->toBe('file_id');
40-
});

0 commit comments

Comments
 (0)