import yaml import os from smolagents import GradioUI, CodeAgent from openai import OpenAI # 我们这里用 OpenAI 作为接口调用的示范 # 获取当前目录路径 CURRENT_DIR = os.path.dirname(os.path.abspath(__file__)) # 引入你的工具类 from tools.web_search import DuckDuckGoSearchTool as WebSearch from tools.visit_webpage import VisitWebpageTool as VisitWebpage from tools.suggest_menu import SimpleTool as SuggestMenu from tools.catering_service_tool import SimpleTool as CateringServiceTool from tools.superhero_party_theme_generator import SuperheroPartyThemeTool as SuperheroPartyThemeGenerator from tools.final_answer import FinalAnswerTool as FinalAnswer # 获取火山平台配置 VOLC_API_KEY = os.getenv("VOLC_API_KEY") VOLC_BASE_URL = os.getenv("VOLC_BASE_URL") VOLC_BOT = os.getenv("VOLC_BOT") # 创建火山平台客户端(OpenAI兼容方式) client = OpenAI(api_key=VOLC_API_KEY, base_url=VOLC_BASE_URL) def _to_openai_messages(messages): out = [] for m in messages: if isinstance(m, dict): out.append({"role": m.get("role"), "content": m.get("content")}) continue role = getattr(m, "role", None) or "user" content = getattr(m, "content", None) if content is None: # 常见兜底字段 content = getattr(m, "text", None) or getattr(m, "message", None) if content is None: content = str(m) out.append({"role": role, "content": content}) return out class VolcanoModel: def _normalize_messages(self, messages): allowed = {"system", "user", "assistant", "tool"} role_map = { # smolagents / 其他框架常见内部角色 "tool-call": "assistant", "tool_call": "assistant", "function_call": "assistant", "observation": "tool", # 有些框架用 observation 表示工具输出 } out = [] for m in messages: # m 可能是 ChatMessage 对象,也可能是 dict if isinstance(m, dict): role = m.get("role", "user") content = m.get("content", "") else: role = getattr(m, "role", "user") content = getattr(m, "content", "") or "" role = role_map.get(role, role) # 兜底:任何不在白名单的 role 都当 assistant(更安全) if role not in allowed: role = "assistant" out.append({"role": role, "content": content}) return out def generate(self, messages, **kwargs): norm_messages = self._normalize_messages(messages) response = client.chat.completions.create( model=VOLC_BOT, messages=norm_messages, temperature=kwargs.get("temperature", None), max_tokens=kwargs.get("max_tokens", None), ) class Result: content = response.choices[0].message.content token_usage = None # 或按你之前那样映射 usage return Result() # 读取prompt配置 with open(os.path.join(CURRENT_DIR, "prompts.yaml"), 'r') as stream: prompt_templates = yaml.safe_load(stream) # 初始化 CodeAgent agent = CodeAgent( model=VolcanoModel(), # 使用火山模型 tools=[WebSearch(), VisitWebpage(), SuggestMenu(), CateringServiceTool(), SuperheroPartyThemeGenerator()], managed_agents=[], max_steps=10, verbosity_level=2, planning_interval=None, name=None, description=None, executor_type='local', executor_kwargs={}, max_print_outputs_length=None, prompt_templates=prompt_templates ) # 启动 Gradio UI11 if __name__ == "__main__": GradioUI(agent).launch(share=False, ssr_mode=False)