Commit Graph

4958 Commits

Author SHA1 Message Date
Weilong Liao
90dc50688e Update astrbot/core/platform/sources/qqofficial/qqofficial_platform_adapter.py
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
2026-07-06 22:54:00 +08:00
Soulter
ab83662b5a fix: preserve qq official quoted message context 2026-07-06 21:59:33 +08:00
Weilong Liao
ab2502c174 feat: add chat token usage indicator
Show a neutral token usage ring in ChatUI when the current model has context-window metadata.
2026-07-06 21:14:35 +08:00
Fiber
56326c7551 fix: serialize webchat history timestamps as UTC-aware ISO strings (#9159)
ChatService serialized PlatformMessageHistory records via bare model_dump(),
causing created_at/updated_at to be emitted as naive ISO strings without a
timezone suffix. The frontend new Date() parses such strings as local time
per ES2015+, so UTC values were displayed as-is instead of converted.

Add serialize_history_entry helper and apply it to get_session, get_thread,
and update_message. This matches the SSE real-time path and session list
path, ensuring the frontend consistently receives ISO strings with the
+00:00 suffix across all code paths.
2026-07-06 21:12:29 +08:00
Weilong Liao
18e067fab1 fix: keep model metadata separate from providers (#9161) 2026-07-06 21:10:57 +08:00
Weilong Liao
6627fd53c2 feat: show model metadata in selectors
Surface cached model metadata in model/provider selectors, show neutral capability/context badges, and add provider test actions.
2026-07-06 20:38:30 +08:00
Weilong Liao
25cbd41e08 feat: add sanitation for malformed tool call names in ToolLoopAgentRunner (#9144)
* feat: add sanitation for malformed tool call names in ToolLoopAgentRunner

fixes: #8929
closes: #8911

* Update astrbot/core/agent/runners/tool_loop_agent_runner.py

Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com>

* fix: update docstring to clarify normalization of malformed tool call names

---------

Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com>
2026-07-05 10:53:14 +08:00
sama233
3b8caf37e6 test: cover POSIX file URI root preservation (#8906)
* test: cover POSIX file URI root preservation

* Update tests/test_media_utils.py

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

---------

Co-authored-by: Weilong Liao <37870767+Soulter@users.noreply.github.com>
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
2026-07-05 10:12:59 +08:00
Soulter
85b653b6f0 feat: add note on cross-platform compatibility and Python version support 2026-07-05 10:06:16 +08:00
tangtaizong666
c9eed7b65e fix: adapt MiMo STT to V2.5 models and reject non-WAV audio payloads (#9118)
* fix: adapt MiMo STT to V2.5 models and reject non-WAV audio

The MiMo-V2 series went offline on 2026-06-30, so the default STT model
mimo-v2-omni fails for every default configuration. Switch the default
to mimo-v2.5-asr, the dedicated speech recognition model whose official
docs use exactly the bare input_audio payload this provider sends.

For non-ASR multimodal models such as mimo-v2.5, the audio understanding
docs require a text instruction alongside the audio, so restore the
system/user transcription prompts for that model family only.

Also validate that the resolved audio payload really is RIFF/WAVE before
calling the API: when a platform voice file (e.g. Tencent SILK from QQ)
slips through the WAV conversion chain unchanged, fail locally with an
actionable error instead of the opaque HTTP 400 from the API.

Fixes #9113

* fix: accept unpadded MiMo wav headers

---------

Co-authored-by: tangtaizong666 <212687958+tangtaizong666@users.noreply.github.com>
2026-07-05 09:59:48 +08:00
shuiping233
cc0b347508 fix: qq_official websocket适配器发送消息收到None时现在会重试了 (#8977) (#8979)
* fix: qq_official websocket适配器发送消息收到None时现在会重试了 (#8977)

* fix: qq_official websocket适配器重试发送消息的时候不会重复打印重试告警了

* fix: qq_official websocket适配器发送媒体/文件消息时遇到api返回None也会重试了
2026-07-05 09:50:42 +08:00
LIghtJUNction
30426c4f67 fix: secure project update temp staging (#9083)
* fix: secure project update temp staging

* Update astrbot/dashboard/services/update_service.py

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

* fix: close update staging temp context

---------

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
2026-07-05 09:49:11 +08:00
VectorPeak
041fba4df4 fix: enforce ownership when reading ChatUI sessions (#9141) 2026-07-05 09:34:38 +08:00
Weilong Liao
b43cc6dee0 feat: improve ChatUI attachment display (#9134) 2026-07-04 17:56:33 +08:00
Soulter
20008f179c fix: preserve absolute custom workspace paths 2026-07-03 22:59:21 +08:00
NayukiChiba
8a31cf01f2 fix(core): improve web search API key failover
Merge PR #8896
2026-07-03 22:53:22 +08:00
Soulter
6d798908ad fix: constrain custom workspace paths 2026-07-03 22:45:35 +08:00
lxfight
ea9e3421d9 fix: align knowledge base CRUD API contract with kb_name, canonical payload fields, and matching OpenAPI types (#9000)
Warning: Potential breaking changes in /kb related openapi.

* fix(kb): align CRUD API contract end-to-end

Unify knowledge base create/update/list with kb_name, canonical_payload,
optional list pagination with total, and matching OpenAPI plus dashboard types.

* fix: restore _model_dict references, add KnowledgeBaseCreateRequest, fix OpenAPI allOf validation

- Replace 3 remaining _model_dict() calls with payload.model_dump(exclude_none=True)
- Add KnowledgeBaseCreateRequest schema with required kb_name + embedding_provider_id
- Remove additionalProperties: false from OpenAPI allOf sub-schema to avoid validation failures
- Use Pydantic Field(alias="name") + populate_by_name=True for legacy name migration
- Delegate _canonical_kb_payload to KnowledgeBaseRequest to eliminate duplicated logic
- Add getattr default None for update_kb to prevent AttributeError
- Add validation error tests: missing kb_name, missing embedding_provider_id

* fix: address knowledge base contract follow-ups

* fix: preserve knowledge base create error shape
2026-07-03 22:18:56 +08:00
lxfight
e2f3b00088 fix(kb): clean up KBMedia records on document delete, fix update_kb_stats (#9120)
* fix(kb): clean up KBMedia records on document delete, fix update_kb_stats

- delete_document_by_id now deletes associated KBMedia records before
  removing the KBDocument row, preventing orphaned media data.
- update_kb_stats now passes kb_id filter to vec_db.count_documents,
  fixing chunk count that previously counted across all KBs.
- add tests for document deletion cleanup and update_kb_stats behavior.

* fix(kb): merge media and document deletion into single transaction
2026-07-03 22:13:23 +08:00
lxfight
468eea99c6 fix(kb): improve retrieval resilience on per-KB failure and rerank selection (#9122)
* fix(kb): improve retrieval resilience on per-KB failure and rerank selection

- Remove RuntimeError on single-KB dense retrieval failure: always skip
  the faulty KB and return partial results instead of crashing.
- Simplify rerank provider selection: remove redundant rerank_pi check
  since the provider is already loaded from that ID.

* fix(kb): simplify rerank selection loop, improve dense retrieval error log
2026-07-03 22:12:24 +08:00
lxfight
aecee6fc9f fix(kb): replace fragile error string matching with pre-check for duplicate kb_name (#9121)
* fix(kb): replace fragile error string matching with pre-check for duplicate kb_name

* fix(kb): handle IntegrityError race condition on duplicate kb_name
2026-07-03 22:12:00 +08:00
Glowing Brick
3ce66576f4 fix: Improve MCP client startup and shutdown handling to prevent idle spinning when a server is disabled and ensure proper cleanup on errors, timeouts, and cancellation (#9070)
* fix: mcp cancel scope cross task spin (#9068)

* fix: mcp cancel scope cross task spin

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

* fix: mcp cancel scope cross task spin

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

* fix: mcp cancel scope cross task spin

---------

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
2026-07-03 22:10:53 +08:00
Weilong Liao
e7d5be632f feat: add ChatUI project workspaces (#9066)
* feat: add ChatUI project workspaces

* feat: refine chatui layout

* feat: enhance chat input and project view styles for attachment handling

* feat: adjust chat sidebar brand logo positioning

* feat: enhance project dialog with error handling and loading state
2026-07-03 21:54:20 +08:00
VectorPeak
89b80a6ca7 fix: enable only synced ModelScope MCP servers (#9084)
* fix: enable only synced ModelScope MCP servers

* fix: avoid mutating default MCP config
2026-07-03 01:05:25 +08:00
NayukiChiba
9f50c900b0 feat(platform): 支持扫码创建时自定义机器人ID (#9067)
* feat(platform): 支持扫码创建时自定义机器人ID

- 在扫码创建平台机器人时新增机器人 ID 输入框,允许用户在创建前自定义平台 ID。
- 输入框展示在二维码上方,并对空值、空格、冒号和感叹号进行校验。
- 用户手动填写 ID 后,扫码结果不会再自动覆盖该值。
- 同时补充中英俄三语言文案。

* refactor(platform): 重构扫码创建平台ID输入组件

- 将平台专属CSS类名改为通用名称registration-inline
- 使用统一的isPlatformIdValid方法校验ID格式,替代分散的正则判断
- 移除setter中对platform ID的trim操作,交由校验逻辑处理
- 删除不再使用的.weixin-oc-registration-inline样式定义
2026-07-03 01:04:03 +08:00
Weilong Liao
e8f00960fe chore: bump version to 4.26.4
Release AstrBot v4.26.4.
v4.26.4
2026-07-03 00:54:01 +08:00
100yoGranny
413340fca5 fix: apply fallback chat models to background wakeups (#9094) 2026-07-03 00:40:20 +08:00
伊尔弥亚 - Irmia
152fb3be8f fix: skip _unbind_plugin for inactivated plugins in reload() (#9096)
* fix: skip _unbind_plugin for inactivated plugins in reload()

* fix: only skip _unbind_plugin for deactivated plugins on specified-plugin reload path

Revert the full reload unconditional smd.activated guard added in 555fcfa; it is unnecessary because load() re-adds everything after the clear anyway. Keep the guard only on the specified-plugin reload path.

* test: set tool active=False precondition in turn_on_plugin test; clean up mock_load in unbind test
2026-07-03 00:34:37 +08:00
Weilong Liao
1e3b12acc9 fix: preserve webhook callback responses
Preserve raw webhook callback responses and fix QQ webhook validation handling.
2026-07-03 00:25:09 +08:00
Marshall
ea19be1d06 fix: wecom adapter returning json instead of plain text (#9107)
* Fix wecom adapter returning json instead of plain text

* Fix handle_verify return class
2026-07-02 23:27:08 +08:00
VectorPeak
70a52ea6d0 fix: reject non-200 download responses (#9085)
* fix: reject non-200 download responses

* fix: share download response handling
2026-07-02 11:53:45 +09:00
NLKASHEI
029e9c84af 修复了DISCORD适配器注册命令正则过于严格的问题 (#9102)
* 修复了DISCORD适配器注册命令正则过于严格的问题

* Update astrbot/core/platform/sources/discord/discord_platform_adapter.py

# Discord 支持 Unicode 命令名(如中文),放宽匹配并确保全小写

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

---------

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
2026-07-02 11:36:38 +09:00
Cooper
3b41a870ff fix: updated reboot logic (#9073)
* Update updator.py

* test: cover Windows reboot process spawning

---------

Co-authored-by: 邹永赫 <1259085392@qq.com>
2026-07-02 11:33:47 +09:00
エイカク
b673cb375f fix: guard desktop-managed core restart (#9098) 2026-07-02 11:21:02 +09:00
Fiber
4cf210e503 fix: resample and downmix WAV files for Tencent Silk encoding (#9100)
* fix: resample and downmix WAV files for Tencent Silk encoding

* fix: improve WAV to Tencent Silk conversion by handling sample width and resampling
2026-07-01 22:33:36 +08:00
Simon He
372b9f5bfc fix: reduce markdown streaming lag (#9097)
* fix: reduce markdown streaming lag

* refactor: centralize markdown live node limit
2026-07-01 09:53:21 +09:00
Haoran Xu
41f8960302 fix: astrbot_file_read_tool returns clear error for directory path instead of misleading Permission denied (#9088)
When LLM passes a directory path to astrbot_file_read_tool, the tool previously
returned Error: [Errno 13] Permission denied, misleading the LLM into thinking
it was a permissions issue. The real cause: _probe_local_file() calls open('rb')
on the path, which fails on directories with Errno 13 on Windows. This is caught
by except PermissionError and displayed as-is.

Fix: Add os.path.isdir() check in FileReadTool.call() before any file I/O, at
the earliest safe point after path normalization and permission validation.
Returns a clear message: '<path> is a directory, not a file. Use a file path
instead, or use astrbot_execute_shell to list directory contents.'

Changes:
- astrbot/core/tools/computer_tools/fs.py: add isdir guard
- tests/test_computer_fs_tools.py: add test_file_read_tool_rejects_directory_with_clear_message
2026-06-30 20:39:50 +08:00
Soulter
7831c68660 chore: bump version to 4.26.3 v4.26.3 2026-06-30 20:10:58 +08:00
LIghtJUNction
6067a70803 feat: support local plugin install (#8448)
* feat: support local plugin install

* fix: make editable plugin install symlink

* fix: harden local plugin install

* Update tests/test_cli_plugin.py

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

* Update astrbot/cli/commands/cmd_plug.py

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

---------

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
2026-06-29 01:44:06 +08:00
Weilong Liao
89ec07a92b style: standardize dashboard dialog styling (#9062) 2026-06-28 14:24:19 +08:00
lxfight
758e43273d fix: paginate knowledge base dashboard lists (#9055)
* fix: paginate knowledge base dashboard lists

* fix: preserve knowledge document search pagination
2026-06-28 14:00:45 +08:00
Weilong Liao
3d4c4ed01b fix: validate plugin install sources (#9061) 2026-06-28 13:45:59 +08:00
Gargantua
c1cc74b6bc fix: preserve fallback models for future tasks (#9054)
* fix: preserve fallback models for future tasks

* chore: remove local test markdown ignore

---------

Co-authored-by: Gargantua <22532097@zju.edu.cn>
2026-06-28 00:03:31 +08:00
Weilong Liao
a619988d2d chore: bump version to 4.26.2 (#9052) v4.26.2 2026-06-27 17:50:04 +08:00
Weilong Liao
de572e3fe0 fix: avoid duplicate send_message_to_user replies (#9051) 2026-06-27 16:57:17 +08:00
F. Abyssalis
d4fa9d3d5d fix: align OpenAI tool message sanitizer (#8350)
Co-authored-by: Soulter <905617992@qq.com>
2026-06-27 16:27:32 +08:00
Copilot
771911a893 fix: keep Tab navigation within reset-password inputs in account dialog (#9049)
* Initial plan

* fix: keep tab navigation on account dialog inputs

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
2026-06-27 16:21:24 +08:00
Weilong Liao
8f30978c8d fix: separate plugin and tool activation state (#9048)
* fix: separate plugin and tool activation state

* style: apply ruff formatting

* fix: preserve manual tool deactivation on load

* fix: harden plugin tool state migration
2026-06-27 16:15:31 +08:00
Weilong Liao
dd2865d28c chore: remove plugin publish issue template (#9050) 2026-06-27 16:11:13 +08:00
Fiber
298078b536 Fix: KV storage not cleared on plugin uninstall. Improved cleanup logic and updated i18n strings to indicate database KV data removal. (#8291)
* fix: 完善插件卸载时的清理逻辑,新增KV数据清理,更新了多语言文案以说明会清理数据库KV数据

* fix: 修复插件关闭时不清理KV的问题,更新单元测试

* refactor: 统一插件ID生成逻辑

将插件ID生成逻辑抽离到StarMetadata类中,移除重复的代码实现,
同时在__post_init__中自动补全plugin_id字段。

* refactor: 将plugin_id属性从方法转换为属性,确保在属性赋值后正确计算
2026-06-27 16:06:14 +08:00