Documentation / @agentick/shared
@agentick/shared ​
Platform-independent types and utilities for Agentick. Works in both Node.js and browser environments.
Installation ​
pnpm add @agentick/sharedModel Catalog ​
Reference data for known LLM models including context windows and capabilities. Supports runtime registration for custom/fine-tuned models.
Registering Custom Models ​
Use registerModel() to add custom or fine-tuned models that aren't in the built-in catalog:
import { registerModel } from "@agentick/shared";
// Register a custom fine-tuned model
registerModel("myorg/custom-model-v1", {
name: "My Custom Model",
provider: "myorg",
contextWindow: 32768, // 32k context
maxOutputTokens: 8192,
supportsToolUse: true,
supportsVision: false,
isReasoningModel: false,
});
// Register multiple models at once
import { registerModels } from "@agentick/shared";
registerModels({
"myorg/model-small": {
name: "My Model Small",
provider: "myorg",
contextWindow: 16384,
maxOutputTokens: 4096,
supportsToolUse: true,
},
"myorg/model-large": {
name: "My Model Large",
provider: "myorg",
contextWindow: 128000,
maxOutputTokens: 8192,
supportsToolUse: true,
supportsVision: true,
},
});Looking Up Model Info ​
import { getModelInfo, getContextWindow, getContextUtilization } from "@agentick/shared";
// Get full model info
const info = getModelInfo("gpt-4o");
console.log(info?.contextWindow); // 128000
console.log(info?.supportsVision); // true
// Just get context window
const contextWindow = getContextWindow("claude-3-5-sonnet");
console.log(contextWindow); // 200000
// Calculate utilization percentage
const utilization = getContextUtilization("gpt-4o", 64000);
console.log(utilization); // 50ModelInfo Interface ​
interface ModelInfo {
name: string; // Display name
provider: string; // Provider name (openai, anthropic, google, etc.)
contextWindow: number; // Context window size in tokens
maxOutputTokens?: number; // Max output tokens
releaseDate?: string; // Model release date
supportsVision?: boolean; // Supports image input
supportsToolUse?: boolean; // Supports tool/function calling
isReasoningModel?: boolean; // Extended thinking model (o1, etc.)
}Built-in Model Coverage ​
The catalog includes models from:
- Anthropic: Claude 4, Claude 3.5, Claude 3 series
- OpenAI: GPT-5, GPT-4.1, GPT-4o, o1/o3 reasoning models
- Google: Gemini 3, Gemini 2.5, Gemini 2.0, Gemini 1.5
- Mistral: Large 3, Small 3.1, Codestral, Ministral
- Meta: Llama 4, Llama 3.1
- DeepSeek: Chat, Coder, Reasoner
Adapter Integration ​
When using adapters, model info from the adapter takes precedence over the catalog:
import { getEffectiveModelInfo, getEffectiveContextWindow } from "@agentick/shared";
// Adapter metadata overrides catalog values
const effectiveInfo = getEffectiveModelInfo(
{ contextWindow: 256000 }, // Adapter reports 256k
"custom-model",
);
// Priority: adapter > runtime registry > static catalog
const contextWindow = getEffectiveContextWindow(adapterMetadata, modelId);Formatting Utilities ​
import { formatContextWindow } from "@agentick/shared";
formatContextWindow(128000); // "128K"
formatContextWindow(1000000); // "1M"
formatContextWindow(2097152); // "2.1M"Response Format ​
Normalized response format type for structured output across providers:
import type { ResponseFormat } from "@agentick/shared";
// Free-form text (default behavior)
const text: ResponseFormat = { type: "text" };
// JSON output (provider ensures valid JSON)
const json: ResponseFormat = { type: "json" };
// Structured output conforming to a JSON Schema
const structured: ResponseFormat = {
type: "json_schema",
schema: {
type: "object",
properties: {
name: { type: "string" },
age: { type: "number" },
},
required: ["name"],
},
name: "person", // optional
};ResponseFormat is accepted on both ModelInput (per-call) and ModelConfig (adapter default). Each adapter maps it to the provider's native format.
Content Types ​
ContentBlock ​
Content blocks represent different types of content in messages:
import type {
ContentBlock,
TextBlock,
ImageBlock,
ToolUseBlock,
ToolResultBlock,
} from "@agentick/shared";
// Text content
const text: TextBlock = {
type: "text",
text: "Hello, world!",
};
// Image content
const image: ImageBlock = {
type: "image",
source: {
type: "base64",
mediaType: "image/png",
data: "iVBORw0KGgo...",
},
};
// Tool use (model calling a tool)
const toolUse: ToolUseBlock = {
type: "tool_use",
id: "call_123",
name: "calculator",
input: { expression: "2 + 2" },
};
// Tool result (response to tool use)
const toolResult: ToolResultBlock = {
type: "tool_result",
toolUseId: "call_123",
content: [{ type: "text", text: "4" }],
};Message Types ​
import type { Message, UserMessage, AssistantMessage } from "@agentick/shared";
const userMessage: UserMessage = {
role: "user",
content: [{ type: "text", text: "Hello!" }],
};
const assistantMessage: AssistantMessage = {
role: "assistant",
content: [{ type: "text", text: "Hi there!" }],
};Stream Events ​
Events emitted during streaming responses:
import type {
StreamEvent,
ContentDeltaEvent,
MessageEndEvent,
ToolCallEvent,
ContextUpdateEvent,
} from "@agentick/shared";
// Text streaming
const delta: ContentDeltaEvent = {
type: "content_delta",
delta: "Hello",
contentIndex: 0,
};
// Context utilization update
const contextUpdate: ContextUpdateEvent = {
type: "context_update",
modelId: "gpt-4o",
modelName: "GPT-4o",
provider: "openai",
contextWindow: 128000,
inputTokens: 1500,
outputTokens: 500,
totalTokens: 2000,
utilization: 1.56, // percentage
supportsVision: true,
supportsToolUse: true,
};Error Types ​
Typed errors with codes for proper error handling:
import {
AgentickError,
ValidationError,
AbortError,
isAbortError,
isAgentickError,
} from "@agentick/shared";
// Check error types
try {
await operation();
} catch (error) {
if (isAbortError(error)) {
console.log("Operation was cancelled");
} else if (isAgentickError(error)) {
console.log(`Error [${error.code}]: ${error.message}`);
}
}
// Throw typed errors
throw new ValidationError("email", "Invalid email format");
throw new AbortError("User cancelled");
throw AbortError.timeout(30000); // Timeout via AbortError factoryInput Normalization ​
Utilities for normalizing various input formats:
import { normalizeContent, normalizeMessage } from "@agentick/shared";
// Normalize string to content blocks
const content = normalizeContent("Hello!");
// [{ type: "text", text: "Hello!" }]
// Normalize various message formats
const message = normalizeMessage("Hello!");
// { role: "user", content: [{ type: "text", text: "Hello!" }] }
const message2 = normalizeMessage({
role: "user",
content: "Hello!",
});
// { role: "user", content: [{ type: "text", text: "Hello!" }] }Transport Types ​
The transport layer abstracts the connection between @agentick/client and an Agentick backend. Transport types live in @agentick/shared so both @agentick/client and @agentick/core can implement transports without circular dependencies.
import type {
ClientTransport,
TransportState,
TransportEventData,
TransportEventHandler,
TransportConfig,
} from "@agentick/shared";ClientTransport ​
The core transport interface. All transports implement this — SSE/HTTP, WebSocket, and local (in-process).
| Method | Description |
|---|---|
connect() | Establish connection |
disconnect() | Close connection |
send(input, sessionId?) | Send a message, returns AsyncIterable<TransportEventData> with .abort() |
subscribeToSession(id) | Subscribe to session events |
abortSession(id, reason?) | Abort a running execution |
closeSession(id) | Close a session |
submitToolResult(sessionId, toolUseId, result) | Submit tool confirmation result |
onEvent(handler) | Register event handler, returns unsubscribe function |
onStateChange(handler) | Register state change handler |
TransportEventData ​
All transport events share this structure:
interface TransportEventData {
type: string; // Event type (e.g., "content_delta", "execution_end")
sessionId?: string; // Session this event belongs to
executionId?: string;
data?: unknown; // Structured event payload
}The data field contains the original stream event payload. It is never spread into the top level — this prevents property collisions and makes the wire format predictable.
Wire format: The gateway sends EventMessage envelopes ({ type: "event", event: "<type>", sessionId, data }). The unwrapEventMessage() utility normalizes these to TransportEventData, promoting event to type and preserving data as-is.
TransportState ​
"disconnected" | "connecting" | "connected" | "error"
Available Transports ​
| Transport | Package | Description |
|---|---|---|
| SSE/HTTP | @agentick/client | Default remote transport (HTTP + Server-Sent Events) |
| WebSocket | @agentick/client | Bidirectional via createWSTransport(config) |
| Unix Socket | @agentick/gateway | NDJSON over Unix domain socket (Node.js only) |
| Local | @agentick/core | In-process bridge via createLocalTransport(app) |
WebSocket and Unix socket transports are built on the shared createRPCTransport factory, which provides all protocol machinery (request correlation, event streaming, reconnection, session operations). Each transport is a thin delegate that provides wire-specific I/O.
See packages/shared/src/transport.ts for the ClientTransport interface and packages/shared/src/rpc-transport.ts for the RPC factory.
Tool Types ​
import type { ToolDefinition, ToolCall, ToolResult } from "@agentick/shared";
const tool: ToolDefinition = {
name: "calculator",
description: "Performs mathematical calculations",
inputSchema: {
type: "object",
properties: {
expression: { type: "string", description: "Math expression" },
},
required: ["expression"],
},
};License ​
MIT
Agentick Shared Types ​
Platform-independent type definitions shared across all Agentick packages. These types define the core data structures for messages, content blocks, tools, and streaming.
Content Blocks ​
Content blocks are discriminated unions representing all content types:
- Text - Plain text content
- Image/Audio/Video - Media content with base64 or URL sources
- ToolUse/ToolResult - Tool call requests and responses
- Code - Executable code blocks
Messages ​
Messages represent conversation entries with roles:
user- Human inputassistant- Model responsessystem- System promptstool_result- Tool execution results
Usage ​
import type { Message, ContentBlock, ToolDefinition } from '@agentick/shared';
const message: Message = {
role: 'user',
content: [{ type: 'text', text: 'Hello!' }]
};See ​
- ContentBlock - All content block types
- Message - Conversation message structure
- ToolDefinition - Tool schema definition
Enumerations ​
- AudioMimeType
- BlockType
- CodeLanguage
- DocumentMimeType
- ImageMimeType
- MediaSourceType
- MessageRole
- StopReason
- ToolExecutionType
- ToolIntent
- VideoMimeType
Classes ​
- AbortError
- AdapterError
- AgentickError
- ContextError
- GuardError
- NotFoundError
- ReactivityError
- StateError
- TransportError
- ValidationError
Interfaces ​
- AdapterModelMetadata
- AssistantMessage
- AudioBlock
- Base64Source
- BaseContentBlock
- BaseMediaSource
- ChannelEvent
- ChannelEventMetadata
- ChannelPublishRequest
- ChannelSSEEvent
- ClientToolDefinition
- ClientTransport
- CodeBlock
- CodeExecutionResultBlock
- ConnectionMetadata
- ContentAnnotation
- ContentCitation
- ContentMetadata
- ContextInfo
- CreateSessionRequest
- CreateSessionResponse
- CsvBlock
- CustomContentBlock
- DevToolsConfig
- DevToolsEventBase
- DiffPreviewMetadata
- DocumentBlock
- DTClientConnectedEvent
- DTClientDisconnectedEvent
- DTCompiledEvent
- DTCompiledPreview
- DTContentDeltaEvent
- DTContextUpdateEvent
- DTExecutionEndEvent
- DTExecutionStartEvent
- DTFiberSnapshotEvent
- DTFiberSummary
- DTGatewayRequestEvent
- DTGatewayResponseEvent
- DTGatewaySessionEvent
- DTModelRequestEvent
- DTModelResponseEvent
- DTModelStartEvent
- DTProcedureEndEvent
- DTProcedureErrorEvent
- DTProcedureStartEvent
- DTProviderRequestEvent
- DTProviderResponseEvent
- DTReasoningDeltaEvent
- DTSerializedFiberNode
- DTSerializedHookState
- DTStateChangeEvent
- DTTickEndEvent
- DTTickStartEvent
- DTTokenSummary
- DTToolCallEvent
- DTToolConfirmationEvent
- DTToolResultEvent
- EmbedInput
- EmbedResult
- EphemeralInput
- EventMessage
- ExecutableCodeBlock
- ExecutionContextFields
- FileReferenceSource
- ForwardContext
- GCSSource
- GeneratedFileBlock
- GeneratedImageBlock
- GroundingInput
- HtmlBlock
- ImageBlock
- JsonBlock
- Message
- MessageMetadata
- MessageSourceTypes
- ModelConfig
- ModelInfo
- ModelInput
- ModelMessage
- ModelOutput
- ProtocolError
- ReasoningBlock
- RPCConnectionHandle
- RPCTransportCallbacks
- RPCTransportConfig
- RPCTransportDelegate
- S3Source
- SecretStore
- SectionInput
- SendInput
- SerializedAgentickError
- SessionAbortPayload
- SessionContextPayload
- SessionRenderPayload
- SessionResultPayload
- SessionState
- SplitOptions
- StateChangeBlock
- StreamEventBase
- SystemEventBlock
- SystemMessage
- TextBlock
- TimelineEntry
- ToolCall
- ToolConfirmationRequest
- ToolConfirmationResponse
- ToolConfirmationResult
- ToolDefinition
- ToolMessage
- ToolResult
- ToolResultBlock
- ToolUseBlock
- TransportConfig
- TransportEventData
- UrlSource
- UsageStats
- UserActionBlock
- UserMessage
- VideoBlock
- XmlBlock
Type Aliases ​
- AgentickErrorCode
- AssistantAllowedBlock
- BlockTypes
- CompiledEvent
- ContentBlock
- ContentDeltaEvent
- ContentEndEvent
- ContentEvent
- ContentInput
- ContentInputArray
- ContentStartEvent
- ContextUpdateEvent
- CustomBlockDeltaEvent
- CustomBlockEndEvent
- CustomBlockEvent
- CustomBlockStartEvent
- DataBlock
- DevToolsBatchSubscriber
- DevToolsEvent
- DevToolsSubscriber
- DTHookType
- EngineErrorEvent
- EntryCommittedEvent
- EphemeralPosition
- EventAllowedBlock
- EventBlock
- ExecutionEndEvent
- ExecutionEvent
- ExecutionStartEvent
- ForkEndEvent
- ForkStartEvent
- FrameworkChannel
- MediaBlock
- MediaSource
- MessageEndEvent
- MessageEvent
- MessageInput
- MessageRoles
- MessageSource
- MessageStartEvent
- ModelRequestEvent
- ModelResponseEvent
- ModelStreamEvent
- ModelToolReference
- OrchestrationStreamEvent
- ProviderRequestEvent
- ReasoningDeltaEvent
- ReasoningEndEvent
- ReasoningEvent
- ReasoningStartEvent
- ResourceType
- ResponseFormat
- ResultStreamEvent
- SessionMessagePayload
- SpawnEndEvent
- SpawnStartEvent
- StreamErrorEvent
- StreamEvent
- SystemAllowedBlock
- TickEndEvent
- TickEvent
- TickStartEvent
- ToolAllowedBlock
- ToolBlock
- ToolCallDeltaEvent
- ToolCallEndEvent
- ToolCallEvent
- ToolCallStartEvent
- ToolConfirmationRequiredEvent
- ToolConfirmationResultEvent
- ToolExecutor
- ToolResultEvent
- ToolResultStartEvent
- TransportEventHandler
- TransportState
- UsageEvent
- UserAllowedBlock
Variables ​
- CONTENT_COMPONENT_SYMBOL
- DEVTOOLS_CHANNEL
- devToolsEmitter
- ErrorCodes
- FrameworkChannels
- HOST_PRIMITIVE_SYMBOL
- MODEL_CATALOG
- MODEL_EVENT_TYPES
- ORCHESTRATION_EVENT_TYPES
- RESULT_EVENT_TYPES
- SEMANTIC_COMPONENT_SYMBOL
Functions ​
- base64SourceToBuffer
- bufferToBase64Source
- clearRuntimeModels
- createAssistantMessage
- createEventMessage
- createModelInfo
- createRPCTransport
- createSystemMessage
- createToolMessage
- createUserMessage
- ensureError
- extractText
- extractToolUses
- formatContextWindow
- forwardToDevTools
- getContextUtilization
- getContextWindow
- getEffectiveContextWindow
- getEffectiveModelInfo
- getModelInfo
- getRuntimeModels
- hasSymbol
- isAbortError
- isAdapterError
- isAgentickError
- isAssistantMessage
- isContentBlock
- isContentComponent
- isContextError
- isCustomBlock
- isDeltaEvent
- isEventBlock
- isEventMessage
- isFinalEvent
- isForkEvent
- isGuardError
- isHostPrimitive
- isMediaBlock
- isMessage
- isModelStreamEvent
- isNotFoundError
- isOrchestrationStreamEvent
- isReactivityError
- isSemanticComponent
- isSpawnEvent
- isStateChangeBlock
- isStateError
- isSystemEventBlock
- isSystemMessage
- isTextBlock
- isToolMessage
- isToolResultBlock
- isToolUseBlock
- isTransportError
- isUrlString
- isUserActionBlock
- isUserMessage
- isValidationError
- markAsContentComponent
- markAsHostPrimitive
- markAsSemanticComponent
- markWithSymbol
- normalizeContentArray
- normalizeContentInput
- normalizeDevToolsConfig
- normalizeMessageInput
- registerModel
- registerModels
- splitMessage
- stringToMediaSource
- unwrapEventMessage
- wrapAsAgentickError