Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion ai_helpdesk_agent/__manifest__.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
'name': 'AI Helpdesk Agent',
'version': '16.0.0.1.0',
'version': '18.0.0.1.0',
'summary': 'Process tickets with AI and send responses to customers.',
'description': 'AI for helpdesk tickets',
'category': 'Services/Helpdesk',
Expand Down
2 changes: 2 additions & 0 deletions ai_helpdesk_agent/const.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
class AIActions:
"""AI Actions for Helpdesk Tickets get from AI API"""
ESCALATE = 'ESCALATE'

HTML_FOR_AI_RESPONSE = True
2 changes: 0 additions & 2 deletions ai_helpdesk_agent/models/conversation_examples.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ class ConversationExamples(models.Model):
ticket_id = fields.Many2one('helpdesk.ticket')
subject = fields.Char()
description = fields.Char()
ticket_type_id = fields.Many2one('helpdesk.ticket.type')
partner_id = fields.Many2one('res.partner')
customer_name = fields.Char()
customer_email = fields.Char()
Expand All @@ -32,7 +31,6 @@ def get_conv_examples(self):
'ticket_id': exmpl_id.ticket_id.id,
'subject': '',
'description': exmpl_id.description,
'ticket_type': exmpl_id.ticket_type_id.name,
'status': exmpl_id.state if exmpl_id.active else 'archived',
'last_update_at': str(exmpl_id.write_date.timestamp()).split('.')[0],
'customer_name': exmpl_id.customer_name,
Expand Down
4 changes: 2 additions & 2 deletions ai_helpdesk_agent/models/helpdesk_team.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
class HelpdeskTeam(models.Model):
_inherit = 'helpdesk.team'

mail_shortcode_ids = fields.Many2many('mail.shortcode')
mail_shortcode_ids = fields.Many2many('mail.canned.response')

@api.model
def get_templates(self):
Expand All @@ -18,4 +18,4 @@ def get_templates(self):
'id': canned.id,
'substitution': canned.substitution,
} for canned in team.mail_shortcode_ids]
return json.dumps(templates)
return json.dumps(templates)
13 changes: 8 additions & 5 deletions ai_helpdesk_agent/models/helpdesk_ticket.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
from odoo import models, fields, api
from odoo.fields import Command

from ..const import AIActions
from ..const import AIActions, HTML_FOR_AI_RESPONSE

_logger = logging.getLogger(__name__)

Expand All @@ -17,7 +17,8 @@ def send_default_email(ticket_id):


def send_ai_response(ticket_id, ai_result, user_id):
ticket_id.sudo().message_post(body=ai_result, message_type='comment', subtype_xmlid='mail.mt_comment',
ticket_id.sudo().message_post(body=ai_result, body_is_html=HTML_FOR_AI_RESPONSE,
message_type='comment', subtype_xmlid='mail.mt_comment',
author_id=user_id.sudo().partner_id.id)

def get_ai_user(env):
Expand Down Expand Up @@ -121,6 +122,9 @@ def _process_ai_response(self, request, continue_conv):
self._set_error_tag()
_logger.error(f'{self.id} AI Error, text: {request.text}, status: {request.status_code}')
return
if dry_run:
send_default_email(self)
return
request_data = request.json()
text = request_data.get('text', '')
escalate = request_data.get('actions', [])
Expand All @@ -130,7 +134,8 @@ def _process_ai_response(self, request, continue_conv):
if text:
send_ai_response(self, text, ai_user_id)
if reasoning:
self.message_post(body=reasoning, message_type='comment', subtype_xmlid='mail.mt_note')
self.message_post(body=reasoning, body_is_html=HTML_FOR_AI_RESPONSE,
message_type='comment', subtype_xmlid='mail.mt_note')

def _save_ticket(self, escalate, continue_conv):
self.ensure_one()
Expand Down Expand Up @@ -199,7 +204,6 @@ def _get_request_data(self, messages=[]):
'ticket_id': self.id,
'subject': self.name if self.name else '',
'description': str(self.description) if self.description else '',
'ticket_type': self.ticket_type_id.name if self.ticket_type_id.name else '',
'customer_name': self.partner_id.name if self.partner_id.name else '',
'customer_email': self.partner_id.email if self.partner_id.email else '',
'question': '',
Expand All @@ -214,7 +218,6 @@ def _action_conv_expl(self):
'ticket_id': self.id,
'subject': self.name,
'description': str(self.description),
'ticket_type_id': self.ticket_type_id.id,
'partner_id': self.partner_id.id,
'customer_name': self.partner_id.name,
'customer_email': self.partner_id.email,
Expand Down
65 changes: 35 additions & 30 deletions ai_helpdesk_agent/views/conversation_examples_view.xml
Original file line number Diff line number Diff line change
Expand Up @@ -8,59 +8,64 @@
<form>
<header>
<field name="set_readonly" invisible="1"/>
<field name="state" widget="statusbar" options="{'clickable': '1'}"
attributes="{'readonly': [('state', '=', 'published')]}"/>
<field name="state" widget="statusbar"
options="{'clickable': true}"
readonly="state == 'published'"/>
</header>
<group>
<sheet>
<group>
<field name="ticket_id"/>
<field name="description"/>
<field name="ticket_type_id" required="1"/>
<group>
<field name="ticket_id"/>
<field name="description"/>
</group>
<group>
<field name="customer_name" required="1"/>
<field name="customer_email" required="1"/>
<field name="question" invisible="1"/>
</group>
</group>
<group>
<field name="customer_name" required="1"/>
<field name="customer_email" required="1"/>
<field name="question" invisible="1"/>
</group>
</group>
<notebook>
<page name="messages" string="Messages">
<field name="message_ids">
<tree editable="bottom">
<field name="sequence" widget="handle"/>
<field name="role" required="1"/>
<field name="body" required="1"/>
</tree>
</field>
</page>
</notebook>
<notebook>
<page name="messages" string="Messages">
<field name="message_ids">
<list editable="bottom">
<field name="sequence" widget="handle"/>
<field name="role" required="1"/>
<field name="body" required="1"/>
</list>
</field>
</page>
</notebook>
</sheet>
</form>
</field>
</record>

<record id="view_conversation_examples_tree" model="ir.ui.view">
<field name="name">aihd.conversation_examples.tree</field>
<field name="name">aihd.conversation_examples.list</field>
<field name="model">aihd.conversation_examples</field>
<field name="arch" type="xml">
<tree>
<list>
<field name="id"/>
<field name="description"/>
<field name="ticket_id"/>
<field name="write_date"/>
<field name="state"/>
</tree>
<field name="state" decoration-info="state == 'draft'"
decoration-success="state == 'published'"/>
</list>
</field>
</record>


<record id="view_conversation_examples_action" model="ir.actions.act_window">
<field name="name">Dialogs</field>
<field name="res_model">aihd.conversation_examples</field>
<field name="view_mode">tree,form</field>
<field name="view_mode">list,form</field>
</record>

<menuitem id="helpdesk_ticket_conversation_examples" name="Dialogs"
<menuitem id="helpdesk_ticket_conversation_examples"
name="Dialogs"
action="view_conversation_examples_action"
sequence="30" parent="helpdesk.helpdesk_ticket_menu_main"/>
sequence="30"
parent="helpdesk.helpdesk_ticket_menu_main"/>

</odoo>
30 changes: 15 additions & 15 deletions ai_helpdesk_agent/views/helpdesk_team_view.xml
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<record id="ai_helpdesk_agent_helpdesk_team_form_inherit" model="ir.ui.view">
<field name="name">ai_helpdesk_agent.helpdesk.team.form.inherit</field>
<field name="model">helpdesk.team</field>
<field name="inherit_id" ref="helpdesk.helpdesk_team_view_form"/>
<field name="arch" type="xml">
<xpath expr="//div[hasclass('oe_title')]" position="after">
<div>
<br/>
<label for="mail_shortcode_ids" string="Canned responses: "/>
<h3><field name="mail_shortcode_ids" widget="many2many_tags"/></h3>
<record id="ai_helpdesk_agent_helpdesk_team_form_inherit" model="ir.ui.view">
<field name="name">ai_helpdesk_agent.helpdesk.team.form.inherit</field>
<field name="model">helpdesk.team</field>
<field name="inherit_id" ref="helpdesk.helpdesk_team_view_form"/>
<field name="arch" type="xml">
<xpath expr="//div[hasclass('oe_title')]" position="after">
<div class="row mt-2">
<div class="col-12">
<label for="mail_shortcode_ids" string="Canned responses"/>
<field name="mail_shortcode_ids" widget="many2many_tags"/>
</div>
</xpath>
</field>
</record>
</data>
</div>
</xpath>
</field>
</record>
</odoo>
76 changes: 38 additions & 38 deletions ai_helpdesk_agent/views/helpdesk_ticket.xml
Original file line number Diff line number Diff line change
@@ -1,43 +1,43 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<record id="ai_helpdesk_agent_helpdesk_ticket_form_inherit" model="ir.ui.view">
<field name="name">ai_helpdesk_agent.helpdesk.ticket.form.inherit</field>
<field name="model">helpdesk.ticket</field>
<field name="inherit_id" ref="helpdesk.helpdesk_ticket_view_form"/>
<field name="arch" type="xml">
<xpath expr="//div[hasclass('oe_button_box')]" position="inside">
<button class="oe_stat_button" type="object" name="action_open_helpdesk_conv_exml"
icon="fa-comments"
attrs="{'invisible': [('conv_exml_count', '=', 0)]}">
<field name="conv_exml_count" widget="statinfo" string="Dialogs"/>
</button>
</xpath>
</field>
</record>
<record id="ai_helpdesk_agent_helpdesk_ticket_form_inherit" model="ir.ui.view">
<field name="name">ai_helpdesk_agent.helpdesk.ticket.form.inherit</field>
<field name="model">helpdesk.ticket</field>
<field name="inherit_id" ref="helpdesk.helpdesk_ticket_view_form"/>
<field name="arch" type="xml">
<xpath expr="//header" position="inside">
<button type="object"
name="action_open_helpdesk_conv_exml"
class="btn btn-secondary"
icon="fa-comments"
invisible="conv_exml_count == 0">
<field name="conv_exml_count" class="me-1"/>Dialogs
</button>
</xpath>
</field>
</record>

<record id="aihd_view_helpdesk_ticket_search_inherit" model="ir.ui.view">
<field name="name">AI helpdesk.ticket.search.inherit</field>
<field name="model">helpdesk.ticket</field>
<field name="inherit_id" ref="helpdesk.helpdesk_tickets_view_search"/>
<field name="arch" type="xml">
<xpath expr="//filter[@name='unassigned']" position="after">
<filter string="AI Redirected"
domain="[('is_ai_redirected','=',True)]"
name="ai_redirected"
/>
</xpath>
</field>
</record>
<record id="aihd_view_helpdesk_ticket_search_inherit" model="ir.ui.view">
<field name="name">AI helpdesk.ticket.search.inherit</field>
<field name="model">helpdesk.ticket</field>
<field name="inherit_id" ref="helpdesk.helpdesk_tickets_view_search"/>
<field name="arch" type="xml">
<filter name="unassigned" position="after">
<filter string="AI Redirected"
name="ai_redirected"
domain="[('is_ai_redirected', '=', True)]"/>
</filter>
</field>
</record>

<record id="ai_helpdesk_agent_helpdesk_ticket_tree_inherit" model="ir.ui.view">
<field name="name">ai_helpdesk_agent.helpdesk.ticket.tree.inherit</field>
<field name="model">helpdesk.ticket</field>
<field name="inherit_id" ref="helpdesk.helpdesk_tickets_view_tree"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='stage_id']" position="after">
<field name="total_message_by_agent" optional="show"/>
</xpath>
<record id="ai_helpdesk_agent_helpdesk_ticket_tree_inherit" model="ir.ui.view">
<field name="name">ai_helpdesk_agent.helpdesk.ticket.tree.inherit</field>
<field name="model">helpdesk.ticket</field>
<field name="inherit_id" ref="helpdesk.helpdesk_tickets_view_tree"/>
<field name="arch" type="xml">
<field name="stage_id" position="after">
<field name="total_message_by_agent" optional="show"/>
</field>
</record>
</data>
</field>
</record>
</odoo>
2 changes: 1 addition & 1 deletion ai_helpdesk_agent/views/res_config_settings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
<field name="model">res.config.settings</field>
<field name="inherit_id" ref="base.res_config_settings_view_form"/>
<field name="arch" type="xml">
<xpath expr="//div[hasclass('settings')]" position="inside">
<xpath expr="//form" position="inside">
<div class="app_settings_block" string="Helpdesk AI" data-key="helpdesk_ai_user_id">
<h2>Helpdesk AI</h2>
<div class="row mt16 o_settings_container" id="helpdesk_ai_settings">
Expand Down