定制 helgesverre/mistral 二次开发

按需修改功能、优化性能、对接业务系统,提供一站式技术支持

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

helgesverre/mistral

Composer 安装命令:

composer require helgesverre/mistral

包简介

Laravel Client for the Mistral.ai API

README 文档

README

Laravel Client for Mistral.AI

Latest Version on Packagist Total Downloads

The Mistral.ai Laravel Client enables laravel applications to interact with the Mistral.ai API, providing straightforward access to features like chat completions and text embeddings.

Get your API key at console.mistral.ai.

Installation

You can install the package via composer:

composer require helgesverre/mistral

You can publish the config file with:

php artisan vendor:publish --tag="mistral-config"

This is the contents of the published config file:

return [
    'api_key' => env('MISTRAL_API_KEY'),
    'base_url' => env('MISTRAL_BASE_URL'), // defaults to https://api.mistral.ai/v1 if null
    'timeout' => env('MISTRAL_TIMEOUT', 60),
];

Usage

Client Instantiation

Create an instance of the Mistral client to start interacting with the API. This instance will be your primary interface for sending requests to Mistral.AI.

use HelgeSverre\Mistral\Enums\Model;
use HelgeSverre\Mistral\Mistral;

// Instantiate the client
$mistral = new Mistral(apiKey: config('mistral.api_key'));

// Or use the Facade (Laravel)
Mistral::chat();
Mistral::simpleChat();
Mistral::embedding();
Mistral::models();

Examples

The package includes 12 hands-on examples in the examples/ directory, each with detailed documentation, working code, and explanations. These examples are the fastest way to learn the SDK and see it in action.

Quick Start: Begin with 01-getting-started to set up your first working integration.

Example Description
01-getting-started Install the SDK, configure authentication, and make your first API call
02-basic-chat Learn chat completions, system messages, and multi-turn conversations
03-chat-parameters Master temperature, top_p, max_tokens, and other generation parameters
04-streaming-chat Implement real-time streaming responses with Server-Sent Events
05-function-calling Enable AI to call PHP functions and interact with your application
06-embeddings Generate vector embeddings for semantic search and similarity matching
07-ocr Extract and process text from images and documents using OCR
08-audio Transcribe audio files with support for multiple languages and formats
09-moderation Identify and filter inappropriate content with content moderation
10-error-handling Implement robust error handling, retry logic, and rate limit management
11-speech Generate spoken audio from text with preset or custom voices
12-voices Manage custom voices — create from a sample, list, update, delete

Each example includes:

  • Step-by-step implementation guide
  • Complete working code
  • Real-world use cases
  • Troubleshooting tips
  • Links to related examples

To run an example:

cd examples/01-getting-started
php getting-started.php

Available Resources & Methods

The Mistral PHP client provides 14 resource classes. Most resources offer both Response-returning methods and typed DTO convenience methods; where omitted, you can still call ->dto() on the Response.

Chat Resource

Access via $mistral->chat()

Methods:

  • create(...): Response - Create a chat completion
  • createDto(...): ChatCompletionResponse - Create a chat completion and return typed DTO
  • createStreamed(...): Generator - Stream chat completions

Example:

$completion = $mistral->chat()->createDto(
    messages: [['role' => 'user', 'content' => 'Hello!']],
    model: Model::small->value
);

SimpleChat Resource

Access via $mistral->simpleChat()

Methods:

  • create(...): SimpleChatResponse - Simplified chat completion (returns flattened DTO directly)
  • stream(...): Generator - Stream simplified chat completions

Example:

$response = $mistral->simpleChat()->create(
    messages: [['role' => 'user', 'content' => 'Hello!']],
    model: Model::medium->value
);
echo $response->content; // Direct access to content

Embedding Resource

Access via $mistral->embedding()

Methods:

  • create(array $input, ...): Response - Create embeddings
  • createDto(array $input, ...): EmbeddingResponse - Create embeddings and return typed DTO

Example:

$embeddings = $mistral->embedding()->createDto([
    'Text to embed',
    'Another text'
]);

Models Resource

Access via $mistral->models()

Methods:

  • list(): Response - List available models
  • listDto(): ModelList - List models and return typed DTO
  • retrieve(string $modelId): BaseModelCard|FTModelCard - Get model details
  • delete(string $modelId): DeleteModelOut - Delete a fine-tuned model

Example:

$models = $mistral->models()->listDto();
foreach ($models->data as $model) {
    echo $model->id;
}

OCR Resource

Access via $mistral->ocr()

Methods:

  • process(...): Response - Process document with OCR
  • processDto(...): OCRResponse - Process and return typed DTO
  • processUrl(string $url, ...): Response - Process document from URL
  • processUrlDto(string $url, ...): OCRResponse - Process URL and return typed DTO
  • processBase64(string $base64, ...): Response - Process base64 encoded document
  • processBase64Dto(string $base64, ...): OCRResponse - Process base64 and return typed DTO

Example:

$result = $mistral->ocr()->processUrlDto(
    url: 'https://example.com/document.pdf'
);

FIM Resource (Fill-in-the-Middle)

Access via $mistral->fim()

Methods:

  • create(...): Response - Create FIM completion
  • createDto(...): FIMCompletionResponse - Create and return typed DTO
  • createStreamed(...): Generator - Stream FIM completions

Example:

$completion = $mistral->fim()->createDto(
    model: 'codestral-latest',
    prompt: 'def fibonacci(',
    suffix: '    return result'
);

Agents Resource

Access via $mistral->agents()

Methods:

  • create(AgentCreationRequest $request): Response - Create an agent
  • createDto(AgentCreationRequest $request): Agent - Create and return typed DTO
  • list(?int $page, ?int $pageSize): Response - List agents
  • listDto(?int $page, ?int $pageSize): AgentList - List and return typed DTO
  • get(string $agentId): Response - Get agent details
  • getDto(string $agentId): Agent - Get agent and return typed DTO
  • update(string $agentId, AgentUpdateRequest $request): Response - Update agent
  • updateDto(string $agentId, AgentUpdateRequest $request): Agent - Update and return typed DTO
  • updateVersion(string $agentId, int $version): Response - Switch agent version
  • updateVersionDto(string $agentId, int $version): Agent - Switch version and return typed DTO
  • listVersions(string $agentId, ?int $page, ?int $pageSize): Response - List all versions of an agent
  • listVersionsDto(...): DataCollection<Agent> - List versions and return typed DTO collection
  • getVersion(string $agentId, int $version): Response - Get a specific agent version
  • getVersionDto(string $agentId, int $version): Agent - Get version and return typed DTO
  • listAliases(string $agentId): Response - List all aliases for an agent
  • listAliasesDto(string $agentId): DataCollection<AgentAliasResponse> - List aliases and return typed DTO collection
  • createAlias(string $agentId, string $alias, int $version): Response - Create or update an alias (idempotent PUT)
  • createAliasDto(...): AgentAliasResponse - Create/update alias and return typed DTO
  • deleteAlias(string $agentId, string $alias): Response - Delete an alias (204 No Content)

Conversations Resource

Access via $mistral->conversations()

Methods:

  • create(ConversationRequest $request): Response - Create conversation
  • createDto(ConversationRequest $request): ConversationResponse - Create and return typed DTO
  • createStreamed(ConversationRequest $request): Generator - Create with streaming
  • list(?int $page, ?int $pageSize, ?string $order): Response - List conversations
  • listDto(...): ConversationList - List and return typed DTO
  • get(string $conversationId): Response - Get conversation
  • getDto(string $conversationId): ConversationResponse - Get and return typed DTO
  • append(string $conversationId, ConversationAppendRequest $request): Response - Append to conversation
  • appendDto(...): ConversationResponse - Append and return typed DTO
  • appendStreamed(...): Generator - Append with streaming
  • getHistory(string $conversationId): Response - Get conversation history
  • getHistoryDto(string $conversationId): ConversationHistory - Get history and return typed DTO
  • getMessages(string $conversationId): Response - Get conversation messages
  • getMessagesDto(string $conversationId): ConversationMessages - Get messages and return typed DTO
  • restart(string $conversationId, ConversationRestartRequest $request): Response - Restart conversation
  • restartDto(...): ConversationResponse - Restart and return typed DTO
  • restartStreamed(...): Generator - Restart with streaming

Audio Resource

Access via $mistral->audio()

Methods:

Transcription (speech-to-text):

  • transcribe(string $filePath, ...): Response - Transcribe audio
  • transcribeDto(string $filePath, ...): TranscriptionResponse - Transcribe and return typed DTO
  • transcribeStreamed(string $filePath, ...): Generator - Transcribe with streaming

Speech (text-to-speech):

  • speech(SpeechRequest $request): Response - Generate speech audio
  • speechDto(SpeechRequest $request): SpeechResponse - Generate speech and return typed DTO (base64 audio + decoded() / saveTo() helpers)
  • speechStreamed(SpeechRequest $request): Generator - Stream audio chunks (SpeechStreamAudioDelta + final SpeechStreamDone)

Voices:

  • listVoices(?int $limit, ?int $offset): Response - List voices (paginated)
  • listVoicesDto(...): VoiceListResponse
  • createVoice(VoiceCreateRequest $request): Response - Create a custom voice (use VoiceCreateRequest::fromFile() to load + base64 a local file)
  • createVoiceDto(...): VoiceResponse
  • getVoice(string $voiceId): Response - Get a voice
  • getVoiceDto(string $voiceId): VoiceResponse
  • updateVoice(string $voiceId, VoiceUpdateRequest $request): Response - Update voice metadata
  • updateVoiceDto(...): VoiceResponse
  • deleteVoice(string $voiceId): Response - Delete a custom voice (returns the deleted voice)
  • deleteVoiceDto(string $voiceId): VoiceResponse
  • getVoiceSample(string $voiceId): Response - Download the raw audio/wav sample for a voice

Example — transcription:

$transcription = $mistral->audio()->transcribeDto(
    filePath: '/path/to/audio.mp3',
    model: 'voxtral-small-latest'
);

Example — text-to-speech:

use HelgeSverre\Mistral\Dto\Audio\SpeechRequest;
use HelgeSverre\Mistral\Enums\SpeechOutputFormat;

$dto = $mistral->audio()->speechDto(
    SpeechRequest::withVoice(
        input: 'Hello from PHP!',
        voiceId: 'alice',
        responseFormat: SpeechOutputFormat::MP3,
    )
);

$dto->saveTo('hello.mp3');

Files Resource

Access via $mistral->files()

Methods:

  • upload(string $filePath, ?FilePurpose $purpose): Response - Upload file
  • uploadDto(...): UploadFileOut - Upload and return typed DTO
  • list(...): Response - List files with filters
  • listDto(...): ListFilesOut - List and return typed DTO
  • retrieve(string $fileId): Response - Get file metadata
  • retrieveDto(string $fileId): RetrieveFileOut - Get metadata and return typed DTO
  • delete(string $fileId): Response - Delete file
  • deleteDto(string $fileId): DeleteFileOut - Delete and return typed DTO
  • download(string $fileId): Response - Download file content
  • getSignedUrl(string $fileId, ?int $expiry): Response - Get signed download URL
  • getSignedUrlDto(string $fileId, ?int $expiry): FileSignedURL - Get URL and return typed DTO

FineTuning Resource

Access via $mistral->fineTuning()

Methods:

  • list(...): Response - List fine-tuning jobs
  • listAsDto(...): JobsOut - List and return typed DTO
  • create(JobIn $jobIn, ?bool $dryRun): Response - Create fine-tuning job
  • createAsDto(JobIn $jobIn, ?bool $dryRun): CompletionJobOut|ClassifierJobOut|LegacyJobMetadataOut
  • get(string $jobId): Response - Get job details
  • getAsDto(string $jobId): CompletionDetailedJobOut|ClassifierDetailedJobOut
  • cancel(string $jobId): Response - Cancel job
  • cancelAsDto(string $jobId): CompletionDetailedJobOut|ClassifierDetailedJobOut
  • start(string $jobId): Response - Start validated job
  • startAsDto(string $jobId): CompletionDetailedJobOut|ClassifierDetailedJobOut
  • updateModel(string $modelId, UpdateFTModelIn $update): Response - Update model metadata
  • updateModelAsDto(...): CompletionFTModelOut|ClassifierFTModelOut
  • archiveModel(string $modelId): Response - Archive model
  • archiveModelAsDto(string $modelId): ArchiveFTModelOut
  • unarchiveModel(string $modelId): Response - Unarchive model
  • unarchiveModelAsDto(string $modelId): UnarchiveFTModelOut

Batch Resource

Access via $mistral->batch()

Methods:

  • list(...): Response - List batch jobs
  • listAsDto(...): BatchJobsOut - List and return typed DTO
  • create(BatchJobIn $batchJobIn): Response - Create batch job
  • createAsDto(BatchJobIn $batchJobIn): BatchJobOut - Create and return typed DTO
  • get(string $jobId): Response - Get batch job details
  • getAsDto(string $jobId): BatchJobOut - Get and return typed DTO
  • cancel(string $jobId): Response - Cancel batch job
  • cancelAsDto(string $jobId): BatchJobOut - Cancel and return typed DTO

Classifications Resource

Access via $mistral->classifications()

Methods:

  • moderate(string $model, string|array $input): Response - Moderate content
  • moderateAsDto(string $model, string|array $input): ModerationResponse - Moderate and return typed DTO
  • moderateChat(string $model, array $input): Response - Moderate chat messages
  • moderateChatAsDto(string $model, array $input): ModerationResponse - Moderate chat and return typed DTO
  • classify(string $model, string|array $input): Response - Classify content
  • classifyAsDto(string $model, string|array $input): ClassificationResponse - Classify and return typed DTO
  • classifyChat(string $model, array $messages): Response - Classify chat
  • classifyChatAsDto(string $model, array $messages): ClassificationResponse - Classify chat and return typed DTO

Example:

$moderation = $mistral->classifications()->moderateAsDto(
    model: 'mistral-moderation-latest',
    input: 'Text to moderate'
);

Libraries Resource

Access via $mistral->libraries()

Methods:

  • list(?int $page, ?int $pageSize): Response - List libraries
  • create(LibraryIn $library): Response - Create library
  • get(string $libraryId): Response - Get library details
  • update(string $libraryId, LibraryInUpdate $library): Response - Update library
  • delete(string $libraryId): Response - Delete library
  • listDocuments(string $libraryId, ...): Response - List documents in library
  • uploadDocument(string $libraryId, string $filePath): Response - Upload document
  • getDocument(string $libraryId, string $documentId): Response - Get document details
  • updateDocument(string $libraryId, string $documentId, DocumentUpdateIn $update): Response - Update document
  • deleteDocument(string $libraryId, string $documentId): Response - Delete document
  • listSharing(string $libraryId): Response - List library sharing settings
  • createSharing(string $libraryId, SharingIn $sharing): Response - Create/update sharing
  • deleteSharing(string $libraryId, SharingDelete $sharing): Response - Delete sharing

Resources

Models Resource

List available models

// Get Response object
$response = $mistral->models()->list();

// Or get typed DTO directly
/** @var \HelgeSverre\Mistral\Dto\Models\ModelList $models */
$models = $mistral->models()->listDto();

Embeddings Resource

Create embedding

// Get Response object
$response = $mistral->embedding()->create([
    "A string here",
    "Another one here",
]);

// Or get typed DTO directly
/** @var EmbeddingResponse $embeddings */
$embeddings = $mistral->embedding()->createDto([
    "A string here",
    "Another one here",
]);

Chat Resource

Create Chat Completion

// Get Response object
$response = $mistral->chat()->create(
    messages: [
        [
            "role" => "user",
            "content" => "Write hello world in BASH",
        ]
    ],
    model: Model::medium->value,
    temperature: 0.4,
    maxTokens: 100,
    safeMode: false
);

// Or get typed DTO directly
/** @var ChatCompletionResponse $completion */
$completion = $mistral->chat()->createDto(
    messages: [
        [
            "role" => "user",
            "content" => "Write hello world in BASH",
        ]
    ],
    model: Model::medium->value,
    temperature: 0.4,
    maxTokens: 100,
    safeMode: false
);

Create Chat Completion with Function Calling

$response = $this->mistral->chat()->create(
    messages: [
        [
            'role' => Role::user->value,
            'content' => 'What is the weather in Bergen, Norway?',
        ],
    ],
    model: Model::large->value,
    maxTokens: 1000,
    tools: [
        [
            'type' => 'function',
            'function' => [
                'name' => 'searchWeather',
                'description' => 'Get the weather for a location',
                'parameters' => [
                    'type' => 'object',
                    'required' => [
                        'location',
                    ],
                    'properties' => [
                        'location' => [
                            'type' => 'string',
                            'description' => 'The location to get the weather for.',
                        ],
                    ],
                ],
            ],
        ],
        [
            'type' => 'function',
            'function' => [
                'name' => 'sendWeatherNotification',
                'description' => 'Send notification about weather to a user',
                'parameters' => [
                    'type' => 'object',
                    'required' => [
                        'userId',
                        'message',
                    ],
                    'properties' => [
                        'userId' => [
                            'type' => 'string',
                            'description' => 'the id of the user',
                        ],
                        'message' => [
                            'type' => 'string',
                            'description' => 'the message to send the user',
                        ],
                    ],
                ],
            ],
        ],
    ],
    toolChoice: 'any',
);

// Tool calls are returned in the response
$response->json('choices.0.message.tool_calls');
$response->json('choices.0.message.tool_calls.0.id');
$response->json('choices.0.message.tool_calls.0.type');
$response->json('choices.0.message.tool_calls.0.function');
$response->json('choices.0.message.tool_calls.0.function.name');
$response->json('choices.0.message.tool_calls.0.function.arguments');


// Or using the dto

/** @var ChatCompletionResponse $dto */
$dto = $response->dto();

$dto->choices; // array of ChatCompletionChoice

foreach ($dto->choices as $choice) {

    $choice->message; // ChatCompletionMessage

    foreach ($choice->message->toolCalls as $toolCall) {
        $toolCall->id; // null
        $toolCall->type; // function
        $toolCall->function; // FunctionCall
        $toolCall->function->name; // 'searchWeather'
        $toolCall->function->arguments; // '{"location":"Bergen, Norway"}'
        $toolCall->function->args(); // ['location' => 'Bergen, Norway']
    }
}

Create Streamed Chat Completions

// Returns a generator, which you can iterate over to get the streamed chunks
$stream = $mistral->chat()->createStreamed(
    messages: [
        [
            'role' => 'user',
            'content' => 'Make a markdown list of 10 common fruits'
        ],
    ],
    model: Model::small->value,
);

foreach ($stream as $chunk) {

    /** @var StreamedChatCompletionResponse $chunk */

    echo $chunk->id; // 'cmpl-0339459d35cb441b9f111b94216cff97'
    echo $chunk->model; // 'mistral-small'
    echo $chunk->object; // 'chat.completion.chunk'
    echo $chunk->created; // DateTime

    foreach ($chunk->choices as $choice) {
        $choice->index; // 0
        $choice->delta->role; // 'assistant'
        $choice->delta->content; // 'Fruit list...'
        $choice->finishReason; // 'length'
    }
}

SimpleChat Resource

For convenience, the client also provides a simple chat completion method, which returns a simpler, condensed and flattened DTO, which is useful for quick prototyping.

Create simple chat completions

$response = $mistral->simpleChat()->create(
    messages: [
        [
            "role" => "user",
            "content" => "Hello world!",
        ],
    ],
    model: Model::medium->value,
    temperature: 0.4,
    maxTokens: 1500,
    safeMode: false
);

/** @var SimpleChatResponse $response */

Create Streamed Simple Chat Completions

// Returns a generator, which you can iterate over to get the streamed chunks
$response = $mistral->simpleChat()->stream(
    messages: [
        [
            'role' => "user",
            'content' => 'Say the word "banana"',
        ],
    ],
    maxTokens: 100,
);

foreach ($response as $chunk) {
    /** @var SimpleStreamChunk $chunk */

    $chunk->id;           // 'cmpl-716e95d336db4e51a04cbcf2b84d1a76'
    $chunk->model;        // 'mistral-medium'
    $chunk->object;       // 'chat.completion.chunk'
    $chunk->created;      // '2024-01-03 12:00:00'
    $chunk->role;         // 'assistant'
    $chunk->content;      // 'the text \n'
    $chunk->finishReason; // 'length'
}

List of DTOs

For convenience, here is a list of all the DTOs available in this package, organized by feature area.

Chat

SimpleChat

Embeddings

Fill-in-the-Middle (FIM)

OCR

Models

Fine-Tuning

Files

Batch

Audio

Classifications & Moderation

Agents

Conversations

Libraries

Shared/Common

List of available Mistral models

The following models are available in the Mistral API. You can use the Model enum in this package to refer to them, or use the string value directly.

Current Production Models

Enum Case String Value Type Description
Model::large->value 'mistral-large-latest' Chat Most capable model for complex reasoning and specialized tasks
Model::medium->value 'mistral-medium-latest' Chat Balanced model for intermediate tasks
Model::small->value 'mistral-small-latest' Chat Fast, efficient model for simple bulk tasks
Model::magistralMedium->value 'magistral-medium-latest' Reasoning Advanced reasoning model
Model::pixtralLarge->value 'pixtral-large-latest' Vision Advanced vision model for image understanding
Model::pixtral12b->value 'pixtral-12b-latest' Vision Efficient vision model
Model::codestral->value 'codestral-latest' Code Specialized model for code generation and understanding
Model::ministral8b->value 'ministral-8b-latest' Chat Compact 8B parameter model for edge deployment
Model::voxtralSmall->value 'voxtral-small-latest' Audio Audio transcription model
Model::embed->value 'mistral-embed' Embeddings Text embedding model for semantic search and retrieval

Open Source Models

Enum Case String Value Type Description
Model::mistral7b->value 'open-mistral-7b' Chat 7B parameter open source foundation model
Model::mixtral->value 'open-mixtral-8x7b' Chat Mixture of Experts model with 8x7B parameters

For the most up-to-date model information and capabilities, visit the Mistral AI Models Documentation.

Testing

cp .env.example .env
composer test
composer analyse src

License

The MIT License (MIT). Please see License File for more information.

Disclaimer

Mistral and the Mistral logo are trademarks of Mistral.ai. This package is not affiliated with, endorsed by, or sponsored by Mistral.ai. All trademarks and registered trademarks are the property of their respective owners.

See Mistral.AI for more information.

helgesverre/mistral 适用场景与选型建议

helgesverre/mistral 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 18.9k 次下载、GitHub Stars 达 55, 最近一次更新时间为 2023 年 12 月 14 日, 在 PHP 生态内属于活跃度较高的组件。

它主要适用于以下技术方向: 「sdk」 「laravel」 「ai」 「mistral」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。

我们在过去多个企业项目中使用过 helgesverre/mistral 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。

围绕 helgesverre/mistral 我们能提供哪些服务?
定制开发 / 二次开发

基于 helgesverre/mistral 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。

BUG 修复 & 性能优化

线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。

项目外包 & 长期维护

承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。

yvsm@zunyunkeji.com QQ:316430983 微信:yvsm316 西安尊云信息科技 · 专注 PHP / Go / 分布式系统研发

统计信息

  • 总下载量: 18.9k
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 55
  • 点击次数: 24
  • 依赖项目数: 1
  • 推荐数: 0

GitHub 信息

  • Stars: 55
  • Watchers: 1
  • Forks: 4
  • 开发语言: PHP

其他信息

  • 授权协议: MIT
  • 更新时间: 2023-12-14