SYMBOL INDEX (5411 symbols across 463 files) FILE: astrbot/builtin_stars/astrbot/long_term_memory.py class LongTermMemory (line 19) | class LongTermMemory: method __init__ (line 20) | def __init__(self, acm: AstrBotConfigManager, context: star.Context) -... method cfg (line 26) | def cfg(self, event: AstrMessageEvent): method remove_session (line 59) | async def remove_session(self, event: AstrMessageEvent) -> int: method get_image_caption (line 66) | async def get_image_caption( method need_active_reply (line 88) | async def need_active_reply(self, event: AstrMessageEvent) -> bool: method handle_message (line 114) | async def handle_message(self, event: AstrMessageEvent) -> None: method on_req_llm (line 151) | async def on_req_llm(self, event: AstrMessageEvent, req: ProviderReque... method after_req_llm (line 174) | async def after_req_llm( FILE: astrbot/builtin_stars/astrbot/main.py class Main (line 12) | class Main(star.Star): method __init__ (line 13) | def __init__(self, context: star.Context) -> None: method ltm_enabled (line 21) | def ltm_enabled(self, event: AstrMessageEvent): method on_message (line 28) | async def on_message(self, event: AstrMessageEvent): method decorate_llm_req (line 88) | async def decorate_llm_req( method record_llm_resp_to_ltm (line 99) | async def record_llm_resp_to_ltm( method after_message_sent (line 110) | async def after_message_sent(self, event: AstrMessageEvent) -> None: FILE: astrbot/builtin_stars/builtin_commands/commands/admin.py class AdminCommands (line 7) | class AdminCommands: method __init__ (line 8) | def __init__(self, context: star.Context) -> None: method op (line 11) | async def op(self, event: AstrMessageEvent, admin_id: str = "") -> None: method deop (line 24) | async def deop(self, event: AstrMessageEvent, admin_id: str = "") -> N... method wl (line 42) | async def wl(self, event: AstrMessageEvent, sid: str = "") -> None: method dwl (line 56) | async def dwl(self, event: AstrMessageEvent, sid: str = "") -> None: method update_dashboard (line 73) | async def update_dashboard(self, event: AstrMessageEvent) -> None: FILE: astrbot/builtin_stars/builtin_commands/commands/alter_cmd.py class AlterCmdCommands (line 13) | class AlterCmdCommands(CommandParserMixin): method __init__ (line 14) | def __init__(self, context: star.Context) -> None: method update_reset_permission (line 17) | async def update_reset_permission(self, scene_key: str, perm_type: str... method alter_cmd (line 29) | async def alter_cmd(self, event: AstrMessageEvent) -> None: FILE: astrbot/builtin_stars/builtin_commands/commands/conversation.py class ConversationCommands (line 24) | class ConversationCommands: method __init__ (line 25) | def __init__(self, context: star.Context) -> None: method _get_current_persona_id (line 28) | async def _get_current_persona_id(self, session_id): method reset (line 42) | async def reset(self, message: AstrMessageEvent) -> None: method stop (line 110) | async def stop(self, message: AstrMessageEvent) -> None: method his (line 134) | async def his(self, message: AstrMessageEvent, page: int = 1) -> None: method convs (line 177) | async def convs(self, message: AstrMessageEvent, page: int = 1) -> None: method new_conv (line 269) | async def new_conv(self, message: AstrMessageEvent) -> None: method groupnew_conv (line 297) | async def groupnew_conv(self, message: AstrMessageEvent, sid: str = ""... method switch_conv (line 324) | async def switch_conv( method rename_conv (line 363) | async def rename_conv(self, message: AstrMessageEvent, new_name: str =... method del_conv (line 374) | async def del_conv(self, message: AstrMessageEvent) -> None: FILE: astrbot/builtin_stars/builtin_commands/commands/help.py class HelpCommand (line 10) | class HelpCommand: method __init__ (line 11) | def __init__(self, context: star.Context) -> None: method _query_astrbot_notice (line 14) | async def _query_astrbot_notice(self): method _build_reserved_command_lines (line 25) | async def _build_reserved_command_lines(self) -> list[str]: method help (line 65) | async def help(self, event: AstrMessageEvent) -> None: FILE: astrbot/builtin_stars/builtin_commands/commands/llm.py class LLMCommands (line 5) | class LLMCommands: method __init__ (line 6) | def __init__(self, context: star.Context) -> None: method llm (line 9) | async def llm(self, event: AstrMessageEvent) -> None: FILE: astrbot/builtin_stars/builtin_commands/commands/persona.py class PersonaCommands (line 11) | class PersonaCommands: method __init__ (line 12) | def __init__(self, context: star.Context) -> None: method _build_tree_output (line 15) | def _build_tree_output( method persona (line 53) | async def persona(self, message: AstrMessageEvent) -> None: FILE: astrbot/builtin_stars/builtin_commands/commands/plugin.py class PluginCommands (line 10) | class PluginCommands: method __init__ (line 11) | def __init__(self, context: star.Context) -> None: method plugin_ls (line 14) | async def plugin_ls(self, event: AstrMessageEvent) -> None: method plugin_off (line 33) | async def plugin_off(self, event: AstrMessageEvent, plugin_name: str =... method plugin_on (line 46) | async def plugin_on(self, event: AstrMessageEvent, plugin_name: str = ... method plugin_get (line 59) | async def plugin_get(self, event: AstrMessageEvent, plugin_repo: str =... method plugin_help (line 80) | async def plugin_help(self, event: AstrMessageEvent, plugin_name: str ... FILE: astrbot/builtin_stars/builtin_commands/commands/provider.py class _ModelLookupConfig (line 28) | class _ModelLookupConfig: class _ModelCache (line 34) | class _ModelCache: method __init__ (line 35) | def __init__(self) -> None: method get (line 38) | def get(self, provider_id: str, umo: str | None, ttl: float) -> list[s... method set (line 50) | def set( method _evict_if_needed (line 58) | def _evict_if_needed(self) -> None: method invalidate (line 69) | def invalidate( class ProviderCommands (line 85) | class ProviderCommands: method __init__ (line 86) | def __init__(self, context: star.Context) -> None: method _register_provider_change_hook (line 91) | def _register_provider_change_hook(self) -> None: method invalidate_provider_models_cache (line 108) | def invalidate_provider_models_cache( method _on_provider_manager_changed (line 114) | def _on_provider_manager_changed( method _get_provider_settings (line 123) | def _get_provider_settings(self, umo: str | None) -> dict: method _get_model_cache_ttl (line 135) | def _get_model_cache_ttl(self, umo: str | None) -> float: method _get_model_lookup_concurrency (line 152) | def _get_model_lookup_concurrency(self, umo: str | None) -> int: method _get_model_lookup_config (line 170) | def _get_model_lookup_config(self, umo: str | None) -> _ModelLookupCon... method _resolve_model_name (line 177) | def _resolve_model_name( method _apply_model (line 207) | def _apply_model( method _get_provider_models (line 214) | async def _get_provider_models( method _get_models_or_reply_error (line 234) | async def _get_models_or_reply_error( method _log_reachability_failure (line 261) | def _log_reachability_failure( method _test_provider_capability (line 278) | async def _test_provider_capability(self, provider): method _find_provider_for_model (line 294) | async def _find_provider_for_model( method provider (line 378) | async def provider( method _switch_model_by_name (line 560) | async def _switch_model_by_name( method model_ls (line 627) | async def model_ls( method key (line 696) | async def key(self, message: AstrMessageEvent, index: int | None = Non... FILE: astrbot/builtin_stars/builtin_commands/commands/setunset.py class SetUnsetCommands (line 5) | class SetUnsetCommands: method __init__ (line 6) | def __init__(self, context: star.Context) -> None: method set_variable (line 9) | async def set_variable(self, event: AstrMessageEvent, key: str, value:... method unset_variable (line 22) | async def unset_variable(self, event: AstrMessageEvent, key: str) -> N... FILE: astrbot/builtin_stars/builtin_commands/commands/sid.py class SIDCommand (line 7) | class SIDCommand: method __init__ (line 10) | def __init__(self, context: star.Context) -> None: method sid (line 13) | async def sid(self, event: AstrMessageEvent) -> None: FILE: astrbot/builtin_stars/builtin_commands/commands/t2i.py class T2ICommand (line 7) | class T2ICommand: method __init__ (line 10) | def __init__(self, context: star.Context) -> None: method t2i (line 13) | async def t2i(self, event: AstrMessageEvent) -> None: FILE: astrbot/builtin_stars/builtin_commands/commands/tts.py class TTSCommand (line 8) | class TTSCommand: method __init__ (line 11) | def __init__(self, context: star.Context) -> None: method tts (line 14) | async def tts(self, event: AstrMessageEvent) -> None: FILE: astrbot/builtin_stars/builtin_commands/commands/utils/rst_scene.py class RstScene (line 4) | class RstScene(Enum): method key (line 10) | def key(self) -> str: method name (line 14) | def name(self) -> str: method from_index (line 18) | def from_index(cls, index: int) -> "RstScene": method get_scene (line 23) | def get_scene(cls, is_group: bool, is_unique_session: bool) -> "RstSce... FILE: astrbot/builtin_stars/builtin_commands/main.py class Main (line 20) | class Main(star.Star): method __init__ (line 21) | def __init__(self, context: star.Context) -> None: method help (line 38) | async def help(self, event: AstrMessageEvent) -> None: method llm (line 44) | async def llm(self, event: AstrMessageEvent) -> None: method plugin (line 49) | def plugin(self) -> None: method plugin_ls (line 53) | async def plugin_ls(self, event: AstrMessageEvent) -> None: method plugin_off (line 59) | async def plugin_off(self, event: AstrMessageEvent, plugin_name: str =... method plugin_on (line 65) | async def plugin_on(self, event: AstrMessageEvent, plugin_name: str = ... method plugin_get (line 71) | async def plugin_get(self, event: AstrMessageEvent, plugin_repo: str =... method plugin_help (line 76) | async def plugin_help(self, event: AstrMessageEvent, plugin_name: str ... method t2i (line 81) | async def t2i(self, event: AstrMessageEvent) -> None: method tts (line 86) | async def tts(self, event: AstrMessageEvent) -> None: method sid (line 91) | async def sid(self, event: AstrMessageEvent) -> None: method op (line 97) | async def op(self, event: AstrMessageEvent, admin_id: str = "") -> None: method deop (line 103) | async def deop(self, event: AstrMessageEvent, admin_id: str) -> None: method wl (line 109) | async def wl(self, event: AstrMessageEvent, sid: str = "") -> None: method dwl (line 115) | async def dwl(self, event: AstrMessageEvent, sid: str) -> None: method provider (line 121) | async def provider( method reset (line 131) | async def reset(self, message: AstrMessageEvent) -> None: method stop (line 136) | async def stop(self, message: AstrMessageEvent) -> None: method model_ls (line 142) | async def model_ls( method his (line 151) | async def his(self, message: AstrMessageEvent, page: int = 1) -> None: method convs (line 156) | async def convs(self, message: AstrMessageEvent, page: int = 1) -> None: method new_conv (line 161) | async def new_conv(self, message: AstrMessageEvent) -> None: method groupnew_conv (line 167) | async def groupnew_conv(self, message: AstrMessageEvent, sid: str) -> ... method switch_conv (line 172) | async def switch_conv( method rename_conv (line 179) | async def rename_conv(self, message: AstrMessageEvent, new_name: str) ... method del_conv (line 184) | async def del_conv(self, message: AstrMessageEvent) -> None: method key (line 190) | async def key(self, message: AstrMessageEvent, index: int | None = Non... method persona (line 196) | async def persona(self, message: AstrMessageEvent) -> None: method update_dashboard (line 202) | async def update_dashboard(self, event: AstrMessageEvent) -> None: method set_variable (line 207) | async def set_variable(self, event: AstrMessageEvent, key: str, value:... method unset_variable (line 211) | async def unset_variable(self, event: AstrMessageEvent, key: str) -> N... method alter_cmd (line 216) | async def alter_cmd(self, event: AstrMessageEvent) -> None: FILE: astrbot/builtin_stars/session_controller/main.py class Main (line 17) | class Main(Star): method __init__ (line 20) | def __init__(self, context: Context) -> None: method handle_session_control_agent (line 24) | async def handle_session_control_agent(self, event: AstrMessageEvent) ... method handle_empty_mention (line 33) | async def handle_empty_mention(self, event: AstrMessageEvent): FILE: astrbot/builtin_stars/web_searcher/engines/__init__.py class SearchResult (line 31) | class SearchResult: method __str__ (line 37) | def __str__(self) -> str: class SearchEngine (line 41) | class SearchEngine: method __init__ (line 44) | def __init__(self) -> None: method _set_selector (line 49) | def _set_selector(self, selector: str) -> str: method _get_next_page (line 52) | async def _get_next_page(self, query: str) -> str: method _get_html (line 55) | async def _get_html(self, url: str, data: dict | None = None) -> str: method tidy_text (line 83) | def tidy_text(self, text: str) -> str: method _get_url (line 87) | def _get_url(self, tag: Tag) -> str: method search (line 90) | async def search(self, query: str, num_results: int) -> list[SearchRes... FILE: astrbot/builtin_stars/web_searcher/engines/bing.py class Bing (line 4) | class Bing(SearchEngine): method __init__ (line 5) | def __init__(self) -> None: method _set_selector (line 10) | def _set_selector(self, selector: str): method _get_next_page (line 20) | async def _get_next_page(self, query) -> str: FILE: astrbot/builtin_stars/web_searcher/engines/sogo.py class Sogo (line 10) | class Sogo(SearchEngine): method __init__ (line 11) | def __init__(self) -> None: method _set_selector (line 16) | def _set_selector(self, selector: str): method _get_next_page (line 26) | async def _get_next_page(self, query) -> str: method _get_url (line 30) | def _get_url(self, tag: Tag) -> str: method search (line 33) | async def search(self, query: str, num_results: int) -> list[SearchRes... method _parse_url (line 41) | async def _parse_url(self, url) -> str: FILE: astrbot/builtin_stars/web_searcher/main.py class Main (line 20) | class Main(star.Star): method __init__ (line 29) | def __init__(self, context: star.Context) -> None: method _tidy_text (line 64) | async def _tidy_text(self, text: str) -> str: method _get_from_url (line 68) | async def _get_from_url(self, url: str) -> str: method _process_search_result (line 81) | async def _process_search_result( method _web_search_default (line 104) | async def _web_search_default( method _get_tavily_key (line 126) | async def _get_tavily_key(self, cfg: AstrBotConfig) -> str: method _web_search_tavily (line 137) | async def _web_search_tavily( method _extract_tavily (line 172) | async def _extract_tavily(self, cfg: AstrBotConfig, payload: dict) -> ... method search_from_search_engine (line 200) | async def search_from_search_engine( method ensure_baidu_ai_search_mcp (line 238) | async def ensure_baidu_ai_search_mcp(self, umo: str | None = None) -> ... method fetch_website_content (line 264) | async def fetch_website_content(self, event: AstrMessageEvent, url: st... method search_from_tavily (line 275) | async def search_from_tavily( method tavily_extract_web_page (line 351) | async def tavily_extract_web_page( method _get_bocha_key (line 386) | async def _get_bocha_key(self, cfg: AstrBotConfig) -> str: method _web_search_bocha (line 397) | async def _web_search_bocha( method search_from_bocha (line 434) | async def search_from_bocha( method edit_web_search_tools (line 541) | async def edit_web_search_tools( FILE: astrbot/cli/__main__.py function cli (line 22) | def cli() -> None: function help (line 31) | def help(command_name: str | None) -> None: FILE: astrbot/cli/commands/cmd_conf.py function _validate_log_level (line 12) | def _validate_log_level(value: str) -> str: function _validate_dashboard_port (line 22) | def _validate_dashboard_port(value: str) -> int: function _validate_dashboard_username (line 33) | def _validate_dashboard_username(value: str) -> str: function _validate_dashboard_password (line 40) | def _validate_dashboard_password(value: str) -> str: function _validate_timezone (line 47) | def _validate_timezone(value: str) -> str: function _validate_callback_api_base (line 58) | def _validate_callback_api_base(value: str) -> str: function _load_config (line 78) | def _load_config() -> dict[str, Any]: function _save_config (line 101) | def _save_config(config: dict[str, Any]) -> None: function _set_nested_item (line 111) | def _set_nested_item(obj: dict[str, Any], path: str, value: Any) -> None: function _get_nested_item (line 125) | def _get_nested_item(obj: dict[str, Any], path: str) -> Any: function conf (line 134) | def conf() -> None: function set_config (line 156) | def set_config(key: str, value: str) -> None: function get_config (line 185) | def get_config(key: str | None = None) -> None: FILE: astrbot/cli/commands/cmd_init.py function initialize_astrbot (line 10) | async def initialize_astrbot(astrbot_root: Path) -> None: function init (line 38) | def init() -> None: FILE: astrbot/cli/commands/cmd_plug.py function plug (line 18) | def plug() -> None: function _get_data_path (line 22) | def _get_data_path() -> Path: function display_plugins (line 31) | def display_plugins(plugins, title=None, color=None) -> None: function new (line 50) | def new(name: str) -> None: function list (line 107) | def list(all: bool) -> None: function install (line 148) | def install(name: str, proxy: str | None) -> None: function remove (line 171) | def remove(name: str) -> None: function update (line 196) | def update(name: str, proxy: str | None) -> None: function search (line 236) | def search(query: str) -> None: FILE: astrbot/cli/commands/cmd_run.py function run_astrbot (line 13) | async def run_astrbot(astrbot_root: Path) -> None: function run (line 32) | def run(reload: bool, port: str) -> None: FILE: astrbot/cli/utils/basic.py function check_astrbot_root (line 9) | def check_astrbot_root(path: str | Path) -> bool: function get_astrbot_root (line 20) | def get_astrbot_root() -> Path: function check_dashboard (line 25) | async def check_dashboard(astrbot_root: Path) -> None: FILE: astrbot/cli/utils/plugin.py class PluginStatus (line 15) | class PluginStatus(str, Enum): function get_git_repo (line 22) | def get_git_repo(url: str, target_path: Path, proxy: str | None = None) ... function load_yaml_metadata (line 86) | def load_yaml_metadata(plugin_dir: Path) -> dict: function build_plug_list (line 105) | def build_plug_list(plugins_dir: Path) -> list: function manage_plugin (line 193) | def manage_plugin( FILE: astrbot/cli/utils/version_comparator.py class VersionComparator (line 6) | class VersionComparator: method compare_version (line 8) | def compare_version(v1: str, v2: str) -> int: method _split_prerelease (line 80) | def _split_prerelease(prerelease): FILE: astrbot/core/agent/agent.py class Agent (line 10) | class Agent(Generic[TContext]): FILE: astrbot/core/agent/context/compressor.py class ContextCompressor (line 22) | class ContextCompressor(Protocol): method should_compress (line 28) | def should_compress( method __call__ (line 43) | async def __call__(self, messages: list[Message]) -> list[Message]: class TruncateByTurnsCompressor (line 55) | class TruncateByTurnsCompressor: method __init__ (line 60) | def __init__( method should_compress (line 72) | def should_compress( method __call__ (line 90) | async def __call__(self, messages: list[Message]) -> list[Message]: function split_history (line 99) | def split_history( class LLMSummaryCompressor (line 146) | class LLMSummaryCompressor: method __init__ (line 151) | def __init__( method should_compress (line 178) | def should_compress( method __call__ (line 196) | async def __call__(self, messages: list[Message]) -> list[Message]: FILE: astrbot/core/agent/context/config.py class ContextConfig (line 12) | class ContextConfig: FILE: astrbot/core/agent/context/manager.py class ContextManager (line 10) | class ContextManager: method __init__ (line 13) | def __init__( method process (line 44) | async def process( method _run_compression (line 82) | async def _run_compression( FILE: astrbot/core/agent/context/token_counter.py class TokenCounter (line 8) | class TokenCounter(Protocol): method count_tokens (line 14) | def count_tokens( class EstimateTokenCounter (line 38) | class EstimateTokenCounter: method count_tokens (line 46) | def count_tokens( method _estimate_tokens (line 75) | def _estimate_tokens(self, text: str) -> int: FILE: astrbot/core/agent/context/truncator.py class ContextTruncator (line 4) | class ContextTruncator: method _has_tool_calls (line 7) | def _has_tool_calls(self, message: Message) -> bool: method _split_system_rest (line 16) | def _split_system_rest( method _ensure_user_message (line 32) | def _ensure_user_message( method fix_messages (line 51) | def fix_messages(self, messages: list[Message]) -> list[Message]: method truncate_by_turns (line 100) | def truncate_by_turns( method truncate_by_dropping_oldest_turns (line 146) | def truncate_by_dropping_oldest_turns( method truncate_by_halving (line 175) | def truncate_by_halving( FILE: astrbot/core/agent/handoff.py class HandoffTool (line 8) | class HandoffTool(FunctionTool, Generic[TContext]): method __init__ (line 11) | def __init__( method default_parameters (line 39) | def default_parameters(self) -> dict: method default_description (line 63) | def default_description(self, agent_name: str | None) -> str: FILE: astrbot/core/agent/hooks.py class BaseAgentRunHooks (line 11) | class BaseAgentRunHooks(Generic[TContext]): method on_agent_begin (line 12) | async def on_agent_begin(self, run_context: ContextWrapper[TContext]) ... method on_tool_start (line 13) | async def on_tool_start( method on_tool_end (line 19) | async def on_tool_end( method on_agent_done (line 26) | async def on_agent_done( FILE: astrbot/core/agent/mcp_client.py function _prepare_config (line 39) | def _prepare_config(config: dict) -> dict: function _quick_test_mcp_connection (line 48) | async def _quick_test_mcp_connection(config: dict) -> tuple[bool, str]: class MCPClient (line 110) | class MCPClient: method __init__ (line 111) | def __init__(self) -> None: method connect_to_server (line 129) | async def connect_to_server(self, mcp_server_config: dict, name: str) ... method list_tools_and_save (line 252) | async def list_tools_and_save(self) -> mcp.ListToolsResult: method _reconnect (line 260) | async def _reconnect(self) -> None: method call_tool_with_reconnect (line 310) | async def call_tool_with_reconnect( method cleanup (line 359) | async def cleanup(self) -> None: class MCPTool (line 376) | class MCPTool(FunctionTool, Generic[TContext]): method __init__ (line 379) | def __init__( method call (line 391) | async def call( FILE: astrbot/core/agent/message.py class ContentPart (line 16) | class ContentPart(BaseModel): method __init_subclass__ (line 23) | def __init_subclass__(cls, **kwargs: Any) -> None: method __get_pydantic_core_schema__ (line 35) | def __get_pydantic_core_schema__( class TextPart (line 62) | class TextPart(ContentPart): class ThinkPart (line 72) | class ThinkPart(ContentPart): method merge_in_place (line 83) | def merge_in_place(self, other: Any) -> bool: class ImageURLPart (line 94) | class ImageURLPart(ContentPart): class ImageURL (line 100) | class ImageURL(BaseModel): class AudioURLPart (line 110) | class AudioURLPart(ContentPart): class AudioURL (line 116) | class AudioURL(BaseModel): class ToolCall (line 126) | class ToolCall(BaseModel): class FunctionBody (line 140) | class FunctionBody(BaseModel): method serialize (line 154) | def serialize(self, handler): class ToolCallPart (line 161) | class ToolCallPart(BaseModel): class Message (line 168) | class Message(BaseModel): method check_content_required (line 190) | def check_content_required(self): method serialize (line 203) | def serialize(self, handler): class AssistantMessageSegment (line 212) | class AssistantMessageSegment(Message): class ToolCallMessageSegment (line 218) | class ToolCallMessageSegment(Message): class UserMessageSegment (line 224) | class UserMessageSegment(Message): class SystemMessageSegment (line 230) | class SystemMessageSegment(Message): FILE: astrbot/core/agent/response.py class AgentResponseData (line 8) | class AgentResponseData(T.TypedDict): class AgentResponse (line 13) | class AgentResponse: class AgentStats (line 19) | class AgentStats: method duration (line 26) | def duration(self) -> float: method to_dict (line 29) | def to_dict(self) -> dict: FILE: astrbot/core/agent/run_context.py class ContextWrapper (line 13) | class ContextWrapper(Generic[TContext]): FILE: astrbot/core/agent/runners/base.py class AgentState (line 13) | class AgentState(Enum): class BaseAgentRunner (line 22) | class BaseAgentRunner(T.Generic[TContext]): method reset (line 24) | async def reset( method step (line 36) | async def step(self) -> T.AsyncGenerator[AgentResponse, None]: method step_until_done (line 41) | async def step_until_done( method done (line 48) | def done(self) -> bool: method get_final_llm_resp (line 55) | def get_final_llm_resp(self) -> LLMResponse | None: method _transition_state (line 61) | def _transition_state(self, new_state: AgentState) -> None: FILE: astrbot/core/agent/runners/coze/coze_agent_runner.py class CozeAgentRunner (line 27) | class CozeAgentRunner(BaseAgentRunner[TContext]): method reset (line 31) | async def reset( method step (line 73) | async def step(self): method step_until_done (line 109) | async def step_until_done( method _execute_coze_request (line 116) | async def _execute_coze_request(self): method _download_and_upload_image (line 326) | async def _download_and_upload_image( method done (line 361) | def done(self) -> bool: method get_final_llm_resp (line 366) | def get_final_llm_resp(self) -> LLMResponse | None: FILE: astrbot/core/agent/runners/coze/coze_api_client.py class CozeAPIClient (line 12) | class CozeAPIClient: method __init__ (line 13) | def __init__(self, api_key: str, api_base: str = "https://api.coze.cn"... method _ensure_session (line 18) | async def _ensure_session(self): method upload_file (line 44) | async def upload_file( method download_image (line 100) | async def download_image(self, image_url: str) -> bytes: method chat_messages (line 123) | async def chat_messages( method clear_context (line 211) | async def clear_context(self, conversation_id: str): method get_message_list (line 244) | async def get_message_list( method close (line 280) | async def close(self) -> None: function test_coze_api_client (line 291) | async def test_coze_api_client() -> None: FILE: astrbot/core/agent/runners/dashscope/dashscope_agent_runner.py class DashscopeAgentRunner (line 31) | class DashscopeAgentRunner(BaseAgentRunner[TContext]): method reset (line 35) | async def reset( method has_rag_options (line 70) | def has_rag_options(self) -> bool: method step (line 85) | async def step(self): method step_until_done (line 119) | async def step_until_done( method _consume_sync_generator (line 126) | def _consume_sync_generator( method _process_stream_chunk (line 147) | async def _process_stream_chunk( method _format_doc_references (line 200) | def _format_doc_references(self, doc_references: list) -> str: method _build_request_payload (line 219) | async def _build_request_payload( method _handle_streaming_response (line 280) | async def _handle_streaming_response( method _execute_dashscope_request (line 369) | async def _execute_dashscope_request(self): method done (line 397) | def done(self) -> bool: method get_final_llm_resp (line 402) | def get_final_llm_resp(self) -> LLMResponse | None: FILE: astrbot/core/agent/runners/deerflow/deerflow_agent_runner.py class DeerFlowAgentRunner (line 49) | class DeerFlowAgentRunner(BaseAgentRunner[TContext]): class _RunnerConfig (line 55) | class _RunnerConfig: class _StreamState (line 70) | class _StreamState: class _FinalResult (line 85) | class _FinalResult: method _format_exception (line 89) | def _format_exception(self, err: Exception) -> str: method close (line 111) | async def close(self) -> None: method _notify_agent_done_hook (line 124) | async def _notify_agent_done_hook(self) -> None: method _finish_with_result (line 132) | async def _finish_with_result( method _finish_with_error (line 146) | async def _finish_with_error(self, err_msg: str) -> AgentResponse: method _parse_runner_config (line 163) | def _parse_runner_config(self, provider_config: dict) -> _RunnerConfig: method _load_config_and_client (line 212) | async def _load_config_and_client(self, provider_config: dict) -> None: method reset (line 262) | async def reset( method step (line 280) | async def step(self): method step_until_done (line 306) | async def step_until_done( method _extract_new_messages_from_values (line 323) | def _extract_new_messages_from_values( method _fingerprint_message (line 354) | def _fingerprint_message(self, message: dict[str, T.Any]) -> str: method _remember_seen_message_id (line 361) | def _remember_seen_message_id(self, state: _StreamState, msg_id: str) ... method _ensure_thread_id (line 371) | async def _ensure_thread_id(self, session_id: str) -> str: method _build_messages (line 396) | def _build_messages( method _build_runtime_context (line 413) | def _build_runtime_context(self, thread_id: str) -> dict[str, T.Any]: method _build_payload (line 426) | def _build_payload( method _update_text_and_maybe_stream (line 446) | def _update_text_and_maybe_stream( method _handle_values_event (line 488) | def _handle_values_event( method _handle_message_event (line 539) | def _handle_message_event( method _build_final_result (line 560) | def _build_final_result(self, state: _StreamState) -> _FinalResult: method _emit_non_plain_components_at_end (line 605) | def _emit_non_plain_components_at_end( method _execute_deerflow_request (line 623) | async def _execute_deerflow_request(self): method done (line 687) | def done(self) -> bool: method get_final_llm_resp (line 692) | def get_final_llm_resp(self) -> LLMResponse | None: FILE: astrbot/core/agent/runners/deerflow/deerflow_api_client.py function _normalize_sse_newlines (line 13) | def _normalize_sse_newlines(text: str) -> str: function _parse_sse_data_lines (line 18) | def _parse_sse_data_lines(data_lines: list[str]) -> Any: function _parse_sse_block (line 41) | def _parse_sse_block(block: str) -> dict[str, Any] | None: function _stream_sse (line 58) | async def _stream_sse(resp: ClientResponse) -> AsyncGenerator[dict[str, ... class DeerFlowAPIClient (line 98) | class DeerFlowAPIClient: method __init__ (line 105) | def __init__( method _get_session (line 124) | def _get_session(self) -> ClientSession: method __aenter__ (line 131) | async def __aenter__(self) -> "DeerFlowAPIClient": method __aexit__ (line 134) | async def __aexit__( method create_thread (line 142) | async def create_thread(self, timeout: float = 20) -> dict[str, Any]: method stream_run (line 160) | async def stream_run( method close (line 209) | async def close(self) -> None: method __del__ (line 233) | def __del__(self) -> None: method is_closed (line 244) | def is_closed(self) -> bool: FILE: astrbot/core/agent/runners/deerflow/deerflow_content_mapper.py function is_likely_base64_image (line 12) | def is_likely_base64_image(value: str) -> bool: function build_user_content (line 30) | def build_user_content(prompt: str, image_urls: list[str]) -> Any: function image_component_from_url (line 97) | def image_component_from_url(url: Any) -> Comp.Image | None: function append_components_from_content (line 130) | def append_components_from_content( function build_chain_from_ai_content (line 178) | def build_chain_from_ai_content( FILE: astrbot/core/agent/runners/deerflow/deerflow_stream_utils.py function extract_text (line 5) | def extract_text(content: T.Any) -> str: function extract_messages_from_values_data (line 30) | def extract_messages_from_values_data(data: T.Any) -> list[T.Any]: function is_ai_message (line 47) | def is_ai_message(message: dict[str, T.Any]) -> bool: function extract_latest_ai_text (line 62) | def extract_latest_ai_text(messages: Iterable[T.Any]) -> str: function extract_latest_ai_message (line 80) | def extract_latest_ai_message(messages: Iterable[T.Any]) -> dict[str, T.... function is_clarification_tool_message (line 94) | def is_clarification_tool_message(message: dict[str, T.Any]) -> bool: function extract_latest_clarification_text (line 100) | def extract_latest_clarification_text(messages: Iterable[T.Any]) -> str: function get_message_id (line 116) | def get_message_id(message: T.Any) -> str: function extract_event_message_obj (line 123) | def extract_event_message_obj(data: T.Any) -> dict[str, T.Any] | None: function extract_ai_delta_from_event_data (line 133) | def extract_ai_delta_from_event_data(data: T.Any) -> str: function extract_clarification_from_event_data (line 145) | def extract_clarification_from_event_data(data: T.Any) -> str: function _iter_custom_event_items (line 154) | def _iter_custom_event_items(data: T.Any) -> list[dict[str, T.Any]]: function extract_task_failures_from_custom_event (line 169) | def extract_task_failures_from_custom_event(data: T.Any) -> list[str]: function build_task_failure_summary (line 189) | def build_task_failure_summary(failures: list[str]) -> str: FILE: astrbot/core/agent/runners/dify/dify_agent_runner.py class DifyAgentRunner (line 28) | class DifyAgentRunner(BaseAgentRunner[TContext]): method reset (line 32) | async def reset( method step (line 66) | async def step(self): method step_until_done (line 102) | async def step_until_done( method _execute_dify_request (line 109) | async def _execute_dify_request(self): method parse_dify_result (line 282) | async def parse_dify_result(self, chunk: dict | str) -> MessageChain: method done (line 330) | def done(self) -> bool: method get_final_llm_resp (line 335) | def get_final_llm_resp(self) -> LLMResponse | None: FILE: astrbot/core/agent/runners/dify/dify_api_client.py function _stream_sse (line 11) | async def _stream_sse(resp: ClientResponse) -> AsyncGenerator[dict, None]: class DifyAPIClient (line 33) | class DifyAPIClient: method __init__ (line 34) | def __init__(self, api_key: str, api_base: str = "https://api.dify.ai/... method chat_messages (line 42) | async def chat_messages( method workflow_run (line 73) | async def workflow_run( method file_upload (line 102) | async def file_upload( method close (line 158) | async def close(self) -> None: method get_chat_convs (line 161) | async def get_chat_convs(self, user: str, limit: int = 20): method delete_chat_conv (line 171) | async def delete_chat_conv(self, user: str, conversation_id: str): method rename (line 180) | async def rename( FILE: astrbot/core/agent/runners/tool_loop_agent_runner.py class _HandleFunctionToolsResult (line 54) | class _HandleFunctionToolsResult: method from_message_chain (line 61) | def from_message_chain(cls, chain: MessageChain) -> "_HandleFunctionTo... method from_tool_call_result_blocks (line 65) | def from_tool_call_result_blocks( method from_cached_image (line 71) | def from_cached_image(cls, image: T.Any) -> "_HandleFunctionToolsResult": class FollowUpTicket (line 76) | class FollowUpTicket: class ToolLoopAgentRunner (line 83) | class ToolLoopAgentRunner(BaseAgentRunner[TContext]): method _get_persona_custom_error_message (line 84) | def _get_persona_custom_error_message(self) -> str | None: method reset (line 90) | async def reset( method _iter_llm_responses (line 202) | async def _iter_llm_responses( method _iter_llm_responses_with_fallback (line 222) | async def _iter_llm_responses_with_fallback( method _simple_print_message_role (line 293) | def _simple_print_message_role(self, tag: str = ""): method follow_up (line 299) | def follow_up( method _resolve_unconsumed_follow_ups (line 315) | def _resolve_unconsumed_follow_ups(self) -> None: method _consume_follow_up_notice (line 323) | def _consume_follow_up_notice(self) -> str: method _merge_follow_up_notice (line 342) | def _merge_follow_up_notice(self, content: str) -> str: method step (line 349) | async def step(self): method step_until_done (line 621) | async def step_until_done( method _handle_function_tools (line 650) | async def _handle_function_tools( method _build_tool_requery_context (line 889) | def _build_tool_requery_context( method _build_tool_subset (line 912) | def _build_tool_subset(self, tool_set: ToolSet, tool_names: list[str])... method _resolve_tool_exec (line 921) | async def _resolve_tool_exec( method done (line 954) | def done(self) -> bool: method request_stop (line 958) | def request_stop(self) -> None: method was_aborted (line 961) | def was_aborted(self) -> bool: method get_final_llm_resp (line 964) | def get_final_llm_resp(self) -> LLMResponse | None: FILE: astrbot/core/agent/tool.py class ToolSchema (line 20) | class ToolSchema: method validate_parameters (line 33) | def validate_parameters(self) -> "ToolSchema": class FunctionTool (line 41) | class FunctionTool(ToolSchema, Generic[TContext]): method __repr__ (line 67) | def __repr__(self) -> str: method call (line 70) | async def call(self, context: ContextWrapper[TContext], **kwargs) -> T... class ToolSet (line 78) | class ToolSet: method empty (line 87) | def empty(self) -> bool: method add_tool (line 91) | def add_tool(self, tool: FunctionTool) -> None: method remove_tool (line 100) | def remove_tool(self, name: str) -> None: method get_tool (line 104) | def get_tool(self, name: str) -> FunctionTool | None: method get_light_tool_set (line 111) | def get_light_tool_set(self) -> "ToolSet": method get_param_only_tool_set (line 131) | def get_param_only_tool_set(self) -> "ToolSet": method add_func (line 153) | def add_func( method remove_func (line 179) | def remove_func(self, name: str) -> None: method get_func (line 184) | def get_func(self, name: str) -> FunctionTool | None: method func_list (line 189) | def func_list(self) -> list[FunctionTool]: method openai_schema (line 193) | def openai_schema(self, omit_empty_parameter_field: bool = False) -> l... method anthropic_schema (line 210) | def anthropic_schema(self) -> list[dict]: method google_schema (line 224) | def google_schema(self) -> dict: method get_func_desc_openai_style (line 316) | def get_func_desc_openai_style(self, omit_empty_parameter_field: bool ... method get_func_desc_anthropic_style (line 320) | def get_func_desc_anthropic_style(self): method get_func_desc_google_genai_style (line 324) | def get_func_desc_google_genai_style(self): method names (line 327) | def names(self) -> list[str]: method merge (line 331) | def merge(self, other: "ToolSet") -> None: method __len__ (line 336) | def __len__(self) -> int: method __bool__ (line 339) | def __bool__(self) -> bool: method __iter__ (line 342) | def __iter__(self): method __repr__ (line 345) | def __repr__(self) -> str: method __str__ (line 348) | def __str__(self) -> str: FILE: astrbot/core/agent/tool_executor.py class BaseFunctionToolExecutor (line 10) | class BaseFunctionToolExecutor(Generic[TContext]): method execute (line 12) | async def execute( FILE: astrbot/core/agent/tool_image_cache.py class CachedImage (line 17) | class CachedImage: class ToolImageCache (line 32) | class ToolImageCache: method __new__ (line 43) | def __new__(cls) -> "ToolImageCache": method __init__ (line 49) | def __init__(self) -> None: method _get_file_extension (line 57) | def _get_file_extension(self, mime_type: str) -> str: method save_image (line 70) | def save_image( method get_image_base64_by_path (line 111) | def get_image_base64_by_path( method cleanup_expired (line 135) | def cleanup_expired(self) -> int: FILE: astrbot/core/astr_agent_context.py class AstrAgentContext (line 10) | class AstrAgentContext: FILE: astrbot/core/astr_agent_hooks.py class MainAgentHooks (line 14) | class MainAgentHooks(BaseAgentRunHooks[AstrAgentContext]): method on_agent_done (line 15) | async def on_agent_done(self, run_context, llm_response) -> None: method on_tool_start (line 29) | async def on_tool_start( method on_tool_end (line 42) | async def on_tool_end( class EmptyAgentHooks (line 84) | class EmptyAgentHooks(BaseAgentRunHooks[AstrAgentContext]): FILE: astrbot/core/astr_agent_run_util.py function _should_stop_agent (line 26) | def _should_stop_agent(astr_event) -> bool: function _truncate_tool_result (line 30) | def _truncate_tool_result(text: str, limit: int = 70) -> str: function _extract_chain_json_data (line 40) | def _extract_chain_json_data(msg_chain: MessageChain) -> dict | None: function _record_tool_call_name (line 49) | def _record_tool_call_name( function _build_tool_call_status_message (line 61) | def _build_tool_call_status_message(tool_info: dict | None) -> str: function _build_tool_result_status_message (line 67) | def _build_tool_result_status_message( function run_agent (line 90) | async def run_agent( function _watch_agent_stop_signal (line 271) | async def _watch_agent_stop_signal(agent_runner: AgentRunner, astr_event... function run_live_agent (line 279) | async def run_live_agent( function _run_agent_feeder (line 421) | async def _run_agent_feeder( function _safe_tts_stream_wrapper (line 482) | async def _safe_tts_stream_wrapper( function _simulated_stream_tts (line 496) | async def _simulated_stream_tts( FILE: astrbot/core/astr_agent_tool_exec.py class FunctionToolExecutor (line 46) | class FunctionToolExecutor(BaseFunctionToolExecutor[AstrAgentContext]): method _collect_image_urls_from_args (line 48) | def _collect_image_urls_from_args(cls, image_urls_raw: T.Any) -> list[... method _collect_image_urls_from_message (line 67) | async def _collect_image_urls_from_message( method _collect_handoff_image_urls (line 92) | async def _collect_handoff_image_urls( method execute (line 121) | async def execute(cls, tool, run_context, **tool_args): method _get_runtime_computer_tools (line 180) | def _get_runtime_computer_tools(cls, runtime: str) -> dict[str, Functi... method _build_handoff_toolset (line 196) | def _build_handoff_toolset( method _execute_handoff (line 239) | async def _execute_handoff( method _execute_handoff_background (line 313) | async def _execute_handoff_background( method _do_handoff_background (line 356) | async def _do_handoff_background( method _execute_background (line 403) | async def _execute_background( method _wake_main_agent_for_background_result (line 443) | async def _wake_main_agent_for_background_result( method _execute_local (line 552) | async def _execute_local( method _execute_mcp (line 636) | async def _execute_mcp( function call_local_llm_tool (line 648) | async def call_local_llm_tool( FILE: astrbot/core/astr_main_agent.py class MainAgentBuildConfig (line 86) | class MainAgentBuildConfig: class MainAgentBuildResult (line 144) | class MainAgentBuildResult: function _select_provider (line 151) | def _select_provider( function _get_session_conv (line 173) | async def _get_session_conv( function _apply_kb (line 190) | async def _apply_kb( function _apply_file_extract (line 219) | async def _apply_file_extract( function _apply_prompt_prefix (line 268) | def _apply_prompt_prefix(req: ProviderRequest, cfg: dict) -> None: function _apply_local_env_tools (line 278) | def _apply_local_env_tools(req: ProviderRequest) -> None: function _build_local_mode_prompt (line 286) | def _build_local_mode_prompt() -> str: function _ensure_persona_and_skills (line 301) | async def _ensure_persona_and_skills( function _request_img_caption (line 447) | async def _request_img_caption( function _ensure_img_caption (line 475) | async def _ensure_img_caption( function _append_quoted_image_attachment (line 497) | def _append_quoted_image_attachment(req: ProviderRequest, image_path: st... function _get_quoted_message_parser_settings (line 503) | def _get_quoted_message_parser_settings( function _process_quote_message (line 514) | async def _process_quote_message( function _append_system_reminders (line 576) | def _append_system_reminders( function _decorate_llm_request (line 620) | async def _decorate_llm_request( function _modalities_fix (line 660) | def _modalities_fix(provider: Provider, req: ProviderRequest) -> None: function _sanitize_context_by_modalities (line 683) | def _sanitize_context_by_modalities( function _plugin_tool_fix (line 761) | def _plugin_tool_fix(event: AstrMessageEvent, req: ProviderRequest) -> N... function _handle_webchat (line 790) | async def _handle_webchat( function _apply_llm_safety_mode (line 834) | def _apply_llm_safety_mode(config: MainAgentBuildConfig, req: ProviderRe... function _apply_sandbox_tools (line 844) | def _apply_sandbox_tools( function _proactive_cron_job_tools (line 920) | def _proactive_cron_job_tools(req: ProviderRequest) -> None: function _get_compress_provider (line 928) | def _get_compress_provider( function _get_fallback_chat_providers (line 951) | def _get_fallback_chat_providers( function build_main_agent (line 986) | async def build_main_agent( FILE: astrbot/core/astr_main_agent_resources.py class KnowledgeBaseQueryTool (line 151) | class KnowledgeBaseQueryTool(FunctionTool[AstrAgentContext]): method call (line 172) | async def call( class SendMessageToUserTool (line 189) | class SendMessageToUserTool(FunctionTool[AstrAgentContext]): method _resolve_path_from_sandbox (line 240) | async def _resolve_path_from_sandbox( method call (line 275) | async def call( function retrieve_knowledge_base (line 399) | async def retrieve_knowledge_base( FILE: astrbot/core/astrbot_config_mgr.py class ConfInfo (line 16) | class ConfInfo(TypedDict): class AstrBotConfigManager (line 31) | class AstrBotConfigManager: method __init__ (line 34) | def __init__( method _get_abconf_data (line 48) | def _get_abconf_data(self) -> dict: method _load_all_configs (line 59) | def _load_all_configs(self) -> None: method _load_conf_mapping (line 75) | def _load_conf_mapping(self, umo: str | MessageSession) -> ConfInfo: method _save_conf_mapping (line 103) | def _save_conf_mapping( method get_conf (line 124) | def get_conf(self, umo: str | MessageSession | None) -> AstrBotConfig: method default_conf (line 140) | def default_conf(self) -> AstrBotConfig: method get_conf_info (line 144) | def get_conf_info(self, umo: str | MessageSession) -> ConfInfo: method get_conf_list (line 151) | def get_conf_list(self) -> list[ConfInfo]: method create_conf (line 163) | def create_conf( method delete_conf (line 177) | def delete_conf(self, conf_id: str) -> bool: method update_conf_info (line 231) | def update_conf_info(self, conf_id: str, name: str | None = None) -> b... method g (line 265) | def g( FILE: astrbot/core/backup/constants.py function get_backup_directories (line 60) | def get_backup_directories() -> dict[str, str]: FILE: astrbot/core/backup/exporter.py class AstrBotExporter (line 39) | class AstrBotExporter: method __init__ (line 57) | def __init__( method export_all (line 68) | async def export_all( method _export_main_database (line 206) | async def _export_main_database(self) -> dict[str, list[dict]]: method _export_kb_metadata (line 227) | async def _export_kb_metadata(self) -> dict[str, list[dict]]: method _export_kb_documents (line 251) | async def _export_kb_documents(self, kb_helper: Any) -> dict[str, Any]: method _export_faiss_index (line 272) | async def _export_faiss_index( method _export_kb_media_files (line 288) | async def _export_kb_media_files( method _export_directories (line 307) | async def _export_directories( method _export_attachments (line 358) | async def _export_attachments( method _model_to_dict (line 374) | def _model_to_dict(self, record: Any) -> dict: method _add_checksum (line 402) | def _add_checksum(self, path: str, content: str | bytes) -> None: method _generate_manifest (line 409) | def _generate_manifest( FILE: astrbot/core/backup/importer.py function _get_major_version (line 41) | def _get_major_version(version_str: str) -> str: function _load_platform_stats_invalid_count_warn_limit (line 70) | def _load_platform_stats_invalid_count_warn_limit() -> int: class _InvalidCountWarnLimiter (line 95) | class _InvalidCountWarnLimiter: method __init__ (line 98) | def __init__(self, limit: int) -> None: method warn_invalid_count (line 103) | def warn_invalid_count(self, value: Any, key_for_log: tuple[Any, ...])... class ImportPreCheckResult (line 130) | class ImportPreCheckResult: method to_dict (line 158) | def to_dict(self) -> dict: class ImportResult (line 173) | class ImportResult: method __init__ (line 176) | def __init__(self) -> None: method add_warning (line 184) | def add_warning(self, msg: str) -> None: method add_error (line 188) | def add_error(self, msg: str) -> None: method to_dict (line 193) | def to_dict(self) -> dict: class DatabaseClearError (line 204) | class DatabaseClearError(RuntimeError): class AstrBotImporter (line 208) | class AstrBotImporter: method __init__ (line 225) | def __init__( method pre_check (line 237) | def pre_check(self, zip_path: str) -> ImportPreCheckResult: method _check_version_compatibility (line 300) | def _check_version_compatibility(self, backup_version: str) -> dict: method import_all (line 349) | async def import_all( method _validate_version (line 496) | def _validate_version(self, manifest: dict) -> None: method _clear_main_db (line 516) | async def _clear_main_db(self) -> None: method _clear_kb_data (line 529) | async def _clear_kb_data(self) -> None: method _import_main_database (line 556) | async def _import_main_database( method _preprocess_main_table_rows (line 587) | def _preprocess_main_table_rows( method _merge_platform_stats_rows (line 602) | def _merge_platform_stats_rows( method _normalize_platform_stats_entry (line 641) | def _normalize_platform_stats_entry( method _normalize_platform_stats_timestamp (line 674) | def _normalize_platform_stats_timestamp(self, value: Any) -> str | None: method _import_knowledge_bases (line 699) | async def _import_knowledge_bases( method _import_kb_documents (line 777) | async def _import_kb_documents(self, kb_id: str, doc_data: dict) -> None: method _import_attachments (line 802) | async def _import_attachments( method _import_directories (line 839) | async def _import_directories( method _convert_datetime_fields (line 924) | def _convert_datetime_fields(self, row: dict, model_class: type) -> dict: FILE: astrbot/core/computer/booters/base.py class ComputerBooter (line 9) | class ComputerBooter: method fs (line 11) | def fs(self) -> FileSystemComponent: ... method python (line 14) | def python(self) -> PythonComponent: ... method shell (line 17) | def shell(self) -> ShellComponent: ... method capabilities (line 20) | def capabilities(self) -> tuple[str, ...] | None: method browser (line 29) | def browser(self) -> BrowserComponent | None: method boot (line 32) | async def boot(self, session_id: str) -> None: ... method shutdown (line 34) | async def shutdown(self) -> None: ... method upload_file (line 36) | async def upload_file(self, path: str, file_name: str) -> dict: method download_file (line 43) | async def download_file(self, remote_path: str, local_path: str) -> None: method available (line 47) | async def available(self) -> bool: FILE: astrbot/core/computer/booters/bay_manager.py class BayContainerManager (line 33) | class BayContainerManager: method __init__ (line 36) | def __init__( method ensure_running (line 50) | async def ensure_running(self) -> str: method wait_healthy (line 121) | async def wait_healthy(self, timeout: int = HEALTH_TIMEOUT_S) -> None: method read_credentials (line 147) | async def read_credentials(self) -> str: method close_client (line 210) | async def close_client(self) -> None: method stop (line 219) | async def stop(self) -> None: method _find_managed_container (line 237) | async def _find_managed_container(self) -> dict | None: method _pull_image_if_needed (line 249) | async def _pull_image_if_needed(self) -> None: FILE: astrbot/core/computer/booters/boxlite.py class MockShipyardSandboxClient (line 17) | class MockShipyardSandboxClient: method __init__ (line 18) | def __init__(self, sb_url: str) -> None: method _exec_operation (line 21) | async def _exec_operation( method upload_file (line 43) | async def upload_file(self, path: str, remote_path: str) -> dict: method wait_healthy (line 112) | async def wait_healthy(self, ship_id: str, session_id: str) -> None: class BoxliteBooter (line 131) | class BoxliteBooter(ComputerBooter): method boot (line 132) | async def boot(self, session_id: str) -> None: method shutdown (line 171) | async def shutdown(self) -> None: method fs (line 177) | def fs(self) -> FileSystemComponent: method python (line 181) | def python(self) -> PythonComponent: method shell (line 185) | def shell(self) -> ShellComponent: method upload_file (line 188) | async def upload_file(self, path: str, file_name: str) -> dict: FILE: astrbot/core/computer/booters/local.py function _is_safe_command (line 39) | def _is_safe_command(command: str) -> bool: function _ensure_safe_path (line 44) | def _ensure_safe_path(path: str) -> str: function _decode_shell_output (line 56) | def _decode_shell_output(output: bytes | None) -> str: class LocalShellComponent (line 82) | class LocalShellComponent(ShellComponent): method exec (line 83) | async def exec( class LocalPythonComponent (line 134) | class LocalPythonComponent(PythonComponent): method exec (line 135) | async def exec( class LocalFileSystemComponent (line 170) | class LocalFileSystemComponent(FileSystemComponent): method create_file (line 171) | async def create_file( method read_file (line 184) | async def read_file(self, path: str, encoding: str = "utf-8") -> dict[... method write_file (line 193) | async def write_file( method delete_file (line 205) | async def delete_file(self, path: str) -> dict[str, Any]: method list_dir (line 216) | async def list_dir( class LocalBooter (line 229) | class LocalBooter(ComputerBooter): method __init__ (line 230) | def __init__(self) -> None: method boot (line 235) | async def boot(self, session_id: str) -> None: method shutdown (line 238) | async def shutdown(self) -> None: method fs (line 242) | def fs(self) -> FileSystemComponent: method python (line 246) | def python(self) -> PythonComponent: method shell (line 250) | def shell(self) -> ShellComponent: method upload_file (line 253) | async def upload_file(self, path: str, file_name: str) -> dict: method download_file (line 258) | async def download_file(self, remote_path: str, local_path: str) -> None: method available (line 263) | async def available(self) -> bool: FILE: astrbot/core/computer/booters/shipyard.py class ShipyardBooter (line 9) | class ShipyardBooter(ComputerBooter): method __init__ (line 10) | def __init__( method boot (line 23) | async def boot(self, session_id: str) -> None: method shutdown (line 33) | async def shutdown(self) -> None: method fs (line 37) | def fs(self) -> FileSystemComponent: method python (line 41) | def python(self) -> PythonComponent: method shell (line 45) | def shell(self) -> ShellComponent: method upload_file (line 48) | async def upload_file(self, path: str, file_name: str) -> dict: method download_file (line 54) | async def download_file(self, remote_path: str, local_path: str): method available (line 64) | async def available(self) -> bool: FILE: astrbot/core/computer/booters/shipyard_neo.py function _maybe_model_dump (line 18) | def _maybe_model_dump(value: Any) -> dict[str, Any]: class NeoPythonComponent (line 28) | class NeoPythonComponent(PythonComponent): method __init__ (line 29) | def __init__(self, sandbox: Any) -> None: method exec (line 32) | async def exec( class NeoShellComponent (line 69) | class NeoShellComponent(ShellComponent): method __init__ (line 70) | def __init__(self, sandbox: Any) -> None: method exec (line 73) | async def exec( class NeoFileSystemComponent (line 138) | class NeoFileSystemComponent(FileSystemComponent): method __init__ (line 139) | def __init__(self, sandbox: Any) -> None: method create_file (line 142) | async def create_file( method read_file (line 152) | async def read_file(self, path: str, encoding: str = "utf-8") -> dict[... method write_file (line 157) | async def write_file( method delete_file (line 169) | async def delete_file(self, path: str) -> dict[str, Any]: method list_dir (line 173) | async def list_dir( class NeoBrowserComponent (line 188) | class NeoBrowserComponent(BrowserComponent): method __init__ (line 189) | def __init__(self, sandbox: Any) -> None: method exec (line 192) | async def exec( method exec_batch (line 211) | async def exec_batch( method run_skill (line 232) | async def run_skill( class ShipyardNeoBooter (line 252) | class ShipyardNeoBooter(ComputerBooter): method __init__ (line 263) | def __init__( method bay_client (line 283) | def bay_client(self) -> Any: method sandbox (line 287) | def sandbox(self) -> Any: method capabilities (line 291) | def capabilities(self) -> tuple[str, ...] | None: method is_auto_mode (line 302) | def is_auto_mode(self) -> bool: method boot (line 307) | async def boot(self, session_id: str) -> None: method _resolve_profile (line 372) | async def _resolve_profile(self, client: Any) -> str: method shutdown (line 427) | async def shutdown(self) -> None: method fs (line 445) | def fs(self) -> FileSystemComponent: method python (line 451) | def python(self) -> PythonComponent: method shell (line 457) | def shell(self) -> ShellComponent: method browser (line 463) | def browser(self) -> BrowserComponent: method upload_file (line 468) | async def upload_file(self, path: str, file_name: str) -> dict: method download_file (line 482) | async def download_file(self, remote_path: str, local_path: str) -> None: method available (line 497) | async def available(self) -> bool: FILE: astrbot/core/computer/computer_client.py function _list_local_skill_dirs (line 23) | def _list_local_skill_dirs(skills_root: Path) -> list[Path]: function _discover_bay_credentials (line 34) | def _discover_bay_credentials(endpoint: str) -> str: function _build_python_exec_command (line 93) | def _build_python_exec_command(script: str) -> str: function _build_apply_sync_command (line 104) | def _build_apply_sync_command() -> str: function _build_scan_command (line 180) | def _build_scan_command() -> str: function _build_sync_and_scan_command (line 294) | def _build_sync_and_scan_command() -> str: function _shell_exec_succeeded (line 302) | def _shell_exec_succeeded(result: dict) -> bool: function _format_exec_error_detail (line 309) | def _format_exec_error_detail(result: dict) -> str: function _decode_sync_payload (line 322) | def _decode_sync_payload(stdout: str) -> dict | None: function _update_sandbox_skills_cache (line 338) | def _update_sandbox_skills_cache(payload: dict | None) -> None: function _apply_skills_to_sandbox (line 347) | async def _apply_skills_to_sandbox(booter: ComputerBooter) -> None: function _scan_sandbox_skills (line 362) | async def _scan_sandbox_skills(booter: ComputerBooter) -> dict | None: function _sync_skills_to_sandbox (line 379) | async def _sync_skills_to_sandbox(booter: ComputerBooter) -> None: function get_booter (line 430) | async def get_booter( function sync_skills_to_active_sandboxes (line 508) | async def sync_skills_to_active_sandboxes() -> None: function get_local_booter (line 526) | def get_local_booter() -> ComputerBooter: FILE: astrbot/core/computer/olayer/browser.py class BrowserComponent (line 8) | class BrowserComponent(Protocol): method exec (line 11) | async def exec( method exec_batch (line 23) | async def exec_batch( method run_skill (line 36) | async def run_skill( FILE: astrbot/core/computer/olayer/filesystem.py class FileSystemComponent (line 8) | class FileSystemComponent(Protocol): method create_file (line 9) | async def create_file( method read_file (line 15) | async def read_file(self, path: str, encoding: str = "utf-8") -> dict[... method write_file (line 19) | async def write_file( method delete_file (line 25) | async def delete_file(self, path: str) -> dict[str, Any]: method list_dir (line 29) | async def list_dir( FILE: astrbot/core/computer/olayer/python.py class PythonComponent (line 8) | class PythonComponent(Protocol): method exec (line 11) | async def exec( FILE: astrbot/core/computer/olayer/shell.py class ShellComponent (line 8) | class ShellComponent(Protocol): method exec (line 11) | async def exec( FILE: astrbot/core/computer/tools/browser.py function _to_json (line 13) | def _to_json(data: Any) -> str: function _ensure_admin (line 17) | def _ensure_admin(context: ContextWrapper[AstrAgentContext]) -> str | None: function _get_browser_component (line 26) | async def _get_browser_component(context: ContextWrapper[AstrAgentContex... class BrowserExecTool (line 41) | class BrowserExecTool(FunctionTool): method call (line 70) | async def call( class BrowserBatchExecTool (line 98) | class BrowserBatchExecTool(FunctionTool): method call (line 132) | async def call( class RunBrowserSkillTool (line 162) | class RunBrowserSkillTool(FunctionTool): method call (line 180) | async def call( FILE: astrbot/core/computer/tools/fs.py class FileUploadTool (line 81) | class FileUploadTool(FunctionTool): method call (line 106) | async def call( class FileDownloadTool (line 146) | class FileDownloadTool(FunctionTool): method call (line 170) | async def call( FILE: astrbot/core/computer/tools/neo_skills.py function _to_jsonable (line 15) | def _to_jsonable(model_like: Any) -> Any: function _to_json_text (line 25) | def _to_json_text(data: Any) -> str: function _ensure_admin (line 29) | def _ensure_admin(context: ContextWrapper[AstrAgentContext]) -> str | None: function _get_neo_context (line 35) | async def _get_neo_context( class NeoSkillToolBase (line 53) | class NeoSkillToolBase(FunctionTool): method _run (line 56) | async def _run( class GetExecutionHistoryTool (line 73) | class GetExecutionHistoryTool(NeoSkillToolBase): method call (line 92) | async def call( class AnnotateExecutionTool (line 119) | class AnnotateExecutionTool(NeoSkillToolBase): method call (line 135) | async def call( class CreateSkillPayloadTool (line 156) | class CreateSkillPayloadTool(NeoSkillToolBase): method call (line 186) | async def call( class GetSkillPayloadTool (line 203) | class GetSkillPayloadTool(NeoSkillToolBase): method call (line 216) | async def call( class CreateSkillCandidateTool (line 229) | class CreateSkillCandidateTool(NeoSkillToolBase): method call (line 261) | async def call( class ListSkillCandidatesTool (line 282) | class ListSkillCandidatesTool(NeoSkillToolBase): method call (line 298) | async def call( class EvaluateSkillCandidateTool (line 319) | class EvaluateSkillCandidateTool(NeoSkillToolBase): method call (line 336) | async def call( class PromoteSkillCandidateTool (line 359) | class PromoteSkillCandidateTool(NeoSkillToolBase): method call (line 388) | async def call( class ListSkillReleasesTool (line 429) | class ListSkillReleasesTool(NeoSkillToolBase): method call (line 446) | async def call( class RollbackSkillReleaseTool (line 469) | class RollbackSkillReleaseTool(NeoSkillToolBase): method call (line 482) | async def call( class SyncSkillReleaseTool (line 495) | class SyncSkillReleaseTool(NeoSkillToolBase): method call (line 512) | async def call( function _sync_release_to_dict (line 531) | async def _sync_release_to_dict( FILE: astrbot/core/computer/tools/permissions.py function check_admin_permission (line 5) | def check_admin_permission( FILE: astrbot/core/computer/tools/python.py function handle_result (line 33) | async def handle_result(result: dict, event: AstrMessageEvent) -> ToolEx... class PythonTool (line 65) | class PythonTool(FunctionTool): method call (line 70) | async def call( class LocalPythonTool (line 87) | class LocalPythonTool(FunctionTool): method call (line 96) | async def call( FILE: astrbot/core/computer/tools/shell.py class ExecuteShellTool (line 14) | class ExecuteShellTool(FunctionTool): method call (line 43) | async def call( FILE: astrbot/core/config/astrbot_config.py class RateLimitStrategy (line 14) | class RateLimitStrategy(enum.Enum): class AstrBotConfig (line 19) | class AstrBotConfig(dict): method __init__ (line 31) | def __init__( method _config_schema_to_default_config (line 68) | def _config_schema_to_default_config(self, schema: dict) -> dict: method check_config_integrity (line 95) | def check_config_integrity(self, refer_conf: dict, conf: dict, path=""): method save_config (line 154) | def save_config(self, replace_config: dict | None = None) -> None: method __getattr__ (line 164) | def __getattr__(self, item): method __delattr__ (line 170) | def __delattr__(self, key) -> None: method __setattr__ (line 177) | def __setattr__(self, key, value) -> None: method check_exist (line 180) | def check_exist(self) -> bool: FILE: astrbot/core/config/default.py class ChatProviderTemplate (line 251) | class ChatProviderTemplate(TypedDict): FILE: astrbot/core/config/i18n_utils.py class ConfigMetadataI18n (line 10) | class ConfigMetadataI18n: method _get_i18n_key (line 14) | def _get_i18n_key(group: str, section: str, field: str, attr: str) -> ... method convert_to_i18n_keys (line 33) | def convert_to_i18n_keys(metadata: dict[str, Any]) -> dict[str, Any]: FILE: astrbot/core/conversation_mgr.py class ConversationManager (line 17) | class ConversationManager: method __init__ (line 20) | def __init__(self, db_helper: BaseDatabase) -> None: method register_on_session_deleted (line 28) | def register_on_session_deleted( method _trigger_session_deleted (line 43) | async def _trigger_session_deleted(self, unified_msg_origin: str) -> N... method _convert_conv_from_v2_to_v1 (line 60) | def _convert_conv_from_v2_to_v1(self, conv_v2: ConversationV2) -> Conv... method new_conversation (line 78) | async def new_conversation( method switch_conversation (line 112) | async def switch_conversation( method delete_conversation (line 125) | async def delete_conversation( method delete_conversations_by_user_id (line 146) | async def delete_conversations_by_user_id(self, unified_msg_origin: st... method get_curr_conversation_id (line 160) | async def get_curr_conversation_id(self, unified_msg_origin: str) -> s... method get_conversation (line 176) | async def get_conversation( method get_conversations (line 202) | async def get_conversations( method get_filtered_conversations (line 226) | async def get_filtered_conversations( method update_conversation (line 258) | async def update_conversation( method update_conversation_title (line 288) | async def update_conversation_title( method update_conversation_persona_id (line 310) | async def update_conversation_persona_id( method add_message_pair (line 332) | async def add_message_pair( method get_human_readable_context (line 367) | async def get_human_readable_context( FILE: astrbot/core/core_lifecycle.py class AstrBotCoreLifecycle (line 46) | class AstrBotCoreLifecycle: method __init__ (line 54) | def __init__(self, log_broker: LogBroker, db: BaseDatabase) -> None: method _init_or_reload_subagent_orchestrator (line 82) | async def _init_or_reload_subagent_orchestrator(self) -> None: method initialize (line 100) | async def initialize(self) -> None: method _load (line 235) | def _load(self) -> None: method _task_wrapper (line 273) | async def _task_wrapper(self, task: asyncio.Task) -> None: method start (line 291) | async def start(self) -> None: method stop (line 315) | async def stop(self) -> None: method restart (line 350) | async def restart(self) -> None: method load_platform (line 362) | def load_platform(self) -> list[asyncio.Task]: method load_pipeline_scheduler (line 375) | async def load_pipeline_scheduler(self) -> dict[str, PipelineScheduler]: method reload_pipeline_scheduler (line 391) | async def reload_pipeline_scheduler(self, conf_id: str) -> None: FILE: astrbot/core/cron/events.py class CronMessageEvent (line 14) | class CronMessageEvent(AstrMessageEvent): method __init__ (line 17) | def __init__( method send (line 56) | async def send(self, message: MessageChain) -> None: method send_streaming (line 62) | async def send_streaming(self, generator, use_fallback: bool = False) ... FILE: astrbot/core/cron/manager.py class CronJobManager (line 25) | class CronJobManager: method __init__ (line 28) | def __init__(self, db: BaseDatabase) -> None: method start (line 35) | async def start(self, ctx: "Context") -> None: method shutdown (line 44) | async def shutdown(self) -> None: method sync_from_db (line 51) | async def sync_from_db(self) -> None: method add_basic_job (line 64) | async def add_basic_job( method add_active_job (line 91) | async def add_active_job( method update_job (line 122) | async def update_job(self, job_id: str, **kwargs) -> CronJob | None: method delete_job (line 131) | async def delete_job(self, job_id: str) -> None: method list_jobs (line 136) | async def list_jobs(self, job_type: str | None = None) -> list[CronJob]: method _remove_scheduled (line 139) | def _remove_scheduled(self, job_id: str) -> None: method _schedule_job (line 143) | def _schedule_job(self, job: CronJob) -> None: method _get_next_run_time (line 187) | def _get_next_run_time(self, job_id: str): method _run_job (line 191) | async def _run_job(self, job_id: str) -> None: method _run_basic_job (line 225) | async def _run_basic_job(self, job: CronJob) -> None: method _run_active_agent_job (line 234) | async def _run_active_agent_job(self, job: CronJob, start_time: dateti... method _woke_main_agent (line 263) | async def _woke_main_agent( FILE: astrbot/core/db/__init__.py class BaseDatabase (line 30) | class BaseDatabase(abc.ABC): method __init__ (line 35) | def __init__(self) -> None: method initialize (line 55) | async def initialize(self) -> None: method get_db (line 59) | async def get_db(self) -> T.AsyncGenerator[AsyncSession, None]: method get_base_stats (line 69) | def get_base_stats(self, offset_sec: int = 86400) -> Stats: method get_total_message_count (line 75) | def get_total_message_count(self) -> int: method get_grouped_base_stats (line 81) | def get_grouped_base_stats(self, offset_sec: int = 86400) -> Stats: method insert_platform_stats (line 88) | async def insert_platform_stats( method count_platform_stats (line 99) | async def count_platform_stats(self) -> int: method get_platform_stats (line 104) | async def get_platform_stats(self, offset_sec: int = 86400) -> list[Pl... method get_conversations (line 109) | async def get_conversations( method get_conversation_by_id (line 121) | async def get_conversation_by_id(self, cid: str) -> ConversationV2: method get_all_conversations (line 126) | async def get_all_conversations( method get_filtered_conversations (line 135) | async def get_filtered_conversations( method create_conversation (line 147) | async def create_conversation( method update_conversation (line 162) | async def update_conversation( method delete_conversation (line 174) | async def delete_conversation(self, cid: str) -> None: method delete_conversations_by_user_id (line 179) | async def delete_conversations_by_user_id(self, user_id: str) -> None: method insert_platform_message_history (line 184) | async def insert_platform_message_history( method delete_platform_message_offset (line 196) | async def delete_platform_message_offset( method get_platform_message_history (line 206) | async def get_platform_message_history( method get_platform_message_history_by_id (line 217) | async def get_platform_message_history_by_id( method insert_attachment (line 225) | async def insert_attachment( method get_attachment_by_id (line 235) | async def get_attachment_by_id(self, attachment_id: str) -> Attachment: method get_attachments (line 240) | async def get_attachments(self, attachment_ids: list[str]) -> list[Att... method delete_attachment (line 245) | async def delete_attachment(self, attachment_id: str) -> bool: method delete_attachments (line 253) | async def delete_attachments(self, attachment_ids: list[str]) -> int: method create_api_key (line 261) | async def create_api_key( method list_api_keys (line 274) | async def list_api_keys(self) -> list[ApiKey]: method get_api_key_by_id (line 279) | async def get_api_key_by_id(self, key_id: str) -> ApiKey | None: method get_active_api_key_by_hash (line 284) | async def get_active_api_key_by_hash(self, key_hash: str) -> ApiKey | ... method touch_api_key (line 289) | async def touch_api_key(self, key_id: str) -> None: method revoke_api_key (line 294) | async def revoke_api_key(self, key_id: str) -> bool: method delete_api_key (line 302) | async def delete_api_key(self, key_id: str) -> bool: method insert_persona (line 310) | async def insert_persona( method get_persona_by_id (line 336) | async def get_persona_by_id(self, persona_id: str) -> Persona: method get_personas (line 341) | async def get_personas(self) -> list[Persona]: method update_persona (line 346) | async def update_persona( method delete_persona (line 359) | async def delete_persona(self, persona_id: str) -> None: method insert_persona_folder (line 368) | async def insert_persona_folder( method get_persona_folder_by_id (line 379) | async def get_persona_folder_by_id(self, folder_id: str) -> PersonaFol... method get_persona_folders (line 384) | async def get_persona_folders( method get_all_persona_folders (line 391) | async def get_all_persona_folders(self) -> list[PersonaFolder]: method update_persona_folder (line 396) | async def update_persona_folder( method delete_persona_folder (line 408) | async def delete_persona_folder(self, folder_id: str) -> None: method move_persona_to_folder (line 413) | async def move_persona_to_folder( method get_personas_by_folder (line 420) | async def get_personas_by_folder( method batch_update_sort_order (line 427) | async def batch_update_sort_order( method insert_preference_or_update (line 442) | async def insert_preference_or_update( method get_preference (line 453) | async def get_preference(self, scope: str, scope_id: str, key: str) ->... method get_preferences (line 458) | async def get_preferences( method remove_preference (line 468) | async def remove_preference(self, scope: str, scope_id: str, key: str)... method clear_preferences (line 473) | async def clear_preferences(self, scope: str, scope_id: str) -> None: method get_command_configs (line 478) | async def get_command_configs(self) -> list[CommandConfig]: method get_command_config (line 483) | async def get_command_config(self, handler_full_name: str) -> CommandC... method upsert_command_config (line 488) | async def upsert_command_config( method delete_command_config (line 508) | async def delete_command_config(self, handler_full_name: str) -> None: method delete_command_configs (line 513) | async def delete_command_configs(self, handler_full_names: list[str]) ... method list_command_conflicts (line 518) | async def list_command_conflicts( method upsert_command_conflict (line 526) | async def upsert_command_conflict( method delete_command_conflicts (line 543) | async def delete_command_conflicts(self, ids: list[int]) -> None: method get_session_conversations (line 566) | async def get_session_conversations( method create_cron_job (line 581) | async def create_cron_job( method update_cron_job (line 600) | async def update_cron_job( method delete_cron_job (line 621) | async def delete_cron_job(self, job_id: str) -> None: method get_cron_job (line 626) | async def get_cron_job(self, job_id: str) -> CronJob | None: method list_cron_jobs (line 631) | async def list_cron_jobs(self, job_type: str | None = None) -> list[Cr... method create_platform_session (line 640) | async def create_platform_session( method get_platform_session_by_id (line 652) | async def get_platform_session_by_id( method get_platform_sessions_by_ids (line 659) | async def get_platform_sessions_by_ids( method get_platform_sessions_by_creator (line 666) | async def get_platform_sessions_by_creator( method get_platform_sessions_by_creator_paginated (line 680) | async def get_platform_sessions_by_creator_paginated( method update_platform_session (line 696) | async def update_platform_session( method delete_platform_session (line 705) | async def delete_platform_session(self, session_id: str) -> None: method create_chatui_project (line 714) | async def create_chatui_project( method get_chatui_project_by_id (line 725) | async def get_chatui_project_by_id(self, project_id: str) -> ChatUIPro... method get_chatui_projects_by_creator (line 730) | async def get_chatui_projects_by_creator( method update_chatui_project (line 740) | async def update_chatui_project( method delete_chatui_project (line 751) | async def delete_chatui_project(self, project_id: str) -> None: method add_session_to_project (line 756) | async def add_session_to_project( method remove_session_from_project (line 765) | async def remove_session_from_project(self, session_id: str) -> None: method get_project_sessions (line 770) | async def get_project_sessions( method get_project_by_session (line 780) | async def get_project_by_session( FILE: astrbot/core/db/migration/helper.py function check_migration_needed_v4 (line 17) | async def check_migration_needed_v4(db_helper: BaseDatabase) -> bool: function do_migration_v4 (line 37) | async def do_migration_v4( FILE: astrbot/core/db/migration/migra_3_to_4.py function get_platform_id (line 23) | def get_platform_id( function get_platform_type (line 33) | def get_platform_type( function migration_conversation_table (line 43) | async def migration_conversation_table( function migration_platform_table (line 101) | async def migration_platform_table( function migration_webchat_data (line 180) | async def migration_webchat_data( function migration_persona_data (line 236) | async def migration_persona_data( function migration_preferences (line 279) | async def migration_preferences( FILE: astrbot/core/db/migration/migra_45_to_46.py function migrate_45_to_46 (line 6) | async def migrate_45_to_46(acm: AstrBotConfigManager, ucr: UmopConfigRou... FILE: astrbot/core/db/migration/migra_token_usage.py function migrate_token_usage (line 15) | async def migrate_token_usage(db_helper: BaseDatabase) -> None: FILE: astrbot/core/db/migration/migra_webchat_session.py function migrate_webchat_session (line 20) | async def migrate_webchat_session(db_helper: BaseDatabase) -> None: FILE: astrbot/core/db/migration/shared_preferences_v3.py class SharedPreferences (line 10) | class SharedPreferences: method __init__ (line 11) | def __init__(self, path=None) -> None: method _load_preferences (line 17) | def _load_preferences(self): method _save_preferences (line 26) | def _save_preferences(self) -> None: method get (line 31) | def get(self, key, default: _VT = None) -> _VT: method put (line 34) | def put(self, key, value) -> None: method remove (line 38) | def remove(self, key) -> None: method clear (line 43) | def clear(self) -> None: FILE: astrbot/core/db/migration/sqlite_v3.py class Conversation (line 10) | class Conversation: class SQLiteDatabase (line 81) | class SQLiteDatabase: method __init__ (line 82) | def __init__(self, db_path: str) -> None: method _get_conn (line 125) | def _get_conn(self, db_path: str) -> sqlite3.Connection: method _exec_sql (line 130) | def _exec_sql(self, sql: str, params: tuple | None = None) -> None: method insert_platform_metrics (line 147) | def insert_platform_metrics(self, metrics: dict) -> None: method insert_llm_metrics (line 156) | def insert_llm_metrics(self, metrics: dict) -> None: method get_base_stats (line 165) | def get_base_stats(self, offset_sec: int = 86400) -> Stats: method get_total_message_count (line 189) | def get_total_message_count(self) -> int: method get_grouped_base_stats (line 204) | def get_grouped_base_stats(self, offset_sec: int = 86400) -> Stats: method get_conversation_by_user_id (line 229) | def get_conversation_by_user_id( method new_conversation (line 252) | def new_conversation(self, user_id: str, cid: str) -> None: method get_conversations (line 263) | def get_conversations(self, user_id: str) -> list[Conversation]: method update_conversation (line 290) | def update_conversation(self, user_id: str, cid: str, history: str) ->... method update_conversation_title (line 300) | def update_conversation_title(self, user_id: str, cid: str, title: str... method update_conversation_persona_id (line 308) | def update_conversation_persona_id( method delete_conversation (line 318) | def delete_conversation(self, user_id: str, cid: str) -> None: method get_all_conversations (line 326) | def get_all_conversations( method get_filtered_conversations (line 387) | def get_filtered_conversations( FILE: astrbot/core/db/po.py class TimestampMixin (line 9) | class TimestampMixin(SQLModel): class PlatformStat (line 17) | class PlatformStat(SQLModel, table=True): class ConversationV2 (line 41) | class ConversationV2(TimestampMixin, SQLModel, table=True): class PersonaFolder (line 75) | class PersonaFolder(TimestampMixin, SQLModel, table=True): class Persona (line 108) | class Persona(TimestampMixin, SQLModel, table=True): class CronJob (line 144) | class CronJob(TimestampMixin, SQLModel, table=True): class Preference (line 175) | class Preference(TimestampMixin, SQLModel, table=True): class PlatformMessageHistory (line 202) | class PlatformMessageHistory(TimestampMixin, SQLModel, table=True): class PlatformSession (line 225) | class PlatformSession(TimestampMixin, SQLModel, table=True): class Attachment (line 262) | class Attachment(TimestampMixin, SQLModel, table=True): class ApiKey (line 293) | class ApiKey(TimestampMixin, SQLModel, table=True): class ChatUIProject (line 330) | class ChatUIProject(TimestampMixin, SQLModel, table=True): class SessionProjectRelation (line 366) | class SessionProjectRelation(SQLModel, table=True): class CommandConfig (line 389) | class CommandConfig(TimestampMixin, SQLModel, table=True): class CommandConflict (line 411) | class CommandConflict(TimestampMixin, SQLModel, table=True): class Conversation (line 439) | class Conversation: class Personality (line 462) | class Personality(TypedDict): class Platform (line 491) | class Platform: class Stats (line 500) | class Stats: FILE: astrbot/core/db/sqlite.py class SQLiteDatabase (line 41) | class SQLiteDatabase(BaseDatabase): method __init__ (line 42) | def __init__(self, db_path: str) -> None: method initialize (line 48) | async def initialize(self) -> None: method _ensure_persona_folder_columns (line 64) | async def _ensure_persona_folder_columns(self, conn) -> None: method _ensure_persona_skills_column (line 84) | async def _ensure_persona_skills_column(self, conn) -> None: method _ensure_persona_custom_error_message_column (line 96) | async def _ensure_persona_custom_error_message_column(self, conn) -> N... method insert_platform_stats (line 110) | async def insert_platform_stats( method count_platform_stats (line 143) | async def count_platform_stats(self) -> int: method get_platform_stats (line 155) | async def get_platform_stats(self, offset_sec: int = 86400) -> list[Pl... method get_conversations (line 176) | async def get_conversations(self, user_id=None, platform_id=None): method get_conversation_by_id (line 191) | async def get_conversation_by_id(self, cid): method get_all_conversations (line 198) | async def get_all_conversations(self, page=1, page_size=20): method get_filtered_conversations (line 210) | async def get_filtered_conversations( method create_conversation (line 264) | async def create_conversation( method update_conversation (line 296) | async def update_conversation( method delete_conversation (line 320) | async def delete_conversation(self, cid) -> None: method delete_conversations_by_user_id (line 330) | async def delete_conversations_by_user_id(self, user_id: str) -> None: method get_session_conversations (line 340) | async def get_session_conversations( method insert_platform_message_history (line 449) | async def insert_platform_message_history( method delete_platform_message_offset (line 471) | async def delete_platform_message_offset( method get_platform_message_history (line 491) | async def get_platform_message_history( method get_platform_message_history_by_id (line 513) | async def get_platform_message_history_by_id( method insert_attachment (line 525) | async def insert_attachment(self, path, type, mime_type): method get_attachment_by_id (line 538) | async def get_attachment_by_id(self, attachment_id): method get_attachments (line 546) | async def get_attachments(self, attachment_ids: list[str]) -> list: method delete_attachment (line 558) | async def delete_attachment(self, attachment_id: str) -> bool: method delete_attachments (line 572) | async def delete_attachments(self, attachment_ids: list[str]) -> int: method create_api_key (line 588) | async def create_api_key( method list_api_keys (line 614) | async def list_api_keys(self) -> list[ApiKey]: method get_api_key_by_id (line 623) | async def get_api_key_by_id(self, key_id: str) -> ApiKey | None: method get_active_api_key_by_hash (line 632) | async def get_active_api_key_by_hash(self, key_hash: str) -> ApiKey | ... method touch_api_key (line 645) | async def touch_api_key(self, key_id: str) -> None: method revoke_api_key (line 656) | async def revoke_api_key(self, key_id: str) -> bool: method delete_api_key (line 669) | async def delete_api_key(self, key_id: str) -> bool: method insert_persona (line 682) | async def insert_persona( method get_persona_by_id (line 712) | async def get_persona_by_id(self, persona_id): method get_personas (line 720) | async def get_personas(self): method update_persona (line 728) | async def update_persona( method delete_persona (line 759) | async def delete_persona(self, persona_id) -> None: method insert_persona_folder (line 772) | async def insert_persona_folder( method get_persona_folder_by_id (line 794) | async def get_persona_folder_by_id(self, folder_id: str) -> PersonaFol... method get_persona_folders (line 802) | async def get_persona_folders( method get_all_persona_folders (line 829) | async def get_all_persona_folders(self) -> list[PersonaFolder]: method update_persona_folder (line 839) | async def update_persona_folder( method delete_persona_folder (line 869) | async def delete_persona_folder(self, folder_id: str) -> None: method move_persona_to_folder (line 891) | async def move_persona_to_folder( method get_personas_by_folder (line 905) | async def get_personas_by_folder( method batch_update_sort_order (line 930) | async def batch_update_sort_order( method insert_preference_or_update (line 969) | async def insert_preference_or_update(self, scope, scope_id, key, value): method get_preference (line 993) | async def get_preference(self, scope, scope_id, key): method get_preferences (line 1005) | async def get_preferences(self, scope, scope_id=None, key=None): method remove_preference (line 1017) | async def remove_preference(self, scope, scope_id, key) -> None: method clear_preferences (line 1031) | async def clear_preferences(self, scope, scope_id) -> None: method _run_in_tx (line 1048) | async def _run_in_tx( method _apply_updates (line 1058) | def _apply_updates(model, **updates) -> None: method _new_command_config (line 1064) | def _new_command_config( method _new_command_conflict (line 1097) | def _new_command_conflict( method get_command_configs (line 1121) | async def get_command_configs(self) -> list[CommandConfig]: method get_command_config (line 1127) | async def get_command_config( method upsert_command_config (line 1135) | async def upsert_command_config( method delete_command_config (line 1190) | async def delete_command_config(self, handler_full_name: str) -> None: method delete_command_configs (line 1193) | async def delete_command_configs(self, handler_full_names: list[str]) ... method list_command_conflicts (line 1206) | async def list_command_conflicts( method upsert_command_conflict (line 1218) | async def upsert_command_conflict( method delete_command_conflicts (line 1269) | async def delete_command_conflicts(self, ids: list[int]) -> None: method get_base_stats (line 1284) | def get_base_stats(self, offset_sec=86400): method get_total_message_count (line 1318) | def get_total_message_count(self): method get_grouped_base_stats (line 1341) | def get_grouped_base_stats(self, offset_sec=86400): method create_platform_session (line 1380) | async def create_platform_session( method get_platform_session_by_id (line 1408) | async def get_platform_session_by_id( method get_platform_sessions_by_ids (line 1420) | async def get_platform_sessions_by_ids( method get_platform_sessions_by_creator (line 1435) | async def get_platform_sessions_by_creator( method _build_platform_sessions_query (line 1459) | def _build_platform_sessions_query( method _rows_to_session_dicts (line 1491) | def _rows_to_session_dicts(rows: T.Sequence[Row[tuple]]) -> list[dict]: method get_platform_sessions_by_creator_paginated (line 1509) | async def get_platform_sessions_by_creator_paginated( method update_platform_session (line 1543) | async def update_platform_session( method delete_platform_session (line 1562) | async def delete_platform_session(self, session_id: str) -> None: method create_chatui_project (line 1577) | async def create_chatui_project( method get_chatui_project_by_id (line 1599) | async def get_chatui_project_by_id(self, project_id: str) -> ChatUIPro... method get_chatui_projects_by_creator (line 1610) | async def get_chatui_projects_by_creator( method update_chatui_project (line 1629) | async def update_chatui_project( method delete_chatui_project (line 1654) | async def delete_chatui_project(self, project_id: str) -> None: method add_session_to_project (line 1672) | async def add_session_to_project( method remove_session_from_project (line 1697) | async def remove_session_from_project(self, session_id: str) -> None: method get_project_sessions (line 1708) | async def get_project_sessions( method get_project_by_session (line 1732) | async def get_project_by_session( method create_cron_job (line 1756) | async def create_cron_job( method update_cron_job (line 1793) | async def update_cron_job( method delete_cron_job (line 1844) | async def delete_cron_job(self, job_id: str) -> None: method get_cron_job (line 1852) | async def get_cron_job(self, job_id: str) -> CronJob | None: method list_cron_jobs (line 1860) | async def list_cron_jobs(self, job_type: str | None = None) -> list[Cr... FILE: astrbot/core/db/vec_db/base.py class Result (line 6) | class Result: class BaseVecDB (line 11) | class BaseVecDB: method initialize (line 12) | async def initialize(self) -> None: method insert (line 16) | async def insert( method insert_batch (line 26) | async def insert_batch( method retrieve (line 45) | async def retrieve( method delete (line 63) | async def delete(self, doc_id: str) -> bool: method close (line 73) | async def close(self): ... FILE: astrbot/core/db/vec_db/faiss_impl/document_storage.py class BaseDocModel (line 14) | class BaseDocModel(SQLModel, table=False): class Document (line 18) | class Document(BaseDocModel, table=True): class DocumentStorage (line 35) | class DocumentStorage: method __init__ (line 36) | def __init__(self, db_path: str) -> None: method initialize (line 46) | async def initialize(self) -> None: method connect (line 83) | async def connect(self) -> None: method get_session (line 98) | async def get_session(self): method get_documents (line 103) | async def get_documents( method insert_document (line 151) | async def insert_document(self, doc_id: str, text: str, metadata: dict... method insert_documents_batch (line 177) | async def insert_documents_batch( method delete_document_by_doc_id (line 214) | async def delete_document_by_doc_id(self, doc_id: str) -> None: method get_document_by_doc_id (line 231) | async def get_document_by_doc_id(self, doc_id: str): method update_document_by_doc_id (line 252) | async def update_document_by_doc_id(self, doc_id: str, new_text: str) ... method delete_documents (line 272) | async def delete_documents(self, metadata_filters: dict) -> None: method count_documents (line 299) | async def count_documents(self, metadata_filters: dict | None = None) ... method get_user_ids (line 326) | async def get_user_ids(self) -> list[str]: method _document_to_dict (line 343) | def _document_to_dict(self, document: Document) -> dict: method tuple_to_dict (line 366) | async def tuple_to_dict(self, row): method close (line 387) | async def close(self) -> None: FILE: astrbot/core/db/vec_db/faiss_impl/embedding_storage.py class EmbeddingStorage (line 12) | class EmbeddingStorage: method __init__ (line 13) | def __init__(self, dimension: int, path: str | None = None) -> None: method insert (line 23) | async def insert(self, vector: np.ndarray, id: int) -> None: method insert_batch (line 41) | async def insert_batch(self, vectors: np.ndarray, ids: list[int]) -> N... method search (line 59) | async def search(self, vector: np.ndarray, k: int) -> tuple: method delete (line 74) | async def delete(self, ids: list[int]) -> None: method save_index (line 86) | async def save_index(self) -> None: FILE: astrbot/core/db/vec_db/faiss_impl/sqlite_init.sql type documents (line 2) | CREATE TABLE documents ( type idx_documents_user_id (line 16) | CREATE INDEX idx_documents_user_id ON documents(user_id) type idx_documents_group_id (line 17) | CREATE INDEX idx_documents_group_id ON documents(group_id) FILE: astrbot/core/db/vec_db/faiss_impl/vec_db.py class FaissVecDB (line 14) | class FaissVecDB(BaseVecDB): method __init__ (line 17) | def __init__( method initialize (line 35) | async def initialize(self) -> None: method insert (line 38) | async def insert( method insert_batch (line 58) | async def insert_batch( method retrieve (line 103) | async def retrieve( method delete (line 168) | async def delete(self, doc_id: str) -> None: method close (line 180) | async def close(self) -> None: method count_documents (line 183) | async def count_documents(self, metadata_filter: dict | None = None) -... method delete_documents (line 195) | async def delete_documents(self, metadata_filters: dict) -> None: FILE: astrbot/core/event_bus.py class EventBus (line 23) | class EventBus: method __init__ (line 26) | def __init__( method dispatch (line 37) | async def dispatch(self) -> None: method _print_event (line 52) | def _print_event(self, event: AstrMessageEvent, conf_name: str) -> None: FILE: astrbot/core/exceptions.py class AstrBotError (line 4) | class AstrBotError(Exception): class ProviderNotFoundError (line 8) | class ProviderNotFoundError(AstrBotError): FILE: astrbot/core/file_token_service.py class FileTokenService (line 9) | class FileTokenService: method __init__ (line 12) | def __init__(self, default_timeout: float = 300) -> None: method _cleanup_expired_tokens (line 17) | async def _cleanup_expired_tokens(self) -> None: method check_token_expired (line 26) | async def check_token_expired(self, file_token: str) -> bool: method register_file (line 31) | async def register_file(self, file_path: str, timeout: float | None = ... method handle_file (line 75) | async def handle_file(self, file_token: str) -> str: FILE: astrbot/core/initial_loader.py class InitialLoader (line 17) | class InitialLoader: method __init__ (line 20) | def __init__(self, db: BaseDatabase, log_broker: LogBroker) -> None: method start (line 26) | async def start(self) -> None: FILE: astrbot/core/knowledge_base/chunking/base.py class BaseChunker (line 9) | class BaseChunker(ABC): method chunk (line 16) | async def chunk(self, text: str, **kwargs) -> list[str]: FILE: astrbot/core/knowledge_base/chunking/fixed_size.py class FixedSizeChunker (line 9) | class FixedSizeChunker(BaseChunker): method __init__ (line 15) | def __init__(self, chunk_size: int = 512, chunk_overlap: int = 50) -> ... method chunk (line 26) | async def chunk(self, text: str, **kwargs) -> list[str]: FILE: astrbot/core/knowledge_base/chunking/recursive.py class RecursiveCharacterChunker (line 6) | class RecursiveCharacterChunker(BaseChunker): method __init__ (line 7) | def __init__( method chunk (line 42) | async def chunk(self, text: str, **kwargs) -> list[str]: method _split_by_character (line 137) | def _split_by_character( FILE: astrbot/core/knowledge_base/kb_db_sqlite.py class KBSQLiteDatabase (line 19) | class KBSQLiteDatabase: method __init__ (line 20) | def __init__(self, db_path: str | None = None) -> None: method get_db (line 52) | async def get_db(self): method initialize (line 63) | async def initialize(self) -> None: method migrate_to_v1 (line 80) | async def migrate_to_v1(self) -> None: method close (line 167) | async def close(self) -> None: method get_kb_by_id (line 172) | async def get_kb_by_id(self, kb_id: str) -> KnowledgeBase | None: method get_kb_by_name (line 179) | async def get_kb_by_name(self, kb_name: str) -> KnowledgeBase | None: method list_kbs (line 186) | async def list_kbs(self, offset: int = 0, limit: int = 100) -> list[Kn... method count_kbs (line 198) | async def count_kbs(self) -> int: method get_document_by_id (line 207) | async def get_document_by_id(self, doc_id: str) -> KBDocument | None: method list_documents_by_kb (line 214) | async def list_documents_by_kb( method count_documents_by_kb (line 232) | async def count_documents_by_kb(self, kb_id: str) -> int: method get_document_with_metadata (line 241) | async def get_document_with_metadata(self, doc_id: str) -> dict | None: method get_documents_with_metadata_batch (line 259) | async def get_documents_with_metadata_batch( method delete_document_by_id (line 299) | async def delete_document_by_id(self, doc_id: str, vec_db: FaissVecDB)... method list_media_by_doc (line 313) | async def list_media_by_doc(self, doc_id: str) -> list[KBMedia]: method get_media_by_id (line 320) | async def get_media_by_id(self, media_id: str) -> KBMedia | None: method update_kb_stats (line 327) | async def update_kb_stats(self, kb_id: str, vec_db: FaissVecDB) -> None: FILE: astrbot/core/knowledge_base/kb_helper.py class RateLimiter (line 31) | class RateLimiter: method __init__ (line 34) | def __init__(self, max_rpm: int) -> None: method __aenter__ (line 39) | async def __aenter__(self): method __aexit__ (line 51) | async def __aexit__(self, exc_type, exc_val, exc_tb): function _repair_and_translate_chunk_with_retry (line 55) | async def _repair_and_translate_chunk_with_retry( class KBHelper (line 108) | class KBHelper: method __init__ (line 112) | def __init__( method initialize (line 133) | async def initialize(self) -> None: method get_ep (line 136) | async def get_ep(self) -> EmbeddingProvider: method get_rp (line 148) | async def get_rp(self) -> RerankProvider | None: method _ensure_vec_db (line 160) | async def _ensure_vec_db(self) -> FaissVecDB: method delete_vec_db (line 177) | async def delete_vec_db(self) -> None: method terminate (line 185) | async def terminate(self) -> None: method upload_document (line 189) | async def upload_document( method list_documents (line 349) | async def list_documents( method get_document (line 358) | async def get_document(self, doc_id: str) -> KBDocument | None: method delete_document (line 363) | async def delete_document(self, doc_id: str) -> None: method delete_chunk (line 375) | async def delete_chunk(self, chunk_id: str, doc_id: str) -> None: method refresh_kb (line 386) | async def refresh_kb(self) -> None: method refresh_document (line 392) | async def refresh_document(self, doc_id: str) -> None: method get_chunks_by_doc_id (line 405) | async def get_chunks_by_doc_id( method get_chunk_count_by_doc_id (line 433) | async def get_chunk_count_by_doc_id(self, doc_id: str) -> int: method _save_media (line 439) | async def _save_media( method upload_from_url (line 470) | async def upload_from_url( method _clean_and_rechunk_content (line 561) | async def _clean_and_rechunk_content( FILE: astrbot/core/knowledge_base/kb_mgr.py class KnowledgeBaseManager (line 23) | class KnowledgeBaseManager: method __init__ (line 27) | def __init__( method initialize (line 37) | async def initialize(self) -> None: method _init_kb_database (line 62) | async def _init_kb_database(self) -> None: method load_kbs (line 68) | async def load_kbs(self) -> None: method create_kb (line 82) | async def create_kb( method get_kb (line 131) | async def get_kb(self, kb_id: str) -> KBHelper | None: method get_kb_by_name (line 136) | async def get_kb_by_name(self, kb_name: str) -> KBHelper | None: method delete_kb (line 143) | async def delete_kb(self, kb_id: str) -> bool: method list_kbs (line 157) | async def list_kbs(self) -> list[KnowledgeBase]: method update_kb (line 162) | async def update_kb( method retrieve (line 208) | async def retrieve( method _format_context (line 258) | def _format_context(self, results: list[RetrievalResult]) -> str: method terminate (line 279) | async def terminate(self) -> None: method upload_from_url (line 296) | async def upload_from_url( FILE: astrbot/core/knowledge_base/models.py class BaseKBModel (line 7) | class BaseKBModel(SQLModel, table=False): class KnowledgeBase (line 11) | class KnowledgeBase(BaseKBModel, table=True): class KBDocument (line 59) | class KBDocument(BaseKBModel, table=True): class KBMedia (line 93) | class KBMedia(BaseKBModel, table=True): FILE: astrbot/core/knowledge_base/parsers/base.py class MediaItem (line 11) | class MediaItem: class ParseResult (line 24) | class ParseResult: class BaseParser (line 34) | class BaseParser(ABC): method parse (line 41) | async def parse(self, file_content: bytes, file_name: str) -> ParseRes... FILE: astrbot/core/knowledge_base/parsers/markitdown_parser.py class MarkitdownParser (line 12) | class MarkitdownParser(BaseParser): method parse (line 15) | async def parse(self, file_content: bytes, file_name: str) -> ParseRes... FILE: astrbot/core/knowledge_base/parsers/pdf_parser.py class PDFParser (line 17) | class PDFParser(BaseParser): method parse (line 23) | async def parse(self, file_content: bytes, file_name: str) -> ParseRes... FILE: astrbot/core/knowledge_base/parsers/text_parser.py class TextParser (line 9) | class TextParser(BaseParser): method parse (line 15) | async def parse(self, file_content: bytes, file_name: str) -> ParseRes... FILE: astrbot/core/knowledge_base/parsers/url_parser.py class URLExtractor (line 6) | class URLExtractor: method __init__ (line 9) | def __init__(self, tavily_keys: list[str]) -> None: method _get_tavily_key (line 23) | async def _get_tavily_key(self) -> str: method extract_text_from_url (line 30) | async def extract_text_from_url(self, url: str) -> str: function extract_text_from_url (line 91) | async def extract_text_from_url(url: str, tavily_keys: list[str]) -> str: FILE: astrbot/core/knowledge_base/parsers/util.py function select_parser (line 4) | async def select_parser(ext: str) -> BaseParser: FILE: astrbot/core/knowledge_base/retrieval/manager.py class RetrievalResult (line 21) | class RetrievalResult: class RetrievalManager (line 34) | class RetrievalManager: method __init__ (line 42) | def __init__( method retrieve (line 61) | async def retrieve( method _dense_retrieve (line 196) | async def _dense_retrieve( method _rerank (line 242) | async def _rerank( FILE: astrbot/core/knowledge_base/retrieval/rank_fusion.py class FusedResult (line 15) | class FusedResult: class RankFusion (line 26) | class RankFusion: method __init__ (line 34) | def __init__(self, kb_db: KBSQLiteDatabase, k: int = 60) -> None: method fuse (line 45) | async def fuse( FILE: astrbot/core/knowledge_base/retrieval/sparse_retriever.py class SparseResult (line 18) | class SparseResult: class SparseRetriever (line 29) | class SparseRetriever: method __init__ (line 37) | def __init__(self, kb_db: KBSQLiteDatabase) -> None: method retrieve (line 55) | async def retrieve( FILE: astrbot/core/log.py class _RecordEnricherFilter (line 23) | class _RecordEnricherFilter(logging.Filter): method filter (line 26) | def filter(self, record: logging.LogRecord) -> bool: class _QueueAnsiColorFilter (line 38) | class _QueueAnsiColorFilter(logging.Filter): method filter (line 49) | def filter(self, record: logging.LogRecord) -> bool: function _is_plugin_path (line 55) | def _is_plugin_path(pathname: str | None) -> bool: function _get_short_level_name (line 62) | def _get_short_level_name(level_name: str) -> str: function _build_source_file (line 73) | def _build_source_file(pathname: str | None) -> str: function _patch_record (line 82) | def _patch_record(record: "Record") -> None: class _LoguruInterceptHandler (line 96) | class _LoguruInterceptHandler(logging.Handler): method emit (line 99) | def emit(self, record: logging.LogRecord) -> None: class LogBroker (line 126) | class LogBroker: method __init__ (line 129) | def __init__(self) -> None: method register (line 133) | def register(self) -> Queue: method unregister (line 138) | def unregister(self, q: Queue) -> None: method publish (line 141) | def publish(self, log_entry: dict) -> None: class LogQueueHandler (line 150) | class LogQueueHandler(logging.Handler): method __init__ (line 153) | def __init__(self, log_broker: LogBroker) -> None: method emit (line 157) | def emit(self, record: logging.LogRecord) -> None: class LogManager (line 168) | class LogManager: method _default_log_path (line 185) | def _default_log_path(cls) -> str: method _resolve_log_path (line 189) | def _resolve_log_path(cls, configured_path: str | None) -> str: method _setup_loguru (line 197) | def _setup_loguru(cls) -> None: method _setup_root_bridge (line 216) | def _setup_root_bridge(cls) -> None: method _ensure_logger_enricher_filter (line 232) | def _ensure_logger_enricher_filter(cls, logger: logging.Logger) -> None: method _ensure_logger_intercept_handler (line 243) | def _ensure_logger_intercept_handler(cls, logger: logging.Logger) -> N... method GetLogger (line 254) | def GetLogger(cls, log_name: str = "default") -> logging.Logger: method set_queue_handler (line 266) | def set_queue_handler(cls, logger: logging.Logger, log_broker: LogBrok... method _remove_sink (line 286) | def _remove_sink(cls, sink_id: int | None) -> None: method _add_file_sink (line 295) | def _add_file_sink( method configure_logger (line 340) | def configure_logger( method configure_trace_logger (line 384) | def configure_trace_logger(cls, config: dict | None) -> None: FILE: astrbot/core/message/components.py class ComponentType (line 42) | class ComponentType(str, Enum): class BaseMessageComponent (line 70) | class BaseMessageComponent(BaseModel): method __init__ (line 73) | def __init__(self, **kwargs) -> None: method toDict (line 76) | def toDict(self): method to_dict (line 86) | async def to_dict(self) -> dict: class Plain (line 91) | class Plain(BaseMessageComponent): method __init__ (line 96) | def __init__(self, text: str, convert: bool = True, **_) -> None: method toDict (line 99) | def toDict(self) -> dict: method to_dict (line 102) | async def to_dict(self) -> dict: class Face (line 106) | class Face(BaseMessageComponent): method __init__ (line 110) | def __init__(self, **_) -> None: class Record (line 114) | class Record(BaseMessageComponent): method __init__ (line 127) | def __init__(self, file: str | None, **_) -> None: method fromFileSystem (line 135) | def fromFileSystem(path, **_): method fromURL (line 139) | def fromURL(url: str, **_): method fromBase64 (line 145) | def fromBase64(bs64_data: str, **_): method convert_to_file_path (line 148) | async def convert_to_file_path(self) -> str: method convert_to_base64 (line 175) | async def convert_to_base64(self) -> str: method register_to_file_service (line 199) | async def register_to_file_service(self) -> str: class Video (line 223) | class Video(BaseMessageComponent): method __init__ (line 231) | def __init__(self, file: str, **_) -> None: method fromFileSystem (line 235) | def fromFileSystem(path, **_): method fromURL (line 239) | def fromURL(url: str, **_): method convert_to_file_path (line 244) | async def convert_to_file_path(self) -> str: method register_to_file_service (line 266) | async def register_to_file_service(self) -> str: method to_dict (line 289) | async def to_dict(self): class At (line 309) | class At(BaseMessageComponent): method __init__ (line 314) | def __init__(self, **_) -> None: method toDict (line 317) | def toDict(self): class AtAll (line 324) | class AtAll(At): method __init__ (line 327) | def __init__(self, **_) -> None: class RPS (line 331) | class RPS(BaseMessageComponent): # TODO method __init__ (line 334) | def __init__(self, **_) -> None: class Dice (line 338) | class Dice(BaseMessageComponent): # TODO method __init__ (line 341) | def __init__(self, **_) -> None: class Shake (line 345) | class Shake(BaseMessageComponent): # TODO method __init__ (line 348) | def __init__(self, **_) -> None: class Share (line 352) | class Share(BaseMessageComponent): method __init__ (line 359) | def __init__(self, **_) -> None: class Contact (line 363) | class Contact(BaseMessageComponent): # TODO method __init__ (line 368) | def __init__(self, **_) -> None: class Location (line 372) | class Location(BaseMessageComponent): # TODO method __init__ (line 379) | def __init__(self, **_) -> None: class Music (line 383) | class Music(BaseMessageComponent): method __init__ (line 393) | def __init__(self, **_) -> None: class Image (line 400) | class Image(BaseMessageComponent): method __init__ (line 413) | def __init__(self, file: str | None, **_) -> None: method fromURL (line 417) | def fromURL(url: str, **_): method fromFileSystem (line 423) | def fromFileSystem(path, **_): method fromBase64 (line 427) | def fromBase64(base64: str, **_): method fromBytes (line 431) | def fromBytes(byte: bytes): method fromIO (line 435) | def fromIO(IO): method convert_to_file_path (line 438) | async def convert_to_file_path(self) -> str: method convert_to_base64 (line 466) | async def convert_to_base64(self) -> str: method register_to_file_service (line 491) | async def register_to_file_service(self) -> str: class Reply (line 515) | class Reply(BaseMessageComponent): method __init__ (line 537) | def __init__(self, **_) -> None: class Poke (line 541) | class Poke(BaseMessageComponent): method __init__ (line 547) | def __init__(self, poke_type: str | int | None = None, **_) -> None: method target_id (line 556) | def target_id(self) -> str | None: method toDict (line 566) | def toDict(self): class Forward (line 574) | class Forward(BaseMessageComponent): method __init__ (line 578) | def __init__(self, **_) -> None: class Node (line 582) | class Node(BaseMessageComponent): method __init__ (line 593) | def __init__(self, content: list[BaseMessageComponent], **_) -> None: method to_dict (line 599) | async def to_dict(self): class Nodes (line 636) | class Nodes(BaseMessageComponent): method __init__ (line 640) | def __init__(self, nodes: list[Node], **_) -> None: method toDict (line 643) | def toDict(self): method to_dict (line 653) | async def to_dict(self) -> dict: class Json (line 662) | class Json(BaseMessageComponent): method __init__ (line 666) | def __init__(self, data: str | dict, **_) -> None: class Unknown (line 672) | class Unknown(BaseMessageComponent): class File (line 677) | class File(BaseMessageComponent): method __init__ (line 685) | def __init__(self, name: str, file: str = "", url: str = "") -> None: method file (line 690) | def file(self) -> str: method file (line 724) | def file(self, value: str) -> None: method get_file (line 736) | async def get_file(self, allow_return_url: bool = False) -> str: method _download_file (line 784) | async def _download_file(self) -> None: method register_to_file_service (line 798) | async def register_to_file_service(self) -> str: method to_dict (line 821) | async def to_dict(self): class WechatEmoji (line 842) | class WechatEmoji(BaseMessageComponent): method __init__ (line 848) | def __init__(self, **_) -> None: FILE: astrbot/core/message/message_event_result.py class MessageChain (line 18) | class MessageChain: method message (line 33) | def message(self, message: str): method at (line 44) | def at(self, name: str, qq: str | int): method at_all (line 55) | def at_all(self): method error (line 67) | def error(self, message: str): method url_image (line 77) | def url_image(self, url: str): method file_image (line 90) | def file_image(self, path: str): method base64_image (line 102) | def base64_image(self, base64_str: str): method use_t2i (line 111) | def use_t2i(self, use_t2i: bool): method get_plain_text (line 121) | def get_plain_text(self, with_other_comps_mark: bool = False) -> str: method squash_plain (line 142) | def squash_plain(self): class EventResultType (line 167) | class EventResultType(enum.Enum): class ResultContentType (line 180) | class ResultContentType(enum.Enum): class MessageEventResult (line 196) | class MessageEventResult(MessageChain): method stop_event (line 218) | def stop_event(self) -> "MessageEventResult": method continue_event (line 223) | def continue_event(self) -> "MessageEventResult": method is_stopped (line 228) | def is_stopped(self) -> bool: method set_async_stream (line 232) | def set_async_stream(self, stream: AsyncGenerator) -> "MessageEventRes... method set_result_content_type (line 237) | def set_result_content_type(self, typ: ResultContentType) -> "MessageE... method is_llm_result (line 247) | def is_llm_result(self) -> bool: method is_model_result (line 251) | def is_model_result(self) -> bool: FILE: astrbot/core/persona_error_reply.py function normalize_persona_custom_error_message (line 9) | def normalize_persona_custom_error_message(value: object) -> str | None: function extract_persona_custom_error_message_from_persona (line 17) | def extract_persona_custom_error_message_from_persona( function extract_persona_custom_error_message_from_event (line 26) | def extract_persona_custom_error_message_from_event(event: Any) -> str |... function set_persona_custom_error_message_on_event (line 37) | def set_persona_custom_error_message_on_event( function resolve_persona_custom_error_message (line 50) | async def resolve_persona_custom_error_message( function resolve_event_conversation_persona_id (line 72) | async def resolve_event_conversation_persona_id( FILE: astrbot/core/persona_mgr.py class PersonaManager (line 22) | class PersonaManager: method __init__ (line 23) | def __init__(self, db_helper: BaseDatabase, acm: AstrBotConfigManager)... method initialize (line 35) | async def initialize(self) -> None: method get_persona (line 40) | async def get_persona(self, persona_id: str): method get_persona_v3_by_id (line 47) | def get_persona_v3_by_id(self, persona_id: str | None) -> Personality ... method get_default_persona_v3 (line 63) | async def get_default_persona_v3( method resolve_selected_persona (line 75) | async def resolve_selected_persona( method delete_persona (line 129) | async def delete_persona(self, persona_id: str) -> None: method update_persona (line 137) | async def update_persona( method get_all_personas (line 172) | async def get_all_personas(self) -> list[Persona]: method get_personas_by_folder (line 176) | async def get_personas_by_folder( method move_persona_to_folder (line 186) | async def move_persona_to_folder( method create_folder (line 207) | async def create_folder( method get_folder (line 222) | async def get_folder(self, folder_id: str) -> PersonaFolder | None: method get_folders (line 226) | async def get_folders(self, parent_id: str | None = None) -> list[Pers... method get_all_folders (line 234) | async def get_all_folders(self) -> list[PersonaFolder]: method update_folder (line 238) | async def update_folder( method delete_folder (line 255) | async def delete_folder(self, folder_id: str) -> None: method batch_update_sort_order (line 262) | async def batch_update_sort_order(self, items: list[dict]) -> None: method get_folder_tree (line 276) | async def get_folder_tree(self) -> list[dict]: method create_persona (line 315) | async def create_persona( method get_v3_persona_data (line 353) | def get_v3_persona_data( FILE: astrbot/core/pipeline/__init__.py function __getattr__ (line 98) | def __getattr__(name: str) -> Any: function __dir__ (line 108) | def __dir__() -> list[str]: FILE: astrbot/core/pipeline/bootstrap.py function ensure_builtin_stages_registered (line 34) | def ensure_builtin_stages_registered() -> None: FILE: astrbot/core/pipeline/content_safety_check/stage.py class ContentSafetyCheckStage (line 13) | class ContentSafetyCheckStage(Stage): method initialize (line 19) | async def initialize(self, ctx: PipelineContext) -> None: method process (line 23) | async def process( FILE: astrbot/core/pipeline/content_safety_check/strategies/__init__.py class ContentSafetyStrategy (line 4) | class ContentSafetyStrategy(abc.ABC): method check (line 6) | def check(self, content: str) -> tuple[bool, str]: FILE: astrbot/core/pipeline/content_safety_check/strategies/baidu_aip.py class BaiduAipStrategy (line 10) | class BaiduAipStrategy(ContentSafetyStrategy): method __init__ (line 11) | def __init__(self, appid: str, ak: str, sk: str) -> None: method check (line 17) | def check(self, content: str) -> tuple[bool, str]: FILE: astrbot/core/pipeline/content_safety_check/strategies/keywords.py class KeywordsStrategy (line 6) | class KeywordsStrategy(ContentSafetyStrategy): method __init__ (line 7) | def __init__(self, extra_keywords: list) -> None: method check (line 20) | def check(self, content: str) -> tuple[bool, str]: FILE: astrbot/core/pipeline/content_safety_check/strategies/strategy.py class StrategySelector (line 6) | class StrategySelector: method __init__ (line 7) | def __init__(self, config: dict) -> None: method check (line 29) | def check(self, content: str) -> tuple[bool, str]: FILE: astrbot/core/pipeline/context.py class PipelineContext (line 15) | class PipelineContext: FILE: astrbot/core/pipeline/context_utils.py function call_handler (line 12) | async def call_handler( function call_event_hook (line 75) | async def call_event_hook( FILE: astrbot/core/pipeline/preprocess_stage/stage.py class PreProcessStage (line 15) | class PreProcessStage(Stage): method initialize (line 16) | async def initialize(self, ctx: PipelineContext) -> None: method process (line 24) | async def process( FILE: astrbot/core/pipeline/process_stage/follow_up.py class FollowUpCapture (line 23) | class FollowUpCapture: function _event_follow_up_text (line 30) | def _event_follow_up_text(event: AstrMessageEvent) -> str: function register_active_runner (line 37) | def register_active_runner(umo: str, runner: AgentRunner) -> None: function unregister_active_runner (line 41) | def unregister_active_runner(umo: str, runner: AgentRunner) -> None: function _get_follow_up_order_state (line 46) | def _get_follow_up_order_state(umo: str) -> dict[str, object]: function _advance_follow_up_turn_locked (line 62) | def _advance_follow_up_turn_locked(state: dict[str, object]) -> None: function _allocate_follow_up_order (line 80) | def _allocate_follow_up_order(umo: str) -> int: function _mark_follow_up_consumed (line 92) | async def _mark_follow_up_consumed(umo: str, seq: int) -> None: function _activate_and_wait_follow_up_turn (line 111) | async def _activate_and_wait_follow_up_turn(umo: str, seq: int) -> None: function _finish_follow_up_turn (line 132) | async def _finish_follow_up_turn(umo: str, seq: int) -> None: function _monitor_follow_up_ticket (line 150) | async def _monitor_follow_up_ticket( function try_capture_follow_up (line 161) | def try_capture_follow_up(event: AstrMessageEvent) -> FollowUpCapture | ... function prepare_follow_up_capture (line 203) | async def prepare_follow_up_capture(capture: FollowUpCapture) -> tuple[b... function finalize_follow_up_capture (line 213) | async def finalize_follow_up_capture( FILE: astrbot/core/pipeline/process_stage/method/agent_request.py class AgentRequestSubStage (line 13) | class AgentRequestSubStage(Stage): method initialize (line 14) | async def initialize(self, ctx: PipelineContext) -> None: method process (line 34) | async def process(self, event: AstrMessageEvent) -> AsyncGenerator[Non... FILE: astrbot/core/pipeline/process_stage/method/agent_sub_stages/internal.py class InternalAgentSubStage (line 47) | class InternalAgentSubStage(Stage): method initialize (line 48) | async def initialize(self, ctx: PipelineContext) -> None: method process (line 141) | async def process( method _save_to_history (line 387) | async def _save_to_history( FILE: astrbot/core/pipeline/process_stage/method/agent_sub_stages/third_party.py function run_third_party_agent (line 62) | async def run_third_party_agent( class _RunnerResultAggregator (line 94) | class _RunnerResultAggregator: method __init__ (line 95) | def __init__(self) -> None: method add_chunk (line 99) | def add_chunk(self, chain: MessageChain, is_error: bool) -> None: method finalize (line 104) | def finalize( function _start_stream_watchdog (line 124) | def _start_stream_watchdog( function _close_runner_if_supported (line 151) | async def _close_runner_if_supported(runner: "BaseAgentRunner") -> None: class ThirdPartyAgentSubStage (line 164) | class ThirdPartyAgentSubStage(Stage): method initialize (line 165) | async def initialize(self, ctx: PipelineContext) -> None: method _resolve_persona_custom_error_message (line 189) | async def _resolve_persona_custom_error_message( method _handle_streaming_response (line 207) | async def _handle_streaming_response( method _handle_non_streaming_response (line 254) | async def _handle_non_streaming_response( method process (line 289) | async def process( FILE: astrbot/core/pipeline/process_stage/method/star_request.py class StarRequestSubStage (line 17) | class StarRequestSubStage(Stage): method initialize (line 18) | async def initialize(self, ctx: PipelineContext) -> None: method process (line 23) | async def process( FILE: astrbot/core/pipeline/process_stage/stage.py class ProcessStage (line 14) | class ProcessStage(Stage): method initialize (line 15) | async def initialize(self, ctx: PipelineContext) -> None: method process (line 28) | async def process( FILE: astrbot/core/pipeline/rate_limit_check/stage.py class RateLimitStage (line 15) | class RateLimitStage(Stage): method __init__ (line 22) | def __init__(self) -> None: method initialize (line 31) | async def initialize(self, ctx: PipelineContext) -> None: method process (line 43) | async def process( method _remove_expired_timestamps (line 85) | def _remove_expired_timestamps( FILE: astrbot/core/pipeline/respond/stage.py class RespondStage (line 19) | class RespondStage(Stage): method initialize (line 53) | async def initialize(self, ctx: PipelineContext) -> None: method _word_cnt (line 91) | async def _word_cnt(self, text: str) -> int: method _calc_comp_interval (line 99) | async def _calc_comp_interval(self, comp: BaseMessageComponent) -> float: method _is_empty_message_chain (line 110) | async def _is_empty_message_chain(self, chain: list[BaseMessageCompone... method is_seg_reply_required (line 131) | def is_seg_reply_required(self, event: AstrMessageEvent) -> bool: method _extract_comp (line 150) | def _extract_comp( method process (line 170) | async def process( FILE: astrbot/core/pipeline/result_decorate/stage.py class ResultDecorateStage (line 22) | class ResultDecorateStage(Stage): method initialize (line 23) | async def initialize(self, ctx: PipelineContext) -> None: method _split_text_by_words (line 104) | def _split_text_by_words(self, text: str) -> list[str]: method process (line 126) | async def process( FILE: astrbot/core/pipeline/scheduler.py class PipelineScheduler (line 17) | class PipelineScheduler: method __init__ (line 20) | def __init__(self, context: PipelineContext) -> None: method initialize (line 28) | async def initialize(self) -> None: method _process_stages (line 35) | async def _process_stages(self, event: AstrMessageEvent, from_stage=0)... method execute (line 78) | async def execute(self, event: AstrMessageEvent) -> None: FILE: astrbot/core/pipeline/session_status_check/stage.py class SessionStatusCheckStage (line 12) | class SessionStatusCheckStage(Stage): method initialize (line 15) | async def initialize(self, ctx: PipelineContext) -> None: method process (line 19) | async def process( FILE: astrbot/core/pipeline/stage.py function register_stage (line 13) | def register_stage(cls): class Stage (line 19) | class Stage(abc.ABC): method initialize (line 23) | async def initialize(self, ctx: PipelineContext) -> None: method process (line 33) | async def process( FILE: astrbot/core/pipeline/waking_check/stage.py function build_unique_session_id (line 28) | def build_unique_session_id(event: AstrMessageEvent) -> str | None: class WakingCheckStage (line 35) | class WakingCheckStage(Stage): method initialize (line 45) | async def initialize(self, ctx: PipelineContext) -> None: method process (line 76) | async def process( FILE: astrbot/core/pipeline/whitelist_check/stage.py class WhitelistCheckStage (line 12) | class WhitelistCheckStage(Stage): method initialize (line 15) | async def initialize(self, ctx: PipelineContext) -> None: method process (line 31) | async def process( FILE: astrbot/core/platform/astr_message_event.py class AstrMessageEvent (line 34) | class AstrMessageEvent(abc.ABC): method __init__ (line 35) | def __init__( method unified_msg_origin (line 99) | def unified_msg_origin(self) -> str: method unified_msg_origin (line 104) | def unified_msg_origin(self, value: str) -> None: method session_id (line 110) | def session_id(self) -> str: method session_id (line 115) | def session_id(self, value: str) -> None: method get_platform_name (line 119) | def get_platform_name(self): method get_platform_id (line 126) | def get_platform_id(self): method get_message_str (line 133) | def get_message_str(self) -> str: method _outline_chain (line 137) | def _outline_chain(self, chain: list[BaseMessageComponent] | None) -> ... method get_message_outline (line 167) | def get_message_outline(self) -> str: method get_messages (line 174) | def get_messages(self) -> list[BaseMessageComponent]: method get_message_type (line 178) | def get_message_type(self) -> MessageType: method get_session_id (line 185) | def get_session_id(self) -> str: method get_group_id (line 189) | def get_group_id(self) -> str: method get_self_id (line 193) | def get_self_id(self) -> str: method get_sender_id (line 197) | def get_sender_id(self) -> str: method get_sender_name (line 204) | def get_sender_name(self) -> str: method set_extra (line 216) | def set_extra(self, key, value) -> None: method get_extra (line 220) | def get_extra(self, key: str | None = None, default=None) -> Any: method clear_extra (line 226) | def clear_extra(self) -> None: method is_private_chat (line 231) | def is_private_chat(self) -> bool: method is_wake_up (line 235) | def is_wake_up(self) -> bool: method is_admin (line 239) | def is_admin(self) -> bool: method process_buffer (line 243) | async def process_buffer(self, buffer: str, pattern: re.Pattern) -> str: method send_streaming (line 255) | async def send_streaming( method send_typing (line 269) | async def send_typing(self) -> None: method _pre_send (line 275) | async def _pre_send(self) -> None: method _post_send (line 278) | async def _post_send(self) -> None: method set_result (line 281) | def set_result(self, result: MessageEventResult | str) -> None: method stop_event (line 310) | def stop_event(self) -> None: method continue_event (line 317) | def continue_event(self) -> None: method is_stopped (line 324) | def is_stopped(self) -> bool: method should_call_llm (line 330) | def should_call_llm(self, call_llm: bool) -> None: method get_result (line 337) | def get_result(self) -> MessageEventResult | None: method clear_result (line 341) | def clear_result(self) -> None: method make_result (line 347) | def make_result(self) -> MessageEventResult: method plain_result (line 362) | def plain_result(self, text: str) -> MessageEventResult: method image_result (line 366) | def image_result(self, url_or_path: str) -> MessageEventResult: method chain_result (line 375) | def chain_result(self, chain: list[BaseMessageComponent]) -> MessageEv... method request_llm (line 383) | def request_llm( method send (line 435) | async def send(self, message: MessageChain) -> None: method react (line 454) | async def react(self, emoji: str) -> None: method get_group (line 463) | async def get_group(self, group_id: str | None = None, **kwargs) -> Gr... FILE: astrbot/core/platform/astrbot_message.py class MessageMember (line 10) | class MessageMember: method __str__ (line 14) | def __str__(self) -> str: class Group (line 23) | class Group: method __str__ (line 37) | def __str__(self) -> str: class AstrBotMessage (line 50) | class AstrBotMessage: method __init__ (line 64) | def __init__(self) -> None: method __str__ (line 68) | def __str__(self) -> str: method group_id (line 72) | def group_id(self) -> str: method group_id (line 81) | def group_id(self, value: str | None) -> None: FILE: astrbot/core/platform/manager.py class PlatformTasks (line 17) | class PlatformTasks: class PlatformManager (line 22) | class PlatformManager: method __init__ (line 23) | def __init__(self, config: AstrBotConfig, event_queue: Queue) -> None: method _is_valid_platform_id (line 38) | def _is_valid_platform_id(self, platform_id: str | None) -> bool: method _sanitize_platform_id (line 43) | def _sanitize_platform_id(self, platform_id: str | None) -> tuple[str ... method _start_platform_task (line 49) | def _start_platform_task(self, task_name: str, inst: Platform) -> None: method _stop_platform_task (line 60) | async def _stop_platform_task(self, client_id: str) -> None: method _terminate_inst_and_tasks (line 69) | async def _terminate_inst_and_tasks(self, inst: Platform) -> None: method initialize (line 87) | async def initialize(self) -> None: method load_platform (line 102) | async def load_platform(self, platform_config: dict) -> None: method _task_wrapper (line 222) | async def _task_wrapper( method reload (line 246) | async def reload(self, platform_config: dict) -> None: method terminate_platform (line 257) | async def terminate_platform(self, platform_id: str) -> None: method terminate (line 278) | async def terminate(self) -> None: method get_insts (line 296) | def get_insts(self): method get_all_stats (line 299) | def get_all_stats(self) -> dict: FILE: astrbot/core/platform/message_session.py class MessageSession (line 7) | class MessageSession: method __str__ (line 18) | def __str__(self) -> str: method __post_init__ (line 21) | def __post_init__(self): method from_str (line 25) | def from_str(session_str: str): FILE: astrbot/core/platform/message_type.py class MessageType (line 4) | class MessageType(Enum): FILE: astrbot/core/platform/platform.py class PlatformStatus (line 18) | class PlatformStatus(Enum): class PlatformError (line 28) | class PlatformError: class Platform (line 36) | class Platform(abc.ABC): method __init__ (line 37) | def __init__(self, config: dict, event_queue: Queue) -> None: method status (line 51) | def status(self) -> PlatformStatus: method status (line 56) | def status(self, value: PlatformStatus) -> None: method errors (line 63) | def errors(self) -> list[PlatformError]: method last_error (line 68) | def last_error(self) -> PlatformError | None: method record_error (line 72) | def record_error(self, message: str, traceback_str: str | None = None)... method clear_errors (line 77) | def clear_errors(self) -> None: method unified_webhook (line 83) | def unified_webhook(self) -> bool: method get_stats (line 90) | def get_stats(self) -> dict: method run (line 120) | def run(self) -> Coroutine[Any, Any, None]: method terminate (line 124) | async def terminate(self) -> None: method meta (line 128) | def meta(self) -> PlatformMetadata: method send_by_session (line 132) | async def send_by_session( method commit_event (line 143) | def commit_event(self, event: AstrMessageEvent) -> None: method get_client (line 147) | def get_client(self) -> object: method webhook_callback (line 150) | async def webhook_callback(self, request: Any) -> Any: FILE: astrbot/core/platform/platform_metadata.py class PlatformMetadata (line 5) | class PlatformMetadata: FILE: astrbot/core/platform/register.py function register_platform_adapter (line 11) | def register_platform_adapter( function unregister_platform_adapters_by_module (line 66) | def unregister_platform_adapters_by_module(module_path_prefix: str) -> l... FILE: astrbot/core/platform/sources/aiocqhttp/aiocqhttp_message_event.py class AiocqhttpMessageEvent (line 22) | class AiocqhttpMessageEvent(AstrMessageEvent): method __init__ (line 23) | def __init__( method _from_segment_to_dict (line 35) | async def _from_segment_to_dict(segment: BaseMessageComponent) -> dict: method _parse_onebot_json (line 70) | async def _parse_onebot_json(message_chain: MessageChain): method _dispatch_send (line 90) | async def _dispatch_send( method send_message (line 115) | async def send_message( method send (line 168) | async def send(self, message: MessageChain) -> None: method send_streaming (line 184) | async def send_streaming( method get_group (line 220) | async def get_group(self, group_id=None, **kwargs): FILE: astrbot/core/platform/sources/aiocqhttp/aiocqhttp_platform_adapter.py class AiocqhttpAdapter (line 35) | class AiocqhttpAdapter(Platform): method __init__ (line 36) | def __init__( method send_by_session (line 109) | async def send_by_session( method convert_message (line 128) | async def convert_message(self, event: Event) -> AstrBotMessage | None: method _convert_handle_request_event (line 143) | async def _convert_handle_request_event(self, event: Event) -> AstrBot... method _convert_handle_notice_event (line 168) | async def _convert_handle_notice_event(self, event: Event) -> AstrBotM... method _convert_handle_message_event (line 198) | async def _convert_handle_message_event( method run (line 419) | def run(self) -> Awaitable[Any]: method terminate (line 439) | async def terminate(self) -> None: method _close_reverse_ws_connections (line 444) | async def _close_reverse_ws_connections(self) -> None: method shutdown_trigger_placeholder (line 477) | async def shutdown_trigger_placeholder(self) -> None: method meta (line 481) | def meta(self) -> PlatformMetadata: method handle_msg (line 484) | async def handle_msg(self, message: AstrBotMessage) -> None: method get_client (line 495) | def get_client(self) -> CQHttp: FILE: astrbot/core/platform/sources/dingtalk/dingtalk_adapter.py class MyEventHandler (line 37) | class MyEventHandler(dingtalk_stream.EventHandler): method process (line 38) | async def process(self, event: dingtalk_stream.EventMessage): class DingtalkPlatformAdapter (line 52) | class DingtalkPlatformAdapter(Platform): method __init__ (line 53) | def __init__( method _id_to_sid (line 87) | def _id_to_sid(self, dingtalk_id: str | None) -> str: method send_by_session (line 95) | async def send_by_session( method send_with_session (line 124) | async def send_with_session( method send_with_sesison (line 131) | async def send_with_sesison( method meta (line 139) | def meta(self) -> PlatformMetadata: method convert_msg (line 148) | async def convert_msg( method _remember_sender_binding (line 289) | async def _remember_sender_binding( method download_ding_file (line 315) | async def download_ding_file( method get_access_token (line 368) | async def get_access_token(self) -> str: method _get_sender_staff_id (line 393) | async def _get_sender_staff_id(self, session: MessageSesion) -> str: method _send_group_message (line 406) | async def _send_group_message( method _send_private_message (line 439) | async def _send_private_message( method _safe_remove_file (line 472) | def _safe_remove_file(self, file_path: str | None) -> None: method _prepare_voice_for_dingtalk (line 482) | async def _prepare_voice_for_dingtalk(self, input_path: str) -> tuple[... method upload_media (line 496) | async def upload_media(self, file_path: str, media_type: str) -> str: method upload_image (line 526) | async def upload_image(self, image: Image) -> str: method _send_message_chain (line 530) | async def _send_message_chain( method send_message_chain_to_group (line 658) | async def send_message_chain_to_group( method send_message_chain_to_user (line 673) | async def send_message_chain_to_user( method send_message_chain_with_incoming (line 688) | async def send_message_chain_with_incoming( method handle_msg (line 735) | async def handle_msg(self, abm: AstrBotMessage) -> None: method run (line 747) | async def run(self) -> None: method terminate (line 766) | async def terminate(self) -> None: method get_client (line 776) | def get_client(self): FILE: astrbot/core/platform/sources/dingtalk/dingtalk_event.py class DingtalkMessageEvent (line 7) | class DingtalkMessageEvent(AstrMessageEvent): method __init__ (line 8) | def __init__( method send (line 21) | async def send(self, message: MessageChain) -> None: method send_streaming (line 31) | async def send_streaming(self, generator, use_fallback: bool = False): FILE: astrbot/core/platform/sources/discord/client.py class DiscordBotClient (line 15) | class DiscordBotClient(discord.Bot): method __init__ (line 18) | def __init__(self, token: str, proxy: str | None = None) -> None: method on_ready (line 35) | async def on_ready(self) -> None: method _create_message_data (line 54) | def _create_message_data(self, message: discord.Message) -> dict: method _create_interaction_data (line 74) | def _create_interaction_data(self, interaction: discord.Interaction) -... method on_message (line 96) | async def on_message(self, message: discord.Message) -> None: method _extract_interaction_content (line 109) | def _extract_interaction_content(self, interaction: discord.Interactio... method start_polling (line 133) | async def start_polling(self) -> None: method close (line 138) | async def close(self) -> None: FILE: astrbot/core/platform/sources/discord/components.py class DiscordEmbed (line 7) | class DiscordEmbed(BaseMessageComponent): method __init__ (line 12) | def __init__( method to_discord_embed (line 32) | def to_discord_embed(self) -> discord.Embed: class DiscordButton (line 61) | class DiscordButton(BaseMessageComponent): method __init__ (line 66) | def __init__( class DiscordReference (line 83) | class DiscordReference(BaseMessageComponent): method __init__ (line 88) | def __init__(self, message_id: str, channel_id: str) -> None: class DiscordView (line 93) | class DiscordView(BaseMessageComponent): method __init__ (line 98) | def __init__( method to_discord_view (line 106) | def to_discord_view(self) -> discord.ui.View: FILE: astrbot/core/platform/sources/discord/discord_platform_adapter.py class DiscordPlatformAdapter (line 40) | class DiscordPlatformAdapter(Platform): method __init__ (line 41) | def __init__( method send_by_session (line 59) | async def send_by_session( method meta (line 114) | def meta(self) -> PlatformMetadata: method run (line 125) | async def run(self) -> None: method _get_message_type (line 167) | def _get_message_type( method _get_channel_id (line 179) | def _get_channel_id( method _convert_message_to_abm (line 185) | def _convert_message_to_abm(self, data: dict) -> AstrBotMessage: method convert_message (line 249) | async def convert_message(self, data: dict) -> AstrBotMessage: method handle_msg (line 254) | async def handle_msg(self, message: AstrBotMessage, followup_webhook=N... method terminate (line 326) | async def terminate(self) -> None: method register_handler (line 361) | def register_handler(self, handler_info) -> None: method _collect_and_register_commands (line 365) | async def _collect_and_register_commands(self) -> None: method _create_dynamic_callback (line 418) | def _create_dynamic_callback(self, cmd_name: str): method _extract_command_info (line 478) | def _extract_command_info( FILE: astrbot/core/platform/sources/discord/discord_platform_event.py class DiscordViewComponent (line 28) | class DiscordViewComponent(BaseMessageComponent): method __init__ (line 31) | def __init__(self, view: discord.ui.View) -> None: class DiscordPlatformEvent (line 35) | class DiscordPlatformEvent(AstrMessageEvent): method __init__ (line 36) | def __init__( method send (line 49) | async def send(self, message: MessageChain) -> None: method send_streaming (line 100) | async def send_streaming( method _get_channel (line 115) | async def _get_channel( method _parse_to_discord (line 128) | async def _parse_to_discord( method react (line 270) | async def react(self, emoji: str) -> None: method is_slash_command (line 283) | def is_slash_command(self) -> bool: method is_button_interaction (line 292) | def is_button_interaction(self) -> bool: method get_interaction_custom_id (line 301) | def get_interaction_custom_id(self) -> str: method is_mentioned (line 313) | def is_mentioned(self) -> bool: method get_mention_clean_content (line 327) | def get_mention_clean_content(self) -> str: FILE: astrbot/core/platform/sources/kook/kook_adapter.py class KookPlatformAdapter (line 44) | class KookPlatformAdapter(Platform): method __init__ (line 45) | def __init__( method send_by_session (line 57) | async def send_by_session( method meta (line 72) | def meta(self) -> PlatformMetadata: method _should_ignore_event_by_bot_nickname (line 77) | def _should_ignore_event_by_bot_nickname(self, author_id: str) -> bool: method _on_received (line 80) | async def _on_received(self, event: KookMessageEventData): method run (line 98) | async def run(self): method _main_loop (line 116) | async def _main_loop(self): method _cleanup (line 175) | async def _cleanup(self): method _parse_kmarkdown_text_message (line 194) | def _parse_kmarkdown_text_message( method _parse_card_message (line 273) | def _parse_card_message(self, data: KookMessageEventData) -> tuple[lis... method _handle_section_text (line 337) | def _handle_section_text(self, module: SectionModule) -> str: method _handle_image_group (line 343) | def _handle_image_group( method convert_message (line 356) | async def convert_message(self, data: KookMessageEventData) -> AstrBot... method handle_msg (line 408) | async def handle_msg(self, message: AstrBotMessage): FILE: astrbot/core/platform/sources/kook/kook_client.py class KookClient (line 30) | class KookClient: method __init__ (line 31) | def __init__(self, config: KookConfig, event_callback): method bot_id (line 57) | def bot_id(self): method bot_nickname (line 61) | def bot_nickname(self): method bot_username (line 65) | def bot_username(self): method get_bot_info (line 68) | async def get_bot_info(self) -> None: method get_gateway_url (line 104) | async def get_gateway_url(self, resume=False, sn=0, session_id=None) -... method connect (line 140) | async def connect(self, resume=False): method listen (line 183) | async def listen(self): method _handle_signal (line 228) | async def _handle_signal(self, event: KookWebsocketEvent): method _handle_hello (line 257) | async def _handle_hello(self, data: KookHelloEventData): method _handle_pong (line 272) | async def _handle_pong(self): method _handle_reconnect (line 277) | async def _handle_reconnect(self): method _handle_resume_ack (line 285) | async def _handle_resume_ack(self, data: KookResumeAckEventData): method _heartbeat_loop (line 290) | async def _heartbeat_loop(self): method _send_ping (line 333) | async def _send_ping(self): method send_text (line 348) | async def send_text( method upload_asset (line 394) | async def upload_asset(self, file_url: str | None) -> str: method wait_until_closed (line 459) | async def wait_until_closed(self): method close (line 463) | async def close(self): FILE: astrbot/core/platform/sources/kook/kook_config.py class KookConfig (line 7) | class KookConfig: method from_dict (line 36) | def from_dict(cls, config_dict: dict) -> "KookConfig": method to_dict (line 73) | def to_dict(self) -> dict[str, Any]: method pretty_jsons (line 76) | def pretty_jsons(self, indent=2) -> str: FILE: astrbot/core/platform/sources/kook/kook_event.py class KookEvent (line 35) | class KookEvent(AstrMessageEvent): method __init__ (line 36) | def __init__( method _wrap_message (line 50) | def _wrap_message( method send (line 153) | async def send(self, message: MessageChain): FILE: astrbot/core/platform/sources/kook/kook_types.py class KookApiPaths (line 8) | class KookApiPaths: class KookMessageType (line 26) | class KookMessageType(IntEnum): class KookModuleType (line 39) | class KookModuleType(str, Enum): class KookBaseDataClass (line 70) | class KookBaseDataClass(BaseModel): method from_dict (line 78) | def from_dict(cls, raw_data: dict): method from_json (line 82) | def from_json(cls, raw_data: str | bytes | bytearray): method to_dict (line 85) | def to_dict( method to_json (line 99) | def to_json( class KookCardModelBase (line 116) | class KookCardModelBase(KookBaseDataClass): class PlainTextElement (line 122) | class PlainTextElement(KookCardModelBase): class KmarkdownElement (line 128) | class KmarkdownElement(KookCardModelBase): class ImageElement (line 133) | class ImageElement(KookCardModelBase): class ButtonElement (line 142) | class ButtonElement(KookCardModelBase): class ParagraphStructure (line 156) | class ParagraphStructure(KookCardModelBase): class HeaderModule (line 163) | class HeaderModule(KookCardModelBase): class SectionModule (line 168) | class SectionModule(KookCardModelBase): class ImageGroupModule (line 175) | class ImageGroupModule(KookCardModelBase): class ContainerModule (line 182) | class ContainerModule(KookCardModelBase): class ActionGroupModule (line 189) | class ActionGroupModule(KookCardModelBase): class ContextModule (line 196) | class ContextModule(KookCardModelBase): class DividerModule (line 202) | class DividerModule(KookCardModelBase): class FileModule (line 208) | class FileModule(KookCardModelBase): class CountdownModule (line 218) | class CountdownModule(KookCardModelBase): class InviteModule (line 230) | class InviteModule(KookCardModelBase): class KookCardMessage (line 252) | class KookCardMessage(KookBaseDataClass): method add_module (line 267) | def add_module(self, module: AnyModule): class KookCardMessageContainer (line 271) | class KookCardMessageContainer(list[KookCardMessage]): method append (line 274) | def append(self, object: KookCardMessage) -> None: method to_json (line 277) | def to_json(self, indent: int | None = None, ensure_ascii: bool = True... method from_dict (line 283) | def from_dict(cls, raw_data: list[dict[str, Any]]): class OrderMessage (line 287) | class OrderMessage(BaseModel): class KookMessageSignal (line 294) | class KookMessageSignal(IntEnum): class KookChannelType (line 314) | class KookChannelType(str, Enum): class KookAuthor (line 320) | class KookAuthor(KookBaseDataClass): class KookKMarkdown (line 333) | class KookKMarkdown(KookBaseDataClass): class KookExtra (line 339) | class KookExtra(KookBaseDataClass): class KookMessageEventData (line 351) | class KookMessageEventData(KookBaseDataClass): class KookHelloEventData (line 369) | class KookHelloEventData(KookBaseDataClass): class KookPingEventData (line 379) | class KookPingEventData(KookBaseDataClass): class KookPongEventData (line 386) | class KookPongEventData(KookBaseDataClass): class KookResumeEventData (line 393) | class KookResumeEventData(KookBaseDataClass): class KookReconnectEventData (line 400) | class KookReconnectEventData(KookBaseDataClass): class KookResumeAckEventData (line 410) | class KookResumeAckEventData(KookBaseDataClass): class KookWebsocketEvent (line 419) | class KookWebsocketEvent(KookBaseDataClass): method _inject_signal_into_data (line 444) | def _inject_signal_into_data(cls, data: Any) -> Any: class KookUserTag (line 454) | class KookUserTag(KookBaseDataClass): class KookApiResponseBase (line 460) | class KookApiResponseBase(KookBaseDataClass): method success (line 465) | def success(self) -> bool: class KookUserMeData (line 469) | class KookUserMeData(KookBaseDataClass): class KookUserMeResponse (line 492) | class KookUserMeResponse(KookApiResponseBase): class KookGatewayIndexData (line 498) | class KookGatewayIndexData(KookBaseDataClass): class KookGatewayIndexResponse (line 502) | class KookGatewayIndexResponse(KookApiResponseBase): FILE: astrbot/core/platform/sources/lark/lark_adapter.py class LarkPlatformAdapter (line 39) | class LarkPlatformAdapter(Platform): method __init__ (line 40) | def __init__( method _download_message_resource (line 98) | async def _download_message_resource( method _build_message_str_from_components (line 131) | def _build_message_str_from_components( method _parse_post_content (line 156) | def _parse_post_content(content: dict[str, Any]) -> list[dict[str, Any]]: method _build_at_map (line 168) | def _build_at_map(mentions: list[Any] | None) -> dict[str, Comp.At]: method _parse_message_components (line 191) | async def _parse_message_components( method _build_reply_from_parent_id (line 340) | async def _build_reply_from_parent_id( method _download_file_resource_to_temp (line 413) | async def _download_file_resource_to_temp( method _clean_expired_events (line 439) | def _clean_expired_events(self) -> None: method _is_duplicate_event (line 450) | def _is_duplicate_event(self, event_id: str) -> bool: method send_by_session (line 465) | async def send_by_session( method meta (line 489) | def meta(self) -> PlatformMetadata: method convert_msg (line 497) | async def convert_msg(self, event: lark.im.v1.P2ImMessageReceiveV1) ->... method handle_msg (line 590) | async def handle_msg(self, abm: AstrBotMessage) -> None: method handle_webhook_event (line 601) | async def handle_webhook_event(self, event_data: dict) -> None: method run (line 623) | async def run(self) -> None: method webhook_callback (line 639) | async def webhook_callback(self, request: Any) -> Any: method terminate (line 646) | async def terminate(self) -> None: method get_client (line 651) | def get_client(self) -> lark.ws.Client: method unified_webhook (line 654) | def unified_webhook(self) -> bool: FILE: astrbot/core/platform/sources/lark/lark_event.py class LarkMessageEvent (line 43) | class LarkMessageEvent(AstrMessageEvent): method __init__ (line 44) | def __init__( method _send_im_message (line 56) | async def _send_im_message( method _upload_lark_file (line 131) | async def _upload_lark_file( method _convert_to_lark (line 194) | async def _convert_to_lark(message: MessageChain, lark_client: lark.Cl... method send_message_chain (line 284) | async def send_message_chain( method send (line 358) | async def send(self, message: MessageChain) -> None: method _send_file_message (line 368) | async def _send_file_message( method _send_audio_message (line 402) | async def _send_audio_message( method _send_media_message (line 475) | async def _send_media_message( method react (line 547) | async def react(self, emoji: str) -> None: method _create_streaming_card (line 568) | async def _create_streaming_card(self) -> str | None: method _send_card_message (line 630) | async def _send_card_message( method _update_streaming_text (line 651) | async def _update_streaming_text( method _close_streaming_mode (line 688) | async def _close_streaming_mode( method _fallback_send_streaming (line 727) | async def _fallback_send_streaming(self, generator, use_fallback: bool... method send_streaming (line 743) | async def send_streaming(self, generator, use_fallback: bool = False): FILE: astrbot/core/platform/sources/lark/server.py class AESCipher (line 21) | class AESCipher: method __init__ (line 24) | def __init__(self, key: str) -> None: method str_to_bytes (line 29) | def str_to_bytes(data): method _unpad (line 36) | def _unpad(s): method decrypt (line 39) | def decrypt(self, enc): method decrypt_string (line 44) | def decrypt_string(self, enc): class LarkWebhookServer (line 49) | class LarkWebhookServer: method __init__ (line 55) | def __init__(self, config: dict, event_queue: asyncio.Queue) -> None: method verify_signature (line 75) | def verify_signature( method decrypt_event (line 102) | def decrypt_event(self, encrypted_data: str) -> dict: method handle_challenge (line 117) | async def handle_challenge(self, event_data: dict) -> dict: method handle_callback (line 131) | async def handle_callback(self, request) -> tuple[dict, int] | dict: method set_callback (line 200) | def set_callback(self, callback: Callable[[dict], Awaitable[None]]) ->... FILE: astrbot/core/platform/sources/line/line_adapter.py class LinePlatformAdapter (line 71) | class LinePlatformAdapter(Platform): method __init__ (line 72) | def __init__( method send_by_session (line 97) | async def send_by_session( method meta (line 107) | def meta(self) -> PlatformMetadata: method run (line 115) | async def run(self) -> None: method terminate (line 123) | async def terminate(self) -> None: method webhook_callback (line 127) | async def webhook_callback(self, request: Any) -> Any: method handle_webhook_event (line 146) | async def handle_webhook_event(self, payload: dict[str, Any]) -> None: method convert_message (line 169) | async def convert_message(self, event: dict[str, Any]) -> AstrBotMessa... method _parse_line_message_components (line 233) | async def _parse_line_message_components( method _parse_text_with_mentions (line 268) | def _parse_text_with_mentions(self, text: str, mention_obj: dict[str, ... method _build_image_component (line 307) | async def _build_image_component( method _build_video_component (line 322) | async def _build_video_component( method _build_audio_component (line 339) | async def _build_audio_component( method _build_file_component (line 356) | async def _build_file_component( method _get_external_content_url (line 378) | def _get_external_content_url(message: dict[str, Any]) -> str: method _guess_suffix (line 387) | def _guess_suffix(content_type: str | None, fallback: str) -> str: method _store_temp_content (line 397) | def _store_temp_content( method _build_message_str (line 421) | def _build_message_str(components: list) -> str: method _clean_expired_events (line 440) | def _clean_expired_events(self) -> None: method _is_duplicate_event (line 450) | def _is_duplicate_event(self, event_id: str) -> bool: method handle_msg (line 457) | async def handle_msg(self, abm: AstrBotMessage) -> None: FILE: astrbot/core/platform/sources/line/line_api.py class LineAPIClient (line 14) | class LineAPIClient: method __init__ (line 15) | def __init__( method _get_session (line 27) | async def _get_session(self) -> aiohttp.ClientSession: method close (line 32) | async def close(self) -> None: method verify_signature (line 36) | def verify_signature(self, raw_body: bytes, signature: str | None) -> ... method _auth_headers (line 48) | def _auth_headers(self) -> dict[str, str]: method reply_message (line 51) | async def reply_message( method push_message (line 69) | async def push_message( method _post_json (line 87) | async def _post_json( method get_message_content (line 115) | async def get_message_content( method _read_content_response (line 150) | async def _read_content_response( method _extract_filename_from_disposition (line 160) | def _extract_filename_from_disposition(self, disposition: str | None) ... method _wait_for_transcoding (line 174) | async def _wait_for_transcoding( FILE: astrbot/core/platform/sources/line/line_event.py class LineMessageEvent (line 25) | class LineMessageEvent(AstrMessageEvent): method __init__ (line 26) | def __init__( method _component_to_message_object (line 38) | async def _component_to_message_object( method _resolve_image_url (line 105) | async def _resolve_image_url(segment: Image) -> str: method _resolve_record_url (line 116) | async def _resolve_record_url(segment: Record) -> str: method _resolve_record_duration (line 127) | async def _resolve_record_duration(segment: Record) -> int: method _resolve_video_url (line 138) | async def _resolve_video_url(segment: Video) -> str: method _resolve_video_preview_url (line 149) | async def _resolve_video_preview_url(segment: Video) -> str: method _resolve_file_url (line 191) | async def _resolve_file_url(segment: File) -> str: method _resolve_file_size (line 201) | async def _resolve_file_size(segment: File) -> int: method build_line_messages (line 211) | async def build_line_messages(cls, message_chain: MessageChain) -> lis... method send (line 228) | async def send(self, message: MessageChain) -> None: method send_streaming (line 249) | async def send_streaming( FILE: astrbot/core/platform/sources/misskey/misskey_adapter.py class MisskeyPlatformAdapter (line 50) | class MisskeyPlatformAdapter(Platform): method __init__ (line 51) | def __init__( method meta (line 100) | def meta(self) -> PlatformMetadata: method run (line 124) | async def run(self) -> None: method _register_event_handlers (line 153) | def _register_event_handlers(self, streaming) -> None: method _send_text_only_message (line 166) | async def _send_text_only_message( method _process_poll_data (line 192) | def _process_poll_data( method _extract_additional_fields (line 212) | def _extract_additional_fields(self, session, message_chain) -> dict[s... method _start_websocket_connection (line 236) | async def _start_websocket_connection(self) -> None: method _handle_notification (line 284) | async def _handle_notification(self, data: dict[str, Any]) -> None: method _handle_chat_message (line 308) | async def _handle_chat_message(self, data: dict[str, Any]) -> None: method _debug_handler (line 343) | async def _debug_handler(self, data: dict[str, Any]) -> None: method _is_bot_mentioned (line 349) | def _is_bot_mentioned(self, note: dict[str, Any]) -> bool: method send_by_session (line 368) | async def send_by_session( method convert_message (line 634) | async def convert_message(self, raw_data: dict[str, Any]) -> AstrBotMe... method convert_chat_message (line 682) | async def convert_chat_message(self, raw_data: dict[str, Any]) -> Astr... method convert_room_message (line 709) | async def convert_room_message(self, raw_data: dict[str, Any]) -> Astr... method terminate (line 757) | async def terminate(self) -> None: method get_client (line 762) | def get_client(self) -> Any: FILE: astrbot/core/platform/sources/misskey/misskey_api.py class APIError (line 25) | class APIError(Exception): class APIConnectionError (line 29) | class APIConnectionError(APIError): class APIRateLimitError (line 33) | class APIRateLimitError(APIError): class AuthenticationError (line 37) | class AuthenticationError(APIError): class WebSocketError (line 41) | class WebSocketError(APIError): class StreamingClient (line 45) | class StreamingClient: method __init__ (line 46) | def __init__(self, instance_url: str, access_token: str) -> None: method connect (line 57) | async def connect(self) -> bool: method disconnect (line 93) | async def disconnect(self) -> None: method subscribe_channel (line 101) | async def subscribe_channel( method unsubscribe_channel (line 119) | async def unsubscribe_channel(self, channel_id: str) -> None: method add_message_handler (line 135) | def add_message_handler( method listen (line 142) | async def listen(self) -> None: method _handle_message (line 190) | async def _handle_message(self, data: dict[str, Any]) -> None: function retry_async (line 265) | def retry_async( class MisskeyAPI (line 327) | class MisskeyAPI: method __init__ (line 328) | def __init__( method __aenter__ (line 350) | async def __aenter__(self): method __aexit__ (line 353) | async def __aexit__(self, exc_type, exc_val, exc_tb): method close (line 357) | async def close(self) -> None: method get_streaming_client (line 366) | def get_streaming_client(self) -> StreamingClient: method session (line 372) | def session(self) -> aiohttp.ClientSession: method _handle_response_status (line 378) | def _handle_response_status(self, status: int, endpoint: str) -> NoRet... method _process_response (line 413) | async def _process_response( method _make_request (line 457) | async def _make_request( method create_note (line 474) | async def create_note( method upload_file (line 538) | async def upload_file( method find_files_by_hash (line 578) | async def find_files_by_hash(self, md5_hash: str) -> list[dict[str, An... method find_files_by_name (line 596) | async def find_files_by_name( method find_files (line 620) | async def find_files( method _download_with_existing_session (line 646) | async def _download_with_existing_session( method _download_with_temp_session (line 664) | async def _download_with_temp_session( method upload_and_find_file (line 680) | async def upload_and_find_file( method get_current_user (line 747) | async def get_current_user(self) -> dict[str, Any]: method send_message (line 751) | async def send_message( method send_room_message (line 770) | async def send_room_message( method get_messages (line 789) | async def get_messages( method get_mentions (line 806) | async def get_mentions( method send_message_with_media (line 825) | async def send_message_with_media( method _process_media_urls (line 873) | async def _process_media_urls(self, urls: list[str]) -> list[str]: method _process_local_files (line 890) | async def _process_local_files(self, file_paths: list[str]) -> list[str]: method _dispatch_message (line 906) | async def _dispatch_message( FILE: astrbot/core/platform/sources/misskey/misskey_event.py class MisskeyPlatformEvent (line 21) | class MisskeyPlatformEvent(AstrMessageEvent): method __init__ (line 22) | def __init__( method _is_system_command (line 33) | def _is_system_command(self, message_str: str) -> bool: method send (line 43) | async def send(self, message: MessageChain) -> None: method send_streaming (line 129) | async def send_streaming( FILE: astrbot/core/platform/sources/misskey/misskey_utils.py class FileIDExtractor (line 9) | class FileIDExtractor: method extract_file_id (line 13) | def extract_file_id(result: Any) -> str | None: class MessagePayloadBuilder (line 33) | class MessagePayloadBuilder: method build_chat_payload (line 37) | def build_chat_payload( method build_room_payload (line 50) | def build_room_payload( method build_note_payload (line 63) | def build_note_payload( function serialize_message_chain (line 77) | def serialize_message_chain(chain: list[Any]) -> tuple[str, bool]: function resolve_message_visibility (line 120) | def resolve_message_visibility( function resolve_visibility_from_raw_message (line 176) | def resolve_visibility_from_raw_message( function is_valid_user_session_id (line 184) | def is_valid_user_session_id(session_id: str | Any) -> bool: function is_valid_room_session_id (line 198) | def is_valid_room_session_id(session_id: str | Any) -> bool: function is_valid_chat_session_id (line 212) | def is_valid_chat_session_id(session_id: str | Any) -> bool: function extract_user_id_from_session_id (line 226) | def extract_user_id_from_session_id(session_id: str) -> str: function extract_room_id_from_session_id (line 235) | def extract_room_id_from_session_id(session_id: str) -> str: function add_at_mention_if_needed (line 244) | def add_at_mention_if_needed( function create_file_component (line 269) | def create_file_component(file_info: dict[str, Any]) -> tuple[Any, str]: function process_files (line 284) | def process_files( function format_poll (line 299) | def format_poll(poll: dict[str, Any]) -> str: function extract_sender_info (line 315) | def extract_sender_info( function create_base_message (line 335) | def create_base_message( function process_at_mention (line 375) | def process_at_mention( function cache_user_info (line 400) | def cache_user_info( function cache_room_info (line 428) | def cache_room_info( function resolve_component_url_or_path (line 449) | async def resolve_component_url_or_path( function summarize_component_for_log (line 515) | def summarize_component_for_log(comp: Any) -> dict[str, Any]: function upload_local_with_retries (line 528) | async def upload_local_with_retries( FILE: astrbot/core/platform/sources/qqofficial/qqofficial_message_event.py function _patch_qq_botpy_formdata (line 28) | def _patch_qq_botpy_formdata() -> None: class QQOfficialMessageEvent (line 48) | class QQOfficialMessageEvent(AstrMessageEvent): method __init__ (line 56) | def __init__( method send (line 68) | async def send(self, message: MessageChain) -> None: method send_streaming (line 72) | async def send_streaming(self, generator, use_fallback: bool = False): method _extract_response_message_id (line 152) | def _extract_response_message_id(ret) -> str | None: method _post_send (line 162) | async def _post_send(self, stream: dict | None = None): method _send_with_markdown_fallback (line 393) | async def _send_with_markdown_fallback( method upload_group_and_c2c_image (line 444) | async def upload_group_and_c2c_image( method upload_group_and_c2c_media (line 483) | async def upload_group_and_c2c_media( method post_c2c_message (line 541) | async def post_c2c_message( method _parse_to_qqofficial (line 578) | async def _parse_to_qqofficial(message: MessageChain): FILE: astrbot/core/platform/sources/qqofficial/qqofficial_platform_adapter.py class botClient (line 37) | class botClient(Client): method set_platform (line 38) | def set_platform(self, platform: QQOfficialPlatformAdapter) -> None: method on_group_at_message_create (line 42) | async def on_group_at_message_create( method on_at_message_create (line 55) | async def on_at_message_create(self, message: botpy.message.Message) -... method on_direct_message_create (line 66) | async def on_direct_message_create( method on_c2c_message_create (line 78) | async def on_c2c_message_create(self, message: botpy.message.C2CMessag... method _commit (line 87) | def _commit(self, abm: AstrBotMessage) -> None: class QQOfficialPlatformAdapter (line 101) | class QQOfficialPlatformAdapter(Platform): method __init__ (line 102) | def __init__( method send_by_session (line 139) | async def send_by_session( method _send_by_session_common (line 146) | async def _send_by_session_common( method remember_session_message_id (line 304) | def remember_session_message_id(self, session_id: str, message_id: str... method remember_session_scene (line 309) | def remember_session_scene(self, session_id: str, scene: str) -> None: method _extract_message_id (line 314) | def _extract_message_id(self, ret: Any) -> str | None: method meta (line 323) | def meta(self) -> PlatformMetadata: method _normalize_attachment_url (line 332) | def _normalize_attachment_url(url: str | None) -> str: method _append_attachments (line 340) | def _append_attachments( method _parse_face_message (line 395) | def _parse_face_message(content: str) -> str: method _parse_from_qqofficial (line 436) | def _parse_from_qqofficial( method run (line 503) | def run(self): method get_client (line 506) | def get_client(self) -> botClient: method terminate (line 509) | async def terminate(self) -> None: FILE: astrbot/core/platform/sources/qqofficial_webhook/qo_webhook_adapter.py class botClient (line 26) | class botClient(Client): method set_platform (line 27) | def set_platform(self, platform: "QQOfficialWebhookPlatformAdapter") -... method on_group_at_message_create (line 31) | async def on_group_at_message_create( method on_at_message_create (line 44) | async def on_at_message_create(self, message: botpy.message.Message) -... method on_direct_message_create (line 55) | async def on_direct_message_create( method on_c2c_message_create (line 67) | async def on_c2c_message_create(self, message: botpy.message.C2CMessag... method _commit (line 76) | def _commit(self, abm: AstrBotMessage) -> None: class QQOfficialWebhookPlatformAdapter (line 90) | class QQOfficialWebhookPlatformAdapter(Platform): method __init__ (line 91) | def __init__( method send_by_session (line 118) | async def send_by_session( method remember_session_message_id (line 129) | def remember_session_message_id(self, session_id: str, message_id: str... method remember_session_scene (line 134) | def remember_session_scene(self, session_id: str, scene: str) -> None: method _extract_message_id (line 139) | def _extract_message_id(self, ret: Any) -> str | None: method meta (line 148) | def meta(self) -> PlatformMetadata: method run (line 156) | async def run(self) -> None: method get_client (line 173) | def get_client(self) -> botClient: method webhook_callback (line 176) | async def webhook_callback(self, request: Any) -> Any: method terminate (line 184) | async def terminate(self) -> None: FILE: astrbot/core/platform/sources/qqofficial_webhook/qo_webhook_event.py class QQOfficialWebhookMessageEvent (line 8) | class QQOfficialWebhookMessageEvent(QQOfficialMessageEvent): method __init__ (line 9) | def __init__( FILE: astrbot/core/platform/sources/qqofficial_webhook/qo_webhook_server.py class QQOfficialWebhook (line 17) | class QQOfficialWebhook: method __init__ (line 18) | def __init__( method initialize (line 47) | async def initialize(self) -> None: method repeat_seed (line 66) | async def repeat_seed(self, bot_secret: str, target_size: int = 32) ->... method webhook_validation (line 72) | async def webhook_validation(self, validation_payload: dict): method callback (line 87) | async def callback(self): method handle_callback (line 91) | async def handle_callback(self, request) -> dict: method start_polling (line 140) | async def start_polling(self) -> None: method shutdown_trigger (line 150) | async def shutdown_trigger(self) -> None: FILE: astrbot/core/platform/sources/satori/satori_adapter.py class SatoriPlatformAdapter (line 34) | class SatoriPlatformAdapter(Platform): method __init__ (line 35) | def __init__( method send_by_session (line 72) | async def send_by_session( method meta (line 86) | def meta(self) -> PlatformMetadata: method _is_websocket_closed (line 89) | def _is_websocket_closed(self, ws) -> bool: method run (line 102) | async def run(self) -> None: method connect_websocket (line 136) | async def connect_websocket(self) -> None: method send_identify (line 184) | async def send_identify(self) -> None: method heartbeat_loop (line 212) | async def heartbeat_loop(self) -> None: method handle_message (line 237) | async def handle_message(self, message: str) -> None: method handle_event (line 278) | async def handle_event(self, event_data: dict) -> None: method convert_satori_message (line 310) | async def convert_satori_message( method _extract_namespace_prefixes (line 406) | def _extract_namespace_prefixes(self, content: str) -> set: method _extract_quote_element (line 458) | async def _extract_quote_element(self, content: str) -> dict | None: method _extract_quote_with_regex (line 529) | async def _extract_quote_with_regex(self, content: str) -> dict | None: method _convert_quote_message (line 552) | async def _convert_quote_message(self, quote: dict) -> AstrBotMessage ... method parse_satori_elements (line 592) | async def parse_satori_elements(self, content: str) -> list: method _parse_xml_node (line 637) | async def _parse_xml_node(self, node: ET.Element, elements: list) -> N... method handle_msg (line 723) | async def handle_msg(self, message: AstrBotMessage) -> None: method send_http_request (line 735) | async def send_http_request( method terminate (line 783) | async def terminate(self) -> None: FILE: astrbot/core/platform/sources/satori/satori_event.py class SatoriPlatformEvent (line 23) | class SatoriPlatformEvent(AstrMessageEvent): method __init__ (line 24) | def __init__( method send_with_adapter (line 56) | async def send_with_adapter( method send (line 113) | async def send(self, message: MessageChain) -> None: method send_streaming (line 163) | async def send_streaming(self, generator, use_fallback: bool = False): method _convert_component_to_satori (line 212) | async def _convert_component_to_satori(self, component) -> str: method _convert_node_to_satori (line 271) | async def _convert_node_to_satori(self, node: Node) -> str: method _convert_component_to_satori_static (line 305) | async def _convert_component_to_satori_static(cls, component) -> str: method _convert_node_to_satori_static (line 365) | async def _convert_node_to_satori_static(cls, node: Node) -> str: method _convert_nodes_to_satori (line 397) | async def _convert_nodes_to_satori(self, nodes: Nodes) -> str: method _convert_nodes_to_satori_static (line 416) | async def _convert_nodes_to_satori_static(cls, nodes: Nodes) -> str: FILE: astrbot/core/platform/sources/slack/client.py class SlackWebhookClient (line 19) | class SlackWebhookClient: method __init__ (line 22) | def __init__( method _setup_routes (line 47) | def _setup_routes(self) -> None: method handle_callback (line 60) | async def handle_callback(self, req): method start (line 108) | async def start(self) -> None: method shutdown_trigger (line 121) | async def shutdown_trigger(self) -> None: method stop (line 124) | async def stop(self) -> None: class SlackSocketClient (line 130) | class SlackSocketClient: method __init__ (line 133) | def __init__( method _handle_events (line 144) | async def _handle_events( method start (line 163) | async def start(self) -> None: method stop (line 177) | async def stop(self) -> None: FILE: astrbot/core/platform/sources/slack/slack_adapter.py class SlackAdapter (line 35) | class SlackAdapter(Platform): method __init__ (line 36) | def __init__( method send_by_session (line 80) | async def send_by_session( method convert_message (line 115) | async def convert_message(self, event: dict) -> AstrBotMessage: method _parse_blocks (line 209) | def _parse_blocks(self, blocks: list) -> list: method _handle_socket_event (line 288) | async def _handle_socket_event(self, req: SocketModeRequest) -> None: method get_bot_user_id (line 310) | async def get_bot_user_id(self): method get_file_base64 (line 314) | async def get_file_base64(self, url: str) -> str: method run (line 328) | async def run(self) -> None: method _handle_webhook_event (line 377) | async def _handle_webhook_event(self, event_data: dict) -> None: method webhook_callback (line 397) | async def webhook_callback(self, request: Any) -> Any: method terminate (line 404) | async def terminate(self) -> None: method meta (line 411) | def meta(self) -> PlatformMetadata: method handle_msg (line 414) | async def handle_msg(self, message: AstrBotMessage) -> None: method get_client (line 425) | def get_client(self): method unified_webhook (line 428) | def unified_webhook(self) -> bool: FILE: astrbot/core/platform/sources/slack/slack_event.py class SlackMessageEvent (line 19) | class SlackMessageEvent(AstrMessageEvent): method __init__ (line 20) | def __init__( method _from_segment_to_slack_block (line 32) | async def _from_segment_to_slack_block( method _parse_slack_blocks (line 91) | async def _parse_slack_blocks( method send (line 129) | async def send(self, message: MessageChain) -> None: method send_streaming (line 175) | async def send_streaming( method get_group (line 211) | async def get_group(self, group_id=None, **kwargs): FILE: astrbot/core/platform/sources/telegram/tg_adapter.py class TelegramPlatformAdapter (line 43) | class TelegramPlatformAdapter(Platform): method __init__ (line 44) | def __init__( method send_by_session (line 108) | async def send_by_session( method meta (line 122) | def meta(self) -> PlatformMetadata: method run (line 127) | async def run(self) -> None: method register_commands (line 152) | async def register_commands(self) -> None: method collect_commands (line 170) | def collect_commands(self) -> list[BotCommand]: method _extract_command_info (line 200) | def _extract_command_info( method start (line 241) | async def start(self, update: Update, context: ContextTypes.DEFAULT_TY... method message_handler (line 252) | async def message_handler( method convert_message (line 267) | async def convert_message( method handle_media_group_message (line 448) | async def handle_media_group_message( method process_media_group (line 509) | async def process_media_group(self, media_group_id: str) -> None: method handle_msg (line 555) | async def handle_msg(self, message: AstrBotMessage) -> None: method get_client (line 565) | def get_client(self) -> ExtBot: method terminate (line 568) | async def terminate(self) -> None: FILE: astrbot/core/platform/sources/telegram/tg_event.py function _is_gif (line 28) | def _is_gif(path: str) -> bool: class TelegramPlatformEvent (line 38) | class TelegramPlatformEvent(AstrMessageEvent): method _allocate_draft_id (line 54) | def _allocate_draft_id(cls) -> int: method __init__ (line 72) | def __init__( method _split_message (line 84) | def _split_message(cls, text: str) -> list[str]: method _send_chat_action (line 109) | async def _send_chat_action( method _get_chat_action_for_chain (line 126) | def _get_chat_action_for_chain(cls, chain: list[Any]) -> ChatAction | ... method _send_media_with_action (line 134) | async def _send_media_with_action( method _send_voice_with_fallback (line 160) | async def _send_voice_with_fallback( method _ensure_typing (line 222) | async def _ensure_typing( method send_typing (line 232) | async def send_typing(self) -> None: method send_with_client (line 245) | async def send_with_client( method send (line 334) | async def send(self, message: MessageChain) -> None: method react (line 341) | async def react(self, emoji: str | None, big: bool = False) -> None: method _send_message_draft (line 373) | async def _send_message_draft( method _process_chain_items (line 411) | async def _process_chain_items( method _send_final_segment (line 477) | async def _send_final_segment(self, delta: str, payload: dict[str, Any... method send_streaming (line 492) | async def send_streaming(self, generator, use_fallback: bool = False): method _send_streaming_draft (line 529) | async def _send_streaming_draft( method _send_streaming_edit (line 632) | async def _send_streaming_edit( FILE: astrbot/core/platform/sources/webchat/message_parts_helper.py function strip_message_parts_path_fields (line 31) | def strip_message_parts_path_fields(message_parts: list[dict]) -> list[d... function webchat_message_parts_have_content (line 35) | def webchat_message_parts_have_content(message_parts: list[dict]) -> bool: function parse_webchat_message_parts (line 43) | async def parse_webchat_message_parts( function build_webchat_message_parts (line 164) | async def build_webchat_message_parts( function webchat_message_parts_to_message_chain (line 238) | def webchat_message_parts_to_message_chain( function build_message_chain_from_payload (line 310) | async def build_message_chain_from_payload( function create_attachment_part_from_existing_file (line 330) | async def create_attachment_part_from_existing_file( function message_chain_to_storage_message_parts (line 362) | async def message_chain_to_storage_message_parts( function _copy_file_to_attachment_part (line 436) | async def _copy_file_to_attachment_part( FILE: astrbot/core/platform/sources/webchat/webchat_adapter.py function _extract_conversation_id (line 32) | def _extract_conversation_id(session_id: str) -> str: class QueueListener (line 41) | class QueueListener: method __init__ (line 42) | def __init__( method run (line 52) | async def run(self) -> None: class WebChatAdapter (line 62) | class WebChatAdapter(Platform): method __init__ (line 63) | def __init__( method send_by_session (line 86) | async def send_by_session( method _save_proactive_message (line 131) | async def _save_proactive_message( method _get_message_history (line 152) | async def _get_message_history( method _parse_message_parts (line 157) | async def _parse_message_parts( method convert_message (line 199) | async def convert_message(self, data: tuple) -> AstrBotMessage: method run (line 223) | def run(self) -> Coroutine[Any, Any, None]: method meta (line 231) | def meta(self) -> PlatformMetadata: method handle_msg (line 234) | async def handle_msg(self, message: AstrBotMessage) -> None: method terminate (line 252) | async def terminate(self) -> None: FILE: astrbot/core/platform/sources/webchat/webchat_event.py function _extract_conversation_id (line 17) | def _extract_conversation_id(session_id: str) -> str: class WebChatMessageEvent (line 26) | class WebChatMessageEvent(AstrMessageEvent): method __init__ (line 27) | def __init__(self, message_str, message_obj, platform_meta, session_id... method _send (line 32) | async def _send( method send (line 132) | async def send(self, message: MessageChain | None) -> None: method send_streaming (line 137) | async def send_streaming(self, generator, use_fallback: bool = False) ... FILE: astrbot/core/platform/sources/webchat/webchat_queue_mgr.py class WebChatQueueMgr (line 7) | class WebChatQueueMgr: method __init__ (line 8) | def __init__(self, queue_maxsize: int = 128, back_queue_maxsize: int =... method get_or_create_queue (line 21) | def get_or_create_queue(self, conversation_id: str) -> asyncio.Queue: method get_or_create_back_queue (line 29) | def get_or_create_back_queue( method remove_back_queue (line 46) | def remove_back_queue(self, request_id: str): method remove_queues (line 57) | def remove_queues(self, conversation_id: str) -> None: method remove_queue (line 66) | def remove_queue(self, conversation_id: str): method list_back_request_ids (line 78) | def list_back_request_ids(self, conversation_id: str) -> list[str]: method has_queue (line 82) | def has_queue(self, conversation_id: str) -> bool: method set_listener (line 86) | def set_listener( method clear_listener (line 94) | async def clear_listener(self) -> None: method _start_listener_if_needed (line 107) | def _start_listener_if_needed(self, conversation_id: str): method _listen_to_queue (line 128) | async def _listen_to_queue( FILE: astrbot/core/platform/sources/wecom/wecom_adapter.py class WecomServer (line 42) | class WecomServer: method __init__ (line 43) | def __init__(self, event_queue: asyncio.Queue, config: dict) -> None: method verify (line 68) | async def verify(self): method handle_verify (line 72) | async def handle_verify(self, request) -> str: method callback_command (line 96) | async def callback_command(self): method handle_callback (line 100) | async def handle_callback(self, request) -> str: method start_polling (line 127) | async def start_polling(self) -> None: method shutdown_trigger (line 137) | async def shutdown_trigger(self) -> None: class WecomPlatformAdapter (line 142) | class WecomPlatformAdapter(Platform): method __init__ (line 143) | def __init__( method send_by_session (line 215) | async def send_by_session( method meta (line 253) | def meta(self) -> PlatformMetadata: method run (line 263) | async def run(self) -> None: method webhook_callback (line 305) | async def webhook_callback(self, request: Any) -> Any: method convert_message (line 313) | async def convert_message(self, msg: BaseMessage) -> AstrBotMessage | ... method convert_wechat_kf_message (line 380) | async def convert_wechat_kf_message(self, msg: dict) -> AstrBotMessage... method handle_msg (line 435) | async def handle_msg(self, message: AstrBotMessage) -> None: method get_client (line 445) | def get_client(self) -> WeChatClient: method terminate (line 448) | async def terminate(self) -> None: FILE: astrbot/core/platform/sources/wecom/wecom_event.py class WecomPlatformEvent (line 15) | class WecomPlatformEvent(AstrMessageEvent): method __init__ (line 16) | def __init__( method send_with_client (line 28) | async def send_with_client( method split_plain (line 35) | async def split_plain(self, plain: str) -> list[str]: method send (line 81) | async def send(self, message: MessageChain) -> None: method send_streaming (line 288) | async def send_streaming(self, generator, use_fallback: bool = False): FILE: astrbot/core/platform/sources/wecom/wecom_kf.py class WeChatKF (line 27) | class WeChatKF(BaseWeChatAPI): method sync_msg (line 33) | def sync_msg(self, token, open_kfid, cursor="", limit=1000): method get_service_state (line 54) | def get_service_state(self, open_kfid, external_userid): method trans_service_state (line 74) | def trans_service_state( method get_servicer_list (line 97) | def get_servicer_list(self, open_kfid): method add_servicer (line 108) | def add_servicer(self, open_kfid, userid_list): method del_servicer (line 125) | def del_servicer(self, open_kfid, userid_list): method batchget_customer (line 142) | def batchget_customer(self, external_userid_list): method get_account_list (line 156) | def get_account_list(self): method add_contact_way (line 163) | def add_contact_way(self, open_kfid, scene): method get_upgrade_service_config (line 173) | def get_upgrade_service_config(self): method upgrade_service (line 180) | def upgrade_service( method cancel_upgrade_service (line 208) | def cancel_upgrade_service(self, open_kfid, external_userid): method send_msg_on_event (line 218) | def send_msg_on_event(self, code, msgtype, msg_content, msgid=None): method get_corp_statistic (line 235) | def get_corp_statistic(self, start_time, end_time, open_kfid=None): method get_servicer_statistic (line 246) | def get_servicer_statistic( method account_update (line 269) | def account_update(self, open_kfid, name, media_id): FILE: astrbot/core/platform/sources/wecom/wecom_kf_message.py class WeChatKFMessage (line 28) | class WeChatKFMessage(BaseWeChatAPI): method send (line 45) | def send(self, user_id, open_kfid, msgid="", msg=None): method send_text (line 68) | def send_text(self, user_id, open_kfid, content, msgid=""): method send_image (line 76) | def send_image(self, user_id, open_kfid, media_id, msgid=""): method send_voice (line 84) | def send_voice(self, user_id, open_kfid, media_id, msgid=""): method send_video (line 92) | def send_video(self, user_id, open_kfid, media_id, msgid=""): method send_file (line 103) | def send_file(self, user_id, open_kfid, media_id, msgid=""): method send_articles_link (line 111) | def send_articles_link(self, user_id, open_kfid, article, msgid=""): method send_msgmenu (line 125) | def send_msgmenu( method send_location (line 148) | def send_location( method send_miniprogram (line 173) | def send_miniprogram( FILE: astrbot/core/platform/sources/wecom_ai_bot/WXBizJsonMsgCrypt.py class FormatException (line 30) | class FormatException(Exception): function throw_exception (line 34) | def throw_exception(message, exception_class=FormatException) -> NoReturn: class SHA1 (line 39) | class SHA1: method getSHA1 (line 42) | def getSHA1(self, token, timestamp, nonce, encrypt): class JsonParse (line 66) | class JsonParse: method extract (line 77) | def extract(self, jsontext): method generate (line 89) | def generate(self, encrypt, signature, timestamp, nonce): class PKCS7Encoder (line 107) | class PKCS7Encoder: method encode (line 112) | def encode(self, text): method decode (line 129) | def decode(self, decrypted): class Prpcrypt (line 140) | class Prpcrypt: method __init__ (line 149) | def __init__(self, key) -> None: method encrypt (line 155) | def encrypt(self, text, receiveid): method decrypt (line 183) | def decrypt(self, text, receiveid): method get_random_str (line 213) | def get_random_str(self): class WXBizJsonMsgCrypt (line 222) | class WXBizJsonMsgCrypt: method __init__ (line 224) | def __init__(self, sToken, sEncodingAESKey, sReceiveId) -> None: method VerifyURL (line 242) | def VerifyURL(self, sMsgSignature, sTimeStamp, sNonce, sEchoStr): method EncryptMsg (line 253) | def EncryptMsg(self, sReplyMsg, sNonce, timestamp=None): method DecryptMsg (line 275) | def DecryptMsg(self, sPostData, sMsgSignature, sTimeStamp, sNonce): FILE: astrbot/core/platform/sources/wecom_ai_bot/wecomai_adapter.py class WecomAIQueueListener (line 46) | class WecomAIQueueListener: method __init__ (line 49) | def __init__( method run (line 57) | async def run(self) -> None: class WecomAIBotAdapter (line 69) | class WecomAIBotAdapter(Platform): method __init__ (line 72) | def __init__( method _handle_queued_message (line 174) | async def _handle_queued_message(self, data: dict) -> None: method _process_message (line 182) | async def _process_message( method _process_long_connection_payload (line 359) | async def _process_long_connection_payload( method _send_long_connection_respond_welcome (line 413) | async def _send_long_connection_respond_welcome(self, req_id: str) -> ... method _send_long_connection_respond_msg (line 428) | async def _send_long_connection_respond_msg( method _extract_session_id (line 442) | def _extract_session_id(self, message_data: dict[str, Any]) -> str: method _enqueue_message (line 454) | async def _enqueue_message( method convert_message (line 473) | async def convert_message(self, payload: dict) -> AstrBotMessage: method send_by_session (line 564) | async def send_by_session( method run (line 588) | def run(self) -> Awaitable[Any]: method webhook_callback (line 625) | async def webhook_callback(self, request: Any) -> Any: method terminate (line 635) | async def terminate(self) -> None: method meta (line 644) | def meta(self) -> PlatformMetadata: method handle_msg (line 648) | async def handle_msg(self, message: AstrBotMessage) -> None: method get_client (line 672) | def get_client(self) -> WecomAIBotAPIClient | None: method get_server (line 676) | def get_server(self) -> WecomAIBotServer | None: FILE: astrbot/core/platform/sources/wecom_ai_bot/wecomai_api.py class WecomAIBotAPIClient (line 19) | class WecomAIBotAPIClient: method __init__ (line 22) | def __init__(self, token: str, encoding_aes_key: str) -> None: method decrypt_message (line 34) | async def decrypt_message( method encrypt_message (line 82) | async def encrypt_message( method verify_url (line 113) | def verify_url( method process_encrypted_image (line 151) | async def process_encrypted_image( class WecomAIBotStreamMessageBuilder (line 226) | class WecomAIBotStreamMessageBuilder: method make_text_stream (line 230) | def make_text_stream(stream_id: str, content: str, finish: bool = Fals... method make_image_stream (line 249) | def make_image_stream( method make_mixed_stream (line 284) | def make_mixed_stream( method make_text (line 311) | def make_text(content: str) -> str: class WecomAIBotMessageParser (line 325) | class WecomAIBotMessageParser: method parse_text_message (line 329) | def parse_text_message(data: dict[str, Any]) -> str | None: method parse_image_message (line 346) | def parse_image_message(data: dict[str, Any]) -> str | None: method parse_stream_message (line 363) | def parse_stream_message(data: dict[str, Any]) -> dict[str, Any] | None: method parse_mixed_message (line 386) | def parse_mixed_message(data: dict[str, Any]) -> list | None: method parse_event_message (line 403) | def parse_event_message(data: dict[str, Any]) -> dict[str, Any] | None: FILE: astrbot/core/platform/sources/wecom_ai_bot/wecomai_event.py class WecomAIBotMessageEvent (line 15) | class WecomAIBotMessageEvent(AstrMessageEvent): method __init__ (line 20) | def __init__( method _mark_stream_complete (line 49) | async def _mark_stream_complete(self, stream_id: str) -> None: method _send (line 61) | async def _send( method _extract_plain_text_from_chain (line 128) | def _extract_plain_text_from_chain(message_chain: MessageChain | None)... method send (line 139) | async def send(self, message: MessageChain | None) -> None: method send_streaming (line 206) | async def send_streaming(self, generator, use_fallback=False) -> None: FILE: astrbot/core/platform/sources/wecom_ai_bot/wecomai_long_connection.py class WecomAIBotLongConnectionClient (line 14) | class WecomAIBotLongConnectionClient: method __init__ (line 17) | def __init__( method gen_req_id (line 39) | def gen_req_id() -> str: method start (line 42) | async def start(self) -> None: method _run_once (line 58) | async def _run_once(self) -> None: method _subscribe (line 90) | async def _subscribe(self) -> None: method _heartbeat_loop (line 113) | async def _heartbeat_loop(self) -> None: method _handle_text_message (line 124) | async def _handle_text_message(self, text: str) -> None: method send_command (line 151) | async def send_command( method _send_and_wait_response (line 199) | async def _send_and_wait_response( method _send_json (line 221) | async def _send_json(self, payload: dict[str, Any]) -> None: method shutdown (line 228) | async def shutdown(self) -> None: FILE: astrbot/core/platform/sources/wecom_ai_bot/wecomai_queue_mgr.py class WecomAIQueueMgr (line 14) | class WecomAIQueueMgr: method __init__ (line 17) | def __init__(self, queue_maxsize: int = 128, back_queue_maxsize: int =... method get_or_create_queue (line 34) | def get_or_create_queue(self, session_id: str) -> asyncio.Queue: method get_or_create_back_queue (line 51) | def get_or_create_back_queue(self, session_id: str) -> asyncio.Queue: method remove_queues (line 68) | def remove_queues(self, session_id: str, mark_finished: bool = False) ... method remove_queue (line 89) | def remove_queue(self, session_id: str): method has_queue (line 103) | def has_queue(self, session_id: str) -> bool: method has_back_queue (line 115) | def has_back_queue(self, session_id: str) -> bool: method set_pending_response (line 127) | def set_pending_response( method get_pending_response (line 143) | def get_pending_response(self, session_id: str) -> dict[str, Any] | None: method is_stream_finished (line 155) | def is_stream_finished( method cleanup_expired_responses (line 169) | def cleanup_expired_responses(self, max_age_seconds: int = 300) -> None: method set_listener (line 194) | def set_listener( method _start_listener_if_needed (line 202) | def _start_listener_if_needed(self, session_id: str): method _listen_to_queue (line 221) | async def _listen_to_queue( method get_stats (line 254) | def get_stats(self) -> dict[str, int]: FILE: astrbot/core/platform/sources/wecom_ai_bot/wecomai_server.py class WecomAIBotServer (line 17) | class WecomAIBotServer: method __init__ (line 20) | def __init__( method _setup_routes (line 46) | def _setup_routes(self) -> None: method verify_url (line 61) | async def verify_url(self): method handle_verify (line 65) | async def handle_verify(self, request): method handle_message (line 94) | async def handle_message(self): method handle_callback (line 98) | async def handle_callback(self, request): method start_server (line 165) | async def start_server(self) -> None: method shutdown_trigger (line 179) | async def shutdown_trigger(self) -> None: method shutdown (line 183) | async def shutdown(self) -> None: method get_app (line 188) | def get_app(self): FILE: astrbot/core/platform/sources/wecom_ai_bot/wecomai_utils.py class WecomAIBotConstants (line 19) | class WecomAIBotConstants: function generate_random_string (line 45) | def generate_random_string(length: int = 10) -> str: function calculate_image_md5 (line 59) | def calculate_image_md5(image_data: bytes) -> str: function encode_image_base64 (line 72) | def encode_image_base64(image_data: bytes) -> str: function format_session_id (line 85) | def format_session_id(session_type: str, session_id: str) -> str: function parse_session_id (line 99) | def parse_session_id(formatted_session_id: str) -> tuple[str, str]: function safe_json_loads (line 120) | def safe_json_loads(json_str: str, default: Any = None) -> Any: function format_error_response (line 140) | def format_error_response(error_code: int, error_msg: str) -> str: function process_encrypted_image (line 154) | async def process_encrypted_image( FILE: astrbot/core/platform/sources/wecom_ai_bot/wecomai_webhook.py class WecomAIBotWebhookError (line 20) | class WecomAIBotWebhookError(RuntimeError): class WecomAIBotWebhookClient (line 24) | class WecomAIBotWebhookClient: method __init__ (line 27) | def __init__(self, webhook_url: str, timeout_seconds: int = 15) -> None: method _extract_webhook_key (line 34) | def _extract_webhook_key(self) -> str: method _build_upload_url (line 41) | def _build_upload_url(self, media_type: Literal["file", "voice"]) -> str: method _split_markdown_v2_content (line 46) | def _split_markdown_v2_content(content: str, max_bytes: int = 4096) ->... method send_payload (line 65) | async def send_payload(self, payload: dict[str, Any]) -> None: method send_markdown_v2 (line 81) | async def send_markdown_v2(self, content: str) -> None: method send_image_base64 (line 90) | async def send_image_base64(self, image_base64: str) -> None: method upload_media (line 103) | async def upload_media( method send_file (line 141) | async def send_file(self, file_path: Path) -> None: method send_voice (line 150) | async def send_voice(self, file_path: Path) -> None: method is_stream_supported_component (line 160) | def is_stream_supported_component(component: Any) -> bool: method send_message_chain (line 163) | async def send_message_chain( FILE: astrbot/core/platform/sources/weixin_official_account/weixin_offacc_adapter.py class WeixinOfficialAccountServer (line 41) | class WeixinOfficialAccountServer: method __init__ (line 42) | def __init__( method verify (line 77) | async def verify(self): method handle_verify (line 81) | async def handle_verify(self, request) -> str: method callback_command (line 109) | async def callback_command(self): method _maybe_encrypt (line 113) | def _maybe_encrypt(self, xml: str, nonce: str | None, timestamp: str |... method _preview (line 118) | def _preview(self, msg: BaseMessage, limit: int = 24) -> str: method handle_callback (line 129) | async def handle_callback(self, request) -> str: method start_polling (line 301) | async def start_polling(self) -> None: method shutdown_trigger (line 311) | async def shutdown_trigger(self) -> None: class WeixinOfficialAccountPlatformAdapter (line 318) | class WeixinOfficialAccountPlatformAdapter(Platform): method __init__ (line 319) | def __init__( method send_by_session (line 394) | async def send_by_session( method meta (line 402) | def meta(self) -> PlatformMetadata: method run (line 412) | async def run(self) -> None: method webhook_callback (line 422) | async def webhook_callback(self, request: Any) -> Any: method convert_message (line 430) | async def convert_message( method handle_msg (line 512) | async def handle_msg(self, message: AstrBotMessage) -> None: method get_client (line 529) | def get_client(self) -> WeChatClient: method terminate (line 532) | async def terminate(self) -> None: FILE: astrbot/core/platform/sources/weixin_official_account/weixin_offacc_event.py class WeixinOfficialAccountPlatformEvent (line 15) | class WeixinOfficialAccountPlatformEvent(AstrMessageEvent): method __init__ (line 16) | def __init__( method send_with_client (line 30) | async def send_with_client( method split_plain (line 37) | async def split_plain(self, plain: str, max_length: int = 1024) -> lis... method send (line 83) | async def send(self, message: MessageChain) -> None: method send_streaming (line 178) | async def send_streaming(self, generator, use_fallback: bool = False): FILE: astrbot/core/platform_message_history_mgr.py class PlatformMessageHistoryManager (line 5) | class PlatformMessageHistoryManager: method __init__ (line 6) | def __init__(self, db_helper: BaseDatabase) -> None: method insert (line 9) | async def insert( method get (line 26) | async def get( method delete (line 43) | async def delete( FILE: astrbot/core/provider/entities.py class ProviderType (line 27) | class ProviderType(enum.Enum): class ProviderMeta (line 36) | class ProviderMeta: class ProviderMetaData (line 50) | class ProviderMetaData(ProviderMeta): class ToolCallsResult (line 64) | class ToolCallsResult: method to_openai_messages (line 72) | def to_openai_messages(self) -> list[dict]: method to_openai_messages_model (line 79) | def to_openai_messages_model( class ProviderRequest (line 89) | class ProviderRequest: method __repr__ (line 114) | def __repr__(self) -> str: method __str__ (line 124) | def __str__(self) -> str: method append_tool_calls_result (line 127) | def append_tool_calls_result(self, tool_calls_result: ToolCallsResult)... method _print_friendly_context (line 135) | def _print_friendly_context(self): method assemble_context (line 170) | async def assemble_context(self) -> dict: method _encode_image_bs64 (line 217) | async def _encode_image_bs64(self, image_url: str) -> str: class TokenUsage (line 228) | class TokenUsage: method total (line 237) | def total(self) -> int: method input (line 241) | def input(self) -> int: method __add__ (line 244) | def __add__(self, other: TokenUsage) -> TokenUsage: method __sub__ (line 251) | def __sub__(self, other: TokenUsage) -> TokenUsage: class LLMResponse (line 260) | class LLMResponse: method __init__ (line 294) | def __init__( method completion_text (line 353) | def completion_text(self): method completion_text (line 359) | def completion_text(self, value) -> None: method to_openai_tool_calls (line 370) | def to_openai_tool_calls(self) -> list[dict]: method to_openai_to_calls_model (line 389) | def to_openai_to_calls_model(self) -> list[ToolCall]: class RerankResult (line 410) | class RerankResult: FILE: astrbot/core/provider/func_tool_manager.py class MCPInitError (line 31) | class MCPInitError(Exception): class MCPInitTimeoutError (line 35) | class MCPInitTimeoutError(asyncio.TimeoutError, MCPInitError): class MCPAllServicesFailedError (line 39) | class MCPAllServicesFailedError(MCPInitError): class MCPShutdownTimeoutError (line 43) | class MCPShutdownTimeoutError(asyncio.TimeoutError): method __init__ (line 46) | def __init__(self, names: list[str], timeout: float) -> None: class MCPInitSummary (line 54) | class MCPInitSummary: class _MCPServerRuntime (line 61) | class _MCPServerRuntime: class _MCPClientDictView (line 68) | class _MCPClientDictView(Mapping[str, MCPClient]): method __init__ (line 71) | def __init__(self, runtime: dict[str, _MCPServerRuntime]) -> None: method __getitem__ (line 74) | def __getitem__(self, key: str) -> MCPClient: method __iter__ (line 77) | def __iter__(self): method __len__ (line 80) | def __len__(self) -> int: function _resolve_timeout (line 84) | def _resolve_timeout( function _prepare_config (line 143) | def _prepare_config(config: dict) -> dict: function _quick_test_mcp_connection (line 152) | async def _quick_test_mcp_connection(config: dict) -> tuple[bool, str]: class FunctionToolManager (line 207) | class FunctionToolManager: method __init__ (line 208) | def __init__(self) -> None: method mcp_client_dict (line 234) | def mcp_client_dict(self) -> Mapping[str, MCPClient]: method mcp_server_runtime_view (line 242) | def mcp_server_runtime_view(self) -> Mapping[str, _MCPServerRuntime]: method mcp_server_runtime (line 247) | def mcp_server_runtime(self) -> Mapping[str, _MCPServerRuntime]: method empty (line 254) | def empty(self) -> bool: method spec_to_func (line 257) | def spec_to_func( method add_func (line 279) | def add_func( method remove_func (line 306) | def remove_func(self, name: str) -> None: method get_func (line 313) | def get_func(self, name) -> FuncTool | None: method get_full_tool_set (line 318) | def get_full_tool_set(self) -> ToolSet: method _log_safe_mcp_debug_config (line 324) | def _log_safe_mcp_debug_config(cfg: dict) -> None: method init_mcp_clients (line 348) | async def init_mcp_clients( method _start_mcp_server (line 452) | async def _start_mcp_server( method _shutdown_runtimes (line 515) | async def _shutdown_runtimes( method _cleanup_mcp_client_safely (line 568) | async def _cleanup_mcp_client_safely( method _init_mcp_client (line 579) | async def _init_mcp_client(self, name: str, config: dict) -> MCPClient: method _terminate_mcp_client (line 614) | async def _terminate_mcp_client(self, name: str) -> None: method test_mcp_server_connection (line 644) | async def test_mcp_server_connection(config: dict) -> list[str]: method enable_mcp_server (line 661) | async def enable_mcp_server( method disable_mcp_server (line 696) | async def disable_mcp_server( method _warn_on_timeout_mismatch (line 724) | def _warn_on_timeout_mismatch( method get_func_desc_openai_style (line 742) | def get_func_desc_openai_style(self, omit_empty_parameter_field=False)... method get_func_desc_anthropic_style (line 750) | def get_func_desc_anthropic_style(self) -> list: method get_func_desc_google_genai_style (line 756) | def get_func_desc_google_genai_style(self) -> dict: method deactivate_llm_tool (line 762) | def deactivate_llm_tool(self, name: str) -> bool: method activate_llm_tool (line 792) | def activate_llm_tool(self, name: str, star_map: dict) -> bool: method mcp_config_path (line 822) | def mcp_config_path(self): method load_mcp_config (line 826) | def load_mcp_config(self): method save_mcp_config (line 841) | def save_mcp_config(self, config: dict) -> bool: method sync_modelscope_mcp_servers (line 850) | async def sync_modelscope_mcp_servers(self, access_token: str) -> None: method __str__ (line 916) | def __str__(self) -> str: method __repr__ (line 919) | def __repr__(self) -> str: FILE: astrbot/core/provider/manager.py class HasInitialize (line 27) | class HasInitialize(Protocol): method initialize (line 28) | async def initialize(self) -> None: ... class ProviderManager (line 31) | class ProviderManager: method __init__ (line 32) | def __init__( method set_provider_change_callback (line 84) | def set_provider_change_callback( method register_provider_change_hook (line 92) | def register_provider_change_hook( method _notify_provider_changed (line 99) | def _notify_provider_changed( method persona_configs (line 129) | def persona_configs(self) -> list: method personas (line 134) | def personas(self) -> list: method selected_default_persona (line 139) | def selected_default_persona(self): method set_provider (line 143) | async def set_provider( method get_provider_by_id (line 209) | async def get_provider_by_id(self, provider_id: str) -> Providers | None: method get_using_provider (line 213) | def get_using_provider( method initialize (line 273) | async def initialize(self) -> None: method dynamic_import_provider (line 346) | def dynamic_import_provider(self, type: str) -> None: method get_merged_provider_config (line 467) | def get_merged_provider_config(self, provider_config: dict) -> dict: method _resolve_env_key_list (line 490) | def _resolve_env_key_list(self, provider_config: dict) -> dict: method load_provider (line 517) | async def load_provider(self, provider_config: dict) -> None: method reload (line 674) | async def reload(self, provider_config: dict) -> None: method get_insts (line 717) | def get_insts(self): method terminate_provider (line 720) | async def terminate_provider(self, provider_id: str) -> None: method delete_provider (line 754) | async def delete_provider( method update_provider (line 776) | async def update_provider(self, origin_provider_id: str, new_config: d... method create_provider (line 800) | async def create_provider(self, new_config: dict) -> None: method terminate (line 818) | async def terminate(self) -> None: FILE: astrbot/core/provider/provider.py class AbstractProvider (line 27) | class AbstractProvider(abc.ABC): method __init__ (line 30) | def __init__(self, provider_config: dict) -> None: method set_model (line 35) | def set_model(self, model_name: str) -> None: method get_model (line 39) | def get_model(self) -> str: method meta (line 43) | def meta(self) -> ProviderMeta: method test (line 57) | async def test(self) -> None: class Provider (line 66) | class Provider(AbstractProvider): method __init__ (line 69) | def __init__( method get_current_key (line 78) | def get_current_key(self) -> str: method get_keys (line 81) | def get_keys(self) -> list[str]: method set_key (line 87) | def set_key(self, key: str) -> None: method get_models (line 91) | async def get_models(self) -> list[str]: method text_chat (line 96) | async def text_chat( method text_chat_stream (line 128) | async def text_chat_stream( method pop_record (line 160) | async def pop_record(self, context: list) -> None: method _ensure_message_to_dicts (line 175) | def _ensure_message_to_dicts( method test (line 191) | async def test(self, timeout: float = 45.0) -> None: class STTProvider (line 198) | class STTProvider(AbstractProvider): method __init__ (line 199) | def __init__(self, provider_config: dict, provider_settings: dict) -> ... method get_text (line 205) | async def get_text(self, audio_url: str) -> str: method test (line 209) | async def test(self) -> None: class TTSProvider (line 218) | class TTSProvider(AbstractProvider): method __init__ (line 219) | def __init__(self, provider_config: dict, provider_settings: dict) -> ... method support_stream (line 224) | def support_stream(self) -> bool: method get_audio (line 236) | async def get_audio(self, text: str) -> str: method get_audio_stream (line 240) | async def get_audio_stream( method test (line 283) | async def test(self) -> None: class EmbeddingProvider (line 304) | class EmbeddingProvider(AbstractProvider): method __init__ (line 305) | def __init__(self, provider_config: dict, provider_settings: dict) -> ... method get_embedding (line 311) | async def get_embedding(self, text: str) -> list[float]: method get_embeddings (line 316) | async def get_embeddings(self, text: list[str]) -> list[list[float]]: method get_dim (line 321) | def get_dim(self) -> int: method test (line 325) | async def test(self) -> None: method get_embeddings_batch (line 328) | async def get_embeddings_batch( class RerankProvider (line 396) | class RerankProvider(AbstractProvider): method __init__ (line 397) | def __init__(self, provider_config: dict, provider_settings: dict) -> ... method rerank (line 403) | async def rerank( method test (line 412) | async def test(self) -> None: FILE: astrbot/core/provider/register.py function register_provider_adapter (line 14) | def register_provider_adapter( FILE: astrbot/core/provider/sources/anthropic_source.py class ProviderAnthropic (line 30) | class ProviderAnthropic(Provider): method _normalize_custom_headers (line 32) | def _normalize_custom_headers(provider_config: dict) -> dict[str, str]... method _resolve_custom_headers (line 42) | def _resolve_custom_headers( method __init__ (line 55) | def __init__( method _init_api_key (line 79) | def _init_api_key(self, provider_config: dict) -> None: method _create_http_client (line 90) | def _create_http_client(self, provider_config: dict) -> httpx.AsyncCli... method _apply_thinking_config (line 100) | def _apply_thinking_config(self, payloads: dict) -> None: method _prepare_payload (line 116) | def _prepare_payload(self, messages: list[dict]): method _extract_usage (line 241) | def _extract_usage(self, usage: Usage) -> TokenUsage: method _update_usage (line 249) | def _update_usage(self, token_usage: TokenUsage, usage: MessageDeltaUs... method _query (line 257) | async def _query(self, payloads: dict, tools: ToolSet | None) -> LLMRe... method _query_stream (line 329) | async def _query_stream( method text_chat (line 475) | async def text_chat( method text_chat_stream (line 532) | async def text_chat_stream( method _detect_image_mime_type (line 583) | def _detect_image_mime_type(self, data: bytes) -> str: method assemble_context (line 595) | async def assemble_context( method encode_image_bs64 (line 674) | async def encode_image_bs64(self, image_url: str) -> tuple[str, str]: method get_current_key (line 691) | def get_current_key(self) -> str: method get_models (line 694) | async def get_models(self) -> list[str]: method set_key (line 702) | def set_key(self, key: str) -> None: method terminate (line 705) | async def terminate(self): FILE: astrbot/core/provider/sources/azure_tts_source.py class OTTSProvider (line 26) | class OTTSProvider: method __init__ (line 27) | def __init__(self, config: dict) -> None: method client (line 41) | def client(self) -> AsyncClient: method __aenter__ (line 48) | async def __aenter__(self): method __aexit__ (line 54) | async def __aexit__(self, exc_type, exc_val, exc_tb): method _sync_time (line 59) | async def _sync_time(self) -> None: method _generate_signature (line 71) | async def _generate_signature(self) -> str: method get_audio (line 80) | async def get_audio(self, text: str, voice_params: dict) -> str: class AzureNativeProvider (line 113) | class AzureNativeProvider(TTSProvider): method __init__ (line 114) | def __init__(self, provider_config: dict, provider_settings: dict) -> ... method client (line 141) | def client(self) -> AsyncClient: method __aenter__ (line 148) | async def __aenter__(self): method __aexit__ (line 159) | async def __aexit__(self, exc_type, exc_val, exc_tb): method _refresh_token (line 164) | async def _refresh_token(self) -> None: method get_audio (line 176) | async def get_audio(self, text: str) -> str: class AzureTTSProvider (line 209) | class AzureTTSProvider(TTSProvider): method __init__ (line 210) | def __init__(self, provider_config: dict, provider_settings: dict) -> ... method _parse_provider (line 215) | def _parse_provider( method get_audio (line 243) | async def get_audio(self, text: str) -> str: FILE: astrbot/core/provider/sources/bailian_rerank_source.py class BailianRerankError (line 12) | class BailianRerankError(Exception): class BailianAPIError (line 18) | class BailianAPIError(BailianRerankError): class BailianNetworkError (line 24) | class BailianNetworkError(BailianRerankError): class BailianRerankProvider (line 33) | class BailianRerankProvider(RerankProvider): method __init__ (line 36) | def __init__(self, provider_config: dict, provider_settings: dict) -> ... method _build_payload (line 73) | def _build_payload( method _parse_results (line 108) | def _parse_results(self, data: dict) -> list[RerankResult]: method _log_usage (line 153) | def _log_usage(self, data: dict) -> None: method rerank (line 163) | async def rerank( method terminate (line 231) | async def terminate(self) -> None: FILE: astrbot/core/provider/sources/dashscope_tts.py class ProviderDashscopeTTSAPI (line 30) | class ProviderDashscopeTTSAPI(TTSProvider): method __init__ (line 31) | def __init__( method get_audio (line 43) | async def get_audio(self, text: str) -> str: method _call_qwen_tts (line 66) | def _call_qwen_tts(self, model: str, text: str): method _synthesize_with_qwen_tts (line 85) | async def _synthesize_with_qwen_tts( method _extract_audio_from_response (line 100) | async def _extract_audio_from_response(self, response) -> bytes | None: method _download_audio_from_url (line 119) | async def _download_audio_from_url(self, url: str) -> bytes | None: method _synthesize_with_cosyvoice (line 136) | async def _synthesize_with_cosyvoice( method _is_qwen_tts_model (line 161) | def _is_qwen_tts_model(self, model: str) -> bool: FILE: astrbot/core/provider/sources/edge_tts_source.py class ProviderEdgeTTS (line 29) | class ProviderEdgeTTS(TTSProvider): method __init__ (line 30) | def __init__( method get_audio (line 48) | async def get_audio(self, text: str) -> str: FILE: astrbot/core/provider/sources/fishaudio_tts_api_source.py class ServeReferenceAudio (line 18) | class ServeReferenceAudio(BaseModel): class ServeTTSRequest (line 23) | class ServeTTSRequest(BaseModel): class ProviderFishAudioTTSAPI (line 46) | class ProviderFishAudioTTSAPI(TTSProvider): method __init__ (line 47) | def __init__( method _get_reference_id_by_character (line 72) | async def _get_reference_id_by_character(self, character: str) -> str ... method _validate_reference_id (line 105) | def _validate_reference_id(self, reference_id: str) -> bool: method _generate_request (line 123) | async def _generate_request(self, text: str) -> ServeTTSRequest: method get_audio (line 144) | async def get_audio(self, text: str) -> str: FILE: astrbot/core/provider/sources/gemini_embedding_source.py class GeminiEmbeddingProvider (line 19) | class GeminiEmbeddingProvider(EmbeddingProvider): method __init__ (line 20) | def __init__(self, provider_config: dict, provider_settings: dict) -> ... method get_embedding (line 45) | async def get_embedding(self, text: str) -> list[float]: method get_embeddings (line 61) | async def get_embeddings(self, text: list[str]) -> list[list[float]]: method get_dim (line 81) | def get_dim(self) -> int: method terminate (line 85) | async def terminate(self): FILE: astrbot/core/provider/sources/gemini_source.py class SuppressNonTextPartsWarning (line 26) | class SuppressNonTextPartsWarning(logging.Filter): method filter (line 29) | def filter(self, record): class ProviderGoogleGenAI (line 40) | class ProviderGoogleGenAI(Provider): method __init__ (line 55) | def __init__( method _init_client (line 76) | def _init_client(self) -> None: method _init_safety_settings (line 91) | def _init_safety_settings(self) -> None: method _handle_api_error (line 104) | async def _handle_api_error(self, e: APIError, keys: list[str]) -> bool: method _prepare_query_config (line 130) | async def _prepare_query_config( method _prepare_conversation (line 282) | def _prepare_conversation(self, payloads: dict) -> list[types.Content]: method _extract_reasoning_content (line 413) | def _extract_reasoning_content(self, candidate: types.Candidate) -> str: method _extract_usage (line 423) | def _extract_usage( method _process_content_parts (line 433) | def _process_content_parts( method _query (line 516) | async def _query(self, payloads: dict, tools: ToolSet | None) -> LLMRe... method _query_stream (line 600) | async def _query_stream( method text_chat (line 720) | async def text_chat( method text_chat_stream (line 775) | async def text_chat_stream( method get_models (line 830) | async def get_models(self): method get_current_key (line 843) | def get_current_key(self) -> str: method get_keys (line 846) | def get_keys(self) -> list[str]: method set_key (line 849) | def set_key(self, key) -> None: method assemble_context (line 853) | async def assemble_context( method encode_image_bs64 (line 923) | async def encode_image_bs64(self, image_url: str) -> str: method terminate (line 931) | async def terminate(self) -> None: FILE: astrbot/core/provider/sources/gemini_tts_source.py class ProviderGeminiTTSAPI (line 21) | class ProviderGeminiTTSAPI(TTSProvider): method __init__ (line 22) | def __init__( method get_audio (line 51) | async def get_audio(self, text: str) -> str: method terminate (line 88) | async def terminate(self): FILE: astrbot/core/provider/sources/genie_tts.py class GenieTTSProvider (line 22) | class GenieTTSProvider(TTSProvider): method __init__ (line 23) | def __init__( method support_stream (line 53) | def support_stream(self) -> bool: method get_audio (line 56) | async def get_audio(self, text: str) -> str: method get_audio_stream (line 83) | async def get_audio_stream( FILE: astrbot/core/provider/sources/groq_source.py class ProviderGroq (line 8) | class ProviderGroq(ProviderOpenAIOfficial): method __init__ (line 9) | def __init__( method _finally_convert_payload (line 17) | def _finally_convert_payload(self, payloads: dict) -> None: FILE: astrbot/core/provider/sources/gsv_selfhosted_source.py class ProviderGSVTTS (line 20) | class ProviderGSVTTS(TTSProvider): method __init__ (line 21) | def __init__( method initialize (line 42) | async def initialize(self) -> None: method get_session (line 54) | def get_session(self) -> aiohttp.ClientSession: method _make_request (line 61) | async def _make_request( method _set_model_weights (line 88) | async def _set_model_weights(self) -> None: method get_audio (line 115) | async def get_audio(self, text: str) -> str: method build_synthesis_params (line 137) | def build_synthesis_params(self, text: str) -> dict: method terminate (line 147) | async def terminate(self) -> None: FILE: astrbot/core/provider/sources/gsvi_tts_source.py class ProviderGSVITTS (line 19) | class ProviderGSVITTS(TTSProvider): method __init__ (line 20) | def __init__( method get_audio (line 31) | async def get_audio(self, text: str) -> str: FILE: astrbot/core/provider/sources/kimi_code_source.py class ProviderKimiCode (line 13) | class ProviderKimiCode(ProviderAnthropic): method __init__ (line 14) | def __init__( FILE: astrbot/core/provider/sources/minimax_tts_api_source.py class ProviderMiniMaxTTSAPI (line 21) | class ProviderMiniMaxTTSAPI(TTSProvider): method __init__ (line 22) | def __init__( method _build_tts_stream_body (line 78) | def _build_tts_stream_body(self, text: str): method _call_tts_stream (line 93) | async def _call_tts_stream(self, text: str) -> AsyncIterator[str]: method _audio_play (line 139) | async def _audio_play(self, audio_stream: AsyncIterator[str]) -> bytes: method get_audio (line 147) | async def get_audio(self, text: str) -> str: FILE: astrbot/core/provider/sources/oai_aihubmix_source.py class ProviderAIHubMix (line 8) | class ProviderAIHubMix(ProviderOpenAIOfficial): method __init__ (line 9) | def __init__( FILE: astrbot/core/provider/sources/openai_embedding_source.py class OpenAIEmbeddingProvider (line 16) | class OpenAIEmbeddingProvider(EmbeddingProvider): method __init__ (line 17) | def __init__(self, provider_config: dict, provider_settings: dict) -> ... method get_embedding (line 39) | async def get_embedding(self, text: str) -> list[float]: method get_embeddings (line 49) | async def get_embeddings(self, text: list[str]) -> list[list[float]]: method _embedding_kwargs (line 59) | def _embedding_kwargs(self) -> dict: method get_dim (line 71) | def get_dim(self) -> int: method terminate (line 82) | async def terminate(self): FILE: astrbot/core/provider/sources/openai_source.py class ProviderOpenAIOfficial (line 40) | class ProviderOpenAIOfficial(Provider): method _truncate_error_text_candidate (line 44) | def _truncate_error_text_candidate(cls, text: str) -> str: method _safe_json_dump (line 50) | def _safe_json_dump(value: Any) -> str | None: method _get_image_moderation_error_patterns (line 56) | def _get_image_moderation_error_patterns(self) -> list[str]: method _extract_error_text_candidates (line 72) | def _extract_error_text_candidates(error: Exception) -> list[str]: method _is_content_moderated_upload_error (line 110) | def _is_content_moderated_upload_error(self, error: Exception) -> bool: method _context_contains_image (line 126) | def _context_contains_image(contexts: list[dict]) -> bool: method _fallback_to_text_only_and_retry (line 136) | async def _fallback_to_text_only_and_retry( method _create_http_client (line 163) | def _create_http_client(self, provider_config: dict) -> httpx.AsyncCli... method __init__ (line 168) | def __init__(self, provider_config, provider_settings) -> None: method get_models (line 213) | async def get_models(self): method _query (line 224) | async def _query(self, payloads: dict, tools: ToolSet | None) -> LLMRe... method _query_stream (line 268) | async def _query_stream( method _extract_reasoning_content (line 348) | def _extract_reasoning_content( method _extract_usage (line 368) | def _extract_usage(self, usage: CompletionUsage | dict) -> TokenUsage: method _normalize_content (line 380) | def _normalize_content(raw_content: Any, strip: bool = True) -> str: method _parse_openai_completion (line 469) | async def _parse_openai_completion( method _prepare_chat_payload (line 553) | async def _prepare_chat_payload( method _finally_convert_payload (line 598) | def _finally_convert_payload(self, payloads: dict) -> None: method _handle_api_error (line 616) | async def _handle_api_error( method text_chat (line 721) | async def text_chat( method text_chat_stream (line 789) | async def text_chat_stream( method _remove_image_from_context (line 855) | async def _remove_image_from_context(self, contexts: list): method get_current_key (line 874) | def get_current_key(self) -> str: method get_keys (line 877) | def get_keys(self) -> list[str]: method set_key (line 880) | def set_key(self, key) -> None: method assemble_context (line 883) | async def assemble_context( method encode_image_bs64 (line 953) | async def encode_image_bs64(self, image_url: str) -> str: method terminate (line 961) | async def terminate(self): FILE: astrbot/core/provider/sources/openai_tts_api_source.py class ProviderOpenAITTSAPI (line 20) | class ProviderOpenAITTSAPI(TTSProvider): method __init__ (line 21) | def __init__( method get_audio (line 48) | async def get_audio(self, text: str) -> str: method terminate (line 62) | async def terminate(self): FILE: astrbot/core/provider/sources/openrouter_source.py class ProviderOpenRouter (line 8) | class ProviderOpenRouter(ProviderOpenAIOfficial): method __init__ (line 9) | def __init__( FILE: astrbot/core/provider/sources/sensevoice_selfhosted_source.py class ProviderSenseVoiceSTTSelfHost (line 31) | class ProviderSenseVoiceSTTSelfHost(STTProvider): method __init__ (line 32) | def __init__( method initialize (line 42) | async def initialize(self) -> None: method get_timestamped_path (line 53) | async def get_timestamped_path(self) -> str: method _is_silk_file (line 59) | async def _is_silk_file(self, file_path) -> bool: method get_text (line 68) | async def get_text(self, audio_url: str) -> str: FILE: astrbot/core/provider/sources/vllm_rerank_source.py class VLLMRerankProvider (line 15) | class VLLMRerankProvider(RerankProvider): method __init__ (line 16) | def __init__(self, provider_config: dict, provider_settings: dict) -> ... method rerank (line 34) | async def rerank( method terminate (line 68) | async def terminate(self) -> None: FILE: astrbot/core/provider/sources/volcengine_tts.py class ProviderVolcengineTTS (line 23) | class ProviderVolcengineTTS(TTSProvider): method __init__ (line 24) | def __init__(self, provider_config: dict, provider_settings: dict) -> ... method _build_request_payload (line 37) | def _build_request_payload(self, text: str) -> dict: method get_audio (line 62) | async def get_audio(self, text: str) -> str: FILE: astrbot/core/provider/sources/whisper_api_source.py class ProviderOpenAIWhisperAPI (line 24) | class ProviderOpenAIWhisperAPI(STTProvider): method __init__ (line 25) | def __init__( method _get_audio_format (line 41) | async def _get_audio_format(self, file_path) -> str | None: method get_text (line 59) | async def get_text(self, audio_url: str) -> str: method terminate (line 116) | async def terminate(self): FILE: astrbot/core/provider/sources/whisper_selfhosted_source.py class ProviderOpenAIWhisperSelfHost (line 23) | class ProviderOpenAIWhisperSelfHost(STTProvider): method __init__ (line 24) | def __init__( method initialize (line 33) | async def initialize(self) -> None: method _is_silk_file (line 43) | async def _is_silk_file(self, file_path) -> bool: method get_text (line 52) | async def get_text(self, audio_url: str) -> str: FILE: astrbot/core/provider/sources/xai_source.py class ProviderXAI (line 8) | class ProviderXAI(ProviderOpenAIOfficial): method __init__ (line 9) | def __init__( method _maybe_inject_xai_search (line 16) | def _maybe_inject_xai_search(self, payloads: dict) -> None: method _finally_convert_payload (line 27) | def _finally_convert_payload(self, payloads: dict) -> None: FILE: astrbot/core/provider/sources/xinference_rerank_source.py class XinferenceRerankProvider (line 22) | class XinferenceRerankProvider(RerankProvider): method __init__ (line 23) | def __init__(self, provider_config: dict, provider_settings: dict) -> ... method initialize (line 40) | async def initialize(self) -> None: method rerank (line 86) | async def rerank( method terminate (line 117) | async def terminate(self) -> None: FILE: astrbot/core/provider/sources/xinference_stt_provider.py class ProviderXinferenceSTT (line 26) | class ProviderXinferenceSTT(STTProvider): method __init__ (line 27) | def __init__(self, provider_config: dict, provider_settings: dict) -> ... method initialize (line 43) | async def initialize(self) -> None: method get_text (line 82) | async def get_text(self, audio_url: str) -> str: method terminate (line 208) | async def terminate(self) -> None: FILE: astrbot/core/provider/sources/zhipu_source.py class ProviderZhipu (line 10) | class ProviderZhipu(ProviderOpenAIOfficial): method __init__ (line 11) | def __init__( FILE: astrbot/core/skills/neo_skill_sync.py function _now_iso (line 21) | def _now_iso() -> str: function _to_jsonable (line 25) | def _to_jsonable(model_like: Any) -> dict[str, Any]: function _parse_frontmatter (line 35) | def _parse_frontmatter(text: str) -> tuple[dict[str, str], str]: function _derive_description (line 66) | def _derive_description(markdown_body: str) -> str: function _ensure_skill_frontmatter (line 94) | def _ensure_skill_frontmatter(markdown: str, *, skill_name: str, skill_k... class NeoSkillSyncResult (line 111) | class NeoSkillSyncResult: class NeoSkillSyncManager (line 121) | class NeoSkillSyncManager: method sync_result_to_dict (line 123) | def sync_result_to_dict(result: NeoSkillSyncResult) -> dict[str, str]: method __init__ (line 134) | def __init__( method _load_map (line 144) | def _load_map(self) -> dict[str, Any]: method _save_map (line 159) | def _save_map(self, data: dict[str, Any]) -> None: method normalize_skill_name (line 165) | def normalize_skill_name(skill_key: str) -> str: method _resolve_local_skill_name (line 172) | def _resolve_local_skill_name(self, skill_key: str, mapping: dict[str,... method _find_release (line 193) | async def _find_release(self, client: Any, *, release_id: str) -> dict... method _find_active_stable_release (line 210) | async def _find_active_stable_release( method sync_release (line 233) | async def sync_release( method promote_with_optional_sync (line 324) | async def promote_with_optional_sync( FILE: astrbot/core/skills/skill_manager.py function _is_ignored_zip_entry (line 32) | def _is_ignored_zip_entry(name: str) -> bool: class SkillInfo (line 40) | class SkillInfo: function _parse_frontmatter_description (line 51) | def _parse_frontmatter_description(text: str) -> str: function _is_windows_prompt_path (line 97) | def _is_windows_prompt_path(path: str) -> bool: function _sanitize_prompt_path_for_prompt (line 103) | def _sanitize_prompt_path_for_prompt(path: str) -> str: function _sanitize_prompt_description (line 121) | def _sanitize_prompt_description(description: str) -> str: function _sanitize_skill_display_name (line 128) | def _sanitize_skill_display_name(name: str) -> str: function _build_skill_read_command_example (line 134) | def _build_skill_read_command_example(path: str) -> str: function build_skills_prompt (line 146) | def build_skills_prompt(skills: list[SkillInfo]) -> str: class SkillManager (line 225) | class SkillManager: method __init__ (line 226) | def __init__(self, skills_root: str | None = None) -> None: method _load_config (line 233) | def _load_config(self) -> dict: method _save_config (line 243) | def _save_config(self, config: dict) -> None: method _load_sandbox_skills_cache (line 247) | def _load_sandbox_skills_cache(self) -> dict: method _save_sandbox_skills_cache (line 266) | def _save_sandbox_skills_cache(self, cache: dict) -> None: method set_sandbox_skills_cache (line 272) | def set_sandbox_skills_cache(self, skills: list[dict]) -> None: method get_sandbox_skills_cache_status (line 296) | def get_sandbox_skills_cache_status(self) -> dict[str, object]: method list_skills (line 307) | def list_skills( method is_sandbox_only_skill (line 423) | def is_sandbox_only_skill(self, name: str) -> bool: method set_skill_active (line 439) | def set_skill_active(self, name: str, active: bool) -> None: method _remove_skill_from_sandbox_cache (line 449) | def _remove_skill_from_sandbox_cache(self, name: str) -> None: method delete_skill (line 467) | def delete_skill(self, name: str) -> None: method install_skill_from_zip (line 486) | def install_skill_from_zip(self, zip_path: str, *, overwrite: bool = T... FILE: astrbot/core/star/base.py class Star (line 15) | class Star(CommandParserMixin, PluginKVStoreMixin): class _ContextLike (line 21) | class _ContextLike(Protocol): method get_config (line 22) | def get_config(self, umo: str | None = None) -> Any: ... method __init__ (line 24) | def __init__(self, context: _ContextLike, config: dict | None = None) ... method _get_context_config (line 27) | def _get_context_config(self) -> Any: method __init_subclass__ (line 37) | def __init_subclass__(cls, **kwargs): method text_to_image (line 50) | async def text_to_image(self, text: str, return_url=True) -> str: method html_render (line 65) | async def html_render( method initialize (line 80) | async def initialize(self) -> None: method terminate (line 83) | async def terminate(self) -> None: method __del__ (line 86) | def __del__(self) -> None: FILE: astrbot/core/star/command_management.py class CommandDescriptor (line 18) | class CommandDescriptor: function sync_command_configs (line 48) | async def sync_command_configs() -> None: function toggle_command (line 60) | async def toggle_command(handler_full_name: str, enabled: bool) -> Comma... function rename_command (line 91) | async def rename_command( function update_command_permission (line 143) | async def update_command_permission( function list_commands (line 188) | async def list_commands() -> list[dict[str, Any]]: function list_command_conflicts (line 226) | async def list_command_conflicts() -> list[dict[str, Any]]: function _collect_descriptors (line 253) | def _collect_descriptors(include_sub_commands: bool) -> list[CommandDesc... function _build_descriptor (line 272) | def _build_descriptor(handler: StarHandlerMetadata) -> CommandDescriptor... function _build_descriptor_by_full_name (line 341) | def _build_descriptor_by_full_name(full_name: str) -> CommandDescriptor ... function _locate_primary_filter (line 348) | def _locate_primary_filter( function _determine_permission (line 357) | def _determine_permission(handler: StarHandlerMetadata) -> str: function _resolve_group_parent_signature (line 368) | def _resolve_group_parent_signature(group_filter: CommandGroupFilter) ->... function _find_parent_group_handler (line 377) | def _find_parent_group_handler(module_path: str, parent_signature: str) ... function _compose_command (line 393) | def _compose_command(parent_signature: str, fragment: str | None) -> str: function _bind_descriptor_with_config (line 403) | def _bind_descriptor_with_config( function _apply_config_to_descriptor (line 411) | def _apply_config_to_descriptor( function _apply_config_to_runtime (line 434) | def _apply_config_to_runtime( function _bind_configs_to_descriptors (line 451) | def _bind_configs_to_descriptors( function _group_conflicts (line 462) | def _group_conflicts( function _set_filter_fragment (line 472) | def _set_filter_fragment( function _set_filter_aliases (line 487) | def _set_filter_aliases( function _is_command_in_use (line 499) | def _is_command_in_use( function _descriptor_to_dict (line 516) | def _descriptor_to_dict(desc: CommandDescriptor) -> dict[str, Any]: FILE: astrbot/core/star/config.py function load_config (line 9) | def load_config(namespace: str) -> dict | bool: function put_config (line 25) | def put_config(namespace: str, name: str, key: str, value, description: ... function update_config (line 67) | def update_config(namespace: str, key: str, value) -> None: FILE: astrbot/core/star/context.py class PlatformManagerProtocol (line 52) | class PlatformManagerProtocol(Protocol): class Context (line 56) | class Context: method __init__ (line 65) | def __init__( method llm_generate (line 104) | async def llm_generate( method tool_loop_agent (line 145) | async def tool_loop_agent( method get_current_chat_provider_id (line 249) | async def get_current_chat_provider_id(self, umo: str) -> str: method get_registered_star (line 266) | def get_registered_star(self, star_name: str) -> StarMetadata | None: method get_all_stars (line 272) | def get_all_stars(self) -> list[StarMetadata]: method get_llm_tool_manager (line 276) | def get_llm_tool_manager(self) -> FunctionToolManager: method activate_llm_tool (line 280) | def activate_llm_tool(self, name: str) -> bool: method deactivate_llm_tool (line 294) | def deactivate_llm_tool(self, name: str) -> bool: method get_provider_by_id (line 305) | def get_provider_by_id( method get_all_providers (line 329) | def get_all_providers(self) -> list[Provider]: method get_all_tts_providers (line 333) | def get_all_tts_providers(self) -> list[TTSProvider]: method get_all_stt_providers (line 337) | def get_all_stt_providers(self) -> list[STTProvider]: method get_all_embedding_providers (line 341) | def get_all_embedding_providers(self) -> list[EmbeddingProvider]: method get_using_provider (line 345) | def get_using_provider(self, umo: str | None = None) -> Provider | None: method get_using_tts_provider (line 370) | def get_using_tts_provider(self, umo: str | None = None) -> TTSProvide... method get_using_stt_provider (line 390) | def get_using_stt_provider(self, umo: str | None = None) -> STTProvide... method get_config (line 410) | def get_config(self, umo: str | None = None) -> AstrBotConfig: method send_message (line 427) | async def send_message( method add_llm_tools (line 463) | def add_llm_tools(self, *tools: FunctionTool) -> None: method register_web_api (line 498) | def register_web_api( method get_event_queue (line 526) | def get_event_queue(self) -> Queue: method get_platform (line 531) | def get_platform(self, platform_type: PlatformAdapterType | str) -> Pl... method get_platform_inst (line 554) | def get_platform_inst(self, platform_id: str) -> Platform | None: method get_db (line 570) | def get_db(self) -> BaseDatabase: method register_provider (line 578) | def register_provider(self, provider: Provider) -> None: method register_llm_tool (line 586) | def register_llm_tool( method unregister_llm_tool (line 618) | def unregister_llm_tool(self, name: str) -> None: method register_commands (line 630) | def register_commands( method register_task (line 671) | def register_task(self, task: Awaitable, desc: str) -> None: FILE: astrbot/core/star/error_messages.py function format_plugin_error (line 13) | def format_plugin_error(key: str, **kwargs) -> str: FILE: astrbot/core/star/filter/__init__.py class HandlerFilter (line 8) | class HandlerFilter(abc.ABC): method filter (line 10) | def filter(self, event: AstrMessageEvent, cfg: AstrBotConfig) -> bool: FILE: astrbot/core/star/filter/command.py class GreedyStr (line 15) | class GreedyStr(str): function unwrap_optional (line 19) | def unwrap_optional(annotation) -> tuple: class CommandFilter (line 31) | class CommandFilter(HandlerFilter): method __init__ (line 34) | def __init__( method print_types (line 54) | def print_types(self): method init_handler_md (line 66) | def init_handler_md(self, handle_md: StarHandlerMetadata) -> None: method get_handler_md (line 81) | def get_handler_md(self) -> StarHandlerMetadata: method add_custom_filter (line 84) | def add_custom_filter(self, custom_filter: CustomFilter) -> None: method custom_filter_ok (line 87) | def custom_filter_ok(self, event: AstrMessageEvent, cfg: AstrBotConfig... method validate_and_convert_params (line 93) | def validate_and_convert_params( method get_complete_command_names (line 175) | def get_complete_command_names(self): method equals (line 185) | def equals(self, message_str: str) -> bool: method filter (line 191) | def filter(self, event: AstrMessageEvent, cfg: AstrBotConfig) -> bool: FILE: astrbot/core/star/filter/command_group.py class CommandGroupFilter (line 12) | class CommandGroupFilter(HandlerFilter): method __init__ (line 13) | def __init__( method add_sub_command_filter (line 29) | def add_sub_command_filter( method add_custom_filter (line 35) | def add_custom_filter(self, custom_filter: CustomFilter) -> None: method get_complete_command_names (line 38) | def get_complete_command_names(self) -> list[str]: method print_cmd_tree (line 63) | def print_cmd_tree( method custom_filter_ok (line 105) | def custom_filter_ok(self, event: AstrMessageEvent, cfg: AstrBotConfig... method startswith (line 111) | def startswith(self, message_str: str) -> bool: method equals (line 114) | def equals(self, message_str: str) -> bool: method filter (line 117) | def filter(self, event: AstrMessageEvent, cfg: AstrBotConfig) -> bool: FILE: astrbot/core/star/filter/custom_filter.py class CustomFilterMeta (line 9) | class CustomFilterMeta(ABCMeta): method __and__ (line 10) | def __and__(cls, other): method __or__ (line 15) | def __or__(cls, other): class CustomFilter (line 21) | class CustomFilter(HandlerFilter, metaclass=CustomFilterMeta): method __init__ (line 22) | def __init__(self, raise_error: bool = True, **kwargs) -> None: method filter (line 26) | def filter(self, event: AstrMessageEvent, cfg: AstrBotConfig) -> bool: method __or__ (line 30) | def __or__(self, other): method __and__ (line 33) | def __and__(self, other): class CustomFilterOr (line 37) | class CustomFilterOr(CustomFilter): method __init__ (line 38) | def __init__(self, filter1: CustomFilter, filter2: CustomFilter) -> None: method filter (line 47) | def filter(self, event: AstrMessageEvent, cfg: AstrBotConfig) -> bool: class CustomFilterAnd (line 51) | class CustomFilterAnd(CustomFilter): method __init__ (line 52) | def __init__(self, filter1: CustomFilter, filter2: CustomFilter) -> None: method filter (line 61) | def filter(self, event: AstrMessageEvent, cfg: AstrBotConfig) -> bool: FILE: astrbot/core/star/filter/event_message_type.py class EventMessageType (line 10) | class EventMessageType(enum.Flag): class EventMessageTypeFilter (line 24) | class EventMessageTypeFilter(HandlerFilter): method __init__ (line 25) | def __init__(self, event_message_type: EventMessageType) -> None: method filter (line 28) | def filter(self, event: AstrMessageEvent, cfg: AstrBotConfig) -> bool: FILE: astrbot/core/star/filter/permission.py class PermissionType (line 9) | class PermissionType(enum.Flag): class PermissionTypeFilter (line 16) | class PermissionTypeFilter(HandlerFilter): method __init__ (line 17) | def __init__( method filter (line 23) | def filter(self, event: AstrMessageEvent, cfg: AstrBotConfig) -> bool: FILE: astrbot/core/star/filter/platform_adapter_type.py class PlatformAdapterType (line 9) | class PlatformAdapterType(enum.Flag): class PlatformAdapterTypeFilter (line 63) | class PlatformAdapterTypeFilter(HandlerFilter): method __init__ (line 64) | def __init__(self, platform_adapter_type_or_str: PlatformAdapterType |... method filter (line 70) | def filter(self, event: AstrMessageEvent, cfg: AstrBotConfig) -> bool: FILE: astrbot/core/star/filter/regex.py class RegexFilter (line 10) | class RegexFilter(HandlerFilter): method __init__ (line 13) | def __init__(self, regex: str) -> None: method filter (line 17) | def filter(self, event: AstrMessageEvent, cfg: AstrBotConfig) -> bool: FILE: astrbot/core/star/register/star.py function register_star (line 8) | def register_star( FILE: astrbot/core/star/register/star_handler.py function get_handler_full_name (line 31) | def get_handler_full_name( function get_handler_or_create (line 38) | def get_handler_or_create( function register_command (line 75) | def register_command( function register_custom_filter (line 126) | def register_custom_filter(custom_type_filter, *args, **kwargs): function register_command_group (line 205) | def register_command_group( class RegisteringCommandable (line 245) | class RegisteringCommandable: method __init__ (line 252) | def __init__(self, parent_group: CommandGroupFilter) -> None: function register_event_message_type (line 256) | def register_event_message_type(event_message_type: EventMessageType, **... function register_platform_adapter_type (line 271) | def register_platform_adapter_type( function register_regex (line 287) | def register_regex(regex: str, **kwargs): function register_permission_type (line 302) | def register_permission_type(permission_type: PermissionType, raise_erro... function register_on_astrbot_loaded (line 321) | def register_on_astrbot_loaded(**kwargs): function register_on_platform_loaded (line 331) | def register_on_platform_loaded(**kwargs): function register_on_plugin_error (line 341) | def register_on_plugin_error(**kwargs): function register_on_plugin_loaded (line 359) | def register_on_plugin_loaded(**kwargs): function register_on_plugin_unloaded (line 376) | def register_on_plugin_unloaded(**kwargs): function register_on_waiting_llm_request (line 393) | def register_on_waiting_llm_request(**kwargs): function register_on_llm_request (line 417) | def register_on_llm_request(**kwargs): function register_on_llm_response (line 440) | def register_on_llm_response(**kwargs): function register_on_using_llm_tool (line 463) | def register_on_using_llm_tool(**kwargs): function register_on_llm_tool_respond (line 487) | def register_on_llm_tool_respond(**kwargs): function register_llm_tool (line 512) | def register_llm_tool(name: str | None = None, **kwargs): class RegisteringAgent (line 612) | class RegisteringAgent: method llm_tool (line 615) | def llm_tool(self, *args, **kwargs): method __init__ (line 619) | def __init__(self, agent: Agent[Any]) -> None: function register_agent (line 623) | def register_agent( function register_on_decorating_result (line 656) | def register_on_decorating_result(**kwargs): function register_after_message_sent (line 670) | def register_after_message_sent(**kwargs): FILE: astrbot/core/star/session_llm_manager.py class SessionServiceManager (line 7) | class SessionServiceManager: method is_llm_enabled_for_session (line 15) | async def is_llm_enabled_for_session(session_id: str) -> bool: method set_llm_status_for_session (line 42) | async def set_llm_status_for_session(session_id: str, enabled: bool) -... method should_process_llm_request (line 68) | async def should_process_llm_request(event: AstrMessageEvent) -> bool: method is_tts_enabled_for_session (line 86) | async def is_tts_enabled_for_session(session_id: str) -> bool: method set_tts_status_for_session (line 113) | async def set_tts_status_for_session(session_id: str, enabled: bool) -... method should_process_tts_request (line 143) | async def should_process_tts_request(event: AstrMessageEvent) -> bool: method is_session_enabled (line 161) | async def is_session_enabled(session_id: str) -> bool: FILE: astrbot/core/star/session_plugin_manager.py class SessionPluginManager (line 7) | class SessionPluginManager: method is_plugin_enabled_for_session (line 11) | async def is_plugin_enabled_for_session( method filter_handlers_by_session (line 49) | async def filter_handlers_by_session( FILE: astrbot/core/star/star.py class StarMetadata (line 18) | class StarMetadata: method __str__ (line 70) | def __str__(self) -> str: method __repr__ (line 73) | def __repr__(self) -> str: FILE: astrbot/core/star/star_handler.py class StarHandlerRegistry (line 14) | class StarHandlerRegistry(Generic[T]): method __init__ (line 15) | def __init__(self) -> None: method append (line 19) | def append(self, handler: StarHandlerMetadata) -> None: method _print_handlers (line 28) | def _print_handlers(self) -> None: method get_handlers_by_event_type (line 33) | def get_handlers_by_event_type( method get_handlers_by_event_type (line 41) | def get_handlers_by_event_type( method get_handlers_by_event_type (line 49) | def get_handlers_by_event_type( method get_handlers_by_event_type (line 59) | def get_handlers_by_event_type( method get_handlers_by_event_type (line 67) | def get_handlers_by_event_type( method get_handlers_by_event_type (line 75) | def get_handlers_by_event_type( method get_handlers_by_event_type (line 83) | def get_handlers_by_event_type( method get_handlers_by_event_type (line 93) | def get_handlers_by_event_type( method get_handlers_by_event_type (line 101) | def get_handlers_by_event_type( method get_handlers_by_event_type (line 109) | def get_handlers_by_event_type( method get_handlers_by_event_type (line 117) | def get_handlers_by_event_type( method get_handlers_by_event_type (line 125) | def get_handlers_by_event_type( method get_handlers_by_event_type (line 134) | def get_handlers_by_event_type( method get_handler_by_full_name (line 172) | def get_handler_by_full_name(self, full_name: str) -> StarHandlerMetad... method get_handlers_by_module_name (line 175) | def get_handlers_by_module_name( method clear (line 185) | def clear(self) -> None: method remove (line 189) | def remove(self, handler: StarHandlerMetadata) -> None: method __iter__ (line 193) | def __iter__(self): method __len__ (line 196) | def __len__(self) -> int: class EventType (line 203) | class EventType(enum.Enum): class StarHandlerMetadata (line 230) | class StarHandlerMetadata(Generic[H]): method __lt__ (line 259) | def __lt__(self, other: StarHandlerMetadata): FILE: astrbot/core/star/star_manager.py class PluginVersionIncompatibleError (line 59) | class PluginVersionIncompatibleError(Exception): class PluginDependencyInstallError (line 63) | class PluginDependencyInstallError(Exception): method __init__ (line 66) | def __init__( function _temporary_filtered_requirements_file (line 81) | def _temporary_filtered_requirements_file( function _install_requirements_with_precheck (line 113) | async def _install_requirements_with_precheck( class PluginManager (line 154) | class PluginManager: method __init__ (line 155) | def __init__(self, context: Context, config: AstrBotConfig) -> None: method _watch_plugins_changes (line 186) | async def _watch_plugins_changes(self) -> None: method _handle_file_changes (line 203) | async def _handle_file_changes(self, changes) -> None: method _get_classes (line 239) | def _get_classes(arg: ModuleType): method _get_modules (line 250) | def _get_modules(path): method _get_plugin_modules (line 276) | def _get_plugin_modules(self) -> list[dict]: method _check_plugin_dept_update (line 287) | async def _check_plugin_dept_update( method _ensure_plugin_requirements (line 307) | async def _ensure_plugin_requirements( method _import_plugin_with_dependency_recovery (line 335) | async def _import_plugin_with_dependency_recovery( method _load_plugin_metadata (line 367) | def _load_plugin_metadata(plugin_path: str, plugin_obj=None) -> StarMe... method _normalize_plugin_dir_name (line 426) | def _normalize_plugin_dir_name(plugin_name: str) -> str: method _validate_importable_name (line 430) | def _validate_importable_name(plugin_name: str) -> None: method _get_plugin_dir_name_from_metadata (line 441) | def _get_plugin_dir_name_from_metadata(plugin_path: str) -> str: method _validate_astrbot_version_specifier (line 463) | def _validate_astrbot_version_specifier( method _get_plugin_related_modules (line 497) | def _get_plugin_related_modules( method _purge_modules (line 520) | def _purge_modules( method _cleanup_plugin_state (line 554) | def _cleanup_plugin_state(self, dir_name: str) -> None: method _build_failed_plugin_record (line 581) | def _build_failed_plugin_record( method _rebuild_failed_plugin_info (line 618) | def _rebuild_failed_plugin_info(self) -> None: method reload_failed_plugin (line 643) | async def reload_failed_plugin(self, dir_name): method reload (line 671) | async def reload(self, specified_plugin_name=None): method load (line 727) | async def load( method _cleanup_failed_plugin_install (line 1102) | async def _cleanup_failed_plugin_install( method _cleanup_plugin_optional_artifacts (line 1145) | def _cleanup_plugin_optional_artifacts( method _track_failed_install_dir (line 1184) | def _track_failed_install_dir( method install_plugin (line 1212) | async def install_plugin( method uninstall_plugin (line 1325) | async def uninstall_plugin( method uninstall_failed_plugin (line 1381) | async def uninstall_failed_plugin( method _unbind_plugin (line 1437) | async def _unbind_plugin(self, plugin_name: str, plugin_module_path: s... method update_plugin (line 1500) | async def update_plugin(self, plugin_name: str, proxy="") -> None: method turn_off_plugin (line 1517) | async def turn_off_plugin(self, plugin_name: str) -> None: method _terminate_plugin (line 1559) | async def _terminate_plugin(star_metadata: StarMetadata) -> None: method turn_on_plugin (line 1605) | async def turn_on_plugin(self, plugin_name: str) -> None: method install_plugin_from_file (line 1631) | async def install_plugin_from_file( FILE: astrbot/core/star/star_tools.py class StarTools (line 42) | class StarTools: method initialize (line 50) | def initialize(cls, context: Context) -> None: method send_message (line 60) | async def send_message( method send_message_by_id (line 86) | async def send_message_by_id( method create_message (line 122) | async def create_message( method create_event (line 167) | async def create_event( method activate_llm_tool (line 205) | def activate_llm_tool(cls, name: str) -> bool: method deactivate_llm_tool (line 218) | def deactivate_llm_tool(cls, name: str) -> bool: method register_llm_tool (line 230) | def register_llm_tool( method unregister_llm_tool (line 251) | def unregister_llm_tool(cls, name: str) -> None: method get_data_dir (line 264) | def get_data_dir(cls, plugin_name: str | None = None) -> Path: FILE: astrbot/core/star/updator.py class PluginUpdator (line 13) | class PluginUpdator(RepoZipUpdator): method __init__ (line 14) | def __init__(self, repo_mirror: str = "") -> None: method get_plugin_store_path (line 18) | def get_plugin_store_path(self) -> str: method install (line 21) | async def install(self, repo_url: str, proxy="") -> str: method update (line 30) | async def update(self, plugin: StarMetadata, proxy="") -> str: method unzip_file (line 55) | def unzip_file(self, zip_path: str, target_dir: str) -> None: FILE: astrbot/core/subagent_orchestrator.py class SubAgentOrchestrator (line 15) | class SubAgentOrchestrator: method __init__ (line 22) | def __init__( method reload_from_config (line 29) | async def reload_from_config(self, cfg: dict[str, Any]) -> None: FILE: astrbot/core/tools/cron_tools.py function _extract_job_session (line 12) | def _extract_job_session(job: Any) -> str | None: class CreateActiveCronTool (line 21) | class CreateActiveCronTool(FunctionTool[AstrAgentContext]): method call (line 56) | async def call( class DeleteCronJobTool (line 109) | class DeleteCronJobTool(FunctionTool[AstrAgentContext]): method call (line 125) | async def call( class ListCronJobsTool (line 145) | class ListCronJobsTool(FunctionTool[AstrAgentContext]): method call (line 160) | async def call( FILE: astrbot/core/umop_config_router.py class UmopConfigRouter (line 6) | class UmopConfigRouter: method __init__ (line 9) | def __init__(self, sp: SharedPreferences) -> None: method initialize (line 14) | async def initialize(self) -> None: method _load_routing_table (line 17) | async def _load_routing_table(self) -> None: method _split_umo (line 29) | def _split_umo(umo: str) -> tuple[str, str, str] | None: method _is_umo_match (line 38) | def _is_umo_match(self, p1: str, p2: str) -> bool: method get_conf_id_for_umop (line 48) | def get_conf_id_for_umop(self, umo: str) -> str | None: method update_routing_data (line 63) | async def update_routing_data(self, new_routing: dict[str, str]) -> None: method update_route (line 83) | async def update_route(self, umo: str, conf_id: str) -> None: method delete_route (line 102) | async def delete_route(self, umo: str) -> None: FILE: astrbot/core/updator.py class AstrBotUpdator (line 15) | class AstrBotUpdator(RepoZipUpdator): method __init__ (line 21) | def __init__(self, repo_mirror: str = "") -> None: method terminate_child_processes (line 26) | def terminate_child_processes(self) -> None: method _is_option_arg (line 48) | def _is_option_arg(arg: str) -> bool: method _collect_flag_values (line 52) | def _collect_flag_values(cls, argv: list[str], flag: str) -> str | None: method _resolve_webui_dir_arg (line 74) | def _resolve_webui_dir_arg(cls, argv: list[str]) -> str | None: method _build_frozen_reboot_args (line 77) | def _build_frozen_reboot_args(self) -> list[str]: method _reset_pyinstaller_environment (line 88) | def _reset_pyinstaller_environment() -> None: method _build_reboot_argv (line 96) | def _build_reboot_argv(self, executable: str) -> list[str]: method _exec_reboot (line 106) | def _exec_reboot(executable: str, argv: list[str]) -> None: method _reboot (line 114) | def _reboot(self, delay: int = 3) -> None: method check_update (line 131) | async def check_update( method get_releases (line 144) | async def get_releases(self) -> list: method update (line 147) | async def update(self, reboot=False, latest=True, version=None, proxy=... FILE: astrbot/core/utils/active_event_registry.py class ActiveEventRegistry (line 10) | class ActiveEventRegistry: method __init__ (line 16) | def __init__(self) -> None: method register (line 19) | def register(self, event: AstrMessageEvent) -> None: method unregister (line 22) | def unregister(self, event: AstrMessageEvent) -> None: method stop_all (line 28) | def stop_all( method request_agent_stop_all (line 49) | def request_agent_stop_all( FILE: astrbot/core/utils/astrbot_path.py function get_astrbot_path (line 21) | def get_astrbot_path() -> str: function get_astrbot_root (line 28) | def get_astrbot_root() -> str: function get_astrbot_data_path (line 37) | def get_astrbot_data_path() -> str: function get_astrbot_config_path (line 42) | def get_astrbot_config_path() -> str: function get_astrbot_plugin_path (line 47) | def get_astrbot_plugin_path() -> str: function get_astrbot_plugin_data_path (line 52) | def get_astrbot_plugin_data_path() -> str: function get_astrbot_t2i_templates_path (line 57) | def get_astrbot_t2i_templates_path() -> str: function get_astrbot_webchat_path (line 62) | def get_astrbot_webchat_path() -> str: function get_astrbot_temp_path (line 67) | def get_astrbot_temp_path() -> str: function get_astrbot_skills_path (line 72) | def get_astrbot_skills_path() -> str: function get_astrbot_site_packages_path (line 77) | def get_astrbot_site_packages_path() -> str: function get_astrbot_knowledge_base_path (line 82) | def get_astrbot_knowledge_base_path() -> str: function get_astrbot_backups_path (line 87) | def get_astrbot_backups_path() -> str: FILE: astrbot/core/utils/command_parser.py class CommandTokens (line 4) | class CommandTokens: method __init__ (line 5) | def __init__(self) -> None: method get (line 9) | def get(self, idx: int) -> str | None: class CommandParserMixin (line 15) | class CommandParserMixin: method parse_commands (line 16) | def parse_commands(self, message: str): method regex_match (line 22) | def regex_match(self, message: str, command: str) -> bool: FILE: astrbot/core/utils/config_number.py function coerce_int_config (line 4) | def coerce_int_config( FILE: astrbot/core/utils/core_constraints.py function _resolve_core_dist_name (line 19) | def _resolve_core_dist_name(core_dist_name: str | None) -> str | None: function _get_core_constraints (line 50) | def _get_core_constraints(core_dist_name: str | None) -> tuple[str, ...]: class CoreConstraintsProvider (line 90) | class CoreConstraintsProvider: method __init__ (line 91) | def __init__(self, core_dist_name: str | None) -> None: method constraints_file (line 95) | def constraints_file(self) -> Iterator[str | None]: FILE: astrbot/core/utils/datetime_utils.py function normalize_datetime_utc (line 4) | def normalize_datetime_utc(dt: datetime | None) -> datetime | None: function to_utc_isoformat (line 16) | def to_utc_isoformat(dt: datetime | None) -> str | None: function to_utc_timestamp (line 23) | def to_utc_timestamp(dt: datetime | None) -> float | None: FILE: astrbot/core/utils/error_redaction.py function _redact_json_field (line 26) | def _redact_json_field(match: re.Match[str]) -> str: function _redact_auth_json_field (line 31) | def _redact_auth_json_field(match: re.Match[str]) -> str: function _redact_prefixed_value (line 36) | def _redact_prefixed_value(match: re.Match[str]) -> str: function _redact_bearer_token (line 40) | def _redact_bearer_token(match: re.Match[str]) -> str: function _redact_json_like (line 44) | def _redact_json_like(text: str) -> str: function _redact_query_like (line 49) | def _redact_query_like(text: str) -> str: function _redact_tokens (line 54) | def _redact_tokens(text: str) -> str: function redact_sensitive_text (line 60) | def redact_sensitive_text(text: str) -> str: function safe_error (line 67) | def safe_error( FILE: astrbot/core/utils/file_extract.py function extract_file_moonshotai (line 6) | async def extract_file_moonshotai(file_path: str, api_key: str) -> str: FILE: astrbot/core/utils/history_saver.py function persist_agent_history (line 9) | async def persist_agent_history( FILE: astrbot/core/utils/http_ssl.py function build_ssl_context_with_certifi (line 17) | def build_ssl_context_with_certifi() -> ssl.SSLContext: function build_tls_connector (line 32) | def build_tls_connector() -> aiohttp.TCPConnector: FILE: astrbot/core/utils/image_ref_utils.py function resolve_file_url_path (line 22) | def resolve_file_url_path(image_ref: str) -> str: function _is_path_within_roots (line 42) | def _is_path_within_roots(path: str, roots: Sequence[str]) -> bool: function is_supported_image_ref (line 58) | def is_supported_image_ref( FILE: astrbot/core/utils/io.py function on_error (line 22) | def on_error(func, path, exc_info) -> None: function remove_dir (line 33) | def remove_dir(file_path: str) -> bool: function port_checker (line 40) | def port_checker(port: int, host: str = "localhost") -> bool: function save_temp_img (line 52) | def save_temp_img(img: Image.Image | bytes) -> str: function download_image_by_url (line 66) | async def download_image_by_url( function download_file (line 126) | async def download_file(url: str, path: str, show_progress: bool = False... function file_to_base64 (line 202) | def file_to_base64(file_path: str) -> str: function get_local_ip_addresses (line 209) | def get_local_ip_addresses(): function get_dashboard_version (line 221) | async def get_dashboard_version(): function download_dashboard (line 238) | async def download_dashboard( FILE: astrbot/core/utils/llm_metadata.py class LLMModalities (line 9) | class LLMModalities(TypedDict): class LLMLimit (line 14) | class LLMLimit(TypedDict): class LLMMetadata (line 19) | class LLMMetadata(TypedDict): function update_llm_metadata (line 33) | async def update_llm_metadata() -> None: FILE: astrbot/core/utils/log_pipe.py class LogPipe (line 6) | class LogPipe(threading.Thread): method __init__ (line 7) | def __init__( method fileno (line 24) | def fileno(self): method run (line 27) | def run(self) -> None: method close (line 35) | def close(self) -> None: FILE: astrbot/core/utils/media_utils.py function get_media_duration (line 16) | async def get_media_duration(file_path: str) -> int | None: function convert_audio_to_opus (line 61) | async def convert_audio_to_opus(audio_path: str, output_path: str | None... function convert_video_format (line 137) | async def convert_video_format( function convert_audio_format (line 214) | async def convert_audio_format( function convert_audio_to_amr (line 265) | async def convert_audio_to_amr(audio_path: str, output_path: str | None ... function convert_audio_to_wav (line 274) | async def convert_audio_to_wav(audio_path: str, output_path: str | None ... function extract_video_cover (line 283) | async def extract_video_cover( FILE: astrbot/core/utils/metrics.py class Metric (line 12) | class Metric: method get_installation_id (line 16) | def get_installation_id(): method upload (line 43) | async def upload(**kwargs) -> None: FILE: astrbot/core/utils/migra_helper.py function _migra_agent_runner_configs (line 14) | def _migra_agent_runner_configs(conf: AstrBotConfig, ids_map: dict) -> N... function _migra_provider_to_source_structure (line 45) | def _migra_provider_to_source_structure(conf: AstrBotConfig) -> None: function migra (line 131) | async def migra( FILE: astrbot/core/utils/network_utils.py function is_connection_error (line 8) | def is_connection_error(exc: BaseException) -> bool: function log_connection_failure (line 48) | def log_connection_failure( function create_proxy_client (line 83) | def create_proxy_client( FILE: astrbot/core/utils/path_util.py function path_Mapping (line 6) | def path_Mapping(mappings, srcPath: str) -> str: FILE: astrbot/core/utils/pip_installer.py class DependencyConflictError (line 53) | class DependencyConflictError(Exception): method __init__ (line 56) | def __init__( class PipInstallError (line 64) | class PipInstallError(Exception): method __init__ (line 67) | def __init__(self, message: str, *, code: int) -> None: class PipConflictContext (line 73) | class PipConflictContext: function _get_pip_main (line 82) | def _get_pip_main(): function _prepend_sys_path (line 99) | def _prepend_sys_path(path: str) -> None: function _cleanup_added_root_handlers (line 107) | def _cleanup_added_root_handlers(original_handlers: list[logging.Handler... function _get_trusted_host_for_index_url (line 118) | def _get_trusted_host_for_index_url(index_url: str) -> str | None: function _normalize_sensitive_pip_key (line 126) | def _normalize_sensitive_pip_key(raw_key: str) -> str: function _is_sensitive_pip_value_key (line 130) | def _is_sensitive_pip_value_key(raw_key: str) -> bool: function _redact_url_credentials (line 134) | def _redact_url_credentials(raw_value: str) -> str: function _redact_pip_args_for_logging (line 155) | def _redact_pip_args_for_logging(args: list[str]) -> list[str]: function _package_specs_override_index (line 187) | def _package_specs_override_index(package_specs: list[str]) -> bool: class _StreamingLogWriter (line 202) | class _StreamingLogWriter(io.TextIOBase): method __init__ (line 203) | def __init__(self, log_func, *, max_lines: int | None = None) -> None: method write (line 208) | def write(self, text: str) -> int: method flush (line 220) | def flush(self) -> None: method lines (line 228) | def lines(self) -> list[str]: function _run_pip_main_streaming (line 232) | def _run_pip_main_streaming(pip_main, args: list[str]) -> tuple[int, lis... function _temporary_environ (line 244) | def _temporary_environ(updates: Mapping[str, str]): function _run_pip_main_with_temporary_environ (line 264) | def _run_pip_main_with_temporary_environ( function _normalize_windows_native_build_path (line 280) | def _normalize_windows_native_build_path(path: str) -> str: function _get_case_insensitive_env_value (line 302) | def _get_case_insensitive_env_value( function _build_packaged_windows_runtime_build_env (line 318) | def _build_packaged_windows_runtime_build_env( function _matches_pip_failure_pattern (line 357) | def _matches_pip_failure_pattern(line: str, *pattern_names: str) -> bool: function _normalize_conflict_detail_line (line 362) | def _normalize_conflict_detail_line(line: str) -> str: function _build_pip_conflict_context (line 374) | def _build_pip_conflict_context(output_lines: list[str]) -> PipConflictC... function _classify_pip_failure (line 443) | def _classify_pip_failure(output_lines: list[str]) -> DependencyConflict... function _extract_top_level_modules (line 486) | def _extract_top_level_modules( function _collect_candidate_modules (line 503) | def _collect_candidate_modules( function _ensure_preferred_modules (line 557) | def _ensure_preferred_modules( function _module_exists_in_site_packages (line 589) | def _module_exists_in_site_packages(module_name: str, site_packages_path... function _is_module_loaded_from_site_packages (line 596) | def _is_module_loaded_from_site_packages( function _prefer_module_from_site_packages (line 621) | def _prefer_module_from_site_packages( function _extract_conflicting_module_name (line 687) | def _extract_conflicting_module_name(exc: Exception) -> str | None: function _prefer_module_with_dependency_recovery (line 705) | def _prefer_module_with_dependency_recovery( function _prefer_modules_from_site_packages (line 740) | def _prefer_modules_from_site_packages( function _ensure_plugin_dependencies_preferred (line 800) | def _ensure_plugin_dependencies_preferred( function _get_loader_for_package (line 817) | def _get_loader_for_package(package: object) -> object | None: function _try_register_distlib_finder (line 828) | def _try_register_distlib_finder( function _patch_distlib_finder_for_frozen_runtime (line 868) | def _patch_distlib_finder_for_frozen_runtime() -> None: class PipInstaller (line 921) | class PipInstaller: method __init__ (line 922) | def __init__( method _build_pip_args (line 933) | def _build_pip_args( method install (line 980) | async def install( method prefer_installed_dependencies (line 1026) | def prefer_installed_dependencies(self, requirements_path: str) -> None: method _run_pip_in_process (line 1046) | async def _run_pip_in_process(self, args: list[str]) -> int: method _run_pip_with_classification (line 1067) | async def _run_pip_with_classification(self, args: list[str]) -> None: FILE: astrbot/core/utils/plugin_kv_store.py class PluginKVStoreMixin (line 9) | class PluginKVStoreMixin: method put_kv_data (line 14) | async def put_kv_data( method get_kv_data (line 22) | async def get_kv_data(self, key: str, default: _VT) -> _VT | None: method delete_kv_data (line 26) | async def delete_kv_data(self, key: str) -> None: FILE: astrbot/core/utils/quoted_message/chain_parser.py class ParsedOneBotPayload (line 31) | class ParsedOneBotPayload(TypedDict): function _build_parsed_payload (line 37) | def _build_parsed_payload( function _join_text_parts (line 49) | def _join_text_parts(parts: list[str]) -> str | None: function _find_first_reply_component (line 54) | def _find_first_reply_component(event: AstrMessageEvent) -> Reply | None: function _is_forward_placeholder_only_text (line 61) | def _is_forward_placeholder_only_text(text: str | None) -> bool: function _extract_image_refs_from_component_chain (line 70) | def _extract_image_refs_from_component_chain( function _extract_text_from_component_chain (line 115) | def _extract_text_from_component_chain( function _extract_image_refs_from_reply_component (line 176) | def _extract_image_refs_from_reply_component( function _extract_text_from_reply_component (line 194) | def _extract_text_from_reply_component( function _unwrap_onebot_data (line 215) | def _unwrap_onebot_data(payload: Any) -> dict[str, Any]: function _extract_text_from_multimsg_json (line 224) | def _extract_text_from_multimsg_json(raw_json: str) -> str | None: function _parse_onebot_segments (line 264) | def _parse_onebot_segments( function _extract_text_forward_ids_and_images_from_forward_nodes (line 349) | def _extract_text_forward_ids_and_images_from_forward_nodes( function _parse_onebot_get_msg_payload (line 411) | def _parse_onebot_get_msg_payload( function _parse_onebot_get_forward_payload (line 431) | def _parse_onebot_get_forward_payload( class ReplyChainParser (line 455) | class ReplyChainParser: method __init__ (line 456) | def __init__(self, settings: QuotedMessageParserSettings = SETTINGS): method find_first_reply_component (line 460) | def find_first_reply_component(event: AstrMessageEvent) -> Reply | None: method is_forward_placeholder_only_text (line 464) | def is_forward_placeholder_only_text(text: str | None) -> bool: method extract_text_from_reply_component (line 467) | def extract_text_from_reply_component( method extract_image_refs_from_reply_component (line 479) | def extract_image_refs_from_reply_component( class OneBotPayloadParser (line 492) | class OneBotPayloadParser: method __init__ (line 493) | def __init__(self, settings: QuotedMessageParserSettings = SETTINGS): method parse_get_msg_payload (line 496) | def parse_get_msg_payload(self, payload: dict[str, Any]) -> ParsedOneB... method parse_get_forward_payload (line 499) | def parse_get_forward_payload( FILE: astrbot/core/utils/quoted_message/extractor.py function _collect_text_and_images_from_forward_ids (line 16) | async def _collect_text_and_images_from_forward_ids( class QuotedMessageContent (line 66) | class QuotedMessageContent: class QuotedMessageExtractor (line 76) | class QuotedMessageExtractor: method __init__ (line 77) | def __init__( method _fetch_quoted_content (line 89) | async def _fetch_quoted_content( method text (line 148) | async def text(self, reply_component: Reply | None = None) -> str | None: method images (line 181) | async def images(self, reply_component: Reply | None = None) -> list[s... function extract_quoted_message_text (line 194) | async def extract_quoted_message_text( function extract_quoted_message_images (line 204) | async def extract_quoted_message_images( FILE: astrbot/core/utils/quoted_message/image_refs.py function normalize_file_like_url (line 11) | def normalize_file_like_url(path: str | None) -> str | None: function looks_like_image_file_name (line 25) | def looks_like_image_file_name(name: str) -> bool: function convert_data_image_to_base64_ref (line 33) | def convert_data_image_to_base64_ref(image_ref: str) -> str | None: function get_existing_local_path (line 53) | def get_existing_local_path(value: str) -> str | None: function normalize_image_ref (line 67) | def normalize_image_ref(image_ref: str) -> str | None: FILE: astrbot/core/utils/quoted_message/image_resolver.py function _build_image_id_candidates (line 14) | def _build_image_id_candidates(image_ref: str) -> list[str]: function _build_image_resolve_actions (line 23) | def _build_image_resolve_actions( class ImageResolver (line 64) | class ImageResolver: method __init__ (line 65) | def __init__( method resolve_for_llm (line 73) | async def resolve_for_llm(self, image_refs: list[str]) -> list[str]: method _resolve_one (line 97) | async def _resolve_one(self, image_ref: str) -> str | None: FILE: astrbot/core/utils/quoted_message/onebot_client.py function _unwrap_action_response (line 12) | def _unwrap_action_response(ret: dict[str, Any] | None) -> dict[str, Any]: class CallAction (line 21) | class CallAction(Protocol): method __call__ (line 22) | def __call__(self, action: str, **params: Any) -> Awaitable[Any] | Any... class OneBotClient (line 25) | class OneBotClient: method __init__ (line 26) | def __init__( method _resolve_call_action (line 35) | def _resolve_call_action(event: AstrMessageEvent) -> CallAction | None: method _call_action_try_params (line 43) | async def _call_action_try_params( method call (line 85) | async def call( method _call_action_compat (line 102) | async def _call_action_compat( method get_msg (line 120) | async def get_msg(self, message_id: str | int) -> dict[str, Any] | None: method get_forward_msg (line 123) | async def get_forward_msg(self, forward_id: str | int) -> dict[str, An... FILE: astrbot/core/utils/quoted_message/settings.py function _read_int_mapping (line 12) | def _read_int_mapping( function _read_bool_mapping (line 29) | def _read_bool_mapping( class QuotedMessageParserSettings (line 49) | class QuotedMessageParserSettings: method with_overrides (line 55) | def with_overrides( FILE: astrbot/core/utils/requirements_utils.py class RequirementsPrecheckFailed (line 20) | class RequirementsPrecheckFailed(Exception): class ParsedPackageInput (line 27) | class ParsedPackageInput: class MissingRequirementsPlan (line 33) | class MissingRequirementsPlan: function canonicalize_distribution_name (line 39) | def canonicalize_distribution_name(name: str) -> str: function strip_inline_requirement_comment (line 43) | def strip_inline_requirement_comment(raw_input: str) -> str: function _specifier_contains_version (line 49) | def _specifier_contains_version(specifier: SpecifierSet, version: str) -... function _looks_like_local_path_reference (line 57) | def _looks_like_local_path_reference(token: str) -> bool: function looks_like_direct_reference (line 66) | def looks_like_direct_reference(token: str) -> bool: function extract_requirement_name (line 77) | def extract_requirement_name(raw_requirement: str) -> str | None: function _parse_editable_or_direct_name (line 97) | def _parse_editable_or_direct_name(target: str) -> str | None: function _parse_requirement_name_and_spec (line 106) | def _parse_requirement_name_and_spec( function _parse_requirement_line (line 138) | def _parse_requirement_line( function _extract_requirement_names_from_package_tokens (line 145) | def _extract_requirement_names_from_package_tokens(tokens: list[str]) ->... function parse_package_install_input (line 213) | def parse_package_install_input(raw_input: str) -> ParsedPackageInput: function _iter_requirement_lines (line 248) | def _iter_requirement_lines( function iter_requirements (line 286) | def iter_requirements( function extract_requirement_names (line 301) | def extract_requirement_names(requirements_path: str) -> set[str]: function get_requirement_check_paths (line 311) | def get_requirement_check_paths() -> list[str]: function _canonical_distribution_identity (line 320) | def _canonical_distribution_identity(distribution) -> tuple[str | None, ... function collect_installed_distribution_versions (line 329) | def collect_installed_distribution_versions(paths: list[str]) -> dict[st... function _load_requirement_lines_for_precheck (line 343) | def _load_requirement_lines_for_precheck( function find_missing_requirements (line 384) | def find_missing_requirements(requirements_path: str) -> set[str] | None: function find_missing_requirements_from_lines (line 394) | def find_missing_requirements_from_lines( function build_missing_requirements_install_lines (line 418) | def build_missing_requirements_install_lines( function plan_missing_requirements_install (line 444) | def plan_missing_requirements_install( function find_missing_requirements_or_raise (line 482) | def find_missing_requirements_or_raise(requirements_path: str) -> set[str]: FILE: astrbot/core/utils/runtime_env.py function is_frozen_runtime (line 5) | def is_frozen_runtime() -> bool: function is_packaged_desktop_runtime (line 9) | def is_packaged_desktop_runtime() -> bool: FILE: astrbot/core/utils/session_lock.py class _PerLoopSessionLockManager (line 8) | class _PerLoopSessionLockManager: method __init__ (line 11) | def __init__(self) -> None: method acquire_lock (line 17) | async def acquire_lock(self, session_id: str): class SessionLockManager (line 33) | class SessionLockManager: method __init__ (line 36) | def __init__(self) -> None: method _get_loop_manager (line 42) | def _get_loop_manager(self) -> _PerLoopSessionLockManager: method acquire_lock (line 49) | async def acquire_lock(self, session_id: str): FILE: astrbot/core/utils/session_waiter.py class SessionController (line 18) | class SessionController: method __init__ (line 21) | def __init__(self) -> None: method stop (line 32) | def stop(self, error: Exception | None = None) -> None: method keep (line 40) | def keep(self, timeout: float = 0, reset_timeout=False) -> None: method _holding (line 74) | async def _holding(self, event: asyncio.Event, timeout: float) -> None: method get_history_chains (line 85) | def get_history_chains(self) -> list[list[Comp.BaseMessageComponent]]: class SessionFilter (line 90) | class SessionFilter: method filter (line 94) | def filter(self, event: AstrMessageEvent) -> str: class DefaultSessionFilter (line 98) | class DefaultSessionFilter(SessionFilter): method filter (line 99) | def filter(self, event: AstrMessageEvent) -> str: class SessionWaiter (line 104) | class SessionWaiter: method __init__ (line 105) | def __init__( method register_wait (line 124) | async def register_wait( method _cleanup (line 144) | def _cleanup(self, error: Exception | None = None) -> None: method trigger (line 154) | async def trigger(cls, session_id: str, event: AstrMessageEvent) -> None: function session_waiter (line 174) | def session_waiter(timeout: int = 30, record_history_chains: bool = False): FILE: astrbot/core/utils/shared_preferences.py class SharedPreferences (line 17) | class SharedPreferences: method __init__ (line 18) | def __init__(self, db_helper: BaseDatabase, json_storage_path=None) ->... method _clear_temporary_cache (line 39) | def _clear_temporary_cache(self) -> None: method get_async (line 42) | async def get_async( method range_get_async (line 58) | async def range_get_async( method session_get (line 71) | async def session_get( method session_get (line 79) | async def session_get( method session_get (line 87) | async def session_get( method session_get (line 95) | async def session_get( method session_get (line 102) | async def session_get( method global_get (line 117) | async def global_get(self, key: None, default: Any = None) -> list[Pre... method global_get (line 120) | async def global_get(self, key: str, default: _VT = None) -> _VT: ... method global_get (line 122) | async def global_get( method put_async (line 135) | async def put_async(self, scope: str, scope_id: str, key: str, value: ... method session_put (line 144) | async def session_put(self, umo: str, key: str, value: Any) -> None: method global_put (line 147) | async def global_put(self, key: str, value: Any) -> None: method remove_async (line 150) | async def remove_async(self, scope: str, scope_id: str, key: str) -> N... method session_remove (line 154) | async def session_remove(self, umo: str, key: str) -> None: method global_remove (line 157) | async def global_remove(self, key: str) -> None: method clear_async (line 161) | async def clear_async(self, scope: str, scope_id: str) -> None: method get (line 169) | def get( method range_get (line 191) | def range_get( method put (line 205) | def put( method remove (line 214) | def remove( method clear (line 223) | def clear(self, scope: str | None = None, scope_id: str | None = None)... FILE: astrbot/core/utils/string_utils.py function normalize_and_dedupe_strings (line 7) | def normalize_and_dedupe_strings(items: Iterable[Any] | None) -> list[str]: FILE: astrbot/core/utils/t2i/__init__.py class RenderStrategy (line 4) | class RenderStrategy(ABC): method render (line 6) | async def render(self, text: str, return_url: bool) -> str: method render_custom_template (line 10) | async def render_custom_template( FILE: astrbot/core/utils/t2i/local_strategy.py class FontManager (line 17) | class FontManager: method get_font (line 23) | def get_font(cls, size: int) -> ImageFont.FreeTypeFont|ImageFont.Image... class TextMeasurer (line 65) | class TextMeasurer: method get_text_size (line 69) | def get_text_size(text: str, font: ImageFont.FreeTypeFont|ImageFont.Im... method split_text_to_fit_width (line 77) | def split_text_to_fit_width( class MarkdownElement (line 108) | class MarkdownElement(ABC): method __init__ (line 111) | def __init__(self, content: str): method calculate_height (line 115) | def calculate_height(self, image_width: int, font_size: int) -> int: method render (line 120) | def render( class TextElement (line 133) | class TextElement(MarkdownElement): method calculate_height (line 136) | def calculate_height(self, image_width: int, font_size: int) -> int: method render (line 146) | def render( class BoldTextElement (line 170) | class BoldTextElement(MarkdownElement): method calculate_height (line 173) | def calculate_height(self, image_width: int, font_size: int) -> int: method render (line 180) | def render( class ItalicTextElement (line 235) | class ItalicTextElement(MarkdownElement): method calculate_height (line 238) | def calculate_height(self, image_width: int, font_size: int) -> int: method render (line 245) | def render( class UnderlineTextElement (line 315) | class UnderlineTextElement(MarkdownElement): method calculate_height (line 318) | def calculate_height(self, image_width: int, font_size: int) -> int: method render (line 325) | def render( class StrikethroughTextElement (line 355) | class StrikethroughTextElement(MarkdownElement): method calculate_height (line 358) | def calculate_height(self, image_width: int, font_size: int) -> int: method render (line 365) | def render( class HeaderElement (line 393) | class HeaderElement(MarkdownElement): method __init__ (line 396) | def __init__(self, content: str): method calculate_height (line 408) | def calculate_height(self, image_width: int, font_size: int) -> int: method render (line 416) | def render( class QuoteElement (line 438) | class QuoteElement(MarkdownElement): method __init__ (line 441) | def __init__(self, content: str): method calculate_height (line 445) | def calculate_height(self, image_width: int, font_size: int) -> int: method render (line 452) | def render( class ListItemElement (line 486) | class ListItemElement(MarkdownElement): method calculate_height (line 489) | def calculate_height(self, image_width: int, font_size: int) -> int: method render (line 496) | def render( class CodeBlockElement (line 526) | class CodeBlockElement(MarkdownElement): method __init__ (line 529) | def __init__(self, content: list[str]): method calculate_height (line 532) | def calculate_height(self, image_width: int, font_size: int) -> int: method render (line 546) | def render( class InlineCodeElement (line 583) | class InlineCodeElement(MarkdownElement): method calculate_height (line 586) | def calculate_height(self, image_width: int, font_size: int) -> int: method render (line 589) | def render( class ImageElement (line 621) | class ImageElement(MarkdownElement): method __init__ (line 624) | def __init__(self, content: str, image_url: str): method load_image (line 629) | async def load_image(self): method calculate_height (line 647) | def calculate_height(self, image_width: int, font_size: int) -> int: method render (line 661) | def render( class MarkdownParser (line 698) | class MarkdownParser: method parse (line 702) | async def parse(text: str) -> list[MarkdownElement]: class MarkdownRenderer (line 837) | class MarkdownRenderer: method __init__ (line 840) | def __init__( method render (line 850) | async def render(self, markdown_text: str) -> Image.Image: class LocalRenderStrategy (line 910) | class LocalRenderStrategy(RenderStrategy): method render_custom_template (line 913) | async def render_custom_template( method render (line 918) | async def render(self, text: str, return_url: bool = False) -> str: FILE: astrbot/core/utils/t2i/network_strategy.py class NetworkRenderStrategy (line 19) | class NetworkRenderStrategy(RenderStrategy): method __init__ (line 20) | def __init__(self, base_url: str | None = None) -> None: method initialize (line 30) | async def initialize(self) -> None: method get_template (line 34) | async def get_template(self, name: str = "base") -> str: method get_official_endpoints (line 38) | async def get_official_endpoints(self) -> None: method _clean_url (line 62) | def _clean_url(self, url: str): method render_custom_template (line 68) | async def render_custom_template( method render (line 122) | async def render( FILE: astrbot/core/utils/t2i/renderer.py class HtmlRenderer (line 9) | class HtmlRenderer: method __init__ (line 10) | def __init__(self, endpoint_url: str | None = None) -> None: method initialize (line 14) | async def initialize(self) -> None: method render_custom_template (line 17) | async def render_custom_template( method render_t2i (line 40) | async def render_t2i( FILE: astrbot/core/utils/t2i/template_manager.py class TemplateManager (line 9) | class TemplateManager: method __init__ (line 17) | def __init__(self) -> None: method _copy_core_templates (line 31) | def _copy_core_templates(self, overwrite: bool = False) -> None: method _initialize_user_templates (line 39) | def _initialize_user_templates(self) -> None: method _get_user_template_path (line 43) | def _get_user_template_path(self, name: str) -> str: method _read_file (line 49) | def _read_file(self, path: str) -> str: method list_templates (line 54) | def list_templates(self) -> list[dict]: method get_template (line 69) | def get_template(self, name: str) -> str: method create_template (line 83) | def create_template(self, name: str, content: str) -> None: method update_template (line 91) | def update_template(self, name: str, content: str) -> None: method delete_template (line 100) | def delete_template(self, name: str) -> None: method reset_default_template (line 109) | def reset_default_template(self) -> None: FILE: astrbot/core/utils/temp_dir_cleaner.py function parse_size_to_bytes (line 10) | def parse_size_to_bytes(value: str | int | float | None) -> int: class TempFileInfo (line 27) | class TempFileInfo: class TempDirCleaner (line 33) | class TempDirCleaner: method __init__ (line 39) | def __init__( method _limit_bytes (line 48) | def _limit_bytes(self) -> int: method _scan_temp_files (line 59) | def _scan_temp_files(self) -> tuple[int, list[TempFileInfo]]: method _cleanup_empty_dirs (line 80) | def _cleanup_empty_dirs(self) -> None: method cleanup_once (line 93) | def cleanup_once(self) -> None: method run (line 126) | async def run(self) -> None: method stop (line 149) | async def stop(self) -> None: FILE: astrbot/core/utils/tencent_record_helper.py function tencent_silk_to_wav (line 13) | async def tencent_silk_to_wav(silk_path: str, output_path: str) -> str: function wav_to_tencent_silk (line 33) | async def wav_to_tencent_silk(wav_path: str, output_path: str) -> int: function convert_to_pcm_wav (line 63) | async def convert_to_pcm_wav(input_path: str, output_path: str) -> str: function audio_to_tencent_silk_base64 (line 105) | async def audio_to_tencent_silk_base64(audio_path: str) -> tuple[str, fl... FILE: astrbot/core/utils/trace.py function _get_log_broker (line 15) | def _get_log_broker(): function _get_trace_logger (line 26) | def _get_trace_logger(): class TraceSpan (line 37) | class TraceSpan: method __init__ (line 38) | def __init__( method record (line 52) | def record(self, action: str, **fields: Any) -> None: FILE: astrbot/core/utils/version_comparator.py class VersionComparator (line 4) | class VersionComparator: method compare_version (line 6) | def compare_version(v1: str, v2: str) -> int: method _split_prerelease (line 78) | def _split_prerelease(prerelease): FILE: astrbot/core/utils/webhook_utils.py function _get_callback_api_base (line 8) | def _get_callback_api_base() -> str: function _get_dashboard_port (line 16) | def _get_dashboard_port() -> int: function _is_dashboard_ssl_enabled (line 24) | def _is_dashboard_ssl_enabled() -> bool: function log_webhook_info (line 38) | def log_webhook_info(platform_name: str, webhook_uuid: str) -> None: function ensure_platform_webhook_config (line 69) | def ensure_platform_webhook_config(platform_cfg: dict) -> bool: FILE: astrbot/core/zip_updator.py class ReleaseInfo (line 16) | class ReleaseInfo: method __init__ (line 21) | def __init__( method __str__ (line 31) | def __str__(self) -> str: class RepoZipUpdator (line 35) | class RepoZipUpdator: method __init__ (line 36) | def __init__(self, repo_mirror: str = "") -> None: method fetch_release_info (line 40) | async def fetch_release_info(self, url: str, latest: bool = True) -> l... method github_api_release_parser (line 88) | def github_api_release_parser(self, releases: list) -> list: method unzip (line 105) | def unzip(self) -> NoReturn: method update (line 108) | async def update(self) -> NoReturn: method compare_version (line 111) | def compare_version(self, v1: str, v2: str) -> int: method check_update (line 115) | async def check_update( method download_from_repo_url (line 152) | async def download_from_repo_url( method parse_github_url (line 191) | def parse_github_url(self, url: str): method unzip_file (line 209) | def unzip_file(self, zip_path: str, target_dir: str) -> None: method format_name (line 238) | def format_name(self, name: str) -> str: FILE: astrbot/dashboard/routes/api_key.py class ApiKeyRoute (line 15) | class ApiKeyRoute(Route): method __init__ (line 16) | def __init__(self, context: RouteContext, db: BaseDatabase) -> None: method _normalize_utc (line 28) | def _normalize_utc(dt: datetime | None) -> datetime | None: method _serialize_datetime (line 32) | def _serialize_datetime(cls, dt: datetime | None) -> str | None: method _hash_key (line 39) | def _hash_key(raw_key: str) -> str: method _serialize_api_key (line 48) | def _serialize_api_key(key) -> dict: method list_api_keys (line 65) | async def list_api_keys(self): method create_api_key (line 71) | async def create_api_key(self): method revoke_api_key (line 123) | async def revoke_api_key(self): method delete_api_key (line 134) | async def delete_api_key(self): FILE: astrbot/dashboard/routes/auth.py class AuthRoute (line 13) | class AuthRoute(Route): method __init__ (line 14) | def __init__(self, context: RouteContext) -> None: method login (line 22) | async def login(self): method edit_account (line 50) | async def edit_account(self): method generate_jwt (line 82) | def generate_jwt(self, username): FILE: astrbot/dashboard/routes/backup.py function secure_filename (line 35) | def secure_filename(filename: str) -> str: function generate_unique_filename (line 65) | def generate_unique_filename(original_filename: str) -> str: class BackupRoute (line 79) | class BackupRoute(Route): method __init__ (line 85) | def __init__( method _init_task (line 127) | def _init_task(self, task_id: str, task_type: str, status: str = "pend... method _set_task_result (line 143) | def _set_task_result( method _update_progress (line 158) | def _update_progress( method _make_progress_callback (line 183) | def _make_progress_callback(self, task_id: str): method _ensure_cleanup_task_started (line 200) | def _ensure_cleanup_task_started(self) -> None: method _cleanup_expired_uploads (line 211) | async def _cleanup_expired_uploads(self) -> None: method _cleanup_upload_session (line 238) | async def _cleanup_upload_session(self, upload_id: str) -> None: method _get_backup_manifest (line 250) | def _get_backup_manifest(self, zip_path: str) -> dict | None: method list_backups (line 271) | async def list_backups(self): method export_backup (line 345) | async def export_backup(self): method _background_export_task (line 376) | async def _background_export_task(self, task_id: str) -> None: method upload_backup (line 414) | async def upload_backup(self): method upload_init (line 464) | async def upload_init(self): method upload_chunk (line 543) | async def upload_chunk(self): method _mark_backup_as_uploaded (line 618) | def _mark_backup_as_uploaded(self, zip_path: str) -> None: method upload_complete (line 647) | async def upload_complete(self): method upload_abort (line 737) | async def upload_abort(self): method check_backup (line 767) | async def check_backup(self): method import_backup (line 811) | async def import_backup(self): method _background_import_task (line 871) | async def _background_import_task(self, task_id: str, zip_path: str) -... method get_progress (line 913) | async def get_progress(self): method download_backup (line 954) | async def download_backup(self): method delete_backup (line 1015) | async def delete_backup(self): method rename_backup (line 1042) | async def rename_backup(self): FILE: astrbot/dashboard/routes/chat.py function track_conversation (line 31) | async def track_conversation(convs: dict, conv_id: str): function _poll_webchat_stream_result (line 39) | async def _poll_webchat_stream_result(back_queue, username: str): class ChatRoute (line 53) | class ChatRoute(Route): method __init__ (line 54) | def __init__( method get_file (line 91) | async def get_file(self): method get_attachment (line 123) | async def get_attachment(self): method post_file (line 142) | async def post_file(self): method _build_user_message_parts (line 189) | async def _build_user_message_parts(self, message: str | list) -> list... method _create_attachment_from_file (line 197) | async def _create_attachment_from_file( method _extract_web_search_refs (line 209) | def _extract_web_search_refs( method _save_bot_message (line 268) | async def _save_bot_message( method chat (line 300) | async def chat(self, post_data: dict | None = None): method stop_session (line 562) | async def stop_session(self): method _delete_session_internal (line 592) | async def _delete_session_internal(self, session, username: str) -> None: method delete_webchat_session (line 636) | async def delete_webchat_session(self): method batch_delete_sessions (line 653) | async def batch_delete_sessions(self): method _extract_attachment_ids (line 700) | def _extract_attachment_ids(self, history_list) -> list[str]: method _delete_attachments (line 713) | async def _delete_attachments(self, attachment_ids: list[str]) -> None: method new_session (line 735) | async def new_session(self): method get_sessions (line 760) | async def get_sessions(self): method get_session (line 794) | async def get_session(self): method update_session_display_name (line 835) | async def update_session_display_name(self): FILE: astrbot/dashboard/routes/chatui_project.py class ChatUIProjectRoute (line 9) | class ChatUIProjectRoute(Route): method __init__ (line 10) | def __init__(self, context: RouteContext, db: BaseDatabase) -> None: method create_project (line 28) | async def create_project(self): method list_projects (line 62) | async def list_projects(self): method get_project (line 82) | async def get_project(self): method update_chatui_project (line 113) | async def update_chatui_project(self): method delete_project (line 143) | async def delete_project(self): method add_session_to_project (line 162) | async def add_session_to_project(self): method remove_session_from_project (line 194) | async def remove_session_from_project(self): method get_project_sessions (line 216) | async def get_project_sessions(self): FILE: astrbot/dashboard/routes/command.py class CommandRoute (line 20) | class CommandRoute(Route): method __init__ (line 21) | def __init__(self, context: RouteContext) -> None: method get_commands (line 32) | async def get_commands(self): method get_conflicts (line 41) | async def get_conflicts(self): method toggle_command (line 45) | async def toggle_command(self): method rename_command (line 64) | async def rename_command(self): method update_permission (line 81) | async def update_permission(self): function _get_command_payload (line 100) | async def _get_command_payload(handler_full_name: str): FILE: astrbot/dashboard/routes/config.py function try_cast (line 43) | def try_cast(value: Any, type_: str): function _expect_type (line 62) | def _expect_type(value, expected_type, path_key, errors, expected_name=N... function _validate_template_list (line 72) | def _validate_template_list(value, meta, path_key, errors, validate_fn) ... function validate_config (line 102) | def validate_config(data, schema: dict, is_core: bool) -> tuple[list[str... function _log_computer_config_changes (line 209) | def _log_computer_config_changes(old_config: dict, new_config: dict) -> ... function _validate_neo_connectivity (line 247) | async def _validate_neo_connectivity( function save_config (line 302) | def save_config( class ConfigRoute (line 334) | class ConfigRoute(Route): method __init__ (line 335) | def __init__( method delete_provider_source (line 390) | async def delete_provider_source(self): method update_provider_source (line 432) | async def update_provider_source(self): method get_provider_template (line 510) | async def get_provider_template(self): method get_uc_table (line 532) | async def get_uc_table(self): method update_ucr_all (line 536) | async def update_ucr_all(self): method update_ucr (line 554) | async def update_ucr(self): method delete_ucr (line 573) | async def delete_ucr(self): method get_default_config (line 593) | async def get_default_config(self): method get_abconf_list (line 598) | async def get_abconf_list(self): method create_abconf (line 603) | async def create_abconf(self): method get_abconf (line 618) | async def get_abconf(self): method delete_abconf (line 640) | async def delete_abconf(self): method update_abconf (line 662) | async def update_abconf(self): method _test_single_provider (line 685) | async def _test_single_provider(self, provider): method _error_response (line 721) | def _error_response( method check_one_provider_status (line 733) | async def check_one_provider_status(self): method get_configs (line 767) | async def get_configs(self): method get_provider_config_list (line 775) | async def get_provider_config_list(self): method get_provider_model_list (line 803) | async def get_provider_model_list(self): method get_embedding_dim (line 840) | async def get_embedding_dim(self): method get_provider_source_models (line 911) | async def get_provider_source_models(self): method get_platform_list (line 1009) | async def get_platform_list(self): method post_astrbot_configs (line 1016) | async def post_astrbot_configs(self): method post_plugin_configs (line 1041) | async def post_plugin_configs(self): method _get_plugin_metadata_by_name (line 1055) | def _get_plugin_metadata_by_name(self, plugin_name: str) -> StarMetada... method _resolve_config_file_scope (line 1061) | def _resolve_config_file_scope( method upload_config_file (line 1085) | async def upload_config_file(self): method delete_config_file (line 1164) | async def delete_config_file(self): method get_config_file_list (line 1200) | async def get_config_file_list(self): method post_new_platform (line 1242) | async def post_new_platform(self): method post_new_provider (line 1258) | async def post_new_provider(self): method post_update_platform (line 1269) | async def post_update_platform(self): method post_update_provider (line 1296) | async def post_update_provider(self): method post_delete_platform (line 1311) | async def post_delete_platform(self): method post_delete_provider (line 1327) | async def post_delete_provider(self): method get_llm_tools (line 1341) | async def get_llm_tools(self): method _register_platform_logo (line 1347) | async def _register_platform_logo(self, platform, platform_default_tmp... method _inject_platform_metadata_with_i18n (line 1414) | def _inject_platform_metadata_with_i18n( method _get_astrbot_config (line 1438) | async def _get_astrbot_config(self): method _get_plugin_config (line 1500) | async def _get_plugin_config(self, plugin_name: str): method _save_astrbot_configs (line 1521) | async def _save_astrbot_configs( method _save_plugin_configs (line 1539) | async def _save_plugin_configs(self, post_configs: dict, plugin_name: ... FILE: astrbot/dashboard/routes/conversation.py class ConversationRoute (line 15) | class ConversationRoute(Route): method __init__ (line 16) | def __init__( method list_conversations (line 42) | async def list_conversations(self): method get_conv_detail (line 107) | async def get_conv_detail(self): method upd_conv (line 144) | async def upd_conv(self): method del_conv (line 176) | async def del_conv(self): method update_history (line 245) | async def update_history(self): method export_conversations (line 292) | async def export_conversations(self): FILE: astrbot/dashboard/routes/cron.py class CronRoute (line 12) | class CronRoute(Route): method __init__ (line 13) | def __init__( method _serialize_job (line 26) | def _serialize_job(self, job) -> dict: method list_jobs (line 40) | async def list_jobs(self): method create_job (line 55) | async def create_job(self): method update_job (line 126) | async def update_job(self, job_id: str): method delete_job (line 163) | async def delete_job(self, job_id: str): FILE: astrbot/dashboard/routes/file.py class FileRoute (line 9) | class FileRoute(Route): method __init__ (line 10) | def __init__( method serve_file (line 20) | async def serve_file(self, file_token: str): FILE: astrbot/dashboard/routes/knowledge_base.py class KnowledgeBaseRoute (line 21) | class KnowledgeBaseRoute(Route): method __init__ (line 27) | def __init__( method _get_kb_manager (line 69) | def _get_kb_manager(self): method _init_task (line 72) | def _init_task(self, task_id: str, status: str = "pending") -> None: method _set_task_result (line 79) | def _set_task_result( method _update_progress (line 90) | def _update_progress( method _make_progress_callback (line 117) | def _make_progress_callback(self, task_id: str, file_idx: int, file_na... method _background_upload_task (line 131) | async def _background_upload_task( method _background_import_task (line 212) | async def _background_import_task( method list_kbs (line 299) | async def list_kbs(self): method create_kb (line 331) | async def create_kb(self): method get_kb (line 428) | async def get_kb(self): method update_kb (line 454) | async def update_kb(self): method delete_kb (line 534) | async def delete_kb(self): method get_kb_stats (line 561) | async def get_kb_stats(self): method list_documents (line 598) | async def list_documents(self): method upload_document (line 638) | async def upload_document(self): method _validate_import_request (line 779) | def _validate_import_request(self, data: dict): method import_documents (line 803) | async def import_documents(self): method get_upload_progress (line 866) | async def get_upload_progress(self): method get_document (line 919) | async def get_document(self): method delete_document (line 950) | async def delete_document(self): method delete_chunk (line 982) | async def delete_chunk(self): method list_chunks (line 1017) | async def list_chunks(self): method retrieve (line 1066) | async def retrieve(self): method upload_document_from_url (line 1129) | async def upload_document_from_url(self): method _background_upload_from_url_task (line 1210) | async def _background_upload_from_url_task( FILE: astrbot/dashboard/routes/live_chat.py class LiveChatSession (line 29) | class LiveChatSession: method __init__ (line 32) | def __init__(self, session_id: str, username: str) -> None: method start_speaking (line 46) | def start_speaking(self, stamp: str) -> None: method add_audio_frame (line 53) | def add_audio_frame(self, data: bytes) -> None: method end_speaking (line 58) | async def end_speaking(self, stamp: str) -> tuple[str | None, float]: method cleanup (line 97) | def cleanup(self) -> None: class LiveChatRoute (line 108) | class LiveChatRoute(Route): method __init__ (line 111) | def __init__( method live_chat_ws (line 131) | async def live_chat_ws(self) -> None: method unified_chat_ws (line 135) | async def unified_chat_ws(self) -> None: method _unified_ws_loop (line 139) | async def _unified_ws_loop(self, force_ct: str | None = None) -> None: method _create_attachment_from_file (line 185) | async def _create_attachment_from_file( method _extract_web_search_refs (line 197) | def _extract_web_search_refs( method _save_bot_message (line 245) | async def _save_bot_message( method _send_chat_payload (line 276) | async def _send_chat_payload(self, session: LiveChatSession, payload: ... method _forward_chat_subscription (line 280) | async def _forward_chat_subscription( method _ensure_chat_subscription (line 308) | async def _ensure_chat_subscription( method _cleanup_chat_subscriptions (line 327) | async def _cleanup_chat_subscriptions(self, session: LiveChatSession) ... method _handle_chat_message (line 339) | async def _handle_chat_message( method _build_chat_message_parts (line 656) | async def _build_chat_message_parts(self, message: list[dict]) -> list... method _handle_message (line 664) | async def _handle_message(self, session: LiveChatSession, message: dic... method _process_audio (line 711) | async def _process_audio( method _save_interrupted_message (line 919) | async def _save_interrupted_message( FILE: astrbot/dashboard/routes/log.py function _format_log_sse (line 15) | def _format_log_sse(log: dict, ts: float) -> str: class LogRoute (line 24) | class LogRoute(Route): method __init__ (line 25) | def __init__(self, context: RouteContext, log_broker: LogBroker) -> None: method _replay_cached_logs (line 45) | async def _replay_cached_logs( method log (line 64) | async def log(self) -> QuartResponse: method log_history (line 103) | async def log_history(self): method get_trace_settings (line 120) | async def get_trace_settings(self): method update_trace_settings (line 129) | async def update_trace_settings(self): FILE: astrbot/dashboard/routes/open_api.py class OpenApiRoute (line 25) | class OpenApiRoute(Route): method __init__ (line 26) | def __init__( method _resolve_open_username (line 51) | def _resolve_open_username( method _get_chat_config_list (line 61) | def _get_chat_config_list(self) -> list[dict]: method _resolve_chat_config_id (line 77) | def _resolve_chat_config_id(self, post_data: dict) -> tuple[str | None... method _ensure_chat_session (line 110) | async def _ensure_chat_session( method chat_send (line 138) | async def chat_send(self): method _extract_ws_api_key (line 194) | def _extract_ws_api_key() -> str | None: method _authenticate_chat_ws_api_key (line 209) | async def _authenticate_chat_ws_api_key(self) -> tuple[bool, str | None]: method _send_chat_ws_error (line 235) | async def _send_chat_ws_error(self, message: str, code: str) -> None: method _update_session_config_route (line 244) | async def _update_session_config_route( method _handle_chat_ws_send (line 273) | async def _handle_chat_ws_send(self, post_data: dict) -> None: method chat_ws (line 505) | async def chat_ws(self) -> None: method upload_file (line 537) | async def upload_file(self): method get_chat_sessions (line 540) | async def get_chat_sessions(self): method get_chat_configs (line 603) | async def get_chat_configs(self): method _build_message_chain_from_payload (line 607) | async def _build_message_chain_from_payload( method send_message (line 617) | async def send_message(self): method get_bots (line 660) | async def get_bots(self): FILE: astrbot/dashboard/routes/persona.py class PersonaRoute (line 12) | class PersonaRoute(Route): method __init__ (line 13) | def __init__( method list_personas (line 40) | async def list_personas(self): method get_persona_detail (line 80) | async def get_persona_detail(self): method create_persona (line 119) | async def create_persona(self): method update_persona (line 193) | async def update_persona(self): method delete_persona (line 247) | async def delete_persona(self): method move_persona (line 265) | async def move_persona(self): method list_folders (line 288) | async def list_folders(self): method get_folder_tree (line 322) | async def get_folder_tree(self): method get_folder_detail (line 331) | async def get_folder_detail(self): method create_folder (line 367) | async def create_folder(self): method update_folder (line 412) | async def update_folder(self): method delete_folder (line 438) | async def delete_folder(self): method reorder_items (line 454) | async def reorder_items(self): FILE: astrbot/dashboard/routes/platform.py class PlatformRoute (line 15) | class PlatformRoute(Route): method __init__ (line 18) | def __init__( method _register_webhook_routes (line 29) | def _register_webhook_routes(self) -> None: method unified_webhook_callback (line 45) | async def unified_webhook_callback(self, webhook_uuid: str): method _find_platform_by_uuid (line 74) | def _find_platform_by_uuid(self, webhook_uuid: str) -> Platform | None: method get_platform_stats (line 89) | async def get_platform_stats(self): FILE: astrbot/dashboard/routes/plugin.py class RegistrySource (line 40) | class RegistrySource: class PluginRoute (line 46) | class PluginRoute(Route): method __init__ (line 47) | def __init__( method check_plugin_compatibility (line 90) | async def check_plugin_compatibility(self): method reload_failed_plugins (line 111) | async def reload_failed_plugins(self): method reload_plugins (line 138) | async def reload_plugins(self): method get_online_plugins (line 157) | async def get_online_plugins(self): method _build_registry_source (line 227) | def _build_registry_source(self, custom_url: str | None) -> RegistrySo... method _load_cached_md5 (line 251) | def _load_cached_md5(self, cache_file: str) -> str | None: method _fetch_remote_md5 (line 264) | async def _fetch_remote_md5(self, md5_url: str | None) -> str | None: method _is_cache_valid (line 287) | async def _is_cache_valid(self, source: RegistrySource) -> bool: method _load_plugin_cache (line 310) | def _load_plugin_cache(self, cache_file: str): method _save_plugin_cache (line 326) | def _save_plugin_cache(self, cache_file: str, data, md5: str | None = ... method get_plugin_logo_token (line 344) | async def get_plugin_logo_token(self, logo_path: str): method _resolve_plugin_dir (line 356) | def _resolve_plugin_dir(self, plugin) -> Path | None: method _get_plugin_installed_at (line 370) | def _get_plugin_installed_at(self, plugin) -> str | None: method get_plugins (line 384) | async def get_plugins(self): method get_failed_plugins (line 429) | async def get_failed_plugins(self): method get_plugin_handlers_info (line 433) | async def get_plugin_handlers_info(self, handler_full_names: list[str]): method install_plugin (line 494) | async def install_plugin(self): method install_plugin_upload (line 533) | async def install_plugin_upload(self): method uninstall_plugin (line 574) | async def uninstall_plugin(self): method uninstall_failed_plugin (line 599) | async def uninstall_failed_plugin(self): method update_plugin (line 627) | async def update_plugin(self): method update_all_plugins (line 649) | async def update_all_plugins(self): method off_plugin (line 702) | async def off_plugin(self): method on_plugin (line 720) | async def on_plugin(self): method get_plugin_readme (line 738) | async def get_plugin_readme(self): method get_plugin_changelog (line 794) | async def get_plugin_changelog(self): method get_custom_source (line 857) | async def get_custom_source(self): method save_custom_source (line 862) | async def save_custom_source(self): FILE: astrbot/dashboard/routes/route.py class RouteContext (line 9) | class RouteContext: class Route (line 14) | class Route: method __init__ (line 17) | def __init__(self, context: RouteContext) -> None: method register_routes (line 21) | def register_routes(self) -> None: class Response (line 43) | class Response: method error (line 48) | def error(self, message: str): method ok (line 53) | def ok(self, data: dict | list | None = None, message: str | None = No... FILE: astrbot/dashboard/routes/session_management.py class SessionManagementRoute (line 23) | class SessionManagementRoute(Route): method __init__ (line 24) | def __init__( method _get_umo_rules (line 51) | async def _get_umo_rules( method list_session_rule (line 120) | async def list_session_rule(self): method update_session_rule (line 251) | async def update_session_rule(self): method delete_session_rule (line 291) | async def delete_session_rule(self): method batch_delete_session_rule (line 326) | async def batch_delete_session_rule(self): method list_umos (line 382) | async def list_umos(self): method list_all_umos_with_status (line 403) | async def list_all_umos_with_status(self): method batch_update_service (line 558) | async def batch_update_service(self): method batch_update_provider (line 676) | async def batch_update_provider(self): method _get_groups (line 788) | def _get_groups(self) -> dict: method _save_groups (line 792) | def _save_groups(self, groups: dict) -> None: method list_groups (line 796) | async def list_groups(self): method create_group (line 816) | async def create_group(self): method update_group (line 859) | async def update_group(self): method delete_group (line 916) | async def delete_group(self): FILE: astrbot/dashboard/routes/skills.py function _to_jsonable (line 24) | def _to_jsonable(value: Any) -> Any: function _to_bool (line 34) | def _to_bool(value: Any, default: bool = False) -> bool: class SkillsRoute (line 47) | class SkillsRoute(Route): method __init__ (line 48) | def __init__(self, context: RouteContext, core_lifecycle) -> None: method _get_neo_client_config (line 70) | def _get_neo_client_config(self) -> tuple[str, str]: method _delete_neo_release (line 90) | async def _delete_neo_release( method _delete_neo_candidate (line 95) | async def _delete_neo_candidate( method _with_neo_client (line 100) | async def _with_neo_client( method get_skills (line 122) | async def get_skills(self): method upload_skill (line 147) | async def upload_skill(self): method batch_upload_skills (line 193) | async def batch_upload_skills(self): method download_skill (line 301) | async def download_skill(self): method update_skill (line 348) | async def update_skill(self): method delete_skill (line 367) | async def delete_skill(self): method get_neo_candidates (line 389) | async def get_neo_candidates(self): method get_neo_releases (line 410) | async def get_neo_releases(self): method get_neo_payload (line 433) | async def get_neo_payload(self): method evaluate_neo_candidate (line 446) | async def evaluate_neo_candidate(self): method promote_neo_candidate (line 476) | async def promote_neo_candidate(self): method rollback_neo_release (line 533) | async def rollback_neo_release(self): method sync_neo_release (line 553) | async def sync_neo_release(self): method delete_neo_candidate (line 598) | async def delete_neo_candidate(self): method delete_neo_release (line 619) | async def delete_neo_release(self): FILE: astrbot/dashboard/routes/stat.py class StatRoute (line 25) | class StatRoute(Route): method __init__ (line 26) | def __init__( method restart_core (line 47) | async def restart_core(self): method _get_running_time_components (line 58) | def _get_running_time_components(self, total_seconds: int): method is_default_cred (line 64) | def is_default_cred(self): method get_version (line 73) | async def get_version(self): method get_start_time (line 89) | async def get_start_time(self): method get_stat (line 92) | async def get_stat(self): method test_ghproxy_connection (line 161) | async def test_ghproxy_connection(self): method get_changelog (line 196) | async def get_changelog(self): method list_changelog_versions (line 254) | async def list_changelog_versions(self): method get_first_notice (line 285) | async def get_first_notice(self): FILE: astrbot/dashboard/routes/static_file.py class StaticFileRoute (line 4) | class StaticFileRoute(Route): method __init__ (line 5) | def __init__(self, context: RouteContext) -> None: method index (line 36) | async def index(self): FILE: astrbot/dashboard/routes/subagent.py class SubAgentRoute (line 12) | class SubAgentRoute(Route): method __init__ (line 13) | def __init__( method get_config (line 29) | async def get_config(self): method update_config (line 67) | async def update_config(self): method get_available_tools (line 90) | async def get_available_tools(self): FILE: astrbot/dashboard/routes/t2i.py class T2iRoute (line 14) | class T2iRoute(Route): method __init__ (line 15) | def __init__( method list_templates (line 41) | async def list_templates(self): method get_active_template (line 51) | async def get_active_template(self): method get_template (line 64) | async def get_template(self, name: str): method create_template (line 80) | async def create_template(self): method update_template (line 120) | async def update_template(self, name: str): method delete_template (line 151) | async def delete_template(self, name: str): method set_active_template (line 172) | async def set_active_template(self): method reset_default_template (line 207) | async def reset_default_template(self): FILE: astrbot/dashboard/routes/tools.py class EmptyMcpServersError (line 15) | class EmptyMcpServersError(ValueError): function _extract_mcp_server_config (line 21) | def _extract_mcp_server_config(mcp_servers_value: object) -> dict: class ToolsRoute (line 41) | class ToolsRoute(Route): method __init__ (line 42) | def __init__( method _rollback_mcp_server (line 62) | def _rollback_mcp_server(self, name: str) -> bool: method get_mcp_servers (line 73) | async def get_mcp_servers(self): method add_mcp_server (line 120) | async def add_mcp_server(self): method update_mcp_server (line 198) | async def update_mcp_server(self): method delete_mcp_server (line 339) | async def delete_mcp_server(self): method test_mcp_connection (line 381) | async def test_mcp_connection(self): method get_tool_list (line 428) | async def get_tool_list(self): method toggle_tool (line 461) | async def toggle_tool(self): method sync_provider (line 495) | async def sync_provider(self): FILE: astrbot/dashboard/routes/update.py class UpdateRoute (line 17) | class UpdateRoute(Route): method __init__ (line 18) | def __init__( method do_migration (line 37) | async def do_migration(self): method check_update (line 54) | async def check_update(self): method get_releases (line 80) | async def get_releases(self): method update_project (line 88) | async def update_project(self): method update_dashboard (line 139) | async def update_dashboard(self): method install_pip_package (line 152) | async def install_pip_package(self): FILE: astrbot/dashboard/routes/util.py function get_schema_item (line 13) | def get_schema_item(schema: dict | None, key_path: str) -> dict | None: function sanitize_filename (line 40) | def sanitize_filename(name: str) -> str: function sanitize_path_segment (line 57) | def sanitize_path_segment(segment: str) -> str: function config_key_to_folder (line 82) | def config_key_to_folder(key_path: str) -> str: function normalize_rel_path (line 89) | def normalize_rel_path(rel_path: str | None) -> str | None: FILE: astrbot/dashboard/server.py class _AddrWithPort (line 40) | class _AddrWithPort(Protocol): function _parse_env_bool (line 47) | def _parse_env_bool(value: str | None, default: bool) -> bool: class AstrBotJSONProvider (line 53) | class AstrBotJSONProvider(DefaultJSONProvider): method default (line 54) | def default(self, obj): class AstrBotDashboard (line 60) | class AstrBotDashboard: method __init__ (line 61) | def __init__( method srv_plug_route (line 153) | async def srv_plug_route(self, subpath, *args, **kwargs): method auth_middleware (line 162) | async def auth_middleware(self): method _extract_raw_api_key (line 228) | def _extract_raw_api_key() -> str | None: method _get_required_open_api_scope (line 243) | def _get_required_open_api_scope(path: str) -> str | None: method check_port_in_use (line 255) | def check_port_in_use(self, port: int) -> bool: method get_process_using_port (line 272) | def get_process_using_port(self, port: int) -> str: method _init_jwt_secret (line 294) | def _init_jwt_secret(self) -> None: method run (line 303) | def run(self): method shutdown_trigger (line 423) | async def shutdown_trigger(self) -> None: FILE: astrbot/dashboard/utils.py function generate_tsne_visualization (line 11) | async def generate_tsne_visualization( FILE: astrbot/utils/http_ssl_common.py function build_ssl_context_with_certifi (line 10) | def build_ssl_context_with_certifi(log_obj: Any | None = None) -> ssl.SS... FILE: dashboard/env.d.ts type ImportMetaEnv (line 3) | interface ImportMetaEnv { type ImportMeta (line 7) | interface ImportMeta { FILE: dashboard/scripts/subset-mdi-font.mjs constant ROOT (line 20) | const ROOT = resolve(__dirname, ".."); constant SRC (line 21) | const SRC = join(ROOT, "src"); constant MDI_CSS_PATH (line 22) | const MDI_CSS_PATH = join(ROOT, "node_modules/@mdi/font/css/materialdesi... constant MDI_TTF_PATH (line 23) | const MDI_TTF_PATH = join(ROOT, "node_modules/@mdi/font/fonts/materialde... constant MDI_WOFF2_PATH (line 24) | const MDI_WOFF2_PATH = join(ROOT, "node_modules/@mdi/font/fonts/material... constant MDI_WOFF_PATH (line 25) | const MDI_WOFF_PATH = join(ROOT, "node_modules/@mdi/font/fonts/materiald... constant OUT_DIR (line 26) | const OUT_DIR = join(ROOT, "src/assets/mdi-subset"); constant UTILITY_CLASSES (line 29) | const UTILITY_CLASSES = new Set([ constant ICON_CLASS_PATTERN (line 37) | const ICON_CLASS_PATTERN = /\.(mdi-[a-z][a-z0-9-]*)::before\s*\{\s*conte... function scanUsedIcons (line 54) | function scanUsedIcons(sourceFiles) { function parseIconCodepoints (line 69) | function parseIconCodepoints(mdiCSS) { function resolveUsedIcons (line 78) | function resolveUsedIcons(usedIcons, iconMap) { function extractUtilityCss (line 100) | function extractUtilityCss(mdiCSS, iconClassPattern) { function buildFallbackCss (line 115) | function buildFallbackCss() { function fallbackToFullFont (line 129) | function fallbackToFullFont(reason) { function runMdiSubset (line 149) | async function runMdiSubset() { FILE: dashboard/src/components/extension/componentPanel/composables/useCommandActions.ts function useCommandActions (line 8) | function useCommandActions( FILE: dashboard/src/components/extension/componentPanel/composables/useCommandFilters.ts function useCommandFilters (line 8) | function useCommandFilters(commands: Ref) { FILE: dashboard/src/components/extension/componentPanel/composables/useComponentData.ts function useComponentData (line 8) | function useComponentData() { FILE: dashboard/src/components/extension/componentPanel/types.ts type CommandItem (line 6) | interface CommandItem { type CommandType (line 29) | type CommandType = 'command' | 'group' | 'sub_command'; type PermissionType (line 32) | type PermissionType = 'admin' | 'everyone' | 'member'; type CommandSummary (line 35) | interface CommandSummary { type FilterState (line 41) | interface FilterState { type RenameDialogState (line 51) | interface RenameDialogState { type DetailsDialogState (line 60) | interface DetailsDialogState { type SnackbarState (line 66) | interface SnackbarState { type TypeInfo (line 73) | interface TypeInfo { type StatusInfo (line 80) | interface StatusInfo { type ToolParameter (line 87) | interface ToolParameter { type ToolItem (line 93) | interface ToolItem { FILE: dashboard/src/components/folder/types.ts type Folder (line 10) | interface Folder { type FolderTreeNode (line 23) | interface FolderTreeNode extends Folder { type DraggableItem (line 30) | interface DraggableItem { type DropEventData (line 39) | interface DropEventData { type FolderOperations (line 49) | interface FolderOperations { type CreateFolderData (line 72) | interface CreateFolderData { type UpdateFolderData (line 81) | interface UpdateFolderData { type FolderManagerState (line 91) | interface FolderManagerState { type BreadcrumbItem (line 104) | interface BreadcrumbItem { type ContextMenuEvent (line 114) | interface ContextMenuEvent { type FolderI18nKeys (line 123) | interface FolderI18nKeys { type BaseFolderProps (line 194) | interface BaseFolderProps { type SelectableItem (line 205) | interface SelectableItem { type FolderItemSelectorOperations (line 216) | interface FolderItemSelectorOperations { type FolderItemSelectorLabels (line 230) | interface FolderItemSelectorLabels { FILE: dashboard/src/components/folder/useFolderManager.ts type UseFolderManagerOptions (line 16) | interface UseFolderManagerOptions { type UseFolderManagerReturn (line 27) | interface UseFolderManagerReturn { function useFolderManager (line 63) | function useFolderManager(options: UseFolderManagerOptions): UseFolderMa... function collectFolderAndChildrenIds (line 291) | function collectFolderAndChildrenIds( FILE: dashboard/src/composables/useConversations.ts type Conversation (line 5) | interface Conversation { function useConversations (line 11) | function useConversations(chatboxMode: boolean = false) { FILE: dashboard/src/composables/useMediaHandling.ts type StagedFileInfo (line 4) | interface StagedFileInfo { function useMediaHandling (line 12) | function useMediaHandling() { FILE: dashboard/src/composables/useMessages.ts type ToolCall (line 6) | interface ToolCall { type TokenUsage (line 16) | interface TokenUsage { type AgentStats (line 23) | interface AgentStats { type FileInfo (line 31) | interface FileInfo { type MessagePart (line 38) | interface MessagePart { type ReplyInfo (line 52) | interface ReplyInfo { type MessageContent (line 58) | interface MessageContent { type Message (line 66) | interface Message { type ChatTransportMode (line 72) | type ChatTransportMode = 'sse' | 'websocket'; type StreamChunk (line 74) | type StreamChunk = { type WsStreamContext (line 87) | type WsStreamContext = { constant STREAMING_STORAGE_KEY (line 92) | const STREAMING_STORAGE_KEY = 'enableStreaming'; constant TRANSPORT_MODE_STORAGE_KEY (line 93) | const TRANSPORT_MODE_STORAGE_KEY = 'chatTransportMode'; function useMessages (line 95) | function useMessages( FILE: dashboard/src/composables/useProjects.ts function useProjects (line 5) | function useProjects() { FILE: dashboard/src/composables/useProviderSources.ts type UseProviderSourcesOptions (line 7) | interface UseProviderSourcesOptions { function resolveDefaultTab (line 13) | function resolveDefaultTab(value?: string) { function useProviderSources (line 39) | function useProviderSources(options: UseProviderSourcesOptions) { FILE: dashboard/src/composables/useRecording.ts function useRecording (line 4) | function useRecording() { FILE: dashboard/src/composables/useSessions.ts type Session (line 6) | interface Session { function useSessions (line 16) | function useSessions(chatboxMode: boolean = false) { FILE: dashboard/src/composables/useVADRecording.ts type VADOptions (line 4) | interface VADOptions { type VADInstance (line 21) | interface VADInstance { type Window (line 29) | interface Window { function useVADRecording (line 42) | function useVADRecording() { FILE: dashboard/src/config.ts type ConfigProps (line 1) | type ConfigProps = { function checkUITheme (line 10) | function checkUITheme() { FILE: dashboard/src/i18n/composables.ts function initI18n (line 12) | async function initI18n(locale: Locale = 'zh-CN') { function loadTranslations (line 22) | function loadTranslations(locale: Locale) { function useI18n (line 48) | function useI18n() { function useModuleI18n (line 123) | function useModuleI18n(moduleName: string) { function useLanguageSwitcher (line 156) | function useLanguageSwitcher() { function mergeDynamicTranslations (line 187) | function mergeDynamicTranslations(modulePath: string, allLocaleData: Rec... function deepMerge (line 207) | function deepMerge(target: Record, source: Record { method loadModules (line 142) | private async loadModules( method loadCoreModules (line 162) | async loadCoreModules(locale: string): Promise { method loadFeatureModules (line 169) | async loadFeatureModules(locale: string, features?: string[]): Promise... method loadMessageModules (line 176) | async loadMessageModules(locale: string): Promise { method loadAllModules (line 183) | async loadAllModules(locale: string): Promise { method loadLocale (line 200) | async loadLocale(locale: string): Promise { method mergeModules (line 207) | private mergeModules(modules: any[], moduleNames: string[]): any { method preloadEssentials (line 246) | async preloadEssentials(locale: string): Promise { method clearCache (line 261) | clearCache(locale?: string): void { method getLoadingStatus (line 275) | getLoadingStatus(): { total: number; loaded: number; modules: ModuleIn... method reloadModule (line 289) | async reloadModule(locale: string, moduleName: string): Promise { FILE: dashboard/src/i18n/tools/index.ts function generateMissingKeys (line 7) | function generateMissingKeys( FILE: dashboard/src/i18n/translations.ts type TranslationData (line 278) | type TranslationData = typeof translations; FILE: dashboard/src/i18n/types.ts type TranslationSchema (line 13) | type TranslationSchema = typeof translations[keyof typeof translations]; type NestedKeyOf (line 16) | type NestedKeyOf = T extends object type TranslationKey (line 25) | type TranslationKey = NestedKeyOf; type Locale (line 28) | type Locale = keyof typeof translations; type TranslationFunction (line 31) | type TranslationFunction = { type ModuleLoadingState (line 39) | interface ModuleLoadingState { type I18nConfig (line 46) | interface I18nConfig { type ValidationResult (line 56) | interface ValidationResult { type ValidationError (line 63) | interface ValidationError { type UsageReport (line 71) | interface UsageReport { type TranslationStats (line 80) | interface TranslationStats { type DevToolsData (line 103) | interface DevToolsData { FILE: dashboard/src/i18n/validator.ts class I18nValidator (line 8) | class I18nValidator { method validateCompleteness (line 15) | validateCompleteness(localeData: Record): ValidationResult { method validateValues (line 91) | validateValues(localeData: Record): ValidationError[] { method validateNestedValues (line 104) | private validateNestedValues( method validateUsage (line 152) | validateUsage(translationKeys: string[], usedKeys: string[]): UsageRep... method generateStats (line 168) | generateStats(localeData: Record): TranslationStats { method analyzeModules (line 208) | private analyzeModules(data: any, locale: string, modules: Translation... method getAllKeys (line 235) | private getAllKeys(obj: any, prefix: string = ''): string[] { method getValueByKey (line 254) | private getValueByKey(obj: any, keyPath: string): any { method validateInterpolation (line 263) | validateInterpolation(localeData: Record): ValidationErro... method validateKeyNaming (line 305) | validateKeyNaming(localeData: Record): ValidationError[] { method validateKeyNamingRecursive (line 319) | private validateKeyNamingRecursive( method validateLocales (line 347) | async validateLocales(locales: string[]): Promise<{ method generateReport (line 412) | generateReport(localeData: Record, usedKeys: string[] = [... FILE: dashboard/src/layouts/full/vertical-sidebar/sidebarItem.ts type menu (line 1) | interface menu { FILE: dashboard/src/plugins/confirmPlugin.ts method install (line 6) | install(app: App) { FILE: dashboard/src/router/index.ts type AuthStore (line 17) | interface AuthStore { FILE: dashboard/src/router/routeConstants.mjs constant EXTENSION_ROUTE_NAME (line 1) | const EXTENSION_ROUTE_NAME = 'Extensions'; FILE: dashboard/src/stores/auth.ts method login (line 13) | async login(username: string, password: string): Promise { method logout (line 33) | logout() { method has_token (line 39) | has_token(): boolean { FILE: dashboard/src/stores/common.js method createEventSource (line 18) | async createEventSource() { method closeEventSourcet (line 126) | closeEventSourcet() { method getLogCache (line 132) | getLogCache() { method fetchStartTime (line 135) | async fetchStartTime() { method getStartTime (line 140) | getStartTime() { method getPluginCollections (line 147) | async getPluginCollections(force = false, customSource = null) { FILE: dashboard/src/stores/customizer.ts method SET_SIDEBAR_DRAWER (line 19) | SET_SIDEBAR_DRAWER() { method SET_MINI_SIDEBAR (line 22) | SET_MINI_SIDEBAR(payload: boolean) { method SET_FONT (line 25) | SET_FONT(payload: string) { method SET_UI_THEME (line 28) | SET_UI_THEME(payload: string) { method SET_VIEW_MODE (line 32) | SET_VIEW_MODE(payload: 'bot' | 'chat') { method TOGGLE_CHAT_SIDEBAR (line 36) | TOGGLE_CHAT_SIDEBAR() { method SET_CHAT_SIDEBAR (line 39) | SET_CHAT_SIDEBAR(payload: boolean) { FILE: dashboard/src/stores/personaStore.ts type PersonaFolder (line 8) | interface PersonaFolder { type Persona (line 18) | interface Persona { type FolderTreeNode (line 31) | interface FolderTreeNode { type ReorderItem (line 40) | interface ReorderItem { method currentFolderName (line 61) | currentFolderName(): string { method toggleFolderExpansion (line 73) | toggleFolderExpansion(folderId: string) { method setFolderExpansion (line 85) | setFolderExpansion(folderId: string, expanded: boolean) { method loadFolderTree (line 97) | async loadFolderTree(): Promise { method navigateToFolder (line 114) | async navigateToFolder(folderId: string | null): Promise { method updateBreadcrumb (line 147) | updateBreadcrumb(folderId: string | null): void { method refreshCurrentFolder (line 176) | async refreshCurrentFolder(): Promise { method movePersonaToFolder (line 183) | async movePersonaToFolder(personaId: string, targetFolderId: string | nu... method moveFolderToFolder (line 203) | async moveFolderToFolder(folderId: string, targetParentId: string | null... method createFolder (line 223) | async createFolder(data: { method updateFolder (line 249) | async updateFolder(data: { method deleteFolder (line 270) | async deleteFolder(folderId: string): Promise { method deletePersona (line 289) | async deletePersona(personaId: string): Promise { method reorderItems (line 305) | async reorderItems(items: ReorderItem[]): Promise { method findFolderInTree (line 319) | findFolderInTree(folderId: string): FolderTreeNode | null { FILE: dashboard/src/stores/routerLoading.ts function start (line 9) | function start() { function finish (line 36) | function finish() { FILE: dashboard/src/stores/toast.js function add (line 8) | function add({ function shift (line 26) | function shift() { FILE: dashboard/src/types/confirm.d.ts type ComponentCustomProperties (line 6) | interface ComponentCustomProperties { FILE: dashboard/src/types/desktop-bridge.d.ts type AstrBotDesktopAppUpdateCheckResult (line 4) | interface AstrBotDesktopAppUpdateCheckResult { type AstrBotDesktopAppUpdateResult (line 12) | interface AstrBotDesktopAppUpdateResult { type AstrBotAppUpdaterBridge (line 17) | interface AstrBotAppUpdaterBridge { type Window (line 22) | interface Window { FILE: dashboard/src/types/themeTypes/ThemeType.ts type ThemeTypes (line 1) | type ThemeTypes = { FILE: dashboard/src/types/vue_tabler_icon.d.ts type HTMLAttributes (line 3) | interface HTMLAttributes { type SVGAttributes (line 6) | interface SVGAttributes { FILE: dashboard/src/utils/chatConfigBinding.ts constant CHAT_SELECTED_CONFIG_STORAGE_KEY (line 1) | const CHAT_SELECTED_CONFIG_STORAGE_KEY = 'chat.selectedConfigId'; type ChatMessageType (line 3) | type ChatMessageType = 'FriendMessage' | 'GroupMessage'; type WebchatUmoDetails (line 5) | interface WebchatUmoDetails { function getFromLocalStorage (line 13) | function getFromLocalStorage(key: string, fallback: string): string { function setToLocalStorage (line 25) | function setToLocalStorage(key: string, value: string): void { function getStoredDashboardUsername (line 36) | function getStoredDashboardUsername(): string { function getStoredSelectedChatConfigId (line 40) | function getStoredSelectedChatConfigId(): string { function setStoredSelectedChatConfigId (line 44) | function setStoredSelectedChatConfigId(configId: string): void { function buildWebchatUmoDetails (line 48) | function buildWebchatUmoDetails(sessionId: string, isGroup = false): Web... FILE: dashboard/src/utils/confirmDialog.ts type ConfirmDialogOptions (line 3) | type ConfirmDialogOptions = { type ConfirmDialogHandler (line 8) | type ConfirmDialogHandler = (options: ConfirmDialogOptions) => Promise { FILE: dashboard/src/utils/errorUtils.js constant INVALID_ERROR_STRINGS (line 1) | const INVALID_ERROR_STRINGS = new Set(["[object Object]", "undefined", "... FILE: dashboard/src/utils/hashRouteTabs.mjs function getValidHashTab (line 3) | function getValidHashTab(routeHash, validTabs) { function createTabRouteLocation (line 9) | function createTabRouteLocation(route, tab, fallbackRouteName = EXTENSIO... function replaceTabRoute (line 38) | async function replaceTabRoute(router, route, tab, logger = console) { FILE: dashboard/src/utils/platformUtils.js function getPlatformIcon (line 10) | function getPlatformIcon(name) { function getTutorialLink (line 47) | function getTutorialLink(platformType) { function getPlatformDescription (line 75) | function getPlatformDescription(template, name) { function getPlatformDisplayName (line 90) | function getPlatformDisplayName(platformId) { FILE: dashboard/src/utils/pluginSearch.js constant HAN_IDEOGRAPH_RE (line 3) | const HAN_IDEOGRAPH_RE = /\p{Unified_Ideograph}/u; FILE: dashboard/src/utils/providerUtils.js function getProviderIcon (line 10) | function getProviderIcon(type) { function getProviderDescription (line 54) | function getProviderDescription(template, name, tm) { FILE: dashboard/src/utils/restartAstrBot.ts type WaitingForRestartRef (line 4) | type WaitingForRestartRef = { function triggerWaiting (line 9) | async function triggerWaiting( function fetchCurrentStartTime (line 17) | async function fetchCurrentStartTime(): Promise { function restartAstrBot (line 28) | async function restartAstrBot( FILE: dashboard/src/utils/routerReadiness.mjs function waitForRouterReadyInBackground (line 1) | function waitForRouterReadyInBackground(router, logger = console) { FILE: dashboard/src/utils/sidebarCustomization.js constant STORAGE_KEY (line 2) | const STORAGE_KEY = 'astrbot_sidebar_customization'; function getSidebarCustomization (line 8) | function getSidebarCustomization() { function setSidebarCustomization (line 24) | function setSidebarCustomization(config) { function clearSidebarCustomization (line 35) | function clearSidebarCustomization() { function resolveSidebarItems (line 52) | function resolveSidebarItems(defaultItems, customization, options = {}) { function applySidebarCustomization (line 165) | function applySidebarCustomization(defaultItems) { FILE: dashboard/src/utils/toast.js function useToast (line 3) | function useToast() { FILE: dashboard/tests/subsetMdiFont.test.mjs function makeTmpDir (line 18) | function makeTmpDir() { FILE: dashboard/vite.config.ts function mdiSubset (line 10) | function mdiSubset() { FILE: docs/.vitepress/theme/index.js method Layout (line 14) | Layout() { FILE: docs/scripts/sync_docs_to_wiki.py class PageInfo (line 61) | class PageInfo: class ResolutionResult (line 72) | class ResolutionResult: class MarkdownLink (line 78) | class MarkdownLink: class Segment (line 87) | class Segment: function repo_root (line 92) | def repo_root() -> Path: function discover_source_pages (line 96) | def discover_source_pages(source_root: str) -> tuple[str, ...]: function find_label_end (line 108) | def find_label_end(content: str, label_start: int) -> int: function find_target_end (line 126) | def find_target_end(content: str, target_start: int) -> int: function iter_markdown_links (line 144) | def iter_markdown_links(content: str): function split_anchor (line 189) | def split_anchor(target: str) -> tuple[str, str]: function prepare_candidate_path (line 196) | def prepare_candidate_path(path: PurePosixPath) -> PurePosixPath: function language_for_source (line 206) | def language_for_source(source_path: str) -> str: function parse_doc_target (line 210) | def parse_doc_target(target: str) -> tuple[str, str] | None: function find_existing_source_path (line 225) | def find_existing_source_path( function resolve_link_path (line 261) | def resolve_link_path( class LinkResolver (line 289) | class LinkResolver: method __init__ (line 290) | def __init__(self, source_root: Path): method resolve_base_target (line 294) | def resolve_base_target( method resolve_markdown_target (line 304) | def resolve_markdown_target( function rewrite_link_target (line 316) | def rewrite_link_target(target: str, source_path: str, resolver: LinkRes... function rewrite_links_in_segment (line 324) | def rewrite_links_in_segment( function iter_segments (line 345) | def iter_segments(content: str): function rewrite_links (line 376) | def rewrite_links( function find_unresolved_doc_links (line 398) | def find_unresolved_doc_links(source_root: Path) -> list[str]: function check_unresolved_doc_links (line 426) | def check_unresolved_doc_links(source_root: Path) -> None: function page_name_for_source (line 435) | def page_name_for_source(source_path: str) -> str: function strip_frontmatter (line 441) | def strip_frontmatter(content: str) -> str: function normalize_content (line 452) | def normalize_content(content: str) -> str: function default_title_for_source (line 459) | def default_title_for_source(source_path: str) -> str: function extract_title (line 464) | def extract_title(content: str, source_path: str) -> str: function build_language_index (line 471) | def build_language_index(language: str, page_names: set[str]) -> str: function build_home_page (line 482) | def build_home_page(language: str) -> str: function build_sidebar (line 490) | def build_sidebar(page_infos: list[PageInfo]) -> str: function build_page_info (line 525) | def build_page_info( function read_manifest (line 549) | def read_manifest(wiki_root: Path) -> set[str]: function write_manifest (line 560) | def write_manifest(wiki_root: Path, file_names: set[str]) -> None: function write_file (line 568) | def write_file(path: Path, content: str) -> None: function sync_docs_to_wiki (line 573) | def sync_docs_to_wiki(source_root: Path, wiki_root: Path) -> None: function main (line 609) | def main() -> int: FILE: docs/scripts/upload_doc_images_to_r2.py function parse_args (line 34) | def parse_args() -> argparse.Namespace: function is_local_ref (line 74) | def is_local_ref(ref: str) -> bool: function parse_md_ref (line 85) | def parse_md_ref(raw: str) -> str: function clean_ref (line 95) | def clean_ref(raw: str) -> str: function resolve_local_ref (line 101) | def resolve_local_ref(md_file: Path, ref: str, root: Path) -> Path | None: function find_markdown_files (line 128) | def find_markdown_files(root: Path) -> list[Path]: function collect_images (line 137) | def collect_images( function build_target (line 169) | def build_target(remote: str, bucket: str, prefix: str) -> str: function rel_object_path (line 181) | def rel_object_path(root: Path, image_path: Path, prefix: str) -> str: function build_public_url (line 187) | def build_public_url(base: str, object_path: str) -> str: function run_rclone_upload (line 193) | def run_rclone_upload( function rewrite_markdown_files (line 228) | def rewrite_markdown_files( function main (line 281) | def main() -> int: FILE: docs/tests/test_sync_docs_to_wiki.py function load_sync_module (line 8) | def load_sync_module(): class SyncDocsHelpersTest (line 21) | class SyncDocsHelpersTest(unittest.TestCase): method test_page_name_for_nested_markdown_source (line 22) | def test_page_name_for_nested_markdown_source(self): method test_strip_frontmatter_removes_leading_block (line 30) | def test_strip_frontmatter_removes_leading_block(self): method test_module_does_not_expose_removed_wrapper_helpers (line 37) | def test_module_does_not_expose_removed_wrapper_helpers(self): method test_module_exposes_consolidated_helper_names (line 46) | def test_module_exposes_consolidated_helper_names(self): method test_parse_doc_target_returns_base_and_anchor (line 55) | def test_parse_doc_target_returns_base_and_anchor(self): method test_iter_markdown_links_handles_whitespace_before_target (line 66) | def test_iter_markdown_links_handles_whitespace_before_target(self): method test_iter_segments_splits_text_inline_and_fenced_code (line 73) | def test_iter_segments_splits_text_inline_and_fenced_code(self): method test_rewrite_links_handles_absolute_same_language_links (line 93) | def test_rewrite_links_handles_absolute_same_language_links(self): method test_rewrite_links_handles_relative_links (line 109) | def test_rewrite_links_handles_relative_links(self): method test_rewrite_links_handles_rewritten_root_paths (line 125) | def test_rewrite_links_handles_rewritten_root_paths(self): method test_rewrite_links_handles_internal_links_with_parentheses (line 141) | def test_rewrite_links_handles_internal_links_with_parentheses(self): method test_rewrite_links_leaves_local_asset_links_unchanged (line 166) | def test_rewrite_links_leaves_local_asset_links_unchanged(self): method test_rewrite_links_skips_fenced_code_blocks (line 190) | def test_rewrite_links_skips_fenced_code_blocks(self): method test_rewrite_links_skips_inline_code (line 211) | def test_rewrite_links_skips_inline_code(self): method test_link_resolver_resolves_source_paths (line 232) | def test_link_resolver_resolves_source_paths(self): method test_resolve_link_path_resolves_relative_target (line 250) | def test_resolve_link_path_resolves_relative_target(self): method test_build_home_page_uses_language_config (line 276) | def test_build_home_page_uses_language_config(self): method test_prepare_candidate_path_normalizes_suffix_and_alias (line 286) | def test_prepare_candidate_path_normalizes_suffix_and_alias(self): method test_find_existing_source_path_matches_language_bounded_suffixes (line 296) | def test_find_existing_source_path_matches_language_bounded_suffixes(s... method test_build_page_info_returns_page_info_dataclass (line 313) | def test_build_page_info_returns_page_info_dataclass(self): method test_build_page_info_uses_display_ready_group (line 333) | def test_build_page_info_uses_display_ready_group(self): method test_sync_writes_pages_and_sidebar (line 353) | def test_sync_writes_pages_and_sidebar(self): method test_sync_preserves_unknown_wiki_pages (line 393) | def test_sync_preserves_unknown_wiki_pages(self): method test_find_unresolved_doc_links_reports_ambiguous_matches (line 417) | def test_find_unresolved_doc_links_reports_ambiguous_matches(self): method test_resolver_does_not_match_partial_path_segments (line 444) | def test_resolver_does_not_match_partial_path_segments(self): method test_live_docs_have_no_unresolved_internal_doc_links (line 466) | def test_live_docs_have_no_unresolved_internal_doc_links(self): method test_check_unresolved_doc_links_raises_for_bad_docs (line 475) | def test_check_unresolved_doc_links_raises_for_bad_docs(self): FILE: main.py function check_env (line 43) | def check_env() -> None: function check_dashboard_files (line 68) | async def check_dashboard_files(webui_dir: str | None = None): function main_async (line 104) | async def main_async(webui_dir_arg: str | None) -> None: FILE: runtime_bootstrap.py function _try_patch_aiohttp_ssl_context (line 12) | def _try_patch_aiohttp_ssl_context( function configure_runtime_ca_bundle (line 37) | def configure_runtime_ca_bundle(log_obj: Any | None = None) -> bool: function initialize_runtime_bootstrap (line 49) | def initialize_runtime_bootstrap(log_obj: Any | None = None) -> bool: FILE: scripts/hatch_build.py class CustomBuildHook (line 26) | class CustomBuildHook(BuildHookInterface): method initialize (line 29) | def initialize(self, version: str, build_data: dict) -> None: FILE: tests/agent/test_context_manager.py class MockProvider (line 19) | class MockProvider: method __init__ (line 22) | def __init__(self): method text_chat (line 29) | async def text_chat(self, **kwargs): method get_model (line 38) | def get_model(self): method meta (line 41) | def meta(self): class TestContextManager (line 45) | class TestContextManager: method create_message (line 48) | def create_message( method create_messages (line 54) | def create_messages(self, count: int) -> list[Message]: method test_init_with_minimal_config (line 64) | def test_init_with_minimal_config(self): method test_init_with_llm_compressor (line 74) | def test_init_with_llm_compressor(self): method test_init_with_truncate_compressor (line 88) | def test_init_with_truncate_compressor(self): method test_process_empty_messages (line 100) | async def test_process_empty_messages(self): method test_process_single_message (line 110) | async def test_process_single_message(self): method test_process_with_no_limits (line 122) | async def test_process_with_no_limits(self): method test_enforce_max_turns_basic (line 136) | async def test_enforce_max_turns_basic(self): method test_enforce_max_turns_zero (line 149) | async def test_enforce_max_turns_zero(self): method test_enforce_max_turns_negative (line 161) | async def test_enforce_max_turns_negative(self): method test_enforce_max_turns_with_system_messages (line 172) | async def test_enforce_max_turns_with_system_messages(self): method test_token_compression_not_triggered_below_threshold (line 191) | async def test_token_compression_not_triggered_below_threshold(self): method test_token_compression_triggered_above_threshold (line 214) | async def test_token_compression_triggered_above_threshold(self): method test_token_compression_with_zero_max_tokens (line 251) | async def test_token_compression_with_zero_max_tokens(self): method test_token_compression_with_negative_max_tokens (line 268) | async def test_token_compression_with_negative_max_tokens(self): method test_double_check_after_compression (line 285) | async def test_double_check_after_compression(self): method test_combined_enforce_turns_and_token_limit (line 313) | async def test_combined_enforce_turns_and_token_limit(self): method test_sequential_processing_order (line 329) | async def test_sequential_processing_order(self): method test_error_handling_returns_original_messages (line 350) | async def test_error_handling_returns_original_messages(self): method test_error_handling_logs_exception (line 367) | async def test_error_handling_logs_exception(self): method test_process_messages_with_textpart_content (line 392) | async def test_process_messages_with_textpart_content(self): method test_token_counting_with_multimodal_content (line 408) | async def test_token_counting_with_multimodal_content(self): method test_process_messages_with_tool_calls (line 429) | async def test_process_messages_with_tool_calls(self): method test_should_compress_empty_messages (line 456) | async def test_should_compress_empty_messages(self): method test_should_compress_below_threshold (line 466) | async def test_should_compress_below_threshold(self): method test_should_compress_above_threshold (line 478) | async def test_should_compress_above_threshold(self): method test_truncate_by_halving_basic (line 493) | def test_truncate_by_halving_basic(self): method test_truncate_by_halving_empty_list (line 504) | def test_truncate_by_halving_empty_list(self): method test_truncate_by_halving_single_message (line 513) | def test_truncate_by_halving_single_message(self): method test_multiple_compression_cycles (line 526) | async def test_multiple_compression_cycles(self): method test_alternating_roles_preserved (line 542) | async def test_alternating_roles_preserved(self): method test_compression_threshold_default (line 557) | async def test_compression_threshold_default(self): method test_large_batch_processing (line 574) | async def test_large_batch_processing(self): method test_config_persistence (line 591) | async def test_config_persistence(self): method test_run_compression_calls_compressor (line 610) | async def test_run_compression_calls_compressor(self): method test_run_compression_applies_compressor_through_process (line 632) | async def test_run_compression_applies_compressor_through_process(self): method test_llm_compression_with_mock_provider (line 664) | async def test_llm_compression_with_mock_provider(self): method test_split_history_ensures_user_start (line 689) | def test_split_history_ensures_user_start(self): method test_split_history_handles_assistant_at_split_point (line 715) | def test_split_history_handles_assistant_at_split_point(self): method test_split_history_all_assistant_messages (line 736) | def test_split_history_all_assistant_messages(self): method test_split_history_with_system_messages (line 754) | def test_split_history_with_system_messages(self): FILE: tests/agent/test_token_counter.py function _msg (line 20) | def _msg(role: str, content) -> Message: class TestTextCounting (line 24) | class TestTextCounting: method test_plain_string (line 25) | def test_plain_string(self): method test_chinese (line 29) | def test_chinese(self): method test_text_part (line 35) | def test_text_part(self): class TestMultimodalCounting (line 40) | class TestMultimodalCounting: method test_image_counted (line 41) | def test_image_counted(self): method test_audio_counted (line 48) | def test_audio_counted(self): method test_think_counted (line 55) | def test_think_counted(self): method test_mixed_content (line 60) | def test_mixed_content(self): method test_multiple_images (line 71) | def test_multiple_images(self): class TestTrustedUsage (line 82) | class TestTrustedUsage: method test_trusted_overrides (line 83) | def test_trusted_overrides(self): class TestToolCalls (line 93) | class TestToolCalls: method test_tool_calls_counted (line 94) | def test_tool_calls_counted(self): FILE: tests/agent/test_truncator.py class TestContextTruncator (line 7) | class TestContextTruncator: method create_message (line 10) | def create_message(self, role: str, content: str = "test content") -> ... method create_messages (line 14) | def create_messages( method test_fix_messages_empty_list (line 37) | def test_fix_messages_empty_list(self): method test_fix_messages_normal_messages (line 43) | def test_fix_messages_normal_messages(self): method test_fix_messages_tool_without_context (line 55) | def test_fix_messages_tool_without_context(self): method test_truncate_by_turns_no_limit (line 67) | def test_truncate_by_turns_no_limit(self): method test_truncate_by_turns_basic (line 75) | def test_truncate_by_turns_basic(self): method test_truncate_by_turns_with_system_message (line 87) | def test_truncate_by_turns_with_system_message(self): method test_truncate_by_turns_zero_keep (line 99) | def test_truncate_by_turns_zero_keep(self): method test_truncate_by_turns_below_threshold (line 111) | def test_truncate_by_turns_below_threshold(self): method test_truncate_by_turns_exact_threshold (line 124) | def test_truncate_by_turns_exact_threshold(self): method test_truncate_by_turns_ensures_user_first (line 137) | def test_truncate_by_turns_ensures_user_first(self): method test_truncate_by_turns_multiple_drop (line 149) | def test_truncate_by_turns_multiple_drop(self): method test_truncate_by_dropping_oldest_turns_zero (line 162) | def test_truncate_by_dropping_oldest_turns_zero(self): method test_truncate_by_dropping_oldest_turns_negative (line 169) | def test_truncate_by_dropping_oldest_turns_negative(self): method test_truncate_by_dropping_oldest_turns_basic (line 176) | def test_truncate_by_dropping_oldest_turns_basic(self): method test_truncate_by_dropping_oldest_turns_with_system (line 188) | def test_truncate_by_dropping_oldest_turns_with_system(self): method test_truncate_by_dropping_oldest_turns_drop_all (line 198) | def test_truncate_by_dropping_oldest_turns_drop_all(self): method test_truncate_by_dropping_oldest_turns_drop_more_than_available (line 209) | def test_truncate_by_dropping_oldest_turns_drop_more_than_available(se... method test_truncate_by_dropping_oldest_turns_ensures_user_first (line 220) | def test_truncate_by_dropping_oldest_turns_ensures_user_first(self): method test_truncate_by_halving_empty (line 232) | def test_truncate_by_halving_empty(self): method test_truncate_by_halving_single_message (line 238) | def test_truncate_by_halving_single_message(self): method test_truncate_by_halving_two_messages (line 246) | def test_truncate_by_halving_two_messages(self): method test_truncate_by_halving_basic (line 254) | def test_truncate_by_halving_basic(self): method test_truncate_by_halving_with_system_message (line 266) | def test_truncate_by_halving_with_system_message(self): method test_truncate_by_halving_odd_count (line 276) | def test_truncate_by_halving_odd_count(self): method test_truncate_by_halving_ensures_user_first (line 287) | def test_truncate_by_halving_ensures_user_first(self): method test_truncate_by_halving_preserves_recent_messages (line 297) | def test_truncate_by_halving_preserves_recent_messages(self): method test_truncate_with_tool_messages (line 315) | def test_truncate_with_tool_messages(self): method test_chain_multiple_truncations (line 332) | def test_chain_multiple_truncations(self): method test_empty_after_system_message (line 348) | def test_empty_after_system_message(self): method test_all_system_messages (line 361) | def test_all_system_messages(self): method _build_tool_chain (line 381) | def _build_tool_chain(self, tool_rounds: int = 20) -> list[Message]: method test_drop_oldest_preserves_sole_user (line 392) | def test_drop_oldest_preserves_sole_user(self): method test_halving_preserves_sole_user (line 401) | def test_halving_preserves_sole_user(self): method test_truncate_by_turns_preserves_sole_user (line 409) | def test_truncate_by_turns_preserves_sole_user(self): method test_drop_oldest_heavy_drops_still_has_user (line 419) | def test_drop_oldest_heavy_drops_still_has_user(self): method test_normal_multi_user_not_affected (line 427) | def test_normal_multi_user_not_affected(self): FILE: tests/conftest.py function pytest_collection_modifyitems (line 36) | def pytest_collection_modifyitems(session, config, items): # noqa: ARG001 function pytest_addoption (line 81) | def pytest_addoption(parser): function pytest_configure (line 92) | def pytest_configure(config): function temp_dir (line 110) | def temp_dir(tmp_path: Path) -> Path: function event_queue (line 116) | def event_queue() -> Queue: function platform_settings (line 122) | def platform_settings() -> dict: function temp_data_dir (line 128) | def temp_data_dir(temp_dir: Path) -> Path: function temp_config_file (line 143) | def temp_config_file(temp_data_dir: Path) -> Path: function temp_db_file (line 158) | def temp_db_file(temp_data_dir: Path) -> Path: function mock_provider (line 169) | def mock_provider(): function mock_platform (line 185) | def mock_platform(): function mock_conversation (line 197) | def mock_conversation(): function mock_event (line 211) | def mock_event(): function astrbot_config (line 241) | def astrbot_config(temp_config_file: Path): function main_agent_build_config (line 251) | def main_agent_build_config(): function temp_db (line 276) | async def temp_db(temp_db_file: Path): function mock_context (line 295) | async def mock_context( function provider_request (line 346) | def provider_request(): function pytest_runtest_setup (line 364) | def pytest_runtest_setup(item): FILE: tests/fixtures/__init__.py function load_fixture (line 34) | def load_fixture(filename: str) -> dict: function get_fixture_path (line 42) | def get_fixture_path(filename: str) -> Path: FILE: tests/fixtures/helpers.py class NoopAwaitable (line 15) | class NoopAwaitable: method __await__ (line 21) | def __await__(self): function make_platform_config (line 32) | def make_platform_config(platform_type: str, **kwargs) -> dict: function create_mock_update (line 88) | def create_mock_update( function create_mock_file (line 170) | def create_mock_file(file_path: str = "https://api.telegram.org/file/tes... function create_mock_discord_attachment (line 190) | def create_mock_discord_attachment( function create_mock_discord_user (line 215) | def create_mock_discord_user( function create_mock_discord_channel (line 241) | def create_mock_discord_channel( function create_mock_message_component (line 277) | def create_mock_message_component( function create_mock_llm_response (line 307) | def create_mock_llm_response( class MockPluginConfig (line 344) | class MockPluginConfig: class MockPluginBuilder (line 393) | class MockPluginBuilder: method __init__ (line 415) | def __init__(self, plugin_store_path: str | Path): method create (line 424) | def create( method cleanup (line 489) | def cleanup(self, plugin_name: str | None = None) -> None: method cleanup_all (line 506) | def cleanup_all(self) -> None: method get_plugin_path (line 510) | def get_plugin_path(self, plugin_name: str) -> Path: method created_plugins (line 522) | def created_plugins(self) -> set[str]: function create_mock_updater_install (line 527) | def create_mock_updater_install( function create_mock_updater_update (line 562) | def create_mock_updater_update( FILE: tests/fixtures/mocks/aiocqhttp.py function create_mock_aiocqhttp_modules (line 12) | def create_mock_aiocqhttp_modules(): function mock_aiocqhttp_modules (line 28) | def mock_aiocqhttp_modules(): class MockAiocqhttpBuilder (line 42) | class MockAiocqhttpBuilder: method create_bot (line 46) | def create_bot(): FILE: tests/fixtures/mocks/discord.py function create_mock_discord_modules (line 12) | def create_mock_discord_modules(): function mock_discord_modules (line 97) | def mock_discord_modules(): class MockDiscordBuilder (line 120) | class MockDiscordBuilder: method create_client (line 124) | def create_client(): FILE: tests/fixtures/mocks/telegram.py function create_mock_telegram_modules (line 12) | def create_mock_telegram_modules(): function mock_telegram_modules (line 63) | def mock_telegram_modules(): class MockTelegramBuilder (line 94) | class MockTelegramBuilder: method create_bot (line 98) | def create_bot(): method create_application (line 117) | def create_application(): method create_scheduler (line 135) | def create_scheduler(): FILE: tests/fixtures/plugins/fixture_plugin.py class TestPlugin (line 12) | class TestPlugin(star.Star): method __init__ (line 15) | def __init__(self, context: star.Context) -> None: method terminate (line 19) | async def terminate(self) -> None: method test_command (line 24) | async def test_command(self, event: AstrMessageEvent) -> None: method test_llm_tool (line 29) | async def test_llm_tool(self, query: str) -> str: method test_regex_handler (line 38) | async def test_regex_handler(self, event: AstrMessageEvent) -> None: FILE: tests/test_anthropic_kimi_code_provider.py class _FakeAsyncAnthropic (line 7) | class _FakeAsyncAnthropic: method __init__ (line 8) | def __init__(self, **kwargs): method close (line 11) | async def close(self): function test_anthropic_provider_injects_custom_headers_into_http_client (line 15) | def test_anthropic_provider_injects_custom_headers_into_http_client(monk... function test_kimi_code_provider_sets_defaults_and_preserves_custom_headers (line 41) | def test_kimi_code_provider_sets_defaults_and_preserves_custom_headers(m... function test_kimi_code_provider_restores_required_user_agent_when_blank (line 66) | def test_kimi_code_provider_restores_required_user_agent_when_blank(monk... FILE: tests/test_api_key_open_api.py function _get_open_api_route (line 18) | def _get_open_api_route(app: Quart): function _create_api_key (line 31) | async def _create_api_key( function core_lifecycle_td (line 51) | async def core_lifecycle_td(tmp_path_factory): function app (line 69) | def app(core_lifecycle_td: AstrBotCoreLifecycle): function authenticated_header (line 76) | async def authenticated_header(app: Quart, core_lifecycle_td: AstrBotCor... function test_api_key_scope_and_revoke (line 91) | async def test_api_key_scope_and_revoke(app: Quart, authenticated_header... function test_open_send_message_with_api_key (line 146) | async def test_open_send_message_with_api_key(app: Quart, authenticated_... function test_open_chat_send_auto_session_id_and_username (line 170) | async def test_open_chat_send_auto_session_id_and_username( function test_open_chat_sessions_pagination (line 261) | async def test_open_chat_sessions_pagination( function test_open_chat_configs_list (line 326) | async def test_open_chat_configs_list( function test_open_api_auth_validation_and_key_carriers (line 356) | async def test_open_api_auth_validation_and_key_carriers( function test_open_chat_send_conversation_alias_and_blank_username (line 400) | async def test_open_chat_send_conversation_alias_and_blank_username( function test_open_chat_send_config_resolution (line 462) | async def test_open_chat_send_config_resolution( function test_open_chat_sessions_input_validation_and_filtering (line 600) | async def test_open_chat_sessions_input_validation_and_filtering( function test_open_send_message_error_paths (line 677) | async def test_open_send_message_error_paths(app: Quart, authenticated_h... function test_open_file_upload_requires_file_and_can_upload (line 732) | async def test_open_file_upload_requires_file_and_can_upload( FILE: tests/test_backup.py function temp_backup_dir (line 38) | def temp_backup_dir(tmp_path): function temp_data_dir (line 46) | def temp_data_dir(tmp_path): function mock_main_db (line 63) | def mock_main_db(): function mock_kb_manager (line 77) | def mock_kb_manager(): class TestImportResult (line 93) | class TestImportResult: method test_init (line 96) | def test_init(self): method test_add_warning (line 105) | def test_add_warning(self): method test_add_error (line 112) | def test_add_error(self): method test_to_dict (line 119) | def test_to_dict(self): class TestAstrBotExporter (line 131) | class TestAstrBotExporter: method test_init (line 134) | def test_init(self, mock_main_db, mock_kb_manager, temp_data_dir): method test_model_to_dict_with_model_dump (line 144) | def test_model_to_dict_with_model_dump(self): method test_model_to_dict_with_datetime (line 155) | def test_model_to_dict_with_datetime(self): method test_add_checksum (line 166) | def test_add_checksum(self): method test_generate_manifest (line 175) | def test_generate_manifest(self, mock_main_db, mock_kb_manager): method test_export_all_creates_zip (line 209) | async def test_export_all_creates_zip( class TestAstrBotImporter (line 244) | class TestAstrBotImporter: method test_init (line 247) | def test_init(self, mock_main_db, mock_kb_manager, temp_data_dir): method test_validate_version_match (line 257) | def test_validate_version_match(self): method test_validate_version_major_diff_rejected (line 265) | def test_validate_version_major_diff_rejected(self): method test_validate_version_minor_diff_allowed (line 274) | def test_validate_version_minor_diff_allowed(self): method test_validate_version_missing (line 286) | def test_validate_version_missing(self): method test_convert_datetime_fields (line 294) | def test_convert_datetime_fields(self): method test_merge_platform_stats_rows (line 313) | def test_merge_platform_stats_rows(self): method test_merge_platform_stats_rows_normalizes_naive_timestamp_to_utc (line 380) | def test_merge_platform_stats_rows_normalizes_naive_timestamp_to_utc(s... method test_merge_platform_stats_rows_warns_on_invalid_count (line 405) | def test_merge_platform_stats_rows_warns_on_invalid_count(self): method test_merge_platform_stats_rows_keeps_invalid_timestamps_distinct (line 498) | def test_merge_platform_stats_rows_keeps_invalid_timestamps_distinct(s... method test_merge_platform_stats_rows_keeps_non_string_platform_keys_distinct (line 529) | def test_merge_platform_stats_rows_keeps_non_string_platform_keys_dist... method test_merge_platform_stats_rows_preserves_input_order (line 565) | def test_merge_platform_stats_rows_preserves_input_order(self): method test_import_file_not_exists (line 606) | async def test_import_file_not_exists(self, mock_main_db, tmp_path): method test_import_invalid_zip (line 616) | async def test_import_invalid_zip(self, mock_main_db, tmp_path): method test_import_missing_manifest (line 629) | async def test_import_missing_manifest(self, mock_main_db, tmp_path): method test_import_major_version_mismatch (line 643) | async def test_import_major_version_mismatch(self, mock_main_db, tmp_p... method test_import_replace_fails_when_clear_main_db_fails (line 663) | async def test_import_replace_fails_when_clear_main_db_fails( class TestSecureFilename (line 692) | class TestSecureFilename: method test_secure_filename_normal (line 695) | def test_secure_filename_normal(self): method test_secure_filename_path_traversal (line 700) | def test_secure_filename_path_traversal(self): method test_secure_filename_with_path (line 706) | def test_secure_filename_with_path(self): method test_secure_filename_special_chars (line 714) | def test_secure_filename_special_chars(self): method test_secure_filename_hidden_file (line 726) | def test_secure_filename_hidden_file(self): method test_secure_filename_empty (line 731) | def test_secure_filename_empty(self): method test_generate_unique_filename (line 736) | def test_generate_unique_filename(self): method test_generate_unique_filename_with_complex_name (line 745) | def test_generate_unique_filename_with_complex_name(self): class TestVersionComparison (line 754) | class TestVersionComparison: method test_get_major_version_simple (line 757) | def test_get_major_version_simple(self): method test_get_major_version_with_prefix (line 763) | def test_get_major_version_with_prefix(self): method test_get_major_version_with_prerelease (line 768) | def test_get_major_version_with_prerelease(self): method test_get_major_version_single_part (line 774) | def test_get_major_version_single_part(self): method test_get_major_version_empty (line 778) | def test_get_major_version_empty(self): method test_compare_versions_equal (line 782) | def test_compare_versions_equal(self): method test_compare_versions_less_than (line 788) | def test_compare_versions_less_than(self): method test_compare_versions_greater_than (line 797) | def test_compare_versions_greater_than(self): method test_compare_versions_different_lengths (line 806) | def test_compare_versions_different_lengths(self): method test_compare_versions_prerelease (line 812) | def test_compare_versions_prerelease(self): class TestImportPreCheckResult (line 821) | class TestImportPreCheckResult: method test_init_default_values (line 824) | def test_init_default_values(self): method test_to_dict (line 837) | def test_to_dict(self): class TestPreCheck (line 859) | class TestPreCheck: method test_pre_check_file_not_exists (line 862) | def test_pre_check_file_not_exists(self, mock_main_db): method test_pre_check_invalid_zip (line 870) | def test_pre_check_invalid_zip(self, mock_main_db, tmp_path): method test_pre_check_missing_manifest (line 881) | def test_pre_check_missing_manifest(self, mock_main_db, tmp_path): method test_pre_check_version_match (line 893) | def test_pre_check_version_match(self, mock_main_db, tmp_path): method test_pre_check_minor_version_diff (line 919) | def test_pre_check_minor_version_diff(self, mock_main_db, tmp_path): method test_pre_check_major_version_diff (line 945) | def test_pre_check_major_version_diff(self, mock_main_db, tmp_path): class TestVersionCompatibility (line 967) | class TestVersionCompatibility: method test_check_version_compatibility_match (line 970) | def test_check_version_compatibility_match(self, mock_main_db): method test_check_version_compatibility_minor_diff (line 978) | def test_check_version_compatibility_minor_diff(self, mock_main_db): method test_check_version_compatibility_major_diff (line 989) | def test_check_version_compatibility_major_diff(self, mock_main_db): method test_check_version_compatibility_empty_version (line 997) | def test_check_version_compatibility_empty_version(self, mock_main_db): class TestModelMappings (line 1006) | class TestModelMappings: method test_main_db_models_not_empty (line 1009) | def test_main_db_models_not_empty(self): method test_main_db_models_contain_expected_tables (line 1013) | def test_main_db_models_contain_expected_tables(self): method test_kb_metadata_models_not_empty (line 1025) | def test_kb_metadata_models_not_empty(self): method test_kb_metadata_models_contain_expected_tables (line 1029) | def test_kb_metadata_models_contain_expected_tables(self): class TestBackupIntegration (line 1040) | class TestBackupIntegration: method test_export_import_roundtrip (line 1044) | async def test_export_import_roundtrip(self, tmp_path): FILE: tests/test_chat_route.py class _QueueThatRaises (line 8) | class _QueueThatRaises: method __init__ (line 9) | def __init__(self, exc: BaseException): method get (line 12) | async def get(self): class _QueueWithResult (line 16) | class _QueueWithResult: method __init__ (line 17) | def __init__(self, result): method get (line 20) | async def get(self): function test_poll_webchat_stream_result_breaks_on_cancelled_error (line 25) | async def test_poll_webchat_stream_result_breaks_on_cancelled_error(): function test_poll_webchat_stream_result_continues_on_generic_exception (line 36) | async def test_poll_webchat_stream_result_continues_on_generic_exception(): function test_poll_webchat_stream_result_returns_queue_payload (line 47) | async def test_poll_webchat_stream_result_returns_queue_payload(): FILE: tests/test_computer_config.py class TestDiscoverBayCredentials (line 21) | class TestDiscoverBayCredentials: method _write_creds (line 24) | def _write_creds( method test_discover_from_bay_data_dir_env (line 42) | def test_discover_from_bay_data_dir_env( method test_discover_from_cwd (line 54) | def test_discover_from_cwd( method test_returns_empty_when_no_credentials_found (line 66) | def test_returns_empty_when_no_credentials_found( method test_skips_empty_api_key (line 76) | def test_skips_empty_api_key( method test_skips_malformed_json (line 88) | def test_skips_malformed_json( method test_endpoint_mismatch_still_returns_key (line 102) | def test_endpoint_mismatch_still_returns_key( method test_endpoint_match_no_warning (line 120) | def test_endpoint_match_no_warning( method test_bay_data_dir_priority_over_cwd (line 137) | def test_bay_data_dir_priority_over_cwd( method test_trailing_slash_normalization (line 151) | def test_trailing_slash_normalization( class TestLogComputerConfigChanges (line 174) | class TestLogComputerConfigChanges: method test_logs_runtime_change (line 178) | def test_logs_runtime_change(self, mock_logger) -> None: method test_no_log_when_runtime_unchanged (line 190) | def test_no_log_when_runtime_unchanged(self, mock_logger) -> None: method test_logs_sandbox_key_change (line 200) | def test_logs_sandbox_key_change(self, mock_logger) -> None: method test_masks_token_values (line 220) | def test_masks_token_values(self, mock_logger) -> None: method test_masks_empty_token_as_empty_label (line 237) | def test_masks_empty_token_as_empty_label(self, mock_logger) -> None: method test_no_log_when_nothing_changed (line 253) | def test_no_log_when_nothing_changed(self, mock_logger) -> None: method test_handles_missing_provider_settings (line 270) | def test_handles_missing_provider_settings(self, mock_logger) -> None: method test_detects_new_sandbox_key (line 281) | def test_detects_new_sandbox_key(self, mock_logger) -> None: method test_detects_removed_sandbox_key (line 297) | def test_detects_removed_sandbox_key(self, mock_logger) -> None: method test_secret_key_masked (line 313) | def test_secret_key_masked(self, mock_logger) -> None: FILE: tests/test_computer_skill_sync.py class _FakeShell (line 9) | class _FakeShell: method __init__ (line 10) | def __init__(self, sync_payload_json: str): method exec (line 14) | async def exec(self, command: str, **kwargs): class _FakeBooter (line 27) | class _FakeBooter: method __init__ (line 28) | def __init__(self, sync_payload_json: str): method upload_file (line 32) | async def upload_file(self, path: str, file_name: str) -> dict: function test_sync_skills_keeps_builtin_skills_when_local_is_empty (line 37) | def test_sync_skills_keeps_builtin_skills_when_local_is_empty(monkeypatc... function test_sync_skills_uses_managed_strategy_instead_of_wiping_all (line 77) | def test_sync_skills_uses_managed_strategy_instead_of_wiping_all( FILE: tests/test_dashboard.py function core_lifecycle_td (line 31) | async def core_lifecycle_td(tmp_path_factory): function app (line 52) | def app(core_lifecycle_td: AstrBotCoreLifecycle): function authenticated_header (line 61) | async def authenticated_header(app: Quart, core_lifecycle_td: AstrBotCor... function test_auth_login (line 78) | async def test_auth_login(app: Quart, core_lifecycle_td: AstrBotCoreLife... function test_get_stat (line 100) | async def test_get_stat(app: Quart, authenticated_header: dict): function test_subagent_config_accepts_default_persona (line 111) | async def test_subagent_config_accepts_default_persona( function test_batch_delete_sessions_rejects_non_object_payload (line 159) | async def test_batch_delete_sessions_rejects_non_object_payload( function test_batch_delete_sessions_masks_internal_error (line 176) | async def test_batch_delete_sessions_masks_internal_error( function test_batch_delete_sessions_uses_batch_lookup (line 212) | async def test_batch_delete_sessions_uses_batch_lookup( function test_plugins (line 261) | async def test_plugins( function test_plugins_when_installed_at_unresolved (line 380) | async def test_plugins_when_installed_at_unresolved( function test_commands_api (line 402) | async def test_commands_api(app: Quart, authenticated_header: dict): function test_check_update (line 430) | async def test_check_update( function test_do_update (line 468) | async def test_do_update( function test_install_pip_package_returns_pip_install_error_message (line 515) | async def test_install_pip_package_returns_pip_install_error_message( class _FakeNeoSkills (line 543) | class _FakeNeoSkills: method list_candidates (line 544) | async def list_candidates(self, **kwargs): method list_releases (line 555) | async def list_releases(self, **kwargs): method get_payload (line 567) | async def get_payload(self, payload_ref: str): method evaluate_candidate (line 573) | async def evaluate_candidate(self, candidate_id: str, **kwargs): method promote_candidate (line 576) | async def promote_candidate(self, candidate_id: str, stage: str = "can... method rollback_release (line 584) | async def rollback_release(self, release_id: str): class _FakeNeoBayClient (line 588) | class _FakeNeoBayClient: method __init__ (line 589) | def __init__(self, endpoint_url: str, access_token: str): method __aenter__ (line 594) | async def __aenter__(self): method __aexit__ (line 597) | async def __aexit__(self, exc_type, exc, tb): function test_neo_skills_routes (line 603) | async def test_neo_skills_routes( function test_batch_upload_skills_returns_error_when_all_files_invalid (line 725) | async def test_batch_upload_skills_returns_error_when_all_files_invalid( function test_batch_upload_skills_accepts_zip_files (line 750) | async def test_batch_upload_skills_accepts_zip_files( function test_batch_upload_skills_accepts_valid_skill_archive (line 803) | async def test_batch_upload_skills_accepts_valid_skill_archive( function test_batch_upload_skills_partial_success (line 876) | async def test_batch_upload_skills_partial_success( FILE: tests/test_kb_import.py function core_lifecycle_td (line 17) | async def core_lifecycle_td(tmp_path_factory): function app (line 60) | def app(core_lifecycle_td: AstrBotCoreLifecycle): function authenticated_header (line 68) | async def authenticated_header(app: Quart, core_lifecycle_td: AstrBotCor... function test_import_documents (line 85) | async def test_import_documents( function test_import_documents_invalid_input (line 150) | async def test_import_documents_invalid_input(app: Quart, authenticated_... FILE: tests/test_kook/test_kook_event.py function mock_kook_client (line 24) | async def mock_kook_client(upload_asset_return: str, send_text_return: s... function mock_file_message (line 33) | def mock_file_message(input: str): function mock_record_message (line 39) | def mock_record_message(input: str): function mock_astrbot_message (line 46) | def mock_astrbot_message(): function test_kook_event_warp_message (line 158) | async def test_kook_event_warp_message( FILE: tests/test_kook/test_kook_types.py function test_kook_card_message_container_append (line 30) | def test_kook_card_message_container_append(): function test_kook_card_message_container_to_json (line 43) | def test_kook_card_message_container_to_json( function test_all_kook_card_type (line 53) | def test_all_kook_card_type(): function test_websocket_event_type_parse (line 129) | def test_websocket_event_type_parse(expected_json_data_filename:str): function test_websocket_event_create (line 138) | def test_websocket_event_create(): FILE: tests/test_local_shell_component.py class _FakeCompletedProcess (line 10) | class _FakeCompletedProcess: method __init__ (line 11) | def __init__(self, stdout: bytes, stderr: bytes = b"", returncode: int... function test_local_shell_component_decodes_utf8_output (line 17) | def test_local_shell_component_decodes_utf8_output(monkeypatch): function test_local_shell_component_prefers_utf8_before_windows_locale (line 31) | def test_local_shell_component_prefers_utf8_before_windows_locale( function test_local_shell_component_falls_back_to_gbk_on_windows (line 53) | def test_local_shell_component_falls_back_to_gbk_on_windows(monkeypatch): function test_local_shell_component_falls_back_to_utf8_replace (line 73) | def test_local_shell_component_falls_back_to_utf8_replace(monkeypatch): FILE: tests/test_main.py class _version_info (line 14) | class _version_info: method __init__ (line 15) | def __init__(self, major, minor): method __eq__ (line 19) | def __eq__(self, other): method __ge__ (line 24) | def __ge__(self, other): method __le__ (line 29) | def __le__(self, other): method __gt__ (line 34) | def __gt__(self, other): method __lt__ (line 39) | def __lt__(self, other): function test_check_env (line 45) | def test_check_env(monkeypatch): function test_version_info_comparisons (line 63) | def test_version_info_comparisons(): function test_check_dashboard_files_not_exists (line 97) | async def test_check_dashboard_files_not_exists(monkeypatch): function test_check_dashboard_files_exists_and_version_match (line 107) | async def test_check_dashboard_files_exists_and_version_match(monkeypatch): function test_check_dashboard_files_exists_but_version_mismatch (line 126) | async def test_check_dashboard_files_exists_but_version_mismatch(monkeyp... function test_check_dashboard_files_with_webui_dir_arg (line 141) | async def test_check_dashboard_files_with_webui_dir_arg(monkeypatch): FILE: tests/test_neo_skill_sync.py class _FakeSkills (line 11) | class _FakeSkills: method list_releases (line 12) | async def list_releases(self, **kwargs): method get_candidate (line 26) | async def get_candidate(self, candidate_id: str): method get_payload (line 33) | async def get_payload(self, payload_ref: str): class _FakeClient (line 44) | class _FakeClient: method __init__ (line 45) | def __init__(self): function test_sync_release_writes_skill_and_map (line 49) | def test_sync_release_writes_skill_and_map(monkeypatch, tmp_path: Path): function test_sync_release_rejects_non_stable (line 91) | def test_sync_release_rejects_non_stable(monkeypatch, tmp_path: Path): FILE: tests/test_neo_skill_tools.py class _FakeSkills (line 10) | class _FakeSkills: method __init__ (line 11) | def __init__(self): method promote_candidate (line 14) | async def promote_candidate(self, candidate_id: str, stage: str = "can... method rollback_release (line 24) | async def rollback_release(self, release_id: str): class _FakeClient (line 29) | class _FakeClient: method __init__ (line 30) | def __init__(self): class _FakeBooter (line 34) | class _FakeBooter: method __init__ (line 35) | def __init__(self): function test_promote_stable_sync_failure_auto_rolls_back (line 40) | def test_promote_stable_sync_failure_auto_rolls_back(monkeypatch): FILE: tests/test_openai_source.py class _ErrorWithBody (line 9) | class _ErrorWithBody(Exception): method __init__ (line 10) | def __init__(self, message: str, body: dict): class _ErrorWithResponse (line 15) | class _ErrorWithResponse(Exception): method __init__ (line 16) | def __init__(self, message: str, response_text: str): function _make_provider (line 21) | def _make_provider(overrides: dict | None = None) -> ProviderOpenAIOffic... function _make_groq_provider (line 36) | def _make_groq_provider(overrides: dict | None = None) -> ProviderGroq: function test_handle_api_error_content_moderated_removes_images (line 52) | async def test_handle_api_error_content_moderated_removes_images(): function test_handle_api_error_model_not_vlm_removes_images_and_retries_text_only (line 93) | async def test_handle_api_error_model_not_vlm_removes_images_and_retries... function test_handle_api_error_model_not_vlm_after_fallback_raises (line 132) | async def test_handle_api_error_model_not_vlm_after_fallback_raises(): function test_handle_api_error_content_moderated_with_unserializable_body (line 168) | async def test_handle_api_error_content_moderated_with_unserializable_bo... function test_extract_error_text_candidates_truncates_long_response_text (line 207) | def test_extract_error_text_candidates_truncates_long_response_text(): function test_openai_payload_keeps_reasoning_content_in_assistant_history (line 218) | async def test_openai_payload_keeps_reasoning_content_in_assistant_histo... function test_groq_payload_drops_reasoning_content_from_assistant_history (line 243) | async def test_groq_payload_drops_reasoning_content_from_assistant_histo... function test_handle_api_error_content_moderated_without_images_raises (line 269) | async def test_handle_api_error_content_moderated_without_images_raises(): function test_handle_api_error_content_moderated_detects_structured_body (line 301) | async def test_handle_api_error_content_moderated_detects_structured_bod... function test_handle_api_error_content_moderated_supports_custom_patterns (line 343) | async def test_handle_api_error_content_moderated_supports_custom_patter... function test_handle_api_error_content_moderated_without_patterns_raises (line 382) | async def test_handle_api_error_content_moderated_without_patterns_raise... function test_handle_api_error_unknown_image_error_raises (line 418) | async def test_handle_api_error_unknown_image_error_raises(): FILE: tests/test_pip_helper_modules.py function test_requirements_utils_parse_package_install_input_collects_specs_and_names (line 10) | def test_requirements_utils_parse_package_install_input_collects_specs_a... function test_core_constraints_provider_writes_constraints_file_from_fallback_distribution (line 24) | def test_core_constraints_provider_writes_constraints_file_from_fallback... function test_resolve_core_dist_name_skips_distribution_without_name (line 77) | def test_resolve_core_dist_name_skips_distribution_without_name(monkeypa... function test_find_missing_requirements_returns_none_when_precheck_gate_fails (line 110) | def test_find_missing_requirements_returns_none_when_precheck_gate_fails( function test_parse_package_install_input_tracks_only_named_direct_references (line 128) | def test_parse_package_install_input_tracks_only_named_direct_references(): function test_find_missing_requirements_or_raise_uses_requirements_exception (line 140) | def test_find_missing_requirements_or_raise_uses_requirements_exception(... function test_build_missing_requirements_install_lines_keeps_only_missing_lines (line 148) | def test_build_missing_requirements_install_lines_keeps_only_missing_lin... function test_build_missing_requirements_install_lines_returns_empty_tuple_when_all_satisfied (line 171) | def test_build_missing_requirements_install_lines_returns_empty_tuple_wh... function test_build_missing_requirements_install_lines_returns_none_for_option_lines (line 184) | def test_build_missing_requirements_install_lines_returns_none_for_optio... function test_build_missing_requirements_install_lines_skips_inactive_marker_lines (line 202) | def test_build_missing_requirements_install_lines_skips_inactive_marker_... function test_plan_missing_requirements_install_returns_none_when_missing_names_cannot_map_to_lines (line 220) | def test_plan_missing_requirements_install_returns_none_when_missing_nam... function test_plan_missing_requirements_install_loads_requirement_lines_once (line 241) | def test_plan_missing_requirements_install_loads_requirement_lines_once( function test_build_missing_requirements_install_lines_logs_why_option_lines_fall_back (line 277) | def test_build_missing_requirements_install_lines_logs_why_option_lines_... function test_find_missing_requirements_logs_path_and_reason_on_precheck_fallback (line 305) | def test_find_missing_requirements_logs_path_and_reason_on_precheck_fall... function test_load_requirement_lines_for_precheck_uses_parse_requirement_line_result (line 326) | def test_load_requirement_lines_for_precheck_uses_parse_requirement_line... function test_collect_installed_distribution_versions_skips_nameless_distribution (line 347) | def test_collect_installed_distribution_versions_skips_nameless_distribu... function test_get_core_constraints_logs_resolution_step_context (line 371) | def test_get_core_constraints_logs_resolution_step_context(monkeypatch): function test_iter_requirements_supports_direct_line_input (line 394) | def test_iter_requirements_supports_direct_line_input(): function test_parse_requirement_name_and_spec_preserves_direct_reference_rules (line 406) | def test_parse_requirement_name_and_spec_preserves_direct_reference_rule... function test_parse_requirement_name_and_spec_handles_plain_requirement_token (line 418) | def test_parse_requirement_name_and_spec_handles_plain_requirement_token(): FILE: tests/test_pip_installer.py function _make_run_pip_mock (line 23) | def _make_run_pip_mock( function _configure_run_pip_in_process_capture (line 37) | def _configure_run_pip_in_process_capture( function configure_run_pip_in_process_capture (line 88) | def configure_run_pip_in_process_capture(monkeypatch): function test_install_targets_site_packages_for_desktop_client (line 96) | async def test_install_targets_site_packages_for_desktop_client(monkeypa... function test_run_pip_in_process_streams_output_lines (line 132) | async def test_run_pip_in_process_streams_output_lines(monkeypatch): function test_run_pip_in_process_preserves_shared_stream_order (line 178) | async def test_run_pip_in_process_preserves_shared_stream_order(monkeypa... function test_run_pip_in_process_preserves_blank_lines (line 207) | async def test_run_pip_in_process_preserves_blank_lines(monkeypatch): function test_run_pip_in_process_preserves_trailing_blank_line_on_flush (line 238) | async def test_run_pip_in_process_preserves_trailing_blank_line_on_flush... function test_run_pip_in_process_normalizes_crlf_without_extra_blank_lines (line 265) | async def test_run_pip_in_process_normalizes_crlf_without_extra_blank_li... function test_normalize_windows_native_build_path_variants (line 330) | def test_normalize_windows_native_build_path_variants(path, expected): function test_temporary_environ_restores_previous_values (line 334) | def test_temporary_environ_restores_previous_values(monkeypatch): function test_build_packaged_windows_runtime_build_env_uses_base_env_snapshot (line 351) | def test_build_packaged_windows_runtime_build_env_uses_base_env_snapshot( function test_build_packaged_windows_runtime_build_env_matches_snapshot_keys_case_insensitively (line 387) | def test_build_packaged_windows_runtime_build_env_matches_snapshot_keys_... function test_run_pip_in_process_injects_windows_runtime_build_env (line 428) | async def test_run_pip_in_process_injects_windows_runtime_build_env( function test_run_pip_in_process_injects_windows_runtime_build_env_without_existing_paths (line 471) | async def test_run_pip_in_process_injects_windows_runtime_build_env_with... function test_run_pip_in_process_does_not_inject_when_runtime_dirs_missing (line 503) | async def test_run_pip_in_process_does_not_inject_when_runtime_dirs_miss... function test_run_pip_in_process_uses_latest_env_when_building_runtime_paths (line 527) | async def test_run_pip_in_process_uses_latest_env_when_building_runtime_... function test_run_pip_in_process_does_not_modify_env_on_non_windows (line 564) | async def test_run_pip_in_process_does_not_modify_env_on_non_windows( function test_run_pip_in_process_does_not_inject_env_when_not_packaged (line 586) | async def test_run_pip_in_process_does_not_inject_env_when_not_packaged( function test_run_pip_in_process_classifies_nonstandard_conflict_output (line 608) | async def test_run_pip_in_process_classifies_nonstandard_conflict_output... function test_install_raises_dedicated_pip_install_error_on_non_conflict_failure (line 637) | async def test_install_raises_dedicated_pip_install_error_on_non_conflic... function test_run_pip_with_classification_raises_install_error_on_non_conflict_failure (line 653) | async def test_run_pip_with_classification_raises_install_error_on_non_c... function test_run_pip_in_process_bounds_retained_conflict_lines (line 669) | async def test_run_pip_in_process_bounds_retained_conflict_lines(monkeyp... function test_build_pip_args_rejects_package_name_and_requirements_path_together (line 701) | def test_build_pip_args_rejects_package_name_and_requirements_path_toget... function _make_fake_distribution (line 711) | def _make_fake_distribution(name: str, version: str): function test_find_missing_requirements_honors_version_specifiers (line 721) | def test_find_missing_requirements_honors_version_specifiers(monkeypatch... function test_find_missing_requirements_skips_unmatched_markers (line 736) | def test_find_missing_requirements_skips_unmatched_markers(monkeypatch, ... function test_find_missing_requirements_follows_nested_requirement_files (line 754) | def test_find_missing_requirements_follows_nested_requirement_files( function test_find_missing_requirements_follows_equals_form_nested_requirements (line 773) | def test_find_missing_requirements_follows_equals_form_nested_requirements( function test_find_missing_requirements_returns_none_when_nested_file_missing (line 792) | def test_find_missing_requirements_returns_none_when_nested_file_missing... function test_find_missing_requirements_extracts_editable_vcs_requirement (line 801) | def test_find_missing_requirements_extracts_editable_vcs_requirement( function test_find_missing_requirements_prefers_first_search_path_version (line 821) | def test_find_missing_requirements_prefers_first_search_path_version( function test_find_missing_requirements_returns_none_when_distribution_scan_fails (line 841) | def test_find_missing_requirements_returns_none_when_distribution_scan_f... function test_get_core_constraints_caches_fallback_resolution (line 863) | def test_get_core_constraints_caches_fallback_resolution(monkeypatch): function test_get_core_constraints_skips_distributions_with_unreadable_top_level (line 920) | def test_get_core_constraints_skips_distributions_with_unreadable_top_le... function test_core_constraints_file_propagates_inner_conflict_without_fake_warning (line 980) | def test_core_constraints_file_propagates_inner_conflict_without_fake_wa... function test_iter_requirement_lines_expands_nested_requirement_files (line 1012) | def test_iter_requirement_lines_expands_nested_requirement_files(tmp_path): function test_build_pip_args_extracts_requested_requirements (line 1029) | def test_build_pip_args_extracts_requested_requirements(): function test_build_pip_args_appends_default_index_when_not_overridden (line 1047) | def test_build_pip_args_appends_default_index_when_not_overridden(): function test_install_splits_space_separated_packages (line 1057) | async def test_install_splits_space_separated_packages(monkeypatch): function test_install_splits_three_space_separated_packages (line 1072) | async def test_install_splits_three_space_separated_packages(monkeypatch): function test_install_splits_three_bare_packages (line 1094) | async def test_install_splits_three_bare_packages(monkeypatch): function test_install_tracks_multiline_packages_for_desktop_client (line 1114) | async def test_install_tracks_multiline_packages_for_desktop_client( function test_install_splits_space_separated_packages_within_multiline_input (line 1151) | async def test_install_splits_space_separated_packages_within_multiline_... function test_install_keeps_single_requirement_with_marker_intact (line 1175) | async def test_install_keeps_single_requirement_with_marker_intact(monke... function test_install_keeps_single_requirement_with_compact_marker_intact (line 1193) | async def test_install_keeps_single_requirement_with_compact_marker_inta... function test_install_keeps_single_requirement_with_version_range_intact (line 1211) | async def test_install_keeps_single_requirement_with_version_range_intac... function test_install_tracks_only_real_requirement_names_for_spaced_single_requirement (line 1229) | async def test_install_tracks_only_real_requirement_names_for_spaced_sin... function test_prefer_installed_dependencies_prefers_modules_for_requirements_in_desktop_runtime (line 1259) | def test_prefer_installed_dependencies_prefers_modules_for_requirements_... function test_install_multiline_input_strips_comments_and_splits_options (line 1294) | async def test_install_multiline_input_strips_comments_and_splits_option... function test_install_single_line_input_strips_inline_comment (line 1321) | async def test_install_single_line_input_strips_inline_comment(monkeypat... function test_install_splits_single_line_editable_option_input (line 1336) | async def test_install_splits_single_line_editable_option_input(monkeypa... function test_install_splits_single_line_option_with_url (line 1351) | async def test_install_splits_single_line_option_with_url(monkeypatch): function test_install_tracks_requirement_name_for_single_line_option_input (line 1375) | async def test_install_tracks_requirement_name_for_single_line_option_in... function test_install_keeps_equals_form_index_override (line 1408) | async def test_install_keeps_equals_form_index_override(monkeypatch): function test_install_keeps_short_form_index_override (line 1430) | async def test_install_keeps_short_form_index_override(monkeypatch): function test_install_preserves_url_fragment_in_option_input (line 1450) | async def test_install_preserves_url_fragment_in_option_input(monkeypatch): function test_find_missing_requirements_returns_none_for_editable_local_path_reference (line 1472) | def test_find_missing_requirements_returns_none_for_editable_local_path_... function test_find_missing_requirements_returns_none_for_editable_local_path_variants (line 1490) | def test_find_missing_requirements_returns_none_for_editable_local_path_... function test_install_strips_inline_comment_from_option_line (line 1502) | async def test_install_strips_inline_comment_from_option_line(monkeypatch): function test_install_falls_back_to_raw_input_for_invalid_token_string (line 1526) | async def test_install_falls_back_to_raw_input_for_invalid_token_string(... function test_install_ignores_whitespace_only_package_string (line 1542) | async def test_install_ignores_whitespace_only_package_string(monkeypatch): function test_install_ignores_missing_package_and_requirements (line 1554) | async def test_install_ignores_missing_package_and_requirements(monkeypa... function test_install_respects_index_override_in_pip_install_arg (line 1566) | async def test_install_respects_index_override_in_pip_install_arg(monkey... function test_install_respects_no_index_with_find_links (line 1587) | async def test_install_respects_no_index_with_find_links(monkeypatch): function test_redact_pip_args_for_logging_redacts_inline_url_credentials (line 1610) | def test_redact_pip_args_for_logging_redacts_inline_url_credentials(): function test_redact_pip_args_for_logging_redacts_sensitive_option_value_pairs (line 1626) | def test_redact_pip_args_for_logging_redacts_sensitive_option_value_pair... function test_redact_pip_args_for_logging_redacts_inline_sensitive_values (line 1648) | def test_redact_pip_args_for_logging_redacts_inline_sensitive_values(): function test_install_logs_redacted_pip_argv_when_credentials_present (line 1667) | async def test_install_logs_redacted_pip_argv_when_credentials_present(m... function test_install_does_not_add_aliyun_trusted_host_for_default_index (line 1691) | async def test_install_does_not_add_aliyun_trusted_host_for_default_inde... function test_install_adds_aliyun_trusted_host_only_for_aliyun_index (line 1708) | async def test_install_adds_aliyun_trusted_host_only_for_aliyun_index(mo... FILE: tests/test_plugin_manager.py class MockStar (line 19) | class MockStar: method __init__ (line 20) | def __init__(self): function _write_local_test_plugin (line 28) | def _write_local_test_plugin(plugin_path: Path, repo_url: str): function _write_requirements (line 47) | def _write_requirements(plugin_path: Path): function _clear_module_cache (line 53) | def _clear_module_cache(): function _build_load_mock (line 62) | def _build_load_mock(events): function _build_reload_mock (line 71) | def _build_reload_mock(events): function _build_dependency_install_mock (line 79) | def _build_dependency_install_mock( function _mock_missing_requirements (line 106) | def _mock_missing_requirements(monkeypatch, missing: set[str]): function _mock_missing_requirements_plan (line 110) | def _mock_missing_requirements_plan( function _mock_precheck_fails (line 127) | def _mock_precheck_fails(monkeypatch): function _assert_dependency_install_event_matches (line 134) | def _assert_dependency_install_event_matches( function plugin_manager_pm (line 161) | def plugin_manager_pm(tmp_path, monkeypatch): function local_updator (line 197) | def local_updator(plugin_manager_pm): function test_install_plugin_dependency_install_flow (line 209) | async def test_install_plugin_dependency_install_flow( function test_install_plugin_from_file_dependency_install_flow (line 256) | async def test_install_plugin_from_file_dependency_install_flow( function test_reload_failed_plugin_dependency_install_flow (line 297) | async def test_reload_failed_plugin_dependency_install_flow( function test_ensure_plugin_requirements_reraises_cancelled_error (line 340) | async def test_ensure_plugin_requirements_reraises_cancelled_error( function test_ensure_plugin_requirements_wraps_generic_dependency_install_failure (line 362) | async def test_ensure_plugin_requirements_wraps_generic_dependency_insta... function test_ensure_plugin_requirements_wraps_pip_install_error (line 388) | async def test_ensure_plugin_requirements_wraps_pip_install_error( function test_ensure_plugin_requirements_logs_requirements_file_install_for_missing_dependencies (line 414) | async def test_ensure_plugin_requirements_logs_requirements_file_install... function test_update_plugin_dependency_install_flow (line 443) | async def test_update_plugin_dependency_install_flow( function test_install_plugin_skips_dependency_install_when_no_requirements_missing (line 488) | async def test_install_plugin_skips_dependency_install_when_no_requireme... function test_install_plugin_runs_dependency_install_when_precheck_fails (line 519) | async def test_install_plugin_runs_dependency_install_when_precheck_fails( function test_ensure_plugin_requirements_installs_only_missing_requirement_lines (line 554) | async def test_ensure_plugin_requirements_installs_only_missing_requirem... function test_ensure_plugin_requirements_creates_temp_dir_before_filtered_install (line 586) | async def test_ensure_plugin_requirements_creates_temp_dir_before_filter... function test_ensure_plugin_requirements_falls_back_when_missing_names_have_no_install_lines (line 614) | async def test_ensure_plugin_requirements_falls_back_when_missing_names_... function test_ensure_plugin_requirements_does_not_mask_install_error_when_cleanup_fails (line 643) | async def test_ensure_plugin_requirements_does_not_mask_install_error_wh... FILE: tests/test_profile_aware_tools.py class TestShipyardNeoBooterCapabilities (line 16) | class TestShipyardNeoBooterCapabilities: method _make_booter (line 19) | def _make_booter(self, sandbox_caps: list[str] | None = None): method test_none_before_boot (line 30) | def test_none_before_boot(self): method test_returns_tuple_after_boot (line 34) | def test_returns_tuple_after_boot(self): method test_includes_browser_when_present (line 39) | def test_includes_browser_when_present(self): method test_no_browser_when_absent (line 43) | def test_no_browser_when_absent(self): method test_returns_immutable (line 47) | def test_returns_immutable(self): function _make_config (line 61) | def _make_config(booter_type: str = "shipyard_neo"): function _make_req (line 67) | def _make_req(): function _import_apply_sandbox_tools (line 71) | def _import_apply_sandbox_tools(): class TestApplySandboxToolsConditional (line 81) | class TestApplySandboxToolsConditional: method _tool_names (line 84) | def _tool_names(self, req) -> set[str]: method test_no_session_registers_all (line 90) | def test_no_session_registers_all(self): method test_with_browser_capability (line 106) | def test_with_browser_capability(self): method test_without_browser_capability (line 124) | def test_without_browser_capability(self): method test_skill_tools_always_registered (line 146) | def test_skill_tools_always_registered(self): class TestResolveProfile (line 169) | class TestResolveProfile: method _make_booter (line 172) | def _make_booter(self, profile: str = "python-default"): method test_user_specified_profile_honoured (line 182) | async def test_user_specified_profile_honoured(self): method test_selects_browser_profile (line 190) | async def test_selects_browser_profile(self): method test_falls_back_to_default_on_api_error (line 213) | async def test_falls_back_to_default_on_api_error(self): method test_falls_back_on_empty_profiles (line 225) | async def test_falls_back_on_empty_profiles(self): method test_single_profile_selected (line 237) | async def test_single_profile_selected(self): method test_auth_error_not_silenced (line 256) | async def test_auth_error_not_silenced(self): class TestBaseComputerBooter (line 274) | class TestBaseComputerBooter: method test_capabilities_default_none (line 277) | def test_capabilities_default_none(self): method test_browser_default_none (line 283) | def test_browser_default_none(self): FILE: tests/test_quoted_message_parser.py class _DummyAPI (line 12) | class _DummyAPI: method __init__ (line 13) | def __init__( method call_action (line 22) | async def call_action(self, action: str, **params): class _FailIfCalledAPI (line 36) | class _FailIfCalledAPI: method call_action (line 37) | async def call_action(self, action: str, **params): function _make_event (line 43) | def _make_event( function test_extract_quoted_message_text_from_reply_chain (line 60) | async def test_extract_quoted_message_text_from_reply_chain(): function test_extract_quoted_message_text_no_reply_component (line 68) | async def test_extract_quoted_message_text_no_reply_component(): function test_extract_quoted_message_images_no_reply_component (line 80) | async def test_extract_quoted_message_images_no_reply_component(): function test_extract_quoted_message_text_reply_without_id_does_not_call_get_msg (line 93) | async def test_extract_quoted_message_text_reply_without_id_does_not_cal... function test_extract_quoted_message_text_fallback_get_msg_and_forward (line 111) | async def test_extract_quoted_message_text_fallback_get_msg_and_forward(): function test_extract_quoted_message_text_forward_placeholder_variants_trigger_fallback (line 171) | async def test_extract_quoted_message_text_forward_placeholder_variants_... function test_extract_quoted_message_text_mixed_placeholder_does_not_trigger_fallback (line 195) | async def test_extract_quoted_message_text_mixed_placeholder_does_not_tr... function test_extract_quoted_message_text_forward_placeholder_fallback_failure (line 214) | async def test_extract_quoted_message_text_forward_placeholder_fallback_... function test_extract_quoted_message_text_multimsg_malformed_config_does_not_raise (line 223) | async def test_extract_quoted_message_text_multimsg_malformed_config_doe... function test_extract_quoted_message_images_from_reply_chain (line 252) | async def test_extract_quoted_message_images_from_reply_chain(): function test_extract_quoted_message_images_fallback_get_msg_direct_url (line 268) | async def test_extract_quoted_message_images_fallback_get_msg_direct_url(): function test_extract_quoted_message_images_data_image_ref_normalized_to_base64 (line 291) | async def test_extract_quoted_message_images_data_image_ref_normalized_t... function test_extract_quoted_message_images_file_url_with_query_string (line 312) | async def test_extract_quoted_message_images_file_url_with_query_string(): function test_extract_quoted_message_images_non_image_local_path_is_ignored (line 339) | async def test_extract_quoted_message_images_non_image_local_path_is_ign... function test_extract_quoted_message_images_chain_placeholder_triggers_fallback (line 358) | async def test_extract_quoted_message_images_chain_placeholder_triggers_... function test_extract_quoted_message_images_fallback_resolve_file_id_with_get_image (line 383) | async def test_extract_quoted_message_images_fallback_resolve_file_id_wi... function test_extract_quoted_message_images_deduplicates_across_sources (line 404) | async def test_extract_quoted_message_images_deduplicates_across_sources(): function test_extract_quoted_message_nested_forward_id_is_resolved (line 454) | async def test_extract_quoted_message_nested_forward_id_is_resolved(): FILE: tests/test_runtime_env.py function test_desktop_client_env_marks_desktop_runtime_without_frozen (line 5) | def test_desktop_client_env_marks_desktop_runtime_without_frozen(monkeyp... function test_desktop_client_uses_home_root_without_explicit_astrbot_root (line 12) | def test_desktop_client_uses_home_root_without_explicit_astrbot_root(mon... function test_explicit_astrbot_root_overrides_desktop_default (line 20) | def test_explicit_astrbot_root_overrides_desktop_default(monkeypatch, tm... FILE: tests/test_security_fixes.py function test_wecom_crypto_uses_secrets (line 13) | def test_wecom_crypto_uses_secrets(): function test_wecomai_utils_uses_secrets (line 36) | def test_wecomai_utils_uses_secrets(): function test_azure_tts_signature_uses_secrets (line 56) | def test_azure_tts_signature_uses_secrets(): function test_ssl_context_fallback_explicit (line 97) | def test_ssl_context_fallback_explicit(): function test_io_module_has_ssl_imports (line 116) | def test_io_module_has_ssl_imports(): function test_secrets_module_randomness_quality (line 127) | def test_secrets_module_randomness_quality(): FILE: tests/test_skill_manager_sandbox_cache.py function _write_skill (line 10) | def _write_skill(root: Path, name: str, description: str) -> None: function test_list_skills_merges_local_and_sandbox_cache (line 19) | def test_list_skills_merges_local_and_sandbox_cache(monkeypatch, tmp_pat... function test_sandbox_cached_skill_respects_active_and_display_path (line 64) | def test_sandbox_cached_skill_respects_active_and_display_path( function test_sandbox_and_local_path_resolution_with_show_sandbox_path_false (line 111) | def test_sandbox_and_local_path_resolution_with_show_sandbox_path_false( FILE: tests/test_skill_metadata_enrichment.py function test_parse_frontmatter_description (line 17) | def test_parse_frontmatter_description(): function test_parse_frontmatter_description_only (line 32) | def test_parse_frontmatter_description_only(): function test_parse_frontmatter_empty (line 37) | def test_parse_frontmatter_empty(): function test_parse_frontmatter_missing_end_delimiter (line 42) | def test_parse_frontmatter_missing_end_delimiter(): function test_parse_frontmatter_quoted_description (line 47) | def test_parse_frontmatter_quoted_description(): function test_parse_frontmatter_multiline_literal_description (line 52) | def test_parse_frontmatter_multiline_literal_description(): function test_parse_frontmatter_multiline_folded_description (line 66) | def test_parse_frontmatter_multiline_folded_description(): function test_parse_frontmatter_invalid_yaml_returns_empty (line 80) | def test_parse_frontmatter_invalid_yaml_returns_empty(): function test_build_skills_prompt_basic_format (line 88) | def test_build_skills_prompt_basic_format(): function test_build_skills_prompt_absolute_path_in_example (line 103) | def test_build_skills_prompt_absolute_path_in_example(): function test_build_skills_prompt_keeps_placeholder_example_literal (line 117) | def test_build_skills_prompt_keeps_placeholder_example_literal(): function test_build_skills_prompt_preserves_windows_absolute_path_in_example (line 131) | def test_build_skills_prompt_preserves_windows_absolute_path_in_example(... function test_build_skills_prompt_uses_windows_friendly_command_for_windows_paths (line 145) | def test_build_skills_prompt_uses_windows_friendly_command_for_windows_p... function test_build_skills_prompt_quotes_windows_paths_with_spaces (line 162) | def test_build_skills_prompt_quotes_windows_paths_with_spaces(monkeypatch): function test_build_skills_prompt_normalizes_windows_backslashes_in_example (line 176) | def test_build_skills_prompt_normalizes_windows_backslashes_in_example(m... function test_build_skills_prompt_uses_windows_command_for_unc_paths (line 190) | def test_build_skills_prompt_uses_windows_command_for_unc_paths(monkeypa... function test_build_skills_prompt_keeps_posix_double_slash_paths_on_non_windows (line 204) | def test_build_skills_prompt_keeps_posix_double_slash_paths_on_non_windo... function test_build_skills_prompt_normalizes_windows_backslashes_on_non_windows_host (line 219) | def test_build_skills_prompt_normalizes_windows_backslashes_on_non_windo... function test_build_skills_prompt_preserves_drive_colon_while_sanitizing_unsafe_chars (line 236) | def test_build_skills_prompt_preserves_drive_colon_while_sanitizing_unsa... function test_build_skills_prompt_strips_non_drive_colons_from_example_path (line 255) | def test_build_skills_prompt_strips_non_drive_colons_from_example_path(): function test_build_skills_prompt_preserves_unicode_local_path_in_example (line 269) | def test_build_skills_prompt_preserves_unicode_local_path_in_example(): function test_build_skills_prompt_sanitizes_sandbox_skill_metadata_in_inventory (line 283) | def test_build_skills_prompt_sanitizes_sandbox_skill_metadata_in_invento... function test_build_skills_prompt_sanitizes_invalid_sandbox_skill_name_in_path (line 305) | def test_build_skills_prompt_sanitizes_invalid_sandbox_skill_name_in_pat... function test_build_skills_prompt_preserves_safe_unicode_sandbox_description (line 324) | def test_build_skills_prompt_preserves_safe_unicode_sandbox_description(): function test_build_skills_prompt_preserves_safe_arabic_sandbox_description (line 343) | def test_build_skills_prompt_preserves_safe_arabic_sandbox_description(): function test_build_skills_prompt_progressive_disclosure_rules (line 362) | def test_build_skills_prompt_progressive_disclosure_rules(): function test_build_skills_prompt_no_custom_fields (line 384) | def test_build_skills_prompt_no_custom_fields(): function test_list_skills_parses_description_from_local (line 403) | def test_list_skills_parses_description_from_local(monkeypatch, tmp_path... function test_list_skills_description_from_sandbox_cache (line 444) | def test_list_skills_description_from_sandbox_cache(monkeypatch, tmp_pat... FILE: tests/test_smoke.py function _run_code_in_fresh_interpreter (line 22) | def _run_code_in_fresh_interpreter(code: str, failure_message: str) -> N... function test_smoke_critical_imports_in_fresh_interpreter (line 35) | def test_smoke_critical_imports_in_fresh_interpreter() -> None: function test_smoke_pipeline_stage_registration_matches_order (line 50) | def test_smoke_pipeline_stage_registration_matches_order() -> None: function test_smoke_agent_sub_stages_are_stage_subclasses (line 58) | def test_smoke_agent_sub_stages_are_stage_subclasses() -> None: function test_pipeline_package_exports_remain_compatible (line 63) | def test_pipeline_package_exports_remain_compatible() -> None: function test_builtin_stage_bootstrap_is_idempotent (line 72) | def test_builtin_stage_bootstrap_is_idempotent() -> None: function test_pipeline_import_is_stable_with_mocked_apscheduler (line 95) | def test_pipeline_import_is_stable_with_mocked_apscheduler() -> None: FILE: tests/test_temp_dir_cleaner.py function test_parse_size_to_bytes (line 8) | def test_parse_size_to_bytes(): function _write_file (line 16) | def _write_file(path: Path, size: int, mtime: float) -> None: function test_cleanup_once_releases_30_percent_and_prefers_old_files (line 21) | def test_cleanup_once_releases_30_percent_and_prefers_old_files(tmp_path): function test_cleanup_once_noop_when_below_limit (line 43) | def test_cleanup_once_noop_when_below_limit(tmp_path): FILE: tests/test_tool_loop_agent_runner.py class MockProvider (line 18) | class MockProvider(Provider): method __init__ (line 21) | def __init__(self): method get_current_key (line 27) | def get_current_key(self) -> str: method set_key (line 30) | def set_key(self, key: str): method get_models (line 33) | async def get_models(self) -> list[str]: method text_chat (line 36) | async def text_chat(self, **kwargs) -> LLMResponse: method text_chat_stream (line 68) | async def text_chat_stream(self, **kwargs): class MockToolExecutor (line 76) | class MockToolExecutor: method execute (line 80) | def execute(cls, tool, run_context, **tool_args): class MockFailingProvider (line 93) | class MockFailingProvider(MockProvider): method text_chat (line 94) | async def text_chat(self, **kwargs) -> LLMResponse: class MockErrProvider (line 99) | class MockErrProvider(MockProvider): method text_chat (line 100) | async def text_chat(self, **kwargs) -> LLMResponse: class MockAbortableStreamProvider (line 108) | class MockAbortableStreamProvider(MockProvider): method text_chat_stream (line 109) | async def text_chat_stream(self, **kwargs): class MockHooks (line 130) | class MockHooks(BaseAgentRunHooks): method __init__ (line 133) | def __init__(self): method on_agent_begin (line 139) | async def on_agent_begin(self, run_context): method on_tool_start (line 142) | async def on_tool_start(self, run_context, tool, tool_args): method on_tool_end (line 145) | async def on_tool_end(self, run_context, tool, tool_args, tool_result): method on_agent_done (line 148) | async def on_agent_done(self, run_context, llm_response): class MockEvent (line 152) | class MockEvent: method __init__ (line 153) | def __init__(self, umo: str, sender_id: str): method get_sender_id (line 157) | def get_sender_id(self): class MockAgentContext (line 161) | class MockAgentContext: method __init__ (line 162) | def __init__(self, event): function mock_provider (line 167) | def mock_provider(): function mock_tool_executor (line 172) | def mock_tool_executor(): function mock_hooks (line 177) | def mock_hooks(): function tool_set (line 182) | def tool_set(): function provider_request (line 194) | def provider_request(tool_set): function runner (line 200) | def runner(): function test_max_step_limit_functionality (line 206) | async def test_max_step_limit_functionality( function test_normal_completion_without_max_step (line 251) | async def test_normal_completion_without_max_step( function test_max_step_with_streaming (line 299) | async def test_max_step_with_streaming( function test_hooks_called_with_max_step (line 342) | async def test_hooks_called_with_max_step( function test_fallback_provider_used_when_primary_raises (line 376) | async def test_fallback_provider_used_when_primary_raises( function test_fallback_provider_used_when_primary_returns_err (line 405) | async def test_fallback_provider_used_when_primary_returns_err( function test_stop_signal_returns_aborted_and_persists_partial_message (line 434) | async def test_stop_signal_returns_aborted_and_persists_partial_message( function test_tool_result_injects_follow_up_notice (line 470) | async def test_tool_result_injects_follow_up_notice( function test_follow_up_ticket_not_consumed_when_no_next_tool_call (line 513) | async def test_follow_up_ticket_not_consumed_when_no_next_tool_call( FILE: tests/unit/test_aiocqhttp_poke.py function test_poke_to_dict_matches_onebot_v11_segment_format (line 13) | def test_poke_to_dict_matches_onebot_v11_segment_format(): function test_poke_to_dict_keeps_legacy_qq_compatible (line 21) | def test_poke_to_dict_keeps_legacy_qq_compatible(): function test_respond_stage_treats_poke_with_target_as_non_empty (line 30) | async def test_respond_stage_treats_poke_with_target_as_non_empty(): function test_aiocqhttp_parse_json_outputs_standard_poke_data (line 37) | async def test_aiocqhttp_parse_json_outputs_standard_poke_data(): function test_aiocqhttp_send_message_dispatches_onebot_v11_poke_payload (line 44) | async def test_aiocqhttp_send_message_dispatches_onebot_v11_poke_payload(): FILE: tests/unit/test_astr_agent_tool_exec.py class _DummyEvent (line 11) | class _DummyEvent: method __init__ (line 12) | def __init__(self, message_components: list[object] | None = None) -> ... method get_extra (line 16) | def get_extra(self, _key: str): class _DummyTool (line 20) | class _DummyTool: method __init__ (line 21) | def __init__(self) -> None: function _build_run_context (line 26) | def _build_run_context(message_components: list[object] | None = None): function test_collect_handoff_image_urls_normalizes_filters_and_appends_event_image (line 33) | async def test_collect_handoff_image_urls_normalizes_filters_and_appends... function test_collect_handoff_image_urls_skips_failed_event_image_conversion (line 62) | async def test_collect_handoff_image_urls_skips_failed_event_image_conve... function test_collect_handoff_image_urls_filters_supported_schemes_and_extensions (line 105) | async def test_collect_handoff_image_urls_filters_supported_schemes_and_... function test_collect_handoff_image_urls_collects_event_image_when_args_is_none (line 117) | async def test_collect_handoff_image_urls_collects_event_image_when_args... function test_do_handoff_background_reports_prepared_image_urls (line 135) | async def test_do_handoff_background_reports_prepared_image_urls( function test_execute_handoff_skips_renormalize_when_image_urls_prepared (line 175) | async def test_execute_handoff_skips_renormalize_when_image_urls_prepared( function test_collect_handoff_image_urls_keeps_extensionless_existing_event_file (line 228) | async def test_collect_handoff_image_urls_keeps_extensionless_existing_e... function test_collect_handoff_image_urls_filters_extensionless_missing_event_file (line 252) | async def test_collect_handoff_image_urls_filters_extensionless_missing_... function test_collect_handoff_image_urls_filters_extensionless_file_outside_temp_root (line 276) | async def test_collect_handoff_image_urls_filters_extensionless_file_out... FILE: tests/unit/test_astr_main_agent.py function mock_provider (line 20) | def mock_provider(): function mock_context (line 32) | def mock_context(): function mock_event (line 49) | def mock_event(): function mock_conversation (line 79) | def mock_conversation(): function sample_config (line 89) | def sample_config(): function _new_mock_conversation (line 101) | def _new_mock_conversation(cid: str = "conv-id") -> MagicMock: function _setup_conversation_for_build (line 109) | def _setup_conversation_for_build(conv_mgr, cid: str = "conv-id") -> Mag... class TestMainAgentBuildConfig (line 117) | class TestMainAgentBuildConfig: method test_config_initialization (line 120) | def test_config_initialization(self): method test_config_with_custom_values (line 133) | def test_config_with_custom_values(self): class TestSelectProvider (line 156) | class TestSelectProvider: method test_select_provider_by_id (line 159) | def test_select_provider_by_id(self, mock_event, mock_context, mock_pr... method test_select_provider_not_found (line 172) | def test_select_provider_not_found(self, mock_event, mock_context): method test_select_provider_invalid_type (line 184) | def test_select_provider_invalid_type(self, mock_event, mock_context): method test_select_provider_fallback (line 196) | def test_select_provider_fallback(self, mock_event, mock_context, mock... method test_select_provider_fallback_error (line 209) | def test_select_provider_fallback_error(self, mock_event, mock_context): class TestGetSessionConv (line 220) | class TestGetSessionConv: method test_get_session_conv_existing (line 224) | async def test_get_session_conv_existing( method test_get_session_conv_create_new (line 244) | async def test_get_session_conv_create_new(self, mock_event, mock_cont... method test_get_session_conv_retry (line 264) | async def test_get_session_conv_retry(self, mock_event, mock_context): method test_get_session_conv_failure (line 284) | async def test_get_session_conv_failure(self, mock_event, mock_context): class TestApplyKb (line 296) | class TestApplyKb: method test_apply_kb_without_agentic_mode (line 300) | async def test_apply_kb_without_agentic_mode(self, mock_event, mock_co... method test_apply_kb_with_agentic_mode (line 318) | async def test_apply_kb_with_agentic_mode(self, mock_event, mock_conte... method test_apply_kb_no_prompt (line 329) | async def test_apply_kb_no_prompt(self, mock_event, mock_context): method test_apply_kb_no_result (line 342) | async def test_apply_kb_no_result(self, mock_event, mock_context): method test_apply_kb_with_existing_tools (line 359) | async def test_apply_kb_with_existing_tools(self, mock_event, mock_con... class TestApplyFileExtract (line 371) | class TestApplyFileExtract: method test_file_extract_basic (line 375) | async def test_file_extract_basic(self, mock_event, sample_config): method test_file_extract_no_files (line 396) | async def test_file_extract_no_files(self, mock_event, sample_config): method test_file_extract_in_reply (line 407) | async def test_file_extract_in_reply(self, mock_event, sample_config): method test_file_extract_no_prompt (line 429) | async def test_file_extract_no_prompt(self, mock_event, sample_config): method test_file_extract_no_api_key (line 449) | async def test_file_extract_no_api_key(self, mock_event): class TestEnsurePersonaAndSkills (line 469) | class TestEnsurePersonaAndSkills: method test_ensure_persona_from_session (line 473) | async def test_ensure_persona_from_session(self, mock_event, mock_cont... method test_ensure_persona_from_conversation (line 490) | async def test_ensure_persona_from_conversation(self, mock_event, mock... method test_ensure_persona_none_explicit (line 506) | async def test_ensure_persona_none_explicit(self, mock_event, mock_con... method test_ensure_tools_from_persona (line 521) | async def test_ensure_tools_from_persona(self, mock_event, mock_context): method test_subagent_dedupe_uses_default_persona_tools (line 543) | async def test_subagent_dedupe_uses_default_persona_tools( class TestDecorateLlmRequest (line 600) | class TestDecorateLlmRequest: method test_decorate_llm_request_basic (line 604) | async def test_decorate_llm_request_basic( method test_decorate_llm_request_with_prefix (line 617) | async def test_decorate_llm_request_with_prefix(self, mock_event, mock... method test_decorate_llm_request_prefix_with_placeholder (line 633) | async def test_decorate_llm_request_prefix_with_placeholder( method test_decorate_llm_request_no_conversation (line 652) | async def test_decorate_llm_request_no_conversation(self, mock_event, ... class TestModalitiesFix (line 667) | class TestModalitiesFix: method test_modalities_fix_image_not_supported (line 670) | def test_modalities_fix_image_not_supported(self, mock_provider): method test_modalities_fix_tool_not_supported (line 681) | def test_modalities_fix_tool_not_supported(self, mock_provider): method test_modalities_fix_all_supported (line 699) | def test_modalities_fix_all_supported(self, mock_provider): class TestSanitizeContextByModalities (line 724) | class TestSanitizeContextByModalities: method test_sanitize_no_op (line 727) | def test_sanitize_no_op(self, mock_provider): method test_sanitize_removes_tool_messages (line 740) | def test_sanitize_removes_tool_messages(self, mock_provider): method test_sanitize_removes_tool_calls (line 759) | def test_sanitize_removes_tool_calls(self, mock_provider): method test_sanitize_removes_image_blocks (line 780) | def test_sanitize_removes_image_blocks(self, mock_provider): class TestPluginToolFix (line 805) | class TestPluginToolFix: method test_plugin_tool_fix_none_plugins (line 808) | def test_plugin_tool_fix_none_plugins(self, mock_event): method test_plugin_tool_fix_filters_by_plugin (line 818) | def test_plugin_tool_fix_filters_by_plugin(self, mock_event): method test_plugin_tool_fix_mcp_preserved (line 847) | def test_plugin_tool_fix_mcp_preserved(self, mock_event): method test_plugin_tool_fix_preserves_tools_without_plugin_origin (line 865) | def test_plugin_tool_fix_preserves_tools_without_plugin_origin(self, m... class TestBuildMainAgent (line 888) | class TestBuildMainAgent: method test_build_main_agent_basic (line 892) | async def test_build_main_agent_basic( method test_build_main_agent_no_provider (line 922) | async def test_build_main_agent_no_provider(self, mock_event, mock_con... method test_build_main_agent_with_wake_prefix (line 937) | async def test_build_main_agent_with_wake_prefix( method test_build_main_agent_no_wake_prefix (line 969) | async def test_build_main_agent_no_wake_prefix( method test_build_main_agent_with_images (line 989) | async def test_build_main_agent_with_images( method test_build_main_agent_no_prompt_no_images (line 1022) | async def test_build_main_agent_no_prompt_no_images( method test_build_main_agent_apply_reset_false (line 1046) | async def test_build_main_agent_apply_reset_false( method test_build_main_agent_with_existing_request (line 1079) | async def test_build_main_agent_with_existing_request( class TestHandleWebchat (line 1109) | class TestHandleWebchat: method test_handle_webchat_generates_title (line 1113) | async def test_handle_webchat_generates_title(self, mock_event): method test_handle_webchat_no_user_prompt (line 1142) | async def test_handle_webchat_no_user_prompt(self, mock_event): method test_handle_webchat_empty_user_prompt (line 1160) | async def test_handle_webchat_empty_user_prompt(self, mock_event): method test_handle_webchat_session_already_has_display_name (line 1178) | async def test_handle_webchat_session_already_has_display_name(self, m... method test_handle_webchat_no_session_found (line 1197) | async def test_handle_webchat_no_session_found(self, mock_event): method test_handle_webchat_llm_returns_none_title (line 1213) | async def test_handle_webchat_llm_returns_none_title(self, mock_event): method test_handle_webchat_llm_returns_empty_title (line 1236) | async def test_handle_webchat_llm_returns_empty_title(self, mock_event): method test_handle_webchat_llm_returns_none_response (line 1259) | async def test_handle_webchat_llm_returns_none_response(self, mock_eve... method test_handle_webchat_llm_returns_no_completion_text (line 1280) | async def test_handle_webchat_llm_returns_no_completion_text(self, moc... method test_handle_webchat_strips_title_whitespace (line 1303) | async def test_handle_webchat_strips_title_whitespace(self, mock_event): method test_handle_webchat_provider_exception_is_handled (line 1329) | async def test_handle_webchat_provider_exception_is_handled(self, mock... class TestApplyLlmSafetyMode (line 1354) | class TestApplyLlmSafetyMode: method test_apply_llm_safety_mode_system_prompt_strategy (line 1357) | def test_apply_llm_safety_mode_system_prompt_strategy(self): method test_apply_llm_safety_mode_prepends_safety_prompt (line 1372) | def test_apply_llm_safety_mode_prepends_safety_prompt(self): method test_apply_llm_safety_mode_with_none_system_prompt (line 1386) | def test_apply_llm_safety_mode_with_none_system_prompt(self): method test_apply_llm_safety_mode_unsupported_strategy (line 1399) | def test_apply_llm_safety_mode_unsupported_strategy(self): method test_apply_llm_safety_mode_empty_system_prompt (line 1418) | def test_apply_llm_safety_mode_empty_system_prompt(self): class TestApplySandboxTools (line 1432) | class TestApplySandboxTools: method test_apply_sandbox_tools_creates_toolset_if_none (line 1435) | def test_apply_sandbox_tools_creates_toolset_if_none(self): method test_apply_sandbox_tools_adds_required_tools (line 1450) | def test_apply_sandbox_tools_adds_required_tools(self): method test_apply_sandbox_tools_adds_sandbox_prompt (line 1468) | def test_apply_sandbox_tools_adds_sandbox_prompt(self): method test_apply_sandbox_tools_with_shipyard_booter (line 1482) | def test_apply_sandbox_tools_with_shipyard_booter(self, monkeypatch): method test_apply_sandbox_tools_shipyard_missing_endpoint (line 1504) | def test_apply_sandbox_tools_shipyard_missing_endpoint(self): method test_apply_sandbox_tools_shipyard_missing_access_token (line 1527) | def test_apply_sandbox_tools_shipyard_missing_access_token(self): method test_apply_sandbox_tools_preserves_existing_toolset (line 1546) | def test_apply_sandbox_tools_preserves_existing_toolset(self): method test_apply_sandbox_tools_appends_to_existing_system_prompt (line 1565) | def test_apply_sandbox_tools_appends_to_existing_system_prompt(self): method test_apply_sandbox_tools_with_none_system_prompt (line 1580) | def test_apply_sandbox_tools_with_none_system_prompt(self): FILE: tests/unit/test_astr_message_event.py class ConcreteAstrMessageEvent (line 24) | class ConcreteAstrMessageEvent(AstrMessageEvent): method send (line 27) | async def send(self, message): function platform_meta (line 33) | def platform_meta(): function message_member (line 43) | def message_member(): function astrbot_message (line 49) | def astrbot_message(message_member): function astr_message_event (line 64) | def astr_message_event(platform_meta, astrbot_message): class TestAstrMessageEventInit (line 74) | class TestAstrMessageEventInit: method test_init_basic (line 77) | def test_init_basic(self, astr_message_event): method test_init_session (line 87) | def test_init_session(self, astr_message_event): method test_init_platform_reference (line 92) | def test_init_platform_reference(self, astr_message_event, platform_me... method test_init_created_at (line 97) | def test_init_created_at(self, astr_message_event): method test_init_trace (line 102) | def test_init_trace(self, astr_message_event): class TestUnifiedMsgOrigin (line 109) | class TestUnifiedMsgOrigin: method test_unified_msg_origin_getter (line 112) | def test_unified_msg_origin_getter(self, astr_message_event): method test_unified_msg_origin_setter (line 117) | def test_unified_msg_origin_setter(self, astr_message_event): class TestSessionId (line 125) | class TestSessionId: method test_session_id_getter (line 128) | def test_session_id_getter(self, astr_message_event): method test_session_id_setter (line 132) | def test_session_id_setter(self, astr_message_event): class TestGetPlatformInfo (line 139) | class TestGetPlatformInfo: method test_get_platform_name (line 142) | def test_get_platform_name(self, astr_message_event): method test_get_platform_id (line 146) | def test_get_platform_id(self, astr_message_event): class TestGetMessageInfo (line 151) | class TestGetMessageInfo: method test_get_message_str (line 154) | def test_get_message_str(self, astr_message_event): method test_get_message_str_none (line 158) | def test_get_message_str_none(self, platform_meta, astrbot_message): method test_get_messages (line 169) | def test_get_messages(self, astr_message_event): method test_get_message_type (line 176) | def test_get_message_type(self, astr_message_event): method test_get_session_id (line 180) | def test_get_session_id(self, astr_message_event): method test_get_group_id_empty_for_private (line 184) | def test_get_group_id_empty_for_private(self, astr_message_event): method test_get_self_id (line 188) | def test_get_self_id(self, astr_message_event): method test_get_sender_id (line 192) | def test_get_sender_id(self, astr_message_event): method test_get_sender_name (line 196) | def test_get_sender_name(self, astr_message_event): method test_get_sender_name_empty_when_none (line 200) | def test_get_sender_name_empty_when_none(self, platform_meta, astrbot_... method test_get_sender_name_coerces_non_string (line 211) | def test_get_sender_name_coerces_non_string(self, platform_meta, astrb... class TestGetMessageOutline (line 224) | class TestGetMessageOutline: method test_outline_plain_text (line 227) | def test_outline_plain_text(self, astr_message_event): method test_outline_with_image (line 232) | def test_outline_with_image(self, platform_meta, astrbot_message): method test_outline_with_at (line 248) | def test_outline_with_at(self, platform_meta, astrbot_message): method test_outline_with_at_all (line 260) | def test_outline_with_at_all(self, platform_meta, astrbot_message): method test_outline_with_face (line 273) | def test_outline_with_face(self, platform_meta, astrbot_message): method test_outline_with_forward (line 285) | def test_outline_with_forward(self, platform_meta, astrbot_message): method test_outline_with_reply (line 298) | def test_outline_with_reply(self, platform_meta, astrbot_message): method test_outline_with_reply_no_message (line 314) | def test_outline_with_reply_no_message(self, platform_meta, astrbot_me... method test_outline_empty_chain (line 329) | def test_outline_empty_chain(self, platform_meta, astrbot_message): method test_outline_very_long_plain_text (line 341) | def test_outline_very_long_plain_text(self, platform_meta, astrbot_mes... class TestExtras (line 356) | class TestExtras: method test_set_extra (line 359) | def test_set_extra(self, astr_message_event): method test_get_extra_with_key (line 364) | def test_get_extra_with_key(self, astr_message_event): method test_get_extra_with_default (line 369) | def test_get_extra_with_default(self, astr_message_event): method test_get_extra_all (line 374) | def test_get_extra_all(self, astr_message_event): method test_clear_extra (line 381) | def test_clear_extra(self, astr_message_event): class TestSetResult (line 388) | class TestSetResult: method test_set_result_with_message_event_result (line 391) | def test_set_result_with_message_event_result(self, astr_message_event): method test_set_result_with_string (line 398) | def test_set_result_with_string(self, astr_message_event): method test_set_result_with_empty_chain (line 406) | def test_set_result_with_empty_chain(self, astr_message_event): class TestStopContinueEvent (line 415) | class TestStopContinueEvent: method test_stop_event_creates_result_if_none (line 418) | def test_stop_event_creates_result_if_none(self, astr_message_event): method test_stop_event_with_existing_result (line 425) | def test_stop_event_with_existing_result(self, astr_message_event): method test_continue_event_creates_result_if_none (line 432) | def test_continue_event_creates_result_if_none(self, astr_message_event): method test_continue_event_with_existing_result (line 439) | def test_continue_event_with_existing_result(self, astr_message_event): method test_is_stopped_default_false (line 447) | def test_is_stopped_default_false(self, astr_message_event): class TestIsPrivateChat (line 452) | class TestIsPrivateChat: method test_is_private_chat_true (line 455) | def test_is_private_chat_true(self, astr_message_event): method test_is_private_chat_false (line 459) | def test_is_private_chat_false(self, platform_meta, astrbot_message): class TestIsWakeUp (line 471) | class TestIsWakeUp: method test_is_wake_up_default_false (line 474) | def test_is_wake_up_default_false(self, astr_message_event): method test_is_wake_up_when_set (line 478) | def test_is_wake_up_when_set(self, astr_message_event): class TestIsAdmin (line 484) | class TestIsAdmin: method test_is_admin_default_false (line 487) | def test_is_admin_default_false(self, astr_message_event): method test_is_admin_when_admin (line 491) | def test_is_admin_when_admin(self, astr_message_event): class TestProcessBuffer (line 497) | class TestProcessBuffer: method test_process_buffer_splits_by_pattern (line 501) | async def test_process_buffer_splits_by_pattern(self, astr_message_eve... method test_process_buffer_no_match (line 516) | async def test_process_buffer_no_match(self, astr_message_event): class TestResultHelpers (line 526) | class TestResultHelpers: method test_make_result (line 529) | def test_make_result(self, astr_message_event): method test_plain_result (line 534) | def test_plain_result(self, astr_message_event): method test_image_result_url (line 543) | def test_image_result_url(self, astr_message_event): method test_image_result_path (line 551) | def test_image_result_path(self, astr_message_event): class TestGetResult (line 560) | class TestGetResult: method test_get_result_returns_none_by_default (line 563) | def test_get_result_returns_none_by_default(self, astr_message_event): method test_get_result_returns_set_result (line 567) | def test_get_result_returns_set_result(self, astr_message_event): method test_clear_result (line 574) | def test_clear_result(self, astr_message_event): class TestShouldCallLlm (line 582) | class TestShouldCallLlm: method test_should_call_llm_default (line 585) | def test_should_call_llm_default(self, astr_message_event): method test_should_call_llm_when_set (line 589) | def test_should_call_llm_when_set(self, astr_message_event): class TestRequestLlm (line 595) | class TestRequestLlm: method test_request_llm_basic (line 598) | def test_request_llm_basic(self, astr_message_event): method test_request_llm_with_all_params (line 607) | def test_request_llm_with_all_params(self, astr_message_event): class TestSendStreaming (line 624) | class TestSendStreaming: method test_send_streaming_sets_has_send_oper (line 628) | async def test_send_streaming_sets_has_send_oper(self, astr_message_ev... class TestSendTyping (line 644) | class TestSendTyping: method test_send_typing_default_empty (line 648) | async def test_send_typing_default_empty(self, astr_message_event): class TestReact (line 654) | class TestReact: method test_react_sends_emoji (line 658) | async def test_react_sends_emoji(self, astr_message_event): class TestGetGroup (line 673) | class TestGetGroup: method test_get_group_returns_none_for_private (line 677) | async def test_get_group_returns_none_for_private(self, astr_message_e... method test_get_group_with_group_id_param (line 683) | async def test_get_group_with_group_id_param(self, astr_message_event): class TestMessageTypeHandling (line 690) | class TestMessageTypeHandling: method test_message_type_from_valid_string (line 693) | def test_message_type_from_valid_string(self, platform_meta): method test_message_type_from_invalid_string_defaults_to_friend (line 707) | def test_message_type_from_invalid_string_defaults_to_friend(self, pla... method test_message_type_from_none_defaults_to_friend (line 721) | def test_message_type_from_none_defaults_to_friend(self, platform_meta): method test_message_type_from_integer_defaults_to_friend (line 735) | def test_message_type_from_integer_defaults_to_friend(self, platform_m... class TestDefensiveGetattr (line 750) | class TestDefensiveGetattr: method test_get_messages_without_message_attr (line 753) | def test_get_messages_without_message_attr(self, astr_message_event): method test_get_message_type_without_type_attr (line 759) | def test_get_message_type_without_type_attr(self, astr_message_event): method test_get_sender_fields_without_sender_attr (line 765) | def test_get_sender_fields_without_sender_attr(self, astr_message_event): method test_get_message_type_with_non_enum_type (line 773) | def test_get_message_type_with_non_enum_type(self, astr_message_event): FILE: tests/unit/test_astrbot_message.py class TestMessageMember (line 11) | class TestMessageMember: method test_message_member_creation_basic (line 14) | def test_message_member_creation_basic(self): method test_message_member_creation_with_nickname (line 21) | def test_message_member_creation_with_nickname(self): method test_message_member_str_with_nickname (line 28) | def test_message_member_str_with_nickname(self): method test_message_member_str_without_nickname (line 36) | def test_message_member_str_without_nickname(self): class TestGroup (line 45) | class TestGroup: method test_group_creation_basic (line 48) | def test_group_creation_basic(self): method test_group_creation_with_all_fields (line 59) | def test_group_creation_with_all_fields(self): method test_group_str_with_all_fields (line 78) | def test_group_str_with_all_fields(self): method test_group_str_with_minimal_fields (line 98) | def test_group_str_with_minimal_fields(self): class TestAstrBotMessage (line 112) | class TestAstrBotMessage: method test_astrbot_message_creation (line 115) | def test_astrbot_message_creation(self): method test_astrbot_message_timestamp (line 123) | def test_astrbot_message_timestamp(self): method test_astrbot_message_all_attributes (line 129) | def test_astrbot_message_all_attributes(self): method test_astrbot_message_str (line 150) | def test_astrbot_message_str(self): class TestAstrBotMessageGroupId (line 161) | class TestAstrBotMessageGroupId: method test_group_id_returns_empty_when_no_group (line 164) | def test_group_id_returns_empty_when_no_group(self): method test_group_id_returns_group_id_when_group_exists (line 169) | def test_group_id_returns_group_id_when_group_exists(self): method test_group_id_setter_creates_new_group (line 176) | def test_group_id_setter_creates_new_group(self): method test_group_id_setter_updates_existing_group (line 184) | def test_group_id_setter_updates_existing_group(self): method test_group_id_setter_with_none_removes_group (line 192) | def test_group_id_setter_with_none_removes_group(self): method test_group_id_setter_with_empty_string_removes_group (line 200) | def test_group_id_setter_with_empty_string_removes_group(self): class TestAstrBotMessageTypes (line 209) | class TestAstrBotMessageTypes: method test_friend_message_type (line 212) | def test_friend_message_type(self): method test_group_message_type (line 220) | def test_group_message_type(self): method test_other_message_type (line 228) | def test_other_message_type(self): class TestAstrBotMessageChain (line 237) | class TestAstrBotMessageChain: method test_message_chain_with_plain_text (line 240) | def test_message_chain_with_plain_text(self): method test_message_chain_with_multiple_components (line 249) | def test_message_chain_with_multiple_components(self): method test_message_chain_empty (line 263) | def test_message_chain_empty(self): FILE: tests/unit/test_computer.py class TestLocalBooterInit (line 23) | class TestLocalBooterInit: method test_local_booter_init (line 26) | def test_local_booter_init(self): method test_local_booter_properties (line 34) | def test_local_booter_properties(self): class TestLocalBooterLifecycle (line 42) | class TestLocalBooterLifecycle: method test_boot (line 46) | async def test_boot(self): method test_shutdown (line 54) | async def test_shutdown(self): method test_available (line 61) | async def test_available(self): class TestLocalBooterUploadDownload (line 67) | class TestLocalBooterUploadDownload: method test_upload_file_not_supported (line 71) | async def test_upload_file_not_supported(self): method test_download_file_not_supported (line 81) | async def test_download_file_not_supported(self): class TestSecurityRestrictions (line 91) | class TestSecurityRestrictions: method test_is_safe_command_allowed (line 94) | def test_is_safe_command_allowed(self): method test_is_safe_command_blocked (line 109) | def test_is_safe_command_blocked(self): method test_ensure_safe_path_allowed (line 129) | def test_ensure_safe_path_allowed(self, tmp_path): method test_ensure_safe_path_blocked (line 153) | def test_ensure_safe_path_blocked(self, tmp_path): class TestLocalShellComponent (line 175) | class TestLocalShellComponent: method test_exec_safe_command (line 179) | async def test_exec_safe_command(self): method test_exec_blocked_command (line 187) | async def test_exec_blocked_command(self): method test_exec_with_timeout (line 195) | async def test_exec_with_timeout(self): method test_exec_with_cwd (line 203) | async def test_exec_with_cwd(self, tmp_path): method test_exec_with_env (line 232) | async def test_exec_with_env(self): class TestLocalPythonComponent (line 243) | class TestLocalPythonComponent: method test_exec_simple_code (line 247) | async def test_exec_simple_code(self): method test_exec_with_error (line 254) | async def test_exec_with_error(self): method test_exec_with_timeout (line 261) | async def test_exec_with_timeout(self): method test_exec_silent_mode (line 269) | async def test_exec_silent_mode(self): method test_exec_return_value (line 276) | async def test_exec_return_value(self): class TestLocalFileSystemComponent (line 283) | class TestLocalFileSystemComponent: method test_create_file (line 287) | async def test_create_file(self, tmp_path): method test_read_file (line 312) | async def test_read_file(self, tmp_path): method test_write_file (line 337) | async def test_write_file(self, tmp_path): method test_delete_file (line 361) | async def test_delete_file(self, tmp_path): method test_delete_directory (line 386) | async def test_delete_directory(self, tmp_path): method test_list_dir (line 412) | async def test_list_dir(self, tmp_path): method test_read_nonexistent_file (line 446) | async def test_read_nonexistent_file(self, tmp_path): class TestComputerBooterBase (line 469) | class TestComputerBooterBase: method test_base_class_is_protocol (line 472) | def test_base_class_is_protocol(self): class TestShipyardBooter (line 485) | class TestShipyardBooter: method test_shipyard_booter_init (line 489) | async def test_shipyard_booter_init(self): method test_shipyard_booter_boot (line 504) | async def test_shipyard_booter_boot(self): method test_shipyard_available_healthy (line 529) | async def test_shipyard_available_healthy(self): method test_shipyard_available_unhealthy (line 554) | async def test_shipyard_available_unhealthy(self): class TestBoxliteBooter (line 579) | class TestBoxliteBooter: method test_boxlite_booter_init (line 583) | async def test_boxlite_booter_init(self): class TestComputerClient (line 597) | class TestComputerClient: method test_get_local_booter (line 600) | def test_get_local_booter(self): method test_get_booter_shipyard (line 617) | async def test_get_booter_shipyard(self): method test_get_booter_unknown_type (line 670) | async def test_get_booter_unknown_type(self): method test_get_booter_reuses_existing (line 692) | async def test_get_booter_reuses_existing(self): method test_get_booter_rebuild_unavailable (line 736) | async def test_get_booter_rebuild_unavailable(self): class TestSyncSkillsToSandbox (line 791) | class TestSyncSkillsToSandbox: method test_sync_skills_no_skills_dir (line 795) | async def test_sync_skills_no_skills_dir(self): method test_sync_skills_empty_dir (line 817) | async def test_sync_skills_empty_dir(self): method test_sync_skills_success (line 843) | async def test_sync_skills_success(self): FILE: tests/unit/test_config.py function temp_config_path (line 14) | def temp_config_path(tmp_path): function minimal_default_config (line 20) | def minimal_default_config(): class TestRateLimitStrategy (line 39) | class TestRateLimitStrategy: method test_stall_value (line 42) | def test_stall_value(self): method test_discard_value (line 46) | def test_discard_value(self): class TestAstrBotConfigLoad (line 51) | class TestAstrBotConfigLoad: method test_init_creates_file_if_not_exists (line 54) | def test_init_creates_file_if_not_exists( method test_init_loads_existing_file (line 68) | def test_init_loads_existing_file(self, temp_config_path, minimal_defa... method test_first_deploy_flag (line 85) | def test_first_deploy_flag(self, temp_config_path, minimal_default_con... method test_init_with_schema (line 94) | def test_init_with_schema(self, temp_config_path): method test_dot_notation_access (line 116) | def test_dot_notation_access(self, temp_config_path, minimal_default_c... method test_setattr_updates_config (line 125) | def test_setattr_updates_config(self, temp_config_path, minimal_defaul... method test_delattr_removes_field (line 135) | def test_delattr_removes_field(self, temp_config_path, minimal_default... method test_delattr_saves_config (line 149) | def test_delattr_saves_config(self, temp_config_path, minimal_default_... method test_check_exist (line 162) | def test_check_exist(self, temp_config_path, minimal_default_config): class TestConfigValidation (line 189) | class TestConfigValidation: method test_insert_missing_config_items (line 192) | def test_insert_missing_config_items( method test_replace_none_with_default (line 207) | def test_replace_none_with_default(self, temp_config_path, minimal_def... method test_reorder_config_keys (line 229) | def test_reorder_config_keys(self, temp_config_path, minimal_default_c... method test_remove_unknown_config_keys (line 251) | def test_remove_unknown_config_keys(self, temp_config_path, minimal_de... method test_nested_config_validation (line 267) | def test_nested_config_validation(self, temp_config_path): class TestConfigHotReload (line 295) | class TestConfigHotReload: method test_save_config (line 298) | def test_save_config(self, temp_config_path, minimal_default_config): method test_save_config_with_replace (line 311) | def test_save_config_with_replace(self, temp_config_path, minimal_defa... method test_modification_persists_after_reload (line 332) | def test_modification_persists_after_reload( class TestConfigSchemaToDefault (line 349) | class TestConfigSchemaToDefault: method test_convert_schema_with_defaults (line 352) | def test_convert_schema_with_defaults(self, temp_config_path): method test_convert_schema_without_defaults (line 366) | def test_convert_schema_without_defaults(self, temp_config_path): method test_unsupported_schema_type_raises_error (line 380) | def test_unsupported_schema_type_raises_error(self, temp_config_path): method test_template_list_type (line 389) | def test_template_list_type(self, temp_config_path): method test_nested_object_schema (line 399) | def test_nested_object_schema(self, temp_config_path): class TestConfigMetadataI18n (line 417) | class TestConfigMetadataI18n: method test_get_i18n_key (line 420) | def test_get_i18n_key(self): method test_get_i18n_key_without_field (line 431) | def test_get_i18n_key_without_field(self): method test_convert_to_i18n_keys_simple (line 442) | def test_convert_to_i18n_keys_simple(self): method test_convert_to_i18n_keys_with_hint (line 474) | def test_convert_to_i18n_keys_with_hint(self): method test_convert_to_i18n_keys_with_labels (line 500) | def test_convert_to_i18n_keys_with_labels(self): method test_convert_to_i18n_keys_nested_items (line 524) | def test_convert_to_i18n_keys_nested_items(self): method test_convert_to_i18n_keys_preserves_non_i18n_fields (line 560) | def test_convert_to_i18n_keys_preserves_non_i18n_fields(self): method test_convert_to_i18n_keys_with_name (line 585) | def test_convert_to_i18n_keys_with_name(self): FILE: tests/unit/test_core_lifecycle.py function mock_log_broker (line 14) | def mock_log_broker(): function mock_db (line 21) | def mock_db(): function mock_astrbot_config (line 29) | def mock_astrbot_config(): class TestAstrBotCoreLifecycleInit (line 38) | class TestAstrBotCoreLifecycleInit: method test_init (line 41) | def test_init(self, mock_log_broker, mock_db): method test_init_with_proxy (line 51) | def test_init_with_proxy( method test_init_clears_proxy (line 80) | def test_init_clears_proxy( class TestAstrBotCoreLifecycleStop (line 102) | class TestAstrBotCoreLifecycleStop: method test_stop_without_initialize (line 106) | async def test_stop_without_initialize(self, mock_log_broker, mock_db): class TestAstrBotCoreLifecycleTaskWrapper (line 129) | class TestAstrBotCoreLifecycleTaskWrapper: method test_task_wrapper_normal_completion (line 133) | async def test_task_wrapper_normal_completion(self, mock_log_broker, m... method test_task_wrapper_with_exception (line 146) | async def test_task_wrapper_with_exception(self, mock_log_broker, mock... method test_task_wrapper_with_cancelled_error (line 162) | async def test_task_wrapper_with_cancelled_error(self, mock_log_broker... class TestAstrBotCoreLifecycleLoadPlatform (line 182) | class TestAstrBotCoreLifecycleLoadPlatform: method test_load_platform (line 186) | async def test_load_platform(self, mock_log_broker, mock_db): class TestAstrBotCoreLifecycleErrorHandling (line 221) | class TestAstrBotCoreLifecycleErrorHandling: method test_subagent_orchestrator_error_is_logged (line 225) | async def test_subagent_orchestrator_error_is_logged( class TestAstrBotCoreLifecycleInitialize (line 262) | class TestAstrBotCoreLifecycleInitialize: method test_initialize_sets_up_all_components (line 266) | async def test_initialize_sets_up_all_components( method test_initialize_handles_migration_failure (line 406) | async def test_initialize_handles_migration_failure( class TestAstrBotCoreLifecycleStart (line 501) | class TestAstrBotCoreLifecycleStart: method test_start_loads_event_bus_and_runs (line 505) | async def test_start_loads_event_bus_and_runs(self, mock_log_broker, m... method test_start_calls_on_astrbot_loaded_hook (line 564) | async def test_start_calls_on_astrbot_loaded_hook(self, mock_log_broke... class TestAstrBotCoreLifecycleStopAdditional (line 629) | class TestAstrBotCoreLifecycleStopAdditional: method test_stop_cancels_all_tasks (line 633) | async def test_stop_cancels_all_tasks(self, mock_log_broker, mock_db): method test_stop_terminates_all_managers (line 673) | async def test_stop_terminates_all_managers(self, mock_log_broker, moc... method test_stop_handles_plugin_termination_error (line 705) | async def test_stop_handles_plugin_termination_error( class TestAstrBotCoreLifecycleRestart (line 748) | class TestAstrBotCoreLifecycleRestart: method test_restart_terminates_managers_and_starts_thread (line 752) | async def test_restart_terminates_managers_and_starts_thread( class TestAstrBotCoreLifecycleLoadPipelineScheduler (line 784) | class TestAstrBotCoreLifecycleLoadPipelineScheduler: method test_load_pipeline_scheduler_creates_schedulers (line 788) | async def test_load_pipeline_scheduler_creates_schedulers( method test_reload_pipeline_scheduler_updates_existing (line 828) | async def test_reload_pipeline_scheduler_updates_existing( method test_reload_pipeline_scheduler_raises_for_missing_config (line 863) | async def test_reload_pipeline_scheduler_raises_for_missing_config( FILE: tests/unit/test_cron_manager.py function mock_db (line 13) | def mock_db(): function mock_context (line 25) | def mock_context(): function cron_manager (line 34) | def cron_manager(mock_db): function sample_cron_job (line 40) | def sample_cron_job(): class TestCronJobManagerInit (line 57) | class TestCronJobManagerInit: method test_init (line 60) | def test_init(self, mock_db): class TestCronJobManagerStart (line 69) | class TestCronJobManagerStart: method test_start (line 73) | async def test_start(self, cron_manager, mock_db, mock_context): method test_start_idempotent (line 83) | async def test_start_idempotent(self, cron_manager, mock_db, mock_cont... class TestCronJobManagerShutdown (line 94) | class TestCronJobManagerShutdown: method test_shutdown (line 98) | async def test_shutdown(self, cron_manager, mock_db, mock_context): method test_shutdown_when_not_started (line 108) | async def test_shutdown_when_not_started(self, cron_manager): class TestAddBasicJob (line 114) | class TestAddBasicJob: method test_add_basic_job (line 118) | async def test_add_basic_job(self, cron_manager, mock_db, sample_cron_... method test_add_basic_job_disabled (line 137) | async def test_add_basic_job_disabled(self, cron_manager, mock_db, sam... method test_add_basic_job_with_timezone (line 155) | async def test_add_basic_job_with_timezone(self, cron_manager, mock_db... class TestAddActiveJob (line 173) | class TestAddActiveJob: method test_add_active_job (line 177) | async def test_add_active_job(self, cron_manager, mock_db, sample_cron... method test_add_active_job_run_once (line 192) | async def test_add_active_job_run_once(self, cron_manager, mock_db, sa... class TestUpdateJob (line 213) | class TestUpdateJob: method test_update_job (line 217) | async def test_update_job(self, cron_manager, mock_db, sample_cron_job): method test_update_job_not_found (line 234) | async def test_update_job_not_found(self, cron_manager, mock_db): class TestDeleteJob (line 243) | class TestDeleteJob: method test_delete_job (line 247) | async def test_delete_job(self, cron_manager, mock_db): class TestListJobs (line 257) | class TestListJobs: method test_list_all_jobs (line 261) | async def test_list_all_jobs(self, cron_manager, mock_db, sample_cron_... method test_list_jobs_by_type (line 271) | async def test_list_jobs_by_type(self, cron_manager, mock_db, sample_c... class TestSyncFromDb (line 281) | class TestSyncFromDb: method test_sync_from_db_empty (line 285) | async def test_sync_from_db_empty(self, cron_manager, mock_db): method test_sync_from_db_skips_disabled (line 294) | async def test_sync_from_db_skips_disabled(self, cron_manager, mock_db... method test_sync_from_db_skips_non_persistent (line 306) | async def test_sync_from_db_skips_non_persistent(self, cron_manager, m... method test_sync_from_db_basic_without_handler (line 318) | async def test_sync_from_db_basic_without_handler( class TestRemoveScheduled (line 330) | class TestRemoveScheduled: method test_remove_scheduled_existing (line 334) | async def test_remove_scheduled_existing(self, cron_manager, mock_cont... method test_remove_scheduled_nonexistent (line 354) | def test_remove_scheduled_nonexistent(self, cron_manager): class TestScheduleJob (line 360) | class TestScheduleJob: method test_schedule_job_basic (line 364) | async def test_schedule_job_basic(self, cron_manager, sample_cron_job,... method test_schedule_job_with_timezone (line 376) | async def test_schedule_job_with_timezone(self, cron_manager, sample_c... method test_schedule_job_invalid_timezone (line 388) | async def test_schedule_job_invalid_timezone(self, cron_manager, sampl... method test_schedule_job_run_once (line 404) | async def test_schedule_job_run_once(self, cron_manager, mock_context): class TestRunJob (line 425) | class TestRunJob: method test_run_job_disabled (line 429) | async def test_run_job_disabled(self, cron_manager, mock_db, sample_cr... method test_run_job_not_found (line 440) | async def test_run_job_not_found(self, cron_manager, mock_db): class TestRunBasicJob (line 450) | class TestRunBasicJob: method test_run_basic_job_sync_handler (line 454) | async def test_run_basic_job_sync_handler(self, cron_manager, sample_c... method test_run_basic_job_async_handler (line 465) | async def test_run_basic_job_async_handler(self, cron_manager, sample_... method test_run_basic_job_no_handler (line 476) | async def test_run_basic_job_no_handler(self, cron_manager, sample_cro... class TestGetNextRunTime (line 484) | class TestGetNextRunTime: method test_get_next_run_time_existing_job (line 488) | async def test_get_next_run_time_existing_job(self, cron_manager, samp... method test_get_next_run_time_nonexistent (line 500) | def test_get_next_run_time_nonexistent(self, cron_manager): FILE: tests/unit/test_cron_tools.py function test_create_future_task_cron_description_prefers_named_weekdays (line 6) | def test_create_future_task_cron_description_prefers_named_weekdays(): FILE: tests/unit/test_event_bus.py function event_queue (line 13) | def event_queue(): function mock_pipeline_scheduler (line 19) | def mock_pipeline_scheduler(): function mock_config_manager (line 27) | def mock_config_manager(): function event_bus (line 37) | def event_bus(event_queue, mock_pipeline_scheduler, mock_config_manager): class TestEventBusInit (line 46) | class TestEventBusInit: method test_init (line 49) | def test_init(self, event_queue, mock_pipeline_scheduler, mock_config_... class TestEventBusDispatch (line 62) | class TestEventBusDispatch: method test_dispatch_processes_event (line 66) | async def test_dispatch_processes_event( method test_dispatch_handles_missing_scheduler (line 105) | async def test_dispatch_handles_missing_scheduler( method test_dispatch_multiple_events (line 150) | async def test_dispatch_multiple_events( method test_dispatch_falls_back_to_conf_id_when_name_missing (line 188) | async def test_dispatch_falls_back_to_conf_id_when_name_missing( class TestPrintEvent (line 229) | class TestPrintEvent: method test_print_event_with_sender_name (line 232) | def test_print_event_with_sender_name(self, event_bus): method test_print_event_without_sender_name (line 251) | def test_print_event_without_sender_name(self, event_bus): class TestEventSubscription (line 272) | class TestEventSubscription: method test_subscriber_registration (line 276) | async def test_subscriber_registration(self, event_queue, mock_config_... method test_multiple_subscribers_receive_events (line 302) | async def test_multiple_subscribers_receive_events( method test_unsubscribe_by_removing_scheduler (line 363) | async def test_unsubscribe_by_removing_scheduler( method test_subscriber_exception_handling (line 387) | async def test_subscriber_exception_handling( class TestEventFiltering (line 448) | class TestEventFiltering: method test_filter_by_event_origin (line 452) | async def test_filter_by_event_origin(self, event_queue): method test_filter_by_message_content_type (line 508) | async def test_filter_by_message_content_type( method test_combined_filter_conditions (line 552) | async def test_combined_filter_conditions(self, event_queue): method test_no_matching_filter_ignores_event (line 614) | async def test_no_matching_filter_ignores_event(self, event_queue): method test_empty_pipeline_mapping_filters_all (line 663) | async def test_empty_pipeline_mapping_filters_all(self, event_queue): FILE: tests/unit/test_python_tools.py function test_python_tool_description_contains_os (line 4) | def test_python_tool_description_contains_os(): function test_local_python_tool_description_contains_os (line 11) | def test_local_python_tool_description_contains_os(): FILE: tests/unit/test_session_lock.py class TestSessionLockManagerBasic (line 14) | class TestSessionLockManagerBasic: method test_init (line 17) | def test_init(self): method test_acquire_release_lock (line 24) | async def test_acquire_release_lock(self): method test_lock_is_reusable (line 39) | async def test_lock_is_reusable(self): class TestCrossLoopIsolation (line 53) | class TestCrossLoopIsolation: method test_different_loops_have_different_managers (line 57) | async def test_different_loops_have_different_managers(self): method test_locks_isolated_across_loops (line 86) | async def test_locks_isolated_across_loops(self): method test_same_loop_blocks_on_same_session (line 120) | async def test_same_loop_blocks_on_same_session(self): class TestConcurrency (line 145) | class TestConcurrency: method test_concurrent_acquisitions_same_loop (line 149) | async def test_concurrent_acquisitions_same_loop(self): method test_thread_safety_of_loop_manager_creation (line 175) | async def test_thread_safety_of_loop_manager_creation(self): class TestEventLoopCleanup (line 210) | class TestEventLoopCleanup: method test_weakref_cleanup_on_loop_close (line 214) | async def test_weakref_cleanup_on_loop_close(self): method test_access_after_loop_close_in_new_loop_works (line 254) | async def test_access_after_loop_close_in_new_loop_works(self): class TestIssue5464 (line 285) | class TestIssue5464: method test_multiple_event_loops_no_cross_loop_error (line 293) | async def test_multiple_event_loops_no_cross_loop_error(self): method test_lock_object_not_shared_across_loops (line 344) | async def test_lock_object_not_shared_across_loops(self): method test_concurrent_access_same_session_different_loops (line 388) | async def test_concurrent_access_same_session_different_loops(self): class TestEdgeCases (line 437) | class TestEdgeCases: method test_empty_session_id (line 441) | async def test_empty_session_id(self): method test_special_characters_in_session_id (line 451) | async def test_special_characters_in_session_id(self): method test_very_long_session_id (line 462) | async def test_very_long_session_id(self): method test_lock_not_held_after_context_exit (line 473) | async def test_lock_not_held_after_context_exit(self): method test_exception_during_lock (line 490) | async def test_exception_during_lock(self): method test_nested_lock_different_sessions (line 505) | async def test_nested_lock_different_sessions(self): method test_reentrant_lock_same_session (line 522) | async def test_reentrant_lock_same_session(self): FILE: tests/unit/test_star_base.py class TestStarBase (line 7) | class TestStarBase: method test_star_class_exists (line 10) | def test_star_class_exists(self): method test_star_init_with_context (line 16) | def test_star_init_with_context(self): method test_text_to_image_with_config (line 34) | async def test_text_to_image_with_config(self): method test_text_to_image_without_config (line 64) | async def test_text_to_image_without_config(self): method test_html_render (line 92) | async def test_html_render(self): method test_initialize_and_terminate (line 124) | async def test_initialize_and_terminate(self): method test_star_metadata_registration (line 147) | def test_star_metadata_registration(self): class TestNoCircularImports (line 167) | class TestNoCircularImports: method test_import_star_module (line 170) | def test_import_star_module(self): method test_import_pipeline_module (line 176) | def test_import_pipeline_module(self): method test_import_both_modules (line 182) | def test_import_both_modules(self): method test_import_pipeline_context (line 194) | def test_import_pipeline_context(self): FILE: tests/unit/test_subagent_orchestrator.py function _build_cfg (line 9) | def _build_cfg(agent_overrides: dict) -> dict: function test_reload_from_config_default_persona_is_resolved (line 23) | async def test_reload_from_config_default_persona_is_resolved(): function test_reload_from_config_missing_persona_falls_back_to_inline_and_warns (line 45) | async def test_reload_from_config_missing_persona_falls_back_to_inline_a... function test_reload_from_config_uses_processed_begin_dialogs_and_deepcopy (line 66) | async def test_reload_from_config_uses_processed_begin_dialogs_and_deepc... function test_reload_from_config_tool_normalization (line 96) | async def test_reload_from_config_tool_normalization(raw_tools, expected... FILE: typings/faiss/__init__.pyi class Index (line 12) | class Index: method add (line 18) | def add(self, x: np.ndarray) -> None: ... method add_with_ids (line 19) | def add_with_ids(self, x: np.ndarray, ids: np.ndarray) -> None: ... method search (line 20) | def search( method remove_ids (line 29) | def remove_ids(self, x: np.ndarray) -> int: ... method reconstruct (line 31) | def reconstruct(self, key: int) -> np.ndarray: ... method reconstruct (line 33) | def reconstruct(self, key: int, x: np.ndarray) -> None: ... method reconstruct (line 34) | def reconstruct( method reconstruct_n (line 38) | def reconstruct_n(self, n0: int, ni: int) -> np.ndarray: ... method reconstruct_n (line 40) | def reconstruct_n(self, n0: int, ni: int, x: np.ndarray) -> None: ... method reconstruct_n (line 41) | def reconstruct_n( method range_search (line 44) | def range_search( method add_sa_codes (line 47) | def add_sa_codes(self, codes: np.ndarray, ids: np.ndarray | None = ...... method sa_encode (line 48) | def sa_encode(self, x: np.ndarray) -> np.ndarray: ... method sa_decode (line 49) | def sa_decode(self, codes: np.ndarray) -> np.ndarray: ... class IndexFlatL2 (line 51) | class IndexFlatL2(Index): method __init__ (line 52) | def __init__(self, d: int) -> None: ... class IndexIDMap (line 54) | class IndexIDMap(Index): method __init__ (line 57) | def __init__(self, index: Index) -> None: ... function read_index (line 59) | def read_index(path: str) -> Index: ... function write_index (line 60) | def write_index(index: Index, path: str | None = ...) -> None: ... function normalize_L2 (line 61) | def normalize_L2(x: np.ndarray) -> None: ... class IndexBinary (line 66) | class IndexBinary(Index): method __init__ (line 67) | def __init__(self, d: int) -> None: ... class InvertedLists (line 69) | class InvertedLists: method __len__ (line 70) | def __len__(self) -> int: ... class AdditiveQuantizer (line 72) | class AdditiveQuantizer: class Quantizer (line 75) | class Quantizer: class VectorTransform (line 78) | class VectorTransform: function downcast_IndexBinary (line 82) | def downcast_IndexBinary(obj: Any) -> IndexBinary: ... function downcast_InvertedLists (line 83) | def downcast_InvertedLists(obj: Any) -> InvertedLists: ... function downcast_AdditiveQuantizer (line 84) | def downcast_AdditiveQuantizer(obj: Any) -> AdditiveQuantizer: ... function downcast_Quantizer (line 85) | def downcast_Quantizer(obj: Any) -> Quantizer: ... function downcast_VectorTransform (line 86) | def downcast_VectorTransform(obj: Any) -> VectorTransform: ... function downcast_index (line 87) | def downcast_index(obj: Any) -> Index: ...