菜单跳转

This commit is contained in:
李鹏宇
2026-07-02 10:28:24 +08:00
parent e80910e522
commit 561691f33c
5 changed files with 33 additions and 86 deletions
-79
View File
@@ -1,31 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<odoo noupdate="1">
<!-- noupdate=1: 仅首次安装时创建,升级不会覆盖已有数据 -->
<!-- ===================== 回复指令类 ===================== -->
<record id="rule_concise_reply" model="ai.rule">
<field name="name">简洁回复</field>
<field name="rule_type">instruction</field>
<field name="priority">5</field>
<field name="content">所有回复控制在 200 字以内,重点突出结论,避免冗长的铺垫和解释。如果内容较多,优先使用表格或列表形式呈现。</field>
<field name="provider_ids" eval="[(4, ref('provider_deepseek'))]"/>
</record>
<record id="rule_data_format" model="ai.rule">
<field name="name">数据展示规范</field>
<field name="rule_type">instruction</field>
<field name="priority">10</field>
<field name="content">当查询到多条数据时,必须用 Markdown 表格呈现,表头使用中文名称。金额字段保留两位小数并加上 ¥ 前缀,日期使用 YYYY-MM-DD 格式。</field>
<field name="provider_ids" eval="[(4, ref('provider_deepseek'))]"/>
</record>
<record id="rule_professional_tone" model="ai.rule">
<field name="name">专业商务风格</field>
<field name="rule_type">instruction</field>
<field name="priority">15</field>
<field name="content">使用专业、正式的商务语气回复,避免口语化表达、网络用语和表情符号。对不确定的信息要明确说明"暂无相关数据",不得猜测或编造。</field>
</record>
<!-- ===================== 限制规则类 ===================== -->
<record id="rule_no_salary" model="ai.rule">
<field name="name">禁止薪资话题</field>
@@ -48,57 +22,4 @@
<field name="priority">3</field>
<field name="content">禁止协助用户修改系统参数(ir.config_parameter)、用户权限组(res.groups)、安全规则(ir.rule)等系统级配置。统一回复"系统配置修改需由管理员在后台操作,请联系 IT 部门。"</field>
</record>
<!-- ===================== 技能接口类 ===================== -->
<record id="rule_skill_weather" model="ai.rule">
<field name="name">天气查询技能</field>
<field name="rule_type">skill</field>
<field name="priority">10</field>
<field name="skill_name">query_weather</field>
<field name="skill_description">当用户询问某个城市的天气状况时调用此技能,获取实时天气数据。</field>
<field name="skill_parameters">{
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "要查询的城市名,如:北京、上海、深圳"
}
},
"required": ["city"]
}</field>
<field name="skill_endpoint">https://api.example.com/weather</field>
<field name="skill_method">GET</field>
<field name="skill_headers">{}</field>
<field name="skill_timeout">5</field>
<field name="active" eval="False"/>
</record>
<record id="rule_skill_knowledge_base" model="ai.rule">
<field name="name">企业知识库检索</field>
<field name="rule_type">skill</field>
<field name="priority">5</field>
<field name="skill_name">search_knowledge</field>
<field name="skill_description">当用户询问公司制度、流程规范、操作手册等内部知识时,调用此技能从企业知识库中检索相关内容。</field>
<field name="skill_parameters">{
"type": "object",
"properties": {
"query": {
"type": "string",
"description": "用户的问题或关键词"
},
"category": {
"type": "string",
"enum": ["制度规范", "操作手册", "常见问题", "全部"],
"description": "知识分类,默认全部"
}
},
"required": ["query"]
}</field>
<field name="skill_endpoint">https://api.example.com/knowledge/search</field>
<field name="skill_method">POST</field>
<field name="skill_headers">{"Authorization": "Bearer YOUR_API_KEY"}</field>
<field name="skill_timeout">10</field>
<field name="active" eval="False"/>
</record>
</odoo>
+4 -4
View File
@@ -215,7 +215,7 @@ class AiRule(models.Model):
string='触发值',
help='字段值等于什么时触发,如 True',
)
guide_message = fields.Text(
guide_message = fields.Char(
string='提醒内容',
help='主动弹出时显示的文字,支持变量:{record_name}, {user_name}',
)
@@ -223,8 +223,8 @@ class AiRule(models.Model):
string='按钮文字',
default='确认执行',
)
guide_button_action = fields.Text(
string='按钮动作 (JSON)',
guide_button_action = fields.Char(
string='按钮方法配置',
help='按钮点击后执行的动作,JSON格式,如 {"type": "execute_tool", "tool": "notice_publish", "params": {"notice_id": "{record_id}"}}',
default='{}',
)
@@ -232,7 +232,7 @@ class AiRule(models.Model):
string='方法名称',
help='后台处理方法名,用于标识触发哪个逻辑',
)
guide_method_desc = fields.Text(
guide_method_desc = fields.Char(
string='方法说明',
)
+20 -2
View File
@@ -14,7 +14,8 @@
decoration-info="rule_type == 'instruction'"
decoration-warning="rule_type == 'restriction'"
decoration-success="rule_type == 'skill'"
decoration-danger="rule_type == 'method'"/>
decoration-danger="rule_type == 'method'"
decoration-primary="rule_type == 'active_guide'"/>
<field name="provider_ids" widget="many2many_tags"/>
<field name="group_ids" widget="many2many_tags"/>
<field name="active" widget="boolean_toggle"/>
@@ -61,10 +62,25 @@
<notebook>
<!-- 回复指令 / 限制规则 -->
<page string="规则内容" name="content"
invisible="rule_type in ('skill', 'method')">
invisible="rule_type in ('skill', 'method', 'active_guide')">
<field name="content" placeholder="写给 AI 的指令内容,如:所有回复不超过 200 字 / 不得回答薪资相关问题" nolabel="1"/>
</page>
<!-- 主动感知配置 -->
<page string="主动感知配置" name="active_guide"
invisible="rule_type != 'active_guide'">
<group>
<group string="引导内容">
<field name="guide_message"
placeholder="主动弹出时显示的文字,支持 {record_name} / {user_name} / {record_id}" />
<field name="guide_button_action"
placeholder='{"type": "execute_tool", "tool": "notice_publish", "params": {"notice_id": "{record_id}"}}' />
<field name="guide_method_desc"
placeholder="按钮对应后台方法的功能说明" />
</group>
</group>
</page>
<!-- 技能接口配置 -->
<page string="技能接口配置" name="skill"
invisible="rule_type != 'skill'">
@@ -137,6 +153,8 @@
domain="[('rule_type','=','skill')]"/>
<filter name="filter_method" string="模型方法"
domain="[('rule_type','=','method')]"/>
<filter name="filter_active_guide" string="主动感知"
domain="[('rule_type','=','active_guide')]"/>
<separator/>
<filter name="filter_active" string="已启用"
domain="[('active','=',True)]"/>
+1 -1
View File
@@ -23,7 +23,7 @@
'web.assets_backend': [
'yuthon_base/static/src/views/**/*',
'yuthon_base/static/src/js/datetime_picker.js',
# 'yuthon_base/static/src/scss/base.css',
'yuthon_base/static/src/scss/base.css',
]
},
'demo': [],
+8
View File
@@ -1,3 +1,11 @@
.flex-column {
flex-direction: row !important;
}
/* 隐藏控制面板右上角 Knowledge 搜索按钮 */
.o_control_panel .o_knowledge_icon_search,
.o_control_panel .o_cp_action_menus .o_knowledge_icon_search,
.o_form_view .o_knowledge_icon_search,
.o_cp_action_menus .o_knowledge_icon_search {
display: none !important;
}