ai_co_discuss 0.2.44 → 0.2.46
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/backend/server.py +5 -4
- package/docs/architecture.md +1 -1
- package/docs/runner.md +1 -1
- package/package.json +1 -1
- package/runner/discussion_runner.mjs +2 -1
- package/web/modern.css +1 -1
- package/web/modern.js +956 -915
package/backend/server.py
CHANGED
|
@@ -282,7 +282,7 @@ def require_floor(room, speaker):
|
|
|
282
282
|
def host_arrangements(connection, room_id, decisions):
|
|
283
283
|
"""Each plan the host created (turns saved in one batch), anchored after the latest answer before it.
|
|
284
284
|
|
|
285
|
-
Invitation turns are not plans, and a plan the smart scheduler applied is already shown by its own decision.
|
|
285
|
+
The opening plan has no answer to follow and is anchored at 0. Invitation turns are not plans, and a plan the smart scheduler applied is already shown by its own decision.
|
|
286
286
|
"""
|
|
287
287
|
plans, latest_answer = [], 0
|
|
288
288
|
for row in connection.execute("SELECT id,expert,question,answer_id,created_at,submission_id FROM discussion_turns WHERE room_id=? ORDER BY id", (room_id,)):
|
|
@@ -293,7 +293,7 @@ def host_arrangements(connection, room_id, decisions):
|
|
|
293
293
|
plans.append({"id": row["id"], "after_message_id": latest_answer, "created_at": row["created_at"], "turns": [{"expert": row["expert"], "question": row["question"]}]})
|
|
294
294
|
latest_answer = max(latest_answer, row["answer_id"] or 0)
|
|
295
295
|
applied = {item["after_message_id"] for item in decisions if item["applied"]}
|
|
296
|
-
return [plan for plan in plans if plan["after_message_id"]
|
|
296
|
+
return [plan for plan in plans if plan["after_message_id"] not in applied][-RECENT_DECISIONS:]
|
|
297
297
|
|
|
298
298
|
|
|
299
299
|
def discussion_rounds(connection, room_id, experts):
|
|
@@ -1320,8 +1320,9 @@ def update_state(connection, room_id, payload):
|
|
|
1320
1320
|
until = int(payload.get("until", room["latest_id"]))
|
|
1321
1321
|
if until < 0 or until > room["latest_id"]:
|
|
1322
1322
|
raise ValueError("讨论状态的截止编号无效")
|
|
1323
|
-
|
|
1324
|
-
|
|
1323
|
+
saved_brief = connection.execute("SELECT until FROM room_briefs WHERE room_id=?", (room_id,)).fetchone()
|
|
1324
|
+
if "brief" in payload and saved_brief and until < saved_brief["until"]:
|
|
1325
|
+
raise ValueError(f"简报已整理至 #{saved_brief['until']},截止编号不能回退;请先读取最新状态")
|
|
1325
1326
|
connection.execute("UPDATE rooms SET state_text=?,state_until=? WHERE id=?", (text, until, room_id))
|
|
1326
1327
|
if "brief" in payload:
|
|
1327
1328
|
connection.execute("""INSERT INTO room_briefs (room_id,text,until,updated_at) VALUES (?,?,?,?)
|
package/docs/architecture.md
CHANGED
|
@@ -224,7 +224,7 @@ Python 通过进程内条件变量唤醒订阅者,不占用数据库连接,
|
|
|
224
224
|
|
|
225
225
|
- `round_budgets`:程序统计轮次的预算(`base` 为本段计数起点的专家观点数,`cap` 为本段轮次上限、0 表示取 `discussion_limits.max_rounds`,`extra` 为用户累计追加轮数)。建房时写入;没有记录的旧房间沿用按花名册逐轮统计的旧口径。房间视图的 `limits` 返回 `segment_rounds`、`round_cap`、`extra_rounds`。
|
|
226
226
|
- `discussion_options`:建房时的讨论选项,目前只有 `named_followup`(0/1,建房 `named_followup` 布尔值,默认 false,计入建房幂等比对)。没有记录的旧房间视为 true;房间视图返回 `named_followup`。
|
|
227
|
-
- `scheduler_decisions`:讨论中每次智能调度判断的可见记录(`kind` 为 `interjection` / `round`,`label`、`confidence`、`applied`、`provider`、`after_message_id`),由接入程序用运行控制凭据 `POST scheduler-decisions` 写入,不是消息,不影响轮次、发言权与暂扣;房间视图 `scheduler_decisions` 返回最近 100 条;每条可带 `detail`(独立表 `scheduler_decision_details`,由 `POST scheduler-decisions` 的 `detail` 写入:每个问题的题目说明、选项,以及决策模型选了哪项和各选项概率,最多 4 项、4000 字,不含房间消息摘录,不随备份导出),网页默认折叠,点开才显示“问 / 答”。房间视图另附 `host_arrangements`:由 `discussion_turns` 按同一批创建时间分组得到的主持人安排(不含邀请追加的开场安排,也不含已由智能调度写入决策的那一批),`after_message_id`
|
|
227
|
+
- `scheduler_decisions`:讨论中每次智能调度判断的可见记录(`kind` 为 `interjection` / `round`,`label`、`confidence`、`applied`、`provider`、`after_message_id`),由接入程序用运行控制凭据 `POST scheduler-decisions` 写入,不是消息,不影响轮次、发言权与暂扣;房间视图 `scheduler_decisions` 返回最近 100 条;每条可带 `detail`(独立表 `scheduler_decision_details`,由 `POST scheduler-decisions` 的 `detail` 写入:每个问题的题目说明、选项,以及决策模型选了哪项和各选项概率,最多 4 项、4000 字,不含房间消息摘录,不随备份导出),网页默认折叠,点开才显示“问 / 答”。房间视图另附 `host_arrangements`:由 `discussion_turns` 按同一批创建时间分组得到的主持人安排(不含邀请追加的开场安排,也不含已由智能调度写入决策的那一批),`after_message_id` 取该批之前最新的回答(开场安排前没有回答,取 0,显示在议题卡片下方),网页在该回答后显示与智能调度卡片同样式的“主持人安排:A → B → C”一行,点开才逐条显示专家与主持人写的任务说明(`turns`);没有可跟随的回答(讨论开场)时不显示。不新增表。
|
|
228
228
|
- 两表都是独立表,D1 重新应用 schema 即可;备份、导入(`after_message_id` 随消息重编号)与删除一并处理。智能调度代主持人执行的写入不新增权限,沿用该主持事件的执行凭据。
|
|
229
229
|
|
|
230
230
|
## 自动运行协议
|
package/docs/runner.md
CHANGED
|
@@ -332,7 +332,7 @@ Codex 要求 CLI 0.163.0 或更新版本,使用 permission profiles 和本地
|
|
|
332
332
|
- **轮次衔接**:仅 `named_followup` 为 false、无排队、上一轮已完成时判断。继续 → 先请模型选出的专家(不是上一轮最后发言者),其余按房间专家顺序,统一使用 `peer_round_question`;第 1 轮后自动把阶段从 `initial` 改为 `discussing`。可收束、跑偏、重复或卡住 → 主持人。
|
|
333
333
|
- **执行方式**:有把握时 runner 领取该主持事件,以 `smart-scheduler` 会话进入,用本次执行凭据以主持人身份领取发言权、改阶段、创建或继续安排;网站的发言权、上限与凭据校验照常生效。到限、阶段不在进行中或已有进行中安排时不判断。执行中任一写入失败,把同一事件交回主持人软件并标记已进入(任务说明与 API 主持都跳过 `execution enter`)。判断失败或置信度不足时,主持任务附 `scheduler_suggestions` 供参考。
|
|
334
334
|
- **成员变化**:新邀请的专家由网站在入场事务中加入现有队列的补齐位置(本轮未发言的专家之后、会再次发言的专家之前,没有重复时在队尾),当前执行与其余安排的相对顺序不变,runner 到它的安排生效时才交付;手动专家仍由原会话提交。暂离、移除、请回等需要重排的变化会作废排队安排(留下最近一次实际安排之后的 `skipped`)。本轮未完成且无排队时,runner 不调用模型,按原顺序补回仍在场专家的安排,再请本轮尚未发言的专家开场,不唤醒主持人。
|
|
335
|
-
-
|
|
335
|
+
- 每次实际向决策模型提出的判断(含交回主持人)用控制凭据写入 `POST scheduler-decisions`,`after_message_id` 取最近一条已回答安排的回答,对话中显示为该发言卡片与下一张卡片之间的独立调度卡片(“智能调度:……”)。交回主持人时写明原因:建议收束或拿不准。没有向模型提问的情形(已到讨论上限、同时有多条留言、话题设置有修改、点名追问已开启、本轮只剩主持人或只剩手动接入的专家)直接交回主持人,不调用模型,也不记录调度卡片;主持人的开场任务同样不记录。本轮未完成且没有后续安排时(如点“跳过”后),先补回因成员变动作废的计划,否则由决策模型在本轮未发言、可自动唤醒的专家中选下一位(置信度 ≥ 0.7),拿不准或建议调整方向才交回主持人。无论开新一轮还是本轮继续,每次只安排一位,答完队列为空再判断下一位;队列里已有安排时直接接力,不判断。刚被用户“跳过”的专家本轮不再被选(除非没有别人);从未发言的专家(如新邀请)使用开场提示词;手动接入的专家不在候选内,也不会被留言分流选中。
|
|
336
336
|
- 每次判断与结果写入 `service.log`;阈值 0.7(所有判断统一)未经实测校准,两家的置信度不可互相套用。面板提示:开启后房间标题与最近消息会发给所选供应商。
|
|
337
337
|
- 2026-10-23 用真实 Jev 密钥核对:`/v1/systemone` 的请求与答案格式与本模块一致;4 条自由房间分派全部合理(直接派出的置信度 0.91),3 条讨论建议中 2 条符合预期,单次 0.5–1.1 秒(首次连接约 5 秒)。该密钥的 `GET /v1/models` 只列出 `jev-latest` 与 `jev-preview`,没有可锁定的版本,默认仍用 `jev-latest`;Jev 升级可能改变判断结果。OpenAI Decisions 仅按文档实现,未用真实密钥调用。
|
|
338
338
|
|
package/package.json
CHANGED
|
@@ -327,7 +327,8 @@ export class DiscussionRunner {
|
|
|
327
327
|
if (!plan) return {};
|
|
328
328
|
const suggestions = plan.message_id ? [{ message_id: plan.message_id, suggestion: plan.label, confidence: plan.confidence }] : [];
|
|
329
329
|
if (plan.action === 'host') {
|
|
330
|
-
|
|
330
|
+
// A skip made no judgment (no model call, so no detail); only a decision actually asked of the model is shown.
|
|
331
|
+
if (plan.detail) await this.record_decision(plan, false);
|
|
331
332
|
return { suggestions };
|
|
332
333
|
}
|
|
333
334
|
const token = randomUUID();
|