diff options
Diffstat (limited to 'packages/provider-umans/src')
| -rw-r--r-- | packages/provider-umans/src/extension.test.ts | 68 | ||||
| -rw-r--r-- | packages/provider-umans/src/extension.ts | 58 | ||||
| -rw-r--r-- | packages/provider-umans/src/index.ts | 8 | ||||
| -rw-r--r-- | packages/provider-umans/src/reasoning.test.ts | 36 | ||||
| -rw-r--r-- | packages/provider-umans/src/reasoning.ts | 18 | ||||
| -rw-r--r-- | packages/provider-umans/src/resolver.test.ts | 64 | ||||
| -rw-r--r-- | packages/provider-umans/src/resolver.ts | 22 |
7 files changed, 137 insertions, 137 deletions
diff --git a/packages/provider-umans/src/extension.test.ts b/packages/provider-umans/src/extension.test.ts index 59efddc..07b4f4c 100644 --- a/packages/provider-umans/src/extension.test.ts +++ b/packages/provider-umans/src/extension.test.ts @@ -4,49 +4,49 @@ import { activate, manifest } from "./extension.js"; import type { EnvSource } from "./resolver.js"; function makeFakeHost(overrides: { configGet?: (key: string) => unknown }): { - host: HostAPI; - defineProvider: ReturnType<typeof vi.fn>; - warn: ReturnType<typeof vi.fn>; - info: ReturnType<typeof vi.fn>; + host: HostAPI; + defineProvider: ReturnType<typeof vi.fn>; + warn: ReturnType<typeof vi.fn>; + info: ReturnType<typeof vi.fn>; } { - const defineProvider = vi.fn(); - const warn = vi.fn(); - const info = vi.fn(); - const host = { - defineProvider, - config: { get: overrides.configGet ?? (() => undefined) }, - logger: { debug: vi.fn(), info, warn, error: vi.fn() }, - } as unknown as HostAPI; - return { host, defineProvider, warn, info }; + const defineProvider = vi.fn(); + const warn = vi.fn(); + const info = vi.fn(); + const host = { + defineProvider, + config: { get: overrides.configGet ?? (() => undefined) }, + logger: { debug: vi.fn(), info, warn, error: vi.fn() }, + } as unknown as HostAPI; + return { host, defineProvider, warn, info }; } describe("provider-umans activation", () => { - it('activate registers the "umans" provider when UMANS_API_KEY is set (defineProvider called with id "umans")', async () => { - const { host, defineProvider } = makeFakeHost({}); - const env: EnvSource = { UMANS_API_KEY: "sk-test" }; + it('activate registers the "umans" provider when UMANS_API_KEY is set (defineProvider called with id "umans")', async () => { + const { host, defineProvider } = makeFakeHost({}); + const env: EnvSource = { UMANS_API_KEY: "sk-test" }; - await activate(host, env); + await activate(host, env); - expect(defineProvider).toHaveBeenCalledTimes(1); - expect(defineProvider.mock.calls[0]?.[0]?.id).toBe("umans"); - }); + expect(defineProvider).toHaveBeenCalledTimes(1); + expect(defineProvider.mock.calls[0]?.[0]?.id).toBe("umans"); + }); - it("activate does NOT register + warns when UMANS_API_KEY is unset", async () => { - const { host, defineProvider, warn } = makeFakeHost({}); - const env: EnvSource = {}; + it("activate does NOT register + warns when UMANS_API_KEY is unset", async () => { + const { host, defineProvider, warn } = makeFakeHost({}); + const env: EnvSource = {}; - await activate(host, env); + await activate(host, env); - expect(defineProvider).not.toHaveBeenCalled(); - expect(warn).toHaveBeenCalledWith("provider-umans: no UMANS_API_KEY. Provider not registered."); - }); + expect(defineProvider).not.toHaveBeenCalled(); + expect(warn).toHaveBeenCalledWith("provider-umans: no UMANS_API_KEY. Provider not registered."); + }); - it("declares no dependsOn (self-contained, reads env directly)", () => { - expect(manifest.dependsOn).toBeUndefined(); - }); + it("declares no dependsOn (self-contained, reads env directly)", () => { + expect(manifest.dependsOn).toBeUndefined(); + }); - it("declares the umans provider contribution + network capability", () => { - expect(manifest.contributes?.providers).toEqual(["umans"]); - expect(manifest.capabilities?.network).toBe(true); - }); + it("declares the umans provider contribution + network capability", () => { + expect(manifest.contributes?.providers).toEqual(["umans"]); + expect(manifest.capabilities?.network).toBe(true); + }); }); diff --git a/packages/provider-umans/src/extension.ts b/packages/provider-umans/src/extension.ts index 74f8481..da77724 100644 --- a/packages/provider-umans/src/extension.ts +++ b/packages/provider-umans/src/extension.ts @@ -4,14 +4,14 @@ import { transformBody } from "./reasoning.js"; import { type EnvSource, resolveUmansConfig } from "./resolver.js"; export const manifest: Manifest = { - id: "provider-umans", - name: "Umans AI Coding Plan", - version: "0.0.0", - apiVersion: "^0.1.0", - trust: "bundled", - activation: "eager", - capabilities: { network: true }, - contributes: { providers: ["umans"] }, + id: "provider-umans", + name: "Umans AI Coding Plan", + version: "0.0.0", + apiVersion: "^0.1.0", + trust: "bundled", + activation: "eager", + capabilities: { network: true }, + contributes: { providers: ["umans"] }, }; /** @@ -26,30 +26,30 @@ export const manifest: Manifest = { * No `UMANS_API_KEY` is a config state, not an error — warn + skip registration. */ export async function activate(host: HostAPI, env: EnvSource = process.env): Promise<void> { - const configModel = host.config.get<string>("provider.umans.model"); - const cfg = resolveUmansConfig(env, configModel); - if (!cfg) { - host.logger.warn("provider-umans: no UMANS_API_KEY. Provider not registered."); - return; - } + const configModel = host.config.get<string>("provider.umans.model"); + const cfg = resolveUmansConfig(env, configModel); + if (!cfg) { + host.logger.warn("provider-umans: no UMANS_API_KEY. Provider not registered."); + return; + } - const credentials: ApiKeyCredentials = { - type: "api-key", - apiKey: cfg.apiKey, - baseURL: cfg.baseURL, - }; + const credentials: ApiKeyCredentials = { + type: "api-key", + apiKey: cfg.apiKey, + baseURL: cfg.baseURL, + }; - const provider = createOpenAICompatProvider({ - credentials, - model: cfg.model, - id: "umans", - transformBody, - }); - host.defineProvider(provider); - host.logger.info(`provider-umans: registered (model=${cfg.model})`); + const provider = createOpenAICompatProvider({ + credentials, + model: cfg.model, + id: "umans", + transformBody, + }); + host.defineProvider(provider); + host.logger.info(`provider-umans: registered (model=${cfg.model})`); } export const extension: Extension = { - manifest, - activate, + manifest, + activate, }; diff --git a/packages/provider-umans/src/index.ts b/packages/provider-umans/src/index.ts index d4d143b..241028e 100644 --- a/packages/provider-umans/src/index.ts +++ b/packages/provider-umans/src/index.ts @@ -1,8 +1,8 @@ export { activate, extension, manifest } from "./extension.js"; export { mapReasoningEffort, transformBody } from "./reasoning.js"; export { - type EnvSource, - resolveUmansConfig, - toUmansCredentials, - type UmansConfig, + type EnvSource, + resolveUmansConfig, + toUmansCredentials, + type UmansConfig, } from "./resolver.js"; diff --git a/packages/provider-umans/src/reasoning.test.ts b/packages/provider-umans/src/reasoning.test.ts index 2e57e25..a31b8cf 100644 --- a/packages/provider-umans/src/reasoning.test.ts +++ b/packages/provider-umans/src/reasoning.test.ts @@ -2,27 +2,27 @@ import { describe, expect, it } from "vitest"; import { mapReasoningEffort, transformBody } from "./reasoning.js"; describe("mapReasoningEffort", () => { - it('mapReasoningEffort: low → "low", medium → "medium", high → "high", xhigh → "high", max → "high"', () => { - expect(mapReasoningEffort("low")).toBe("low"); - expect(mapReasoningEffort("medium")).toBe("medium"); - expect(mapReasoningEffort("high")).toBe("high"); - expect(mapReasoningEffort("xhigh")).toBe("high"); - expect(mapReasoningEffort("max")).toBe("high"); - }); + it('mapReasoningEffort: low → "low", medium → "medium", high → "high", xhigh → "high", max → "high"', () => { + expect(mapReasoningEffort("low")).toBe("low"); + expect(mapReasoningEffort("medium")).toBe("medium"); + expect(mapReasoningEffort("high")).toBe("high"); + expect(mapReasoningEffort("xhigh")).toBe("high"); + expect(mapReasoningEffort("max")).toBe("high"); + }); - it("mapReasoningEffort: undefined → undefined (no field)", () => { - expect(mapReasoningEffort(undefined)).toBe(undefined); - }); + it("mapReasoningEffort: undefined → undefined (no field)", () => { + expect(mapReasoningEffort(undefined)).toBe(undefined); + }); }); describe("transformBody", () => { - it("transformBody adds reasoning_effort when opts.reasoningEffort is set", () => { - const result = transformBody({}, { reasoningEffort: "high" }); - expect(result).toEqual({ reasoning_effort: "high" }); - }); + it("transformBody adds reasoning_effort when opts.reasoningEffort is set", () => { + const result = transformBody({}, { reasoningEffort: "high" }); + expect(result).toEqual({ reasoning_effort: "high" }); + }); - it("transformBody adds nothing when opts.reasoningEffort is absent (byte-stable)", () => { - const result = transformBody({}, {}); - expect(result).toEqual({}); - }); + it("transformBody adds nothing when opts.reasoningEffort is absent (byte-stable)", () => { + const result = transformBody({}, {}); + expect(result).toEqual({}); + }); }); diff --git a/packages/provider-umans/src/reasoning.ts b/packages/provider-umans/src/reasoning.ts index 9015848..22b3202 100644 --- a/packages/provider-umans/src/reasoning.ts +++ b/packages/provider-umans/src/reasoning.ts @@ -12,11 +12,11 @@ import type { ProviderStreamOptions, ReasoningEffort } from "@dispatch/kernel"; * Pure: the `transformBody` decision, factored out for direct unit testing. */ export function mapReasoningEffort( - effort: ReasoningEffort | undefined, + effort: ReasoningEffort | undefined, ): "low" | "medium" | "high" | undefined { - if (effort === undefined) return undefined; - if (effort === "xhigh" || effort === "max") return "high"; - return effort; + if (effort === undefined) return undefined; + if (effort === "xhigh" || effort === "max") return "high"; + return effort; } /** @@ -27,10 +27,10 @@ export function mapReasoningEffort( * byte-stable for calls with no reasoning preference. */ export function transformBody( - _body: Record<string, unknown>, - opts: ProviderStreamOptions, + _body: Record<string, unknown>, + opts: ProviderStreamOptions, ): Record<string, unknown> { - const mapped = mapReasoningEffort(opts.reasoningEffort); - if (mapped === undefined) return {}; - return { reasoning_effort: mapped }; + const mapped = mapReasoningEffort(opts.reasoningEffort); + if (mapped === undefined) return {}; + return { reasoning_effort: mapped }; } diff --git a/packages/provider-umans/src/resolver.test.ts b/packages/provider-umans/src/resolver.test.ts index 47d436e..966c1bf 100644 --- a/packages/provider-umans/src/resolver.test.ts +++ b/packages/provider-umans/src/resolver.test.ts @@ -2,42 +2,42 @@ import { describe, expect, it } from "vitest"; import { resolveUmansConfig } from "./resolver.js"; describe("resolveUmansConfig", () => { - it("activate uses UMANS_BASE_URL override when set (default otherwise)", () => { - const override = resolveUmansConfig( - { UMANS_API_KEY: "sk-test", UMANS_BASE_URL: "https://custom.example.com/v1" }, - undefined, - ); - expect(override?.baseURL).toBe("https://custom.example.com/v1"); + it("activate uses UMANS_BASE_URL override when set (default otherwise)", () => { + const override = resolveUmansConfig( + { UMANS_API_KEY: "sk-test", UMANS_BASE_URL: "https://custom.example.com/v1" }, + undefined, + ); + expect(override?.baseURL).toBe("https://custom.example.com/v1"); - const fallback = resolveUmansConfig({ UMANS_API_KEY: "sk-test" }, undefined); - expect(fallback?.baseURL).toBe("https://api.code.umans.ai/v1"); - }); + const fallback = resolveUmansConfig({ UMANS_API_KEY: "sk-test" }, undefined); + expect(fallback?.baseURL).toBe("https://api.code.umans.ai/v1"); + }); - it('activate uses config provider.umans.model → UMANS_MODEL → "umans-coder" resolution', () => { - // config wins over env + default - const fromConfig = resolveUmansConfig( - { UMANS_API_KEY: "sk-test", UMANS_MODEL: "env-model" }, - "config-model", - ); - expect(fromConfig?.model).toBe("config-model"); + it('activate uses config provider.umans.model → UMANS_MODEL → "umans-coder" resolution', () => { + // config wins over env + default + const fromConfig = resolveUmansConfig( + { UMANS_API_KEY: "sk-test", UMANS_MODEL: "env-model" }, + "config-model", + ); + expect(fromConfig?.model).toBe("config-model"); - // env wins when config is absent - const fromEnv = resolveUmansConfig( - { UMANS_API_KEY: "sk-test", UMANS_MODEL: "env-model" }, - undefined, - ); - expect(fromEnv?.model).toBe("env-model"); + // env wins when config is absent + const fromEnv = resolveUmansConfig( + { UMANS_API_KEY: "sk-test", UMANS_MODEL: "env-model" }, + undefined, + ); + expect(fromEnv?.model).toBe("env-model"); - // default when neither is set - const fromDefault = resolveUmansConfig({ UMANS_API_KEY: "sk-test" }, undefined); - expect(fromDefault?.model).toBe("umans-coder"); - }); + // default when neither is set + const fromDefault = resolveUmansConfig({ UMANS_API_KEY: "sk-test" }, undefined); + expect(fromDefault?.model).toBe("umans-coder"); + }); - it("returns null when UMANS_API_KEY is unset", () => { - expect(resolveUmansConfig({}, undefined)).toBeNull(); - }); + it("returns null when UMANS_API_KEY is unset", () => { + expect(resolveUmansConfig({}, undefined)).toBeNull(); + }); - it("returns null when UMANS_API_KEY is empty string", () => { - expect(resolveUmansConfig({ UMANS_API_KEY: "" }, undefined)).toBeNull(); - }); + it("returns null when UMANS_API_KEY is empty string", () => { + expect(resolveUmansConfig({ UMANS_API_KEY: "" }, undefined)).toBeNull(); + }); }); diff --git a/packages/provider-umans/src/resolver.ts b/packages/provider-umans/src/resolver.ts index 416a281..5f0e76e 100644 --- a/packages/provider-umans/src/resolver.ts +++ b/packages/provider-umans/src/resolver.ts @@ -8,9 +8,9 @@ const DEFAULT_MODEL = "umans-coder"; * and model that `activate` threads into `createOpenAICompatProvider`. */ export interface UmansConfig { - readonly apiKey: string; - readonly baseURL: string; - readonly model: string; + readonly apiKey: string; + readonly baseURL: string; + readonly model: string; } /** @@ -32,14 +32,14 @@ export type EnvSource = Readonly<Record<string, string | undefined>>; * unit testing with zero mocks. */ export function resolveUmansConfig( - env: EnvSource, - configModel: string | undefined, + env: EnvSource, + configModel: string | undefined, ): UmansConfig | null { - const apiKey = env.UMANS_API_KEY; - if (!apiKey) return null; - const baseURL = env.UMANS_BASE_URL ?? DEFAULT_BASE_URL; - const model = configModel ?? env.UMANS_MODEL ?? DEFAULT_MODEL; - return { apiKey, baseURL, model }; + const apiKey = env.UMANS_API_KEY; + if (!apiKey) return null; + const baseURL = env.UMANS_BASE_URL ?? DEFAULT_BASE_URL; + const model = configModel ?? env.UMANS_MODEL ?? DEFAULT_MODEL; + return { apiKey, baseURL, model }; } /** @@ -47,5 +47,5 @@ export function resolveUmansConfig( * — `baseURL` on the credential so it is overridable per-credential. */ export function toUmansCredentials(cfg: UmansConfig): ApiKeyCredentials { - return { type: "api-key", apiKey: cfg.apiKey, baseURL: cfg.baseURL }; + return { type: "api-key", apiKey: cfg.apiKey, baseURL: cfg.baseURL }; } |
