{"id":51371997,"url":"https://github.com/jyx0208/claude-science-api-bridge","last_synced_at":"2026-07-06T11:00:46.074Z","repository":{"id":368829994,"uuid":"1286822346","full_name":"Jyx0208/claude-science-api-bridge","owner":"Jyx0208","description":"让 Claude Science 一键接入 DeepSeek、硅基流动 Kimi、OpenAI 等第三方 API 的 macOS 本地代理与安装器","archived":false,"fork":false,"pushed_at":"2026-07-04T03:08:45.000Z","size":525,"stargazers_count":16,"open_issues_count":2,"forks_count":1,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-07-05T10:14:36.891Z","etag":null,"topics":["agent-runbook","ai-agent","anthropic","byok","claude-science","deepseek","kimi","local-proxy","macos","openai-compatible","proxy","siliconflow"],"latest_commit_sha":null,"homepage":"https://github.com/Jyx0208/claude-science-api-bridge/releases/latest","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Jyx0208.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-07-02T06:07:54.000Z","updated_at":"2026-07-05T01:52:32.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/Jyx0208/claude-science-api-bridge","commit_stats":null,"previous_names":["jyx0208/claude-science-api-bridge"],"tags_count":10,"template":false,"template_full_name":null,"purl":"pkg:github/Jyx0208/claude-science-api-bridge","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Jyx0208%2Fclaude-science-api-bridge","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Jyx0208%2Fclaude-science-api-bridge/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Jyx0208%2Fclaude-science-api-bridge/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Jyx0208%2Fclaude-science-api-bridge/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Jyx0208","download_url":"https://codeload.github.com/Jyx0208/claude-science-api-bridge/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Jyx0208%2Fclaude-science-api-bridge/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35187639,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-06T02:00:07.184Z","response_time":106,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["agent-runbook","ai-agent","anthropic","byok","claude-science","deepseek","kimi","local-proxy","macos","openai-compatible","proxy","siliconflow"],"created_at":"2026-07-03T08:00:21.791Z","updated_at":"2026-07-06T11:00:46.014Z","avatar_url":"https://github.com/Jyx0208.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Claude Science API Bridge\n\n让 Claude Science 安全接入 DeepSeek、OpenAI、硅基流动 Kimi 与任意 OpenAI 兼容第三方 API 的本地代理和 agent 配置手册。\n\n最新 macOS 一键安装包：[`Claude Science API Bridge.dmg`](https://github.com/Jyx0208/claude-science-api-bridge/releases/latest)\n\n最省事的安装方式：\n\n```bash\ncurl -fsSL https://raw.githubusercontent.com/Jyx0208/claude-science-api-bridge/main/scripts/install-macos-app.sh | bash\n```\n\n这个脚本会下载最新 DMG，复制 App 到 `~/Applications`，移除 Apple quarantine 标记并打开 App。它不会修改 Clash、VPN、TUN、DNS、系统代理、`/etc/hosts`、系统证书或 443 端口。\n\n这个项目不只是一个代理程序，也是一份给 AI agent 读取的操作说明书。把仓库交给 Codex、Claude Code 或其他本地 agent 后，它可以先读 `AGENTS.md` 和 `docs/agent-runbook.md`，再按步骤完成诊断、安装、配置和验证。\n\n## 功能\n\n- 提供 macOS `.app + .dmg` 一键安装包，首次打开即可选择 provider 并写入本地配置\n- 在本机启动 Anthropic 兼容接口：`http://127.0.0.1:9876`\n- 将 Claude Science 的 Anthropic Messages API 请求转换为 OpenAI Chat Completions 请求\n- 将 DeepSeek、OpenAI 或其他 OpenAI 兼容接口的响应转换回 Anthropic 格式\n- 支持流式、非流式、工具调用、工具结果、真实图片输入和基础 token 计数\n- 对支持视觉的 OpenAI 兼容模型保留图片输入；对文本模型可自动省略图片，避免后端报错\n- 自动生成 Claude Science 可接受的本地 fake OAuth token\n- 支持 cc-switch 风格的「切换中心」：当前配置摘要、Provider 卡片、搜索、配置档保存和一键切换\n- 支持 Provider 配置档：provider、base_url、协议模式、API key、模型映射可保存和复用\n- 支持一键从当前 Provider 拉取 `/v1/models` 模型列表，并把选中的模型应用到 Claude Science 菜单\n- 支持第三方模型菜单映射，让 Claude Science 模型选择里显示 Kimi、Qwen、GPT 等真实后端模型名\n- 可安全补丁本地 daemon 复制件，把硬编码的 Opus/Sonnet 菜单替换成 BYOK 模型菜单\n- 支持 Provider 预设、OpenAI 兼容翻译与 Anthropic 原生透传两种上游模式\n- 支持可选 path-secret 本地鉴权，避免本机其他进程随便调用你的第三方 key\n- 支持按模型配置 `max_tokens` 上限，减少第三方 provider 因输出上限报 400\n- 提供 Web 管理面板：`http://127.0.0.1:9876/dashboard`\n- 支持 macOS LaunchAgent 后台运行和开机自启\n- 提供 agent runbook，方便 AI agent 在用户电脑上安全接管配置\n\n## 默认安全策略\n\n默认安装只走安全模式，不会修改：\n\n- Clash、VPN、TUN、DNS 或系统代理配置\n- `/etc/hosts`\n- macOS 系统证书信任\n- `443` 端口\n\n如果 Claude Science 的某些硬编码 HTTPS 请求必须拦截，可以使用高级模式，但需要先阅读 `docs/network-interception.md`，并由用户明确同意。\n\n本项目不打算重写一个完整的 [cc-switch](https://github.com/farion1231/cc-switch)。更合理的方向是复用它已经验证过的思路：Provider 配置档、模型列表拉取、endpoint 候选推导、模型映射、官方/第三方隔离。本项目只增加 Claude Science 专用的 OAuth 门票、Anthropic/OpenAI 翻译、daemon 模型菜单补丁和安全安装脚本。\n\n同时也吸收了 [CSSwitch](https://github.com/SuperJJ007/CSswitch) 的几个 Science 方向安全设计：入站 Claude OAuth/API key 不转发给第三方、path-secret 本地鉴权、优先使用 provider 的 Anthropic 原生端点。我们的默认模式仍保持兼容：不强制 secret，不默认修改 Clash、DNS 或系统代理。\n\n## 用户怎么使用\n\n也可以手动下载 macOS 发布包：\n\n1. 下载 `Claude Science API Bridge.dmg`\n2. 双击打开 `Claude Science API Bridge.app`\n3. 按弹窗选择 provider，输入自己的 API key\n4. App 会自动安装本地代理、打开 Dashboard，并启动 Claude Science\n\n如果首次打开被 macOS 拦截，请优先使用上面的一行安装命令，或者在 Finder 里右键 App，选择“打开”。\n\n当前公开 DMG 使用 ad-hoc 签名，未经过 Apple Developer ID 公证，所以 macOS 可能显示“Apple 无法验证是否包含恶意软件”。这不是检测到恶意软件，而是 Apple 没有给这个包签发公证票据。临时使用可右键打开；正式发布给更多用户前，应使用 `./scripts/notarize-macos-release.sh` 做 Developer ID 签名和 Apple notarization。\n\nAgent 安装方式也仍然支持。推荐做法是：把下面这段 prompt 复制给你的本地 agent，让 agent 阅读仓库、诊断环境、安装、配置并验证。\n\n你只需要准备：\n\n- 一台 macOS 电脑\n- 已安装 Claude Science\n- 一个 DeepSeek、OpenAI 或其他 OpenAI 兼容 API key\n\n## 直接复制给 Agent 的 Prompt\n\n把下面整段发给 Codex、Claude Code 或其他能操作本机终端的 agent：\n\n```text\n请你帮我在这台 macOS 上配置 Claude Science API Bridge，让 Claude Science 使用第三方 OpenAI 兼容 API。\n\n仓库地址：\nhttps://github.com/Jyx0208/claude-science-api-bridge\n\n目标：\n1. 使用安全模式完成安装和配置。\n2. 让 Claude Science 的 Anthropic API 请求走本地代理 127.0.0.1:9876。\n3. 后端使用我提供的第三方 API。\n4. 如果我要求读图，请使用支持视觉输入的模型，不要把图片替换成文本占位。\n5. 让 Claude Science 的模型选择里显示第三方模型别名，而不是只显示 Opus / Sonnet / Haiku。\n6. 使用 Dashboard 或 /api/fetch-models 一键获取当前 provider 模型列表，让我选择实际要用的第三方模型。\n7. 完成端到端验证，确认 /v1/models 和 /v1/messages 都成功；如果启用读图，还要完成图片请求验证。\n\n我的后端配置：\n- provider: DeepSeek / OpenAI / Custom（三选一；硅基流动 Kimi 请选择 Custom；如果我没写，请先问我）\n- api_key: 我会单独给你；不要把 key 打印到日志或最终回复里\n- base_url: 如果是 DeepSeek 用 https://api.deepseek.com；如果是 OpenAI 用 https://api.openai.com；如果是硅基流动用 https://api.siliconflow.cn；如果是其他 Custom 请先问我\n- model: 第三方服务实际支持的模型名；如果我没写，请先问我\n- image_support: 如果我需要读图，请确认模型支持视觉输入，并设置 inline_image_policy=preserve 或 auto\n\n安全要求：\n1. 先完整阅读仓库结构，以及 README.md、AGENTS.md、docs/agent-runbook.md、docs/troubleshooting.md、scripts/doctor.sh、scripts/install-safe.sh、scripts/verify-proxy.sh。\n2. 默认只使用安全模式，不要修改 Clash、VPN、TUN、DNS、系统代理、/etc/hosts、系统证书信任或 443 端口。\n3. 不要 reload Clash，不要改任何网络代理配置。\n4. 不要输出、提交、总结或截图我的 API key、OAuth token、证书私钥。\n5. 如果你认为必须使用高级 HTTPS 拦截，必须先停下来解释原因并单独征求我的明确同意。\n\n执行要求：\n1. 如果本机还没有仓库，请 clone 到 ~/.claude-science/proxy；如果已有仓库，请进入该目录并拉取最新 main。\n2. 先运行 ./scripts/doctor.sh 做只读诊断。\n3. 按 AGENTS.md 和 docs/agent-runbook.md 执行安全安装。\n4. 将 API key 和模型配置写入本地 config.json，确保 config.json 不会提交到 Git。\n5. 优先调用 /api/fetch-models 获取当前 provider 的模型列表；若 provider 不支持模型列表，再手动使用用户给定模型。\n6. 配置 model_aliases、model_list_mode=aliases 和 model_menu_strategy=claude_compatible，让 /v1/models 返回第三方模型显示名，同时使用 Claude Science 更容易放行的菜单槽位。\n7. 运行 ./scripts/self-test.sh。\n8. 启动或重启代理服务。\n9. 运行 ./scripts/verify-proxy.sh 做 health、models、messages 和 recent-requests 验证。\n10. 如果模型支持读图，运行 VERIFY_IMAGE=1 ./scripts/verify-proxy.sh 做真实图片输入验证。\n11. 运行 ./scripts/start-claude-science.sh，让脚本自动刷新 token、补丁本地 daemon 复制件并重启 Claude Science。\n12. 再检查 http://127.0.0.1:9876/api/recent-requests，确认 Claude Science 命中了本地代理。\n\n如果遇到问题：\n1. 先运行 ./scripts/doctor.sh。\n2. 阅读 docs/troubleshooting.md。\n3. 优先修安全模式路径。\n4. 不要通过修改 Clash 或系统网络配置来“试一试”。\n\n最终回复请只告诉我：\n1. 是否安装成功。\n2. 使用的 provider、base_url 和模型名，但不要显示 API key。\n3. 验证结果摘要。\n4. Dashboard 地址。\n5. 如果失败，明确卡在哪一步以及下一步需要我提供什么。\n```\n\n## 给 Agent 的入口\n\n如果你是 AI agent，请不要让用户手动安装。你应该按顺序读取：\n\n1. `AGENTS.md`\n2. `docs/agent-runbook.md`\n3. `docs/troubleshooting.md`\n4. `docs/network-interception.md`，仅在用户明确允许高级拦截时读取和执行\n5. `docs/github-publishing.md`，仅在需要发布到 GitHub 时读取\n\n推荐执行流程：\n\n```bash\n./scripts/doctor.sh\n./scripts/install-safe.sh\n./scripts/self-test.sh\n./scripts/verify-proxy.sh\n```\n\n`doctor.sh` 是只读诊断脚本；agent 应先运行它，不要直接猜测用户机器状态。\n\n## Provider 配置示例\n\n### DeepSeek\n\n```json\n{\n  \"deepseek_api_key\": \"REDACTED\",\n  \"deepseek_base_url\": \"https://api.deepseek.com\",\n  \"default_backend\": \"deepseek\",\n  \"force_model\": \"deepseek-chat\",\n  \"inline_image_policy\": \"auto\"\n}\n```\n\n### OpenAI\n\n```json\n{\n  \"openai_api_key\": \"REDACTED\",\n  \"openai_base_url\": \"https://api.openai.com\",\n  \"default_backend\": \"openai\",\n  \"force_model\": \"gpt-4o\",\n  \"inline_image_policy\": \"preserve\"\n}\n```\n\n### 任意 OpenAI 兼容 API\n\n```json\n{\n  \"custom_api_key\": \"REDACTED\",\n  \"custom_base_url\": \"https://provider.example.com\",\n  \"custom_upstream_mode\": \"openai\",\n  \"default_backend\": \"custom\",\n  \"force_model\": \"provider-model-name\",\n  \"model_aliases\": [\n    {\n      \"id\": \"claude-opus-4-8\",\n      \"display_name\": \"Provider Model\",\n      \"backend\": \"custom\",\n      \"model\": \"provider-model-name\"\n    }\n  ],\n  \"model_list_mode\": \"aliases\",\n  \"model_menu_strategy\": \"claude_compatible\",\n  \"model_token_caps\": {\n    \"provider-model-name\": 8192\n  },\n  \"default_max_tokens_cap\": 0,\n  \"inline_image_policy\": \"auto\"\n}\n```\n\n`custom_base_url` 可以写成 `https://provider.example.com`，也可以写成 `https://provider.example.com/v1`，代理会自动规范化。\n\n### 硅基流动 Kimi 示例\n\n```json\n{\n  \"custom_api_key\": \"REDACTED\",\n  \"custom_base_url\": \"https://api.siliconflow.cn\",\n  \"custom_upstream_mode\": \"openai\",\n  \"default_backend\": \"custom\",\n  \"force_model\": \"Pro/moonshotai/Kimi-K2.6\",\n  \"model_aliases\": [\n    {\n      \"id\": \"claude-opus-4-8\",\n      \"display_name\": \"Kimi K2.6 Pro++\",\n      \"backend\": \"custom\",\n      \"model\": \"Pro/moonshotai/Kimi-K2.6\"\n    }\n  ],\n  \"model_list_mode\": \"aliases\",\n  \"model_menu_strategy\": \"claude_compatible\",\n  \"inline_image_policy\": \"preserve\",\n  \"reasoning_content_policy\": \"never\"\n}\n```\n\n`reasoning_content_policy` 默认应保持 `never`。部分后端会把内部思考、会话恢复记录或执行计划放在 `reasoning_content` 或普通 `content` 前缀里；代理会尽量过滤这些工作记录，避免它们作为普通对话显示。\n\n## 上游协议模式\n\n每个后端都有一个 `*_upstream_mode`：\n\n- `openai`：Claude Science 的 Anthropic 请求先由本代理翻译成 OpenAI Chat Completions，再发给第三方。适合硅基流动 Kimi、DashScope Qwen、OpenAI 兼容聚合器等。\n- `anthropic`：第三方 provider 本身支持 Anthropic Messages API，本代理只替换模型名和鉴权头后透传。工具调用、thinking、流式事件更保真。适合 DeepSeek Anthropic、Moonshot Anthropic、部分 provider 的原生 Claude 兼容端点。\n\nDeepSeek 原生 Anthropic 示例：\n\n```json\n{\n  \"deepseek_api_key\": \"REDACTED\",\n  \"deepseek_base_url\": \"https://api.deepseek.com/anthropic\",\n  \"deepseek_upstream_mode\": \"anthropic\",\n  \"default_backend\": \"deepseek\",\n  \"force_model\": \"deepseek-chat\"\n}\n```\n\nDashboard 的「Provider 预设」可以快速套用常见 provider 的 base URL、协议模式、默认模型和模型别名。套用预设不会写入 API key；key 仍需本地配置。\n\nDashboard 的「一键获取模型列表」会使用当前 provider 的 API key 调用上游模型列表端点。模型端点会按 cc-switch 的思路自动尝试：\n\n- `{base_url}/v1/models`\n- `{base_url}/models`，当 base_url 已以 `/v1`、`/v4` 等版本段结尾时\n- 剥离 `/anthropic`、`/api/anthropic`、`/apps/anthropic`、`/api/coding`、`/coding` 等兼容子路径后再尝试 `/v1/models` 和 `/models`\n\n拉取成功后，可以勾选模型并点击「应用到菜单」或「应用并补丁菜单」。默认 `model_menu_strategy=claude_compatible`：Claude Science 看到的 ID 仍是 `claude-opus-4-8`、`claude-sonnet-5` 等它认可的槽位，但显示名和实际请求模型都是第三方模型。\n\n## 本地 Path-Secret\n\n默认 `proxy_auth_mode=optional`，保持旧用法：\n\n```text\nANTHROPIC_BASE_URL=http://127.0.0.1:9876\n```\n\n如果需要更严格的本机访问控制，可以配置：\n\n```json\n{\n  \"proxy_auth_token\": \"生成一段随机长字符串\",\n  \"proxy_auth_mode\": \"required\"\n}\n```\n\n之后启动脚本会自动使用：\n\n```text\nANTHROPIC_BASE_URL=http://127.0.0.1:9876/\u003csecret\u003e\n```\n\n日志和 Dashboard 会对 secret 脱敏；没有 secret 的 `/v1/messages`、`/v1/models` 请求会返回 403。\n\n## 模型选择显示第三方模型\n\nClaude Science 的模型选择界面有一部分来自本地 daemon 的硬编码模型列表，因此只改 `/v1/models` 不一定能让界面立刻显示第三方模型名。\n\n安全安装和启动脚本会自动运行：\n\n```bash\n./scripts/patch-daemon-models.sh\n```\n\n这个脚本只修改 `~/.claude-science/bin/claude-science` 这一份用户目录里的 daemon 复制件，不修改 `/Applications/Claude Science.app`，也不修改 Clash、DNS、系统代理、证书或 443 端口。脚本会：\n\n- 备份本地 daemon 复制件\n- 默认把 Claude-facing 模型 ID 保持为 Claude Science 认可的槽位：`claude-opus-4-8`、`claude-sonnet-5`、`claude-sonnet-4-6`\n- 把显示名改成 `model_aliases` 里的第三方模型名，例如 `Kimi K2.6 Pro++`\n- 同步写回 `config.json`，确保这些菜单 ID 能路由到真实后端模型\n- 重新 ad-hoc 签名并执行 daemon 可运行检查\n\n常用配置：\n\n```json\n{\n  \"model_aliases\": [\n    {\n      \"id\": \"claude-opus-4-8\",\n      \"display_name\": \"Kimi K2.6 Pro++\",\n      \"backend\": \"custom\",\n      \"model\": \"Pro/moonshotai/Kimi-K2.6\"\n    }\n  ],\n  \"model_list_mode\": \"aliases\",\n  \"model_menu_strategy\": \"claude_compatible\"\n}\n```\n\n`model_aliases` 中的 `id` 是 Claude Science 看到的模型 ID，`model` 是实际发给第三方 API 的模型名。别名命中时会优先于 `force_model`，所以用户在菜单里选择哪个第三方别名，代理就会调用对应的真实模型。\n\n也可以设置 `model_menu_strategy=real_ids`，让 `/v1/models` 直接暴露第三方真实模型 ID。但部分 Claude Science 版本会把非 `claude-*` 模型塞进 More models 或直接隐藏，所以默认推荐 `claude_compatible`。\n\n## 图片 / 读图能力\n\nClaude Science 发出的 Anthropic 图片 block 会被代理转换成 OpenAI 兼容的 `image_url` 内容。只要后端模型本身支持视觉输入，就可以让模型真正读图，而不是用文本占位替代图片。\n\n`inline_image_policy` 支持：\n\n- `auto`：默认策略。DeepSeek 这类文本后端会省略图片；Custom/OpenAI 后端会保留图片。\n- `preserve`：始终把图片发送给后端。适合 Kimi、GPT-4o、Qwen-VL 等视觉模型。\n- `omit`：始终省略图片。适合只想跑文本的便宜模型。\n- `omit_inline`：只省略 base64 内联图片，保留外部图片 URL。\n\n对硅基流动 Kimi，代理会在本机把内联 PNG/WebP/GIF/HEIC 转成 JPEG data URL 再发送，避免部分服务拒绝 PNG base64。图片不会被上传到临时图床；只会随请求发送到你配置的后端 API。\n\n读图验收由 agent 执行：\n\n```bash\nVERIFY_IMAGE=1 ./scripts/verify-proxy.sh\n```\n\n这个测试会生成一张红色图片，通过 Anthropic 图片格式发给本地代理，并要求后端模型回答 `red`。如果模型不支持视觉输入，这一步应该失败，agent 需要换成支持视觉的模型或把图片策略改回 `omit`。\n\n## Agent 验收标准\n\n下面这些命令由 agent 执行，不要求用户自己运行：\n\n```bash\n./scripts/doctor.sh\n./scripts/self-test.sh\n./scripts/verify-proxy.sh\ncurl -sS http://127.0.0.1:9876/health\ncurl -sS http://127.0.0.1:9876/v1/models\ncurl -sS http://127.0.0.1:9876/v1/messages \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"model\":\"claude-sonnet-4-5\",\"max_tokens\":32,\"messages\":[{\"role\":\"user\",\"content\":\"Reply OK\"}]}'\n```\n\n如果配置的是视觉模型，agent 还应执行：\n\n```bash\nVERIFY_IMAGE=1 ./scripts/verify-proxy.sh\n```\n\nagent 还应检查最近请求：\n\n```bash\ncurl -sS http://127.0.0.1:9876/api/recent-requests\n```\n\n## 构建发布包\n\n维护者或 agent 可以在 macOS 上生成 `.app` 和 `.dmg`：\n\n```bash\n./scripts/build-macos-release.sh\n./scripts/smoke-test-release-package.sh\n```\n\n如果有 Apple Developer ID 证书和 notarytool 凭证，可生成已公证 DMG：\n\n```bash\nDEVELOPER_ID_APPLICATION=\"Developer ID Application: Your Name (TEAMID)\" \\\nNOTARYTOOL_PROFILE=\"your-notarytool-profile\" \\\n./scripts/notarize-macos-release.sh\n```\n\n产物位于：\n\n```text\ndist/Claude Science API Bridge.app\ndist/Claude Science API Bridge.dmg\n```\n\n发布包不会包含 `config.json`、证书、日志、`.env` 或 Git 历史。详细说明见 `docs/release-packaging.md`。\n\n## 项目结构\n\n```text\n.\n├── AGENTS.md\n├── README.md\n├── SECURITY.md\n├── config.example.json\n├── proxy.py\n├── setup-token.py\n├── start.sh\n├── install.sh\n├── setup-network.sh\n├── requirements.txt\n├── scripts/\n│   ├── doctor.sh\n│   ├── install-safe.sh\n│   ├── patch-daemon-auth.sh\n│   ├── patch-daemon-models.sh\n│   ├── restore-daemon-auth.sh\n│   ├── self-test.sh\n│   ├── start-claude-science.sh\n│   ├── uninstall.sh\n│   └── verify-proxy.sh\n├── docs/\n│   ├── agent-runbook.md\n│   ├── github-publishing.md\n│   ├── network-interception.md\n│   ├── release-packaging.md\n│   └── troubleshooting.md\n├── packaging/\n│   └── macos/\n│       ├── app-launcher.sh\n│       └── build-release.sh\n└── static/\n    └── dashboard.html\n```\n\n## 不要提交的文件\n\n`.gitignore` 已排除本地敏感文件和运行态文件：\n\n- `config.json`\n- `.env`\n- `certs/`\n- `*.plist`\n- 日志\n- Python 缓存\n\n发布前请确认：\n\n```bash\ngit status --ignored\n```\n\n确保 API key、OAuth token、证书私钥和本地日志没有被加入 Git。\n\n## 许可证\n\nMIT。见 `LICENSE`。\n\n\n友情链接 https://linux.do/\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjyx0208%2Fclaude-science-api-bridge","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjyx0208%2Fclaude-science-api-bridge","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjyx0208%2Fclaude-science-api-bridge/lists"}