OpenAI API используюしているけど、コストが高すぎて困っている。でもGeminiへの切り替え方がわからない。既存のOpenAI向けコードが大量にあるなら、書き直しは本当に必要なの?
実は、コードを1行も変更せずに移行できる方法があります。この記事では、私が実際に3つの移行パターンを試した経験を元に、それぞれの実装方法・メリット・デメリットを解説します。
前提知識:なぜフォーマット変換が必要か
Google Gemini APIとOpenAI APIは、同じ「テキスト生成AI」への入り口ですが、内部のフォーマットが違います。
- OpenAI:messages配列形式(role: system/user/assistant)
- Gemini:contents形式(parts配列)
この違いがあるため、単純なURL変更では動きません。ただし、HolySheep AIのようなマルチモデルゲートウェイを使えば、OpenAIフォーマット 그대로Geminiを呼び出せます。
3つの移行パス比較
| 移行パス | 変更箇所 | 実装難易度 | コスト | 向いている場面 |
|---|---|---|---|---|
| パス1:SDKラッパー | インポート文のみ | ★☆☆☆☆ | 中 | 既存のOpenAI SDKコードがある |
| パス2:HTTPプロキシ | base_url変更 | ★★☆☆☆ | 安 | 複数のAIを切り替える必要がある |
| パス3:HolySheep直接 | APIキー+URL変更 | ★★★☆☆ | 最安 | コスト削減したい |
パス1:SDKラッパーで変換(推奨度★★★☆☆)
最も классическая な方法で、openai-python SDKの内部フォーマットをGemini用に変換するラッパーを自作します。
必要なもの
# requirements.txt
openai>=1.0.0
google-generativeai>=0.3.0
pip install -r requirements.txt
ラッパークラスの実装
import os
from openai import OpenAI
import google.generativeai as genai
class GeminiWrapper:
"""
OpenAI SDK形式でGeminiを呼び出すラッパー
学習目的:実際のプロジェクトでは後述のHolySheepを推奨
"""
def __init__(self, api_key: str, model: str = "gemini-2.0-flash"):
genai.configure(api_key=api_key)
self.model = model
self.client = OpenAI(api_key="dummy") # OpenAI形式を模倣
def chat(self, messages: list) -> str:
# OpenAI形式 → Gemini形式へ変換
system_prompt = ""
user_content = ""
for msg in messages:
if msg["role"] == "system":
system_prompt = msg["content"]
elif msg["role"] == "user":
user_content = msg["content"]
# Gemini API呼び出し
model = genai.GenerativeModel(
self.model,
system_instruction=system_prompt
)
response = model.generate_content(user_content)
return response.text
使用例
wrapper = GeminiWrapper(api_key="YOUR_GEMINI_API_KEY")
response = wrapper.chat([
{"role": "system", "content": "あなたは関西弁で話す помощник です"},
{"role": "user", "content": "今日の天気を教えて"}
])
print(response)
💡 スクリーンショットヒント:ラッパー呼び出し後、関西弁で返答が来ることを確認してください。system promptが正しく伝わっていれば「ほんまかいな」「ややこしいわ」などの表現が使われます。
パス2:プロキシサーバーで変換(推奨度★★★☆☆)
FastAPIで自作プロキシを作り、OpenAIリクエストをGeminiリクエストに変換する方法です。複数のAIモデルを一元管理したい場合に有用です。
# proxy_server.py
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from typing import List, Optional
import httpx
import os
app = FastAPI(title="OpenAI to Gemini Proxy")
class Message(BaseModel):
role: str
content: str
class ChatRequest(BaseModel):
model: str
messages: List[Message]
temperature: Optional[float] = 0.7
class ChatResponse(BaseModel):
id: str
model: str
choices: List[dict]
@app.post("/v1/chat/completions")
async def chat_completions(request: ChatRequest):
"""OpenAI形式 → Gemini形式へ変換して転送"""
# OpenAI形式から抽出
system_instruction = ""
user_message = ""
for msg in request.messages:
if msg.role == "system":
system_instruction = msg.content
elif msg.role == "user":
user_message = msg.content
# Gemini APIに変換
gemini_request = {
"contents": [{
"parts": [{"text": user_message}]
}],
"systemInstruction": {
"parts": [{"text": system_instruction}]
},
"generationConfig": {
"temperature": request.temperature
}
}
# Gemini APIへ転送
async with httpx.AsyncClient() as client:
response = await client.post(
"https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent",
params={"key": os.environ["GEMINI_API_KEY"]},
json=gemini_request,
timeout=30.0
)
if response.status_code != 200:
raise HTTPException(status_code=500, detail="Gemini API Error")
gemini_data = response.json()
# Gemini形式 → OpenAI形式に戻す
return ChatResponse(
id=f"chatcmpl-{os.urandom(12).hex()}",
model=request.model,
choices=[{
"index": 0,
"message": {
"role": "assistant",
"content": gemini_data["candidates"][0]["content"]["parts"][0]["text"]
},
"finish_reason": "stop"
}]
)
実行: uvicorn proxy_server:app --reload --port 8000
# クライアント侧(OpenAI SDKそのまま使用可能)
from openai import OpenAI
client = OpenAI(
api_key="dummy", # ローカルプロキシなので不要
base_url="http://localhost:8000/v1" # 自分のプロキシを指す
)
response = client.chat.completions.create(
model="gemini-2.0-flash",
messages=[
{"role": "system", "content": "简単な日本語で答えて"},
{"role": "user", "content": "量子コンピュータとは何ですか?"}
]
)
print(response.choices[0].message.content)
💡 スクリーンショットヒント:localhost:8000/docs にアクセスすると、FastAPIの自動生成ドキュメントが確認できます。「Try it out」からテスト送信も可能です。
パス3:HolySheep AIで直接変換(推奨度★★★★★)
自作ラッパーやプロキシの手間を省き、既存のOpenAIフォーマット 그대로複数社のAIを切り替えられるのがHolySheep AIです。
なぜHolySheep인가
- レートが¥1=$1(公式¥7.3=$1