Pyspurとは?

Pyspurは、ビジュアルなノードベース環境を提供することで、AIエージェントの開発を加速するために設計されたオープンソースプラットフォームです。ドラッグアンドドロップのキャンバス上でモジュラーコンポーネントを接続することにより、エンジニアは複雑なAIワークフローを構築、デバッグ、デプロイできます。
Drag & Drop to build AI Agents.
— Shubham Saboo (@Saboo_Shubham_) December 19, 2024
And deploy to API in one click with Nocode.
100% Opensource. pic.twitter.com/iPEJEzIHVI
Pyspurが解決する核となる問題は、AI開発によく見られる透明性の欠如と遅いイテレーションサイクルです。「プロンプト地獄」や「ワークフローの盲点」に対処するため、エージェントのロジックの各ステップの入力と出力をリアルタイムで検査することを可能にします。このプラットフォームには、Retrieval-Augmented Generation (RAG)のような高度なパターンに対する組み込みサポートが含まれており、人間が介入できるブレークポイントを許可し、あらゆるワークフローをワンクリックで本番環境対応のAPIとしてデプロイできます。最終的に、Pyspurはエンジニアがより信頼性が高く、デバッグ可能なAIシステムをより速く構築するのに役立ちます。
最大限の生産性で開発チームが共同作業できる統合されたオールインワンプラットフォームをお探しですか?
Apidogはあなたのすべての要求に応え、Postmanをはるかに手頃な価格で置き換えます!
We’re thrilled to share that MCP support is coming soon to Apidog! 🚀
— Apidog (@ApidogHQ) March 19, 2025
Apidog MCP Server lets you feed API docs directly to Agentic AI, supercharging your vibe coding experience! Whether you're using Cursor, Cline, or Windsurf - it'll make your dev process faster and smoother.… pic.twitter.com/ew8U38mU0K
始めましょう!
1. 環境設定
あなたの目的に最適な設定オプションを選択してください。ローカル開発や実験には、pip
インストールで十分です。スケーラブルなシステムや本番システムには、専用のPostgreSQLインスタンスを備えた再現可能なコンテナ化環境を提供するDockerベースの設定が推奨されます。
オプションA: ローカルpip
インストール
前提条件: Python 3.11+
PyPIからのインストール:
pip install pyspur
プロジェクトディレクトリの初期化: このコマンドは、設定用の.env
ファイルを含むプロジェクトのひな形を作成します。
pyspur init my-pyspur-project && cd my-pyspur-project
サーバーの起動: --sqlite
フラグは、PyspurにローカルのSQLiteデータベースを使用するように指示し、別のデータベースサーバーへの依存関係を排除します。
pyspur serve --sqlite
UIへのアクセス: ブラウザでhttp://localhost:6080
に移動します。
オプションB: Docker設定
前提条件: Docker Engine
設定スクリプトの実行: このコマンドは、Pyspurリポジトリをクローンし、docker-compose.dev.yml
ファイルを構成し、アプリケーションスタック(フロントエンド、バックエンド、データベース)を起動するシェルスクリプトをダウンロードして実行します。
curl -fsSL https://raw.githubusercontent.com/PySpur-com/pyspur/main/start_pyspur_docker.sh | bash -s pyspur-project
UIへのアクセス: http://localhost:6080
に移動します。
2. Pyspurでワークフローを構築しましょう
ゼロから構築する代わりに、既存のPyspurテンプレートをロードして分析します。このアプローチにより、非自明なワークフローを現実的に見ることができます。
テンプレートのロード:
- Pyspurダッシュボードで、「New Spur」をクリックします。
- 表示されるモーダルで、「Templates」タブを選択します。
- 「Joke Generator」テンプレートを選択します。キャンバスに事前構築済みのワークフローが読み込まれます。
ワークフロー分析:
このワークフローは、ジョークを生成し、それを洗練するように設計されています。これは、LLMプロンプトをN回実行し、別のLLM呼び出しを使用してN個の出力を評価し、最適なものを選択する高度なコンポーネントであるBestOfNNode
を使用します。
joke_generator.json
で定義されている主要なノードを分解してみましょう。
input_node
(InputNode
): このノードはワークフローのエントリポイントを定義します。
config.output_schema
:{ "topic": "string", "audience": "string" }
- これは、ワークフローがジョークの
topic
とその対象audience
という2つの文字列入力を必要とすることを指定します。
JokeDrafter
(BestOfNNode
): これはジョーク作成の最初の段階です。
config.system_message
:"You are a stand-up comedian who uses dark humor like Ricky Gervais or Jimmy Carr..."
config.user_message
:"Your audience is: {{input_node.audience}}\nThe topic should be about {{input_node.topic}}"
- このJinja2テンプレートは、
input_node
からのデータを動的に挿入します。 config.samples
:10
- これは、ノードに10個のジョークドラフトを生成するように指示します。
config.rating_prompt
:"Rate the following joke on a scale from 0 to 10..."
- 10個のジョークを生成した後、このプロンプトを使用してLLMに各ジョークを評価させます。ノードは次に最も評価の高いジョークを選択します。
config.output_schema
:{ "initial_joke": "string" }
- ノードの出力は単一の文字列です。10個のサンプルから選ばれた最高のジョークです。
JokeRefiner
(BestOfNNode
): このノードは、ドラフトされたジョークを受け取り、それを改善します。
config.system_message
:"Your goal is to refine a joke to make it more vulgar and concise..."
config.user_message
:{{JokeDrafter.initial_joke}}
- 重要なのは、このノードの入力が
JokeDrafter
ノードの出力であることです。 config.samples
:3
- 最初のジョークの洗練されたバージョンを3つ生成します。
- また、評価プロンプトを使用して、3つの洗練されたジョークの中から最適なものを選択します。
config.output_schema
:{ "final_joke": "string" }
リンク: JSONのlinks
配列はデータフローを定義します。input_node
-> JokeDrafter
-> JokeRefiner
.
実行と検査:
- 右側のテストパネルで、事前に設定されたテスト入力を使用するか、独自の入力を作成します(例: Topic: "AI assistants", Audience: "Developers")。
- Runをクリックします。
- ワークフローの実行中に、
JokeDrafter
ノードをクリックします。そのrun_data
を検査できます。これには、生成された10個のサンプルすべてとそれに対応する評価が表示され、エージェントの「思考プロセス」を透過的に見ることができます。 - 最終的な洗練されたジョークは、
JokeRefiner
ノードの出力で利用可能になります。
3. RAGパイプラインの実装
ジョークジェネレーターの一部ではありませんが、Retrieval-Augmented Generation (RAG)はPyspurの重要な機能です。エージェントに知識を追加するための技術的なプロセスは次のとおりです。
- ドキュメント取り込み(コレクション): RAGセクションに移動します。「Document Collection」を作成し、ファイルをアップロードすると(例: PDF)、Pyspurはドキュメントをテキストに解析し、トークン長に基づいて構成可能なチャンクに分割し、これらのチャンクをソースメタデータとともにデータベースに保存するバックエンドプロセスを開始します。
- ベクトル化(インデックス): コレクションから「Vector Index」を作成すると、別のプロセスがトリガーされます。Pyspurは各テキストチャンクを繰り返し処理し、指定された埋め込みモデル(例: OpenAIの
text-embedding-ada-002
)へのAPI呼び出しを行ってベクトル表現を取得し、これらのベクトルを構成されたベクトルデータベース(例: ChromaDB, PGVector)にアップサートします。 - 検索(ワークフローノード): ワークフローでは、Retriever Nodeが特定のVector Indexを指すように構成されます。実行時には、その入力
query
が同じモデルを使用して埋め込まれ、ベクトルデータベースに対してセマンティック検索(近似最近傍探索)が実行され、最も関連性の高いテキストチャンクがフェッチされます。これらのチャンクは、コンテキストとして下流のLLMに渡されます。
4. 本番APIとしてのデプロイ
ワークフローが完成したら、それをセキュアなHTTPエンドポイントとして公開できます。
デプロイの開始: トップナビゲーションバーの「Deploy」ボタンをクリックします。
API呼び出しタイプの選択:
- ブロッキング(同期): 高速に実行されるワークフロー向け。クライアントは同じHTTPレスポンスで結果を受け取ります。
- エンドポイント:
POST /api/wf/{workflow_id}/run/?run_type=blocking
- ノンブロッキング(非同期): 長時間実行されるワークフロー(10回以上のLLM呼び出しを含むジョークジェネレーターなど)向け。クライアントはすぐに
run_id
を受け取り、結果を取得するために別のエンドポイントをポーリングする必要があります。これにより、クライアントのタイムアウトを防ぎます。 - 開始エンドポイント:
POST /api/wf/{workflow_id}/start_run/?run_type=non_blocking
- ステータスエンドポイント:
GET /api/runs/{run_id}/status/
アプリケーションとの統合:
デプロイモーダルはクライアントコードを生成します。POST
リクエストのボディは、initial_inputs
キーが入力ノードのtitle
と一致するキーを持つオブジェクトを含むJSONオブジェクトである必要があります。
Pythonクライアントの例(ジョークジェネレーター向け):
import requests
import json
import time
PYSUR_HOST = "http://localhost:6080"
WORKFLOW_ID = "your_workflow_id_here" # Get this from the deploy modal
# The keys in this dict must match the 'output_schema' of the input_node
payload = {
"initial_inputs": {
"input_node": {
"topic": "Python decorators",
"audience": "Senior Software Engineers"
}
}
}
# 1. Start the non-blocking run
start_url = f"{PYSUR_HOST}/api/wf/{WORKFLOW_ID}/start_run/?run_type=non_blocking"
start_resp = requests.post(start_url, json=payload)
run_id = start_resp.json()['id']
print(f"Workflow started with run_id: {run_id}")
# 2. Poll for the result
status_url = f"{PYSUR_HOST}/api/runs/{run_id}/status/"
while True:
status_resp = requests.get(status_url)
data = status_resp.json()
status = data.get("status")
print(f"Current status: {status}")
if status in ["COMPLETED", "FAILED"]:
print("Final Output:")
print(json.dumps(data.get("outputs"), indent=2))
break
time.sleep(2)
結論
Pyspurは、AIエージェント開発のための堅牢で透過的、かつ技術的に根拠のある環境を提供します。個々の操作をモジュラーノードに抽象化し、ビジュアルキャンバスを提供することで、エンジニアはエージェントの高レベルなロジックに集中できます。このプラットフォームの真の力は、深い検査可能性(データフローを追跡し、各コンポーネントのI/Oをデバッグできること)と、ビジュアルプロトタイプから本番環境対応APIへのシームレスな移行にあります。単純な単一呼び出しエージェントから、Best-of-NやRAGのようなパターンを利用する複雑な多段階ワークフローへの移行は、可能なだけでなく直感的です。Pyspurで構築することは、単にボックスを接続するだけでなく、信頼性が高く、デバッグ可能で、スケーラブルなAIシステムをエンジニアリングすることなのです。
最大限の生産性で開発チームが共同作業できる統合されたオールインワンプラットフォームをお探しですか?
Apidogはあなたのすべての要求に応え、Postmanをはるかに手頃な価格で置き換えます!