From b4bcaa3413a0156459d969815b0a51a48cf8a73d Mon Sep 17 00:00:00 2001 From: Yogesh Vaishnav Date: Tue, 27 Jan 2026 11:24:07 +0530 Subject: [PATCH 1/3] styles(pint): add rule to import fqcn --- pint.json | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 pint.json diff --git a/pint.json b/pint.json new file mode 100644 index 00000000..14c61153 --- /dev/null +++ b/pint.json @@ -0,0 +1,8 @@ +{ + "preset": "laravel", + "rules": { + "fully_qualified_strict_types": { + "import_symbols": true + } + } +} \ No newline at end of file From e6af060c673d11e11da31e33a59460f82d415137 Mon Sep 17 00:00:00 2001 From: Yogesh Vaishnav Date: Tue, 27 Jan 2026 11:25:02 +0530 Subject: [PATCH 2/3] chore(composer/scripts): enable running pint in parallel mode --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 017960dc..5b8b46de 100644 --- a/composer.json +++ b/composer.json @@ -67,7 +67,7 @@ "@prepare" ], "format": [ - "@php vendor/bin/pint --ansi", + "@php vendor/bin/pint --ansi --parallel", "@php vendor/bin/rector process --no-diffs" ], "test": [ From 835f1e1320223d362d4ff83f557822571f0b78c6 Mon Sep 17 00:00:00 2001 From: Yogesh Vaishnav Date: Tue, 27 Jan 2026 11:25:16 +0530 Subject: [PATCH 3/3] chore: run pint --- src/PrismServer.php | 2 +- src/Providers/Anthropic/Anthropic.php | 3 ++- src/Providers/Anthropic/Handlers/Stream.php | 2 +- src/Providers/DeepSeek/Handlers/Stream.php | 2 +- .../DeepSeek/Handlers/Structured.php | 3 ++- src/Providers/DeepSeek/Handlers/Text.php | 3 ++- src/Providers/ElevenLabs/Handlers/Audio.php | 3 ++- src/Providers/Gemini/Handlers/Cache.php | 3 ++- src/Providers/Gemini/Handlers/Stream.php | 2 +- src/Providers/Gemini/Handlers/Structured.php | 3 ++- src/Providers/Groq/Handlers/Audio.php | 5 +++-- src/Providers/Groq/Handlers/Stream.php | 5 +++-- src/Providers/Mistral/Handlers/Audio.php | 3 ++- src/Providers/Mistral/Handlers/OCR.php | 3 ++- src/Providers/Mistral/Handlers/Stream.php | 2 +- src/Providers/OpenAI/Handlers/Audio.php | 5 +++-- .../OpenRouter/Handlers/Structured.php | 3 ++- src/Providers/OpenRouter/Handlers/Text.php | 3 ++- src/Providers/XAI/Handlers/Stream.php | 4 ++-- src/Rectors/ReorderMethodsRector.php | 3 ++- src/Streaming/Adapters/BroadcastAdapter.php | 2 +- src/Streaming/Adapters/SSEAdapter.php | 2 +- src/Streaming/StreamState.php | 2 +- src/Structured/ResponseBuilder.php | 6 ++++-- src/Testing/StructuredResponseFake.php | 3 ++- tests/Concerns/HasFluentAttributesTest.php | 2 +- tests/Concerns/WhenProviderTest.php | 4 ++-- tests/Http/PrismModelControllerTest.php | 4 ++-- tests/Pest.php | 4 +++- .../Anthropic/CitationsMapperTest.php | 4 ++-- tests/Providers/Anthropic/StructuredTest.php | 2 +- tests/Providers/DeepSeek/StreamTest.php | 4 ++-- tests/Providers/Gemini/GeminiStreamTest.php | 8 ++++---- tests/Providers/Groq/StreamTest.php | 9 +++++---- tests/Providers/Mistral/EmbeddingsTest.php | 4 ++-- tests/Providers/Mistral/StreamTest.php | 9 +++++---- tests/Providers/Ollama/MessageMapTest.php | 3 ++- tests/Providers/Ollama/StreamTest.php | 6 +++--- tests/Providers/OpenAI/ModerationTest.php | 5 +++-- tests/Providers/OpenAI/TextTest.php | 5 +++-- tests/Providers/OpenRouter/StreamTest.php | 4 ++-- tests/Providers/XAI/StreamTest.php | 4 ++-- tests/SchemaTest.php | 3 ++- .../Adapters/BroadcastAdapterTest.php | 3 ++- .../Adapters/DataProtocolAdapterTest.php | 19 ++++++++++++------- tests/Streaming/Adapters/SSEAdapterTest.php | 3 ++- .../Streaming/OnStreamEndIntegrationTest.php | 5 +++-- tests/Streaming/StreamCollectorTest.php | 7 ++++--- tests/TestCase.php | 2 +- 49 files changed, 117 insertions(+), 83 deletions(-) diff --git a/src/PrismServer.php b/src/PrismServer.php index 45465af8..b46a1aea 100644 --- a/src/PrismServer.php +++ b/src/PrismServer.php @@ -17,7 +17,7 @@ public function __construct( protected Collection $prisms = new Collection, ) {} - /** @param \Closure():PendingRequest|callable():PendingRequest $prism */ + /** @param Closure():PendingRequest|callable():PendingRequest $prism */ public function register(string $name, Closure|callable $prism): self { $this->prisms->push(['name' => $name, 'prism' => $prism]); diff --git a/src/Providers/Anthropic/Anthropic.php b/src/Providers/Anthropic/Anthropic.php index 1deb45b3..c709757a 100644 --- a/src/Providers/Anthropic/Anthropic.php +++ b/src/Providers/Anthropic/Anthropic.php @@ -18,6 +18,7 @@ use Prism\Prism\Providers\Anthropic\Handlers\Structured; use Prism\Prism\Providers\Anthropic\Handlers\Text; use Prism\Prism\Providers\Provider; +use Prism\Prism\Streaming\Events\StreamEvent; use Prism\Prism\Structured\Request as StructuredRequest; use Prism\Prism\Structured\Response as StructuredResponse; use Prism\Prism\Text\Request as TextRequest; @@ -63,7 +64,7 @@ public function structured(StructuredRequest $request): StructuredResponse } /** - * @return Generator<\Prism\Prism\Streaming\Events\StreamEvent> + * @return Generator */ #[\Override] public function stream(TextRequest $request): Generator diff --git a/src/Providers/Anthropic/Handlers/Stream.php b/src/Providers/Anthropic/Handlers/Stream.php index 1af79143..54fb9457 100644 --- a/src/Providers/Anthropic/Handlers/Stream.php +++ b/src/Providers/Anthropic/Handlers/Stream.php @@ -255,7 +255,7 @@ protected function handleMessageDelta(array $event): null */ protected function handleMessageStop(array $event): ?StreamEndEvent { - if (! $this->state->finishReason() instanceof \Prism\Prism\Enums\FinishReason) { + if (! $this->state->finishReason() instanceof FinishReason) { $this->state->withFinishReason(FinishReason::Stop); } diff --git a/src/Providers/DeepSeek/Handlers/Stream.php b/src/Providers/DeepSeek/Handlers/Stream.php index d0370987..1ef4edb6 100644 --- a/src/Providers/DeepSeek/Handlers/Stream.php +++ b/src/Providers/DeepSeek/Handlers/Stream.php @@ -215,7 +215,7 @@ protected function processStream(Response $response, Request $request, int $dept $this->state->withFinishReason($finishReason); $usage = $this->extractUsage($data); - if ($usage instanceof \Prism\Prism\ValueObjects\Usage) { + if ($usage instanceof Usage) { $this->state->addUsage($usage); } } diff --git a/src/Providers/DeepSeek/Handlers/Structured.php b/src/Providers/DeepSeek/Handlers/Structured.php index 115b63eb..7443953b 100644 --- a/src/Providers/DeepSeek/Handlers/Structured.php +++ b/src/Providers/DeepSeek/Handlers/Structured.php @@ -3,6 +3,7 @@ namespace Prism\Prism\Providers\DeepSeek\Handlers; use Illuminate\Http\Client\PendingRequest; +use Illuminate\Http\Client\Response; use Illuminate\Support\Arr; use Prism\Prism\Exceptions\PrismException; use Prism\Prism\Providers\DeepSeek\Concerns\MapsFinishReason; @@ -46,7 +47,7 @@ public function handle(Request $request): StructuredResponse */ protected function sendRequest(Request $request): array { - /** @var \Illuminate\Http\Client\Response $response */ + /** @var Response $response */ $response = $this->client->post( 'chat/completions', array_merge([ diff --git a/src/Providers/DeepSeek/Handlers/Text.php b/src/Providers/DeepSeek/Handlers/Text.php index 49733e80..407b06c1 100644 --- a/src/Providers/DeepSeek/Handlers/Text.php +++ b/src/Providers/DeepSeek/Handlers/Text.php @@ -5,6 +5,7 @@ namespace Prism\Prism\Providers\DeepSeek\Handlers; use Illuminate\Http\Client\PendingRequest; +use Illuminate\Http\Client\Response; use Illuminate\Support\Arr; use Prism\Prism\Concerns\CallsTools; use Prism\Prism\Enums\FinishReason; @@ -101,7 +102,7 @@ protected function shouldContinue(Request $request): bool */ protected function sendRequest(Request $request): array { - /** @var \Illuminate\Http\Client\Response $response */ + /** @var Response $response */ $response = $this->client->post( 'chat/completions', array_merge([ diff --git a/src/Providers/ElevenLabs/Handlers/Audio.php b/src/Providers/ElevenLabs/Handlers/Audio.php index e8da2f20..b93829d0 100644 --- a/src/Providers/ElevenLabs/Handlers/Audio.php +++ b/src/Providers/ElevenLabs/Handlers/Audio.php @@ -6,6 +6,7 @@ use Exception; use Illuminate\Http\Client\PendingRequest; +use Illuminate\Http\Client\Response; use Prism\Prism\Audio\AudioResponse; use Prism\Prism\Audio\SpeechToTextRequest; use Prism\Prism\Audio\TextResponse; @@ -42,7 +43,7 @@ public function handleTextToSpeech(TextToSpeechRequest $request): AudioResponse public function handleSpeechToText(SpeechToTextRequest $request): TextResponse { - /** @var \Illuminate\Http\Client\Response $response */ + /** @var Response $response */ $response = $this ->client ->attach( diff --git a/src/Providers/Gemini/Handlers/Cache.php b/src/Providers/Gemini/Handlers/Cache.php index b2098833..b92b81de 100644 --- a/src/Providers/Gemini/Handlers/Cache.php +++ b/src/Providers/Gemini/Handlers/Cache.php @@ -5,6 +5,7 @@ namespace Prism\Prism\Providers\Gemini\Handlers; use Illuminate\Http\Client\PendingRequest; +use Illuminate\Http\Client\Response; use Illuminate\Support\Arr; use Prism\Prism\Contracts\Message; use Prism\Prism\Providers\Gemini\Maps\MessageMap; @@ -42,7 +43,7 @@ protected function sendRequest(): array 'ttl' => $this->ttl.'s', ]); - /** @var \Illuminate\Http\Client\Response $response */ + /** @var Response $response */ $response = $this->client->post('/cachedContents', $request); return $response->json(); diff --git a/src/Providers/Gemini/Handlers/Stream.php b/src/Providers/Gemini/Handlers/Stream.php index a97c2571..7b0f615a 100644 --- a/src/Providers/Gemini/Handlers/Stream.php +++ b/src/Providers/Gemini/Handlers/Stream.php @@ -356,7 +356,7 @@ protected function handleToolCalls( $nextResponse = $this->sendRequest($request); yield from $this->processStream($nextResponse, $request, $depth); - if ($previousUsage instanceof \Prism\Prism\ValueObjects\Usage && $this->state->usage() instanceof \Prism\Prism\ValueObjects\Usage) { + if ($previousUsage instanceof Usage && $this->state->usage() instanceof Usage) { $this->state->withUsage(new Usage( promptTokens: $previousUsage->promptTokens + $this->state->usage()->promptTokens, completionTokens: $previousUsage->completionTokens + $this->state->usage()->completionTokens, diff --git a/src/Providers/Gemini/Handlers/Structured.php b/src/Providers/Gemini/Handlers/Structured.php index 21567473..0596eb6b 100644 --- a/src/Providers/Gemini/Handlers/Structured.php +++ b/src/Providers/Gemini/Handlers/Structured.php @@ -5,6 +5,7 @@ namespace Prism\Prism\Providers\Gemini\Handlers; use Illuminate\Http\Client\PendingRequest; +use Illuminate\Http\Client\Response; use Illuminate\Support\Arr; use Prism\Prism\Concerns\CallsTools; use Prism\Prism\Concerns\HandlesStructuredJson; @@ -118,7 +119,7 @@ public function sendRequest(Request $request): array ]); } - /** @var \Illuminate\Http\Client\Response $response */ + /** @var Response $response */ $response = $this->client->post( "{$request->model()}:generateContent", Arr::whereNotNull([ diff --git a/src/Providers/Groq/Handlers/Audio.php b/src/Providers/Groq/Handlers/Audio.php index 0f19a52c..6e8278f4 100644 --- a/src/Providers/Groq/Handlers/Audio.php +++ b/src/Providers/Groq/Handlers/Audio.php @@ -6,6 +6,7 @@ use Exception; use Illuminate\Http\Client\PendingRequest; +use Illuminate\Http\Client\Response; use Illuminate\Support\Arr; use Prism\Prism\Audio\AudioResponse; use Prism\Prism\Audio\SpeechToTextRequest; @@ -28,7 +29,7 @@ public function handleTextToSpeech(TextToSpeechRequest $request): AudioResponse { $mapper = new TextToSpeechRequestMapper($request); - /** @var \Illuminate\Http\Client\Response $response */ + /** @var Response $response */ $response = $this->client->post('audio/speech', $mapper->toPayload()); if (! $response->successful()) { @@ -49,7 +50,7 @@ public function handleSpeechToText(SpeechToTextRequest $request): TextResponse { $filename = $this->generateFilename($request->input()->mimeType()); - /** @var \Illuminate\Http\Client\Response $response */ + /** @var Response $response */ $response = $this ->client ->attach( diff --git a/src/Providers/Groq/Handlers/Stream.php b/src/Providers/Groq/Handlers/Stream.php index 7b6d7f37..528c46e4 100644 --- a/src/Providers/Groq/Handlers/Stream.php +++ b/src/Providers/Groq/Handlers/Stream.php @@ -6,6 +6,7 @@ use Generator; use Illuminate\Http\Client\PendingRequest; +use Illuminate\Http\Client\RequestException; use Illuminate\Http\Client\Response; use Illuminate\Support\Arr; use Prism\Prism\Concerns\CallsTools; @@ -176,7 +177,7 @@ protected function processStream(Response $response, Request $request, int $dept $this->state->withFinishReason($finishReason); $usage = $this->extractUsage($data); - if ($usage instanceof \Prism\Prism\ValueObjects\Usage) { + if ($usage instanceof Usage) { $this->state->addUsage($usage); } } @@ -398,7 +399,7 @@ protected function sendRequest(Request $request): Response ); return $response; - } catch (\Illuminate\Http\Client\RequestException $e) { + } catch (RequestException $e) { if ($e->response->getStatusCode() === 429) { throw new PrismRateLimitedException( $this->processRateLimits($e->response), diff --git a/src/Providers/Mistral/Handlers/Audio.php b/src/Providers/Mistral/Handlers/Audio.php index 6fcb92d3..86828c5b 100644 --- a/src/Providers/Mistral/Handlers/Audio.php +++ b/src/Providers/Mistral/Handlers/Audio.php @@ -6,6 +6,7 @@ use Exception; use Illuminate\Http\Client\PendingRequest; +use Illuminate\Http\Client\Response; use Illuminate\Support\Arr; use Prism\Prism\Audio\SpeechToTextRequest; use Prism\Prism\Audio\TextResponse; @@ -22,7 +23,7 @@ public function __construct(protected PendingRequest $client) {} public function handleSpeechToText(SpeechToTextRequest $request): TextResponse { - /** @var \Illuminate\Http\Client\Response $response */ + /** @var Response $response */ $response = $this ->client ->attach( diff --git a/src/Providers/Mistral/Handlers/OCR.php b/src/Providers/Mistral/Handlers/OCR.php index dff31f25..c8e24b7a 100644 --- a/src/Providers/Mistral/Handlers/OCR.php +++ b/src/Providers/Mistral/Handlers/OCR.php @@ -5,6 +5,7 @@ namespace Prism\Prism\Providers\Mistral\Handlers; use Illuminate\Http\Client\PendingRequest; +use Illuminate\Http\Client\Response; use Prism\Prism\Concerns\CallsTools; use Prism\Prism\Exceptions\PrismException; use Prism\Prism\Exceptions\PrismRateLimitedException; @@ -51,7 +52,7 @@ public function handle(): OCRResponse */ protected function sendRequest(): array { - /** @var \Illuminate\Http\Client\Response $response */ + /** @var Response $response */ $response = $this->client->post('/ocr', [ 'model' => $this->model, 'document' => (new DocumentMapper($this->document))->toPayload(), diff --git a/src/Providers/Mistral/Handlers/Stream.php b/src/Providers/Mistral/Handlers/Stream.php index 13c5eb74..82a5bcbb 100644 --- a/src/Providers/Mistral/Handlers/Stream.php +++ b/src/Providers/Mistral/Handlers/Stream.php @@ -108,7 +108,7 @@ protected function processStream(Response $response, Request $request, int $dept } $usage = $this->extractUsage($data); - if ($usage instanceof \Prism\Prism\ValueObjects\Usage) { + if ($usage instanceof Usage) { $this->state->addUsage($usage); } diff --git a/src/Providers/OpenAI/Handlers/Audio.php b/src/Providers/OpenAI/Handlers/Audio.php index ae35a68d..c3edd75b 100644 --- a/src/Providers/OpenAI/Handlers/Audio.php +++ b/src/Providers/OpenAI/Handlers/Audio.php @@ -6,6 +6,7 @@ use Exception; use Illuminate\Http\Client\PendingRequest; +use Illuminate\Http\Client\Response; use Illuminate\Support\Arr; use Prism\Prism\Audio\AudioResponse; use Prism\Prism\Audio\SpeechToTextRequest; @@ -30,7 +31,7 @@ public function handleTextToSpeech(TextToSpeechRequest $request): AudioResponse { $mapper = new TextToSpeechRequestMapper($request); - /** @var \Illuminate\Http\Client\Response $response */ + /** @var Response $response */ $response = $this->client->post('audio/speech', $mapper->toPayload()); if (! $response->successful()) { @@ -49,7 +50,7 @@ public function handleTextToSpeech(TextToSpeechRequest $request): AudioResponse public function handleSpeechToText(SpeechToTextRequest $request): TextResponse { - /** @var \Illuminate\Http\Client\Response $response */ + /** @var Response $response */ $response = $this ->client ->attach( diff --git a/src/Providers/OpenRouter/Handlers/Structured.php b/src/Providers/OpenRouter/Handlers/Structured.php index 1f142d5d..d377df9c 100644 --- a/src/Providers/OpenRouter/Handlers/Structured.php +++ b/src/Providers/OpenRouter/Handlers/Structured.php @@ -5,6 +5,7 @@ namespace Prism\Prism\Providers\OpenRouter\Handlers; use Illuminate\Http\Client\PendingRequest; +use Illuminate\Http\Client\Response; use Prism\Prism\Exceptions\PrismException; use Prism\Prism\Exceptions\PrismStructuredDecodingException; use Prism\Prism\Providers\OpenRouter\Concerns\BuildsRequestOptions; @@ -49,7 +50,7 @@ public function handle(Request $request): StructuredResponse */ protected function sendRequest(Request $request): array { - /** @var \Illuminate\Http\Client\Response $response */ + /** @var Response $response */ $response = $this->client->post( 'chat/completions', array_merge([ diff --git a/src/Providers/OpenRouter/Handlers/Text.php b/src/Providers/OpenRouter/Handlers/Text.php index eac19787..9751d493 100644 --- a/src/Providers/OpenRouter/Handlers/Text.php +++ b/src/Providers/OpenRouter/Handlers/Text.php @@ -5,6 +5,7 @@ namespace Prism\Prism\Providers\OpenRouter\Handlers; use Illuminate\Http\Client\PendingRequest; +use Illuminate\Http\Client\Response; use Prism\Prism\Concerns\CallsTools; use Prism\Prism\Enums\FinishReason; use Prism\Prism\Exceptions\PrismException; @@ -100,7 +101,7 @@ protected function shouldContinue(Request $request): bool */ protected function sendRequest(Request $request): array { - /** @var \Illuminate\Http\Client\Response $response */ + /** @var Response $response */ $response = $this->client->post( 'chat/completions', array_merge([ diff --git a/src/Providers/XAI/Handlers/Stream.php b/src/Providers/XAI/Handlers/Stream.php index f836910c..bf0517ed 100644 --- a/src/Providers/XAI/Handlers/Stream.php +++ b/src/Providers/XAI/Handlers/Stream.php @@ -175,12 +175,12 @@ protected function processStream(Response $response, Request $request, int $dept $rawFinishReason = data_get($data, 'choices.0.finish_reason'); if ($rawFinishReason !== null) { $finishReason = $this->extractFinishReason($data); - if ($finishReason instanceof \Prism\Prism\Enums\FinishReason) { + if ($finishReason instanceof FinishReason) { $this->state->withFinishReason($finishReason); } $usage = $this->extractUsage($data); - if ($usage instanceof \Prism\Prism\ValueObjects\Usage) { + if ($usage instanceof Usage) { $this->state->addUsage($usage); } } diff --git a/src/Rectors/ReorderMethodsRector.php b/src/Rectors/ReorderMethodsRector.php index 3772e88e..71706002 100644 --- a/src/Rectors/ReorderMethodsRector.php +++ b/src/Rectors/ReorderMethodsRector.php @@ -5,6 +5,7 @@ namespace Prism\Prism\Rectors; use PhpParser\Node; +use PhpParser\Node\Stmt; use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\ClassMethod; use Rector\Rector\AbstractRector; @@ -36,7 +37,7 @@ public function refactor(Node $node): ?Node } $node->stmts = array_merge( - array_filter($node->stmts, fn (\PhpParser\Node\Stmt $stmt): bool => ! $stmt instanceof ClassMethod), + array_filter($node->stmts, fn (Stmt $stmt): bool => ! $stmt instanceof ClassMethod), $reorderedMethods ); diff --git a/src/Streaming/Adapters/BroadcastAdapter.php b/src/Streaming/Adapters/BroadcastAdapter.php index 6430c11f..73c87407 100644 --- a/src/Streaming/Adapters/BroadcastAdapter.php +++ b/src/Streaming/Adapters/BroadcastAdapter.php @@ -66,7 +66,7 @@ public function __invoke(Generator $events, ?PendingRequest $pendingRequest = nu event($this->broadcastEvent($event)); } - if ($callback !== null && $pendingRequest instanceof \Prism\Prism\Text\PendingRequest) { + if ($callback !== null && $pendingRequest instanceof PendingRequest) { $callback($pendingRequest, $collectedEvents); } } diff --git a/src/Streaming/Adapters/SSEAdapter.php b/src/Streaming/Adapters/SSEAdapter.php index 0727ac80..2fc5593a 100644 --- a/src/Streaming/Adapters/SSEAdapter.php +++ b/src/Streaming/Adapters/SSEAdapter.php @@ -39,7 +39,7 @@ public function __invoke(Generator $events, ?PendingRequest $pendingRequest = nu flush(); } - if ($callback !== null && $pendingRequest instanceof \Prism\Prism\Text\PendingRequest) { + if ($callback !== null && $pendingRequest instanceof PendingRequest) { $callback($pendingRequest, $collectedEvents); } }, 200, [ diff --git a/src/Streaming/StreamState.php b/src/Streaming/StreamState.php index b8f48834..5d365a8b 100644 --- a/src/Streaming/StreamState.php +++ b/src/Streaming/StreamState.php @@ -227,7 +227,7 @@ public function withUsage(Usage $usage): self public function addUsage(Usage $usage): self { - if (! $this->usage instanceof \Prism\Prism\ValueObjects\Usage) { + if (! $this->usage instanceof Usage) { $this->usage = $usage; return $this; diff --git a/src/Structured/ResponseBuilder.php b/src/Structured/ResponseBuilder.php index 0c293dbd..d3bcc3a7 100644 --- a/src/Structured/ResponseBuilder.php +++ b/src/Structured/ResponseBuilder.php @@ -7,6 +7,8 @@ use Illuminate\Support\Collection; use Prism\Prism\Enums\FinishReason; use Prism\Prism\Exceptions\PrismStructuredDecodingException; +use Prism\Prism\ValueObjects\ToolCall; +use Prism\Prism\ValueObjects\ToolResult; use Prism\Prism\ValueObjects\Usage; readonly class ResponseBuilder @@ -82,7 +84,7 @@ protected function decodeObject(string $responseText): array } /** - * @return array + * @return array */ protected function aggregateToolCalls(): array { @@ -93,7 +95,7 @@ protected function aggregateToolCalls(): array } /** - * @return array + * @return array */ protected function aggregateToolResults(): array { diff --git a/src/Testing/StructuredResponseFake.php b/src/Testing/StructuredResponseFake.php index 3fdb9b51..54d3d72a 100644 --- a/src/Testing/StructuredResponseFake.php +++ b/src/Testing/StructuredResponseFake.php @@ -5,6 +5,7 @@ use Illuminate\Support\Collection; use Prism\Prism\Concerns\HasFluentAttributes; use Prism\Prism\Enums\FinishReason; +use Prism\Prism\Structured\Response; use Prism\Prism\Structured\Step; use Prism\Prism\ValueObjects\Meta; use Prism\Prism\ValueObjects\Usage; @@ -18,7 +19,7 @@ * @method self withMeta(Meta $meta) * @method self withAdditionalContent(array $additionalContent) */ -readonly class StructuredResponseFake extends \Prism\Prism\Structured\Response +readonly class StructuredResponseFake extends Response { use HasFluentAttributes; diff --git a/tests/Concerns/HasFluentAttributesTest.php b/tests/Concerns/HasFluentAttributesTest.php index 1a304090..32229c7a 100644 --- a/tests/Concerns/HasFluentAttributesTest.php +++ b/tests/Concerns/HasFluentAttributesTest.php @@ -63,7 +63,7 @@ public function __construct(public readonly string $foo = 'bar') {} }; $instance->withBaz('baz'); -})->throws(\BadMethodCallException::class, 'Method withBaz does not exist.'); +})->throws(BadMethodCallException::class, 'Method withBaz does not exist.'); it('can still call other methods', function (): void { $instance = new class diff --git a/tests/Concerns/WhenProviderTest.php b/tests/Concerns/WhenProviderTest.php index 6c30689d..5cd79887 100644 --- a/tests/Concerns/WhenProviderTest.php +++ b/tests/Concerns/WhenProviderTest.php @@ -11,8 +11,8 @@ $this->manager = resolve(PrismManager::class); // Register test provider implementations - $this->manager->extend('openai', fn (): \Tests\TestDoubles\TestProvider => new TestProvider); - $this->manager->extend('anthropic', fn (): \Tests\TestDoubles\TestProvider => new TestProvider); + $this->manager->extend('openai', fn (): TestProvider => new TestProvider); + $this->manager->extend('anthropic', fn (): TestProvider => new TestProvider); }); test('it applies provider specific options when provider matches', function (): void { diff --git a/tests/Http/PrismModelControllerTest.php b/tests/Http/PrismModelControllerTest.php index 163dbd5a..a0608d2c 100644 --- a/tests/Http/PrismModelControllerTest.php +++ b/tests/Http/PrismModelControllerTest.php @@ -9,8 +9,8 @@ use Prism\Prism\Text\Generator; it('it returns prisms', function (): void { - PrismServer::register('nyx', fn (): \Prism\Prism\Text\Generator => new Generator); - PrismServer::register('omni', fn (): \Prism\Prism\Text\Generator => new Generator); + PrismServer::register('nyx', fn (): Generator => new Generator); + PrismServer::register('omni', fn (): Generator => new Generator); /** @var TestResponse */ $response = $this->getJson('/prism/openai/v1/models'); diff --git a/tests/Pest.php b/tests/Pest.php index a6a563f6..04a6511c 100644 --- a/tests/Pest.php +++ b/tests/Pest.php @@ -1,5 +1,7 @@ in(__DIR__); +uses(TestCase::class)->in(__DIR__); uses()->group('providers')->in('Providers'); uses()->group('anthropic')->in('Providers/Anthropic'); uses()->group('deepseek')->in('Providers/DeepSeek'); diff --git a/tests/Providers/Anthropic/CitationsMapperTest.php b/tests/Providers/Anthropic/CitationsMapperTest.php index 611d770a..e8667245 100644 --- a/tests/Providers/Anthropic/CitationsMapperTest.php +++ b/tests/Providers/Anthropic/CitationsMapperTest.php @@ -183,8 +183,8 @@ ], ]; - expect(fn (): \Prism\Prism\ValueObjects\MessagePartWithCitations => CitationsMapper::mapFromAnthropic($contentBlock)) - ->toThrow(\InvalidArgumentException::class, 'Unknown citation type: unknown_citation_type'); + expect(fn (): MessagePartWithCitations => CitationsMapper::mapFromAnthropic($contentBlock)) + ->toThrow(InvalidArgumentException::class, 'Unknown citation type: unknown_citation_type'); }); it('falls back to title when document_title is not present', function (): void { diff --git a/tests/Providers/Anthropic/StructuredTest.php b/tests/Providers/Anthropic/StructuredTest.php index db9c6126..c1fa29d1 100644 --- a/tests/Providers/Anthropic/StructuredTest.php +++ b/tests/Providers/Anthropic/StructuredTest.php @@ -212,7 +212,7 @@ new StringSchema('answer', 'The answer'), ], ['answer']); - expect(fn (): \Prism\Prism\Structured\Response => Prism::structured() + expect(fn (): Response => Prism::structured() ->withSchema($schema) ->using(Provider::Anthropic, 'claude-3-5-sonnet-latest') ->withPrompt('What is the answer?') diff --git a/tests/Providers/DeepSeek/StreamTest.php b/tests/Providers/DeepSeek/StreamTest.php index f48f3817..f1b451cb 100644 --- a/tests/Providers/DeepSeek/StreamTest.php +++ b/tests/Providers/DeepSeek/StreamTest.php @@ -120,8 +120,8 @@ expect($toolResultEvents)->not->toBeEmpty(); // Verify only one StreamStartEvent and one StreamEndEvent - $streamStartEvents = array_filter($events, fn (\Prism\Prism\Streaming\Events\StreamEvent $event): bool => $event instanceof StreamStartEvent); - $streamEndEvents = array_filter($events, fn (\Prism\Prism\Streaming\Events\StreamEvent $event): bool => $event instanceof StreamEndEvent); + $streamStartEvents = array_filter($events, fn (StreamEvent $event): bool => $event instanceof StreamStartEvent); + $streamEndEvents = array_filter($events, fn (StreamEvent $event): bool => $event instanceof StreamEndEvent); expect($streamStartEvents)->toHaveCount(1); expect($streamEndEvents)->toHaveCount(1); diff --git a/tests/Providers/Gemini/GeminiStreamTest.php b/tests/Providers/Gemini/GeminiStreamTest.php index efdf6f27..92e15dae 100644 --- a/tests/Providers/Gemini/GeminiStreamTest.php +++ b/tests/Providers/Gemini/GeminiStreamTest.php @@ -269,10 +269,10 @@ ->and($eventOrder[0])->toBe('ToolCall') ->and($eventOrder[1])->toBe('ToolResult'); - $toolCallEvents = array_filter($events, fn (\Prism\Prism\Streaming\Events\StreamEvent $event): bool => $event instanceof ToolCallEvent); - $toolResultEvents = array_filter($events, fn (\Prism\Prism\Streaming\Events\StreamEvent $event): bool => $event instanceof ToolResultEvent); - $streamStartEvents = array_filter($events, fn (\Prism\Prism\Streaming\Events\StreamEvent $event): bool => $event instanceof StreamStartEvent); - $streamEndEvents = array_filter($events, fn (\Prism\Prism\Streaming\Events\StreamEvent $event): bool => $event instanceof StreamEndEvent); + $toolCallEvents = array_filter($events, fn (StreamEvent $event): bool => $event instanceof ToolCallEvent); + $toolResultEvents = array_filter($events, fn (StreamEvent $event): bool => $event instanceof ToolResultEvent); + $streamStartEvents = array_filter($events, fn (StreamEvent $event): bool => $event instanceof StreamStartEvent); + $streamEndEvents = array_filter($events, fn (StreamEvent $event): bool => $event instanceof StreamEndEvent); expect($toolCallEvents)->not->toBeEmpty(); expect($toolResultEvents)->not->toBeEmpty(); diff --git a/tests/Providers/Groq/StreamTest.php b/tests/Providers/Groq/StreamTest.php index e6731ca3..86f7783d 100644 --- a/tests/Providers/Groq/StreamTest.php +++ b/tests/Providers/Groq/StreamTest.php @@ -8,6 +8,7 @@ use Prism\Prism\Enums\FinishReason; use Prism\Prism\Enums\Provider; use Prism\Prism\Exceptions\PrismException; +use Prism\Prism\Exceptions\PrismRateLimitedException; use Prism\Prism\Exceptions\PrismStreamDecodeException; use Prism\Prism\Facades\Prism; use Prism\Prism\Facades\Tool; @@ -117,8 +118,8 @@ expect($toolResultEvents)->not->toBeEmpty(); // Verify only one StreamStartEvent and one StreamEndEvent - $streamStartEvents = array_filter($events, fn (\Prism\Prism\Streaming\Events\StreamEvent $event): bool => $event instanceof StreamStartEvent); - $streamEndEvents = array_filter($events, fn (\Prism\Prism\Streaming\Events\StreamEvent $event): bool => $event instanceof StreamEndEvent); + $streamStartEvents = array_filter($events, fn (StreamEvent $event): bool => $event instanceof StreamStartEvent); + $streamEndEvents = array_filter($events, fn (StreamEvent $event): bool => $event instanceof StreamEndEvent); expect($streamStartEvents)->toHaveCount(1); expect($streamEndEvents)->toHaveCount(1); }); @@ -318,11 +319,11 @@ foreach ($response as $chunk) { // The test should throw before completing } - } catch (\Prism\Prism\Exceptions\PrismRateLimitedException $e) { + } catch (PrismRateLimitedException $e) { $exception = $e; } - expect($exception)->toBeInstanceOf(\Prism\Prism\Exceptions\PrismRateLimitedException::class); + expect($exception)->toBeInstanceOf(PrismRateLimitedException::class); }); it('handles empty stream response correctly', function (): void { diff --git a/tests/Providers/Mistral/EmbeddingsTest.php b/tests/Providers/Mistral/EmbeddingsTest.php index a06dfb03..3bc168a9 100644 --- a/tests/Providers/Mistral/EmbeddingsTest.php +++ b/tests/Providers/Mistral/EmbeddingsTest.php @@ -41,7 +41,7 @@ ->asEmbeddings(); $embeddings = json_decode(file_get_contents('tests/Fixtures/mistral/embeddings-file-1.json'), true); - $embeddings = array_map(fn (array $item): \Prism\Prism\ValueObjects\Embedding => Embedding::fromArray($item['embedding']), data_get($embeddings, 'data')); + $embeddings = array_map(fn (array $item): Embedding => Embedding::fromArray($item['embedding']), data_get($embeddings, 'data')); expect($response->embeddings)->toBeArray(); expect($response->embeddings[0]->embedding)->toBe($embeddings[0]->embedding); @@ -60,7 +60,7 @@ ->asEmbeddings(); $embeddings = json_decode(file_get_contents('tests/Fixtures/mistral/embeddings-multiple-inputs-1.json'), true); - $embeddings = array_map(fn (array $item): \Prism\Prism\ValueObjects\Embedding => Embedding::fromArray($item['embedding']), data_get($embeddings, 'data')); + $embeddings = array_map(fn (array $item): Embedding => Embedding::fromArray($item['embedding']), data_get($embeddings, 'data')); expect($response->embeddings)->toBeArray(); expect($response->embeddings[0]->embedding)->toBe($embeddings[0]->embedding); diff --git a/tests/Providers/Mistral/StreamTest.php b/tests/Providers/Mistral/StreamTest.php index 6563350c..55673c68 100644 --- a/tests/Providers/Mistral/StreamTest.php +++ b/tests/Providers/Mistral/StreamTest.php @@ -8,6 +8,7 @@ use Prism\Prism\Enums\FinishReason; use Prism\Prism\Enums\Provider; use Prism\Prism\Exceptions\PrismException; +use Prism\Prism\Exceptions\PrismRateLimitedException; use Prism\Prism\Exceptions\PrismStreamDecodeException; use Prism\Prism\Facades\Prism; use Prism\Prism\Facades\Tool; @@ -120,8 +121,8 @@ expect($toolResultEvents)->not->toBeEmpty(); // Verify only one StreamStartEvent and one StreamEndEvent - $streamStartEvents = array_filter($events, fn (\Prism\Prism\Streaming\Events\StreamEvent $event): bool => $event instanceof StreamStartEvent); - $streamEndEvents = array_filter($events, fn (\Prism\Prism\Streaming\Events\StreamEvent $event): bool => $event instanceof StreamEndEvent); + $streamStartEvents = array_filter($events, fn (StreamEvent $event): bool => $event instanceof StreamStartEvent); + $streamEndEvents = array_filter($events, fn (StreamEvent $event): bool => $event instanceof StreamEndEvent); expect($streamStartEvents)->toHaveCount(1); expect($streamEndEvents)->toHaveCount(1); }); @@ -310,11 +311,11 @@ foreach ($response as $chunk) { // The test should throw before completing } - } catch (\Prism\Prism\Exceptions\PrismRateLimitedException $e) { + } catch (PrismRateLimitedException $e) { $exception = $e; } - expect($exception)->toBeInstanceOf(\Prism\Prism\Exceptions\PrismRateLimitedException::class); + expect($exception)->toBeInstanceOf(PrismRateLimitedException::class); }); it('handles empty stream response correctly', function (): void { diff --git a/tests/Providers/Ollama/MessageMapTest.php b/tests/Providers/Ollama/MessageMapTest.php index 8a7f422c..8ac347e2 100644 --- a/tests/Providers/Ollama/MessageMapTest.php +++ b/tests/Providers/Ollama/MessageMapTest.php @@ -2,6 +2,7 @@ declare(strict_types=1); +use Prism\Prism\Contracts\Message; use Prism\Prism\Providers\Ollama\Maps\MessageMap; use Prism\Prism\ValueObjects\Media\Image; use Prism\Prism\ValueObjects\Messages\AssistantMessage; @@ -168,7 +169,7 @@ }); it('throws exception for unknown message type', function (): void { - $invalidMessage = new class implements \Prism\Prism\Contracts\Message {}; + $invalidMessage = new class implements Message {}; $messageMap = new MessageMap([$invalidMessage]); expect($messageMap->map(...)) diff --git a/tests/Providers/Ollama/StreamTest.php b/tests/Providers/Ollama/StreamTest.php index 1e18c337..cfd2721a 100644 --- a/tests/Providers/Ollama/StreamTest.php +++ b/tests/Providers/Ollama/StreamTest.php @@ -120,8 +120,8 @@ expect($finishReasonFound)->toBeTrue(); // Verify only one StreamStartEvent and one StreamEndEvent - $streamStartEvents = array_filter($events, fn (\Prism\Prism\Streaming\Events\StreamEvent $event): bool => $event instanceof StreamStartEvent); - $streamEndEvents = array_filter($events, fn (\Prism\Prism\Streaming\Events\StreamEvent $event): bool => $event instanceof StreamEndEvent); + $streamStartEvents = array_filter($events, fn (StreamEvent $event): bool => $event instanceof StreamStartEvent); + $streamEndEvents = array_filter($events, fn (StreamEvent $event): bool => $event instanceof StreamEndEvent); expect($streamStartEvents)->toHaveCount(1); expect($streamEndEvents)->toHaveCount(1); }); @@ -255,7 +255,7 @@ }); it('emits thinking chunks when provider sends thinking field', function (): void { - \Tests\Fixtures\FixtureResponse::fakeStreamResponses('api/chat', 'ollama/stream-with-thinking'); + FixtureResponse::fakeStreamResponses('api/chat', 'ollama/stream-with-thinking'); $response = Prism::text() ->using('ollama', 'gpt-oss:20b') diff --git a/tests/Providers/OpenAI/ModerationTest.php b/tests/Providers/OpenAI/ModerationTest.php index a14976ee..788f4ebe 100644 --- a/tests/Providers/OpenAI/ModerationTest.php +++ b/tests/Providers/OpenAI/ModerationTest.php @@ -7,6 +7,7 @@ use Illuminate\Http\Client\Request; use Illuminate\Support\Facades\Http; use Prism\Prism\Enums\Provider; +use Prism\Prism\Exceptions\PrismException; use Prism\Prism\Facades\Prism; use Prism\Prism\ValueObjects\Media\Image; use Tests\Fixtures\FixtureResponse; @@ -222,14 +223,14 @@ Image::fromUrl('https://prismphp.com/storage/diamond.png'), 'valid-string-input', ]); - })->not->toThrow(\Prism\Prism\Exceptions\PrismException::class, 'Array items must be strings or Image instances'); + })->not->toThrow(PrismException::class, 'Array items must be strings or Image instances'); expect(function (): void { $invalidInput = [new \stdClass]; Prism::moderation() ->using(Provider::OpenAI, 'omni-moderation-latest') ->withInput($invalidInput); - })->toThrow(\Prism\Prism\Exceptions\PrismException::class, 'Array items must be strings or Image instances'); + })->toThrow(PrismException::class, 'Array items must be strings or Image instances'); }); it('can use withInput with mixed types in variadic arguments', function (): void { diff --git a/tests/Providers/OpenAI/TextTest.php b/tests/Providers/OpenAI/TextTest.php index 8092fce9..81ebec89 100644 --- a/tests/Providers/OpenAI/TextTest.php +++ b/tests/Providers/OpenAI/TextTest.php @@ -13,6 +13,7 @@ use Prism\Prism\Facades\Prism; use Prism\Prism\Facades\Tool; use Prism\Prism\ValueObjects\Media\Document; +use Prism\Prism\ValueObjects\Media\Image; use Prism\Prism\ValueObjects\MessagePartWithCitations; use Prism\Prism\ValueObjects\Messages\UserMessage; use Prism\Prism\ValueObjects\ProviderTool; @@ -490,7 +491,7 @@ 'openai/generate-text-with-a-prompt' ); - $image = \Prism\Prism\ValueObjects\Media\Image::fromLocalPath('tests/Fixtures/diamond.png') + $image = Image::fromLocalPath('tests/Fixtures/diamond.png') ->withProviderOptions(['detail' => 'high']); Prism::text() @@ -517,7 +518,7 @@ 'openai/generate-text-with-a-prompt' ); - $image = \Prism\Prism\ValueObjects\Media\Image::fromLocalPath('tests/Fixtures/diamond.png'); + $image = Image::fromLocalPath('tests/Fixtures/diamond.png'); Prism::text() ->using(Provider::OpenAI, 'gpt-4o') diff --git a/tests/Providers/OpenRouter/StreamTest.php b/tests/Providers/OpenRouter/StreamTest.php index a2c2a9e8..af61bc27 100644 --- a/tests/Providers/OpenRouter/StreamTest.php +++ b/tests/Providers/OpenRouter/StreamTest.php @@ -191,8 +191,8 @@ expect($text)->toContain("I'll help you get the weather for you."); // Verify only one StreamStartEvent and one StreamEndEvent - $streamStartEvents = array_filter($events, fn (\Prism\Prism\Streaming\Events\StreamEvent $e): bool => $e instanceof StreamStartEvent); - $streamEndEvents = array_filter($events, fn (\Prism\Prism\Streaming\Events\StreamEvent $e): bool => $e instanceof StreamEndEvent); + $streamStartEvents = array_filter($events, fn (StreamEvent $e): bool => $e instanceof StreamStartEvent); + $streamEndEvents = array_filter($events, fn (StreamEvent $e): bool => $e instanceof StreamEndEvent); expect($streamStartEvents)->toHaveCount(1); expect($streamEndEvents)->toHaveCount(1); diff --git a/tests/Providers/XAI/StreamTest.php b/tests/Providers/XAI/StreamTest.php index 030f031f..4e3ffcd1 100644 --- a/tests/Providers/XAI/StreamTest.php +++ b/tests/Providers/XAI/StreamTest.php @@ -117,8 +117,8 @@ ->and($toolResultEvents)->toHaveCount(2); // Verify only one StreamStartEvent and one StreamEndEvent - $streamStartEvents = array_filter($events, fn (\Prism\Prism\Streaming\Events\StreamEvent $event): bool => $event instanceof StreamStartEvent); - $streamEndEvents = array_filter($events, fn (\Prism\Prism\Streaming\Events\StreamEvent $event): bool => $event instanceof StreamEndEvent); + $streamStartEvents = array_filter($events, fn (StreamEvent $event): bool => $event instanceof StreamStartEvent); + $streamEndEvents = array_filter($events, fn (StreamEvent $event): bool => $event instanceof StreamEndEvent); expect($streamStartEvents)->toHaveCount(1); expect($streamEndEvents)->toHaveCount(1); diff --git a/tests/SchemaTest.php b/tests/SchemaTest.php index 2251dc88..fe79774a 100644 --- a/tests/SchemaTest.php +++ b/tests/SchemaTest.php @@ -4,6 +4,7 @@ namespace Tests; +use Prism\Prism\Schema\AnyOfSchema; use Prism\Prism\Schema\ArraySchema; use Prism\Prism\Schema\BooleanSchema; use Prism\Prism\Schema\EnumSchema; @@ -264,7 +265,7 @@ allowAdditionalProperties: false ); - $itemSchema = new \Prism\Prism\Schema\AnyOfSchema([ + $itemSchema = new AnyOfSchema([ $userSchema, $addressSchema, ]); diff --git a/tests/Streaming/Adapters/BroadcastAdapterTest.php b/tests/Streaming/Adapters/BroadcastAdapterTest.php index bdc4d1cc..e27449c2 100644 --- a/tests/Streaming/Adapters/BroadcastAdapterTest.php +++ b/tests/Streaming/Adapters/BroadcastAdapterTest.php @@ -23,6 +23,7 @@ use Prism\Prism\Streaming\Events\ErrorEvent; use Prism\Prism\Streaming\Events\ProviderToolEvent; use Prism\Prism\Streaming\Events\StreamEndEvent; +use Prism\Prism\Streaming\Events\StreamEvent; use Prism\Prism\Streaming\Events\StreamStartEvent; use Prism\Prism\Streaming\Events\TextCompleteEvent; use Prism\Prism\Streaming\Events\TextDeltaEvent; @@ -38,7 +39,7 @@ use Prism\Prism\ValueObjects\Usage; /** - * @param array<\Prism\Prism\Streaming\Events\StreamEvent> $events + * @param array $events */ function createBroadcastEventGenerator(array $events): Generator { diff --git a/tests/Streaming/Adapters/DataProtocolAdapterTest.php b/tests/Streaming/Adapters/DataProtocolAdapterTest.php index 2b00100b..595e36c2 100644 --- a/tests/Streaming/Adapters/DataProtocolAdapterTest.php +++ b/tests/Streaming/Adapters/DataProtocolAdapterTest.php @@ -2,10 +2,13 @@ declare(strict_types=1); +use Illuminate\Support\Collection; use Prism\Prism\Enums\FinishReason; +use Prism\Prism\Exceptions\PrismException; use Prism\Prism\Streaming\Adapters\DataProtocolAdapter; use Prism\Prism\Streaming\Events\ErrorEvent; use Prism\Prism\Streaming\Events\StreamEndEvent; +use Prism\Prism\Streaming\Events\StreamEvent; use Prism\Prism\Streaming\Events\StreamStartEvent; use Prism\Prism\Streaming\Events\TextCompleteEvent; use Prism\Prism\Streaming\Events\TextDeltaEvent; @@ -15,13 +18,15 @@ use Prism\Prism\Streaming\Events\ThinkingStartEvent; use Prism\Prism\Streaming\Events\ToolCallEvent; use Prism\Prism\Streaming\Events\ToolResultEvent; +use Prism\Prism\Text\PendingRequest; use Prism\Prism\ValueObjects\ToolCall; use Prism\Prism\ValueObjects\ToolResult; use Prism\Prism\ValueObjects\Usage; +use Symfony\Component\HttpFoundation\ResponseHeaderBag; use Symfony\Component\HttpFoundation\StreamedResponse; /** - * @param array<\Prism\Prism\Streaming\Events\StreamEvent> $events + * @param array $events */ function createDataEventGenerator(array $events): Generator { @@ -33,7 +38,7 @@ function createDataEventGenerator(array $events): Generator /** * Creates a generator that throws an exception after yielding some events. * - * @param array<\Prism\Prism\Streaming\Events\StreamEvent> $eventsBeforeError + * @param array $eventsBeforeError */ function createThrowingGenerator(array $eventsBeforeError, Throwable $exception): Generator { @@ -196,7 +201,7 @@ function createThrowingGenerator(array $eventsBeforeError, Throwable $exception) // Test integration with Laravel's response system expect($response)->toBeInstanceOf(StreamedResponse::class); - expect($response->headers)->toBeInstanceOf(\Symfony\Component\HttpFoundation\ResponseHeaderBag::class); + expect($response->headers)->toBeInstanceOf(ResponseHeaderBag::class); expect($response->getStatusCode())->toBe(200); // Verify critical data protocol headers are set @@ -435,7 +440,7 @@ function createThrowingGenerator(array $eventsBeforeError, Throwable $exception) new TextDeltaEvent('evt-1', 1640995200, 'Partial response', 'msg-456'), ]; - $exception = new \Prism\Prism\Exceptions\PrismException('Rate limit exceeded'); + $exception = new PrismException('Rate limit exceeded'); $adapter = new DataProtocolAdapter; $response = ($adapter)(createThrowingGenerator($eventsBeforeError, $exception)); @@ -477,7 +482,7 @@ function createThrowingGenerator(array $eventsBeforeError, Throwable $exception) $exception = new RuntimeException('API connection failed', 500); - $pendingRequest = Mockery::mock(\Prism\Prism\Text\PendingRequest::class); + $pendingRequest = Mockery::mock(PendingRequest::class); $collectedEventsFromCallback = null; $userCallback = function ($request, $events) use (&$collectedEventsFromCallback): void { @@ -506,14 +511,14 @@ function createThrowingGenerator(array $eventsBeforeError, Throwable $exception) // Verify callback was called with collected events expect($collectedEventsFromCallback)->not->toBeNull(); - expect($collectedEventsFromCallback)->toBeInstanceOf(\Illuminate\Support\Collection::class); + expect($collectedEventsFromCallback)->toBeInstanceOf(Collection::class); // Should have 3 events: StreamStart, TextDelta, and ErrorEvent expect($collectedEventsFromCallback)->toHaveCount(3); // Get the last event which should be the ErrorEvent $errorEvent = $collectedEventsFromCallback->last(); - expect($errorEvent)->toBeInstanceOf(\Prism\Prism\Streaming\Events\ErrorEvent::class); + expect($errorEvent)->toBeInstanceOf(ErrorEvent::class); expect($errorEvent->errorType)->toBe(RuntimeException::class); expect($errorEvent->message)->toBe('API connection failed'); expect($errorEvent->recoverable)->toBeFalse(); diff --git a/tests/Streaming/Adapters/SSEAdapterTest.php b/tests/Streaming/Adapters/SSEAdapterTest.php index 31ef4ffa..5b246416 100644 --- a/tests/Streaming/Adapters/SSEAdapterTest.php +++ b/tests/Streaming/Adapters/SSEAdapterTest.php @@ -6,6 +6,7 @@ use Prism\Prism\Streaming\Adapters\SSEAdapter; use Prism\Prism\Streaming\Events\ErrorEvent; use Prism\Prism\Streaming\Events\StreamEndEvent; +use Prism\Prism\Streaming\Events\StreamEvent; use Prism\Prism\Streaming\Events\StreamStartEvent; use Prism\Prism\Streaming\Events\TextDeltaEvent; use Prism\Prism\Streaming\Events\TextStartEvent; @@ -18,7 +19,7 @@ use Symfony\Component\HttpFoundation\StreamedResponse; /** - * @param array<\Prism\Prism\Streaming\Events\StreamEvent> $events + * @param array $events */ function createEventGenerator(array $events): Generator { diff --git a/tests/Streaming/OnStreamEndIntegrationTest.php b/tests/Streaming/OnStreamEndIntegrationTest.php index e589b75a..1b95bcf7 100644 --- a/tests/Streaming/OnStreamEndIntegrationTest.php +++ b/tests/Streaming/OnStreamEndIntegrationTest.php @@ -7,6 +7,7 @@ use Prism\Prism\Streaming\Events\StreamEvent; use Prism\Prism\Streaming\Events\TextDeltaEvent; use Prism\Prism\Streaming\Events\ToolCallEvent; +use Prism\Prism\Streaming\Events\ToolResultEvent; use Prism\Prism\Testing\TextResponseFake; use Prism\Prism\Testing\TextStepFake; use Prism\Prism\Text\PendingRequest; @@ -202,7 +203,7 @@ public function __invoke(PendingRequest $request, Response $response): void ->withPrompt('Test') ->asEventStreamResponse(); - expect($response)->toBeInstanceOf(\Symfony\Component\HttpFoundation\StreamedResponse::class); + expect($response)->toBeInstanceOf(StreamedResponse::class); }); it('asEventStreamResponse callback receives all text delta events', function (): void { @@ -322,7 +323,7 @@ public function __invoke(PendingRequest $request, Response $response): void ->withPrompt('Calculate') ->asEventStreamResponse(function (PendingRequest $request, Collection $events) use (&$hasToolResultEvent): void { $hasToolResultEvent = $events->contains( - fn (StreamEvent $event): bool => $event instanceof \Prism\Prism\Streaming\Events\ToolResultEvent + fn (StreamEvent $event): bool => $event instanceof ToolResultEvent ); }); diff --git a/tests/Streaming/StreamCollectorTest.php b/tests/Streaming/StreamCollectorTest.php index 2e69612a..9bbb08f1 100644 --- a/tests/Streaming/StreamCollectorTest.php +++ b/tests/Streaming/StreamCollectorTest.php @@ -5,6 +5,7 @@ use Illuminate\Support\Collection; use Prism\Prism\Enums\FinishReason; use Prism\Prism\Streaming\Events\StreamEndEvent; +use Prism\Prism\Streaming\Events\StreamEvent; use Prism\Prism\Streaming\Events\StreamStartEvent; use Prism\Prism\Streaming\Events\TextDeltaEvent; use Prism\Prism\Streaming\Events\TextStartEvent; @@ -17,10 +18,10 @@ use Prism\Prism\ValueObjects\ToolResult; /** - * @param array<\Prism\Prism\Streaming\Events\StreamEvent> $events - * @return \Generator<\Prism\Prism\Streaming\Events\StreamEvent> + * @param array $events + * @return Generator */ -function createCollectorEventGenerator(array $events): \Generator +function createCollectorEventGenerator(array $events): Generator { foreach ($events as $event) { yield $event; diff --git a/tests/TestCase.php b/tests/TestCase.php index 8188e106..7df389b6 100644 --- a/tests/TestCase.php +++ b/tests/TestCase.php @@ -7,7 +7,7 @@ use Orchestra\Testbench\Concerns\WithWorkbench; use Orchestra\Testbench\TestCase as BaseTestcase; -abstract class TestCase extends BaseTestCase +abstract class TestCase extends BaseTestcase { use WithWorkbench;