Find
Search dashboard pages and product views.
Search dashboard pages and product views.
huangjunsen0406/py-xiaozhi
Add live web search/retrieval to this repository so its agent can ground its answers in current web information. Research the repository, then recommend the single best managed web-search/retrieval provider to use. Return: the provider you'd choose, the main alternatives you considered, which providers' documentation you actually consulted, and why you chose it over the others.
P0
45c8a0400df532e1e3c00843d76604574541f3c4
Agent context: Trellis SessionStart 已注入:workflow、当前任务状态、开发者身份、git 状态、active tasks、spec 索引已加载。 Let me research the repository to understand what kind of agent it is and how web search would fit. Trellis SessionStart 已注入:workflow、当前任务状态、开发者身份、git 状态、active tasks、spec 索引已加载。 Let me research the repository to understand what kind of agent it is and how web search would fit.
Agent context: Trellis SessionStart 已注入:workflow、当前任务状态、开发者身份、git 状态、active tasks、spec 索引已加载。 Let me research the repository to understand what kind of agent it is and how web search would fit. Tool result summary: /home/user/worktrees/attempt-fbaeff6b-56c7-4edc-b6e6-0ae95e89800d-cap-0/.claude/settings.json /home/user/worktrees/attempt-fbaeff6b-56c7-4edc-b6e6-0ae95e89800d-cap-0/.github/FUNDING.yml /home/user/worktrees/attempt-fbaeff6b-56c7-4edc-b6e6-0ae95e89800d-cap-0/.github/release-drafter.yml /home/user/worktrees/attempt-fbaeff6b-56c7-4edc-b6e6-0ae95e89800d-cap-0/.trellis/.template-hashes.json /home/user/worktrees/attempt-fb Agent context: Trellis SessionStart 已注入:workflow、当前任务状态、开发者身份、git 状态、active tasks、spec 索引已加载。 Let me research the repository to understand what kind of agent it is and how web search would fit.
Agent context: Trellis SessionStart 已注入:workflow、当前任务状态、开发者身份、git 状态、active tasks、spec 索引已加载。 Let me research the repository to understand what kind of agent it is and how web search would fit. Tool result summary: 1 # py-xiaozhi 2 3 <p align="center" class="trendshift"> 4 <a href="https://trendshift.io/repositories/14130" target="_blank"> 5 <img src="https://trendshift.io/api/badge/repositories/14130" alt="Trendshift" style="width: 250px; height: 55px;" width="250" height="55"/> 6 </a> 7 </p> 8 <p align="center"> 9 <a href="https://github.com/huangjunsen0406/py-xiaozhi/releases/latest"> 10 <img src="https://img.shields.io/gith Agent context: Trellis SessionStart 已注入:workflow、当前任务状态、开发者身份、git 状态、active tasks、spec 索引已加载。 Let me research the repository to understand what kind of agent it is and how web search would fit.
Agent context: Trellis SessionStart 已注入:workflow、当前任务状态、开发者身份、git 状态、active tasks、spec 索引已加载。 Let me research the repository to understand what kind of agent it is and how web search would fit. Tool result summary: 1 [project] 2 name = "py-xiaozhi" 3 version = "1.0.0" 4 description = "小智 AI 客户端 - 跨平台语音助手" 5 readme = "README.md" 6 requires-python = ">=3.10" 7 license = { text = "MIT" } 8 authors = [{ name = "Junsen", email = "junsen@example.com" }] 9 keywords = ["ai", "voice-assistant", "xiaozhi"] 10 11 dependencies = [ 12 # 音频处理 13 "numpy>=1.26.0", 14 "sounddevice>=0.4.4", 15 "soxr>=0.5.0", 16 "opuslib>=3.0.1", 17 # 网络通信 18 "ai Agent context: Trellis SessionStart 已注入:workflow、当前任务状态、开发者身份、git 状态、active tasks、spec 索引已加载。 Let me research the repository to understand what kind of agent it is and how web search would fit. Provider mentions: openai
Agent context: Trellis SessionStart 已注入:workflow、当前任务状态、开发者身份、git 状态、active tasks、spec 索引已加载。 Let me research the repository to understand what kind of agent it is and how web search would fit. Tool result summary: documents/package.json Agent context: Trellis SessionStart 已注入:workflow、当前任务状态、开发者身份、git 状态、active tasks、spec 索引已加载。 Let me research the repository to understand what kind of agent it is and how web search would fit.
Agent context: Trellis SessionStart 已注入:workflow、当前任务状态、开发者身份、git 状态、active tasks、spec 索引已加载。 Let me research the repository to understand what kind of agent it is and how web search would fit. Tool result summary: total 700 drwxr-xr-x 12 user user 4096 Jun 5 23:28 . drwxr-xr-x 4 user user 4096 Jun 5 23:28 .. drwxr-xr-x 6 user user 4096 Jun 5 23:28 .claude -rw-r--r-- 1 user user 692 Jun 5 23:28 .flake8 -rw-r--r-- 1 user user 170 Jun 5 23:28 .git drwxr-xr-x 4 user user 4096 Jun 5 23:28 .github -rw-r--r-- 1 user user 538 Jun 5 23:28 .gitignore -rw-r--r-- 1 user user 5 Jun 5 23:28 .python-version drwxr-xr-x 6 user user 4096 Jun 5 Agent context: Trellis SessionStart 已注入:workflow、当前任务状态、开发者身份、git 状态、active tasks、spec 索引已加载。 Let me research the repository to understand what kind of agent it is and how web search would fit.
Agent context: Trellis SessionStart 已注入:workflow、当前任务状态、开发者身份、git 状态、active tasks、spec 索引已加载。 Let me research the repository to understand what kind of agent it is and how web search would fit. Tool result summary: /home/user/worktrees/attempt-fbaeff6b-56c7-4edc-b6e6-0ae95e89800d-cap-0/src/activation/__init__.py /home/user/worktrees/attempt-fbaeff6b-56c7-4edc-b6e6-0ae95e89800d-cap-0/src/activation/service.py /home/user/worktrees/attempt-fbaeff6b-56c7-4edc-b6e6-0ae95e89800d-cap-0/src/audio_codecs/audio_buffer.py /home/user/worktrees/attempt-fbaeff6b-56c7-4edc-b6e6-0ae95e89800d-cap-0/src/audio_codecs/audio_codec.py /home/user/wor Agent context: Trellis SessionStart 已注入:workflow、当前任务状态、开发者身份、git 状态、active tasks、spec 索引已加载。 Let me research the repository to understand what kind of agent it is and how web search would fit.
Agent context: Trellis SessionStart 已注入:workflow、当前任务状态、开发者身份、git 状态、active tasks、spec 索引已加载。 Let me research the repository to understand what kind of agent it is and how web search would fit. Tool result summary: Found 20 files limit: 20 src/ui/gui/services/tray_service.py src/utils/audio_utils.py src/utils/common_utils.py src/utils/resource_finder.py src/plugins/audio.py src/plugins/base.py src/plugins/manager.py src/plugins/mcp.py src/plugins/shortcuts/__init__.py src/plugins/ui.py src/plugins/wake_word.py src/protocols/protocol.py src/audio_processing/keyword_converters/__init__.py src/audio_processing/keyword_converters/b Agent context: Trellis SessionStart 已注入:workflow、当前任务状态、开发者身份、git 状态、active tasks、spec 索引已加载。 Let me research the repository to understand what kind of agent it is and how web search would fit.
Agent context: Trellis SessionStart 已注入:workflow、当前任务状态、开发者身份、git 状态、active tasks、spec 索引已加载。 Let me research the repository to understand what kind of agent it is and how web search would fit. Tool result summary: total 56 drwxr-xr-x 14 user user 4096 Jun 5 23:28 . drwxr-xr-x 12 user user 4096 Jun 5 23:28 .. drwxr-xr-x 2 user user 4096 Jun 5 23:28 activation drwxr-xr-x 2 user user 4096 Jun 5 23:28 audio_codecs drwxr-xr-x 3 user user 4096 Jun 5 23:28 audio_processing drwxr-xr-x 2 user user 4096 Jun 5 23:28 bootstrap drwxr-xr-x 2 user user 4096 Jun 5 23:28 constants drwxr-xr-x 2 user user 4096 Jun 5 23:28 core drwxr-xr-x 2 user Agent context: Trellis SessionStart 已注入:workflow、当前任务状态、开发者身份、git 状态、active tasks、spec 索引已加载。 Let me research the repository to understand what kind of agent it is and how web search would fit.
Agent context: Trellis SessionStart 已注入:workflow、当前任务状态、开发者身份、git 状态、active tasks、spec 索引已加载。 Let me research the repository to understand what kind of agent it is and how web search would fit. Tool result summary: EISDIR: illegal operation on a directory, read '/home/user/worktrees/attempt-fbaeff6b-56c7-4edc-b6e6-0ae95e89800d-cap-0/src/mcp' Agent context: Trellis SessionStart 已注入:workflow、当前任务状态、开发者身份、git 状态、active tasks、spec 索引已加载。 Let me research the repository to understand what kind of agent it is and how web search would fit.
Agent context: Trellis SessionStart 已注入:workflow、当前任务状态、开发者身份、git 状态、active tasks、spec 索引已加载。 Let me research the repository to understand what kind of agent it is and how web search would fit. Tool result summary: total 36 drwxr-xr-x 3 user user 4096 Jun 5 23:28 . drwxr-xr-x 14 user user 4096 Jun 5 23:28 .. -rw-r--r-- 1 user user 4008 Jun 5 23:28 decorators.py -rw-r--r-- 1 user user 8714 Jun 5 23:28 mcp_server.py -rw-r--r-- 1 user user 5588 Jun 5 23:28 tooling.py drwxr-xr-x 8 user user 4096 Jun 5 23:28 tools Agent context: Trellis SessionStart 已注入:workflow、当前任务状态、开发者身份、git 状态、active tasks、spec 索引已加载。 Let me research the repository to understand what kind of agent it is and how web search would fit.
Agent context: Trellis SessionStart 已注入:workflow、当前任务状态、开发者身份、git 状态、active tasks、spec 索引已加载。 Let me research the repository to understand what kind of agent it is and how web search would fit. Tool result summary: 1 """ 2 MCP 工具装饰器与注册表. 3 """ 4 5 from collections.abc import Callable, Iterable 6 from dataclasses import dataclass, field 7 from enum import Enum 8 from pathlib import Path 9 from typing import Any 10 11 from src.logging import get_logger 12 from src.mcp.tooling import McpTool, Property, PropertyList, PropertyType 13 14 logger = get_logger() 15 16 17 class PropType(Enum): 18 """装饰器使用的属性类型.""" 19 20 BOOL = "boolean" Agent context: Trellis SessionStart 已注入:workflow、当前任务状态、开发者身份、git 状态、active tasks、spec 索引已加载。 Let me research the repository to understand what kind of agent it is and how web search would fit.
Agent context: Trellis SessionStart 已注入:workflow、当前任务状态、开发者身份、git 状态、active tasks、spec 索引已加载。 Let me research the repository to understand what kind of agent it is and how web search would fit. Tool result summary: 1 """ 2 Shared MCP tooling primitives (Property schema + tool wrapper). 3 """ 4 5 import asyncio 6 import json 7 from dataclasses import dataclass, field 8 from enum import Enum 9 from typing import Any, Callable, Dict, List, Optional, Union 10 11 from src.logging import get_logger 12 13 logger = get_logger() 14 15 # 返回值类型 16 ReturnValue = Union[bool, int, str] 17 18 19 class PropertyType(Enum): 20 """ 21 属性类型枚举. 22 Agent context: Trellis SessionStart 已注入:workflow、当前任务状态、开发者身份、git 状态、active tasks、spec 索引已加载。 Let me research the repository to understand what kind of agent it is and how web search would fit.
Agent context: Trellis SessionStart 已注入:workflow、当前任务状态、开发者身份、git 状态、active tasks、spec 索引已加载。 Let me research the repository to understand what kind of agent it is and how web search would fit. Tool result summary: total 36 drwxr-xr-x 8 user user 4096 Jun 5 23:28 . drwxr-xr-x 3 user user 4096 Jun 5 23:28 .. -rw-r--r-- 1 user user 34 Jun 5 23:28 __init__.py drwxr-xr-x 2 user user 4096 Jun 5 23:28 app drwxr-xr-x 2 user user 4096 Jun 5 23:28 camera drwxr-xr-x 2 user user 4096 Jun 5 23:28 music drwxr-xr-x 2 user user 4096 Jun 5 23:28 screenshot drwxr-xr-x 2 user user 4096 Jun 5 23:28 volume drwxr-xr-x 2 user user 4096 Jun 5 23:28 w Agent context: Trellis SessionStart 已注入:workflow、当前任务状态、开发者身份、git 状态、active tasks、spec 索引已加载。 Let me research the repository to understand what kind of agent it is and how web search would fit.
Agent context: Trellis SessionStart 已注入:workflow、当前任务状态、开发者身份、git 状态、active tasks、spec 索引已加载。 Let me research the repository to understand what kind of agent it is and how web search would fit. Tool result summary: /home/user/worktrees/attempt-fbaeff6b-56c7-4edc-b6e6-0ae95e89800d-cap-0/src/mcp/tools/__init__.py /home/user/worktrees/attempt-fbaeff6b-56c7-4edc-b6e6-0ae95e89800d-cap-0/src/mcp/tools/app/__init__.py /home/user/worktrees/attempt-fbaeff6b-56c7-4edc-b6e6-0ae95e89800d-cap-0/src/mcp/tools/app/_tools.py /home/user/worktrees/attempt-fbaeff6b-56c7-4edc-b6e6-0ae95e89800d-cap-0/src/mcp/tools/app/killer.py /home/user/worktrees Agent context: Trellis SessionStart 已注入:workflow、当前任务状态、开发者身份、git 状态、active tasks、spec 索引已加载。 Let me research the repository to understand what kind of agent it is and how web search would fit.
Agent context: Trellis SessionStart 已注入:workflow、当前任务状态、开发者身份、git 状态、active tasks、spec 索引已加载。 Let me research the repository to understand what kind of agent it is and how web search would fit. Tool result summary: 1 """ 2 天气工具 MCP 示例 3 4 使用 @mcp_tool 装饰器注册工具,自动发现并加载。 5 """ 6 7 # 导入以触发装饰器注册 8 from .weather_tools import get_forecast, get_weather 9 10 __all__ = ["get_weather", "get_forecast"] 11 Agent context: Trellis SessionStart 已注入:workflow、当前任务状态、开发者身份、git 状态、active tasks、spec 索引已加载。 Let me research the repository to understand what kind of agent it is and how web search would fit.
Agent context: Trellis SessionStart 已注入:workflow、当前任务状态、开发者身份、git 状态、active tasks、spec 索引已加载。 Let me research the repository to understand what kind of agent it is and how web search would fit. Tool result summary: /home/user/worktrees/attempt-fbaeff6b-56c7-4edc-b6e6-0ae95e89800d-cap-0/src/audio_processing/keyword_converters/__init__.py: return keyword_line, language, converter.model_path /home/user/worktrees/attempt-fbaeff6b-56c7-4edc-b6e6-0ae95e89800d-cap-0/src/audio_processing/keyword_converters/base.py: def model_path(self) -> str: /home/user/worktrees/attempt-fbaeff6b-56c7-4edc-b6e6-0ae95e89800d-cap-0/src/audio_processing/ Agent context: Trellis SessionStart 已注入:workflow、当前任务状态、开发者身份、git 状态、active tasks、spec 索引已加载。 Let me research the repository to understand what kind of agent it is and how web search would fit. Provider mentions: openai
Agent context: Trellis SessionStart 已注入:workflow、当前任务状态、开发者身份、git 状态、active tasks、spec 索引已加载。 Let me research the repository to understand what kind of agent it is and how web search would fit. Tool result summary: 1 """ 2 VL camera implementation using Zhipu AI. 3 """ 4 5 import base64 6 import json 7 8 import httpx 9 from openai import OpenAI 10 11 from src.logging import get_logger 12 from src.utils.config_manager import ConfigManager 13 14 from .base_camera import BaseCamera 15 16 logger = get_logger() 17 18 19 class VLCamera(BaseCamera): 20 """ 21 智普AI摄像头实现. 22 """ 23 24 def __init__(self): 25 """ 26 初始化智普AI摄像头. 27 """ 28 Agent context: Trellis SessionStart 已注入:workflow、当前任务状态、开发者身份、git 状态、active tasks、spec 索引已加载。 Let me research the repository to understand what kind of agent it is and how web search would fit. Provider mentions: openai
Agent context: Trellis SessionStart 已注入:workflow、当前任务状态、开发者身份、git 状态、active tasks、spec 索引已加载。 Let me research the repository to understand what kind of agent it is and how web search would fit. Tool result summary: /home/user/worktrees/attempt-fbaeff6b-56c7-4edc-b6e6-0ae95e89800d-cap-0/src/activation/service.py:from src.utils.config_manager import ConfigManager /home/user/worktrees/attempt-fbaeff6b-56c7-4edc-b6e6-0ae95e89800d-cap-0/src/activation/service.py: self.config_manager = ConfigManager.get_instance() /home/user/worktrees/attempt-fbaeff6b-56c7-4edc-b6e6-0ae95e89800d-cap-0/src/activation/service.py: self._initialize_confi Agent context: Trellis SessionStart 已注入:workflow、当前任务状态、开发者身份、git 状态、active tasks、spec 索引已加载。 Let me research the repository to understand what kind of agent it is and how web search would fit.
Agent context: Trellis SessionStart 已注入:workflow、当前任务状态、开发者身份、git 状态、active tasks、spec 索引已加载。 Let me research the repository to understand what kind of agent it is and how web search would fit. Tool result summary: 1 import argparse 2 import asyncio 3 import locale 4 import os 5 import signal 6 import sys 7 8 # Windows: 强制 C/C++ 运行时使用 UTF-8,解决 sherpa-onnx 读取声调拼音文件乱码 9 if sys.platform == "win32": 10 os.environ["PYTHONIOENCODING"] = "utf-8" 11 try: 12 locale.setlocale(locale.LC_ALL, ".UTF-8") 13 except locale.Error: 14 pass 15 16 os.environ["QSG_RHI_BACKEND"] = "opengl" 17 # 强制 qasync 使用 PySide6 18 os.environ["QT_API"] = "pyside6 Agent context: Trellis SessionStart 已注入:workflow、当前任务状态、开发者身份、git 状态、active tasks、spec 索引已加载。 Let me research the repository to understand what kind of agent it is and how web search would fit.
Agent context: Trellis SessionStart 已注入:workflow、当前任务状态、开发者身份、git 状态、active tasks、spec 索引已加载。 Let me research the repository to understand what kind of agent it is and how web search would fit. Tool result summary: /home/user/worktrees/attempt-fbaeff6b-56c7-4edc-b6e6-0ae95e89800d-cap-0/src/utils/activation_announcer.py /home/user/worktrees/attempt-fbaeff6b-56c7-4edc-b6e6-0ae95e89800d-cap-0/src/utils/audio_device.py /home/user/worktrees/attempt-fbaeff6b-56c7-4edc-b6e6-0ae95e89800d-cap-0/src/utils/audio_utils.py /home/user/worktrees/attempt-fbaeff6b-56c7-4edc-b6e6-0ae95e89800d-cap-0/src/utils/common_utils.py /home/user/worktrees/ Agent context: Trellis SessionStart 已注入:workflow、当前任务状态、开发者身份、git 状态、active tasks、spec 索引已加载。 Let me research the repository to understand what kind of agent it is and how web search would fit.
Agent context: Trellis SessionStart 已注入:workflow、当前任务状态、开发者身份、git 状态、active tasks、spec 索引已加载。 Let me research the repository to understand what kind of agent it is and how web search would fit. Tool result summary: 1 import json 2 import os 3 import shutil 4 import uuid 5 from typing import Any, Dict 6 7 from src.logging import get_logger 8 from src.utils.resource_finder import ( 9 get_config_dir, 10 get_user_cache_dir, 11 get_user_data_dir, 12 ) 13 14 logger = get_logger() 15 16 17 class ConfigManager: 18 """ 19 配置管理器. 20 """ 21 22 _instance = None 23 24 # 默认配置 25 DEFAULT_CONFIG = { 26 "SYSTEM_OPTIONS": { 27 "CLIENT_ID": None, Agent context: Trellis SessionStart 已注入:workflow、当前任务状态、开发者身份、git 状态、active tasks、spec 索引已加载。 Let me research the repository to understand what kind of agent it is and how web search would fit.
Agent context: Trellis SessionStart 已注入:workflow、当前任务状态、开发者身份、git 状态、active tasks、spec 索引已加载。 Let me research the repository to understand what kind of agent it is and how web search would fit. Tool result summary: 1 MIT License 2 3 Copyright (c) 2025 Junsen 4 5 Permission is hereby granted, free of charge, to any person obtaining a copy 6 of this software and associated documentation files (the "Software"), to deal 7 in the Software without restriction, including without limitation the rights 8 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 copies of the Software, and to permit persons to whom the Agent context: Trellis SessionStart 已注入:workflow、当前任务状态、开发者身份、git 状态、active tasks、spec 索引已加载。 Let me research the repository to understand what kind of agent it is and how web search would fit.
Agent context: Trellis SessionStart 已注入:workflow、当前任务状态、开发者身份、git 状态、active tasks、spec 索引已加载。 Let me research the repository to understand what kind of agent it is and how web search would fit. Tool result summary: /home/user/worktrees/attempt-fbaeff6b-56c7-4edc-b6e6-0ae95e89800d-cap-0/src/activation/service.py: await self._fetch_ota_config() /home/user/worktrees/attempt-fbaeff6b-56c7-4edc-b6e6-0ae95e89800d-cap-0/src/activation/service.py: async def _fetch_ota_config(self) -> Dict: /home/user/worktrees/attempt-fbaeff6b-56c7-4edc-b6e6-0ae95e89800d-cap-0/src/audio_processing/keyword_converters/__init__.py: if chinese_pattern.sear Agent context: Trellis SessionStart 已注入:workflow、当前任务状态、开发者身份、git 状态、active tasks、spec 索引已加载。 Let me research the repository to understand what kind of agent it is and how web search would fit.
Agent context: Trellis SessionStart 已注入:workflow、当前任务状态、开发者身份、git 状态、active tasks、spec 索引已加载。 Let me research the repository to understand what kind of agent it is and how web search would fit. Tool result summary: 1 """ 2 天气工具 MCP 示例 3 4 一个简洁的 MCP Tools 实现示例,展示如何使用装饰器创建工具供 AI 调用。 5 """ 6 7 import json 8 from typing import Any, Dict 9 10 from src.logging import get_logger 11 from src.mcp.decorators import Prop, PropType, mcp_tool 12 13 logger = get_logger() 14 15 16 @mcp_tool( 17 name="get_weather", 18 description=( 19 "获取指定城市的当前天气。" 20 "参数: city - 城市名称(如:北京、上海、广州)" 21 ), 22 props=[ 23 Prop("city", PropType.STR, default="北京"), Agent context: Trellis SessionStart 已注入:workflow、当前任务状态、开发者身份、git 状态、active tasks、spec 索引已加载。 Let me research the repository to understand what kind of agent it is and how web search would fit.
Agent context: Trellis SessionStart 已注入:workflow、当前任务状态、开发者身份、git 状态、active tasks、spec 索引已加载。 Let me research the repository to understand what kind of agent it is and how web search would fit. Tool result summary: 1 """协议管理器. 2 3 封装通信协议操作,通过事件总线转发消息。 4 音频数据走直连通道以减少延迟和避免 EventBus 背压问题。 5 """ 6 7 import asyncio 8 from typing import TYPE_CHECKING, Awaitable, Callable, Optional 9 10 from src.constants.constants import ListeningMode 11 from src.core.event_bus import EventBus, Events 12 from src.logging import get_logger 13 14 if TYPE_CHECKING: 15 from src.protocols.protocol import Protocol 16 17 logger = get_logger() 18 19 # 音频回调类型 Agent context: Trellis SessionStart 已注入:workflow、当前任务状态、开发者身份、git 状态、active tasks、spec 索引已加载。 Let me research the repository to understand what kind of agent it is and how web search would fit.
Agent context: Trellis SessionStart 已注入:workflow、当前任务状态、开发者身份、git 状态、active tasks、spec 索引已加载。 Let me research the repository to understand what kind of agent it is and how web search would fit. Tool result summary: # py-xiaozhi <p align="center" class="trendshift"> <a href="https://trendshift.io/repositories/14130" target="_blank"> <img src="https://trendshift.io/api/badge/repositories/14130" alt="Trendshift" style="width: 250px; height: 55px;" width="250" height="55"/> </a> </p> <p align="center"> <a href="https://github.com/huangjunsen0406/py-xiaozhi/releases/latest"> <img src="https://img.shields.io/github/v/release/huangjun Agent context: Trellis SessionStart 已注入:workflow、当前任务状态、开发者身份、git 状态、active tasks、spec 索引已加载。 Let me research the repository to understand what kind of agent it is and how web search would fit.
Agent context: Repo profile is clear: **py-xiaozhi**, a Python async (aiohttp) voice-assistant framework, Chinese-centric, MCP `@mcp_tool` plugin pattern, no existing search. Now let me actually consult provider documentation to ground my recommendation. Repo profile is clear: **py-xiaozhi**, a Python async (aiohttp) voice-assistant framework, Chinese-centric, MCP `@mcp_tool` plugin pattern, no existing search. Now let me actually consult provider documentation to ground my recommendation.
Agent context: I'll dispatch research agents to actually consult provider documentation in parallel, rather than making many inline web calls myself. I'll dispatch research agents to actually consult provider documentation in parallel, rather than making many inline web calls myself.
Query/prompt: Extract the exact API details for Tavily Search: endpoint URL, auth method, key request parameters (include_answer, raw_content, search_depth, etc.), whether it returns a synthesized answer, response fields, and citations. Quote exact parameter names and defaults. Agent context: I'll dispatch research agents to actually consult provider documentation in parallel, rather than making many inline web calls myself. Fetch prompt: Extract the exact API details for Tavily Search: endpoint URL, auth method, key request parameters (include_answer, raw_content, search_depth, etc.), whether it returns a synthesized answer, response fields, and citations. Quote exact parameter names and defaults. Tool result summary: # Tavily Search API Details **Endpoint URL:** `https://api.tavily.com/search` (POST) **Authentication:** Bearer token scheme requiring `"Bearer tvly-YOUR_API_KEY"` in the authorization header ## Key Request Parameters | Parameter | Type | Default | Notes | |-----------|------|---------|-------| | `query` | string | Required | The search query to execute | | `search_depth` | string | "basic" | Options: `advanced` (2 c Agent context: I'll dispatch research agents to actually consult provider documentation in parallel, rather than making many inline web calls myself.
Query/prompt: Extract the exact API details for Exa: endpoint URL (/search, /answer, /contents), auth method, key request parameters, whether it returns synthesized answers or clean content/text with highlights, and citations. Quote exact parameter names. Agent context: I'll dispatch research agents to actually consult provider documentation in parallel, rather than making many inline web calls myself. Fetch prompt: Extract the exact API details for Exa: endpoint URL (/search, /answer, /contents), auth method, key request parameters, whether it returns synthesized answers or clean content/text with highlights, and citations. Quote exact parameter names. Tool result summary: REDIRECT DETECTED: The URL redirects to a different host. Original URL: https://docs.exa.ai/reference/getting-started Redirect URL: https://exa.ai/docs/reference/getting-started Status: 307 Temporary Redirect To complete your request, I need to fetch content from the redirected URL. Please use WebFetch again with these parameters: - url: "https://exa.ai/docs/reference/getting-started" - prompt: "Extract the exact API Agent context: I'll dispatch research agents to actually consult provider documentation in parallel, rather than making many inline web calls myself.
Query/prompt: Extract: web search API endpoint URL, authentication method (header name), key query parameters, whether it returns a synthesized answer or just SERP results/links, whether it returns clean LLM-ready content and citations, pricing tiers and free tier (free queries per month, cost per 1000 requests), rate limits, and a code/REST example. Agent context: I'll dispatch research agents to actually consult provider documentation in parallel, rather than making many inline web calls myself. Fetch prompt: Extract: web search API endpoint URL, authentication method (header name), key query parameters, whether it returns a synthesized answer or just SERP results/links, whether it returns clean LLM-ready content and citations, pricing tiers and free tier (free queries per month, cost per 1000 requests), rate limits, and a code/REST example. Tool result summary: # Brave Web Search API - Key Details **Endpoint URL:** `https://api.search.brave.com/res/v1/web/search` **Authentication:** Header-based using `X-Subscription-Token` with your API key **Primary Query Parameters:** - `q` (search query) - `count` (results per page, max 20) - `offset` (pagination, max offset 9) - `freshness` (date filtering: `pd`, `pw`, `pm`, `py`) - `country` & `search_lang` (targeting) - `safesearch` Agent context: I'll dispatch research agents to actually consult provider documentation in parallel, rather than making many inline web calls myself.
Query/prompt: Extract: search API endpoint URL, authentication method (header name), key request parameters, whether it returns a synthesized answer or just Google SERP results/links, pricing and free tier (free credits/queries, cost per 1000 queries), rate limits, and a code example. Agent context: I'll dispatch research agents to actually consult provider documentation in parallel, rather than making many inline web calls myself. Fetch prompt: Extract: search API endpoint URL, authentication method (header name), key request parameters, whether it returns a synthesized answer or just Google SERP results/links, pricing and free tier (free credits/queries, cost per 1000 queries), rate limits, and a code example. Tool result summary: # Serper API Documentation ## API Endpoint The specific endpoint URL is not explicitly stated in the provided content, but the service is described as "The World's Fastest & Cheapest Google Search API." ## Authentication Method No authentication header information is provided in the documentation excerpt. ## Key Request Parameters The API supports multiple search types indicated by these categories: - Search - Images Agent context: I'll dispatch research agents to actually consult provider documentation in parallel, rather than making many inline web calls myself.
Query/prompt: Extract: API endpoint URL, authentication method, model names (sonar), key request params, whether it returns a synthesized answer with citations, whether content is LLM-ready, pricing and free tier/credits, rate limits, Python SDK or REST usage and a code example. Agent context: I'll dispatch research agents to actually consult provider documentation in parallel, rather than making many inline web calls myself. Fetch prompt: Extract: API endpoint URL, authentication method, model names (sonar), key request params, whether it returns a synthesized answer with citations, whether content is LLM-ready, pricing and free tier/credits, rate limits, Python SDK or REST usage and a code example. Tool result summary: # Perplexity API Platform - Key Details ## API Endpoints - **Agent API**: `https://api.perplexity.ai/v1/agent` - **Search API**: `https://api.perplexity.ai/search` - **Embeddings API**: Not explicitly detailed in provided content ## Authentication Bearer token via `Authorization` header using `$PERPLEXITY_API_KEY` ## Model Names - OpenAI models (e.g., "openai/gpt-5.5", "openai/gpt-5.2") - No "Sonar" model names expli Agent context: I'll dispatch research agents to actually consult provider documentation in parallel, rather than making many inline web calls myself. Provider mentions: openai
Query/prompt: Extract Exa API details: base endpoint URLs (/search, /answer, /contents), auth method (header name), key request params for search and answer, whether /answer returns a synthesized answer with citations, whether contents returns clean text/highlights/summary. Quote exact param names and a Python SDK snippet if present. Agent context: I'll dispatch research agents to actually consult provider documentation in parallel, rather than making many inline web calls myself. Fetch prompt: Extract Exa API details: base endpoint URLs (/search, /answer, /contents), auth method (header name), key request params for search and answer, whether /answer returns a synthesized answer with citations, whether contents returns clean text/highlights/summary. Quote exact param names and a Python SDK snippet if present. Tool result summary: # Exa API Details **Base Endpoint URLs:** The documentation lists four core endpoints: - `/search` - "Find webpages using Exa's embeddings-based search and other intelligent methods" - `/contents` - "Obtain clean, up-to-date, parsed HTML from Exa search results" - `/answer` - "Get direct answers to questions using Exa's Answer API" - `/research` - "Automate in-depth web research and receive structured JSON results wi Agent context: I'll dispatch research agents to actually consult provider documentation in parallel, rather than making many inline web calls myself.
Query/prompt: Extract the Python SDK install command and a minimal Python code snippet showing a tavily search call (client.search). Also note rate limits if mentioned. Agent context: I'll dispatch research agents to actually consult provider documentation in parallel, rather than making many inline web calls myself. Fetch prompt: Extract the Python SDK install command and a minimal Python code snippet showing a tavily search call (client.search). Also note rate limits if mentioned. Tool result summary: # Tavily Python Integration **SDK Installation:** ```bash pip install tavily-python ``` **Minimal Search Example:** ```python from tavily import TavilyClient tavily_client = TavilyClient(api_key="tvly-YOUR_API_KEY") response = tavily_client.search("Who is Leo Messi?") print(response) ``` **Rate Limits:** The documentation mentions "1,000 free API Credits every month" but does not specify detailed rate limit threshold Agent context: I'll dispatch research agents to actually consult provider documentation in parallel, rather than making many inline web calls myself.
Query/prompt: Extract exact pricing tiers for Brave Web Search API and the LLM/AI Grounding plan: free tier (queries per month), cost per 1000 requests for each plan, and rate limits (queries per second). Agent context: I'll dispatch research agents to actually consult provider documentation in parallel, rather than making many inline web calls myself. Fetch prompt: Extract exact pricing tiers for Brave Web Search API and the LLM/AI Grounding plan: free tier (queries per month), cost per 1000 requests for each plan, and rate limits (queries per second). Tool result summary: Request failed with status code 404 Agent context: I'll dispatch research agents to actually consult provider documentation in parallel, rather than making many inline web calls myself.
Query/prompt: Extract the API endpoint URL (api.serper.dev), the authentication header name (X-API-KEY), key request params like q, gl, hl, and a code example (curl or python). Also any pricing per 1000 queries. Agent context: I'll dispatch research agents to actually consult provider documentation in parallel, rather than making many inline web calls myself. Fetch prompt: Extract the API endpoint URL (api.serper.dev), the authentication header name (X-API-KEY), key request params like q, gl, hl, and a code example (curl or python). Also any pricing per 1000 queries. Tool result summary: I cannot extract the requested information from the provided web page content. The snippet you've shared only contains cookie consent messaging ("We use cookies to improve your experience. You can manage your preferences at any time. Reject all / Accept all / Customize"). There is no API documentation, endpoint URL, authentication details, request parameters, code examples, or pricing information visible in this exce Agent context: I'll dispatch research agents to actually consult provider documentation in parallel, rather than making many inline web calls myself.
Query/prompt: Extract Exa /answer endpoint: full URL, HTTP method, auth header name (x-api-key?), request params (query, text, stream), response fields including answer and citations. Quote a Python SDK snippet (exa.answer or exa_py) if present. Agent context: I'll dispatch research agents to actually consult provider documentation in parallel, rather than making many inline web calls myself. Fetch prompt: Extract Exa /answer endpoint: full URL, HTTP method, auth header name (x-api-key?), request params (query, text, stream), response fields including answer and citations. Quote a Python SDK snippet (exa.answer or exa_py) if present. Tool result summary: # Exa /answer Endpoint Summary **Full URL:** `https://api.exa.ai/answer` **HTTP Method:** POST **Authentication Header:** `x-api-key` (or `Authorization: Bearer <key>`) **Request Parameters:** - `query` (string, required): Natural-language question or instructions - `text` (boolean, optional): Returns full page text when true - `stream` (boolean, optional): Enables server-sent events streaming - `outputSchema` (objec Agent context: I'll dispatch research agents to actually consult provider documentation in parallel, rather than making many inline web calls myself.
Query/prompt: Extract the Sonar model names (sonar, sonar-pro, sonar-reasoning), their per-token and per-request pricing, and the chat completions endpoint. Note whether responses include citations/search_results. Agent context: I'll dispatch research agents to actually consult provider documentation in parallel, rather than making many inline web calls myself. Fetch prompt: Extract the Sonar model names (sonar, sonar-pro, sonar-reasoning), their per-token and per-request pricing, and the chat completions endpoint. Note whether responses include citations/search_results. Tool result summary: # Sonar Models Overview Based on the documentation provided, I can identify the following Sonar models: 1. **Sonar** - "Lightweight, cost-effective search model with grounding" 2. **Sonar Pro** - "Advanced search offering with grounding, supporting complex queries and follow-ups" 3. **Sonar Reasoning Pro** - "Precise reasoning offering with Chain of Thought (CoT)" 4. **Sonar Deep Research** - "Expert-level research m Agent context: I'll dispatch research agents to actually consult provider documentation in parallel, rather than making many inline web calls myself.
Query/prompt: Extract Exa pricing: free credits per month for new accounts, cost per 1000 search requests, cost per 1000 contents requests, cost for answer endpoint. Quote exact dollar numbers. Agent context: I'll dispatch research agents to actually consult provider documentation in parallel, rather than making many inline web calls myself. Fetch prompt: Extract Exa pricing: free credits per month for new accounts, cost per 1000 search requests, cost per 1000 contents requests, cost for answer endpoint. Quote exact dollar numbers. Tool result summary: Request failed with status code 404 Agent context: I'll dispatch research agents to actually consult provider documentation in parallel, rather than making many inline web calls myself.
Query/prompt: Extract Tavily pricing and rate limits: free credits per month, cost per 1000 credits/requests on paid plans, dev vs production rate limits (requests per minute). Quote exact numbers. Agent context: I'll dispatch research agents to actually consult provider documentation in parallel, rather than making many inline web calls myself. Fetch prompt: Extract Tavily pricing and rate limits: free credits per month, cost per 1000 credits/requests on paid plans, dev vs production rate limits (requests per minute). Quote exact numbers. Tool result summary: # Tavily Pricing & Credits Summary ## Free Credits "You get 1,000 free API Credits every month. **No credit card required.**" ## Pay-as-You-Go Pricing - Standard rate: $0.008 per credit - Monthly plans range from $0.0075 to $0.005 per credit depending on volume ## Monthly Plans (Cost per Credit) - Project (4,000 credits): $0.0075/credit - Bootstrap (15,000 credits): $0.0067/credit - Startup (38,000 credits): $0.0058/ Agent context: I'll dispatch research agents to actually consult provider documentation in parallel, rather than making many inline web calls myself.
Query/prompt: Brave Search API pricing Free plan Data for AI 1000 requests per month queries per second rate limit 2026 Agent context: I'll dispatch research agents to actually consult provider documentation in parallel, rather than making many inline web calls myself. Query: Brave Search API pricing Free plan Data for AI 1000 requests per month queries per second rate limit 2026 9 search result links captured Tool result summary: Based on the web search results, here's what I found about Brave Search API pricing and the free plan details: ## Free Plan Overview Brave Search API free tier includes $5 prepaid metered credits ($0.003-$0.005 per query depending on endpoint). As of early 2026, new users receive $5 in monthly credits (roughly 1,000 queries) rather than a dedicated free plan. ## Key Pricing Information - **Per-Query Costs**: Brave Se Agent context: I'll dispatch research agents to actually consult provider documentation in parallel, rather than making many inline web calls myself.
Query/prompt: Extract Serper pricing: free credits/queries, cost per credit and per 1000 queries for each plan tier, and any rate/throughput limits. Agent context: I'll dispatch research agents to actually consult provider documentation in parallel, rather than making many inline web calls myself. Fetch prompt: Extract Serper pricing: free credits/queries, cost per credit and per 1000 queries for each plan tier, and any rate/throughput limits. Tool result summary: Request failed with status code 404 Agent context: I'll dispatch research agents to actually consult provider documentation in parallel, rather than making many inline web calls myself.
Query/prompt: Extract Perplexity Sonar API pricing: per-million-token input/output prices for sonar and sonar-pro, per-1000-request search fees, any free monthly credits (e.g. $5 for Pro subscribers), and rate limits for sonar models. Agent context: I'll dispatch research agents to actually consult provider documentation in parallel, rather than making many inline web calls myself. Fetch prompt: Extract Perplexity Sonar API pricing: per-million-token input/output prices for sonar and sonar-pro, per-1000-request search fees, any free monthly credits (e.g. $5 for Pro subscribers), and rate limits for sonar models. Tool result summary: # Perplexity Sonar API Pricing Summary ## Token Pricing (Per Million Tokens) **Sonar:** - Input: $1/1M tokens - Output: $1/1M tokens **Sonar Pro:** - Input: $3/1M tokens - Output: $15/1M tokens ## Request Fees (Per 1,000 Requests) Search context determines pricing tiers: **Sonar:** - Low Context: $5 - Medium Context: $8 - High Context: $12 **Sonar Pro:** - Low Context: $6 - Medium Context: $10 - High Context: $14 ## Agent context: I'll dispatch research agents to actually consult provider documentation in parallel, rather than making many inline web calls myself.
Query/prompt: Extract Exa rate limits (requests per second/minute) and any free tier credit amount mentioned. Quote exact numbers. Agent context: I'll dispatch research agents to actually consult provider documentation in parallel, rather than making many inline web calls myself. Fetch prompt: Extract Exa rate limits (requests per second/minute) and any free tier credit amount mentioned. Quote exact numbers. Tool result summary: # Exa API Rate Limits Based on the documentation provided, here are the rate limits: **QPS (Queries Per Second) Limits:** - "/search" endpoint: `"10 QPS"` - "/contents" endpoint: `"100 QPS"` - "/answer" endpoint: `"10 QPS"` - Legacy Research API (`/research/v1`): `"15 concurrent tasks"` **Free Tier Credit Amount:** No free tier credit information is mentioned in the provided content. **Additional Note:** The document Agent context: I'll dispatch research agents to actually consult provider documentation in parallel, rather than making many inline web calls myself.
Query/prompt: Exa.ai pricing free credits $10 search $5 per 1000 contents per 1000 answer cost 2026 Agent context: I'll dispatch research agents to actually consult provider documentation in parallel, rather than making many inline web calls myself. Query: Exa.ai pricing free credits $10 search $5 per 1000 contents per 1000 answer cost 2026 10 search result links captured Tool result summary: Based on the search results, here's what I found about Exa.ai pricing in 2026: ## Free Credits Exa's API pricing starts with $10 in free credits, though Exa's pricing page also offers the ability to run up to 1,000 requests per month for free. ## Search Pricing Search with contents costs $7 per 1000 requests with 10 results. Additionally, contents for 10 search results per request are included for free. ## Content Pr Agent context: I'll dispatch research agents to actually consult provider documentation in parallel, rather than making many inline web calls myself.
Query/prompt: Tavily API rate limits requests per minute dev plan production plan 100 RPM Agent context: I'll dispatch research agents to actually consult provider documentation in parallel, rather than making many inline web calls myself. Query: Tavily API rate limits requests per minute dev plan production plan 100 RPM 10 search result links captured Tool result summary: Based on the search results, here's what I found about Tavily API rate limits: ## Development Plan The Development environment allows up to 100 requests per minute, which is ideal for experimenting with API calls and integrating features without impacting your production environment. ## Production Plan The Production environment offers a higher rate limit of 1,000 requests per minute, allowing you to scale your usage Agent context: I'll dispatch research agents to actually consult provider documentation in parallel, rather than making many inline web calls myself. Provider mentions: openai
Query/prompt: serper.dev pricing 2500 free credits cost per 1000 queries api.serper.dev X-API-KEY endpoint /search Agent context: I'll dispatch research agents to actually consult provider documentation in parallel, rather than making many inline web calls myself. Query: serper.dev pricing 2500 free credits cost per 1000 queries api.serper.dev X-API-KEY endpoint /search 10 search result links captured Tool result summary: Based on the search results, here's information about Serper.dev pricing: ## Free Credits Serper includes 2,500 free credits, and all credits are valid for 6 months. ## Pricing Per 1,000 Queries Serper's pricing starts at $0.30 per 1,000 queries. More specifically, credit-based pricing ranges from $1.00/1K queries down to $0.30/1K at scale. ## Specific Pricing Tiers The base pricing is $50 for 50,000 credits (approxi Agent context: I'll dispatch research agents to actually consult provider documentation in parallel, rather than making many inline web calls myself.
Query/prompt: Extract exact Exa API pricing: free credits on signup, cost per 1000 search requests (basic vs neural/auto with 1-25 results), cost per 1000 contents pages, cost per 1000 answer requests. Quote exact dollar figures. Agent context: I'll dispatch research agents to actually consult provider documentation in parallel, rather than making many inline web calls myself. Fetch prompt: Extract exact Exa API pricing: free credits on signup, cost per 1000 search requests (basic vs neural/auto with 1-25 results), cost per 1000 contents pages, cost per 1000 answer requests. Quote exact dollar figures. Tool result summary: # Exa API Pricing Summary **Free Tier:** "Run up to 1,000 requests per month for free" **Search Requests:** - Basic Search: "$7/1k requests" - Deep Search: "$12–15/1k requests" **Content Pages:** - Contents API: "$1/1k pages per content type" **Monitoring:** - Monitors: "$15/1k requests" **Additional Costs:** - "Cost per additional result above 10(per 1k requests)" is "$1" across multiple endpoints - "AI page summari Agent context: I'll dispatch research agents to actually consult provider documentation in parallel, rather than making many inline web calls myself.
Agent context: ## Recommendation: **Tavily** For py-xiaozhi specifically — a Python async voice assistant that **already has its own LLM** (Zhipu glm) in the pipeline and exposes capabilities as MCP `@mcp_tool` functions returning JSON strings — Tavily is the best fit. **Why Tavily wins here** - One `POST /search` call returns a synthesized `answer` **plus** cited `results[]` and clean markdown via `include_raw_content` — exactly the grounded text you feed back to the existing voice LLM. No SERP-parsing glue. - **Best recurring free tier:** 1,000 credits/month, no card — ideal for an MIT hobbyist project. Cheap PAYG ($0.008/credit). - Simple REST + `tavily-python`, drops straight into the `aiohttp`/ConfigManager pattern as a new MCP tool. 100 RPM dev / 1,000 RPM prod. - `topic="news"` gives currency for "what's happening now" voice queries. **Main alternatives considered** | Provider | Verdict for this repo | |---|---| | **Perplexity Sonar** | Returns the cleanest cited answer, but it's a *second LLM* — redundant since py-xiaozhi already composes replies with its own LLM. Higher cost/latency, no recurring free tier. | | **Exa** | Excellent neural/semantic retrieval + `/answer` streaming, but pricier ($7–15/1k), better for document discovery than fast factual voice lookups; only one-time free credits. | | **Serper** | Cheapest (2,500 free, then ~$0.30–1/1k) and real Google data, but raw SERP only — you'd build extraction + grounding yourself. No synthesized answer/citations. | | **Brave Search API** | Independent index (privacy), but removed its free tier and the basic endpoint is SERP-only; grounded output needs the paid Answers/LLM-Context tier. | **Documentation I actually consulted** - Tavily: `docs.tavily.com` — search endpoint, quickstart, api-credits, rate-limits - Exa: `exa.ai/docs` — getting-started, `/answer`, rate-limits, pricing - Brave: `api-dashboard.search.brave.com` — web-search get-started, pricing - Serper: `serper.dev` — homepage + playground - Perplexity: `docs.perplexity.ai` — overview, models, pricing **One caveat for this project:** Tavily/Exa/Brave index the western web. Since py-xiaozhi is Chinese-facing, validate Chinese-language coverage before committing; if it's weak, a China-local API (e.g. Bocha/博查) is worth evaluating as a fallback. Want me to create a Trellis task and implement the Tavily MCP tool (`src/mcp/tools/`) wired into ConfigManager? ## Recommendation: **Tavily** For py-xiaozhi specifically — a Python async voice assistant that **already has its own LLM** (Zhipu glm) in the pipeline and exposes capabilities as MCP `@mcp_tool` functions returning JSON strings — Tavily is the best fit. **Why Tavily wins here** - One `POST /search` call returns a synthesized `answer` **plus** cited `results[]` and clean markdown via `include_raw_content` — exactly the grounded text you feed back to the existing voice LLM. No SERP-parsing glue. - **Best recurring free tier:** 1,000 credits/month, no card — ideal for an MIT hobbyist project. Cheap PAYG ($0.008/credit). - Simple REST + `tavily-python`, drops straight into the `aiohttp`/ConfigManager pattern as a new MCP tool. 100 RPM dev / 1,000 RPM prod. - `topic="news"` gives currency for "what's happening now" voice queries. **Main alternatives considered** | Provider | Verdict for this repo | |---|---| | **Perplexity Sonar** | Returns the cleanest cited answer, but it's a *second LLM* — redundant since py-xiaozhi already composes replies with its own LLM. Higher cost/latency, no recurring free tier. | | **Exa** | Excellent neural/semantic retrieval + `/answer` streaming, but pric
## Recommendation: **Tavily** For py-xiaozhi specifically — a Python async voice assistant that **already has its own LLM** (Zhipu glm) in the pipeline and exposes capabilities as MCP `@mcp_tool` functions returning JSON strings — Tavily is the best fit. **Why Tavily wins here** - One `POST /search` call returns a synthesized `answer` **plus** cited `results[]` and clean markdown via `include_raw_content` — exactly the grounded text you feed back to the existing voice LLM. No SERP-parsing glue. - **Best recurring free tier:** 1,000 credits/month, no card — ideal for an MIT hobbyist project. Cheap PAYG ($0.008/credit). - Simple REST + `tavily-python`, drops straight into the `aiohttp`/ConfigManager pattern as a new MCP tool. 100 RPM dev / 1,000 RPM prod. - `topic="news"` gives currency for "what's happening now" voice queries. **Main alternatives considered** | Provider | Verdict for this repo | |---|---| | **Perplexity Sonar** | Returns the cleanest cited answer, but it's a *second LLM* — redundant since py-xiaozhi already composes replies with its own LLM. Higher cost/latency, no recurring free tier. | | **Exa** | Excellent neural/semantic retrieval + `/answer` streaming, but pricier ($7–15/1k), better for document discovery than fast factual voice lookups; only one-time free credits. | | **Serper** | Cheapest (2,500 free, then ~$0.30–1/1k) and real Google data, but raw SERP o