Spaces:
Runtime error
Runtime error
| from typing import Dict, List, Literal, TypedDict | |
| from models import Model | |
| from pybars import Compiler | |
| compiler = Compiler() | |
| class Turn(TypedDict): | |
| role: Literal["user", "assistant", "system"] | |
| content: str | |
| def chatmsg(message:str, role:Literal["user", "assistant", "system"]): | |
| return {"role": role, "content": message} | |
| conversation=List[Turn] | |
| class ChatModel: | |
| def __init__(self,model:Model,sysprompt:str): | |
| self.setModel(model) | |
| self.setSysPrompt(sysprompt) | |
| def __call__(self, msg:str): | |
| raise NotImplementedError | |
| def getconversation(self) -> conversation: | |
| raise NotImplementedError | |
| def conversationend(self) -> bool: | |
| raise NotImplementedError | |
| def setconversation(self,conversation:conversation): | |
| raise NotImplementedError | |
| def setSysPrompt(self,sysprompt:str): | |
| def _eq(this, a,b): | |
| return a==b | |
| self.sysprompt=compiler.compile(sysprompt)({ | |
| "model":self.name | |
| },helpers={"eq":_eq}) | |
| print(self.name+" SystemPrompt:\n"+self.sysprompt) | |
| def setModel(self,model:Model): | |
| self.model=model | |
| class SwapChatModel(ChatModel): | |
| def __init__(self,model:Model,sysprompt:str): | |
| super().__init__(model,sysprompt) | |
| self.conversation=[] | |
| def __call__(self, msg:str): | |
| self.conversation.append(chatmsg(msg,"assistant")) | |
| if "End of conversation." in [i["content"] for i in self.conversation]: | |
| return | |
| prompt="".join([ | |
| self.model.start(), | |
| self.model.conv([chatmsg(self.sysprompt,"system")]), | |
| self.model.conv(self.conversation),self.model.starttok("user") | |
| ]) | |
| ret=self.model(prompt, stop=[".","\n \n","?\n",".\n","tile|>","\n"],max_tokens=100) | |
| comp=ret["choices"][0]["text"] | |
| if("<|end" in comp): | |
| self.conversation.append(chatmsg(comp.removesuffix("<|end"),"user")) | |
| self.conversation.append(chatmsg("End of conversation.","user")) | |
| else: | |
| self.conversation.append(chatmsg(comp,"user")) | |
| def getconversation(self) -> conversation: | |
| return self.conversation | |
| def conversationend(self) -> bool: | |
| return "End of conversation." in [i["content"] for i in self.conversation] | |
| def setconversation(self,conversation:conversation): | |
| self.conversation=conversation | |
| SwapChatModel.name="SwapChat" | |
| class InquiryChatModel(SwapChatModel): | |
| def __init__(self,model:Model,sysprompt:str): | |
| super().__init__(model,sysprompt) | |
| def inquire(self,msg): | |
| prompt="".join([ | |
| self.model.start(), | |
| self.model.conv([chatmsg(self.sysprompt,"system")]), | |
| self.model.conv(self.conversation), | |
| self.model.conv([chatmsg(msg,"assistant")]), | |
| self.model.starttok("system"), | |
| "Is this conversation complete(true/false)?\n" | |
| ]) | |
| ret=self.model(prompt, stop=[".","\n \n","?\n",".\n","tile|>","\n"],max_tokens=10) | |
| print("system prompt:",ret["choices"][0]["text"]) | |
| if "true" in ret["choices"][0]["text"].lower(): | |
| self.conversation.append(chatmsg(msg,"assistant")) | |
| self.conversation.append(chatmsg("End of conversation.","user")) | |
| def __call__(self, msg:str): | |
| self.inquire(msg) | |
| super().__call__(msg) | |
| InquiryChatModel.name="InquiryChat" | |
| models=[SwapChatModel,InquiryChatModel] |