diff --git a/.changeset/allow-public-expert-without-api-key.md b/.changeset/allow-public-expert-without-api-key.md new file mode 100644 index 00000000..fb238b60 --- /dev/null +++ b/.changeset/allow-public-expert-without-api-key.md @@ -0,0 +1,7 @@ +--- +"@perstack/runtime": patch +"@perstack/installer": patch +"perstack": patch +--- + +Allow resolving public experts without PERSTACK_API_KEY. Public experts on the Perstack API do not require authentication. diff --git a/packages/installer/src/expert-resolver.ts b/packages/installer/src/expert-resolver.ts index b51539d1..9815eba0 100644 --- a/packages/installer/src/expert-resolver.ts +++ b/packages/installer/src/expert-resolver.ts @@ -158,13 +158,9 @@ export async function resolveAllExperts( if (toResolve.size === 0) { return experts } - const apiKey = env.PERSTACK_API_KEY - if (!apiKey) { - throw new PerstackError("PERSTACK_API_KEY is required to resolve remote delegates") - } const client = createApiClient({ baseUrl: config.perstackApiBaseUrl ?? defaultPerstackApiBaseUrl, - apiKey, + apiKey: env.PERSTACK_API_KEY ?? "", }) while (toResolve.size > 0) { const delegateKey = toResolve.values().next().value diff --git a/packages/runtime/src/helpers/resolve-expert.test.ts b/packages/runtime/src/helpers/resolve-expert.test.ts index 609b5023..d97875f6 100644 --- a/packages/runtime/src/helpers/resolve-expert.test.ts +++ b/packages/runtime/src/helpers/resolve-expert.test.ts @@ -116,12 +116,11 @@ describe("@perstack/runtime: resolveExpertToRun", () => { expect(experts["remote-expert"]).toBeUndefined() }) - it("throws error when API key is not provided for published expert", async () => { + it("fetches public expert from API without API key", async () => { const experts: Record = {} - await expect( - resolveExpertToRun("published-expert", experts, { - perstackApiBaseUrl: "https://api.test.com", - }), - ).rejects.toThrow('PERSTACK_API_KEY is required to resolve published expert "published-expert"') + const result = await resolveExpertToRun("published-expert", experts, { + perstackApiBaseUrl: "https://api.test.com", + }) + expect(result.key).toBe("published-expert") }) }) diff --git a/packages/runtime/src/helpers/resolve-expert.ts b/packages/runtime/src/helpers/resolve-expert.ts index e8f0eff6..dcd6e329 100644 --- a/packages/runtime/src/helpers/resolve-expert.ts +++ b/packages/runtime/src/helpers/resolve-expert.ts @@ -12,14 +12,9 @@ export async function resolveExpertToRun( if (experts[expertKey]) { return experts[expertKey] } - if (!clientOptions.perstackApiKey) { - throw new PerstackError( - `PERSTACK_API_KEY is required to resolve published expert "${expertKey}"`, - ) - } const client = createApiClient({ baseUrl: clientOptions.perstackApiBaseUrl, - apiKey: clientOptions.perstackApiKey, + apiKey: clientOptions.perstackApiKey ?? "", }) const result = await client.experts.get(expertKey) if (!result.ok) {