Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/Images/PendingRequest.php
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ public function generate(): Response
$request = $this->toRequest();

try {
return $this->provider->images($this->toRequest());
return $this->provider->images($request);
} catch (RequestException $e) {
$this->provider->handleRequestException($request->model(), $e);
}
Expand Down
11 changes: 3 additions & 8 deletions src/Providers/Anthropic/Anthropic.php
Original file line number Diff line number Diff line change
Expand Up @@ -36,15 +36,10 @@ public function __construct(
#[\Override]
public function text(TextRequest $request): TextResponse
{
$handler = new Text(
$this->client(
$request->clientOptions(),
$request->clientRetry()
),
return (new Text(
$this->client($request->clientOptions(), $request->clientRetry()),
$request
);

return $handler->handle();
))->handle();
}

#[\Override]
Expand Down
72 changes: 5 additions & 67 deletions src/Providers/Anthropic/Handlers/Text.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,10 @@

namespace Prism\Prism\Providers\Anthropic\Handlers;

use Illuminate\Http\Client\PendingRequest;
use Illuminate\Support\Arr;
use Illuminate\Support\Collection;
use Prism\Prism\Concerns\CallsTools;
use Prism\Prism\Contracts\PrismRequest;
use Prism\Prism\Enums\FinishReason;
use Prism\Prism\Exceptions\PrismException;
use Prism\Prism\Providers\Anthropic\Concerns\ExtractsCitations;
use Prism\Prism\Providers\Anthropic\Concerns\ExtractsText;
use Prism\Prism\Providers\Anthropic\Concerns\ExtractsThinking;
Expand All @@ -20,57 +17,21 @@
use Prism\Prism\Providers\Anthropic\Maps\MessageMap;
use Prism\Prism\Providers\Anthropic\Maps\ToolChoiceMap;
use Prism\Prism\Providers\Anthropic\Maps\ToolMap;
use Prism\Prism\Providers\TextHandler;
use Prism\Prism\Text\Request as TextRequest;
use Prism\Prism\Text\Response;
use Prism\Prism\Text\ResponseBuilder;
use Prism\Prism\Text\Step;
use Prism\Prism\ValueObjects\Messages\AssistantMessage;
use Prism\Prism\ValueObjects\Messages\ToolResultMessage;
use Prism\Prism\ValueObjects\Meta;
use Prism\Prism\ValueObjects\ProviderTool;
use Prism\Prism\ValueObjects\ToolCall;
use Prism\Prism\ValueObjects\ToolResult;
use Prism\Prism\ValueObjects\Usage;

class Text
class Text extends TextHandler
{
use CallsTools, ExtractsCitations, ExtractsText, ExtractsThinking, HandlesHttpRequests, ProcessesRateLimits;

protected Response $tempResponse;

protected ResponseBuilder $responseBuilder;

public function __construct(protected PendingRequest $client, protected TextRequest $request)
{
$this->responseBuilder = new ResponseBuilder;
}

public function handle(): Response
{
$this->sendRequest();

$this->prepareTempResponse();

$responseMessage = new AssistantMessage(
$this->tempResponse->text,
$this->tempResponse->toolCalls,
$this->tempResponse->additionalContent,
);

$this->responseBuilder->addResponseMessage($responseMessage);

$this->request->addMessage($responseMessage);

return match ($this->tempResponse->finishReason) {
FinishReason::ToolCalls => $this->handleToolCalls(),
FinishReason::Stop, FinishReason::Length => $this->handleStop(),
default => throw new PrismException('Anthropic: unknown finish reason'),
};
}

/**
* @param TextRequest $request
* @return array<string, mixed>
*/
#[\Override]
public static function buildHttpRequestPayload(PrismRequest $request): array
Expand Down Expand Up @@ -113,38 +74,13 @@ protected function handleToolCalls(): Response

$this->addStep($toolResults);

if ($this->responseBuilder->steps->count() < $this->request->maxSteps()) {
if ($this->shouldContinue()) {
return $this->handle();
}

return $this->responseBuilder->toResponse();
}

protected function handleStop(): Response
{
$this->addStep();

return $this->responseBuilder->toResponse();
}

/**
* @param ToolResult[] $toolResults
*/
protected function addStep(array $toolResults = []): void
{
$this->responseBuilder->addStep(new Step(
text: $this->tempResponse->text,
finishReason: $this->tempResponse->finishReason,
toolCalls: $this->tempResponse->toolCalls,
toolResults: $toolResults,
usage: $this->tempResponse->usage,
meta: $this->tempResponse->meta,
messages: $this->request->messages(),
systemPrompts: $this->request->systemPrompts(),
additionalContent: $this->tempResponse->additionalContent,
));
}

protected function prepareTempResponse(): void
{
$data = $this->httpResponse->json();
Expand Down Expand Up @@ -218,4 +154,6 @@ protected function extractToolCalls(array $data): array

return $toolCalls;
}

protected function handleResponseError(): void {}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,16 @@

namespace Prism\Prism\Providers\DeepSeek\Concerns;

use Illuminate\Http\Client\Response;
use Prism\Prism\Exceptions\PrismException;

trait ValidatesResponses
trait HandleResponseError
{
/**
* @param array<string, mixed> $data
*/
protected function validateResponse(array $data): void
protected Response $httpResponse;

protected function handleResponseError(): void
{
if ($data === []) {
if ($this->httpResponse->json() === []) {
throw PrismException::providerResponseError('DeepSeek Error: Empty response');
}
}
Expand Down
10 changes: 4 additions & 6 deletions src/Providers/DeepSeek/DeepSeek.php
Original file line number Diff line number Diff line change
Expand Up @@ -26,12 +26,10 @@ public function __construct(
#[\Override]
public function text(TextRequest $request): TextResponse
{
$handler = new Text($this->client(
$request->clientOptions(),
$request->clientRetry()
));

return $handler->handle($request);
return (new Text(
$this->client($request->clientOptions(), $request->clientRetry()),
$request
))->handle();
}

#[\Override]
Expand Down
21 changes: 5 additions & 16 deletions src/Providers/DeepSeek/Handlers/Structured.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,8 @@

use Illuminate\Http\Client\PendingRequest;
use Illuminate\Support\Arr;
use Prism\Prism\Exceptions\PrismException;
use Prism\Prism\Providers\DeepSeek\Concerns\HandleResponseError;
use Prism\Prism\Providers\DeepSeek\Concerns\MapsFinishReason;
use Prism\Prism\Providers\DeepSeek\Concerns\ValidatesResponses;
use Prism\Prism\Providers\DeepSeek\Maps\FinishReasonMap;
use Prism\Prism\Providers\DeepSeek\Maps\MessageMap;
use Prism\Prism\Structured\Request;
Expand All @@ -20,8 +19,8 @@

class Structured
{
use HandleResponseError;
use MapsFinishReason;
use ValidatesResponses;

protected ResponseBuilder $responseBuilder;

Expand All @@ -36,7 +35,7 @@ public function handle(Request $request): StructuredResponse

$data = $this->sendRequest($request);

$this->validateResponse($data);
$this->handleResponseError();

return $this->createResponse($request, $data);
}
Expand All @@ -46,7 +45,7 @@ public function handle(Request $request): StructuredResponse
*/
protected function sendRequest(Request $request): array
{
$response = $this->client->post(
$this->httpResponse = $this->client->post(
'chat/completions',
array_merge([
'model' => $request->model(),
Expand All @@ -59,17 +58,7 @@ protected function sendRequest(Request $request): array
]))
);

return $response->json();
}

/**
* @param array<string, mixed> $data
*/
protected function validateResponse(array $data): void
{
if ($data === []) {
throw PrismException::providerResponseError('DeepSeek Error: Empty response');
}
return $this->httpResponse->json();
}

/**
Expand Down
Loading
Loading