- RubyLLM permet de créer, dans des apps Ruby, des workflows IA comme des chatbots, des agents IA, du RAG ou de la génération de contenu au sein d’un framework unique
- GPT, Claude ou Ollama en local sont gérés via la même interface, avec des dépendances limitées à Faraday, Zeitwerk et Marcel
- Au-delà du chat, il couvre l’analyse d’images et de vidéos, la transcription audio, le traitement de documents, la génération d’images, les embeddings, la modération, l’appel d’outils, les sorties structurées et le streaming
- Dans Rails, il fournit
acts_as_chat, le chargement des modèles et un générateur optionnel d’interface de chat, et permet d’ouvrir une interface prête à l’emploi directement àhttp://localhost:3000/chats - Il prend en charge OpenAI, xAI, Anthropic, Gemini, VertexAI, Bedrock, DeepSeek, Mistral, Ollama, OpenRouter, Perplexity, GPUStack et les API compatibles OpenAI
Un framework IA unifié pour Ruby
- RubyLLM est un outil conçu pour réunir les principaux fournisseurs d’IA dans un seul framework Ruby
- Il vise la création de chatbots, d’agents IA, d’applications RAG, de générateurs de contenu et d’autres workflows IA
- Il est utilisé en production par Chat with Work
Une interface qui masque les différences entre API des fournisseurs
- Il se concentre sur la réduction des différences de clients, d’API, de formats de réponse et de conventions entre fournisseurs d’IA
- Il permet d’utiliser GPT, Claude et Ollama en local via une interface unique
- Il ne s’appuie que sur trois dépendances : Faraday, Zeitwerk et Marcel
Utilisation de base
- Pour une question simple, on crée un objet de chat avec
RubyLLM.chat, puis on exécute avecchat.ask- Exemple :
chat.ask "What's the best way to learn Ruby?"
- Exemple :
- L’analyse de fichiers consiste à passer les fichiers dans l’option
with:- Image :
ruby_conf.jpg - Vidéo :
video.mp4 - Audio :
meeting.wav - PDF :
contract.pdf - Code :
app.rb
- Image :
- Plusieurs fichiers peuvent être passés sous forme de tableau pour être analysés en une seule fois
- Exemple :
with: ["diagram.png", "report.pdf", "notes.txt"]
- Exemple :
- Pour les réponses en streaming, on passe un bloc afin de traiter
chunk.content
Étendue des fonctionnalités IA
RubyLLM.paintsert à la génération d’imagesRubyLLM.embedsert à créer des embeddings de texteRubyLLM.transcribesert à transcrire l’audio en texteRubyLLM.moderatesert à vérifier la sûreté du contenu- Avec une classe héritant de
RubyLLM::Tool, on peut permettre à l’IA d’appeler des méthodes Ruby- L’exemple de l’outil
Weatherreçoit une latitude et une longitude, puis récupère les données météo actuelles via l’API Open-Meteo
- L’exemple de l’outil
RubyLLM::Agentpermet de définir des agents réutilisables incluant des instructions et des outils- L’exemple
WeatherAssistantutilise le modèlegpt-5-nano, une consigne de réponse concise et l’outilWeather
- L’exemple
RubyLLM::Schemapermet de définir un schéma de sortie structurée- L’exemple
ProductSchemadéfinit les champsname,priceetfeatures
- L’exemple
Liste des fonctionnalités et prise en charge des fournisseurs
- Les principales fonctionnalités sont les suivantes
- Chat : IA conversationnelle basée sur
RubyLLM.chat - Vision : analyse d’images et de vidéos
- Audio : transcription et compréhension audio via
RubyLLM.transcribe - Documents : extraction depuis des types de fichiers comme PDF, CSV et JSON
- Image generation : génération d’images via
RubyLLM.paint - Embeddings : création d’embeddings via
RubyLLM.embed - Moderation : vérification de la sûreté du contenu via
RubyLLM.moderate - Tools : l’IA peut appeler des méthodes Ruby
- Agents : assistants réutilisables basés sur
RubyLLM::Agent - Structured output : sorties structurées basées sur des schémas JSON
- Streaming : réponses en temps réel basées sur des blocs
- Rails : intégration ActiveRecord via
acts_as_chat - Async : concurrence basée sur les Fiber
- Model registry : plus de 800 modèles avec détection de capacités et informations tarifaires
- Extended thinking : contrôle, visualisation et sauvegarde du raisonnement du modèle
- Chat : IA conversationnelle basée sur
- Les fournisseurs pris en charge sont OpenAI, xAI, Anthropic, Gemini, VertexAI, Bedrock, DeepSeek, Mistral, Ollama, OpenRouter, Perplexity, GPUStack et les API compatibles OpenAI
Installation et intégration Rails
- L’installation consiste à ajouter
gem 'ruby_llm'dans le Gemfile, puis à exécuterbundle install - Les clés API se configurent dans
config/initializers/ruby_llm.rb- Exemple :
config.openai_api_key = ENV['OPENAI_API_KEY']
- Exemple :
- L’intégration Rails s’installe avec les commandes suivantes
bin/rails generate ruby_llm:installbin/rails db:migratebin/rails ruby_llm:load_models # v1.13+
- Il est possible d’ajouter en option une interface de chat
bin/rails generate ruby_llm:chat_ui
- En déclarant
acts_as_chatdans un modèle Rails, on peut utiliser un chat basé sur ActiveRecord- Le modèle d’exemple déclare
acts_as_chatdansChat < ApplicationRecord - On peut créer un chat avec
Chat.create! model: "claude-sonnet-4"puis poser des questions en lui passant des fichiers
- Le modèle d’exemple déclare
- L’interface de chat prête à l’emploi est accessible à
http://localhost:3000/chats
1 commentaires
Avis sur Hacker News
RubyLLM était étonnamment bon, et côté ergonomie il se rapproche du framework IA de Vercel
Il essaie de trouver un équilibre entre la facilité du prêt-à-l’emploi et la flexibilité ; ce n’est pas simple, mais dans l’ensemble c’était solide
Le principal vrai problème que j’ai rencontré, c’est que le cache ne fonctionne pas toujours. Par exemple, xAI ne prend en charge que l’API de completions et renvoie mal la thought signature, ce qui pose problème
https://github.com/crmne/ruby_llm/blob/main/lib/ruby_llm/pro...
Il existe un gem open source construit au-dessus de l’abstraction de RubyLLM, Raix, et il est pas mal utilisé
https://github.com/OlympiaAI/raix
J’utilise RubyLLM en production et je l’adore. C’est un excellent framework, facile à utiliser
L’absence de support natif de l’API Responses était frustrante, comme d’autres l’ont dit, et ça donnait l’impression d’un manque important. Il existe bien un connecteur créé par un autre développeur, mais il a des bugs et n’atteint pas le niveau de qualité du gem principal
J’attends avec impatience la suite du développement, surtout la 2.0. Maintenant que l’API Responses est intégrée nativement, je vais clairement y jeter un œil
OpenAI a deux protocoles aux capacités différentes, et pour accéder à tous les modèles de VertexAI il faut prendre en charge plusieurs protocoles sous un même fournisseur ; cette hypothèse ne tenait donc plus
Il a donc fallu une grosse refonte pour séparer Protocols et Providers, puis router de façon transparente vers différents Protocols selon le modèle, même sous un même Provider. Ce travail fera partie de RubyLLM 2.0
Deux commits à consulter si ça vous intéresse : https://github.com/crmne/ruby_llm/commit/d398354da493570b050...
https://github.com/crmne/ruby_llm/commit/0875ce2dfeae9d28a3a...
RubyLLM est très simple à utiliser. Je m’en suis beaucoup servi sur un projet l’an dernier
Son point faible, c’est qu’il était difficile à instrumenter pour avoir une vraie observabilité de traçage, et qu’il avait un comportement qui supprimait les modèles internes lors des retries ; l’historique visible restait propre, mais ce n’était pas idéal pour voir précisément l’ordre réel des appels API
https://rubyllm.com/instrumentation/
Je construis quelque chose centré uniquement sur Claude, et je n’ai pas l’intention de sortir de l’écosystème Anthropic. Je me demande si, dans ce cas, RubyLLM apporte quand même des avantages par rapport à l’usage direct du SDK Ruby d’Anthropic
Autrement dit, est-ce que ce choix ressemble davantage à Fog vs aws-sdk-s3, ou à Active Storage vs aws-sdk-s3 ?
Ce qui est bien dans RubyLLM, c’est le DSL chaînable façon ActiveRecord, la structure pour organiser agents, outils et prompts, et la portabilité qui nous a permis de tester puis migrer facilement d’Anthropic vers DeepSeek en réduisant les coûts de plus de 90 %
L’intégration ActiveRecord qui permet d’enregistrer chaque chat en base avec un simple
bin/rails generate ruby_llm:installest aussi très pratique. Le fait de télécharger régulièrement l’historique des conversations stockées pour le donner à claude code et affiner les instructions d’agent nous a beaucoup aidésRien que pour la résilience, il faut se demander ce qui se passe si l’API Anthropic tombe le jour où vous en avez absolument besoin
J’utilise RubyLLM sur un side project, et c’est excellent
C’est intéressant de voir que des points évoqués dans les questions et commentaires de la SF Ruby conf l’an dernier sont déjà sortis en tant que fonctionnalités de l’écosystème : https://youtu.be/y535u1EWqAg?si=rbyv52T035apKwQk
J’ai utilisé RubyLLM assez en profondeur il y a quelques mois, et la conception comme l’implémentation étaient vraiment très réussies
J’ai mes propres clients LLM maison dans plusieurs langages Lisp, au point de m’être demandé si je n’allais pas reprendre certains éléments de conception de RubyLLM. L’imitation est une forme d’éloge
Merci d’avoir amené Ruby dans la communauté IA et d’avoir fait ce travail en open source
Un bon langage mérite d’être davantage exploré et mis en avant
Il existe une bibliothèque similaire aussi dans Laravel
https://laravel.com/docs/13.x/ai-sdk
J’utilise aussi RubyLLM en production, et c’est la bibliothèque la plus élégante que j’aie vue jusqu’ici dans ce domaine
J’ai aussi apprécié la façon dont le suivi des issues est géré. Quand on choisit « Feature Request », il faut expliquer quelles solutions de contournement ont déjà été cherchées, et pourquoi cela devrait faire partie de RubyLLM, ce qui évite que le périmètre ne grossisse sans fin