Repository navigation
fix(weixin_oc): keep a cleared timeout field from disabling the HTTP timeout - #10229
Merged
Soulter merged 1 commit intoSep 27, 2026
Merged
Conversation
Soulter
approved these changes
Sep 27, 2026
elecvoid243
referenced
this pull request
in elecvoid243/AstrBot_for_spzx
Oct 11, 2026
Port 81 compatible upstream patches through fb49dfa. Preserve local chat scrolling, agent extensions, API behavior, and release versions. Adapt queued-request tests to local stage fields and resolve duplicate context arguments. Defer 63aa363 (#10319): plugin Views tests/docs require the excluded Pages-to-Views migration. Validation: - Ruff checks, dashboard typecheck, and production build passed. - Frontend: 1453 passed; 10 failures reproduced on the pre-integration baseline. - Backend: 1091 passed; 2 queue/OpenAPI failures reproduced on the pre-integration baseline. - Backend tests used SQLModel 0.0.31 and SQLAlchemy 2.0.44 in an isolated temporary environment. Upstream commits: 5950d7c chore(deps): bump the github-actions group with 2 updates (#10088) 553096b docs: sync guides with current WebUI navigation (#10093) 763a5ee fix(cron): say who owns a task instead of returning an empty list (#10104) e0aa8d3 fix: clarify local file access menu descriptions 2704b4c fix: tell the model when an animation becomes a frame montage (#10119) bb79c08 fix(dashboard): drop stale exclude_ids hardcode hiding conversations (#10129) f097600 fix(gemini): keep narration streamed before a tool call in history (#10132) 8492df4 fix: serialize Azure TTS backend client lifetimes (#10101) 0812616 fix: propagate Xinference rerank failures instead of returning empty results (#10051) 9c73295 fix: preserve scheduled reminders when an edit is invalid (#10075) 2782454 fix: use GitHub HEAD when repository branch is unspecified (#10080) dae7c24 fix(provider): recognize thinking tags in compatible completions (#10116) b13338d fix(dashboard): restore readable text and switch contrast in fullscreen console (#10135) 774cc94 docs: name the dashboard host/port environment variables and their precedence (#10095) 54c98e8 fix: resolve each OneBot file segment by its own ID (#10098) b065505 fix: clean up invalid materialized images (#10090) 96d9504 docs: explain HTTP proxy address when AstrBot runs in Docker (#10162) 8b5e24b fix: respect session plugin filters in cron agents (#10163) 67c74b7 feat: gzip dashboard static js, css, and html (#10187) 2b6b31a fix: refresh queued conversation history under the session lock (#10238) fbf5286 feat: forward extra_user_content_parts through Context.tool_loop_agent (#10237) 559b171 fix(weixin_oc): keep a cleared timeout field from disabling the HTTP timeout (#10229) 14835b5 fix(respond): keep an unusable segmented-reply log base from dropping the reply (#10231) a426808 fix: skip queued LLM requests after disabling (#10234) 61ba3a2 fix: estimate emoji token cost above the plain text rate (#10216) 0531575 fix: increase cron misfire grace time to 300 seconds (#10183) 42ad277 chore(deps): bump the github-actions group with 4 updates (#10184) 1a59156 feat(dashboard): add search to Skills and MCP pages (#10217) 5fcaf69 fix: compare platform message history cutoff in UTC (#10246) c8a07f7 fix(platform): keep the Satori heartbeat and reconnect delays from being disabled by a cleared field (#10248) ae5a155 fix(dashboard): fix dark mode icons and platform template order (#10061) e99432c fix(qqofficial): restore @ mentions in group messages (#9705) 5b04f13 perf: skip state allocation when rate limiting is disabled (#10270) e19954b fix(stats): prevent timers from starting after unmount (#10272) 1c5dd91 perf(session): skip unused alias lookup when listing rules (#10273) 9c6b603 perf(trace): sort records only for updated spans (#10274) b53999e fix: support Windows long paths during plugin archive extraction (#10193) 5a4745f docs: rename dev QQ group to chit-chat group and add community email (#10282) fe29538 fix: update remaining legacy AstrBot icons (#10278) 6d50e1e chore(deps): bump github/codeql-action in the github-actions group (#10265) ac515d9 docs: add slider key to plugin dev docs (#10289) 73b4fc9 fix: correct shields.io badge links in README files (#10290) 6a2186b fix: replace DeepWiki badge with shields.io in README files (#10299) 553b10f fix(dashboard): use the primary color for the config test-chat button (#10309) 9d4f523 feat(dashboard): edit config profiles from a side drawer in the bot editor (#10310) 9f65a01 fix: reuse logo tokens and refresh expired platform cache (#10294) ab7de72 feat(dashboard): add log search and keyword highlighting to console (#10327) d399090 fix(webui): use colored DeepSeek provider icon (#10332) a6265fa fix: degrade unresolvable voice attachments instead of failing the turn (#10337) 1245979 fix(dashboard): enforce session ownership on chat send path (#10346) 44b5c1b feat(dashboard): show source badge for skills in skills list (#10339) 95af435 fix(dashboard): restore plugin README anchor navigation (#10341) 3d80dd3 fix: clean up session waiter registrations only once (#10344) (#10347) ac4df99 fix(dashboard): align fullscreen log search with dark theme (#10351) 6a4decd fix: handle UTF-16 offsets in Telegram mentions (#10367) f7f3c71 fix: leave Telegram bot token empty by default (#10365) 2f889d2 fix: preserve child folders when deleting persona folders (#10361) de31bbe fix: close FishAudio TTS HTTP client after requests (#10358) 4c037c4 fix: resolve remote Slack file URLs before upload (#10355) dfaaca1 docs: update Slack setup steps and screenshot (#10353) 3861730 fix(telegram): match bot mentions case-insensitively (#10399) 57ac1d8 fix: preserve Slack code block and quote text (#10380) 64430fa docs: sync Lark/Feishu guide with current capabilities and permissions (#10400) c1356bb fix(dify): handle CRLF event separators in streaming responses (#10392) 900a700 fix: match command group names as whole words (#10372) 55c2dd3 feat: remember the last opened tab on the Data & Logs page (#10251) e1d30f3 fix(provider): replace retired gemini-embedding-exp-03-07 default with gemini-embedding-001 (#10393) 2de9059 fix: avoid blocking audio format probes (#10055) 65cbe98 feat: ship astrbot CLI in Docker image for in-container password reset (#10442) cae8f1d feat(dashboard): add distinct hints for local permission access modes (#10444) 30820a4 fix(provider): keep Anthropic tool calls whose streamed input is empty (#10432) 6b2e417 fix(provider): merge custom server tools with registered tools in Anthropic requests (#10437) d8ef9dd fix: send Discord video components as attachments (#10423) 5994167 fix: preserve links and mentions in Slack lists (#10447) 03ce652 fix: preserve outbound Slack user mentions (#10448) d2fb912 fix: prevent Discord self-reply loops (#10425) b01285a chore(github): add plugin submission links to issue template config (#10455) c6f4150 fix: avoid recording cron sends without a matching platform (#10468) 28a10c1 fix: warn when a background task result is not sent to the user (#10398) 845517e chore(github): update plugin submission links in issue template config (#10472) fb49dfa fix(dashboard): update plugin market submit link and label (#10471)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
weixin_oc_long_poll_timeout_msandweixin_oc_api_timeout_msare read with a bareint()inWeixinOCAdapter.__init__, with no lower bound. Both are user-tunable fields —tests/test_weixin_oc_config_metadata.pyasserts they are exactly the two personal-WeChat fields the dashboard exposes — and the dashboard's numeric input writes0when the box is cleared (dashboard/src/components/shared/ConfigItemRenderer.vue:toNumber()mapsparseFloat('')→0).Aiohttp reads
ClientTimeout(total=0)as no timeout at all, so a cleared field silently removes the deadline from every WeChat API call:The consequence is in the receive loop:
_poll_inbound_updates()(astrbot/core/platform/sources/weixin_oc/weixin_oc_adapter.py:1579) issuesgetupdateswithtimeout_ms=self.long_poll_timeout_ms, and the loop is written to survive exactly this case (:1763-1769,except asyncio.TimeoutError: ... retry). With the deadline disabled that branch never fires — one stalled connection parks the coroutine forever and the bot goes quiet without a single log line. Same for_poll_qr_status(:1118).A hand-edited non-numeric value is worse:
int('')raisesValueError: invalid literal for int() with base 10: ''inside the constructor, andPlatformManager.initialize(astrbot/core/platform/manager.py:96-97) flattens that to oneFailed to initialize platform adapterline, so the platform never starts.The repository already refuses both shapes for these very keys —
login_registration.py:32-37routesweixin_oc_api_timeout_ms/weixin_oc_long_poll_timeout_msthrough_int_config(value, default, 1_000)on the QR-login path, and this adapter has its own_get_int_config(key, default, minimum)for its other numeric knobs. Only the constructor reads were left unguarded.Modifications / 改动点
Route the three numeric constructor fields (
weixin_oc_qr_poll_interval,weixin_oc_long_poll_timeout_ms,weixin_oc_api_timeout_ms) through the adapter's existing_get_int_config, with aMIN_TIMEOUT_MS = 1_000floor for the two millisecond fields — the same floorlogin_registration._int_configalready applies to the same keys. Defaults and valid values are unchanged; a0, a negative, or a non-numeric value now falls back instead of disabling the timeout or killing the adapter.This is NOT a breaking change. / 这不是一个破坏性变更。
Screenshots or Test Results / 运行截图或测试结果
New
tests/test_weixin_oc_adapter_timeout_floor.py(7 cases: cleared field →1000, value below the floor →1000, tuned value kept, unset → documented default, non-numeric → default instead of raising, and the value that actually reachesself.client.api_timeout_ms).On
master@69ae35a3(fails before the change):The fifth failure is the crash itself:
After the change:
Adjacent and whole-suite regression, Windows / Python 3.12,
TESTING=true:Lint gate (repo-wide job, pinned version):
Docs
No
docs/zhordocs/enupdate: the two fields keep the same meaning, defaults and unit. This change only rejects the values that the login path already rejects, so no documented behavior moves.Checklist / 检查清单
The boxes below are left unticked on purpose: this patch was prepared by an automated agent session working for the account owner, so the first-person statements are the owner's to confirm, not the agent's. The measured evidence each item would attest to is inline above.
📋 查看中文说明
WeixinOCAdapter.__init__用裸int()读取weixin_oc_long_poll_timeout_ms与weixin_oc_api_timeout_ms,且没有下限。这两项恰好是 Dashboard 对个人微信开放调参的字段(tests/test_weixin_oc_config_metadata.py对此有断言),而 Dashboard 的数字输入框被清空时toNumber()会写入0。aiohttp 把ClientTimeout(total=0)解释为「完全不设超时」,于是长轮询getupdates的超时保护失效:接收循环里except asyncio.TimeoutError的重试分支永远不会触发,一条卡住的连接就能让机器人静默且没有任何日志。若配置被手工写成非数字,int('')会在构造期抛ValueError,PlatformManager.initialize只留一行日志,该平台直接起不来。仓库在扫码登录路径上(login_registration.py:32-37)早已用_int_config(value, default, 1_000)对同样的 key 做了下限保护,本适配器的_get_int_config也给它自己的其他数值项设了下限——只有构造函数这三行漏了。本 PR 让这三行改走同一个 helper,默认值与合法取值均不变。新增 7 条用例:修改前5 failed, 2 passed,修改后7 passed;相关三文件12 passed;Windows 全量3526 passed, 82 skipped;ruff 0.15.22check/format 均通过。检查清单未勾选是因为该补丁由自动化 agent 会话代为准备,第一人称声明需由账号本人确认,实测证据已附于上文。Summary by Sourcery
Keep Weixin OC polling and API timeouts positive and robust against invalid dashboard configuration values.
Bug Fixes:
Enhancements:
Tests: