Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 24 additions & 4 deletions .downstream/gpt6-routing-and-prompts.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,9 +39,9 @@ API Key 使用完整 Responses。OAuth 目录保留实际 Lite 与上下文字

## 提示词规则与账号选择

系统提示词页面使用一个编辑器管理正文、角色、位置、平台/模型范围和默认选择。“保存并生效”在一个事务中创建不可变内容版本、更新规则和开关,只递增一次 revision。历史版本、来源同步和远程 Skill 位于高级入口;不存在第二个“设为全局当前模板”的生效步骤。
从侧栏“扩展功能 → 系统提示词”打开编辑器,选择提示词、修改正文与投递范围,再点击“保存并生效”。页面只保留核心配置和当前提示词的简易历史;独立模板库、来源同步、Skill 发布和请求 JSON 调试已退出管理流程,旧入口在管理员鉴权后返回 HTTP 410。

管理员 `GET /api/v1/admin/system-prompts/config` 返回配置、按规则 ID 索引的正文和协议能力。`PUT` 提交 `expected_revision`、运行开关、v2 `policy` 及仅包含改动正文的 `contents`。新规则可以携带零模板/版本 ID 和正文,也可以明确引用已有不可变版本;事务内生成真实引用。固定版本的旧规则 ID、默认选择、账号引用和顺序保留,v1 写入及无目标规则的旧发布操作明确拒绝。
管理员 `GET /api/v1/admin/system-prompts/config` 返回配置、按规则 ID 索引的正文和协议能力。`PUT` 提交 `expected_revision`、运行开关、v2 `policy` 及仅包含改动正文的 `contents`,一次事务生成不可变内容版本并更新配置,只递增一次 revision。新规则携带零模板/版本 ID 和正文;历史恢复按当前规则校验,仍加入草稿并通过同一次保存生效。`GET /api/v1/admin/system-prompts/rules/:rule_id/history` 只读取该规则的历史。未展示的 Compact、回显兼容值省略时沿用当前值。

| 位置 | 含义 |
| --- | --- |
Expand All @@ -62,14 +62,34 @@ v2 使用独立 `role=auto/system/developer` 与 `position`。平台必须显式

账号详情和账号批量操作提供 `inherit / off / custom`:继承默认规则、关闭、或用指定规则替换默认集合。默认集合留空、指定账号选择 custom,即可只对指定账号开启。账号仅存规则引用,不复制正文;shadow 使用自身绑定。

预览接受未保存正文和规则,使用实际协议转换与同一个编排器,展示基础指令、客户指令、最终角色/载体/索引及跳过原因,不访问模型上游。OAuth 身份参数等模拟部分会标明。实际转发先转换协议和准备基础指令,再应用规则、生成缓存标识/签名并发送;每次重试从干净输入构建,WS 历史累计器不保存本站注入。每轮冻结内容快照,换账号时重新解析绑定;规则变化隔离缓存,保留续接标识及精确载体回显保护。
实际转发先转换协议和准备基础指令,再应用规则、生成缓存标识/签名并发送;每次重试从干净输入构建,WS 历史累计器不保存本站注入。每轮冻结内容快照,换账号时重新解析绑定;规则变化隔离缓存,保留续接标识及精确载体回显保护。编辑器直接根据后端协议能力约束可选角色、位置和范围。

迁移 `255_prompt_rule_policy_v2.sql` 固定旧 follow_active 当时的真实版本,并将旧各域开关折入相应规则,保留 OpenAI/Cindy 范围,避免自动扩散到新平台。Claude 旧自定义块保留布局、缓存属性、模型条件及单次占位符展开,统一投递;Settings 页的旧正文字段仅保留核对,修改请求返回迁移提示。单文档保留 64 KiB 上限;配置最多 64 条规则以容纳旧两个域的并集,每个实际请求命中的编译正文仍限制为 256 KiB,互斥平台的配置不相加计算请求预算。

远程 Skill 仍以共享 `/current` 树和提示词成对发布。订阅该来源的所有规则都是明确影响集合;发布/回滚携带完整 `target_rule_ids` 和 `expected_config_revision`,与 registry revision 一起在事务内比较。普通来源同步只创建候选,应用历史正文只更新指定规则。来源不可用不会阻止无关内联规则,也不妨碍关闭总开关;命中不可用来源的请求明确失败。
迁移 `256_prompt_independent_content.sql` 提供独立内容及冻结文件存储,应用启动时在同一事务中核验并固定升级前实际生效的正文和完整公共文件集合。规则 ID、顺序、默认选择、范围和账号引用保持;混合 Skill 使用活动配对的有效正文,不能用模板存档代替。迁移不联网、不初始化种子,缺少有效正文或活动文件时不提交部分结果,并使应用初始化失败;完成后重启不重复迁移。

已有 `/skills/security-research/current/` 链接继续读取冻结文件,不再跟随来源更新。旧数据保留;需要其他文件包的旧 Skill 版本只能查看档案,不能恢复文件包。普通正文和 Claude 结构化版本可恢复;结构化文本编辑保留块顺序和缓存属性。迁入的公开 Skill 版本保留原回显语义,编辑后创建的普通新版本默认私有,全局回显兼容值不因此改变。

配置冲突保留编辑器草稿,重新读取后可合并未编辑的远端字段。账号仍用自身版本比较;被账号引用的规则不能直接删除。

## 292 采集代理输入

在“Codex 路由设置”的采集代理输入框粘贴地址。支持完整代理 URI、主机端口、两种顺序的四段认证格式、引用分列、中英文标签以及多条记录;IPv6 使用方括号。协议选择仅用于输入未写协议的情况,明确的 URI 或标签协议不会被覆盖。

例如 `proxy.example:8080:user:p@ss` 按候选解析后选择对应端点;`node.example:8080:user.example:9090` 可能有两种合法解释,需要从脱敏列表中明确选择。多个格式识别出同一端点及认证信息时去重,不同密码不合并。输入中的 `%40` 在 URI 认证字段中解码一次,在原始四段式或标签值中保持字面量;含分隔符或边界空白的列值使用引号。

`POST /api/v1/admin/settings/openai-codex-ticket/proxy-parse` 只解析候选,不存储输入、不连接网络。保存和测试携带原文、缺省协议及可选 `proxy_selection_id`,服务端重新解析并核对选择,最终仅保存一个规范代理地址。修改输入、缺省协议或管理员会话会失效旧选择和测试结果;格式错误、未选择或选择过期不会发起连接。测试和实际采集使用同一选定端点,保持证书信任及采集连接隔离。

## 批量账号连接测试

选择账号后即可开始,默认逐账号自动选择支持文本对话的模型;指定模型、推理强度和测试文本在设置中展开。批量请求的 `items` 接受 `selection_mode=auto/explicit`;省略模式且已有 `model_id` 的旧请求视为显式指定,否则默认自动选择。

后台逐项读取统一连接测试计划,目录失败或没有适用模型只影响该账号。发送前保存实际模型和必要执行信息,已解析的失败项重试沿用原模型;能力或映射变化时明确要求重新配置。沿用共享并发 5、每项 90 秒和 24 小时请求资料有效期,100 仅是目录及任务分块大小。

连接成功要求可展示的非空文本和有效协议终态,不判断答案质量。空流、提前 EOF、纯推理或失败终态不能显示成功;正常拒绝文本及带有效文本的输出额度结束可以证明连接完成。列表显示模型、耗时、明确失败类别和恢复结果,不保存完整回答或原始上游错误。

成功后恢复可恢复的错误、限流和临时不可调度状态,保留手动停用。恢复失败单独提示,连接成功状态不回退,也不会因重试而再次发出已成功的模型请求。关闭窗口表示收起;停止后只可重试已失败且资料仍有效的项,已取消和未执行项不会自动重放。

## 界面与验证边界

公共插件 context 的同值刷新不再重建 iframe。主题按 URL/变量差异更新,新 CSS 及字体准备完成再替换旧外观;加载失败保留最后成功版本。内容测量按帧合并,使用自然尺寸而非随滚动变化的 viewport 坐标。
Expand Down
1 change: 1 addition & 0 deletions .github/workflows/downstream-verify.yml
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,7 @@ jobs:
src/features/image-studio/history.legacy.spec.ts \
src/components/admin/account/__tests__/BatchTestAccountModal.spec.ts \
src/components/admin/account/__tests__/BatchTestAccountModal.plan.spec.ts \
src/components/admin/codex/__tests__/CodexRuntime.proxy.spec.ts \
src/components/admin/account/__tests__/AccountFolderBar.spec.ts \
src/components/admin/account/__tests__/AccountTaxonomyManager.spec.ts \
src/components/admin/account/__tests__/AccountBulkTaxonomyModal.spec.ts \
Expand Down
7 changes: 0 additions & 7 deletions backend/cmd/server/wire.go
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,6 @@ func provideCleanup(
promptAudit *securityaudit.PromptService,
promptDomain *service.PromptDomainRuntime,
businessPrompt *service.BusinessSystemPromptService,
remoteSkillRegistry *service.RemoteSkillRegistryService,
accountJobs *service.AccountJobRuntime,
cindyHealth *service.CindyHealthService,
cindyBalanceProbe *service.CindyBalanceProbeService,
Expand Down Expand Up @@ -198,12 +197,6 @@ func provideCleanup(
}
return nil
}},
{"RemoteSkillRegistryService", func() error {
if remoteSkillRegistry != nil {
remoteSkillRegistry.Stop()
}
return nil
}},
{"BusinessSystemPromptService", func() error {
if businessPrompt != nil {
businessPrompt.Stop()
Expand Down
25 changes: 6 additions & 19 deletions backend/cmd/server/wire_gen.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 0 additions & 1 deletion backend/cmd/server/wire_gen_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,6 @@ func minimalDependencyCleanup(autoReset *service.OpenAIQuotaAutoResetService) fu
nil, // promptAudit
nil, // promptDomain
nil, // businessPrompt
nil, // remoteSkillRegistry
nil, // accountJobRuntime
nil, // cindyHealth
nil, // cindyBalanceProbe
Expand Down
17 changes: 15 additions & 2 deletions backend/internal/accounttools/policy/batch.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,19 +16,32 @@ func planBatch(request extensionv1.BatchTestPlanningRequest) (extensionv1.BatchT
plan := extensionv1.BatchTestPlan{Models: make(map[int64]string)}
if request.HasItems || request.Items != nil {
efforts := map[int64]string{}
modes := map[int64]string{}
for _, item := range request.Items {
if item.ModelID != "" && strings.TrimSpace(item.ModelID) == "" {
return plan, invalid
}
item.ModelID = strings.TrimSpace(item.ModelID)
if item.AccountID <= 0 || item.ModelID == "" || len(item.ModelID) > 256 || len(item.ReasoningEffort) > 32 || item.ReasoningEffort != strings.TrimSpace(item.ReasoningEffort) {
if item.SelectionMode == "" {
item.SelectionMode = "auto"
if item.ModelID != "" {
item.SelectionMode = "explicit"
}
}
if item.AccountID <= 0 || (item.SelectionMode != "auto" && item.SelectionMode != "explicit") ||
(item.SelectionMode == "explicit" && item.ModelID == "") || (item.SelectionMode == "auto" && item.ModelID != "") ||
len(item.ModelID) > 256 || len(item.ReasoningEffort) > 32 || item.ReasoningEffort != strings.TrimSpace(item.ReasoningEffort) {
return plan, invalid
}
if previous, exists := plan.Models[item.AccountID]; exists {
if previous != item.ModelID || efforts[item.AccountID] != item.ReasoningEffort {
if previous != item.ModelID || efforts[item.AccountID] != item.ReasoningEffort || modes[item.AccountID] != item.SelectionMode {
return plan, invalid
}
continue
}
plan.AccountIDs = append(plan.AccountIDs, item.AccountID)
plan.Models[item.AccountID], efforts[item.AccountID] = item.ModelID, item.ReasoningEffort
modes[item.AccountID] = item.SelectionMode
plan.Items = append(plan.Items, item)
}
} else {
Expand Down
Loading
Loading