acp-sdk
Version:
Agent Communication Protocol SDK
251 lines (249 loc) • 8.21 kB
JavaScript
import * as z from 'zod';
import { ErrorModel } from './errors.js';
import { nullishObject, createSchemaTypePredicate } from './utils.js';
import { ACPError } from '../client/errors.js';
import { PlatformUIAnnotation } from './platform.js';
const AnyModel = z.record(z.any());
const Author = z.object({
name: z.string(),
email: z.string().nullish(),
url: z.string().url().nullish()
});
const Contributor = z.object({
name: z.string(),
email: z.string().nullish(),
url: z.string().url().nullish()
});
const LinkType = z.enum([
"source-code",
"container-image",
"homepage",
"documentation"
]);
const Link = z.object({
type: LinkType,
url: z.string().url()
});
const DependencyType = z.enum(["agent", "tool", "model"]);
const Dependency = z.object({
type: DependencyType,
name: z.string()
});
const Capability = z.object({
name: z.string(),
description: z.string()
});
const Annotations = z.object({
beeai_ui: PlatformUIAnnotation.nullish()
});
const Metadata = nullishObject(
z.object({
annotations: Annotations,
documentation: z.string(),
license: z.string(),
programming_language: z.string(),
natural_languages: z.array(z.string()),
framework: z.string(),
capabilities: z.array(Capability),
domains: z.array(z.string()),
tags: z.array(z.string()),
created_at: z.string().datetime(),
updated_at: z.string().datetime(),
author: Author,
contributors: z.array(Contributor),
links: z.array(Link),
dependencies: z.array(Dependency),
recommended_models: z.array(z.string())
})
).passthrough();
const CitationMetadata = z.object({
kind: z.literal("citation").default("citation"),
start_index: z.number().int().nullish(),
end_index: z.number().int().nullish(),
url: z.string().nullish(),
title: z.string().nullish(),
description: z.string().nullish()
});
const TrajectoryMetadata = z.object({
kind: z.literal("trajectory").default("trajectory"),
message: z.string().nullish(),
tool_name: z.string().nullish(),
tool_input: AnyModel.nullish(),
tool_output: AnyModel.nullish()
});
const BaseMessagePart = z.object({
name: z.string().nullish(),
content_type: z.string().nullish().default("text/plain"),
content: z.string().nullish(),
content_encoding: z.enum(["plain", "base64"]).nullish().default("plain"),
content_url: z.string().url().nullish(),
metadata: z.union([CitationMetadata, TrajectoryMetadata]).nullish()
}).passthrough();
const refineMessagePart = (val, ctx) => {
if (val.content != null && val.content_url != null) {
ctx.addIssue({
code: z.ZodIssueCode.custom,
message: "Only one of content or content_url can be provided"
});
}
return z.NEVER;
};
const MessagePart = BaseMessagePart.superRefine(refineMessagePart);
const isMessagePart = createSchemaTypePredicate(MessagePart);
const Artifact = BaseMessagePart.required({ name: true }).superRefine(
refineMessagePart
);
const Message = z.object({
role: z.string().regex(/^(user|agent(\/[a-zA-Z0-9_\-]+)?)$/).default("user"),
parts: z.array(MessagePart),
created_at: z.string().datetime().nullable().default(() => (/* @__PURE__ */ new Date()).toISOString()),
completed_at: z.string().datetime().nullable().default(() => (/* @__PURE__ */ new Date()).toISOString())
});
const isMessage = createSchemaTypePredicate(Message);
function concatMessages(lhs, rhs) {
if (lhs.role != rhs.role) {
throw new Error("Message roles must match for concatenation");
}
return {
role: lhs.role,
parts: [...lhs.parts, ...rhs.parts],
created_at: lhs.created_at != null && rhs.created_at != null ? lhs.created_at < rhs.created_at ? lhs.created_at : rhs.created_at : null,
completed_at: lhs.completed_at != null && rhs.completed_at != null ? lhs.completed_at > rhs.completed_at ? lhs.completed_at : rhs.completed_at : null
};
}
function compressMessage(message) {
const canBeJoined = (a, b) => {
return a.name == null && b.name == null && a.content_type === "text/plain" && b.content_type === "text/plain" && a.content_encoding === "plain" && b.content_encoding === "plain" && a.content_url == null && b.content_url == null;
};
const join = (a, b) => ({
name: null,
content_type: "text/plain",
content: (a.content ?? "") + (b.content ?? ""),
content_encoding: "plain",
content_url: null
});
const compressedParts = [];
for (const part of message.parts) {
if (compressedParts.length > 0 && canBeJoined(compressedParts[compressedParts.length - 1], part)) {
const last = compressedParts.pop();
compressedParts.push(join(last, part));
} else {
compressedParts.push(part);
}
}
return { ...message, parts: compressedParts };
}
const UUID = z.string().uuid();
const AgentName = z.string();
const RunId = UUID;
const SessionId = UUID;
const RunMode = z.enum(["sync", "async", "stream"]);
const RunStatus = z.enum([
"created",
"in-progress",
"awaiting",
"cancelling",
"cancelled",
"completed",
"failed"
]);
function isTerminalRunStatus(status) {
return status === "completed" || status === "cancelled" || status === "failed";
}
const MessageAwaitRequest = z.object({
type: z.literal("message"),
message: Message
});
const MessageAwaitResume = z.object({
type: z.literal("message"),
message: Message
});
const AwaitRequest = MessageAwaitRequest;
const AwaitResume = MessageAwaitResume;
const Run = z.object({
run_id: RunId,
agent_name: AgentName,
session_id: SessionId.nullish(),
status: RunStatus.default("created"),
await_request: AwaitRequest.nullish(),
output: z.array(Message).default([]),
error: ErrorModel.nullish(),
created_at: z.string().datetime().default(() => (/* @__PURE__ */ new Date()).toISOString()),
finished_at: z.string().datetime().nullish()
});
function throwForRunStatus(run) {
if (run.status === "cancelled") {
throw new DOMException("Run has been cancelled", "AbortError");
}
if (run.status === "failed") {
throw new ACPError(run.error);
}
return run;
}
const AgentManifest = z.object({
name: AgentName,
description: z.string().nullish(),
input_content_types: z.array(z.string()).min(1),
output_content_types: z.array(z.string()).min(1),
metadata: Metadata.default({})
});
const MessageCreatedEvent = z.object({
type: z.literal("message.created"),
message: Message
});
const MessagePartEvent = z.object({
type: z.literal("message.part"),
part: MessagePart
});
const MessageCompletedEvent = z.object({
type: z.literal("message.completed"),
message: Message
});
const RunAwaitingEvent = z.object({
type: z.literal("run.awaiting"),
run: Run
});
const GenericEvent = z.object({
type: z.literal("generic"),
generic: AnyModel
});
const RunCreatedEvent = z.object({
type: z.literal("run.created"),
run: Run
});
const RunInProgressEvent = z.object({
type: z.literal("run.in-progress"),
run: Run
});
const RunFailedEvent = z.object({
type: z.literal("run.failed"),
run: Run
});
const RunCancelledEvent = z.object({
type: z.literal("run.cancelled"),
run: Run
});
const RunCompletedEvent = z.object({
type: z.literal("run.completed"),
run: Run
});
const ErrorEvent = z.object({
type: z.literal("error"),
error: ErrorModel
});
const Event = z.discriminatedUnion("type", [
MessageCreatedEvent,
MessagePartEvent,
MessageCompletedEvent,
RunAwaitingEvent,
GenericEvent,
RunCreatedEvent,
RunInProgressEvent,
RunFailedEvent,
RunCancelledEvent,
RunCompletedEvent,
ErrorEvent
]);
export { AgentManifest, AgentName, Annotations, AnyModel, Artifact, Author, AwaitRequest, AwaitResume, Capability, CitationMetadata, Contributor, Dependency, DependencyType, ErrorEvent, Event, GenericEvent, Link, LinkType, Message, MessageAwaitRequest, MessageAwaitResume, MessageCompletedEvent, MessageCreatedEvent, MessagePart, MessagePartEvent, Metadata, Run, RunAwaitingEvent, RunCancelledEvent, RunCompletedEvent, RunCreatedEvent, RunFailedEvent, RunId, RunInProgressEvent, RunMode, RunStatus, SessionId, TrajectoryMetadata, compressMessage, concatMessages, isMessage, isMessagePart, isTerminalRunStatus, throwForRunStatus };
//# sourceMappingURL=models.js.map
//# sourceMappingURL=models.js.map