시작하기
Laravel AI SDK는 OpenAI·Anthropic·Gemini 등의 AI 프로바이더와 대화하기 위한 통합되고 표현력 있는 API를 제공합니다. AI SDK를 사용하면 도구 및 구조화된 출력을 갖춘 지능형 에이전트 구축, 이미지 생성, 음성 합성·전사, 벡터 임베딩 생성 등 다양한 AI 기능을 일관된 Laravel다운 인터페이스로 실현할 수 있습니다.Laravel AI SDK는 Laravel 13에서 추가된 공식 패키지입니다.
laravel/ai로 제공되며, 여러 AI 프로바이더를 통합 API로 다룰 수 있습니다.프로바이더 지원 목록
설치
1
패키지 설치
Composer로 Laravel AI SDK를 설치합니다.
2
설정 파일 및 마이그레이션 배포
vendor:publish Artisan 명령으로 설정 파일과 마이그레이션을 배포합니다.3
마이그레이션 실행
데이터베이스 마이그레이션을 실행합니다.
agent_conversations와 agent_conversation_messages 테이블이 생성되어 대화 이력 저장에 사용됩니다.설정
환경 변수
사용할 AI 프로바이더의 API 키를.env 파일에 설정합니다.
config/ai.php에서도 설정할 수 있습니다.
커스텀 베이스 URL
프록시 서비스를 경유시키는 경우, 프로바이더마다 커스텀 URL을 설정할 수 있습니다.OpenAI-Compatible 프로바이더
LM Studio·vLLM·Together·Fireworks·로컬 게이트웨이 등 OpenAI 호환 API를 사용하는 경우,openai-compatible 드라이버로 프로바이더를 설정할 수 있습니다. url은 필수이며, key를 지정한 경우 Bearer 토큰으로 전송됩니다.
Lab enum
코드 내에서 프로바이더를 참조하려면Lab enum을 사용합니다.
에이전트
에이전트는 Laravel AI SDK의 기본 구성 요소입니다.make:agent 명령으로 에이전트 클래스를 생성할 수 있습니다.
app/Ai/Agents/ 디렉터리에 배치됩니다. 다음은 주요 인터페이스를 모두 구현한 에이전트의 예입니다.
프롬프트
prompt() 메서드로 에이전트에 메시지를 보냅니다.
make() 정적 메서드를 사용하면 컨테이너에서 의존성을 해결하여 인스턴스를 생성할 수 있습니다.
prompt()의 인수로 덮어쓸 수 있습니다.
대화 컨텍스트
Conversational 인터페이스를 구현하고 messages() 메서드를 정의하면, 과거 대화 이력을 AI에 전달할 수 있습니다.
RemembersConversations 트레이트를 사용하면, 대화 이력을 데이터베이스에 자동으로 저장·조회할 수 있습니다.
forUser()로 대화를 시작하고, 반환된 conversationId를 사용해 continue()로 후속 대화를 이어갈 수 있습니다.
구조화된 출력
HasStructuredOutput 인터페이스를 구현하고 schema() 메서드로 JSON 스키마를 정의하면, AI의 응답을 구조화된 데이터로 받을 수 있습니다.
중첩된 객체
객체 배열
anyOf (여러 스키마 선택)
값이 여러 스키마 중 하나에 매치되는 경우,anyOf 메서드를 사용합니다.
첨부 파일
attachments 인수로 문서나 이미지를 에이전트에 전달할 수 있습니다.
스트리밍
stream() 메서드를 사용하면 응답을 청크 단위로 반환할 수 있습니다. 긴 응답을 실시간으로 프런트엔드로 보낼 때 적합합니다.
then() 콜백으로 스트리밍 완료 후 처리를 작성할 수 있습니다.
Vercel AI SDK 프로토콜
프런트엔드에서 Vercel AI SDK를 사용하는 경우usingVercelDataProtocol()을 호출합니다.
브로드캐스트
스트림 이벤트를 Laravel Echo 등의 브로드캐스트 채널에 전송할 수 있습니다.broadcastOnQueue()를 사용하면 큐를 경유해 브로드캐스트할 수 있습니다.
거대한 이벤트 스킵
브로드캐스트 플랫폼에 따라서는 WebSocket 메시지를 약 10KB로 제한하는 경우가 있습니다. 큰 도구 결과 등 데이터양이 많은 스트림 이벤트가 이 상한을 초과하여 브로드캐스트에 실패할 수 있습니다.WithoutBroadcasting 어트리뷰트를 사용해 특정 이벤트 타입을 브로드캐스트에서 제외할 수 있습니다.
agent_conversation_messages 테이블로의 저장은 계속됩니다. 그렇기 때문에 프런트엔드는 스트림 완료 후 도구의 전체 데이터를 조회할 수 있습니다. 이는 큐 경유(broadcastOnQueue)와 동기(broadcast / broadcastNow) 양쪽에서 작동합니다.
큐
queue() 메서드로 프롬프트를 큐에 쌓아 비동기 처리할 수 있습니다.
도구
도구를 사용하면 AI가 코드 내의 함수를 호출할 수 있게 됩니다.make:tool 명령으로 도구 클래스를 생성할 수 있습니다.
tools() 메서드에서 도구를 등록합니다.
유사 검색 도구
벡터 임베딩을 사용한 유사 검색 도구를 간단히 추가할 수 있습니다.withDescription()으로 도구 설명을 커스터마이즈할 수 있습니다.
파일 스토리지 도구
FileStorage 도구 팩토리를 사용하면 에이전트에 Laravel 파일시스템 디스크로의 접근을 부여할 수 있습니다. all 메서드는 지정 디스크상의 파일을 목록·읽기·URL 생성·쓰기·삭제·복사하는 도구 일습을 반환합니다.
readOnly 메서드를 사용합니다.
Illuminate\Support\Collection을 반환하므로 제공하는 도구를 더 좁힐 수도 있습니다.
MCP 도구
애플리케이션에서 Laravel MCP를 사용하고 있다면, Model Context Protocol 서버가 공개하는 도구를 에이전트에 제공할 수 있습니다. Laravel MCP 클라이언트를 사용해 원격 또는 로컬 MCP 서버에 연결하고, 그 도구를 에이전트에 직접 전달할 수 있습니다.MCP 도구를 사용하려면 애플리케이션에 Laravel MCP 패키지가 설치되어 있어야 합니다.
tools 메서드는 컬렉션을 반환하므로 ... 스프레드 연산자를 사용해 에이전트의 tools 배열로 전개합니다.
프로바이더 도구
AI 프로바이더가 네이티브로 구현한 특별한 도구입니다.웹 검색
웹 검색을 에이전트에 추가합니다. Anthropic·OpenAI·Gemini·OpenRouter에서 지원합니다.웹 페치
지정한 URL의 콘텐츠를 가져오는 도구입니다. Anthropic·Gemini에서 지원합니다.파일 검색
벡터 스토어에서 문서를 검색하는 도구입니다. OpenAI·Gemini에서 지원합니다.FileSearchQuery를 사용해 복잡한 필터도 지정할 수 있습니다.
서브에이전트
에이전트는 다른 에이전트의tools() 메서드에서 반환할 수도 있습니다. 에이전트를 도구로 등록하면 부모 에이전트가 특정 작업을 서브에이전트에 위임하고 그 결과를 원래 응답에 통합할 수 있습니다. 범용 에이전트가 전문화된 지시·도구·모델 설정·프로바이더 설정을 갖춘 특화형 에이전트에 접근할 때 편리합니다.
예를 들어 고객 지원 에이전트가 환불 정책 질문을 환불 전문 에이전트에 위임하는 예시입니다.
CanActAsTool 인터페이스를 구현하고 도구용 이름과 설명을 정의합니다.
CanActAsTool을 구현하지 않은 서브에이전트의 경우, Laravel은 클래스명을 도구명으로 사용하고 범용적인 설명문을 자동으로 생성합니다. 각 서브에이전트의 호출은 독립적으로 이루어지며 부모 에이전트의 대화 이력은 인계되지 않습니다.
미들웨어
에이전트에 미들웨어를 추가하여 프롬프트나 응답을 인터셉트할 수 있습니다.HasMiddleware 인터페이스를 구현하고 middleware() 메서드로 미들웨어를 등록합니다.
then()을 사용하면 응답 후 처리도 추가할 수 있습니다.
익명 에이전트
클래스를 정의하지 않고agent() 헬퍼로 익명 에이전트를 사용할 수 있습니다.
에이전트 설정 (PHP Attributes)
PHP 어트리뷰트를 사용해 에이전트의 기본 설정을 선언적으로 작성할 수 있습니다.프로바이더 옵션
HasProviderOptions 인터페이스를 구현하면 프로바이더 고유 옵션을 전달할 수 있습니다.
사람에 의한 승인 (Human Tool Approval)
파일 삭제나 송금 등 민감하거나 되돌릴 수 없는 작업을 수행하는 도구에는 실행 전 사람의 승인을 요구할 수 있습니다. 도구를 승인 대상으로 하려면Approvable 컨트랙트를 구현하고 InteractsWithApprovals 트레이트를 사용합니다. 승인 대상 도구는 기본적으로 승인이 필수가 됩니다.
needsApproval 메서드를 정의합니다. 이 메서드는 불리언 또는 승인 이유를 포함한 Approval 인스턴스를 반환할 수 있습니다.
tools 메서드에서 도구를 반환할 때 승인 요건을 덮어쓸 수도 있습니다.
pendingApprovals를 조사함으로써 각 도구 호출의 ID·도구명·인수·승인 이유를 확인할 수 있습니다.
Decisions 인스턴스를 전달합니다. 결정에서는 호출의 승인·거부·실행 전 인수 편집을 할 수 있습니다.
true·false는 각각 승인·거부의 생략 표기로 사용할 수 있습니다. 보류 중인 모든 도구 호출에는 결정이 필요합니다. 알 수 없는·누락된·이미 해결된 도구 호출 ID를 지정하면 ApprovalMismatchException이 발생합니다. 명시적 결정이 없는 호출에 대해서는 approveRemaining 또는 rejectRemaining 메서드로 기본 결정을 지정할 수 있습니다.
Decision::reject('승인되지 않았습니다.')처럼 결과 있는 상태로 거부하면 모델에 반환되어 응답이 계속됩니다. 결과 없이 거부하면 거부가 기록된 시점에서 생성 루프가 정지됩니다.
도구 승인은 prompt·stream·queue·broadcast·broadcastNow·broadcastOnQueue 메서드에서 지원됩니다.
스트리밍 및 브로드캐스트 중에는 일시 정지가 tool_approval_request 이벤트로 표현됩니다. Vercel AI SDK 스트림 프로토콜을 사용 중인 경우, 승인 요청과 결과는 프로토콜의 네이티브 도구 승인 파트로 방출됩니다.
큐잉된 에이전트의 경우 결과 응답은 then 콜백에 전달되며, Laravel은 ToolApprovalRequested 이벤트도 디스패치합니다.
Laravel은 모델에 계속을 요구하기 전에 승인된 도구의 실행 결과를 저장합니다. 그 후 생성이 실패한 경우 승인은 이미 해결된 상태입니다. 같은 승인 결정을 다시 보내지 말고 일반 텍스트 프롬프트로 대화를 이어가세요.
완전한 승인 흐름
다음 라우트는 완전한 승인 흐름을 보여줍니다.GET 라우트는 채팅 화면을 반환하고, POST 라우트는 채팅 화면에서의 새 텍스트 프롬프트 또는 승인 결정 중 하나를 받습니다. 이 예에서는 애플리케이션의 User 모델이 HasConversations 트레이트를 사용한다고 가정합니다.
awaiting_approval인 경우, 채팅 화면은 보류 중인 승인을 표시하고 도구 호출 ID를 키로 사용자의 선택을 같은 엔드포인트에 전송해야 합니다.
message 값을 전송합니다.
이미지 생성
Image 클래스로 이미지를 생성할 수 있습니다. OpenAI·Gemini·xAI 프로바이더가 지원합니다.
이미지 저장
큐에서 이미지 생성
음성 합성 (TTS)
Audio 클래스로 텍스트를 음성으로 변환할 수 있습니다. OpenAI·ElevenLabs 프로바이더가 지원합니다.
음성 저장
큐에서 음성 생성
전사 (STT)
Transcription 클래스로 음성 파일을 텍스트로 변환할 수 있습니다. OpenAI·ElevenLabs·Mistral 프로바이더가 지원합니다.
화자 분리 (다이어라이제이션)
diarize()를 사용하면 화자별로 분리된 전사를 얻을 수 있습니다.
큐에서 전사
텍스트 요약 (Text Summarization)
Laravel의Stringable 클래스가 제공하는 summarize 메서드로 텍스트를 요약할 수 있습니다. 기본적으로는 3문장 이내로 요약되며, 설정된 프로바이더의 가장 저렴한 텍스트 모델이 사용됩니다.
Str 클래스에는 정적 메서드 버전도 준비되어 있습니다.
임베딩 (Embeddings)
텍스트를 벡터 표현으로 변환하여 유사 검색 등에 활용할 수 있습니다.멀티모달 임베딩 (Multimodal Embeddings)
Embeddings::for 메서드는 문자열뿐 아니라 이미지·오디오·문서·비디오 입력도 받아들이므로, 텍스트 외 콘텐츠에 대해서도 임베딩을 생성할 수 있습니다. Gemini는 이미지·오디오·문서·비디오 임베딩을 지원하고, VoyageAI는 이미지·비디오 임베딩을 지원합니다.
VoyageAI는 원격 URL 미디어와 Base64 인코딩된 미디어를 동일한 요청 내에서 혼재시키는 것을 허용하지 않습니다. 로컬·스토리지·업로드된 파일은 Base64 인코딩된 콘텐츠로 전송되며, 텍스트 입력은 어느 미디어 소스와도 조합할 수 있습니다. 사용 가능한 멀티모달 모델과 입력에 대해서는 각 프로바이더의 문서를 확인하세요.
벡터 검색 (pgvector)
PostgreSQL과 pgvector 확장을 사용한 벡터 검색의 설정 예입니다.1
마이그레이션 작성
2
모델 설정
3
유사 검색 쿼리
임베딩 캐싱
같은 텍스트의 임베딩 생성이 반복되지 않도록 캐시할 수 있습니다.config/ai.php에서 기본 캐시 설정을 합니다.
리랭킹
검색 결과를 쿼리에 대한 관련도로 재순위(정렬)할 수 있습니다. Cohere·Jina 프로바이더가 지원합니다.limit()으로 반환할 건수를 좁힐 수 있습니다.
컬렉션 리랭킹
Eloquent 컬렉션을 직접 리랭킹할 수 있습니다.파일 관리
AI 프로바이더에 파일을 업로드하여 나중에 참조할 수 있습니다.저장된 파일 참조
업로드된 파일 ID로 에이전트에 첨부할 수 있습니다.파일 조회·삭제
프로바이더 지정
프로바이더 고유 옵션 지정
withProviderOptions 메서드로 프로바이더 고유 업로드 옵션을 전달할 수 있습니다. 예를 들어 OpenAI 파일의 purpose를 설정할 수 있습니다.
벡터 스토어
벡터 스토어를 사용하면 문서를 프로바이더 측에서 관리할 수 있습니다.스토어에 파일 추가
스토어에서 파일 삭제
페일오버
여러 프로바이더를 배열로 지정하면, 첫 번째 프로바이더가 실패한 경우 다음 프로바이더로 자동 폴백됩니다.테스트
Laravel AI SDK는 테스트용 페이크 기능을 제공하여, 실제 API를 호출하지 않고 테스트할 수 있습니다.에이전트 테스트
preventStrayPrompts()를 사용하면, 페이크로 정의하지 않은 프롬프트가 호출된 경우 예외를 던집니다.
구조화 출력 에이전트에 대해
fake()가 페이크 데이터를 명시적으로 전달하지 않고 호출된 경우, Laravel은 에이전트가 정의한 스키마에 맞는 페이크 데이터를 자동 생성합니다.AnonymousAgent::fake()를 사용합니다.
이미지 생성 테스트
음성 합성 테스트
전사 테스트
임베딩 테스트
리랭킹 테스트
파일 테스트
벡터 스토어 테스트
이벤트
Laravel AI SDK는 다음 이벤트를 디스패치합니다. 이 이벤트들을 리스닝하면 로그 기록이나 모니터링 등에 활용할 수 있습니다.에이전트 관련
에이전트 관련
PromptingAgent— 프롬프트 전송 전AgentPrompted— 프롬프트 전송 후StreamingAgent— 스트리밍 시작 시AgentStreamed— 스트리밍 완료 후InvokingTool— 도구 호출 전ToolInvoked— 도구 호출 후ToolApprovalRequested— 도구 승인 요청 시ToolApprovalResolved— 도구 승인 해결 후
이미지·음성·전사 관련
이미지·음성·전사 관련
GeneratingImage— 이미지 생성 전ImageGenerated— 이미지 생성 후GeneratingAudio— 음성 생성 전AudioGenerated— 음성 생성 후GeneratingTranscription— 전사 전TranscriptionGenerated— 전사 후
임베딩·리랭킹 관련
임베딩·리랭킹 관련
GeneratingEmbeddings— 임베딩 생성 전EmbeddingsGenerated— 임베딩 생성 후Reranking— 리랭킹 전Reranked— 리랭킹 후
파일·스토어 관련
파일·스토어 관련
StoringFile— 파일 저장 전FileStored— 파일 저장 후FileDeleted— 파일 삭제 후CreatingStore— 스토어 생성 전StoreCreated— 스토어 생성 후AddingFileToStore— 스토어로 파일 추가 전FileAddedToStore— 스토어로 파일 추가 후RemovingFileFromStore— 스토어에서 파일 삭제 전FileRemovedFromStore— 스토어에서 파일 삭제 후