@askdkc/dsh-cli 0.12.2 → 0.13.0
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/README.md +6 -1
- package/cordis.patch.yml +12 -131
- package/lib/types/adapter/channel/session-projection.d.ts.map +1 -1
- package/lib/types/adapter/channel/session-projection.js +0 -7
- package/lib/types/adapter/ports/channel-view.d.ts +1 -1
- package/lib/types/adapter/ports/channel-view.d.ts.map +1 -1
- package/lib/types/dsh-adapter/bundled-presets.d.ts +3 -8
- package/lib/types/dsh-adapter/bundled-presets.d.ts.map +1 -1
- package/lib/types/dsh-adapter/bundled-presets.js +5 -20
- package/lib/types/dsh-adapter/channel/binding-events.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/binding-events.js +2 -9
- package/lib/types/dsh-adapter/channel/external-commands.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/external-commands.js +9 -33
- package/lib/types/dsh-adapter/channel/local-actions.d.ts +2 -1
- package/lib/types/dsh-adapter/channel/local-actions.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/local-actions.js +6 -2
- package/lib/types/dsh-adapter/channel/model-actions.js +3 -3
- package/lib/types/dsh-adapter/channel/model-switch.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/model-switch.js +0 -1
- package/lib/types/dsh-adapter/channel/permissions.d.ts +1 -6
- package/lib/types/dsh-adapter/channel/permissions.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/permissions.js +2 -54
- package/lib/types/dsh-adapter/channel/projection.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/projection.js +15 -70
- package/lib/types/dsh-adapter/channel/session-fork.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/session-fork.js +0 -1
- package/lib/types/dsh-adapter/channel/session-metadata.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/session-metadata.js +1 -4
- package/lib/types/dsh-adapter/channel/session-resume.js +2 -2
- package/lib/types/dsh-adapter/channel/session-rewind.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/session-rewind.js +0 -1
- package/lib/types/dsh-adapter/channel/session-tree-actions.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/session-tree-actions.js +1 -2
- package/lib/types/dsh-adapter/channel/session-tree.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/session-tree.js +9 -62
- package/lib/types/dsh-adapter/channel/skill-catalog.js +1 -1
- package/lib/types/dsh-adapter/channel/subagent-projection.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/subagent-projection.js +2 -8
- package/lib/types/dsh-adapter/channel/transcript.d.ts +0 -16
- package/lib/types/dsh-adapter/channel/transcript.d.ts.map +1 -1
- package/lib/types/dsh-adapter/channel/transcript.js +0 -43
- package/lib/types/dsh-adapter/channel.js +2 -2
- package/lib/types/dsh-adapter/compat/index.d.ts +5 -25
- package/lib/types/dsh-adapter/compat/index.d.ts.map +1 -1
- package/lib/types/dsh-adapter/compat/index.js +5 -25
- package/lib/types/dsh-adapter/compat/liveSession.d.ts +12 -23
- package/lib/types/dsh-adapter/compat/liveSession.d.ts.map +1 -1
- package/lib/types/dsh-adapter/compat/liveSession.js +15 -68
- package/lib/types/dsh-adapter/compat/messages.d.ts +1 -3
- package/lib/types/dsh-adapter/compat/messages.d.ts.map +1 -1
- package/lib/types/dsh-adapter/compat/messages.js +2 -10
- package/lib/types/dsh-adapter/compat/persistence.d.ts +2 -3
- package/lib/types/dsh-adapter/compat/persistence.d.ts.map +1 -1
- package/lib/types/dsh-adapter/compat/persistence.js +9 -14
- package/lib/types/dsh-adapter/compat/sessionLog.d.ts +10 -144
- package/lib/types/dsh-adapter/compat/sessionLog.d.ts.map +1 -1
- package/lib/types/dsh-adapter/compat/sessionLog.js +45 -275
- package/lib/types/dsh-adapter/compat/settings.d.ts +4 -10
- package/lib/types/dsh-adapter/compat/settings.d.ts.map +1 -1
- package/lib/types/dsh-adapter/compat/settings.js +6 -23
- package/lib/types/dsh-adapter/compat/shell.d.ts +2 -3
- package/lib/types/dsh-adapter/compat/shell.d.ts.map +1 -1
- package/lib/types/dsh-adapter/compat/shell.js +2 -7
- package/lib/types/dsh-adapter/contract.d.ts +4 -34
- package/lib/types/dsh-adapter/contract.d.ts.map +1 -1
- package/lib/types/dsh-adapter/contract.js +8 -83
- package/lib/types/dsh-adapter/packaged-presets.d.ts +0 -19
- package/lib/types/dsh-adapter/packaged-presets.d.ts.map +1 -1
- package/lib/types/dsh-adapter/packaged-presets.js +1 -83
- package/lib/types/dsh-adapter/plugin.d.ts.map +1 -1
- package/lib/types/dsh-adapter/plugin.js +25 -168
- package/lib/types/dsh-adapter/preset-resolution.d.ts +1 -22
- package/lib/types/dsh-adapter/preset-resolution.d.ts.map +1 -1
- package/lib/types/dsh-adapter/preset-resolution.js +0 -34
- package/lib/types/dsh-adapter/presets.d.ts +1 -4
- package/lib/types/dsh-adapter/presets.d.ts.map +1 -1
- package/lib/types/dsh-adapter/presets.js +3 -6
- package/lib/types/dsh-adapter/questions-answerer.d.ts +5 -43
- package/lib/types/dsh-adapter/questions-answerer.d.ts.map +1 -1
- package/lib/types/dsh-adapter/questions-answerer.js +7 -63
- package/lib/types/dsh-adapter/sessionTree.d.ts +0 -19
- package/lib/types/dsh-adapter/sessionTree.d.ts.map +1 -1
- package/lib/types/dsh-adapter/sessionTree.js +2 -112
- package/lib/types/dsh-adapter/sessions/header.d.ts +2 -2
- package/lib/types/dsh-adapter/sessions/header.d.ts.map +1 -1
- package/lib/types/dsh-adapter/sessions/header.js +2 -8
- package/lib/types/dsh-adapter/sessions/list.d.ts +7 -28
- package/lib/types/dsh-adapter/sessions/list.d.ts.map +1 -1
- package/lib/types/dsh-adapter/sessions/list.js +48 -103
- package/lib/types/dsh-adapter/sessions/store.d.ts +1 -2
- package/lib/types/dsh-adapter/sessions/store.d.ts.map +1 -1
- package/lib/types/dsh-adapter/sessions/store.js +7 -10
- package/lib/types/dsh-adapter/sharp.d.ts.map +1 -1
- package/lib/types/dsh-adapter/sharp.js +0 -1
- package/lib/types/dsh-adapter/subagents.d.ts +1 -2
- package/lib/types/dsh-adapter/subagents.d.ts.map +1 -1
- package/lib/types/dsh-adapter/subagents.js +1 -12
- package/lib/types/dsh-adapter/trajectory/aggregate.d.ts +1 -1
- package/lib/types/dsh-adapter/trajectory/aggregate.js +1 -1
- package/lib/types/dsh-adapter/trajectory/guards.d.ts +5 -22
- package/lib/types/dsh-adapter/trajectory/guards.d.ts.map +1 -1
- package/lib/types/dsh-adapter/trajectory/guards.js +5 -23
- package/lib/types/dsh-adapter/trajectory/projection.d.ts +5 -21
- package/lib/types/dsh-adapter/trajectory/projection.d.ts.map +1 -1
- package/lib/types/dsh-adapter/trajectory/projection.js +4 -38
- package/lib/types/dsh-adapter/trajectory/types.d.ts +1 -1
- package/lib/types/dsh-adapter/trajectory/types.d.ts.map +1 -1
- package/lib/types/i18n.d.ts +2 -22
- package/lib/types/i18n.d.ts.map +1 -1
- package/lib/types/i18n.js +2 -10
- package/lib/types/presetPrefs.d.ts +1 -3
- package/lib/types/presetPrefs.d.ts.map +1 -1
- package/lib/types/presetPrefs.js +2 -4
- package/node_modules/@askdkc/dsh-auth/README.ja.md +28 -3
- package/node_modules/@askdkc/dsh-auth/README.md +19 -3
- package/node_modules/@askdkc/dsh-auth/dsh-plugin.json +3 -3
- package/node_modules/@askdkc/dsh-auth/lib/THIRD_PARTY_NOTICES.txt +168 -0
- package/node_modules/@askdkc/dsh-auth/lib/abortable.d.ts +2 -0
- package/node_modules/@askdkc/dsh-auth/lib/abortable.js +9 -0
- package/node_modules/@askdkc/dsh-auth/lib/auth-contract.d.ts +66 -0
- package/node_modules/@askdkc/dsh-auth/lib/auth-contract.js +1 -0
- package/node_modules/@askdkc/dsh-auth/lib/command.js +15 -1
- package/node_modules/@askdkc/dsh-auth/lib/credentials.d.ts +8 -14
- package/node_modules/@askdkc/dsh-auth/lib/credentials.js +1 -1
- package/node_modules/@askdkc/dsh-auth/lib/index.d.ts +8 -27
- package/node_modules/@askdkc/dsh-auth/lib/index.js +67 -64
- package/node_modules/@askdkc/dsh-auth/lib/interaction.d.ts +5 -5
- package/node_modules/@askdkc/dsh-auth/lib/opencode-adapter.d.ts +37 -0
- package/node_modules/@askdkc/dsh-auth/lib/opencode-adapter.js +197 -0
- package/node_modules/@askdkc/dsh-auth/lib/opencode-catalog.d.ts +72 -0
- package/node_modules/@askdkc/dsh-auth/lib/opencode-catalog.js +252 -0
- package/node_modules/@askdkc/dsh-auth/lib/opencode-codec.d.ts +6 -0
- package/node_modules/@askdkc/dsh-auth/lib/opencode-codec.js +93 -0
- package/node_modules/@askdkc/dsh-auth/lib/opencode-owned.generated.d.ts +113 -0
- package/node_modules/@askdkc/dsh-auth/lib/opencode-owned.generated.js +2866 -0
- package/node_modules/@askdkc/dsh-auth/lib/opencode-replay.d.ts +15 -0
- package/node_modules/@askdkc/dsh-auth/lib/opencode-replay.js +141 -0
- package/node_modules/@askdkc/dsh-auth/lib/opencode-sdk.d.ts +5 -0
- package/node_modules/@askdkc/dsh-auth/lib/opencode-sdk.js +43465 -0
- package/node_modules/@askdkc/dsh-auth/lib/opencode-sdk.js.map +7 -0
- package/node_modules/@askdkc/dsh-auth/lib/opencode-transport.d.ts +5 -0
- package/node_modules/@askdkc/dsh-auth/lib/opencode-transport.js +69 -0
- package/node_modules/@askdkc/dsh-auth/lib/pi-ai.d.ts +2 -1
- package/node_modules/@askdkc/dsh-auth/lib/pi-ai.js +2 -1
- package/node_modules/@askdkc/dsh-auth/lib/pi-routes.d.ts +32 -0
- package/node_modules/@askdkc/dsh-auth/lib/pi-routes.js +45 -0
- package/node_modules/@askdkc/dsh-auth/lib/profiles.d.ts +2 -20
- package/node_modules/@askdkc/dsh-auth/lib/profiles.js +6 -35
- package/node_modules/@askdkc/dsh-auth/lib/routes.d.ts +20 -0
- package/node_modules/@askdkc/dsh-auth/lib/routes.js +13 -0
- package/node_modules/@askdkc/dsh-auth/lib/service.d.ts +11 -2
- package/node_modules/@askdkc/dsh-auth/lib/service.js +26 -16
- package/node_modules/@askdkc/dsh-auth/package.json +26 -14
- package/package.json +100 -96
- package/lib/types/dsh-adapter/providerGuard.d.ts +0 -75
- package/lib/types/dsh-adapter/providerGuard.d.ts.map +0 -1
- package/lib/types/dsh-adapter/providerGuard.js +0 -104
- package/lib/types/migrationPrefs.d.ts +0 -60
- package/lib/types/migrationPrefs.d.ts.map +0 -1
- package/lib/types/migrationPrefs.js +0 -97
- package/presets/liangshen/.dsh-tui-managed.json +0 -5
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/** Versioned history projection. Durable DSH blocks remain authoritative. */
|
|
2
|
+
import { type ContentBlock } from '@deepseek-ai/dsh-llm';
|
|
3
|
+
import type { SharedV4ProviderOptions } from '@ai-sdk/provider';
|
|
4
|
+
import type { OpenCodeModel } from './opencode-catalog.js';
|
|
5
|
+
export declare function record(value: unknown): Record<string, unknown> | undefined;
|
|
6
|
+
export declare function mergeMetadata(previous: SharedV4ProviderOptions | undefined, next: SharedV4ProviderOptions): SharedV4ProviderOptions;
|
|
7
|
+
export interface ReplayProjection {
|
|
8
|
+
blocks: (SharedV4ProviderOptions | undefined)[];
|
|
9
|
+
callIds: Map<string, string>;
|
|
10
|
+
trusted: boolean;
|
|
11
|
+
}
|
|
12
|
+
/** Validate the entire aligned envelope before restoring any signature or item id. */
|
|
13
|
+
export declare function projectReplay(source: unknown, content: readonly ContentBlock[], model: OpenCodeModel, route: string, warn?: (reason: string) => void): ReplayProjection;
|
|
14
|
+
/** Mandatory signatures cannot be replaced by SDK sentinel values or silently omitted. */
|
|
15
|
+
export declare function requireReplaySignature(block: ContentBlock, protocol: OpenCodeModel['protocol'], options: SharedV4ProviderOptions | undefined): void;
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/** Versioned history projection. Durable DSH blocks remain authoritative. */
|
|
2
|
+
import { LlmError } from '@deepseek-ai/dsh-llm';
|
|
3
|
+
export function record(value) {
|
|
4
|
+
return value && typeof value === 'object' && !Array.isArray(value) ? value : undefined;
|
|
5
|
+
}
|
|
6
|
+
export function mergeMetadata(previous, next) {
|
|
7
|
+
const merged = { ...previous };
|
|
8
|
+
for (const [provider, value] of Object.entries(next))
|
|
9
|
+
merged[provider] = { ...merged[provider], ...value };
|
|
10
|
+
return merged;
|
|
11
|
+
}
|
|
12
|
+
/** One Responses item can emit multiple summary blocks before its encrypted
|
|
13
|
+
* payload arrives. Share that payload only among blocks of the same item. */
|
|
14
|
+
function completeResponseSignatures(blocks, content) {
|
|
15
|
+
const encrypted = new Map();
|
|
16
|
+
for (const [index, options] of blocks.entries()) {
|
|
17
|
+
if (content[index]?.type !== 'reasoning')
|
|
18
|
+
continue;
|
|
19
|
+
const item = options?.openai;
|
|
20
|
+
if (typeof item?.itemId !== 'string' || typeof item.reasoningEncryptedContent !== 'string' || !item.reasoningEncryptedContent)
|
|
21
|
+
continue;
|
|
22
|
+
const previous = encrypted.get(item.itemId);
|
|
23
|
+
if (previous !== undefined && previous !== item.reasoningEncryptedContent)
|
|
24
|
+
throw new Error('conflicting reasoning payloads for one response item');
|
|
25
|
+
encrypted.set(item.itemId, item.reasoningEncryptedContent);
|
|
26
|
+
}
|
|
27
|
+
for (const [index, options] of blocks.entries()) {
|
|
28
|
+
const id = options?.openai?.itemId;
|
|
29
|
+
if (content[index]?.type === 'reasoning' && typeof id === 'string' && encrypted.has(id))
|
|
30
|
+
blocks[index] = mergeMetadata(options, { openai: { reasoningEncryptedContent: encrypted.get(id) } });
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
const APIS = { messages: 'anthropic-messages', responses: 'openai-responses', chat: 'openai-completions', google: 'google-generative-ai' };
|
|
34
|
+
/** Validate the entire aligned envelope before restoring any signature or item id. */
|
|
35
|
+
export function projectReplay(source, content, model, route, warn) {
|
|
36
|
+
const empty = () => ({ blocks: content.map(() => undefined), callIds: new Map(), trusted: false });
|
|
37
|
+
const message = record(source);
|
|
38
|
+
const envelope = record(message?.replayState);
|
|
39
|
+
if (!envelope) {
|
|
40
|
+
if (message?.replayState !== undefined)
|
|
41
|
+
warn?.('OpenCode history: malformed replay envelope; retaining message content');
|
|
42
|
+
return empty();
|
|
43
|
+
}
|
|
44
|
+
try {
|
|
45
|
+
const response = record(envelope.response);
|
|
46
|
+
if (!response || response.provider !== message?.provider || response.model !== message?.model)
|
|
47
|
+
throw new Error('replay identity does not match its message');
|
|
48
|
+
if (message?.provider !== route || message?.model !== model.id)
|
|
49
|
+
throw new Error('replay belongs to another route or model');
|
|
50
|
+
const owned = response.kind === 'dsh-opencode' && response.version === 1 && response.protocol === model.protocol;
|
|
51
|
+
const pi = response.kind === 'pi-ai' && response.version === 2 && response.api === APIS[model.protocol];
|
|
52
|
+
if (pi && !['stop', 'length', 'toolUse', 'error', 'aborted'].includes(String(response.stopReason)))
|
|
53
|
+
throw new Error('invalid pi replay stop reason');
|
|
54
|
+
if (!owned && !pi)
|
|
55
|
+
throw new Error('unsupported replay kind, version or protocol');
|
|
56
|
+
if (response.responseId !== undefined && (typeof response.responseId !== 'string' || !response.responseId))
|
|
57
|
+
throw new Error('invalid response id');
|
|
58
|
+
if (!Array.isArray(envelope.blocks) || envelope.blocks.length !== content.length)
|
|
59
|
+
throw new Error('replay block count mismatch');
|
|
60
|
+
const callIds = new Map();
|
|
61
|
+
const ids = new Set();
|
|
62
|
+
const wireIds = new Set();
|
|
63
|
+
const blocks = content.map((block, index) => {
|
|
64
|
+
const entry = record(envelope.blocks[index]);
|
|
65
|
+
if (!entry || entry.type !== block.type)
|
|
66
|
+
throw new Error('replay block type mismatch');
|
|
67
|
+
if (block.type === 'tool-call') {
|
|
68
|
+
if (!block.id || ids.has(block.id))
|
|
69
|
+
throw new Error('duplicate or empty tool call id');
|
|
70
|
+
ids.add(block.id);
|
|
71
|
+
}
|
|
72
|
+
if (owned) {
|
|
73
|
+
if (entry.providerOptions === undefined)
|
|
74
|
+
return undefined;
|
|
75
|
+
const options = record(entry.providerOptions);
|
|
76
|
+
if (!options || Object.values(options).some(value => !record(value)))
|
|
77
|
+
throw new Error('invalid provider replay options');
|
|
78
|
+
return structuredClone(options);
|
|
79
|
+
}
|
|
80
|
+
for (const key of ['thinkingSignature', 'thoughtSignature', 'textSignature'])
|
|
81
|
+
if (entry[key] !== undefined && typeof entry[key] !== 'string')
|
|
82
|
+
throw new Error('invalid replay signature');
|
|
83
|
+
if (model.protocol === 'messages' && block.type === 'reasoning') {
|
|
84
|
+
if (entry.redacted === true && typeof entry.thinkingSignature === 'string')
|
|
85
|
+
return { anthropic: { redactedData: entry.thinkingSignature } };
|
|
86
|
+
if (typeof entry.thinkingSignature === 'string' && entry.thinkingSignature)
|
|
87
|
+
return { anthropic: { signature: entry.thinkingSignature } };
|
|
88
|
+
}
|
|
89
|
+
if (model.protocol === 'google') {
|
|
90
|
+
const signature = entry.thoughtSignature ?? entry.thinkingSignature ?? entry.textSignature;
|
|
91
|
+
if (typeof signature === 'string' && signature)
|
|
92
|
+
return { google: { thoughtSignature: signature } };
|
|
93
|
+
}
|
|
94
|
+
if (model.protocol === 'responses') {
|
|
95
|
+
if (block.type === 'reasoning' && typeof entry.thinkingSignature === 'string') {
|
|
96
|
+
const item = record(JSON.parse(entry.thinkingSignature));
|
|
97
|
+
if (item?.type !== 'reasoning' || typeof item.id !== 'string' || typeof item.encrypted_content !== 'string' || !item.encrypted_content)
|
|
98
|
+
throw new Error('Responses reasoning has no restorable encrypted payload');
|
|
99
|
+
return { openai: { itemId: item.id, reasoningEncryptedContent: item.encrypted_content } };
|
|
100
|
+
}
|
|
101
|
+
if (block.type === 'text' && typeof entry.textSignature === 'string') {
|
|
102
|
+
if (!entry.textSignature.startsWith('{'))
|
|
103
|
+
return { openai: { itemId: entry.textSignature } };
|
|
104
|
+
const signature = record(JSON.parse(entry.textSignature));
|
|
105
|
+
if (signature?.v !== 1 || typeof signature.id !== 'string')
|
|
106
|
+
throw new Error('unknown Responses text signature');
|
|
107
|
+
return { openai: { itemId: signature.id, ...(signature.phase === 'commentary' || signature.phase === 'final_answer' ? { phase: signature.phase } : {}) } };
|
|
108
|
+
}
|
|
109
|
+
if (block.type === 'tool-call') {
|
|
110
|
+
const pieces = block.id.split('|');
|
|
111
|
+
if (pieces.length > 2 || !pieces[0] || (pieces.length === 2 && !pieces[1]))
|
|
112
|
+
throw new Error('invalid Responses tool call pairing');
|
|
113
|
+
if (wireIds.has(pieces[0]))
|
|
114
|
+
throw new Error('duplicate Responses wire call id');
|
|
115
|
+
wireIds.add(pieces[0]);
|
|
116
|
+
callIds.set(block.id, pieces[0]);
|
|
117
|
+
if (pieces[1])
|
|
118
|
+
return { openai: { itemId: pieces[1] } };
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return undefined;
|
|
122
|
+
});
|
|
123
|
+
if (model.protocol === 'responses')
|
|
124
|
+
completeResponseSignatures(blocks, content);
|
|
125
|
+
return { blocks, callIds, trusted: true };
|
|
126
|
+
}
|
|
127
|
+
catch (error) {
|
|
128
|
+
warn?.(`OpenCode history: ${error instanceof Error ? error.message : 'invalid replay'}; retaining message content`);
|
|
129
|
+
return empty();
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
/** Mandatory signatures cannot be replaced by SDK sentinel values or silently omitted. */
|
|
133
|
+
export function requireReplaySignature(block, protocol, options) {
|
|
134
|
+
if (block.type !== 'reasoning')
|
|
135
|
+
return;
|
|
136
|
+
const native = options?.[protocol === 'messages' ? 'anthropic' : 'openai'];
|
|
137
|
+
if (protocol === 'messages' && !native?.signature && !native?.redactedData)
|
|
138
|
+
throw new LlmError('Cannot replay Anthropic reasoning without its verified signature', 'INVALID_REPLAY_STATE');
|
|
139
|
+
if (protocol === 'responses' && !native?.reasoningEncryptedContent)
|
|
140
|
+
throw new LlmError('Cannot replay Responses reasoning without its verified encrypted payload', 'INVALID_REPLAY_STATE');
|
|
141
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** This module is bundled at build time; runtime never resolves a host SDK. */
|
|
2
|
+
export { createAnthropic } from '@ai-sdk/anthropic';
|
|
3
|
+
export { createOpenAI } from '@ai-sdk/openai';
|
|
4
|
+
export { createOpenAICompatible } from '@ai-sdk/openai-compatible';
|
|
5
|
+
export { createGoogleGenerativeAI } from '@ai-sdk/google';
|