diff --git a/src/Providers/Gemini/HandleStream.php b/src/Providers/Gemini/HandleStream.php index a1a48c6d..ef68c564 100644 --- a/src/Providers/Gemini/HandleStream.php +++ b/src/Providers/Gemini/HandleStream.php @@ -62,6 +62,7 @@ public function stream(Message ...$messages): Generator ); $this->streamState = new StreamState(); + $lastFinishReason = null; while (! $stream->eof()) { $line = $this->readLine($stream); @@ -83,6 +84,11 @@ public function stream(Message ...$messages): Generator $this->streamState->getUsage()->outputTokens = $line['usageMetadata']['candidatesTokenCount'] ?? 0; } + // Track finishReason — the last value seen is authoritative + if (isset($line['candidates'][0]['finishReason'])) { + $lastFinishReason = $line['candidates'][0]['finishReason']; + } + // Process tool calls if ($this->hasToolCalls($line)) { $this->streamState->composeToolCalls($line); @@ -138,6 +144,10 @@ public function stream(Message ...$messages): Generator $message = new AssistantMessage($this->streamState->getContentBlocks()); $message->setUsage($this->streamState->getUsage()); + if ($lastFinishReason !== null) { + $message->setStopReason($lastFinishReason); + } + return $message; } @@ -173,7 +183,7 @@ protected function hasToolCalls(array $line): bool return false; } - private function readLine(StreamInterface $stream): string + protected function readLine(StreamInterface $stream): string { $buffer = '';