codebee 0.1.81 → 0.1.83
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/README.md +3 -3
- package/app/core/flows.py +11 -0
- package/app/core/pipeline.py +51 -11
- package/app/core/store.py +4 -0
- package/app/core/usage.py +4 -2
- package/app/ui/app.js +7 -1
- package/app/ui/i18n.js +2 -0
- package/app/ui/index.html +1 -0
- package/app/ui/style.css +7086 -7086
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,18 @@ README 元数据带回,供老版本在「发现新版本」时展示新版更
|
|
|
6
6
|
|
|
7
7
|
## 未发布
|
|
8
8
|
|
|
9
|
+
## v0.1.83(2026-10-05)
|
|
10
|
+
|
|
11
|
+
- **用量统计模型名不再分裂**:同一模型不同大小写(如 GLM-5.3-Flash 与 glm-5.3-flash)在台账倒序读入时 2:2 平局会随机拆成两行——平局裁断补第三序(大写字母数),统计视图稳定归一。
|
|
12
|
+
- **测试面存量红清账六件**(-13F -2E):建书对账收紧与「done 只计确认发布」改版后断言已跟上;发布门禁测试与 e2e 口径对齐;两件旧布局/脚本式测试件改造成 discover 兼容。全量 2143 项对账零新增红。
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
## v0.1.82(2026-10-04)
|
|
16
|
+
|
|
17
|
+
- **连载「多线剧情推演」开放到界面**:任务表单与流程编辑器都能设 1-3 路分支——起草前先让智能体推演几条剧情走向、择优再动笔(比同章多稿赛马省一个数量级 token)。此前该能力只能手拼 API,而且流程里配好的推演数会被任务创建/保存流程静默冲掉。
|
|
18
|
+
- **赛马复赛不再白烧**:容量受限通道上同章赛马首轮全挂后,复赛此前照发同一份全量提示词再烧一遍 N×2400 秒——现在复赛与重试同口径按身份收缩(经验库→4K、圣经保整段),首轮仍发全量先给一次机会。
|
|
19
|
+
- **降级发生可对账**:起草重试/赛马复赛触发降级时,运行页步骤说明会写明降了哪几层(如「降级:经验库→4K;模块库→边界截断」),提示词为什么变小不再靠猜。
|
|
20
|
+
|
|
9
21
|
## v0.1.81(2026-10-04)
|
|
10
22
|
|
|
11
23
|
- **连载超时重试的「分层降级」修准了**:此前起草超时重试把经验库/圣经/知识库折成一整块再收缩,只能整体 4K 硬截——现在三块分开留底,重试时按各自身份降级(经验库 4K、圣经按二级标题保整段、模块库按模块边界保整模块),大纲/前情/本章要点永不动。重试提示词保住的是结构化上下文,不是一截碎尾巴。
|
package/README.md
CHANGED
|
@@ -33,10 +33,10 @@ Trae Agent、OpenClaw……),提供
|
|
|
33
33
|
---
|
|
34
34
|
|
|
35
35
|
<!-- relnotes:start -->
|
|
36
|
-
### 最新版更新内容(v0.1.
|
|
36
|
+
### 最新版更新内容(v0.1.83)
|
|
37
37
|
|
|
38
|
-
-
|
|
39
|
-
-
|
|
38
|
+
- 用量统计模型名不再分裂:同一模型不同大小写写法稳定归一成一行,不再随台账读入顺序随机拆两行
|
|
39
|
+
- 测试面存量红清账六件:建书对账/发布门禁等改版后的滞后断言全部跟上,全量 2143 项零新增红
|
|
40
40
|
<!-- relnotes:end -->
|
|
41
41
|
|
|
42
42
|
|
package/app/core/flows.py
CHANGED
|
@@ -167,6 +167,17 @@ def _norm_serial(serial):
|
|
|
167
167
|
per = volumes.norm_per(serial.get("volume_chapters"))
|
|
168
168
|
if per:
|
|
169
169
|
out["volume_chapters"] = per
|
|
170
|
+
# 同章赛马/多线推演(1=不启用不落键):流程编辑器(app.js fl-variants)
|
|
171
|
+
# 会把 variants 随 serial 提交,漏带会在 upsert 时被静默丢弃——任务创建
|
|
172
|
+
# 从 flow.serial 继承(store.create_task)后永远读到 1,赛马形同虚设。
|
|
173
|
+
# 钳位口径与 store.create_task 一致(1-3)。
|
|
174
|
+
for key in ("variants", "branches"):
|
|
175
|
+
try:
|
|
176
|
+
n = max(1, min(3, int(serial.get(key) or 1)))
|
|
177
|
+
except Exception:
|
|
178
|
+
n = 1
|
|
179
|
+
if n > 1:
|
|
180
|
+
out[key] = n
|
|
170
181
|
return out
|
|
171
182
|
|
|
172
183
|
|
package/app/core/pipeline.py
CHANGED
|
@@ -2519,9 +2519,10 @@ def _shrink_context_block(sk_block, bible, budget=12000):
|
|
|
2519
2519
|
def _serial_shrunk_block(lessons, bible, kb_block, budget=12000):
|
|
2520
2520
|
"""连载起草重试的分层降级组装:经验库与圣经按各自身份过 _shrink_context_block
|
|
2521
2521
|
(经验库→4K、模块库按模块边界、圣经按二级标题边界),知识库块与大纲/前情
|
|
2522
|
-
|
|
2523
|
-
|
|
2524
|
-
|
|
2522
|
+
同待遇永不动。返回 (重组后的替换块, 降级说明)——调用方整块 replace,字节级
|
|
2523
|
+
对位;降级说明(哪几层生效了)进 step note,运行页可对账(预算内为空串)。"""
|
|
2524
|
+
sk2, bible2, note = _shrink_context_block(lessons, bible, budget=budget)
|
|
2525
|
+
return "\n\n".join(p for p in (sk2, bible2, kb_block) if p), note
|
|
2525
2526
|
|
|
2526
2527
|
|
|
2527
2528
|
def _critic_lens(critics, agent):
|
|
@@ -3596,6 +3597,7 @@ def _run_serial_review(run, task, agents, ev, stats, mode, critics, impl, route,
|
|
|
3596
3597
|
last_attempt_reason = chapter_reason
|
|
3597
3598
|
prev_prompt = None # 上一次实际下发的提示词
|
|
3598
3599
|
prev_timed_out = False # 上一次是否「超时/停滞」收场
|
|
3600
|
+
shrink_note = "" # 本次重试的分层降级说明(进 step note 供对账)
|
|
3599
3601
|
for draft_attempt in range(3):
|
|
3600
3602
|
if draft_attempt:
|
|
3601
3603
|
# 30s / 60s 退避;ev.wait 睡等可被取消即刻唤醒
|
|
@@ -3609,8 +3611,9 @@ def _run_serial_review(run, task, agents, ev, stats, mode, critics, impl, route,
|
|
|
3609
3611
|
# ——分层降级:经验库→4K、模块库按模块边界、圣经按二级标题
|
|
3610
3612
|
# 边界,保大纲/前情/本章要点(2026-09-17 七猫实测:全量
|
|
3611
3613
|
# 30KB 对讯飞必挂)
|
|
3612
|
-
|
|
3613
|
-
|
|
3614
|
+
shrunk_block, shrink_note = _serial_shrunk_block(
|
|
3615
|
+
sk_lessons, bible, kb_block)
|
|
3616
|
+
use_prompt = prompt.replace(sk_block, shrunk_block)
|
|
3614
3617
|
# 超时重试必须有新变量才值得做(2026-09-22):提示词与上次逐字节
|
|
3615
3618
|
# 相同、上次又是超时/停滞收场时,重试只是把同一个超时再烧一遍
|
|
3616
3619
|
# (2400s × N)。此时直接跳出交替换将——换 CLI/模型才是新机会。
|
|
@@ -3622,7 +3625,9 @@ def _run_serial_review(run, task, agents, ev, stats, mode, critics, impl, route,
|
|
|
3622
3625
|
step_wd, readonly=False, ev=ev, timeout=2400,
|
|
3623
3626
|
resume=resume_ctx["session"] if resume_ctx else None,
|
|
3624
3627
|
images=_task_images(task, workdir),
|
|
3625
|
-
note=("起草重试 %d/2
|
|
3628
|
+
note=("起草重试 %d/2(网关限流退避%s)"
|
|
3629
|
+
% (draft_attempt,
|
|
3630
|
+
(";降级:" + shrink_note) if shrink_note else "")) if draft_attempt else "")
|
|
3626
3631
|
prev_prompt = use_prompt
|
|
3627
3632
|
prev_timed_out = bool((res.get("raw") or {}).get("timed_out"))
|
|
3628
3633
|
if (res.get("raw") or {}).get("repeat_stop"):
|
|
@@ -3729,6 +3734,10 @@ def _run_serial_review(run, task, agents, ev, stats, mode, critics, impl, route,
|
|
|
3729
3734
|
# 败稿删除;变体 0 = 本任作者(revise 会话沿用),其余取跨族优先的
|
|
3730
3735
|
# 其他真实智能体,不足时同作者开新会话凑数。
|
|
3731
3736
|
scored_variants = []
|
|
3737
|
+
# 复赛降级块(算一次):与非赛马起草重试同源(_serial_shrunk_block)
|
|
3738
|
+
# ——预算内与 sk_block 字节级一致(replace 等于原样),超预算才真降级
|
|
3739
|
+
race_shrunk_block, race_shrink_note = _serial_shrunk_block(
|
|
3740
|
+
sk_lessons, bible, kb_block)
|
|
3732
3741
|
for race_round in range(2):
|
|
3733
3742
|
# 全变体失败(网关突发限流)→ 60s 退避重赛一轮,别一章判死
|
|
3734
3743
|
if race_round:
|
|
@@ -3754,13 +3763,22 @@ def _run_serial_review(run, task, agents, ev, stats, mode, critics, impl, route,
|
|
|
3754
3763
|
|
|
3755
3764
|
def _draft_one(kk, agent):
|
|
3756
3765
|
vfile = "chapter-%02d-v%d.md" % (i, kk)
|
|
3766
|
+
vp = _draft_prompt(vfile)
|
|
3767
|
+
if race_round and len(vp) > 12000 and sk_block and sk_block in vp:
|
|
3768
|
+
# 复赛分层降级(与非赛马起草重试同口径):容量受限通道上
|
|
3769
|
+
# 全量提示词必挂,复赛照发同一份全量只是把 N×2400s 再烧
|
|
3770
|
+
# 一遍——按身份收缩经验库/圣经(大纲/前情/知识库块不动)。
|
|
3771
|
+
vp = vp.replace(sk_block, race_shrunk_block)
|
|
3772
|
+
note = "赛马变体 %d/%d(%s)" % (kk + 1, len(pool), agent.get("id"))
|
|
3773
|
+
if race_round and race_shrink_note:
|
|
3774
|
+
note += ";复赛降级:%s" % race_shrink_note
|
|
3757
3775
|
r = _run_step(run_id, "draft-c%d-v%d" % (i, kk),
|
|
3758
3776
|
modelhub.bind_agent(agent, difficulty),
|
|
3759
|
-
|
|
3777
|
+
vp, step_wd, readonly=False, ev=ev,
|
|
3760
3778
|
timeout=2400,
|
|
3761
3779
|
# 赛马只在全新起草时启用(无续会话),每路都是新会话
|
|
3762
3780
|
images=_task_images(task, workdir),
|
|
3763
|
-
note=
|
|
3781
|
+
note=note)
|
|
3764
3782
|
results[kk] = (vfile, agent, r)
|
|
3765
3783
|
|
|
3766
3784
|
threads = []
|
|
@@ -4176,6 +4194,24 @@ def _run_serial_review(run, task, agents, ev, stats, mode, critics, impl, route,
|
|
|
4176
4194
|
results[idx] = gj
|
|
4177
4195
|
return
|
|
4178
4196
|
gtpl = SERIAL_GLOBAL_PROMPT
|
|
4197
|
+
if start > 1:
|
|
4198
|
+
# 批次评审口径:连载中段批次不能拿全书开篇与高潮段的标准审
|
|
4199
|
+
# (实案:黄金三章口径被用来扣批首章开篇分、承段被按高潮段
|
|
4200
|
+
# 密度打节奏 5.0、伏笔揭示位在后批章纲的被判悬置)。口径只
|
|
4201
|
+
# 纠正评审对象的范围与基准,重复/人设/文风类问题照常计。
|
|
4202
|
+
gtpl = gtpl.replace(
|
|
4203
|
+
"## 全书目标",
|
|
4204
|
+
"## 批次评审口径(系统注入)\n"
|
|
4205
|
+
"- 本次送审批次为全书第 %d—%d 章(连载中段批次),文本中的前文节选仅供衔接核对;\n"
|
|
4206
|
+
"- 「黄金一章/黄金三章」口径仅适用于全书第 1—3 章,不得据此扣减本批批首章的开篇分;\n"
|
|
4207
|
+
"- 本批各章的既定事件以工作目录「章纲/」下的锁定章纲为准(可自行查阅):承段、"
|
|
4208
|
+
"过渡章的节奏分应对照章纲既定事件是否落实与章末钩子是否成立,"
|
|
4209
|
+
"不以高潮段的事件密度为统一标准;\n"
|
|
4210
|
+
"- 「伏笔悬置」类 major 须先核对章纲的揭示位安排:揭示位写在后批章纲中的伏笔"
|
|
4211
|
+
"不算悬置,无任何安排的悬置才成立;\n"
|
|
4212
|
+
"- 重复叙述、人设崩坏、文风漂移、真实前后矛盾照常计 major——本口径只纠正评审"
|
|
4213
|
+
"对象的范围与基准,不是放水。\n\n"
|
|
4214
|
+
"## 全书目标" % (start, end), 1)
|
|
4179
4215
|
if bible:
|
|
4180
4216
|
gtpl = gtpl.replace("## 全书目标", bible + "\n\n## 全书目标", 1)
|
|
4181
4217
|
res = _run_step(run_id, "global-critique", bound[idx],
|
|
@@ -5258,9 +5294,12 @@ def mark_task_plan(workdir, index, status):
|
|
|
5258
5294
|
|
|
5259
5295
|
|
|
5260
5296
|
def _workdir_blocker(task, run_id):
|
|
5261
|
-
"""
|
|
5297
|
+
"""同工作目录互斥:返回占用该目录的任务(无则 None)。
|
|
5262
5298
|
任务计划/项目记忆/任务分支检出都是工作目录级共享状态,并行会互相覆盖
|
|
5263
|
-
(2026-09-23
|
|
5299
|
+
(2026-09-23 禅道双单实案),故同目录只允许一个任务在跑。占用者只认
|
|
5300
|
+
**真正在跑**(running)的 run:2026-10-05 实案——三个同目录任务全部
|
|
5301
|
+
queued 时,排队中的兄弟互相被当成占用者,各自退避 60s 形成活锁,
|
|
5302
|
+
谁也起不来;排队者是「同样在等」而不是「占着」。"""
|
|
5264
5303
|
wd = (task.get("workdir") or "").rstrip("/\\")
|
|
5265
5304
|
if not wd:
|
|
5266
5305
|
return None
|
|
@@ -5269,7 +5308,8 @@ def _workdir_blocker(task, run_id):
|
|
|
5269
5308
|
or t.get("status") not in ("running", "queued")
|
|
5270
5309
|
or (t.get("workdir") or "").rstrip("/\\") != wd):
|
|
5271
5310
|
continue
|
|
5272
|
-
|
|
5311
|
+
blk = jobs._task_active_run(t.get("id"), exclude_run_id=run_id)
|
|
5312
|
+
if blk is not None and blk.get("status") == "running":
|
|
5273
5313
|
return t
|
|
5274
5314
|
return None
|
|
5275
5315
|
|
package/app/core/store.py
CHANGED
|
@@ -1801,6 +1801,10 @@ def continue_task(task_id, chapters=None):
|
|
|
1801
1801
|
}
|
|
1802
1802
|
if serial.get("variants"): # 赛马配置随链条沿用
|
|
1803
1803
|
payload["serial"]["variants"] = serial["variants"]
|
|
1804
|
+
# 多线推演(branches)同口径随链条沿用:漏带则续写批次恒回 1,
|
|
1805
|
+
# 多线剧情推演在连载链上只剩首批生效
|
|
1806
|
+
if serial.get("branches"):
|
|
1807
|
+
payload["serial"]["branches"] = serial["branches"]
|
|
1804
1808
|
# 分卷配置随链条沿用:卷边界必须跨批次稳定,否则同一卷会被续写批次重切
|
|
1805
1809
|
if serial.get("volumes"):
|
|
1806
1810
|
payload["serial"]["volumes"] = serial["volumes"]
|
package/app/core/usage.py
CHANGED
|
@@ -679,7 +679,8 @@ def _group(records, key):
|
|
|
679
679
|
def _model_display_map(records):
|
|
680
680
|
"""模型名归一映射 {casefold: 展示名}:同一模型不同大小写(GLM-5.3-Flash 与
|
|
681
681
|
glm-5.3-flash)会被拆成两行统计,这里把 casefold 相同的归为一组,
|
|
682
|
-
|
|
682
|
+
展示名取组内出现次数最多的原始写法(平局取更长写法,再平局取大写字母
|
|
683
|
+
更多的规范形——台账倒序读入时 2:2 平局的裁断不再随记录顺序漂移)。"""
|
|
683
684
|
canon = {}
|
|
684
685
|
for r in records:
|
|
685
686
|
name = str(r.get("model") or "") or "unknown"
|
|
@@ -690,7 +691,8 @@ def _model_display_map(records):
|
|
|
690
691
|
display = {}
|
|
691
692
|
for k, c in canon.items():
|
|
692
693
|
display[k] = max(c["names"].items(),
|
|
693
|
-
key=lambda kv: (kv[1], len(kv[0])
|
|
694
|
+
key=lambda kv: (kv[1], len(kv[0]),
|
|
695
|
+
sum(ch.isupper() for ch in kv[0])))[0]
|
|
694
696
|
return display
|
|
695
697
|
|
|
696
698
|
|
package/app/ui/app.js
CHANGED
|
@@ -766,7 +766,7 @@ function onTypeChange() {
|
|
|
766
766
|
const bibleCreate = $("bible-create-field");
|
|
767
767
|
const isSerialReview = isReview && !!(flow && flow.serial);
|
|
768
768
|
if (bibleCreate) bibleCreate.classList.toggle("hidden", !isSerialReview);
|
|
769
|
-
const clearSerialFields = () => ["f-chapters", "f-words-per-ch", "f-variants", "f-bible",
|
|
769
|
+
const clearSerialFields = () => ["f-chapters", "f-words-per-ch", "f-variants", "f-branches", "f-bible",
|
|
770
770
|
"f-vol-chapters", "f-vol-spec"].forEach((id) => {
|
|
771
771
|
const el = $(id);
|
|
772
772
|
if (el) el.value = "";
|
|
@@ -3187,6 +3187,9 @@ async function createTask() {
|
|
|
3187
3187
|
chapters: ch,
|
|
3188
3188
|
words_per_chapter: parseInt($("f-words-per-ch").value, 10) || 2500,
|
|
3189
3189
|
variants: Math.max(1, Math.min(3, parseInt($("f-variants").value, 10) || 1)),
|
|
3190
|
+
// 多线剧情推演:任务级 serial 整体替换流程默认,漏带会把流程里
|
|
3191
|
+
// 配好的 branches 冲掉(store.create_task 字段级不合并)
|
|
3192
|
+
branches: Math.max(1, Math.min(3, parseInt($("f-branches").value, 10) || 1)),
|
|
3190
3193
|
};
|
|
3191
3194
|
// 分卷:显式卷结构文本优先(后端解析成卷表),否则用每卷章数。
|
|
3192
3195
|
// 两个都留空 = 不分卷(后端收到 0/缺字段即不分卷)。
|
|
@@ -3951,6 +3954,7 @@ async function newFromTaskAsync(id) {
|
|
|
3951
3954
|
$("f-chapters").value = tk.serial ? tk.serial.chapters : "";
|
|
3952
3955
|
$("f-words-per-ch").value = tk.serial ? tk.serial.words_per_chapter : "";
|
|
3953
3956
|
$("f-variants").value = tk.serial && tk.serial.variants ? tk.serial.variants : "";
|
|
3957
|
+
$("f-branches").value = tk.serial && tk.serial.branches ? tk.serial.branches : "";
|
|
3954
3958
|
// 分卷:还原每卷章数;指定卷结构还原成可读文本(卷名 + 章数/章号范围)
|
|
3955
3959
|
$("f-vol-chapters").value = tk.serial && tk.serial.volume_chapters ? tk.serial.volume_chapters : "";
|
|
3956
3960
|
$("f-vol-spec").value = tk.serial && Array.isArray(tk.serial.volumes)
|
|
@@ -10887,6 +10891,7 @@ function flowForm(fid) {
|
|
|
10887
10891
|
'<div class="field"><label>' + t("连载章节数(留空 = 单稿件)") + '</label><input id="fl-chapters" type="number" min="2" max="20" value="' + (f && f.serial ? f.serial.chapters : "") + '" placeholder="' + t("例:8") + '"></div>' +
|
|
10888
10892
|
'<div class="field"><label>' + t("每章约字数") + '</label><input id="fl-words-per-ch" type="number" min="500" max="8000" step="100" value="' + (f && f.serial ? f.serial.words_per_chapter : "") + '" placeholder="' + t("例:2500") + '"></div>' +
|
|
10889
10893
|
'<div class="field"><label>' + t("同章赛马稿件数") + '</label><input id="fl-variants" type="number" min="1" max="3" step="1" value="' + (f && f.serial ? (f.serial.variants || 1) : 1) + '" placeholder="' + t("1 = 关闭") + '"></div>' +
|
|
10894
|
+
'<div class="field"><label>' + t("多线剧情推演数") + '</label><input id="fl-branches" type="number" min="1" max="3" step="1" value="' + (f && f.serial ? (f.serial.branches || 1) : 1) + '" placeholder="' + t("1 = 关闭") + '"></div>' +
|
|
10890
10895
|
'<div class="field"><label>' + t("分卷:每卷章数(留空 = 不分卷)") + '</label><input id="fl-vol-chapters" type="number" min="2" max="200" step="1" value="' + (f && f.serial && f.serial.volume_chapters ? f.serial.volume_chapters : "") + '" placeholder="' + t("例:20") + '"></div>' +
|
|
10891
10896
|
"</div>" +
|
|
10892
10897
|
'<div class="field"><label>' + t("起草提示词(可选,占位符 __FILE__ __GOAL__ __CONTEXT__ __SKILLS__)") + '</label><textarea id="fl-draft" rows="3" placeholder="' + t("留空 = 内置通用模板") + '">' + esc(f && f.draft_prompt ? f.draft_prompt : "") + "</textarea></div>" +
|
|
@@ -10932,6 +10937,7 @@ async function saveFlow() {
|
|
|
10932
10937
|
chapters: ch,
|
|
10933
10938
|
words_per_chapter: parseInt($("fl-words-per-ch").value, 10) || 2500,
|
|
10934
10939
|
variants: Math.max(1, Math.min(3, parseInt($("fl-variants").value, 10) || 1)),
|
|
10940
|
+
branches: Math.max(1, Math.min(3, parseInt($("fl-branches").value, 10) || 1)),
|
|
10935
10941
|
};
|
|
10936
10942
|
const vp = parseInt(($("fl-vol-chapters") || {}).value, 10);
|
|
10937
10943
|
if (vp >= 2) payload.serial.volume_chapters = vp; // 流程默认分卷(任务级可覆盖)
|
package/app/ui/i18n.js
CHANGED
|
@@ -1831,6 +1831,8 @@
|
|
|
1831
1831
|
"工作目录内的文件名": "File name inside the workdir",
|
|
1832
1832
|
"1 = 关闭": "1 = off",
|
|
1833
1833
|
"1 = 关闭(2-3 每章多稿择优,更贵)": "1 = off (2-3 drafts per chapter, best wins — pricier)",
|
|
1834
|
+
"多线剧情推演数": "Plot branch plans per chapter",
|
|
1835
|
+
"1 = 关闭(2-3 写前剧情分支推演择优)": "1 = off (2-3 branch plans, best picked before drafting)",
|
|
1834
1836
|
"小写字母开头,可留空": "start with a lowercase letter; optional",
|
|
1835
1837
|
"留空 = 2": "empty = 2",
|
|
1836
1838
|
"留空 = 7.0": "empty = 7.0",
|
package/app/ui/index.html
CHANGED
|
@@ -510,6 +510,7 @@
|
|
|
510
510
|
<div class="field"><label data-i18n="连载模式:章节数(空 = 单稿件一次成文)">连载模式:章节数(空 = 单稿件一次成文)</label><input id="f-chapters" type="number" min="2" max="20" placeholder="例:8(逐章起草+评审+修订)" data-i18n-ph="例:8(逐章起草+评审+修订)"></div>
|
|
511
511
|
<div class="field"><label data-i18n="每章约字数">每章约字数</label><input id="f-words-per-ch" type="number" min="500" max="8000" step="100" placeholder="例:2500" data-i18n-ph="例:2500"></div>
|
|
512
512
|
<div class="field"><label data-i18n="同章赛马稿件数">同章赛马稿件数</label><input id="f-variants" type="number" min="1" max="3" step="1" placeholder="1 = 关闭(2-3 每章多稿择优,更贵)" data-i18n-ph="1 = 关闭(2-3 每章多稿择优,更贵)"></div>
|
|
513
|
+
<div class="field"><label data-i18n="多线剧情推演数">多线剧情推演数</label><input id="f-branches" type="number" min="1" max="3" step="1" placeholder="1 = 关闭(2-3 写前剧情分支推演择优)" data-i18n-ph="1 = 关闭(2-3 写前剧情分支推演择优)"></div>
|
|
513
514
|
<div class="field"><label data-i18n="分卷:每卷章数(空 = 不分卷)">分卷:每卷章数(空 = 不分卷)</label><input id="f-vol-chapters" type="number" min="2" max="200" step="1" placeholder="例:20(卷边界按全书章号自动推导)" data-i18n-ph="例:20(卷边界按全书章号自动推导)"></div>
|
|
514
515
|
</div>
|
|
515
516
|
<div class="field" id="f-vol-spec-field"><label data-i18n="分卷:指定卷结构(可选,优先于每卷章数)">分卷:指定卷结构(可选,优先于每卷章数)</label><input id="f-vol-spec" placeholder="例:第一卷 少年初入江湖 20章;第二卷 风云再起 16章" data-i18n-ph="例:第一卷 少年初入江湖 20章;第二卷 风云再起 16章" data-i18n-title="每卷一行或分号分隔:卷名 + 章数(或第1-20章)。也可以在任务目标里直接这样写,会自动识别" title="每卷一行或分号分隔:卷名 + 章数(或第1-20章)。也可以在任务目标里直接这样写,会自动识别"></div>
|