--- name: ruby-llm description: Build AI-powered Ruby applications with RubyLLM. Full lifecycle - chat, tools, streaming, Rails integration, embeddings, and production deployment. Covers all providers (OpenAI, Anthropic, Gemini, etc.) with one unified API. --- ## How RubyLLM Works RubyLLM provides one beautiful Ruby API for all LLM providers. Same interface whether using GPT, Claude, Gemini, or local Ollama models. ### 1. One API for Everything ```ruby # Chat with any provider - same interface chat = RubyLLM.chat(model: 'gpt-4.1') chat = RubyLLM.chat(model: 'claude-sonnet-4-5') chat = RubyLLM.chat(model: 'gemini-2.0-flash') # All return the same RubyLLM::Message object response = chat.ask("Hello!") puts response.content ``` ### 2. Configuration First Always configure API keys before use: ```ruby # config/initializers/ruby_llm.rb RubyLLM.configure do |config| config.openai_api_key = ENV['OPENAI_API_KEY'] config.anthropic_api_key = ENV['ANTHROPIC_API_KEY'] config.gemini_api_key = ENV['GEMINI_API_KEY'] config.request_timeout = 120 config.max_retries = 3 end ``` ### 3. Tools Are Ruby Classes Define tools as `RubyLLM::Tool` subclasses with `description`, `param`, and `execute`: ```ruby class Weather < RubyLLM::Tool description "Get current weather for a location" param :latitude, type: 'number', desc: "Latitude" param :longitude, type: 'number', desc: "Longitude" def execute(latitude:, longitude:) # Return structured data, not exceptions { temperature: 22, conditions: "Sunny" } rescue => e { error: e.message } # Let LLM handle errors gracefully end end chat.with_tool(Weather).ask("What's the weather in Berlin?") ``` ### 4. Rails Integration with acts_as_chat Persist conversations automatically: ```ruby class Chat < ApplicationRecord acts_as_chat end chat = Chat.create!(model: 'gpt-4.1') chat.ask("Hello!") # Automatically persists messages ``` ### 5. Streaming with Blocks Real-time responses via blocks: ```ruby chat.ask("Tell me a story") do |chunk| print chunk.content # Print as it arrives end ``` **What would you like to do?** 1. Build a new AI feature (chat, embeddings, image generation) 2. Add Rails chat integration (acts_as_chat, Turbo Streams) 3. Implement tools/function calling 4. Add streaming responses 5. Debug an LLM interaction 6. Optimize for production 7. Something else **Wait for response, then read the matching workflow.** | Response | Workflow | |----------|----------| | 1, "new", "feature", "chat", "embed", "image" | `workflows/build-new-feature.md` | | 2, "rails", "acts_as", "persist", "turbo" | `workflows/add-rails-chat.md` | | 3, "tool", "function", "agent" | `workflows/implement-tools.md` | | 4, "stream", "real-time", "sse" | `workflows/add-streaming.md` | | 5, "debug", "error", "fix", "not working" | `workflows/debug-llm.md` | | 6, "production", "optimize", "performance", "scale" | `workflows/optimize-performance.md` | | 7, other | Clarify need, then select workflow or read references | **After reading the workflow, follow it exactly.** ## After Every Change ```bash # 1. Does it load? bin/rails console -e test > RubyLLM.chat.ask("Test") # 2. Do tests pass? bin/rails test test/models/chat_test.rb # 3. Check for errors bin/rails test 2>&1 | grep -E "(Error|Fail|exception)" ``` Report to user: - "Config: API keys loaded" - "Chat: Working with [model]" - "Tests: X pass, Y fail" ## Domain Knowledge All in `references/`: **Getting Started:** getting-started.md **Core Features:** chat-api.md, tools.md, streaming.md, structured-output.md **Rails:** rails-integration.md **Capabilities:** embeddings.md, image-audio.md **Infrastructure:** providers.md, error-handling.md, mcp-integration.md **Quality:** anti-patterns.md ## Workflows All in `workflows/`: | File | Purpose | |------|---------| | build-new-feature.md | Create new AI feature from scratch | | add-rails-chat.md | Add persistent chat to Rails app | | implement-tools.md | Create custom tools/function calling | | add-streaming.md | Add real-time streaming responses | | debug-llm.md | Find and fix LLM issues | | optimize-performance.md | Production optimization |