// Internal IR (Intermediate Representation) for any model graph. // We deliberately decouple from ONNX so we can later add other backends // (TensorFlow SavedModel, GGUF metadata, raw config.json heuristics, etc.) // without touching the rendering layer. export type TensorShape = (number | string)[]; export interface IRTensorInfo { name: string; shape: TensorShape; dtype: string; } export interface IRWeight { name: string; shape: number[]; dtype: string; numParams: number; } export interface IRNode { id: string; opType: string; name: string; inputs: string[]; outputs: string[]; attrs: Record; weights: IRWeight[]; } export type IREdgeKind = "tree" | "forward" | "residual"; export interface IREdge { id: string; source: string; target: string; tensor: string; shape?: TensorShape; dtype?: string; /** * Visual classification, used by the renderer to pick a style: * - `tree` parent→child structural edge (default for legacy paths) * - `forward` real forward()-pass edge synthesised from a template * - `residual` residual / skip connection */ kind?: IREdgeKind; } export interface IRGraphMeta { modelName: string; producer: string; irVersion: number; opsetVersion: number; totalParams: number; nodeCount: number; inputs: IRTensorInfo[]; outputs: IRTensorInfo[]; /** HF `model_type` from config.json (e.g. "llama", "gpt2", "bert"). Used to * generate human-friendly Python class names like LlamaDecoderLayer. */ modelType?: string; /** First entry of `architectures` from config.json (e.g. "LlamaForCausalLM"). */ architecture?: string; } export interface IRGraph { nodes: IRNode[]; edges: IREdge[]; meta: IRGraphMeta; } export interface ResolvedModel { repoId: string; filePath: string; url: string; sizeBytes: number; hasExternalData: boolean; } export interface LoadProgress { phase: "resolving" | "streaming" | "building" | "laying-out" | "done"; message: string; /** Bytes received from the network so far. */ loaded?: number; /** Total file size (for context) — note streaming may finish earlier. */ total?: number; }