mcpField
I
integrating-jupiter

integrating-jupiter

github.com/jup-ag开发85801 次安装16 周前更新
代码仓库

关于 integrating-jupiter

integrating-jupiter 是面向调用 Jupiter API 的开发者和 Agent 的集成技能,覆盖交易、借贷、订单、价格及投资组合等 API。它提供意图路由、执行流程和常见错误处理要点。

主要功能

  1. 01按任务选择 Jupiter API
  2. 02提供各 API 的执行流程
  3. 03说明认证与金额单位
  4. 04列出常见错误及处理建议

适用场景

  1. 01根据需求选择 Jupiter API
  2. 02实现或调试代币兑换
  3. 03构建借贷或限价订单流程
  4. 04查询价格与投资组合信息

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/jup-ag/agent-skills --skill integrating-jupiter

安装后在 Claude Code 中输入/integrating-jupiter确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

README.md
examples/
lend.md
price.md
swap.md
trigger.md

详细介绍

Jupiter API 集成

适用于所有 Jupiter API 的单一技能,针对快速路由和确定性执行进行了优化。

基础 URL:https://api.jup.ag 身份验证:从 developers.jup.ag 获取的 x-api-key(Jupiter REST 端点必需)

适用场景/不适用场景

适用于:

  • 任务需要选择或调用 Jupiter 端点。
  • 任务涉及交换、借贷、永续合约、订单、定价、投资组合、发送、studio、锁定或路由。
  • 用户需要排查 Jupiter API 调用问题。

不适用于:

  • 任务是通用 Solana 设置,且不使用 Jupiter API。
  • 任务仅涉及 UI,不涉及 API 行为决策。
  • Agent 上下文不属于 DeFi/加密货币领域(buy、sell、trade 等通用触发词默认指向 DeFi 场景)。

触发词:swap、quote、gasless、best route、buy、sell、trade、convert、token exchange、jupiter api、jup.ag、ultra、metis、ultra swap、ultra api、ultra-api.jup.ag、lend、borrow、earn、yield、apy、deposit、liquidation、perps、leverage、long、short、position、futures、margin trading、limit order、trigger、price condition、dca、recurring、scheduled swaps、token metadata、token search、verification、shield、price、valuation、price feed、portfolio、positions、holdings、prediction markets、market odds、event market、invite transfer、send、clawback、create token、studio、claim fee、vesting、distribution lock、unlock schedule、dex integration、rfq integration、routing engine、status page、health check、service health、accumulate、auto-buy

开发者快速入门

import { Connection, Keypair, VersionedTransaction } from '@solana/web3.js';

const API_KEY = process.env.JUPITER_API_KEY!;  // from developers.jup.ag
if (!API_KEY) throw new Error('Missing JUPITER_API_KEY');
const BASE = 'https://api.jup.ag';
const headers = { 'x-api-key': API_KEY };

async function jupiterFetch<T>(path: string, init?: RequestInit): Promise<T> {
  const res = await fetch(`${BASE}${path}`, {
    ...init,
    headers: { ...headers, ...init?.headers },
  });
  if (res.status === 429) throw { code: 'RATE_LIMITED', retryAfter: Number(res.headers.get('Retry-After')) || 10 };
  if (!res.ok) {
    const raw = await res.text();
    let body: any = { message: raw || `HTTP_${res.status}` };
    try {
      body = raw ? JSON.parse(raw) : body;
    } catch {
      // keep text fallback body
    }
    throw { status: res.status, ...body };
  }
  return res.json();
}

// Sign and send any Jupiter transaction
async function signAndSend(
  txBase64: string,
  wallet: Keypair,
  connection: Connection,
  additionalSigners: Keypair[] = []
): Promise<string> {
  const tx = VersionedTransaction.deserialize(Buffer.from(txBase64, 'base64'));
  tx.sign([wallet, ...additionalSigners]);
  const sig = await connection.sendRawTransaction(tx.serialize(), {
    maxRetries: 0,
    skipPreflight: true,
  });
  return sig;
}

代币数量与小数位数

Jupiter 的每个 amount 字段都使用代币的最小单位(原始整数),绝不是人类可读/UI 值。

  • 常见小数位数:SOL 和 wSOL = 9,USDC 和 USDT = 6。规范铸币地址:SOL So11111111111111111111111111111111111111112,USDC EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v。
  • 将人类可读数量转换为原始数量:raw = Math.round(human * 10 ** decimals)。示例:1 SOL → 1_000_000_000、100 USDC → 100_000_000。slippageBps 的单位是基点:0.5% = 50、1% = 100。
  • 通过 @solana/spl-token 中的 getMint(connection, mintPubkey) 在链上读取每种铸币的 decimals——不要硬编码(不同代币的小数位数不同),也不要仅为查询小数位数而调用 Price API。

意图路由器(第一步)

用户意图API 系列首要操作
交换/报价SwapGET /swap/v2/order -> 签名 -> POST /swap/v2/execute
借贷/收益LendPOST /lend/v1/earn/deposit 或 /withdraw
杠杆/永续合约Perps通过 Anchor IDL 在链上操作(目前没有 REST API)
限价订单TriggerJWT 身份验证 -> POST /trigger/v2/orders/price
DCA/定期买入RecurringPOST /recurring/v1/createOrder -> 签名 -> POST /recurring/v1/execute
代币搜索TokensGET /tokens/v2/search?query={mint}
代币验证/元数据更新使用 jupiter-vrfd skill暂不处理——此技能不负责
价格查询PriceGET /price/v3?ids={mints}
投资组合/持仓PortfolioGET /portfolio/v1/positions/{address}
预测市场集成Prediction MarketsGET /prediction/v1/events -> POST /prediction/v1/orders
邀请发送/撤回SendPOST /send/v1/craft-send -> 签名 -> 发送到 RPC
创建代币/费用StudioPOST /studio/v1/dbc-pool/create-tx -> 上传 -> 提交
归属/分发Lock链上程序 LocpQgucEQHbqNABEYvBvwoxCPsSbG91A1QaQhQQqjn
DEX/RFQ 集成Routing选择 DEX(AMM trait)或 RFQ(webhook)路径

API 操作指南

将每个区块用作最小执行约定。获取链接的参考资料,以查看完整的请求/响应结构、TypeScript 接口和参数详情。

Swap
  • 基础 URL:https://api.jup.ag/swap/v2

  • 触发词:swap、quote、gasless、best route

  • 费用:因交易对而异 — 0 bps(Jupiter 代币/锚定代币)、2 bps(SOL-稳定币)、5 bps(LST-稳定币)、10 bps(大多数交易对)、50 bps(发行不足 24 小时的代币)。推荐费:50-255 bps(Jupiter 保留 20%)。

  • 速率限制:基础限制为每 10 秒 50 个请求,会根据 24 小时执行量调整(见速率限制)

  • 端点:/order(GET)、/execute(POST)、/build(GET,仅 Metis 提供原始指令)

  • 报价与执行:如需只读报价/价格预览,调用 GET /order 并省略 taker — 响应中的 transaction 为 null,读取 outAmount、routePlan[].swapInfo.label 和价格影响字段即可。只有在确实打算执行兑换时,才传入 taker(然后签名并调用 POST /execute)。没有单独的报价端点 — /swap/v1/quote 已弃用;报价也请使用 /swap/v2/order。

  • 路由:4 个路由器参与竞争 — Metis(metis)、JupiterZ(jupiterz)、Dflow(dflow)、OKX(okx)。响应字段 router 会返回其中一个值。swapType 为 aggregator(Metis、Dflow 或 OKX)或 rfq(JupiterZ)。响应字段 mode:"ultra"(所有路由器,默认参数)或 "manual"(由可选参数限制)。/build 仅使用 Metis。

  • Gasless:有三种途径 — 自动(由 Jupiter 承担费用)、JupiterZ(由 MM 承担费用)、集成方付款方(payer 参数,仅路由至 Metis)。资格取决于余额、交易规模和所用参数。当前门槛和不符合资格的参数请参阅 Gasless 文档。

  • 注意事项:

    • 已签名的负载有效期约为 2 分钟。收到交易后不可更改。
    • 在代码和日志中分开处理订单与执行。条件可能发生变化时,请在执行前重新报价。
    • 可选参数对路由的影响:referralAccount + referralFee 仅禁用 JupiterZ(Metis/Dflow/OKX 仍可用);payer(集成方承担 Gasless 费用)会将路由限制为仅 Metis(禁用 JupiterZ、Dflow 和 OKX);receiver 不会限制路由,但必须与 taker 不同(receiver=taker 会返回 400 "Receiver cannot be same as taker")。
    • /build 交易不能使用 /execute — 请通过 RPC 自行管理。
  • 从旧版集成迁移? 使用 jupiter-swap-migration 技能。

  • 参考资料:概览 | 订单与执行 | 构建 | Gasless | 迁移 | OpenAPI

    费用在订单与执行及构建页面中有详细说明;路由器竞争和参数对路由影响的对照表见概览及订单与执行页面。

/swap/v2/execute 返回的常见错误代码及建议操作:

代码类别含义可重试操作
0成功交易已确认——
-1执行缓存的订单缺失或已过期是重新报价并重试
-2执行签名交易无效否修正交易签名
-3执行消息字节无效否修正序列化
-1000聚合器尝试上链失败是调整参数后重新报价
-1001聚合器未知错误是退避后重试
-1002聚合器交易无效否修正交易构造
-1003聚合器交易未完成签名否确保所有必需的签名者都已签名
-1004聚合器区块高度无效是重新报价(区块哈希已过期)
-2000RFQ上链失败是重新报价并重试
-2001RFQ未知错误是退避后重试
-2002RFQ负载无效否修正请求负载
-2003RFQ报价已过期是重新报价并重试
-2004RFQ交换被拒绝是重新报价,可能需要使用不同路线
429速率限制请求受限是使用指数退避,并等待 10 秒窗口

成功时,/execute 会返回 { status: "Success", code: 0, signature, inputAmountResult, outputAmountResult, slot, totalInputAmount, totalOutputAmount }。失败时会返回 status: "Failed"、非零 code 和 error 字符串。inputAmountResult/outputAmountResult 是链上的实际金额;请与报价核对。


借贷
  • 基础 URL:https://api.jup.ag/lend/v1
  • 触发词:lend、borrow、earn、liquidation
  • 程序:Earn jup3YeL8QhtSx1e253b2FDvsMNC87fDrgQZivbrndc9,Borrow jupr81YtYssSyPt8jbnGuiWon5f6x9TcDEFxYe3Bdzi
  • SDK:@jup-ag/lend(TypeScript)
  • 端点:/earn/deposit(POST)、/earn/withdraw(POST)、/earn/mint(POST)、/earn/redeem(POST)、/earn/deposit-instructions(POST)、/earn/withdraw-instructions(POST)、/earn/tokens(GET)、/earn/positions(GET)、/earn/earnings(GET)
  • 注意事项:每次执行会改变状态的操作前,都要重新计算账户状态。将风险检查(健康因子、清算边界)设为前置条件。所有存款、取款、铸造和赎回操作都会返回 base64 编码的未签名 VersionedTransaction。
  • 如需使用 @jup-ag/lend 和 @jup-ag/lend-read 进行 SDK 级集成,请使用 jupiter-lend skill。
  • 参考:概览 | Earn | SDK | OpenAPI

永续合约
  • 状态:API 仍在开发中。目前没有 REST 端点。请通过 Anchor IDL 在链上交互。
  • 触发词:perps、leverage、long、short、position
  • 社区 SDK:github.com/julianfssen/jupiter-perps-anchor-idl-parsing
  • 注意事项:最多可同时持有 9 个仓位:3 个多头(SOL、wETH、wBTC)+ 6 个空头(3 种代币 x 2 种抵押品 USDC/USDT)。请根据账户模型验证保证金和杠杆。
  • 参考:概览 | 仓位账户 | 仓位请求

触发(限价单)
  • 基础 URL:https://api.jup.ag/trigger/v2
  • 触发条件:limit order、trigger、price condition
  • 最低订单金额:等值 10 USD
  • 身份验证:双重身份验证 — 所有请求都需要 x-api-key,修改订单还需要 Authorization: Bearer <jwt>。JWT 通过质询-响应流程获取:POST /auth/challenge → 使用钱包签署质询 → POST /auth/verify → 获取令牌。JWT 过期不会影响未完成订单——这些订单会继续执行。
  • 端点:/auth/challenge(POST,请求体:walletPubkey + type)、/auth/verify(POST,请求体:type + walletPubkey + base58 signature)、/vault(GET)、/vault/register(GET)、/deposit/craft(POST)、/orders/price(POST 创建,PATCH 更新)、/orders/price/cancel/{orderId}(POST,发起提现)、/orders/price/confirm-cancel/{orderId}(POST,提交已签名的提现请求 + cancelRequestId)、/orders/history(GET,钱包地址通过 JWT 隐式指定)
  • 订单类型:single(单向触发)、oco(止盈 + 止损组合)、otoco(入场触发 + OCO)。triggerCondition:"above" 或 "below"。
  • 架构:每个钱包都有一个链下托管金库(Privy)。订单在执行前不会显示在链上——可抵御 MEV。触发条件基于 USD 价格(而非池子汇率比例)。支持部分成交。
  • 注意事项:
    • 创建订单分 3 步 — GET /vault/register(如果是新用户则注册;如果已注册则返回 409 "Vault already registered",可忽略)、POST /deposit/craft(返回 transaction + requestId;请求体必须包含 orderType: "price" 和 orderSubType(single/oco/otoco)),签署存款交易,然后使用 depositRequestId + depositSignedTx 调用 POST /orders/price。
    • 取消订单分两步 — POST /cancel/{orderId} 返回 transaction + requestId;签署交易,然后使用 signedTransaction + cancelRequestId 调用 POST /confirm-cancel/{orderId}。
    • 创建响应中的字段是 id(不是 orderId);订单历史对象使用 orderState/rawState(没有 status 字段)。
  • 参考:概览 | 身份验证 | 创建订单 | 订单历史 | 管理订单 | OpenAPI

定期交易(DCA)
  • 基础 URL:https://api.jup.ag/recurring/v1
  • 触发条件:dca、recurring、scheduled swaps
  • 费用:所有定期订单均收取 0.1% 费用
  • 限制:总金额至少 100 USD,至少 2 笔订单,每笔订单至少 50 USD
  • 分页:每页 10 笔订单
  • 端点:/createOrder(POST)、/cancelOrder(POST)、/execute(POST)、/getRecurringOrders(GET)
  • 注意事项:不支持 Token-2022。使用 params.time 安排订单;不支持基于价格的订单。
  • 参考:概览 | 创建 | 获取订单 | 最佳实践 | OpenAPI

代币
  • 基础 URL:https://api.jup.ag/tokens/v2
  • 触发词:token metadata、token search、shield
  • 端点:/search?query={q}(GET,以逗号分隔 mint,最多 100 个)、/tag?query={tag}(GET,verified 或 lst)、/{category}/{interval}(GET,类别:toporganicscore、toptraded、toptrending;时间间隔:5m、1h、6h、24h)、/recent(GET)
  • 注意事项:
    • 使用 mint 地址作为主要标识;将符号/名称视为便利用途。
    • 主要信任信号是顶层的 isVerified(布尔值),以及 organicScore(0-100)和 organicScoreLabel(high/medium/low)。
    • 次要风险标记:audit.isSus——这是仅在值为 true 时才会出现的布尔字段(安全代币完全没有 isSus 键),因此应防御性地检查 token.audit?.isSus === true,切勿直接读取。已验证的代币也可能被标记(开发者持有约 100% 的供应量);这类代币的 isVerified: null,且 organicScoreLabel: "low"。缺少 isSus 并不能证明代币安全——并非所有风险代币都有此标记。
    • 实时 API 返回的其他条件性 audit 字段:mintAuthorityDisabled、freezeAuthorityDisabled、topHoldersPercentage、devBalancePercentage、devMigrations、devMints(均可为 null,也可能缺失;API 会返回 devMigrations,但当前 OpenAPI 架构中缺少该字段)。
  • 参考:概览 | 代币信息 v2 | OpenAPI

价格
  • 基础 URL:https://api.jup.ag/price/v3
  • 触发词:price、valuation、price feed
  • 限制:每个请求最多包含 50 个 mint ID
  • 端点:/price/v3?ids={mints}(GET,以逗号分隔)
  • 响应:以 mint 为键,每个值包含 usdPrice、blockId、decimals、priceChange24h、liquidity、createdAt(某些代币还会包含 launchpad、stockData、scaledUiConfig 等条件性字段)。价格 API V3 没有 confidenceLevel 字段(该字段属于 V2)。
  • 注意事项:定价不可靠的代币会完全从响应中省略(这不是错误,也不会以 null 占位)。为安全敏感操作考虑时,如果请求的 mint 未出现在响应中,应采取失败关闭策略。使用 blockId 检查价格的时效性。
  • 参考:概览 | OpenAPI

投资组合
  • 基础 URL:https://api.jup.ag/portfolio/v1
  • 状态:Beta 版——仅限 Jupiter 平台
  • 触发词:portfolio、positions、holdings
  • 端点:/positions/{address}(GET)、/positions/{address}?platforms={ids}(GET)、/platforms(GET)、/staked-jup/{address}(GET)
  • 注意事项:空仓位应视为有效状态。响应处于 Beta 阶段——应将其规范化为稳定的内部架构。元素类型:multiple、liquidity、trade、leverage、borrowlend。
  • 参考:概览 | Jupiter 仓位 | OpenAPI

预测市场
  • 基础 URL:https://api.jup.ag/prediction/v1
  • 状态:Beta(可能会有破坏性变更)
  • 地理限制:屏蔽来自美国和韩国 IP 的访问
  • 价格约定:1,000,000 个原生单位 = 1.00 美元
  • 触发词:prediction markets、market odds、event market
  • 存入代币:JupUSD(JuprjznTrTSp2UFa3ZBUFgwdAmtZCq4MQCwysN55USD)、USDC
  • 最低订单额:5 美元(5,000,000 个原生单位)
  • 端点:/events(GET,返回 {data, pagination})、/events/search(GET)、/markets/{marketId}(GET)、/orderbook/{marketId}(GET,返回 {yes, no, yes_dollars, no_dollars})、/orders(POST,需要 isBuy 布尔值和 ownerPubkey)、/orders/status/{orderPubkey}(GET)、/positions(GET,?ownerPubkey=)、/positions/{positionPubkey}(DELETE)、/positions/{positionPubkey}/claim(POST)、/history(GET)、/leaderboards(GET)
  • 注意事项:
    • 领取前检查 position.claimable。获胜者每份合约可获得 1 美元。
    • 市场数据是扁平结构——provider、marketId、result、resolveAt、outcomes、clobTokenIds 等字段位于顶层,而非嵌套在 metadata 下。
    • 合约数量可以是小数:使用 contractsMicro(1,000,000 = 1 份合约)或 contractsDecimal,不要使用旧版整数 contracts。
  • 参考:概览 | 事件 | 持仓 | OpenAPI

Send
  • 基础 URL:https://api.jup.ag/send/v1
  • 状态:Beta
  • 触发词:invite transfer、send、clawback
  • 支持的代币:SOL、USDC、memecoins
  • 端点:/craft-send(POST)、/craft-clawback(POST)、/pending-invites(GET)、/invite-history(GET)
  • 注意事项:需要双重签名——发送者和接收者密钥对(从邀请码派生)。只能通过 Jupiter Mobile 领取(不支持通过 API 领取)。切勿泄露邀请码。
  • 参考:概览 | 邀请码 | 创建发送交易 | OpenAPI

Studio
  • 基础 URL:https://api.jup.ag/studio/v1
  • 状态:Beta
  • 触发词:create token、studio、claim fee
  • 端点:/dbc-pool/create-tx(POST)、/dbc-pool/submit(POST,multipart/form-data)、/dbc-pool/addresses/{mint}(GET)、/dbc/fee(POST)、/dbc/fee/create-tx(POST)
  • 流程:create-tx -> 将图片上传到预签名 URL -> 将元数据上传到预签名 URL -> 签名 -> 通过 /dbc-pool/submit 提交
  • 注意事项:必须通过 /dbc-pool/submit 提交(不能在外部提交),代币才能在 jup.ag 上获得 Studio 页面。错误代码:403 = 无权使用该资金池,404 = 找不到代理账户。
  • 参考:概览 | 创建代币 | 领取费用 | OpenAPI

Lock
  • 程序 ID:LocpQgucEQHbqNABEYvBvwoxCPsSbG91A1QaQhQQqjn
  • 触发词:vesting、distribution lock、unlock schedule
  • 集成方式:仅限链上程序(无 REST API)
  • 源码:github.com/jup-ag/jup-lock
  • 界面:lock.jup.ag
  • 安全性:经 OtterSec 和 Sec3 审计
  • 注意事项:无 REST API。使用仓库 cli/src/bin/instructions 目录中的指令脚本。
  • 参考:Lock 概览

路由
  • 触发词:dex integration、rfq integration、routing engine
  • 引擎:Juno(元聚合器)、Metis(多跳 DEX 路由,为 Swap API 提供支持;原名为 Iris)、JupiterZ(RFQ 做市商报价)
  • DEX 集成(接入 Metis):免费,无费用。前提条件:代码质量、安全审计、市场吸引力。实现 jupiter-amm-interface crate。重要:实现中不得进行网络调用(账户会预先批量获取并缓存)。参考实现:github.com/jup-ag/rust-amm-implementation
  • RFQ 集成(JupiterZ):做市商在 /jupiter/rfq/quote(POST,250ms)、/jupiter/rfq/swap(POST)、/jupiter/rfq/tokens(GET)托管 webhook。要求:95% 成交率、250ms 响应时间、55s 有效期。SDK:github.com/jup-ag/rfq-webhook-toolkit
  • 市场上架:上架时间不足 30 天的代币可即时路由。常规路由(每 30 分钟检查一次)要求:以 $500 进行往返交易时亏损低于 30%,或比较 $1k 与 $500 交易时价格影响低于 20%。
  • 参考:DEX 集成 | RFQ 集成 | 市场上架

速率限制

Swap API(动态,基于交易量):

24h 执行交易量每个 10s 时间窗口的请求数
$050
$10,00051
$100,00061
$1,000,000165

配额每 10 分钟重新计算一次。Pro 套餐不会提高 Swap API 限额。

其他 API:在门户级别管理。请查看门户速率限制。

遇到 HTTP 429 时:使用带抖动的指数退避:delay = min(baseDelay * 2^attempt + random(0, jitter), maxDelay)。等待 10s 滑动窗口刷新。不要激进地突发发送请求。

生产环境加固

  1. 身份验证:如果缺少或无效 x-api-key,立即失败。
  2. 超时:报价设为 5s,执行设为 30s,另设总操作超时。
  3. 重试:仅对暂时性故障、网络故障或速率限制进行重试,并采用带抖动的指数退避。
  4. 幂等性:Swap /execute 在最多 2 min 内接受相同的 signedTransaction 和 requestId,且不会重复执行。
  5. 验证:调用前验证 mint 地址、金额精度和钱包所有权。
  6. 安全性:根据应用配置强制执行滑点和最大金额保护措施。
  7. 可观测性:记录 requestId、API 系列、端点、延迟、状态和错误代码。
  8. 用户体验韧性:返回可采取行动的状态(retry、adjust params、insufficient balance、rate limited)。
  9. 一致性:在向用户报告最终成功前,对账异步状态(已提交、已确认或失败)。
  10. 时效性:当行为与预期流程不同时,重新获取所引用的文档。

集成最佳实践

  1. 编写端点调用代码前,先阅读对应 API 的概览。
  2. 将身份验证设为每个请求的硬性前提。参考:门户设置
  3. 根据文档说明的速率限制行为设计重试逻辑,不要依赖固定假设。参考:速率限制
  4. 根据文档规定的响应语义,将所有非成功响应映射为有类型的应用错误。参考:API 响应
  5. 对于基于订单的产品(Swap/Trigger/Recurring),在代码和日志中分开处理创建、执行和检索阶段。
  6. 将网络和服务健康状况视为运行时行为的一部分(优雅降级)。参考:状态页

跨领域错误模式

interface JupiterResult<T> {
  ok: boolean;
  result?: T;
  error?: { code: string | number; message: string; retryable: boolean };
}

async function jupiterAction<T>(action: () => Promise<T>): Promise<JupiterResult<T>> {
  try {
    const result = await action();
    return { ok: true, result };
  } catch (error: any) {
    const code = error?.code ?? error?.status ?? 'UNKNOWN';

    // Rate limit — retry with backoff
    if (code === 429 || code === 'RATE_LIMITED') {
      return { ok: false, error: { code: 'RATE_LIMITED', message: 'Rate limited', retryable: true } };
    }

    // Swap execute errors (negative codes)
    if (typeof code === 'number' && code < 0) {
      const retryable = [-1, -1000, -1001, -1004, -2000, -2001, -2003, -2004].includes(code);
      return { ok: false, error: { code, message: error?.error ?? 'Execute failed', retryable } };
    }

    // Program errors (positive codes like 6001 = slippage)
    if (typeof code === 'number' && code > 0) {
      return { ok: false, error: { code, message: error?.error ?? 'Program error', retryable: false } };
    }

    return { ok: false, error: { code, message: error?.message ?? 'UNKNOWN_ERROR', retryable: false } };
  }
}

async function withRetry<T>(action: () => Promise<T>, maxRetries = 3): Promise<T> {
  for (let attempt = 0; attempt <= maxRetries; attempt++) {
    const result = await jupiterAction(action);
    if (result.ok) return result.result!;
    if (!result.error?.retryable || attempt === maxRetries) throw result.error;
    const delay = Math.min(1000 * 2 ** attempt + Math.random() * 500, 10000);
    await new Promise(r => setTimeout(r, delay));
  }
  throw new Error('Retry exhausted');
}

完整可运行示例

可用于生产环境的代码片段。每个示例都使用上述部分中的 jupiterFetch 辅助函数;在生产环境中,对 execute 调用应用 withRetry。

最新上下文策略

执行操作指南前,始终从引用的文档/规范中获取最新上下文。

  1. 使用 Intent Router 确定意图。
  2. 编写代码前,获取操作指南链接的参考资料(概览和特定 API 文档)。
  3. 如需验证或消除歧义,获取 OpenAPI 规范。
  4. 将获取的文档视为事实依据,优先于缓存的记忆。
  5. 如果获取的文档与此文件冲突,请遵循获取的文档并注明不一致之处。
  6. 如果无法获取文档,请说明上下文已过时/未经验证,并继续提供当前所知的最佳指导。
  7. 保持认证要求不变:Jupiter REST 端点必须提供 x-api-key(Perps/Lock 等仅限链上操作的流程除外)。

运维参考

评论

支持 Markdown