OpenAI API используюしているけど、コストが高すぎて困っている。でもGeminiへの切り替え方がわからない。既存のOpenAI向けコードが大量にあるなら、書き直しは本当に必要なの?

実は、コードを1行も変更せずに移行できる方法があります。この記事では、私が実際に3つの移行パターンを試した経験を元に、それぞれの実装方法・メリット・デメリットを解説します。

前提知識:なぜフォーマット変換が必要か

Google Gemini APIとOpenAI APIは、同じ「テキスト生成AI」への入り口ですが、内部のフォーマットが違います。

この違いがあるため、単純な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인가