CoolFace
Apppublic

Shanzhicheng/LifeAgent

sourceHugging Faceupdated 7mo agoView on Hugging Face
0likes
app.py114 linesDownload Raw Back to root
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)