
10 月 17 日北京 10:03 到 11:05 这六十来分钟里四个仓库都没发新版本:CLIProxyAPI 的端口比凭证清单早开一步,重启时排队进来的请求会被打成 400;配置用「写新文件再 rename 覆盖」保存,热重载会静默停掉;另有 sub2api 一条升级后充值回调卡住的报障,还没有结论。
(*Service).Run 第 178 行把 s.server.Start() 丢进 goroutine 先跑,第 185 行只睡 100 毫秒,第 187 行就打出「API server started successfully」11。OnAfterStart 之后,到第 224 行才 watcherWrapper.Start(watcherCtx);给每个凭证注册模型,是 watcher 初次 reload 时同步做的11。
sdk/cliproxy/service_lifecycle.go:第 178 行开端口(在 goroutine 里),第 185 行睡 100 毫秒,第 224 行才启动 watcher;两者之间还夹着 pprof/discovery 的应用与 OnAfterStart11
sdk/api/handlers/handlers_routing.go 第 211–228 行:provider 列表为空时,第 219 行拼出 model_not_found 错误体、第 225 行返回 400;上方那段注释解释了为什么不用 40410model_not_found 做有限重试,别把 400 一律当终局。syncPluginModelRuntime)提到 s.server.Start() 之前,加载期间 context 被取消就返回 ctx.Err(),让端口只在路由表装好之后才开9。OnAfterStart 会变成在初次加载之后执行,第一次 pprof/discovery 应用会挪进 watcher 的初次 reload;home 模式不变9。config.yaml。sync.RWMutex,把进程内写配置的几条路(WriteConfig、SaveConfigPreserveComments、上传前的准备、LoadConfig 里的清理)与重载、加载、管理端配置端点的读排开。WriteConfig 是刻意保留 inode 的,挂载的配置要靠它;另外对单文件 bind mount 做 rename 会直接 EBUSY13。TestWatcherReloadsAfterConfigFileIsReplaced 在 dev 上第一次替换就失败,在这个分支上通过13。errors.As 穿透包装:执行层会包错误(fast 模式解码失败、Home 重试轮次等),以前包一层头就丢了14。Retry-After 时(Home 轮次延迟、本地冷却),上游的 Retry-After 与 Retry-After-Ms 不再覆盖它,但 Anthropic-Ratelimit-Unified-* 照旧转发14。FilterUpstreamHeaders,与成功响应一致;此前只跳过 CPA 保留名,带原始头的错误(比如首个 payload 之前就失败的流)就可能把 Set-Cookie 与 hop-by-hop 头带出去14。passthrough-headers 开关:Responses WebSocket 的错误事件,以及插件里的模型执行14。github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
github.com
status.openai.com
status.openai.com
status.anthropic.com
status.cloud.google.com
codex-reset.com
opentherank.com
community.openai.com
reddit.com
reddit.com
reddit.com
This story was produced automatically by a channel. One sentence is all it takes for Neodrop to keep producing for you.