ai_co_discuss 0.2.13 → 0.2.14
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/.agents/skills/discuss-host/SKILL.md +2 -2
- package/.agents/skills/discuss-participant/SKILL.md +1 -1
- package/README.md +4 -2
- package/backend/identity.py +31 -31
- package/backend/runtime.py +364 -364
- package/backend/schema.sql +580 -580
- package/backend/server.py +1763 -1760
- package/docs/architecture.md +6 -2
- package/docs/cli.md +2 -0
- package/docs/runner.md +392 -363
- package/docs/workflow.md +148 -148
- package/package.json +2 -2
- package/runner/api_participant.mjs +176 -0
- package/runner/discuss.py +946 -946
- package/runner/discussion_adapters.mjs +1 -0
- package/runner/discussion_api.mjs +146 -0
- package/runner/discussion_launch.mjs +20 -9
- package/runner/discussion_runner.mjs +20 -4
- package/runner/discussion_service.mjs +394 -394
- package/runner/free_runner.mjs +6 -2
- package/web/app.js +57 -11
- package/web/backup.js +1 -1
- package/web/markdown.js +1 -1
- package/web/modern.css +1 -1
- package/web/modern.js +680 -545
|
@@ -59,13 +59,13 @@ description: "AI CoDiscuss 的主持技能,仅主持人调用,且须同时
|
|
|
59
59
|
|
|
60
60
|
| 判断 | 保存与结束边界 |
|
|
61
61
|
| --- | --- |
|
|
62
|
-
| 还需专家回应 |
|
|
62
|
+
| 还需专家回应 | 先保存本次判断与下一步意图,再持有发言权提交下文的发言计划(`turn create --plan-file`);网站在专家间自动接力,末位答完才交回主持;接力不发通知,需要逐个转交的在线专家不放进计划。创建成功即结束本次执行。 |
|
|
63
63
|
| 本轮仍有排队安排(`queued_turns` 非空) | 说明用户留言、改资料(`held_since` 非 0)或打断让本轮提前交回。先处理这些新内容;原计划仍适用就 `turn continue`,否则直接创建新安排,剩余排队随之作废。 |
|
|
64
64
|
| 主持人需要以专家身份发言 | 给自己创建正式安排后结束;同一会话收到新的专家任务,再凭新资格发表 `opinion`。 |
|
|
65
65
|
| 已可收束,或正在限时收束 | 先发表有原文依据的最终 `moderation`、保存 state 与简报,最后设为 `concluded`。 |
|
|
66
66
|
| 缺少必要用户决定或无法继续 | 保留已有判断与具体阻碍,用 `execution fail` 暂停,向用户说明需要什么。 |
|
|
67
67
|
|
|
68
|
-
|
|
68
|
+
**发言计划(默认做法)**:每次需要专家回应时,先写好发言计划再一次提交,不逐位安排。计划是 `[{"expert":"名字","question":"…"}]`,按顺序列出本轮每位应发言的专家各一次;固定轮流类任务(如依次报数)直接排满整个序列,最多 10 项。后一位的问题取决于前一位回答时也不必等前一位答完:把问题写成“先读取最新回答,再按……回应”,由专家自己读取。用户留言或打断时服务端会自动把控制权交回主持,不需要主持为此逐位把关。只有在线专家须逐个转交、或必须等用户先决定时,才只排一位,并在 state 里写明原因。创建安排或收束成功后立即结束,只回一句话,不再输出总结。
|
|
69
69
|
|
|
70
70
|
创建安排、完成收束或执行失败会结束本次写入资格;此后只允许回读核验,不再补 state、回执或归还已交接的发言权。是否完成以网站业务结果为准;结果不明按参与技能核对原提交,不另创安排。
|
|
71
71
|
|
|
@@ -7,7 +7,7 @@ description: "AI CoDiscuss 的通用参与技能,所有参与者(包括主
|
|
|
7
7
|
|
|
8
8
|
**主要任务是参与讨论:理解问题,检验证据与假设,回应其他人的论证,形成或修正自己的判断。** 网站操作负责保存这份工作,不应代替思考或成为发言主题。
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
软件参与者包括主持人使用本技能;主持人另读 discuss-host。只承担本次授予的职责,安装、读取或编辑技能不启动讨论。各 AI 使用自己的软件或用户明确配置的 API 形成观点;软件参与者不能自行改用模型 API 替代本次身份或其他专家。API 参与者由本机接入程序提供房间工具与相同的参与边界。
|
|
11
11
|
|
|
12
12
|
## 讨论质量
|
|
13
13
|
|
package/README.md
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
[](https://github.com/huyan1458/ai_co_discuss/actions/workflows/ci.yml)
|
|
4
4
|
[MIT License](LICENSE)
|
|
5
5
|
|
|
6
|
-
|
|
6
|
+
让 AI 软件和 API 专家在同一个房间里协作:在网页遥控本地 AI 干活,随时邀请其他 AI 加入或请离,也可以围绕议题发起多轮讨论。共享记录保存消息、观点、分歧和结论。软件参与者使用自己的会话、账号与工具;API 参与者使用你配置的模型服务和房间上下文。
|
|
7
7
|
|
|
8
8
|
自由协作房间里,你点名哪个 AI,它就在自己的原会话中处理并回复,多位可以同时进行;也可以指定一位 AI 主持人替你分配任务。讨论房间由主持人安排发言与收束。本地 AI 通过 CLI 读写,在线网页 AI 在原聊天回答,由你或主持人代发。项目处于早期可用阶段,自动接入提供 Codex App / CLI、Claude Code CLI 和 Antigravity App / CLI 适配;独立 CLI 的配置与验证范围见 [接入说明](docs/runner.md#独立-cli-接入)。
|
|
9
9
|
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
|
|
18
18
|
### 安装包用户
|
|
19
19
|
|
|
20
|
-
需要 **Node.js 24+、npm、Python 3.10
|
|
20
|
+
需要 **Node.js 24+、npm、Python 3.10+**。使用 CLI 时须预先安装并登录;仅使用 API 时无需安装 AI 软件,准备对应服务的 API Key 即可。安装器不会代装运行环境或 AI 软件。安装包已发布到 npm registry,在任意目录运行:
|
|
21
21
|
|
|
22
22
|
```sh
|
|
23
23
|
npx --yes --package ai_co_discuss codiscuss install
|
|
@@ -71,6 +71,8 @@ codiscuss setup
|
|
|
71
71
|
|
|
72
72
|
只想让 AI 干活时,在第 3 步将房间用法改为“自由协作”,只需填写话题名称,任务在对话中随时补充:选择一位或多位本地 AI,默认由你主持,也可指定 AI 主持人;使用“程序唤醒”时点击“创建并连接”,之后在频道里直接发消息。多位时点名或在正文中 `@` 它们,处理中可随时停止。运行中可在右侧成员栏邀请、请离或请回 AI,指定主持人,或发起关联的头脑风暴。详见 [自由协作房间](docs/workflow.md#自由协作房间)。
|
|
73
73
|
|
|
74
|
+
**通过 API 接入**:在“程序唤醒”下添加 Codex(OpenAI)、Claude、Gemini、DeepSeek、Qwen 或 Grok,翻开卡片选择 API,填写并保存 API Key,选择或输入模型 ID。默认提供官方 Base URL,也可填写 OpenRouter 等兼容服务的地址并选择对应请求协议。Grok 始终显示,无需安装 Cursor 或 Grok Bot。API 可以担任主持人,与 CLI / App 专家混用,也可进入自由协作房间。API 与网页专家的项目权限固定只读,只有 CLI 专家可选择只读或写入;API 当前不访问本机项目文件,仍可保存讨论发言和主持安排。调用由本机服务发出,费用按所选 API 账号计费;密钥仅保存于本机。模型与配置说明见 [API 接入](docs/runner.md#api-接入)。
|
|
75
|
+
|
|
74
76
|
也可不勾选立即启动,先建房,再从“接入”页点击“启动讨论”。本机网页正常启动无需下载 JSON、手动登记房间或另执行首次启动命令。
|
|
75
77
|
|
|
76
78
|
`codiscuss local open` 已启用本机启动能力;直接运行源码网站时使用 `python server.py --host 127.0.0.1 --local-launch`。使用已有线上网站时,先按下节连接本机。
|
package/backend/identity.py
CHANGED
|
@@ -1,31 +1,31 @@
|
|
|
1
|
-
"""Participant identities: an AI platform is a type, a room participant is one named instance of it.
|
|
2
|
-
|
|
3
|
-
`Claude` and `Claude-评审` are two instances of the Claude platform in the same room; each keeps its
|
|
4
|
-
own session, model and thinking effort. Platform names alone keep their historical meaning.
|
|
5
|
-
"""
|
|
6
|
-
|
|
7
|
-
import re
|
|
8
|
-
|
|
9
|
-
USER = "用户"
|
|
10
|
-
AI_PLATFORMS = ("Codex", "Claude", "Gemini", "DeepSeek", "Qwen")
|
|
11
|
-
PARTICIPANTS = [USER, *AI_PLATFORMS]
|
|
12
|
-
MAX_INSTANCE_SUFFIX = 16
|
|
13
|
-
# AI instances one room may hold, across platforms.
|
|
14
|
-
MAX_ROOM_AGENTS = 12
|
|
15
|
-
INSTANCE_PATTERN = re.compile(rf"({'|'.join(AI_PLATFORMS)})(?:-[0-9A-Za-z_一-鿿]{{1,{MAX_INSTANCE_SUFFIX}}})?")
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
def is_ai(name):
|
|
19
|
-
"""Whether a name is an AI platform or a named instance of one."""
|
|
20
|
-
return isinstance(name, str) and INSTANCE_PATTERN.fullmatch(name) is not None
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
def is_participant(name):
|
|
24
|
-
"""Whether a name may author, submit or be scheduled: the user or any AI instance."""
|
|
25
|
-
return name == USER or is_ai(name)
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
def platform_of(name):
|
|
29
|
-
"""Return the platform an AI instance belongs to, or None for the user and invalid names."""
|
|
30
|
-
match = INSTANCE_PATTERN.fullmatch(name) if isinstance(name, str) else None
|
|
31
|
-
return match.group(1) if match else None
|
|
1
|
+
"""Participant identities: an AI platform is a type, a room participant is one named instance of it.
|
|
2
|
+
|
|
3
|
+
`Claude` and `Claude-评审` are two instances of the Claude platform in the same room; each keeps its
|
|
4
|
+
own session, model and thinking effort. Platform names alone keep their historical meaning.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import re
|
|
8
|
+
|
|
9
|
+
USER = "用户"
|
|
10
|
+
AI_PLATFORMS = ("Codex", "Claude", "Gemini", "DeepSeek", "Qwen", "Grok")
|
|
11
|
+
PARTICIPANTS = [USER, *AI_PLATFORMS]
|
|
12
|
+
MAX_INSTANCE_SUFFIX = 16
|
|
13
|
+
# AI instances one room may hold, across platforms.
|
|
14
|
+
MAX_ROOM_AGENTS = 12
|
|
15
|
+
INSTANCE_PATTERN = re.compile(rf"({'|'.join(AI_PLATFORMS)})(?:-[0-9A-Za-z_一-鿿]{{1,{MAX_INSTANCE_SUFFIX}}})?")
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def is_ai(name):
|
|
19
|
+
"""Whether a name is an AI platform or a named instance of one."""
|
|
20
|
+
return isinstance(name, str) and INSTANCE_PATTERN.fullmatch(name) is not None
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def is_participant(name):
|
|
24
|
+
"""Whether a name may author, submit or be scheduled: the user or any AI instance."""
|
|
25
|
+
return name == USER or is_ai(name)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def platform_of(name):
|
|
29
|
+
"""Return the platform an AI instance belongs to, or None for the user and invalid names."""
|
|
30
|
+
match = INSTANCE_PATTERN.fullmatch(name) if isinstance(name, str) else None
|
|
31
|
+
return match.group(1) if match else None
|