Merge remote-tracking branch 'origin/16.0' into 16.0

# Conflicts:
#	app_chatgpt/models/mail_channel.py
This commit is contained in:
ivan deng
2023-04-19 20:35:50 +08:00
6 changed files with 53 additions and 20 deletions

View File

@@ -50,6 +50,7 @@
],
'data': [
'security/ir.model.access.csv',
'security/ir_rules.xml',
'data/mail_channel_data.xml',
'data/ai_robot_data.xml',
'data/user_partner_data.xml',

View File

@@ -149,7 +149,7 @@ GPT-3 A set of models that can understand and generate natural language
content = json.loads(json.dumps(res['choices'][0]['message']['content']))
data = content.replace(' .', '.').strip()
answer_user = answer_id.mapped('user_ids')[:1]
if answer_user.gpt_policy == 'limit' and usage:
if usage:
prompt_tokens = usage['prompt_tokens']
completion_tokens = usage['completion_tokens']
total_tokens = usage['total_tokens']
@@ -159,6 +159,7 @@ GPT-3 A set of models that can understand and generate natural language
if not ai_use:
ai_use.create({
'name': author_id.id,
'ai_user_id': answer_user.id,
'human_prompt_tokens': prompt_tokens,
'ai_completion_tokens': completion_tokens,
'tokens_total': total_tokens,

View File

@@ -39,8 +39,8 @@ class Channel(models.Model):
ai_msg_list = message_model.with_context(tz='UTC').search(domain, order="id desc", limit=chat_count)
for ai_msg in ai_msg_list:
# 判断这个 ai_msg 是不是ai发有才 insert。 判断 user_msg 是不是 user发的有才 insert
user_msg = ai_msg.parent_id
if ai_msg.author_id.gpt_id:
user_msg = ai_msg.parent_id.sudo()
if ai_msg.author_id.sudo().gpt_id:
ai_content = str(ai_msg.body).replace("<p>", "").replace("</p>", "").replace("<p>", "")
context_history.insert(0, {
'role': 'assistant',
@@ -74,7 +74,7 @@ class Channel(models.Model):
answer_id = self.env['res.partner']
user_id = self.env['res.users']
author_id = msg_vals.get('author_id')
ai = self.env['ai.robot']
ai = self.env['ai.robot'].sudo()
channel = self.env['mail.channel']
channel_type = self.channel_type
messages = []
@@ -86,13 +86,13 @@ class Channel(models.Model):
if channel_type == 'chat':
channel_partner_ids = self.channel_partner_ids
answer_id = channel_partner_ids - message.author_id
user_id = answer_id.mapped('user_ids').filtered(lambda r: r.gpt_id)[:1]
user_id = answer_id.mapped('user_ids').sudo().filtered(lambda r: r.gpt_id)[:1]
if user_id and answer_id.gpt_id:
gpt_policy = user_id.gpt_policy
gpt_wl_partners = user_id.gpt_wl_partners
is_allow = message.author_id.id in gpt_wl_partners.ids
if gpt_policy == 'all' or (gpt_policy == 'limit' and is_allow):
ai = answer_id.gpt_id
ai = answer_id.sudo().gpt_id
elif channel_type in ['group', 'channel']:
# partner_ids = @ ids
@@ -101,10 +101,10 @@ class Channel(models.Model):
# 常规群聊 @
partners = self.env['res.partner'].search([('id', 'in', partner_ids)])
# user_id = user, who has binded gpt robot
user_id = partners.mapped('user_ids').filtered(lambda r: r.gpt_id)[:1]
user_id = partners.mapped('user_ids').sudo().filtered(lambda r: r.gpt_id)[:1]
elif message.body == _('<div class="o_mail_notification">joined the channel</div>'):
# 欢迎的情况
partners = self.channel_partner_ids.filtered(lambda r: r.gpt_id)[:1]
partners = self.channel_partner_ids.sudo().filtered(lambda r: r.gpt_id)[:1]
user_id = partners.mapped('user_ids')[:1]
elif self.member_count == 2:
# 处理独聊频道
@@ -112,7 +112,7 @@ class Channel(models.Model):
# 2个人的非私有频道不处理
pass
else:
partners = self.channel_partner_ids.filtered(lambda r: r.gpt_id)[:1]
partners = self.channel_partner_ids.sudo().filtered(lambda r: r.gpt_id)[:1]
user_id = partners.mapped('user_ids')[:1]
elif not message.author_id.gpt_id:
# 没有@时默认第一个robot
@@ -120,9 +120,9 @@ class Channel(models.Model):
# 临时用azure
robot = self.env.ref('app_chatgpt.chatgpt3_azure')
if robot:
user_id = self.env['res.users'].search([('gpt_id', '=', robot.id)], limit=1)
user_id = self.env['res.users'].sudo().search([('gpt_id', '=', robot.id)], limit=1)
else:
partners = self.channel_partner_ids.filtered(lambda r: r.gpt_id)[:1]
partners = self.channel_partner_ids.sudo().filtered(lambda r: r.gpt_id)[:1]
user_id = partners.mapped('user_ids')[:1]
if user_id:
gpt_policy = user_id.gpt_policy
@@ -130,6 +130,7 @@ class Channel(models.Model):
is_allow = message.author_id.id in gpt_wl_partners.ids
answer_id = user_id.partner_id
if gpt_policy == 'all' or (gpt_policy == 'limit' and is_allow):
ai = user_id.sudo().gpt_id
ai = user_id.gpt_id
elif user_id.gpt_id and not is_allow:
# 暂时有限用户的Ai
@@ -176,7 +177,6 @@ class Channel(models.Model):
messages.append({"role": "system", "content": channel.description})
try:
messages = []
c_history = self.get_openai_context(channel.id, author_id, answer_id, openapi_context_timeout, chat_count)
if c_history:
messages += c_history

View File

@@ -1,3 +1,4 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_gpt_robt_user,AiRobotUser,model_ai_robot,base.group_user,1,1,1,1
access_res_partner_ai_use_user,ResPartnerAiUseUser,model_res_partner_ai_use,base.group_user,1,1,1,1
access_gpt_robt_manager,AiRobotUser,model_ai_robot,base.group_erp_manager,1,1,1,1
access_res_partner_ai_use_user,ResPartnerAiUseUser,model_res_partner_ai_use,base.group_user,1,0,0,0
access_res_partner_ai_use_manager,ResPartnerAiUseUser,model_res_partner_ai_use,sales_team.group_sale_manager,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_gpt_robt_user access_gpt_robt_manager AiRobotUser model_ai_robot base.group_user base.group_erp_manager 1 1 1 1
3 access_res_partner_ai_use_user ResPartnerAiUseUser model_res_partner_ai_use base.group_user 1 1 0 1 0 1 0
4 access_res_partner_ai_use_manager ResPartnerAiUseUser model_res_partner_ai_use sales_team.group_sale_manager 1 1 1 1

View File

@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo noupdate="1">
<record id="res_partner_ai_use_personal_rule" model="ir.rule">
<field name="name">Personal AI Use</field>
<field ref="model_res_partner_ai_use" name="model_id"/>
<field name="domain_force">[('name','=',user.partner_id.id)]</field>
<field name="groups" eval="[(4, ref('base.group_user'))]"/>
</record>
<record id="res_partner_ai_use_see_all" model="ir.rule">
<field name="name">All AI Use</field>
<field ref="model_res_partner_ai_use" name="model_id"/>
<field name="domain_force">[(1,'=',1)]</field>
<field name="groups" eval="[(4, ref('sales_team.group_sale_manager'))]"/>
</record>
</odoo>

View File

@@ -10,12 +10,12 @@
<field name="first_ask_time"/>
<field name="service_start_date"/>
<field name="service_end_date"/>
<field name="used_number"/>
<field name="max_number"/>
<field name="token_balance"/>
<field name="human_prompt_tokens"/>
<field name="ai_completion_tokens"/>
<field name="tokens_total"/>
<field name="used_number" sum="Total"/>
<field name="max_number" sum="Total"/>
<field name="token_balance" sum="Total"/>
<field name="human_prompt_tokens" sum="Total"/>
<field name="ai_completion_tokens" sum="Total"/>
<field name="tokens_total" sum="Total"/>
</tree>
</field>
</record>
@@ -51,6 +51,20 @@
</field>
</record>
<record id="res_partner_ai_use_search_view" model="ir.ui.view">
<field name="name">res.partner.ai.use.search</field>
<field name="model">res.partner.ai.use</field>
<field name="arch" type="xml">
<search>
<field name="name"/>
<field name="ai_user_id"/>
<searchpanel>
<field name="ai_user_id"/>
</searchpanel>
</search>
</field>
</record>
<record id="action_res_partner_ai_use" model="ir.actions.act_window">
<field name="name">Partner Ai Use</field>
<field name="res_model">res.partner.ai.use</field>