From 497179d15b0d09f394a15519513da3dec5bca44c Mon Sep 17 00:00:00 2001 From: Indra Zulfi Date: Tue, 2 Jun 2026 13:01:21 +0700 Subject: [PATCH] Fix Studio cookbook typecheck --- .changeset/studio-cookbook-typecheck.md | 5 +++++ .../content/docs/studio/configure/status.mdx | 2 +- .../docs/studio/inspect-context/memory.mdx | 2 +- .../09_studio/09-inspection-surfaces.ts | 7 +++--- examples/cookbook/tsconfig.json | 22 ++++++++++++++++++- package.json | 1 + packages/tools/studio/src/runtime/studio.ts | 6 +++-- packages/tools/studio/src/types.ts | 7 ++++-- 8 files changed, 42 insertions(+), 10 deletions(-) create mode 100644 .changeset/studio-cookbook-typecheck.md diff --git a/.changeset/studio-cookbook-typecheck.md b/.changeset/studio-cookbook-typecheck.md new file mode 100644 index 00000000..39b237cb --- /dev/null +++ b/.changeset/studio-cookbook-typecheck.md @@ -0,0 +1,5 @@ +--- +"@anvia/studio": patch +--- + +Allow Studio to accept typed pipelines with arbitrary input and output types, and update the cookbook Studio inspection example to point at the correct UI routes. diff --git a/apps/docs/content/docs/studio/configure/status.mdx b/apps/docs/content/docs/studio/configure/status.mdx index f24ebc0e..4b0da831 100644 --- a/apps/docs/content/docs/studio/configure/status.mdx +++ b/apps/docs/content/docs/studio/configure/status.mdx @@ -5,7 +5,7 @@ description: Inspect Studio runtime status, storage adapters, counts, and capabi The Status page gives a compact operational snapshot of the local Studio runtime. -Open `http://localhost:4021/status` after starting Studio. +Open `http://localhost:4021/ui/status` after starting Studio. ## HTTP Route diff --git a/apps/docs/content/docs/studio/inspect-context/memory.mdx b/apps/docs/content/docs/studio/inspect-context/memory.mdx index 86a34d8e..0fe3c450 100644 --- a/apps/docs/content/docs/studio/inspect-context/memory.mdx +++ b/apps/docs/content/docs/studio/inspect-context/memory.mdx @@ -5,7 +5,7 @@ description: Inspect stored Studio users, conversations, messages, and transcrip The Memory page is backed by Studio session storage. It summarizes stored sessions by user id, lists conversations, and shows the raw messages and UI transcript steps for a selected conversation. -Open `http://localhost:4021/memory` after starting Studio. +Open `http://localhost:4021/ui/memory` after starting Studio. ## What Studio Shows diff --git a/examples/cookbook/09_studio/09-inspection-surfaces.ts b/examples/cookbook/09_studio/09-inspection-surfaces.ts index 5a00f430..543c0c39 100644 --- a/examples/cookbook/09_studio/09-inspection-surfaces.ts +++ b/examples/cookbook/09_studio/09-inspection-surfaces.ts @@ -77,6 +77,7 @@ new Studio([agent], { }, }).start({ port: 4021 }); -console.log("Open http://localhost:4021/tools to run get_ticket directly."); -console.log("Open http://localhost:4021/memory after creating a session."); -console.log("Open http://localhost:4021/status for runtime counts and capabilities."); +console.log("Open http://localhost:4021/ui/tools to run get_ticket directly."); +console.log("Open http://localhost:4021/ui/memory after creating a session."); +console.log("Open http://localhost:4021/ui/status for runtime counts and capabilities."); +console.log("Open http://localhost:4021/status for the raw status API response."); diff --git a/examples/cookbook/tsconfig.json b/examples/cookbook/tsconfig.json index ad3d6122..6bc82e3e 100644 --- a/examples/cookbook/tsconfig.json +++ b/examples/cookbook/tsconfig.json @@ -1,9 +1,29 @@ { "extends": "../../tsconfig.base.json", "compilerOptions": { + "baseUrl": ".", "noEmit": true, + "lib": ["ES2022", "DOM", "DOM.Iterable"], "jsx": "react-jsx", - "jsxImportSource": "hono/jsx" + "jsxImportSource": "hono/jsx", + "paths": { + "@anvia/chroma": ["../../packages/vector-stores/chroma/src/index.ts"], + "@anvia/core": ["../../packages/core/src/index.ts"], + "@anvia/core/*": ["../../packages/core/src/*/index.ts"], + "@anvia/fastembed": ["../../packages/embeddings/fastembed/src/index.ts"], + "@anvia/gemini": ["../../packages/providers/gemini/src/index.ts"], + "@anvia/langfuse": ["../../packages/observability/langfuse/src/index.ts"], + "@anvia/logger": ["../../packages/logger/src/index.ts"], + "@anvia/mistral": ["../../packages/providers/mistral/src/index.ts"], + "@anvia/openai": ["../../packages/providers/openai/src/index.ts"], + "@anvia/otel": ["../../packages/observability/otel/src/index.ts"], + "@anvia/pgvector": ["../../packages/vector-stores/pgvector/src/index.ts"], + "@anvia/qdrant": ["../../packages/vector-stores/qdrant/src/index.ts"], + "@anvia/react": ["../../packages/react/src/index.ts"], + "@anvia/server": ["../../packages/server/src/index.ts"], + "@anvia/studio": ["../../packages/tools/studio/src/index.ts"], + "@anvia/transformers": ["../../packages/embeddings/transformers/src/index.ts"] + } }, "include": [ "01_basics/**/*.ts", diff --git a/package.json b/package.json index 35f21cfa..10b637d2 100644 --- a/package.json +++ b/package.json @@ -88,6 +88,7 @@ "cookbook:studio:06": "pnpm --filter cookbook studio:06", "cookbook:studio:07": "pnpm --filter cookbook studio:07", "cookbook:studio:08": "pnpm --filter cookbook studio:08", + "cookbook:studio:09": "pnpm --filter cookbook studio:09", "cookbook:integrations": "pnpm --filter cookbook integrations", "cookbook:integrations:01": "pnpm --filter cookbook integrations:01", "cookbook:integrations:02": "pnpm --filter cookbook integrations:02", diff --git a/packages/tools/studio/src/runtime/studio.ts b/packages/tools/studio/src/runtime/studio.ts index 521b74a8..fa75566f 100644 --- a/packages/tools/studio/src/runtime/studio.ts +++ b/packages/tools/studio/src/runtime/studio.ts @@ -169,7 +169,8 @@ function studioOptionsFromTargets( ): StudioRuntimeOptions { const agents = targets.filter((target): target is Agent => target instanceof Agent); const pipelines = targets.filter( - (target): target is Pipeline => target instanceof Pipeline, + // biome-ignore lint/suspicious/noExplicitAny: Studio accepts heterogeneous user pipelines. + (target): target is Pipeline => target instanceof Pipeline, ); return { agents: inferStudioAgents(agents, options.quickPrompts ?? {}), @@ -193,7 +194,8 @@ function inferStudioAgents(agents: Agent[], quickPrompts: Record>): StudioPipeline[] { +// biome-ignore lint/suspicious/noExplicitAny: Studio accepts heterogeneous user pipelines. +function inferStudioPipelines(pipelines: Array>): StudioPipeline[] { const ids = new Set(); return pipelines.map((pipeline) => { const id = uniqueAgentId(pipeline.id || "pipeline", ids); diff --git a/packages/tools/studio/src/types.ts b/packages/tools/studio/src/types.ts index ed3440c2..e055fae7 100644 --- a/packages/tools/studio/src/types.ts +++ b/packages/tools/studio/src/types.ts @@ -39,7 +39,9 @@ export type StudioAgent = { metadata?: JsonObject; }; -export type StudioTarget = Agent | Pipeline; +// Studio accepts arbitrary pipelines and validates run inputs at the HTTP boundary. +// biome-ignore lint/suspicious/noExplicitAny: input/output types remain user-defined outside Studio. +export type StudioTarget = Agent | Pipeline; export type StudioAgentConfig = { id: string; @@ -71,7 +73,8 @@ export type StudioAgentRuntimeSummary = { export type StudioPipeline = { id: string; - pipeline: Pipeline; + // biome-ignore lint/suspicious/noExplicitAny: Studio stores heterogeneous user pipelines. + pipeline: Pipeline; name?: string; description?: string; metadata?: JsonObject;