このブログアプリにAI機能を追加しました

このブログ、Ruby on Rails 使ってるんだけど、記事を書いた後に入力するスラッグと要約文をAIで自動生成するようにした。
使ったLLMはオープンウエイトの qwen3 で、Cloudflare Workers AI を使ってAPIとしてコールしている。
Quenのような中華LLMは軽量安価でいいんだけど、データが中国のデータセンターに送られることに不安を感じる人もいるかもしれない。
その点、Cloudflare Workers AI を使ってこれらを呼ぶと、こちらが送ったデータは Cloudflare に留まるからちょっと安心な気もする。

サンプルコード

このブログのソースコードは非公開だから見せられないけど、CURLを使ってAPIをたたくとしたらこんな感じ
(なお、Cloudflareで取得したトークンとアカウントIDを CLOUDFLARE_AI_API_TOKEN CLOUDFLARE_ACCOUNT_ID 環境変数にセットしてから実行すること。

export CLOUDFLARE_ACCOUNT_ID="..."
export CLOUDFLARE_AI_API_TOKEN="..."

CURLでのサンプル

  curl -X POST \

    "https://api.cloudflare.com/client/v4/accounts/${CLOUDFLARE_ACCOUNT_ID}/ai/run/@cf/qwen/qwen3-30b-a3b-fp8"
    \
    -H "Authorization: Bearer ${CLOUDFLARE_AI_API_TOKEN}" \
    -H "Content-Type: application/json" \
    -d '{
      "messages": [
        {
          "role": "system",
          "content": "あなたは技術ブログ編集者です。短く正確な日本語で回答してください。"
        },
        {
          "role": "user",
          "content": "AWS Aurora PostgreSQLへオンプレから移行期間中に接続する記事を、70字程度で要約し
          てください。"
        }
      ]
    }'

Rubyでのサンプル

  require "json"
  require "net/http"
  require "uri"

  account_id = ENV.fetch("CLOUDFLARE_ACCOUNT_ID")
  api_token = ENV.fetch("CLOUDFLARE_AI_API_TOKEN")
  model = "@cf/qwen/qwen3-30b-a3b-fp8"

  uri = URI("https://api.cloudflare.com/client/v4/accounts/#{account_id}/ai/run/#{model}")

  request = Net::HTTP::Post.new(uri)
  request["Authorization"] = "Bearer #{api_token}"
  request["Content-Type"] = "application/json"
  request.body = JSON.generate(
    messages: [
      {
        role: "system",
        content: "あなたは技術ブログ編集者です。短く正確な日本語で回答してください。"
      },
      {
        role: "user",
        content: "AWS Aurora PostgreSQLへオンプレから移行期間中に接続する記事を、70字程度で要約してく
        ださい。"
      }
    ]
  )

  http = Net::HTTP.new(uri.host, uri.port)
  http.use_ssl = true
  http.open_timeout = 60
  http.read_timeout = 60

  response = http.request(request)
  payload = JSON.parse(response.body)

  puts "HTTP #{response.code}"
  puts payload.dig("result", "response") || payload["result"] || payload

あとはプロンプトをどれだけ良い感じに作れるかだけど、結構簡単に自作アプリにAIを組み込めた。

© 2025 Hiroe Tech Notes. All rights reserved.

コメント

まだコメントはありません。