AstrBot 3.5.25__tar.gz → 3.5.26__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {astrbot-3.5.25 → astrbot-3.5.26}/.github/workflows/dashboard_ci.yml +12 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/PKG-INFO +3 -3
- {astrbot-3.5.25 → astrbot-3.5.26}/README.md +2 -2
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/config/default.py +14 -1
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/core_lifecycle.py +5 -1
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/platform/sources/dingtalk/dingtalk_event.py +1 -1
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/platform/sources/qqofficial/qqofficial_message_event.py +96 -3
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/provider/sources/fishaudio_tts_api_source.py +37 -3
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/provider/sources/gemini_source.py +3 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/provider/sources/openai_source.py +5 -2
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/updator.py +3 -3
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/utils/io.py +43 -9
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/zip_updator.py +3 -4
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/dashboard/routes/update.py +7 -6
- astrbot-3.5.26/changelogs/v3.5.26.md +9 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/i18n/locales/en-US/core/header.json +3 -3
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/i18n/locales/zh-CN/core/header.json +2 -3
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/layouts/full/vertical-header/VerticalHeader.vue +38 -16
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/views/SessionManagementPage.vue +5 -3
- {astrbot-3.5.25 → astrbot-3.5.26}/pyproject.toml +1 -1
- {astrbot-3.5.25 → astrbot-3.5.26}/.dockerignore +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/.github/FUNDING.yml +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/.github/ISSUE_TEMPLATE/PLUGIN_PUBLISH.yml +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/.github/ISSUE_TEMPLATE/bug-report.yml +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/.github/ISSUE_TEMPLATE/feature-request.yml +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/.github/copilot-instructions.md +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/.github/dependabot.yml +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/.github/workflows/auto_release.yml +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/.github/workflows/codeql.yml +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/.github/workflows/coverage_test.yml +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/.github/workflows/docker-image.yml +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/.github/workflows/stale.yml +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/.gitignore +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/.pre-commit-config.yaml +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/.python-version +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/CODE_OF_CONDUCT.md +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/Dockerfile +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/Dockerfile_with_node +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/LICENSE +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/README_en.md +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/README_ja.md +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/__init__.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/api/__init__.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/api/all.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/api/event/__init__.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/api/event/filter/__init__.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/api/message_components.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/api/platform/__init__.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/api/provider/__init__.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/api/star/__init__.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/api/util/__init__.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/cli/__init__.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/cli/__main__.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/cli/commands/__init__.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/cli/commands/cmd_conf.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/cli/commands/cmd_init.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/cli/commands/cmd_plug.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/cli/commands/cmd_run.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/cli/utils/__init__.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/cli/utils/basic.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/cli/utils/plugin.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/cli/utils/version_comparator.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/__init__.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/config/__init__.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/config/astrbot_config.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/conversation_mgr.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/db/__init__.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/db/po.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/db/sqlite.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/db/sqlite_init.sql +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/db/vec_db/base.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/db/vec_db/faiss_impl/__init__.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/db/vec_db/faiss_impl/document_storage.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/db/vec_db/faiss_impl/embedding_storage.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/db/vec_db/faiss_impl/sqlite_init.sql +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/db/vec_db/faiss_impl/vec_db.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/event_bus.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/file_token_service.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/initial_loader.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/log.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/message/components.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/message/message_event_result.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/pipeline/__init__.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/pipeline/content_safety_check/stage.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/pipeline/content_safety_check/strategies/__init__.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/pipeline/content_safety_check/strategies/baidu_aip.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/pipeline/content_safety_check/strategies/keywords.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/pipeline/content_safety_check/strategies/strategy.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/pipeline/context.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/pipeline/platform_compatibility/stage.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/pipeline/preprocess_stage/stage.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/pipeline/process_stage/agent_runner/base.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/pipeline/process_stage/agent_runner/tool_loop_agent.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/pipeline/process_stage/method/llm_request.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/pipeline/process_stage/method/star_request.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/pipeline/process_stage/stage.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/pipeline/rate_limit_check/stage.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/pipeline/respond/stage.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/pipeline/result_decorate/stage.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/pipeline/scheduler.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/pipeline/session_status_check/stage.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/pipeline/stage.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/pipeline/waking_check/stage.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/pipeline/whitelist_check/stage.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/platform/__init__.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/platform/astr_message_event.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/platform/astrbot_message.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/platform/manager.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/platform/message_type.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/platform/platform.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/platform/platform_metadata.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/platform/register.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/platform/sources/aiocqhttp/aiocqhttp_message_event.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/platform/sources/aiocqhttp/aiocqhttp_platform_adapter.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/platform/sources/dingtalk/dingtalk_adapter.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/platform/sources/discord/client.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/platform/sources/discord/components.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/platform/sources/discord/discord_platform_adapter.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/platform/sources/discord/discord_platform_event.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/platform/sources/lark/lark_adapter.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/platform/sources/lark/lark_event.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/platform/sources/qqofficial/qqofficial_platform_adapter.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/platform/sources/qqofficial_webhook/qo_webhook_adapter.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/platform/sources/qqofficial_webhook/qo_webhook_event.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/platform/sources/qqofficial_webhook/qo_webhook_server.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/platform/sources/slack/client.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/platform/sources/slack/slack_adapter.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/platform/sources/slack/slack_event.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/platform/sources/telegram/tg_adapter.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/platform/sources/telegram/tg_event.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/platform/sources/webchat/webchat_adapter.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/platform/sources/webchat/webchat_event.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/platform/sources/webchat/webchat_queue_mgr.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/platform/sources/wechatpadpro/wechatpadpro_adapter.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/platform/sources/wechatpadpro/wechatpadpro_message_event.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/platform/sources/wechatpadpro/xml_data_parser.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/platform/sources/wecom/wecom_adapter.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/platform/sources/wecom/wecom_event.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/platform/sources/wecom/wecom_kf.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/platform/sources/wecom/wecom_kf_message.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/platform/sources/weixin_official_account/weixin_offacc_adapter.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/platform/sources/weixin_official_account/weixin_offacc_event.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/provider/__init__.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/provider/entites.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/provider/entities.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/provider/func_tool_manager.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/provider/manager.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/provider/provider.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/provider/register.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/provider/sources/anthropic_source.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/provider/sources/azure_tts_source.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/provider/sources/dashscope_source.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/provider/sources/dashscope_tts.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/provider/sources/dify_source.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/provider/sources/edge_tts_source.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/provider/sources/gemini_embedding_source.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/provider/sources/gemini_tts_source.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/provider/sources/gsv_selfhosted_source.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/provider/sources/gsvi_tts_source.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/provider/sources/minimax_tts_api_source.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/provider/sources/openai_embedding_source.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/provider/sources/openai_tts_api_source.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/provider/sources/sensevoice_selfhosted_source.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/provider/sources/volcengine_tts.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/provider/sources/whisper_api_source.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/provider/sources/whisper_selfhosted_source.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/provider/sources/zhipu_source.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/star/README.md +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/star/__init__.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/star/config.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/star/context.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/star/filter/__init__.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/star/filter/command.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/star/filter/command_group.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/star/filter/custom_filter.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/star/filter/event_message_type.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/star/filter/permission.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/star/filter/platform_adapter_type.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/star/filter/regex.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/star/register/__init__.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/star/register/star.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/star/register/star_handler.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/star/session_llm_manager.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/star/session_plugin_manager.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/star/star.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/star/star_handler.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/star/star_manager.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/star/star_tools.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/star/updator.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/utils/astrbot_path.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/utils/command_parser.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/utils/dify_api_client.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/utils/log_pipe.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/utils/metrics.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/utils/path_util.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/utils/pip_installer.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/utils/session_lock.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/utils/session_waiter.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/utils/shared_preferences.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/utils/t2i/__init__.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/utils/t2i/local_strategy.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/utils/t2i/network_strategy.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/utils/t2i/renderer.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/utils/t2i/template/base.html +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/utils/tencent_record_helper.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/core/utils/version_comparator.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/dashboard/routes/__init__.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/dashboard/routes/auth.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/dashboard/routes/chat.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/dashboard/routes/config.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/dashboard/routes/conversation.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/dashboard/routes/file.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/dashboard/routes/log.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/dashboard/routes/plugin.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/dashboard/routes/route.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/dashboard/routes/session_management.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/dashboard/routes/stat.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/dashboard/routes/static_file.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/dashboard/routes/tools.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/astrbot/dashboard/server.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/changelogs/v3.4.0.md +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/changelogs/v3.4.1.md +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/changelogs/v3.4.10.md +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/changelogs/v3.4.11.md +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/changelogs/v3.4.12.md +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/changelogs/v3.4.13.md +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/changelogs/v3.4.14.md +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/changelogs/v3.4.15.md +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/changelogs/v3.4.16.md +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/changelogs/v3.4.17.md +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/changelogs/v3.4.18.md +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/changelogs/v3.4.19.md +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/changelogs/v3.4.20.md +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/changelogs/v3.4.21.md +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/changelogs/v3.4.22.md +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/changelogs/v3.4.23.md +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/changelogs/v3.4.24.md +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/changelogs/v3.4.25.md +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/changelogs/v3.4.26.md +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/changelogs/v3.4.27.md +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/changelogs/v3.4.28.md +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/changelogs/v3.4.29.md +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/changelogs/v3.4.3.md +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/changelogs/v3.4.30.md +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/changelogs/v3.4.31.md +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/changelogs/v3.4.32.md +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/changelogs/v3.4.33.md +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/changelogs/v3.4.35.md +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/changelogs/v3.4.36.md +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/changelogs/v3.4.37.md +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/changelogs/v3.4.38.md +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/changelogs/v3.4.39.md +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/changelogs/v3.4.4.md +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/changelogs/v3.4.5.md +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/changelogs/v3.4.6.md +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/changelogs/v3.4.7.md +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/changelogs/v3.4.8.md +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/changelogs/v3.4.9.md +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/changelogs/v3.5.0.md +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/changelogs/v3.5.1.md +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/changelogs/v3.5.10.md +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/changelogs/v3.5.11.md +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/changelogs/v3.5.12.md +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/changelogs/v3.5.13.md +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/changelogs/v3.5.14.md +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/changelogs/v3.5.15.md +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/changelogs/v3.5.16.md +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/changelogs/v3.5.17.md +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/changelogs/v3.5.18.md +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/changelogs/v3.5.19.md +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/changelogs/v3.5.2.md +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/changelogs/v3.5.20.md +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/changelogs/v3.5.21.md +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/changelogs/v3.5.22.md +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/changelogs/v3.5.23.md +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/changelogs/v3.5.24.md +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/changelogs/v3.5.25.md +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/changelogs/v3.5.3.1.md +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/changelogs/v3.5.3.2.md +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/changelogs/v3.5.3.md +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/changelogs/v3.5.4.md +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/changelogs/v3.5.5.md +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/changelogs/v3.5.6.md +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/changelogs/v3.5.7.md +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/changelogs/v3.5.8.md +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/changelogs/v3.5.9.md +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/compose.yml +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/.gitignore +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/LICENSE +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/README.md +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/env.d.ts +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/index.html +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/public/_redirects +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/public/favicon.svg +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/App.vue +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/assets/images/astrbot_logo_mini.webp +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/assets/images/logo-normal.svg +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/assets/images/logo-waifu.png +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/assets/images/platform_logos/dingtalk.svg +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/assets/images/platform_logos/discord.svg +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/assets/images/platform_logos/kook.png +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/assets/images/platform_logos/lark.png +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/assets/images/platform_logos/qq.png +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/assets/images/platform_logos/slack.svg +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/assets/images/platform_logos/telegram.svg +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/assets/images/platform_logos/vocechat.png +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/assets/images/platform_logos/wechat.png +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/assets/images/platform_logos/wecom.png +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/components/ConfirmDialog.vue +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/components/chat/ProviderModelSelector.vue +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/components/shared/AstrBotConfig.vue +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/components/shared/ConsoleDisplayer.vue +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/components/shared/ExtensionCard.vue +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/components/shared/ItemCard.vue +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/components/shared/ItemCardGrid.vue +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/components/shared/LanguageSwitcher.vue +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/components/shared/ListConfigItem.vue +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/components/shared/Logo.vue +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/components/shared/ProxySelector.vue +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/components/shared/ReadmeDialog.vue +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/components/shared/UiParentCard.vue +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/components/shared/WaitingForRestart.vue +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/config.ts +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/i18n/composables.ts +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/i18n/loader.ts +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/i18n/locales/en-US/core/actions.json +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/i18n/locales/en-US/core/common.json +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/i18n/locales/en-US/core/navigation.json +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/i18n/locales/en-US/core/status.json +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/i18n/locales/en-US/features/about.json +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/i18n/locales/en-US/features/alkaid/index.json +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/i18n/locales/en-US/features/alkaid/knowledge-base.json +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/i18n/locales/en-US/features/alkaid/memory.json +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/i18n/locales/en-US/features/auth.json +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/i18n/locales/en-US/features/chart.json +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/i18n/locales/en-US/features/chat.json +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/i18n/locales/en-US/features/config.json +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/i18n/locales/en-US/features/console.json +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/i18n/locales/en-US/features/conversation.json +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/i18n/locales/en-US/features/dashboard.json +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/i18n/locales/en-US/features/extension.json +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/i18n/locales/en-US/features/platform.json +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/i18n/locales/en-US/features/provider.json +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/i18n/locales/en-US/features/session-management.json +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/i18n/locales/en-US/features/settings.json +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/i18n/locales/en-US/features/tool-use.json +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/i18n/locales/en-US/messages/errors.json +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/i18n/locales/en-US/messages/success.json +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/i18n/locales/en-US/messages/validation.json +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/i18n/locales/zh-CN/core/actions.json +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/i18n/locales/zh-CN/core/common.json +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/i18n/locales/zh-CN/core/navigation.json +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/i18n/locales/zh-CN/core/status.json +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/i18n/locales/zh-CN/features/about.json +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/i18n/locales/zh-CN/features/alkaid/index.json +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/i18n/locales/zh-CN/features/alkaid/knowledge-base.json +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/i18n/locales/zh-CN/features/alkaid/memory.json +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/i18n/locales/zh-CN/features/auth.json +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/i18n/locales/zh-CN/features/chart.json +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/i18n/locales/zh-CN/features/chat.json +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/i18n/locales/zh-CN/features/config.json +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/i18n/locales/zh-CN/features/console.json +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/i18n/locales/zh-CN/features/conversation.json +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/i18n/locales/zh-CN/features/dashboard.json +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/i18n/locales/zh-CN/features/extension.json +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/i18n/locales/zh-CN/features/platform.json +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/i18n/locales/zh-CN/features/provider.json +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/i18n/locales/zh-CN/features/session-management.json +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/i18n/locales/zh-CN/features/settings.json +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/i18n/locales/zh-CN/features/tool-use.json +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/i18n/locales/zh-CN/messages/errors.json +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/i18n/locales/zh-CN/messages/success.json +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/i18n/locales/zh-CN/messages/validation.json +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/i18n/tools/index.ts +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/i18n/translations.ts +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/i18n/types.ts +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/i18n/validator.ts +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/layouts/blank/BlankLayout.vue +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/layouts/full/FullLayout.vue +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/layouts/full/vertical-sidebar/NavItem.vue +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/layouts/full/vertical-sidebar/VerticalSidebar.vue +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/layouts/full/vertical-sidebar/sidebarItem.ts +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/main.ts +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/plugins/confirmPlugin.ts +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/plugins/vuetify.ts +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/router/AuthRoutes.ts +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/router/ChatBoxRoutes.ts +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/router/MainRoutes.ts +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/router/index.ts +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/scss/_override.scss +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/scss/_variables.scss +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/scss/components/_VButtons.scss +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/scss/components/_VCard.scss +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/scss/components/_VField.scss +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/scss/components/_VInput.scss +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/scss/components/_VNavigationDrawer.scss +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/scss/components/_VScrollbar.scss +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/scss/components/_VShadow.scss +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/scss/components/_VTabs.scss +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/scss/components/_VTextField.scss +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/scss/layout/_container.scss +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/scss/layout/_sidebar.scss +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/scss/pages/_dashboards.scss +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/scss/style.scss +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/stores/auth.ts +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/stores/common.js +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/stores/customizer.ts +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/theme/DarkTheme.ts +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/theme/LightTheme.ts +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/types/themeTypes/ThemeType.ts +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/types/vue3-print-nb.d.ts +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/types/vue_tabler_icon.d.ts +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/views/AboutPage.vue +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/views/AlkaidPage.vue +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/views/AlkaidPage_sigma.vue +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/views/ChatBoxPage.vue +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/views/ChatPage.vue +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/views/ConfigPage.vue +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/views/ConsolePage.vue +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/views/ConversationPage.vue +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/views/ExtensionPage.vue +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/views/PlatformPage.vue +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/views/ProviderPage.vue +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/views/Settings.vue +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/views/ToolUsePage.vue +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/views/alkaid/KnowledgeBase.vue +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/views/alkaid/LongTermMemory.vue +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/views/alkaid/Other.vue +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/views/authentication/auth/LoginPage.vue +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/views/authentication/authForms/AuthLogin.vue +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/views/dashboards/default/DefaultDashboard.vue +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/views/dashboards/default/components/MemoryUsage.vue +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/views/dashboards/default/components/MessageStat.vue +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/views/dashboards/default/components/OnlinePlatform.vue +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/views/dashboards/default/components/OnlineTime.vue +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/views/dashboards/default/components/PlatformStat.vue +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/views/dashboards/default/components/RunningTime.vue +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/src/views/dashboards/default/components/TotalMessage.vue +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/tsconfig.json +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/tsconfig.vite-config.json +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/dashboard/vite.config.ts +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/main.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/packages/astrbot/long_term_memory.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/packages/astrbot/main.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/packages/astrbot/metadata.yaml +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/packages/python_interpreter/main.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/packages/python_interpreter/metadata.yaml +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/packages/python_interpreter/requirements.txt +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/packages/python_interpreter/shared/api.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/packages/reminder/main.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/packages/reminder/metadata.yaml +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/packages/session_controller/main.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/packages/session_controller/metadata.yaml +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/packages/thinking_filter/main.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/packages/thinking_filter/metadata.yaml +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/packages/web_searcher/engines/__init__.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/packages/web_searcher/engines/bing.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/packages/web_searcher/engines/google.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/packages/web_searcher/engines/sogo.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/packages/web_searcher/main.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/packages/web_searcher/metadata.yaml +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/requirements.txt +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/samples/stt_health_check.wav +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/tests/test_dashboard.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/tests/test_main.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/tests/test_pipeline.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/tests/test_plugin_manager.py +0 -0
- {astrbot-3.5.25 → astrbot-3.5.26}/uv.lock +0 -0
|
@@ -25,6 +25,8 @@ jobs:
|
|
|
25
25
|
echo "COMMIT_SHA=$(git rev-parse HEAD)" >> $GITHUB_ENV
|
|
26
26
|
mkdir -p dashboard/dist/assets
|
|
27
27
|
echo $COMMIT_SHA > dashboard/dist/assets/version
|
|
28
|
+
cd dashboard
|
|
29
|
+
zip -r dist.zip dist
|
|
28
30
|
|
|
29
31
|
- name: Archive production artifacts
|
|
30
32
|
uses: actions/upload-artifact@v4
|
|
@@ -33,3 +35,13 @@ jobs:
|
|
|
33
35
|
path: |
|
|
34
36
|
dashboard/dist
|
|
35
37
|
!dist/**/*.md
|
|
38
|
+
|
|
39
|
+
- name: Create GitHub Release
|
|
40
|
+
uses: ncipollo/release-action@v1
|
|
41
|
+
with:
|
|
42
|
+
tag: release-${{ github.sha }}
|
|
43
|
+
owner: AstrBotDevs
|
|
44
|
+
repo: astrbot-release-harbour
|
|
45
|
+
body: "Automated release from commit ${{ github.sha }}"
|
|
46
|
+
token: ${{ secrets.ASTRBOT_HARBOUR_TOKEN }}
|
|
47
|
+
artifacts: "dashboard/dist.zip"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: AstrBot
|
|
3
|
-
Version: 3.5.
|
|
3
|
+
Version: 3.5.26
|
|
4
4
|
Summary: 易上手的多平台 LLM 聊天机器人及开发框架
|
|
5
5
|
License-File: LICENSE
|
|
6
6
|
Requires-Python: >=3.10
|
|
@@ -47,7 +47,7 @@ Requires-Dist: websockets>=15.0.1
|
|
|
47
47
|
Requires-Dist: wechatpy>=1.8.18
|
|
48
48
|
Description-Content-Type: text/markdown
|
|
49
49
|
|
|
50
|
-
<p align="center">
|
|
50
|
+
<img width="430" height="31" alt="image" src="https://github.com/user-attachments/assets/474c822c-fab7-41be-8c23-6dae252823ed" /><p align="center">
|
|
51
51
|
|
|
52
52
|

|
|
53
53
|
|
|
@@ -74,7 +74,7 @@ _✨ 易上手的多平台 LLM 聊天机器人及开发框架 ✨_
|
|
|
74
74
|
<a href="https://github.com/Soulter/AstrBot/issues">问题提交</a>
|
|
75
75
|
</div>
|
|
76
76
|
|
|
77
|
-
AstrBot
|
|
77
|
+
AstrBot 是一个开源的一站式 Agentic 聊天机器人平台及开发框架。
|
|
78
78
|
|
|
79
79
|
## ✨ 主要功能
|
|
80
80
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<p align="center">
|
|
1
|
+
<img width="430" height="31" alt="image" src="https://github.com/user-attachments/assets/474c822c-fab7-41be-8c23-6dae252823ed" /><p align="center">
|
|
2
2
|
|
|
3
3
|

|
|
4
4
|
|
|
@@ -25,7 +25,7 @@ _✨ 易上手的多平台 LLM 聊天机器人及开发框架 ✨_
|
|
|
25
25
|
<a href="https://github.com/Soulter/AstrBot/issues">问题提交</a>
|
|
26
26
|
</div>
|
|
27
27
|
|
|
28
|
-
AstrBot
|
|
28
|
+
AstrBot 是一个开源的一站式 Agentic 聊天机器人平台及开发框架。
|
|
29
29
|
|
|
30
30
|
## ✨ 主要功能
|
|
31
31
|
|
|
@@ -6,7 +6,7 @@ import os
|
|
|
6
6
|
|
|
7
7
|
from astrbot.core.utils.astrbot_path import get_astrbot_data_path
|
|
8
8
|
|
|
9
|
-
VERSION = "3.5.
|
|
9
|
+
VERSION = "3.5.26"
|
|
10
10
|
DB_PATH = os.path.join(get_astrbot_data_path(), "data_v3.db")
|
|
11
11
|
|
|
12
12
|
# 默认配置
|
|
@@ -103,6 +103,7 @@ DEFAULT_CONFIG = {
|
|
|
103
103
|
"t2i_endpoint": "",
|
|
104
104
|
"t2i_use_file_service": False,
|
|
105
105
|
"http_proxy": "",
|
|
106
|
+
"no_proxy": ["localhost", "127.0.0.1", "::1"],
|
|
106
107
|
"dashboard": {
|
|
107
108
|
"enable": True,
|
|
108
109
|
"username": "astrbot",
|
|
@@ -971,6 +972,7 @@ CONFIG_METADATA_2 = {
|
|
|
971
972
|
"api_key": "",
|
|
972
973
|
"api_base": "https://api.fish.audio/v1",
|
|
973
974
|
"fishaudio-tts-character": "可莉",
|
|
975
|
+
"fishaudio-tts-reference-id": "",
|
|
974
976
|
"timeout": "20",
|
|
975
977
|
},
|
|
976
978
|
"阿里云百炼 TTS(API)": {
|
|
@@ -1564,6 +1566,11 @@ CONFIG_METADATA_2 = {
|
|
|
1564
1566
|
"type": "string",
|
|
1565
1567
|
"hint": "fishaudio TTS 的角色。默认为可莉。更多角色请访问:https://fish.audio/zh-CN/discovery",
|
|
1566
1568
|
},
|
|
1569
|
+
"fishaudio-tts-reference-id": {
|
|
1570
|
+
"description": "reference_id",
|
|
1571
|
+
"type": "string",
|
|
1572
|
+
"hint": "fishaudio TTS 的参考模型ID(可选)。如果填入此字段,将直接使用模型ID而不通过角色名称查询。例如:626bb6d3f3364c9cbc3aa6a67300a664。更多模型请访问:https://fish.audio/zh-CN/discovery,进入模型详情界面后可复制模型ID",
|
|
1573
|
+
},
|
|
1567
1574
|
"whisper_hint": {
|
|
1568
1575
|
"description": "本地部署 Whisper 模型须知",
|
|
1569
1576
|
"type": "string",
|
|
@@ -1910,6 +1917,12 @@ CONFIG_METADATA_2 = {
|
|
|
1910
1917
|
"type": "string",
|
|
1911
1918
|
"hint": "启用后,会以添加环境变量的方式设置代理。格式为 `http://ip:port`",
|
|
1912
1919
|
},
|
|
1920
|
+
"no_proxy": {
|
|
1921
|
+
"description": "直连地址列表",
|
|
1922
|
+
"type": "list",
|
|
1923
|
+
"items": {"type": "string"},
|
|
1924
|
+
"hint": "在此处添加不希望通过代理访问的地址,例如内部服务地址。回车添加,可添加多个,如未设置代理请忽略此配置",
|
|
1925
|
+
},
|
|
1913
1926
|
"timezone": {
|
|
1914
1927
|
"description": "时区",
|
|
1915
1928
|
"type": "string",
|
|
@@ -52,14 +52,18 @@ class AstrBotCoreLifecycle:
|
|
|
52
52
|
os.environ["https_proxy"] = proxy_config
|
|
53
53
|
os.environ["http_proxy"] = proxy_config
|
|
54
54
|
logger.debug(f"Using proxy: {proxy_config}")
|
|
55
|
+
# 设置 no_proxy
|
|
56
|
+
no_proxy_list = self.astrbot_config.get("no_proxy", [])
|
|
57
|
+
os.environ["no_proxy"] = ",".join(no_proxy_list)
|
|
55
58
|
else:
|
|
56
59
|
# 清空代理环境变量
|
|
57
60
|
if "https_proxy" in os.environ:
|
|
58
61
|
del os.environ["https_proxy"]
|
|
59
62
|
if "http_proxy" in os.environ:
|
|
60
63
|
del os.environ["http_proxy"]
|
|
64
|
+
if "no_proxy" in os.environ:
|
|
65
|
+
del os.environ["no_proxy"]
|
|
61
66
|
logger.debug("HTTP proxy cleared")
|
|
62
|
-
os.environ["no_proxy"] = "localhost,127.0.0.1,::1"
|
|
63
67
|
|
|
64
68
|
async def initialize(self):
|
|
65
69
|
"""
|
|
@@ -3,15 +3,23 @@ import botpy.message
|
|
|
3
3
|
import botpy.types
|
|
4
4
|
import botpy.types.message
|
|
5
5
|
import asyncio
|
|
6
|
+
import base64
|
|
7
|
+
import aiofiles
|
|
6
8
|
from astrbot.core.utils.io import file_to_base64, download_image_by_url
|
|
9
|
+
from astrbot.core.utils.tencent_record_helper import wav_to_tencent_silk
|
|
10
|
+
from astrbot.core.utils.astrbot_path import get_astrbot_data_path
|
|
7
11
|
from astrbot.api.event import AstrMessageEvent, MessageChain
|
|
8
12
|
from astrbot.api.platform import AstrBotMessage, PlatformMetadata
|
|
9
|
-
from astrbot.api.message_components import Plain, Image
|
|
13
|
+
from astrbot.api.message_components import Plain, Image, Record
|
|
10
14
|
from botpy import Client
|
|
11
15
|
from botpy.http import Route
|
|
12
16
|
from astrbot.api import logger
|
|
17
|
+
from botpy.types.message import Media
|
|
13
18
|
from botpy.types import message
|
|
19
|
+
from typing import Optional
|
|
14
20
|
import random
|
|
21
|
+
import uuid
|
|
22
|
+
import os
|
|
15
23
|
|
|
16
24
|
|
|
17
25
|
class QQOfficialMessageEvent(AstrMessageEvent):
|
|
@@ -36,6 +44,7 @@ class QQOfficialMessageEvent(AstrMessageEvent):
|
|
|
36
44
|
stream_payload = {"state": 1, "id": None, "index": 0, "reset": False}
|
|
37
45
|
last_edit_time = 0 # 上次编辑消息的时间
|
|
38
46
|
throttle_interval = 1 # 编辑消息的间隔时间 (秒)
|
|
47
|
+
ret = None
|
|
39
48
|
try:
|
|
40
49
|
async for chain in generator:
|
|
41
50
|
source = self.message_obj.raw_message
|
|
@@ -85,9 +94,10 @@ class QQOfficialMessageEvent(AstrMessageEvent):
|
|
|
85
94
|
plain_text,
|
|
86
95
|
image_base64,
|
|
87
96
|
image_path,
|
|
97
|
+
record_file_path
|
|
88
98
|
) = await QQOfficialMessageEvent._parse_to_qqofficial(self.send_buffer)
|
|
89
99
|
|
|
90
|
-
if not plain_text and not image_base64 and not image_path:
|
|
100
|
+
if not plain_text and not image_base64 and not image_path and not record_file_path:
|
|
91
101
|
return
|
|
92
102
|
|
|
93
103
|
payload = {
|
|
@@ -98,6 +108,8 @@ class QQOfficialMessageEvent(AstrMessageEvent):
|
|
|
98
108
|
if not isinstance(source, (botpy.message.Message, botpy.message.DirectMessage)):
|
|
99
109
|
payload["msg_seq"] = random.randint(1, 10000)
|
|
100
110
|
|
|
111
|
+
ret = None
|
|
112
|
+
|
|
101
113
|
match type(source):
|
|
102
114
|
case botpy.message.GroupMessage:
|
|
103
115
|
if image_base64:
|
|
@@ -106,6 +118,12 @@ class QQOfficialMessageEvent(AstrMessageEvent):
|
|
|
106
118
|
)
|
|
107
119
|
payload["media"] = media
|
|
108
120
|
payload["msg_type"] = 7
|
|
121
|
+
if record_file_path: # group record msg
|
|
122
|
+
media = await self.upload_group_and_c2c_record(
|
|
123
|
+
record_file_path, 3, group_openid=source.group_openid
|
|
124
|
+
)
|
|
125
|
+
payload["media"] = media
|
|
126
|
+
payload["msg_type"] = 7
|
|
109
127
|
ret = await self.bot.api.post_group_message(
|
|
110
128
|
group_openid=source.group_openid, **payload
|
|
111
129
|
)
|
|
@@ -116,6 +134,12 @@ class QQOfficialMessageEvent(AstrMessageEvent):
|
|
|
116
134
|
)
|
|
117
135
|
payload["media"] = media
|
|
118
136
|
payload["msg_type"] = 7
|
|
137
|
+
if record_file_path: # c2c record
|
|
138
|
+
media = await self.upload_group_and_c2c_record(
|
|
139
|
+
record_file_path, 3, openid = source.author.user_openid
|
|
140
|
+
)
|
|
141
|
+
payload["media"] = media
|
|
142
|
+
payload["msg_type"] = 7
|
|
119
143
|
if stream:
|
|
120
144
|
ret = await self.post_c2c_message(
|
|
121
145
|
openid=source.author.user_openid,
|
|
@@ -165,6 +189,59 @@ class QQOfficialMessageEvent(AstrMessageEvent):
|
|
|
165
189
|
)
|
|
166
190
|
return await self.bot.api._http.request(route, json=payload)
|
|
167
191
|
|
|
192
|
+
async def upload_group_and_c2c_record(
|
|
193
|
+
self,
|
|
194
|
+
file_source: str,
|
|
195
|
+
file_type: int,
|
|
196
|
+
srv_send_msg: bool = False,
|
|
197
|
+
**kwargs
|
|
198
|
+
) -> Optional[Media]:
|
|
199
|
+
"""
|
|
200
|
+
上传媒体文件
|
|
201
|
+
"""
|
|
202
|
+
# 构建基础payload
|
|
203
|
+
payload = {
|
|
204
|
+
"file_type": file_type,
|
|
205
|
+
"srv_send_msg": srv_send_msg
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
# 处理文件数据
|
|
209
|
+
if os.path.exists(file_source):
|
|
210
|
+
# 读取本地文件
|
|
211
|
+
async with aiofiles.open(file_source, 'rb') as f:
|
|
212
|
+
file_content = await f.read()
|
|
213
|
+
# use base64 encode
|
|
214
|
+
payload["file_data"] = base64.b64encode(file_content).decode('utf-8')
|
|
215
|
+
else:
|
|
216
|
+
# 使用URL
|
|
217
|
+
payload["url"] = file_source
|
|
218
|
+
|
|
219
|
+
# 添加接收者信息和确定路由
|
|
220
|
+
if "openid" in kwargs:
|
|
221
|
+
payload["openid"] = kwargs["openid"]
|
|
222
|
+
route = Route("POST", "/v2/users/{openid}/files", openid=kwargs["openid"])
|
|
223
|
+
elif "group_openid" in kwargs:
|
|
224
|
+
payload["group_openid"] =kwargs["group_openid"]
|
|
225
|
+
route = Route("POST", "/v2/groups/{group_openid}/files", group_openid=kwargs["group_openid"])
|
|
226
|
+
else:
|
|
227
|
+
return None
|
|
228
|
+
|
|
229
|
+
try:
|
|
230
|
+
# 使用底层HTTP请求
|
|
231
|
+
result = await self.bot.api._http.request(route, json=payload)
|
|
232
|
+
|
|
233
|
+
if result:
|
|
234
|
+
return Media(
|
|
235
|
+
file_uuid=result.get("file_uuid"),
|
|
236
|
+
file_info=result.get("file_info"),
|
|
237
|
+
ttl=result.get("ttl", 0),
|
|
238
|
+
file_id=result.get("id", "")
|
|
239
|
+
)
|
|
240
|
+
except Exception as e:
|
|
241
|
+
logger.error(f"上传请求错误: {e}")
|
|
242
|
+
|
|
243
|
+
return None
|
|
244
|
+
|
|
168
245
|
async def post_c2c_message(
|
|
169
246
|
self,
|
|
170
247
|
openid: str,
|
|
@@ -191,6 +268,7 @@ class QQOfficialMessageEvent(AstrMessageEvent):
|
|
|
191
268
|
plain_text = ""
|
|
192
269
|
image_base64 = None # only one img supported
|
|
193
270
|
image_file_path = None
|
|
271
|
+
record_file_path = None
|
|
194
272
|
for i in message.chain:
|
|
195
273
|
if isinstance(i, Plain):
|
|
196
274
|
plain_text += i.text
|
|
@@ -206,6 +284,21 @@ class QQOfficialMessageEvent(AstrMessageEvent):
|
|
|
206
284
|
else:
|
|
207
285
|
image_base64 = file_to_base64(i.file)
|
|
208
286
|
image_base64 = image_base64.removeprefix("base64://")
|
|
287
|
+
elif isinstance(i, Record):
|
|
288
|
+
if i.file:
|
|
289
|
+
record_wav_path = await i.convert_to_file_path() # wav 路径
|
|
290
|
+
temp_dir = os.path.join(get_astrbot_data_path(), "temp")
|
|
291
|
+
record_tecent_silk_path = os.path.join(temp_dir, f"{uuid.uuid4()}.silk")
|
|
292
|
+
try:
|
|
293
|
+
duration = await wav_to_tencent_silk(record_wav_path, record_tecent_silk_path)
|
|
294
|
+
if duration > 0:
|
|
295
|
+
record_file_path = record_tecent_silk_path
|
|
296
|
+
else:
|
|
297
|
+
record_file_path = None
|
|
298
|
+
logger.error("转换音频格式时出错:音频时长不大于0")
|
|
299
|
+
except Exception as e:
|
|
300
|
+
logger.error(f"处理语音时出错: {e}")
|
|
301
|
+
record_file_path = None
|
|
209
302
|
else:
|
|
210
303
|
logger.debug(f"qq_official 忽略 {i.type}")
|
|
211
|
-
return plain_text, image_base64, image_file_path
|
|
304
|
+
return plain_text, image_base64, image_file_path, record_file_path
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import os
|
|
2
2
|
import uuid
|
|
3
|
+
import re
|
|
3
4
|
import ormsgpack
|
|
4
5
|
from pydantic import BaseModel, conint
|
|
5
6
|
from httpx import AsyncClient
|
|
@@ -24,8 +25,8 @@ class ServeTTSRequest(BaseModel):
|
|
|
24
25
|
# 参考音频
|
|
25
26
|
references: list[ServeReferenceAudio] = []
|
|
26
27
|
# 参考模型 ID
|
|
27
|
-
# 例如 https://fish.audio/m/
|
|
28
|
-
# 其中reference_id为
|
|
28
|
+
# 例如 https://fish.audio/m/626bb6d3f3364c9cbc3aa6a67300a664/
|
|
29
|
+
# 其中reference_id为 626bb6d3f3364c9cbc3aa6a67300a664
|
|
29
30
|
reference_id: str | None = None
|
|
30
31
|
# 对中英文文本进行标准化,这可以提高数字的稳定性
|
|
31
32
|
normalize: bool = True
|
|
@@ -44,6 +45,7 @@ class ProviderFishAudioTTSAPI(TTSProvider):
|
|
|
44
45
|
) -> None:
|
|
45
46
|
super().__init__(provider_config, provider_settings)
|
|
46
47
|
self.chosen_api_key: str = provider_config.get("api_key", "")
|
|
48
|
+
self.reference_id: str = provider_config.get("fishaudio-tts-reference-id", "")
|
|
47
49
|
self.character: str = provider_config.get("fishaudio-tts-character", "可莉")
|
|
48
50
|
self.api_base: str = provider_config.get(
|
|
49
51
|
"api_base", "https://api.fish-audio.cn/v1"
|
|
@@ -81,11 +83,43 @@ class ProviderFishAudioTTSAPI(TTSProvider):
|
|
|
81
83
|
return item["_id"]
|
|
82
84
|
return None
|
|
83
85
|
|
|
86
|
+
def _validate_reference_id(self, reference_id: str) -> bool:
|
|
87
|
+
"""
|
|
88
|
+
验证reference_id格式是否有效
|
|
89
|
+
|
|
90
|
+
Args:
|
|
91
|
+
reference_id: 参考模型ID
|
|
92
|
+
|
|
93
|
+
Returns:
|
|
94
|
+
bool: ID是否有效
|
|
95
|
+
"""
|
|
96
|
+
if not reference_id or not reference_id.strip():
|
|
97
|
+
return False
|
|
98
|
+
|
|
99
|
+
# FishAudio的reference_id通常是32位十六进制字符串
|
|
100
|
+
# 例如: 626bb6d3f3364c9cbc3aa6a67300a664
|
|
101
|
+
pattern = r'^[a-fA-F0-9]{32}$'
|
|
102
|
+
return bool(re.match(pattern, reference_id.strip()))
|
|
103
|
+
|
|
84
104
|
async def _generate_request(self, text: str) -> dict:
|
|
105
|
+
# 向前兼容逻辑:优先使用reference_id,如果没有则使用角色名称查询
|
|
106
|
+
if self.reference_id and self.reference_id.strip():
|
|
107
|
+
# 验证reference_id格式
|
|
108
|
+
if not self._validate_reference_id(self.reference_id):
|
|
109
|
+
raise ValueError(
|
|
110
|
+
f"无效的FishAudio参考模型ID: '{self.reference_id}'. "
|
|
111
|
+
f"请确保ID是32位十六进制字符串(例如: 626bb6d3f3364c9cbc3aa6a67300a664)。"
|
|
112
|
+
f"您可以从 https://fish.audio/zh-CN/discovery 获取有效的模型ID。"
|
|
113
|
+
)
|
|
114
|
+
reference_id = self.reference_id.strip()
|
|
115
|
+
else:
|
|
116
|
+
# 回退到原来的角色名称查询逻辑
|
|
117
|
+
reference_id = await self._get_reference_id_by_character(self.character)
|
|
118
|
+
|
|
85
119
|
return ServeTTSRequest(
|
|
86
120
|
text=text,
|
|
87
121
|
format="wav",
|
|
88
|
-
reference_id=
|
|
122
|
+
reference_id=reference_id,
|
|
89
123
|
)
|
|
90
124
|
|
|
91
125
|
async def get_audio(self, text: str) -> str:
|
|
@@ -431,6 +431,7 @@ class ProviderGoogleGenAI(Provider):
|
|
|
431
431
|
continue
|
|
432
432
|
|
|
433
433
|
llm_response = LLMResponse("assistant")
|
|
434
|
+
llm_response.raw_completion = result
|
|
434
435
|
llm_response.result_chain = self._process_content_parts(result, llm_response)
|
|
435
436
|
return llm_response
|
|
436
437
|
|
|
@@ -481,6 +482,7 @@ class ProviderGoogleGenAI(Provider):
|
|
|
481
482
|
part.function_call for part in chunk.candidates[0].content.parts
|
|
482
483
|
):
|
|
483
484
|
llm_response = LLMResponse("assistant", is_chunk=False)
|
|
485
|
+
llm_response.raw_completion = chunk
|
|
484
486
|
llm_response.result_chain = self._process_content_parts(
|
|
485
487
|
chunk, llm_response
|
|
486
488
|
)
|
|
@@ -496,6 +498,7 @@ class ProviderGoogleGenAI(Provider):
|
|
|
496
498
|
# Process the final chunk for potential tool calls or other content
|
|
497
499
|
if chunk.candidates[0].content.parts:
|
|
498
500
|
final_response = LLMResponse("assistant", is_chunk=False)
|
|
501
|
+
final_response.raw_completion = chunk
|
|
499
502
|
final_response.result_chain = self._process_content_parts(
|
|
500
503
|
chunk, final_response
|
|
501
504
|
)
|
|
@@ -99,10 +99,13 @@ class ProviderOpenAIOfficial(Provider):
|
|
|
99
99
|
for key in to_del:
|
|
100
100
|
del payloads[key]
|
|
101
101
|
|
|
102
|
-
# 针对 qwen3 模型的特殊处理:非流式调用必须设置 enable_thinking=false
|
|
103
102
|
model = payloads.get("model", "")
|
|
103
|
+
# 针对 qwen3 模型的特殊处理:非流式调用必须设置 enable_thinking=false
|
|
104
104
|
if "qwen3" in model.lower():
|
|
105
|
-
extra_body["enable_thinking"] = False
|
|
105
|
+
extra_body["enable_thinking"] = False
|
|
106
|
+
# 针对 deepseek 模型的特殊处理:deepseek-reasoner调用必须移除 tools ,否则将被切换至 deepseek-chat
|
|
107
|
+
elif model == "deepseek-reasoner" and "tools" in payloads:
|
|
108
|
+
del payloads["tools"]
|
|
106
109
|
|
|
107
110
|
completion = await self.client.chat.completions.create(
|
|
108
111
|
**payloads, stream=False, extra_body=extra_body
|
|
@@ -89,7 +89,6 @@ class AstrBotUpdator(RepoZipUpdator):
|
|
|
89
89
|
file_url = update_data[0]["zipball_url"]
|
|
90
90
|
elif str(version).startswith("v"):
|
|
91
91
|
# 更新到指定版本
|
|
92
|
-
logger.info(f"正在更新到指定版本: {version}")
|
|
93
92
|
for data in update_data:
|
|
94
93
|
if data["tag_name"] == version:
|
|
95
94
|
file_url = data["zipball_url"]
|
|
@@ -98,8 +97,8 @@ class AstrBotUpdator(RepoZipUpdator):
|
|
|
98
97
|
else:
|
|
99
98
|
if len(str(version)) != 40:
|
|
100
99
|
raise Exception("commit hash 长度不正确,应为 40")
|
|
101
|
-
|
|
102
|
-
|
|
100
|
+
file_url = f"https://github.com/Soulter/AstrBot/archive/{version}.zip"
|
|
101
|
+
logger.info(f"准备更新至指定版本的 AstrBot Core: {version}")
|
|
103
102
|
|
|
104
103
|
if proxy:
|
|
105
104
|
proxy = proxy.removesuffix("/")
|
|
@@ -107,6 +106,7 @@ class AstrBotUpdator(RepoZipUpdator):
|
|
|
107
106
|
|
|
108
107
|
try:
|
|
109
108
|
await download_file(file_url, "temp.zip")
|
|
109
|
+
logger.info("下载 AstrBot Core 更新文件完成,正在执行解压...")
|
|
110
110
|
self.unzip_file("temp.zip", self.MAIN_PATH)
|
|
111
111
|
except BaseException as e:
|
|
112
112
|
raise e
|
|
@@ -8,6 +8,7 @@ import base64
|
|
|
8
8
|
import zipfile
|
|
9
9
|
import uuid
|
|
10
10
|
import psutil
|
|
11
|
+
import logging
|
|
11
12
|
|
|
12
13
|
import certifi
|
|
13
14
|
|
|
@@ -16,6 +17,8 @@ from typing import Union
|
|
|
16
17
|
from PIL import Image
|
|
17
18
|
from .astrbot_path import get_astrbot_data_path
|
|
18
19
|
|
|
20
|
+
logger = logging.getLogger("astrbot")
|
|
21
|
+
|
|
19
22
|
|
|
20
23
|
def on_error(func, path, exc_info):
|
|
21
24
|
"""
|
|
@@ -212,19 +215,50 @@ async def get_dashboard_version():
|
|
|
212
215
|
return None
|
|
213
216
|
|
|
214
217
|
|
|
215
|
-
async def download_dashboard(
|
|
218
|
+
async def download_dashboard(
|
|
219
|
+
path: str | None = None,
|
|
220
|
+
extract_path: str = "data",
|
|
221
|
+
latest: bool = True,
|
|
222
|
+
version: str | None = None,
|
|
223
|
+
proxy: str | None = None,
|
|
224
|
+
):
|
|
216
225
|
"""下载管理面板文件"""
|
|
217
226
|
if path is None:
|
|
218
227
|
path = os.path.join(get_astrbot_data_path(), "dashboard.zip")
|
|
219
228
|
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
229
|
+
if latest or len(str(version)) != 40:
|
|
230
|
+
logger.info("准备下载最新发行版本的 AstrBot WebUI")
|
|
231
|
+
ver_name = "latest" if latest else version
|
|
232
|
+
dashboard_release_url = f"https://astrbot-registry.soulter.top/download/astrbot-dashboard/{ver_name}/dist.zip"
|
|
233
|
+
try:
|
|
234
|
+
await download_file(dashboard_release_url, path, show_progress=True)
|
|
235
|
+
except BaseException as _:
|
|
236
|
+
if latest:
|
|
237
|
+
dashboard_release_url = "https://github.com/Soulter/AstrBot/releases/latest/download/dist.zip"
|
|
238
|
+
else:
|
|
239
|
+
dashboard_release_url = f"https://github.com/Soulter/AstrBot/releases/download/{version}/dist.zip"
|
|
240
|
+
if proxy:
|
|
241
|
+
dashboard_release_url = f"{proxy}/{dashboard_release_url}"
|
|
242
|
+
await download_file(dashboard_release_url, path, show_progress=True)
|
|
243
|
+
else:
|
|
244
|
+
logger.info(f"准备下载指定版本的 AstrBot WebUI: {version}")
|
|
245
|
+
|
|
246
|
+
url = (
|
|
247
|
+
"https://api.github.com/repos/AstrBotDevs/astrbot-release-harbour/releases"
|
|
226
248
|
)
|
|
227
|
-
|
|
228
|
-
|
|
249
|
+
if proxy:
|
|
250
|
+
url = f"{proxy}/{url}"
|
|
251
|
+
async with aiohttp.ClientSession(trust_env=True) as session:
|
|
252
|
+
async with session.get(url) as resp:
|
|
253
|
+
if resp.status == 200:
|
|
254
|
+
releases = await resp.json()
|
|
255
|
+
for release in releases:
|
|
256
|
+
if version in release["tag_name"]:
|
|
257
|
+
download_url = release["assets"][0]["browser_download_url"]
|
|
258
|
+
await download_file(download_url, path, show_progress=True)
|
|
259
|
+
else:
|
|
260
|
+
logger.warning(f"未找到指定的版本的 Dashboard 构建文件: {version}")
|
|
261
|
+
return
|
|
262
|
+
|
|
229
263
|
with zipfile.ZipFile(path, "r") as z:
|
|
230
264
|
z.extractall(extract_path)
|
|
@@ -181,14 +181,13 @@ class RepoZipUpdator:
|
|
|
181
181
|
"""
|
|
182
182
|
os.makedirs(target_dir, exist_ok=True)
|
|
183
183
|
update_dir = ""
|
|
184
|
-
logger.info(f"解压文件: {zip_path}")
|
|
185
184
|
with zipfile.ZipFile(zip_path, "r") as z:
|
|
186
185
|
update_dir = z.namelist()[0]
|
|
187
186
|
z.extractall(target_dir)
|
|
187
|
+
logger.debug(f"解压文件完成: {zip_path}")
|
|
188
188
|
|
|
189
189
|
files = os.listdir(os.path.join(target_dir, update_dir))
|
|
190
190
|
for f in files:
|
|
191
|
-
logger.info(f"移动更新文件/目录: {f}")
|
|
192
191
|
if os.path.isdir(os.path.join(target_dir, update_dir, f)):
|
|
193
192
|
if os.path.exists(os.path.join(target_dir, f)):
|
|
194
193
|
shutil.rmtree(os.path.join(target_dir, f), onerror=on_error)
|
|
@@ -198,13 +197,13 @@ class RepoZipUpdator:
|
|
|
198
197
|
shutil.move(os.path.join(target_dir, update_dir, f), target_dir)
|
|
199
198
|
|
|
200
199
|
try:
|
|
201
|
-
logger.
|
|
200
|
+
logger.debug(
|
|
202
201
|
f"删除临时更新文件: {zip_path} 和 {os.path.join(target_dir, update_dir)}"
|
|
203
202
|
)
|
|
204
203
|
shutil.rmtree(os.path.join(target_dir, update_dir), onerror=on_error)
|
|
205
204
|
os.remove(zip_path)
|
|
206
205
|
except BaseException:
|
|
207
|
-
logger.
|
|
206
|
+
logger.warning(
|
|
208
207
|
f"删除更新文件失败,可以手动删除 {zip_path} 和 {os.path.join(target_dir, update_dir)}"
|
|
209
208
|
)
|
|
210
209
|
|
|
@@ -48,7 +48,7 @@ class UpdateRoute(Route):
|
|
|
48
48
|
"version": f"v{VERSION}",
|
|
49
49
|
"has_new_version": ret is not None,
|
|
50
50
|
"dashboard_version": dv,
|
|
51
|
-
"dashboard_has_new_version": dv != f"v{VERSION}",
|
|
51
|
+
"dashboard_has_new_version": dv and dv != f"v{VERSION}",
|
|
52
52
|
},
|
|
53
53
|
).__dict__
|
|
54
54
|
except Exception as e:
|
|
@@ -82,11 +82,12 @@ class UpdateRoute(Route):
|
|
|
82
82
|
latest=latest, version=version, proxy=proxy
|
|
83
83
|
)
|
|
84
84
|
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
85
|
+
try:
|
|
86
|
+
await download_dashboard(
|
|
87
|
+
latest=latest, version=version, proxy=proxy
|
|
88
|
+
)
|
|
89
|
+
except Exception as e:
|
|
90
|
+
logger.error(f"下载管理面板文件失败: {e}。")
|
|
90
91
|
|
|
91
92
|
# pip 更新依赖
|
|
92
93
|
logger.info("更新依赖中...")
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# What's Changed
|
|
2
|
+
|
|
3
|
+
1. 新增:为 FishAudio TTS 添加可选的 reference_id 直接指定功能 ([#2513](https://github.com/AstrBotDevs/AstrBot/issues/2513))
|
|
4
|
+
2. 新增:Gemini 添加对 LLMResponse 的 raw_completion 支持
|
|
5
|
+
3. 新增:支持官方 QQ 接口发送语音 ([#2525](https://github.com/AstrBotDevs/AstrBot/issues/2525))
|
|
6
|
+
4. 新增:调用 deepseek-reasoner 时自动移除 tools ([#2531](https://github.com/AstrBotDevs/AstrBot/issues/2531))
|
|
7
|
+
5. 新增:添加 no_proxy 配置支持以优化代理设置 ([#2564](https://github.com/AstrBotDevs/AstrBot/issues/2564))
|
|
8
|
+
6. 新增:支持升级的同时更新到指定版本的 WebUI
|
|
9
|
+
7. 修复: 修复编辑会话名称窗口的圆角和左右边距问题 ([#2583](https://github.com/AstrBotDevs/AstrBot/issues/2583))
|
|
@@ -31,9 +31,9 @@
|
|
|
31
31
|
"description": "Versions marked as pre-release may contain unknown issues or bugs and are not recommended for production use. If you encounter any problems, please visit ",
|
|
32
32
|
"issueLink": "GitHub Issues"
|
|
33
33
|
},
|
|
34
|
-
"tip": "💡 TIP:
|
|
35
|
-
"tipLink": "
|
|
36
|
-
"tipContinue": ",
|
|
34
|
+
"tip": "💡 TIP:",
|
|
35
|
+
"tipLink": "",
|
|
36
|
+
"tipContinue": "By default, the corresponding version of the WebUI files will be downloaded when switching versions. The WebUI code is located in the dashboard directory of the project, and you can use npm to build it yourself.",
|
|
37
37
|
"dockerTip": "The `Update to Latest Version` button will try to update both the bot main program and the dashboard. If you are using Docker deployment, you can also re-pull the image or use",
|
|
38
38
|
"dockerTipLink": "watchtower",
|
|
39
39
|
"dockerTipContinue": "to automatically monitor and pull.",
|
|
@@ -31,9 +31,8 @@
|
|
|
31
31
|
"description": "标有预发布标签的版本可能存在未知问题或 Bug,不建议在生产环境使用。如发现问题,请提交至 ",
|
|
32
32
|
"issueLink": "GitHub Issues"
|
|
33
33
|
},
|
|
34
|
-
"tip": "💡 TIP:
|
|
35
|
-
"
|
|
36
|
-
"tipContinue": "找到对应的面板文件 dist.zip,解压后替换 data/dist 文件夹即可。当然,前端源代码在 dashboard 目录下,你也可以自己使用 npm install 和 npm build 构建。",
|
|
34
|
+
"tip": "💡 TIP: ",
|
|
35
|
+
"tipContinue": "默认在切换版本时会下载对应版本的 WebUI 文件。WebUI 代码位于项目的 dashboard 目录,您可使用 npm 自行构建。",
|
|
37
36
|
"dockerTip": "`更新到最新版本` 按钮会同时尝试更新机器人主程序和管理面板。如果您正在使用 Docker 部署,也可以重新拉取镜像或者使用",
|
|
38
37
|
"dockerTipLink": "watchtower",
|
|
39
38
|
"dockerTipContinue": "来自动监控拉取。",
|