Daily updates from Odoo
Tuesday, August 4, 2026
8 changes · master
Enhancements to existing features
This update makes Odoo's AI assistant more flexible by standardizing how browser-side actions are handled and how results are returned to the AI. It also improves user experience by updating AI thinking messages more dynamically, preserving normal view filters when opening records, and preventing new messages while the assistant is still responding.
Original PR description
Purpose: -------- Instead of handling each AI client tool as a special case when posting a message in the thread, a dedicated registry (ai.client_tools) has been added to make it easy to declare and…
Purpose:
--------
Instead of handling each AI client tool as a special case when posting a message in the thread, a dedicated registry (ai.client_tools) has been added to make it easy to declare and extend client-side tool handlers: `registry.category("ai.client_tools").add(name, (thread, params) => cb);`
On the Python side, AI tools can now trigger client-side behavior by returning a "client_tool" entry with a name and params, keeping the server interface minimal and consistent.
Updating the thinking text is now done using one of this tool, allowing to update the thinking text more dynamically. For example, the thought will now be updated when the web search tool has been executed.
Also, with this commit, the action domains are not overridden anymore: before, if you asked to open your crm pipeline, it would open it without the default hidden domain (type = 'opportunity'). Now, this domain will be applied, so that the view opened is the same as if the user opened it manually.
#### Async JS tools
Client tools can now pause the agent loop, return a result from the
browser and resume the conversation with this result.
By default, client tools wait for a result from the browser. Tools that
do not need to return a result can set `oneway` to true, allowing the
agent loop to continue without creating a pending tool call (for example
to show a notification).
Tool confirmations and client tool results use the same pending tool
response flow. Confirming a tool re-executes it on the Python side,
while returning a client tool result resumes the loop without
re-executing the tool.
To add a tool that allows the agent to get a result from the browser,
one needs to:
- add an AI tool in the backend that returns a dict with a `client_tool`
entry: `'client_tool': {'name': name, 'params': {}}`;
- add an AI tool in the frontend with the same name in the
`ai.client_tools` registry and return the result that needs to be sent
to the LLM.
For a client tool that does not need to return a result, use the `'oneway'`
option on the `client_tool` entry:
`'client_tool': {'name': name, 'params': {}, 'oneway': True}`
To prevent race conditions that could happen when the user sends a new
message while a client tool is being processed, the send button will now
be disabled when the agent is generating a response.
This commit also removes references to `ai_session_identifier` which was
not used anymore.
Task-6352942Improves the process that suggests reconciliation rules when assigning accounts to bank statement lines. The change prevents failures and slowdowns caused by very long payment references, making bank reconciliation setup more reliable for accounting users.
Original PR description
When setting an account to an account.bank.statement there is a step to automatically create a reconciliation rule/model if one does not exist already. To do so, we retrieve 5…
When setting an account to an account.bank.statement there is a step to automatically create a reconciliation rule/model if one does not exist already. To do so, we retrieve 5 account.bank.statement.lines and use them to define the reconciliation model config. A matching is done on the payment_ref of the account.bank.statement.lines by finding the longest common substring in the reference. ### Current Implementation The current algorithm does so by first generating all the possible substrings for all the payment_ref before doing the intersection between these sets and returning the max if `len(substring) >=10`. This is reasonable when the payment_ref follows either a SEPA communication national standard like the Belgian one or the Creditor Reference standard (ISO 11649). For transactions with large, unstructured communication with more than 100 chars, the method `_get_common_substrings` quickly overfill the memory, sometimes raising a MemoryErorr, and takes a significant amount of time. That's because the nested function `_generate_all_substrings` generates n*(n+1)/2 substrings, with n being the lenght of a payment_ref, called `label` in `generate_all_substrings`. ### Proposed Fix This commit introduces another algorithm to find the largest common substring. It starts by taking the two smallest labels to find their substrings intersection. We know that for an arbitrary collection of labels, the intersection of their substrings sets A ∩ B ∩...∩ Z is included in the intersection of any two substrings sets. The underlying assumption of the first step is that for an arbitrary collection of labels the intersection of the substrings sets of the two smallest labels will be the smallest intersection of any given pair of substrings sets. This won't hold true everytime and using a metric such as label similarity instead of shortest string might be better. But on average this should be good enough and it's easier to implement + it removes the need of preprocessing the labels to compute the similarity. The point of the new nested function `common_substrings` is to discard common substrings as we build them. Using the current `generate_all_substsrings` on either the smallest label or both smallest labels would still generate and store a lot of substrings, especially for large labels. By yielding the common substrings as we find them, the memory footprint is vastly reduced. Lastly, the next substring in the common_substrings iterable is only checked against the remaining labels if it's longer than the current match. This speeds up the whole process ### speedup In a customer database with some account.bank.statement.line with payment_ref > 500 chars, setting a specific account (code 4970) on transactions goes from MemoryError to < 1Mb memory consumption. Because of the memory consumption it was not possible to gather timing value on the current version. Testing the new algorithm in a shell and using as labels the 5 longest payment_ref in the customer database (831, 831, 1117, 1178, 1300 chars), averaging to 2000 chars once normalised, the average time to execute `_get_common_substrings` is 900 ms ± 10.3 ms. Forward-Port-Of: odoo/enterprise#121575 Forward-Port-Of: odoo/enterprise#118824
The timesheet ActivityWatch suggestions panel now displays total tracked time by project and an overall total at the bottom. This gives users a clearer view of how much time has been captured before creating or reviewing timesheets.
Original PR description
This commit introduces new time tracking metrics to the ActivityWatch suggestions panel to improve user visibility into their tracked hours. **Enhancements:** - Added the total duration per project in the By Project grouped view. - Added a grand total footer for all suggestions at the bottom of the list. task-6088877 Forward-Port-Of: odoo/enterprise#125515 Forward-Port-Of: odoo/enterprise#114772
This update aligns several country-specific Point of Sale accounting and electronic invoicing flows with recent accounting changes. It helps keep POS receipts, fiscal certification, and tax reporting working correctly across affected localizations after the accounting refactor.
Original PR description
Refector PR: https://github.com/odoo/enterprise/pull/112634
Shop floor users can now manually adjust production time logs when a timer was not started or stopped correctly. This helps keep work order timing accurate by creating or closing time entries based on the corrected time.
Original PR description
The "Update Time Log" dialog inside shopfloor is added to increase the timer's reliability by manually entering the desired time. If someone forgot to start the timer, this option adds a new productivity line ending now. If someone forgot to stop it, this option close the timer and set the end date accordingly. Task-6164336
When an item quantity is set to zero in the certified Point of Sale flow, all removed order lines are now visibly struck through, not just weighted products. This improves receipt and order clarity and prevents newly added items from being incorrectly merged with previously removed lines.
Original PR description
We now strike every orderline instead of only the ones related to weightable products, when quantity is set to 0. We also fix an issue where the PoS kept merging new orderlines with strikedthrough ones. task-6425588
Cashiers can now see each customer's due or deposit amount directly on the mobile customer selection card. This makes it easier to spot outstanding balances or available deposits before choosing a customer, speeding up checkout decisions.
Original PR description
This commit adds the customer's due/deposit amount to the customer card displayed in the mobile customer selection list, allowing cashiers to quickly identify outstanding balances or available deposits when choosing a customer. Task-6329233 Related PR: https://github.com/odoo/odoo/pull/272076 <img width="200" height="431" alt="image" src="https://github.com/user-attachments/assets/d4ad9e0a-34f9-4995-84d3-8c28058cba4f" />
HR users can now complete employee document signature requests themselves when they are the only required signer. This removes the unnecessary step of sending the document to the employee, saving time and simplifying the process.
Original PR description
Before:
- When creating a Signature Request from the employee form:
- If the document had only one signer (HR user), the system still asked to
send it to the employee.
- HR users could not sign the document directly.
After:
- If there is only one signer (the HR user):
- The HR user can now sign the document directly.
- No need to send the document to the employee.
Impact:
- Saves time for HR users.
- Makes the process simpler and faster.
- Reduces unnecessary steps.
Task: 6032364