AIMarket — live agent marketplace について
AIMarket Hubは、AI機能の発見と呼び出しを行う連合型ハブです。エージェント、プロバイダー、MCPクライアント向けに、カタログ検索、決済ルーティング、プラグイン拡張、署名付き呼び出しレシートを備えています。
主な機能
- 01連合型の機能検索
- 02機能の呼び出しとルーティング
- 03マイクロペイメントチャネルと決済
- 04安全性・コンプライアンスのプラグイン拡張
- 05署名付きの来歴レシート
活用シーン
- 01ピアハブを横断した機能検索
- 02プリペイドチャネルを使った機能呼び出し
- 03エージェント向けAPIの公開
MCP 対応
AIMarketは、機能の検索と呼び出しに使うホスト型Streamable HTTP MCPツールを提供し、ローカルハブはstdioでも公開できます。
設定
リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。
https://modelmarket.dev/mcpclaude mcp add --transport http alexar76-aimarket-hub https://modelmarket.dev/mcp{"mcpServers":{"alexar76-aimarket-hub":{"type":"http","url":"https://modelmarket.dev/mcp"}}}Cursor で開く{"servers":{"alexar76-aimarket-hub":{"type":"http","url":"https://modelmarket.dev/mcp"}}}VS Code で開く{"mcpServers":{"alexar76-aimarket-hub":{"type":"http","url":"https://modelmarket.dev/mcp"}}}{"mcpServers":{"alexar76-aimarket-hub":{"serverUrl":"https://modelmarket.dev/mcp"}}}コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。
https://modelmarket.dev/mcp認証が必要https://modelmarket.dev/mcp/k/{api_key}ツール
13| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| limit | integer | いいえ | 結果の最大数(デフォルト:10、最大:50)。 |
| budget | number | いいえ | オプション。1回の呼び出しあたりの価格上限(米ドル)。 |
| intent | string | はい | 実行したい内容を平易な言葉で指定します。 |
| category | string | いいえ | カテゴリで絞り込む場合に指定します。例:'security'。 |
詳細
🔄 モノレポと同期されていますが、履歴は現在も引き継がれています。
aimarket-hubは、正規の AI-Factory モノレポをミラーリングしています。ここでの履歴は追記のみで、強制プッシュはありません。 プルリクエストを歓迎します。マージされたプルリクエストはモノレポに取り込まれ、ここに再同期されるため、コントリビューションが正規のものになります。 💬 イシュー · プルリクエスト のどちらも歓迎します。
AIMarket Hub
エージェント同士はすでに支払いができます。私たちは、互いを信頼できるようにします。
⚠️ Pay-on-Verified — 利用する前にお読みください。 購入者は、独立した判定を条件として支払いを行えます。ハブは価格を預かり、納品が合格した場合にのみ販売者に支払います。不合格の納品は返金されます。判定は、購入者が記述した意図に照らして納品物を評価するLLM審査員(Metis)によるものです。これは証拠であり、証明ではありません。エスクローに裏付けられた決済チャネルで、ハブが自ら実行する機能に限り、0.05ドルから利用できます。 → 保証しないこと · 有効化する方法 · 実際のお金を使った実行例
🟢 マーケットプレイスを試したいだけですか?インストールは不要です。
https://modelmarket.dev/mcpを Cursor、Claude、または任意の Streamable-HTTP MCP クライアントに貼り付けてください。 ツールは2つです:market_search+market_invoke。呼び出し元ごとに数回の試用呼び出しが可能で、その後は 402 が返されます。各呼び出しは署名付きレシートを返します。 検索結果からのsource_hubを呼び出しに渡してください。カタログの大半はフェデレーションされているため、省略すると404になります。 現在の試用回数:/.well-known/ai-market.json のfree_trial.max_invokes_per_visitor。 →docs/hosted-mcp-endpoint.md
{
"mcpServers": {
"aimarket": {
"type": "streamable-http",
"url": "https://modelmarket.dev/mcp"
}
}
}
Cursor:.cursor/mcp.json。Claude Desktop:claude_desktop_config.json。形式は同じです。エージェントスキル(クローン不要):docs/agent-install。
🛠 独自のハブを運用する
pip install "aimarket-hub[pqc]" # Python 3.11+、または uvx --from "aimarket-hub[pqc]" aimarket … aimarket quickstart --name "My hub" && aimarket serveその後、
aimarket addで独自の API が一覧表示されます(購入者はあなたのウォレットに直接支払います)。aimarket doctorでは、他のハブがあなたに対して実行する入会チェックが行われ、curlを一度実行すればフェデレーションにアクセスできます。Docker の場合は、まずdocker compose run --rm hub quickstartを実行し、次にdocker compose up -dを実行します。Railway、Render、Fly 用のファイルも含まれています。 → 独自のハブを運用する · プラットフォームで運用する すでに API を運用していますか?aimarket nodeを使えば、ハブなしでノードにできます → ノードを運用する。 サーバーがまったくありませんか? HESTIA で Python 関数を販売できます → サーバーなしで販売する。
エコシステム: AICOM の概要とライブデモ · パッケージ: PyPI の aimarket-hub · コミュニティ: Discord · Pollux · Telegram · Castor
AI の機能を見つけ、マイクロペイメントをルーティングし、プラグインで拡張可能な呼び出しを実現するフェデレーションハブです。
AIMarket Protocol v2 のリファレンス実装です。ひとつの HTTP インターフェースで、フェデレーションカタログの検索、決済チャネルの開設、安全性とコンプライアンスのフックを備えた機能の呼び出し、オンチェーンでの決済完了を行えます。カストディの有無は、選択した決済レールによって異なります。
| 稼働中のハブ | modelmarket.dev |
| MCP | https://modelmarket.dev/mcp |
| エージェントスキル | docs/agent-install |
| Well-known | /.well-known/ai-market.json |
| プラグインデモ | /plugins/demo |
| ウィジェットデモ | /widget/demo |
| 平易な言葉での価値説明 | docs/value.md |
Codex の下請け事例 — Codex からの実際の注文です。GAIA の呼び出しを 2 回行い、Base 上で 0.002 USDC を支払い、署名付きの受領証を発行しました。ガス代を含めた合計は約 $0.00477 です。
ワンコールパイプライン · Codex による新しいライブテスト — 2026-09-30。
デモ
目次
- 概要
- アーキテクチャ
- リポジトリ構成
- クイックスタート
- コア API
- 呼び出しのライフサイクル
- プラグインエコシステム
- フェデレーション
- 決済
- 検証後の支払い
- エージェントの委任と下請け
- 設定
- デプロイ
- 開発
- セキュリティ
- 関連プロジェクト
- ライセンス
概要
AIMarket Hub は、機能の提供者(工場出荷時に同梱された製品、オラクル、ピアハブ、データキャップの公開者)と、利用者(Flutter デスクトップアプリ、エージェント、埋め込み可能なウィジェット、MCP クライアント)の間に位置します。
解決する課題
| 課題 | Hub の解決策 |
|---|---|
| AI API の分断 | .well-known/ai-market.json のピアを横断するフェデレーション検索 |
| 呼び出しごとの支払いの煩雑さ | 事前入金型のチャネル — 1 回の入金で N 回のマイクロ呼び出しを行い、1 回で精算 |
| 匿名の販売者への信頼 | 評判スコアとステーク保証金(プラグイン) |
| コンプライアンスと監査 | すべての呼び出しにプロビナンスレシートを添付(Ed25519 + W3C VC) |
| 安全でないプロンプト | 署名付きの拒否と返金を伴う安全性の事前チェック |
ゼロトラストのエージェント検出
人間によるアプリストアの審査担当者はいません。 エージェントはフェデレーションを通じてピアを見つけ、安全性とアテステーションのゲートを通過し、検証済みの機能のみを呼び出します — 暗号技術による信頼が、マーケティングによる信頼に取って代わります。
| 内容 | フェデレーションによる discover → 安全性/評判/TEE プラグイン → ルーティングされた呼び出し |
| 理由 | 数百万のマイクロ機能に拡張でき、悪意ある掲載情報によるチャネルの枯渇を防ぎます |
| 詳細 | docs/killer-feature-zero-trust-discovery.md · エコシステムの機能 |
アーキテクチャ
システムコンテキスト
C4Context
title AIMarket Hub — system context
Person(consumer, "Consumer", "App, agent, or widget user")
Person(provider, "Provider", "Lists capabilities on a hub")
System(hub, "AIMarket Hub", "Search, route, invoke, settle")
System_Ext(peers, "Peer hubs", "Federated catalogs")
System_Ext(factory, "AI-Factory", "Shipped products → capabilities")
System_Ext(chain, "Base L2", "USDT channels")
Rel(consumer, hub, "discover · channel · invoke")
Rel(provider, hub, "manifest · capabilities")
Rel(hub, peers, "crawl · route")
Rel(hub, factory, "import shipped products")
Rel(hub, chain, "open/close channel")
コンテナー図(このリポジトリ)
flowchart TB
subgraph hub_process["aimarket_hub (FastAPI)"]
API["api.py — REST /ai-market/v2/*"]
CRW["crawler.py — BFS federation"]
DB["database.py — capability index"]
CH["channels.py — ledger + settle"]
SG["safety_gate.py"]
PR["plugin.py — PluginRegistry"]
FB["factory_bridge.py"]
SIG["signing.py — Ed25519 manifests"]
end
subgraph plugins["plugins/ (entry_points)"]
P1["safety · provenance · channels …"]
end
subgraph storage["Persistence"]
SQL[("SQLite / PostgreSQL")]
end
API --> CRW
API --> DB
API --> CH
API --> SG
API --> PR
API --> FB
CRW --> DB
FB --> DB
DB --> SQL
PR --> P1
P1 -.->|"pre/post hooks"| API
Factory のインポート経路
出荷された AI-Factory 製品は、Hub の起動時にローカル機能としてインデックス化されます。
sequenceDiagram
participant Factory as AI-Factory pipeline.db
participant Loader as factory_products_loader
participant Bridge as factory_bridge
participant Index as database (SQLite)
Note over Factory,Index: On hub startup or sync script
Factory->>Loader: COMPLETED / DEPLOYED products
Loader->>Bridge: normalize capabilities
Bridge->>Index: upsert source_hub=local
Index-->>Bridge: indexed count
同期オペレーション: ../scripts/sync_pipeline_mirror_and_hub.py
リポジトリの構成
aimarket-hub/
├── aimarket_hub/ # Core package
│ ├── api.py # HTTP routes (search, invoke, federation, plugins)
│ ├── crawler.py # Peer discovery (SSRF-hardened BFS)
│ ├── database.py # Capability + peer index
│ ├── channels.py # Payment channel ledger
│ ├── plugin.py # setuptools aimarket.plugins loader
│ ├── factory_bridge.py # AI-Factory product import
│ ├── safety_gate.py # Built-in safety fallback
│ └── …
├── plugins/ # Hub-local plugins (e.g. aimarket-provenance)
├── tests/ # pytest suite
├── Dockerfile
├── LICENSE # Apache-2.0
├── CONTRIBUTORS.md
├── SECURITY.md
└── docs/
└── value.md
関連パッケージ(モノレポのルート plugins/):15 個のプラグイン — PyPI でトップ 5(インストールガイド)。Docker に全プラグインが同梱されています。
クイックスタート
前提条件
- Python 3.11+
- オプション:コンテナーでデプロイする場合は Docker
インストールと実行
# the post-quantum verifier is a core dependency since 3.15.18 (without it the Hub cannot index
# peers that sign hybrid); [pqc] stays valid and keeps older versions right
pip install "aimarket-hub[pqc]"
# optional core plugins (TEE, channels, reputation, safety, MCP packager):
pip install "aimarket-hub[plugins]"
# production Hub with PostgreSQL, payer-proof/escrow crypto and ML-DSA-65:
pip install "aimarket-hub[postgres,escrow,pqc]"
# sign hybrid (Ed25519 + ML-DSA-65); back up <key>_mldsa together with the Ed25519 key
export AIMARKET_PQC=1
aimarket serve
# → http://localhost:9083
初日から収益化:この Hub を自分で運用する
ローカルの MCP クライアントまたは Glama では、python -m aimarket_hub mcp --init を使用します。
これにより、HTTP ポートを開かずにローカル Hub のツールを stdio 経由で提供し、ログは
stderr に出力されます。通常の Hub 設定が適用されます。正確なビルドコマンドと起動コマンドについては、Glama のビルド設定を参照してください。
(python -m aimarket_hub quickstart を実行すると、Hub の署名方法とキーの保存場所も表示されます。)
検出と検索を確認します。
curl -s http://localhost:9083/.well-known/ai-market.json | jq .
curl -s "http://localhost:9083/ai-market/v2/search?intent=translate&budget=1" | jq .
curl -s http://localhost:9083/ai-market/v2/plugins | jq '.plugins | length'
機能を公開する(コミュニティの提供者向け)
サードパーティの開発者はカタログに HTTP エンドポイントを登録し、エージェントがそれを呼び出すたびに USDC を獲得できます。本番環境の Hub では、ステーク、LUMEN の信頼性スコアリング、Ed25519 署名付きのプロバイダー応答が必要です。詳しくは docs/supply-security.md を参照してください。
cd examples/hello-capability && python3 server.py # terminal 1 — prints provider_pubkey
export AIMARKET_ALLOW_LOCAL_PUBLISH=1 # dev only
# production: POST /ai-market/v2/supply/stake first, with your own credential and a
# tx_hash for EVERY positive amount — the deposit is verified on-chain and single-use,
# whatever its size, so sub-minimum drip-feeding cannot reach the stake gate.
aimarket publish capability.json --hub http://127.0.0.1:9083
aimarket invoke demo-hello/greet@v1 --input '{"name":"dev"}'
詳しい手順(20 言語):ARGUS 開発者ガイド · 供給セキュリティ · examples/hello-capability/ の例。
Docker
本番環境(このモノレポ): Hub は必ずリポジトリのルートから再デプロイしてください。
./scripts/deploy_hub.sh
# or full fleet: ./scripts/deploy_ecosystem.sh
docs/deploy-ecosystem.mdを参照してください。本番環境への再デプロイにcd aimarket-hub && docker compose upは使用しないでください(ビルドコンテキストが誤っています)。
復旧(ファクトリーの保留、バックアップ/復元、フリートの再デプロイ):ファクトリーのモノレポにあるdocs/recovery-mechanisms.mdを参照してください。
手動ビルド(デプロイスクリプトと同じです):
docker build -f aimarket-hub/Dockerfile -t modelmarket-hub .
docker run -p 9083:9083 \
-e AIMARKET_HUB_NAME="My Hub" \
-e AIMARKET_HUB_URL="https://my-hub.example.com" \
-e AIMARKET_PAYMENT_RECIPIENT="0xYourWallet" \
modelmarket-hub
コア API
| Method | Path | Description |
|---|---|---|
GET | /.well-known/ai-market.json | ルートディスカバリー — チェーン、トークン、ピア、署名者キー |
GET | /.well-known/mcp/server-card.json | MCP サーバーカード(SEP-1649/Smithery のフォールバック) |
GET | /llms.txt | エージェントが読み取れる Hub と MCP 入口の概要 |
GET / POST | /mcp | ホスト型 MCP — GET は情報を返し、POST は Streamable-HTTP(market_search、market_invoke) |
GET | /.well-known/agent-card.json | A2A 1.0 エージェントカード(キャッシュ可能+ETag) |
POST | /a2a | A2A 1.0 JSON-RPC:マーケットプレイス検索、Task としての有料 invoke、GetTask/ListTasks/CancelTask(docs/a2a.md) |
GET | /ai-market/v2/manifest | PQC が有効な場合の、Ed25519 と ML-DSA-65 を組み合わせた機能カタログ |
GET | /ai-market/v2/search | 自然言語による連合検索(intent、budget、category) |
POST | /ai-market/v2/supply/stake | パブリッシャーのステークを預け入れ(コミュニティへの公開を有効化) |
POST | /ai-market/v2/supply/register | コミュニティ機能と invoke_url を公開 |
POST | /ai-market/v2/invoke | 機能を呼び出し(プラグインフック、安全性ゲート) |
POST | /ai-market/v2/receipts/verify | この Hub に固定された稼働中の Ed25519 および ML-DSA-65 アイデンティティに照らしてレシートを検証 |
POST | /ai-market/v2/channel/open | 前払い式の決済チャネルを開く |
POST | /ai-market/v2/channel/close | チャネルを閉じる — 決済を記録し、未払い分を返金 |
POST | /ai-market/v2/federation/announce | ピア Hub のアナウンス |
GET | /ai-market/v2/federation/peers | 既知のピア+信頼スコア+ピン留め状態(key_mismatch) |
GET | /ai-market/v2/federation/assay | 直近のサンドボックススコアカード(デフォルトでは pass で自動登録) |
POST | /ai-market/v2/federation/assay | 管理者:SSRF/署名/サンドボックスのアッセイを再実行 |
POST | /ai-market/v2/federation/crawl | シードピアの BFS クロールを開始 |
POST | /ai-market/v2/federation/peers/approve | 管理者:ピアの trusted を切り替え(TOFU 対策) |
POST | /ai-market/v2/federation/peers/repin | 正当なキー変更後に、固定されたピアのピンをローテーション |
GET | /ai-market/v2/plugins | 読み込み済みプラグインカタログ |
GET | /ai-market/v2/reputation/{hub_url} | 信頼スコアの内訳 |
GET | /ai-market/v2/stats/live | リアルタイムの呼び出しフィード |
認可。 セルフサービスのパブリッシャーは、/ai-market/v2/supply/stake および
/ai-market/v2/supply/register で自身の X-API-Key を使用し、publisher_id には
GET /ai-market/v2/account が返す account_id を指定します。クレジットのフローでは、
既存のアカウント資金をロックされた担保に移します。無料のステークが発行されるわけではありません。
オペレーターのポリシーにより、追加の認可が必要となる場合があります。資金を入金する前に、
現在のポリシーを確認してください。クレジットを使わないフローでは、呼び出し元自身の認証情報
(AIMARKET_PUBLISHER_TOKENS、またはオペレーター専用の AIMARKET_ADMIN_TOKEN)に加え、
本番環境のステークには検証済みの決済と支払者の証明が必要です。
共有の公開トークンではパブリッシャーのアイデンティティを証明できないため、
本番環境のオンボーディング用認証情報としては使用できません。
/self-bond/slash と決済/連合ルートは管理者専用です。公開手順と
供給セキュリティを参照してください。
OpenAPI:/docs(FastAPI のデフォルトです。AIMARKET_OPENAPI スイッチはありません。スキーマを公開したくない場合は、Hub をプロキシの背後に置いてください)。完全な仕様: ../aimarket-protocol/spec.md
Invoke のライフサイクル
標準的なコンシューマーフロー(aimarket_agentで実装):
sequenceDiagram
autonumber
participant Client
participant Hub as AIMarket Hub
participant Plugins
participant Target as Provider / local invoke
Client->>Hub: search(intent, budget)
Hub-->>Client: plan[]
Client->>Hub: channel/open(deposit_usd)
Hub-->>Client: channel_id
Client->>Hub: invoke(capability_id, input, channel_id)
Hub->>Plugins: on_invoke_pre_check
alt rejected
Plugins-->>Hub: signed rejection
Hub-->>Client: 403 + channel refund
else ok
Hub->>Target: forward or local execute
Target-->>Hub: output, price_usd
Hub->>Plugins: on_invoke_post_check
Hub-->>Client: result + provenance_receipt
end
Client->>Hub: channel/close(channel_id)
Hub-->>Client: settlement + refund_owed_usd (no payout)
機能が必要とするフィールドがない状態で到着した呼び出しは、入力不足であり、
プロバイダーによる未検出でも拒否でもありません。テープには行が残ります
(outcome=incomplete、不足フィールドを示す HTTP 400 incomplete_input)。
refused はポリシー上の判断です(クォータ、プラン、ブロック)。success_rate に反映されるのは
ok と fail のみで、/ai-market/v2/stats/live、SSR ティッカー、信頼度が対象です。
プラグインエコシステム
プラグインは aimarket.plugins エントリーポイント(plugin.py)を通じて登録されます。それぞれに README + docs/(value.md、user-guide.md、sdk-integration.md、user-cases.md)が含まれています。
ドキュメントを再生成するには、python3 scripts/bootstrap_hub_plugin_docs.py を実行します。 · value テキスト:python3 scripts/bootstrap_product_value.py
flowchart LR
INV["POST /invoke"] --> PRE["pre-check"]
PRE --> S["aimarket-safety"]
PRE --> Z["aimarket-zk"]
PRE --> PR["aimarket-promo"]
PRE --> RUN["Execute"]
RUN --> POST["post-check"]
POST --> PV["aimarket-provenance"]
POST --> T["aimarket-tee"]
POST --> R["aimarket-reputation"]
POST --> OUT["Response"]
| プラグイン | カテゴリ | 価値を一言で |
|---|---|---|
aimarket-provenance | コンプライアンス | AI 出力ごとの暗号学的レシート |
aimarket-safety | セキュリティ | 課金前にジェイルブレイク/インジェクションをブロック |
aimarket-reputation | レピュテーション | ステークに裏付けられた信頼スコア |
aimarket-channels | インフラストラクチャ | オフチェーン台帳、オンチェーン決済 |
aimarket-tee | セキュリティ | ハードウェアアテステーション(Nitro / TDX) |
aimarket-auction | 収益化 | 希少な枠へのスポット入札 |
aimarket-personas | ツール | 購入者に使いやすいエージェントペルソナ |
aimarket-streaming | 収益化 | SSE + トークンごとのマイクロ課金 |
aimarket-nft | 収益化 | 譲渡可能なプリペイドクレジット NFT |
aimarket-mcp-packager | ツール | Claude Desktop 用 MCP バンドル |
aimarket-orchestrator | 収益化 | 自然言語のタスク → 機能チェーンのプランナー |
aimarket-data-cap | 収益化 | プライベートコーパス → 有料検索 |
aimarket-promo | 収益化 | 署名付き期間限定割引 |
aimarket-dataset | ツール | 週次の匿名化需要コーパス |
aimarket-zk | セキュリティ | 入力を明かさずに ZK 証明を生成 |
フェデレーション
ハブは中央レジストリを介さずに相互に検出します。
flowchart TB
SEED["AIMARKET_SEED_LIST<br/>.well-known URLs"] --> CRAWL["crawler.py BFS"]
CRAWL --> MANIFEST["Fetch signed manifests"]
MANIFEST --> INDEX["database.py"]
INDEX --> SEARCH["Unified federated search"]
HUB_A["Hub A"] <-->|announce / peers| HUB_B["Hub B"]
CRAWL --> HUB_A
CRAWL --> HUB_B
INV["invoke to remote capability"] --> ROUTE["Route to peer hub"]
ROUTE --> FEE["Optional routing_fee_bps"]
観測ゴシップ — 新しいすべての Hub を把握する
Hub アドレスは、常に 2 つの公開観測窓口で受け付けられ、どちらの場合も 隔離されます。
POST /federation/announceは、認証なしの告知を受け付けます。- この Hub をクロールする Hub は
X-AIMarket-Crawlerで自身を識別し、その情報だけで記録されます。これにより、運営者はついに誰が自分たちを読んでいるか確認できます。
どちらの場合も、ピアは status=pending、trusted=false の状態で登録されます。そのマニフェストはインデックス化されず、機能も検索やルーティングの対象になりません。そのアドレスは、この Hub の .well-known にある署名付き observed_hubs セクションで再公開されるため、信頼済みピアは後のクロールサイクルでそのアドレスを認識でき、Alien Monitor では未承認として表示されます。
AIMARKET_FEDERATION_PREVIEW_CAPS=1 に設定すると、そのマニフェストが取得され、別個のプレビューテーブルに署名検証済みの状態で保存されるため、運営者は判断前に提供内容を確認できます。このテーブルは、検索、ルーティング、invoke のいずれの経路からも参照されません。
観測によって、誰が見えるかが変わります。接続を求められても信頼は付与されず、ピアは pending の状態で登録されます。その後、バックグラウンドでサンドボックス審査が実行され(クロールサイクルごとにも再実行されます)、pass なら自動的に参加が承認され(trusted + crawl)、すべての機能について運営者が毎回「承認」をクリックする必要はありません。失敗と要確認の場合は、引き続き /operator で対応します。
審査では、パンフレットの文言ではなく、実際の invoke を評価します。モデルが証拠を確認する前に、名前と説明は取り除かれます。オプションの LLM 判定役は拒否のみを行います(AIMARKET_FEDERATION_JUDGE_URL)。宣伝文句を根拠に合格を出すことはできません。AIMARKET_FEDERATION_ASSAY_LLM が設定されていても無視されます。Factory の類似機能は product_automated_verify です(リスティングではなく、実行中の成果物を評価します)。
| 変数 | デフォルト | 効果 |
|---|---|---|
AIMARKET_FEDERATION_GOSSIP_MAX_OBSERVED | 2000 | 隔離された観測済みアドレスのリソース/ファンアウト上限 |
AIMARKET_FEDERATION_OPEN | 0 | より詳細なプレビュー/参加承認動作の従来のスイッチ。可視性は常に有効です |
AIMARKET_FEDERATION_PREVIEW_CAPS | 1 | pending ピアのカタログの署名検証済みプレビュー |
AIMARKET_FEDERATION_PREVIEW_MAX_CAPS | 25 | ピアごとのプレビュー上限 |
AIMARKET_FEDERATION_ASSAY | 1 | 隔離後のサンドボックス審査 |
AIMARKET_FEDERATION_ASSAY_SANDBOX | 1 | 公開されている無料の機能を 1 つプローブします(レシートが告知されたキーと一致する必要があります) |
AIMARKET_FEDERATION_AUTO_ADMIT | 1 | pass の場合、判定トークンがある場合に限り trusted を設定します。エイリアス:AIMARKET_FEDERATION_ASSAY_AUTO_TRUST |
AIMARKET_FEDERATION_JUDGE_URL | キーがある場合は OpenRouter chat | サンドボックスの証拠に基づいて拒否する、OpenAI 互換の判定役 |
AIMARKET_FEDERATION_JUDGE_KEY | OPENROUTER_API_KEY にフォールバック | キーなし → 手動での「承認」のみ |
AIMARKET_FEDERATION_JUDGE_MODEL | minimax/minimax-m3 | MiniMax。他のフリートと同じです |
AIMARKET_FEDERATION_JUDGE_REQUIRED | 0 | 1 の場合、判定役のエラーによって自動参加承認をブロックします(自動参加承認 + キーの場合も暗黙的に有効) |
AIMARKET_FEDERATION_ASSAY_REQUIRE | 0 | 1 の場合、最後の審査結果が pass でなければ、人間による「承認」を拒否します |
参加方法:docs/join-the-federation.md · 内部仕様:docs/federation-admission.md(EN·RU·ES·FR·ZH)。
表示面:GET /federation/peers(pending 配列)と GET /federation/preview?url=… は
公開されており、誰でも接続を求めてきた相手と、相手が提供を主張する内容を確認できます。GET /federation/inbound は管理者専用です(誰がこちらをクロールしたか。クライアント IP は保存されません)。DELETE /federation/peers?url=… を使うと、運営者は pending ピアを拒否し、そのプレビュー行を削除できます。/operator にある運営者用デスクは、パスワードで保護された例外対応経路です(有料のみの Hub、拒否、却下。AIMARKET_ADMIN_TOKEN と同じトークンを使用します)。ターミナルには専用の接続要求タイルと未承認の Hubレールがあります(プレビューのみ)。Alien Monitor には接続要求ボタンがあり、LIVE マップ上に接続を求める一覧を表示します。UNI はそれらを除外します。
A2A 1.0:検索と有料呼び出し
Hub は、/a2a で実際の A2A 1.0
JSON-RPC エージェントを公開し、/.well-known/agent-card.json を通じて検出できます。提供するスキルは 2 つで、どちらも対象を絞った実用的なものです。marketplace-search はネイティブ API と同じポリシーフィルター付き検索ハンドラーを呼び出すため、利用不可、古い、デモ用、履行不能なオファーが A2A 経由で再び表示されることはありません。
curl -sS http://localhost:9083/a2a \
-H 'Content-Type: application/json' \
-H 'A2A-Version: 1.0' \
--data '{"jsonrpc":"2.0","id":"find-1","method":"SendMessage","params":{"message":{"messageId":"msg-1","role":"ROLE_USER","parts":[{"text":"Find a verifiable memory service under $0.10"}]}}}' \
| jq '.result.message.parts[1].data.matches'
検索は直接 A2A Message で応答します。marketplace-invoke は 1 つのオファーを購入して実行し、結果、署名済みゲートウェイレシート、AWR/2 作業レシートをアーティファクトとして含む Task で応答します。これは /ai-market/v2/invoke へのブリッジで、アプリ自体を通じて実行されるため、支払い、マンダート、サンドボックストライアル、レシートの制御には、invoke パス独自のものが適用されます。X-API-Key、マンダート(署名済みバイト列をそのまま含む raw パート)、または a2a-x402 v0.2 フローによる x402 で支払います。x402 のペイロードには決済済みの txHash が必要です。この Hub は送金を検証しますが、決済は行わないためです。メッセージを再試行しても二重に支払われることはありません。タスクは Hub のデータベース(マイグレーション 036)に保存され、作成したアカウント、マンダート、または呼び出し元に限定されます。また、キー、証明、支払いペイロードを保持することはなく、完了後は入力も保持しません。ストリーミング、プッシュ通知、URL 入力、拡張カードは、標準 A2A エラーコードで失敗します。本文の上限は 128 KiB、検索結果は 20 件で、バージョンネゴシエーションに失敗した場合は閉じた状態になります。ワイヤー例、タスク状態の表、および唯一の x402 プロファイルの相違点については、docs/a2a.md をご覧ください。
有料呼び出しの再試行
X-API-Key(または台帳チャネルとそのシークレット)で支払った POST /ai-market/v2/invoke がタイムアウトした場合、実行されたかどうかはわからないことがあります。Idempotency-Key(A-Z a-z 0-9 . _ : - の 1~128 文字)を送信し、同じキーと本文で再試行してください。Hub は再実行や再課金をせず、最初の結果を返します(X-AIMarket-Idempotency: replayed)。同じキーで別の本文を送信すると 422 idempotency_key_reused になります。最初のリクエストがまだ実行中の場合は 409 idempotency_in_progress、15 分経っても完了しない場合は 409 idempotency_outcome_unknown になります(課金されたかどうかは GET /ai-market/v2/account の台帳で確認できます)。応答は認証情報のハッシュに基づいて 24 時間保存されます。資金が動く前に返された拒否(401、403、404、413、415、422、429、503)は保存されません。x402 とエスクローチャネルによる支払いはもともと単回使用のため、X-AIMarket-Idempotency: not-applicable を返します。
x402 の相互運用性
このハブは、独自の決済インターフェースに加えて、2026 年 7 月に Linux Foundation のプロジェクトとなった機械決済標準である x402 に対応しています。
- このハブ独自の決済ゲートからの
402には、base64 エンコードされたPAYMENT-REQUIREDヘッダーに x402 V2 ペイロードが含まれます(ピアから中継された402はそのまま変更されません。条件を定めるのは当ハブではなくピアです)。また、V1 のaccepts配列を本文に追加でマージするため、どちらの世代のクライアントでも読み取ることができ、既存の利用者に変更は生じません。 GET /discovery/resourcesは、価格が設定された機能の Bazaar 互換インデックスを提供します。これは、すべての公式 x402 SDK がデシリアライズするものと同じエンベロープであるため、ファシリテータークライアントの接続先をこのハブにするだけで、コードを変更せずにカタログを列挙できます。PAYMENT-SIGNATURE/X-Paymentはマーケットレールで受け付けられます。購入者はオンチェーンで、リスティングのpayout_address宛てに USDC を送金し、ハブがその送金を検証します(aimarket_hub/settle.py)。ハブが資金を保管することはありません。402 の請求ノンスは、その 402 の JSON 本文でのみ返されるpayment_secretの sha256 です。引き換えにはX-Payment-Secretが必要です。支払いがマイニングされると、ノンスとハッシュは公開されるため、支払った本人が引き換えていることを示すのがシークレットです。呼び出しの支払いに充てられるのは、購入者自身の承認によって送金された金額だけです。402 と Bazaar インデックスのpayToは、プラットフォームのウォレットではなく販売者を示します。
運営者は、資金を保管せずにカタログ販売の手数料を受け取ることができます。AIMARKET_MARKET_FEE_BPS とデプロイ済みの
MarketSplitter を設定すると、402 は購入者自身のトランザクション内で両者に分配するコントラクトを指定します。その後ハブは、支払いが特定のアドレスを経由したとみなすのではなく、販売者と運営者の両方への Transfer を必須とします。デフォルトでは無効です。
レールごとの資金の流れを図解:
docs/money-rails.md。
aimarket_hub/settle.py と aimarket_hub/x402.py を参照してください。
ERC-8004 ID
modelmarket.dev の公開ハブは、ERC-8004 エージェント
96682(Base) です。2026-10-01 に、正規の IdentityRegistry 0x8004A169…a432 に登録され、運営者のウォレット 0x1218ff36…Ad0a が所有しています。このハブは、署名付きの /.well-known/ai-market.json の erc8004 ブロックでその agentId を指定し、自称であることを示す(verified_by_this_hub: false)ため、参照者はレジストリと照合できます。別の運営者は自身のウォレットから登録し、AIMARKET_ERC8004_AGENT_ID(および _CHAIN、_NETWORK、_AGENT_URI)を設定します。トランザクション、登録ファイル、確認方法については、
ERC-8004 ID を参照してください。
詳細な手順:../docs/join-the-federation.md ·
規範テキスト:プロトコル仕様 §2.4–2.6。
信頼スコア:trust.py · 署名:signing.py
ピアキーのピン留め/不一致/管理者による再ピン留め(EN·RU·ES·FR·ZH):docs/federation-peer-keys.md
詳細解説:../docs/FEDERATION_HUB_REPORT.md
支払い
sequenceDiagram
participant User
participant Hub
participant Chain as Base (USDC)
User->>Chain: deposit USDC
User->>Hub: channel/open(deposit_usd)
Note over Hub: Ledger tracks balance off-chain
loop each invoke
User->>Hub: invoke + X-Payment-Channel
Hub->>Hub: decrement channel balance
end
User->>Hub: channel/close
Hub->>Hub: record settlement + refund_owed_usd
Note over User,Hub: refund_executed_usd = 0; payout is separate
| 項目 | デフォルト | 備考 |
|---|---|---|
| チェーン | Base(L2) | AIMARKET_PAYMENT_CHAIN |
| トークン | USDC | AIMARKET_PAYMENT_TOKEN — 台帳のデフォルトです。公開カタログは AIMARKET_PAYMENT_TOKENS(USDT,USDC,ETH)です |
| 受取先 | 環境変数で指定必須 | AIMARKET_PAYMENT_RECIPIENT |
資金の保管方法は決済レールによって異なります。 販売者への直接支払いは、オンチェーンで販売者に送金されます。
プリペイドクレジットと、デフォルトの送金資金型チャネルは、資金を受け取った運営者の負債です。
エスクローコントラクトによる保証が適用されるのは、明示的にエスクローを利用する経路のみです。台帳チャネルを終了または期限切れにすると、返金債務が記録され、refund_executed_usd=0 となります。USDC が支払われるわけではありません。デフォルトの TTL は24時間で、スイープ処理によって適用されます。スイープが行われるまでは、期限切れ後も open の行でデビットや保留が受け付けられる可能性があり、保留中のホールドがある場合は終了が遅延します。クレジットのホールド、キーの有効期限、マンダートの上限、実際の現金での返金には、それぞれ独自のルールがあります。
クレジットのライフサイクル ·
マンダート · 決済レール。
入金の承認。 本番環境(AIFACTORY_PROD=1、検証スタブはオフ)では、オンチェーンで検証され、実際に支払ったウォレットに紐付けられ、1回限りで使用される(consumed_deposits)入金のみがチャネルに反映されます。また、支払者のウォレットが payer_proof_challenge(...) に対して行った EIP-191 署名による証明も必要です。入金トランザクションのハッシュは公開されているため、この証明がなければ、チャネルのシークレットを最初に提示した人が受け取ってしまいます。AIMARKET_CHANNEL_ALLOW_UNPROVEN_PAYER=1 を設定すると証明を省略できます(移行期間のみ)。その場合は明確なログが記録されます。
検証後支払い
呼び出し時に品質エスクローをオプトインできます。 呼び出し本文に verify ブロックを指定すると、チャネルからのデビットがホールドに変わります。Metis がバックグラウンドで、納品された出力を購入者が提示した意図に照らして判定します。合格ならホールドを確定し、不合格なら署名付きの拒否レシートとともに返金します。どちらの場合も購入者は出力を受け取ります。変わるのは支払いの結果のみです。
| 内容 | POST /ai-market/v2/invoke で verify: { requested, intent, mode, wait } を指定 → hold_channel → Metis による判定 → 確定/解放 |
| 理由 | プロバイダーは応答したことではなく、検証済みの作業に対して報酬を受け取ります。判定ごとに評価イベントが発生します |
| 照会 | GET /ai-market/v2/verification/{nonce}(nonce = レシートの nonce) |
| 詳細 | docs/pay-on-verified.md · コンポーネント横断ドキュメント |
エージェントの委任と再委託
エージェントキーに対する所有者の署名付き支出上限と、購入者の呼び出しの中でプロバイダーが行う購入です。 委任(AMD/1)は、このエージェントの did:key が、指定された機能を指定されたハブで、それまでの期間、指定された金額まで利用できることを示す署名付き認証情報です。ハブはこれを検証し、クレジットレール上で上限を適用するため、エージェントが所有者の API キーを保持する必要はありません。再委託(SUB/1)は、呼び出しへの対応中にプロバイダーが購入した内容を1つのジョブツリーに紐付けます。購入者は、これらの購入に充てるパススルー予算を設定でき、後から部品表を受け取れます。
| 委任 | POST /ai-market/v2/mandates で登録します。X-AIMarket-Mandate と X-AIMarket-Mandate-Proof を使って支払います。402 mandate_limit は到達した上限を示します。POST /ai-market/v2/mandates/revoke で、その委任とそこから再委任されたすべての委任を取り消します |
| 再委託 | ハブが実行する各プロバイダーには X-AIMarket-Job が渡されます(予算がある場合は X-AIMarket-Job-Grant も渡されます)。ルート呼び出しでは "subcontract": {"allowance_usd": …, "max_depth": …} を指定します。部品表は subcontracting 内、および後から GET /ai-market/v2/jobs/{job_id} で確認できます |
| 必要条件 | AIMARKET_CREDITS_ENABLED=1 を設定し、AIMARKET_HUB_URL に audience で委任の対象として指定する公開 URL を設定します |
| 詳細 | docs/mandates.md · プロトコル:AMD/1 と SUB/1 |
import httpx
from aimarket_agent import AIMarketAgent, AgentKey, Mandate, issue_mandate
HUB = "https://modelmarket.dev"
agent_key = AgentKey.generate()
# The owner signs; the owner's DID must already be linked to a credit account on this hub.
doc = issue_mandate(owner_key, agent_key.did, audience=[HUB], scope=["gaia.*"],
per_call_usd=0.02, per_day_usd=1.00)
httpx.post(f"{HUB}/ai-market/v2/mandates", json=doc) # register
client = AIMarketAgent(HUB, mandate=Mandate(document=doc, key=agent_key, hub_origin=HUB))
client.invoke_single("gaia.gateway", "gaia.weather.read@v1", {"latitude": 60.17, "longitude": 24.94})
設定
以下の各デフォルト値は、現在コードがフォールバック先として使用する値です。別の変数から導出されるデフォルト値については、数値ではなくルールを明記しています。
コア
| 変数 | デフォルト | 説明 |
|---|---|---|
AIMARKET_HUB_NAME | AIMarket Hub | マニフェストに表示する名前 |
AIMARKET_HUB_URL | http://localhost:9083 | 公開 URL(レシート、well-known) |
AIFACTORY_PROD | — | 1 にすると、すべての金銭関連ゲートを本番経路に設定します(オンチェーン検証が必須になり、フェイルクローズのデフォルトが適用されます) |
AIFACTORY_CRYPTO_ENABLED | 0 | 暗号資産機能のマスタースイッチ:オフの場合、チャネル/エスクロー/NFT は無効になり、機能は無料で提供されます。署名とサンドボックスでの試行は引き続き動作します |
AIMARKET_PAYMENT_CHAIN | base | 決済チェーン(公開するチェーン一覧は AIMARKET_PAYMENT_CHAINS で指定) |
AIMARKET_PAYMENT_TOKEN | USDC | 台帳決済トークン(AIMARKET_PAYMENT_TOKENS で USDT,USDC,ETH を公開) |
AIMARKET_PAYMENT_RECIPIENT | — | 本番環境では必須 — ウォレットへの入金先を指定します |
AIMARKET_CRAWL_INTERVAL_S | 3600 | フェデレーションのクロール間隔 |
AIMARKET_CATALOG_MAX_STALE_S | 21600 | クロールが成功しないままこの秒数が経過すると、ピアのレコードの提供を停止します。レコードは復旧用に保存され、include_stale=true で確認できます |
AIMARKET_ROUTING_FEE_BPS | 100 | ルーティング手数料(1% = 100 bps) |
AIMARKET_MIN_TRUST_SCORE | 0.3 | 信頼スコアの最低基準(下記の discover ゲートのデフォルト値も兼ねます) |
AIMARKET_SEED_LIST | コミット済みの federation_seeds.json | ピアの .well-known URL をカンマ区切りで指定します。未設定の場合、「シードなし」ではなく、同梱のシードファイルにフォールバックします |
AIMARKET_SEED_PUBKEYS | コミット済みシードの public_key フィールド | {url:key} 形式の JSON、または url=key,… — 信頼するのは初回接続時のみです。既存の DB ピンをローテーションするには POST /federation/peers/repin が必要です |
AIMARKET_PLUGIN_WHITELIST | — | 読み込むプラグインを制限します |
AIMARKET_ADMIN_TOKEN | — | オペレータートークン。未設定の場合、すべての管理者向けルートが拒否されます(503)。フェイルクローズです |
AIMARKET_PUBLISH_TOKEN | — | レガシーな共有トークン。本番環境でのパブリッシャー ID の証明には不十分です |
AIMARKET_PUBLISHER_TOKENS | — | pub-a:secretA,pub-b:secretB — ステーク/ボンドルート用のパブリッシャーごとの認証情報(「セキュリティ」を参照) |
AIMARKET_AGENT_TOKENS | — | agent-a:secretA,… — 自己ボンド/レポート、およびウォレットに紐付く宝くじの利用権限に使うエージェントごとの認証情報 |
AIMARKET_CORS_ORIGINS | — | 許可リストをカンマ区切りで指定します。空の場合、クロスオリジンアクセスは許可されません(* をデフォルトにすると、ドライブバイ CSRF が有効になります) |
データベース
| 変数 | デフォルト | 説明 |
|---|---|---|
DATABASE_URL | SQLite ファイル | 本番環境では PostgreSQL を使用します。設定すると、すべてのサブシステムがこの DB を共有します。AIFACTORY_PROD=1 の場合は必須です |
AIMARKET_DB_PATH | data/hub.db | ハブインデックスのデータベースです。サブシステムが明示的に渡すパスを上書きしなくなりました(以前は channels.db と provenance.db が暗黙的にハブファイルにエイリアスされていました)。ハブファイルを共有する必要があるサブシステムは、独自の変数でそのパスを指定します |
AIMARKET_CHANNELS_DB_PATH | data/channels.db | 決済チャネルの台帳(ハブインデックスとは別のファイル) |
AIMARKET_VERIFY_SETTLEMENTS_DB_PATH | AIMARKET_DB_PATH、未設定の場合は data/hub.db | verified_settlements の保存先です。孤立した保留を処理するクリーンアップ処理はこの DB を読み取り、読み取れない項目は解放しません |
既存の本番 Hub を SQLite から PostgreSQL に移行する
スタンドアロンの Hub とサンドボックスのトライアル台帳は、DATABASE_URL が
postgresql://(または postgres://)を使用していない場合、AIFACTORY_PROD=1
で起動時に失敗します。そのため本番環境では、環境ファイルが見つからない場合に新しい
SQLite へのフォールバックがひそかに作成されることはなくなりました。
本番環境では DATABASE_URL を設定し、稼働中の Hub、チャネル台帳、
サンドボックスのクォータ、決済記録、来歴を 1 つの PostgreSQL データベースに保存してください。移行
ツールはすべての SQLite ソースを読み取り専用で開き、冪等に挿入し、行数を検証した後、
PostgreSQL のすべてのシリアルシーケンスを進めます。最後の手順を省略すると、最初の新規書き込みで
インポート済みの id と衝突します。
Hub を停止し、空のターゲットデータベースから切り替えを実行してください。
export TARGET_DATABASE_URL='postgresql:///aimarket_hub'
systemctl stop aimarket-hub
# Initialize every Hub subsystem in the empty target schema.
DATABASE_URL="$TARGET_DATABASE_URL" \
AIMARKET_SIGNING_KEY_PATH=/var/lib/aimarket/hub_signing_key \
python -c 'from aimarket_hub.api import create_app; create_app()'
python scripts/migrate_sqlite_to_postgres.py \
--dsn "$TARGET_DATABASE_URL" \
--sqlite /var/lib/aimarket/hub-federation.db \
--sqlite /var/lib/aimarket/channels.db \
--sqlite /var/lib/aimarket/sandbox_trials.db
# Put DATABASE_URL in the service environment, then start and verify before removing nothing.
systemctl start aimarket-hub
curl -fsS http://127.0.0.1:9083/ai-market/v2/health
curl -fsS http://127.0.0.1:9083/ai-market/v2/search?intent=echo
PostgreSQL の pg_dump が実際のリストアテストに合格するまで、ロールバック用のスナップショットとして SQLite ファイルを保管してください。本番環境のバックアップジョブには、PostgreSQL のダンプと 2 つの署名鍵(hub_signing_key と hub_signing_key_mldsa)の両方を含める必要があります。PostgreSQL で稼働している Hub のバックアップは、古い .db ファイルをコピーしただけでは不十分です。
共有データベースのエイリアス化を解消した後のアップグレード
これは、すでに AIMARKET_DB_PATH を設定して稼働したことがある Hub に必要な一度限りの移行手順です。ここにあるすべてのコンテナ(Dockerfile、Dockerfile.standalone、
docker-compose.yml、docker-compose.core.yml)がこの環境変数をエクスポートしているため、すべて該当します。
このリリースまでは、この環境変数がサブシステムの要求したパスを上書きしていたため、チャネル
台帳(data/channels.db)と来歴ストア(data/provenance.db)は hub ファイルの中に
作成されていました。現在は明示的な引数が優先されるため、これらのサブシステムはそれぞれ独自の
ファイルを開きます。アップグレード済みのデプロイでは、これらのファイルは 空の状態で始まります。
- チャネル台帳では、オープン中のチャネルと、さらに重大なことに
consumed_deposits(オンチェーンの入金を一度しか使えないようにするテーブル)が失われます。このテーブルが空だと、すでに使用済みのすべての入金を再度利用して、新しい資金提供済みチャネルを作成できてしまいます。 - 来歴ストアではレシートが失われます。
Hub は起動時に、要求されたファイルが存在せず、AIMARKET_DB_PATH のファイルは存在することを検知すると、データがまだ保存されているファイル名を示して ERROR をログに記録します。トラフィックを受け付ける前に、次のいずれかを実行してください。
# A. channel ledger — keep the shared file, no data moves, pre-upgrade behaviour exactly
export AIMARKET_CHANNELS_DB_PATH="$AIMARKET_DB_PATH"
# B. channel ledger — split it out: copy the file with the hub stopped
cp /app/data/hub.db /app/data/channels.db
export AIMARKET_CHANNELS_DB_PATH=/app/data/channels.db
どちらの場合も、コピー先の所有者が使用しないテーブルは読み取られません。来歴ストアにはパス変数がありません。常に Hub データベースのディレクトリから provenance.db を導き出すため、ここでは B だけが選択肢です(cp /app/data/hub.db /app/data/provenance.db)。これを省略すると空のレシートストアが起動します。監査証跡は失われますが、金銭的な損失はありません。
DATABASE_URL を使うデプロイには影響しません。PostgreSQL は常に 1 つの共有データベースでした。
チャネル
| 変数 | デフォルト | 説明 |
|---|---|---|
AIMARKET_ALLOW_DEMO_CREDIT | — | 1 にすると、オンチェーン検証なしでチャネルにクレジットを付与します(開発/デモ用)。本番環境以外では、これを設定しないとクレジット付与はフェイルクローズになります |
AIMARKET_CHANNEL_ALLOW_UNPROVEN_PAYER | 0 | 1 にすると、支払者の制御証明要件を無効にします(移行期間のみ。入金の先回り送信が可能な状態を残します) |
AIMARKET_CHANNEL_ANON_OPENS_PER_HOUR | 200 | ウォレットを持たないすべてのオープンに共通する上限(例外にはなりません) |
AIMARKET_CHANNEL_ANON_CLOSES_PER_HOUR | 600 | 同じく、クローズに適用されます |
AIMARKET_CHANNEL_HOLD_REAP_AFTER_SECS | 86400 | ライブ検証がないままこの秒数だけ held 状態で滞留したホールドを解放します。0 にするとリーパーを無効にします |
AIFACTORY_PAYMENT_MIN_CONFIRMATIONS | 2 | 入金が有効と見なされるまでに必要な承認数 |
AIFACTORY_PAYMENT_VERIFY_STUB | 0 | 1 にすると、任意のトランザクションハッシュを受け入れます。開発専用です |
Pay-on-Verified
| 変数 | デフォルト値 | 説明 |
|---|---|---|
AIMARKET_VERIFY_ENABLED | 1 | Pay-on-Verified のマスタースイッチ(呼び出しごとにオプトインが必要です) |
AIMARKET_VERIFY_MIN_PRICE_USD | 0.05 | 価格の下限です。この価格を下回る呼び出しに検証手数料はかかりません |
AIMARKET_VERIFY_SCORE_THRESHOLD | 0.7 | 保留金を受け取るために必要な verify_score です(0.0~1.0 の範囲外の値は 0.7 にフォールバックします) |
AIMARKET_VERIFY_COUNCIL_MIN_PRICE_USD | 0.50 | ルートの上限です。この価格以上では council が許可され、それ未満では fast に制限されます |
AIMARKET_VERIFY_MAX_CONCURRENCY | 8 | 決済保留中に同時実行できる Metis 呼び出し数の上限です |
AIMARKET_VERIFY_ATTEMPT_TIMEOUT_S | 330 | 試行ごとの Metis HTTP タイムアウトです(Metis サーバーの上限 300 秒を超えます) |
AIMARKET_VERIFY_RETRY_BACKOFF_S | 5 | 通信再試行の初期待機時間です(指数関数的に増加し、上限は 300 秒です) |
AIMARKET_VERIFY_ENGINE_RETRIES | 2 | ポリシー適用前に、エンジンエラーのエンベロープを受け取った後に再実行する回数です |
AIMARKET_VERIFY_MAX_WAIT_S | 0 | 0 = 判定期限なし、>0 の場合はポリシーによって解決までの時間を制限します |
AIMARKET_VERIFY_FAIL_CLOSED | 1 | 結果が不確定の場合 ⇒ 購入者に返金します。明示的に 0/false/no/off を指定した場合のみ受け取り、それ以外の認識できない値は入力ミスとしてフェイルクローズします |
AIMARKET_VERIFY_METIS_URL | http://127.0.0.1:8080 | Metis のベース URL(METIS_URL にフォールバックします) |
AIMARKET_VERIFY_METIS_KEY | — | Metis のベアラーキー(METIS_API_KEY にフォールバックします) |
AIMARKET_VERIFY_VERIFIER_ID | metis.verify@v1 | Metis 以外の検証者がスロットを担当する場合の、エンベロープ内の verifier 帰属情報です |
AIMARKET_APPEAL_WINDOW_S | 0 | 異議申し立て(プロトコル):有効な有料判定が仮状態となり、敗訴側が異議を申し立てられる期間(秒)です。0 = 無効。判定後、すぐに資金が移動します |
AIMARKET_APPEAL_METIS_URL | — | 異議審査機関となる、第 2 の検証者です。未設定、または第一審の URL と同じ場合、異議申し立ては無効になります |
AIMARKET_APPEAL_METIS_KEY | — | 異議審査機関のベアラーキーです |
AIMARKET_APPEAL_VERIFIER_ID | metis.appeal@v1 | エンベロープ内で異議審査機関を示します。AIMARKET_VERIFY_VERIFIER_ID とは異なる値である必要があります |
AIMARKET_APPEAL_BOND_MIN_USD / AIMARKET_APPEAL_BOND_RATE | 0.02 / 0.20 | 保証金 = max(最小額、料率 × 価格)。ただし価格を上限とします |
AIMARKET_APPEAL_MAX_WAIT_S | 21600 | この時間を過ぎると審査結果は不確定とみなされ、第一審の判定が維持され、保証金が返還されます(0 = 上限なし) |
AIMARKET_APPEAL_SWEEP_S | 30 | 期限切れの期間を確定し、提出済みの異議申し立てを処理する安全策としての定期実行間隔です |
サプライセキュリティ(コミュニティパブリッシャー)
詳細は docs/supply-security.md を参照してください。以下のいずれかのしきい値に有限値でない値、または数値でない値が設定された場合、警告を出して無視し、文書化されたデフォルト値を使用します。nan のしきい値を設定すると、本来はそのしきい値が制御するゲートが警告なしに無効になるためです。
| 変数 | デフォルト | 説明 |
|---|---|---|
AIMARKET_SUPPLY_SECURITY_RELAXED | 0 | 1 = 開発用バイパス:最低ステーク額をゼロにし、レスポンス署名の要件とスラッシングを無効にします |
AIMARKET_SUPPLY_MIN_STAKE_USD | 本番環境では 25、それ以外では 10(緩和時は 0) | 公開に必要なステーク額 |
AIMARKET_SUPPLY_PUBLISH_PER_HOUR | 5 | パブリッシャーごとの1時間あたりの公開数 |
AIMARKET_SUPPLY_MIN_TRUST_DISCOVER | AIMARKET_MIN_TRUST_SCORE(0.3) | ディスカバーに表示されるための最低信頼スコア |
AIMARKET_SUPPLY_MIN_TRUST_INVOKE | 0.35 | 呼び出しに必要な最低信頼スコア |
AIMARKET_SUPPLY_REQUIRE_RESPONSE_SIG | 本番環境かつ緩和されていない場合に有効 | プロバイダーのレスポンスに Ed25519 署名を必須とします |
AIMARKET_SUPPLY_MAX_INPUT_KEYS | 32 | invoke 入力で受け入れるトップレベルキーの数 |
AIMARKET_SUPPLY_MAX_INPUT_JSON_BYTES | 32768 | invoke 入力のサイズ上限 |
AIMARKET_SUPPLY_PRODUCT_ALLOWLIST | — | カンマ区切りの product_id 許可リスト |
AIMARKET_SUPPLY_SLASH_FAILURE_THRESHOLD | 3 | ステークがスラッシングされるまでのウィンドウ内のプロバイダー障害数 |
AIMARKET_SUPPLY_SLASH_FAILURE_WINDOW_S | 600 | 障害ウィンドウ(0 より大きい必要があります。0 以下の場合はスラッシングが無効になるため、フォールバック値を使用します) |
AIMARKET_SUPPLY_SLASH_COOLDOWN_S | 3600 | 失敗を原因とするスラッシングはウィンドウごとに最大1回です。0 でクールダウンを無効にします |
AIMARKET_SUPPLY_SLASH_DAILY_CAP_USD | 10 | 失敗を原因とするスラッシングの直近24時間の上限額です。0 で上限を無効にします |
AIMARKET_SUPPLY_VERIFIED_FAIL_THRESHOLD | 3 | 有料の Metis「failed」判定がエスカレーションされるまでの回数 |
AIMARKET_SUPPLY_VERIFIED_FAIL_WINDOW_S | 86400 | これらの判定に適用するウィンドウ |
AIMARKET_SUPPLY_VERIFIED_FAIL_MIN_CONSUMERS | 2 | 必要な支払い済みの異なるコンシューマー数 — 1人の購入者による繰り返しの失敗は1票として扱います |
AIMARKET_SUPPLY_TRUST_GRAPH_MAX_EDGES | 1000 | トラストグラフの上限です。切り詰めが発生すると、その影響を受けたパブリッシャーとともにログに記録されます |
AIMARKET_ORACLE_FAMILY_URL | https://oracles.modelmarket.dev/family | LUMEN 信頼オラクル(ARGUS_ORACLE_FAMILY_URL にフォールバックします) |
デプロイ
まずはこちら: 本番環境への完全なデプロイ手順書。ロシア語、スペイン語、フランス語、中国語版もあります。
この手順書では、コミットを固定した変更不可のリリース、非特権の systemd サービス、ホスト名または /hub サブパスでの nginx/TLS、同一オリジンのフェデレーション検出と invoke、署名付きマニフェストと実際の 402 によるアッセイ証拠、プロトコルのみでのフェデレーション参加、UFW/Fail2ban/SSH の強化、バックアップ、再起動後の受け入れ確認、Alien Monitor と SKOPOS への登録を扱います。通常のアップグレードで、プロバイダーのバックエンドを外部に公開したり、Hub の Ed25519 キーを置き換えたりしないでください。
保守されている公開インストールの参照記録:../docs/production-modelmarket-dev.md。
テストとカバレッジ
CI はプッシュのたびに実行されます(ワークフロー。カバレッジバッジは main 上で pytest --cov を実行して更新されます。
cd aimarket-hub
pip install -e ".[dev]"
pytest tests/ -q --cov=aimarket_hub
開発
pip install -e ".[dev]"
主なテストモジュール:test_api.py、test_crawler.py、test_plugin_system.py、test_channels.py、test_cross_hub_integration.py
プラグインを追加するには、../plugins/ の下に、pyproject.toml のエントリーポイント aimarket.plugins を持つパッケージを作成します。
セキュリティ
- フェデレーションクローラーのSSRF 対策(
crawler.py) - ハイブリッド署名付き証拠 —
AIMARKET_PQC=1の場合、マニフェスト、ディスカバリードキュメント、呼び出しレシート、拒否レシート、Pay-on-Verified 判定エンベロープには、同じバージョン管理された正規化ペイロードに対する Ed25519 および ML-DSA-65 の署名が付与されます。従来方式の検証は引き続き必須です。PQ 署名が存在する場合、PQ 検証に失敗すると処理は拒否されます。公開/ai-market/v2/receipts/verifyエンドポイントは、この Hub が永続化した鍵に固定されており、呼び出し元が指定した鍵を受け付けないため、レシートの自己検証を防ぎます (signing.py) - すべての呼び出しに対するセーフティゲート(
safety_gate.py) - 検証済みの一度限りのステーク入金 — 本番環境では、すべてのステーククレジットに、プラットフォームの受取人へ支払うオンチェーン入金が必要です。クレジット付与前にアトミックな請求処理によって入金ハッシュが消費されるため、同時リクエストがあっても、1 件の入金が 2 つのパブリッシャーの資金になることはありません。請求処理では正規化されたトランザクション ID をキーとして使用します(EVM ハッシュは JSON-RPC 層では大文字と小文字を区別しないため、
0xAB…と0xab…は別々の入金ではなく、同一の入金です) (supply_security.py) - 残存リスク — ステーク入金は支払者に紐付けられていません。 ステーク検証機能が判定するのは「誰かがプラットフォームに支払ったか」であり、「このパブリッシャーが支払ったか」ではありません。そのため、一致するハッシュを最初に送信した人にクレジットが付与されます。これを紐付けるには、ステーク台帳にはまだ存在しないパブリッシャーからウォレットへの記録が必要です。チャネル入金はすでに紐付けられています(下記の項目を参照)。それまでは、ステーク入金ハッシュをベアラーシークレットとして扱い、公開される前に送信してください
- 一度限りのチャネル入金と支払者証明 — 検証済みの入金は、1 つのチャネルにのみ、かつその入金に対して署名したウォレットにのみ資金を提供します(
channels.py) - ステークの変更はサブジェクト単位、スラッシングはオペレーター限定 — 共有トークンを使って他人のステークを増やしたり、競合相手のボンドを没収したりすることはできません(
api.py) - 脆弱性の報告: SECURITY.md → [email protected]
関連プロジェクト
| プロジェクト | 関係 |
|---|---|
| AICOM / AI-Factory | 製品を提供 → Hub のインデックス |
| aimarket-protocol | 規範となる v2 仕様 |
| aimarket-sdks | クライアント SDK(Dart アルファ版) |
| aimarket-widget | 埋め込み可能な UI |
| oracles | 検証可能な数学機能 — 乱数、VDF、コンセンサス、評判(Hub に掲載) |
| desktop-integrations | Flutter 製のコンシューマーアプリ 8 種 |
| Ecosystem architecture | モノレポ全体の図 |
| dioscuri | 双子のコミュニティエージェント — MNEMOSYNE Q&A |
コミュニティ
DIOSCURI の双子が、同期された GitHub ドキュメントに基づいて質問に回答します。
| チャネル | 双子 | おすすめの用途 |
|---|---|---|
| Discord | Pollux | ヘルプ、アイデア、成果の共有 |
| Telegram | Castor | リリース、ダイジェスト、最新ニュース |
エコシステムマップ: Alien Monitor · AICOM
License
Apache-2.0 — see LICENSE. Maintainers: CONTRIBUTORS.md.
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。