1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

OpenCode から Kong 経由でさくらの AI エンジンを利用する

1
Posted at

はじめに

前回の記事 では、Kong AI Gateway の AI Proxy Plugin を使って、さくらの AI エンジンを OpenAI 互換 API として中継する最小構成を作成しました
今回はその構成をベースに、key-auth を追加したうえで、OpenCode から利用する手順まで含めて整理します

OpenCode 側から直接さくらの AI エンジンへ接続するのではなく、いったん Kong を経由させることで、Client に見せる接続先を統一、
key-auth を用いることで安全な接続を確保したうえで、だれがどの程度利用しているかを取得することができるようになります

構成ファイル

今回のファイルはここに用意しています

docker-compose.yml

services:
  kong:
    image: kong/kong-gateway:3.13.0.1
    container_name: opencode-kong-sakura
    restart: unless-stopped
    environment:
      KONG_DATABASE: "off"
      KONG_DECLARATIVE_CONFIG: /opt/kong/kong.yaml
      KONG_LOG_LEVEL: notice
      KONG_PROXY_ACCESS_LOG: /dev/stdout
      KONG_ADMIN_ACCESS_LOG: /dev/stdout
      KONG_PROXY_ERROR_LOG: /dev/stderr
      KONG_ADMIN_ERROR_LOG: /dev/stderr
      KONG_ADMIN_LISTEN: 0.0.0.0:8001
      KONG_ADMIN_GUI_LISTEN: 0.0.0.0:8002
      KONG_ADMIN_GUI_URL: http://localhost:8002
      SAKURA_AI_AUTH_HEADER: ${SAKURA_AI_AUTH_HEADER}
    ports:
      - "8000:8000"
      - "8443:8443"
      - "8001:8001"
      - "8444:8444"
      - "8002:8002"
    volumes:
      - ./kong.yaml:/opt/kong/kong.yaml:ro

kong.yaml

ai-proxykey-auth を同じ Route に設定します

_format_version: "3.0"

services:
  - name: sakura-ai-chat-service
    url: http://localhost
    routes:
      - name: sakura-ai-chat-completions-route
        paths:
          - /v1/chat/completions
        strip_path: false
    plugins:
      - name: key-auth
        config:
          key_names:
            - x-api-key
          key_in_header: true
          key_in_query: false
          key_in_body: false
          hide_credentials: true
      - name: ai-proxy
        config:
          route_type: llm/v1/chat
          max_request_body_size: 131072
          auth:
            header_name: Authorization
            header_value: "{vault://env/sakura-ai-auth-header}"
          model:
            provider: openai
            options:
              upstream_url: https://api.ai.sakura.ad.jp/v1/chat/completions

consumers:
  - username: opencode
    keyauth_credentials:
      - key: REPLACE_WITH_A_LONG_RANDOM_API_KEY

max_request_body_sizeはデフォルトが8192ですが、これだと足りないので今回は増やしています
通常のチャットであれば足りそうですが、opencodeでは不足します

.env の設定

.env.example.env にコピーして使います。

SAKURA_AI_AUTH_HEADER=Bearer <your-sakura-ai-token>

SAKURA_AI_AUTH_HEADERBearer を含めた完全な値を設定します

Kong 側の API Key 設定

kong.yaml 内の以下はプレースホルダです

consumers:
  - username: opencode
    keyauth_credentials:
      - key: REPLACE_WITH_A_LONG_RANDOM_API_KEY

ここは実際に利用する長いランダム文字列へ置き換えてください
OpenCode 側にも同じ値を設定します

OpenCode の設定

インストール

こちらにある通り、

curl -fsSL https://opencode.ai/install | bash

でインストール可能です

これを実行すると ~/.opencode/bin/ にインストールされます

OpenCode 側には opencode.json を用意します
今回は @ai-sdk/openai-compatible を使って Kong を provider として登録します

設定方法はこちらを参照

{
  "$schema": "https://opencode.ai/config.json",
  "provider": {
    "sakura-kong": {
      "npm": "@ai-sdk/openai-compatible",
      "name": "Sakura via Kong",
      "options": {
        "baseURL": "http://localhost:8000/v1",
        "headers": {
          "x-api-key": "{env:OPENCODE_KONG_API_KEY}"
        }
      },
      "models": {
        "Qwen3-Coder-30B-A3B-Instruct": {
          "name": "qwen3"
        },
        "gpt-oss-120b": {
          "name": "gpt-oss-120b"
        }
      }
    }
  },
  "model": "sakura/gpt-oss-120b"
}

ここで、models に設定するキーはモデル名になるので

ガイド参照のこと

あわせて、OpenCode 実行環境側に API Key を環境変数で渡します

export OPENCODE_KONG_API_KEY=replace-with-the-same-key-as-kong-yaml

ここで作成した opencode.json~/.config/opencode/opencode.json に配置をしておきます

openaiのapikeyの実態はBearerトークンであるため、
openai-compatibleを利用する場合のapiKeyはBearerである前提で設定されることになる
カスタムプロバイダー設定にあるoptions.apiKeyは
今回のKey-authの方式では使用できないことに注意

起動手順

  1. .env.example.env にコピーする
  2. SAKURA_AI_AUTH_HEADER を設定する
  3. kong.yamlREPLACE_WITH_A_LONG_RANDOM_API_KEY を置き換える
  4. docker compose up -d で Kong を起動する
  5. OpenCode 側で OPENCODE_KONG_API_KEY を設定する
  6. opencode.json を配置して provider を使う

すべての設定が終わったらこんな感じ

001.png

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?