TypeScript Types
Complete type definitions for @brander/sdk
Imports
import Brander, {
// Components
BranderChatWidget,
// Types
BranderProps,
BranderChatWidgetProps,
CustomerAIParams,
CustomerAIResponse,
// Multi-provider tools
MultiProviderTools,
AnthropicTool,
OpenAITool,
GeminiTool,
// Conversations
Conversation,
ConversationsState,
QueryHistoryItem,
// AG-UI Streaming
AGUIEvent,
AGUIEventType,
StreamingCallback,
ToolCallStartEvent,
ToolCallArgsEvent,
ToolCallEndEvent,
RunErrorEvent,
// Stream adapters
sseStream,
anthropicStream,
anthropicToAGUI,
openaiStream,
openaiToAGUI,
geminiStream,
geminiToAGUI,
} from "@brander/sdk";AG-UI Streaming Types
StreamingCallback
type StreamingCallback = ( params: CustomerAIParams ) => AsyncIterable<AGUIEvent> | ReadableStream<AGUIEvent>;
AGUIEventType (Enum)
enum AGUIEventType {
// Lifecycle Events
RUN_STARTED = "RUN_STARTED",
RUN_FINISHED = "RUN_FINISHED",
RUN_ERROR = "RUN_ERROR",
STEP_STARTED = "STEP_STARTED",
STEP_FINISHED = "STEP_FINISHED",
// Text Message Events
TEXT_MESSAGE_START = "TEXT_MESSAGE_START",
TEXT_MESSAGE_CONTENT = "TEXT_MESSAGE_CONTENT",
TEXT_MESSAGE_END = "TEXT_MESSAGE_END",
TEXT_MESSAGE_CHUNK = "TEXT_MESSAGE_CHUNK",
// Tool Call Events (Most important for BranderUX)
TOOL_CALL_START = "TOOL_CALL_START",
TOOL_CALL_ARGS = "TOOL_CALL_ARGS",
TOOL_CALL_END = "TOOL_CALL_END",
TOOL_CALL_RESULT = "TOOL_CALL_RESULT",
TOOL_CALL_CHUNK = "TOOL_CALL_CHUNK",
// State Events
STATE_SNAPSHOT = "STATE_SNAPSHOT",
STATE_DELTA = "STATE_DELTA",
MESSAGES_SNAPSHOT = "MESSAGES_SNAPSHOT",
}AG-UI Event Types
// Base interface for all AG-UI events
interface BaseAGUIEvent {
type: AGUIEventType;
timestamp?: number;
rawEvent?: unknown;
}
interface ToolCallStartEvent extends BaseAGUIEvent {
type: AGUIEventType.TOOL_CALL_START;
toolCallId: string;
toolCallName: string; // e.g. "generate_dashboard_data"
}
interface ToolCallArgsEvent extends BaseAGUIEvent {
type: AGUIEventType.TOOL_CALL_ARGS;
toolCallId: string;
delta: string; // Partial JSON arguments
}
interface ToolCallEndEvent extends BaseAGUIEvent {
type: AGUIEventType.TOOL_CALL_END;
toolCallId: string;
}
interface ToolCallResultEvent extends BaseAGUIEvent {
type: AGUIEventType.TOOL_CALL_RESULT;
toolCallId: string;
result: unknown;
}
interface TextMessageStartEvent extends BaseAGUIEvent {
type: AGUIEventType.TEXT_MESSAGE_START;
messageId: string;
role: "assistant" | "user" | "system";
}
interface TextMessageContentEvent extends BaseAGUIEvent {
type: AGUIEventType.TEXT_MESSAGE_CONTENT;
messageId: string;
delta: string; // Partial text content
}
interface TextMessageEndEvent extends BaseAGUIEvent {
type: AGUIEventType.TEXT_MESSAGE_END;
messageId: string;
}
interface RunStartedEvent extends BaseAGUIEvent {
type: AGUIEventType.RUN_STARTED;
threadId: string;
runId: string;
}
interface RunFinishedEvent extends BaseAGUIEvent {
type: AGUIEventType.RUN_FINISHED;
threadId: string;
runId: string;
}
interface RunErrorEvent extends BaseAGUIEvent {
type: AGUIEventType.RUN_ERROR;
message: string;
code?: string;
}
// Union type for all events
type AGUIEvent =
| ToolCallStartEvent
| ToolCallArgsEvent
| ToolCallEndEvent
| ToolCallResultEvent
| TextMessageStartEvent
| TextMessageContentEvent
| TextMessageEndEvent
| RunStartedEvent
| RunFinishedEvent
| RunErrorEvent
| /* + state & step events */;Stream Adapters
sseStream (Most Common)
Connects to backend SSE endpoints that return AG-UI events.
function sseStream(
url: string,
options?: {
params?: CustomerAIParams;
headers?: Record<string, string>;
method?: "GET" | "POST";
}
): AsyncIterable<AGUIEvent>;
// Usage
onQueryStream={(params) => sseStream("/api/agent", { params })}anthropicStream
Converts Anthropic SDK streams to AG-UI events.
async function* anthropicStream(
stream: AsyncIterable<Anthropic.MessageStreamEvent>
): AsyncGenerator<AGUIEvent>;
// Usage
onQueryStream={async function*(params) {
const stream = anthropic.messages.stream({...});
yield* anthropicStream(stream);
}}openaiStream
Converts OpenAI SDK streams to AG-UI events.
async function* openaiStream(
stream: AsyncIterable<OpenAI.ChatCompletionChunk>
): AsyncGenerator<AGUIEvent>;
// Usage
onQueryStream={async function*(params) {
const stream = await openai.chat.completions.create({ stream: true, ... });
yield* openaiStream(stream);
}}geminiStream
Converts Google Gemini SDK streams to AG-UI events.
async function* geminiStream(
stream: AsyncIterable<GenerateContentResponse>
): AsyncGenerator<AGUIEvent>;
// Usage
onQueryStream={async function*(params) {
const result = await model.generateContentStream({...});
yield* geminiStream(result.stream);
}}Per-Chunk Converters (Advanced)
For custom control over event conversion:
// Anthropic per-chunk
function* anthropicToAGUI(
chunk: Anthropic.MessageStreamEvent,
state?: { currentToolId?: string | null }
): Generator<AGUIEvent>;
// OpenAI per-chunk
function* openaiToAGUI(
chunk: OpenAI.ChatCompletionChunk
): Generator<AGUIEvent>;
// Gemini per-chunk
function* geminiToAGUI(
chunk: GenerateContentResponse
): Generator<AGUIEvent>;Core Types
CustomerAIParams
interface CustomerAIParams {
system?: string; // System instructions (A2UI protocol in flexible mode)
messages: Array<{
role: "user" | "assistant";
content: string;
}>;
tools?: MultiProviderTools; // Tools in all 3 provider formats
max_tokens?: number; // Suggested max tokens
}MultiProviderTools
interface MultiProviderTools {
anthropic: AnthropicTool[]; // { name, description, input_schema }
openai: OpenAITool[]; // { type: "function", function: { name, parameters } }
gemini: GeminiTool[]; // { name, description, parameters }
}OnQueryCallback (Non-Streaming)
type OnQueryCallback = ( params: CustomerAIParams ) => Promise<CustomerAIResponse>;
CustomerAIResponse (Non-Streaming)
interface CustomerAIResponse {
content: Array<{
type: "text";
text: string;
}>;
}Component Props
BranderProps
interface BranderProps {
// Required props
betaKey: string;
projectId: string;
// AI Handler (ONE required)
onQueryStream?: StreamingCallback; // Recommended
onQuery?: OnQueryCallback; // Alternative
// Display
variant?: "hybrid" | "classic" | "chat";
defaultSidebarOpen?: boolean;
// Conversations
conversations?: Conversation[];
activeConversationId?: string;
onConversationsChange?: (state: ConversationsState) => void;
// Styling
width?: string;
height?: string;
className?: string;
style?: CSSProperties;
}BranderChatWidgetProps
interface BranderChatWidgetProps extends BranderProps {
// Trigger element (required)
children: React.ReactNode;
// Position
position?: "bottom-right" | "bottom-left" | "top-right" | "top-left";
offset?: { top?: number; bottom?: number; left?: number; right?: number };
widgetSize?: { width?: string; height?: string };
// Behavior
defaultOpen?: boolean;
onOpen?: () => void;
onClose?: () => void;
// Backdrop
showBackdrop?: boolean;
backdropOpacity?: number;
closeOnBackdropClick?: boolean;
// Styling
zIndex?: number;
animationDuration?: number;
}CustomPage
interface CustomPage {
id: string;
name: string;
query: string;
}Conversation Types
Conversation
interface Conversation {
id: string;
title: string;
createdAt: number;
updatedAt: number;
queryHistory: QueryHistoryItem[];
}
interface QueryHistoryItem {
id: string;
rawQuery: string;
query: string;
response: Record<string, unknown>;
screenId: string;
timestamp: number;
}ConversationsState
interface ConversationsState {
conversations: Conversation[];
activeConversationId: string | null;
}Multi-Provider Tool Types
AnthropicTool
interface AnthropicTool {
name: string;
description: string;
input_schema: {
type: "object";
properties: Record<string, any>;
required?: string[];
};
}OpenAITool
interface OpenAITool {
type: "function";
function: {
name: string;
description: string;
parameters: {
type: "object";
properties: Record<string, any>;
required?: string[];
};
};
}GeminiTool
interface GeminiTool {
name: string;
description: string;
parameters: {
type: "object";
properties: Record<string, any>;
required?: string[];
};
}Usage Example
App.tsx
import Brander, {
sseStream,
BranderProps,
CustomerAIParams,
AGUIEvent,
AGUIEventType,
StreamingCallback,
} from "@brander/sdk";
// Type your streaming handler
const handleQueryStream: StreamingCallback = (params: CustomerAIParams) => {
return sseStream("/api/agent", { params });
};
// Type your component props
const props: BranderProps = {
betaKey: "bux_your_token",
projectId: "your_project_id",
onQueryStream: handleQueryStream,
variant: "classic",
width: "100%",
height: "600px",
};
function App() {
return <Brander {...props} />;
}