@ agg- building/ sdk
Vanilla 类型脚本客户端 恶作剧 预测市场聚合物—— 一个客户端,每个表面(自动,市场,订单,图表,交易,管理下的执行, 腾讯网.
这是什么
@agg-build/sdk 是安装最低级别的软件包伙伴。 它通过HTTPS和AGG API说话
WebSockets, 管理认证/ 会话状态, 并曝光每个产品端点的打入包装
(市场、订货簿、图表、贸易执行、存款/提款、管理下的钱包、
,(增加). 它没有框架依赖性,在浏览器,Node.js和React Introduct中工作.
反应应用程序, 层 @agg-build/hooks, (中文(简体) ), @agg-build/ui,以及 @agg-build/auth 在顶端,他们都使用这个客户端
在引擎盖下.
何时使用此软件包
- 您正在构建一个 vanilla TS/JS app, React Industrial app, 或服务器侧整合 .
- 您要为 AGG REST API 和 WebSocket 网关输入一个已输入的、包含电池的客户端 .
- 您正在自编自导出反应层, 并需要基本的 认证/ 部分/ 交易原始 .
- 您需要只使用服务器的助手: SSR 配置取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取,
或管理员 API 客户端(参见
@agg-build/sdk/server) (中文(简体) ).
如果您正在运送一个 React app 并且想要现成的钩子或 UI, 请安装 @agg-build/hooks, (中文(简体) ),
@agg-build/ui,以及 @agg-build/auth
相反,这些软件包是建立在 @agg-build/sdk。 。 。 .
安装
npm install @agg-build/sdk
快开始
import { createAggClient } from "@agg-build/sdk";
const client = createAggClient({
baseUrl: "https://api.agg.market",
appId: "your-app-id",
});
// Health check
const hello = await client.getHello();
// Current auth state (persisted across reloads via localStorage)
console.log(client.isAuthenticated, client.user);
认证一个用户( SIWE)
// 1. Start the auth flow
const { nonce } = await client.authStart({ provider: "siwe" });
// 2. Build the EIP-4361 message
const message = client.buildSiweMessage({
address: "0x…",
chainId: 1,
nonce,
domain: window.location.host,
uri: window.location.origin,
});
// 3. Sign with the user's wallet (wagmi, viem, ethers, …)
const signature = await wallet.signMessage(message);
// 4. Verify → stores accessToken + user in the client
const { accessToken, user } = await client.verify({ message, signature });
SIWS (索拉纳语) 使用相同的流量 buildSiwsMessage 以及一个基数58编码的Ed25519签名.
重定向流(Google,苹果,Twitter,电子邮件magic-link)返回一个URL来导航:
const response = await client.authStart({
provider: "google",
redirectUrl: "https://yourapp.com/auth/callback",
});
if (response.type === "redirect") {
window.location.assign(response.url);
}
// …back on the callback page:
const code = new URLSearchParams(window.location.search).get("code");
if (code) {
await client.exchangeAuthCode(code);
window.history.replaceState(null, "", window.location.pathname);
}
Http 纯饼干- 新鲜模式
对于选择一个的浏览器应用程序 HttpOnly 刷新饼干 存储刷新标志 在JS,
用 authDelivery: "cookie-refresh"数字 :
const client = createAggClient({
baseUrl: "https://api.agg.market",
appId: "your-app-id",
authDelivery: "cookie-refresh",
});
在这个模式下, verify() 财务报告和审定财务报表 exchangeAuthCode() 可省略 refreshToken 从返回
对象。 刷新饼干仍保留在 AGG API 主机下 /auth 从未接触过
伙伴前端域.
流取数据( WebSocket)
const ws = client.createWebSocket({
onSnapshot: (outcomeId, book) => console.log("snapshot", outcomeId, book),
onDelta: (outcomeId, book) => console.log("delta", outcomeId, book),
onTrade: (trade) => console.log("trade", trade.venue, trade.price, trade.size),
});
// Orderbooks are keyed by venueMarketOutcomeId (the `outcomes[].id` on REST).
const unsubscribe = ws.subscribe("venue-market-outcome-id");
// Optional: authenticate for user-scoped events (orders, balances)
ws.authenticate(accessToken);
// Cleanup
unsubscribe();
ws.destroy();
createWebSocket 需求 wsUrl 改为: createAggClient基础
AggWebSocket 如果想要更好的控制,也可以直接被即时处理.
服务器侧助手
从 /server 仅限节点公用事业的入口:
import { AggAdminClient, signExternalId, verifyWebhook } from "@agg-build/sdk/server";
// Sign a partner external-ID assertion before sending to the browser
const assertion = signExternalId(process.env.AGG_APP_SECRET!, partnerUser.id);
// Verify an inbound webhook
verifyWebhook(rawBody, req.headers, process.env.AGG_WEBHOOK_SECRET!);
// Admin API client (uses x-app-api-key)
const admin = new AggAdminClient({
baseUrl: "https://api.agg.market",
apiKey: process.env.AGG_APP_API_KEY!,
});
const users = await admin.listUsers("your-app-id", { limit: 50 });
客户选项
| 选项 | 类型 | 需求 | 说明 |
|---|---|---|---|
baseUrl | string | 对 | API 基础 URL( 如. https://api.agg.market(中文(简体) ) |
appId | string | 应用/adminKey软件之一 | 合作伙伴应用程序标识 |
adminKey | string | 应用/adminKey软件之一 | 管理层路由的管理员 API 密钥 |
wsUrl | string | 用于 WebSocket | WebSocket网关 URL( 需要由 createWebSocket(中文(简体) ) |
orderbookUrl | string | 没有 | 订购簿频道的第二个套接字 。 取消设置时保留命令簿 wsUrl。设定时,只使用订购簿的订阅 wsUrl 闲置 |
orderbookLatency | "conflated" | "realtime" | 没有 | 秩序书分层. 默认 conflated 省略 latency· ; realtime 送来 |
authDelivery | "body" | "cookie-refresh" | 没有 | 脚本传送模式( 默认 ): "body"(中文(简体) ) |
persistSession | boolean | 没有 | 本地Storage 的 persist 认证提示( 默认 ): true(中文(简体) ) |
kalshiDemo | boolean | 没有 | 折旧相容性选项; 忽略 |
打电话 client.destroy() 当你不再需要客户端释放内部资源时
(BroadcastChannel用于跨tab auth同步).
主要出口
AggClient 方法
认证会话( S)
| 方法 | 说明 |
|---|---|
authStart(body) | 启动任何认证流( SIWE nonce、 OAuth 重定向等) |
buildSiweMessage(params) | 构建 EIP-4361 信件字符串 |
buildSiwsMessage(params) | 构建索拉纳签名消息 |
verify({ message, signature }) | 验证 SIWE/ SIWS 签名, 存储符牌 |
exchangeAuthCode(code) | 交换令牌的重定向认证代码 |
refreshAccessToken() | 使用存储的刷新符牌刷新 JWT |
setSession({ accessToken, refreshToken?, user? }) | 从重定向调回的种子符号 |
setAccessToken(token) 编号 : clearAccessToken() | 直接管理 JWT |
signOut() | 撤销令牌服务器侧并清除本地会话 |
onAuthStateChange(listener) | 订阅认证状态更改 |
isAuthenticated 编号 : user 编号 : authStatus | 当前会话状态的获取器 |
用户配置文件账户( A)
| 方法 | 说明 |
|---|---|
getCurrentUser() | 从中获取当前用户配置 /users/me |
updateUser(data) | 更新用户名, 外观等 . |
createAvatarUploadUrl(contentType) | 获得预先签名的外观上传 URL |
linkExternalId({ externalId, timestamp, hmac }) | 链接后端签名的伙伴用户ID |
disconnectAccount(provider) | 删除链接的认证提供者 |
市场数据
| 方法 | 说明 |
|---|---|
getVenueEvents(options?) | 列表预测市场事件( cursor pagination) |
getVenueEventById(id) | 通过 ID 获取单个事件 |
getVenueMarkets(options?) | 列表带有过滤器的会场市场( cursor pagination) |
getCategories(options?) | 清单市场类别 |
相关市场
| 方法 | 说明 |
|---|---|
resolveCorrelatedMarkets(params) | 解决市场和回报扩大/尖端思想 |
getCorrelatedMarketCascade(params) | 获取已知会场的扩展/尖端想法 |
getMarketCorrelatedSignals(id) | 检查产生市场信号 |
queryCorrelatedMarkets(params) | 通过信号相似性搜索市场 |
订单和路由
| 方法 | 说明 |
|---|---|
getOrderbooks(params) | 获得给定的每个月的现场订单 venueMarketIds |
getSmartRoute(params) | MILP 解析器,用于在不同地点之间优化顺序 |
图表数据
| 方法 | 说明 |
|---|---|
getChartBars(params) | 贸易View风格的OHLCV蜡烛 |
getPricesHistory(params) | 地点市场结果的价格历史 |
getOrderbookHistory(params) | 结果的顺序书深度历史 |
贸易
| 方法 | 说明 |
|---|---|
validateTrade(body) | 飞行前贸易验证 |
executeTrade(body) | 通过后端执行所支持的预测-市场订单 |
computeSplits(body) | 通过 API 计算不同地点的最佳订单 |
地点键
| 方法 | 说明 |
|---|---|
listVenueKeys(venues?) | 列出存储地点 API 密钥( 未返回秘密) |
upsertVenueKey(body) | 创建或更新会场 API 密钥 |
deleteVenueKey(venue) | 删除会场 API 密钥 |
管理执行和结余
| 方法 | 说明 |
|---|---|
validateManaged(params) | 平衡和过渡要求 |
executeManaged(params) | 填入引号 getSmartRoute() - 见下注 |
withdrawManaged(params) | 从管理的钱包撤回到外部地址 |
withdrawPreview(params) | 预览退出收到数额和路由费 |
getWithdrawalQuote(params) | 引用最高可交付提款额 |
syncManagedBalances() | 触发链上平衡同步 |
cancelManagedOrder(orderId) | 取消待决的管理下执行命令 |
getVenueBalances(venues) | 在各地取得平衡 |
getManagedBalances() | 获取每个链子和每个收入的钱包余额管理 |
getDepositAddresses() | 获取管理的钱包存款地址( EVM + Solana) |
要引出并填补一个管理下的交易, 瞄准一个场地市场 结果. 采购预算与
maxSpend; 销售指定与 sellShares。通过返回 quoteId
改为 executeManaged()数字 :
const buyRoute = await client.getSmartRoute({
venueMarketOutcomeId,
tradeSide: "buy",
maxSpend: 50,
});
await client.executeManaged({ quoteId: buyRoute.quoteId });
const sellRoute = await client.getSmartRoute({
venueMarketOutcomeId,
tradeSide: "sell",
sellShares: 10,
});
await client.executeManaged({ quoteId: sellRoute.quoteId });
venueMarketId, (中文(简体) ), outcomeId,以及 side: "yes" | "no" 仍为已贬值的相容性别名;
应使用新的整合 venueMarketOutcomeId 财务报告和审定财务报表 tradeSide。 。 。 .
在v4中被删除.
quoteManaged()——其终点,POST /execution/quote,在API上并不存在,所以这个电话只有 返回 404号。 取上取出两相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相.
命令和职位
| 方法 | 说明 |
|---|---|
getOrders(params?) | 列出交易执行人命令 |
getExecutionOrders(params?) | 列出执行命令( cursor pagination) |
getExecutionPositions(params?) | 列出执行位置( cursor pagination) |
getPositions(params?) | 按匹配的市场组合打开位置 |
getUserHoldings(params) | 每个地点获得用户位置 |
领导板
| 方法 | 说明 |
|---|---|
getLeaderboard(params?) | 按已实现的 P&L 或音量( cursor pagination) 设置的交易领导板 |
公用事业
| 方法 | 说明 |
|---|---|
getHello() | 健康检查 |
request(path, init?) | 401上自动重试的通用HTTP |
createWebSocket(callbacks?) | 创建 WebSocket 实例( 需要) wsUrl(中文(简体) ) |
destroy() | 发布资源(广播频道等) |
独立公用事业
| 导出 | 说明 |
|---|---|
AggWebSocket | 低级 WebSocket 客户端( 由 client.createWebSocket()(中文(简体) ) |
CandleBuilder | 图表-图书-不可知性蜡烛制造器(贸易-OHLC) |
computeBestSplitsByAmount | 纯功能:最佳地在会场订货簿中分拆 |
applyOrderbookDelta | 将 WS 三角形应用到模拟命令簿 |
computeChecksum | CRC32 订货簿校验和(用于检测干燥剂) |
snapshotToOrderbook | 将 WS 快照转换为内元件 |
aggregateMidpoint | 各个地点的总结果中点 |
mergeCandles | 合并活 + 历史蜡烛 碰撞时的活赢 |
mergeClosedCandles | 只将蜡烛完全关闭的选项 |
TurnstileChallengeError | 当一个认证端点需要 Turnstile 挑战时抛出 |
AggApiError | 每一次非-2xx API 响应被丢弃——见下文 |
isAggApiError | 类型守护 AggApiError |
处理错误
每一个非-2xx 反应被扔作为一个 AggApiError 携带 status,并且 --
当API供给他们的时候—— code, (中文(简体) ), retryable 和每个外地 errors部门
打开 status编号 :code 而不是匹配消息文本; 消息是人为的
并可能被重新措辞.
import { isAggApiError } from "@agg-build/sdk";
try {
await client.getPositions();
} catch (err) {
if (isAggApiError(err)) {
if (err.status === 401) return promptReconnect(); // session lapsed
if (err.code === "unregistered_domain") {
// The signed SIWE `domain` is not in the app's allowedOrigins.
// Note this is NOT the Origin header — sign-in works with no Origin
// at all, which is what makes Node and React Native work.
}
}
throw err;
}
@agg-build/sdk/server
| 导出 | 说明 |
|---|---|
AggAdminClient | 使用 x-app-api-key (仅服务器) |
signExternalId(secret, userId) | HMAC 在打电话前签名一个伙伴用户ID linkExternalId() |
verifyWebhook(payload, headers, secret) | 验证输入的 Webhook 签名 |
parseWebhookEvent(payload, headers, secret) | 校验 + 解析一个被键入的事件 |
WebhookVerificationError | 丢入签名/时间戳失败 |
WebSocket 回调
| 回电 | 当它起火时 |
|---|---|
onSnapshot(outcomeId, book) | 收到完整的订货簿快照 |
onDelta(outcomeId, book) | 应用递增式订单簿更新 |
onTrade(trade) | 交易执行 |
onHeartbeat(hb) | 服务器心跳( 每30s) |
onSubscribed 编号 : onUnsubscribed | 订阅生命周期 |
onConnected 编号 : onAuthenticated | 连接/ 认证生命周期 |
onOrderSubmitted | 通过 WebSocket 设置顺序 |
onBalanceUpdate | 余额变动事件 |
onMarketResolved | 市场解决 |
onDiagnostics(event) | 诊断事件(seq缺口、断层连接) |
onConnectionStateChange(connected) | 主连接状态已更改 |
onOrderbookConnectionStateChange(connected) | 订单套接字状态 。 仅在 orderbookUrl 设定 |
onError(msg) | 服务器发送错误消息 |
命令书按结果键. OrderbookState.outcomeId 是一个
书;被贬损 OrderbookState.marketId 持有同样的结果id, 没有 地点
市场编号,因为订货簿框架没有市场编号。 使用 REST 软件 venueMarketId
(例如来自 getOutcomeOrderbooks或你自己的结果 / 当你需要市场绘图时
市场.
关键行为 :
- 与每个市场重新计算的订阅单项持续连接.
orderbookUrl将命令簿频道移动到第二个套接字上并报告onOrderbookConnectionStateChange。只订阅订单不保留wsUrl连接。 交易、arb、目录和用户活动保持不变wsUrl。 。 。 . - 每集市内订单状态(snapshot + delta并有CRC32核查).
- 序列间隙或校验和错配会触发自动回放.
snapshot_unavailable复试只影响活性结果,每套最多有3个紧张的复试,最多每套每秒再试20个结果。 仍然到达错误onError; 成功快照、 未订阅和套接字关闭将取消等待重试 。 缺少的答复仍由可选书监督员负责.- 以指数回放自动重联(基数1s,最大为30s).
- 活性:45s没有消息触发重接;服务器心跳每30s.
- 投标总是排序 降级,问总是排序 升级.
自动附加信头
x-app-id——从appId选项Authorization: Bearer <jwt>- 注册后x-admin-key如果adminKey提供x-auth-delivery: cookie-refresh+ 键credentials: "include"只有认证的请求authDelivery: "cookie-refresh"已启用
入境点
| 条目 | 目的 |
|---|---|
@agg-build/sdk | AggClient, (中文(简体) ), createAggClient, (中文(简体) ), AggWebSocket水电费 |
@agg-build/sdk/server | 只有节点的帮助者:管理客户端,外部ID/webhook签名 |
同伴依赖关系
无——至于v4,也没有运行时间依赖关系. 捆绑的唯一模块
进口为 node:crypto (使用时间: @agg-build/sdk/server因此,一个新的安装是
1 MB以下,无中转.
带上你的钱包库 SDK 构建 SIWE/ SIWS 消息串, 绝不
签名本身,所以 viem, (中文(简体) ), ethers,或者任何其他签名者的工作——你通过
在一个 signMessage 函数.
在v4中有所改变. 先前版本已声明
viem, (中文(简体) ),ethers@5, (中文(简体) ),@polymarket/clob-client财务报告和审定财务报表@polymarket/builder-signing-sdk作为运行时间 依赖性。 从未导入过代码路径, 但安装者仍在付费 - 大约100 MB的node_modules穿过他们的中转树 他们 在v4中被删除; SDK的行为没有任何改变.
链接
- 文 件 - 存档副本 https://docs.agg.market/ 互联网档案馆的存檔,存档日期2013-12-02
- Demo app - 软件 https://agg.market/ (中文(简体) )
- 反应钩-
@agg-build/hooks - 贸易UI -
@agg-build/ui - 连接/ 登录 UX ——
@agg-build/auth
许可证
麻省理工学院
地点活动读取录取
getVenueEventById 共享同时在每一个客户端内读取和认证
届会(包括常会) cluster 财务报告和审定财务报表 minVolume 查询值). 它保留
没有完成结果缓存。 最多四个不同的活动同时进行;
最多128 等待FIFO顺序。 全队拒绝方式 AggApiError 状态429,
代码 client_read_queue_full,并重试延迟提示.
一个服务器429仍然拒绝原调用,而没有自动重试. 新员额
已队列事件读取其荣誉 Retry-After 延迟加最多250ms正焦;
缺少提示使用一秒钟。 呼叫者可以独立取消; 共享抓取
只有在所有来电者离开后才取消。 队列读取拒绝 AbortError
如果在录取前认证更改. destroy() 取消待读 .
其他读取方法和写取方法保留了现有的再试行为.