Shanzhicheng/LifeAgent
0
1import yaml2import os3from smolagents import GradioUI, CodeAgent4from openai import OpenAI # 我们这里用 OpenAI 作为接口调用的示范5 6# 获取当前目录路径7CURRENT_DIR = os.path.dirname(os.path.abspath(__file__))8 9# 引入你的工具类10from tools.web_search import DuckDuckGoSearchTool as WebSearch11from tools.visit_webpage import VisitWebpageTool as VisitWebpage12from tools.suggest_menu import SimpleTool as SuggestMenu13from tools.catering_service_tool import SimpleTool as CateringServiceTool14from tools.superhero_party_theme_generator import SuperheroPartyThemeTool as SuperheroPartyThemeGenerator15from tools.final_answer import FinalAnswerTool as FinalAnswer16 17# 获取火山平台配置18VOLC_API_KEY = os.getenv("VOLC_API_KEY")19VOLC_BASE_URL = os.getenv("VOLC_BASE_URL")20VOLC_BOT = os.getenv("VOLC_BOT")21 22# 创建火山平台客户端(OpenAI兼容方式)23client = OpenAI(api_key=VOLC_API_KEY, base_url=VOLC_BASE_URL)24 25def _to_openai_messages(messages):26 out = []27 for m in messages:28 if isinstance(m, dict):29 out.append({"role": m.get("role"), "content": m.get("content")})30 continue31 32 role = getattr(m, "role", None) or "user"33 content = getattr(m, "content", None)34 35 if content is None:36 # 常见兜底字段37 content = getattr(m, "text", None) or getattr(m, "message", None)38 39 if content is None:40 content = str(m)41 42 out.append({"role": role, "content": content})43 return out44 45class VolcanoModel:46 def _normalize_messages(self, messages):47 allowed = {"system", "user", "assistant", "tool"}48 role_map = {49 # smolagents / 其他框架常见内部角色50 "tool-call": "assistant",51 "tool_call": "assistant",52 "function_call": "assistant",53 "observation": "tool", # 有些框架用 observation 表示工具输出54 }55 56 out = []57 for m in messages:58 # m 可能是 ChatMessage 对象,也可能是 dict59 if isinstance(m, dict):60 role = m.get("role", "user")61 content = m.get("content", "")62 else:63 role = getattr(m, "role", "user")64 content = getattr(m, "content", "") or ""65 66 role = role_map.get(role, role)67 68 # 兜底:任何不在白名单的 role 都当 assistant(更安全)69 if role not in allowed:70 role = "assistant"71 72 out.append({"role": role, "content": content})73 74 return out75 76 def generate(self, messages, **kwargs):77 norm_messages = self._normalize_messages(messages)78 79 response = client.chat.completions.create(80 model=VOLC_BOT,81 messages=norm_messages,82 temperature=kwargs.get("temperature", None),83 max_tokens=kwargs.get("max_tokens", None),84 )85 86 class Result:87 content = response.choices[0].message.content88 token_usage = None # 或按你之前那样映射 usage89 90 return Result()91 92# 读取prompt配置93with open(os.path.join(CURRENT_DIR, "prompts.yaml"), 'r') as stream:94 prompt_templates = yaml.safe_load(stream)95 96# 初始化 CodeAgent97agent = CodeAgent(98 model=VolcanoModel(), # 使用火山模型99 tools=[WebSearch(), VisitWebpage(), SuggestMenu(), CateringServiceTool(), SuperheroPartyThemeGenerator()],100 managed_agents=[],101 max_steps=10,102 verbosity_level=2,103 planning_interval=None,104 name=None,105 description=None,106 executor_type='local',107 executor_kwargs={},108 max_print_outputs_length=None,109 prompt_templates=prompt_templates110)111 112# 启动 Gradio UI11113if __name__ == "__main__":114 GradioUI(agent).launch(share=False, ssr_mode=False)