From 69b680d169aa721fbd79eb872a1a4b82d6fbad81 Mon Sep 17 00:00:00 2001 From: Rhys Emmerson Date: Tue, 14 Oct 2025 15:44:09 +1000 Subject: [PATCH 1/2] Allow passing parameters to cohere embed --- .../Cohere/CohereEmbeddingsHandler.php | 13 +++++-- tests/Schemas/Cohere/CohereEmbeddingsTest.php | 36 +++++++++++++++++++ 2 files changed, 46 insertions(+), 3 deletions(-) diff --git a/src/Schemas/Cohere/CohereEmbeddingsHandler.php b/src/Schemas/Cohere/CohereEmbeddingsHandler.php index db143b1..5dea71d 100644 --- a/src/Schemas/Cohere/CohereEmbeddingsHandler.php +++ b/src/Schemas/Cohere/CohereEmbeddingsHandler.php @@ -3,6 +3,7 @@ namespace Prism\Bedrock\Schemas\Cohere; use Illuminate\Http\Client\Response; +use Illuminate\Support\Arr; use Prism\Bedrock\Contracts\BedrockEmbeddingsHandler; use Prism\Prism\Embeddings\Request; use Prism\Prism\Embeddings\Response as EmbeddingsResponse; @@ -39,9 +40,15 @@ public static function buildPayload(Request $request): array { return array_filter([ 'texts' => $request->inputs(), - 'input_type' => 'search_document', // TODO: Need to PR providerOptions onto embeddings request to allow override. - 'truncate' => null, // TODO: Need to PR providerOptions onto embeddings request to allow override. Default for now. - 'embedding_types' => null, // TODO: Need to PR providerOptions onto embeddings request to allow override. Default for now. + 'input_type' => 'search_document', + 'truncate' => null, + 'embedding_types' => null, + ...Arr::only($request->providerOptions(), [ + 'input_type', + 'embedding_types', + 'truncate', + 'output_dimension', + ]), ]); } diff --git a/tests/Schemas/Cohere/CohereEmbeddingsTest.php b/tests/Schemas/Cohere/CohereEmbeddingsTest.php index 668c94a..e692e76 100644 --- a/tests/Schemas/Cohere/CohereEmbeddingsTest.php +++ b/tests/Schemas/Cohere/CohereEmbeddingsTest.php @@ -4,6 +4,7 @@ namespace Tests\Schemas\Cohere; +use Illuminate\Support\Facades\Http; use Prism\Prism\Prism; use Prism\Prism\ValueObjects\Embedding; use Tests\Fixtures\FixtureResponse; @@ -63,3 +64,38 @@ expect($response->embeddings[1]->embedding)->toEqual($embeddings[1]->embedding); expect($response->usage->tokens)->toBe(1); }); + +it('can set request params', function (): void { + FixtureResponse::fakeResponseSequence('invoke', 'cohere/generate-embeddings-from-input', [ + 'X-Amzn-Bedrock-Input-Token-Count' => 4, + ]); + + $response = Prism::embeddings() + ->using('bedrock', 'cohere.embed-english-v3') + ->withProviderOptions([ + 'input_type' => 'search_query', + 'truncate' => 'RIGHT', + 'embedding_types' => ['sparse', 'dense'], + 'output_dimension' => 1536, + 'some_other_option' => 'should be filtered out', + ]) + ->fromInput('Hello, world!') + ->asEmbeddings(); + + $embeddings = json_decode(file_get_contents('tests/Fixtures/cohere/generate-embeddings-from-input-1.json'), true); + $embeddings = array_map(fn (array $item): Embedding => Embedding::fromArray($item), data_get($embeddings, 'embeddings')); + + Http::assertSent(function ($request) { + $body = $request->data(); + + return $body['input_type'] === 'search_query' + && $body['truncate'] === 'RIGHT' + && $body['embedding_types'] === ['sparse', 'dense'] + && $body['output_dimension'] === 1536 + && ! array_key_exists('some_other_option', $body); + }); + + expect($response->embeddings)->toBeArray(); + expect($response->embeddings[0]->embedding)->toEqual($embeddings[0]->embedding); + expect($response->usage->tokens)->toBe(4); +}); From da3e0665704361d1b7b7f712960f4aee4a67fd68 Mon Sep 17 00:00:00 2001 From: TJ Miller Date: Thu, 16 Oct 2025 10:21:52 -0400 Subject: [PATCH 2/2] formatting --- tests/Schemas/Cohere/CohereEmbeddingsTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/Schemas/Cohere/CohereEmbeddingsTest.php b/tests/Schemas/Cohere/CohereEmbeddingsTest.php index e692e76..d5cbd65 100644 --- a/tests/Schemas/Cohere/CohereEmbeddingsTest.php +++ b/tests/Schemas/Cohere/CohereEmbeddingsTest.php @@ -85,7 +85,7 @@ $embeddings = json_decode(file_get_contents('tests/Fixtures/cohere/generate-embeddings-from-input-1.json'), true); $embeddings = array_map(fn (array $item): Embedding => Embedding::fromArray($item), data_get($embeddings, 'embeddings')); - Http::assertSent(function ($request) { + Http::assertSent(function ($request): bool { $body = $request->data(); return $body['input_type'] === 'search_query'