2025年5月31日土曜日

stable-diffusion-webui-forge で生成される画像が真っ黒になってしまう場合の対処方法

stable-diffusion-webui-forge で生成される画像が真っ黒になってしまう場合の対処方法

概要

なぜか真っ黒になってしまうので対処方法を紹介します
なおバージョンによっては別の対応が必要なケースがあるのでご注意ください

環境

  • macOS 15.4.1
  • stable-diffusion-webui-forge f2.0.1v1.10.1-previous-663-g17a42e58

解決方法: 起動時のオプションを付与する

  • ./webui.sh --force-upcast-attention

これで自分は真っ黒画像が生成されなくなりました
なおサンプリングメソッドは「DPM++ 2M SDE」スケジューラタイプは「Keras」です

おまけ: listen オプション

--listen を付与すると 0.0.0.0 でバインドします

  • ./webui.sh --force-upcast-attention --listen

参考サイト

2025年5月30日金曜日

stable-diffusion-webui-forge で Dynamic Prompts を使う方法

stable-diffusion-webui-forge で Dynamic Prompts を使う方法

概要

デフォルトで使えると思ったのですが使えなったのでインストール方法と基本的な使い方を紹介します

環境

  • macOS 15.4.1
  • stable-diffusion-webui-forge f2.0.1v1.10.1-previous-663-g17a42e58
  • dynamic prompts de056ff

インストール

使い方

txt2img の設定に Dynamic Prompts の項目が増えているので「Dynamic Prompts enabled」をチェックして有効にします

ブラケットを使うことでその中のワードを自動で選択してくれます

1 girl, {short hair|medium hair|very short hair|messy hair}

最後に

他にも変数やコンビネーションなどもあるので興味があれば調べてみてください

参考サイト

2025年5月29日木曜日

stable-diffusion-webui-forge で ADetailer を使う方法

stable-diffusion-webui-forge で ADetailer を使う方法

概要

ADetailer を使うと表情の最後の細かい調整が簡単に行えます
表情のみでなく手などのパーツにも使えます

環境

  • macOS 15.4.1
  • stable-diffusion-webui-forge f2.0.1v1.10.1-previous-663-g17a42e58
  • ADetailer 36189cbe

インストール

使い方

txt2img の設定に ADetailer の項目が増えているので Enable this tab をチェックして有効にします
使うときはシード値を必ず固定しましょう
であとは ADetailer 側のプロンプトに変換したい表情情報を入力すれば顔だけ挿げ替わると思います

デフォルトのモデル「face_yolov8n.pt」は顔専用のモデルで「hand_yolov8n.pt」などは手専用のモデルになっています
手の修正の場合は hand_depth_refiner という ControlNet と組み合わせて使うのが主流です

最後に

各種パーツのみを変えたい場合には便利です

参考サイト

2025年5月28日水曜日

stable-diffusion-webui-forge の ControlNet で OpenPose を使う方法

stable-diffusion-webui-forge の ControlNet で OpenPose を使う方法

概要

過去に Canny で線画を抽出しその線画を元に画像を生成する方法を紹介しました
同じような方法で OpenPose という方法があるので紹介します
OpenPose は Canny 同様モデルが必要になる抽出処理になります

環境

  • macOS 15.4.1
  • stable-diffusion-webui-forge f2.0.1v1.10.1-previous-663-g17a42e58

モデルのダウンロード

前回同様ダウンロードします
https://huggingface.co/lllyasviel/sd_control_collection

今回は t2i-adapter_xl_openpose.safetensors を使います
ダウンロードした models/ControlNet に配置します

ControlNet の設定

  • Control Integrated
  • Enble にチェック
  • OpenPose にチェック
  • Preprocessor -> openpose_full
  • Model -> t2i-adapter_xl_openpose.safetensors を選択
  • ポーズを抽出したい画像をアップロード

ControlNet の実行

Model の隣にある爆弾が爆発したようなアイコンがあるのでクリックします
しばらくすると棒人間が抽出されれば OK です

OpenPose を使う場合はプロンプトのポーズに関する記述はなくしたほうが良いでしょう

動作確認

あとはプロンプトに入力すれば OK です
同じポーズで違う顔や髪型のキャラが作成できると思います

最後に

Canny に似ていますがポーズだけやポーズ抽出後にポーズの編集もできるのでより細かい調整をしたい場合は OpenPose のほうが良いかなと思います
ただポーズが複雑だったり使用しているモデルによっては画像がおかしくなったりするケースもあったので OpenPose が向かないケースもあるようです

参考サイト

2025年5月27日火曜日

stable-diffusion-webui-forge で ControlNet を使う方法

stable-diffusion-webui-forge で ControlNet を使う方法

概要

同じポーズや画角の絵を大量に生成することができます
forge 版であれば拡張機能無しでデフォルトで使えます

環境

  • macOS 15.4.1
  • stable-diffusion-webui-forge f2.0.1v1.10.1-previous-663-g17a42e58

ControlNet 用のモデルのダウンロード

とりあえずすべてダウンロードします
全部26GBあるのでディスク容量に注意しましょう
ここから必要なモデルだけダウンロードしても OK です

  • mkdir control_net_models
  • huggingface-cli download lllyasviel/sd_control_collection --local-dir ./control_net_models --local-dir-use-symlinks False
  • cp control_net_models/diffusers_xl_canny_full.safetensors ~/path/to/stable-diffusion-webui-forge/models/ControlNet

今回は canny という手法を使います

forge 側の設定

基本はここにある手順を参考に設定すれば  OK です

Canny を使うように設定しモデルを選択すれば OK です
実行し線画が抽出できれば OK です

線画を元に画像を生成する

あとはプロンプトを入力し画像を生成すれば ControlNet の線画を元に画像を生成してくれます
通常の画像生成に比べて時間がかかるので注意しましょう

おまけ: reference_only を使えば同じ顔から生成できる

例えば同じ顔でポーズを変えたい場合は髪型を変えたい場合は reference_only も便利です

先ほど選択した Canny ではなく Reference を選択すれば OK です
Reference の場合はモデルも不要なので Canny よりもお手軽に使えます

最後に

stable-diffusion-webui-forge で ControlNet を試してみました
ControlNet には他にも openpose などいろいろな方法があるので興味があれば試してみてください

forge 版を使わなくてもできますが forge 版であれば簡単に進められました

参考サイト

2025年5月26日月曜日

Github Action で rubocop を実行する方法

Github Action で rubocop を実行する方法

概要

.ruby-version がある場合は ruby-version の指定は不要です

環境

  • Github Action (2025/05/15時点)

.github/workflows/rspec.yml

name: Rspec test

on:
  push:
    branches:
      - "master"

jobs:
  rspec:
    runs-on: ubuntu-latest
    env:
      PASS_SUPPORT: true
      MODE: dev
    steps:
      - name: Checkout repository
        uses: actions/checkout@v3
      - name: Set up Ruby
        uses: ruby/setup-ruby@v1
        with:
          bundler-cache: true
      - name: Run Rspec
        run: bundle exec rspec -f d spec/

最後に

env で環境変数が指定できます

2025年5月25日日曜日

Github Action で rspec を実行する方法

Github Action で rspec を実行する方法

概要

.ruby-version がある場合は ruby-version の指定は不要です

環境

  • Github Action (2025/05/15時点)

.github/workflows/rubocop.yml

name: RuboCop Linter

on:
  push:
    branches:
      - "master"

jobs:
  rubocop:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v3
      - name: Set up Ruby
        uses: ruby/setup-ruby@v1
        with:
	      # ruby-version: '3.4'
          bundler-cache: true
      - name: Run RuboCop
        run: bundle exec rubocop

最後に

参考サイト他のジョブと依存性を持たせたい場合は workflow_run を使いましょう

2025年5月24日土曜日

プロジェクトで使用しているgolangのバージョンを上げる方法

プロジェクトで使用しているgolangのバージョンを上げる方法

概要

忘れるのでメモ

環境

  • macOS 15.4
  • golang 1.24.3

方法

  • go mod tidy -go=1.24.3

2025年5月23日金曜日

iPhoneのショートカットで特定の写真を一発で開く方法

iPhoneのショートカットで特定の写真を一発で開く方法

概要

方法を紹介します

環境

  • iOS 18.4.1

流れ

  1. 写真アプリを開く
  2. ショートカットで開きたい写真を選択
  3. 左下の送るボタンから「ファイルに保存」を選択
  4. 適当なディレクトリに保存
  5. ショートカットアプリを開く
  6. スターターショットカットを追加
  7. アクションを検索で「ファイルを開く」を検索
  8. ファイルに先ほど保存したファイルを選択
  9. デフォルトのアプリで開くにファイルを選択
  10. ショートカットが作成できたら長押し「共有」
  11. ホーム画面に追加を選択

でホーム画面に特定の画像へのショートカットが作成できるのでタップすると画像が一発で開きます

最後に

写真アプリから毎回検索するのが面倒な場合に便利です

2025年5月22日木曜日

Mac で Claude クライアントを使って mcp-server-puppetter を使ってみた

Mac で Claude クライアントを使って mcp-server-puppetter を使ってみた

概要

前回は Windows + mcpo + mcp-server-puppetter で試しました
結果が微妙だったので比較のために Mac + Claude の組み合わせでも試してみます

環境

  • macOS 15.4.1
  • npx 10.9.2
  • claude desktop 0.9.3

claude_desktop_config.json

  • vim ~/Library/Application Support/Claude/claude_desktop_config.json
{
  "mcpServers": {
    "puppeteer": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-puppeteer"]
    }
  }
}

Claude 起動

mcp-server-puppetter が有効になっていることを確認します

動作確認

命令は以下です

puppetter mcp で chrome を起動し「hawksnowlog」と検索し検索結果をテキストファイルに保存してください

で結果を確認すると勝手にブラウザが起動しかつ selector で DOM 検索がない場合などに自動で再帰的に検索をかけ直し正しい DOM を見つけたりしてくれました
ここまでやってくれると(時間はかかりますが)かなり便利な感じはします

最後に

Windows + mcpo では puppetter のインストールやらいろいろしなければいけなかったのですが Mac 上では特に設定は不要でした
また Chrome の立ち上げも Windows だと詳細な命令が必要だったのですが Mac + Claude では不要でした
この挙動の原因として考えられるのは

  • LLM が異なることによる mcp への命令の精度の違い
  • mcpo が悪さしている

あたりかなと思います
Windows でも Claude クライアントを使えば同じような結果が得られるかもしれません

参考サイト

2025年5月21日水曜日

Windows11 で mcp server puppetter を使ってみた

Windows11 で mcp server puppetter を使ってみた

概要

mcpo で mcp-server-puppetter を動かす方法を紹介します

環境

  • Windows11 24H2 (26100.4061)
  • Python 3.12.10
  • node 22.15.1
    • puppetter 24.8.2
  • LLM (gpt4o-mini with open-webui

mcpo 環境構築

mcpo を動かすために Python 環境を構築します
Powershell で操作します

  • Set-ExecutionPolicy RemoteSigned -Scope Process
  • Invoke-WebRequest -UseBasicParsing -Uri "https://raw.githubusercontent.com/pyenv-win/pyenv-win/master/pyenv-win/install-pyenv-win.ps1" -OutFile "./install-pyenv-win.ps1"; &"./install-pyenv-win.ps1"
  • pyenv install 3.12.10
  • mkdir python_work
  • cd python_work
  • pyenv local 3.12.10
  • pip install pipenv
  • pipenv install mcpo

puppetter のインストール

nvm を使ってインストールします
https://github.com/coreybutler/nvm-windows/releases から Windows 用の nvm をインストールします

  • cd python_work
  • nvm install 22.15.1
  • nvm use 22.15.1
  • $Env:PUPPETEER_SKIP_DOWNLOAD = "skip"
  • $Env:NODE_TLS_REJECT_UNAUTHORIZED = "0"
  • npm install -g puppeteer
  • npm install puppeteer
  • npx puppeteer browsers install chrome

mcpo の設定

  • vim config.json
{
  "mcpServers": {
    "puppeteer": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-puppeteer"]
    }
  }
}

mcpo 起動

  • pipenv run mcpo --port 8000 --host 127.0.0.1 --config .\config.json --api-key "top-secret"
Starting MCP OpenAPI Proxy with config file: .\config.json
2025-05-19 14:35:08,611 - INFO - Starting MCPO Server...
2025-05-19 14:35:08,611 - INFO -   Name: MCP OpenAPI Proxy
2025-05-19 14:35:08,611 - INFO -   Version: 1.0
2025-05-19 14:35:08,611 - INFO -   Description: Automatically generated API from MCP Tool Schemas
2025-05-19 14:35:08,611 - INFO -   Hostname: fjct-1267
2025-05-19 14:35:08,611 - INFO -   Port: 8000
2025-05-19 14:35:08,611 - INFO -   API Key: Provided
2025-05-19 14:35:08,611 - INFO -   CORS Allowed Origins: ['*']
2025-05-19 14:35:08,611 - INFO -   Path Prefix: /
2025-05-19 14:35:08,611 - INFO - Loading MCP server configurations from: .\config.json
2025-05-19 14:35:08,621 - INFO - Configured MCP Servers:
2025-05-19 14:35:08,621 - INFO -   Configuring Stdio MCP Server 'puppeteer' with command: npx with args: ['-y', '@modelcontextprotocol/server-puppeteer']
2025-05-19 14:35:08,621 - INFO - Uvicorn server starting...
INFO:     Started server process [2896]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)

Waiting for application startup. で止まる場合は puppetter がうまくインストールできておらず裏で動作していない可能性があります

open-webui の設定

http://127.0.0.1:8000/puppetter を接続に追加しましょう

動作確認

open-webui から質問します
これがかなり大変でした
アバウトな質問だとボタンやフォームが全く検索できないので結構しっかりとした質問にしなければ意図した動きをするのは難しいかなと思います

例えば Google で検索するだけでも以下のような質問が必要でした

puppeteer mcp を使ってブラウザを立ち上げてgoogle.comにアクセスしてhawksnowlogと検索してください、launchOptions で executablePath に "C:\Program Files\Google\Chrome\Application\chrome.exe" を使用してください、google.com にアクセス出来たら検索ボックスに hawksnowlog と入力し検索ボタンを押して下さい、検索ボックスの id は #APjFqb です

同じ質問でも動かないケースがあるのでかなり不安定でした

トラブルシューティング

  • Error: Could not find Chrome

なぜか puppetter からデフォルトの chrome.exe が見えないことがあるようです
puppetter 起動時に launchOptions で executablePath というオプションがあるので LLM の質問を使ってうまくこのオプションを指定するようにしましょう

最後に

Windows11 上に mcp-server-puppetter をインストールして試してみました
質問をかなり工夫しないと思ったように動かないのでまだまだ発展途中かなと思います

LLM を変えたり別の mcp-server を使うのもありですが現状てっとり早いのは puppetter のコードをチャットで書いてもらって自分で実行するのが一番確実で速いと思います

参考サイト

2025年5月20日火曜日

Chef cookbooks のテストを kitchen-docker を使って書く

Chef cookbooks のテストを kitchen-docker を使って書く

概要

更に kitchen-docker を使うので毎回クリーンな環境に対して実際にレシピを実行してテストすることができます

環境

  • macOS 15.4
  • docker 28.1.1
  • Ruby 3.4.3
    • kitchen 3.0.0
    • chef 18.7.6

必要な gem のインストール

  • vim Gemfile
# frozen_string_literal: true

source 'https://rubygems.org'

group :development do
  gem 'csv'
  gem 'inspec'
  gem 'kitchen-docker'
  gem 'kitchen-inspec'
  gem 'test-kitchen'
end

テストの作成

  • vim test/integration/default/default_test.rb
# frozen_string_literal: true

emacs_binary = '/usr/local/bin/emacs'

control 'emacs-install' do
  impact 1.0
  title 'Check Emacs installation'

  describe file(emacs_binary) do
    it { should exist }
    it { should be_executable }
  end

  describe command("#{emacs_binary} --version") do
    its('exit_status') { should eq 0 }
    expect = /GNU Emacs/
    its('stdout') { should match expect }
  end
end

kitchen 用の設定ファイルの作成

  • vim .kitchen.yml
driver:
  name: docker

provisioner:
  name: chef_zero

platforms:
  - name: ubuntu-22.04

suites:
  - name: default
    run_list:
      - recipe[cookbooks-emacs::default]
    attributes:
      owner: root
      group: root
    verifier:
      name: inspec

動作確認

  • bundle exec kitchen test

最初に kitchen でテストするようのイメージをビルドします
そしてそのイメージを元に chef を実行するコンテナが起動します

% docker ps -a
CONTAINER ID   IMAGE          COMMAND                   CREATED          STATUS                      PORTS     NAMES
fe474147bd7b   3d1e259aa0fe   "/usr/sbin/sshd -D -…"   36 minutes ago   Exited (0) 27 minutes ago             defaultubuntu2204-username-machinename-6n9j5hv9
% docker images
REPOSITORY   TAG       IMAGE ID       CREATED             SIZE
<none>       <none>    3d1e259aa0fe   About an hour ago   241MB

おまけ: Github Action で実行する

  • vim .github/workflows/kitchen.yml
name: Kitchen test

on:
  push:
    branches:
      - "master"

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Set up Ruby
        uses: ruby/setup-ruby@v1
        with:
          bundler-cache: true

      - name: Install dependencies
        run: bundle install

      - name: Set up Docker
        uses: docker/setup-docker-action@v3

      - name: Run Test Kitchen
        run: |
          bundle exec kitchen test
        env:
          CHEF_LICENSE: accept

CHEF_LICENSE: accept を忘れずに設定しましょう

トラブルシューティング

[2025-05-18T10:28:25+09:00] ERROR: Chef InSpec cannot execute without valid licenses.

基本は InSpec を使うのにライセンスが必要なのでライセンス登録をしましょう (有償)

もしくは verifier の name を shell にすることでも対応できます

最後に

kitchen-docker を使えば簡単に cookbooks をクリーンな環境で毎回テストできます
Github Action でも使えるので

参考サイト

2025年5月19日月曜日

minecraft-mcp-server を使ってみた

minecraft-mcp-server を使ってみた

概要

minecraft-mcp-server を使って自然言語で建築などができる環境を構築、検証してみました

環境

  • macOS 15.4.1
  • npx 10.9.2
  • claude desktop 0.9.3
  • Minecraft Java Edition 1.21.4

マイクラのワールドをLANに公開する

普通にシングルプレイヤーでワールドを作成します
そして ESC -> LANに公開で Claude から接続できるようにします
ポートはこの次の画面で設定しますが 25565 ポートでオープンしましょう

netstat -an | grep 25565
tcp46      0      0  *.25565                *.*                    LISTEN

claude 設定

  • vim ~/Library/Application\ Support/Claude/claude_desktop_config.json
{
  "mcpServers": {
    "minecraft": {
      "command": "npx",
      "args": [
        "-y",
        "github:yuniko-software/minecraft-mcp-server",
        "--host",
        "localhost",
        "--port",
        "25565",
        "--username",
        "ClaudeBot"
      ]
    }
  }
}

claude の起動

設定ファイルを記載したら claude を起動しましょう
マイクラ側に ClaudeBot が参加すれば準備 OK です

動作確認

Claude で建築の指示を出してみましょう
実際に試してみるとわかりますが中々思うように動いてくれないようです

最後に

minecraft-mcp-server を試してみました
命令すると自動で動いているのは感動しますが動きが遅かったり中々思う通りに動いてくれないのでまだまだ発展の余地があるかなと思います
建築などを依頼するならバニラのような平地でないと厳しい気がします

基本はサバイバルモード前提で自分でブロックを採掘して何かしようとするのでたとえクリエイティブモードであってもブロックを勝手に補充したりとかはしないようです

自分はチートコマンドの /give を使ってある程度ブロックを与えて命令しました

また Claude の無料枠だとあっという間に制限がくるのでチャットに制限がないような環境でないと実用レベルでは難しいかなと思います

参考サイト

2025年5月18日日曜日

docker registry で Let's Encrypt の証明書を使って SSL 通信する方法

docker registry で Let's Encrypt の証明書を使って SSL 通信する方法

概要

わざわざ insecure-registries に記載するのが面倒なので証明書がある場合は SSL 化しましょう

環境

  • Ubuntu 22.04
  • docker registry 2.8.3
  • docker 27.0.3

auth_config.yml

server:
  addr: ":5000"
  certificate: "/certs/fullchain.pem"
  key: "/certs/privkey.pem"

pem ファイルは Let’s Encrypt で取得したものをそのまま利用します

compose.yml

services:
  registry:
    image: registry:2
    ports:
      - "5000:5000"
    volumes:
      - "/path/to/local/registry:/var/lib/registry"
      - "/path/to/auth_config.yml:/config/auth_config.yml"
      - "/etc/letsencrypt/live/your.domain.com/privkey.pem:/certs/privkey.pem"
      - "/etc/letsencrypt/live/your.domain.com/fullchain.pem:/certs/fullchain.pem"
    environment:
      - REGISTRY_HTTP_TLS_CERTIFICATE=/certs/fullchain.pem
      - REGISTRY_HTTP_TLS_KEY=/certs/privkey.pem
    restart: always

ポイントはファイルを配置するだけではなくちゃんと環境変数の REGISTRY_HTTP_TLS_CERTIFICATE と REGISTRY_HTTP_TLS_KEY で配置したパスを指定する点です

起動

  • docker compose up -d

動作確認

insecure-registries なしで docker login できることを確認しましょう
もしくは

  • curl https://your.domain.com:5000/v2/_catalog

で SSL のエラーにならないことを確認しましょう

最後に

SSL を有効にした場合は逆に http が使えなくなるので注意しましょう

参考サイト

2025年5月17日土曜日

docker registry で認証を設定する方法

docker registry で認証を設定する方法

概要

過去に docker_auth を使う方法を紹介しましたがもっと簡単になっているのでその方法を紹介します

環境

  • Ubuntu 22.04
  • docker registry 2.8.3
  • docker 27.0.3

auth_config.yml

users:
  "user01":
    password: "xxx"

password の部分は htpasswd -nB user01 で生成します

compose.yml

services:
  registry:
    image: registry:2
    ports:
      - "5000:5000"
    volumes:
      - "/path/to/local/registry:/var/lib/registry"
      - "/path/to/auth_config.yml:/config/auth_config.yml"
    restart: always

起動

  • docker compose up -d

動作確認

  • docker login localhost:5000

で認証付きでログインできることを確認しましょう
必要であれば /etc/docker/daemon.json に insecure-registries の設定を追記してください

最後に

設定ファイル一つで認証を追加できるようになっていました

参考サイト

2025年5月16日金曜日

Blender MCP を使う

Blender MCP を使う

概要

LLM から Blender を操作して3Dモデリングができるようなのでやってみました
設定方法と簡単な動かし方を紹介します

環境

  • macOS 15.4.1
  • uv 0.7.3
  • claude desktop 0.9.3

uv インストール

  • brew install uv

MCP 設定

  • vim ~/Library/Application\ Support/Claude/claude_desktop_config.json
{
  "mcpServers": {
    "blender": {
        "command": "uvx",
        "args": [
            "blender-mcp"
        ]
    }
  }
}

claude を再起動してツールに blender が追加されていることを確認します

Blender にアドオン追加

アドオンファイルをダウンロードし Blender を開いて追加します

  • git clone https://github.com/ahujasid/blender-mcp.git
  • Blender 起動
  • 編集 -> プリファレンス -> アドオン -> ディスクからインストール
  • 先ほど clone したディレクトリ内から addon.py を選択

MCP サーバの起動

起動は Blender 側から行います
Blender の画面でサイドバーを表示 (ショートカットは N) をします
そして「Connect to MCP Server」をクリックし起動します

起動すると 9876 ポートで LISTEN します

動作確認

これで準備完了です
あとは自然言語で命令すると勝手にモデリングしてくれます

ちゃんと色も付与されています ()

最後に

Claude デスクトップから Blender を操作し自然言語でモデルリングできる環境を構築しました
裏側では Python API が使われてモデリングしているようです

あとはどこまで複雑な命令を実行してくれるかかなと思います
Claude の無料枠だとすぐにトークンの制限になるのでなかなか細かいしていは難しいような気がします

参考サイト

2025年5月15日木曜日

Ubuntu24.04にChromeの最新版をインストールする方法

Ubuntu24.04にChromeの最新版をインストールする方法

概要

apt でインストールできます

環境

  • Ubuntu24.04
  • Chrome 136.0.7103.92-1

gpgキー取得

  • wget -qO- https://dl.google.com/linux/linux_signing_key.pub | sudo gpg --yes --dearmor -o /etc/apt/trusted.gpg.d/google-chrome.gpg

リポジトリ追加

  • sudo sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list'

インストール

  • sudo apt -y update
  • sudo apt install -y google-chrome-stable

最後に

headless でも使えるのでインストールしておくと便利かもです

参考サイト

2025年5月14日水曜日

Ubuntu で Missing Signed-By in the sources.list の対策

Ubuntu で Missing Signed-By in the sources.list の対策

概要

対応方法を紹介します

環境

  • Ubuntu 24.04

エラー文

N: Missing Signed-By in the sources.list(5) entry for 'https://esm.ubuntu.com/apps/ubuntu'

対応方法

  • vim /etc/apt/sources.list.d/ubuntu-esm-apps.sources
Types: deb
URIs: https://esm.ubuntu.com/apps/ubuntu
Suites: noble-apps-security noble-apps-updates
Components: main
Signed-By: /etc/apt/trusted.gpg.d/ubuntu-pro-esm-apps.gpg

最後の Signed-By: /etc/apt/trusted.gpg.d/ubuntu-pro-esm-apps.gpg の部分を追記しましょう
なぜか Ubuntu 24.04 にしたときに消えていたようです
また ubuntu-esm-apps.list.distUpgrade などのファイルがありますがこちらに signed-by などを記載しても解消しないので注意しましょう

最後に

Ubuntu pro に申し込んでいて do-release-upgrade した場合に出る可能性があるので出たら対応しましょう

参考サイト

2025年5月13日火曜日

M1 MacBookAir で mlx 上で stable diffusion を実行する

M1 MacBookAir で mlx 上で stable diffusion を実行する

概要

例のごとく mlx-examples を使います

環境

  • M1 MacBookAir (CPU8, GPU7)
  • Python 3.12.9
  • mlx-examples 977cd30242b9891c306ef23ba925553104eb4f0c

動かす方法

基本はクローンして pip install して python で実行するだけです

  • git clone https://github.com/ml-explore/mlx-examples.git
  • cd mlx-examples
  • cd stable_diffusion
  • pyenv local 3.12.9
  • python -m venv .venv
  • pip install -r requirements.txt
  • python txt2image.py "A photo of an astronaut riding a horse on Mars." --n_images 4 --n_rows 2

だいたい1枚の生成で1分から2分ほどで完了します

オプション

  • n_images -> 1枚の画像内に何枚の絵を生成するか
  • n_rows -> 何行で表示するか、n_images=4 で n_rows=2 だと上下に2枚ずつ生成される、1枚の絵だけ生成したい場合は n_images も n_rows も 1 にする
  • negative_prompt -> ネガティブプロンプトを指定します

生成される画像のサイズは528x528になります

使用しているモデル

txt2image.py では stabilityai/sdxl-turbo を使っているようです
モデルを変更したい場合は好きなモデルをダウンロードして model オプションを指定するか直接ファイルを編集しても OK です

初回はモデルのダウンロードが走り15GBほどダウンロードするのでディスクに注意しましょう

最後に

過去に sd-webuisd-webui-forge のやり方を紹介しましたが Apple Sillicon の GPU をフルで使いたいならやはり mlx を使った方法が一番かもしれません

参考サイト

2025年5月12日月曜日

OpenWebUI で Filesystem MCP Server を使ってローカルにあるファイルなどを操作する

OpenWebUI で Filesystem MCP Server を使ってローカルにあるファイルなどを操作する

概要

各種設定などは前回のものを流用しています

環境

  • Ubuntu 24.04
  • OpenWebUI 0.6.7
  • LiteLLM Proxy 1.68.1
  • Python 3.12.9
    • mcpo 0.0.13
    • mcp 1.8.0
  • secure-filesystem-server - v0.2.0

config.json

{
  "mcpServers": {   
    "filesystem": {
      "command": "npx",
      "args": [
        "-y",
        "@modelcontextprotocol/server-filesystem",
        "/home/devops"
      ]
    }
  }
}

/home/devops の部分は MCP サーバにファイルやディレクトリの操作を許可するパスをフルパスで指定します

OpenWebUI から接続の追加

これは前回までと全く同じです
URL は適宜変更してください

設定 -> ツール -> 追加

  • URL -> http://192.168.0.100:8000/filesystem
  • Auth -> Bearer top-secret

動作確認

あとは質問するだけですがいろいろと工夫が必要だったのでポイントを紹介します

  • フルパスで指定すること
    • 相対パスでは MCP サーバが起動しているパスからの相対パスで検索しようとするのでフルパスで指定したほうがいい
  • 質問に工夫が必要なケースがある
    • OK /home/devops/api 配下のファイルでファイル名に py が含まれるファイルの一覧を表示してください
    • NG /home/devops/api 配下に py で終わる拡張子のファイルの一覧を表示してください
    • 以下のようなクエリとなる質問にしなければならない
    • 拡張子などを質問に含めると pattern が「.*\\.py」というマッチしない条件になったりする
curl -X POST \
     -H "Authorization: Bearer top-secret" \
     -H "Content-Type: application/json" \
     -d '{"path": "/home/devops/api", "pattern": "py", "excludePatterns": []}' \
     http://localhost:8000/filesystem/search_files
  • Filesystem MCP サーバが実装している機能を確認したほうがいいかも (参考サイトのURL参照)
  • 便利な使い方はいろいろあるがローカルにあるプログラムへのパスを指定して「このファイルが何をしているか説明して」というのは便利
    • 今までは自分でコピペしてコンソールなどに食わせていたのがそれをしなくて済む
    • ただそのあと直接ファイルを編集してなどはできなかった (質問の仕方なのかそういった機能がないのかは不明)

最後に

Filesystem MCP サーバを OpenWebUI に導入してみました
自然言語でローカルのファイルを操作できるようになるのは便利かなと思います
ただシェルが扱えればわざわざ MCP サーバを導入するレベルでもないかなとは思いました

参考サイト

2025年5月11日日曜日

OpenWebUI で mcp-server-mysql を使って自然言語で MySQL を操作してみる

OpenWebUI で mcp-server-mysql を使って自然言語で MySQL を操作してみる

概要

前回 open-webui から mcp サーバに接続する方法法を紹介しました
今回は localhost にある mysql サーバに接続しいろいろな操作を試してみます
なお INSERT,UPDATE,DELETE も行える設定なのでテスト用のテーブルなどに対して行いましょう

環境

  • Ubuntu 24.04
  • OpenWebUI 0.6.7
  • LiteLLM Proxy 1.68.1
  • Python 3.12.9
    • mcpo 0.0.13
    • mcp 1.8.0
  • @benborla29/mcp-server-mysql - v0.1.18

nodejs 環境準備

mcp-server-mysql は nodejs で動作するので nodejs が動作する環境を準備します
何でも OK ですが今回は nvm を使う方法を紹介します

  • nvm use --save 20.19.0

ここで保存された .nvmrc があるパスで MCPO を動かします

config.json

mcpServers に追記します
今回は INSERT,UPDATE,DELETE も試したいので ALLOW_INSERT_OPERATION などは true に設定しています

{
  "mcpServers": {
    "time": {
      "command": "docker",
      "args": ["run", "-i", "--rm", "mcp/time"]
    },
    "mcp_server_mysql": {
      "command": "npx",
      "args": [
        "-y",
        "@benborla29/mcp-server-mysql"
      ],
      "env": {
        "MYSQL_HOST": "127.0.0.1",
        "MYSQL_PORT": "3306",
        "MYSQL_USER": "test",
        "MYSQL_PASS": "xxx",
        "MYSQL_DB": "devops",
        "ALLOW_INSERT_OPERATION": "true",
        "ALLOW_UPDATE_OPERATION": "true",
        "ALLOW_DELETE_OPERATION": "true"
      }
    }
  }
}

localhost で mysql -u test-p devops -h 127.0.0.1 でアクセスできれば上記でもアクセスできます

MCPO 起動

先ほど作成した .nvmrc と config.json があるパスで実行します

  • pipenv run mcpo --port 8000 --host 0.0.0.0 --config ./config.json --api-key "top-secret"

MCP サーバの接続

open-webui から行います
uri の部分は config.json に定義した MCP サーバのキー情報を入力します
Bearer は api_key で指定した情報をしていします   接続テストもしておきましょう

動作確認

チャット上のツールが増えていることを確認します
あとはテーブル情報などを含めて質問することでいろいろな操作をしてくれます

MCPO のログを見ると実際に投げている SQL の情報なども確認できます

最後に

open-webui + mcp-server-mysql を試してみました
自然言語でデータベースを操作できる時代が本格的に到来したなと実感しました
以下は試してみた感想です
本番ではまだ使わないほうが安全かなと思います

命令を詳細にすれば実用レベルになる気はします

  • 雑なSQLを投げたりするので本番では更新削除追加系はやらないほうがよさそう
    • WHERE 句 id などのユニークキーを使わずに更新や削除を行ったりする
    • 命令をしっかりすれば id を使ってやってはくれそうだが雑な質問だとやらない
  • コンテキストがおかしくなる場合があるのでSQLを投げたい場合は新規のチャットを作成したほうがいい
  • 外部キー制約などがある場合はそれも伝えるとやってくれる
    • 「先にAテーブルの外部キーを削除してからBテーブルのレコードも削除して」など
  • データをINSERTするときは各カラムの情報を正確に伝えないとやってくれない
    • テーブルの各カラムに制約がある場合などはちゃんと伝えなければダメそう
    • 適当な値でお願いしますと命令もできるがその場合はテーブルのスキーマ情報から適当な数値や文字列を入れようとはする

参考サイト

2025年5月10日土曜日

OpenWebUI で MCP を使う方法

OpenWebUI で MCP を使う方法

概要

OpenWebUI 上でも MCP サーバと連携していろいろなエージェントや拡張ツールを動かすことができるので試してみました
今回は簡単な mcp/time サーバを使って LLM 経由で現在時刻が取得できるようにしてみます

環境

  • Ubuntu 24.04
  • OpenWebUI 0.6.7
  • LiteLLM Proxy 1.68.1
  • Python 3.12.9
    • mcpo 0.0.13
    • mcp 1.8.0

事前準備

litellm と open-webui は前回の記事を元に起動中とします

compose.yaml、litellm_config.yaml、.env を用意して起動しておきます

mcpo のインストール

mcpo は Python 制のツールなので pip でインストールできます
mcpo 経由でローカルホストにアクセスしたりするので可能な限り mcpo で操作させたいホストで直接起動しましょう

  • pipenv install mcpo

で OK です
上記では pipenv を使って venv 上にインストールしていますが問題なければグローバルにインストールしても OK です

MCPO 用の config.json の準備

この config.json は一般的な MCP サーバ用の config.json と同じになります
起動したいコマンド (MCP サーバ) を羅列していけば OK です

  • vim config.json
{
  "mcpServers": {
    "time": {
      "command": "docker",
      "args": ["run", "-i", "--rm", "mcp/time"]
    }
  }
}

ここでローカルマシン上に mcp/time コンテナを起動する定義を記載します

MCPO の起動

先程も記載しましたが可能な限りコマンドなどを実行するホスト上で直接動かしましょう

  • pipenv run mcpo --port 8000 --host 0.0.0.0 --config ./config.json --api-key "top-secret"

ここで設定した api-key は open-webui から mcpo サーバに接続するときに使います

これで docker の状態は以下のようになります

  • docker ps
CONTAINER ID   IMAGE                                 COMMAND                  CREATED              STATUS                    PORTS                                         NAMES
385829c1f469   mcp/time                              "mcp-server-time"        About a minute ago   Up About a minute                                                       beautiful_bassi
26cb3f21bde5   ghcr.io/open-webui/open-webui:main    "bash start.sh"          22 minutes ago       Up 22 minutes (healthy)   0.0.0.0:3000->8080/tcp, [::]:3000->8080/tcp   open-webui
e38fe5175159   ghcr.io/berriai/litellm:main-latest   "docker/prod_entrypo…"   22 minutes ago       Up 22 minutes             0.0.0.0:4000->4000/tcp, :::4000->4000/tcp     litellm

OpenWebUI 上で MCPO サーバと接続設定をする

あとは open-webui 上から MCPO サーバに接続する設定をすれば OK です

設定からツールで MCPO を新規ツールとして接続します
ブラウザから直接アクセスするので localhost や local IP ではなくブラウザからアクセスできる IP アドレスを指定しましょう
また Bearer トークンに先ほど設定したシークレット情報を入力します

くるくるマークを押すと接続テストができるのでここでちゃんと接続できるか確認しておきましょう

動作確認

あとはチャットに戻り MCPO 経由で質問できるか確認します
まずチャット画面上でツールが有効になっているか確認します
ツールの数が 1 になっていれば OK です

また詳細を確認すると実際に MCPO で使えるコマンドが表示されます

あとは質問してみましょう

こんな感じでちゃんと MCPO 経由で回答が来ていることが確認できます

MCPO 側にも以下のようなログがあることが確認できると思います

INFO:     192.168.100.2:30848 - "POST /time/get_current_time HTTP/1.1" 200 OK

最後に

OpenWebUI で MCP と連携する方法を紹介しました
過去に紹介した Claude などは

  • Claude クライアント -> MCP サーバ

で直接通信していましたが OpenWebUI の場合は

  • OpenWebUI -> MCPO -> MCP サーバ

という感じで真ん中に一つ中継プロセスが入るのでそこが違います
そこまで負荷に影響はないですが挙動が少し異なるので認識しておきましょう

MCP サーバを追加したい場合は config.json に追記すれば OK です
MCP サーバも基本的にはローカルホストで起動するので追加しすぎると負荷になるので注意しましょう

参考サイト

2025年5月9日金曜日

OpenWebUI で admin ユーザでログインする方法

OpenWebUI で admin ユーザでログインする方法

概要

WEBUI_AUTH=True にした際にデフォルトの admin ユーザでログインする方法を紹介します

環境

  • Ubuntu 24.04
  • docker 27.3.1
  • open-webui 0.6.7

一度 WEBUI_AUTH=False で立ち上げる

すると自動で admin ユーザが作成されます

admin ユーザにパスワードを設定する

WEBUI_AUTH=False 状態で起動したあとで管理者パネルからユーザの一覧を表示します

そして admin ユーザのパスワードを設定します

WEBUI_AUTH=True で再起動する

そしてメールアドレスに admin@localhost パスワードは先程設定した admin ユーザ用のパスワードでログインすることができます

最後に

OAUTH のサインアップ画面などを用意することもできるようなのですがメールサーバなどが必要になりそうだったのでてっとり早く admin ユーザを作成する方法を紹介しました

2025年5月8日木曜日

OpenWebUI で Gemini を使う方法

OpenWebUI で Gemini を使う方法

概要

Gemini を LiteLLM Proxy でコールし OpenWebUI は LiteLLM Proxy に対してコールします
Gemini のエンドポイントはカスタムエンドポイントとします
過去に Azure OpenAI でやったバージョンの Gemini 版になります

環境

  • Ubuntu 24.04
  • OpenWebUI 0.6.7
  • LiteLLM Proxy 1.68.0

ポイント

OpenWebUI が起動できたらモデルの設定を開き高度な設定から「Stream Chat Response」をオフにしましょう

compose.yaml

services:
  openwebui:
    image: ghcr.io/open-webui/open-webui:main
    container_name: open-webui
    ports:
      - "3000:8080"
    volumes:
      - open-webui:/app/backend/data
    extra_hosts:
      - "host.docker.internal:host-gateway"
    environment:
      - WEBUI_AUTH=False
      # - OPENAI_API_KEY=${MASTER_KEY}
      - OPENAI_API_BASE_URL=http://host.docker.internal:4000/v1
    restart: always

  litellm:
    image: ghcr.io/berriai/litellm:main-latest
    container_name: litellm
    ports:
        - "4000:4000"
    volumes:
        - ./litellm_config.yaml:/app/config.yaml
    environment:
      - GEMINI_API_BASE=${GEMINI_API_BASE}
      - GEMINI_API_KEY=${GEMINI_API_KEY}
    command: --config /app/config.yaml --port 4000 --detailed_debug
    restart: always

volumes:
  open-webui:

litellm_config.yaml

model_list:
  - model_name: gemini/gemini-2.0-flash
    litellm_params:
      model: gemini/gemini-2.0-flash
      api_base: os.environ/GEMINI_API_BASE # runs os.getenv("GEMINI_API_BASE")
      api_key: os.environ/GEMINI_API_KEY # runs os.getenv("GEMINI_API_KEY")
      api_version: ""

.env

GEMINI_API_KEY=xxx
GEMINI_API_BASE=https://your-api-endpoint/ai/chat-ai/flash

動作確認

  • docker compose up -d

で 3000 ポートにアクセスしコンソールから質問できることを確認しましょう

最後に

どうやら OpenWebUI からだとストリーム API のレスポンス形式は想定しておらず generateContent のレスポンスを使っているっぽいのでオフにしてあげる必要がありました

Gemini のカスタムエンドポイントを使う場合には設定してみるといいかなと思います

OpenWebUI で Gemini を使う場合には Pipeline を使うのが王道ですが LiteLLM Proxy でも動作するようです

参考サイト

2025年5月7日水曜日

dspy.ai で Gemini 互換のカスタムエンドポイントを設定する方法

dspy.ai で Gemini 互換のカスタムエンドポイントを設定する方法

概要

カスタムメソッド部分は指定しないのがポイントです

環境

  • Ubuntu 24.04
  • Python 3.12.9
  • dspy 2.6.13

サンプルコード

import dspy

lm = dspy.LM(
    "gemini/gemini-1.5-pro",
    api_key="xxx",
    api_version="",
    api_base="https://your-api-endpoint/ai/chat-ai/pro",
)
dspy.configure(lm=lm)

result = lm("Are you gemini pro 1.5?", temperature=0.7)
print(result)

最後に

内部的には LiteLLM なので LiteLLM でコールできるエンドポイントは dspy でもコールできます

参考サイト