1 points par GN⁺ 4 시간 전 | 1 commentaires | Partager sur WhatsApp
  • 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 avec chat.ask
    • Exemple : chat.ask "What's the best way to learn Ruby?"
  • 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
  • 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"]
  • Pour les réponses en streaming, on passe un bloc afin de traiter chunk.content

Étendue des fonctionnalités IA

  • RubyLLM.paint sert à la génération d’images
  • RubyLLM.embed sert à créer des embeddings de texte
  • RubyLLM.transcribe sert à transcrire l’audio en texte
  • RubyLLM.moderate sert à 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 Weather reçoit une latitude et une longitude, puis récupère les données météo actuelles via l’API Open-Meteo
  • RubyLLM::Agent permet de définir des agents réutilisables incluant des instructions et des outils
    • L’exemple WeatherAssistant utilise le modèle gpt-5-nano, une consigne de réponse concise et l’outil Weather
  • RubyLLM::Schema permet de définir un schéma de sortie structurée
    • L’exemple ProductSchema définit les champs name, price et features

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
  • 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écuter bundle install
  • Les clés API se configurent dans config/initializers/ruby_llm.rb
    • Exemple : config.openai_api_key = ENV['OPENAI_API_KEY']
  • L’intégration Rails s’installe avec les commandes suivantes
    • bin/rails generate ruby_llm:install
    • bin/rails db:migrate
    • bin/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_chat dans un modèle Rails, on peut utiliser un chat basé sur ActiveRecord
    • Le modèle d’exemple déclare acts_as_chat dans Chat < ApplicationRecord
    • On peut créer un chat avec Chat.create! model: "claude-sonnet-4" puis poser des questions en lui passant des fichiers
  • L’interface de chat prête à l’emploi est accessible à http://localhost:3000/chats

1 commentaires

 
GN⁺ 4 시간 전
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

  • 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

    • Si l’API Responses n’avait pas été implémentée dans RubyLLM 1.x, c’est parce que l’architecture supposait en pratique une correspondance 1:1 entre fournisseur et protocole
      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

  • 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 ?

    • Je dirais que c’est plus proche de la relation entre Active Storage et 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:install est 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és
    • Quand on a un outil qui permet de choisir plus tard n’importe quel fournisseur, pourquoi le construire de façon à être dépendant d’un seul fournisseur ?
      Rien 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

    • J’aime bien que Hacker News prenne une ambiance MINASWAN dès qu’on parle de Ruby
  • 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