Commit Graph

79 Commits

  • fix(ai): Fix browser compatibility for Anthropic OAuth tokens
    - Check if process exists before modifying process.env
    - Prevents errors in browser environments
    - Maintains OAuth token functionality in Node.js
  • feat(ai): Add cross-provider message handoff support
    - Add transformMessages utility to handle cross-provider compatibility
    - Convert thinking blocks to <thinking> tagged text when switching providers
    - Preserve native thinking blocks when staying with same provider/model
    - Add comprehensive handoff tests verifying all provider combinations
    - Fix OpenAI Completions to return partial results on abort
    - Update tool call ID format for Anthropic compatibility
    - Document cross-provider handoff capabilities in README
  • refactor(ai): Update API to support partial results on abort
    - Anthropic, Google, and OpenAI Responses providers now return partial results when aborted
    - Restructured streaming to accumulate content blocks incrementally
    - Prevents submission of thinking/toolCall blocks from aborted completions in multi-turn conversations
    - Makes UI development easier by providing partial content even when requests are interrupted
  • feat(ai): Add start event emission to all providers
    - Emit start event with model and provider info after creating stream
    - Add abort signal tests for all providers
    - Update README abort signal section to reflect non-throwing API
    - Fix model references in README examples
  • docs(ai): Add all event types to streaming example
    - Add 'start' event with model/provider info
    - Add 'done' event with stop reason and usage stats
    - Add 'error' event handling
    - Show more detailed event data in examples
  • docs(ai): Update README for new content blocks API
    - Add API changes section explaining v0.5.15+ changes
    - Update Quick Start example to show content array usage
    - Update Tool Calling example to filter tool calls from content blocks
    - Update Streaming example to use new onEvent callback
    - Fix model IDs in provider-specific examples
  • fix(ai): Fix OpenAI Responses provider multi-turn conversation support
    - Collect complete output items during streaming instead of building blocks incrementally
    - Handle reasoning summary parts with proper newline separation
    - Support refusal content in message outputs
    - Preserve full reasoning items and message IDs for multi-turn resubmission
    - Emit proper streaming events for text and thinking deltas
  • refactor(ai): Update API to support multiple thinking and text blocks
    BREAKING CHANGE: AssistantMessage now uses content array instead of separate fields
    - Changed AssistantMessage.content from string to array of content blocks
    - Removed separate thinking, toolCalls, and signature fields
    - Content blocks can be TextContent, ThinkingContent, or ToolCall types
    - Updated streaming events to include start/end events for text and thinking
    - Fixed multiTurn test to handle new content structure
    
    Note: Currently only Anthropic provider is updated to work with new API
    Other providers need to be updated to match the new interface
  • test(ai): Add image input test for Anthropic Haiku 3.5
    - Added image handling test for Claude 3.5 Haiku
    - Ensures vision capabilities are properly tested
  • fix(ai): Fix OpenAI Responses provider multi-turn conversation support
    - Added contentSignature tracking for assistant messages
    - Fixed message format in convertToResponsesFormat (output_text instead of input_text)
    - Properly preserve message IDs for multi-turn conversations
    - Added proper ResponseOutputMessage type satisfaction
    - Updated tests to cover more providers and multi-turn scenarios
  • feat(ai): Enable browser support for OpenAI providers
    - Added dangerouslyAllowBrowser: true to OpenAI client initialization
    - Allows usage of the library in browser environments
    - Applies to both OpenAICompletionsLLM and OpenAIResponsesLLM
  • chore: Mark AI package implementation task as complete
    - Moved completed AI package implementation task to done folder
    - Task successfully implemented the unified AI API (@mariozechner/pi-ai)
    - Package renamed, documentation improved, and published as v0.5.12
  • docs(ai): Fix model names in README examples
    - Changed gpt-4o-mini to gpt-5-mini in examples to match actual model names
    - Minor formatting fixes
  • docs(ai): Improve README with model discovery and capabilities documentation
    - Added note that library only includes tool-calling capable models
    - Added Model Discovery section showing how to enumerate models
    - Added examples for finding models with specific capabilities
    - Added cache read/write costs to model capabilities display
    - Clarified that models are auto-fetched from APIs at build time
  • feat(ai): Rename package to @mariozechner/pi-ai and improve documentation
    - Changed package name from @mariozechner/ai to @mariozechner/pi-ai
    - Fixed generate-models.ts to fetch from models.dev API instead of local file
    - Completely rewrote README with practical examples:
      - Image input with base64 encoding
      - Proper tool calling with context management
      - Streaming with completion indicators
      - Abort signal usage
      - Provider-specific options (reasoning/thinking)
      - Custom model definitions for local/self-hosted LLMs
      - Environment variables explanation
    - Bumped version to 0.5.9 and published
  • feat(ai): Add image input tests for vision-capable models
    - Added image tests to OpenAI Completions (gpt-4o-mini)
    - Added image tests to Anthropic (claude-sonnet-4-0)
    - Added image tests to Google (gemini-2.5-flash)
    - Tests verify models can process and describe the red circle test image
  • docs(ai): Simplify ImageContent interface to base64-only approach
    - Change ImageContent to simple { type, data, mimeType } structure
    - Remove URL and file path support from core interface
    - Simplify provider converters to work with base64 data only
    - Update validation and implementation considerations
    - Clarify that preprocessing is user's responsibility
  • docs(ai): Add comprehensive image input documentation for all LLM providers
    - Document image support for Anthropic, Google GenAI, OpenAI APIs
    - Include format requirements, size limits, and API examples
    - Propose unified abstraction layer for cross-provider image handling
    - Add implementation examples for format conversion and validation
  • fix(ai): Fix OpenAI completions store field type issue
    - Cast params to any for store field assignment
    - Maintains compatibility with providers that don't support store field
  • feat(ai): Add cost tracking to LLM implementations
    - Track input/output token costs for all providers
    - Calculate costs based on Model pricing information
    - Include cost information in AssistantMessage responses
    - Add Usage interface with detailed cost breakdown
    - Implement calculateCost utility function for cost calculations
  • refactor(ai): Update LLM implementations to use Model objects
    - LLM constructors now take Model objects instead of string IDs
    - Added provider field to AssistantMessage interface
    - Updated getModel function with type-safe model ID autocomplete
    - Fixed Anthropic model ID mapping for proper API aliases
    - Added baseUrl to Model interface for provider-specific endpoints
    - Updated all tests to use getModel for model instantiation
    - Removed deprecated models.json in favor of generated models
  • fix(ai): Deduplicate models and add Anthropic aliases
    - Add proper Anthropic model aliases (claude-opus-4-1, claude-sonnet-4-0, etc.)
    - Deduplicate models when same ID appears in both models.dev and OpenRouter
    - models.dev takes priority over OpenRouter for duplicate IDs
    - Fix test to use correct claude-3-5-haiku-latest alias
    - Reduces Anthropic models from 11 to 10 (removed duplicate)
  • feat(ai): Add models.generated.ts with 181 tool-capable models
    - Generated from OpenRouter API and models.dev
    - Includes models from Google, OpenAI, Anthropic, xAI, Groq, Cerebras, OpenRouter
    - Provides type-safe model selection with autocomplete
  • refactor(ai): Implement unified model system with type-safe createLLM
    - Add Model interface to types.ts with normalized structure
    - Create type-safe generic createLLM function with provider-specific model constraints
    - Generate models from OpenRouter API and models.dev data
    - Strip provider prefixes for direct providers (google, openai, anthropic, xai)
    - Keep full model IDs for OpenRouter-proxied models
    - Clean separation: types.ts (Model interface), models.ts (factory logic), models.generated.ts (data)
    - Remove old model scripts and unused dependencies
    - Rename GeminiLLM to GoogleLLM for consistency
    - Add tests for new providers (xAI, Groq, Cerebras, OpenRouter)
    - Support 181 tool-capable models across 7 providers with full type safety
  • feat(ai): Migrate tests to Vitest and add provider test coverage
    - Switch from Node.js test runner to Vitest for better DX
    - Add test suites for Grok, Groq, Cerebras, and OpenRouter providers
    - Add Ollama test suite with automatic server lifecycle management
    - Include thinking mode and multi-turn tests for all providers
    - Remove example files (consolidated into test suite)
    - Add VS Code test configuration
  • feat(ai): Add auto-generated TypeScript models with factory function
    - Generate models.generated.ts from models.json with proper types
    - Categorize providers: OpenAI (Responses), OpenAI-compatible, Anthropic, Gemini
    - Create createLLM() factory with TypeScript overloads for type safety
    - Auto-detect base URLs and environment variables for providers
    - Support 353 models across 39 providers with full autocompletion
    - Exclude generated file from git (rebuilt on npm build)
  • fix(ai): Improve ModelInfo types based on actual data structure
    - Remove catch-all [key: string]: any from ModelInfo
    - Make all required fields non-optional (attachment, reasoning, etc.)
    - Add proper union types for modalities (text, image, audio, video, pdf)
    - Mark only cost and knowledge fields as optional
    - Export ModalityInput and ModalityOutput types
  • feat(ai): Add models.dev data integration
    - Add models script to download latest model information
    - Create models.ts module to query model capabilities
    - Include models.json in package distribution
    - Export utilities to check model features (reasoning, tools)
    - Update build process to copy models.json to dist
  • feat(ai): Add OpenAI-compatible provider examples for multiple services
    - Add examples for Cerebras, Groq, Ollama, and OpenRouter
    - Update OpenAI Completions provider to handle base URL properly
    - Simplify README formatting
    - All examples use the same OpenAICompletionsLLM provider with different base URLs
  • docs(ai): Update README with working quick start examples
    - Replace planned features with actual working code examples
    - Add clear provider comparison table
    - Show real imports and usage patterns
    - Include streaming, thinking, and tool calling examples
    - Update supported models to match current implementation
  • test(ai): Add comprehensive E2E tests for all AI providers
    - Add multi-turn test to verify thinking and tool calling work together
    - Test thinkingSignature handling for proper multi-turn context
    - Fix Gemini provider to generate base64 thinkingSignature when needed
    - Handle multiple rounds of tool calls in tests (Gemini behavior)
    - Make thinking tests more robust for model-dependent behavior
    - All 18 tests passing across 4 providers
  • fix(ai): Correct Gemini thinking config structure
    - Fixed thinkingConfig to be at top level, not nested under 'config'
    - Matches Gemini API documentation structure
  • feat(ai): Add proper thinking support for Gemini 2.5 models
    - Added thinkingConfig with includeThoughts and thinkingBudget support
    - Use part.thought boolean flag to detect thinking content per API docs
    - Capture and preserve thought signatures for multi-turn function calling
    - Added supportsThinking() check for Gemini 2.5 series models
    - Updated example to demonstrate thinking configuration
    - Handle SDK type limitations with proper type assertions
  • feat(ai): Implement Gemini provider with streaming and tool support
    - Added GeminiLLM provider implementation with GoogleGenerativeAI SDK
    - Supports streaming with text/thinking content and completion signals
    - Handles Gemini's parts-based content system (text, thought, functionCall)
    - Implements tool/function calling with proper format conversion
    - Maps between unified types and Gemini-specific formats (model vs assistant role)
    - Added test example matching other provider patterns
    - Fixed typo in AssistantMessage type (stopResaon -> stopReason) across all providers
  • refactor(ai): Add completion signal to onText/onThinking callbacks
    - Update LLMOptions interface to include completion boolean parameter
    - Modify all providers to signal when text/thinking blocks are complete
    - Update examples to handle the completion parameter
    - Move documentation files to docs/ directory
  • feat(ai): Add OpenAI Completions and Responses API providers
    - Implement OpenAICompletionsLLM for Chat Completions API with streaming
    - Implement OpenAIResponsesLLM for Responses API with reasoning support
    - Update types to use LLM/Context instead of AI/Request
    - Add support for reasoning tokens, tool calls, and streaming
    - Create test examples for both OpenAI providers
    - Update Anthropic provider to match new interface
  • feat(ai): Implement unified AI API with Anthropic provider
    - Define clean API with complete() method and callbacks for streaming
    - Add comprehensive type system for messages, tools, and usage
    - Implement AnthropicAI provider with full feature support:
      - Thinking/reasoning with signatures
      - Tool calling with parallel execution
      - Streaming via callbacks (onText, onThinking)
      - Proper error handling and stop reasons
      - Cache tracking for input/output tokens
    - Add working test/example demonstrating tool execution flow
    - Support for system prompts, temperature, max tokens
    - Proper message role types: user, assistant, toolResult
  • feat(ai): Create unified AI package with OpenAI, Anthropic, and Gemini support
    - Set up @mariozechner/ai package structure following monorepo patterns
    - Install OpenAI, Anthropic, and Google Gemini SDK dependencies
    - Document comprehensive API investigation for all three providers
    - Design minimal unified API with streaming-first architecture
    - Add models.dev integration for pricing and capabilities
    - Implement automatic caching strategy for all providers
    - Update project documentation with package creation guide
  • fix: Remove unused imports and add biome-ignore for false positive
    - Remove unused SlashCommand import from tui-renderer.ts
    - Add biome-ignore comment for previousRenderCommands which is actually used