Laravel AI SDK는 OpenAI, Anthropic, Gemini, Mistral 등 주요 AI 서비스를 기본으로 서포트하고 있습니다. 그러나 이하와 같은 케이스에서는 표준 프로바이더로는 대응할 수 없습니다.
아직 공식 대응되지 않은 신흥 AI 서비스
사내의 모델 게이트웨이나 과금 관리 레이어를 경유시키고 싶음
독자 프로토콜이나 인증 방식을 가진 온프레미스 추론 서버
이러한 경우에, 커스텀 프로바이더를 구현하여 SDK의 AiManager에 등록함으로써, 표준 프로바이더와 같은 API로 이용할 수 있습니다.
OpenAI 호환 API의 경우에는 내장 드라이버를 사용한다SDK 0.9 이후, openai-compatible 드라이버가 기본으로 제공되고 있습니다. 사내의 OpenAI 호환 추론 서버(Ollama의 OpenAI 호환 엔드포인트 등)에는 config/ai.php에 설정을 추가하는 것만으로 이용할 수 있으며, 커스텀 프로바이더의 구현은 불필요합니다.
텍스트 생성 프로바이더가 구현하는 인터페이스입니다(src/Contracts/Providers/TextProvider.php).
interface TextProvider extends Provider{ public function prompt(AgentPrompt $prompt): AgentResponse; public function stream(AgentPrompt $prompt): StreamableAgentResponse; public function useTextGateway(StepTextGateway $gateway): self; public function textGenerationLoop(): TextGenerationLoop; public function defaultTextModel(): string; public function cheapestTextModel(): string; public function smartestTextModel(): string;}
prompt()와 stream()의 구현은 기존의 트레이트(GeneratesText, StreamsText)에 맡길 수 있으므로, 실제로 구현이 필요한 것은 모델명을 반환하는 3개의 메서드와 textGateway()의 합계 4개입니다. 멀티 스텝의 도구 루프는 TextGenerationLoop가 관리하므로, 게이트웨이는 1스텝분의 요청만을 처리합니다.
독자 API를 가진 추론 서비스를 my-inference라는 프로바이더로서 등록하는 예입니다.
1
프로바이더 클래스를 작성한다
app/Ai/Providers/MyInferenceProvider.php를 작성합니다.
<?phpdeclare(strict_types=1);namespace App\Ai\Providers;use Illuminate\Contracts\Events\Dispatcher;use Laravel\Ai\Contracts\Gateway\StepTextGateway;use Laravel\Ai\Contracts\Providers\TextProvider;use Laravel\Ai\Providers\Concerns\GeneratesText;use Laravel\Ai\Providers\Concerns\HasTextGateway;use Laravel\Ai\Providers\Concerns\StreamsText;use Laravel\Ai\Providers\Provider;class MyInferenceProvider extends Provider implements TextProvider{ use GeneratesText; use HasTextGateway; use StreamsText; public function __construct(protected array $config, protected Dispatcher $events) { // } /** * Get the credentials for the provider. */ public function providerCredentials(): array { return ['key' => $this->config['key'] ?? null]; } /** * Get the provider's text gateway. */ public function textGateway(): StepTextGateway { return $this->textGateway ??= new \App\Ai\Gateway\MyInferenceGateway($this->events); } public function defaultTextModel(): string { return $this->config['models']['text']['default'] ?? 'my-model-v1'; } public function cheapestTextModel(): string { return $this->config['models']['text']['cheapest'] ?? 'my-model-v1'; } public function smartestTextModel(): string { return $this->config['models']['text']['smartest'] ?? 'my-model-v1'; }}
2
AppServiceProvider에 등록한다
App\Providers\AppServiceProvider의 boot 메서드에서 extend()를 사용해 등록합니다.
<?phpnamespace App\Providers;use App\Ai\Providers\MyInferenceProvider;use Illuminate\Contracts\Events\Dispatcher;use Illuminate\Support\ServiceProvider;use Laravel\Ai\AiManager;class AppServiceProvider extends ServiceProvider{ public function boot(): void { $this->app->make(AiManager::class)->extend( 'my-inference', fn (array $config) => new MyInferenceProvider( $config, $this->app->make(Dispatcher::class) ) ); }}
0.8 이전의 TextGateway 컨트랙트(generateText(), stream(), onToolInvocation())는 0.9에서 삭제되었습니다. 커스텀 게이트웨이를 가지고 있는 경우에는 StepTextGateway로의 이관이 필요합니다. 도구 호출의 onToolInvocation()은 TextGenerationLoop로 이동되어 있습니다.