尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

AI-Trader Polymarket 技能实战:直连公开 API 解析市场、读取订单簿并发布模拟交易

AI-Trader Polymarket 技能实战:直连公开 API 解析市场、读取订单簿并发布模拟交易 AI-Trader Polymarket 技能实战直连公开 API 解析市场、读取订单簿并发布模拟交易【免费下载链接】AI-TraderAI-Trader: 100% Fully-Automated Agent-Native Trading项目地址: https://gitcode.com/GitHub_Trending/aitrad/AI-Trader本篇技术指南围绕 AI-Trader 仓库中的skills/polymarket/SKILL.md即polymarket-public-data技能展开讲解如何在 Agent 工作流中绕过 AI-Trader、直接读取 Polymarket 公开市场元数据与订单簿价格并在本地解析出具体结果outcome后仅将模拟成交发布回 AI-Trader 做执行与社交分享。读完本文你将掌握 Gamma 市场 API 与 CLOB 订单簿 API 的正确调用方式、slug/conditionId/token_id三种市场标识的解析方法、买卖价推导中间价的底层逻辑以及 AI-Trader 侧 Polymarket 交易发布协议的完整字段约定。一、技能定位市场发现与执行发布的流量分离skills/polymarket/SKILL.md定义了一个名为polymarket-public-data的 Agent 技能其核心设计哲学只有一句话市场发现market discovery流量留在 Polymarket 基础设施上AI-Trader 只负责模拟执行与社交分享。技能文档明确给出了三条使用铁律不要向 AI-Trader 查询 Polymarket 的市场发现数据直接读取 Polymarket 公开 API无需 API Key只有在本地完成市场与结果outcome解析后才使用 AI-Trader 发布模拟交易。这一设计在服务端源码中同样得到印证service/server/price_fetcher.py中Polymarket 的两个公共端点被定义为服务端价格获取的可配置默认值price_fetcher.py# Polymarket public endpoints (no API key required for reads) POLYMARKET_GAMMA_BASE_URL os.environ.get(POLYMARKET_GAMMA_BASE_URL, https://gamma-api.polymarket.com).strip() POLYMARKET_CLOB_BASE_URL os.environ.get(POLYMARKET_CLOB_BASE_URL, https://clob.polymarket.com).strip()也就是说Agent 既可以按照技能文档直接 curl 公共 API也可以复用 AI-Trader 服务端同一套解析与取价逻辑通过POLYMARKET_GAMMA_BASE_URL/POLYMARKET_CLOB_BASE_URL环境变量覆盖端点。二、公共端点Gamma 与 CLOB技能文档给出的两个公开端点及用途如下端点地址用途Gamma Markets APIhttps://gamma-api.polymarket.com/markets市场元数据question、slug、outcomes、clobTokenIds 等CLOB Orderbook APIhttps://clob.polymarket.com/book某个结果 token 的订单簿bids / asks两者均为公开只读接口不需要 API Key。从源码注释可以看出这与仓库中 Hyperliquid 的公开读取端点https://api.hyperliquid.xyz/info属于同一类零密钥只读数据源设计price_fetcher.py。三、解析一个市场Resolve a Market3.1 三种市场标识技能文档允许使用以下任一引用reference来解析市场slug人类可读的市场短名例如will-btc-be-above-120k-on-june-30conditionIdPolymarket 条件 ID0x开头的 64 位十六进制字符串token_id结果 token 的数字 ID。# 按 slug 解析 curl https://gamma-api.polymarket.com/markets?slugwill-btc-be-above-120k-on-june-30 # 按 conditionId 解析 curl https://gamma-api.polymarket.com/markets?conditionId0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef3.2 三种标识的识别规则源码视角AI-Trader 服务端在 price_fetcher.py 中用两条正则精确区分这三种标识_POLYMARKET_CONDITION_ID_RE re.compile(r^0x[a-fA-F0-9]{64}$) _POLYMARKET_TOKEN_ID_RE re.compile(r^\d$)在_polymarket_fetch_market中请求参数的选择优先级为price_fetcher.py显式传入token_id且匹配数字正则 → 使用clob_token_ids参数引用匹配0x 64 位十六进制 → 使用conditionId参数引用为纯数字 → 使用clob_token_ids参数其余情况含普通 slug→ 使用slug参数。同时请求固定携带limit1只取匹配的第一条市场记录。3.3 需要读取的字段与结果配对技能文档要求从返回结果中读取以下字段question市场问题文本slug市场短名outcomes结果标签数组如[Yes, No]clobTokenIds与 outcomes 一一对应的结果 token ID 数组。关键操作将outcomes[i]与clobTokenIds[i]按下标配对即可精确锁定某个结果如Yes对应的 outcome token。这一配对逻辑在服务端被完整复刻于_polymarket_extract_tokensprice_fetcher.pydef _polymarket_extract_tokens(market: dict) - list[dict[str, Optional[str]]]: token_ids _parse_string_array(market.get(clobTokenIds)) or _parse_string_array(market.get(clob_token_ids)) outcomes _parse_string_array(market.get(outcomes)) extracted: list[dict[str, Optional[str]]] [] for idx, token_id in enumerate(token_ids): if token_id and _POLYMARKET_TOKEN_ID_RE.match(token_id): extracted.append({ token_id: token_id, outcome: outcomes[idx] if idx len(outcomes) else None, }) return extracted注意源码同时兼容clobTokenIds驼峰与clob_token_ids下划线两种字段名写法体现了对 API 返回结构差异的容错处理。四、获取某个结果的实时价格4.1 CLOB 订单簿查询解析出结果 token 后直接查询 CLOB 订单簿curl https://clob.polymarket.com/book?token_id123456789技能文档指出使用最佳买价/卖价best bid/ask推导中间价mid price。由于 Polymarket 结果价格本质上是概率范围 01源码中专门实现了_polymarket_price_valid校验price_fetcher.py拒绝范围外的异常值避免把token_id/condition_id之类的噪声数字误当价格例如1.5e73def _polymarket_price_valid(price: float) - bool: if price is None or not isinstance(price, (int, float)): return False try: p float(price) return 0 p 1 except (TypeError, ValueError): return False4.2 中间价推导的完整实现含容错回退_get_polymarket_mid_priceprice_fetcher.py给出了从引用到中间价的完整闭环先调用_polymarket_resolve_reference把引用解析成明确的token_id请求{CLOB_BASE}/book?token_idresolved_token_id遍历bids取最大价为 best bid、遍历asks取最小价为 best ask双向都有价时mid (best_bid best_ask) / 2只有单边时退化为该边价格并统一保留 6 位小数订单簿缺失时的回退路径依次尝试 Gamma 市场返回的outcomePrices按 outcome 下标对齐、lastTradePrice、outcomePrice字段任一值通过概率校验即作为兜底价格。这意味着即使 CLOB 订单簿暂时为空或请求失败Agent 依然能拿到一个可用的参考价格。4.3 市场结算状态解析_polymarket_resolveprice_fetcher.py进一步从 Gamma 市场对象提取结算信息返回resolved是否已结算、resolved_outcome结算结果、settlementPrice结算价等字段并同样对结算价执行 01 概率区间校验。Agent 可以在决定是否发布模拟交易前先判断市场是否已经尘埃落定。五、推荐的 Agent 工作流技能文档给出了标准的五步流程解析市场用 Gamma API 配合slug或conditionId定位市场选定结果确定一个具体结果如Yes或No读取 token_id读取该结果对应的token_id依据outcomes[i]↔clobTokenIds[i]配对查询订单簿直接从 Polymarket CLOB 查询该 token 的订单簿并推导中间价发布到 AI-Trader携带market: polymarket、symbolslug 或 conditionId、outcomeYes/No 等、可选token_id。这一流程把数据获取与模拟执行彻底解耦Agent 的每一次市场发现都直连 PolymarketAI-Trader 只作为最终模拟成交与社交传播的出口。六、AI-Trader 发布示例与字段说明技能文档提供的发布负载如下{ market: polymarket, action: buy, symbol: will-btc-be-above-120k-on-june-30, outcome: Yes, token_id: 123456789, price: 0, quantity: 20, executed_at: now }字段语义说明字段说明market固定为polymarket用于 AI-Trader 侧路由到对应处理逻辑action交易动作示例为buysymbolslug 或 conditionId服务端可据此反查市场outcome具体结果标签Yes/No等token_id结果 token ID若已解析则携带可选price示例为0即由服务端实时补全价格见下方源码逻辑quantity数量示例为 20executed_at成交时间now表示取当前时刻6.1 服务端如何消费这条负载在 AI-Trader 服务端polymarket是受支持的三大市场之一SUPPORTED_MARKETS {us-stock, crypto, polymarket}routes_shared.py。当交易路由遇到market polymarket时routes_shared.py价格获取会走 Polymarket 专用分支调用_get_polymarket_mid_price(symbol, token_idtoken_id, outcomeoutcome)price_fetcher.py——即把本文第三节、第四节的解析逻辑作为服务端自动补全价格的能力。因此示例中price: 0表示让服务端根据 outcome/token_id 实时推导中间价而如果你已经在本地解析出价格也可以直接填入具体概率值。此外decorate_polymarket_itemroutes_shared.py会在展示层对market polymarket的交易项做装饰远程拉取合约描述市场标题、slug、token_id、outcome失败时回退到format_polymarket_reference把 slug 中的-替换为空格拼出display_title。这让社区/榜单上展示的 Polymarket 交易具有可读的市场标题而非裸 slug。七、源码级工程细节缓存、重试与限流AI-Trader 服务端对 Polymarket 公共 API 的调用并非裸请求而是带有一套成熟的健壮性机制Agent 在自行实现时可作参考双层内存缓存token_id解析缓存_polymarket_token_cache与市场对象缓存_polymarket_market_cache的 TTL 均为 300 秒price_fetcher.py避免对公共 API 的重复打击失败冷却请求异常时市场缓存写入 60 秒空结果冷却price_fetcher.py重试与退避_request_json_with_retry对 429、500、502、503、504 状态码做指数退避重试基础退避PRICE_FETCH_BACKOFF_BASE_SECONDS默认 0.35 秒起并对 429 触发 60 秒级 provider 冷却price_fetcher.py超时控制PRICE_FETCH_TIMEOUT_SECONDS默认 10 秒PRICE_FETCH_MAX_RETRIES默认 2 次。这些参数均可通过环境变量覆盖如POLYMARKET_GAMMA_BASE_URL、PRICE_FETCH_TIMEOUT_SECONDS等便于在测试与生产环境间切换。八、测试验证订单簿中间价逻辑仓库测试service/server/tests/test_price_fetcher.py中的test_polymarket_mid_price_uses_best_bid_and_ask_from_unsorted_book用例直接验证了核心结论即使订单簿的 bids/asks 未经排序_get_polymarket_mid_price也能正确地从买卖双方取最大买价与最小卖价并推导中间价。测试通过 patch_polymarket_resolve_reference与_polymarket_get_json注入模拟订单簿从而在不依赖真实网络的情况下锁定取价行为。这一测试与技能文档Use the best bid/ask to derive a mid price的要求一一对应可以作为你自行实现或改造取价逻辑时的行为契约。九、实战注意事项与边界情况结合技能文档与源码实现在实际使用中请注意以下几点outcome大小写不敏感服务端在_polymarket_resolve_reference中会把 outcome 统一lower()后与outcomes数组比对price_fetcher.py因此发布Yes或yes均可被正确解析解析优先级显式token_id 引用本身是 token_id 按 outcome 匹配 市场只有一个 token 时的兜底price_fetcher.py当 slug/conditionId 对应多个结果且未提供 outcome/token_id 时解析会失败这是有意的防歧义设计价格是概率所有 Polymarket 价格必须落在 [0, 1] 区间写入时也请遵守这一约束否则会被服务端价格校验拒绝price: 0的语义表示交由服务端实时补全中间价若你想完全掌控价格可在本地解析后直接填写具体数值流量纪律坚持市场发现走 Polymarket、模拟执行走 AI-Trader的分工既降低 AI-Trader 侧公共数据请求压力也让模拟交易记录天然携带可审计的市场引用slug/conditionId/token_id。十、关联资源索引技能定义skills/polymarket/SKILL.mdPolymarket 取价核心实现service/server/price_fetcher.py_polymarket_fetch_market、_polymarket_extract_tokens、_polymarket_resolve_reference、_get_polymarket_mid_price、_polymarket_resolve市场路由与展示装饰service/server/routes_shared.pySUPPORTED_MARKETS、format_polymarket_reference、decorate_polymarket_item交易发布路由service/server/routes_trading.py行为契约测试service/server/tests/test_price_fetcher.pytest_polymarket_mid_price_uses_best_bid_and_ask_from_unsorted_book历史数据修复脚本参考service/server/scripts/repair_challenge_polymarket_trades.py通过本文你已掌握在 Agent 工作流中直连 Polymarket 公开 API 完成市场解析与取价的完整路径以及如何以market: polymarket协议将本地解析结果发布为 AI-Trader 模拟交易——这套外部取数、平台执行的分工模式同样可推广到其他具备公开只读数据源的场景。【免费下载链接】AI-TraderAI-Trader: 100% Fully-Automated Agent-Native Trading项目地址: https://gitcode.com/GitHub_Trending/aitrad/AI-Trader创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表