@tanstack/ai-bedrock 0.0.1

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.
Files changed (64) hide show
  1. package/README.md +95 -0
  2. package/dist/esm/adapters/converse-text.d.ts +93 -0
  3. package/dist/esm/adapters/converse-text.js +430 -0
  4. package/dist/esm/adapters/converse-text.js.map +1 -0
  5. package/dist/esm/adapters/responses-text.d.ts +23 -0
  6. package/dist/esm/adapters/responses-text.js +22 -0
  7. package/dist/esm/adapters/responses-text.js.map +1 -0
  8. package/dist/esm/adapters/text.d.ts +30 -0
  9. package/dist/esm/adapters/text.js +38 -0
  10. package/dist/esm/adapters/text.js.map +1 -0
  11. package/dist/esm/converse/message-converter.d.ts +14 -0
  12. package/dist/esm/converse/message-converter.js +181 -0
  13. package/dist/esm/converse/message-converter.js.map +1 -0
  14. package/dist/esm/converse/provider-options.d.ts +19 -0
  15. package/dist/esm/converse/stream-processor.d.ts +46 -0
  16. package/dist/esm/converse/stream-processor.js +203 -0
  17. package/dist/esm/converse/stream-processor.js.map +1 -0
  18. package/dist/esm/converse/structured-output.d.ts +8 -0
  19. package/dist/esm/converse/structured-output.js +20 -0
  20. package/dist/esm/converse/structured-output.js.map +1 -0
  21. package/dist/esm/converse/tool-converter.d.ts +11 -0
  22. package/dist/esm/converse/tool-converter.js +21 -0
  23. package/dist/esm/converse/tool-converter.js.map +1 -0
  24. package/dist/esm/index.d.ts +29 -0
  25. package/dist/esm/index.js +62 -0
  26. package/dist/esm/index.js.map +1 -0
  27. package/dist/esm/message-types.d.ts +25 -0
  28. package/dist/esm/model-catalog.generated.d.ts +127 -0
  29. package/dist/esm/model-catalog.generated.js +90 -0
  30. package/dist/esm/model-catalog.generated.js.map +1 -0
  31. package/dist/esm/model-meta.d.ts +38 -0
  32. package/dist/esm/model-meta.js +14 -0
  33. package/dist/esm/model-meta.js.map +1 -0
  34. package/dist/esm/text/responses-provider-options.d.ts +29 -0
  35. package/dist/esm/text/text-provider-options.d.ts +36 -0
  36. package/dist/esm/utils/auth.d.ts +20 -0
  37. package/dist/esm/utils/auth.js +49 -0
  38. package/dist/esm/utils/auth.js.map +1 -0
  39. package/dist/esm/utils/client.d.ts +19 -0
  40. package/dist/esm/utils/client.js +35 -0
  41. package/dist/esm/utils/client.js.map +1 -0
  42. package/dist/esm/utils/index.d.ts +1 -0
  43. package/dist/esm/utils/openai-sigv4-fetch.d.ts +10 -0
  44. package/dist/esm/utils/openai-sigv4-fetch.js +35 -0
  45. package/dist/esm/utils/openai-sigv4-fetch.js.map +1 -0
  46. package/package.json +67 -0
  47. package/src/adapters/converse-text.ts +603 -0
  48. package/src/adapters/responses-text.ts +73 -0
  49. package/src/adapters/text.ts +97 -0
  50. package/src/converse/message-converter.ts +268 -0
  51. package/src/converse/provider-options.ts +19 -0
  52. package/src/converse/stream-processor.ts +309 -0
  53. package/src/converse/structured-output.ts +24 -0
  54. package/src/converse/tool-converter.ts +49 -0
  55. package/src/index.ts +190 -0
  56. package/src/message-types.ts +24 -0
  57. package/src/model-catalog.generated.ts +88 -0
  58. package/src/model-meta.ts +69 -0
  59. package/src/text/responses-provider-options.ts +28 -0
  60. package/src/text/text-provider-options.ts +33 -0
  61. package/src/utils/auth.ts +80 -0
  62. package/src/utils/client.ts +62 -0
  63. package/src/utils/index.ts +7 -0
  64. package/src/utils/openai-sigv4-fetch.ts +55 -0
@@ -0,0 +1,203 @@
1
+ import { EventType } from "@tanstack/ai";
2
+ function throwIfConverseStreamError(ev) {
3
+ if ("internalServerException" in ev && ev.internalServerException) {
4
+ throw ev.internalServerException;
5
+ }
6
+ if ("modelStreamErrorException" in ev && ev.modelStreamErrorException) {
7
+ throw ev.modelStreamErrorException;
8
+ }
9
+ if ("validationException" in ev && ev.validationException) {
10
+ throw ev.validationException;
11
+ }
12
+ if ("throttlingException" in ev && ev.throttlingException) {
13
+ throw ev.throttlingException;
14
+ }
15
+ if ("serviceUnavailableException" in ev && ev.serviceUnavailableException) {
16
+ throw ev.serviceUnavailableException;
17
+ }
18
+ }
19
+ async function* processConverseStream(stream, newMessageId, lifecycle = {}) {
20
+ const runId = newMessageId();
21
+ const threadId = lifecycle.threadId ?? newMessageId();
22
+ const { parentRunId, model } = lifecycle;
23
+ const messageId = newMessageId();
24
+ let hasEmittedRunStarted = false;
25
+ let accumulatedContent = "";
26
+ let hasEmittedTextMessageStart = false;
27
+ let reasoningMessageId;
28
+ let hasClosedReasoning = false;
29
+ const toolCallsByIndex = /* @__PURE__ */ new Map();
30
+ let usage;
31
+ let finishReason;
32
+ function* ensureRunStarted() {
33
+ if (hasEmittedRunStarted) return;
34
+ hasEmittedRunStarted = true;
35
+ yield {
36
+ type: EventType.RUN_STARTED,
37
+ runId,
38
+ threadId,
39
+ parentRunId,
40
+ ...model && { model },
41
+ timestamp: Date.now()
42
+ };
43
+ }
44
+ function* closeReasoning() {
45
+ if (reasoningMessageId && !hasClosedReasoning) {
46
+ hasClosedReasoning = true;
47
+ yield {
48
+ type: EventType.REASONING_MESSAGE_END,
49
+ messageId: reasoningMessageId,
50
+ timestamp: Date.now()
51
+ };
52
+ }
53
+ }
54
+ for await (const ev of stream) {
55
+ yield* ensureRunStarted();
56
+ throwIfConverseStreamError(ev);
57
+ if ("messageStart" in ev) continue;
58
+ if ("contentBlockStart" in ev) {
59
+ const start = ev.contentBlockStart;
60
+ const toolUse = start?.start?.toolUse;
61
+ if (start && toolUse) {
62
+ yield* closeReasoning();
63
+ const id = toolUse.toolUseId ?? newMessageId();
64
+ const name = toolUse.name ?? "";
65
+ const index = start.contentBlockIndex ?? 0;
66
+ toolCallsByIndex.set(index, {
67
+ id,
68
+ name,
69
+ started: true
70
+ });
71
+ yield {
72
+ type: EventType.TOOL_CALL_START,
73
+ toolCallId: id,
74
+ toolCallName: name,
75
+ toolName: name,
76
+ timestamp: Date.now(),
77
+ index
78
+ };
79
+ }
80
+ continue;
81
+ }
82
+ if ("contentBlockDelta" in ev) {
83
+ const block = ev.contentBlockDelta;
84
+ const delta = block?.delta;
85
+ const index = block?.contentBlockIndex ?? 0;
86
+ if (delta && "toolUse" in delta && delta.toolUse?.input !== void 0) {
87
+ const toolCall = toolCallsByIndex.get(index);
88
+ if (toolCall?.started) {
89
+ yield {
90
+ type: EventType.TOOL_CALL_ARGS,
91
+ toolCallId: toolCall.id,
92
+ timestamp: Date.now(),
93
+ delta: delta.toolUse.input
94
+ };
95
+ }
96
+ continue;
97
+ }
98
+ if (delta && "reasoningContent" in delta && delta.reasoningContent && "text" in delta.reasoningContent && delta.reasoningContent.text !== void 0) {
99
+ if (!reasoningMessageId) {
100
+ reasoningMessageId = newMessageId();
101
+ yield {
102
+ type: EventType.REASONING_MESSAGE_START,
103
+ messageId: reasoningMessageId,
104
+ role: "reasoning",
105
+ timestamp: Date.now()
106
+ };
107
+ }
108
+ yield {
109
+ type: EventType.REASONING_MESSAGE_CONTENT,
110
+ messageId: reasoningMessageId,
111
+ delta: delta.reasoningContent.text,
112
+ timestamp: Date.now()
113
+ };
114
+ continue;
115
+ }
116
+ if (delta && "text" in delta && delta.text !== void 0) {
117
+ yield* closeReasoning();
118
+ if (!hasEmittedTextMessageStart) {
119
+ hasEmittedTextMessageStart = true;
120
+ yield {
121
+ type: EventType.TEXT_MESSAGE_START,
122
+ messageId,
123
+ role: "assistant",
124
+ timestamp: Date.now()
125
+ };
126
+ }
127
+ accumulatedContent += delta.text;
128
+ yield {
129
+ type: EventType.TEXT_MESSAGE_CONTENT,
130
+ messageId,
131
+ delta: delta.text,
132
+ content: accumulatedContent,
133
+ timestamp: Date.now()
134
+ };
135
+ }
136
+ continue;
137
+ }
138
+ if ("contentBlockStop" in ev) {
139
+ const stopIndex = ev.contentBlockStop?.contentBlockIndex ?? 0;
140
+ const toolCall = toolCallsByIndex.get(stopIndex);
141
+ if (toolCall?.started) {
142
+ yield {
143
+ type: EventType.TOOL_CALL_END,
144
+ toolCallId: toolCall.id,
145
+ toolCallName: toolCall.name,
146
+ toolName: toolCall.name,
147
+ timestamp: Date.now()
148
+ };
149
+ toolCallsByIndex.delete(stopIndex);
150
+ }
151
+ continue;
152
+ }
153
+ if ("messageStop" in ev) {
154
+ const stopReason = ev.messageStop?.stopReason;
155
+ finishReason = stopReason === "tool_use" ? "tool_calls" : stopReason === "max_tokens" ? "length" : stopReason === "content_filtered" ? "content_filter" : "stop";
156
+ continue;
157
+ }
158
+ if ("metadata" in ev) {
159
+ const u = ev.metadata?.usage;
160
+ if (u) {
161
+ usage = {
162
+ promptTokens: u.inputTokens ?? 0,
163
+ completionTokens: u.outputTokens ?? 0,
164
+ totalTokens: u.totalTokens ?? 0
165
+ };
166
+ }
167
+ continue;
168
+ }
169
+ }
170
+ yield* ensureRunStarted();
171
+ for (const [index, toolCall] of toolCallsByIndex) {
172
+ if (!toolCall.started) continue;
173
+ yield {
174
+ type: EventType.TOOL_CALL_END,
175
+ toolCallId: toolCall.id,
176
+ toolCallName: toolCall.name,
177
+ toolName: toolCall.name,
178
+ timestamp: Date.now()
179
+ };
180
+ toolCallsByIndex.delete(index);
181
+ }
182
+ if (hasEmittedTextMessageStart) {
183
+ yield {
184
+ type: EventType.TEXT_MESSAGE_END,
185
+ messageId,
186
+ timestamp: Date.now()
187
+ };
188
+ }
189
+ yield* closeReasoning();
190
+ yield {
191
+ type: EventType.RUN_FINISHED,
192
+ runId,
193
+ threadId,
194
+ timestamp: Date.now(),
195
+ finishReason: finishReason ?? "stop",
196
+ ...usage && { usage }
197
+ };
198
+ }
199
+ export {
200
+ processConverseStream,
201
+ throwIfConverseStreamError
202
+ };
203
+ //# sourceMappingURL=stream-processor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream-processor.js","sources":["../../../src/converse/stream-processor.ts"],"sourcesContent":["import { EventType } from '@tanstack/ai'\nimport type { RunFinishedEvent, StreamChunk } from '@tanstack/ai'\nimport type { ConverseStreamOutput } from '@aws-sdk/client-bedrock-runtime'\n\n/**\n * Converse delivers server-side failures — throttling, request validation,\n * mid-stream model faults, and service-unavailable — as in-band stream events\n * rather than thrown exceptions. If they were ignored the iterator would simply\n * end and the run would look like a clean, truncated success. Throw the\n * underlying exception (these SDK members extend `Error`) so the adapter's\n * `chatStream` / `structuredOutputStream` catch converts it into a `RUN_ERROR`.\n */\nexport function throwIfConverseStreamError(ev: ConverseStreamOutput): void {\n if ('internalServerException' in ev && ev.internalServerException) {\n throw ev.internalServerException\n }\n if ('modelStreamErrorException' in ev && ev.modelStreamErrorException) {\n throw ev.modelStreamErrorException\n }\n if ('validationException' in ev && ev.validationException) {\n throw ev.validationException\n }\n if ('throttlingException' in ev && ev.throttlingException) {\n throw ev.throttlingException\n }\n if ('serviceUnavailableException' in ev && ev.serviceUnavailableException) {\n throw ev.serviceUnavailableException\n }\n}\n\n/**\n * Maps a Bedrock Converse `ConverseStreamOutput` event stream to the TanStack\n * AG-UI `StreamChunk` lifecycle, following `openai-base`'s `processStreamChunks`\n * lifecycle shape so the activity layer / agent loop behave identically across\n * providers. (Reasoning surfaces only the message-level events —\n * `REASONING_MESSAGE_START/CONTENT/END` — which is all the core accumulator\n * consumes; the `REASONING_START`/`REASONING_END`/`STEP_*` boundary events\n * openai-base also emits are no-ops in the engine and are not reproduced here.)\n *\n * Lifecycle ownership matches openai-base: this processor emits the full\n * success-path lifecycle itself — `RUN_STARTED` lazily before the first event,\n * `TEXT_MESSAGE_*` / `TOOL_CALL_*` / `REASONING_MESSAGE_*` for content, and a\n * single terminal `RUN_FINISHED` once the iterator is exhausted (so the trailing\n * `metadata` usage event is folded into the finish event regardless of arrival\n * order). The calling adapter only owns the catch/`RUN_ERROR` path — so any\n * in-band Converse error event (see `throwIfConverseStreamError`) is thrown to\n * surface there rather than ending the stream as a clean truncated success.\n *\n * Converse streams tool-call arguments as partial-JSON string fragments inside\n * `contentBlockDelta.delta.toolUse.input`; each fragment is emitted as a\n * `TOOL_CALL_ARGS` `delta`, mirroring OpenAI's `function.arguments` deltas.\n *\n * @param stream - The Converse event stream from `ConverseStreamCommand`.\n * @param newMessageId - Factory for fresh ids — run, thread, message, and\n * tool-call ids (the adapter passes `() => this.generateId()`).\n * @param lifecycle - Incoming run lifecycle ids, threaded onto the emitted\n * `RUN_STARTED`/`RUN_FINISHED` so the chat path matches every sibling adapter\n * (openai-base reuses `options.threadId`/`parentRunId`). Defaults preserve the\n * previous behaviour (fresh `threadId`, no `parentRunId`).\n */\nexport async function* processConverseStream(\n stream: AsyncIterable<ConverseStreamOutput>,\n newMessageId: () => string,\n lifecycle: { threadId?: string; parentRunId?: string; model?: string } = {},\n): AsyncIterable<StreamChunk> {\n const runId = newMessageId()\n const threadId = lifecycle.threadId ?? newMessageId()\n const { parentRunId, model } = lifecycle\n const messageId = newMessageId()\n\n let hasEmittedRunStarted = false\n\n // Text lifecycle\n let accumulatedContent = ''\n let hasEmittedTextMessageStart = false\n\n // Reasoning lifecycle\n let reasoningMessageId: string | undefined\n let hasClosedReasoning = false\n\n // Tool-call lifecycle, keyed by Converse contentBlockIndex. Converse opens a\n // tool-use block with `contentBlockStart`, streams arg fragments via\n // `contentBlockDelta`, and closes it with `contentBlockStop`.\n const toolCallsByIndex = new Map<\n number,\n { id: string; name: string; started: boolean }\n >()\n\n // Usage + finish-reason are captured during iteration and folded into the\n // single terminal RUN_FINISHED, matching openai-base's deferred-finish\n // contract (usage may arrive after the finish signal).\n let usage:\n | { promptTokens: number; completionTokens: number; totalTokens: number }\n | undefined\n let finishReason: NonNullable<RunFinishedEvent['finishReason']> | undefined\n\n // Lazily emit RUN_STARTED exactly once, before the first content event.\n function* ensureRunStarted(): Generator<StreamChunk> {\n if (hasEmittedRunStarted) return\n hasEmittedRunStarted = true\n yield {\n type: EventType.RUN_STARTED,\n runId,\n threadId,\n parentRunId,\n ...(model && { model }),\n timestamp: Date.now(),\n }\n }\n\n // Close an open reasoning message before text/tool content begins, mirroring\n // openai-base which always emits REASONING_MESSAGE_END before TEXT_MESSAGE_START.\n function* closeReasoning(): Generator<StreamChunk> {\n if (reasoningMessageId && !hasClosedReasoning) {\n hasClosedReasoning = true\n yield {\n type: EventType.REASONING_MESSAGE_END,\n messageId: reasoningMessageId,\n timestamp: Date.now(),\n }\n }\n }\n\n for await (const ev of stream) {\n yield* ensureRunStarted()\n\n // Surface in-band server/throttle/validation errors instead of dropping them.\n throwIfConverseStreamError(ev)\n\n // messageStart carries only the role; no AG-UI event maps to it.\n if ('messageStart' in ev) continue\n\n if ('contentBlockStart' in ev) {\n const start = ev.contentBlockStart\n const toolUse = start?.start?.toolUse\n if (start && toolUse) {\n yield* closeReasoning()\n const id = toolUse.toolUseId ?? newMessageId()\n const name = toolUse.name ?? ''\n const index = start.contentBlockIndex ?? 0\n toolCallsByIndex.set(index, {\n id,\n name,\n started: true,\n })\n yield {\n type: EventType.TOOL_CALL_START,\n toolCallId: id,\n toolCallName: name,\n toolName: name,\n timestamp: Date.now(),\n index,\n }\n }\n continue\n }\n\n if ('contentBlockDelta' in ev) {\n const block = ev.contentBlockDelta\n const delta = block?.delta\n const index = block?.contentBlockIndex ?? 0\n\n // Tool-call argument fragments (partial JSON).\n if (delta && 'toolUse' in delta && delta.toolUse?.input !== undefined) {\n const toolCall = toolCallsByIndex.get(index)\n if (toolCall?.started) {\n yield {\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: toolCall.id,\n timestamp: Date.now(),\n delta: delta.toolUse.input,\n }\n }\n continue\n }\n\n // Reasoning content.\n if (\n delta &&\n 'reasoningContent' in delta &&\n delta.reasoningContent &&\n 'text' in delta.reasoningContent &&\n delta.reasoningContent.text !== undefined\n ) {\n if (!reasoningMessageId) {\n reasoningMessageId = newMessageId()\n yield {\n type: EventType.REASONING_MESSAGE_START,\n messageId: reasoningMessageId,\n role: 'reasoning',\n timestamp: Date.now(),\n }\n }\n yield {\n type: EventType.REASONING_MESSAGE_CONTENT,\n messageId: reasoningMessageId,\n delta: delta.reasoningContent.text,\n timestamp: Date.now(),\n }\n continue\n }\n\n // Text content.\n if (delta && 'text' in delta && delta.text !== undefined) {\n yield* closeReasoning()\n if (!hasEmittedTextMessageStart) {\n hasEmittedTextMessageStart = true\n yield {\n type: EventType.TEXT_MESSAGE_START,\n messageId,\n role: 'assistant',\n timestamp: Date.now(),\n }\n }\n accumulatedContent += delta.text\n yield {\n type: EventType.TEXT_MESSAGE_CONTENT,\n messageId,\n delta: delta.text,\n content: accumulatedContent,\n timestamp: Date.now(),\n }\n }\n continue\n }\n\n if ('contentBlockStop' in ev) {\n const stopIndex = ev.contentBlockStop?.contentBlockIndex ?? 0\n const toolCall = toolCallsByIndex.get(stopIndex)\n if (toolCall?.started) {\n yield {\n type: EventType.TOOL_CALL_END,\n toolCallId: toolCall.id,\n toolCallName: toolCall.name,\n toolName: toolCall.name,\n timestamp: Date.now(),\n }\n toolCallsByIndex.delete(stopIndex)\n }\n continue\n }\n\n if ('messageStop' in ev) {\n const stopReason = ev.messageStop?.stopReason\n // Map Converse stopReason to AG-UI's narrower finishReason vocabulary.\n finishReason =\n stopReason === 'tool_use'\n ? 'tool_calls'\n : stopReason === 'max_tokens'\n ? 'length'\n : stopReason === 'content_filtered'\n ? 'content_filter'\n : 'stop'\n continue\n }\n\n if ('metadata' in ev) {\n const u = ev.metadata?.usage\n if (u) {\n usage = {\n promptTokens: u.inputTokens ?? 0,\n completionTokens: u.outputTokens ?? 0,\n totalTokens: u.totalTokens ?? 0,\n }\n }\n continue\n }\n }\n\n // Stream ended (possibly without any content) — still emit RUN_STARTED so\n // consumers always see a run lifecycle.\n yield* ensureRunStarted()\n\n // Drain any tool call that opened but never received contentBlockStop.\n for (const [index, toolCall] of toolCallsByIndex) {\n if (!toolCall.started) continue\n yield {\n type: EventType.TOOL_CALL_END,\n toolCallId: toolCall.id,\n toolCallName: toolCall.name,\n toolName: toolCall.name,\n timestamp: Date.now(),\n }\n toolCallsByIndex.delete(index)\n }\n\n // Close the text message lifecycle if it was opened.\n if (hasEmittedTextMessageStart) {\n yield {\n type: EventType.TEXT_MESSAGE_END,\n messageId,\n timestamp: Date.now(),\n }\n }\n\n // Close any reasoning lifecycle that text never closed.\n yield* closeReasoning()\n\n // Single terminal RUN_FINISHED. Conditional `usage` spread keeps the wire\n // shape spec-compliant (AG-UI's `usage` is optional with no `| undefined`).\n yield {\n type: EventType.RUN_FINISHED,\n runId,\n threadId,\n timestamp: Date.now(),\n finishReason: finishReason ?? 'stop',\n ...(usage && { usage }),\n }\n}\n"],"names":[],"mappings":";AAYO,SAAS,2BAA2B,IAAgC;AACzE,MAAI,6BAA6B,MAAM,GAAG,yBAAyB;AACjE,UAAM,GAAG;AAAA,EACX;AACA,MAAI,+BAA+B,MAAM,GAAG,2BAA2B;AACrE,UAAM,GAAG;AAAA,EACX;AACA,MAAI,yBAAyB,MAAM,GAAG,qBAAqB;AACzD,UAAM,GAAG;AAAA,EACX;AACA,MAAI,yBAAyB,MAAM,GAAG,qBAAqB;AACzD,UAAM,GAAG;AAAA,EACX;AACA,MAAI,iCAAiC,MAAM,GAAG,6BAA6B;AACzE,UAAM,GAAG;AAAA,EACX;AACF;AAgCA,gBAAuB,sBACrB,QACA,cACA,YAAyE,CAAA,GAC7C;AAC5B,QAAM,QAAQ,aAAA;AACd,QAAM,WAAW,UAAU,YAAY,aAAA;AACvC,QAAM,EAAE,aAAa,MAAA,IAAU;AAC/B,QAAM,YAAY,aAAA;AAElB,MAAI,uBAAuB;AAG3B,MAAI,qBAAqB;AACzB,MAAI,6BAA6B;AAGjC,MAAI;AACJ,MAAI,qBAAqB;AAKzB,QAAM,uCAAuB,IAAA;AAQ7B,MAAI;AAGJ,MAAI;AAGJ,YAAU,mBAA2C;AACnD,QAAI,qBAAsB;AAC1B,2BAAuB;AACvB,UAAM;AAAA,MACJ,MAAM,UAAU;AAAA,MAChB;AAAA,MACA;AAAA,MACA;AAAA,MACA,GAAI,SAAS,EAAE,MAAA;AAAA,MACf,WAAW,KAAK,IAAA;AAAA,IAAI;AAAA,EAExB;AAIA,YAAU,iBAAyC;AACjD,QAAI,sBAAsB,CAAC,oBAAoB;AAC7C,2BAAqB;AACrB,YAAM;AAAA,QACJ,MAAM,UAAU;AAAA,QAChB,WAAW;AAAA,QACX,WAAW,KAAK,IAAA;AAAA,MAAI;AAAA,IAExB;AAAA,EACF;AAEA,mBAAiB,MAAM,QAAQ;AAC7B,WAAO,iBAAA;AAGP,+BAA2B,EAAE;AAG7B,QAAI,kBAAkB,GAAI;AAE1B,QAAI,uBAAuB,IAAI;AAC7B,YAAM,QAAQ,GAAG;AACjB,YAAM,UAAU,OAAO,OAAO;AAC9B,UAAI,SAAS,SAAS;AACpB,eAAO,eAAA;AACP,cAAM,KAAK,QAAQ,aAAa,aAAA;AAChC,cAAM,OAAO,QAAQ,QAAQ;AAC7B,cAAM,QAAQ,MAAM,qBAAqB;AACzC,yBAAiB,IAAI,OAAO;AAAA,UAC1B;AAAA,UACA;AAAA,UACA,SAAS;AAAA,QAAA,CACV;AACD,cAAM;AAAA,UACJ,MAAM,UAAU;AAAA,UAChB,YAAY;AAAA,UACZ,cAAc;AAAA,UACd,UAAU;AAAA,UACV,WAAW,KAAK,IAAA;AAAA,UAChB;AAAA,QAAA;AAAA,MAEJ;AACA;AAAA,IACF;AAEA,QAAI,uBAAuB,IAAI;AAC7B,YAAM,QAAQ,GAAG;AACjB,YAAM,QAAQ,OAAO;AACrB,YAAM,QAAQ,OAAO,qBAAqB;AAG1C,UAAI,SAAS,aAAa,SAAS,MAAM,SAAS,UAAU,QAAW;AACrE,cAAM,WAAW,iBAAiB,IAAI,KAAK;AAC3C,YAAI,UAAU,SAAS;AACrB,gBAAM;AAAA,YACJ,MAAM,UAAU;AAAA,YAChB,YAAY,SAAS;AAAA,YACrB,WAAW,KAAK,IAAA;AAAA,YAChB,OAAO,MAAM,QAAQ;AAAA,UAAA;AAAA,QAEzB;AACA;AAAA,MACF;AAGA,UACE,SACA,sBAAsB,SACtB,MAAM,oBACN,UAAU,MAAM,oBAChB,MAAM,iBAAiB,SAAS,QAChC;AACA,YAAI,CAAC,oBAAoB;AACvB,+BAAqB,aAAA;AACrB,gBAAM;AAAA,YACJ,MAAM,UAAU;AAAA,YAChB,WAAW;AAAA,YACX,MAAM;AAAA,YACN,WAAW,KAAK,IAAA;AAAA,UAAI;AAAA,QAExB;AACA,cAAM;AAAA,UACJ,MAAM,UAAU;AAAA,UAChB,WAAW;AAAA,UACX,OAAO,MAAM,iBAAiB;AAAA,UAC9B,WAAW,KAAK,IAAA;AAAA,QAAI;AAEtB;AAAA,MACF;AAGA,UAAI,SAAS,UAAU,SAAS,MAAM,SAAS,QAAW;AACxD,eAAO,eAAA;AACP,YAAI,CAAC,4BAA4B;AAC/B,uCAA6B;AAC7B,gBAAM;AAAA,YACJ,MAAM,UAAU;AAAA,YAChB;AAAA,YACA,MAAM;AAAA,YACN,WAAW,KAAK,IAAA;AAAA,UAAI;AAAA,QAExB;AACA,8BAAsB,MAAM;AAC5B,cAAM;AAAA,UACJ,MAAM,UAAU;AAAA,UAChB;AAAA,UACA,OAAO,MAAM;AAAA,UACb,SAAS;AAAA,UACT,WAAW,KAAK,IAAA;AAAA,QAAI;AAAA,MAExB;AACA;AAAA,IACF;AAEA,QAAI,sBAAsB,IAAI;AAC5B,YAAM,YAAY,GAAG,kBAAkB,qBAAqB;AAC5D,YAAM,WAAW,iBAAiB,IAAI,SAAS;AAC/C,UAAI,UAAU,SAAS;AACrB,cAAM;AAAA,UACJ,MAAM,UAAU;AAAA,UAChB,YAAY,SAAS;AAAA,UACrB,cAAc,SAAS;AAAA,UACvB,UAAU,SAAS;AAAA,UACnB,WAAW,KAAK,IAAA;AAAA,QAAI;AAEtB,yBAAiB,OAAO,SAAS;AAAA,MACnC;AACA;AAAA,IACF;AAEA,QAAI,iBAAiB,IAAI;AACvB,YAAM,aAAa,GAAG,aAAa;AAEnC,qBACE,eAAe,aACX,eACA,eAAe,eACb,WACA,eAAe,qBACb,mBACA;AACV;AAAA,IACF;AAEA,QAAI,cAAc,IAAI;AACpB,YAAM,IAAI,GAAG,UAAU;AACvB,UAAI,GAAG;AACL,gBAAQ;AAAA,UACN,cAAc,EAAE,eAAe;AAAA,UAC/B,kBAAkB,EAAE,gBAAgB;AAAA,UACpC,aAAa,EAAE,eAAe;AAAA,QAAA;AAAA,MAElC;AACA;AAAA,IACF;AAAA,EACF;AAIA,SAAO,iBAAA;AAGP,aAAW,CAAC,OAAO,QAAQ,KAAK,kBAAkB;AAChD,QAAI,CAAC,SAAS,QAAS;AACvB,UAAM;AAAA,MACJ,MAAM,UAAU;AAAA,MAChB,YAAY,SAAS;AAAA,MACrB,cAAc,SAAS;AAAA,MACvB,UAAU,SAAS;AAAA,MACnB,WAAW,KAAK,IAAA;AAAA,IAAI;AAEtB,qBAAiB,OAAO,KAAK;AAAA,EAC/B;AAGA,MAAI,4BAA4B;AAC9B,UAAM;AAAA,MACJ,MAAM,UAAU;AAAA,MAChB;AAAA,MACA,WAAW,KAAK,IAAA;AAAA,IAAI;AAAA,EAExB;AAGA,SAAO,eAAA;AAIP,QAAM;AAAA,IACJ,MAAM,UAAU;AAAA,IAChB;AAAA,IACA;AAAA,IACA,WAAW,KAAK,IAAA;AAAA,IAChB,cAAc,gBAAgB;AAAA,IAC9B,GAAI,SAAS,EAAE,MAAA;AAAA,EAAM;AAEzB;"}
@@ -0,0 +1,8 @@
1
+ import { ToolConfiguration } from '@aws-sdk/client-bedrock-runtime';
2
+ export declare const STRUCTURED_TOOL_NAME = "structured_output";
3
+ /**
4
+ * Converse has no native json_schema response_format. Structured output is
5
+ * achieved by forcing a single tool whose input schema is the requested output
6
+ * schema; the model's tool-use `input` is the structured result.
7
+ */
8
+ export declare function buildStructuredToolConfig(schema: unknown): ToolConfiguration;
@@ -0,0 +1,20 @@
1
+ const STRUCTURED_TOOL_NAME = "structured_output";
2
+ function buildStructuredToolConfig(schema) {
3
+ return {
4
+ tools: [
5
+ {
6
+ toolSpec: {
7
+ name: STRUCTURED_TOOL_NAME,
8
+ description: "Return the final answer as structured JSON.",
9
+ inputSchema: { json: schema }
10
+ }
11
+ }
12
+ ],
13
+ toolChoice: { tool: { name: STRUCTURED_TOOL_NAME } }
14
+ };
15
+ }
16
+ export {
17
+ STRUCTURED_TOOL_NAME,
18
+ buildStructuredToolConfig
19
+ };
20
+ //# sourceMappingURL=structured-output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"structured-output.js","sources":["../../../src/converse/structured-output.ts"],"sourcesContent":["import type { ToolConfiguration } from '@aws-sdk/client-bedrock-runtime'\nimport type { DocumentType } from '@smithy/types'\n\nexport const STRUCTURED_TOOL_NAME = 'structured_output'\n\n/**\n * Converse has no native json_schema response_format. Structured output is\n * achieved by forcing a single tool whose input schema is the requested output\n * schema; the model's tool-use `input` is the structured result.\n */\nexport function buildStructuredToolConfig(schema: unknown): ToolConfiguration {\n return {\n tools: [\n {\n toolSpec: {\n name: STRUCTURED_TOOL_NAME,\n description: 'Return the final answer as structured JSON.',\n inputSchema: { json: schema as DocumentType },\n },\n },\n ],\n toolChoice: { tool: { name: STRUCTURED_TOOL_NAME } },\n }\n}\n"],"names":[],"mappings":"AAGO,MAAM,uBAAuB;AAO7B,SAAS,0BAA0B,QAAoC;AAC5E,SAAO;AAAA,IACL,OAAO;AAAA,MACL;AAAA,QACE,UAAU;AAAA,UACR,MAAM;AAAA,UACN,aAAa;AAAA,UACb,aAAa,EAAE,MAAM,OAAA;AAAA,QAAuB;AAAA,MAC9C;AAAA,IACF;AAAA,IAEF,YAAY,EAAE,MAAM,EAAE,MAAM,uBAAqB;AAAA,EAAE;AAEvD;"}
@@ -0,0 +1,11 @@
1
+ import { ToolConfiguration } from '@aws-sdk/client-bedrock-runtime';
2
+ export interface ConverseToolInput {
3
+ name: string;
4
+ description?: string;
5
+ inputSchema: unknown;
6
+ }
7
+ export type ToolChoiceInput = 'auto' | 'required' | 'none' | {
8
+ type: 'tool';
9
+ name: string;
10
+ };
11
+ export declare function toToolConfig(tools: Array<ConverseToolInput>, choice: ToolChoiceInput | undefined): ToolConfiguration | undefined;
@@ -0,0 +1,21 @@
1
+ function toToolConfig(tools, choice) {
2
+ if (!tools.length) return void 0;
3
+ const toolChoice = mapChoice();
4
+ return {
5
+ tools: tools.map((t) => ({
6
+ toolSpec: {
7
+ name: t.name,
8
+ ...t.description ? { description: t.description } : {},
9
+ inputSchema: { json: t.inputSchema }
10
+ }
11
+ })),
12
+ ...toolChoice ? { toolChoice } : {}
13
+ };
14
+ }
15
+ function mapChoice(choice) {
16
+ return { auto: {} };
17
+ }
18
+ export {
19
+ toToolConfig
20
+ };
21
+ //# sourceMappingURL=tool-converter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-converter.js","sources":["../../../src/converse/tool-converter.ts"],"sourcesContent":["import type {\n ToolChoice,\n ToolConfiguration,\n} from '@aws-sdk/client-bedrock-runtime'\nimport type { DocumentType } from '@smithy/types'\n\nexport interface ConverseToolInput {\n name: string\n description?: string\n inputSchema: unknown\n}\n\nexport type ToolChoiceInput =\n | 'auto'\n | 'required'\n | 'none'\n | { type: 'tool'; name: string }\n\nexport function toToolConfig(\n tools: Array<ConverseToolInput>,\n choice: ToolChoiceInput | undefined,\n): ToolConfiguration | undefined {\n if (!tools.length) return undefined\n // `none` means \"don't call tools\" — omit the tool config entirely, since\n // Bedrock treats a present tool config with no `toolChoice` as auto.\n if (choice === 'none') return undefined\n const toolChoice = mapChoice(choice)\n return {\n tools: tools.map((t) => ({\n toolSpec: {\n name: t.name,\n ...(t.description ? { description: t.description } : {}),\n inputSchema: { json: t.inputSchema as DocumentType },\n },\n })),\n ...(toolChoice ? { toolChoice } : {}),\n }\n}\n\nfunction mapChoice(\n choice: ToolChoiceInput | undefined,\n): ToolChoice | undefined {\n if (!choice || choice === 'auto') return { auto: {} }\n if (choice === 'required') return { any: {} }\n // `none` is handled earlier in toToolConfig (omits the tool config); this\n // branch keeps the string union narrowed so `choice.name` type-checks.\n if (choice === 'none') return undefined\n return { tool: { name: choice.name } }\n}\n"],"names":[],"mappings":"AAkBO,SAAS,aACd,OACA,QAC+B;AAC/B,MAAI,CAAC,MAAM,OAAQ,QAAO;AAI1B,QAAM,aAAa,UAAgB;AACnC,SAAO;AAAA,IACL,OAAO,MAAM,IAAI,CAAC,OAAO;AAAA,MACvB,UAAU;AAAA,QACR,MAAM,EAAE;AAAA,QACR,GAAI,EAAE,cAAc,EAAE,aAAa,EAAE,YAAA,IAAgB,CAAA;AAAA,QACrD,aAAa,EAAE,MAAM,EAAE,YAAA;AAAA,MAA4B;AAAA,IACrD,EACA;AAAA,IACF,GAAI,aAAa,EAAE,eAAe,CAAA;AAAA,EAAC;AAEvC;AAEA,SAAS,UACP,QACwB;SACiB,EAAE,MAAM,GAAC;AAMpD;"}
@@ -0,0 +1,29 @@
1
+ import { BedrockTextAdapter, BedrockTextConfig } from './adapters/text.js';
2
+ import { BedrockResponsesTextAdapter, BedrockResponsesConfig } from './adapters/responses-text.js';
3
+ import { BedrockConverseTextAdapter, BedrockConverseConfig } from './adapters/converse-text.js';
4
+ import { BedrockChatModels, BedrockConverseModels, BedrockResponsesModels } from './model-meta.js';
5
+ /** Config for the branching factory's converse mode (default, or api: 'converse'). */
6
+ export type BedrockConverseApiConfig = BedrockConverseConfig & {
7
+ api?: 'converse';
8
+ };
9
+ /** Config for the branching factory's chat mode (api: 'chat' required). */
10
+ export type BedrockChatApiConfig = BedrockTextConfig & {
11
+ api: 'chat';
12
+ };
13
+ /** Config for the branching factory's responses mode (api: 'responses' required). */
14
+ export type BedrockResponsesApiConfig = BedrockResponsesConfig & {
15
+ api: 'responses';
16
+ };
17
+ export declare function createBedrockText<TModel extends BedrockConverseModels>(model: TModel, apiKey: string, config?: BedrockConverseApiConfig): BedrockConverseTextAdapter<TModel>;
18
+ export declare function createBedrockText<TModel extends BedrockChatModels>(model: TModel, apiKey: string, config: BedrockChatApiConfig): BedrockTextAdapter<TModel>;
19
+ export declare function createBedrockText<TModel extends BedrockResponsesModels>(model: TModel, apiKey: string, config: BedrockResponsesApiConfig): BedrockResponsesTextAdapter<TModel>;
20
+ export declare function bedrockText<TModel extends BedrockConverseModels>(model: TModel, config?: BedrockConverseApiConfig): BedrockConverseTextAdapter<TModel>;
21
+ export declare function bedrockText<TModel extends BedrockChatModels>(model: TModel, config: BedrockChatApiConfig): BedrockTextAdapter<TModel>;
22
+ export declare function bedrockText<TModel extends BedrockResponsesModels>(model: TModel, config: BedrockResponsesApiConfig): BedrockResponsesTextAdapter<TModel>;
23
+ export { BedrockTextAdapter, createBedrockChat, type BedrockTextConfig, type BedrockTextProviderOptions, } from './adapters/text.js';
24
+ export { BedrockResponsesTextAdapter, createBedrockResponsesText, type BedrockResponsesConfig, type BedrockResponsesProviderOptions, } from './adapters/responses-text.js';
25
+ export { BedrockConverseTextAdapter, createBedrockConverse, type BedrockConverseConfig, } from './adapters/converse-text.js';
26
+ export type { BedrockConverseProviderOptions } from './converse/provider-options.js';
27
+ export { resolveBedrockAuth, withBedrockDefaults, type BedrockClientConfig, type BedrockEndpoint, type ResolvedBedrockAuth, } from './utils.js';
28
+ export { BEDROCK_CHAT_MODELS, BEDROCK_RESPONSES_MODELS, BEDROCK_CONVERSE_MODELS, type BedrockChatModels, type BedrockResponsesModels, type BedrockConverseModels, type BedrockChatModelProviderOptionsByName, type BedrockChatModelToolCapabilitiesByName, type BedrockModelInputModalitiesByName, } from './model-meta.js';
29
+ export type { BedrockMessageMetadataByModality, BedrockTextMetadata, BedrockImageMetadata, BedrockAudioMetadata, BedrockVideoMetadata, BedrockDocumentMetadata, } from './message-types.js';
@@ -0,0 +1,62 @@
1
+ import { BedrockTextAdapter } from "./adapters/text.js";
2
+ import { createBedrockChat } from "./adapters/text.js";
3
+ import { BedrockResponsesTextAdapter } from "./adapters/responses-text.js";
4
+ import { createBedrockResponsesText } from "./adapters/responses-text.js";
5
+ import { BedrockConverseTextAdapter } from "./adapters/converse-text.js";
6
+ import { createBedrockConverse } from "./adapters/converse-text.js";
7
+ import { BEDROCK_RESPONSES_MODELS, BEDROCK_CHAT_MODELS } from "./model-meta.js";
8
+ import { BEDROCK_CONVERSE_MODELS } from "./model-meta.js";
9
+ import { withBedrockDefaults } from "./utils/client.js";
10
+ import { resolveBedrockAuth } from "./utils/auth.js";
11
+ function isResponsesModel(model) {
12
+ return BEDROCK_RESPONSES_MODELS.some((m) => m === model);
13
+ }
14
+ function isChatModel(model) {
15
+ return BEDROCK_CHAT_MODELS.some((m) => m === model);
16
+ }
17
+ function stripApi(config) {
18
+ const { api, ...rest } = config;
19
+ return rest;
20
+ }
21
+ function build(model, config) {
22
+ if (config?.api === "responses") {
23
+ const rest = stripApi(config);
24
+ if (!isResponsesModel(model)) {
25
+ throw new Error(
26
+ `Model "${model}" is not available on the Bedrock Responses API. Responses-capable models: ${BEDROCK_RESPONSES_MODELS.join(", ")}.`
27
+ );
28
+ }
29
+ return new BedrockResponsesTextAdapter(rest, model);
30
+ }
31
+ if (config?.api === "chat") {
32
+ if (!isChatModel(model)) {
33
+ throw new Error(
34
+ `Model "${model}" is not available on the Bedrock Chat Completions API. Chat-capable models: ${BEDROCK_CHAT_MODELS.join(", ")}.`
35
+ );
36
+ }
37
+ return new BedrockTextAdapter(stripApi(config), model);
38
+ }
39
+ return new BedrockConverseTextAdapter(config ? stripApi(config) : {}, model);
40
+ }
41
+ function createBedrockText(model, apiKey, config) {
42
+ return build(model, { ...config, apiKey });
43
+ }
44
+ function bedrockText(model, config) {
45
+ return build(model, config);
46
+ }
47
+ export {
48
+ BEDROCK_CHAT_MODELS,
49
+ BEDROCK_CONVERSE_MODELS,
50
+ BEDROCK_RESPONSES_MODELS,
51
+ BedrockConverseTextAdapter,
52
+ BedrockResponsesTextAdapter,
53
+ BedrockTextAdapter,
54
+ bedrockText,
55
+ createBedrockChat,
56
+ createBedrockConverse,
57
+ createBedrockResponsesText,
58
+ createBedrockText,
59
+ resolveBedrockAuth,
60
+ withBedrockDefaults
61
+ };
62
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../src/index.ts"],"sourcesContent":["/**\n * @module @tanstack/ai-bedrock\n *\n * Amazon Bedrock adapter for TanStack AI via Bedrock's OpenAI-compatible APIs\n * and the native Converse API. The public `bedrockText` / `createBedrockText`\n * factory branches between the Converse adapter (DEFAULT), the Chat Completions\n * adapter (`api: 'chat'`), and the Responses adapter (`api: 'responses'`).\n */\nimport { BedrockTextAdapter } from './adapters/text'\nimport { BedrockResponsesTextAdapter } from './adapters/responses-text'\nimport { BedrockConverseTextAdapter } from './adapters/converse-text'\nimport { BEDROCK_CHAT_MODELS, BEDROCK_RESPONSES_MODELS } from './model-meta'\nimport type { BedrockTextConfig } from './adapters/text'\nimport type { BedrockResponsesConfig } from './adapters/responses-text'\nimport type { BedrockConverseConfig } from './adapters/converse-text'\nimport type { BedrockClientConfig } from './utils'\nimport type {\n BedrockChatModels,\n BedrockConverseModels,\n BedrockResponsesModels,\n} from './model-meta'\n\n/** Config for the branching factory's converse mode (default, or api: 'converse'). */\nexport type BedrockConverseApiConfig = BedrockConverseConfig & {\n api?: 'converse'\n}\n/** Config for the branching factory's chat mode (api: 'chat' required). */\nexport type BedrockChatApiConfig = BedrockTextConfig & {\n api: 'chat'\n}\n/** Config for the branching factory's responses mode (api: 'responses' required). */\nexport type BedrockResponsesApiConfig = BedrockResponsesConfig & {\n api: 'responses'\n}\n\ntype AnyBedrockAdapter =\n | BedrockConverseTextAdapter<BedrockConverseModels>\n | BedrockTextAdapter<BedrockChatModels>\n | BedrockResponsesTextAdapter<BedrockResponsesModels>\n\n/** Cast-free runtime guard: is this model in the Responses-capable subset? */\nfunction isResponsesModel(model: string): model is BedrockResponsesModels {\n return BEDROCK_RESPONSES_MODELS.some((m) => m === model)\n}\n\n/** Cast-free runtime guard: is this model in the Chat-capable subset? */\nfunction isChatModel(model: string): model is BedrockChatModels {\n return BEDROCK_CHAT_MODELS.some((m) => m === model)\n}\n\n/** Strip the `api` discriminator from a config without an unused-var lint error. */\nfunction stripApi<T extends { api?: unknown }>(config: T): Omit<T, 'api'> {\n const { api, ...rest } = config\n void api\n return rest\n}\n\n/**\n * Shared branching used by both public factories. Constructs the adapter\n * classes directly so their constructors run the full auth cascade lazily\n * (config.apiKey → BEDROCK_API_KEY → AWS_BEARER_TOKEN_BEDROCK → SigV4). No\n * eager env-key fetch here, so `auth: 'sigv4'` never throws for a missing key.\n *\n * Default path → Converse adapter; opt-in via `api: 'chat'` or `api: 'responses'`.\n */\nfunction build(\n model: BedrockConverseModels,\n config?: BedrockClientConfig & { api?: 'converse' | 'chat' | 'responses' },\n): AnyBedrockAdapter {\n if (config?.api === 'responses') {\n const rest = stripApi(config)\n if (!isResponsesModel(model)) {\n throw new Error(\n `Model \"${model}\" is not available on the Bedrock Responses API. ` +\n `Responses-capable models: ${BEDROCK_RESPONSES_MODELS.join(', ')}.`,\n )\n }\n return new BedrockResponsesTextAdapter(rest, model)\n }\n if (config?.api === 'chat') {\n if (!isChatModel(model)) {\n throw new Error(\n `Model \"${model}\" is not available on the Bedrock Chat Completions API. ` +\n `Chat-capable models: ${BEDROCK_CHAT_MODELS.join(', ')}.`,\n )\n }\n return new BedrockTextAdapter(stripApi(config), model)\n }\n // Default + explicit 'converse'\n return new BedrockConverseTextAdapter(config ? stripApi(config) : {}, model)\n}\n\n// --- createBedrockText: explicit key, overloaded on `api` ---\nexport function createBedrockText<TModel extends BedrockConverseModels>(\n model: TModel,\n apiKey: string,\n config?: BedrockConverseApiConfig,\n): BedrockConverseTextAdapter<TModel>\nexport function createBedrockText<TModel extends BedrockChatModels>(\n model: TModel,\n apiKey: string,\n config: BedrockChatApiConfig,\n): BedrockTextAdapter<TModel>\nexport function createBedrockText<TModel extends BedrockResponsesModels>(\n model: TModel,\n apiKey: string,\n config: BedrockResponsesApiConfig,\n): BedrockResponsesTextAdapter<TModel>\nexport function createBedrockText(\n model: BedrockConverseModels,\n apiKey: string,\n config?:\n | BedrockConverseApiConfig\n | BedrockChatApiConfig\n | BedrockResponsesApiConfig,\n): AnyBedrockAdapter {\n // Explicit apiKey is authoritative — spread config first so it can't override.\n return build(model, { ...config, apiKey })\n}\n\n// --- bedrockText: env-key counterpart, same overloads ---\nexport function bedrockText<TModel extends BedrockConverseModels>(\n model: TModel,\n config?: BedrockConverseApiConfig,\n): BedrockConverseTextAdapter<TModel>\nexport function bedrockText<TModel extends BedrockChatModels>(\n model: TModel,\n config: BedrockChatApiConfig,\n): BedrockTextAdapter<TModel>\nexport function bedrockText<TModel extends BedrockResponsesModels>(\n model: TModel,\n config: BedrockResponsesApiConfig,\n): BedrockResponsesTextAdapter<TModel>\nexport function bedrockText(\n model: BedrockConverseModels,\n config?:\n | BedrockConverseApiConfig\n | BedrockChatApiConfig\n | BedrockResponsesApiConfig,\n): AnyBedrockAdapter {\n // No eager env-key fetch: the adapter constructor resolves auth lazily so\n // SigV4 (and the env-key fallback) work without a forced API key here.\n return build(model, config)\n}\n\n// --- Re-exports ---\nexport {\n BedrockTextAdapter,\n createBedrockChat,\n type BedrockTextConfig,\n type BedrockTextProviderOptions,\n} from './adapters/text'\nexport {\n BedrockResponsesTextAdapter,\n createBedrockResponsesText,\n type BedrockResponsesConfig,\n type BedrockResponsesProviderOptions,\n} from './adapters/responses-text'\nexport {\n BedrockConverseTextAdapter,\n createBedrockConverse,\n type BedrockConverseConfig,\n} from './adapters/converse-text'\nexport type { BedrockConverseProviderOptions } from './converse/provider-options'\nexport {\n resolveBedrockAuth,\n withBedrockDefaults,\n type BedrockClientConfig,\n type BedrockEndpoint,\n type ResolvedBedrockAuth,\n} from './utils'\nexport {\n BEDROCK_CHAT_MODELS,\n BEDROCK_RESPONSES_MODELS,\n BEDROCK_CONVERSE_MODELS,\n type BedrockChatModels,\n type BedrockResponsesModels,\n type BedrockConverseModels,\n type BedrockChatModelProviderOptionsByName,\n type BedrockChatModelToolCapabilitiesByName,\n type BedrockModelInputModalitiesByName,\n} from './model-meta'\nexport type {\n BedrockMessageMetadataByModality,\n BedrockTextMetadata,\n BedrockImageMetadata,\n BedrockAudioMetadata,\n BedrockVideoMetadata,\n BedrockDocumentMetadata,\n} from './message-types'\n"],"names":[],"mappings":";;;;;;;;;;AAyCA,SAAS,iBAAiB,OAAgD;AACxE,SAAO,yBAAyB,KAAK,CAAC,MAAM,MAAM,KAAK;AACzD;AAGA,SAAS,YAAY,OAA2C;AAC9D,SAAO,oBAAoB,KAAK,CAAC,MAAM,MAAM,KAAK;AACpD;AAGA,SAAS,SAAsC,QAA2B;AACxE,QAAM,EAAE,KAAK,GAAG,KAAA,IAAS;AAEzB,SAAO;AACT;AAUA,SAAS,MACP,OACA,QACmB;AACnB,MAAI,QAAQ,QAAQ,aAAa;AAC/B,UAAM,OAAO,SAAS,MAAM;AAC5B,QAAI,CAAC,iBAAiB,KAAK,GAAG;AAC5B,YAAM,IAAI;AAAA,QACR,UAAU,KAAK,8EACgB,yBAAyB,KAAK,IAAI,CAAC;AAAA,MAAA;AAAA,IAEtE;AACA,WAAO,IAAI,4BAA4B,MAAM,KAAK;AAAA,EACpD;AACA,MAAI,QAAQ,QAAQ,QAAQ;AAC1B,QAAI,CAAC,YAAY,KAAK,GAAG;AACvB,YAAM,IAAI;AAAA,QACR,UAAU,KAAK,gFACW,oBAAoB,KAAK,IAAI,CAAC;AAAA,MAAA;AAAA,IAE5D;AACA,WAAO,IAAI,mBAAmB,SAAS,MAAM,GAAG,KAAK;AAAA,EACvD;AAEA,SAAO,IAAI,2BAA2B,SAAS,SAAS,MAAM,IAAI,CAAA,GAAI,KAAK;AAC7E;AAkBO,SAAS,kBACd,OACA,QACA,QAImB;AAEnB,SAAO,MAAM,OAAO,EAAE,GAAG,QAAQ,QAAQ;AAC3C;AAeO,SAAS,YACd,OACA,QAImB;AAGnB,SAAO,MAAM,OAAO,MAAM;AAC5B;"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Bedrock content-part metadata by modality, used for type inference when
3
+ * constructing multimodal messages. Bedrock's OpenAI-compatible Chat
4
+ * Completions accepts the standard OpenAI image-detail hint; other modalities
5
+ * carry no extra metadata today.
6
+ */
7
+ export interface BedrockTextMetadata {
8
+ }
9
+ export interface BedrockImageMetadata {
10
+ /** Image processing detail: 'auto' (default), 'low', or 'high'. */
11
+ detail?: 'auto' | 'low' | 'high';
12
+ }
13
+ export interface BedrockAudioMetadata {
14
+ }
15
+ export interface BedrockVideoMetadata {
16
+ }
17
+ export interface BedrockDocumentMetadata {
18
+ }
19
+ export interface BedrockMessageMetadataByModality {
20
+ text: BedrockTextMetadata;
21
+ image: BedrockImageMetadata;
22
+ audio: BedrockAudioMetadata;
23
+ video: BedrockVideoMetadata;
24
+ document: BedrockDocumentMetadata;
25
+ }
@@ -0,0 +1,127 @@
1
+ export declare const GENERATED_BEDROCK_MODELS: readonly [{
2
+ readonly id: "openai.gpt-oss-120b-1:0";
3
+ readonly input: readonly ["text"];
4
+ readonly output: readonly ["text"];
5
+ readonly apis: {
6
+ readonly converse: true;
7
+ readonly chat: true;
8
+ readonly responses: true;
9
+ };
10
+ }, {
11
+ readonly id: "openai.gpt-oss-20b-1:0";
12
+ readonly input: readonly ["text"];
13
+ readonly output: readonly ["text"];
14
+ readonly apis: {
15
+ readonly converse: true;
16
+ readonly chat: true;
17
+ readonly responses: true;
18
+ };
19
+ }, {
20
+ readonly id: "us.anthropic.claude-sonnet-4-5-20250929-v1:0";
21
+ readonly input: readonly ["text", "image", "document"];
22
+ readonly output: readonly ["text"];
23
+ readonly apis: {
24
+ readonly converse: true;
25
+ readonly chat: false;
26
+ readonly responses: false;
27
+ };
28
+ }, {
29
+ readonly id: "us.anthropic.claude-haiku-4-5-20251001-v1:0";
30
+ readonly input: readonly ["text", "image", "document"];
31
+ readonly output: readonly ["text"];
32
+ readonly apis: {
33
+ readonly converse: true;
34
+ readonly chat: false;
35
+ readonly responses: false;
36
+ };
37
+ }, {
38
+ readonly id: "us.anthropic.claude-3-7-sonnet-20250219-v1:0";
39
+ readonly input: readonly ["text", "image", "document"];
40
+ readonly output: readonly ["text"];
41
+ readonly apis: {
42
+ readonly converse: true;
43
+ readonly chat: false;
44
+ readonly responses: false;
45
+ };
46
+ }, {
47
+ readonly id: "us.anthropic.claude-3-5-sonnet-20241022-v2:0";
48
+ readonly input: readonly ["text", "image", "document"];
49
+ readonly output: readonly ["text"];
50
+ readonly apis: {
51
+ readonly converse: true;
52
+ readonly chat: false;
53
+ readonly responses: false;
54
+ };
55
+ }, {
56
+ readonly id: "us.anthropic.claude-3-5-haiku-20241022-v1:0";
57
+ readonly input: readonly ["text"];
58
+ readonly output: readonly ["text"];
59
+ readonly apis: {
60
+ readonly converse: true;
61
+ readonly chat: false;
62
+ readonly responses: false;
63
+ };
64
+ }, {
65
+ readonly id: "us.amazon.nova-pro-v1:0";
66
+ readonly input: readonly ["text", "image", "document"];
67
+ readonly output: readonly ["text"];
68
+ readonly apis: {
69
+ readonly converse: true;
70
+ readonly chat: false;
71
+ readonly responses: false;
72
+ };
73
+ }, {
74
+ readonly id: "us.amazon.nova-lite-v1:0";
75
+ readonly input: readonly ["text", "image", "document"];
76
+ readonly output: readonly ["text"];
77
+ readonly apis: {
78
+ readonly converse: true;
79
+ readonly chat: false;
80
+ readonly responses: false;
81
+ };
82
+ }, {
83
+ readonly id: "us.amazon.nova-micro-v1:0";
84
+ readonly input: readonly ["text"];
85
+ readonly output: readonly ["text"];
86
+ readonly apis: {
87
+ readonly converse: true;
88
+ readonly chat: false;
89
+ readonly responses: false;
90
+ };
91
+ }, {
92
+ readonly id: "us.meta.llama3-3-70b-instruct-v1:0";
93
+ readonly input: readonly ["text"];
94
+ readonly output: readonly ["text"];
95
+ readonly apis: {
96
+ readonly converse: true;
97
+ readonly chat: false;
98
+ readonly responses: false;
99
+ };
100
+ }, {
101
+ readonly id: "us.meta.llama4-maverick-17b-instruct-v1:0";
102
+ readonly input: readonly ["text", "image"];
103
+ readonly output: readonly ["text"];
104
+ readonly apis: {
105
+ readonly converse: true;
106
+ readonly chat: false;
107
+ readonly responses: false;
108
+ };
109
+ }, {
110
+ readonly id: "us.mistral.pixtral-large-2502-v1:0";
111
+ readonly input: readonly ["text", "image"];
112
+ readonly output: readonly ["text"];
113
+ readonly apis: {
114
+ readonly converse: true;
115
+ readonly chat: false;
116
+ readonly responses: false;
117
+ };
118
+ }, {
119
+ readonly id: "us.deepseek.r1-v1:0";
120
+ readonly input: readonly ["text"];
121
+ readonly output: readonly ["text"];
122
+ readonly apis: {
123
+ readonly converse: true;
124
+ readonly chat: false;
125
+ readonly responses: false;
126
+ };
127
+ }];