Skip to content

Commit 24c4faf

Browse files
committed
fix: handle unknown finish reasons gracefully across all providers
1 parent 5d6cc65 commit 24c4faf

16 files changed

Lines changed: 26 additions & 63 deletions

File tree

src/Providers/Anthropic/Handlers/Structured.php

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
use Prism\Prism\Concerns\CallsTools;
1212
use Prism\Prism\Contracts\PrismRequest;
1313
use Prism\Prism\Enums\FinishReason;
14-
use Prism\Prism\Exceptions\PrismException;
1514
use Prism\Prism\Providers\Anthropic\Concerns\ExtractsCitations;
1615
use Prism\Prism\Providers\Anthropic\Concerns\ExtractsProviderToolCalls;
1716
use Prism\Prism\Providers\Anthropic\Concerns\ExtractsText;
@@ -71,8 +70,7 @@ public function handle(): Response
7170

7271
return match ($tempResponse->finishReason) {
7372
FinishReason::ToolCalls => $this->handleToolCalls($toolCalls, $tempResponse),
74-
FinishReason::Stop, FinishReason::Length => $this->handleStop($tempResponse),
75-
default => throw new PrismException('Anthropic: unknown finish reason'),
73+
default => $this->handleStop($tempResponse),
7674
};
7775
}
7876

src/Providers/Anthropic/Handlers/Text.php

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
use Prism\Prism\Concerns\CallsTools;
1212
use Prism\Prism\Contracts\PrismRequest;
1313
use Prism\Prism\Enums\FinishReason;
14-
use Prism\Prism\Exceptions\PrismException;
1514
use Prism\Prism\Providers\Anthropic\Concerns\ExtractsCitations;
1615
use Prism\Prism\Providers\Anthropic\Concerns\ExtractsProviderToolCalls;
1716
use Prism\Prism\Providers\Anthropic\Concerns\ExtractsText;
@@ -55,8 +54,7 @@ public function handle(): Response
5554

5655
return match ($this->tempResponse->finishReason) {
5756
FinishReason::ToolCalls => $this->handleToolCalls(),
58-
FinishReason::Stop, FinishReason::Length => $this->handleStop(),
59-
default => throw new PrismException('Anthropic: unknown finish reason'),
57+
default => $this->handleStop(),
6058
};
6159
}
6260

src/Providers/DeepSeek/Handlers/Text.php

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
use Illuminate\Support\Arr;
1010
use Prism\Prism\Concerns\CallsTools;
1111
use Prism\Prism\Enums\FinishReason;
12-
use Prism\Prism\Exceptions\PrismException;
1312
use Prism\Prism\Providers\DeepSeek\Concerns\MapsFinishReason;
1413
use Prism\Prism\Providers\DeepSeek\Concerns\ValidatesResponses;
1514
use Prism\Prism\Providers\DeepSeek\Maps\MessageMap;
@@ -47,8 +46,7 @@ public function handle(Request $request): TextResponse
4746

4847
return match ($this->mapFinishReason($data)) {
4948
FinishReason::ToolCalls => $this->handleToolCalls($data, $request),
50-
FinishReason::Stop => $this->handleStop($data, $request),
51-
default => throw new PrismException('DeepSeek: unknown finish reason'),
49+
default => $this->handleStop($data, $request),
5250
};
5351
}
5452

src/Providers/Gemini/Handlers/Structured.php

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,7 @@ public function handle(Request $request): StructuredResponse
6767

6868
return match ($finishReason) {
6969
FinishReason::ToolCalls => $this->handleToolCalls($data, $request),
70-
FinishReason::Stop, FinishReason::Length => $this->handleStop($data, $request, $finishReason),
71-
default => throw new PrismException('Gemini: unhandled finish reason'),
70+
default => $this->handleStop($data, $request, $finishReason),
7271
};
7372
}
7473

src/Providers/Gemini/Handlers/Text.php

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
use Illuminate\Support\Arr;
1010
use Prism\Prism\Concerns\CallsTools;
1111
use Prism\Prism\Enums\FinishReason;
12-
use Prism\Prism\Exceptions\PrismException;
1312
use Prism\Prism\Providers\Gemini\Concerns\ValidatesResponse;
1413
use Prism\Prism\Providers\Gemini\Maps\CitationMapper;
1514
use Prism\Prism\Providers\Gemini\Maps\FinishReasonMap;
@@ -58,8 +57,7 @@ public function handle(Request $request): TextResponse
5857

5958
return match ($finishReason) {
6059
FinishReason::ToolCalls => $this->handleToolCalls($data, $request),
61-
FinishReason::Stop, FinishReason::Length => $this->handleStop($data, $request, $finishReason),
62-
default => throw new PrismException('Gemini: unhandled finish reason'),
60+
default => $this->handleStop($data, $request, $finishReason),
6361
};
6462
}
6563

src/Providers/Groq/Handlers/Text.php

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
use Illuminate\Support\Arr;
1010
use Prism\Prism\Concerns\CallsTools;
1111
use Prism\Prism\Enums\FinishReason;
12-
use Prism\Prism\Exceptions\PrismException;
1312
use Prism\Prism\Providers\Groq\Concerns\ProcessRateLimits;
1413
use Prism\Prism\Providers\Groq\Concerns\ValidateResponse;
1514
use Prism\Prism\Providers\Groq\Maps\FinishReasonMap;
@@ -50,8 +49,7 @@ public function handle(Request $request): TextResponse
5049

5150
return match ($finishReason) {
5251
FinishReason::ToolCalls => $this->handleToolCalls($data, $request, $response),
53-
FinishReason::Stop, FinishReason::Length => $this->handleStop($data, $request, $response, $finishReason),
54-
default => throw new PrismException('Groq: unhandled finish reason'),
52+
default => $this->handleStop($data, $request, $response, $finishReason),
5553
};
5654
}
5755

src/Providers/Mistral/Handlers/Text.php

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99
use Illuminate\Support\Arr;
1010
use Prism\Prism\Concerns\CallsTools;
1111
use Prism\Prism\Enums\FinishReason;
12-
use Prism\Prism\Exceptions\PrismException;
1312
use Prism\Prism\Providers\Mistral\Concerns\ExtractsText;
1413
use Prism\Prism\Providers\Mistral\Concerns\ExtractsThinking;
1514
use Prism\Prism\Providers\Mistral\Concerns\MapsFinishReason;
@@ -55,8 +54,7 @@ public function handle(Request $request): Response
5554

5655
return match ($this->mapFinishReason($data)) {
5756
FinishReason::ToolCalls => $this->handleToolCalls($data, $request, $response),
58-
FinishReason::Stop => $this->handleStop($data, $request, $response),
59-
default => throw PrismException::providerResponseError('Invalid tool choice'),
57+
default => $this->handleStop($data, $request, $response),
6058
};
6159
}
6260

src/Providers/Ollama/Handlers/Text.php

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@
77
use Illuminate\Http\Client\PendingRequest;
88
use Illuminate\Support\Arr;
99
use Prism\Prism\Concerns\CallsTools;
10-
use Prism\Prism\Enums\FinishReason;
11-
use Prism\Prism\Exceptions\PrismException;
1210
use Prism\Prism\Providers\Ollama\Concerns\MapsFinishReason;
1311
use Prism\Prism\Providers\Ollama\Concerns\ValidatesResponse;
1412
use Prism\Prism\Providers\Ollama\Maps\MessageMap;
@@ -48,16 +46,7 @@ public function handle(Request $request): Response
4846
return $this->handleToolCalls($data, $request);
4947
}
5048

51-
$finishReason = $this->mapFinishReason($data);
52-
53-
return match ($finishReason) {
54-
FinishReason::Stop,
55-
FinishReason::Length,
56-
FinishReason::Unknown,
57-
FinishReason::ContentFilter,
58-
FinishReason::Other => $this->handleStop($data, $request),
59-
default => throw new PrismException('Ollama: unknown finish reason'),
60-
};
49+
return $this->handleStop($data, $request);
6150
}
6251

6352
/**

src/Providers/OpenAI/Handlers/Structured.php

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -80,18 +80,12 @@ public function handle(Request $request): StructuredResponse
8080

8181
return match ($finishReason = $this->mapFinishReason($data)) {
8282
FinishReason::ToolCalls => $this->handleToolCalls($data, $request, $response),
83-
FinishReason::Stop => $this->handleFinalStop($data, $request, $response),
8483
FinishReason::Length => throw new PrismException(sprintf(
8584
'OpenAI: max tokens exceeded (status: %s, type: %s). If using a reasoning model, increase max_tokens to account for internal reasoning token usage.',
8685
data_get($data, 'output.{last}.status', 'n/a'),
8786
data_get($data, 'output.{last}.type', 'n/a'),
8887
)),
89-
default => throw new PrismException(sprintf(
90-
'OpenAI: unhandled finish reason "%s" (status: %s, type: %s)',
91-
$finishReason->value,
92-
data_get($data, 'output.{last}.status', 'n/a'),
93-
data_get($data, 'output.{last}.type', 'n/a'),
94-
)),
88+
default => $this->handleFinalStop($data, $request, $response),
9589
};
9690
}
9791

src/Providers/OpenAI/Handlers/Text.php

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -61,18 +61,12 @@ public function handle(Request $request): Response
6161

6262
return match ($finishReason = $this->mapFinishReason($data)) {
6363
FinishReason::ToolCalls => $this->handleToolCalls($data, $request, $response),
64-
FinishReason::Stop => $this->handleStop($data, $request, $response),
6564
FinishReason::Length => throw new PrismException(sprintf(
6665
'OpenAI: max tokens exceeded (status: %s, type: %s). If using a reasoning model, increase max_tokens to account for internal reasoning token usage.',
6766
data_get($data, 'output.{last}.status', 'n/a'),
6867
data_get($data, 'output.{last}.type', 'n/a'),
6968
)),
70-
default => throw new PrismException(sprintf(
71-
'OpenAI: unhandled finish reason "%s" (status: %s, type: %s)',
72-
$finishReason->value,
73-
data_get($data, 'output.{last}.status', 'n/a'),
74-
data_get($data, 'output.{last}.type', 'n/a'),
75-
)),
69+
default => $this->handleStop($data, $request, $response),
7670
};
7771
}
7872

0 commit comments

Comments
 (0)