Zum Inhalt springen

Odoo 19 Enterprise – AI Use Cases

24. März 2026 durch
Odoo 19 Enterprise – AI Use Cases
Dietmar Hamm

🔍 Recherchiert mit find_files, find_files, read_file, read_file, read_file, read_file, read_file, read_file, find_files, find_files, find_files, read_file, read_file, read_file, read_file, read_file, read_file, read_file, read_file, find_files, find_files, find_files, read_file, read_file, read_file, read_file, read_file


🤖 Odoo 19 Enterprise – AI Use Cases mit Beispielen

Ich habe den gesamten Quellcode durchsucht und kann dir jetzt konkrete, belegte Use Cases liefern. Hier sind alle 6 echten Anwendungsfälle mit detaillierten Beispielen:


📋 Use Case 1: „Ask AI" – Natürlichsprachige Navigation & Datenabfragen

Was passiert im Hintergrund?

enterprise_19/ai/data/ai_agent_data.xml:8<record id="ai_agent_natural_language_search"> mit llm_model="gemini-2.5-flash" und response_style="analytical"
Der „Ask AI"-Agent verwendet bewusst Gemini 2.5 Flash mit Temperature 0.2 (analytical) – das macht ihn schnell und präzise für Tool-Calls, nicht kreativ.

enterprise_19/ai/data/ai_agent_data.xml:13 → Das System-Prompt enthält zwei klar getrennte Entscheidungspfade:

  • „Wer/Wann/Wie"-Fragen → Information Retrieval (antwortet direkt)
  • „Zeig/Öffne/View"-Fragen → Navigation (öffnet Odoo-Ansicht)

Konkrete Beispiele:

Du tippst… Was die AI macht
„Who are my top 5 sales reps?" Ruft get_fields + read_group auf sale.order auf, antwortet direkt im Chat
„Show me a bar chart of top-selling products" Ruft get_menu_details + open_menu_graph auf – öffnet automatisch die richtige Ansicht mit Balkendiagramm
„Do I have customers in Japan?" Baut Domain [["country_id.code","=","JP"]], sucht in res.partner, antwortet mit Namen
„Pivot of products with less than 5 in stock" Ruft open_menu_pivot mit custom_domain=[["qty_on_hand","<",5]] auf

enterprise_19/ai/data/ai_topic_data.xml:51Kritische Regel im Code: Dotted-Paths wie lines.product_id.name sind NUR in custom_domain erlaubt – niemals in search oder groupbys. Das verhindert ORM-Fehler.

enterprise_19/ai/models/ai_prompt_button.py:4PROMPT_MODULE_MAP – Die Quick-Prompts im Systray sind modulabhängig: Nur wenn z.B. accounting installiert ist, erscheint „Show me the current cash flow status".


📧 Use Case 2: E-Mail & Chatter AI-Hilfe

2a. E-Mail verfassen (mail_composer)

enterprise_19/ai/data/ai_composer_data.xml:96<record id="ai_mail_composer"> – Das System-Prompt legt fest:

„YOUR REPLY WILL BE INSERTED AS IS – WRITE ONLY THE BODY. DO NOT ADD COMMENTARY, SUBJECT LINE, OR SIGNATURE."

Beispiel-Ablauf:

  1. Du öffnest die E-Mail-Compose-Maske auf einem CRM-Lead
  2. Du klickst auf „Write a followup answer"
  3. Die AI liest den bisherigen Chatter-Verlauf und schreibt einen passenden Antwort-Entwurf
  4. Der Text wird direkt in das Compose-Feld eingefügt – ohne Umweg

2b. Chatter zusammenfassen (chatter_ai_button)

enterprise_19/ai/data/ai_composer_data.xml:122<record id="ai_chatter_helper"> – Zwei Quick-Prompts sind vorinstalliert:

  • „Summarize the chatter conversation" → Gibt eine strukturierte Zusammenfassung: erst kurze Beschreibung, dann fettgedruckte Bullet-Points mit jedem Schlüsselereignis
  • „Write a followup answer" → Schreibt eine Antwort im Ton der bisherigen Nachrichten

2c. Markierten Text umschreiben (html_field_text_select)

enterprise_19/ai/data/ai_composer_data.xml:113<record id="ai_html_text_selector"> – Du markierst Text in einem HTML-Feld, die AI ersetzt ihn direkt. Quick-Prompt: „Rewrite selected text". Die Antwort ersetzt die Selektion 1:1.

2d. E-Mail-Template Platzhalter ausfüllen (html_prompt_shortcut)

enterprise_19/ai/data/ai_composer_data.xml:131<record id="ai_mail_template_prompt_evaluator"> – Wenn ein Template <div class="o_editor_prompt"> enthält, ersetzt die AI diese Platzhalter automatisch. Wichtige Regel aus dem Code:

„Ideas linked to false, undefined, null or [value] should be IGNORED – don't invent dates or names."

Beispiel aus dem Code (Zeile 160–165):

  • Input: "Insert a greeting mentioning 'Burger Maison' and reminding them of [deadline]."
  • Output: "We're thrilled to announce the launch of Burger Maison – thank you for your continued partnership."
  • [deadline] fehlt → dieser Teil wird einfach weggelassen

📁 Use Case 3: Automatische Dokumenten-Sortierung

Wie es funktioniert:

enterprise_19/ai_documents/wizard/ai_documents_sort.py:46AiDocumentsSort.default_get() – Beim Öffnen des Wizard wird automatisch ein Default-Prompt vorausgefüllt:

"If the document is an invoice, send it to [Finance-Ordner]"

Die Finance-Ordner-ID wird dynamisch eingesetzt.

enterprise_19/ai_documents/wizard/ai_documents_sort.py:98action_setup_folder() – Diese Methode speichert den Prompt auf dem Ordner und richtet Automations-Regeln ein. Ab diesem Moment wird jedes neu eingehende Dokument in diesem Ordner automatisch verarbeitet.

enterprise_19/ai_documents/data/ir_actions_server_tools.xml:3 → Zwei AI-Tools stehen zur Verfügung:

  • „AI: Move To Folder" – verschiebt das Dokument in einen Ziel-Ordner (folder_id als Parameter)
  • „AI: Add Tags" – setzt Tags auf dem Dokument (tag_names als Array)

Konkrete Beispiele:

Eingehende Datei Dein Prompt Ergebnis
rechnung_april.pdf „If invoice → Finance" → Ordner „Finance"
vertrag_kunde.pdf „If contract → Legal, add tag 'review'" → Ordner „Legal" + Tag „review"
foto_produkt.jpg „If image → Marketing" → Ordner „Marketing"

📞 Use Case 4: VOIP-Anruf Transkription & Zusammenfassung

Schritt 1 – Transkription:

enterprise_19/voip_ai/controllers/voip_ai_controller.py:8TRANSCRIPTION_MAX_FILE_SIZE = 25 * 1024 * 1024 – Die Grenze liegt bei exakt 25 MB (OpenAI API-Limit). Bei Überschreitung: Status too_big_to_process.

enterprise_19/voip_ai/controllers/voip_ai_controller.py:12VoipAiController.transcribe_call() – Der Ablauf:

  1. Prüft ob Aufnahme bereits existiert (transcription_status != "no_audio") – verhindert Manipulation
  2. Speichert die .ogg-Aufnahme als ir.attachment
  3. Setzt Status auf pending
  4. Triggert sofort den Cron: ir_cron_transcribe_recent_voip_call._trigger()

Schritt 2 – Automatische Zusammenfassung:

enterprise_19/voip_ai/models/voip_call.py:33VoipCall._cron_transcribe_recent_voip_call() – Nach der Transkription ruft der Cron automatisch den „Call Summarizer"-Agent auf:

enterprise_19/voip_ai/data/ai_agent_prompts.xml:4<record id="voip_call_summary_agent"> – Das System-Prompt ist äußerst präzise definiert:

  • Max 10 Wörter oder 60 Zeichen
  • Beginnt mit Gerundium (z.B. „Discussing…") oder Substantivphrase
  • Keine Pronomen, kein „is/are/was"
  • Mehrsprachig: nimmt die Sprache des Kunden

Beispiele:

Anruf-Inhalt AI-Zusammenfassung
Kunde fragt nach Preis für Produkt X "Requesting pricing for Product X"
Support-Anruf wegen Lieferproblem "Resolving delivery issue"
Kandidaten-Interview für Stelle "Interviewing candidate for position"

Schritt 3 – Quick-Prompts danach:

enterprise_19/ai/data/ai_composer_data.xml:206<record id="ai_voice_transcription"> – Nach der Transkription erscheinen 3 Quick-Prompts:

  • „Summarize this recruitment call"
  • „Summarize this prospect call"
  • „Write an email recap"

🤝 Use Case 5: CRM Lead-Erstellung via Livechat

Der komplette Flow aus dem Code:

enterprise_19/ai_crm/data/ai_topic.xml:3<record id="ai_crm.ai_topic_create_lead"> – Das Topic definiert einen strikten 5-Schritt-Flow:

1. Schlage dem Kunden vor, dass jemand ihn zurückruft
2. Frage Name → 2.1 dann E-Mail → 2.2 dann Telefon → 2.3
   (IMMER einzeln! Nie alle auf einmal!)
3. Rufe das Lead-Tool GENAU EINMAL auf
4. Antworte mit: "Thanks. Our team will recontact you soon."
5. Verrate NIE interne Tool-Namen oder System-Status

enterprise_19/ai_crm/models/crm_lead.py:13CrmLead._ai_create_lead() – Die Methode erstellt den Lead mit allen gesammelten Feldern: name, contact_name, email, phone, team_id, tag_ids, priority, plus optionale Adressfelder.

enterprise_19/ai_crm/models/crm_lead.py:55Wichtige Logik: Wenn der User eingeloggt ist (not env.user._is_public()), wird automatisch der bestehende res.partner verknüpft und fehlende Adressfelder ergänzt. Für anonyme Website-Besucher werden alle Felder neu angelegt.

enterprise_19/ai_crm/models/ai_agent.py:14AIAgent._auto_init() – Jeder AI-Agent bekommt beim Installieren automatisch eine utm.source-ID, damit Leads die richtige Traffic-Quelle zugewiesen bekommen.

Beispiel-Gesprächsverlauf:

Kunde:  "I need a custom quote for 500 units"
AI:     "I'd be happy to have someone from our team reach out.
         May I ask your name?"
Kunde:  "Anna Müller"
AI:     "Thanks Anna! What's the best email to reach you?"
Kunde:  "anna@example.com"
AI:     "And your phone number?"
Kunde:  "+49 123 456789"
AI:     "Thanks. Our team will recontact you soon."
→ Lead wird im CRM angelegt ✅

🧠 Use Case 6: Eigener Agent mit Wissensbasis (RAG)

Wissensquellen hinzufügen:

enterprise_19/ai/models/ai_agent_source.py:57AIAgentSource.create_from_attachments() – Lädt PDFs/Dokumente hoch. Prüft zuerst via checksum, ob die Datei bereits als Embedding vorliegt – verhindert Doppelverarbeitung.

enterprise_19/ai/models/ai_agent_source.py:109AIAgentSource.create_from_urls() – Nur für Admins (self.env.is_system()). Scrapt die URL, liest den Titel via OpenGraph-Preview aus.

RAG-Abruf bei jeder Anfrage:

enterprise_19/ai/models/ai_agent.py:588AIAgent._build_rag_context(prompt) – Der Ablauf:

  1. Erstellt Embedding-Vektor des User-Prompts
  2. Findet Top 5 ähnlichste Chunks aus allen indizierten Quellen
  3. Prüft Zugriffsrechte pro Quelle
  4. Unzugängliche Quellen → [UNACCESSIBLE_REFERENCES] – AI darf sie nicht zitieren
  5. Zugängliche Quellen → werden als ##Context information mitgegeben

enterprise_19/ai/models/ai_agent.py:50PREPROMPTS['restrict_to_sources'] – Wenn restrict_to_sources = True:

„For all questions, ONLY use information from the provided context. DO NOT make up information or use general knowledge."

Beispiel-Szenario: Interner Support-Bot

Agent-Setup:
  - Name: "HR-Assistent"
  - System-Prompt: "Du bist der HR-Assistent der Firma."
  - Quellen: employee_handbook.pdf, vacation_policy.pdf
  - restrict_to_sources: ✅ AN

Mitarbeiter fragt: "Wie viele Urlaubstage habe ich im ersten Jahr?"
→ AI sucht in vacation_policy.pdf → findet Abschnitt → antwortet korrekt
→ Bei Frage zu etwas nicht in den Docs: "No source information available"

🎛️ Alles auf einen Blick

Use Case Modul Trigger Steuerbar?
Natürlichsprachige Suche ai Systray-Button Quick-Prompts anpassen
E-Mail / Chatter Hilfe ai AI-Button im Composer System-Prompt überschreiben
Dokumente auto-sortieren ai_documents Neues Dokument im Ordner Prompt pro Ordner frei definieren
Anruf-Transkription voip_ai Nach VOIP-Anruf Max-Dateigröße 25 MB fest
CRM Lead via Chat ai_crm Livechat auf Website Agent + Topic konfigurieren

Oddy
Oddy
Odoo-Expertin bei Detalex GmbH