diff --git a/app_chatgpt/data/mail_channel_data.xml b/app_chatgpt/data/mail_channel_data.xml
index 20003202..e4c8c70c 100644
--- a/app_chatgpt/data/mail_channel_data.xml
+++ b/app_chatgpt/data/mail_channel_data.xml
@@ -17,12 +17,12 @@
Please ask me any question.
]]>
-
-
-
-
-
-
+
+
+
+
+
+
diff --git a/app_chatgpt/models/ai_robot.py b/app_chatgpt/models/ai_robot.py
index 3586293e..43c939e4 100644
--- a/app_chatgpt/models/ai_robot.py
+++ b/app_chatgpt/models/ai_robot.py
@@ -40,7 +40,7 @@ GPT-3 A set of models that can understand and generate natural language
# begin gpt 参数
# 1. stop:表示聊天机器人停止生成回复的条件,可以是一段文本或者一个列表,当聊天机器人生成的回复中包含了这个条件,就会停止继续生成回复。
# 2. temperature:控制回复的“新颖度”,值越高,聊天机器人生成的回复越不确定和随机,值越低,聊天机器人生成的回复会更加可预测和常规化。
- # 3. top_p:与temperature有些类似,也是控制回复的“新颖度”。不同的是,top_p控制的是回复中概率最高的几个可能性的累计概率之和,值越小,生成的回复越保守,值越大,生成的回复越新颖。
+ # 3. top_p:言语连贯性,与temperature有些类似,也是控制回复的“新颖度”。不同的是,top_p控制的是回复中概率最高的几个可能性的累计概率之和,值越小,生成的回复越保守,值越大,生成的回复越新颖。
# 4. frequency_penalty:用于控制聊天机器人回复中出现频率过高的词汇的惩罚程度。聊天机器人会尝试避免在回复中使用频率较高的词汇,以提高回复的多样性和新颖度。
# 5. presence_penalty:与frequency_penalty相对,用于控制聊天机器人回复中出现频率较低的词汇的惩罚程度。聊天机器人会尝试在回复中使用频率较低的词汇,以提高回复的多样性和新颖度。
max_tokens = fields.Integer('Max response', default=600,
@@ -50,7 +50,7 @@ GPT-3 A set of models that can understand and generate natural language
(including system message, examples, message history, and user query) and the model's response.
One token is roughly 4 characters for typical English text.
""")
- temperature = fields.Float(string='Temperature', default=0.9,
+ temperature = fields.Float(string='Temperature', default=0.8,
help="""
Controls randomness. Lowering the temperature means that the model will produce
more repetitive and deterministic responses.
@@ -104,39 +104,47 @@ GPT-3 A set of models that can understand and generate natural language
def action_disconnect(self):
requests.delete('https://chatgpt.com/v1/disconnect')
-
- def get_ai(self, data, author_id=False, answer_id=False, param={}):
- # 通用方法
- # author_id: 请求的 partner_id 对象
- # answer_id: 回答的 partner_id 对象
- # kwargs,dict 形式的可变参数
- self.ensure_one()
- # 前置勾子,一般返回 False,有问题返回响应内容
- res_pre = self.get_ai_pre(data, author_id, answer_id, param)
- if res_pre:
- return res_pre
- if hasattr(self, 'get_%s' % self.provider):
- res = getattr(self, 'get_%s' % self.provider)(data, author_id, answer_id, param)
- else:
- res = _('No robot provider found')
-
- # 后置勾子,返回处理后的内容,用于处理敏感词等
- res_post = self.get_ai_post(res, author_id, answer_id, param)
- return res_post
def get_ai_pre(self, data, author_id=False, answer_id=False, param={}):
if self.is_filtering:
search = WordsSearch()
search.SetKeywords([])
- content = data[0]['content']
+ if isinstance(data, list):
+ content = data[len(data)-1]['content']
+ else:
+ content = data
sensi = search.FindFirst(content)
if sensi is not None:
+ _logger.error('==========敏感词:%s' % sensi['Keyword'])
return _('温馨提示:您发送的内容含有敏感词,请修改内容后再向我发送。')
else:
return False
+
+ def get_ai(self, data, author_id=False, answer_id=False, param={}):
+ # 通用方法
+ # author_id: 请求的 partner_id 对象
+ # answer_id: 回答的 partner_id 对象
+ # param,dict 形式的参数
+ # 调整输出为2个参数:res_post详细内容,is_ai是否ai的响应
+
+ self.ensure_one()
+ # 前置勾子,一般返回 False,有问题返回响应内容,用于处理敏感词等
+ res_pre = self.get_ai_pre(data, author_id, answer_id, param)
+ if res_pre:
+ # 有错误内容,则返回上级内容及 is_ai为假
+ return res_pre, False
+ if not hasattr(self, 'get_%s' % self.provider):
+ res = _('No robot provider found')
+ return res, False
+
+ res = getattr(self, 'get_%s' % self.provider)(data, author_id, answer_id, param)
+ # 后置勾子,返回处理后的内容
+ res_post, is_ai = self.get_ai_post(res, author_id, answer_id, param)
+ return res_post, is_ai
def get_ai_post(self, res, author_id=False, answer_id=False, param={}):
if res and author_id and isinstance(res, openai.openai_object.OpenAIObject) or isinstance(res, list):
+ # 返回是个对象,那么就是ai
usage = json.loads(json.dumps(res['usage']))
content = json.loads(json.dumps(res['choices'][0]['message']['content']))
data = content.replace(' .', '.').strip()
@@ -170,9 +178,10 @@ GPT-3 A set of models that can understand and generate natural language
'first_ask_time': ask_date
})
ai_use.write(vals)
+ return data, True
else:
- data = res
- return data
+ # 直接返回错误语句,那么就是非ai
+ return res, False
def get_ai_system(self, content=None):
# 获取基础ai角色设定, role system
@@ -221,12 +230,12 @@ GPT-3 A set of models that can understand and generate natural language
o_url = self.endpoint or "https://api.openai.com/v1/chat/completions"
# 处理传参,传过来的优先于 robot 默认的
- max_tokens = param.get('max_tokens') or self.max_tokens or 600,
- temperature = param.get('temperature') or self.temperature or 0.9,
- top_p = param.get('top_p') or self.top_p or 0.6,
- frequency_penalty = param.get('frequency_penalty') or self.frequency_penalty or 0.5,
- presence_penalty = param.get('presence_penalty') or self.presence_penalty or 0.5,
- # request_timeout = param.get('request_timeout') or self.ai_timeout or 120,
+ max_tokens = param.get('max_tokens') if param.get('max_tokens') else self.max_tokens
+ temperature = param.get('temperature') if param.get('temperature') else self.temperature
+ top_p = param.get('top_p') if param.get('top_p') else self.top_p
+ frequency_penalty = param.get('frequency_penalty') if param.get('frequency_penalty') else self.frequency_penalty
+ presence_penalty = param.get('presence_penalty') if param.get('presence_penalty') else self.presence_penalty
+ request_timeout = param.get('request_timeout') if param.get('request_timeout') else self.ai_timeout
if self.stop:
stop = self.stop.split(',')
@@ -246,21 +255,40 @@ GPT-3 A set of models that can understand and generate natural language
sys_content = self.get_ai_system(param.get('sys_content'))
if sys_content:
messages.insert(0, sys_content)
- # 暂时不变
- response = openai.ChatCompletion.create(
- model=self.ai_model,
- messages=messages,
- n=1,
- temperature=self.temperature or 0.9,
- max_tokens=self.max_tokens or 600,
- top_p=self.top_p or 0.6,
- frequency_penalty=self.frequency_penalty or 0.5,
- presence_penalty=self.presence_penalty or 0.5,
- stop=stop,
- request_timeout=self.ai_timeout or 120,
- )
- if 'choices' in response:
- return response
+ # todo: 当前反向代理方式不通,要调整为 远程主机中接受请求,post到openai,再将结果返回给请求者
+ # response = openai.ChatCompletion.create(
+ # model=self.ai_model,
+ # messages=messages,
+ # # 返回的回答数量
+ # n=1,
+ # max_tokens=max_tokens,
+ # temperature=temperature,
+ # top_p=top_p,
+ # frequency_penalty=frequency_penalty,
+ # presence_penalty=presence_penalty,
+ # stop=stop,
+ # request_timeout=request_timeout,
+ # )
+ # if 'choices' in response:
+ # return response
+ # todo: 两种方式一样,要调整 v 服务器的二次处理 /root/toai.py
+ pdata = {
+ "model": self.ai_model,
+ "messages": messages,
+ "max_tokens": max_tokens,
+ "temperature": temperature,
+ "top_p": top_p,
+ "frequency_penalty": frequency_penalty,
+ "presence_penalty": presence_penalty,
+ "stop": stop
+ }
+ response = requests.post(o_url, data=json.dumps(pdata), headers=headers, timeout=R_TIMEOUT)
+ try:
+ res = response.json()
+ if 'choices' in res:
+ return res
+ except Exception as e:
+ _logger.warning("Get Response Json failed: %s", e)
else:
_logger.warning('=====================Openai output data: %s' % response)
elif self.ai_model == 'dall-e2':
@@ -277,7 +305,7 @@ GPT-3 A set of models that can understand and generate natural language
pdata = {
"model": self.ai_model,
"prompt": data,
- "temperature": 0.9,
+ "temperature": 0.8,
"max_tokens": max_tokens,
"top_p": 1,
"frequency_penalty": 0.0,
@@ -313,12 +341,12 @@ GPT-3 A set of models that can understand and generate natural language
messages = [{"role": "user", "content": data}]
# 处理传参,传过来的优先于 robot 默认的
- max_tokens = param.get('max_tokens') or self.max_tokens or 600,
- temperature = param.get('temperature') or self.temperature or 0.9,
- top_p = param.get('top_p') or self.top_p or 0.6,
- frequency_penalty = param.get('frequency_penalty') or self.frequency_penalty or 0.5,
- presence_penalty = param.get('presence_penalty') or self.presence_penalty or 0.5,
- # request_timeout = param.get('request_timeout') or self.ai_timeout or 120,
+ max_tokens = param.get('max_tokens') if param.get('max_tokens') else self.max_tokens
+ temperature = param.get('temperature') if param.get('temperature') else self.temperature
+ top_p = param.get('top_p') if param.get('top_p') else self.top_p
+ frequency_penalty = param.get('frequency_penalty') if param.get('frequency_penalty') else self.frequency_penalty
+ presence_penalty = param.get('presence_penalty') if param.get('presence_penalty') else self.presence_penalty
+ request_timeout= param.get('request_timeout') if param.get('request_timeout') else self.ai_timeout
# Ai角色设定,如果没设定则再处理
if messages[0].get('role') != 'system':
@@ -331,13 +359,13 @@ GPT-3 A set of models that can understand and generate natural language
messages=messages,
# 返回的回答数量
n=1,
- temperature=self.temperature or 0.9,
- max_tokens=self.max_tokens or 600,
- top_p=self.top_p or 0.6,
- frequency_penalty=self.frequency_penalty or 0.5,
- presence_penalty=self.presence_penalty or 0.5,
+ max_tokens=max_tokens,
+ temperature=temperature,
+ top_p=top_p,
+ frequency_penalty=frequency_penalty,
+ presence_penalty=presence_penalty,
stop=stop,
- request_timeout=self.ai_timeout or 120,
+ request_timeout=request_timeout,
)
if 'choices' in response:
return response
diff --git a/app_chatgpt/models/lib/sensi_words.txt b/app_chatgpt/models/lib/sensi_words.txt
index 37e23ea8..70167d7f 100644
--- a/app_chatgpt/models/lib/sensi_words.txt
+++ b/app_chatgpt/models/lib/sensi_words.txt
@@ -6060,7 +6060,6 @@ cctv
wan wang zhi wang
抽插27岁处女meimei淫叫不断
中天萬方
-代理
亮穴
机战
成人 激情 淫 另类
@@ -9911,7 +9910,6 @@ Tokyo Hot n0188 田中爱
毛卖逼
插 操 干 骚穴 嫩穴 小穴 密穴 淫水流
兔meimei色色贴图区
-功
毛夜情
宁王府成人论坛导航
岩崎 Sky Angel Vol。27
@@ -10567,7 +10565,6 @@ fuck兴奋剂
禽獸
明慧网
jiejie
-的
嫩穴
床上激情自拍图
6。4
@@ -13533,7 +13530,6 @@ re xue ying hao
烂
淫荡老师
小姨子的小嫩屄
-create
亚洲激情BT
省长的儿媳妇
苹果日报
@@ -14077,7 +14073,6 @@ gong fu
89年的鬥爭
台湾十八电影
小淫虫电影
-CREATE
外阴
外??挂
毛爷爷复活
@@ -14362,7 +14357,6 @@ secretchina
江泽民靠
錢 其 琛
和妹妹做爱
-服务器
性交做爱
毛李鹏
狗卵子
diff --git a/app_chatgpt/models/mail_channel.py b/app_chatgpt/models/mail_channel.py
index 886383c9..6edb9190 100644
--- a/app_chatgpt/models/mail_channel.py
+++ b/app_chatgpt/models/mail_channel.py
@@ -63,7 +63,7 @@ class Channel(models.Model):
answer_id = user_id.partner_id
# todo: 只有个人配置的群聊才给配置
param = self.get_ai_config(ai)
- res = ai.get_ai(messages, author_id, answer_id, param)
+ res, is_ai = ai.get_ai(messages, author_id, answer_id, param)
if res:
res = res.replace('\n', '
')
channel.with_user(user_id).message_post(body=res, message_type='comment', subtype_xmlid='mail.mt_comment', parent_id=message.id)
@@ -144,22 +144,18 @@ class Channel(models.Model):
if not msg:
return rdata
# api_key = self.env['ir.config_parameter'].sudo().get_param('app_chatgpt.openapi_api_key')
- api_key = ''
- if ai:
+ # ai处理,不要自问自答
+ if ai and answer_id != message.author_id:
api_key = ai.openapi_api_key
if not api_key:
_logger.warning(_("ChatGPT Robot【%s】have not set open api key."))
return rdata
- try:
- openapi_context_timeout = int(self.env['ir.config_parameter'].sudo().get_param('app_chatgpt.openapi_context_timeout')) or 60
- except:
- openapi_context_timeout = 60
- sync_config = self.env['ir.config_parameter'].sudo().get_param('app_chatgpt.openai_sync_config')
- openai.api_key = api_key
- # print(msg_vals)
- # print(msg_vals.get('record_name', ''))
- # print('self.channel_type :',self.channel_type)
- if ai:
+ try:
+ openapi_context_timeout = int(self.env['ir.config_parameter'].sudo().get_param('app_chatgpt.openapi_context_timeout')) or 60
+ except:
+ openapi_context_timeout = 60
+ sync_config = self.env['ir.config_parameter'].sudo().get_param('app_chatgpt.openai_sync_config')
+ openai.api_key = api_key
# 非4版本,取0次。其它取3 次历史
chat_count = 0 if '4' in ai.ai_model else 3
if author_id != answer_id.id and self.channel_type == 'chat':