Narrow provider status errors with Predicate

This commit is contained in:
elpresidank 2026-06-02 03:00:52 -05:00
parent b3aaa9a4af
commit b51dc33786
3 changed files with 39 additions and 6 deletions

View file

@ -1,6 +1,6 @@
import { describe, expect, it } from "@effect/vitest";
import type { LlmChunk } from "@trustgraph/base";
import { providerRuntimeError, toAsyncGenerator } from "../model/text-completion/common.js";
import { providerRuntimeError, providerStatusError, toAsyncGenerator } from "../model/text-completion/common.js";
const emptyChunkIterator = (): AsyncIterable<LlmChunk> => ({
[Symbol.asyncIterator]: () => ({
@ -9,6 +9,18 @@ const emptyChunkIterator = (): AsyncIterable<LlmChunk> => ({
});
describe("text completion common helpers", () => {
it("maps provider rate-limit status fields to tagged retry errors", () => {
expect(providerStatusError("test-provider", { status: 429 })).toMatchObject({
_tag: "TooManyRequestsError",
message: "Rate limit exceeded",
});
expect(providerStatusError("test-provider", { statusCode: 429 })).toMatchObject({
_tag: "TooManyRequestsError",
message: "Rate limit exceeded",
});
});
it("maps fallback generator throw failures into tagged provider errors", async () => {
const generator = toAsyncGenerator(
emptyChunkIterator(),

View file

@ -5,6 +5,7 @@ import {
} from "@trustgraph/base";
import { Config, Effect } from "effect";
import * as O from "effect/Option";
import * as Predicate from "effect/Predicate";
import * as S from "effect/Schema";
export class TextCompletionConfigError extends S.TaggedErrorClass<TextCompletionConfigError>()(
@ -68,11 +69,11 @@ export const providerStatusError = (
provider: string,
error: unknown,
): TextCompletionRuntimeError => {
const status = typeof error === "object" && error !== null && "status" in error
? (error as { readonly status?: unknown }).status
const status = Predicate.isObject(error) && Predicate.hasProperty(error, "status")
? error.status
: undefined;
const statusCode = typeof error === "object" && error !== null && "statusCode" in error
? (error as { readonly statusCode?: unknown }).statusCode
const statusCode = Predicate.isObject(error) && Predicate.hasProperty(error, "statusCode")
? error.statusCode
: undefined;
return status === 429 || statusCode === 429
? TooManyRequestsError.make({ message: "Rate limit exceeded" })