AI2 / DEVELOPER DOCUMENTATION

AI2 API 接入指南

通过 API Key 接入图片生成、图像分析和多轮对话。完整接口参数、响应说明与可运行的调用示例。

v1.0 · Key 接入已开放

版本:1.0 · 更新日期:2026-10-29

AI2 API 提供图片生成、图像分析、批量生成和多轮对话能力。使用服务方分配的 API Key 即可从服务端调用,无需登录或维护 Cookie。

阅读导航

首次接入建议依次阅读「接入地址」「API Key 鉴权」「配置与模型」「后台单张出图」。后续可按需接入历史下载、同步分析、项目管理、批量生成和 AI 对话。文中所有 Key、模型名称和业务 ID 均为占位示例。

1. 接入地址与调用流程

调用能力、额度和并发上限以所分配账户为准。任务通过轮询查询结果,暂不提供完成回调 Webhook。建议由您的服务端保存并使用 API Key。

2. API Key 鉴权

向服务方申请 API Key,并在每次请求头中携带:

HTTP
Authorization: Bearer <API_KEY>

验证 Key 与账户状态:

BASH
export AI2_BASE='https://gen.ai2.lxyi.top'
export AI2_API_KEY='替换为服务方分配的API_KEY'
curl --fail-with-body -sS \
  -H "Authorization: Bearer $AI2_API_KEY" \
  "$AI2_BASE/ui/api/account"

API Key 用于所有业务请求,包括任务提交、状态查询和图片下载。请将其保存在服务端环境变量或凭据管理系统中,不要放入公开网页或 URL 参数。

Key 的有效期与权限由服务方设置。Key 被撤销、账户停用或到期时返回 HTTP 401;请联系服务方确认或更换 Key。

3. 配置、模型与账户

方法路径用途
GET/ui/api/account返回 {mode:"card",account,requests};account 包含余额与权限,requests 为本人最近调用
GET/ui/api/choices可用模型连接、默认配置和路由选项
GET/ui/api/models?keyId=...&proxyId=...获取指定模型连接的模型列表;proxyId 可省略
GET/ui/api/prices{items:[...]},本人可见收费模板
POST/ui/api/rechargeJSON {"card":"充值卡密"},兑付成功返回账户信息

choices 结构示意(编号和模型仅为示例,以实际返回为准):

JSON
{
  "defaults":[{"kind":"image","keyId":1,"model":"实际模型ID","proxyId":null}],
  "keys":[{"id":1,"provider":"服务商ID","providerName":"服务商名称","name":"模型连接名称"}],
  "proxies":[{"id":2,"name":"代理名称"}]
}

models 的 models[] 元素包含 id,name,type,aspectRatios,resolutions。如响应存在 errors[],请检查其中的错误消息,不能仅凭 HTTP 200 认定模型列表完整可用。接口仅返回本账户可见的连接与模型;调用还需满足相应的计价配置及余额要求。

所有模型调用的共同字段:

字段说明
keyId从 choices.keys[].id 获取的模型连接编号,multipart 中按文本传入
model模型真实 ID,非展示名称;应显式填写
proxyId省略或空字符串:连接默认路由;none:直连;数字字符串:指定路由编号
prompt完整提示词,非空,最多 32000 个 UTF-16 编码单元;请包含本次任务所需的完整要求
aspectRatio如 1:1、3:4;留空由服务商决定,需要固定比例时请明确传入
resolution如 1K、2K;留空使用模型默认值。实际支持范围由模型、服务商及收费模板决定

4. 后台单张出图(推荐)

提交成功后返回 HTTP 202,后台继续处理。客户端断连不会取消任务。

POST /ui/api/generation-jobs

请求类型:multipart/form-data。请求头 X-Request-Id 必填,允许 1~100 位字母、数字、下划线、连字符,建议始终使用 UUID,兼容其它付费接口的 16~100 位要求。

表单字段必填说明
keyId, model, prompt是见共同字段
proxyId, aspectRatio, resolution否见共同字段
images[] 或 images否可重复的 JPG / PNG 文件,服务端检查文件头;是否必须有参考图取决于模型
projectId否本账户的项目 UUID;不传则不归项目
title, shotName否用于历史记录展示的商品标题、分镜名
shotId否关联项目中已有的分镜 ID
references否JSON 数组字符串,复用项目图或历史成图,见下例
adoption否preview 只保存为候选结果;其他值按服务端条件尝试自动采用
expectedContentVersion否已有分镜的内容版本;不匹配返回 409
currentResultId否提交时的当前结果 ID;不匹配会阻止自动采用
BASH
export AI2_KEY_ID='从choices取得的编号'
export AI2_MODEL='从models取得的模型ID'
# 一次业务操作生成一个编号,并持久保存;网络重试复用同一编号。
export AI2_REQUEST_ID="$(uuidgen)"
curl --fail-with-body -sS -H "Authorization: Bearer $AI2_API_KEY" \
  -H "X-Request-Id: $AI2_REQUEST_ID" \
  --form-string "keyId=$AI2_KEY_ID" \
  --form-string "model=$AI2_MODEL" \
  --form-string 'prompt=根据参考图生成商品主图,保持商品外形和颜色,白色背景。' \
  --form-string 'aspectRatio=1:1' \
  --form-string 'adoption=preview' \
  -F 'images[]=@product.jpg;type=image/jpeg' \
  "$AI2_BASE/ui/api/generation-jobs"

使用 curl -F 时不要手工设置 Content-Type,由客户端生成 multipart boundary。--form-string 可避免提示词开头的 @ 等字符被 curl 当作文件指令。

复用已保存图片时,将 references 作为普通文本字段:

JSON
[{"projectImageId":"img1"},{"historyId":"历史成图UUID"}]

projectImageId 需要同时提供 projectId,且图片已上传;historyId 必须是本人历史中的图片结果。可与文件上传同时使用,顺序是本次上传图片在前、references 数组在后。接口不支持把任意公网图片 URL 直接作为这个字段。

202 响应示意:

JSON
{
  "id":"生成任务UUID",
  "state":"queued",
  "error":null,
  "created":1793300000000,
  "updated":1793300000000,
  "cancel_requested":false
}

任务可能已立即进入 running 或完成;以实际 state 为准。同一账户和同一 X-Request-Id 再次提交返回原任务,忽略新请求中的输入,不创建新任务。 更改提示词或参考图属于新操作,需使用新编号。

查询、取消和重试

方法路径返回与说明
GET/ui/api/generation-jobs/{id}单任务;完成后含 historyId、adoption
GET/ui/api/generation-jobs?projectId=...{items:[...]},最近 100 条普通任务;可省略项目筛选
POST/ui/api/generation-jobs/{id}/cancel{ok:true};排队中取消,运行中只取消自动采用,仍回收结果并核对费用
POST/ui/api/generation-jobs/{id}/retry带新的 X-Request-Id,202 返回新任务;只允许明确 failed 的普通任务

单任务响应使用 historyId;列表响应使用 history_id、shot_id、cancel_requested。请勿混用两种命名。

state含义与处理
queued已持久化,等待执行
running正在处理,继续查询
done图片结果已归档,取 historyId 下载;账务仍以历史 / 账户调用记录为准
failed明确失败,可检查原因并通过 retry 新建任务
pending上游执行或归档结果不明确,需要核对,禁止自动重试
cancelled排队任务已取消

建议每 2~5 秒轮询一次,自行设置等待期限;停止等待后保留任务 ID,下次继续查询。服务恢复后,排队任务继续执行;执行结果不明确的任务可能转为 pending,需联系服务方核对。

adoption 为 adopted(已自动采用)、available(可用候选)或 conflict(版本 / 当前选择 / 提交顺序变化,未自动采用)。这三种值的区别不影响通过 historyId 下载已归档结果。

Python 完整调用示例

依赖 requests。设置环境变量 AI2_API_KEY、AI2_KEY_ID、AI2_MODEL、AI2_REQUEST_ID;请求编号由调用方为每次业务操作生成并保存,网络重试使用原编号。当前目录准备 product.jpg。示例会发起真实模型调用并按账户规则计费。

PYTHON
import os
import time
from pathlib import Path
import requests

base = "https://gen.ai2.lxyi.top"
session = requests.Session()

def checked(response):
    response.raise_for_status()
    return response

session.headers["Authorization"] = "Bearer " + os.environ["AI2_API_KEY"]

with open("product.jpg", "rb") as image:
    job = checked(session.post(base + "/ui/api/generation-jobs",
        headers={"X-Request-Id": os.environ["AI2_REQUEST_ID"]},
        data={"keyId": os.environ["AI2_KEY_ID"],
              "model": os.environ["AI2_MODEL"],
              "prompt": "生成白底商品图,保持商品外形和颜色。",
              "aspectRatio": "1:1", "adoption": "preview"},
        files=[("images[]", ("product.jpg", image, "image/jpeg"))],
        timeout=(15, 120))).json()

print("请保存任务编号:", job["id"], flush=True)
deadline = time.monotonic() + 900
while job["state"] in ("queued", "running"):
    if time.monotonic() >= deadline:
        raise TimeoutError("等待结束,任务仍保留;稍后使用已保存的任务编号继续查询")
    time.sleep(3)
    job = checked(session.get(base + "/ui/api/generation-jobs/" + job["id"],
                              timeout=(15, 30))).json()

if job["state"] != "done":
    raise RuntimeError(f"请核对任务,勿自动重新提交:{job}")
response = checked(session.get(base + "/ui/api/history/" + job["historyId"] +
                              "/image", timeout=(15, 120)))
mime = response.headers.get("Content-Type", "").split(";")[0].strip()
suffix = {"image/png": ".png", "image/jpeg": ".jpg"}.get(mime)
if suffix is None:
    raise RuntimeError("下载响应不是预期的图片:" + mime)
Path("generated" + suffix).write_bytes(response.content)
print("图片已保存;请通过历史详情或账户调用记录核对最终账务。")

示例对网络异常直接报错,不自动重复付费请求。提交响应丢失时,可用同一账户和原 AI2_REQUEST_ID 重新提交相同输入找回任务;已取得任务编号则直接查询。

5. 历史、图片下载与账务

方法路径说明
GET/ui/api/history?offset=0&q=&projectId=...{items,total,offset,limit},固定每页 24 条;offset 是条数偏移,下一页加 24;q 搜索标题或模型,最多 100 字符
GET/ui/api/history/{historyId}完整提示词、分析文本 / 图片元数据、输入清单及账务信息
GET/ui/api/history/{historyId}/image图片二进制,Content-Type 为实际图片类型
GET/ui/api/history/{historyId}/image?download=1附件下载原图
GET/ui/api/history/{historyId}/input/{index}原始输入图片;index 取详情 inputs[].index,可附加 ?download=1

history 的 projectId 不传查全部,none 查未分类,项目 UUID 查指定项目。图片读取需要有效 API Key,不能作为无需认证的公网图链给外部系统直接抓取。需要外部公开展示时,由第三方服务端下载后存入自己的存储。

BASH
curl --fail-with-body -sS -H "Authorization: Bearer $AI2_API_KEY" \
  "$AI2_BASE/ui/api/history/替换为historyId/image?download=1" \
  -o generated.image

请同时检查 HTTP 状态码和 Content-Type,避免把 JSON 错误体当图片。

账务状态与生成状态分别判断:reserved 处理中,settled 已按用量结算,refunded 明确未发出 / 未计费失败,pending 待核对,resolved 已核对。点数采用十进制字符串,建议用 Decimal / BigDecimal 计算。

账户有可用余额才允许调用;不预先冻结新调用费用,也不设单次扣费封顶,完成后可扣为负数。模型、服务商、分辨率需同时满足权限和有效收费模板。生成成功也可能因上游用量不完整而账务 pending;不要因此重新出图。

6. 同步分析与同步出图

方法路径成功响应
POST/ui/api/analyzeHTTP 200 JSON {text,billing};text 是模型返回的文本,不保证是合法 JSON
POST/ui/api/generateHTTP 200 PNG / JPEG 原始字节,不是 JSON、Base64 或 URL

请求均为 multipart/form-data,使用 keyId、model、proxyId、prompt、images[];出图还支持 aspectRatio、resolution;可传 projectId、title、shotName 关联历史。references 资源复用仅后台任务接口支持,同步接口需上传文件。

请求必须携带 X-Request-Id,16~100 位字母、数字、下划线、连字符。同步接口相同编号重复调用返回 409,不重放旧响应。推荐新集成使用后台出图接口;同步分析仍需等待 HTTP 返回。

BASH
curl --fail-with-body -sS -H "Authorization: Bearer $AI2_API_KEY" \
  -H "X-Request-Id: $(uuidgen)" \
  --form-string "keyId=$AI2_KEY_ID" \
  --form-string 'model=替换为文本或识图模型ID' \
  --form-string 'prompt=请分析商品外观、材质、用途与卖点。' \
  -F 'images[]=@product.jpg;type=image/jpeg' \
  "$AI2_BASE/ui/api/analyze"

成功响应头 X-Generation-Id 是历史 ID;同步出图另有 X-Duration-Ms,有账务时带 X-Billing-State、X-Points-Charged。分析的 billing 在 JSON 内。

同步请求在服务器并发槽满时最多排队 10 分钟,超时 429;还会受到客户端、反向代理和上游超时影响。断连或超时不代表未调用 / 未扣费,应检查历史与账户记录。

7. 项目与分镜(按需接入)

项目用于管理一组参考图、分镜和生成结果。创建项目只需名称;也可以不建项目直接出图。

方法路径请求 / 响应
GET/ui/api/projects{items:[...]}
POST/ui/api/projectsJSON {"name":"第三方商品项目"};返回 id、name、created、updated、version
GET/ui/api/projects/{id}项目、version、state、images
POST/ui/api/projects/{id}JSON name 改名,或 {version,changes} 增量保存
POST/ui/api/projects/{id}/delete软删除,历史归入未分类
POST/ui/api/projects/{id}/restore恢复项目及历史关联
POST/ui/api/projects/{id}/images/{imageId}请求体为 JPG / PNG 原始字节,不是 multipart;单张最大 25 MiB;imageId 为 1~40 位字母数字下划线连字符
GET/ui/api/projects/{id}/images/{imageId}图片字节,可加 download=1
POST/ui/api/projects/{id}/images/{imageId}/delete删除图片关联
GET/ui/api/projects/{id}/shots/{shotId}/versions{items,selectionVersion,currentResultId}
POST/ui/api/projects/{id}/shots/{shotId}/adoptJSON {resultId,selectionVersion},显式采用已有结果;版本变化返回 409

增量保存 changes 支持 form、plan、images、shotsUpsert、removedShots、shotOrder。先读取最新 version 再提交;409 后重新读取并合并,不能直接覆盖。兼容全量 {version,state},建议新接入使用增量。

JSON
{
  "version":0,
  "changes":{
    "shotsUpsert":[{"id":"main","name":"主图","promptEnglish":"White background product photo"}]
  }
}

项目内分镜 ID 为 1~100 位字母、数字、下划线、连字符。自动采用结果要求分镜内容版本、选择版本及最新提交序号仍匹配;与图片无关的名称 / 排序变化不影响内容版本。生成时可传 adoption=preview,由业务系统自行决定使用哪张结果。

8. Vertex 批量出图(可选)

批量能力需由服务方开通,并使用支持 Vertex 批量生成的模型连接。请先调用 options 确认可用性。

方法路径说明
GET/ui/api/batch/options?keyId=...{available:false} 或含 available、location、resolution、discount 的对象
POST/ui/api/batchmultipart 创建批次,HTTP 200 返回批次及 items
GET/ui/api/batch?projectId=...批次列表,可按项目筛选;不是 /batch/{id} 查询
POST/ui/api/batch/{id}/cancel尝试取消上游批次,已结束等情况返回 409

表单字段为 keyId、model、proxyId、projectId、title、aspectRatio、resolution、items、anchorShot。resolution 只允许空或 1K;每批 1~200 项。

items 是 JSON 数组字符串:

JSON
[
  {"shotId":"main","shotName":"主图","prompt":"生成白底商品图","files":["ref1"],"aspectRatio":"1:1"},
  {"shotId":"detail","shotName":"细节图","prompt":"生成商品细节图","files":["ref1"],"aspectRatio":"3:4"}
]

图片作为 multipart 文件字段 ref1 上传;items[].files 必须与文件字段名一致,同一图片只需上传一次。文件字段名限 1~60 位字母、数字、下划线、连字符。项目分镜可另传 contentVersion、currentResultId。

建议始终传 X-Request-Id(1~100 位上述字符);同账户同编号返回原批次,不传则没有本项幂等保护。两段批量时 anchorShot 指定主图 shotId,其余依赖项 files 中加入 @main,服务端等主图完成后再提交依赖项。

查询返回各批次 items,单项含 idx、shot_id、shot_name、state、history_id、error。批次可能部分成功(partial),逐项检查并下载有 history_id 的结果。批量的 pending / 提交结果不明确时,同样不能自动重复创建付费批次。options 中 discount 为批量配置提示,最终扣点以账务记录为准。

9. AI 对话(可选)

方法路径说明
GET / POST/ui/api/chats列表 {items};创建 JSON {"title":"第三方对话"},返回会话 id
GET/ui/api/chats/{id}会话与 messages
POST/ui/api/chats/{id}/renameJSON {"title":"新名称"}
POST/ui/api/chats/{id}/sendJSON {text,keyId,model,proxyId};带 X-Request-Id(16~100 位),默认返回完整会话 JSON
GET/ui/api/chat-media?keyId=...&model=...&proxyId=...所选模型附件策略,上传前查询
GET/ui/api/chats/{id}/attachments/{attachmentId}附件读取,可加 download=1

带附件时 send 改用 multipart,同名文本字段加可重复 files[];支持类型、大小和数量取决于模型策略。纯文本 text 为 1~12000 字符,带附件可空。

send 请求头加 Accept: text/event-stream 开启 SSE,事件依次为 start(已保存用户消息)、delta({"text":"新增文字"})、done(完整会话),异常用 error(error、billed)。HTTP 已进入流后,不能只凭 HTTP 200 认定成功;必须处理 done / error,断线后读取会话核对,不能直接重发。

10. 错误码、限额与重试约定

普通错误 JSON 为 {"error":"原因"};模型执行相关错误可能另有 billed 布尔值。billed:true 表示可能已计费,需核对,不代表已完成最终扣点。没有 billed 字段也不能据此断定上游未执行。

HTTP常见原因建议
400JSON / multipart、请求编号、提示词、格式或参数不合法修正参数
401Key 无效、账户禁用或过期、会话失效检查 Key 和账户状态,保留原请求编号
402可用点数不足充值后操作
403账户权限、收费模板、跨源写入被拒绝检查账户权限 / 配置和请求来源
404对象不存在、不属于本账户、功能未启用或版本不支持检查 ID、账户权限及功能是否开通
405HTTP 方法不支持按接口表使用方法
409重复同步调用、项目 / 选择版本冲突、任务不允许重试或取消按具体 error 查询原结果 / 最新版本
413请求体、项目状态或项目图片超过限制减小输入
429并发限制、排队超时或上游限流核对任务与账务,再退避;后台任务 pending 不自动重试
500 / 502 等服务异常或模型调用失败先核对结果,避免重复付费

multipart 单个文本字段最大 512 KiB,文本与文件字段合计最多 1000 个。项目参考图上传单张最大 25 MiB;生成请求总大小和参考图数量还受所选模型与服务配置限制。遇到 413 时请减小输入或联系服务方确认限额。

最关键的接入约定:保存业务请求编号、任务 ID、历史 ID;区分任务与账务状态;仅对明确 failed 的普通任务使用 retry;pending、超时和断连先核对。不同账户的数据相互隔离,无权限对象通常返回 404。API Key 是访问凭据;keyId、model、prompt 和 X-Request-Id 是各自独立的业务参数,请按接口要求填写。

11. 真实调用数据

以下为 AI2 实际生成历史的脱敏快照,采集时间为 2026-10-29 22:11:01(America/Los_Angeles,UTC−07:00)。采集时共有 408 条已归档记录;本次取最近 24 条,其中图片生成 19 条、分析 5 条,均已结算。

类型真实模型 ID样本数平均耗时平均扣点合计扣点
图片生成gemini-nano-banana-2.11928.30 秒4.458150 点84.704850 点
分析gemini-4-argon5112.36 秒4.256240 点21.281200 点

最近 8 条记录:

脱敏编号归档时间模型耗时实际扣点状态
fc6ada16972026-10-29 21:08:00gemini-nano-banana-2.131.426 秒3.777450 点已结算
998415934b2026-10-29 21:07:02gemini-nano-banana-2.123.912 秒4.969200 点已结算
ad9b82ac7e2026-10-29 21:06:32gemini-nano-banana-2.119.728 秒3.778350 点已结算
794463db2c2026-10-29 21:05:26gemini-nano-banana-2.115.933 秒3.951600 点已结算
51d172a1692026-10-29 21:05:03gemini-nano-banana-2.123.776 秒4.729650 点已结算
49222f4dae2026-10-29 21:04:25gemini-nano-banana-2.124.872 秒4.800900 点已结算
4353a79fbd2026-10-29 20:59:05gemini-4-argon112.515 秒4.588600 点已结算
da53c8a54e2026-10-29 20:42:42gemini-4-argon66.497 秒4.494600 点已结算

统计仅覆盖所选已归档记录,不包含全部失败或未完成调用,不能据此计算整体成功率。耗时取记录的 durationMs;扣点是历史实际结算值,非人民币金额、固定报价或服务时限承诺。记录不含账户、Key、提示词或图片内容。

12. 接入支持

联调或异常核对时,请向服务方提供请求时间、接口路径、HTTP 状态码、X-Request-Id,以及已获得的任务 ID 或历史 ID。请勿在问题描述、截图或普通日志中提供完整 API Key。

Key 发放、权限开通、并发额度、计价与异常账务核对均由服务方受理。