import type { ControlTransport } from './types.js'; export type LLMContentPart = { type: 'text'; text: string; } | { type: 'image_url'; image_url: { url: string; detail?: 'auto' | 'low' | 'high'; }; } | { type: 'input_audio'; input_audio: { data: string; format: 'wav' | 'mp3'; }; }; export interface LLMMessage { role: 'system' | 'developer' | 'user' | 'assistant'; content: string | LLMContentPart[]; } export interface LLMRequest { messages: LLMMessage[]; /** Defaults to the runtime's gemini-3.8-flash; only server-allowed models work. */ model?: string; max_tokens?: number; temperature?: number; } export interface LLMRequestOptions { signal?: AbortSignal; } export interface LLMUsage { prompt_tokens: number; completion_tokens: number; total_tokens: number; } export interface LLMUsageSummary extends LLMUsage { requests: number; unresolved_requests: number; } export interface LLMCompletion { id: string; model: string; choices: { index: number; message: { role: string; content: string | null; }; finish_reason: string | null; }[]; usage: LLMUsage; } export interface LLMChunk { id: string; model: string; choices: { index: number; delta: { role?: string; content?: string | null; }; finish_reason: string | null; }[]; usage?: LLMUsage | null; } /** Authenticated runtime proxy. Provider credentials never enter the game. */ export declare class GameLLM { private readonly transport; readonly gameId: string; constructor(transport: ControlTransport, gameId: string); complete(request: LLMRequest, options?: LLMRequestOptions): Promise; stream(request: LLMRequest, options?: LLMRequestOptions): AsyncGenerator; /** All games combined for the verified current user. */ usage(options?: LLMRequestOptions): Promise; } /** Decode SSE incrementally, including UTF-8 and CRLF split across packets. */ export declare function readLLMStream(response: Response): AsyncGenerator;