@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 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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"}
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EACX,oBAAoB,EAEpB,WAAW,EACX,SAAS,EACT,oBAAoB,EACpB,WAAW,EAGX,MAAM,YAAY,CAAA;AACnB,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;IA6HrE,UAAU,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAmClC,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;CAerC"}
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
- const response = await this.client.send(command, {
216
- requestTimeout: this.config.timeout ?? 120_000,
217
- // Per-request abort: a Stop tears the in-flight Converse stream down.
218
- abortSignal: params.signal,
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 Error('Bedrock returned no stream body');
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
- for await (const event of response.stream) {
227
- // Stop pulling promptly on abort; `for await` calls the stream's
228
- // `.return()` on this throw, releasing the connection.
229
- params.signal?.throwIfAborted();
230
- try {
231
- if ('contentBlockDelta' in event && event.contentBlockDelta?.delta) {
232
- const delta = event.contentBlockDelta.delta;
233
- if ('text' in delta && delta.text) {
234
- yield {
235
- id: requestId,
236
- delta: { content: delta.text },
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 ('toolUse' in delta && delta.toolUse) {
240
- const idx = event.contentBlockDelta.contentBlockIndex ?? toolCallIndex;
241
- const active = activeToolCalls.get(idx);
242
- if (active) {
243
- active.args += delta.toolUse.input ?? '';
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
- function: { arguments: delta.toolUse.input ?? '' },
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
- if ('contentBlockStart' in event && event.contentBlockStart?.start) {
259
- const start = event.contentBlockStart.start;
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
- toolCalls: [
271
- {
272
- index: idx,
273
- id: start.toolUse.toolUseId,
274
- type: 'function',
275
- function: { name: start.toolUse.name ?? '' },
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
- if ('contentBlockStop' in event) {
284
- }
285
- if ('messageStop' in event && event.messageStop) {
286
- yield {
287
- id: requestId,
288
- delta: {},
289
- finishReason: mapStopReason(event.messageStop.stopReason),
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
- catch (parseErr) {
302
- yield {
303
- id: requestId,
304
- delta: { content: undefined },
305
- finishReason: undefined,
306
- usage: undefined,
307
- error: `Stream parse error: ${parseErr instanceof Error ? parseErr.message : String(parseErr)}`,
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() {
@@ -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.2",
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.0.0"
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.2.0"
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
- const response = await this.client.send(command, {
284
- requestTimeout: this.config.timeout ?? 120_000,
285
- // Per-request abort: a Stop tears the in-flight Converse stream down.
286
- abortSignal: params.signal,
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 Error('Bedrock returned no stream body')
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
- for await (const event of response.stream as AsyncIterable<ConverseStreamOutput>) {
299
- // Stop pulling promptly on abort; `for await` calls the stream's
300
- // `.return()` on this throw, releasing the connection.
301
- params.signal?.throwIfAborted()
302
- try {
303
- if ('contentBlockDelta' in event && event.contentBlockDelta?.delta) {
304
- const delta = event.contentBlockDelta.delta
305
- if ('text' in delta && delta.text) {
306
- yield {
307
- id: requestId,
308
- delta: { content: delta.text },
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 ('toolUse' in delta && delta.toolUse) {
313
- const idx = event.contentBlockDelta.contentBlockIndex ?? toolCallIndex
314
- const active = activeToolCalls.get(idx)
315
- if (active) {
316
- active.args += delta.toolUse.input ?? ''
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
- function: { arguments: delta.toolUse.input ?? '' },
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
- if ('contentBlockStart' in event && event.contentBlockStart?.start) {
333
- const start = event.contentBlockStart.start
334
- if ('toolUse' in start && start.toolUse) {
335
- const idx = event.contentBlockStart.contentBlockIndex ?? toolCallIndex
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
- toolCalls: [
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
- if ('metadata' in event && event.metadata?.usage) {
370
- const usage = parseUsage(event.metadata.usage as RawBedrockUsage)
371
- yield {
372
- id: requestId,
373
- delta: {},
374
- usage,
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
- } catch (parseErr) {
378
- yield {
379
- id: requestId,
380
- delta: { content: undefined },
381
- finishReason: undefined,
382
- usage: undefined,
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