以下の内容はhttps://nikkie-ftnext.hatenablog.com/entry/promptflow-request-gemini-openai-compatible-endpointより取得しました。


Microsoft製OSS Prompt flowをローカルで動かし、GoogleのGeminiのOpenAI互換エンドポイントにリクエストを送る

はじめに

人の夢は!!!終わらねェ!!!! nikkieです。

Prompt flowはAzure発なのでGeminiはサポートしていないのですが、触っている中で「私が知ってる範囲の情報を組み合わせたらできるよな?」と思っちゃったので手を動かしました。
内容が内容なので、後日Microsoftさんから校舎裏へ呼び出されるかもしれません(そのときはGoogleさんも一緒に来てください🙏)

目次

Prompt flow

Azureの機械学習機能の1つとして始まり、OSSとなりました。
Pythonがあれば動かせ、プロンプトやPythonスクリプトを組合せてLLMアプリを作れるツールと理解しました(プロンプトを変えた時の検証もできるようですが、私の手が回っていません)

サポートしているLLMは、Azure OpenAIやOpenAI。
https://microsoft.github.io/promptflow/concepts/concept-connections.html
過去の記事では、OpenAIのGPTを使いました。

GeminiのOpenAI互換API

実はGeminiもOpenAIの互換エンドポイントをベータで提供しています

ライブラリopenaiからGeminiが叩けるんです!

from openai import OpenAI

client = OpenAI(
    api_key="gemini_api_key",
    base_url="https://generativelanguage.googleapis.com/v1beta/"
)

response = client.chat.completions.create(
    model="gemini-1.5-flash",  # gemini-2.0-flash-exp もいけます!
    # 省略
)

これらから導き出される結論は...

Prompt flowでOpenAI互換のGeminiを使うぞ!!

環境構築

promptflow-toolsをPyPIからではなく、promptflowのGitHubリポジトリからインストールする必要があります(差分の内容については後述)。
私は(前回同様)uvを使いましたが、pip installする場合は以下になります

% pip install promptflow 'promptflow-tools @ git+https://github.com/microsoft/promptflow.git@promptflow_1.17.1#subdirectory=src/promptflow-tools'

Connectionの作成

$schema: https://azuremlschemas.azureedge.net/promptflow/latest/OpenAIConnection.schema.json
name: gemini_connection
type: open_ai
api_key: "<user-input>"
base_url: https://generativelanguage.googleapis.com/v1beta/
% uv run pf connection create --file connections/gemini_compatible_openai.yml --set api_key=$GOOGLE_API_KEY

ここでGOOGLE_API_KEYに設定しているのは、無料枠のあるGoogle AIのGemini APIです。
本番利用に向くVertex AIではありません。
ref: https://cloud.google.com/vertex-ai/generative-ai/docs/multimodal/overview?hl=ja#how-gemini-vertex-different-gemini-aistudio

できました🙌

     type: code
     path: llm_node.jinja2
   inputs:
-    model: gpt-4o-mini
+    model: gemini-2.0-flash-exp
     max_tokens: 20
     question: ${inputs.text}
-  connection: open_ai_connection
+  connection: gemini_connection
   api: chat
% uv run pf flow test --flow my-first-flow --inputs text='Prompt flowで川柳を詠んで'
Prompt flow service has started...
2025-01-12 14:05:22 +0900   80199 execution.flow     INFO     Start executing nodes in thread pool mode.
2025-01-12 14:05:22 +0900   80199 execution.flow     INFO     Start to run 1 nodes with concurrency level 16.
2025-01-12 14:05:22 +0900   80199 execution.flow     INFO     Executing node llm_node. node run id: 9ef3edd8-c23a-4601-93d8-48ad2b0e02f5_llm_node_0
2025-01-12 14:05:23 +0900   80199 execution.flow     INFO     Node llm_node completes.
{
    "response": "はい、承知いたしました。Prompt flowを使って川柳を詠みます。\n\nどのようなテーマの川"
}

OpenAI互換のGeminiが叩けるようになる差分

リポジトリからインストールした点についてです。

実は、OpenAI互換を謳うGeminiのエンドポイントはOpenAI互換ではありません
ベータ版ではいくつかのパラメタをサポートしていないのだと思われます。

PyPIからインストールするpromptflow-toolsと、リポジトリの最新のpromptflow-toolsの差分が結果的にこの点を吸収していました。

PyPIのpromptflow-tools (1.4.0) からOpenAIのAPIに送られるリクエス
https://github.com/microsoft/promptflow/blob/v1.4.0-tools/src/promptflow-tools/promptflow/tools/openai.py#L118-L129

params = {
    "model": model,
    "messages": messages,
    "temperature": float(temperature),
    "top_p": float(top_p),
    "n": int(n),
    "stream": stream,
    "max_tokens": int(max_tokens) if max_tokens is not None and str(max_tokens).lower() != "inf" else None,
    "presence_penalty": float(presence_penalty),
    "frequency_penalty": float(frequency_penalty),
    "user": user,
}

リポジトリの最新のpromptflow-tools (タグ promptflow_1.17.1)からOpenAIのAPIに送られるリクエス
https://github.com/microsoft/promptflow/blob/promptflow_1.17.1/src/promptflow-tools/promptflow/tools/openai.py#L118-L124

params = {
    "model": model,
    "messages": messages,
    "temperature": temperature,
    "top_p": top_p,
    "stream": stream,
}

PyPI版のpromptflow-toolsのリクエストをGeminiに送ると、400 Bad Requestが返ってきました

Unknown name "frequency_penalty"
Unknown name "presence_penalty"
Unknown name "user"

リポジトリからpromptflow-toolsをインストールすると、この3つはデフォルトでは入ってこないようです。

OpenAIのGPTたちのAPIリファレンスにはこれらは記載されています。
https://platform.openai.com/docs/api-reference/chat/create

GoogleのGeminiのAPIリファレンスには制限の記載がありました。
https://ai.google.dev/gemini-api/docs/openai?hl=ja#current-limitations
OpenAI互換エンドポイントのベータが外れる(=GA)を期待しています!

終わりに

Prompt flowで、Geminiは叩けます!

  • GeminiのOpenAI互換APIを使う
  • promptflow-toolsをリポジトリからインストールする
    • Geminiが受け付けられないパラメタが送られない実装になっている

Geminiが解放されたので、これはPrompt flowを使った開発が捗っちゃいますね、むふふ。
Microsoftさん、現行の最新コードでpromptflow-toolsをリリースしてほしいな〜

Geminiを動かしてみたい方は、以下のコミットのソースコードを取得し、Connectionだけ設定していただければと思います!

(記事執筆に当たり、以下のハックは不要と分かりました)

P.S. GeminiのOpenAI互換APIbase_urlって?

指定の仕方が2通りある、みたいです。
Connectionを作り直して、どちらでも動きました

(1) ref: Gemini is now accessible from the OpenAI Library - Google Developers Blog

base_url="https://generativelanguage.googleapis.com/v1beta/"

(2) ref: OpenAI の互換性  |  Gemini API  |  Google AI for Developers

base_url="https://generativelanguage.googleapis.com/v1beta/openai/"

2通りあると知ったなら、個人的には(2)にしたいかもです




以上の内容はhttps://nikkie-ftnext.hatenablog.com/entry/promptflow-request-gemini-openai-compatible-endpointより取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14