RubyLLM 将 2026 年定为 Ruby AI 代理年。在现有应用程序中构建代理功能的 Rails 团队需要 HTTP 优先的集成,而不是繁重的 SDK。本教程将 RubyLLM 和 Scavio 连接到带有可用搜索工具的 Rails 应用程序中。
前置条件
- 轨道 8+
- 红宝石 3.3+
- Scavio API 密钥
- ruby_llm 宝石
操作指南
步骤 1: 添加 ruby_llm gem
RubyLLM 附带了带有工具支持的代理 DSL。
Bash
bundle add ruby_llm
bundle add faraday步骤 2: 创建 Scavio 工具类
任何 Ruby 可调用对象都可以用作 RubyLLM 工具。
# app/agents/tools/scavio_search.rb
class ScavioSearch
include RubyLLM::Tool
description 'Search the web across Google, Reddit, and YouTube.'
param :query, type: :string
def execute(query:)
res = Faraday.post('https://api.scavio.dev/api/v1/search',
{ query: query }.to_json,
{ 'x-api-key' => ENV['SCAVIO_API_KEY'], 'Content-Type' => 'application/json' })
JSON.parse(res.body).dig('organic_results') || []
end
end步骤 3: 定义代理
RubyLLM 代理 DSL 将工具绑定到聊天循环。
# app/agents/research_agent.rb
class ResearchAgent < RubyLLM::Agent
model 'claude-sonnet-4-6'
tools ScavioSearch
system_prompt 'Research agent. Cite every claim.'
end步骤 4: 从控制器调用代理
在 Rails 控制器或后台作业中工作。
# app/controllers/research_controller.rb
class ResearchController < ApplicationController
def create
result = ResearchAgent.chat(params[:question])
render json: { answer: result }
end
end步骤 5: 连接测试路线
在浏览器中进行端到端验证。
# config/routes.rb
post '/research', to: 'research#create'
# curl: curl -XPOST localhost:3000/research -d 'question=what is rubyllm'Python 示例
Python
# Ruby tutorial; Python parity call:
import os, requests
API_KEY = os.environ['SCAVIO_API_KEY']
r = requests.post('https://api.scavio.dev/api/v1/search',
headers={'x-api-key': API_KEY},
json={'query': 'rubyllm 2026'})
print(r.json().get('organic_results', [])[:3])JavaScript 示例
JavaScript
// Ruby tutorial; JS parity call:
const API_KEY = process.env.SCAVIO_API_KEY;
const r = await fetch('https://api.scavio.dev/api/v1/search', {
method: 'POST',
headers: { 'x-api-key': API_KEY, 'Content-Type': 'application/json' },
body: JSON.stringify({ query: 'rubyllm 2026' })
});
console.log(((await r.json()).organic_results || []).slice(0, 3));预期输出
JSON
Rails endpoint returns agent answers grounded in Scavio search results. Works inside synchronous controllers or Sidekiq jobs.