DBeaver Proxy to Mistral
DBeaver CE(およびその他のOpenAI互換クライアント)がMistral APIで動作するようにする小規模なFastAPIプロキシ。

DBeaver Proxy to Mistral について
DBeaver Proxy to Mistral は、小規模な FastAPI プロキシで、DBeaver CE(およびその他の OpenAI 互換クライアント) を Mistral API と連携させるためのものです。
DBeaver の AI アシスタントは OpenAI のような API を使用しますが、非常に特定の JSON フィールドと SSE イベントタイプを期待します。このプロキシは以下の機能を提供します:
- OpenAI 互換 エンドポイント (
/responses、/models、レガシー/chat/completions) を公開 - DBeaver が使用する OpenAI Responses API の
POST /responsesを Mistral のPOST /chat/completionsに変換 - Mistral のレスポンスを DBeaver が
NullPointerExceptionを発生させずに解析できるペイロードに変換 - ストリーミング(Server-Sent Events) と非ストリーミングの両方をサポート
- 環境変数で設定可能で、systemd サービスとして実行可能

サポートされているエンドポイント
プロキシは以下のエンドポイントを公開します(ルートおよび /v1/* エイリアスが適用可能な場合):
モデルエンドポイント
GET /modelsGET /v1/models
広告モデルのリストを返します(MISTRAL_MODELS で設定)。
レスポンスエンドポイント
POST /responsesPOST /v1/responses
DBeaver/OpenAI Responses API リクエストを受け付け、Mistral chat/completions に転送します。
レガシーエンドポイント
POST /chat/completionsPOST /v1/chat/completions
Mistral chat/completions へのレガシーパススルー(フォーマット変換なし)。
設定
設定は環境変数を介して行われます。ローカルの .env ファイル(python-dotenv を介して読み込み)を使用するか、シェルや systemd 環境で変数を設定できます。
環境変数
必須
MISTRAL_API_KEY
オプション
MISTRAL_BASE_URL- デフォルト:https://api.mistral.ai/v1MISTRAL_MODEL- デフォルト:mistral-large-latest(リクエストでモデルが指定されていない場合に使用)MISTRAL_MODELS- プロキシがGET /modelsを介して広告するモデル ID のカンマ区切りリストHOST- デフォルト:0.0.0.0PORT- デフォルト:60916REQUEST_TIMEOUT_SECONDS- デフォルト:60
設定の注意点
MISTRAL_API_KEYが設定されていなくてもGET /modelsは動作します- Mistral API を呼び出すルート (
/responses、/chat/completions) は、MISTRAL_API_KEYが欠落している場合、401 を返します
ローカル開発
要件
- Python 3.12+
セットアップ
設定
実行
デフォルトでは、サーバーは http://0.0.0.0:60916 で待ち受けます。
リントとテスト
DBeaver との連携
DBeaver CE で:
- OpenAI エンドポイント/ベース URL を
http://<your-server>:60916/v1/に設定 - トークン値を任意の値に設定(DBeaver はトークンを要求しますが、プロキシはサーバー環境の
MISTRAL_API_KEYを使用します)
DBeaver は以下を使用します:
GET /v1/modelsPOST /v1/responses
Systemd サービス
このリポジトリには、ユニットファイルと環境ファイルのテンプレートが含まれています:
deploy/systemd/dbeaver-mistral-proxy.servicedeploy/systemd/dbeaver-mistral-proxy.env.example
インストール
- 仮想環境を作成し、依存関係をインストール(ローカル開発を参照)
- サービスで使用する環境ファイルを作成:
- ユニットファイルをインストール:
ログ
Docker
このプロジェクトは軽量なコンテナとして実行できます。
ビルド
実行 (Docker)
Docker Compose
バージョニングとリリース
このプロジェクトは セマンティックバージョニング (SemVer) と Conventional Commits を使用しています。リリースは GitHub Actions の python-semantic-release を介して自動化されています。
動作原理- main ブランチへのプッシュがリリースワークフローをトリガーします
python-semantic-releaseがコミットメッセージを解析し、次のバージョンを決定します- リリースが作成されると、以下が実行されます:
vX.Y.Z形式の Git タグを作成pyproject.tomlのproject.versionを更新- テンプレートから
CHANGELOG.mdを生成 latestおよびvX.Y.Zタグ付きの Docker イメージを公開
Conventional Commits の例
feat(proxy): add tool_choice forwarding→ マイナーバージョンアップfix(api): handle gzip bodies→ パッチバージョンアップperf(proxy): reduce allocations→ パッチバージョンアップdocs: update readme→ バージョンアップなし
重大な変更 (Breaking Changes)
コミット本文に BREAKING CHANGE: を含めるとメジャーバージョンアップがトリガーされます。
GitHub Actions のシークレット
GITHUB_TOKEN- GitHub によって自動的に提供されますRELEASE_TOKEN(オプション) - コミット/タグのプッシュ権限を持つ PATDOCKERHUB_USERNAME(オプション)DOCKERHUB_TOKEN(オプション)
パブリッシングに関する注意事項
- GHCR へのパブリッシュは
github.tokenを使用し、リリース作成時に実行されます - Docker Hub へのパブリッシュは
DOCKERHUB_USERNAMEとDOCKERHUB_TOKENが設定されている場合にのみ実行されます
トラブルシューティング
DBeaver エラー: "HTTP/1.1 header parser received no bytes" / "Connection reset"
これは、プロキシがレスポンスを書き込む前に失敗したことを示しています。
実装された緩和策:
/responsesと/chat/completionsの堅牢なリクエスト解析- 空のボディや
Content-Encoding: gzipを処理 - 互換性向上のため、Uvicorn に
h11HTTP 実装を強制
デバッグ:
ログに "Unsupported upgrade request" が表示される
これは、クライアントがアップグレードを試みた場合(例: h2c/WebSocket スタイルのアップグレード)に発生します。通常の DBeaver 使用時には予期された動作であり、無害です。
技術スタック
- Python 3.12+ と FastAPI を使用したプロキシサーバー
- Mistral AI API との統合による AI コンプリーション
- DBeaver CE 互換レイヤー
- Docker を使用したコンテナ化されたデプロイメント
- Systemd を使用した Linux サービス管理
- セマンティックバージョニング と Conventional Commits を使用した自動リリース
DBeaver Proxy to Mistral は、DBeaver の OpenAI 互換 API の期待値と Mistral API との間にシームレスなブリッジを提供し、開発者が DBeaver CE 内で直接 Mistral の AI 機能を利用できるようにします。