diff --git a/app_chatgpt/__manifest__.py b/app_chatgpt/__manifest__.py index 509a2c27..614f8b65 100644 --- a/app_chatgpt/__manifest__.py +++ b/app_chatgpt/__manifest__.py @@ -37,10 +37,14 @@ ''', 'depends': ['base', 'base_setup', 'mail'], 'data': [ + 'security/ir.model.access.csv', 'data/mail_channel_data.xml', + 'data/gpt_robot_data.xml', 'data/user_partner_data.xml', 'data/ir_config_parameter.xml', 'views/res_config_settings_views.xml', + 'views/gpt_robot_views.xml', + 'views/res_users_views.xml', ], 'external_dependencies': {'python': ['openai']}, 'images': ['static/description/banner.png'], diff --git a/app_chatgpt/data/gpt_robot_data.xml b/app_chatgpt/data/gpt_robot_data.xml new file mode 100644 index 00000000..2a524e56 --- /dev/null +++ b/app_chatgpt/data/gpt_robot_data.xml @@ -0,0 +1,9 @@ + + + + ChatGPT Robot 1 + + + ChatGPT Robot 2 + + \ No newline at end of file diff --git a/app_chatgpt/data/user_partner_data.xml b/app_chatgpt/data/user_partner_data.xml index 0071b111..2c4ae20e 100644 --- a/app_chatgpt/data/user_partner_data.xml +++ b/app_chatgpt/data/user_partner_data.xml @@ -5,7 +5,7 @@ ChatGPT的odoo机器人 - + chatgpt@sunpop.cn chatgpt @@ -13,5 +13,39 @@ + + + ChatGPT机器人1 + + + + + ChatGPT1 + chatgpt1@sunpop.cn + chatgpt1@sunpop.cn + chatgpt + + + + + + + + + ChatGPT机器人2 + + + + + ChatGPT2 + chatgpt2@sunpop.cn + chatgpt2@sunpop.cn + chatgpt + + + + + + diff --git a/app_chatgpt/models/__init__.py b/app_chatgpt/models/__init__.py index 381d5ad3..e650dfe1 100644 --- a/app_chatgpt/models/__init__.py +++ b/app_chatgpt/models/__init__.py @@ -3,3 +3,5 @@ from . import mail_channel from . import res_config_settings +from . import gpt_robot +from . import res_users diff --git a/app_chatgpt/models/gpt_robot.py b/app_chatgpt/models/gpt_robot.py new file mode 100644 index 00000000..fbb4a418 --- /dev/null +++ b/app_chatgpt/models/gpt_robot.py @@ -0,0 +1,12 @@ +# -*- coding: utf-8 -*- + +from odoo import api, fields, models, _ + + +class GptRobot(models.Model): + _name = 'gpt.robot' + _description = 'Gpt Robot' + + name = fields.Char(string='Name') + openapi_api_key = fields.Char(string="API Key", help="Provide the API key here") + temperature = fields.Float(string='Temperature') diff --git a/app_chatgpt/models/mail_channel.py b/app_chatgpt/models/mail_channel.py index 0dd713c6..d014115a 100644 --- a/app_chatgpt/models/mail_channel.py +++ b/app_chatgpt/models/mail_channel.py @@ -34,7 +34,7 @@ class Channel(models.Model): return "获取结果超时,请重新跟我聊聊。" @api.model - def get_openai_context(self, channel_id, partner_chatgpt, current_prompt,seconds=600): + def get_openai_context(self, channel_id, partner_chatgpt, current_prompt, seconds=600): afterTime = fields.Datetime.now() - datetime.timedelta(seconds=seconds) message_model = self.env['mail.message'].sudo() prompt = [f"Human:{current_prompt}\nAI:", ] @@ -63,7 +63,7 @@ class Channel(models.Model): return '\n'.join(prompt[::-1]) - def get_chatgpt_answer(self,prompt,partner_name): + def get_chatgpt_answer(self, prompt, partner_name): response = openai.Completion.create( model="text-davinci-003", prompt=prompt, @@ -80,11 +80,35 @@ class Channel(models.Model): def _notify_thread(self, message, msg_vals=False, **kwargs): rdata = super(Channel, self)._notify_thread(message, msg_vals=msg_vals, **kwargs) # print(f'rdata:{rdata}') + chatgpt_channel_id = self.env.ref('app_chatgpt.channel_chatgpt') user_chatgpt = self.env.ref("app_chatgpt.user_chatgpt") partner_chatgpt = self.env.ref("app_chatgpt.partner_chatgpt") + author_id = msg_vals.get('author_id') # print('author_id:',author_id) + + gpt_id = self.env['gpt.robot'] + partner_ids = list(msg_vals.get('partner_ids')) + if partner_ids: + partners = self.env['res.partner'].search([('id', 'in', partner_ids)]) + user_id = partners.mapped('user_ids').filtered(lambda r: r.gpt_id)[:1] + if user_id: + gpt_policy = user_id.gpt_policy + gpt_wl_users = user_id.gpt_wl_users + is_allow = message.create_uid.id in gpt_wl_users.ids + if gpt_policy == 'all' or (gpt_policy == 'limit' and is_allow): + user_chatgpt = user_id + partner_chatgpt = user_id.partner_id + gpt_id = user_id.gpt_id + # if gpt_policy == 'limit' and user_id.gpt_wl_users: + # if message.get('create_uid').id in user_id.gpt_wl_users.ids: + # user_chatgpt = user_id + # partner_chatgpt = user_id.partner_id + # gpt_id = user_id.gpt_id + # elif gpt_policy == 'all': + + # print('partner_chatgpt.id:',partner_chatgpt.id) chatgpt_name = str(partner_chatgpt.name or '') + ', ' # print('chatgpt_name:', chatgpt_name) @@ -94,6 +118,8 @@ class Channel(models.Model): if not prompt: return rdata api_key = self.env['ir.config_parameter'].sudo().get_param('app_chatgpt.openapi_api_key') + if gpt_id: + api_key = gpt_id.openapi_api_key try: openapi_context_timeout = int(self.env['ir.config_parameter'].sudo().get_param('app_chatgpt.openapi_context_timeout')) or 600 except: @@ -105,6 +131,9 @@ class Channel(models.Model): if author_id: partner_id = Partner.browse(author_id) if partner_id: + user_id = partner_id.user_ids[:1] + if user_id.gpt_id: + return rdata partner_name = partner_id.name # print(msg_vals) # print(msg_vals.get('record_name', '')) diff --git a/app_chatgpt/models/res_users.py b/app_chatgpt/models/res_users.py new file mode 100644 index 00000000..a3cf2910 --- /dev/null +++ b/app_chatgpt/models/res_users.py @@ -0,0 +1,15 @@ +# -*- coding: utf-8 -*- + +from odoo import fields, models + + +class ResUsers(models.Model): + _inherit = "res.users" + + gpt_id = fields.Many2one('gpt.robot', string='Bind to ChatGpt') + gpt_policy = fields.Selection([ + ('all', 'All Users'), + ('limit', 'Selected Users') + ], string='Allowed Conversation Mode', default='all', ondelete='set default') + gpt_wl_users = fields.Many2many('res.users', 'res_users_res_users_rel', 'robot_id', 'user_id', string='Allowed Users', domain="[('id', '!=', id)]") + gpt_demo_time = fields.Integer('Default Demo Time', default=0) diff --git a/app_chatgpt/security/ir.model.access.csv b/app_chatgpt/security/ir.model.access.csv new file mode 100644 index 00000000..8222aad4 --- /dev/null +++ b/app_chatgpt/security/ir.model.access.csv @@ -0,0 +1,2 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_gpt_robt_user,GptRobotUser,model_gpt_robot,base.group_user,1,1,1,1 \ No newline at end of file diff --git a/app_chatgpt/views/gpt_robot_views.xml b/app_chatgpt/views/gpt_robot_views.xml new file mode 100644 index 00000000..dba7be92 --- /dev/null +++ b/app_chatgpt/views/gpt_robot_views.xml @@ -0,0 +1,52 @@ + + + + gpt.robot.tree + gpt.robot + + + + + + + + + + + gpt.robot.form + gpt.robot + + + + + + + + + + + + + + + + + GPT Robot + gpt.robot + tree,form + + + Let's create a GPT Robot. + + + + + + + \ No newline at end of file diff --git a/app_chatgpt/views/res_users_views.xml b/app_chatgpt/views/res_users_views.xml new file mode 100644 index 00000000..77c4e5f4 --- /dev/null +++ b/app_chatgpt/views/res_users_views.xml @@ -0,0 +1,22 @@ + + + + app.chatgpt.res.users.form + res.users + + + + + + + + + + + + + + + + +
+ Let's create a GPT Robot. +