Skip to content

Commit 8008301

Browse files
authored
fix(anthropic): set default max tokens (#816)
1 parent 825f6af commit 8008301

File tree

4 files changed

+53
-2
lines changed

4 files changed

+53
-2
lines changed

src/Providers/Anthropic/Handlers/Structured.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ public static function buildHttpRequestPayload(PrismRequest $request): array
9898
: config('prism.anthropic.default_thinking_budget', 1024),
9999
]
100100
: null,
101-
'max_tokens' => $request->maxTokens(),
101+
'max_tokens' => $request->maxTokens() ?? 64000,
102102
'temperature' => $request->temperature(),
103103
'top_p' => $request->topP(),
104104
'mcp_servers' => $request->providerOptions('mcp_servers'),

src/Providers/Anthropic/Handlers/Text.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ public static function buildHttpRequestPayload(PrismRequest $request): array
9090
: config('prism.anthropic.default_thinking_budget', 1024),
9191
]
9292
: null,
93-
'max_tokens' => $request->maxTokens(),
93+
'max_tokens' => $request->maxTokens() ?? 64000,
9494
'temperature' => $request->temperature(),
9595
'top_p' => $request->topP(),
9696
'tools' => static::buildTools($request) ?: null,

tests/Providers/Anthropic/AnthropicStructuredRequestTest.php

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -319,3 +319,34 @@
319319
return true;
320320
});
321321
});
322+
323+
it('always includes max_tokens in payload because it is required by anthropic', function (): void {
324+
FixtureResponse::fakeResponseSequence('v1/messages', 'anthropic/structured');
325+
326+
$schema = new ObjectSchema(
327+
'simple',
328+
'Simple object',
329+
[
330+
'data' => new StringSchema('data', 'Some data'),
331+
],
332+
['data']
333+
);
334+
335+
// Note: NOT calling withMaxTokens() - simulating user not setting it
336+
Prism::structured()
337+
->using(Provider::Anthropic, 'claude-3-5-haiku-latest')
338+
->withMessages([new UserMessage('Generate simple data')])
339+
->withSchema($schema)
340+
->asStructured();
341+
342+
Http::assertSent(function (Request $request): bool {
343+
$payload = $request->data();
344+
345+
// Anthropic API requires max_tokens - it should always be present
346+
expect($payload)->toHaveKey('max_tokens');
347+
expect($payload['max_tokens'])->toBeInt();
348+
expect($payload['max_tokens'])->toBeGreaterThan(0);
349+
350+
return true;
351+
});
352+
});

tests/Providers/Anthropic/AnthropicTextRequestTest.php

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,26 @@
241241
});
242242
});
243243

244+
it('always includes max_tokens in payload because it is required by anthropic', function (): void {
245+
FixtureResponse::fakeResponseSequence('v1/messages', 'anthropic/generate-text-with-a-prompt');
246+
247+
Prism::text()
248+
->using(Provider::Anthropic, 'claude-3-5-haiku-latest')
249+
->withMessages([new UserMessage('Test')])
250+
->asText();
251+
252+
Http::assertSent(function (Request $request): bool {
253+
$payload = $request->data();
254+
255+
// Anthropic API requires max_tokens - it should always be present
256+
expect($payload)->toHaveKey('max_tokens');
257+
expect($payload['max_tokens'])->toBeInt();
258+
expect($payload['max_tokens'])->toBeGreaterThan(0);
259+
260+
return true;
261+
});
262+
});
263+
244264
it('can send images from file', function (): void {
245265
FixtureResponse::fakeResponseSequence('v1/messages', 'anthropic/generate-text-with-image');
246266

0 commit comments

Comments
 (0)