Bonsai-Chat-WebGPU / src /lib /contracts.ts
Valeriy Selitskiy
Fix streamed tool calls and align generation limits
b4f163f
Raw
History Blame Contribute Delete
4.9 kB
import type { ModelTierId, RequestedBackend } from '../engine';
import type { ArtifactDocument } from './agent-tools';
export type ModelId = 'bonsai-1.7b' | 'bonsai-4b' | 'bonsai-8b' | 'bonsai-27b';
export type Availability = 'loaded' | 'cached' | 'remote' | 'limited' | 'loading';
export type StreamState = 'idle' | 'loading' | 'streaming' | 'complete' | 'error';
export interface ModelOption {
id: ModelId;
manifestId: ModelTierId;
label: string;
architectureLabel: string;
parameters: string;
runtimeLabel: string;
footprint: string;
availability: Availability;
contextLimit: number;
defaultContext: number;
limitReason?: string;
}
export interface ToolRun {
id: string;
name: string;
input: string;
output?: string;
state: 'queued' | 'running' | 'complete' | 'error';
}
export interface MessageMetrics {
tokens: number;
tokensPerSecond: number;
promptTokensPerSecond?: number;
timeToFirstTokenMs: number;
}
export interface ToolCallActivity {
name: string;
argumentCharacters: number;
}
export interface ChatMessage {
id: string;
role: 'user' | 'assistant' | 'system';
content: string;
reasoning?: string;
isThinking?: boolean;
timestamp: string;
state?: StreamState;
toolActivity?: ToolCallActivity;
tools?: ToolRun[];
metrics?: MessageMetrics;
error?: string;
}
export interface ChatSession {
id: string;
title: string;
messages: ChatMessage[];
modelId: ModelId;
systemPrompt: string;
updatedAt: number;
}
export interface TelemetrySnapshot {
backend: 'WebGPU' | 'WASM' | 'Unavailable';
device: string;
modelMemoryBytes: number;
kvMemoryBytes: number;
storageUsedBytes: number;
contextUsed: number;
contextLimit: number;
tokensPerSecond: number;
prefillTokensPerSecond: number;
decodeTokensPerSecond: number;
inferencePhase: 'idle' | 'prefill' | 'decode' | 'complete';
promptProcessed: number;
promptTotal: number;
completionTokens: number;
timeToFirstTokenMs: number;
gpuLayers: string;
graphSplits: number | null;
}
export interface ToolEvent {
id: string;
timestamp: string;
label: string;
detail: string;
state: 'running' | 'complete' | 'error';
}
export interface DownloadItem {
modelId: ModelId;
label: string;
receivedBytes: number;
totalBytes: number;
state: 'queued' | 'downloading' | 'paused' | 'complete' | 'error';
}
export interface ShardRetryNotice {
modelId: ModelId;
shardIndex: number;
shardCount: number;
shardPath: string;
error: string;
}
export interface StorageStatus {
usedBytes: number;
quotaBytes: number;
persistent: boolean;
downloads: DownloadItem[];
}
export interface ModelShardProgress {
index: number;
path: string;
loadedBytes: number;
verifiedBytes: number;
totalBytes: number;
state: 'queued' | 'cached' | 'downloading' | 'verifying' | 'complete' | 'error';
}
export interface ModelLoadProgress {
modelId: ModelId | null;
modelLabel: string;
stage: 'idle' | 'manifest' | 'cache' | 'download' | 'verify' | 'load' | 'ready' | 'error';
stageProgress: number;
downloadedBytes: number;
totalBytes: number;
residentBytes: number;
nativeStage: string | null;
shards: ModelShardProgress[];
}
export interface RuntimeSettings {
backend: RequestedBackend;
contextSize: number;
temperature: number;
maxTokens: number;
systemPrompt: string;
}
export interface ComposerSubmission {
prompt: string;
toolsEnabled: boolean;
}
export interface BonsaiShellProps {
models: ModelOption[];
activeModelId: ModelId;
loadedModelId: ModelId | null;
messages: ChatMessage[];
conversations: ChatSession[];
activeConversationId: string;
conversationListOpen: boolean;
streamState: StreamState;
modelLoadProgress: ModelLoadProgress;
telemetry: TelemetrySnapshot;
toolEvents: ToolEvent[];
storage: StorageStatus;
artifact: ArtifactDocument | null;
toolsEnabled: boolean;
settings: RuntimeSettings;
settingsOpen: boolean;
runtimeStatus: string;
error: string | null;
shardRetry: ShardRetryNotice | null;
onModelSelect: (modelId: ModelId) => void;
onLoadModel: (modelId: ModelId) => void;
onSend: (submission: ComposerSubmission) => void;
onRegenerate: (messageId: string) => void;
onCancel: () => void;
onToolsEnabledChange: (enabled: boolean) => void;
onOpenSettings: () => void;
onCloseSettings: () => void;
onSettingsChange: (settings: RuntimeSettings) => void;
onPersistStorage: () => void;
onClearStorage: () => void;
onClearConversation: () => void;
onOpenConversationList: () => void;
onNewConversation: () => void;
onOpenConversation: (conversationId: string) => void;
onOpenConversationSettings: (conversationId: string) => void;
onDeleteConversation: (conversationId: string) => void;
onDismissError: () => void;
onRetryShard: (modelId: ModelId) => void;
onCloseArtifact: () => void;
}