2026-06-02 02:58:19 -05:00
|
|
|
import { describe, expect, it } from "@effect/vitest";
|
|
|
|
|
import type { LlmChunk } from "@trustgraph/base";
|
2026-06-02 03:00:52 -05:00
|
|
|
import { providerRuntimeError, providerStatusError, toAsyncGenerator } from "../model/text-completion/common.js";
|
2026-06-02 02:58:19 -05:00
|
|
|
|
|
|
|
|
const emptyChunkIterator = (): AsyncIterable<LlmChunk> => ({
|
|
|
|
|
[Symbol.asyncIterator]: () => ({
|
|
|
|
|
next: () => Promise.resolve({ done: true, value: undefined }),
|
|
|
|
|
}),
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
describe("text completion common helpers", () => {
|
2026-06-02 03:00:52 -05:00
|
|
|
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",
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
2026-06-02 02:58:19 -05:00
|
|
|
it("maps fallback generator throw failures into tagged provider errors", async () => {
|
|
|
|
|
const generator = toAsyncGenerator(
|
|
|
|
|
emptyChunkIterator(),
|
|
|
|
|
(error) => providerRuntimeError("test-provider", error),
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
await expect(generator.throw("provider failed")).rejects.toMatchObject({
|
|
|
|
|
_tag: "TextCompletionProviderError",
|
|
|
|
|
provider: "test-provider",
|
|
|
|
|
message: "provider failed",
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
});
|