| @@ -0,0 +1,112 @@ | |||
| #! /usr/bin/python | |||
| import tornado.web | |||
| import tornado.ioloop | |||
| import tornado.httpserver | |||
| import tornado.options | |||
| import os | |||
| import datetime | |||
| import openai | |||
| import asyncio | |||
| from tornado.web import RequestHandler | |||
| from tornado.options import define,options | |||
| from tornado.websocket import WebSocketHandler | |||
| import openai_async | |||
| import config | |||
| import json | |||
| import traceback | |||
| import aiohttp | |||
| def clearBaiChuanContent(content): | |||
| for ck in config.agentBaiChuanFilterMoel['filterKeys']: | |||
| content = content.replace(ck,'xx') | |||
| return content | |||
| async def talkBaiChuanWithStream(self,message): | |||
| print("{} says {}".format(self.request.remote_ip,message)) | |||
| #url = "https://api.baichuan-ai.com/v1/chat/completions" | |||
| #api_key = config.agentServer['agentBaiChuanApiKey'] | |||
| url = "https://api.baichuan-ai.com/v1/chat/completions" | |||
| api_key = "9f7d5847897f8090195cdc2c3249d0a7" | |||
| try: | |||
| _msg = json.loads(message) | |||
| try: | |||
| if 'model' in _msg : | |||
| _baichuanModel = _msg['model'] | |||
| _real_msg = _msg['messages'] | |||
| else: | |||
| _baichuanModel = 'Baichuan2' | |||
| _real_msg = _msg | |||
| except Exception as gmex: | |||
| _baichuanModel = 'Baichuan2' | |||
| _real_msg = _msg | |||
| _data = { | |||
| "model": _baichuanModel, | |||
| "messages": _real_msg, | |||
| "stream": True | |||
| } | |||
| #json_data = json.dumps(_data) | |||
| headers = { | |||
| "Content-Type": "application/json", | |||
| "Authorization": "Bearer " + api_key | |||
| } | |||
| #http_client = tornado.httpclient.AsyncHTTPClient() | |||
| async with aiohttp.ClientSession() as http_client: | |||
| async with http_client.post(url,headers=headers,json=_data) as resp: | |||
| isDone=False | |||
| while True: | |||
| chunk = await resp.content.read(2048) | |||
| if not chunk: | |||
| break | |||
| chunk_str = chunk.decode() | |||
| #print('chunk_str {}',chunk_str) | |||
| con_list = chunk_str.strip('\n').split('data:') | |||
| for con in con_list: | |||
| con = con.strip() | |||
| if con == "": | |||
| continue | |||
| elif con == '[DONE]': | |||
| isDone=True | |||
| break | |||
| else: | |||
| con_dict = json.loads(con) | |||
| for con_cho in con_dict['choices']: | |||
| self.my_replay_content=self.my_replay_content+con_cho['delta']['content'] | |||
| #print('resp',resp) | |||
| #print("1111111111111111111") | |||
| print("response {}",self.my_replay_content) | |||
| if config.agentBaiChuanFilterMoel['isOpen']: | |||
| if resp is not None: | |||
| cContent = clearBaiChuanContent(self.my_replay_content) | |||
| self.my_replay_content='' | |||
| if isDone: | |||
| cContent = cContent+"___talk_end___" | |||
| await self.write_message(cContent) | |||
| #await self.write_message(currentLineContents) | |||
| else: | |||
| if role_conent is not None: | |||
| print('') | |||
| else: | |||
| self.my_replay_content='' | |||
| await self.write_message("___talk_end___") | |||
| else: | |||
| if resp is not None: | |||
| _cont = self.my_replay_content | |||
| if isDone: | |||
| _cont = _cont+"___talk_end___" | |||
| self.my_replay_content='' | |||
| await self.write_message(_cont) | |||
| else: | |||
| self.my_replay_content='' | |||
| await self.write_message("___talk_end___") | |||
| else: | |||
| self.my_replay_content='' | |||
| await self.write_message("___talk_end___") | |||
| except Exception as es: | |||
| print('onMessage error',es) | |||
| self.close() | |||
| @@ -0,0 +1,41 @@ | |||
| #! /usr/bin/python | |||
| import requests | |||
| import json | |||
| def do_request(): | |||
| url = "https://api.baichuan-ai.com/v1/chat/completions" | |||
| api_key = "9f7d5847897f8090195cdc2c3249d0a7" | |||
| data = { | |||
| "model": "Baichuan2", | |||
| "messages": [ | |||
| { | |||
| "role": "user", | |||
| "content": "世界第一高峰是" | |||
| } | |||
| ], | |||
| "stream": True | |||
| } | |||
| json_data = json.dumps(data) | |||
| headers = { | |||
| "Content-Type": "application/json", | |||
| "Authorization": "Bearer " + api_key | |||
| } | |||
| response = requests.post(url, data=json_data, headers=headers, timeout=60) | |||
| if response.status_code == 200: | |||
| print("请求成功!") | |||
| print("响应body:", response.text) | |||
| print("请求成功,X-BC-Request-Id:", response.headers.get("X-BC-Request-Id")) | |||
| else: | |||
| print("请求失败,状态码:", response.status_code) | |||
| print("请求失败,body:", response.text) | |||
| print("请求失败,X-BC-Request-Id:", response.headers.get("X-BC-Request-Id")) | |||
| if __name__ == "__main__": | |||
| do_request() | |||
| @@ -0,0 +1,30 @@ | |||
| #! /usr/bin/python | |||
| #服务配置### | |||
| agentServer = { | |||
| 'port':9999, | |||
| 'threads':1, | |||
| 'agentApiKey':'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', | |||
| 'agentBaiChuanApiKey':'9f7d5847897f8090195cdc2c3249d0a7' | |||
| } | |||
| ####过滤### | |||
| agentFilterMoel = { | |||
| 'isOpen':True, | |||
| 'filterKeys':['Gpt','gPt','gpT','GPt','GpT','GPT','gpt','Openai','openAI','oPENAI','OpEnAi','OPENAI','oPenAi','OpENAI','openai','oPEnAi','OpEnai','oPENai','OPENai','OpENai','openAi','oPENAi','OpENaI','OPENaI','oPEnaI','OpEnAI','OPENAI','OpenAI','OpenAi'], | |||
| 'oneMessageSplit':[',','.',',','。','?','?','!','!'] | |||
| } | |||
| agentBaiChuanFilterMoel = { | |||
| 'isOpen':False, | |||
| 'filterKeys':['Gpt','gPt','gpT','GPt','GpT','GPT','gpt','Openai','openAI','oPENAI','OpEnAi','OPENAI','oPenAi','OpENAI','openai','oPEnAi','OpEnai','oPENai','OPENai','OpENai','openAi','oPENAi','OpENaI','OPENaI','oPEnaI','OpEnAI','OPENAI','OpenAI','OpenAi'], | |||
| 'oneMessageSplit':[',','.',',','。','?','?','!','!'] | |||
| } | |||
| ###上下文#### | |||
| agentTextual = { | |||
| 'isOpen':False, | |||
| 'talkCounts':3, | |||
| 'resultCounts':3 | |||
| } | |||
| @@ -0,0 +1,130 @@ | |||
| #! /usr/bin/python | |||
| import tornado.web | |||
| import tornado.ioloop | |||
| import tornado.httpserver | |||
| import tornado.options | |||
| import os | |||
| import datetime | |||
| import openai | |||
| import asyncio | |||
| from tornado.web import RequestHandler | |||
| from tornado.options import define,options | |||
| from tornado.websocket import WebSocketHandler | |||
| import openai_async | |||
| import config | |||
| import json | |||
| openai.api_key = config.agentServer['agentApiKey']; | |||
| def clearContent(content): | |||
| for ck in config.agentFilterMoel['filterKeys']: | |||
| content = content.replace(ck,'SmartChat') | |||
| return content | |||
| async def talkGPTWithStream(self,message): | |||
| print("{} says {}".format(self.request.remote_ip,message)) | |||
| try: | |||
| _msg = json.loads(message) | |||
| try: | |||
| if 'model' in _msg : | |||
| _gptModel = _msg['model'] | |||
| _real_msg = _msg['messages'] | |||
| #print("msg is {}".format(type(_real_msg))) | |||
| if _gptModel == '4': | |||
| _gptModel = 'gpt-4-0314' | |||
| elif _gptModel == '3': | |||
| _gptModel = 'gpt-3.5-turbo' | |||
| else: | |||
| print(_gptModel) | |||
| #_gptModel = 'gpt-3.5-turbo' | |||
| else: | |||
| _gptModel = 'gpt-3.5-turbo' | |||
| _real_msg = _msg | |||
| except Exception as gmex: | |||
| _gptModel = 'gpt-3.5-turbo' | |||
| _real_msg = _msg | |||
| #print(_msg) | |||
| async for chunk in await openai.ChatCompletion.acreate( | |||
| model=_gptModel, | |||
| #model='gpt-4-0314', | |||
| #messages=[{'role': 'user', 'content': message}], | |||
| messages=_real_msg, | |||
| temperature=0.8, | |||
| max_tokens=4000, | |||
| stream=True # this time, we set stream=True | |||
| ): | |||
| content = chunk["choices"][0].get("delta", {}).get("content") | |||
| role_conent = chunk["choices"][0].get("delta", {}).get("role") | |||
| #print("response {}",content) | |||
| if config.agentFilterMoel['isOpen']: | |||
| if content is not None: | |||
| ###如果是结尾 | |||
| if content in config.agentFilterMoel['oneMessageSplit']: | |||
| self.my_replay_content = self.my_replay_content+content | |||
| self.currentIsSend=True | |||
| else: | |||
| self.my_replay_content = self.my_replay_content + content | |||
| self.currentIsSend=False | |||
| if self.currentIsSend: | |||
| ####过滤关键字 | |||
| cContent = clearContent(self.my_replay_content) | |||
| self.my_replay_content=''; | |||
| await self.write_message(cContent) | |||
| #await self.write_message(currentLineContents) | |||
| else: | |||
| if role_conent is not None: | |||
| print('') | |||
| else: | |||
| await self.write_message("___talk_end___") | |||
| else: | |||
| if content is not None: | |||
| await self.write_message(content) | |||
| else: | |||
| if role_conent is not None: | |||
| print('') | |||
| else: | |||
| await self.write_message("___talk_end___") | |||
| except Exception as es: | |||
| print('onMessage error',es) | |||
| self.close() | |||
| async def talkGPT(self,message): | |||
| print("{} says {}".format(self.request.remote_ip,message)) | |||
| try: | |||
| _msg = json.loads(message) | |||
| try: | |||
| if 'model' in _msg : | |||
| _gptModel = _msg['model'] | |||
| _real_msg = _msg['messages'] | |||
| #print("msg is {}".format(type(_real_msg))) | |||
| if _gptModel == '4': | |||
| _gptModel = 'gpt-4-0314' | |||
| elif _gptModel == '3': | |||
| _gptModel = 'gpt-3.5-turbo-0125' | |||
| else: | |||
| _gptModel = 'gpt-3.5-turbo-0125' | |||
| else: | |||
| _gptModel = 'gpt-3.5-turbo-0125' | |||
| _real_msg = _msg | |||
| except Exception as gmex: | |||
| _gptModel = 'gpt-3.5-turbo-0125' | |||
| _real_msg = _msg | |||
| response = await openai.Completion.acreate( | |||
| model= _gptModel, | |||
| prompt= _real_msg, | |||
| temperature=0, | |||
| max_tokens=4000, | |||
| top_p=1, | |||
| frequency_penalty=0.5, | |||
| presence_penalty=0 | |||
| ) | |||
| #print(f"response:{response}") | |||
| response_text = response['choices'][0]['text'] | |||
| await self.write_message(response_text+"___talk_end___") | |||
| except Exception as es: | |||
| print('onMessage error',es) | |||
| self.close() | |||
| @@ -0,0 +1,157 @@ | |||
| #! /usr/bin/python | |||
| import tornado.web | |||
| import tornado.ioloop | |||
| import tornado.httpserver | |||
| import tornado.options | |||
| import os | |||
| import datetime | |||
| import openai | |||
| import asyncio | |||
| from tornado.web import RequestHandler | |||
| from tornado.options import define,options | |||
| from tornado.websocket import WebSocketHandler | |||
| import openai_async | |||
| import config | |||
| import gptAgent | |||
| import baichuanAgent | |||
| #define("port",default=9999,type=int) | |||
| class IndexHandler(RequestHandler): | |||
| def get(self): | |||
| self.render("index.html") | |||
| class ChatHandler(WebSocketHandler): | |||
| users = set() #用来存在在线用户的容器 | |||
| def open(self): | |||
| print('进来了') | |||
| self.users.add(self) #建立连接后添加到用户容器中 | |||
| for u in self.users: | |||
| print("user count{}".format(len(self.users))) | |||
| u.write_message(u"[%s]-[%s]-进入" % (self.request.remote_ip,datetime.datetime.now().strftime("%d/%m/%Y"))) | |||
| print("{} enter".format(self.request.remote_ip)) | |||
| def on_message(self,message): | |||
| for u in self.users: # 向所有用户广播消息 | |||
| u.write_message(u"[%s]-[%s]-说:%s" % (self.request.remote_ip,datetime.datetime.now().strftime("%d/%m/%Y"),message)) | |||
| print("{} says {}".format(self.request.remote_ip,message)) | |||
| def on_close(self): | |||
| print('离开了') | |||
| self.users.remove(self) | |||
| for u in self.users: | |||
| u.write_message(u"[%s]-[%s]-离开" % (self.request.remote_ip,datetime.datetime.now().strftime("%d/%m/%Y"))) | |||
| print("{} leave".format(self.request.remote_ip)) | |||
| def check_orign(self,orign): | |||
| #接受所有跨域 | |||
| return True | |||
| # parsed_orign = urllib.parse.urlparse(orign) | |||
| # return parsed_orign.netloc.endswith(".malls.iformall.com") | |||
| #openai.api_key = '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'; | |||
| class gptAgentStreamHandler(WebSocketHandler): | |||
| def __init__(self, *args, **kwargs): | |||
| super().__init__(*args, **kwargs) | |||
| self.my_replay_content = "" | |||
| self.currentIsSend=False | |||
| self.currentIsAll=False | |||
| async def open(self): | |||
| print("{} connect".format(self.request.remote_ip)) | |||
| async def on_message(self,message): | |||
| await gptAgent.talkGPTWithStream(self,message) | |||
| def on_close(self): | |||
| print("{} leave".format(self.request.remote_ip)) | |||
| async def check_orign(self,orign): | |||
| #接受所有跨域 | |||
| return True | |||
| # parsed_orign = urllib.parse.urlparse(orign) | |||
| # return parsed_orign.netloc.endswith(".malls.iformall.com") | |||
| class gptAgentHandler(WebSocketHandler): | |||
| async def open(self): | |||
| print("{} connect".format(self.request.remote_ip)) | |||
| async def on_message(self,message): | |||
| await gptAgent.talkGPT(self,message) | |||
| def on_close(self): | |||
| print("{} leave".format(self.request.remote_ip)) | |||
| async def check_orign(self,orign): | |||
| #接受所有跨域 | |||
| return True | |||
| # parsed_orign = urllib.parse.urlparse(orign) | |||
| # return parsed_orign.netloc.endswith(".malls.iformall.com") | |||
| class gptBaiChuanStreamHandler(WebSocketHandler): | |||
| def __init__(self, *args, **kwargs): | |||
| super().__init__(*args, **kwargs) | |||
| self.my_replay_content = "" | |||
| self.currentIsSend=False | |||
| self.currentIsAll=False | |||
| async def open(self): | |||
| print("{} connect".format(self.request.remote_ip)) | |||
| async def on_message(self,message): | |||
| await baichuanAgent.talkBaiChuanWithStream(self,message) | |||
| def on_close(self): | |||
| print("{} leave".format(self.request.remote_ip)) | |||
| async def check_orign(self,orign): | |||
| #接受所有跨域 | |||
| return True | |||
| async def main(): | |||
| tornado.options.parse_command_line() | |||
| app = tornado.web.Application([ | |||
| (r"/index",IndexHandler), | |||
| (r"/wss/chat",ChatHandler), | |||
| (r"/talk",gptAgentHandler), | |||
| (r"/",gptAgentStreamHandler), | |||
| (r"/baichuan",gptBaiChuanStreamHandler) | |||
| ], | |||
| static_path = os.path.join(os.path.dirname(__file__),"static"), | |||
| template_path = os.path.join(os.path.dirname(__file__),"template"), | |||
| debug = True | |||
| ) | |||
| http_server = tornado.httpserver.HTTPServer(app,xheaders=True) | |||
| #http_server.listen(options.port) | |||
| http_server.bind(config.agentServer['port']) | |||
| http_server.start(config.agentServer['threads']) | |||
| await asyncio.Event().wait() | |||
| if __name__ == '__main__': | |||
| asyncio.run(main()) | |||
| #if __name__ == '__main__': | |||
| #tornado.options.parse_command_line() | |||
| #app = tornado.web.Application([ | |||
| # (r"/index",IndexHandler), | |||
| # (r"/wss/chat",ChatHandler), | |||
| # #(r"/",gptAgentHandler) | |||
| # (r"/",gptAgentStreamHandler) | |||
| # ], | |||
| # static_path = os.path.join(os.path.dirname(__file__),"static"), | |||
| # template_path = os.path.join(os.path.dirname(__file__),"template"), | |||
| # debug = True | |||
| #) | |||
| #http_server = tornado.httpserver.HTTPServer(app,xheaders=True) | |||
| ##http_server.listen(options.port) | |||
| #http_server.bind(options.port) | |||
| #http_server.start(1) | |||
| #tornado.ioloop.IOLoop.current().start() | |||
| @@ -0,0 +1,4 @@ | |||
| #!/bin/bash | |||
| nohup ./server.py > nohup.log 2>&1 & | |||
| @@ -0,0 +1,16 @@ | |||
| #!/bin/bash | |||
| PID=`ps -ef | grep /usr/bin/python | grep server.py | awk '{print \$2}'` | |||
| echo "ps -ef | grep /usr/bin/python | grep server.py | awk '{print \$2}'"; | |||
| echo "KILL PID: $PID"; | |||
| if [ "$PID"x != ""x ]; then | |||
| kill -9 $PID | |||
| if [ $? -eq 0 ]; then | |||
| echo "Kill $1 SUCCESS" | |||
| else | |||
| echo "Kill $1 FAILED" | |||
| exit 1; | |||
| fi | |||
| fi | |||