Spaces:
Runtime error
Runtime error
| #!/usr/bin/env python | |
| # -*- coding: utf-8 -*- | |
| # From: https://github.com/geekan/MetaGPT/blob/main/metagpt/provider/base_gpt_api.py | |
| from abc import abstractmethod | |
| from typing import Optional | |
| from autoagents.system.logs import logger | |
| from autoagents.system.provider.base_chatbot import BaseChatbot | |
| class BaseGPTAPI(BaseChatbot): | |
| """GPT API abstract class, requiring all inheritors to provide a series of standard capabilities""" | |
| system_prompt = 'You are a helpful assistant.' | |
| def _user_msg(self, msg: str) -> dict[str, str]: | |
| return {"role": "user", "content": msg} | |
| def _assistant_msg(self, msg: str) -> dict[str, str]: | |
| return {"role": "assistant", "content": msg} | |
| def _system_msg(self, msg: str) -> dict[str, str]: | |
| return {"role": "system", "content": msg} | |
| def _system_msgs(self, msgs: list[str]) -> list[dict[str, str]]: | |
| return [self._system_msg(msg) for msg in msgs] | |
| def _default_system_msg(self): | |
| return self._system_msg(self.system_prompt) | |
| def ask(self, msg: str) -> str: | |
| message = [self._default_system_msg(), self._user_msg(msg)] | |
| rsp = self.completion(message) | |
| return self.get_choice_text(rsp) | |
| async def aask(self, msg: str, system_msgs: Optional[list[str]] = None) -> str: | |
| if system_msgs: | |
| message = self._system_msgs(system_msgs) + [self._user_msg(msg)] | |
| else: | |
| message = [self._default_system_msg(), self._user_msg(msg)] | |
| rsp = await self.acompletion_text(message, stream=True) | |
| logger.debug(message) | |
| # logger.debug(rsp) | |
| return rsp | |
| def _extract_assistant_rsp(self, context): | |
| return "\n".join([i["content"] for i in context if i["role"] == "assistant"]) | |
| def ask_batch(self, msgs: list) -> str: | |
| context = [] | |
| for msg in msgs: | |
| umsg = self._user_msg(msg) | |
| context.append(umsg) | |
| rsp = self.completion(context) | |
| rsp_text = self.get_choice_text(rsp) | |
| context.append(self._assistant_msg(rsp_text)) | |
| return self._extract_assistant_rsp(context) | |
| async def aask_batch(self, msgs: list) -> str: | |
| """Sequential questioning""" | |
| context = [] | |
| for msg in msgs: | |
| umsg = self._user_msg(msg) | |
| context.append(umsg) | |
| rsp_text = await self.acompletion_text(context) | |
| context.append(self._assistant_msg(rsp_text)) | |
| return self._extract_assistant_rsp(context) | |
| def ask_code(self, msgs: list[str]) -> str: | |
| """FIXME: No code segment filtering has been done here, and all results are actually displayed""" | |
| rsp_text = self.ask_batch(msgs) | |
| return rsp_text | |
| async def aask_code(self, msgs: list[str]) -> str: | |
| """FIXME: No code segment filtering has been done here, and all results are actually displayed""" | |
| rsp_text = await self.aask_batch(msgs) | |
| return rsp_text | |
| def completion(self, messages: list[dict]): | |
| """All GPTAPIs are required to provide the standard OpenAI completion interface | |
| [ | |
| {"role": "system", "content": "You are a helpful assistant."}, | |
| {"role": "user", "content": "hello, show me python hello world code"}, | |
| # {"role": "assistant", "content": ...}, # If there is an answer in the history, also include it | |
| ] | |
| """ | |
| async def acompletion(self, messages: list[dict]): | |
| """Asynchronous version of completion | |
| All GPTAPIs are required to provide the standard OpenAI completion interface | |
| [ | |
| {"role": "system", "content": "You are a helpful assistant."}, | |
| {"role": "user", "content": "hello, show me python hello world code"}, | |
| # {"role": "assistant", "content": ...}, # If there is an answer in the history, also include it | |
| ] | |
| """ | |
| async def acompletion_text(self, messages: list[dict], stream=False) -> str: | |
| """Asynchronous version of completion. Return str. Support stream-print""" | |
| def get_choice_text(self, rsp: dict) -> str: | |
| """Required to provide the first text of choice""" | |
| return rsp.get("choices")[0]["message"]["content"] | |
| def messages_to_prompt(self, messages: list[dict]): | |
| """[{"role": "user", "content": msg}] to user: <msg> etc.""" | |
| return '\n'.join([f"{i['role']}: {i['content']}" for i in messages]) | |
| def messages_to_dict(self, messages): | |
| """objects to [{"role": "user", "content": msg}] etc.""" | |
| return [i.to_dict() for i in messages] | |