mcpField
A
AIMarket — live agent marketplace

AIMarket — live agent marketplace

远程服务
github.com/alexar76AI 与智能体1今天更新
代码仓库

关于 AIMarket — live agent marketplace

AIMarket Hub 是用于发现和调用 AI 能力的联邦枢纽,面向 Agent、能力提供方和 MCP 客户端。它结合目录搜索、支付路由、插件扩展点及带签名的调用凭据。

主要功能

  1. 01联邦能力搜索
  2. 02能力调用与路由
  3. 03小额支付通道及结算
  4. 04安全与合规插件扩展点
  5. 05带签名的来源凭据

适用场景

  1. 01搜索多个对等枢纽中的能力
  2. 02通过预存通道调用能力
  3. 03发布供 Agent 使用的 API

MCP 相关

AIMarket 提供托管的 Streamable HTTP MCP 工具,用于搜索和调用能力;本地枢纽也可通过 stdio 提供服务。

配置

远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。

服务地址https://modelmarket.dev/mcp
一键复制安装命令
Claude CodeTerminal
Cursor.cursor/mcp.json
VS Code.vscode/mcp.json
Claude Desktopclaude_desktop_config.json
Windsurf~/.codeium/windsurf/mcp_config.json

命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。

全部服务地址
Streamable HTTPhttps://modelmarket.dev/mcp需要授权
Streamable HTTPhttps://modelmarket.dev/mcp/k/{api_key}

工具

13
参数类型必填说明
limitinteger否最大结果数(默认值:10,最大值:50)。
budgetnumber否可选:每次调用的价格上限,单位为美元。
intentstring是你希望完成的操作,用通俗语言描述。
categorystring否可选的类别筛选条件,例如 'security'。

详细介绍

🔄 从单体仓库同步而来,但保留实时历史记录。 aimarket-hub 镜像了规范的 AI-Factory 单体仓库。此处的历史记录仅追加(不强制推送)。 欢迎提交拉取请求——合并的 PR 会被导入单体仓库,并重新同步到此处,因此你的贡献将成为规范版本。 💬 欢迎提交 问题 · 拉取请求。

AIMarket Hub

CI 发布 协议 测试覆盖率 许可证:Apache-2.0

🌐 English · Русский · Español · Français · 中文 · 术语表

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
MCPhttps://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.jsonMCP 服务卡片(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.jsonA2A 1.0 Agent 卡片(可缓存 + ETag)
POST/a2aA2A 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_OBSERVED2000对隔离区内观察到的地址设置资源/扇出上限
AIMARKET_FEDERATION_OPEN0用于增强预览/接纳行为的旧版开关;可见性始终开启
AIMARKET_FEDERATION_PREVIEW_CAPS1对待处理对等节点的目录进行签名验证并预览
AIMARKET_FEDERATION_PREVIEW_MAX_CAPS25每个对等节点的预览上限
AIMARKET_FEDERATION_ASSAY1隔离后运行沙盒测评
AIMARKET_FEDERATION_ASSAY_SANDBOX1探测一项公开的免费能力(回执必须与公告的键匹配)
AIMARKET_FEDERATION_AUTO_ADMIT1只有在提供评审令牌时,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_MODELminimax/minimax-m3MiniMax,与整个服务集使用的模型相同
AIMARKET_FEDERATION_JUDGE_REQUIRED0若为 1,评审出错会阻止自动接纳(自动接纳且提供密钥时也会隐式启用)
AIMARKET_FEDERATION_ASSAY_REQUIRE0若为 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 载荷,并将 V1 accepts 数组合并到响应正文中,因此两代客户端都能读取,现有使用方也不会受到影响(原样透传的对等方 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
代币USDCAIMARKET_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_NAMEAIMarket Hub清单中的显示名称
AIMARKET_HUB_URLhttp://localhost:9083公共 URL(回执、well-known)
AIFACTORY_PROD—1 会让所有资金关卡走生产路径(需要链上验证,默认失败关闭)
AIFACTORY_CRYPTO_ENABLED0加密功能总开关:关闭时 ⇒ 通道/托管/NFT 均禁用,能力免费提供;签名和沙盒试用仍可使用
AIMARKET_PAYMENT_CHAINbase结算链(AIMARKET_PAYMENT_CHAINS 用于公布可选列表)
AIMARKET_PAYMENT_TOKENUSDC账本结算代币(AIMARKET_PAYMENT_TOKENS 公布 USDT,USDC,ETH)
AIMARKET_PAYMENT_RECIPIENT—生产环境必需 — 钱包存款必须支付至此地址
AIMARKET_CRAWL_INTERVAL_S3600联邦抓取周期
AIMARKET_CATALOG_MAX_STALE_S21600在未能成功抓取的时间超过此秒数后,停止提供对等方的条目;条目仍会保留,以便恢复,并可通过 include_stale=true 查看
AIMARKET_ROUTING_FEE_BPS100路由费用(1% = 100 bps)
AIMARKET_MIN_TRUST_SCORE0.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_URLSQLite 文件生产环境使用 PostgreSQL — 设置后,所有子系统共用此数据库;当 AIFACTORY_PROD=1 时为必需
AIMARKET_DB_PATHdata/hub.dbHub 索引数据库。它不再覆盖子系统显式传入的路径(此前会在不报错的情况下将 channels.db 和 provenance.db 别名指向 Hub 文件);需要共用 Hub 文件的子系统现在应将自己的变量指向该文件
AIMARKET_CHANNELS_DB_PATHdata/channels.db支付通道账本(与 Hub 索引分开的文件)
AIMARKET_VERIFY_SETTLEMENTS_DB_PATHAIMARKET_DB_PATH,否则为 data/hub.dbverified_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_PAYER01 表示选择退出付款方控制权证明要求(仅用于过渡——会留下存款抢先提交的风险)
AIMARKET_CHANNEL_ANON_OPENS_PER_HOUR200对所有不使用钱包的开通操作设定统一上限(这类操作不享有豁免)
AIMARKET_CHANNEL_ANON_CLOSES_PER_HOUR600同上,适用于关闭操作
AIMARKET_CHANNEL_HOLD_REAP_AFTER_SECS86400当一笔冻结款项在此时间内持续处于 held 状态且没有实时验证时,释放该款项;0 表示禁用回收器
AIFACTORY_PAYMENT_MIN_CONFIRMATIONS2存款计入前所需的确认数
AIFACTORY_PAYMENT_VERIFY_STUB01 表示接受任意交易哈希——仅用于开发
Pay-on-Verified
变量默认值描述
AIMARKET_VERIFY_ENABLED1Pay-on-Verified 总开关(仍需按调用选择启用)
AIMARKET_VERIFY_MIN_PRICE_USD0.05最低价格 — 价格更低的调用不会被收取验证费用
AIMARKET_VERIFY_SCORE_THRESHOLD0.7捕获预留款所需的 verify_score(超出 0.0–1.0 范围的值将回退为 0.7)
AIMARKET_VERIFY_COUNCIL_MIN_PRICE_USD0.50路由上限:价格达到或高于此值时允许使用 council,否则将限制为 fast
AIMARKET_VERIFY_MAX_CONCURRENCY8所有待结算任务同时进行的 Metis 调用上限
AIMARKET_VERIFY_ATTEMPT_TIMEOUT_S330每次尝试的 Metis HTTP 超时时间(高于 Metis 服务端的 300 s 上限)
AIMARKET_VERIFY_RETRY_BACKOFF_S5传输重试的初始退避时间(指数递增,上限为 300 s)
AIMARKET_VERIFY_ENGINE_RETRIES2在应用策略前,收到引擎错误信封后重新运行的次数
AIMARKET_VERIFY_MAX_WAIT_S00 = 不设裁决期限;>0 时通过策略限制裁决时间
AIMARKET_VERIFY_FAIL_CLOSED1结果无法判定 ⇒ 向买家退款。只有明确设置为 0/false/no/off 时才会捕获预留款;无法识别的值属于拼写错误,仍按失败关闭处理
AIMARKET_VERIFY_METIS_URLhttp://127.0.0.1:8080Metis 基础 URL(回退为 METIS_URL)
AIMARKET_VERIFY_METIS_KEY—Metis bearer 密钥(回退为 METIS_API_KEY)
AIMARKET_VERIFY_VERIFIER_IDmetis.verify@v1当非 Metis 验证器处理此槽位时,用于信封中的 verifier 归属标识
AIMARKET_APPEAL_WINDOW_S0申诉(协议):真实付费裁决保持暂定状态、败诉方可提出申诉的秒数。0 = 关闭,裁决立即结算资金
AIMARKET_APPEAL_METIS_URL—申诉法院:第二个验证器。未设置或与一审 URL 相同时,申诉将保持关闭
AIMARKET_APPEAL_METIS_KEY—申诉法院 bearer 密钥
AIMARKET_APPEAL_VERIFIER_IDmetis.appeal@v1在信封中标识申诉法院;必须与 AIMARKET_VERIFY_VERIFIER_ID 不同
AIMARKET_APPEAL_BOND_MIN_USD / AIMARKET_APPEAL_BOND_RATE0.02 / 0.20保证金 = max(最低金额,费率 × 价格),最高不超过价格
AIMARKET_APPEAL_MAX_WAIT_S21600超过此时间后,法院将被视为无法裁决:维持一审裁决并退还保证金(0 = 不限时)
AIMARKET_APPEAL_SWEEP_S30安全兜底检查,用于完成已过期时限的处理并接收已提交的申诉
供应安全(社区发布者)

完整模型:docs/supply-security.md。以下任一阈值若为非有限值或非数值,系统都会发出警告并忽略该值,改用文档中注明的默认值——否则,nan 阈值会悄无声息地禁用其配置的防护门。

变量默认值说明
AIMARKET_SUPPLY_SECURITY_RELAXED01 = 开发绕过:最低质押额为零、无需响应签名、不执行罚没
AIMARKET_SUPPLY_MIN_STAKE_USD生产环境为 25,其他环境为 10(宽松模式下为 0)发布所需的质押额
AIMARKET_SUPPLY_PUBLISH_PER_HOUR5每位发布者每小时的发布次数
AIMARKET_SUPPLY_MIN_TRUST_DISCOVERAIMARKET_MIN_TRUST_SCORE(0.3)在 discover 中显示所需的最低信任分数
AIMARKET_SUPPLY_MIN_TRUST_INVOKE0.35被调用所需的最低信任分数
AIMARKET_SUPPLY_REQUIRE_RESPONSE_SIG仅在生产环境且非宽松模式下启用要求提供者响应签名使用 Ed25519
AIMARKET_SUPPLY_MAX_INPUT_KEYS32invoke 输入中可接受的顶层键数量
AIMARKET_SUPPLY_MAX_INPUT_JSON_BYTES32768invoke 输入大小上限
AIMARKET_SUPPLY_PRODUCT_ALLOWLIST—以逗号分隔的 product_id 允许列表
AIMARKET_SUPPLY_SLASH_FAILURE_THRESHOLD3质押被罚没前,窗口期内允许的提供者故障次数
AIMARKET_SUPPLY_SLASH_FAILURE_WINDOW_S600故障窗口期(必须 > 0;非正值会禁用罚没,因此系统会回退到默认值)
AIMARKET_SUPPLY_SLASH_COOLDOWN_S3600每个窗口期内,因故障触发的罚没最多执行一次;0 表示禁用冷却期
AIMARKET_SUPPLY_SLASH_DAILY_CAP_USD10因故障触发的罚没在滚动 24 h 内的上限;0 表示禁用上限
AIMARKET_SUPPLY_VERIFIED_FAIL_THRESHOLD3升级处理前,需收到的已付费 Metis“失败”判定次数
AIMARKET_SUPPLY_VERIFIED_FAIL_WINDOW_S86400这些判定的统计窗口期
AIMARKET_SUPPLY_VERIFIED_FAIL_MIN_CONSUMERS2所需的不同付费消费者数量——同一买家的重复失败只算一个声音
AIMARKET_SUPPLY_TRUST_GRAPH_MAX_EDGES1000信任图上限;截断时会记录受影响的发布者
AIMARKET_ORACLE_FAMILY_URLhttps://oracles.modelmarket.dev/familyLUMEN 信任预言机(回退到 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-protocolv2 规范性规范
aimarket-sdks客户端 SDK(Dart alpha)
aimarket-widget可嵌入式 UI
oracles可验证的数学能力——随机数、VDF、共识、声誉(列于 Hub)
desktop-integrations8 款 Flutter 消费类应用
生态系统架构完整的单体仓库示意图
dioscuri一对双生社区 Agent——MNEMOSYNE 问答

社区

DIOSCURI 双生 Agent 会根据已同步的 GitHub 文档回答问题。

渠道双生 Agent适合内容
DiscordPollux求助、想法、展示分享
TelegramCastor发布、摘要、速讯

生态系统地图: Alien Monitor · AICOM


License

Apache-2.0 — see LICENSE. Maintainers: CONTRIBUTORS.md.

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。