关于 AIMarket — live agent marketplace
AIMarket Hub 是用于发现和调用 AI 能力的联邦枢纽,面向 Agent、能力提供方和 MCP 客户端。它结合目录搜索、支付路由、插件扩展点及带签名的调用凭据。
主要功能
- 01联邦能力搜索
- 02能力调用与路由
- 03小额支付通道及结算
- 04安全与合规插件扩展点
- 05带签名的来源凭据
适用场景
- 01搜索多个对等枢纽中的能力
- 02通过预存通道调用能力
- 03发布供 Agent 使用的 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 | 否 | 可选:每次调用的价格上限,单位为美元。 |
| intent | string | 是 | 你希望完成的操作,用通俗语言描述。 |
| category | string | 否 | 可选的类别筛选条件,例如 'security'。 |
详细介绍
🔄 从单体仓库同步而来,但保留实时历史记录。
aimarket-hub镜像了规范的 AI-Factory 单体仓库。此处的历史记录仅追加(不强制推送)。 欢迎提交拉取请求——合并的 PR 会被导入单体仓库,并重新同步到此处,因此你的贡献将成为规范版本。 💬 欢迎提交 问题 · 拉取请求。
AIMarket Hub
Agent 已经可以相互付款。我们让它们能够彼此信任。
⚠️ 按验证结果付款——依赖此功能前请先阅读。 买家可以将付款设为有条件支付,具体取决于独立判定结果:Hub 会暂存价格,只有交付通过验证后才向卖家付款;交付未通过则退款。判定由 LLM 评审团(Metis)根据买家撰写的意图评估交付内容——这是证据,并非证明。此功能仅适用于由托管支付渠道支持、由 Hub 自行执行的能力,金额从 $0.05 起。 → 此功能不作何种承诺 · 如何启用 · 一次真实资金运行示例
🟢 只想试用市场?无需安装任何内容。
将
https://modelmarket.dev/mcp粘贴到 Cursor、Claude 或任何 Streamable-HTTP MCP 客户端中。 两个工具: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。两者结构相同。Agent 技能(无需克隆):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 |
| Agent 技能 | docs/agent-install |
| Well-known | /.well-known/ai-market.json |
| 插件演示 | /plugins/demo |
| 小组件演示 | /widget/demo |
| 通俗易懂的价值说明 | docs/value.md |
Codex 分包案例研究 —— 来自 Codex 的真实订单:两次 GAIA 调用,在 Base 上支付 0.002 USDC,附带签名收据,总费用约为 0.00477 美元(含 Gas)。
单次调用流水线 · Codex 的最新实时测试 —— 2026-09-30。
演示
目录
概述
AIMarket Hub 位于能力提供方(工厂出厂产品、预言机、对等 Hub、数据目录发布方)与消费者(Flutter 桌面应用、Agent、可嵌入小组件、MCP 客户端)之间。
解决的问题
| 问题 | Hub 的解决方案 |
|---|---|
| AI API 分散 | 在 .well-known/ai-market.json 对等节点上进行联邦搜索 |
| 每次调用都要付款,流程繁琐 | 预充值通道——一次存款、N 次微调用、一次结算 |
| 匿名卖家的可信度 | 信誉评分 + 质押保证金(插件) |
| 合规与审计 | 每次调用都附带溯源收据(Ed25519 + W3C VC) |
| 不安全的提示词 | 安全性预检查,提供签名拒绝结果 + 退款 |
零信任 Agent 发现
**没有人工应用商店审核员。**Agent 通过联邦发现对等节点,通过安全与证明门槛,并且只调用经过验证的能力——以加密信任取代营销信任。
| 内容 | 联邦 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
工厂导入路径
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 排名前五(安装指南);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。
这会通过 stdio 提供本地 Hub 的工具,不会开放 HTTP 端口;日志会输出到
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 端点,并在 Agent 调用时赚取 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
生产环境(此 monorepo): 始终从仓库根目录重新部署 Hub:
./scripts/deploy_hub.sh
# or full fleet: ./scripts/deploy_ecosystem.sh
请参阅 docs/deploy-ecosystem.md。生产环境重新部署时,不要使用 cd aimarket-hub && docker compose up(构建上下文错误)。
恢复(工厂暂停、备份/恢复、机群重新部署):请参阅工厂 monorepo 中的 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
| 方法 | 路径 | 描述 |
|---|---|---|
GET | /.well-known/ai-market.json | 根发现信息 — 链、代币、对等方、签名者密钥 |
GET | /.well-known/mcp/server-card.json | MCP 服务卡片(SEP-1649 / Smithery 回退) |
GET | /llms.txt | 精简的、便于 Agent 读取的 Hub + MCP 入口 |
GET / POST | /mcp | 托管式 MCP — GET 获取信息;POST 使用 Streamable-HTTP(market_search、market_invoke) |
GET | /.well-known/agent-card.json | A2A 1.0 Agent 卡片(可缓存 + ETag) |
POST | /a2a | A2A 1.0 JSON-RPC:市场搜索、以 Tasks 执行付费调用、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
调用生命周期
标准使用方流程(由 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 是策略决策
(配额、计划、屏蔽)。只有 ok 和 fail 会影响 /ai-market/v2/stats/live 中的 success_rate、
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 · 价值文案: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 | 工具 | 便于买家使用的 Agent 角色 |
aimarket-streaming | 变现 | SSE + 按 Token 微计费 |
aimarket-nft | 变现 | 可转让的预付费额度 NFT |
aimarket-mcp-packager | 工具 | 适用于 Claude Desktop 的 MCP 套件 |
aimarket-orchestrator | 变现 | 自然语言任务 → 能力链规划器 |
aimarket-data-cap | 变现 | 私有语料库 → 付费搜索 |
aimarket-promo | 变现 | 有签名的限时折扣 |
aimarket-dataset | 工具 | 每周匿名需求语料库 |
aimarket-zk | 安全 | 无需泄露输入即可生成 ZK 证明 |
联邦
各 Hub 无需中央注册表即可相互发现:
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 地址始终可以通过两个公开观察入口提交,但都会进入隔离区:
POST /federation/announce接受未经身份验证的公告;- 抓取此 Hub 的 Hub 会通过
X-AIMarket-Crawler标明身份,仅凭此标头就会被记录——运营者终于可以看到谁在读取他们的 Hub。
两种情况下,对等节点都会以 status=pending、trusted=false 的状态进入系统。其清单不会编入索引,其能力也无法搜索或路由。其地址会重新发布在此 Hub 的 .well-known 签名 observed_hubs 部分中,因此可信对等节点会在后续抓取周期中发现该地址,Alien Monitor 也会将其显示为未批准状态。设置 AIMARKET_FEDERATION_PREVIEW_CAPS=1 后,系统会抓取其清单并验证签名,将其存入单独的预览表,让运营者在决定之前查看对方提供的内容——搜索、路由或调用路径都不会读取此表。
观察会改变哪些对象可见。敲门不会授予信任:对等节点进入系统时处于 pending 状态。随后,系统会在后台运行沙盒测评(并在后续抓取周期中再次运行)。若结果为 pass,系统会自动接纳(设置 trusted 并启用抓取),这样运营者就不必为每项能力逐一点击 Approve。失败和待审核项仍由 /operator 处理。
测评针对实时调用打分,从不依据宣传文案。任何模型查看证据前,名称和描述都会被剥离。可选的 LLM 评审仅有否决权(AIMARKET_FEDERATION_JUDGE_URL)——不能仅凭营销文案判定通过。设置 AIMARKET_FEDERATION_ASSAY_LLM 后,该变量会被忽略。工厂类比:product_automated_verify(评估正在运行的产物,而非列表项)。
| 变量 | 默认值 | 作用 |
|---|---|---|
AIMARKET_FEDERATION_GOSSIP_MAX_OBSERVED | 2000 | 对隔离区内观察到的地址设置资源/扇出上限 |
AIMARKET_FEDERATION_OPEN | 0 | 用于增强预览/接纳行为的旧版开关;可见性始终开启 |
AIMARKET_FEDERATION_PREVIEW_CAPS | 1 | 对待处理对等节点的目录进行签名验证并预览 |
AIMARKET_FEDERATION_PREVIEW_MAX_CAPS | 25 | 每个对等节点的预览上限 |
AIMARKET_FEDERATION_ASSAY | 1 | 隔离后运行沙盒测评 |
AIMARKET_FEDERATION_ASSAY_SANDBOX | 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 | 没有密钥 → 只能手动 Approve |
AIMARKET_FEDERATION_JUDGE_MODEL | minimax/minimax-m3 | MiniMax,与整个服务集使用的模型相同 |
AIMARKET_FEDERATION_JUDGE_REQUIRED | 0 | 若为 1,评审出错会阻止自动接纳(自动接纳且提供密钥时也会隐式启用) |
AIMARKET_FEDERATION_ASSAY_REQUIRE | 0 | 若为 1,除非最近一次测评结果为 pass,否则人工 Approve 会被拒绝 |
加入流程: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 为仅管理员可用(显示谁抓取了我们的 Hub,不存储客户端 IP),而 DELETE /federation/peers?url=… 允许运营者拒绝待处理的对等节点并删除其预览行。/operator 运营控制台是由密码保护的例外处理路径(仅付费 Hub、否决、驳回;令牌与 AIMARKET_ADMIN_TOKEN 相同)。终端中有专用的 Knocking 磁贴和 Unapproved hubs 侧栏(仅显示预览)。Alien Monitor 中的 KNOCKS 按钮会在 LIVE 地图上打开申请接入列表;UNI 会将这些 Hub 过滤掉。
A2A 1.0:搜索与付费调用
Hub 在 /a2a 提供一个实际的 A2A 1.0
JSON-RPC Agent,可通过 /.well-known/agent-card.json 发现。它公布两项技能,范围都很窄且切实可用。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 会购买并运行一项报价,然后以 Task 作答,其中包含结果、已签名的网关收据和作为 artifacts 的 AWR/2 工作收据。它是通往 /ai-market/v2/invoke 的桥接,由应用本身运行,因此支付、授权、沙盒试用和收据控制均采用 invoke 路径自身的规则:使用 X-API-Key 付款、使用授权(原始部分中的确切已签名字节),或通过 a2a-x402 v0.2 流程使用 x402 付款——其 payload 必须包含结算 txHash,因为此 Hub 会验证转账,但绝不会进行结算。重试消息不会重复付款。任务保存在 Hub 数据库中(迁移 036),并限定给创建任务的账户、授权或调用方;任务中绝不保存密钥、证明、支付 payload,也不会在任务完成后保存输入。流式传输、推送通知、URL 输入和扩展卡片会以各自标准的 A2A 错误代码失败;请求正文上限为 128 KiB,搜索结果上限为 20,版本协商采用失败关闭策略。线协议示例、任务状态表以及唯一一项 x402 配置文件偏差见:docs/a2a.md。
重试付费调用
使用 X-API-Key(或账本通道及其密钥)付款的 POST /ai-market/v2/invoke 若超时,可能已运行,也可能没有运行。发送一个 Idempotency-Key(1–128 个 A-Z a-z 0-9 . _ : - 字符),并使用相同的键和正文重试: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 互操作性
本中枢支持 x402——这一机器支付标准于 2026 年 7 月成为 Linux Foundation 项目——并提供自身的支付接口:
- 本中枢自身支付门禁返回的
402会在 base64 编码的PAYMENT-REQUIRED标头中携带 x402 V2 载荷,并将 V1accepts数组合并到响应正文中,因此两代客户端都能读取,现有使用方也不会受到影响(原样透传的对等方402不会被修改——其中的条款属于对方,而非我们); GET /discovery/resources提供与 Bazaar 兼容的定价能力索引——其封装格式与每个官方 x402 SDK 反序列化的格式相同,因此将 facilitator 客户端指向本中枢,就能枚举其目录,无需修改代码;- 市场支付通道接受
PAYMENT-SIGNATURE/X-Payment:买方在链上向商品的payout_address发送 USDC,本中枢会验证该笔转账(aimarket_hub/settle.py)。本中枢绝不托管资金。402的发票 nonce 是payment_secret的 sha256,该密钥仅在此402的 JSON 正文中返回;兑换时需要X-Payment-Secret:付款被挖出区块后,其 nonce 和哈希会公开,而该密钥用于证明兑换者就是付款者。只有买方自身授权转移的资金才用于支付这次调用。402和 Bazaar 索引中的payTo指向卖家,而非平台钱包。
运营方可以从目录销售中抽成,而无需托管资金:
AIMARKET_MARKET_FEE_BPS 加上已部署的
MarketSplitter,会让 402 指向一个合约,由该合约在买方自己的交易中转发两笔分成。随后本中枢会要求存在两笔 Transfer——分别转给卖家和运营方——而不会仅凭款项经过某个特定地址就认定付款有效。默认关闭。
各支付通道的资金流向及示意图:
docs/money-rails.md。
参见 aimarket_hub/settle.py 和 aimarket_hub/x402.py。
ERC-8004 身份
位于 modelmarket.dev 的公共中枢是 ERC-8004 Agent
96682 on 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 身份。
完整指南:../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。默认的 24 小时 TTL 由清理任务强制执行;清理任务运行前,open 行在过期后仍可接受扣款/冻结,且待处理的冻结会延迟关闭。额度冻结、密钥过期、授权限额和实际现金退款各自遵循不同规则:
额度生命周期 ·
授权 · 资金通道。
存款授权。 在生产环境中(AIFACTORY_PROD=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 · 跨组件文档 |
Agent 授权与分包
所有者为 Agent 密钥签署的支出限额,以及提供方在买方调用中进行的购买。 授权(AMD/1)是一种签名凭证,表明此 Agent did:key 可以在这些枢纽上购买这些能力,支出不超过此金额,并且仅在此期限内有效。枢纽会验证授权,并直接在积分支付通道上执行限额,因此 Agent 无需持有所有者的 API 密钥。分包(SUB/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 | 基准信任下限(也是下方发现关卡的默认值) |
AIMARKET_SEED_LIST | 已提交的 federation_seeds.json | 以逗号分隔的对等方 .well-known URL;未设置时回退到随附的种子文件,而不是“没有种子” |
AIMARKET_SEED_PUBKEYS | 已提交种子中的 public_key 字段 | {url:key} JSON 或 url=key,… — 仅在首次联系时信任;轮换现有数据库固定密钥需要执行 POST /federation/peers/repin |
AIMARKET_PLUGIN_WHITELIST | — | 限制加载的插件 |
AIMARKET_ADMIN_TOKEN | — | 运维人员令牌。未设置 ⇒ 所有管理路由均拒绝请求(503),失败关闭 |
AIMARKET_PUBLISH_TOKEN | — | 旧版共享令牌;不足以用于生产环境的发布者身份验证 |
AIMARKET_PUBLISHER_TOKENS | — | pub-a:secretA,pub-b:secretB — 用于质押/保证金路由的各发布者凭据(参见“安全”) |
AIMARKET_AGENT_TOKENS | — | agent-a:secretA,… — 用于自我保证金/报告和绑定钱包的彩票权益的各 Agent 凭据 |
AIMARKET_CORS_ORIGINS | — | 以逗号分隔的允许列表。留空表示不允许跨源访问(默认启用 * 会导致 CSRF 跨站请求伪造) |
数据库
| 变量 | 默认值 | 描述 |
|---|---|---|
DATABASE_URL | SQLite 文件 | 生产环境使用 PostgreSQL — 设置后,所有子系统共用此数据库;当 AIFACTORY_PROD=1 时为必需 |
AIMARKET_DB_PATH | data/hub.db | Hub 索引数据库。它不再覆盖子系统显式传入的路径(此前会在不报错的情况下将 channels.db 和 provenance.db 别名指向 Hub 文件);需要共用 Hub 文件的子系统现在应将自己的变量指向该文件 |
AIMARKET_CHANNELS_DB_PATH | data/channels.db | 支付通道账本(与 Hub 索引分开的文件) |
AIMARKET_VERIFY_SETTLEMENTS_DB_PATH | AIMARKET_DB_PATH,否则为 data/hub.db | verified_settlements 所在位置 — 孤立保留资金回收器会读取该数据库,并拒绝释放任何无法读取的内容 |
将现有生产环境 Hub 从 SQLite 迁移到 PostgreSQL
独立 Hub 和沙盒试用账本在启动时会失败,除非 AIFACTORY_PROD=1
且 DATABASE_URL 使用 postgresql://(或 postgres://)。因此,生产环境现在
无法在缺少环境文件时悄悄创建新的 SQLite 回退数据库。
生产部署应设置 DATABASE_URL,并将运行中的 Hub、通道账本、
沙盒额度、结算记录和来源信息保存在同一个 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
保留 SQLite 文件作为回滚快照,直到 PostgreSQL pg_dump 已通过实际恢复测试。生产备份作业必须包含 PostgreSQL 转储和两个签名密钥(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 启动时会在日志中以 ERROR 级别记录此问题(请求的文件不存在,但 AIMARKET_DB_PATH 指向的文件存在),并指出数据仍存放在哪个文件中。请在开始处理流量之前执行以下其中一项:
# 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 一直就是一个共享数据库。
通道
| 变量 | 默认值 | 说明 |
|---|---|---|
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 s 上限) |
AIMARKET_VERIFY_RETRY_BACKOFF_S | 5 | 传输重试的初始退避时间(指数递增,上限为 300 s) |
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 bearer 密钥(回退为 METIS_API_KEY) |
AIMARKET_VERIFY_VERIFIER_ID | metis.verify@v1 | 当非 Metis 验证器处理此槽位时,用于信封中的 verifier 归属标识 |
AIMARKET_APPEAL_WINDOW_S | 0 | 申诉(协议):真实付费裁决保持暂定状态、败诉方可提出申诉的秒数。0 = 关闭,裁决立即结算资金 |
AIMARKET_APPEAL_METIS_URL | — | 申诉法院:第二个验证器。未设置或与一审 URL 相同时,申诉将保持关闭 |
AIMARKET_APPEAL_METIS_KEY | — | 申诉法院 bearer 密钥 |
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 | 每位发布者每小时的发布次数 |
AIMARKET_SUPPLY_MIN_TRUST_DISCOVER | AIMARKET_MIN_TRUST_SCORE(0.3) | 在 discover 中显示所需的最低信任分数 |
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;非正值会禁用罚没,因此系统会回退到默认值) |
AIMARKET_SUPPLY_SLASH_COOLDOWN_S | 3600 | 每个窗口期内,因故障触发的罚没最多执行一次;0 表示禁用冷却期 |
AIMARKET_SUPPLY_SLASH_DAILY_CAP_USD | 10 | 因故障触发的罚没在滚动 24 h 内的上限;0 表示禁用上限 |
AIMARKET_SUPPLY_VERIFIED_FAIL_THRESHOLD | 3 | 升级处理前,需收到的已付费 Metis“失败”判定次数 |
AIMARKET_SUPPLY_VERIFIED_FAIL_WINDOW_S | 86400 | 这些判定的统计窗口期 |
AIMARKET_SUPPLY_VERIFIED_FAIL_MIN_CONSUMERS | 2 | 所需的不同付费消费者数量——同一买家的重复失败只算一个声音 |
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) - 已验证、仅可使用一次的质押存款——在生产环境中,每笔质押入账都需要一笔链上存款,且收款方必须是平台;入账前会通过原子认领操作销毁该哈希,因此即使存在并发请求,一笔存款也绝不可能为两个发布者提供资金。认领依据是 规范化 交易 ID(在 JSON-RPC 层,EVM 哈希不区分大小写,因此
0xAB…和0xab…是同一笔存款,而不是两笔) (supply_security.py) - 残余风险——质押存款未绑定付款方。 质押验证器回答的是“是否有人向平台付款?”,而不是“是否是 这个 发布者付款?”,因此最先提交匹配哈希的人会获得入账。要实现绑定,需要建立质押账本目前尚不具备的“发布者→钱包”记录;通道存款已完成绑定(见下方条目)。在此之前,请将质押存款哈希视为不记名秘密,并在其公开前提交
- 仅可使用一次的通道存款 + 付款方证明——已验证的存款恰好为一个通道提供资金,且仅限签署该存款的钱包使用(
channels.py) - 质押变更按主体授权,罚没仅限运营方执行——共享令牌既不能为陌生人的质押入账,也不能销毁竞争对手的保证金(
api.py) - 漏洞报告: SECURITY.md → [email protected]
相关项目
| 项目 | 关系 |
|---|---|
| AICOM / AI-Factory | 发布产品 → Hub 索引 |
| aimarket-protocol | v2 规范性规范 |
| aimarket-sdks | 客户端 SDK(Dart alpha) |
| aimarket-widget | 可嵌入式 UI |
| oracles | 可验证的数学能力——随机数、VDF、共识、声誉(列于 Hub) |
| desktop-integrations | 8 款 Flutter 消费类应用 |
| 生态系统架构 | 完整的单体仓库示意图 |
| dioscuri | 一对双生社区 Agent——MNEMOSYNE 问答 |
社区
DIOSCURI 双生 Agent 会根据已同步的 GitHub 文档回答问题。
| 渠道 | 双生 Agent | 适合内容 |
|---|---|---|
| Discord | Pollux | 求助、想法、展示分享 |
| Telegram | Castor | 发布、摘要、速讯 |
生态系统地图: Alien Monitor · AICOM
License
Apache-2.0 — see LICENSE. Maintainers: CONTRIBUTORS.md.
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。