/** * AI Module Types * * Shared type definitions for AI drivers and agents. */ export declare interface AIMessage { role: 'user' | 'assistant' | 'system' content: string | AIMessageContent[] } export declare interface AIMessageContent { type: 'text' | 'image_url' | 'image' text?: string image_url?: { url: string, detail?: 'auto' | 'low' | 'high' } source?: { type: 'base64', media_type: string, data: string } } export declare interface AIDriver { name: string process: (command: string, context: string, history: AIMessage[]) => Promise stream?: (command: string, context: string, history: AIMessage[]) => AsyncGenerator embed?: (input: string | string[]) => Promise } export declare interface AIDriverConfig { apiKey?: string baseUrl?: string model?: string maxTokens?: number } export declare interface StreamingResult { stream: ReadableStream fullResponse: Promise } export declare interface EmbeddingResult { embedding: number[] index: number object: string } export declare interface EmbeddingsResponse { data: EmbeddingResult[] model: string usage: { prompt_tokens: number total_tokens: number } } /** * Tool / function definition that the model can call back into. * Cross-provider shape: OpenAI's `tools[]` and Anthropic's `tools[]` * map to this same structure via the JSON Schema for parameters. */ export declare interface AITool { name: string description?: string parameters?: Record } export declare interface ChatCompletionOptions { model?: string maxTokens?: number temperature?: number topP?: number stop?: string | string[] stream?: boolean tools?: AITool[] toolChoice?: 'auto' | 'required' | 'none' | { name: string } responseFormat?: AIResponseFormat } export declare interface AIResult { content: string model: string usage?: { promptTokens: number completionTokens: number totalTokens: number } finishReason?: string } export declare interface ClaudeAPIResponse { content: Array<{ type: string, text: string }> } export declare interface OpenAIAPIResponse { choices: Array<{ message: { content: string } }> } export declare interface OllamaAPIResponse { message: { content: string } } export declare interface ClaudeStreamEvent { type: string subtype?: string message?: { content: Array<{ type: string text?: string name?: string input?: Record }> } delta?: { text?: string } result?: string index?: number content_block?: { type: string text?: string } } // Buddy Types export declare interface RepoState { path: string name: string branch: string hasChanges: boolean lastCommit?: string } export declare interface GitHubCredentials { token: string username: string name: string email: string } export declare interface BuddyState { repo: RepoState | null conversationHistory: AIMessage[] currentDriver: string github: GitHubCredentials | null } export declare interface BuddyConfig { workDir: string commitMessage: string ollamaHost: string ollamaModel: string } export declare interface BuddyApiKeys { anthropic?: string openai?: string claudeCliHost?: string } // Image types export declare interface ImageGenerationConfig { provider: 'openai' model?: string apiKey?: string } // Search/RAG types export declare interface SearchConfig { embeddingProvider: 'openai' | 'ollama' embeddingModel?: string generationProvider?: 'anthropic' | 'openai' | 'ollama' generationModel?: string } // MCP types export declare interface MCPConfig { servers: Array<{ name: string command?: string args?: string[] url?: string env?: Record }> } // AI module config (used by @stacksjs/config) export declare interface AIConfig { default?: AIProvider | string models?: string[] drivers?: { anthropic?: AIDriverConfig & { anthropicVersion?: string } openai?: AIDriverConfig & { embeddingModel?: string } ollama?: AIDriverConfig & { host?: string; embeddingModel?: string } } image?: ImageGenerationConfig search?: SearchConfig mcp?: MCPConfig } /** * Safe, provider-neutral configuration metadata for diagnostics and UI. * Never includes credentials. */ export declare interface AIProviderConfiguration { provider: AIProvider model?: string configured: boolean source: AIConfigurationSource } export declare interface ConfiguredAIOptions extends AIConfig { drivers?: { anthropic?: AIDriverConfig & { anthropicVersion?: string } openai?: AIDriverConfig & { embeddingModel?: string } ollama?: AIDriverConfig & { host?: string, embeddingModel?: string } } } export declare interface GenerateObjectOptions extends ChatCompletionOptions { attempts?: number system?: string } export declare interface ConfiguredAIClient { provider: AIProvider configuration: AIProviderConfiguration generate: (messages: AIMessage[], options?: ChatCompletionOptions & { system?: string }) => Promise generateObject: ( messages: AIMessage[], schema: Record, options?: GenerateObjectOptions, ) => Promise<{ data: T, result: AIResult }> } /** * Structured-output / JSON-mode response format. Modeled after * OpenAI's `response_format` but the Anthropic driver maps it to * the tools-as-json pattern internally (stacksjs/stacks#1878 A-1). */ export type AIResponseFormat = | { type: 'text' } | { type: 'json_object' } | { type: 'json_schema' json_schema: { name: string schema: Record strict?: boolean } } export type AIProvider = 'anthropic' | 'openai' | 'ollama'; export type AIConfigurationSource = 'config' | 'environment' | 'base-url' | 'local' | 'none';