graphlit-client
Version:
Graphlit API Client for TypeScript
138 lines (137 loc) • 3.6 kB
TypeScript
import { ConversationMessage, ConversationToolCall } from "../generated/graphql-types.js";
import { ContextManagementAction } from "./agent.js";
/**
* Tool execution status for streaming
*/
export type ToolExecutionStatus = "preparing" | "executing" | "ready" | "completed" | "failed";
/**
* Reasoning format types
*/
export type ReasoningFormat = "thinking_tag" | "markdown" | "custom";
/**
* Context window usage event - emitted at start of agent interaction
*/
export type ContextWindowEvent = {
type: "context_window";
usage: {
usedTokens: number;
maxTokens: number;
percentage: number;
remainingTokens: number;
};
timestamp: Date;
};
/**
* Structured reasoning/thinking metadata.
* Provides a canonical representation across all providers so the UI
* can decide whether and how to render model reasoning.
*/
export type ReasoningMetadata = {
content: string;
format: ReasoningFormat;
signature?: string;
};
/**
* Extended conversation message with additional streaming metadata
*/
export type StreamingConversationMessage = Partial<ConversationMessage> & {
message: string;
modelName?: string;
isThinking?: boolean;
thinkingContent?: string;
};
/**
* Simplified UI-focused streaming events using GraphQL types
*/
export type AgentStreamEvent = {
type: "conversation_started";
conversationId: string;
timestamp: Date;
model?: string;
} | {
type: "conversation_queued";
conversationId: string;
timestamp: Date;
} | {
type: "conversation_cancelled";
conversationId: string;
timestamp: Date;
} | ContextWindowEvent | {
type: "context_management";
action: ContextManagementAction;
usage: {
usedTokens: number;
maxTokens: number;
percentage: number;
remainingTokens: number;
};
timestamp: Date;
} | {
type: "message_update";
message: StreamingConversationMessage;
isStreaming: boolean;
reasoning?: ReasoningMetadata;
metrics?: {
ttft?: number;
elapsedTime: number;
conversationDuration: number;
tokenCount?: number;
avgTokenDelay?: number;
streamingThroughput?: number;
};
} | {
type: "tool_update";
toolCall: ConversationToolCall;
status: ToolExecutionStatus;
timestamp?: Date;
startedAt?: string;
completedAt?: string;
durationMs?: number;
failedAt?: string;
result?: unknown;
error?: string;
} | {
type: "reasoning_update";
content: string;
format: ReasoningFormat;
isComplete: boolean;
} | {
type: "conversation_completed";
message: StreamingConversationMessage;
reasoning?: ReasoningMetadata;
metrics?: {
ttft?: number;
totalTime: number;
conversationDuration: number;
tokenCount?: number;
llmTokens?: number;
avgTokenDelay?: number;
streamingThroughput?: number;
};
contextWindow?: {
usedTokens: number;
maxTokens: number;
percentage: number;
remainingTokens: number;
};
usage?: {
promptTokens: number;
completionTokens: number;
totalTokens: number;
model?: string;
provider?: string;
cachedInputTokens?: number;
cacheCreationInputTokens?: number;
cacheReadInputTokens?: number;
metadata?: Record<string, unknown>;
};
} | {
type: "error";
error: {
message: string;
code?: string;
recoverable?: boolean;
};
conversationId: string;
timestamp: Date;
};