Skip to content

feat(llm): 接入官方 ChatGPT 计划登录渠道 - #1247

Merged
H-Chris233 merged 4 commits into
betafrom
codex/issue-1243-chatgpt-siwc
Oct 21, 2026
Merged

H-Chris233 merged 4 commits into
betafrom
codex/issue-1243-chatgpt-siwc

Conversation

@H-Chris233

@H-Chris233 H-Chris233 commented Oct 21, 2026 •

Copy link
Copy Markdown
Collaborator

摘要

关联 #1243。

新增独立的 chatgpt_siwc(ChatGPT Plan)文本渠道,由共享 Rust Core 完成官方 Sign in with ChatGPT 认证、模型发现和 Responses 推理,并接入 Windows、macOS、Linux、Android、鸿蒙宿主。

当前为 Draft:本地 mock 与跨平台 CI 已通过,五平台真实账号及设备验收尚未完成。

修复 / 新增 / 改进

  • Core 实现动态客户端注册、稳定 host ID、loopback 回调、PKCE/state/nonce、JWT/JWKS 校验、后台登录与取消、重新授权、刷新和注销。注册按 issuer/subject/issued client ID 隔离,前端只接收脱敏状态。
  • SIWC 使用本机专用安全存储和版本提交,处理跨实例刷新竞争、Token 轮换持久化失败及迟到结果;注销保留注册映射,远端撤销未确认时如实提示。
  • /v1/models 保留服务端可见模型顺序,显示名称与 slug 分离,无硬编码默认模型。/v1/responses 固定端点、认证和字段白名单,强制 store:false、stream:true;所有文本入口底层消费 SSE,仅 response.completed 成功。
  • 接入现有润色、翻译、Prompt、风格及热词管线;额度/认证/权限失败不自动切换到 API Key 计费渠道,不把失败输出保存为完成结果。
  • 接入 Tauri、Linux egui、Android RuntimeService 及鸿蒙原生桥/Asset Store。鸿蒙主应用与 IME 使用存储侧版本条件更新,授权 URL 不经过 WebView。
  • 新增共用 ChatGPT Plan 表单、Linux 登录与模型操作、各现有语言文案、IPC/mock/生命周期及 UI 回归测试,更新现有渠道选择说明。

兼容

  • 保留现有 OpenAI API Key、Codex OAuth 和其他渠道;保留通用 ProviderModelsResult.models: string[] 接口。
  • SIWC Token 与 host ID 不进入普通同步、备份或迁移字段;另一台设备需要重新登录。
  • ASR 保持原渠道;不包含 Omni 音频、通用 API 代理、跨设备 Token 同步或 iOS 新宿主。不引入 Node.js 运行时或官方 DevKit 源码。
  • 断开连接不删除、禁用或重排渠道,已绑定账号的草稿不按空白渠道清理。

测试计划

以下为本地执行结果,Rust 检查使用 1.99.0;工作目录为 openless-all/app。

已通过

  • cargo +1.99.0 test --locked -p openless-core --lib siwc:26 项通过,覆盖 OAuth mock/JWKS、注册隔离、刷新/注销竞争、取消及 SSE 等。
  • cargo +1.99.0 test --locked --manifest-path src-tauri/backend-tests/Cargo.toml:48 项通过,1 项忽略。
  • cargo +1.99.0 test --locked -p openless-harmony-host --lib:4 项通过;执行环境为 Windows,不代表鸿蒙设备或 HAP 验证。
  • Windows Tauri cargo check。
  • Android aarch64-linux-android、x86_64-linux-android 两目标 cargo check;不是完整 APK 构建或设备验收。
  • npm run build(含 TypeScript 检查及 prebuild 契约测试)。
  • node scripts/harmony-siwc.test.mjs、node scripts/siwc-host-contract.test.mjs。
  • Chromium e2e/siwc.spec.ts:2 项通过,覆盖登录/取消、模型选择、主动连接测试、额度提示主操作、断开连接、390px 窄屏和键盘操作;已检查桌面/窄屏实际截图。
  • git diff --cached --check。

证据与可复现用例:crates/openless-core/src/siwc/tests.rs、e2e/siwc.spec.ts、scripts/harmony-siwc.test.mjs、scripts/siwc-host-contract.test.mjs。本地构建日志和截图未纳入提交。

CI 复验(2026-10-21,2f8b470e)

PR CI #39594463544、push CI #39594457807 和 Native capsule #39594463524 均已成功完成。

  • Windows:前端/契约全集、Tauri 编译、测试编译、独立 backend-tests、录音器测试、Rust 1.99 MSRV 检查和 TSF IME 编译。
  • macOS:前端/契约全集、原生 capsule、Codex 沙箱契约、Tauri Rust 后端测试;独立 macOS MSRV job 按既有条件跳过。
  • Linux:Core/Harmony host/egui 测试、严格 Clippy、fcitx5、TLS/权限契约、原生构建和 deb/rpm 打包校验。
  • Android:cargo check、JVM 凭据测试、instrumentation 编译和 Keystore 仪器测试。SIWC 浏览器授权与后台生命周期仍待真机验收。
  • 鸿蒙:IPC/ArkTS 契约、ArkWeb bundle,以及实际 ArkTS/Rust host 编译、无签名 HAP 构建与校验;日志确认生成并校验 OpenLess_harmony_arm64.hap。
  • UI motion(Chromium + WebKit)及 Windows/macOS native-capsule。

本次 CI 修复补齐三个 Linux 旧夹具的 siwc: None,恢复触发既有契约断言的无关链式调用格式,并把 siwc_editor 原样移至测试模块之前。未放宽断言或关闭 Clippy;本地从原失败点起的 109 个前端测试文件通过。

已知未通过 / 未完成

  • 较早的全量 Core 测试中,现有 experimental_asr::tests::optional_runtime_files_are_not_download_progress 在 Windows 报 拒绝访问 (os error 5),单独运行仍复现;不将该全量运行报告为通过。
  • 前端全集在现有 scripts/ci-cache-usage.test.mjs 中因 WSL 无 /bin/bash、随后缺少 deleted.tsv 而中断;未为此改动无关测试。
  • Windows、macOS、Linux、Android、鸿蒙分别验证系统浏览器真实授权、重启恢复、模型选择、润色/翻译、刷新与注销。
  • Android 与鸿蒙额外验证切后台、进程终止/超时恢复及输入法调用;鸿蒙主应用/IME 刷新竞争和超长 Token 持久化需真机关闭验收风险。

本轮没有使用真实账号发起授权或订阅额度推理,也没有发布安装包。

Initialize the optional SIWC state in existing provider editor fixtures. Restore unrelated Less Computer formatting required by its existing contract test.
@H-Chris233
H-Chris233 marked this pull request as ready for review October 21, 2026 12:14
@H-Chris233
H-Chris233 merged commit 8e8b3db into beta Oct 21, 2026
18 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant