ai 7.0.77 → 7.0.79
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +20 -0
- package/dist/index.d.ts +8 -2
- package/dist/index.js +69 -15
- package/dist/index.js.map +1 -1
- package/dist/internal/index.d.ts +3 -0
- package/dist/internal/index.js +15 -6
- package/dist/internal/index.js.map +1 -1
- package/docs/02-foundations/02-providers-and-models.mdx +2 -3
- package/docs/03-ai-sdk-harnesses/05-harness-adapters.mdx +4 -4
- package/package.json +7 -7
- package/src/batch/batch-types.ts +7 -0
- package/src/batch/batch.ts +2 -0
- package/src/generate-text/generate-text.ts +27 -3
- package/src/generate-text/stream-text.ts +38 -1
- package/src/generate-text/validate-tool-approvals.ts +19 -5
- package/src/index.ts +7 -1
- package/src/ui/process-ui-message-stream.ts +2 -3
|
@@ -162,10 +162,9 @@ Here are the capabilities of popular models:
|
|
|
162
162
|
| [Mistral](/providers/ai-sdk-providers/mistral) | `mistral-medium-3.5` | <Cross /> | <Check /> | <Check /> | <Check /> |
|
|
163
163
|
| [Mistral](/providers/ai-sdk-providers/mistral) | `mistral-small-latest` | <Cross /> | <Check /> | <Check /> | <Check /> |
|
|
164
164
|
| [Mistral](/providers/ai-sdk-providers/mistral) | `pixtral-12b-2409` | <Check /> | <Check /> | <Check /> | <Check /> |
|
|
165
|
-
| [DeepSeek](/providers/ai-sdk-providers/deepseek) | `deepseek-
|
|
166
|
-
| [DeepSeek](/providers/ai-sdk-providers/deepseek) | `deepseek-
|
|
165
|
+
| [DeepSeek](/providers/ai-sdk-providers/deepseek) | `deepseek-v4-flash` | <Cross /> | <Check /> | <Check /> | <Check /> |
|
|
166
|
+
| [DeepSeek](/providers/ai-sdk-providers/deepseek) | `deepseek-v4-pro` | <Cross /> | <Check /> | <Check /> | <Check /> |
|
|
167
167
|
| [Cerebras](/providers/ai-sdk-providers/cerebras) | `gpt-oss-120b` | <Cross /> | <Check /> | <Check /> | <Check /> |
|
|
168
|
-
| [Cerebras](/providers/ai-sdk-providers/cerebras) | `zai-glm-4.7` | <Cross /> | <Check /> | <Check /> | <Check /> |
|
|
169
168
|
| [Cerebras](/providers/ai-sdk-providers/cerebras) | `gemma-4-31b` | <Check /> | <Check /> | <Check /> | <Check /> |
|
|
170
169
|
| [Groq](/providers/ai-sdk-providers/groq) | `meta-llama/llama-4-scout-17b-16e-instruct` | <Check /> | <Check /> | <Check /> | <Check /> |
|
|
171
170
|
| [Groq](/providers/ai-sdk-providers/groq) | `llama-3.3-70b-versatile` | <Cross /> | <Check /> | <Check /> | <Check /> |
|
|
@@ -17,7 +17,9 @@ The AI SDK includes the following harness adapters:
|
|
|
17
17
|
- [Claude Code](/providers/ai-sdk-harnesses/claude-code) (`@ai-sdk/harness-claude-code`)
|
|
18
18
|
- [Cline](/providers/ai-sdk-harnesses/cline) (`@ai-sdk/harness-cline`)
|
|
19
19
|
- [Codex](/providers/ai-sdk-harnesses/codex) (`@ai-sdk/harness-codex`)
|
|
20
|
+
- [Cursor](/providers/ai-sdk-harnesses/cursor) (`@ai-sdk/harness-cursor`)
|
|
20
21
|
- [Deep Agents](/providers/ai-sdk-harnesses/deepagents) (`@ai-sdk/harness-deepagents`)
|
|
22
|
+
- [fx](/providers/ai-sdk-harnesses/fx) (`@ai-sdk/harness-fx`)
|
|
21
23
|
- [Grok Build](/providers/ai-sdk-harnesses/grok-build) (`@ai-sdk/harness-grok-build`)
|
|
22
24
|
- [OpenCode](/providers/ai-sdk-harnesses/opencode) (`@ai-sdk/harness-opencode`)
|
|
23
25
|
- [Pi](/providers/ai-sdk-harnesses/pi) (`@ai-sdk/harness-pi`)
|
|
@@ -35,11 +37,9 @@ The AI SDK includes the following harness adapters:
|
|
|
35
37
|
| [Claude Code](/providers/ai-sdk-harnesses/claude-code) | Sandbox bridge | <Check /> | <Check /> | <Check /> | <Check /> | <Check /> |
|
|
36
38
|
| [Cline](/providers/ai-sdk-harnesses/cline) | Host process | <Check /> | <Check /> | <Check /> | <Check /> | <Check /> |
|
|
37
39
|
| [Codex](/providers/ai-sdk-harnesses/codex) | Sandbox bridge | <Check /> | <Check /> | <Check /> | <Cross /> | <Cross /> |
|
|
40
|
+
| [Cursor](/providers/ai-sdk-harnesses/cursor) | Sandbox via ACP | <Check /> | <Check /> | <Cross /> | <Check /> | <Cross /> |
|
|
38
41
|
| [Deep Agents](/providers/ai-sdk-harnesses/deepagents) | Sandbox bridge | <Check /> | <Check /> | <Check /> | <Check /> | <Check /> via auto-rejection |
|
|
42
|
+
| [fx](/providers/ai-sdk-harnesses/fx) | Sandbox via ACP | <Check /> | <Check /> | <Cross /> | <Check /> | <Cross /> |
|
|
39
43
|
| [Grok Build](/providers/ai-sdk-harnesses/grok-build) | Sandbox via ACP | <Check /> | <Check /> | <Check /> | <Check /> | <Cross /> |
|
|
40
44
|
| [OpenCode](/providers/ai-sdk-harnesses/opencode) | Sandbox bridge | <Check /> | <Check /> | <Check /> | <Check /> | <Check /> via auto-rejection |
|
|
41
45
|
| [Pi](/providers/ai-sdk-harnesses/pi) | Host process | <Check /> | <Check /> | <Cross /> | <Check /> | <Check /> |
|
|
42
|
-
|
|
43
|
-
Generic ACP profiles do not support structured output unless they configure an
|
|
44
|
-
implementation-specific prompt metadata mapping; Grok Build includes the
|
|
45
|
-
required mapping, while Codex ACP does not expose one.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ai",
|
|
3
|
-
"version": "7.0.
|
|
3
|
+
"version": "7.0.79",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "AI SDK by Vercel - build apps like ChatGPT, Claude, Gemini, and more with a single interface for any model using the Vercel AI Gateway or go direct to OpenAI, Anthropic, Google, or any other model provider.",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -42,21 +42,21 @@
|
|
|
42
42
|
}
|
|
43
43
|
},
|
|
44
44
|
"dependencies": {
|
|
45
|
-
"@ai-sdk/gateway": "4.0.
|
|
46
|
-
"@ai-sdk/provider": "4.0.
|
|
47
|
-
"@ai-sdk/provider-utils": "5.0.
|
|
45
|
+
"@ai-sdk/gateway": "4.0.64",
|
|
46
|
+
"@ai-sdk/provider": "4.0.8",
|
|
47
|
+
"@ai-sdk/provider-utils": "5.0.30"
|
|
48
48
|
},
|
|
49
49
|
"devDependencies": {
|
|
50
|
+
"@ai-sdk/test-server": "2.0.1",
|
|
50
51
|
"@edge-runtime/vm": "^5.0.0",
|
|
51
52
|
"@types/json-schema": "7.0.15",
|
|
52
53
|
"@types/node": "22.19.19",
|
|
54
|
+
"@vercel/ai-tsconfig": "0.0.0",
|
|
53
55
|
"esbuild": "^0.28.1",
|
|
54
56
|
"tsup": "^7.2.0",
|
|
55
57
|
"tsx": "4.23.12",
|
|
56
58
|
"typescript": "5.8.3",
|
|
57
|
-
"zod": "3.25.76"
|
|
58
|
-
"@ai-sdk/test-server": "2.0.1",
|
|
59
|
-
"@vercel/ai-tsconfig": "0.0.0"
|
|
59
|
+
"zod": "3.25.76"
|
|
60
60
|
},
|
|
61
61
|
"peerDependencies": {
|
|
62
62
|
"zod": "^3.25.76 || ^4.1.8"
|
package/src/batch/batch-types.ts
CHANGED
|
@@ -77,6 +77,13 @@ export type StartTextBatchOptions = {
|
|
|
77
77
|
model: BatchLanguageModel;
|
|
78
78
|
requests: ReadonlyArray<TextBatchRequest>;
|
|
79
79
|
providerOptions?: ProviderOptions;
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* URL that the provider should notify when the batch reaches a terminal
|
|
83
|
+
* state. Providers that do not support completion webhooks return an
|
|
84
|
+
* unsupported warning.
|
|
85
|
+
*/
|
|
86
|
+
webhookUrl?: string;
|
|
80
87
|
} & BatchRequestOptions;
|
|
81
88
|
|
|
82
89
|
/**
|
package/src/batch/batch.ts
CHANGED
|
@@ -37,6 +37,7 @@ export async function startTextBatch({
|
|
|
37
37
|
model: modelArg,
|
|
38
38
|
requests,
|
|
39
39
|
providerOptions,
|
|
40
|
+
webhookUrl,
|
|
40
41
|
abortSignal,
|
|
41
42
|
headers,
|
|
42
43
|
timeout,
|
|
@@ -81,6 +82,7 @@ export async function startTextBatch({
|
|
|
81
82
|
providerOptions,
|
|
82
83
|
abortSignal: operationAbortSignal,
|
|
83
84
|
headers: headersWithUserAgent,
|
|
85
|
+
...(webhookUrl != null && { webhookUrl }),
|
|
84
86
|
});
|
|
85
87
|
const { batchId, warnings, ...status } = result;
|
|
86
88
|
|
|
@@ -713,6 +713,7 @@ export async function generateText<
|
|
|
713
713
|
const {
|
|
714
714
|
approvedToolApprovals: localApprovedToolApprovals,
|
|
715
715
|
deniedToolApprovals: revalidationDeniedToolApprovals,
|
|
716
|
+
invalidToolApprovals,
|
|
716
717
|
} = await validateApprovedToolApprovals<TOOLS, RUNTIME_CONTEXT>({
|
|
717
718
|
approvedToolApprovals: approvedToolApprovals.filter(
|
|
718
719
|
toolApproval => !toolApproval.toolCall.providerExecuted,
|
|
@@ -735,7 +736,8 @@ export async function generateText<
|
|
|
735
736
|
|
|
736
737
|
if (
|
|
737
738
|
deniedToolApprovalsWithoutResults.length > 0 ||
|
|
738
|
-
localApprovedToolApprovals.length > 0
|
|
739
|
+
localApprovedToolApprovals.length > 0 ||
|
|
740
|
+
invalidToolApprovals.length > 0
|
|
739
741
|
) {
|
|
740
742
|
const toolResults = await executeTools({
|
|
741
743
|
toolCalls: localApprovedToolApprovals.map(
|
|
@@ -790,6 +792,24 @@ export async function generateText<
|
|
|
790
792
|
});
|
|
791
793
|
}
|
|
792
794
|
|
|
795
|
+
// Report invalid approved tool calls to the model without executing
|
|
796
|
+
// them. Repairing the input after approval would change the operation
|
|
797
|
+
// that the user authorized.
|
|
798
|
+
for (const toolApproval of invalidToolApprovals) {
|
|
799
|
+
toolContent.push({
|
|
800
|
+
type: 'tool-result' as const,
|
|
801
|
+
toolCallId: toolApproval.toolCall.toolCallId,
|
|
802
|
+
toolName: toolApproval.toolCall.toolName,
|
|
803
|
+
output: await createToolModelOutput({
|
|
804
|
+
toolCallId: toolApproval.toolCall.toolCallId,
|
|
805
|
+
input: toolApproval.toolCall.input,
|
|
806
|
+
tool: getOwn(tools, toolApproval.toolCall.toolName),
|
|
807
|
+
output: toolApproval.error,
|
|
808
|
+
errorMode: 'text',
|
|
809
|
+
}),
|
|
810
|
+
});
|
|
811
|
+
}
|
|
812
|
+
|
|
793
813
|
// add execution denied tool results for all denied tool approvals:
|
|
794
814
|
for (const toolApproval of deniedToolApprovalsWithoutResults) {
|
|
795
815
|
toolContent.push({
|
|
@@ -1518,9 +1538,13 @@ export async function generateText<
|
|
|
1518
1538
|
callbacks: [onEnd, telemetryDispatcher.onEnd],
|
|
1519
1539
|
});
|
|
1520
1540
|
|
|
1521
|
-
// parse output
|
|
1541
|
+
// parse output if the last step was finished with "stop", or if the
|
|
1542
|
+
// provider did not report a finish reason but returned text:
|
|
1522
1543
|
let resolvedOutput;
|
|
1523
|
-
if (
|
|
1544
|
+
if (
|
|
1545
|
+
lastStep.finishReason === 'stop' ||
|
|
1546
|
+
(lastStep.finishReason == null && lastStep.text.length > 0)
|
|
1547
|
+
) {
|
|
1524
1548
|
const outputSpecification = output ?? text();
|
|
1525
1549
|
resolvedOutput = await outputSpecification.parseCompleteOutput(
|
|
1526
1550
|
{ text: lastStep.text },
|
|
@@ -1714,6 +1714,7 @@ class DefaultStreamTextResult<
|
|
|
1714
1714
|
const {
|
|
1715
1715
|
approvedToolApprovals: localApprovedToolApprovals,
|
|
1716
1716
|
deniedToolApprovals: revalidationDeniedToolApprovals,
|
|
1717
|
+
invalidToolApprovals,
|
|
1717
1718
|
} = await validateApprovedToolApprovals<TOOLS, RUNTIME_CONTEXT>({
|
|
1718
1719
|
approvedToolApprovals: approvedToolApprovals.filter(
|
|
1719
1720
|
toolApproval => !toolApproval.toolCall.providerExecuted,
|
|
@@ -1766,6 +1767,23 @@ class DefaultStreamTextResult<
|
|
|
1766
1767
|
} as StaticToolOutputDenied<TOOLS>);
|
|
1767
1768
|
}
|
|
1768
1769
|
|
|
1770
|
+
for (const toolApproval of invalidToolApprovals) {
|
|
1771
|
+
toolExecutionStepStreamController?.enqueue({
|
|
1772
|
+
type: 'tool-error',
|
|
1773
|
+
toolCallId: toolApproval.toolCall.toolCallId,
|
|
1774
|
+
toolName: toolApproval.toolCall.toolName,
|
|
1775
|
+
input: toolApproval.toolCall.input,
|
|
1776
|
+
error: getErrorMessage(toolApproval.error),
|
|
1777
|
+
title: toolApproval.toolCall.title,
|
|
1778
|
+
...(toolApproval.toolCall.dynamic === true
|
|
1779
|
+
? { dynamic: true as const }
|
|
1780
|
+
: {}),
|
|
1781
|
+
...(toolApproval.toolCall.toolMetadata != null
|
|
1782
|
+
? { toolMetadata: toolApproval.toolCall.toolMetadata }
|
|
1783
|
+
: {}),
|
|
1784
|
+
} as TextStreamPart<TOOLS>);
|
|
1785
|
+
}
|
|
1786
|
+
|
|
1769
1787
|
const toolOutputs: Array<ToolOutput<TOOLS>> = [];
|
|
1770
1788
|
|
|
1771
1789
|
await Promise.all(
|
|
@@ -1804,7 +1822,8 @@ class DefaultStreamTextResult<
|
|
|
1804
1822
|
// Local tool results (approved + denied) are sent as tool results:
|
|
1805
1823
|
if (
|
|
1806
1824
|
toolOutputs.length > 0 ||
|
|
1807
|
-
localDeniedToolApprovalsWithoutResults.length > 0
|
|
1825
|
+
localDeniedToolApprovalsWithoutResults.length > 0 ||
|
|
1826
|
+
invalidToolApprovals.length > 0
|
|
1808
1827
|
) {
|
|
1809
1828
|
const localToolContent: ToolContent = [];
|
|
1810
1829
|
|
|
@@ -1827,6 +1846,24 @@ class DefaultStreamTextResult<
|
|
|
1827
1846
|
});
|
|
1828
1847
|
}
|
|
1829
1848
|
|
|
1849
|
+
// Report invalid approved tool calls to the model without
|
|
1850
|
+
// executing them. Repairing the input after approval would change
|
|
1851
|
+
// the operation that the user authorized.
|
|
1852
|
+
for (const toolApproval of invalidToolApprovals) {
|
|
1853
|
+
localToolContent.push({
|
|
1854
|
+
type: 'tool-result' as const,
|
|
1855
|
+
toolCallId: toolApproval.toolCall.toolCallId,
|
|
1856
|
+
toolName: toolApproval.toolCall.toolName,
|
|
1857
|
+
output: await createToolModelOutput({
|
|
1858
|
+
toolCallId: toolApproval.toolCall.toolCallId,
|
|
1859
|
+
input: toolApproval.toolCall.input,
|
|
1860
|
+
tool: getOwn(tools, toolApproval.toolCall.toolName),
|
|
1861
|
+
output: toolApproval.error,
|
|
1862
|
+
errorMode: 'text',
|
|
1863
|
+
}),
|
|
1864
|
+
});
|
|
1865
|
+
}
|
|
1866
|
+
|
|
1830
1867
|
// add execution denied tool results for denied local tool approvals:
|
|
1831
1868
|
for (const toolApproval of localDeniedToolApprovalsWithoutResults) {
|
|
1832
1869
|
localToolContent.push({
|
|
@@ -42,9 +42,15 @@ export async function validateApprovedToolApprovals<
|
|
|
42
42
|
}): Promise<{
|
|
43
43
|
approvedToolApprovals: Array<CollectedToolApprovals<TOOLS>>;
|
|
44
44
|
deniedToolApprovals: Array<CollectedToolApprovals<TOOLS>>;
|
|
45
|
+
invalidToolApprovals: Array<
|
|
46
|
+
CollectedToolApprovals<TOOLS> & { error: InvalidToolInputError }
|
|
47
|
+
>;
|
|
45
48
|
}> {
|
|
46
49
|
const approved: Array<CollectedToolApprovals<TOOLS>> = [];
|
|
47
50
|
const denied: Array<CollectedToolApprovals<TOOLS>> = [];
|
|
51
|
+
const invalid: Array<
|
|
52
|
+
CollectedToolApprovals<TOOLS> & { error: InvalidToolInputError }
|
|
53
|
+
> = [];
|
|
48
54
|
|
|
49
55
|
for (const approval of approvedToolApprovals) {
|
|
50
56
|
const { toolCall, approvalRequest } = approval;
|
|
@@ -88,11 +94,15 @@ export async function validateApprovedToolApprovals<
|
|
|
88
94
|
});
|
|
89
95
|
|
|
90
96
|
if (!validation.success) {
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
97
|
+
invalid.push({
|
|
98
|
+
...approval,
|
|
99
|
+
error: new InvalidToolInputError({
|
|
100
|
+
toolName: toolCall.toolName,
|
|
101
|
+
toolInput: JSON.stringify(toolCall.input),
|
|
102
|
+
cause: validation.error,
|
|
103
|
+
}),
|
|
95
104
|
});
|
|
105
|
+
continue;
|
|
96
106
|
}
|
|
97
107
|
}
|
|
98
108
|
|
|
@@ -119,5 +129,9 @@ export async function validateApprovedToolApprovals<
|
|
|
119
129
|
}
|
|
120
130
|
}
|
|
121
131
|
|
|
122
|
-
return {
|
|
132
|
+
return {
|
|
133
|
+
approvedToolApprovals: approved,
|
|
134
|
+
deniedToolApprovals: denied,
|
|
135
|
+
invalidToolApprovals: invalid,
|
|
136
|
+
};
|
|
123
137
|
}
|
package/src/index.ts
CHANGED
|
@@ -2,7 +2,13 @@
|
|
|
2
2
|
import './global';
|
|
3
3
|
|
|
4
4
|
// re-exports:
|
|
5
|
-
export {
|
|
5
|
+
export {
|
|
6
|
+
createGateway,
|
|
7
|
+
gateway,
|
|
8
|
+
type GatewayAsyncJobMetadata,
|
|
9
|
+
type GatewayModelId,
|
|
10
|
+
type GatewayProviderMetadata,
|
|
11
|
+
} from '@ai-sdk/gateway';
|
|
6
12
|
export {
|
|
7
13
|
asSchema,
|
|
8
14
|
createIdGenerator,
|
|
@@ -881,9 +881,8 @@ export function processUIMessageStream<UI_MESSAGE extends UIMessage>({
|
|
|
881
881
|
}
|
|
882
882
|
|
|
883
883
|
case 'finish-step': {
|
|
884
|
-
//
|
|
885
|
-
|
|
886
|
-
state.activeReasoningParts = createIdMap();
|
|
884
|
+
// Active parts are closed by their explicit end chunks. A merged
|
|
885
|
+
// stream's step can finish while another stream's part is active.
|
|
887
886
|
break;
|
|
888
887
|
}
|
|
889
888
|
|