UNPKG

@artinet/sdk

Version:

A TypeScript SDK for building collaborative AI agents.

401 lines (400 loc) 17.5 kB
/** * Copyright 2025 The Artinet Project * SPDX-License-Identifier: Apache-2.0 */ import { AgentCard, Message, Task, AgentExtension, TaskQueryParams, TaskIdParams, MessageSendParams, SendMessageSuccessResult, PushNotificationConfig } from "@artinet/types/a2a"; import { core } from "../core/index.js"; import { z } from "zod/v4"; export type AgentCardParams = (Partial<AgentCard> & Required<Pick<AgentCard, "name">>) | string; export declare const UpdateSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{ role: z.ZodEnum<{ user: "user"; agent: "agent"; }>; parts: z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{ metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>; kind: z.ZodLiteral<"text">; text: z.ZodString; }, z.core.$strip>, z.ZodObject<{ metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>; kind: z.ZodLiteral<"file">; file: z.ZodUnion<readonly [z.ZodObject<{ name: z.ZodOptional<z.ZodString>; mimeType: z.ZodOptional<z.ZodString>; bytes: z.ZodString; uri: z.ZodOptional<z.ZodNever>; }, z.core.$strip>, z.ZodObject<{ name: z.ZodOptional<z.ZodString>; mimeType: z.ZodOptional<z.ZodString>; uri: z.ZodString; bytes: z.ZodOptional<z.ZodNever>; }, z.core.$strip>]>; }, z.core.$strip>, z.ZodObject<{ metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>; kind: z.ZodLiteral<"data">; data: z.ZodRecord<z.ZodString, z.ZodUnknown>; }, z.core.$strip>]>>; metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>; extensions: z.ZodOptional<z.ZodArray<z.ZodString>>; referenceTaskIds: z.ZodOptional<z.ZodArray<z.ZodString>>; messageId: z.ZodString; taskId: z.ZodOptional<z.ZodString>; contextId: z.ZodOptional<z.ZodString>; kind: z.ZodLiteral<"message">; }, z.core.$strip>, z.ZodObject<{ id: z.ZodString; contextId: z.ZodString; status: z.ZodObject<{ state: z.ZodEnum<{ unknown: "unknown"; submitted: "submitted"; working: "working"; "input-required": "input-required"; completed: "completed"; canceled: "canceled"; failed: "failed"; rejected: "rejected"; "auth-required": "auth-required"; }>; message: z.ZodOptional<z.ZodObject<{ role: z.ZodEnum<{ user: "user"; agent: "agent"; }>; parts: z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{ metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>; kind: z.ZodLiteral<"text">; text: z.ZodString; }, z.core.$strip>, z.ZodObject<{ metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>; kind: z.ZodLiteral<"file">; file: z.ZodUnion<readonly [z.ZodObject<{ name: z.ZodOptional<z.ZodString>; mimeType: z.ZodOptional<z.ZodString>; bytes: z.ZodString; uri: z.ZodOptional<z.ZodNever>; }, z.core.$strip>, z.ZodObject<{ name: z.ZodOptional<z.ZodString>; mimeType: z.ZodOptional<z.ZodString>; uri: z.ZodString; bytes: z.ZodOptional<z.ZodNever>; }, z.core.$strip>]>; }, z.core.$strip>, z.ZodObject<{ metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>; kind: z.ZodLiteral<"data">; data: z.ZodRecord<z.ZodString, z.ZodUnknown>; }, z.core.$strip>]>>; metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>; extensions: z.ZodOptional<z.ZodArray<z.ZodString>>; referenceTaskIds: z.ZodOptional<z.ZodArray<z.ZodString>>; messageId: z.ZodString; taskId: z.ZodOptional<z.ZodString>; contextId: z.ZodOptional<z.ZodString>; kind: z.ZodLiteral<"message">; }, z.core.$strip>>; timestamp: z.ZodOptional<z.ZodISODateTime>; }, z.core.$strip>; history: z.ZodOptional<z.ZodArray<z.ZodObject<{ role: z.ZodEnum<{ user: "user"; agent: "agent"; }>; parts: z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{ metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>; kind: z.ZodLiteral<"text">; text: z.ZodString; }, z.core.$strip>, z.ZodObject<{ metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>; kind: z.ZodLiteral<"file">; file: z.ZodUnion<readonly [z.ZodObject<{ name: z.ZodOptional<z.ZodString>; mimeType: z.ZodOptional<z.ZodString>; bytes: z.ZodString; uri: z.ZodOptional<z.ZodNever>; }, z.core.$strip>, z.ZodObject<{ name: z.ZodOptional<z.ZodString>; mimeType: z.ZodOptional<z.ZodString>; uri: z.ZodString; bytes: z.ZodOptional<z.ZodNever>; }, z.core.$strip>]>; }, z.core.$strip>, z.ZodObject<{ metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>; kind: z.ZodLiteral<"data">; data: z.ZodRecord<z.ZodString, z.ZodUnknown>; }, z.core.$strip>]>>; metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>; extensions: z.ZodOptional<z.ZodArray<z.ZodString>>; referenceTaskIds: z.ZodOptional<z.ZodArray<z.ZodString>>; messageId: z.ZodString; taskId: z.ZodOptional<z.ZodString>; contextId: z.ZodOptional<z.ZodString>; kind: z.ZodLiteral<"message">; }, z.core.$strip>>>; artifacts: z.ZodOptional<z.ZodArray<z.ZodObject<{ artifactId: z.ZodString; name: z.ZodOptional<z.ZodString>; description: z.ZodOptional<z.ZodString>; parts: z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{ metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>; kind: z.ZodLiteral<"text">; text: z.ZodString; }, z.core.$strip>, z.ZodObject<{ metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>; kind: z.ZodLiteral<"file">; file: z.ZodUnion<readonly [z.ZodObject<{ name: z.ZodOptional<z.ZodString>; mimeType: z.ZodOptional<z.ZodString>; bytes: z.ZodString; uri: z.ZodOptional<z.ZodNever>; }, z.core.$strip>, z.ZodObject<{ name: z.ZodOptional<z.ZodString>; mimeType: z.ZodOptional<z.ZodString>; uri: z.ZodString; bytes: z.ZodOptional<z.ZodNever>; }, z.core.$strip>]>; }, z.core.$strip>, z.ZodObject<{ metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>; kind: z.ZodLiteral<"data">; data: z.ZodRecord<z.ZodString, z.ZodUnknown>; }, z.core.$strip>]>>; metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>; extension: z.ZodOptional<z.ZodArray<z.ZodString>>; }, z.core.$strip>>>; metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>; kind: z.ZodLiteral<"task">; }, z.core.$strip>, z.ZodObject<{ taskId: z.ZodString; contextId: z.ZodString; kind: z.ZodLiteral<"status-update">; status: z.ZodObject<{ state: z.ZodEnum<{ unknown: "unknown"; submitted: "submitted"; working: "working"; "input-required": "input-required"; completed: "completed"; canceled: "canceled"; failed: "failed"; rejected: "rejected"; "auth-required": "auth-required"; }>; message: z.ZodOptional<z.ZodObject<{ role: z.ZodEnum<{ user: "user"; agent: "agent"; }>; parts: z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{ metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>; kind: z.ZodLiteral<"text">; text: z.ZodString; }, z.core.$strip>, z.ZodObject<{ metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>; kind: z.ZodLiteral<"file">; file: z.ZodUnion<readonly [z.ZodObject<{ name: z.ZodOptional<z.ZodString>; mimeType: z.ZodOptional<z.ZodString>; bytes: z.ZodString; uri: z.ZodOptional<z.ZodNever>; }, z.core.$strip>, z.ZodObject<{ name: z.ZodOptional<z.ZodString>; mimeType: z.ZodOptional<z.ZodString>; uri: z.ZodString; bytes: z.ZodOptional<z.ZodNever>; }, z.core.$strip>]>; }, z.core.$strip>, z.ZodObject<{ metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>; kind: z.ZodLiteral<"data">; data: z.ZodRecord<z.ZodString, z.ZodUnknown>; }, z.core.$strip>]>>; metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>; extensions: z.ZodOptional<z.ZodArray<z.ZodString>>; referenceTaskIds: z.ZodOptional<z.ZodArray<z.ZodString>>; messageId: z.ZodString; taskId: z.ZodOptional<z.ZodString>; contextId: z.ZodOptional<z.ZodString>; kind: z.ZodLiteral<"message">; }, z.core.$strip>>; timestamp: z.ZodOptional<z.ZodISODateTime>; }, z.core.$strip>; final: z.ZodBoolean; metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>; }, z.core.$strip>, z.ZodObject<{ taskId: z.ZodString; contextId: z.ZodString; kind: z.ZodLiteral<"artifact-update">; artifact: z.ZodObject<{ artifactId: z.ZodString; name: z.ZodOptional<z.ZodString>; description: z.ZodOptional<z.ZodString>; parts: z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{ metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>; kind: z.ZodLiteral<"text">; text: z.ZodString; }, z.core.$strip>, z.ZodObject<{ metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>; kind: z.ZodLiteral<"file">; file: z.ZodUnion<readonly [z.ZodObject<{ name: z.ZodOptional<z.ZodString>; mimeType: z.ZodOptional<z.ZodString>; bytes: z.ZodString; uri: z.ZodOptional<z.ZodNever>; }, z.core.$strip>, z.ZodObject<{ name: z.ZodOptional<z.ZodString>; mimeType: z.ZodOptional<z.ZodString>; uri: z.ZodString; bytes: z.ZodOptional<z.ZodNever>; }, z.core.$strip>]>; }, z.core.$strip>, z.ZodObject<{ metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>; kind: z.ZodLiteral<"data">; data: z.ZodRecord<z.ZodString, z.ZodUnknown>; }, z.core.$strip>]>>; metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>; extension: z.ZodOptional<z.ZodArray<z.ZodString>>; }, z.core.$strip>; append: z.ZodOptional<z.ZodBoolean>; lastChunk: z.ZodOptional<z.ZodBoolean>; metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>; }, z.core.$strip>]>; export type Update = z.output<typeof UpdateSchema>; export type Engine = (context: Context) => AsyncGenerator<Update, void, unknown>; export interface BaseContext extends core.Context<Task> { readonly service: Service; /** * Considering ommit OnStart & OnComplete from Context consumers. * That way the user cannot inadvertently trigger a start/completion out of band. */ readonly publisher: EventPublisher; } export interface Context extends BaseContext { readonly taskId: string; readonly userMessage: Message; readonly messages: MessageConsumerProxy; extensions?: AgentExtension[]; references?: Task[]; userId?: string; getTask: () => Promise<Task>; } export type ContextParams = Omit<BaseContext, "publisher" | "isCancelled" | "getState" | "abortSignal"> & Omit<Partial<Context>, "userMessage" | "taskId"> & { messenger: MessageConsumerProxy; task: Task; overrides?: Partial<Omit<EventConsumer, "contextId">>; }; export interface Contexts extends core.Contexts<Context> { create: (params: ContextParams) => Promise<Context>; list: () => Promise<Context[]>; } export interface Tasks extends core.Manager<Task> { update: (context: Context, update: Update) => Promise<Task>; create: (params: Partial<Task>) => Promise<Task>; has: (id: string) => Promise<boolean>; } export interface Cancellations extends Omit<core.Manager<void>, "get"> { has: (id: string) => Promise<boolean>; } export interface Connections extends Omit<core.Manager<void>, "get"> { } export interface Notifier { notify: (task: Task, update: Update, context?: Context) => Promise<void>; register: (taskId: string, config: PushNotificationConfig) => Promise<void>; } export type ServiceOptions = Pick<ContextParams, "userId" | "extensions"> & { task?: Task; signal?: AbortSignal; notifier?: Notifier; }; export interface Handles { getTask: (input: TaskQueryParams, context: Context) => Promise<Task>; cancelTask: (input: TaskIdParams, context: Context) => Promise<Task>; sendMessage: (message: MessageSendParams, context: Context) => Promise<SendMessageSuccessResult>; /** * @deprecated Use sendMessageStream instead */ streamMessage: (message: MessageSendParams, context: Context) => AsyncGenerator<Update>; sendMessageStream: (message: MessageSendParams, context: Context) => AsyncGenerator<Update>; resubscribe: (input: TaskIdParams, context: Context) => AsyncGenerator<Update>; } export interface RequestHandler { getTask: (input: TaskQueryParams, options?: ServiceOptions) => Promise<Task>; cancelTask: (input: TaskIdParams, options?: ServiceOptions) => Promise<Task>; sendMessage: (message: MessageSendParams, options?: ServiceOptions) => Promise<SendMessageSuccessResult>; /** * @deprecated Use sendMessageStream instead */ streamMessage: (message: MessageSendParams, options?: ServiceOptions) => AsyncGenerator<Update>; sendMessageStream: (message: MessageSendParams, options?: ServiceOptions) => AsyncGenerator<Update>; resubscribe: (input: TaskIdParams, options?: ServiceOptions) => AsyncGenerator<Update>; getAgentCard: () => Promise<AgentCard>; } export interface Stream { readonly contextId: string; isAlive: boolean; kill: () => Promise<void>; updates: Update[]; context: Context; run: (params: { service: Service; }) => AsyncGenerator<Update>; subscribe: () => AsyncGenerator<Update>; } export interface Streams extends Omit<core.Manager<Stream>, "set"> { create: (params: core.Optional<Stream> & { context: Context; }) => Promise<Stream>; has: (id: string) => Promise<boolean>; } export interface Service extends core.Service<{ engine: Engine; context: Context; }>, RequestHandler { readonly events?: Events; readonly connections: Connections; readonly cancellations: Cancellations; readonly tasks: Tasks; readonly contexts: Contexts; readonly streams: Streams; engine: Engine; agentCard: AgentCard; } export interface MessageProducer { isOpen: boolean; send: (message: MessageSendParams) => Promise<void>; } export type MessageMap = { message: [MessageSendParams]; close: []; }; export interface MessageConsumer extends core.Consumer<MessageSendParams, MessageMap> { message: MessageSendParams; messages: MessageSendParams[]; close: () => Promise<void>; next: () => Promise<IteratorResult<MessageSendParams>>; return: (value: MessageSendParams) => Promise<IteratorResult<MessageSendParams>>; } export type MessageConsumerProxy = MessageConsumer & MessageSendParams; export interface EventConsumer { readonly contextId: string; readonly onStart?: (context: Context) => Promise<Task>; readonly onCancel: (update: Update, current: Task) => Promise<void>; readonly onUpdate: (update: Update, current: Task) => Promise<Task>; readonly onError: (error: any, current: Task) => Promise<void>; onComplete: (current: Task) => Promise<void>; } export type Emissions = { start: [MessageSendParams, Task]; cancel: [Update]; update: [Task, Update]; error: [any, Task]; complete: [Task]; }; export interface EventPublisher extends Omit<EventConsumer, "onComplete" | "onCancel" | "onError" | "onUpdate">, core.Publisher<Emissions> { readonly onStart?: (context: Context) => Promise<Task>; readonly onCancel: (update: Update) => Promise<void>; readonly onUpdate: (update: Update) => Promise<Task>; readonly onError: (error: any) => Promise<void>; onComplete: () => Promise<void>; } export interface Events extends core.Manager<EventPublisher> { create: (params: core.Optional<EventPublisher>) => Promise<EventPublisher>; } export * from "@artinet/types/a2a";