5 分钟跑通第一条续写请求。服务地址 https://api.elisnovel.com,鉴权用 Authorization: Bearer <key>。
curl -N https://api.elisnovel.com/v1/continue \
-H "Authorization: Bearer $ELIS_KEY" \
-H "Content-Type: application/json" \
-d '{
"p1": "第一章 雪夜\n他推开门,风雪灌了进来。",
"p2": "第二章 山门\n雪还在下。",
"skel": "他走进山门,看见【一个人影】站在台阶尽头。",
"stream": true
}'
-N 是必须的(关掉 curl 的缓冲,否则你会以为卡住了)。
import json, requests
resp = requests.post(
"https://api.elisnovel.com/v1/continue",
headers={"Authorization": f"Bearer {KEY}", "Content-Type": "application/json"},
json={"p1": p1, "p2": p2, "skel": skel, "stream": True},
stream=True, # 必须
timeout=(10, 600), # 连接 10s,读 600s(一章可能跑到 6 分钟)
)
resp.raise_for_status()
text = ""
for raw in resp.iter_lines(decode_unicode=True):
if not raw or raw.startswith(":"): # 空行 / 心跳注释帧 → 跳过
continue
if not raw.startswith("data: "):
continue
payload = raw[6:].strip()
if payload == "[DONE]":
break
ev = json.loads(payload)
if "choices" not in ev: # queued_ms / error 之类的信息帧
if ev.get("truncated"):
print("⚠️", ev.get("note"))
continue
for ch in ev["choices"]:
piece = (ch.get("delta") or {}).get("content")
if piece:
text += piece
print(piece, end="", flush=True)
print("\n共", len(text), "字")
| 字段 | 类型 | 说明 |
|---|---|---|
p1 | string | 必填。上一章正文 |
p2 | string | 必填。本章前文 |
skel | string | 必填。本章骨架,用 【】 标出要展开的点 |
stream | bool | 必须是 true。公网只提供流式 |
model | string | 可选,默认 elisnovel-v4-32g |
逐帧 data: {...},最后 data: [DONE]。另外会有:
: —— 心跳/保活,客户端必须忽略(标准 SSE 解析器默认就忽略);data: {"queued_ms":1250,"congestion":"busy"} —— 只在排队时出现,当信息帧跳过;data: {"truncated":true,"finish":"length","note":"…"}。| 情况 | 表现 | 怎么办 |
|---|---|---|
| key 无效 / 被禁 | HTTP 401 | 换 key |
没传 stream: true | HTTP 400 stream_required | 加 "stream": true |
| 输入超过 8192 tokens | HTTP 400 | 缩短 p1/p2,不会静默截断 |
| 余额不足 | HTTP 402 | 充值 / 兑换卡密 |
| 排队满了 | HTTP 429(带 Retry-After) | 等一会儿重试 |
| 排队超时 | 已 200 开流,流内一帧 {"error":{"code":"queue_timeout"}} + [DONE] | 重试或错峰 |
| 撞 8K 上限 | 正常结束 + truncated: true | 正文是完整的,只是没自然收尾 |
$0.64 / 百万 tokens,输出 $3.84 / 百万 tokens(32G 档)。GET /v1/me 返回余额与累计用量。GET /v1/status(免鉴权)返回 congestion 与预估等待。公网不行。一章要写 1~6 分钟,一次性返回过不了 CDN 的首字节限制,而且中途断了你会什么都拿不到。 流式至少保证"已经写出来的部分一定到手"。
: 这样的空帧?SSE 允许注释帧,用来保活。所有标准解析器都会忽略它。如果你的解析器报错,说明它没按 SSE 规范实现。
会,两种情况都会明确告知而不是静默丢弃:撞 8K 上限(truncated:true, finish:"length")、
上游中断(finish:"error",正文是已经写出来的那部分)。
curl -X POST https://api.elisnovel.com/v1/redeem \
-H "Authorization: Bearer $ELIS_KEY" \
-H "Content-Type: application/json" \
-d '{"code":"DJ-XXXX-XXXX"}'
返回 {"ok":true,"usd":5.0,"balance_usd":…}。一张卡密只能用一次。
messages 那类 OpenAI 写法在这里没有意义。