Hayhooks について
Hayhooksは、HaystackのパイプラインやエージェントをREST、OpenAI互換チャット、MCPツール、A2Aインターフェースとして提供する開発者向けツールです。Redisによるチェックポイント保存と実行トレースにも対応します。
主な機能
- 01パイプラインとエージェントをREST APIとしてデプロイ
- 02OpenAI互換のチャットエンドポイントを提供
- 03MCPツールとA2Aエージェントを公開
- 04Redisのチェックポイントで長時間処理を再開
- 05実行状況とコンポーネントのトレースを確認
活用シーン
- 01Haystackパイプラインを型付きHTTPエンドポイントとして公開
- 02チャットインターフェースにストリーミング応答を提供
- 03MCPクライアントからパイプラインやエージェントを呼び出す
- 04処理を人間の承認待ちにし、再起動後に再開
MCP 対応
MCPサーバーを起動し、Haystackのパイプラインやエージェントをツールとして公開できます。CursorやClaude DesktopなどのMCPクライアントが利用できます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
Hayhooks
Haystack のパイプラインとエージェントを API として提供します。
REST API、OpenAI 互換チャット、MCP ツール、A2A エージェントに対応し、永続的な実行とトレース機能を組み込んでいます。
パイプラインとエージェントを提供する
パイプラインまたはエージェントをラップする Python コードを記述します。必要なインターフェースと実行時機能を選択できます。
- REST API。 Python ラッパーまたは YAML パイプラインを、OpenAPI ドキュメント、ファイルアップロード、カスタムルートに対応した、型付け済みで検証可能なエンドポイントとしてデプロイできます。
- OpenAI 互換 API。 ストリーミング対応の Chat Completions および Responses エンドポイントを提供します。Open WebUI に接続するか、組み込みの Chainlit UI を使用できます。
- MCP サポート。 パイプラインとエージェントを、Cursor、Claude Desktop、その他の Model Context Protocol クライアント向けのツールとして公開する MCP サーバーを実行できます。
- A2A サポート。 チャット対応のパイプラインとエージェントを Agent2Agent プロトコル経由で公開できます。エージェントの検出とタスクの委任に使うエージェントカードも生成されます。
- 永続的な実行。 長時間実行する処理を Redis にチェックポイントとして保存し、人間による承認を待機したり、失敗時に再試行したり、再起動後に復旧したりできます。
- トレースと可観測性。 ターミナルダッシュボードで実行内容とコンポーネントのトレースを確認するか、
hayhooks[tracing]を使ってスパンを OpenTelemetry バックエンドにエクスポートできます。
ターミナルダッシュボード
ターミナルでデプロイ状況を確認し、実行を追跡し、処理の遅いコンポーネントを見つけることができます。
デモデータを使用した実際のターミナル UI です。 ダッシュボードを見る。
クイックスタート
Haystack エージェントを、型付けされた HTTP エンドポイント経由で提供します。Python 3.10~3.14 と OpenAI API キーが必要です。
インストールして起動する
Python 環境に Hayhooks をインストールし、サーバーを起動する前に API キーを設定します。
pip install hayhooks
export OPENAI_API_KEY="your-api-key"
hayhooks run
サーバーは起動したままにしてください。以下のコマンドは別のターミナルで実行します。
エージェントを作成する
my_agent_dir という名前のディレクトリを作成し、次の内容を my_agent_dir/pipeline_wrapper.py として保存します。
from haystack.components.agents import Agent
from haystack.components.generators.chat import OpenAIResponsesChatGenerator
from haystack.dataclasses import ChatMessage
from haystack.tools import tool
from hayhooks import BasePipelineWrapper
@tool
def search(query: str) -> str:
"""Search the knowledge base."""
return f"This is a demo tool."
class PipelineWrapper(BasePipelineWrapper):
def setup(self) -> None:
self.pipeline = Agent(
chat_generator=OpenAIResponsesChatGenerator(model="gpt-4o-mini"),
tools=[search],
)
async def run_api_async(self, question: str) -> str:
result = await self.pipeline.run_async(messages=[ChatMessage.from_user(question)])
return result["last_message"].text
Hayhooks はメソッドの型ヒントを使ってリクエストを検証し、API スキーマを生成します。
デプロイと実行
hayhooks pipeline deploy-files -n my_agent ./my_agent_dir
curl http://localhost:1416/my_agent/run \
-H 'Content-Type: application/json' \
-d '{"question": "What can you do?"}'
応答にはエージェントの回答が含まれます。API ドキュメントを開いて、エンドポイントを確認し、試してみてください。
ストリーミングチャットを追加する
run_chat_completion_async を実装して、OpenAI 互換の Chat Completions API を通じてエージェントを公開します。
pipeline_wrapper.py の先頭に、次のインポートを追加します。
from collections.abc import AsyncGenerator
from hayhooks import async_streaming_generator
次のメソッドを PipelineWrapper 内に追加します。
async def run_chat_completion_async(
self, model: str, messages: list[dict], body: dict
) -> AsyncGenerator[str, None]:
return async_streaming_generator(
pipeline=self.pipeline,
pipeline_run_args={
"messages": [ChatMessage.from_openai_dict_format(m) for m in messages],
},
)
ラッパーを再デプロイし、ストリーミング応答をリクエストします。
hayhooks pipeline deploy-files -n my_agent ./my_agent_dir --overwrite
curl -N http://localhost:1416/chat/completions \
-H 'Content-Type: application/json' \
-d '{
"model": "my_agent",
"messages": [{"role": "user", "content": "What can you do?"}],
"stream": true
}'
応答はサーバー送信イベントとして届きます。Open WebUI に接続するか、組み込み Chainlit UI を使ってエージェントとチャットします。
ダッシュボードで実行を確認する
macOS または Linux では、サーバーと同じ OS アカウントで、2 つ目のターミナルからダッシュボードを開きます。
pip install "hayhooks[tui]"
hayhooks dashboard
実行には e、トレースには v を押し、詳細を表示するには Enter を押します。ローカルでのキャプチャはデフォルトで有効です。最近の通常の実行は、サーバーが再起動するか、バッファから削除されるまで利用できます。
Windows またはリモートアクセスの場合は、ダッシュボード接続ガイドに従ってください。外部の OpenTelemetry バックエンドにスパンをエクスポートするには、トレーシングと OpenTelemetry を参照してください。
永続実行
リクエストの存続期間を超えて処理を実行します。Hayhooks はパイプラインとエージェントを Redis にチェックポイントとして保存するため、再起動後に別のワーカーが処理を再開できます。
人間の承認を得るために実行を一時停止したり、失敗を再試行したり、任意のレプリカから出力ストリームに再接続したりできます。
stateDiagram-v2
direction LR
[*] --> queued: submit (202)
queued --> running: worker claims
running --> waiting: suspend for a human
waiting --> queued: resume
running --> queued: retry or crash recovery
running --> completed
running --> failed
running --> canceled
人間の承認を得てエージェントを実行する
この例では、デモ用の検索ツールを呼び出す前に承認を待ちます。ラッパーを pipelines/research_agent/pipeline_wrapper.py として保存します。
from haystack.components.agents import Agent
from haystack.components.generators.chat import OpenAIResponsesChatGenerator
from haystack.dataclasses import ChatMessage
from haystack.tools import tool
from pydantic import BaseModel
from hayhooks import BasePipelineWrapper, DurableContext
@tool
def search(query: str) -> str:
"""Search the knowledge base."""
return f"Hayhooks serves Haystack pipelines and agents; results for {query!r}."
class Task(BaseModel):
question: str
class Approval(BaseModel):
approved: bool
class Report(BaseModel):
answer: str
class PipelineWrapper(BasePipelineWrapper):
durable_revision = "research-agent-v1" # compatibility key for persisted inputs and checkpoints
durable_resume_model = Approval # typed input for human-in-the-loop waits
def setup(self) -> None:
generator = OpenAIResponsesChatGenerator(model="gpt-4o-mini")
self.pipeline = Agent(chat_generator=generator, tools=[search])
async def run_durable_async(self, context: DurableContext, task: Task) -> Report:
# Persist the wait in Redis so a worker serving this revision can resume it.
if not context.state.get("approved"):
decision = context.resume_input # consumed on first read
if decision is None:
await context.suspend({"kind": "approval", "message": f"Research {task.question!r}?"})
if not Approval.model_validate(decision).approved:
raise ValueError("research was rejected")
context.state["approved"] = True
# Agent state is checkpointed after tool calls: recovery continues the loop.
result = await context.run_agent_async(messages=[ChatMessage.from_user(task.question)])
return Report(answer=result["last_message"].text)
クイックスタートサーバーがまだ実行中の場合は停止します。追加パッケージをインストールし、Redis を起動して、永続モードでパイプラインディレクトリを提供します。
pip install "hayhooks[durable]"
docker run -d -p 6379:6379 redis
export OPENAI_API_KEY="your-api-key"
HAYHOOKS_DURABLE_MODE=true hayhooks run --pipelines-dir ./pipelines
2 つ目のターミナルで、実行を送信します。
curl -i http://localhost:1416/research_agent/run-durable \
-H 'Content-Type: application/json' -d '{"question": "What does Hayhooks do?"}'
サーバーは実行 ID とリンクを含む 202 Accepted を返します。以下の EXECUTION_ID をその ID に置き換えて、実行のステータスを確認します。
curl http://localhost:1416/research_agent/executions/EXECUTION_ID
ステータスが waiting のときに、復旧をテストできます。サーバーを停止し、同じコマンドで再起動してください。再起動後も待機状態は保持されます。
復旧には、同じリビジョンを提供するワーカーが必要です。互換性のない変更をデプロイするときは、処理が完了するまで古いリビジョンを稼働させてください。リビジョンの互換性を参照してください。
実行を承認し、出力を追跡します。
curl -X POST http://localhost:1416/research_agent/executions/EXECUTION_ID/resume \
-H 'Content-Type: application/json' -d '{"approved": true}'
curl -N http://localhost:1416/research_agent/executions/EXECUTION_ID/stream
チェックポイントの動作については永続実行ガイドを、デプロイと復旧については運用ガイドをお読みください。同じエンジンを任意の FastAPI アプリに組み込むこともできます。
次のステップ
- クイックスタートガイド - Hayhooks を始める
- インストール - Hayhooks と依存関係をインストールする
- 設定 - ニーズに合わせて Hayhooks を設定する
- ターミナルダッシュボード - デプロイ、実行、コンポーネントのトレースを確認する
- 永続実行 - リクエストを超えてパイプラインとエージェントを実行する
- 例 - 実装例を見る
コミュニティとサポート
- GitHub: deepset-ai/hayhooks
- イシュー: GitHub Issues
- ドキュメント: 全ドキュメント
Hayhooks は deepset チームによって積極的にメンテナンスされています。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。
