@namzu/bedrock 1.0.2 → 1.0.3
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 +30 -0
- package/dist/__tests__/error-taxonomy.test.d.ts +17 -0
- package/dist/__tests__/error-taxonomy.test.d.ts.map +1 -0
- package/dist/__tests__/error-taxonomy.test.js +192 -0
- package/dist/__tests__/error-taxonomy.test.js.map +1 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +112 -70
- package/dist/client.js.map +1 -1
- package/package.json +3 -3
- package/src/__tests__/error-taxonomy.test.ts +236 -0
- package/src/client.ts +114 -70
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,35 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.0.3
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 3fd2524: Normalize request-start and mid-stream failures across all seven provider
|
|
8
|
+
drivers with the new public `ProviderRequestError` taxonomy. Errors expose
|
|
9
|
+
`kind` (`throttle`, `network`, `auth`, `context_overflow`, `bad_request`, or
|
|
10
|
+
`server`), `providerId`, and optional `status` / `retryAfterMs`, with
|
|
11
|
+
`isProviderRequestError` available for structural narrowing across package
|
|
12
|
+
copies.
|
|
13
|
+
|
|
14
|
+
Provider error messages and metadata deliberately omit vendor response bodies,
|
|
15
|
+
URLs, messages, and causes because upstream errors can echo credentials. HTTP
|
|
16
|
+
dialect-mismatch diagnostics now keep only the endpoint origin and status.
|
|
17
|
+
Caller-owned aborts remain unchanged instead of being reclassified.
|
|
18
|
+
|
|
19
|
+
The runtime preserves the classified error through streaming and publishes its
|
|
20
|
+
safe metadata as `Run.lastProviderError` and
|
|
21
|
+
`run_failed.providerError`. Bedrock stream-exception events and provider
|
|
22
|
+
iterator/SSE failures no longer appear as clean end-of-stream.
|
|
23
|
+
|
|
24
|
+
`retryAfterMs` is metadata only; this change does not add retries or alter vendor
|
|
25
|
+
SDK retry settings. Provider packages now require `@namzu/sdk >=1.3.0`, the
|
|
26
|
+
first SDK release containing these runtime helpers and types.
|
|
27
|
+
|
|
28
|
+
Ollama now maps `done_reason: "length"` truthfully so runtime continuation can
|
|
29
|
+
run. LM Studio treats content-free `contextLengthReached` as context overflow,
|
|
30
|
+
while preserving `"length"` after partial content, and creates its WebSocket
|
|
31
|
+
client lazily on first use.
|
|
32
|
+
|
|
3
33
|
## 1.0.2
|
|
4
34
|
|
|
5
35
|
### Patch Changes
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provider error taxonomy — Bedrock driver.
|
|
3
|
+
*
|
|
4
|
+
* `chatStream` awaits `this.client.send(command)` with no catch, so an AWS
|
|
5
|
+
* `BedrockRuntimeServiceException` (`ThrottlingException`,
|
|
6
|
+
* `ValidationException`, `ServiceUnavailableException`, …) escapes verbatim.
|
|
7
|
+
* A caller cannot classify it without importing `@aws-sdk/client-bedrock-runtime`.
|
|
8
|
+
*
|
|
9
|
+
* Transport seam: `BedrockConfig` exposes no `requestHandler`/`endpoint`, so
|
|
10
|
+
* unlike the fetch-based drivers there is nothing to inject at the HTTP
|
|
11
|
+
* layer. The tests substitute the `BedrockRuntimeClient`'s `send` and reject
|
|
12
|
+
* with the REAL AWS exception classes — which is exactly what the driver
|
|
13
|
+
* sees from a live call, and the only surface the driver's (currently
|
|
14
|
+
* absent) error mapping would act on.
|
|
15
|
+
*/
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=error-taxonomy.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-taxonomy.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/error-taxonomy.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG"}
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provider error taxonomy — Bedrock driver.
|
|
3
|
+
*
|
|
4
|
+
* `chatStream` awaits `this.client.send(command)` with no catch, so an AWS
|
|
5
|
+
* `BedrockRuntimeServiceException` (`ThrottlingException`,
|
|
6
|
+
* `ValidationException`, `ServiceUnavailableException`, …) escapes verbatim.
|
|
7
|
+
* A caller cannot classify it without importing `@aws-sdk/client-bedrock-runtime`.
|
|
8
|
+
*
|
|
9
|
+
* Transport seam: `BedrockConfig` exposes no `requestHandler`/`endpoint`, so
|
|
10
|
+
* unlike the fetch-based drivers there is nothing to inject at the HTTP
|
|
11
|
+
* layer. The tests substitute the `BedrockRuntimeClient`'s `send` and reject
|
|
12
|
+
* with the REAL AWS exception classes — which is exactly what the driver
|
|
13
|
+
* sees from a live call, and the only surface the driver's (currently
|
|
14
|
+
* absent) error mapping would act on.
|
|
15
|
+
*/
|
|
16
|
+
import { AccessDeniedException, ModelErrorException, ServiceQuotaExceededException, ServiceUnavailableException, ThrottlingException, ValidationException, } from '@aws-sdk/client-bedrock-runtime';
|
|
17
|
+
import { describe, expect, it } from 'vitest';
|
|
18
|
+
import { BedrockProvider } from '../client.js';
|
|
19
|
+
/** Replace the AWS client's `send` so it rejects with `err`. */
|
|
20
|
+
function providerRejectingWith(err) {
|
|
21
|
+
const provider = new BedrockProvider({ region: 'eu-west-1' });
|
|
22
|
+
provider.client = {
|
|
23
|
+
send: () => Promise.reject(err),
|
|
24
|
+
};
|
|
25
|
+
return provider;
|
|
26
|
+
}
|
|
27
|
+
function providerStreaming(...events) {
|
|
28
|
+
const provider = new BedrockProvider({ region: 'eu-west-1' });
|
|
29
|
+
provider.client = {
|
|
30
|
+
send: async () => ({
|
|
31
|
+
$metadata: { requestId: 'bedrock-test' },
|
|
32
|
+
stream: (async function* () {
|
|
33
|
+
yield* events;
|
|
34
|
+
})(),
|
|
35
|
+
}),
|
|
36
|
+
};
|
|
37
|
+
return provider;
|
|
38
|
+
}
|
|
39
|
+
async function captureChatStreamError(provider, signal) {
|
|
40
|
+
try {
|
|
41
|
+
for await (const _chunk of provider.chatStream({
|
|
42
|
+
model: 'anthropic.claude-sonnet-4-5-20250929-v1:0',
|
|
43
|
+
messages: [{ role: 'user', content: 'hi' }],
|
|
44
|
+
signal,
|
|
45
|
+
})) {
|
|
46
|
+
// drain
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
catch (err) {
|
|
50
|
+
return err;
|
|
51
|
+
}
|
|
52
|
+
throw new Error('expected chatStream to throw');
|
|
53
|
+
}
|
|
54
|
+
describe('@namzu/bedrock — provider error taxonomy', () => {
|
|
55
|
+
it('(a) ThrottlingException with `retry-after: 2` becomes a throttle-classified error carrying retryAfterMs', async () => {
|
|
56
|
+
const aws = new ThrottlingException({
|
|
57
|
+
message: 'Too many requests, please wait before trying again.',
|
|
58
|
+
$metadata: { httpStatusCode: 429 },
|
|
59
|
+
});
|
|
60
|
+
aws.$response = {
|
|
61
|
+
statusCode: 429,
|
|
62
|
+
headers: { 'retry-after': '2' },
|
|
63
|
+
};
|
|
64
|
+
const err = await captureChatStreamError(providerRejectingWith(aws));
|
|
65
|
+
expect(err).toMatchObject({
|
|
66
|
+
name: 'ProviderRequestError',
|
|
67
|
+
kind: 'throttle',
|
|
68
|
+
status: 429,
|
|
69
|
+
retryAfterMs: 2000,
|
|
70
|
+
providerId: 'bedrock',
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
it("(c) a ValidationException reporting too many input tokens classifies as 'context_overflow'", async () => {
|
|
74
|
+
const aws = new ValidationException({
|
|
75
|
+
message: 'Input is too long for requested model. The input token count exceeds the maximum for this model.',
|
|
76
|
+
$metadata: { httpStatusCode: 400 },
|
|
77
|
+
});
|
|
78
|
+
const err = await captureChatStreamError(providerRejectingWith(aws));
|
|
79
|
+
expect(err).toMatchObject({
|
|
80
|
+
name: 'ProviderRequestError',
|
|
81
|
+
kind: 'context_overflow',
|
|
82
|
+
status: 400,
|
|
83
|
+
providerId: 'bedrock',
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
it("(c) a ValidationException that is not an overflow classifies as 'bad_request'", async () => {
|
|
87
|
+
const aws = new ValidationException({
|
|
88
|
+
message: 'The value at toolConfig.tools failed to satisfy constraint.',
|
|
89
|
+
$metadata: { httpStatusCode: 400 },
|
|
90
|
+
});
|
|
91
|
+
const err = await captureChatStreamError(providerRejectingWith(aws));
|
|
92
|
+
expect(err).toMatchObject({
|
|
93
|
+
name: 'ProviderRequestError',
|
|
94
|
+
kind: 'bad_request',
|
|
95
|
+
status: 400,
|
|
96
|
+
providerId: 'bedrock',
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
it("an AccessDeniedException classifies as 'auth'", async () => {
|
|
100
|
+
const aws = new AccessDeniedException({
|
|
101
|
+
message: 'You do not have access to the model with the specified model ID.',
|
|
102
|
+
$metadata: { httpStatusCode: 403 },
|
|
103
|
+
});
|
|
104
|
+
const err = await captureChatStreamError(providerRejectingWith(aws));
|
|
105
|
+
expect(err).toMatchObject({
|
|
106
|
+
name: 'ProviderRequestError',
|
|
107
|
+
kind: 'auth',
|
|
108
|
+
status: 403,
|
|
109
|
+
providerId: 'bedrock',
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
it("a ServiceUnavailableException classifies as 'server'", async () => {
|
|
113
|
+
const aws = new ServiceUnavailableException({
|
|
114
|
+
message: 'The service is unavailable, try again later.',
|
|
115
|
+
$metadata: { httpStatusCode: 503 },
|
|
116
|
+
});
|
|
117
|
+
const err = await captureChatStreamError(providerRejectingWith(aws));
|
|
118
|
+
expect(err).toMatchObject({
|
|
119
|
+
name: 'ProviderRequestError',
|
|
120
|
+
kind: 'server',
|
|
121
|
+
status: 503,
|
|
122
|
+
providerId: 'bedrock',
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
it("a ModelErrorException with HTTP 424 still classifies as 'server'", async () => {
|
|
126
|
+
const aws = new ModelErrorException({
|
|
127
|
+
message: 'The model failed while processing the request.',
|
|
128
|
+
originalStatusCode: 500,
|
|
129
|
+
$metadata: { httpStatusCode: 424 },
|
|
130
|
+
});
|
|
131
|
+
const err = await captureChatStreamError(providerRejectingWith(aws));
|
|
132
|
+
expect(err).toMatchObject({
|
|
133
|
+
name: 'ProviderRequestError',
|
|
134
|
+
kind: 'server',
|
|
135
|
+
status: 424,
|
|
136
|
+
providerId: 'bedrock',
|
|
137
|
+
});
|
|
138
|
+
});
|
|
139
|
+
it("a ServiceQuotaExceededException classifies as 'throttle'", async () => {
|
|
140
|
+
const aws = new ServiceQuotaExceededException({
|
|
141
|
+
message: 'Account inference quota exceeded.',
|
|
142
|
+
$metadata: { httpStatusCode: 400 },
|
|
143
|
+
});
|
|
144
|
+
const err = await captureChatStreamError(providerRejectingWith(aws));
|
|
145
|
+
expect(err).toMatchObject({
|
|
146
|
+
name: 'ProviderRequestError',
|
|
147
|
+
kind: 'throttle',
|
|
148
|
+
status: 400,
|
|
149
|
+
providerId: 'bedrock',
|
|
150
|
+
});
|
|
151
|
+
});
|
|
152
|
+
it('classifies a throttling exception delivered as a stream union event', async () => {
|
|
153
|
+
const aws = new ThrottlingException({
|
|
154
|
+
message: 'stream quota exceeded',
|
|
155
|
+
$metadata: { httpStatusCode: 429 },
|
|
156
|
+
});
|
|
157
|
+
const err = await captureChatStreamError(providerStreaming({ throttlingException: aws }));
|
|
158
|
+
expect(err).toMatchObject({
|
|
159
|
+
name: 'ProviderRequestError',
|
|
160
|
+
kind: 'throttle',
|
|
161
|
+
status: 429,
|
|
162
|
+
providerId: 'bedrock',
|
|
163
|
+
});
|
|
164
|
+
});
|
|
165
|
+
it('drops a secret-bearing validation stream event without retaining cause', async () => {
|
|
166
|
+
const secret = 'aws-secret-FAKE-DO-NOT-LOG';
|
|
167
|
+
const aws = new ValidationException({
|
|
168
|
+
message: `invalid request echoed ${secret}`,
|
|
169
|
+
$metadata: { httpStatusCode: 400 },
|
|
170
|
+
});
|
|
171
|
+
const err = await captureChatStreamError(providerStreaming({ validationException: aws }));
|
|
172
|
+
expect(err).toMatchObject({
|
|
173
|
+
name: 'ProviderRequestError',
|
|
174
|
+
kind: 'bad_request',
|
|
175
|
+
providerId: 'bedrock',
|
|
176
|
+
});
|
|
177
|
+
expect(err.message).not.toContain(secret);
|
|
178
|
+
expect('cause' in err).toBe(false);
|
|
179
|
+
});
|
|
180
|
+
it('preserves the caller abort reason when the SDK replaces the error object', async () => {
|
|
181
|
+
const controller = new AbortController();
|
|
182
|
+
const reason = new Error('user stopped');
|
|
183
|
+
const sdkAbort = Object.assign(new Error('request aborted'), {
|
|
184
|
+
name: 'AbortError',
|
|
185
|
+
});
|
|
186
|
+
controller.abort(reason);
|
|
187
|
+
const err = await captureChatStreamError(providerRejectingWith(sdkAbort), controller.signal);
|
|
188
|
+
expect(sdkAbort).not.toBe(reason);
|
|
189
|
+
expect(err).toBe(reason);
|
|
190
|
+
});
|
|
191
|
+
});
|
|
192
|
+
//# sourceMappingURL=error-taxonomy.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-taxonomy.test.js","sourceRoot":"","sources":["../../src/__tests__/error-taxonomy.test.ts"],"names":[],"mappings":"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"}
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EACX,oBAAoB,EAEpB,WAAW,EACX,SAAS,EACT,oBAAoB,EACpB,WAAW,EAGX,MAAM,YAAY,CAAA;AAOnB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAqM/C;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,EAAE,oBAKlC,CAAA;AAED,qBAAa,eAAgB,YAAW,WAAW;IAClD,QAAQ,CAAC,EAAE,aAAY;IACvB,QAAQ,CAAC,IAAI,iBAAgB;IAC7B,QAAQ,CAAC,YAAY,uBAAuB;IAE5C,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,MAAM,CAAe;gBAEjB,MAAM,EAAE,aAAa;IAoB1B,UAAU,CAAC,MAAM,EAAE,oBAAoB,GAAG,aAAa,CAAC,WAAW,CAAC;IAkKrE,UAAU,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAmClC,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;CAerC"}
|
package/dist/client.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { BedrockRuntimeClient, ConverseCommand, ConverseStreamCommand, } from '@aws-sdk/client-bedrock-runtime';
|
|
2
|
+
import { ProviderRequestError, isCallerAbortError, isProviderRequestError, providerVendorError, } from '@namzu/sdk';
|
|
2
3
|
function extractSystemBlocks(messages) {
|
|
3
4
|
return messages
|
|
4
5
|
.filter((m) => m.role === 'system')
|
|
@@ -212,101 +213,142 @@ export class BedrockProvider {
|
|
|
212
213
|
toolConfig,
|
|
213
214
|
inferenceConfig,
|
|
214
215
|
});
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
216
|
+
// AWS models failures as distinct exception CLASSES rather than status
|
|
217
|
+
// codes (ThrottlingException, ValidationException, AccessDeniedException),
|
|
218
|
+
// and lets them escape verbatim. Classify from the class name, then drop
|
|
219
|
+
// the AWS error — no re-throw, no `cause`.
|
|
220
|
+
let response;
|
|
221
|
+
try {
|
|
222
|
+
response = await this.client.send(command, {
|
|
223
|
+
requestTimeout: this.config.timeout ?? 120_000,
|
|
224
|
+
// Per-request abort: a Stop tears the in-flight Converse stream down.
|
|
225
|
+
abortSignal: params.signal,
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
catch (err) {
|
|
229
|
+
if (isCallerAbortError(err, params.signal))
|
|
230
|
+
throw params.signal?.reason ?? err;
|
|
231
|
+
if (isProviderRequestError(err))
|
|
232
|
+
throw err;
|
|
233
|
+
throw providerVendorError({ providerId: 'bedrock', error: err });
|
|
234
|
+
}
|
|
220
235
|
if (!response.stream) {
|
|
221
|
-
throw new
|
|
236
|
+
throw new ProviderRequestError({
|
|
237
|
+
kind: 'server',
|
|
238
|
+
providerId: 'bedrock',
|
|
239
|
+
detail: 'the response contained no stream body',
|
|
240
|
+
});
|
|
222
241
|
}
|
|
223
242
|
const requestId = response.$metadata.requestId ?? `bedrock-${Date.now()}`;
|
|
224
243
|
const activeToolCalls = new Map();
|
|
225
244
|
let toolCallIndex = 0;
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
245
|
+
try {
|
|
246
|
+
for await (const event of response.stream) {
|
|
247
|
+
// Stop pulling promptly on abort; `for await` calls the stream's
|
|
248
|
+
// `.return()` on this throw, releasing the connection.
|
|
249
|
+
params.signal?.throwIfAborted();
|
|
250
|
+
// Bedrock reports several post-handshake failures as UNION
|
|
251
|
+
// EVENTS, not thrown exceptions. Ignoring these members makes a
|
|
252
|
+
// throttled or failed stream look like a clean EOF.
|
|
253
|
+
const streamFailure = ('internalServerException' in event ? event.internalServerException : undefined) ??
|
|
254
|
+
('modelStreamErrorException' in event ? event.modelStreamErrorException : undefined) ??
|
|
255
|
+
('validationException' in event ? event.validationException : undefined) ??
|
|
256
|
+
('throttlingException' in event ? event.throttlingException : undefined) ??
|
|
257
|
+
('serviceUnavailableException' in event ? event.serviceUnavailableException : undefined);
|
|
258
|
+
if (streamFailure) {
|
|
259
|
+
throw providerVendorError({
|
|
260
|
+
providerId: 'bedrock',
|
|
261
|
+
error: streamFailure,
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
try {
|
|
265
|
+
if ('contentBlockDelta' in event && event.contentBlockDelta?.delta) {
|
|
266
|
+
const delta = event.contentBlockDelta.delta;
|
|
267
|
+
if ('text' in delta && delta.text) {
|
|
268
|
+
yield {
|
|
269
|
+
id: requestId,
|
|
270
|
+
delta: { content: delta.text },
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
if ('toolUse' in delta && delta.toolUse) {
|
|
274
|
+
const idx = event.contentBlockDelta.contentBlockIndex ?? toolCallIndex;
|
|
275
|
+
const active = activeToolCalls.get(idx);
|
|
276
|
+
if (active) {
|
|
277
|
+
active.args += delta.toolUse.input ?? '';
|
|
278
|
+
yield {
|
|
279
|
+
id: requestId,
|
|
280
|
+
delta: {
|
|
281
|
+
toolCalls: [
|
|
282
|
+
{
|
|
283
|
+
index: idx,
|
|
284
|
+
function: { arguments: delta.toolUse.input ?? '' },
|
|
285
|
+
},
|
|
286
|
+
],
|
|
287
|
+
},
|
|
288
|
+
};
|
|
289
|
+
}
|
|
290
|
+
}
|
|
238
291
|
}
|
|
239
|
-
if ('
|
|
240
|
-
const
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
292
|
+
if ('contentBlockStart' in event && event.contentBlockStart?.start) {
|
|
293
|
+
const start = event.contentBlockStart.start;
|
|
294
|
+
if ('toolUse' in start && start.toolUse) {
|
|
295
|
+
const idx = event.contentBlockStart.contentBlockIndex ?? toolCallIndex;
|
|
296
|
+
activeToolCalls.set(idx, {
|
|
297
|
+
id: start.toolUse.toolUseId ?? `tool-${Date.now()}`,
|
|
298
|
+
name: start.toolUse.name ?? '',
|
|
299
|
+
args: '',
|
|
300
|
+
});
|
|
244
301
|
yield {
|
|
245
302
|
id: requestId,
|
|
246
303
|
delta: {
|
|
247
304
|
toolCalls: [
|
|
248
305
|
{
|
|
249
306
|
index: idx,
|
|
250
|
-
|
|
307
|
+
id: start.toolUse.toolUseId,
|
|
308
|
+
type: 'function',
|
|
309
|
+
function: { name: start.toolUse.name ?? '' },
|
|
251
310
|
},
|
|
252
311
|
],
|
|
253
312
|
},
|
|
254
313
|
};
|
|
314
|
+
toolCallIndex = idx + 1;
|
|
255
315
|
}
|
|
256
316
|
}
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
if ('toolUse' in start && start.toolUse) {
|
|
261
|
-
const idx = event.contentBlockStart.contentBlockIndex ?? toolCallIndex;
|
|
262
|
-
activeToolCalls.set(idx, {
|
|
263
|
-
id: start.toolUse.toolUseId ?? `tool-${Date.now()}`,
|
|
264
|
-
name: start.toolUse.name ?? '',
|
|
265
|
-
args: '',
|
|
266
|
-
});
|
|
317
|
+
if ('contentBlockStop' in event) {
|
|
318
|
+
}
|
|
319
|
+
if ('messageStop' in event && event.messageStop) {
|
|
267
320
|
yield {
|
|
268
321
|
id: requestId,
|
|
269
|
-
delta: {
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
322
|
+
delta: {},
|
|
323
|
+
finishReason: mapStopReason(event.messageStop.stopReason),
|
|
324
|
+
};
|
|
325
|
+
}
|
|
326
|
+
if ('metadata' in event && event.metadata?.usage) {
|
|
327
|
+
const usage = parseUsage(event.metadata.usage);
|
|
328
|
+
yield {
|
|
329
|
+
id: requestId,
|
|
330
|
+
delta: {},
|
|
331
|
+
usage,
|
|
279
332
|
};
|
|
280
|
-
toolCallIndex = idx + 1;
|
|
281
333
|
}
|
|
282
334
|
}
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
};
|
|
291
|
-
}
|
|
292
|
-
if ('metadata' in event && event.metadata?.usage) {
|
|
293
|
-
const usage = parseUsage(event.metadata.usage);
|
|
294
|
-
yield {
|
|
295
|
-
id: requestId,
|
|
296
|
-
delta: {},
|
|
297
|
-
usage,
|
|
298
|
-
};
|
|
335
|
+
catch (parseErr) {
|
|
336
|
+
if (isProviderRequestError(parseErr))
|
|
337
|
+
throw parseErr;
|
|
338
|
+
throw new ProviderRequestError({
|
|
339
|
+
kind: 'server',
|
|
340
|
+
providerId: 'bedrock',
|
|
341
|
+
detail: 'the provider stream returned malformed data',
|
|
342
|
+
});
|
|
299
343
|
}
|
|
300
344
|
}
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
};
|
|
309
|
-
}
|
|
345
|
+
}
|
|
346
|
+
catch (err) {
|
|
347
|
+
if (isCallerAbortError(err, params.signal))
|
|
348
|
+
throw params.signal?.reason ?? err;
|
|
349
|
+
if (isProviderRequestError(err))
|
|
350
|
+
throw err;
|
|
351
|
+
throw providerVendorError({ providerId: 'bedrock', error: err });
|
|
310
352
|
}
|
|
311
353
|
}
|
|
312
354
|
async listModels() {
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@namzu/bedrock",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.3",
|
|
4
4
|
"description": "AWS Bedrock LLM provider for @namzu/sdk. Provides Converse API (chat + streaming) with full tool-use support.",
|
|
5
5
|
"license": "FSL-1.1-MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -37,14 +37,14 @@
|
|
|
37
37
|
"@aws-sdk/client-bedrock-runtime": "^3.700.0"
|
|
38
38
|
},
|
|
39
39
|
"peerDependencies": {
|
|
40
|
-
"@namzu/sdk": ">=1.
|
|
40
|
+
"@namzu/sdk": ">=1.3.0"
|
|
41
41
|
},
|
|
42
42
|
"devDependencies": {
|
|
43
43
|
"@biomejs/biome": "^1.9.4",
|
|
44
44
|
"@types/node": "^22.19.17",
|
|
45
45
|
"typescript": "^5.5.0",
|
|
46
46
|
"vitest": "^2.0.0",
|
|
47
|
-
"@namzu/sdk": "^1.
|
|
47
|
+
"@namzu/sdk": "^1.4.0"
|
|
48
48
|
},
|
|
49
49
|
"scripts": {
|
|
50
50
|
"build": "tsc --build",
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provider error taxonomy — Bedrock driver.
|
|
3
|
+
*
|
|
4
|
+
* `chatStream` awaits `this.client.send(command)` with no catch, so an AWS
|
|
5
|
+
* `BedrockRuntimeServiceException` (`ThrottlingException`,
|
|
6
|
+
* `ValidationException`, `ServiceUnavailableException`, …) escapes verbatim.
|
|
7
|
+
* A caller cannot classify it without importing `@aws-sdk/client-bedrock-runtime`.
|
|
8
|
+
*
|
|
9
|
+
* Transport seam: `BedrockConfig` exposes no `requestHandler`/`endpoint`, so
|
|
10
|
+
* unlike the fetch-based drivers there is nothing to inject at the HTTP
|
|
11
|
+
* layer. The tests substitute the `BedrockRuntimeClient`'s `send` and reject
|
|
12
|
+
* with the REAL AWS exception classes — which is exactly what the driver
|
|
13
|
+
* sees from a live call, and the only surface the driver's (currently
|
|
14
|
+
* absent) error mapping would act on.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import {
|
|
18
|
+
AccessDeniedException,
|
|
19
|
+
ModelErrorException,
|
|
20
|
+
ServiceQuotaExceededException,
|
|
21
|
+
ServiceUnavailableException,
|
|
22
|
+
ThrottlingException,
|
|
23
|
+
ValidationException,
|
|
24
|
+
} from '@aws-sdk/client-bedrock-runtime'
|
|
25
|
+
import type { ConverseStreamOutput } from '@aws-sdk/client-bedrock-runtime'
|
|
26
|
+
import { describe, expect, it } from 'vitest'
|
|
27
|
+
import { BedrockProvider } from '../client.js'
|
|
28
|
+
|
|
29
|
+
/** Replace the AWS client's `send` so it rejects with `err`. */
|
|
30
|
+
function providerRejectingWith(err: unknown): BedrockProvider {
|
|
31
|
+
const provider = new BedrockProvider({ region: 'eu-west-1' })
|
|
32
|
+
;(provider as unknown as { client: { send: () => Promise<never> } }).client = {
|
|
33
|
+
send: () => Promise.reject(err),
|
|
34
|
+
}
|
|
35
|
+
return provider
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function providerStreaming(...events: ConverseStreamOutput[]): BedrockProvider {
|
|
39
|
+
const provider = new BedrockProvider({ region: 'eu-west-1' })
|
|
40
|
+
;(provider as unknown as { client: { send: () => Promise<unknown> } }).client = {
|
|
41
|
+
send: async () => ({
|
|
42
|
+
$metadata: { requestId: 'bedrock-test' },
|
|
43
|
+
stream: (async function* () {
|
|
44
|
+
yield* events
|
|
45
|
+
})(),
|
|
46
|
+
}),
|
|
47
|
+
}
|
|
48
|
+
return provider
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
async function captureChatStreamError(
|
|
52
|
+
provider: BedrockProvider,
|
|
53
|
+
signal?: AbortSignal,
|
|
54
|
+
): Promise<unknown> {
|
|
55
|
+
try {
|
|
56
|
+
for await (const _chunk of provider.chatStream({
|
|
57
|
+
model: 'anthropic.claude-sonnet-4-5-20250929-v1:0',
|
|
58
|
+
messages: [{ role: 'user', content: 'hi' }],
|
|
59
|
+
signal,
|
|
60
|
+
})) {
|
|
61
|
+
// drain
|
|
62
|
+
}
|
|
63
|
+
} catch (err) {
|
|
64
|
+
return err
|
|
65
|
+
}
|
|
66
|
+
throw new Error('expected chatStream to throw')
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
describe('@namzu/bedrock — provider error taxonomy', () => {
|
|
70
|
+
it('(a) ThrottlingException with `retry-after: 2` becomes a throttle-classified error carrying retryAfterMs', async () => {
|
|
71
|
+
const aws = new ThrottlingException({
|
|
72
|
+
message: 'Too many requests, please wait before trying again.',
|
|
73
|
+
$metadata: { httpStatusCode: 429 },
|
|
74
|
+
})
|
|
75
|
+
;(aws as unknown as { $response: unknown }).$response = {
|
|
76
|
+
statusCode: 429,
|
|
77
|
+
headers: { 'retry-after': '2' },
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const err = await captureChatStreamError(providerRejectingWith(aws))
|
|
81
|
+
|
|
82
|
+
expect(err).toMatchObject({
|
|
83
|
+
name: 'ProviderRequestError',
|
|
84
|
+
kind: 'throttle',
|
|
85
|
+
status: 429,
|
|
86
|
+
retryAfterMs: 2000,
|
|
87
|
+
providerId: 'bedrock',
|
|
88
|
+
})
|
|
89
|
+
})
|
|
90
|
+
|
|
91
|
+
it("(c) a ValidationException reporting too many input tokens classifies as 'context_overflow'", async () => {
|
|
92
|
+
const aws = new ValidationException({
|
|
93
|
+
message:
|
|
94
|
+
'Input is too long for requested model. The input token count exceeds the maximum for this model.',
|
|
95
|
+
$metadata: { httpStatusCode: 400 },
|
|
96
|
+
})
|
|
97
|
+
|
|
98
|
+
const err = await captureChatStreamError(providerRejectingWith(aws))
|
|
99
|
+
|
|
100
|
+
expect(err).toMatchObject({
|
|
101
|
+
name: 'ProviderRequestError',
|
|
102
|
+
kind: 'context_overflow',
|
|
103
|
+
status: 400,
|
|
104
|
+
providerId: 'bedrock',
|
|
105
|
+
})
|
|
106
|
+
})
|
|
107
|
+
|
|
108
|
+
it("(c) a ValidationException that is not an overflow classifies as 'bad_request'", async () => {
|
|
109
|
+
const aws = new ValidationException({
|
|
110
|
+
message: 'The value at toolConfig.tools failed to satisfy constraint.',
|
|
111
|
+
$metadata: { httpStatusCode: 400 },
|
|
112
|
+
})
|
|
113
|
+
|
|
114
|
+
const err = await captureChatStreamError(providerRejectingWith(aws))
|
|
115
|
+
|
|
116
|
+
expect(err).toMatchObject({
|
|
117
|
+
name: 'ProviderRequestError',
|
|
118
|
+
kind: 'bad_request',
|
|
119
|
+
status: 400,
|
|
120
|
+
providerId: 'bedrock',
|
|
121
|
+
})
|
|
122
|
+
})
|
|
123
|
+
|
|
124
|
+
it("an AccessDeniedException classifies as 'auth'", async () => {
|
|
125
|
+
const aws = new AccessDeniedException({
|
|
126
|
+
message: 'You do not have access to the model with the specified model ID.',
|
|
127
|
+
$metadata: { httpStatusCode: 403 },
|
|
128
|
+
})
|
|
129
|
+
|
|
130
|
+
const err = await captureChatStreamError(providerRejectingWith(aws))
|
|
131
|
+
|
|
132
|
+
expect(err).toMatchObject({
|
|
133
|
+
name: 'ProviderRequestError',
|
|
134
|
+
kind: 'auth',
|
|
135
|
+
status: 403,
|
|
136
|
+
providerId: 'bedrock',
|
|
137
|
+
})
|
|
138
|
+
})
|
|
139
|
+
|
|
140
|
+
it("a ServiceUnavailableException classifies as 'server'", async () => {
|
|
141
|
+
const aws = new ServiceUnavailableException({
|
|
142
|
+
message: 'The service is unavailable, try again later.',
|
|
143
|
+
$metadata: { httpStatusCode: 503 },
|
|
144
|
+
})
|
|
145
|
+
|
|
146
|
+
const err = await captureChatStreamError(providerRejectingWith(aws))
|
|
147
|
+
|
|
148
|
+
expect(err).toMatchObject({
|
|
149
|
+
name: 'ProviderRequestError',
|
|
150
|
+
kind: 'server',
|
|
151
|
+
status: 503,
|
|
152
|
+
providerId: 'bedrock',
|
|
153
|
+
})
|
|
154
|
+
})
|
|
155
|
+
|
|
156
|
+
it("a ModelErrorException with HTTP 424 still classifies as 'server'", async () => {
|
|
157
|
+
const aws = new ModelErrorException({
|
|
158
|
+
message: 'The model failed while processing the request.',
|
|
159
|
+
originalStatusCode: 500,
|
|
160
|
+
$metadata: { httpStatusCode: 424 },
|
|
161
|
+
})
|
|
162
|
+
|
|
163
|
+
const err = await captureChatStreamError(providerRejectingWith(aws))
|
|
164
|
+
|
|
165
|
+
expect(err).toMatchObject({
|
|
166
|
+
name: 'ProviderRequestError',
|
|
167
|
+
kind: 'server',
|
|
168
|
+
status: 424,
|
|
169
|
+
providerId: 'bedrock',
|
|
170
|
+
})
|
|
171
|
+
})
|
|
172
|
+
|
|
173
|
+
it("a ServiceQuotaExceededException classifies as 'throttle'", async () => {
|
|
174
|
+
const aws = new ServiceQuotaExceededException({
|
|
175
|
+
message: 'Account inference quota exceeded.',
|
|
176
|
+
$metadata: { httpStatusCode: 400 },
|
|
177
|
+
})
|
|
178
|
+
|
|
179
|
+
const err = await captureChatStreamError(providerRejectingWith(aws))
|
|
180
|
+
|
|
181
|
+
expect(err).toMatchObject({
|
|
182
|
+
name: 'ProviderRequestError',
|
|
183
|
+
kind: 'throttle',
|
|
184
|
+
status: 400,
|
|
185
|
+
providerId: 'bedrock',
|
|
186
|
+
})
|
|
187
|
+
})
|
|
188
|
+
|
|
189
|
+
it('classifies a throttling exception delivered as a stream union event', async () => {
|
|
190
|
+
const aws = new ThrottlingException({
|
|
191
|
+
message: 'stream quota exceeded',
|
|
192
|
+
$metadata: { httpStatusCode: 429 },
|
|
193
|
+
})
|
|
194
|
+
|
|
195
|
+
const err = await captureChatStreamError(providerStreaming({ throttlingException: aws }))
|
|
196
|
+
|
|
197
|
+
expect(err).toMatchObject({
|
|
198
|
+
name: 'ProviderRequestError',
|
|
199
|
+
kind: 'throttle',
|
|
200
|
+
status: 429,
|
|
201
|
+
providerId: 'bedrock',
|
|
202
|
+
})
|
|
203
|
+
})
|
|
204
|
+
|
|
205
|
+
it('drops a secret-bearing validation stream event without retaining cause', async () => {
|
|
206
|
+
const secret = 'aws-secret-FAKE-DO-NOT-LOG'
|
|
207
|
+
const aws = new ValidationException({
|
|
208
|
+
message: `invalid request echoed ${secret}`,
|
|
209
|
+
$metadata: { httpStatusCode: 400 },
|
|
210
|
+
})
|
|
211
|
+
|
|
212
|
+
const err = await captureChatStreamError(providerStreaming({ validationException: aws }))
|
|
213
|
+
|
|
214
|
+
expect(err).toMatchObject({
|
|
215
|
+
name: 'ProviderRequestError',
|
|
216
|
+
kind: 'bad_request',
|
|
217
|
+
providerId: 'bedrock',
|
|
218
|
+
})
|
|
219
|
+
expect((err as Error).message).not.toContain(secret)
|
|
220
|
+
expect('cause' in (err as object)).toBe(false)
|
|
221
|
+
})
|
|
222
|
+
|
|
223
|
+
it('preserves the caller abort reason when the SDK replaces the error object', async () => {
|
|
224
|
+
const controller = new AbortController()
|
|
225
|
+
const reason = new Error('user stopped')
|
|
226
|
+
const sdkAbort = Object.assign(new Error('request aborted'), {
|
|
227
|
+
name: 'AbortError',
|
|
228
|
+
})
|
|
229
|
+
controller.abort(reason)
|
|
230
|
+
|
|
231
|
+
const err = await captureChatStreamError(providerRejectingWith(sdkAbort), controller.signal)
|
|
232
|
+
|
|
233
|
+
expect(sdkAbort).not.toBe(reason)
|
|
234
|
+
expect(err).toBe(reason)
|
|
235
|
+
})
|
|
236
|
+
})
|
package/src/client.ts
CHANGED
|
@@ -7,6 +7,7 @@ import type {
|
|
|
7
7
|
Message as BedrockMessage,
|
|
8
8
|
ContentBlock,
|
|
9
9
|
ConversationRole,
|
|
10
|
+
ConverseStreamCommandOutput,
|
|
10
11
|
ConverseStreamOutput,
|
|
11
12
|
SystemContentBlock,
|
|
12
13
|
Tool,
|
|
@@ -23,6 +24,12 @@ import type {
|
|
|
23
24
|
TokenUsage,
|
|
24
25
|
ToolChoice,
|
|
25
26
|
} from '@namzu/sdk'
|
|
27
|
+
import {
|
|
28
|
+
ProviderRequestError,
|
|
29
|
+
isCallerAbortError,
|
|
30
|
+
isProviderRequestError,
|
|
31
|
+
providerVendorError,
|
|
32
|
+
} from '@namzu/sdk'
|
|
26
33
|
import type { BedrockConfig } from './types.js'
|
|
27
34
|
|
|
28
35
|
function extractSystemBlocks(messages: ChatCompletionParams['messages']): SystemContentBlock[] {
|
|
@@ -280,14 +287,29 @@ export class BedrockProvider implements LLMProvider {
|
|
|
280
287
|
inferenceConfig,
|
|
281
288
|
})
|
|
282
289
|
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
290
|
+
// AWS models failures as distinct exception CLASSES rather than status
|
|
291
|
+
// codes (ThrottlingException, ValidationException, AccessDeniedException),
|
|
292
|
+
// and lets them escape verbatim. Classify from the class name, then drop
|
|
293
|
+
// the AWS error — no re-throw, no `cause`.
|
|
294
|
+
let response: ConverseStreamCommandOutput
|
|
295
|
+
try {
|
|
296
|
+
response = await this.client.send(command, {
|
|
297
|
+
requestTimeout: this.config.timeout ?? 120_000,
|
|
298
|
+
// Per-request abort: a Stop tears the in-flight Converse stream down.
|
|
299
|
+
abortSignal: params.signal,
|
|
300
|
+
})
|
|
301
|
+
} catch (err) {
|
|
302
|
+
if (isCallerAbortError(err, params.signal)) throw params.signal?.reason ?? err
|
|
303
|
+
if (isProviderRequestError(err)) throw err
|
|
304
|
+
throw providerVendorError({ providerId: 'bedrock', error: err })
|
|
305
|
+
}
|
|
288
306
|
|
|
289
307
|
if (!response.stream) {
|
|
290
|
-
throw new
|
|
308
|
+
throw new ProviderRequestError({
|
|
309
|
+
kind: 'server',
|
|
310
|
+
providerId: 'bedrock',
|
|
311
|
+
detail: 'the response contained no stream body',
|
|
312
|
+
})
|
|
291
313
|
}
|
|
292
314
|
|
|
293
315
|
const requestId = response.$metadata.requestId ?? `bedrock-${Date.now()}`
|
|
@@ -295,94 +317,116 @@ export class BedrockProvider implements LLMProvider {
|
|
|
295
317
|
const activeToolCalls = new Map<number, { id: string; name: string; args: string }>()
|
|
296
318
|
let toolCallIndex = 0
|
|
297
319
|
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
320
|
+
try {
|
|
321
|
+
for await (const event of response.stream as AsyncIterable<ConverseStreamOutput>) {
|
|
322
|
+
// Stop pulling promptly on abort; `for await` calls the stream's
|
|
323
|
+
// `.return()` on this throw, releasing the connection.
|
|
324
|
+
params.signal?.throwIfAborted()
|
|
325
|
+
|
|
326
|
+
// Bedrock reports several post-handshake failures as UNION
|
|
327
|
+
// EVENTS, not thrown exceptions. Ignoring these members makes a
|
|
328
|
+
// throttled or failed stream look like a clean EOF.
|
|
329
|
+
const streamFailure =
|
|
330
|
+
('internalServerException' in event ? event.internalServerException : undefined) ??
|
|
331
|
+
('modelStreamErrorException' in event ? event.modelStreamErrorException : undefined) ??
|
|
332
|
+
('validationException' in event ? event.validationException : undefined) ??
|
|
333
|
+
('throttlingException' in event ? event.throttlingException : undefined) ??
|
|
334
|
+
('serviceUnavailableException' in event ? event.serviceUnavailableException : undefined)
|
|
335
|
+
if (streamFailure) {
|
|
336
|
+
throw providerVendorError({
|
|
337
|
+
providerId: 'bedrock',
|
|
338
|
+
error: streamFailure,
|
|
339
|
+
})
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
try {
|
|
343
|
+
if ('contentBlockDelta' in event && event.contentBlockDelta?.delta) {
|
|
344
|
+
const delta = event.contentBlockDelta.delta
|
|
345
|
+
if ('text' in delta && delta.text) {
|
|
346
|
+
yield {
|
|
347
|
+
id: requestId,
|
|
348
|
+
delta: { content: delta.text },
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
if ('toolUse' in delta && delta.toolUse) {
|
|
353
|
+
const idx = event.contentBlockDelta.contentBlockIndex ?? toolCallIndex
|
|
354
|
+
const active = activeToolCalls.get(idx)
|
|
355
|
+
if (active) {
|
|
356
|
+
active.args += delta.toolUse.input ?? ''
|
|
357
|
+
yield {
|
|
358
|
+
id: requestId,
|
|
359
|
+
delta: {
|
|
360
|
+
toolCalls: [
|
|
361
|
+
{
|
|
362
|
+
index: idx,
|
|
363
|
+
function: { arguments: delta.toolUse.input ?? '' },
|
|
364
|
+
},
|
|
365
|
+
],
|
|
366
|
+
},
|
|
367
|
+
}
|
|
368
|
+
}
|
|
309
369
|
}
|
|
310
370
|
}
|
|
311
371
|
|
|
312
|
-
if ('
|
|
313
|
-
const
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
372
|
+
if ('contentBlockStart' in event && event.contentBlockStart?.start) {
|
|
373
|
+
const start = event.contentBlockStart.start
|
|
374
|
+
if ('toolUse' in start && start.toolUse) {
|
|
375
|
+
const idx = event.contentBlockStart.contentBlockIndex ?? toolCallIndex
|
|
376
|
+
activeToolCalls.set(idx, {
|
|
377
|
+
id: start.toolUse.toolUseId ?? `tool-${Date.now()}`,
|
|
378
|
+
name: start.toolUse.name ?? '',
|
|
379
|
+
args: '',
|
|
380
|
+
})
|
|
317
381
|
yield {
|
|
318
382
|
id: requestId,
|
|
319
383
|
delta: {
|
|
320
384
|
toolCalls: [
|
|
321
385
|
{
|
|
322
386
|
index: idx,
|
|
323
|
-
|
|
387
|
+
id: start.toolUse.toolUseId,
|
|
388
|
+
type: 'function',
|
|
389
|
+
function: { name: start.toolUse.name ?? '' },
|
|
324
390
|
},
|
|
325
391
|
],
|
|
326
392
|
},
|
|
327
393
|
}
|
|
394
|
+
toolCallIndex = idx + 1
|
|
328
395
|
}
|
|
329
396
|
}
|
|
330
|
-
}
|
|
331
397
|
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
activeToolCalls.set(idx, {
|
|
337
|
-
id: start.toolUse.toolUseId ?? `tool-${Date.now()}`,
|
|
338
|
-
name: start.toolUse.name ?? '',
|
|
339
|
-
args: '',
|
|
340
|
-
})
|
|
398
|
+
if ('contentBlockStop' in event) {
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
if ('messageStop' in event && event.messageStop) {
|
|
341
402
|
yield {
|
|
342
403
|
id: requestId,
|
|
343
|
-
delta: {
|
|
344
|
-
|
|
345
|
-
{
|
|
346
|
-
index: idx,
|
|
347
|
-
id: start.toolUse.toolUseId,
|
|
348
|
-
type: 'function',
|
|
349
|
-
function: { name: start.toolUse.name ?? '' },
|
|
350
|
-
},
|
|
351
|
-
],
|
|
352
|
-
},
|
|
404
|
+
delta: {},
|
|
405
|
+
finishReason: mapStopReason(event.messageStop.stopReason),
|
|
353
406
|
}
|
|
354
|
-
toolCallIndex = idx + 1
|
|
355
|
-
}
|
|
356
|
-
}
|
|
357
|
-
|
|
358
|
-
if ('contentBlockStop' in event) {
|
|
359
|
-
}
|
|
360
|
-
|
|
361
|
-
if ('messageStop' in event && event.messageStop) {
|
|
362
|
-
yield {
|
|
363
|
-
id: requestId,
|
|
364
|
-
delta: {},
|
|
365
|
-
finishReason: mapStopReason(event.messageStop.stopReason),
|
|
366
407
|
}
|
|
367
|
-
}
|
|
368
408
|
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
409
|
+
if ('metadata' in event && event.metadata?.usage) {
|
|
410
|
+
const usage = parseUsage(event.metadata.usage as RawBedrockUsage)
|
|
411
|
+
yield {
|
|
412
|
+
id: requestId,
|
|
413
|
+
delta: {},
|
|
414
|
+
usage,
|
|
415
|
+
}
|
|
375
416
|
}
|
|
376
|
-
}
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
error: `Stream parse error: ${parseErr instanceof Error ? parseErr.message : String(parseErr)}`,
|
|
417
|
+
} catch (parseErr) {
|
|
418
|
+
if (isProviderRequestError(parseErr)) throw parseErr
|
|
419
|
+
throw new ProviderRequestError({
|
|
420
|
+
kind: 'server',
|
|
421
|
+
providerId: 'bedrock',
|
|
422
|
+
detail: 'the provider stream returned malformed data',
|
|
423
|
+
})
|
|
384
424
|
}
|
|
385
425
|
}
|
|
426
|
+
} catch (err) {
|
|
427
|
+
if (isCallerAbortError(err, params.signal)) throw params.signal?.reason ?? err
|
|
428
|
+
if (isProviderRequestError(err)) throw err
|
|
429
|
+
throw providerVendorError({ providerId: 'bedrock', error: err })
|
|
386
430
|
}
|
|
387
431
|
}
|
|
388
432
|
|