构建主对话代理(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,
)
| 1326 | |
| 1327 | |
| 1328 | async 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}]") |
no test coverage detected