From c16baeac13b377a313736d82741529ab4c35cd6d Mon Sep 17 00:00:00 2001
From: Ivan Office
Date: Sun, 26 Jan 2025 18:48:42 +0800
Subject: [PATCH 1/5] =?UTF-8?q?=E5=A4=84=E7=90=86=E5=BD=93clone=E5=BA=93?=
=?UTF-8?q?=E6=97=B6=EF=BC=8Cappid=E5=90=8C=E6=97=B6=E6=9B=B4=E6=96=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app_saas/models/__init__.py | 3 +--
app_saas/models/ir_config_parameter.py | 17 +++++++++++++++++
2 files changed, 18 insertions(+), 2 deletions(-)
create mode 100644 app_saas/models/ir_config_parameter.py
diff --git a/app_saas/models/__init__.py b/app_saas/models/__init__.py
index 94facece..9b769ae8 100644
--- a/app_saas/models/__init__.py
+++ b/app_saas/models/__init__.py
@@ -4,5 +4,4 @@
from . import res_config_settings
from . import auth_oauth_provider
from . import res_users
-
-
+from . import ir_config_parameter
diff --git a/app_saas/models/ir_config_parameter.py b/app_saas/models/ir_config_parameter.py
new file mode 100644
index 00000000..86128dfb
--- /dev/null
+++ b/app_saas/models/ir_config_parameter.py
@@ -0,0 +1,17 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+from odoo import models
+
+
+class IrConfigParameter(models.Model):
+ _inherit = 'ir.config_parameter'
+
+ def init(self, force=False):
+ super(IrConfigParameter, self).init(force=force)
+ if force:
+ oauth_app_saas = self.env.ref('app_saas.ir_config_parameter.py')
+ if not oauth_app_saas:
+ return
+ dbuuid = self.sudo().get_param('database.uuid')
+ oauth_app_saas.write({'client_id': dbuuid})
From eb8ea19d5d79f44b10cfeba50bda93e74d3c7c87 Mon Sep 17 00:00:00 2001
From: Ivan Office
Date: Fri, 7 Feb 2025 18:22:27 +0800
Subject: [PATCH 2/5] add deepseek
---
app_deepseek/__init__.py | 4 +
app_deepseek/__manifest__.py | 64 ++++
app_deepseek/controllers/__init__.py | 3 +
app_deepseek/controllers/main.py | 10 +
app_deepseek/data/ai_robot_data.xml | 13 +
app_deepseek/data/discuss_channel_data.xml | 25 ++
app_deepseek/data/user_partner_data.xml | 19 ++
app_deepseek/i18n/zh_CN.po | 123 +++++++
app_deepseek/models/__init__.py | 4 +
app_deepseek/models/ai_robot.py | 71 ++++
app_deepseek/models/discuss_channel.py | 60 ++++
app_deepseek/security/odooai.cn | 0
app_deepseek/static/description/ai_banner.jpg | Bin 0 -> 222781 bytes
app_deepseek/static/description/apply1.jpg | Bin 0 -> 101126 bytes
app_deepseek/static/description/apply2.jpg | Bin 0 -> 95690 bytes
app_deepseek/static/description/apply3.jpg | Bin 0 -> 83038 bytes
app_deepseek/static/description/apply4.jpg | Bin 0 -> 151596 bytes
app_deepseek/static/description/apply5.jpg | Bin 0 -> 71465 bytes
app_deepseek/static/description/apply6.jpg | Bin 0 -> 116732 bytes
app_deepseek/static/description/apply7.jpg | Bin 0 -> 115941 bytes
app_deepseek/static/description/baidu.png | Bin 0 -> 4271 bytes
app_deepseek/static/description/banner.gif | Bin 0 -> 1434859 bytes
app_deepseek/static/description/banner.png | Bin 0 -> 63737 bytes
app_deepseek/static/description/bard.gif | Bin 0 -> 277497 bytes
app_deepseek/static/description/chatgpt.png | Bin 0 -> 5269 bytes
.../static/description/chatgpt4_azure.png | Bin 0 -> 53379 bytes
.../static/description/chatgpt_blue.png | Bin 0 -> 45894 bytes
.../static/description/chatgpt_green.jpg | Bin 0 -> 20442 bytes
app_deepseek/static/description/demo01.jpg | Bin 0 -> 123546 bytes
app_deepseek/static/description/demo02.jpg | Bin 0 -> 292863 bytes
app_deepseek/static/description/demo03.jpg | Bin 0 -> 195278 bytes
app_deepseek/static/description/demo04.jpg | Bin 0 -> 79890 bytes
app_deepseek/static/description/demo1.jpg | Bin 0 -> 57714 bytes
app_deepseek/static/description/demo2.jpg | Bin 0 -> 80005 bytes
app_deepseek/static/description/demo3.jpg | Bin 0 -> 35583 bytes
app_deepseek/static/description/demo4.jpg | Bin 0 -> 51255 bytes
app_deepseek/static/description/demo5.jpg | Bin 0 -> 66092 bytes
app_deepseek/static/description/demo6.jpg | Bin 0 -> 65941 bytes
app_deepseek/static/description/demo7.jpg | Bin 0 -> 89585 bytes
app_deepseek/static/description/demo71.jpg | Bin 0 -> 140543 bytes
app_deepseek/static/description/demo8.jpg | Bin 0 -> 127393 bytes
app_deepseek/static/description/demo81.jpg | Bin 0 -> 46209 bytes
app_deepseek/static/description/demo9.jpg | Bin 0 -> 175469 bytes
app_deepseek/static/description/demo91.jpg | Bin 0 -> 27407 bytes
.../static/description/demo_deepseek.jpg | Bin 0 -> 134019 bytes
app_deepseek/static/description/demoa.jpg | Bin 0 -> 49433 bytes
app_deepseek/static/description/demob.jpg | Bin 0 -> 253125 bytes
app_deepseek/static/description/icon.png | Bin 0 -> 3605 bytes
app_deepseek/static/description/index.html | 322 ++++++++++++++++++
app_deepseek/static/description/setup2.jpg | Bin 0 -> 94407 bytes
app_deepseek/static/description/setup3.jpg | Bin 0 -> 89700 bytes
app_deepseek/static/description/setup4.jpg | Bin 0 -> 102987 bytes
app_deepseek/static/description/setup5.jpg | Bin 0 -> 111232 bytes
app_deepseek/static/description/setup6.jpg | Bin 0 -> 81152 bytes
app_deepseek/static/description/setup7.jpg | Bin 0 -> 147242 bytes
app_deepseek/static/src/img/deepseek.png | Bin 0 -> 3605 bytes
app_deepseek/static/src/odooai.cn | 0
app_deepseek/views/ai_robot_views.xml | 13 +
58 files changed, 731 insertions(+)
create mode 100644 app_deepseek/__init__.py
create mode 100644 app_deepseek/__manifest__.py
create mode 100644 app_deepseek/controllers/__init__.py
create mode 100644 app_deepseek/controllers/main.py
create mode 100644 app_deepseek/data/ai_robot_data.xml
create mode 100644 app_deepseek/data/discuss_channel_data.xml
create mode 100644 app_deepseek/data/user_partner_data.xml
create mode 100644 app_deepseek/i18n/zh_CN.po
create mode 100644 app_deepseek/models/__init__.py
create mode 100644 app_deepseek/models/ai_robot.py
create mode 100644 app_deepseek/models/discuss_channel.py
create mode 100644 app_deepseek/security/odooai.cn
create mode 100644 app_deepseek/static/description/ai_banner.jpg
create mode 100644 app_deepseek/static/description/apply1.jpg
create mode 100644 app_deepseek/static/description/apply2.jpg
create mode 100644 app_deepseek/static/description/apply3.jpg
create mode 100644 app_deepseek/static/description/apply4.jpg
create mode 100644 app_deepseek/static/description/apply5.jpg
create mode 100644 app_deepseek/static/description/apply6.jpg
create mode 100644 app_deepseek/static/description/apply7.jpg
create mode 100644 app_deepseek/static/description/baidu.png
create mode 100644 app_deepseek/static/description/banner.gif
create mode 100644 app_deepseek/static/description/banner.png
create mode 100644 app_deepseek/static/description/bard.gif
create mode 100644 app_deepseek/static/description/chatgpt.png
create mode 100644 app_deepseek/static/description/chatgpt4_azure.png
create mode 100644 app_deepseek/static/description/chatgpt_blue.png
create mode 100644 app_deepseek/static/description/chatgpt_green.jpg
create mode 100644 app_deepseek/static/description/demo01.jpg
create mode 100644 app_deepseek/static/description/demo02.jpg
create mode 100644 app_deepseek/static/description/demo03.jpg
create mode 100644 app_deepseek/static/description/demo04.jpg
create mode 100644 app_deepseek/static/description/demo1.jpg
create mode 100644 app_deepseek/static/description/demo2.jpg
create mode 100644 app_deepseek/static/description/demo3.jpg
create mode 100644 app_deepseek/static/description/demo4.jpg
create mode 100644 app_deepseek/static/description/demo5.jpg
create mode 100644 app_deepseek/static/description/demo6.jpg
create mode 100644 app_deepseek/static/description/demo7.jpg
create mode 100644 app_deepseek/static/description/demo71.jpg
create mode 100644 app_deepseek/static/description/demo8.jpg
create mode 100644 app_deepseek/static/description/demo81.jpg
create mode 100644 app_deepseek/static/description/demo9.jpg
create mode 100644 app_deepseek/static/description/demo91.jpg
create mode 100644 app_deepseek/static/description/demo_deepseek.jpg
create mode 100644 app_deepseek/static/description/demoa.jpg
create mode 100644 app_deepseek/static/description/demob.jpg
create mode 100644 app_deepseek/static/description/icon.png
create mode 100644 app_deepseek/static/description/index.html
create mode 100644 app_deepseek/static/description/setup2.jpg
create mode 100644 app_deepseek/static/description/setup3.jpg
create mode 100644 app_deepseek/static/description/setup4.jpg
create mode 100644 app_deepseek/static/description/setup5.jpg
create mode 100644 app_deepseek/static/description/setup6.jpg
create mode 100644 app_deepseek/static/description/setup7.jpg
create mode 100644 app_deepseek/static/src/img/deepseek.png
create mode 100644 app_deepseek/static/src/odooai.cn
create mode 100644 app_deepseek/views/ai_robot_views.xml
diff --git a/app_deepseek/__init__.py b/app_deepseek/__init__.py
new file mode 100644
index 00000000..d6948c82
--- /dev/null
+++ b/app_deepseek/__init__.py
@@ -0,0 +1,4 @@
+# -*- coding: utf-8 -*-
+
+# from . import controllers
+from . import models
diff --git a/app_deepseek/__manifest__.py b/app_deepseek/__manifest__.py
new file mode 100644
index 00000000..103b596b
--- /dev/null
+++ b/app_deepseek/__manifest__.py
@@ -0,0 +1,64 @@
+# -*- coding: utf-8 -*-
+
+# Created on 2023-09-15
+# author: 欧度智能,https://www.odooai.cn
+# email: 300883@qq.com
+# resource of odooai
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
+
+{
+ 'name': 'Deepseek Ai for odoo ai center, 深度求索Ai支持-对话模型',
+ 'version': '17.0.25.02.07',
+ 'author': 'odooai.cn',
+ 'company': 'odooai.cn',
+ 'maintainer': 'odooai.cn',
+ 'category': 'Website/Website',
+ 'website': 'https://www.odooai.cn',
+ 'live_test_url': 'https://demo.odooapp.cn',
+ 'license': 'LGPL-3',
+ 'sequence': 10,
+ 'license': 'LGPL-3',
+ 'price': 0.00,
+ 'currency': 'EUR',
+ 'images': ['static/description/banner.png'],
+ 'summary': '''
+ Deepseek AI for Odoo AI Center. Ai Aigc Center including Deepseek, Azure Chatgpt Ai, OpenAi Chatgpt Ai.
+ Ai服务中心的DeepSeek支持,包括V3和R1等,本版本只支持开放对话模型。
+ Integration All Ai robot Api, like Azure OpenAI Chatgpt Service.
+ Also support(need extra pay) Ali Ai, Baidu Ai, Kimi Ai.
+ Easy Chat channel with several Ai Robots and train.
+ ''',
+ 'description': '''
+ Chat with Deepseek ai with odoo.
+ Allows the application to leverage the capabilities of the GPT language model to generate human-like responses,
+ providing a more natural and intuitive user experience.
+ odoo Deepseek ai connector.
+ 1. Multi ChatGpt openAI robot Connector. Chat and train.
+ 2. Multi Ai support including Google Bard Ai, Azure Ai, Chatgpt 4, Chatgpt 3.5 Turbo, Chatgpt 3 Davinci, Chatgpt 2 Code Optimized, 'Dall-E Image.
+ 3. Bind ChatGpt Api to user. So we can chat to robot user or use ChatGpt Channel for Group Chat.
+ 4. White and black List for ChatGpt.
+ 5. Setup Demo Chat time for every new user.
+ 6. Easy Start and Stop ChatGpt.
+ 7. Evaluation the ai robot to make better response. This training.
+ 8. Add api support Connect the Microsoft Azure OpenAI Service.
+ 9. Can set Synchronous or Asynchronous mode for Ai response.
+ 10.Filter Sensitive Words Setup.
+ 11. Multi-language Support. Multi-Company Support.
+ 12. Support Odoo 18,17,16,15,14,13,12, Enterprise and Community and odoo.sh Edition.
+ 13. Full Open Source.
+ ''',
+ 'depends': [
+ 'app_chatgpt',
+ ],
+ 'data': [
+ 'data/ai_robot_data.xml',
+ 'data/user_partner_data.xml',
+ 'data/mail_channel_data.xml',
+ 'views/ai_robot_views.xml',
+ ],
+ 'assets': {
+ },
+ 'installable': True,
+ 'application': True,
+ 'auto_install': False,
+}
diff --git a/app_deepseek/controllers/__init__.py b/app_deepseek/controllers/__init__.py
new file mode 100644
index 00000000..65a8c120
--- /dev/null
+++ b/app_deepseek/controllers/__init__.py
@@ -0,0 +1,3 @@
+# -*- coding: utf-8 -*-
+
+from . import main
diff --git a/app_deepseek/controllers/main.py b/app_deepseek/controllers/main.py
new file mode 100644
index 00000000..217c4d8b
--- /dev/null
+++ b/app_deepseek/controllers/main.py
@@ -0,0 +1,10 @@
+# -*- coding: utf-8 -*-
+
+from odoo import http
+
+
+class ChatgptController(http.Controller):
+ @http.route(['/chatgpt_form'], type='http', auth="public", csrf=False,
+ website=True)
+ def question_submit(self):
+ return http.request.render('app_chatgpt.connector')
diff --git a/app_deepseek/data/ai_robot_data.xml b/app_deepseek/data/ai_robot_data.xml
new file mode 100644
index 00000000..6d125d30
--- /dev/null
+++ b/app_deepseek/data/ai_robot_data.xml
@@ -0,0 +1,13 @@
+
+
+
+ DeepSeek Ai
+ deepseek
+ deepseek-chat
+ deepseek-chat
+
+ https://api.deepseek.com
+ 11
+
+
+
diff --git a/app_deepseek/data/discuss_channel_data.xml b/app_deepseek/data/discuss_channel_data.xml
new file mode 100644
index 00000000..723c776b
--- /dev/null
+++ b/app_deepseek/data/discuss_channel_data.xml
@@ -0,0 +1,25 @@
+
+
+
+
+ Deepseek Group Chat
+
+
+
+
+
+
+ discuss.channel
+
+ email
+
+ Welcome to Deepseek Ai Group Chat
+ Welcome to Deepseek Ai Group Chat.
+ Please ask me any question.
]]>
+
+
+
+
+
+
+
diff --git a/app_deepseek/data/user_partner_data.xml b/app_deepseek/data/user_partner_data.xml
new file mode 100644
index 00000000..b6b67975
--- /dev/null
+++ b/app_deepseek/data/user_partner_data.xml
@@ -0,0 +1,19 @@
+
+
+
+
+ Deepseek聊天
+
+
+
+
+ deepseek_chat@example.com
+ deepseek_chat@example.com
+
+
+
+
+
+
+
+
diff --git a/app_deepseek/i18n/zh_CN.po b/app_deepseek/i18n/zh_CN.po
new file mode 100644
index 00000000..46a125cf
--- /dev/null
+++ b/app_deepseek/i18n/zh_CN.po
@@ -0,0 +1,123 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * app_ai_baidu
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 16.0+e-20230721\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2023-09-15 10:35+0000\n"
+"PO-Revision-Date: 2023-09-15 10:35+0000\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: \n"
+
+#. module: app_ai_baidu
+#: model:ir.model.fields,help:app_ai_baidu.field_ai_robot__set_ai_model
+msgid ""
+"\n"
+"GPT-4: Can understand Image, generate natural language or code.\n"
+"GPT-3.5: A set of models that improve on GPT-3 and can understand as well as generate natural language or code\n"
+"DALL·E: A model that can generate and edit images given a natural language prompt\n"
+"Whisper: A model that can convert audio into text\n"
+"Embeddings:\tA set of models that can convert text into a numerical form\n"
+"CodexLimited: A set of models that can understand and generate code, including translating natural language to code\n"
+"Moderation: A fine-tuned model that can detect whether text may be sensitive or unsafe\n"
+"GPT-3\tA set of models that can understand and generate natural language\n"
+" "
+msgstr ""
+"\n"
+"GPT-4: 最新引擎,更好的智能回复。支持多模态输入如图片,但暂时没开放。\n"
+"GPT-3.5: 问答引擎,可以根据提问回复答案或者代码。\n"
+"DALL·E: 根据要求生成图片。\n"
+"Whisper: 文字转语音引擎。\n"
+"Embeddings:\tA set of models that can convert text into a numerical form\n"
+"CodexLimited: A set of models that can understand and generate code, including translating natural language to code\n"
+"Moderation: A fine-tuned model that can detect whether text may be sensitive or unsafe\n"
+"GPT-3\tA set of models that can understand and generate natural language\n"
+
+#. module: app_ai_baidu
+#: model:ir.model.fields,field_description:app_ai_baidu.field_ai_robot__provider
+msgid "AI Provider"
+msgstr "Ai服务商"
+
+#. module: app_ai_baidu
+#: model:ir.model,name:app_ai_baidu.model_ai_robot
+msgid "Ai Robot"
+msgstr "Ai机器人"
+
+#. module: app_ai_baidu
+#: model:ai.robot,name:app_ai_baidu.robot_bloomz_7b
+#: model:ir.model.fields.selection,name:app_ai_baidu.selection__ai_robot__set_ai_model__bloomz-7b
+msgid "BLOOMZ-7B"
+msgstr ""
+
+#. module: app_ai_baidu
+#: model:ir.model,name:app_ai_baidu.model_mail_channel
+msgid "Discussion Channel"
+msgstr ""
+
+#. module: app_ai_baidu
+#: model:ir.model.fields.selection,name:app_ai_baidu.selection__ai_robot__set_ai_model__ernie-bot-turbo
+msgid "ERNIE-Bot-turbo百度大语言"
+msgstr ""
+
+#. module: app_ai_baidu
+#: model:ir.model.fields.selection,name:app_ai_baidu.selection__ai_robot__set_ai_model__ernie-bot
+msgid "ERNIE-Bot百度大语言"
+msgstr ""
+
+#. module: app_ai_baidu
+#. odoo-python
+#: code:addons/app_ai_baidu/models/ai_robot.py:0
+#: code:addons/app_ai_baidu/models/ai_robot.py:0
+#, python-format
+msgid "Please provide Ai Robot [%s] API Key and Secret Key first."
+msgstr "请先设置 Ai机器人 [%s] 的 API Key 和 Secret Key。"
+
+#. module: app_ai_baidu
+#: model:ir.model.fields,help:app_ai_baidu.field_ai_robot__client_secret
+msgid "Provide API Client Secret here if needed."
+msgstr "如果需要,请设置API Client Secret。"
+
+#. module: app_ai_baidu
+#: model:ir.model.fields,field_description:app_ai_baidu.field_ai_robot__set_ai_model
+msgid "Quick Set Model"
+msgstr "模型快选"
+
+#. module: app_ai_baidu
+#. odoo-python
+#: code:addons/app_ai_baidu/models/mail_channel.py:0
+#, python-format
+msgid "Response Timeout, please speak again."
+msgstr ""
+
+#. module: app_ai_baidu
+#: model:ir.model.fields,field_description:app_ai_baidu.field_ai_robot__client_secret
+msgid "Secret Key"
+msgstr ""
+
+#. module: app_ai_baidu
+#. odoo-python
+#: code:addons/app_ai_baidu/models/mail_channel.py:0
+#, python-format
+msgid "温馨提示:您发送的内容含有敏感词,请修改内容后再向我发送。"
+msgstr ""
+
+#. module: app_ai_baidu
+#: model:ir.model.fields.selection,name:app_ai_baidu.selection__ai_robot__provider__baidu
+msgid "百度千帆"
+msgstr ""
+
+#. module: app_ai_baidu
+#: model:ai.robot,name:app_ai_baidu.robot_baidu_ernie_bot
+msgid "百度千帆ERNIE-Bot"
+msgstr ""
+
+#. module: app_ai_baidu
+#: model:ai.robot,name:app_ai_baidu.robot_baidu_ernie_bot_turbo
+msgid "百度千帆ERNIE-Bot-turbo"
+msgstr ""
diff --git a/app_deepseek/models/__init__.py b/app_deepseek/models/__init__.py
new file mode 100644
index 00000000..bacb61bd
--- /dev/null
+++ b/app_deepseek/models/__init__.py
@@ -0,0 +1,4 @@
+# -*- coding: utf-8 -*-
+
+from . import ai_robot
+from . import discuss_channel
diff --git a/app_deepseek/models/ai_robot.py b/app_deepseek/models/ai_robot.py
new file mode 100644
index 00000000..3e42ff32
--- /dev/null
+++ b/app_deepseek/models/ai_robot.py
@@ -0,0 +1,71 @@
+# -*- coding: utf-8 -*-
+
+import base64
+import os
+import requests, json
+import logging
+from openai import OpenAI
+from http import HTTPStatus
+from odoo import api, fields, models, modules, tools, _
+from odoo.exceptions import UserError
+
+
+_logger = logging.getLogger(__name__)
+
+
+class AiRobot(models.Model):
+ _inherit = 'ai.robot'
+
+ provider = fields.Selection(selection_add=[('deepseek', 'Deepseek')], ondelete={'deepseek': 'set default'})
+ set_ai_model = fields.Selection(
+ selection_add=[
+ ('deepseek-chat', 'Deepseek Chat'),
+ ],
+ ondelete={'deepseek-chat': 'set default'})
+
+ @api.onchange('provider')
+ def _onchange_provider(self):
+ if self.provider == 'deepseek':
+ self.endpoint = 'https://api.deepseek.com'
+ # 取头像
+ module_path = modules.get_module_path('app_ai', display_warning=False)
+ if module_path:
+ path = modules.check_resource_path(module_path, ('static/description/src/%s.png' % self.provider))
+ if path:
+ image_file = tools.file_open(path, 'rb')
+ self.image_avatar = base64.b64encode(image_file.read())
+ return super()._onchange_provider()
+
+ def get_deepseek(self, data, author_id, answer_id, param={}):
+ self.ensure_one()
+ api_key = self.openapi_api_key
+ if not api_key or not self.endpoint:
+ raise UserError(_("Please provide Ai Robot [%s] API Key and Endpoint URL first." % self.name))
+
+ if isinstance(data, list):
+ messages = data
+ else:
+ messages = [{"role": "user", "content": data}]
+
+ url = self.endpoint
+
+ client = OpenAI(api_key=api_key, base_url=self.endpoint)
+ response = client.chat.completions.create(
+ model=self.ai_model,
+ messages=messages
+ )
+ res = response.model_dump()
+ if 'choices' in res:
+ return res
+ else:
+ _logger.warning('=====================deepseek output data: %s' % response.json())
+
+ return _("Response Timeout, please speak again.")
+
+ def get_ai_post(self, res, author_id=False, answer_id=False, param={}):
+ if self.provider == 'deepseek':
+ usage = res['usage']
+ content = res['choices'][0]['message']['content']
+ return content, usage, True
+ else:
+ return super().get_ai_post(res, author_id, answer_id, param)
diff --git a/app_deepseek/models/discuss_channel.py b/app_deepseek/models/discuss_channel.py
new file mode 100644
index 00000000..01cccdff
--- /dev/null
+++ b/app_deepseek/models/discuss_channel.py
@@ -0,0 +1,60 @@
+# -*- coding: utf-8 -*-
+
+import logging
+import datetime
+from odoo import api, fields, models, tools, _
+from odoo.exceptions import UserError
+from odoo.osv import expression
+_logger = logging.getLogger(__name__)
+
+
+class Channel(models.Model):
+ _inherit = 'discuss.channel'
+
+ def get_openai_context(self, channel_id, author_id, answer_id, minutes=30, chat_count=0):
+ gpt_id = False
+ if self.ai_partner_id:
+ ai_user = self.env['res.users'].search([('partner_id', '=', self.ai_partner_id.id)], limit=1)
+ gpt_id = ai_user.mapped('gpt_id')
+ if gpt_id and gpt_id.provider == 'deepseek':
+ context_history = []
+ afterTime = fields.Datetime.now() - datetime.timedelta(minutes=minutes)
+ message_model = self.env['mail.message'].sudo()
+ domain = [('res_id', '=', channel_id),
+ ('model', '=', 'discuss.channel'),
+ ('message_type', '!=', 'user_notification'),
+ ('parent_id', '!=', False),
+ ('is_ai', '=', True),
+ ('body', '!=', '%s
' % _('Response Timeout, please speak again.')),
+ ('body', '!=', _('温馨提示:您发送的内容含有敏感词,请修改内容后再向我发送。'))]
+ if self.channel_type in ['group', 'channel']:
+ # 群聊增加时间限制,当前找所有人,不限制 author_id
+ domain = expression.AND([domain, [('date', '>=', afterTime)]])
+ else:
+ domain = expression.AND([domain, [('author_id', '=', answer_id.id)]])
+ if chat_count == 0:
+ ai_msg_list = []
+ else:
+ ai_msg_list = message_model.with_context(tz='UTC').search(domain, order="id asc", limit=chat_count)
+ for ai_msg in ai_msg_list:
+ # 判断这个 ai_msg 是不是ai发,有才 insert。 判断 user_msg 是不是 user发的,有才 insert
+ user_msg = ai_msg.parent_id.sudo()
+ ai_content = str(ai_msg.body).replace("", "").replace("
", "").replace("", "")
+ if ai_msg.author_id.sudo().gpt_id and answer_id.sudo().gpt_id and ai_msg.author_id.sudo().gpt_id == answer_id.sudo().gpt_id:
+ context_history.insert(0, {
+ 'role': 'assistant',
+ 'content': ai_content,
+ })
+ if not user_msg.author_id.gpt_id:
+ user_content = user_msg.body.replace("
", "").replace("
", "").replace('@%s' % answer_id.name, '').lstrip()
+ context_history.append({
+ 'role': 'user',
+ 'content': user_content,
+ })
+ context_history.append({
+ 'role': 'assistant',
+ 'content': ai_content,
+ })
+ return context_history
+ else:
+ return super(Channel, self).get_openai_context(channel_id, author_id, answer_id, minutes, chat_count)
diff --git a/app_deepseek/security/odooai.cn b/app_deepseek/security/odooai.cn
new file mode 100644
index 00000000..e69de29b
diff --git a/app_deepseek/static/description/ai_banner.jpg b/app_deepseek/static/description/ai_banner.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..45b4dea405c92fd61186f925116a12c75d16fc5d
GIT binary patch
literal 222781
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