This commit is contained in:
Nariman Jelveh
2026-07-29 15:48:21 -07:00
6 changed files with 49 additions and 3 deletions
@@ -225,6 +225,21 @@ describe('AlibabaProvider.complete request shape', () => {
expect(createMock.mock.calls[0]![0].max_tokens).toBe(256);
});
it('forwards max_tokens 0 instead of substituting the default 1000', async () => {
const { provider } = makeProvider();
createMock.mockResolvedValueOnce(baseCompletion);
await withTestActor(() =>
provider.complete({
model: 'qwen-plus',
messages: [{ role: 'user', content: 'hi' }],
max_tokens: 0,
}),
);
expect(createMock.mock.calls[0]![0].max_tokens).toBe(0);
});
it('forwards temperature when supplied', async () => {
const { provider } = makeProvider();
createMock.mockResolvedValueOnce(baseCompletion);
@@ -86,7 +86,7 @@ export class AlibabaProvider implements IChatProvider {
messages,
model: modelUsed.id,
...(tools ? { tools } : {}),
max_tokens: max_tokens || 1000,
max_tokens: max_tokens ?? 1000,
temperature,
stream,
...(stream
@@ -237,6 +237,22 @@ describe('ClaudeProvider.complete request shape', () => {
});
});
it('forwards max_tokens 0 instead of substituting the model default', async () => {
const { provider } = makeProvider();
messagesCreateMock.mockResolvedValueOnce(baseResponse);
await withTestActor(() =>
provider.complete({
model: 'claude-haiku-4-5-20251001',
messages: [{ role: 'user', content: 'hello' }],
max_tokens: 0,
}),
);
const [args] = messagesCreateMock.mock.calls[0]!;
expect(args.max_tokens).toBe(0);
});
it('extracts system messages and forwards them as the top-level `system` field', async () => {
const { provider } = makeProvider();
messagesCreateMock.mockResolvedValueOnce(baseResponse);
@@ -320,7 +320,7 @@ export class ClaudeProvider implements IChatProvider {
} = {
model: modelUsed.id,
max_tokens: Math.floor(
max_tokens ||
max_tokens ??
(model === 'claude-3-5-sonnet-20241022' ||
model === 'claude-3-5-sonnet-20240620'
? 8192
@@ -216,6 +216,21 @@ describe('DeepSeekProvider.complete request shape', () => {
expect(createMock.mock.calls[0]![0].max_tokens).toBe(256);
});
it('forwards max_tokens 0 instead of substituting the default 1000', async () => {
const { provider } = makeProvider();
createMock.mockResolvedValueOnce(baseCompletion);
await withTestActor(() =>
provider.complete({
model: 'deepseek-v4-flash',
messages: [{ role: 'user', content: 'hi' }],
max_tokens: 0,
}),
);
expect(createMock.mock.calls[0]![0].max_tokens).toBe(0);
});
it('omits the `tools` key entirely when no tools are supplied', async () => {
const { provider } = makeProvider();
createMock.mockResolvedValueOnce(baseCompletion);
@@ -117,7 +117,7 @@ export class DeepSeekProvider implements IChatProvider {
messages,
model: modelUsed.id,
...(tools ? { tools } : {}),
max_tokens: max_tokens || 1000,
max_tokens: max_tokens ?? 1000,
temperature,
stream,
...(stream