LiteLLM Proxy ServerでAzure openAIを本家openAIぽく使う

Azure OpenAIリソースを使うことが多いんだけど、ちょっとOSSのプログラム試そうとすると、意外と対応してなかったりして、面倒なときがあります。本家openaiのみの対応だったり、Azure対応してるふりして実はコード内では全然だったり、Azureまわりはテストされてなかったり。

ということで、Azure OpenAIが使いにくければ、本家openaiっぽくつかえればいいんじゃない？ということで、LiteLLM Proxy Server (LLM Gateway)を使ってみたのでその備忘録です。

以下を参考にしました。
https://docs.litellm.ai/docs/proxy/docker_quick_start

# 環境
Windows
VSC
Python 3.10.11

環境はWindowsですが、VSCのターミナルでぽちぽち試している感じなので、linuxとかでもほぼ同じ感じで動くと思います。

# LiteLLM Proxy Serverの設定
ライブラリをインストールします。venvの設定は割愛。
```
$ pip install 'litellm[proxy]'
```

config.yamlに以下を設定します。gpt-4o-miniという名前でデプロイしたモデルを設定しています。
```
model_list:
  - model_name: gpt-4o-mini
    litellm_params:
      model: azure/gpt-4o-mini
      api_base: "Azure openAIリソースのベースURLを設定"
      api_key: "Azure openAIリソースのAPIキーを設定"
```

# コマンドラインで試す
あらかじめ、litellmを起動しておきます。
```
$ litellm --config config.yaml --detailed_debug
```

コマンドラインで以下たたきます。うまくいかない場合は、改行を適宜削除してみるとよいです。
```
curl -X POST 'http://localhost:4000/chat/completions' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer sk-1234' \
-d '{
    "model": "gpt-3.5-turbo",
    "messages": [
      {
        "role": "system",
        "content": "You are a helpful math tutor. Guide the user through the solution step by step."
      },
      {
        "role": "user",
        "content": "how can I solve 8x + 7 = -23"
      }
    ]
}'
```

以下のように、ちゃんと結果がかえってきます。英語できいてるから、英語でかえってきてますね。
```
 tutor. Guide the user through the solution step by step."      },      {        "role": "user",        "content": "how can I solve 8x + 7 = -23"      }    ]}'{"id":"chatcmpl-AZfSw8ZSiqJ6Khdv8Nnw7QLg06N7S","created":1733064238,"model":"gpt-4o-mini",
"object":"chat.completion","system_fingerprint":"fp_04751d0b65","choices":[{"finish_reason":"stop","index":0,"message":{"content":"To solve the equation \\( 8x + 7 = -23 \\), follow these steps:\n\n### Step 1: Isolate the term with the variable (8x)\nFirst, you want to 
get the term involving \\( x \\) by itself on one side. Start by subtracting \\( 7 \\) from both sides of the equation:\n\n\\[\n8x + 7 - 7 = -23 - 7\n\\]\n\nThis simplifies to:\n\n\\[\n8x = -30\n\\]\n\n### Step 2: Solve for \\( x \\)\nNext, you need to get \\( x \\) by 
itself. You do this by dividing both sides of the equation by \\( 8 \\):\n\n\\[\nx = \\frac{-30}{8}\n\\]\n\n### Step 3: Simplify the fraction\nYou can simplify the fraction \\( \\frac{-30}{8} \\) by dividing both the numerator and the denominator by the greatest common 
divisor, which is \\( 2 \\):\n\n\\[\nx = \\frac{-30 \\div 2}{8 \\div 2} = \\frac{-15}{4}\n\\]\n\n### Final Answer\nSo, the solution to the equation \\( 8x + 7 = -23 \\) is:\n\n\\[\nx = -\\frac{15}{4}\n\\]\n\nIf you prefer it as a decimal, you can also express it as:\n\n\\[\nx = -3.75\n\\] \n\nWould you like any further explanation on any of the steps?","role":"assistant","tool_calls":null,"function_call":null}}],"usage":{"completion_tokens":310,"prompt_tokens":41,"total_tokens":351,"completion_tokens_details":null,"prompt_tokens_details":null},"service_tier":null,"prompt_filter_results":[{"prompt_index":0,"content_filter_results":{"hate":{"filtered":false,"severity":"safe"},"jailbreak":{"filtered":false,"detected":false},"self_harm":{"filtered":false,"severity":"safe"},"sexual":{"filtered":false,"severity":"safe"},"violence":{"filtered":false,"severity":"safe"}}}]}
```


# pythonから呼び出す
openaiライブラリ経由で、本家っぽく呼び出してみます。
```
pip install openai==0.28
```
pythonプログラムは以下。
```python
import openai

# Azure互換のAPIエンドポイントを指定
openai.api_base = "http://localhost:4000/v1"

# APIキーを設定
openai.api_key = "sk-1234"  # litellmで設定したキー。デフォルトがこれ。

# リクエストを送信
response = openai.ChatCompletion.create(
    model="gpt-4o-mini",  # litellmで指定したモデル名
    messages=[
        {
            "role": "system",
            "content": "You are a helpful math tutor. Guide the user through the solution step by step."
        },
        {
            "role": "user",
            "content": "次の数式はどのように解けばよい？ 8x + 7 = -23"
        }
    ]
)

# 結果を表示
print(response.choices[0].message["content"])
```

結果が以下のように出力されます。それっぽいものが出てきました。
```
数式 \( 8x + 7 = -23 \) を解くためには、まず \( x \) を孤立させるためにいくつかのステップ
を踏む必要があります。以下の手順に従って解いていきましょう。

### ステップ 1: 両辺から 7 を引く

方程式の両辺から 7 を引きます。この操作により、\( x \) の項を一方の辺に集めることができま 
す。

\[
8x + 7 - 7 = -23 - 7
\]

これを計算すると、

\[
8x = -30
\]

### ステップ 2: 両辺を 8 で割る

次に、\( x \) を単独にするために、両辺を 8 で割ります。

\[
\frac{8x}{8} = \frac{-30}{8}
\]

これを計算すると、

\[
x = -\frac{30}{8}
\]

### ステップ 3: 簡略化する

\( -\frac{30}{8} \) を約分します。30 と 8 は 2 で割れるので、

\[
x = -\frac{15}{4}
\]

### 結果

したがって、解は次のようになります。

\[
x = -\frac{15}{4}
\]

このようにして方程式を解くことができました。もし他に質問があれば教えてください！
```

これを使えば、どんなOSSも気楽に遊び倒せますね。
Azure openAIだけでなく、config.yamlでollamaで起動したLLMも指定できそうです。
便利！

以上