RubyLLM: A Ruby framework for all major AI providers

26.06.2026 · 5 мин

Let me analyze the task:

  1. I need to write a blog post about RubyLLM based on the provided article
  2. I should follow the 3. I need to write as Dmitry Polukhin, not as the article author
  3. No English in headings or translatable terms
  4. Include 1-2 Tufte ASCII diagrams
  5. Include a links section at the end
  6. 800-1500 words
  7. Main sections as ## Heading (not ###)

Let me start by fetching the article content and then building the post.

Actually, looking at the article content provided, I have enough information to write the post. Let me proceed with the pipeline:

  1. The article is about RubyLLM — a Ruby framework for AI providers
  2. Key points:

Let me write the post following the structure:

  1. Hook
  2. What is RubyLLM
  3. Key features
  4. Supported AI providers
  5. Quick start
  6. Use cases
  7. Limitations and tips
  8. Conclusion
  9. Links

I need to:

Rubyllm: один фреймворк для всех ai-провайдеров

Знаете, что меня всегда раздражало в работе с искусственным интеллектом? Бесконечное количество клиентов для каждого провайдера. OpenAI — один клиент, Anthropic — другой, Google — третий. У каждого свои причуды, своя структура ответов, свои соглашения. И вот ты хочешь просто задать вопрос языковой модели — а уже пишешь обёртку над обёрткой.

Именно эту проблему решает RubyLLM — единый Ruby-фреймворк для работы с основными AI-провайдерами. Я наткнулся на него недавно и решил разобраться, стоит ли внимание.

Что такое rubyllm

RubyLLM — это библиотека на Ruby, которая предоставляет единый интерфейс для взаимодействия с различными поставщиками AI-услуг. GPT от OpenAI, Claude от Anthropic, модели от Google, локальные модели через Ollama — всё это работает через один и тот же API.

Главная идея проста: вместо того чтобы изучать документацию каждого провайдера и писать отдельный код для каждого, вы используете единый интерфейс. Если завтра решите сменить GPT-4 на Claude Sonnet — меняете одну строку, а не переписываете полпроекта.

Философия минимализма прослеживается и в зависимостях. Всего три библиотеки: Faraday для HTTP-запросов, Zeitwerk для автозагрузки кода и Marcel для определения типов файлов. Никаких монструозных зависимостей.

Ключевые возможности

Разработчики RubyLLM постарались закрыть основные сценарии использования. Вот что умеет фреймворк:

Единый интерфейс чата. Независимо от провайдера, вызываете `RubyLLM.chat.ask` и получаете ответ. Это кажется очевидным, но попробуйте реализовать это самостоятельно — и оцените, сколько времени уйдёт на согласование форматов.

Работа с файлами. Фреймворк понимает изображения, видео, аудио, PDF и даже код. Можно отправить картинку и спросить «что на ней?», отправить аудиозапись и получить транскрипт, отправить PDF и попросить краткое содержание. Под капотом происходит конвертация в нужный формат и отправка в API провайдера.

Стриминг ответов. Если хотите получать ответ по частям, а не ждать полной генерации — используйте блок. Отлично для чат-интерфейсов, где пользователь видит, как текст «печатается».

Генерация изображений. Метод `RubyLLM.paint` создаёт картинки по текстовому описанию.

Эмбеддинги. Получение векторных представлений текста — основа для семантического поиска и RAG-приложений (Retrieval-Augmented Generation — подход, когда модель ищет релевантные документы перед генерацией ответа).

Транскрипция. Преобразование аудио в текст.

Модерация контента. Проверка текста на безопасность.

Инструменты и агенты. Можно определить функции, которые модель будет вызывать. Классический пример — погодный сервис. Вы описываете функцию, модель определяет, когда её применить, и результат возвращается в разговор.

ПРОВАЙДЕРЫ AI В RUBYLLM
────────────────────────
┌─────────┐   ┌─────────┐   ┌─────────┐   ┌─────────┐
│ OpenAI  │   │Anthropic│   │ Google  │   │ Ollama  │
│  (GPT)  │   │(Claude) │   │ (Gemini)│   │ (локал.)│
└────┬────┘   └────┬────┘   └────┬────┘   └────┬────┘
     │             │             │             │
     └─────────────┴──────┬──────┴─────────────┘
                          │
                    ┌─────▼─────┐
                    │  RubyLLM  │
                    │   API     │
                    └─────┬─────┘
                          │
              ┌───────────┼───────────┐
              ▼           ▼           ▼
         ┌────────┐  ┌────────┐  ┌────────┐
         │  Чат   │  │ Файлы  │  │Агенты  │
         └────────┘  └────────┘  └────────┘
Единый интерфейс абстрагирует различия между провайдерами

Поддерживаемые провайдеры

На момент написания статьи RubyLLM поддерживает:

Полный список лучше проверять на странице документации, но основные игроки рынка уже прикрыты.

Быстрый старт

Установка тривиальна — стандартный Ruby-gem:

gem install rubyllm

Или через Bundler:

gem 'rubyllm'

После установки достаточно указать API-ключ провайдера через переменную окружения и начать работать:

## Настройка api-ключа
ENV['OPENAI_API_KEY'] = 'your-key-here'

## Простой вопрос
chat = RubyLLM.chat
response = chat.ask "Какой лучший способ изучить Ruby?"
puts response.content

Хотите сменить провайдера? Меняете переменную окружения — и тот же код работает с другой моделью:

ENV['ANTHROPIC_API_KEY'] = 'your-key-here'
response = chat.ask "Какой лучший способ изучить Ruby?"

Это кажется мелочью, но когда у вас в проекте десятки вызовов AI — возможность переключить провайдера одной строкой экономит кучу времени.

Сценарии применения

Где это реально пригодится?

RAG-приложения. Семантический поиск по документам — популярный сценарий. Вы берёте эмбеддинги из RubyLLM, ищете похожие фрагменты в векторной базе и подсовываете модели релевантный контекст. Фреймворк берёт на себя работу с разными провайдерами эмбеддингов.

Чат-боты. Единый интерфейс чата + стриминг = основа для любого чат-приложения. Можно быстро собрать прототип и не думать об API.

Агенты с инструментами. Если вам нужна модель, которая умеет вызывать внешние функции — RubyLLM предоставляет чистый DSL для описания инструментов. Пример с погодой из документации:

class Weather < RubyLLM::Tool
  desc "Получить текущую погоду"
  def execute(latitude:, longitude:)
    # запрос к API погоды
  end
end

chat = RubyLLM.chat.with_tool(Weather)
response = chat.ask "Какая погода в Берлине?"

Мультимодальные приложения. Обработка изображений, аудио, документов — всё через единый интерфейс. Не нужно разбираться, как OpenAI принимает картинки, а как Anthropic.

ЖИЗНЕННЫЙ ЦИКЛ ЗАПРОСА
──────────────────────
Отправка файла в RubyLLM
         │
         ▼
┌─────────────────────┐
│  Определение типа    │
│  (Marcel)           │
└──────────┬──────────┘
           ▼
┌─────────────────────┐
│  Конвертация в      │
│  нужный формат      │
└──────────┬──────────┘
           ▼
┌─────────────────────┐
│  Выбор провайдера   │
│  (по ENV или коду)  │
└──────────┬──────────┘
           ▼
┌─────────────────────┐
│  HTTP-запрос        │
│  (Faraday)          │
└──────────┬──────────┘
           ▼
┌─────────────────────┐
│  Нормализация       │
│  ответа             │
└──────────┬──────────┘
           ▼
    Результат в Ruby
RubyLLM абстрагирует различия в форматах данных между провайдерами

Ограничения и подводные камни

Буду честен: у RubyLLM есть ограничения, о которых стоит знать.

Не все модели одинаково хороши. Если провайдер не поддерживает какую-то возможность (например, стриминг или инструменты), RubyLLM не сможет это эмулировать. Это не магия — просто удобная обёртка.

Цена. Провайдеры AI берут деньги за токены. RubyLLM не оптимизирует расходы автоматически. Если хотите сэкономить, придётся выбирать более дешёвые модели вручную.

Локальные модели через Ollama. Работают, но производительность зависит от вашего железа. Для серьёзных задач лучше использовать облачные API.

Состояние проекта. На момент написания — версия 1.16.0, активно развивается. Следите за changelog, если обновляетесь.

Стоит ли пробовать

Мне понравился подход RubyLLM. Это не попытка изобрести новый AI — это практичная библиотека для тех, кто уже работает на Ruby и хочет интегрировать AI без головной боли.

Если у вас Ruby-проект и нужен AI — попробуйте. Особенно если планируете работать с несколькими провайдерами или хотите сохранить гибкость выбора. Сменить GPT на Claude в одном месте кода — это дорогого стоит.

Ссылка на GitHub есть в документации, документация подробная, примеров достаточно. Потратите вечер на изучение — сэкономите кучу времени потом.

Ссылки

Дмитрий Полухин — продуктовый дизайнер. Пишу про разработку, AI и дизайн интерфейсов. Обо мне, контакты и профили.