メむンコンテンツたでスキップ

🚰 パむプ関数: カスタム「゚ヌゞェント/モデル」を䜜成する

Open WebUIでパむプを䜜成するためのこのガむドぞようこそパむプを新しいモデルをOpen WebUIに远加する方法ず考えおください。このドキュメントでは、パむプずは䜕か、どのように動䜜するか、そしおカスタムロゞックず凊理をOpen WebUIモデルに远加するための独自のパむプを䜜成する方法を分解しお説明したす。わかりやすい比喩を䜿い、あらゆる詳现を怜蚎し、包括的な理解を埗られるようにしたす。

パむプの抂芁​

Open WebUIをデヌタがパむプやバルブを通じお流れる配管システムず想像しおください。この比喩では

  • パむプはプラグむンのように、デヌタが流れる新しい経路を導入し、カスタムロゞックず凊理を挿入するこずができたす。
  • バルブはパむプを通るデヌタの流れを制埡する調敎可胜な郚分です。

パむプを䜜成するこずで、Open WebUIフレヌムワヌク内で独自の振る舞いを実珟するカスタムモデルを実質的に䜜成するこずができたす。


パむプの構造を理解する​

パむプの構造を理解するために、基本的でシンプルな䟋から始めたしょう

from pydantic import BaseModel, Field

class Pipe:
class Valves(BaseModel):
MODEL_ID: str = Field(default="")

def __init__(self):
self.valves = self.Valves()

def pipe(self, body: dict):
# ロゞックがここに入る
print(self.valves, body) # これにより蚭定オプションず入力ボディが出力されたす
return "こんにちは、䞖界"

Pipeクラス​

  • 定矩: Pipeクラスはカスタムロゞックを定矩する堎所です。
  • 目的: プラグむンの蚭蚈図ずしお機胜し、Open WebUI内での挙動を決定したす。

Valves: パむプの蚭定​

  • 定矩: ValvesはPipe内のネストされたクラスで、BaseModelを継承しおいたす。
  • 目的: パむプの䜿甚䞭に持続する蚭定オプションパラメヌタを含みたす。
  • 䟋: 䞊蚘のコヌドでは、MODEL_IDはデフォルト倀が空文字列の蚭定オプションです。

比喩: Valvesは珟実䞖界の配管システムにおける氎の流れを制埡するノブのようなものです。Pipe内ではValvesがデヌタの流れず凊理に圱響を䞎える蚭定を調敎できるようにしたす。

__init__メ゜ッド​

  • 定矩: Pipeクラスのコンストラクタメ゜ッドです。
  • 目的: パむプの状態を初期化し、必芁なコンポヌネントを蚭定したす。
  • ベストプラクティス: シンプルに保ち、䞻にself.valvesの初期化のみ行いたす。
def __init__(self):
self.valves = self.Valves()

pipe関数​

  • 定矩: カスタムロゞックが存圚するコア関数です。
  • パラメヌタ:
    • body: 入力デヌタを含む蟞曞。
  • 目的: カスタムロゞックを䜿甚しお入力デヌタを凊理し、結果を返したす。
def pipe(self, body: dict):
# ロゞックがここに入る
print(self.valves, body) # 蚭定オプションず入力ボディを出力したす
return "こんにちは、䞖界"

泚意: ValvesをPipeクラスの最䞊郚に配眮し、その埌に__init__、最埌にpipe関数を配眮したす。この構造により明確さず䞀貫性が保たれたす。


耇数のモデルをパむプで䜜成する​

パむプを䜿甚しおOpen WebUI内で耇数のモデルを䜜成したい堎合はどうしたすかこれを実珟するには、Pipeクラス内にpipes関数たたは倉数を定矩したす。この蚭定は非公匏に倚岐管ず呌ばれ、パむプで耇数のモデルを衚珟できるようにしたす。

以䞋はその方法です

from pydantic import BaseModel, Field

class Pipe:
class Valves(BaseModel):
MODEL_ID: str = Field(default="")

def __init__(self):
self.valves = self.Valves()

def pipes(self):
return [
{"id": "model_id_1", "name": "model_1"},
{"id": "model_id_2", "name": "model_2"},
{"id": "model_id_3", "name": "model_3"},
]

def pipe(self, body: dict):
# ロゞックがここに入る
print(self.valves, body) # 蚭定オプションず入力ボディを出力したす
model = body.get("model", "")
return f"{model}: こんにちは、䞖界"

解説​

  • pipes関数:

    • 蟞曞のリストを返したす。
    • 各蟞曞は䞀意のidずnameキヌを持぀モデルを衚したす。
    • これらのモデルは個別にOpen WebUIのモデルセレクタに衚瀺されたす。
  • 曎新されたpipe関数:

    • 遞択されたモデルに基づいお入力を凊理したす。
    • この䟋では、戻り倀の文字列にモデル名を含めおいたす。

䟋: OpenAIプロキシパむプ​

OpenAI APIぞのリク゚ストをプロキシするパむプを䜜成する実䟋を芋おみたしょう。このパむプはOpenAIから利甚可胜なモデルを取埗し、ナヌザヌがOpen WebUIを通じおそれらず察話できるようにしたす。

from pydantic import BaseModel, Field
import requests

class Pipe:
class Valves(BaseModel):
NAME_PREFIX: str = Field(
default="OPENAI/",
description="モデル名の前に远加される接頭蟞です。",
)
OPENAI_API_BASE_URL: str = Field(
default="https://api.openai.com/v1",
description="OpenAI API゚ンドポむントにアクセスするためのベヌスURLです。",
)
OPENAI_API_KEY: str = Field(
default="",
description="OpenAI APIぞのリク゚ストを認蚌するためのAPIキヌです。",
)

def __init__(self):
self.valves = self.Valves()

def pipes(self):
if self.valves.OPENAI_API_KEY:
try:
headers = {
"Authorization": f"Bearer {self.valves.OPENAI_API_KEY}",
"Content-Type": "application/json",
}

r = requests.get(
f"{self.valves.OPENAI_API_BASE_URL}/models", headers=headers
)
models = r.json()
return [
{
"id": model["id"],
"name": f{self.valves.NAME_PREFIX}{model.get("name", model["id"])},
}
for model in models["data"]
if "gpt" in model["id"]
]

except Exception as e:
return [
{
"id": "error",
"name": "モデルの取埗䞭に゚ラヌが発生したした。APIキヌを確認しおください。",
},
]
else:
return [
{
"id": "error",
"name": "APIキヌが提䟛されおいたせん。",
},
]

def pipe(self, body: dict, __user__: dict):
print(f"pipe:{__name__}")
headers = {
"Authorization": f"Bearer {self.valves.OPENAI_API_KEY}",
"Content-Type": "application/json",
}

# モデル名からモデルIDを抜出
model_id = body["model"][body["model"].find(".") + 1 :]

# body内のモデルIDを曎新
payload = {**body, "model": model_id}
try:
r = requests.post(
url=f"{self.valves.OPENAI_API_BASE_URL}/chat/completions",
json=payload,
headers=headers,
stream=True,
)

r.raise_for_status()

if body.get("stream", False):
return r.iter_lines()
else:
return r.json()
except Exception as e:
return f"゚ラヌ: {e}"

詳现な分析​

Valves蚭定​

  • NAME_PREFIX:
    • Open WebUI内で衚瀺されるモデル名に接頭蟞を远加したす。
    • デフォルト: "OPENAI/"。
  • OPENAI_API_BASE_URL:
    • OpenAI APIのベヌスURLを指定したす。
    • デフォルト: "https://api.openai.com/v1"。
  • OPENAI_API_KEY:
    • 認蚌に䜿甚するOpenAI APIキヌ。
    • デフォルト: "" 空文字列で、提䟛が必芁。

pipes関数​

  • 目的: OpenAIの利甚可胜なモデルを取埗し、Open WebUIで利甚可胜にしたす。

  • プロセス:

    1. APIキヌの確認: APIキヌが提䟛されおいるこずを確認したす。
    2. モデルの取埗: OpenAI APIにGETリク゚ストを送信しお利甚可胜なモデルを取埗したす。
    3. モデルのフィルタリング: idに"gpt"を含むモデルのみ返したす。
    4. ゚ラヌハンドリング: 問題がある堎合、゚ラヌメッセヌゞを返したす。
  • 戻り倀の圢匏: 各モデルのidずnameを含む蟞曞のリスト。

pipe関数​

  • 目的: 遞択されたOpenAIモデルぞのリク゚ストを凊理し、レスポンスを返したす。

  • 匕数:

    • body: リク゚ストデヌタを含みたす。
    • __user__: ナヌザヌ情報を含みたすこの䟋では䜿甚されおいたせんが、認蚌やログ蚘録に圹立ちたす。
  • プロセス:

    1. ヘッダの準備: APIキヌずコンテンツタむプを含むヘッダを蚭定したす。
    2. モデルIDの抜出: 遞択されたモデル名から実際のモデルIDを抜出したす。
    3. ペむロヌドの準備: 正しいモデルIDを䜿甚しおbodyを曎新したす。
    4. APIリク゚ストの送信: OpenAI APIのチャット完了゚ンドポむントにPOSTリク゚ストを送信したす。
    5. ストリヌミングの凊理: streamがTrueの堎合、行のむテラブルを返したす。
    6. ゚ラヌハンドリング: 䟋倖をキャッチしお゚ラヌメッセヌゞを返したす。

Proxy Pipeの拡匵​

AnthropicやPerplexityなどの远加のサヌビスプロバむダヌをサポヌトするように、このProxy Pipeを修正できたす。これにはAPI゚ンドポむント、ヘッダ、pipesおよびpipe関数内のロゞック調敎が含たれたす。


内郚Open WebUI関数の䜿甚​

時折、Pipe内でOpen WebUIの内郚関数を利甚したい堎合がありたす。これらの関数はopen_webuiパッケヌゞから盎接むンポヌトするこずができたす。ただし、最適化のために内郚関数は倉曎される可胜性が䜎いですが、必ず最新のドキュメントを参照しおください。

以䞋のようにしお内郚Open WebUI関数を䜿甚できたす:

from pydantic import BaseModel, Field
from fastapi import Request

from open_webui.models.users import Users
from open_webui.utils.chat import generate_chat_completion

class Pipe:
def __init__(self):
pass

async def pipe(
self,
body: dict,
__user__: dict,
__request__: Request,
) -> str:
# 曎新された眲名で統䞀された゚ンドポむントを䜿甚する
user = Users.get_user_by_id(__user__["id"])
body["model"] = "llama3.2:latest"
return await generate_chat_completion(__request__, body, user)

説明​

  • むンポヌト:

    • Users from open_webui.models.users: ナヌザヌ情報を取埗するため。
    • generate_chat_completion from open_webui.utils.chat: 内郚ロゞックを䜿甚しおチャット補完を生成するため。
  • 非同期 pipe 関数:

    • パラメヌタ:
      • body: モデルぞの入力デヌタ。
      • __user__: ナヌザヌ情報を含む蟞曞。
      • __request__: generate_chat_completion に必芁な FastAPI のリク゚ストオブゞェクト。
    • 凊理:
      1. ナヌザヌオブゞェクトの取埗: ナヌザヌの ID を䜿甚しおナヌザヌオブゞェクトを取埗したす。
      2. モデルの蚭定: 䜿甚するモデルを指定したす。
      3. 補完の生成: generate_chat_completion を呌び出しお、入力を凊理し、出力を生成したす。

重芁な泚意点​

  • 関数の眲名: 正確な関数の眲名ずパラメヌタに぀いおは、最新の Open WebUI コヌドベヌスやドキュメントを参照しおください。
  • ベストプラクティス: 䟋倖や゚ラヌを適切に凊理しお、スムヌズなナヌザヌ䜓隓を提䟛しおください。

よくある質問​

Q1: Open WebUI で Pipes を䜿甚する理由は​

A: Pipes を䜿甚するず、独自のロゞックずプロセスを持぀新しい「モデル」を Open WebUI に远加できたす。カスタム機胜を統合したり、モデルの挙動をカスタマむズしたりする柔軟なプラグむンシステムを提䟛し、コアコヌドベヌスを倉曎せずに革新的な機胜を䜜成できたす。


Q2: Valves ずは䜕ですか そしおそれはなぜ重芁ですか​

A: Valves は Pipe の蚭定可胜なパラメヌタであり、蚭定や制埡のように機胜したす。Valves を調敎するこずで、Pipe の動䜜を倉曎するこずができたす。これは、基瀎ずなるコヌドを倉曎せずに行えたす。


Q3: Valves を䜿甚せずに Pipe を䜜成できたすか​

A: はい、氞続的な蚭定オプションを必芁ずしない Pipe の堎合は Valves クラスを定矩せずに簡易的な Pipe を䜜成できたす。ただし、Valves を含めるこずで柔軟性や将来の拡匵性が向䞊したす。


Q4: APIキヌを䜿甚する堎合、Pipe のセキュリティをどのように確保したすか​

A: APIキヌなどの機密情報を Pipe にハヌドコヌドしないでください。代わりに Valves を䜿甚しお APIキヌを安党に入力および保存しおください。これらのキヌを適切に凊理し、ログや公開を避けるようにしおください。


Q5: pipe 関数ず pipes 関数の違いは䜕ですか​

A:

  • pipe 関数: 入力デヌタを凊理し、出力を生成する䞻芁な関数。単䞀のモデルのロゞックを扱いたす。

  • pipes 関数: 耇数のモデルを衚すために䜿甚でき、それぞれのモデル定矩をリストずしお返したす。各モデルが Open WebUI に個別に衚瀺されたす。


Q6: Pipe の䞭で゚ラヌをどのように凊理したすか​

A: pipe および pipes 関数内で try-except ブロックを䜿甚しお䟋倖をキャッチしたす。意味のある゚ラヌメッセヌゞを返すか、゚ラヌを適切に凊理しお、ナヌザヌに䜕が問題だったのかを䌝えたす。


Q7: Pipe の䞭で倖郚ラむブラリを䜿甚できたすか​

A: はい、必芁に応じお倖郚ラむブラリをむンポヌトしお䜿甚できたす。䟝存関係が適切にむンストヌルされ、環境内で管理されおいるこずを確認しおください。


Q8: Pipe をどのようにテストしたすか​

A: Open WebUI を開発環境で実行し、むンタヌフェヌスからカスタムモデルを遞択しお Pipe をテストしおください。さたざたな入力ず蚭定で Pipe が期埅通りに動䜜するかを怜蚌したす。


Q9: Pipe のコヌドを敎理するためのベストプラクティスはありたすか​

A: はい、以䞋のガむドラむンに埓っおください:

  • Valves を Pipe クラスの䞊郚に眮く。
  • 䞻に self.valves を __init__ メ゜ッドで初期化する。
  • __init__ メ゜ッドの埌に pipe 関数を眮く。
  • 明確で説明的な倉数名を䜿甚する。
  • コヌドにコメントを远加しお明確にする。

Q10: 最新の Open WebUI ドキュメントはどこにありたすか​

A: 公匏の Open WebUI リポゞトリたたはドキュメントサむトを蚪問しお、最新情報、関数の眲名、䟋、および倉曎がある堎合の移行ガむドを確認しおください。


結論​

これたでの説明で、Open WebUI で Pipes を䜜成しお䜿甚する方法に぀いおの包括的な理解が埗られたはずです。Pipes は、Open WebUI の機胜を拡匵およびカスタマむズし、特定のニヌズに適応させるための匷力な手段を提䟛したす。倖郚APIを統合したり、新しいモデルを远加したり、耇雑なロゞックを泚入したりする堎合でも、Pipesはそれを柔軟に実珟したす。

芚えおおいおください:

  • Pipe クラスで明確で䞀貫した構造を䜿甚する。
  • 構成可胜なオプションに Valves を掻甚する。
  • ゚ラヌを適切に凊理し、ナヌザヌ䜓隓を向䞊させる。
  • 最新のドキュメントを参照しおください 曎新や倉曎がある堎合がありたす。

楜しいコヌディングをそしお、Pipesを䜿っおOpen WebUIを拡匵するのを楜しんでください