MCPcopy
hub / github.com/AstrBotDevs/AstrBot / build_main_agent

Function build_main_agent

astrbot/core/astr_main_agent.py:1328–1644  ·  view source on GitHub ↗

构建主对话代理(Main Agent),并且自动 reset。 If apply_reset is False, will not call reset on the agent runner.

(
    *,
    event: AstrMessageEvent,
    plugin_context: Context,
    config: MainAgentBuildConfig,
    provider: Provider | None = None,
    req: ProviderRequest | None = None,
    apply_reset: bool = True,
)

Source from the content-addressed store, hash-verified

1326
1327
1328async def build_main_agent(
1329 *,
1330 event: AstrMessageEvent,
1331 plugin_context: Context,
1332 config: MainAgentBuildConfig,
1333 provider: Provider | None = None,
1334 req: ProviderRequest | None = None,
1335 apply_reset: bool = True,
1336) -> MainAgentBuildResult | None:
1337 """构建主对话代理(Main Agent),并且自动 reset。
1338
1339 If apply_reset is False, will not call reset on the agent runner.
1340 """
1341 provider = provider or _select_provider(event, plugin_context)
1342 if provider is None:
1343 logger.info("未找到任何对话模型(提供商),跳过 LLM 请求处理。")
1344 if not event.get_extra(LLM_ERROR_MESSAGE_EXTRA_KEY):
1345 _set_llm_error_message(
1346 event,
1347 "LLM 请求失败:未找到任何可用的对话模型(提供商)。请先在 WebUI 中配置并启用可用模型。",
1348 )
1349 return None
1350
1351 if req is None:
1352 if event.get_extra("provider_request"):
1353 req = event.get_extra("provider_request")
1354 assert isinstance(req, ProviderRequest), (
1355 "provider_request 必须是 ProviderRequest 类型。"
1356 )
1357 if req.conversation:
1358 req.contexts = json.loads(req.conversation.history)
1359 else:
1360 req = ProviderRequest()
1361 req.prompt = ""
1362 req.image_urls = []
1363 req.audio_urls = []
1364 if sel_model := event.get_extra("selected_model"):
1365 req.model = sel_model
1366 if config.provider_wake_prefix and not event.message_str.startswith(
1367 config.provider_wake_prefix
1368 ):
1369 return None
1370
1371 req.prompt = event.message_str[len(config.provider_wake_prefix) :]
1372
1373 # media files attachments
1374 for comp in event.message_obj.message:
1375 if isinstance(comp, Image):
1376 path = await comp.convert_to_file_path()
1377 image_path = await _compress_image_for_provider(
1378 path,
1379 config.provider_settings,
1380 )
1381 if _is_generated_compressed_image_path(path, image_path):
1382 event.track_temporary_local_file(image_path)
1383 req.image_urls.append(image_path)
1384 req.extra_user_content_parts.append(
1385 TextPart(text=f"[Image Attachment: path {image_path}]")

Callers 3

_woke_main_agentMethod · 0.90
processMethod · 0.90

Calls 15

ProviderRequestClass · 0.90
TextPartClass · 0.90
AstrAgentContextClass · 0.90
ToolSetClass · 0.90
_select_providerFunction · 0.85
_set_llm_error_messageFunction · 0.85
_append_audio_attachmentFunction · 0.85

Tested by

no test coverage detected