@anvia/core 0.7.0 → 0.7.2-preview.20260620T153502.752ef82

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -195,8 +195,9 @@ const ticket = await extractor.extract(
195
195
 
196
196
  ```ts
197
197
  import { PipelineBuilder } from "@anvia/core/pipeline";
198
+ import { z } from "zod";
198
199
 
199
- const pipeline = new PipelineBuilder<string>()
200
+ const pipeline = new PipelineBuilder(z.string())
200
201
  .step((input) => `Extract this support ticket:\n\n${input}`)
201
202
  .prompt(agent)
202
203
  .extract(extractor)
@@ -1,3 +1,4 @@
1
+ import { z } from 'zod';
1
2
  import { e as Agent } from '../agent-BW19m79B.js';
2
3
  import { J as JsonObject, C as CompletionModel } from '../types-C8loR4il.js';
3
4
  import { Extractor } from '../extractor/index.js';
@@ -8,7 +9,6 @@ import '../middleware-CZocYAtZ.js';
8
9
  import '../types-IB2e9u5M.js';
9
10
  import '../vector-store/index.js';
10
11
  import '../zod-schema-C7F4clpm.js';
11
- import 'zod';
12
12
 
13
13
  /** Minimal interface for anything that can run as a pipeline stage. */
14
14
  interface PipelineOp<Input = unknown, Output = unknown> {
@@ -108,8 +108,8 @@ declare class Pipeline<Input, Output> implements PipelineOp<Input, Awaited<Outpu
108
108
  declare class PipelineBuilder<Input, Output = Input> {
109
109
  private readonly executor;
110
110
  private readonly state;
111
- constructor();
112
- constructor(metadata: PipelineMetadata);
111
+ constructor(schema: z.ZodType<Output, Input>);
112
+ constructor(schema: z.ZodType<Output, Input>, metadata: PipelineMetadata);
113
113
  constructor(executor: (input: Input) => Output | Promise<Output>);
114
114
  constructor(executor: PipelineExecutor<Input, Output>, state: PipelineBuilderState);
115
115
  /** Add a synchronous or asynchronous transform stage. */
@@ -5,6 +5,9 @@ import {
5
5
  mapWithConcurrency
6
6
  } from "../chunk-OIMLU4SF.js";
7
7
 
8
+ // src/pipeline/builder.ts
9
+ import { z } from "zod";
10
+
8
11
  // src/pipeline/graph.ts
9
12
  function initialBuilderState(metadata) {
10
13
  return {
@@ -189,10 +192,10 @@ async function runNode(context, node, fn) {
189
192
  var PipelineBuilder = class _PipelineBuilder {
190
193
  executor;
191
194
  state;
192
- constructor(metadataOrExecutor, state) {
193
- if (state !== void 0) {
195
+ constructor(metadataOrExecutor, stateOrMetadata) {
196
+ if (stateOrMetadata !== void 0 && isBuilderState(stateOrMetadata)) {
194
197
  this.executor = metadataOrExecutor;
195
- this.state = state;
198
+ this.state = stateOrMetadata;
196
199
  return;
197
200
  }
198
201
  if (typeof metadataOrExecutor === "function") {
@@ -201,6 +204,13 @@ var PipelineBuilder = class _PipelineBuilder {
201
204
  this.state = initialBuilderState({});
202
205
  return;
203
206
  }
207
+ if (isZodSchema(metadataOrExecutor)) {
208
+ const schema = metadataOrExecutor;
209
+ const metadata = stateOrMetadata !== void 0 && isPipelineMetadata(stateOrMetadata) ? stateOrMetadata : {};
210
+ this.executor = ((input) => schema.parse(input));
211
+ this.state = initialBuilderState(metadata);
212
+ return;
213
+ }
204
214
  this.executor = identity;
205
215
  this.state = initialBuilderState(metadataOrExecutor ?? {});
206
216
  }
@@ -338,6 +348,23 @@ var PipelineBuilder = class _PipelineBuilder {
338
348
  function identity(input) {
339
349
  return input;
340
350
  }
351
+ function isZodSchema(value) {
352
+ return value instanceof z.ZodType;
353
+ }
354
+ function isBuilderState(value) {
355
+ if (typeof value !== "object" || value === null || Array.isArray(value)) {
356
+ return false;
357
+ }
358
+ const candidate = value;
359
+ return "graph" in candidate && "terminalNodeId" in candidate && "terminalNodeIds" in candidate && "nextNodeIndex" in candidate && "nextEdgeIndex" in candidate;
360
+ }
361
+ function isPipelineMetadata(value) {
362
+ if (typeof value !== "object" || value === null || Array.isArray(value)) {
363
+ return false;
364
+ }
365
+ const candidate = value;
366
+ return "id" in candidate || "name" in candidate || "description" in candidate || "metadata" in candidate;
367
+ }
341
368
  export {
342
369
  Pipeline,
343
370
  PipelineBuilder
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/pipeline/graph.ts","../../src/pipeline/pipeline.ts","../../src/pipeline/runtime.ts","../../src/pipeline/builder.ts"],"sourcesContent":["import type { JsonObject } from \"../completion\";\nimport { compact } from \"../internal/compact\";\nimport type {\n PipelineBuilderState,\n PipelineGraph,\n PipelineGraphNode,\n PipelineMetadata,\n PipelineStageKind,\n} from \"./types\";\n\nexport function initialBuilderState(metadata: PipelineMetadata): PipelineBuilderState {\n return {\n graph: initialGraph(metadata),\n terminalNodeId: \"input\",\n terminalNodeIds: [\"input\"],\n nextNodeIndex: 1,\n nextEdgeIndex: 1,\n };\n}\n\nexport function initialGraph(metadata: PipelineMetadata): PipelineGraph {\n const id = normalizeId(metadata.id ?? \"pipeline\");\n return {\n ...compact({\n id,\n name: metadata.name,\n description: metadata.description,\n metadata: metadata.metadata,\n }),\n nodes: [{ id: \"input\", kind: \"input\", label: \"Input\" }],\n edges: [],\n };\n}\n\nexport function appendNode(\n state: PipelineBuilderState,\n kind: PipelineStageKind,\n label: string,\n options: {\n description?: string | undefined;\n metadata?: JsonObject | undefined;\n preferredId?: string | undefined;\n agentId?: string | undefined;\n agentName?: string | undefined;\n pipelineId?: string | undefined;\n } = {},\n): { state: PipelineBuilderState; node: PipelineGraphNode } {\n const node = graphNode(kind, label, state.nextNodeIndex, {\n ...options,\n existingIds: new Set(state.graph.nodes.map((item) => item.id)),\n });\n return {\n node,\n state: appendGraphNode(state, node, activeTerminalNodeIds(state), [node.id]),\n };\n}\n\nexport function appendChildNode(\n state: PipelineBuilderState,\n parentId: string,\n kind: PipelineStageKind,\n label: string,\n options: {\n branchKey?: string | undefined;\n } = {},\n): { state: PipelineBuilderState; node: PipelineGraphNode } {\n const node = graphNode(kind, label, state.nextNodeIndex, {\n ...options,\n existingIds: new Set(state.graph.nodes.map((item) => item.id)),\n });\n return {\n node,\n state: appendGraphNode(state, node, [parentId], activeTerminalNodeIds(state)),\n };\n}\n\nexport function activeTerminalNodeIds(state: PipelineBuilderState): string[] {\n return state.terminalNodeIds.length > 0 ? state.terminalNodeIds : [state.terminalNodeId];\n}\n\nexport function withTerminalNodes(\n state: PipelineBuilderState,\n terminalNodeIds: string[],\n): PipelineBuilderState {\n return {\n ...state,\n terminalNodeId: terminalNodeIds.at(-1) ?? state.terminalNodeId,\n terminalNodeIds,\n };\n}\n\nexport function withOutputNode(state: PipelineBuilderState): PipelineGraph {\n const graph = cloneGraph(state.graph);\n if (graph.nodes.some((node) => node.id === \"output\")) {\n return graph;\n }\n graph.nodes.push({ id: \"output\", kind: \"output\", label: \"Output\" });\n graph.edges.push(\n ...activeTerminalNodeIds(state).map((sourceId, index) => ({\n id: `edge_${state.nextEdgeIndex + index}`,\n source: sourceId,\n target: \"output\",\n })),\n );\n return graph;\n}\n\nexport function nextStageLabel(state: PipelineBuilderState, prefix: string): string {\n return `${prefix} ${state.nextNodeIndex}`;\n}\n\nexport function cloneGraph(graph: PipelineGraph): PipelineGraph {\n return {\n ...graph,\n nodes: graph.nodes.map((node) => ({ ...node })),\n edges: graph.edges.map((edge) => ({ ...edge })),\n };\n}\n\nfunction appendGraphNode(\n state: PipelineBuilderState,\n node: PipelineGraphNode,\n sourceIds: string[],\n terminalNodeIds: string[],\n): PipelineBuilderState {\n const edges = sourceIds.map((sourceId, index) => ({\n id: `edge_${state.nextEdgeIndex + index}`,\n source: sourceId,\n target: node.id,\n }));\n const terminalNodeId = terminalNodeIds.at(-1) ?? state.terminalNodeId;\n return {\n graph: {\n ...state.graph,\n nodes: [...state.graph.nodes, node],\n edges: [...state.graph.edges, ...edges],\n },\n terminalNodeId,\n terminalNodeIds,\n nextNodeIndex: state.nextNodeIndex + 1,\n nextEdgeIndex: state.nextEdgeIndex + edges.length,\n };\n}\n\nfunction graphNode(\n kind: PipelineStageKind,\n label: string,\n index: number,\n options: {\n description?: string | undefined;\n metadata?: JsonObject | undefined;\n preferredId?: string | undefined;\n agentId?: string | undefined;\n agentName?: string | undefined;\n pipelineId?: string | undefined;\n branchKey?: string | undefined;\n existingIds?: Set<string> | undefined;\n } = {},\n): PipelineGraphNode {\n const id = uniqueGraphNodeId(\n normalizeId(options.preferredId ?? `${kind}_${index}`),\n options.existingIds ?? new Set(),\n );\n return compact({\n id,\n kind,\n label,\n description: options.description,\n metadata: options.metadata,\n agentId: options.agentId,\n agentName: options.agentName,\n pipelineId: options.pipelineId,\n branchKey: options.branchKey,\n }) as PipelineGraphNode;\n}\n\nfunction normalizeId(value: string): string {\n const normalized = value\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9_-]+/g, \"_\")\n .replace(/^_+|_+$/g, \"\");\n return normalized.length === 0 ? \"pipeline\" : normalized;\n}\n\nfunction uniqueGraphNodeId(baseId: string, existingIds: Set<string>): string {\n let id = baseId;\n let suffix = 2;\n while (existingIds.has(id)) {\n id = `${baseId}_${suffix}`;\n suffix += 1;\n }\n return id;\n}\n","import type { JsonObject } from \"../completion\";\nimport { mapWithConcurrency } from \"../internal/concurrency\";\nimport { cloneGraph, initialGraph } from \"./graph\";\nimport type {\n PipelineBatchOptions,\n PipelineExecutor,\n PipelineGraph,\n PipelineOp,\n PipelineRunOptions,\n} from \"./types\";\n\n/** Runnable pipeline returned by `PipelineBuilder.build()`. */\nexport class Pipeline<Input, Output> implements PipelineOp<Input, Awaited<Output>> {\n readonly id: string;\n readonly name: string | undefined;\n readonly description: string | undefined;\n readonly metadata: JsonObject | undefined;\n\n constructor(\n private readonly executor: PipelineExecutor<Input, Output>,\n private readonly pipelineGraph: PipelineGraph = initialGraph({}),\n ) {\n this.id = pipelineGraph.id;\n this.name = pipelineGraph.name;\n this.description = pipelineGraph.description;\n this.metadata = pipelineGraph.metadata;\n }\n\n /** Run one input through the built pipeline and return the final stage output. */\n async run(input: Input, options: PipelineRunOptions = {}): Promise<Awaited<Output>> {\n return (await this.executor(input, { observer: options.observer })) as Awaited<Output>;\n }\n\n /** Run many inputs through the same pipeline with bounded concurrency. */\n async batch<I extends Iterable<Input>>(\n inputs: I,\n options: PipelineBatchOptions,\n ): Promise<Array<Awaited<Output>>> {\n return mapWithConcurrency([...inputs], options.concurrency, (input) => this.run(input));\n }\n\n graph(): PipelineGraph {\n return cloneGraph(this.pipelineGraph);\n }\n}\n","import type { PipelineGraphNode, PipelineRunContext } from \"./types\";\n\nexport async function runNode<Output>(\n context: PipelineRunContext,\n node: PipelineGraphNode,\n fn: () => Output | Promise<Output>,\n): Promise<Awaited<Output>> {\n const startedAt = Date.now();\n await context.observer?.onEvent({ type: \"stage_started\", node });\n try {\n const output = (await fn()) as Awaited<Output>;\n await context.observer?.onEvent({\n type: \"stage_completed\",\n node,\n durationMs: Date.now() - startedAt,\n });\n return output;\n } catch (error) {\n await context.observer?.onEvent({\n type: \"stage_failed\",\n node,\n durationMs: Date.now() - startedAt,\n error,\n });\n throw error;\n }\n}\n","import type { Agent } from \"../agent/agent\";\nimport type { CompletionModel } from \"../completion\";\nimport type { Extractor } from \"../extractor\";\nimport {\n appendChildNode,\n appendNode,\n initialBuilderState,\n nextStageLabel,\n withOutputNode,\n withTerminalNodes,\n} from \"./graph\";\nimport { Pipeline } from \"./pipeline\";\nimport { runNode } from \"./runtime\";\nimport type {\n ParallelOutput,\n PipelineBuilderState,\n PipelineExecutor,\n PipelineGraphNode,\n PipelineMetadata,\n PipelineOp,\n PipelineRunContext,\n PipelineStageMetadata,\n} from \"./types\";\n\n/** Builds a typed pipeline from an original input type to an inferred output type. */\nexport class PipelineBuilder<Input, Output = Input> {\n private readonly executor: PipelineExecutor<Input, Output>;\n private readonly state: PipelineBuilderState;\n\n constructor();\n constructor(metadata: PipelineMetadata);\n constructor(executor: (input: Input) => Output | Promise<Output>);\n constructor(executor: PipelineExecutor<Input, Output>, state: PipelineBuilderState);\n constructor(\n metadataOrExecutor?:\n | PipelineMetadata\n | ((input: Input) => Output | Promise<Output>)\n | PipelineExecutor<Input, Output>,\n state?: PipelineBuilderState,\n ) {\n if (state !== undefined) {\n this.executor = metadataOrExecutor as PipelineExecutor<Input, Output>;\n this.state = state;\n return;\n }\n\n if (typeof metadataOrExecutor === \"function\") {\n const executor = metadataOrExecutor as (input: Input) => Output | Promise<Output>;\n this.executor = ((input) => executor(input)) as PipelineExecutor<Input, Output>;\n this.state = initialBuilderState({});\n return;\n }\n\n this.executor = identity as PipelineExecutor<Input, Output>;\n this.state = initialBuilderState(metadataOrExecutor ?? {});\n }\n\n /** Add a synchronous or asynchronous transform stage. */\n step<Next>(\n fn: (input: Awaited<Output>) => Next | Promise<Next>,\n metadata?: PipelineStageMetadata,\n ): PipelineBuilder<Input, Awaited<Next>> {\n const next = appendNode(\n this.state,\n \"step\",\n metadata?.name ?? nextStageLabel(this.state, \"Step\"),\n {\n description: metadata?.description,\n metadata: metadata?.metadata,\n preferredId: metadata?.id,\n },\n );\n return new PipelineBuilder<Input, Awaited<Next>>(\n async (input, context): Promise<Awaited<Next>> => {\n const value = await this.runStep(input, context);\n const result = await runNode(context, next.node, () => fn(value));\n return result as Awaited<Next>;\n },\n next.state,\n );\n }\n\n /** Compose another pipeline operation after the current stage. */\n use<Next>(\n op: PipelineOp<Awaited<Output>, Next>,\n metadata?: PipelineStageMetadata,\n ): PipelineBuilder<Input, Awaited<Next>> {\n const nested = op instanceof Pipeline ? op : undefined;\n const next = appendNode(\n this.state,\n nested === undefined ? \"step\" : \"pipeline\",\n metadata?.name ??\n nested?.name ??\n nested?.id ??\n nextStageLabel(this.state, nested === undefined ? \"Operation\" : \"Pipeline\"),\n {\n description: metadata?.description ?? nested?.description,\n metadata: metadata?.metadata ?? nested?.metadata,\n preferredId: metadata?.id,\n pipelineId: nested?.id,\n },\n );\n return new PipelineBuilder<Input, Awaited<Next>>(\n async (input, context): Promise<Awaited<Next>> => {\n const value = await this.runStep(input, context);\n const result = await runNode(context, next.node, () => op.run(value));\n return result as Awaited<Next>;\n },\n next.state,\n );\n }\n\n /** Run named branch operations concurrently from the current value. */\n parallel<Branches extends Record<string, PipelineOp<Awaited<Output>, unknown>>>(\n branches: Branches,\n metadata?: PipelineStageMetadata,\n ): PipelineBuilder<Input, ParallelOutput<Branches>> {\n const parallel = appendNode(\n this.state,\n \"parallel\",\n metadata?.name ?? `${Object.keys(branches).length} parallel branches`,\n {\n description: metadata?.description,\n metadata: metadata?.metadata,\n preferredId: metadata?.id,\n },\n );\n let nextState = parallel.state;\n const branchNodes: Record<string, PipelineGraphNode> = {};\n for (const key of Object.keys(branches)) {\n const branch = appendChildNode(nextState, parallel.node.id, \"branch\", key, {\n branchKey: key,\n });\n nextState = branch.state;\n branchNodes[key] = branch.node;\n }\n nextState = withTerminalNodes(\n nextState,\n Object.values(branchNodes).map((node) => node.id),\n );\n\n return new PipelineBuilder<Input, ParallelOutput<Branches>>(async (input, context) => {\n const value = await this.runStep(input, context);\n const entries = await runNode(context, parallel.node, () =>\n Promise.all(\n Object.entries(branches).map(async ([key, op]) => {\n const node = branchNodes[key] as PipelineGraphNode;\n const output = await runNode(context, node, () => op.run(value));\n return [key, output] as const;\n }),\n ),\n );\n return Object.fromEntries(entries) as ParallelOutput<Branches>;\n }, nextState);\n }\n\n /** Send the current value to an agent as text and continue with the agent output. */\n prompt(\n agent: Agent<CompletionModel>,\n metadata?: PipelineStageMetadata,\n ): PipelineBuilder<Input, string> {\n const next = appendNode(this.state, \"agent\", metadata?.name ?? agent.name ?? agent.id, {\n description: metadata?.description ?? agent.description,\n metadata: metadata?.metadata,\n preferredId: metadata?.id,\n agentId: agent.id,\n agentName: agent.name,\n });\n return new PipelineBuilder<Input, string>(async (input, context) => {\n const value = await this.runStep(input, context);\n return runNode(context, next.node, async () => {\n const response = await agent.prompt(String(value)).send();\n return response.output;\n });\n }, next.state);\n }\n\n /** Send the current value to an extractor as text and continue with typed schema data. */\n extract<T>(\n extractor: Extractor<T, CompletionModel>,\n metadata?: PipelineStageMetadata,\n ): PipelineBuilder<Input, T> {\n const next = appendNode(\n this.state,\n \"extractor\",\n metadata?.name ?? nextStageLabel(this.state, \"Extractor\"),\n {\n description: metadata?.description,\n metadata: metadata?.metadata,\n preferredId: metadata?.id,\n },\n );\n return new PipelineBuilder<Input, T>(async (input, context) => {\n const value = await this.runStep(input, context);\n return runNode(context, next.node, () => extractor.extract(String(value)));\n }, next.state);\n }\n\n /** Finish the builder and return a runnable pipeline. */\n build(): Pipeline<Input, Awaited<Output>> {\n const graph = withOutputNode(this.state);\n return new Pipeline<Input, Awaited<Output>>(\n (input, context) => this.runStep(input, context) as Promise<Awaited<Output>>,\n graph,\n );\n }\n\n private async runStep(input: Input, context: PipelineRunContext): Promise<Awaited<Output>> {\n return (await this.executor(input, context)) as Awaited<Output>;\n }\n}\n\nfunction identity<T>(input: T): T {\n return input;\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/pipeline/builder.ts","../../src/pipeline/graph.ts","../../src/pipeline/pipeline.ts","../../src/pipeline/runtime.ts"],"sourcesContent":["import { z } from \"zod\";\nimport type { Agent } from \"../agent/agent\";\nimport type { CompletionModel } from \"../completion\";\nimport type { Extractor } from \"../extractor\";\nimport {\n appendChildNode,\n appendNode,\n initialBuilderState,\n nextStageLabel,\n withOutputNode,\n withTerminalNodes,\n} from \"./graph\";\nimport { Pipeline } from \"./pipeline\";\nimport { runNode } from \"./runtime\";\nimport type {\n ParallelOutput,\n PipelineBuilderState,\n PipelineExecutor,\n PipelineGraphNode,\n PipelineMetadata,\n PipelineOp,\n PipelineRunContext,\n PipelineStageMetadata,\n} from \"./types\";\n\n/** Builds a typed pipeline from an original input type to an inferred output type. */\nexport class PipelineBuilder<Input, Output = Input> {\n private readonly executor: PipelineExecutor<Input, Output>;\n private readonly state: PipelineBuilderState;\n\n constructor(schema: z.ZodType<Output, Input>);\n constructor(schema: z.ZodType<Output, Input>, metadata: PipelineMetadata);\n constructor(executor: (input: Input) => Output | Promise<Output>);\n constructor(executor: PipelineExecutor<Input, Output>, state: PipelineBuilderState);\n constructor(\n metadataOrExecutor?:\n | PipelineMetadata\n | z.ZodType\n | ((input: Input) => Output | Promise<Output>)\n | PipelineExecutor<Input, Output>,\n stateOrMetadata?: PipelineBuilderState | PipelineMetadata,\n ) {\n if (stateOrMetadata !== undefined && isBuilderState(stateOrMetadata)) {\n this.executor = metadataOrExecutor as PipelineExecutor<Input, Output>;\n this.state = stateOrMetadata;\n return;\n }\n\n if (typeof metadataOrExecutor === \"function\") {\n const executor = metadataOrExecutor as (input: Input) => Output | Promise<Output>;\n this.executor = ((input) => executor(input)) as PipelineExecutor<Input, Output>;\n this.state = initialBuilderState({});\n return;\n }\n\n if (isZodSchema(metadataOrExecutor)) {\n const schema = metadataOrExecutor;\n const metadata: PipelineMetadata =\n stateOrMetadata !== undefined && isPipelineMetadata(stateOrMetadata) ? stateOrMetadata : {};\n this.executor = ((input) => schema.parse(input)) as PipelineExecutor<Input, Output>;\n this.state = initialBuilderState(metadata);\n return;\n }\n\n this.executor = identity as PipelineExecutor<Input, Output>;\n this.state = initialBuilderState((metadataOrExecutor as PipelineMetadata | undefined) ?? {});\n }\n\n /** Add a synchronous or asynchronous transform stage. */\n step<Next>(\n fn: (input: Awaited<Output>) => Next | Promise<Next>,\n metadata?: PipelineStageMetadata,\n ): PipelineBuilder<Input, Awaited<Next>> {\n const next = appendNode(\n this.state,\n \"step\",\n metadata?.name ?? nextStageLabel(this.state, \"Step\"),\n {\n description: metadata?.description,\n metadata: metadata?.metadata,\n preferredId: metadata?.id,\n },\n );\n return new PipelineBuilder<Input, Awaited<Next>>(\n async (input, context): Promise<Awaited<Next>> => {\n const value = await this.runStep(input, context);\n const result = await runNode(context, next.node, () => fn(value));\n return result as Awaited<Next>;\n },\n next.state,\n );\n }\n\n /** Compose another pipeline operation after the current stage. */\n use<Next>(\n op: PipelineOp<Awaited<Output>, Next>,\n metadata?: PipelineStageMetadata,\n ): PipelineBuilder<Input, Awaited<Next>> {\n const nested = op instanceof Pipeline ? op : undefined;\n const next = appendNode(\n this.state,\n nested === undefined ? \"step\" : \"pipeline\",\n metadata?.name ??\n nested?.name ??\n nested?.id ??\n nextStageLabel(this.state, nested === undefined ? \"Operation\" : \"Pipeline\"),\n {\n description: metadata?.description ?? nested?.description,\n metadata: metadata?.metadata ?? nested?.metadata,\n preferredId: metadata?.id,\n pipelineId: nested?.id,\n },\n );\n return new PipelineBuilder<Input, Awaited<Next>>(\n async (input, context): Promise<Awaited<Next>> => {\n const value = await this.runStep(input, context);\n const result = await runNode(context, next.node, () => op.run(value));\n return result as Awaited<Next>;\n },\n next.state,\n );\n }\n\n /** Run named branch operations concurrently from the current value. */\n parallel<Branches extends Record<string, PipelineOp<Awaited<Output>, unknown>>>(\n branches: Branches,\n metadata?: PipelineStageMetadata,\n ): PipelineBuilder<Input, ParallelOutput<Branches>> {\n const parallel = appendNode(\n this.state,\n \"parallel\",\n metadata?.name ?? `${Object.keys(branches).length} parallel branches`,\n {\n description: metadata?.description,\n metadata: metadata?.metadata,\n preferredId: metadata?.id,\n },\n );\n let nextState = parallel.state;\n const branchNodes: Record<string, PipelineGraphNode> = {};\n for (const key of Object.keys(branches)) {\n const branch = appendChildNode(nextState, parallel.node.id, \"branch\", key, {\n branchKey: key,\n });\n nextState = branch.state;\n branchNodes[key] = branch.node;\n }\n nextState = withTerminalNodes(\n nextState,\n Object.values(branchNodes).map((node) => node.id),\n );\n\n return new PipelineBuilder<Input, ParallelOutput<Branches>>(async (input, context) => {\n const value = await this.runStep(input, context);\n const entries = await runNode(context, parallel.node, () =>\n Promise.all(\n Object.entries(branches).map(async ([key, op]) => {\n const node = branchNodes[key] as PipelineGraphNode;\n const output = await runNode(context, node, () => op.run(value));\n return [key, output] as const;\n }),\n ),\n );\n return Object.fromEntries(entries) as ParallelOutput<Branches>;\n }, nextState);\n }\n\n /** Send the current value to an agent as text and continue with the agent output. */\n prompt(\n agent: Agent<CompletionModel>,\n metadata?: PipelineStageMetadata,\n ): PipelineBuilder<Input, string> {\n const next = appendNode(this.state, \"agent\", metadata?.name ?? agent.name ?? agent.id, {\n description: metadata?.description ?? agent.description,\n metadata: metadata?.metadata,\n preferredId: metadata?.id,\n agentId: agent.id,\n agentName: agent.name,\n });\n return new PipelineBuilder<Input, string>(async (input, context) => {\n const value = await this.runStep(input, context);\n return runNode(context, next.node, async () => {\n const response = await agent.prompt(String(value)).send();\n return response.output;\n });\n }, next.state);\n }\n\n /** Send the current value to an extractor as text and continue with typed schema data. */\n extract<T>(\n extractor: Extractor<T, CompletionModel>,\n metadata?: PipelineStageMetadata,\n ): PipelineBuilder<Input, T> {\n const next = appendNode(\n this.state,\n \"extractor\",\n metadata?.name ?? nextStageLabel(this.state, \"Extractor\"),\n {\n description: metadata?.description,\n metadata: metadata?.metadata,\n preferredId: metadata?.id,\n },\n );\n return new PipelineBuilder<Input, T>(async (input, context) => {\n const value = await this.runStep(input, context);\n return runNode(context, next.node, () => extractor.extract(String(value)));\n }, next.state);\n }\n\n /** Finish the builder and return a runnable pipeline. */\n build(): Pipeline<Input, Awaited<Output>> {\n const graph = withOutputNode(this.state);\n return new Pipeline<Input, Awaited<Output>>(\n (input, context) => this.runStep(input, context) as Promise<Awaited<Output>>,\n graph,\n );\n }\n\n private async runStep(input: Input, context: PipelineRunContext): Promise<Awaited<Output>> {\n return (await this.executor(input, context)) as Awaited<Output>;\n }\n}\n\nfunction identity<T>(input: T): T {\n return input;\n}\n\nfunction isZodSchema(value: unknown): value is z.ZodType {\n return value instanceof z.ZodType;\n}\n\nfunction isBuilderState(value: unknown): value is PipelineBuilderState {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n return false;\n }\n const candidate = value as Record<string, unknown>;\n return (\n \"graph\" in candidate &&\n \"terminalNodeId\" in candidate &&\n \"terminalNodeIds\" in candidate &&\n \"nextNodeIndex\" in candidate &&\n \"nextEdgeIndex\" in candidate\n );\n}\n\nfunction isPipelineMetadata(value: unknown): value is PipelineMetadata {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n return false;\n }\n const candidate = value as Record<string, unknown>;\n return (\n \"id\" in candidate ||\n \"name\" in candidate ||\n \"description\" in candidate ||\n \"metadata\" in candidate\n );\n}\n","import type { JsonObject } from \"../completion\";\nimport { compact } from \"../internal/compact\";\nimport type {\n PipelineBuilderState,\n PipelineGraph,\n PipelineGraphNode,\n PipelineMetadata,\n PipelineStageKind,\n} from \"./types\";\n\nexport function initialBuilderState(metadata: PipelineMetadata): PipelineBuilderState {\n return {\n graph: initialGraph(metadata),\n terminalNodeId: \"input\",\n terminalNodeIds: [\"input\"],\n nextNodeIndex: 1,\n nextEdgeIndex: 1,\n };\n}\n\nexport function initialGraph(metadata: PipelineMetadata): PipelineGraph {\n const id = normalizeId(metadata.id ?? \"pipeline\");\n return {\n ...compact({\n id,\n name: metadata.name,\n description: metadata.description,\n metadata: metadata.metadata,\n }),\n nodes: [{ id: \"input\", kind: \"input\", label: \"Input\" }],\n edges: [],\n };\n}\n\nexport function appendNode(\n state: PipelineBuilderState,\n kind: PipelineStageKind,\n label: string,\n options: {\n description?: string | undefined;\n metadata?: JsonObject | undefined;\n preferredId?: string | undefined;\n agentId?: string | undefined;\n agentName?: string | undefined;\n pipelineId?: string | undefined;\n } = {},\n): { state: PipelineBuilderState; node: PipelineGraphNode } {\n const node = graphNode(kind, label, state.nextNodeIndex, {\n ...options,\n existingIds: new Set(state.graph.nodes.map((item) => item.id)),\n });\n return {\n node,\n state: appendGraphNode(state, node, activeTerminalNodeIds(state), [node.id]),\n };\n}\n\nexport function appendChildNode(\n state: PipelineBuilderState,\n parentId: string,\n kind: PipelineStageKind,\n label: string,\n options: {\n branchKey?: string | undefined;\n } = {},\n): { state: PipelineBuilderState; node: PipelineGraphNode } {\n const node = graphNode(kind, label, state.nextNodeIndex, {\n ...options,\n existingIds: new Set(state.graph.nodes.map((item) => item.id)),\n });\n return {\n node,\n state: appendGraphNode(state, node, [parentId], activeTerminalNodeIds(state)),\n };\n}\n\nexport function activeTerminalNodeIds(state: PipelineBuilderState): string[] {\n return state.terminalNodeIds.length > 0 ? state.terminalNodeIds : [state.terminalNodeId];\n}\n\nexport function withTerminalNodes(\n state: PipelineBuilderState,\n terminalNodeIds: string[],\n): PipelineBuilderState {\n return {\n ...state,\n terminalNodeId: terminalNodeIds.at(-1) ?? state.terminalNodeId,\n terminalNodeIds,\n };\n}\n\nexport function withOutputNode(state: PipelineBuilderState): PipelineGraph {\n const graph = cloneGraph(state.graph);\n if (graph.nodes.some((node) => node.id === \"output\")) {\n return graph;\n }\n graph.nodes.push({ id: \"output\", kind: \"output\", label: \"Output\" });\n graph.edges.push(\n ...activeTerminalNodeIds(state).map((sourceId, index) => ({\n id: `edge_${state.nextEdgeIndex + index}`,\n source: sourceId,\n target: \"output\",\n })),\n );\n return graph;\n}\n\nexport function nextStageLabel(state: PipelineBuilderState, prefix: string): string {\n return `${prefix} ${state.nextNodeIndex}`;\n}\n\nexport function cloneGraph(graph: PipelineGraph): PipelineGraph {\n return {\n ...graph,\n nodes: graph.nodes.map((node) => ({ ...node })),\n edges: graph.edges.map((edge) => ({ ...edge })),\n };\n}\n\nfunction appendGraphNode(\n state: PipelineBuilderState,\n node: PipelineGraphNode,\n sourceIds: string[],\n terminalNodeIds: string[],\n): PipelineBuilderState {\n const edges = sourceIds.map((sourceId, index) => ({\n id: `edge_${state.nextEdgeIndex + index}`,\n source: sourceId,\n target: node.id,\n }));\n const terminalNodeId = terminalNodeIds.at(-1) ?? state.terminalNodeId;\n return {\n graph: {\n ...state.graph,\n nodes: [...state.graph.nodes, node],\n edges: [...state.graph.edges, ...edges],\n },\n terminalNodeId,\n terminalNodeIds,\n nextNodeIndex: state.nextNodeIndex + 1,\n nextEdgeIndex: state.nextEdgeIndex + edges.length,\n };\n}\n\nfunction graphNode(\n kind: PipelineStageKind,\n label: string,\n index: number,\n options: {\n description?: string | undefined;\n metadata?: JsonObject | undefined;\n preferredId?: string | undefined;\n agentId?: string | undefined;\n agentName?: string | undefined;\n pipelineId?: string | undefined;\n branchKey?: string | undefined;\n existingIds?: Set<string> | undefined;\n } = {},\n): PipelineGraphNode {\n const id = uniqueGraphNodeId(\n normalizeId(options.preferredId ?? `${kind}_${index}`),\n options.existingIds ?? new Set(),\n );\n return compact({\n id,\n kind,\n label,\n description: options.description,\n metadata: options.metadata,\n agentId: options.agentId,\n agentName: options.agentName,\n pipelineId: options.pipelineId,\n branchKey: options.branchKey,\n }) as PipelineGraphNode;\n}\n\nfunction normalizeId(value: string): string {\n const normalized = value\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9_-]+/g, \"_\")\n .replace(/^_+|_+$/g, \"\");\n return normalized.length === 0 ? \"pipeline\" : normalized;\n}\n\nfunction uniqueGraphNodeId(baseId: string, existingIds: Set<string>): string {\n let id = baseId;\n let suffix = 2;\n while (existingIds.has(id)) {\n id = `${baseId}_${suffix}`;\n suffix += 1;\n }\n return id;\n}\n","import type { JsonObject } from \"../completion\";\nimport { mapWithConcurrency } from \"../internal/concurrency\";\nimport { cloneGraph, initialGraph } from \"./graph\";\nimport type {\n PipelineBatchOptions,\n PipelineExecutor,\n PipelineGraph,\n PipelineOp,\n PipelineRunOptions,\n} from \"./types\";\n\n/** Runnable pipeline returned by `PipelineBuilder.build()`. */\nexport class Pipeline<Input, Output> implements PipelineOp<Input, Awaited<Output>> {\n readonly id: string;\n readonly name: string | undefined;\n readonly description: string | undefined;\n readonly metadata: JsonObject | undefined;\n\n constructor(\n private readonly executor: PipelineExecutor<Input, Output>,\n private readonly pipelineGraph: PipelineGraph = initialGraph({}),\n ) {\n this.id = pipelineGraph.id;\n this.name = pipelineGraph.name;\n this.description = pipelineGraph.description;\n this.metadata = pipelineGraph.metadata;\n }\n\n /** Run one input through the built pipeline and return the final stage output. */\n async run(input: Input, options: PipelineRunOptions = {}): Promise<Awaited<Output>> {\n return (await this.executor(input, { observer: options.observer })) as Awaited<Output>;\n }\n\n /** Run many inputs through the same pipeline with bounded concurrency. */\n async batch<I extends Iterable<Input>>(\n inputs: I,\n options: PipelineBatchOptions,\n ): Promise<Array<Awaited<Output>>> {\n return mapWithConcurrency([...inputs], options.concurrency, (input) => this.run(input));\n }\n\n graph(): PipelineGraph {\n return cloneGraph(this.pipelineGraph);\n }\n}\n","import type { PipelineGraphNode, PipelineRunContext } from \"./types\";\n\nexport async function runNode<Output>(\n context: PipelineRunContext,\n node: PipelineGraphNode,\n fn: () => Output | Promise<Output>,\n): Promise<Awaited<Output>> {\n const startedAt = Date.now();\n await context.observer?.onEvent({ type: \"stage_started\", node });\n try {\n const output = (await fn()) as Awaited<Output>;\n await context.observer?.onEvent({\n type: \"stage_completed\",\n node,\n durationMs: Date.now() - startedAt,\n });\n return output;\n } catch (error) {\n await context.observer?.onEvent({\n type: \"stage_failed\",\n node,\n durationMs: Date.now() - startedAt,\n error,\n });\n throw error;\n }\n}\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@anvia/core",
3
- "version": "0.7.0",
3
+ "version": "0.7.2-preview.20260620T153502.752ef82",
4
4
  "description": "Core runtime primitives for context-aware Anvia agents.",
5
5
  "author": "anvia",
6
6
  "maintainer": "Indra Zulfi",