@useatlas/sdk
Advanced tools
+16
-1
@@ -269,5 +269,20 @@ /** | ||
| rows: Record<string, unknown>[]; | ||
| } | { | ||
| } | ||
| /** | ||
| * Mid-stream error. | ||
| * | ||
| * Atlas serializes mid-stream errors as a `ChatErrorInfo`-shaped JSON | ||
| * body inside the SSE error frame's `errorText` so callers can branch | ||
| * on the typed `code` instead of regex-scraping the message. When | ||
| * `errorText` is not parseable as that body (a plain-text frame from a | ||
| * non-Atlas server, a malformed payload, or a non-JSON error) only | ||
| * `message` is set. | ||
| */ | ||
| | { | ||
| type: "error"; | ||
| message: string; | ||
| code?: string; | ||
| retryable?: boolean; | ||
| retryAfterSeconds?: number; | ||
| requestId?: string; | ||
| } | ||
@@ -274,0 +289,0 @@ /** Client-side: emitted when an SSE frame contains invalid JSON. */ |
+27
-1
@@ -275,5 +275,31 @@ // src/client.ts | ||
| case "error": { | ||
| const raw = event.errorText ?? event.message ?? "Unknown error"; | ||
| let message = raw; | ||
| let code; | ||
| let retryable; | ||
| let retryAfterSeconds; | ||
| let requestId; | ||
| try { | ||
| const parsed = JSON.parse(raw); | ||
| if (parsed && typeof parsed === "object") { | ||
| if (typeof parsed.error === "string") | ||
| code = parsed.error; | ||
| if (typeof parsed.message === "string") | ||
| message = parsed.message; | ||
| if (typeof parsed.retryable === "boolean") | ||
| retryable = parsed.retryable; | ||
| if (typeof parsed.retryAfterSeconds === "number") { | ||
| retryAfterSeconds = parsed.retryAfterSeconds; | ||
| } | ||
| if (typeof parsed.requestId === "string") | ||
| requestId = parsed.requestId; | ||
| } | ||
| } catch {} | ||
| yield { | ||
| type: "error", | ||
| message: event.errorText ?? event.message ?? "Unknown error" | ||
| message, | ||
| ...code !== undefined && { code }, | ||
| ...retryable !== undefined && { retryable }, | ||
| ...retryAfterSeconds !== undefined && { retryAfterSeconds }, | ||
| ...requestId !== undefined && { requestId } | ||
| }; | ||
@@ -280,0 +306,0 @@ break; |
+27
-1
@@ -275,5 +275,31 @@ // src/client.ts | ||
| case "error": { | ||
| const raw = event.errorText ?? event.message ?? "Unknown error"; | ||
| let message = raw; | ||
| let code; | ||
| let retryable; | ||
| let retryAfterSeconds; | ||
| let requestId; | ||
| try { | ||
| const parsed = JSON.parse(raw); | ||
| if (parsed && typeof parsed === "object") { | ||
| if (typeof parsed.error === "string") | ||
| code = parsed.error; | ||
| if (typeof parsed.message === "string") | ||
| message = parsed.message; | ||
| if (typeof parsed.retryable === "boolean") | ||
| retryable = parsed.retryable; | ||
| if (typeof parsed.retryAfterSeconds === "number") { | ||
| retryAfterSeconds = parsed.retryAfterSeconds; | ||
| } | ||
| if (typeof parsed.requestId === "string") | ||
| requestId = parsed.requestId; | ||
| } | ||
| } catch {} | ||
| yield { | ||
| type: "error", | ||
| message: event.errorText ?? event.message ?? "Unknown error" | ||
| message, | ||
| ...code !== undefined && { code }, | ||
| ...retryable !== undefined && { retryable }, | ||
| ...retryAfterSeconds !== undefined && { retryAfterSeconds }, | ||
| ...requestId !== undefined && { requestId } | ||
| }; | ||
@@ -280,0 +306,0 @@ break; |
+2
-2
| { | ||
| "name": "@useatlas/sdk", | ||
| "version": "0.0.11", | ||
| "version": "0.0.12", | ||
| "description": "TypeScript SDK for the Atlas text-to-SQL agent API", | ||
@@ -47,4 +47,4 @@ "type": "module", | ||
| "dependencies": { | ||
| "@useatlas/types": "^0.0.11" | ||
| "@useatlas/types": "^0.0.16" | ||
| } | ||
| } |
+8
-2
@@ -127,3 +127,9 @@ # @useatlas/sdk | ||
| case "error": | ||
| console.error(event.message); | ||
| // Mid-stream errors carry a typed `code` and a `retryAfterSeconds` | ||
| // delta when the server emits a structured `ChatErrorInfo` body | ||
| // (e.g. provider rate limiting). Older servers populate only `message`. | ||
| console.error(event.code ?? "error", event.message); | ||
| if (event.retryable && event.retryAfterSeconds !== undefined) { | ||
| console.warn(`Server suggests retrying in ${event.retryAfterSeconds}s`); | ||
| } | ||
| break; | ||
@@ -197,3 +203,3 @@ case "parse-error": | ||
| | `result` | `columns`, `rows` | Convenience event extracted from `tool-result` when `executeSQL` returns data. Both `tool-result` and `result` are emitted. | | ||
| | `error` | `message` | Error during streaming | | ||
| | `error` | `message`, `code?`, `retryable?`, `retryAfterSeconds?`, `requestId?` | Mid-stream error. When the server sends a structured `ChatErrorInfo` body (`provider_rate_limit`, `provider_timeout`, etc.) the typed `code` and upstream `Retry-After` delta travel alongside the human-readable `message`. Older servers populate only `message`. | | ||
| | `parse-error` | `raw`, `error` | Client-side: an SSE frame contained invalid JSON. The raw data is preserved for debugging. | | ||
@@ -200,0 +206,0 @@ | `finish` | `reason` | Stream completed | |
67302
5.58%1576
4.44%259
2.37%+ Added
- Removed
Updated