From 04845f6fd1900ed98a2033b5a7492feae88dcff9 Mon Sep 17 00:00:00 2001 From: HiranoMasaaki Date: Thu, 26 Feb 2026 02:08:23 +0000 Subject: [PATCH] fix: allow resolving public experts without PERSTACK_API_KEY Public experts do not require authentication. Remove the early throw that blocked API calls without an API key, allowing the client to attempt the request (the API returns public experts without auth). Co-Authored-By: Claude Opus 4.6 --- .changeset/allow-public-expert-without-api-key.md | 7 +++++++ packages/installer/src/expert-resolver.ts | 6 +----- packages/runtime/src/helpers/resolve-expert.test.ts | 11 +++++------ packages/runtime/src/helpers/resolve-expert.ts | 7 +------ 4 files changed, 14 insertions(+), 17 deletions(-) create mode 100644 .changeset/allow-public-expert-without-api-key.md 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) {