Skip to content

Commit 97ec189

Browse files
Merge pull request #24 from GeraudBourdin/main
enable query to pixtral model
2 parents 957526b + 25a32b6 commit 97ec189

File tree

3 files changed

+135
-2
lines changed

3 files changed

+135
-2
lines changed

Readme.md

+76-1
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,38 @@ function datePlusNdays(\DateTime $date, $n) {
281281
$datePlusNdays->add(new \DateInterval('P'.abs($n).'D'));
282282
```
283283

284+
#### Pixtral request
285+
```php
286+
287+
$contents = [
288+
['type' => 'text', 'text' => 'Describe this image in detail please.'],
289+
['type' => 'image_url', 'image_url' => 'https://s3.amazonaws.com/cms.ipressroom.com/338/files/201808/5b894ee1a138352221103195_A680%7Ejogging-edit/A680%7Ejogging-edit_hero.jpg'],
290+
['type' => 'text', 'text' => 'and this one as well. Answer in French.'],
291+
['type' => 'image_url', 'image_url' => 'https://www.wolframcloud.com/obj/resourcesystem/images/a0e/a0ee3983-46c6-4c92-b85d-059044639928/6af8cfb971db031b.png']
292+
];
293+
294+
$messages = new Messages();
295+
$messages->addMixedContentUserMessage($contents);
296+
297+
try {
298+
$result = $client->chat(
299+
$messages,
300+
[
301+
'model' => 'Pixtral-12B-2409',
302+
'max_tokens' => 1024,
303+
]
304+
);
305+
} catch (MistralClientException $e) {
306+
echo $e->getMessage();
307+
exit(1);
308+
}
309+
310+
print($result->getMessage());
311+
```
312+
Result :
313+
```console
314+
Dans cette image, on voit une famille de cinq personnes posant pour une photo. Ils sont tous vêtus de chemises rouges assorties et sont allongés sur le ventre sur une surface blanche devant un fond blanc. Les membres de la famille sourient et semblent être dans une pose détendue et joyeuse, les mains jointes devant eux. La famille semble former un groupe uni et heureux, et l'ambiance générale de la photo est chaleureuse et accueillante.
315+
```
284316

285317
## Lama.cpp inference
286318
[MistralAi La plateforme](https://console.mistral.ai/) is really cheap you should consider subscribing to it instead of running
@@ -313,7 +345,7 @@ CHAT_MODEL=mistral-7b-instruct-v0.2.Q4_K_M.gguf
313345
Starting to v0.6.0 vLLM is fully compatible with the tools/tool_choice from mistral's plateforme.
314346
To get an ISO instance locally you will need to specify the template: [examples/tool_chat_template_mistral.jinja](https://github.com/vllm-project/vllm/blob/main/examples/tool_chat_template_mistral.jinja) . Here is a docker-compose you can use for example:
315347

316-
348+
vLLM inference for tool_call
317349
```yaml
318350
services:
319351
mistral:
@@ -332,6 +364,46 @@ services:
332364
environment:
333365
- HUGGING_FACE_HUB_TOKEN=*****
334366
- NVIDIA_VISIBLE_DEVICES=0,1
367+
- VLLM_WORKER_MULTIPROC_METHOD=spawn
368+
volumes:
369+
- /path_to_config/:/config
370+
- /path_to_cache/.cache/huggingface:/root/.cache/huggingface
371+
ports:
372+
- "40001:8000"
373+
deploy:
374+
resources:
375+
reservations:
376+
devices:
377+
- driver: nvidia
378+
capabilities: [gpu]
379+
runtime: nvidia
380+
ipc: host
381+
networks:
382+
- llm_1x2_network
383+
networks:
384+
llm_1x2_network:
385+
driver: bridge
386+
```
387+
vLLM inference for Pixtral
388+
```yaml
389+
services:
390+
mistral:
391+
image: vllm/vllm-openai:v0.6.1
392+
command: |
393+
--model mistralai/Pixtral-12B-2409
394+
--tokenizer_mode mistral
395+
--limit_mm_per_prompt 'image=4'
396+
--max_num_batched_tokens 16384
397+
--served-model-name Pixtral-12B-2409
398+
--max-model-len 16384
399+
--tensor-parallel-size 2
400+
--gpu-memory-utilization 1
401+
--trust-remote-code
402+
--enforce-eager
403+
environment:
404+
- HUGGING_FACE_HUB_TOKEN=*****
405+
- NVIDIA_VISIBLE_DEVICES=0,1
406+
- VLLM_WORKER_MULTIPROC_METHOD=spawn
335407
volumes:
336408
- /path_to_config/:/config
337409
- /path_to_cache/.cache/huggingface:/root/.cache/huggingface
@@ -354,6 +426,9 @@ networks:
354426
355427
356428
429+
430+
431+
357432
## About the Response object
358433
359434
`$client->chat()` method return a `Partitech\PhpMistral\Response` object.

examples/pixtral.php

+37
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
<?php
2+
require_once __DIR__ . '/../vendor/autoload.php';
3+
4+
use Partitech\PhpMistral\MistralClient;
5+
use Partitech\PhpMistral\MistralClientException;
6+
use Partitech\PhpMistral\Messages;
7+
8+
// export MISTRAL_API_KEY=your_api_key
9+
$apiKey = getenv('MISTRAL_API_KEY');
10+
$client = new MistralClient($apiKey);
11+
12+
$contents = [
13+
['type' => 'text', 'text' => 'Describe this image in detail please.'],
14+
['type' => 'image_url', 'image_url' => 'https://s3.amazonaws.com/cms.ipressroom.com/338/files/201808/5b894ee1a138352221103195_A680%7Ejogging-edit/A680%7Ejogging-edit_hero.jpg'],
15+
['type' => 'text', 'text' => 'and this one as well. Answer in French.'],
16+
['type' => 'image_url', 'image_url' => 'https://www.wolframcloud.com/obj/resourcesystem/images/a0e/a0ee3983-46c6-4c92-b85d-059044639928/6af8cfb971db031b.png']
17+
];
18+
19+
20+
$messages = new Messages();
21+
$messages->addMixedContentUserMessage($contents);
22+
try {
23+
$result = $client->chat(
24+
$messages,
25+
[
26+
'model' => 'Pixtral-12B-2409',
27+
'max_tokens' => 1024,
28+
]
29+
);
30+
} catch (MistralClientException $e) {
31+
echo $e->getMessage();
32+
exit(1);
33+
}
34+
35+
print($result->getMessage());
36+
37+
// Dans cette image, on voit une famille de cinq personnes posant pour une photo. Ils sont tous vêtus de chemises rouges assorties et sont allongés sur le ventre sur une surface blanche devant un fond blanc. Les membres de la famille sourient et semblent être dans une pose détendue et joyeuse, les mains jointes devant eux. La famille semble former un groupe uni et heureux, et l'ambiance générale de la photo est chaleureuse et accueillante.

src/Messages.php

+22-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,12 @@ public function format(string $format=MistralClient::CHAT_ML): string|array|null
2828
if(MistralClient::CHAT_ML === $format) {
2929
$messages = [];
3030
foreach($this->getMessages() as $message) {
31-
$messages[] = $message->toArray();
31+
if(!is_array($message)) {
32+
$messageArray = $message->toArray();
33+
}else{
34+
$messageArray = $message;
35+
}
36+
$messages[] = $messageArray;
3237
}
3338
return $messages;
3439
}
@@ -113,6 +118,22 @@ public function addUserMessage(string $content): self
113118
return $this;
114119
}
115120

121+
public function addMixedContentUserMessage(array $contents): void
122+
{
123+
$messageContent = [];
124+
foreach ($contents as $content) {
125+
if (isset($content['type']) && $content['type'] === 'text') {
126+
$messageContent[] = ['type' => 'text', 'text' => $content['text']];
127+
} elseif (isset($content['type']) && $content['type'] === 'image_url') {
128+
$messageContent[] = ['type' => 'image_url', 'image_url' => ['url' => $content['image_url']]];
129+
}
130+
}
131+
$this->messages[] = [
132+
'role' => 'user',
133+
'content' => $messageContent
134+
];
135+
}
136+
116137
public function addToolMessage(string $name, array $content, string $toolCallId): self
117138
{
118139
$message = new Message();

0 commit comments

Comments
 (0)