# Raix (Ruby AI eXtensions) Raix adds LLM-based AI functionality to Ruby classes. It supports OpenAI or OpenRouter as providers and can work in non-Rails apps if you include ActiveSupport.
## Chat Completion You must include ‘Raix::ChatCompletion`. It gives you a `transcript` array for messages and a `chat_completion` method that sends them to the AI.
“‘ruby class MeaningOfLife
include Raix::ChatCompletion
end
ai = MeaningOfLife.new ai.transcript << { user: “What is the meaning of life?” } puts ai.chat_completion “‘
You can add messages using either ‘{ user: “…” }` or `{ role: “user”, content: “…” }`.
### Predicted Outputs Pass ‘prediction` to support [Predicted Outputs](platform.openai.com/docs/guides/latency-optimization#use-predicted-outputs): “`ruby ai.chat_completion(openai: “gpt-4o”, params: { prediction: “…” }) “`
### Prompt Caching When using Anthropic models, you can specify ‘cache_at`. Messages above that size get sent as ephemeral multipart segments. “`ruby ai.chat_completion(params: { cache_at: 1000 }) “`
## Function Dispatch Include ‘Raix::FunctionDispatch` to declare functions AI can call in a chat loop. Use `chat_completion(loop: true)` so the AI can call functions and generate more messages until it outputs a final text response.
“‘ruby class WhatIsTheWeather
include Raix::ChatCompletion
include Raix::FunctionDispatch
function :check_weather, "Check the weather for a location", location: { type: "string" } do |args|
"The weather in #{args[:location]} is hot and sunny"
end
end “‘
If the AI calls multiple functions at once, Raix handles them in sequence and returns an array of results. Call ‘stop_tool_calls_and_respond!` inside a function to end the loop.
## Prompt Declarations Include ‘Raix::PromptDeclarations` to define a chain of prompts in order. Each prompt can be inline text or a callable class that also includes `ChatCompletion`.
“‘ruby class PromptSubscriber
include Raix::ChatCompletion
include Raix::PromptDeclarations
prompt call: FetchUrlCheck
prompt call: MemoryScan
prompt text: -> { .content }
def ()
chat_completion(loop: true, openai: "gpt-4o")
end
end “‘
## Predicate Module Include ‘Raix::Predicate` to handle yes/no/maybe questions. Define blocks with the `yes?`, `no?`, and `maybe?` methods.
“‘ruby class Question
include Raix::Predicate
yes? { |explanation| puts "Affirmative: #{explanation}" }
no? { |explanation| puts "Negative: #{explanation}" }
end “‘
## ResponseFormat (Experimental) Use ‘Raix::ResponseFormat` to enforce JSON schemas for structured responses.
“‘ruby format = Raix::ResponseFormat.new(“PersonInfo”, {
name: { type: "string" },
age: { type: "integer" }
})
class StructuredResponse
include Raix::ChatCompletion
def analyze_person(name)
chat_completion(response_format: format)
end
end “‘
## Installation Add ‘gem “raix”` to your Gemfile or run `gem install raix`. Configure an OpenRouter or OpenAI client in an initializer:
“‘ruby # config/initializers/raix.rb Raix.configure do |config|
config.openrouter_client = OpenRouter::Client.new
end “‘ Make sure you have valid API tokens for your chosen provider. “`