创建Pythonx402Facilitator与BazaarDiscovery create-python-x402-facilitator-bazaar

创建 Python x402 Facilitator 与 Bazaar Discovery 扩展,用于自动编目和索引支付受限的 API,增强资源服务器的发现能力。

后端开发 0 次安装 0 次浏览 更新于 3/4/2026

创建 Python x402 Facilitator 与 Bazaar Discovery

创建 Python x402 服务,使用 Bazaar 发现扩展自动编目和索引支付受限的 API。

先决条件

在使用此技能之前,请确保:

  1. Python 3.10+ 已安装
  2. x402-avm 带有扩展pip install "x402-avm[extensions,avm]"
  3. 熟悉 x402 资源服务器 和 Facilitator 概念
  4. Web 框架 已安装:pip install "x402-avm[extensions,avm,fastapi]"[...,flask]

Bazaar Discovery 功能

Bazaar 是内置于 x402 的资源发现协议。它允许支付受限的 API 宣传:

  • 它们接受的输入 – GET/HEAD/DELETE 的查询参数,或 POST/PUT/PATCH 的请求正文模式
  • 它们返回的输出 – 响应数据的形状、类型和示例

此元数据使 Facilitator 能够自动编目和索引 x402 启用的资源,因此客户端可以通过它们的功能而不是仅通过 URL 发现 API。它是付费 API 的机器可读菜单。

资源服务器(声明)         Facilitator(编目)        客户端(发现)
+---------------------------+      +----------------------+      +-------------------+
| RouteConfig + extensions: |      | extract_discovery_   |      | with_bazaar()     |
|   **declare_discovery_    | ---> |   info()             | ---> |   .list_resources()|
|     extension(...)        |      | validate_discovery_  |      |                   |
+---------------------------+      |   extension()        |      +-------------------+
                                   +----------------------+

如何进行

第 1 步:安装依赖项

# 扩展 + Algorand + FastAPI
pip install "x402-avm[extensions,avm,fastapi]"

# 扩展 + Algorand + Flask
pip install "x402-avm[extensions,avm,flask]"

extensions 额外安装 jsonschema>=4.0.0 用于模式验证。

第 2 步:在路由上声明发现扩展

使用 declare_discovery_extension() 在您的路由配置上描述每个端点接受和返回的内容。

对于 GET 端点(查询参数):

from x402.extensions.bazaar import declare_discovery_extension, OutputConfig

discovery = declare_discovery_extension(
    input={"city": "San Francisco"},
    input_schema={
        "properties": {
            "city": {"type": "string", "description": "城市名称"},
        },
        "required": ["city"],
    },
    output=OutputConfig(
        example={"weather": "sunny", "temperature": 70},
        schema={
            "properties": {
                "weather": {"type": "string"},
                "temperature": {"type": "number"},
            },
            "required": ["weather", "temperature"],
        },
    ),
)

对于 POST 端点(JSON 正文):

discovery = declare_discovery_extension(
    input={"prompt": "告诉我关于 Algorand 的信息", "max_tokens": 100},
    input_schema={
        "properties": {
            "prompt": {"type": "string"},
            "max_tokens": {"type": "integer"},
        },
        "required": ["prompt"],
    },
    body_type="json",
    output=OutputConfig(
        example={"text": "Algorand 是...", "tokens_used": 42},
    ),
)

第 3 步:将扩展添加到路由配置

将发现字典展开到您的路由的 extensions 字段:

from x402.http import PaymentOption
from x402.http.types import RouteConfig
from x402.schemas import Network

AVM_NETWORK: Network = "algorand:SGO1GKSzyE7IEPItTxCByw9x8FmnrCDexi9/cOUJOiI="

routes = {
    "GET /weather": RouteConfig(
        accepts=[
            PaymentOption(
                scheme="exact",
                pay_to=AVM_ADDRESS,
                price="$0.001",
                network=AVM_NETWORK,
            ),
        ],
        description="天气报告",
        mime_type="application/json",
        extensions={
            **declare_discovery_extension(
                input={"city": "San Francisco"},
                input_schema={
                    "properties": {"city": {"type": "string"}},
                    "required": ["city"],
                },
                output=OutputConfig(
                    example={"weather": "sunny", "temperature": 70},
                ),
            )
        },
    ),
}

第 4 步:在服务器上注册 Bazaar 扩展

from x402.server import x402ResourceServer
from x402.http import FacilitatorConfig, HTTPFacilitatorClient
from x402.extensions.bazaar import bazaar_resource_server_extension
from x402.mechanisms.avm.exact import ExactAvmServerScheme

facilitator = HTTPFacilitatorClient(FacilitatorConfig(url="https://x402.org/facilitator"))
server = x402ResourceServer(facilitator)
server.register(AVM_NETWORK, ExactAvmServerScheme())
server.register_extension(bazaar_resource_server_extension)

第 5 步:在 Facilitator 方面提取和验证

from x402.extensions.bazaar import extract_discovery_info, validate_discovery_extension

# 从支付请求中提取发现信息
discovered = extract_discovery_info(
    payment_payload=payment_payload,
    payment_requirements=payment_requirements,
    validate=True,
)

if discovered:
    print(f"URL: {discovered.resource_url}")
    print(f"Method: {discovered.method}")
    print(f"Description: {discovered.description}")

第 6 步:应用支付中间件

FastAPI:

from fastapi import FastAPI
from x402.http.middleware.fastapi import PaymentMiddlewareASGI

app = FastAPI()
app.add_middleware(PaymentMiddlewareASGI, routes=routes, server=server)

Flask:

from flask import Flask
from x402.http.middleware.flask import payment_middleware

app = Flask(__name__)
payment_middleware(app, routes=routes, server=server)

重要规则 / 指南

  1. 发现是链无关的 – 相同的 Bazaar 元数据适用于客户端使用哪种支付网络(AVM、EVM、SVM)。
  2. 扩展展开到路由 – 使用 **declare_discovery_extension(...){"bazaar": {...}} 字典合并到路由的 extensions 字典中。
  3. body_type 确定输入类型None(默认)创建查询扩展(GET/HEAD/DELETE)。"json" 创建正文扩展(POST/PUT/PATCH)。
  4. 服务器扩展是必需的 – 在服务器上注册 bazaar_resource_server_extension 以在运行时用 HTTP 方法丰富声明。
  5. 验证使用 jsonschema[extensions] 额外安装 jsonschema。验证检查 info 数据是否符合其 schema

常见错误 / 故障排除

错误 原因 解决方案
ImportError: jsonschema 缺少 [extensions] 额外 安装 pip install "x402-avm[extensions]"
KeyError: 'bazaar' 路由上未声明扩展 **declare_discovery_extension(...) 添加到路由配置 extensions
ValidationResult.valid is False 扩展信息与模式不匹配 检查示例数据是否符合声明的输入/输出模式
discovered is None 支付请求中没有 Bazaar 扩展 确保服务器端声明和扩展注册都已就绪
body_type not set for POST POST 路由被视为查询扩展 body_type="json" 添加到 declare_discovery_extension()

参考资料 / 进一步阅读