Merge branch '17.0' of github.com:guohuadeng/app-odoo into 17.0
@@ -7,8 +7,8 @@
|
|||||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
||||||
|
|
||||||
{
|
{
|
||||||
'name': 'Google Bard Ai for odoo ai center, 谷歌Ai支持',
|
'name': 'Google Gemini (Bard) Ai for odoo ai center, 谷歌Ai支持',
|
||||||
'version': '24.11.06',
|
'version': '17.0.25.02.08',
|
||||||
'author': 'odooai.cn',
|
'author': 'odooai.cn',
|
||||||
'company': 'odooai.cn',
|
'company': 'odooai.cn',
|
||||||
'maintainer': 'odooai.cn',
|
'maintainer': 'odooai.cn',
|
||||||
@@ -19,12 +19,12 @@
|
|||||||
'sequence': 10,
|
'sequence': 10,
|
||||||
'images': ['static/description/banner.gif'],
|
'images': ['static/description/banner.gif'],
|
||||||
'summary': '''
|
'summary': '''
|
||||||
Google Bard Ai for Odoo AI Center. Ai Aigc Center including Google Bard Ai, Azure Ai, Baidu Ai.
|
Google Gemini Ai for Odoo AI Center. Ai Aigc Center including Google Gemini Ai(Bard before), Azure Ai, Baidu Ai.
|
||||||
Support chatgpt 4 image. DALLE, Integration All ChatGpt Api and Azure OpenAI Service.
|
Support chatgpt 4 image. DALLE, Integration All ChatGpt Api and Azure OpenAI Service.
|
||||||
Easy Chat channel with several ChatGPT Robots and train.
|
Easy Chat channel with several ChatGPT Robots and train.
|
||||||
''',
|
''',
|
||||||
'description': '''
|
'description': '''
|
||||||
Chat with google bard ai with odoo.
|
Chat with google Gemini ai with odoo.
|
||||||
Allows the application to leverage the capabilities of the GPT language model to generate human-like responses,
|
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.
|
providing a more natural and intuitive user experience.
|
||||||
odoo bard connector.
|
odoo bard connector.
|
||||||
|
|||||||
@@ -44,11 +44,8 @@
|
|||||||
13. Full Open Source.
|
13. Full Open Source.
|
||||||
''',
|
''',
|
||||||
'depends': [
|
'depends': [
|
||||||
'base',
|
|
||||||
'app_odoo_customize',
|
'app_odoo_customize',
|
||||||
'base_setup',
|
|
||||||
'mail',
|
'mail',
|
||||||
# 'queue_job',
|
|
||||||
],
|
],
|
||||||
'data': [
|
'data': [
|
||||||
'security/ir.model.access.csv',
|
'security/ir.model.access.csv',
|
||||||
|
|||||||
@@ -312,11 +312,13 @@ class Channel(models.Model):
|
|||||||
|
|
||||||
# if msg_len * 2 >= 8000:
|
# if msg_len * 2 >= 8000:
|
||||||
# messages = [{"role": "user", "content": msg}]
|
# messages = [{"role": "user", "content": msg}]
|
||||||
|
if sync_config == 'sync':
|
||||||
|
self.get_ai_response(ai, messages, channel, user_id, message)
|
||||||
|
else:
|
||||||
|
if hasattr(self, 'with_delay'):
|
||||||
|
self.with_delay().get_ai_response(ai, messages, channel, user_id, message)
|
||||||
|
else:
|
||||||
self.get_ai_response(ai, messages, channel, user_id, message)
|
self.get_ai_response(ai, messages, channel, user_id, message)
|
||||||
# if sync_config == 'sync':
|
|
||||||
# self.get_ai_response(ai, messages, channel, user_id, message)
|
|
||||||
# else:
|
|
||||||
# self.with_delay().get_ai_response(ai, messages, channel, user_id, message)
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
raise UserError(_(e))
|
raise UserError(_(e))
|
||||||
|
|
||||||
|
|||||||
4
app_deepseek/__init__.py
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
# from . import controllers
|
||||||
|
from . import models
|
||||||
64
app_deepseek/__manifest__.py
Normal file
@@ -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,
|
||||||
|
}
|
||||||
3
app_deepseek/controllers/__init__.py
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
from . import main
|
||||||
10
app_deepseek/controllers/main.py
Normal file
@@ -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')
|
||||||
13
app_deepseek/data/ai_robot_data.xml
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
|
<odoo noupdate="1">
|
||||||
|
<record id="robot_deepseek_chat" model="ai.robot">
|
||||||
|
<field name="name">DeepSeek Ai</field>
|
||||||
|
<field name="provider">deepseek</field>
|
||||||
|
<field name="ai_model">deepseek-chat</field>
|
||||||
|
<field name="set_ai_model">deepseek-chat</field>
|
||||||
|
<field name="api_version" eval="False"/>
|
||||||
|
<field name="endpoint">https://api.deepseek.com</field>
|
||||||
|
<field name="sequence">11</field>
|
||||||
|
<field name="image_avatar" type="base64" file="app_deepseek/static/src/img/deepseek.png"/>
|
||||||
|
</record>
|
||||||
|
</odoo>
|
||||||
25
app_deepseek/data/discuss_channel_data.xml
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<odoo>
|
||||||
|
<data noupdate="1">
|
||||||
|
<record model="discuss.channel" id="channel_deepseek">
|
||||||
|
<field name="name">Deepseek Group Chat</field>
|
||||||
|
<!-- <field name="description">你的职责是帮我们解决各行业你是各行业的专家,专门解决大家的行业疑难问题。</field>-->
|
||||||
|
<field name="image_128" type="base64" file="app_deepseek/static/src/img/deepseek.png"/>
|
||||||
|
<field name="ai_partner_id" ref="app_deepseek.partner_deepseek_chat"/>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record model="mail.message" id="module_install_notification">
|
||||||
|
<field name="model">discuss.channel</field>
|
||||||
|
<field name="res_id" ref="app_deepseek.channel_deepseek"/>
|
||||||
|
<field name="message_type">email</field>
|
||||||
|
<field name="subtype_id" ref="mail.mt_comment"/>
|
||||||
|
<field name="subject">Welcome to Deepseek Ai Group Chat</field>
|
||||||
|
<field name="body"><![CDATA[<p>Welcome to Deepseek Ai Group Chat.</p>
|
||||||
|
<p>Please ask me any question.</p>]]></field>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record model="discuss.channel" id="app_deepseek.channel_deepseek">
|
||||||
|
<field name="group_ids" eval="[Command.link(ref('base.group_user'))]"/>
|
||||||
|
</record>
|
||||||
|
</data>
|
||||||
|
</odoo>
|
||||||
19
app_deepseek/data/user_partner_data.xml
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<odoo>
|
||||||
|
<data noupdate="1">
|
||||||
|
<record id="partner_deepseek_chat" model="res.partner">
|
||||||
|
<field name="name">Deepseek聊天</field>
|
||||||
|
<field name="image_1920" type="base64" file="app_deepseek/static/src/img/deepseek.png"/>
|
||||||
|
</record>
|
||||||
|
|
||||||
|
<record id="user_deepseek_chat" model="res.users">
|
||||||
|
<field name="login">deepseek_chat@example.com</field>
|
||||||
|
<field name="email">deepseek_chat@example.com</field>
|
||||||
|
<field name="partner_id" ref="partner_deepseek_chat"/>
|
||||||
|
<field name="gpt_id" ref="robot_deepseek_chat"/>
|
||||||
|
<field name="company_id" ref="base.main_company"/>
|
||||||
|
<field name="company_ids" eval="[Command.link(ref('base.main_company'))]"/>
|
||||||
|
<field name="groups_id" eval="[Command.link(ref('base.group_user'))]"/>
|
||||||
|
</record>
|
||||||
|
</data>
|
||||||
|
</odoo>
|
||||||
123
app_deepseek/i18n/zh_CN.po
Normal file
@@ -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 ""
|
||||||
4
app_deepseek/models/__init__.py
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
from . import ai_robot
|
||||||
|
from . import discuss_channel
|
||||||
71
app_deepseek/models/ai_robot.py
Normal file
@@ -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)
|
||||||
60
app_deepseek/models/discuss_channel.py
Normal file
@@ -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', '!=', '<p>%s</p>' % _('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("<p>", "").replace("</p>", "").replace("<p>", "")
|
||||||
|
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("<p>", "").replace("</p>", "").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)
|
||||||
0
app_deepseek/security/odooai.cn
Normal file
BIN
app_deepseek/static/description/ai_banner.jpg
Normal file
|
After Width: | Height: | Size: 218 KiB |
BIN
app_deepseek/static/description/apply1.jpg
Normal file
|
After Width: | Height: | Size: 99 KiB |
BIN
app_deepseek/static/description/apply2.jpg
Normal file
|
After Width: | Height: | Size: 93 KiB |
BIN
app_deepseek/static/description/apply3.jpg
Normal file
|
After Width: | Height: | Size: 81 KiB |
BIN
app_deepseek/static/description/apply4.jpg
Normal file
|
After Width: | Height: | Size: 148 KiB |
BIN
app_deepseek/static/description/apply5.jpg
Normal file
|
After Width: | Height: | Size: 70 KiB |
BIN
app_deepseek/static/description/apply6.jpg
Normal file
|
After Width: | Height: | Size: 114 KiB |
BIN
app_deepseek/static/description/apply7.jpg
Normal file
|
After Width: | Height: | Size: 113 KiB |
BIN
app_deepseek/static/description/baidu.png
Normal file
|
After Width: | Height: | Size: 4.2 KiB |
BIN
app_deepseek/static/description/banner.gif
Normal file
|
After Width: | Height: | Size: 1.4 MiB |
BIN
app_deepseek/static/description/banner.png
Normal file
|
After Width: | Height: | Size: 62 KiB |
BIN
app_deepseek/static/description/bard.gif
Normal file
|
After Width: | Height: | Size: 271 KiB |
BIN
app_deepseek/static/description/chatgpt.png
Normal file
|
After Width: | Height: | Size: 5.1 KiB |
BIN
app_deepseek/static/description/chatgpt4_azure.png
Normal file
|
After Width: | Height: | Size: 52 KiB |
BIN
app_deepseek/static/description/chatgpt_blue.png
Normal file
|
After Width: | Height: | Size: 45 KiB |
BIN
app_deepseek/static/description/chatgpt_green.jpg
Normal file
|
After Width: | Height: | Size: 20 KiB |
BIN
app_deepseek/static/description/demo01.jpg
Normal file
|
After Width: | Height: | Size: 121 KiB |
BIN
app_deepseek/static/description/demo02.jpg
Normal file
|
After Width: | Height: | Size: 286 KiB |
BIN
app_deepseek/static/description/demo03.jpg
Normal file
|
After Width: | Height: | Size: 191 KiB |
BIN
app_deepseek/static/description/demo04.jpg
Normal file
|
After Width: | Height: | Size: 78 KiB |
BIN
app_deepseek/static/description/demo1.jpg
Normal file
|
After Width: | Height: | Size: 56 KiB |
BIN
app_deepseek/static/description/demo2.jpg
Normal file
|
After Width: | Height: | Size: 78 KiB |
BIN
app_deepseek/static/description/demo3.jpg
Normal file
|
After Width: | Height: | Size: 35 KiB |
BIN
app_deepseek/static/description/demo4.jpg
Normal file
|
After Width: | Height: | Size: 50 KiB |
BIN
app_deepseek/static/description/demo5.jpg
Normal file
|
After Width: | Height: | Size: 64 KiB |
BIN
app_deepseek/static/description/demo6.jpg
Normal file
|
After Width: | Height: | Size: 64 KiB |
BIN
app_deepseek/static/description/demo7.jpg
Normal file
|
After Width: | Height: | Size: 88 KiB |
BIN
app_deepseek/static/description/demo71.jpg
Normal file
|
After Width: | Height: | Size: 137 KiB |
BIN
app_deepseek/static/description/demo8.jpg
Normal file
|
After Width: | Height: | Size: 124 KiB |
BIN
app_deepseek/static/description/demo81.jpg
Normal file
|
After Width: | Height: | Size: 45 KiB |
BIN
app_deepseek/static/description/demo9.jpg
Normal file
|
After Width: | Height: | Size: 171 KiB |
BIN
app_deepseek/static/description/demo91.jpg
Normal file
|
After Width: | Height: | Size: 27 KiB |
BIN
app_deepseek/static/description/demo_deepseek.jpg
Normal file
|
After Width: | Height: | Size: 131 KiB |
BIN
app_deepseek/static/description/demoa.jpg
Normal file
|
After Width: | Height: | Size: 48 KiB |
BIN
app_deepseek/static/description/demob.jpg
Normal file
|
After Width: | Height: | Size: 247 KiB |
BIN
app_deepseek/static/description/icon.png
Normal file
|
After Width: | Height: | Size: 3.5 KiB |
322
app_deepseek/static/description/index.html
Normal file
@@ -0,0 +1,322 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!--
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
##############################################################################
|
||||||
|
# Copyright (C) 2009~2024 odooAi.cn
|
||||||
|
##############################################################################
|
||||||
|
-->
|
||||||
|
<html>
|
||||||
|
<!-- begin title-->
|
||||||
|
<section class="oe_container container o_cc o_cc2">
|
||||||
|
<h2 class="text-center bg-warning text-white pt24 pb24">Deepseek Ai for odoo ai center,Mass AIGC Generator. </h2>
|
||||||
|
<h4 class="text-center">DeepSeek深度求索Ai支持-全Ai服务管理中心,全网Ai对接核心框架</h4>
|
||||||
|
</section>
|
||||||
|
<!-- end title-->
|
||||||
|
|
||||||
|
<section class="oe_container container">
|
||||||
|
<div class="oe_row oe_spaced" >
|
||||||
|
<div class="row">
|
||||||
|
<div class="oe_row">
|
||||||
|
<h3>Latest update: v17.0.25.02.07</h3>
|
||||||
|
<div class="row">
|
||||||
|
<img class="oe_demo oe_screenshot img img-fluid" style="max-height: 100%;" src="banner.png">
|
||||||
|
</div>
|
||||||
|
<div class="oe_span12 oe_spaced">
|
||||||
|
<div class="alert alert-info" style="padding:8px;font-weight: 300; font-size: 20px;">
|
||||||
|
<i class="fa fa-hand-o-right"></i><b> Key features: </b>
|
||||||
|
<ul class="list-unstyled">
|
||||||
|
<li>
|
||||||
|
<i class="fa fa-check-square-o text-primary"></i>
|
||||||
|
1. Deepseek Ai support for Multi Ai robot Connector. Ai Chat, character setup and train.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<i class="fa fa-check-square-o text-primary"></i>
|
||||||
|
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.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<i class="fa fa-check-square-o text-primary"></i>
|
||||||
|
3. Bind ChatGpt Api to user. So we can chat to robot user or use ChatGpt Channel for Group Chat.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<i class="fa fa-check-square-o text-primary"></i>
|
||||||
|
4. White and black List for ChatGpt.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<i class="fa fa-check-square-o text-primary"></i>
|
||||||
|
5. Setup Demo Chat time for every new user.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<i class="fa fa-check-square-o text-primary"></i>
|
||||||
|
6. Easy Start and Stop ChatGpt.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<i class="fa fa-check-square-o text-primary"></i>
|
||||||
|
7. Evaluation the ai robot to make better response. This training.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<i class="fa fa-check-square-o text-primary"></i>
|
||||||
|
8. Add api support Connect the Microsoft Azure OpenAI Service.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<i class="fa fa-check-square-o text-primary"></i>
|
||||||
|
9. Can set Synchronous or Asynchronous mode for Ai response.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<i class="fa fa-check-square-o text-primary"></i>
|
||||||
|
10.Filter Sensitive Words Setup.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<i class="fa fa-check-square-o text-primary"></i>
|
||||||
|
11. Multi-language Support. Multi-Company Support.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<i class="fa fa-check-square-o text-primary"></i>
|
||||||
|
12. Support Odoo 16,15,14,13,12, Enterprise and Community and odoo.sh Edition.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<i class="fa fa-check-square-o text-primary"></i>
|
||||||
|
13. Full Open Source.
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="oe_container container">
|
||||||
|
<div class="oe_row oe_spaced">
|
||||||
|
<h2 class="bg-warning text-center pt8 pb8 mt16 mb16">Add more Ai support like Deepseek Ai, google bard, chatgpt 4, baidu china</h2>
|
||||||
|
<h4 class="oe_slogan"> Need to navigate to odoo app store to buy and install addons</h4>
|
||||||
|
<div class="oe_demo oe_screenshot img img-fluid">
|
||||||
|
<img src="demo01.jpg"/>
|
||||||
|
</div>
|
||||||
|
<h4 class="oe_slogan">Please apply for the api first from deepseek follow https://api-docs.deepseek.com/</h4>
|
||||||
|
<div class="oe_demo oe_screenshot img img-fluid">
|
||||||
|
<img src="apply1.jpg"/>
|
||||||
|
</div>
|
||||||
|
<h4 class="oe_slogan">Setup for your own key</h4>
|
||||||
|
<div class="oe_demo oe_screenshot img img-fluid">
|
||||||
|
<img src="apply5.jpg"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="oe_container container">
|
||||||
|
<div class="oe_row oe_spaced">
|
||||||
|
<h2 class="bg-warning text-center pt8 pb8 mt16 mb16">Easy to use Ai Robot with multi Provider. Easy chat, easy help</h2>
|
||||||
|
<h4 class="oe_slogan">Deepseek or Open Ai for more smart. 中国用户可以使用deepseek</h4>
|
||||||
|
<div class="oe_demo oe_screenshot img img-fluid">
|
||||||
|
<img src="demo_deepseek.jpg"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="oe_container container">
|
||||||
|
<div class="oe_row oe_spaced">
|
||||||
|
<h2 class="bg-warning text-center pt8 pb8 mt16 mb16">1. Multi ChatGpt openAI robot Connector. Chat and train.</h2>
|
||||||
|
<h4 class="oe_slogan"> Goto Setting--> GPT Robot to setup your robot api. </h4>
|
||||||
|
<p> Input your api key, And Select the api model you need to use.</p>
|
||||||
|
<div class="oe_demo oe_screenshot img img-fluid">
|
||||||
|
<img src="demo1.jpg"/>
|
||||||
|
</div>
|
||||||
|
<p> You can set the Temperature higer for more creative answer.</p>
|
||||||
|
<div class="oe_demo oe_screenshot img img-fluid">
|
||||||
|
<img src="demo2.jpg"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
|
||||||
|
<section class="oe_container container">
|
||||||
|
<div class="oe_row oe_spaced">
|
||||||
|
<h2 class="bg-warning text-center pt8 pb8 mt16 mb16">2. Multi Api support, Chatgpt 3.5 Turbo, Chatgpt 3 Davinci, Chatgpt 2 Code Optimized, 'Dall-E Image.</h2>
|
||||||
|
<h4 class="oe_slogan"> Choose the model you want to use</h4>
|
||||||
|
<div class="oe_demo oe_screenshot img img-fluid">
|
||||||
|
<img src="demo2.jpg"/>
|
||||||
|
</div>
|
||||||
|
<p> You can set the Temperature higer for more creative answer.</p>
|
||||||
|
<div class="oe_demo oe_screenshot img img-fluid">
|
||||||
|
<img src="demo3.jpg"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="oe_container container">
|
||||||
|
<div class="oe_row oe_spaced">
|
||||||
|
<h2 class="bg-warning text-center pt8 pb8 mt16 mb16">3. Bind ChatGpt Api to user. So we can chat to robot user or use ChatGpt Channel for Group Chat.</h2>
|
||||||
|
<h4 class="oe_slogan"> Go Settings ->users, bind chatgpt to some user.</h4>
|
||||||
|
<img src="demo4.jpg"/>
|
||||||
|
</div>
|
||||||
|
<h4 class="oe_slogan"> So you can have many user, and many chatgpt robot. This provide you an Ai pool.</h4>
|
||||||
|
<div class="oe_demo oe_screenshot img img-fluid">
|
||||||
|
<img src="demo5.jpg"/>
|
||||||
|
</div>
|
||||||
|
<h4 class="oe_slogan"> You can set the blacklist to this chatgpt robot to limit request. Also you can setup Demo time for every normal user..</h4>
|
||||||
|
<div class="oe_demo oe_screenshot img img-fluid">
|
||||||
|
<img src="demo6.jpg"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="oe_container container">
|
||||||
|
<div class="oe_row oe_spaced">
|
||||||
|
<h2 class="bg-warning text-center pt8 pb8 mt16 mb16">4. White and black List for ChatGpt.</h2>
|
||||||
|
<h2 class="bg-warning text-center pt8 pb8 mt16 mb16">5. Setup Demo Chat time for every new user.</h2>
|
||||||
|
<h4 class="oe_slogan"> You can set the blacklist to this chatgpt robot to limit request. Also you can setup Demo time for every normal user..</h4>
|
||||||
|
<div class="oe_demo oe_screenshot img img-fluid">
|
||||||
|
<img src="demo6.jpg"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="oe_container container">
|
||||||
|
<div class="oe_row oe_spaced">
|
||||||
|
<h2 class="bg-warning text-center pt8 pb8 mt16 mb16">6. Easy Start and Stop ChatGpt..</h2>
|
||||||
|
<h4 class="oe_slogan"> You can easy chat with the apt robot with odoo IM</h4>
|
||||||
|
<div class="oe_demo oe_screenshot img img-fluid">
|
||||||
|
<img src="demo7.jpg"/>
|
||||||
|
</div>
|
||||||
|
<h4 class="oe_slogan"> You can chat with several robot in the same time</h4>
|
||||||
|
<div class="oe_demo oe_screenshot img img-fluid">
|
||||||
|
<img src="demo8.jpg"/>
|
||||||
|
</div>
|
||||||
|
<h4 class="oe_slogan"> If you have more than 1 robot in the group. you can @ the specify robot.</h4>
|
||||||
|
<div class="oe_demo oe_screenshot img img-fluid">
|
||||||
|
<img src="demo9.jpg"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
|
||||||
|
<section class="oe_container container">
|
||||||
|
<div class="oe_row oe_spaced">
|
||||||
|
<h2 class="bg-warning text-center pt8 pb8 mt16 mb16">7. Evaluation the ai robot to make better response. This training.</h2>
|
||||||
|
<h4 class="oe_slogan"> You can Evaluation chatgpt's answer. Mark as good for good answer. Mark as back for bad answer.</h4>
|
||||||
|
<p> With Evaluation, you can make your ai robot more smart.
|
||||||
|
<div class="oe_demo oe_screenshot img img-fluid">
|
||||||
|
<img src="demo71.jpg"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="oe_container container">
|
||||||
|
<div class="oe_row oe_spaced">
|
||||||
|
<h2 class="bg-warning text-center pt8 pb8 mt16 mb16">8. Add api support Connect the Microsoft Azure OpenAI Service.</h2>
|
||||||
|
<h4 class="oe_slogan"> Azure openai add. It is for china and other country which no chatgpt service.</h4>
|
||||||
|
<div class="oe_demo oe_screenshot img img-fluid">
|
||||||
|
<img src="demo81.jpg"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="oe_container container">
|
||||||
|
<div class="oe_row oe_spaced">
|
||||||
|
<h2 class="bg-warning text-center pt8 pb8 mt16 mb16">9. Can set Synchronous or Asynchronous mode for Ai response.</h2>
|
||||||
|
<h4 class="oe_slogan"> Synchronous(default) mode can get response then ask question again. Asynchronous mode would make you do other thing when waiting for response.</h4>
|
||||||
|
<div class="oe_demo oe_screenshot img img-fluid">
|
||||||
|
<img src="demo91.jpg"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="oe_container container">
|
||||||
|
<div class="oe_row oe_spaced">
|
||||||
|
<h2 class="bg-warning text-center pt8 pb8 mt16 mb16">Multi-language Support..</h2>
|
||||||
|
<h4 class="oe_slogan"> </h4>
|
||||||
|
<div class="oe_demo oe_screenshot img img-fluid">
|
||||||
|
<img src="cnreadme.jpg"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<!-- begin howto-->
|
||||||
|
<section class="oe_container container s_text_block o_colored_level pt16 pb16">
|
||||||
|
<h2 class="text-center bg-info text-white pt16 pb16">- How to setup and use -</h2>
|
||||||
|
</section>
|
||||||
|
<section class="oe_container container">
|
||||||
|
<div class="oe_row oe_spaced">
|
||||||
|
<h4 class="pt16">
|
||||||
|
1. Get ChatGPT Api key from openai or azure.
|
||||||
|
</h4>
|
||||||
|
<p>Api From Azure, please read </p>
|
||||||
|
<p>https://www.odooai.cn/blog/odoo-install-deploy-6/chatgpt4-china-application-chatgpt3-5-free-one-year-microsoft-azure-openai-api-registration-tutorial-odoo-aicenter-integration-28 </p>
|
||||||
|
|
||||||
|
<p>Api For deepseek, please follow</p>
|
||||||
|
<div class="row">
|
||||||
|
<div class="oe_demo oe_screenshot img img-fluid">
|
||||||
|
<img src="apply1.jpg">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<h4 class="pt16">2. Setup your Api information from Settings -- Users --Ai Robot</h4>
|
||||||
|
<div class="row">
|
||||||
|
<div class="oe_demo oe_screenshot img img-fluid">
|
||||||
|
<img src="setup2.jpg">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<h4 class="pt16">3. Setup your Api Provider(openai) , api key, End point</h4>
|
||||||
|
<div class="row">
|
||||||
|
<div class="oe_demo oe_screenshot img img-fluid">
|
||||||
|
<img src="setup3.jpg">
|
||||||
|
</div>
|
||||||
|
<p> As openai change the api often, sometime you need to check</p>
|
||||||
|
<p> https://platform.openai.com/docs/introduction</p>
|
||||||
|
</div>
|
||||||
|
<h4 class="pt16">4.Bind your Ai Robot (GPT) to a User. We already setup a sample.</h4>
|
||||||
|
<div class="row">
|
||||||
|
<div class="oe_demo oe_screenshot img img-fluid">
|
||||||
|
<img src="setup4.jpg">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<h4 class="pt16">5. Bind your Ai User to Channel from Discuss. We already setup a sample.</h4>
|
||||||
|
<div class="row">
|
||||||
|
<div class="oe_demo oe_screenshot img img-fluid">
|
||||||
|
<img src="setup5.jpg">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<h5 class="pt16">6. You can setup the Ai system context and Character.</h5>
|
||||||
|
<div class="row">
|
||||||
|
<div class="oe_demo oe_screenshot img img-fluid">
|
||||||
|
<img src="setup6.jpg">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<h5 class="pt16">7. You can setup Lots of channel for subjects and projects..</h5>
|
||||||
|
<div class="row">
|
||||||
|
<div class="oe_demo oe_screenshot img img-fluid">
|
||||||
|
<img src="setup7.jpg">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
<!-- end howto-->
|
||||||
|
|
||||||
|
<!-- begin support-->
|
||||||
|
<section class="container oe_dark">
|
||||||
|
<div class="oe_row oe_spaced text-center">
|
||||||
|
<div class="row">
|
||||||
|
<h2 class="oe_slogan">Technical Help & Support</h2>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-12 pad0">
|
||||||
|
<div class="oe_mt16">
|
||||||
|
<p><h4 class="pt16">
|
||||||
|
For any type of technical help & support requests, Feel free to contact us</h4></p>
|
||||||
|
<a style="background: #002e5a none repeat scroll 0% 0%; color: rgb(255, 255, 255);position: relative; overflow: hidden;"
|
||||||
|
class="btn btn-warning btn-lg" rel="nofollow" href="mailto:odoo@china.com"><span
|
||||||
|
style="height: 354px; width: 354px; top: -147.433px; left: -6.93335px;" class="o_ripple"></span>
|
||||||
|
<i class="fa fa-envelope"></i> odoo@china.com</a>
|
||||||
|
<p><h4 class="pt16">
|
||||||
|
Via QQ: 300883 (App user would not get QQ or any other IM support. Only for odoo project customize.)</h4></p>
|
||||||
|
<a style="background: #002e5a none repeat scroll 0% 0%; color: rgb(255, 255, 255);position: relative; overflow: hidden;"
|
||||||
|
class="btn btn-warning btn-lg" rel="nofollow" href="mailto:300883@qq.com"><span
|
||||||
|
style="height: 354px; width: 354px; top: -147.433px; left: -6.93335px;" class="o_ripple"></span>
|
||||||
|
<i class="fa fa-envelope"></i> 300883@qq.com</a>
|
||||||
|
</div>
|
||||||
|
<div class="oe_mt16">
|
||||||
|
<h4 class="pt16">Visit our website for more support.</h4>
|
||||||
|
<h4 class="pt16">https://www.odooai.cn</h4>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</html>
|
||||||
BIN
app_deepseek/static/description/setup2.jpg
Normal file
|
After Width: | Height: | Size: 92 KiB |
BIN
app_deepseek/static/description/setup3.jpg
Normal file
|
After Width: | Height: | Size: 88 KiB |
BIN
app_deepseek/static/description/setup4.jpg
Normal file
|
After Width: | Height: | Size: 101 KiB |
BIN
app_deepseek/static/description/setup5.jpg
Normal file
|
After Width: | Height: | Size: 109 KiB |
BIN
app_deepseek/static/description/setup6.jpg
Normal file
|
After Width: | Height: | Size: 79 KiB |
BIN
app_deepseek/static/description/setup7.jpg
Normal file
|
After Width: | Height: | Size: 144 KiB |
BIN
app_deepseek/static/src/img/deepseek.png
Normal file
|
After Width: | Height: | Size: 3.5 KiB |
0
app_deepseek/static/src/odooai.cn
Normal file
13
app_deepseek/views/ai_robot_views.xml
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
|
<odoo>
|
||||||
|
<!-- <record id="baidu_ai_robot_form_view" model="ir.ui.view">
|
||||||
|
<field name="name">baidu.ai.robot.form</field>
|
||||||
|
<field name="model">ai.robot</field>
|
||||||
|
<field name="inherit_id" ref="app_chatgpt.ai_robot_form_view"/>
|
||||||
|
<field name="arch" type="xml">
|
||||||
|
<xpath expr="//field[@name='openapi_api_key']" position="after">
|
||||||
|
<field name="client_secret" password="True"/>
|
||||||
|
</xpath>
|
||||||
|
</field>
|
||||||
|
</record> -->
|
||||||
|
</odoo>
|
||||||
@@ -31,7 +31,7 @@
|
|||||||
'category': 'Base',
|
'category': 'Base',
|
||||||
'website': 'https://www.odooai.cn',
|
'website': 'https://www.odooai.cn',
|
||||||
'live_test_url': 'https://demo.odooapp.cn',
|
'live_test_url': 'https://demo.odooapp.cn',
|
||||||
'license': 'OPL-1',
|
'license': 'LGPL-3',
|
||||||
'sequence': 2,
|
'sequence': 2,
|
||||||
'price': 0.00,
|
'price': 0.00,
|
||||||
'currency': 'EUR',
|
'currency': 'EUR',
|
||||||
|
|||||||
@@ -4,5 +4,4 @@
|
|||||||
from . import res_config_settings
|
from . import res_config_settings
|
||||||
from . import auth_oauth_provider
|
from . import auth_oauth_provider
|
||||||
from . import res_users
|
from . import res_users
|
||||||
|
from . import ir_config_parameter
|
||||||
|
|
||||||
|
|||||||
17
app_saas/models/ir_config_parameter.py
Normal file
@@ -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})
|
||||||
@@ -29,7 +29,7 @@
|
|||||||
'category': 'Base',
|
'category': 'Base',
|
||||||
'website': 'https://www.odooai.cn',
|
'website': 'https://www.odooai.cn',
|
||||||
'live_test_url': 'https://demo.odooapp.cn',
|
'live_test_url': 'https://demo.odooapp.cn',
|
||||||
'license': 'OPL-1',
|
'license': 'LGPL-3',
|
||||||
'sequence': 2,
|
'sequence': 2,
|
||||||
'price': 2.00,
|
'price': 2.00,
|
||||||
'currency': 'EUR',
|
'currency': 'EUR',
|
||||||
|
|||||||