Search records
odoo_search_readSearch and read records from any Odoo model. Returns paginated results — if has_more is true, the response carries a truncation_notice and you should call again with next_offset to fetch the next page. A workspace skill may already encode the right query: load it with tuqui_skill(action='get') when something names one, else look for one with tuqui_skill(action='list'). Keep limit tight (default 10) and always pass the smallest fields list that answers the question; every extra record and field stays in the conversation context. When fields is omitted, the tool returns the top-K most relevant fields per the schema (identity, workflow, required, common refs) plus rich-text/HTML stripped — the response then carries fields_selected / fields_total, so read those before concluding anything from a field you do not see: empty values are dropped, so an absent key means empty or not selected, never 'this model has no such field'. Ask for a monetary field and its currency comes back with it, even when you pinned fields — read that currency, never assume it ('amount_total' is in 'currency_id', 'amount_total_signed' is already converted to 'company_currency_id'). For a count alone pass count_only=true: it returns {'count': n} and no records. For aggregates or top-N use odoo_read_group; to find records by words the user remembers (free text, ranked), odoo_search_text. html fields come back as markdown (checklists as - [ ]/- [x]), lossy on classes and embeds; to see the stored HTML or edit part of it, use odoo_html if you have it. Datetime domains use UTC — for 'today in local time' use the user timezone from tuqui_context to compute the correct UTC bounds (e.g. UTC-3 → today starts at 03:00:00 UTC).
Tool call template
Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.
{
"id": 1,
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"arguments": {
"model": "<model>",
"domain": "<domain>"
},
"name": "odoo_search_read"
}
}Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max records per page (default 10, max 500). | |
| model | Yes | Odoo model technical name (e.g., 'sale.order', 'res.partner') | |
| order | No | Sort expression, e.g. 'amount_total desc'. | |
| domain | Yes | Odoo domain filter as logical operators ('&', '|', '!') and/or 3-item condition tuples like ['field', '=', 'value'] or ['field', 'in', ['a', 'b']]. For relational filters use 'any' / 'not any' with a sub-domain on a to-one/to-many field (Odoo 17+), which does a whole anti-join in one query: [['sale_order_ids', 'any', [['date_order', '>=', '2025-01-01']]], ['sale_order_ids', 'not any', [['date_order', '>=', '2026-01-01']]]]. | |
| fields | No | Field names to return. Omit for the top-K most relevant fields. | |
| offset | No | ||
| context | No | Optional Odoo execute_kw context. The user's ``lang`` is injected from their profile — pass it here only to override it. See each field below for what it does. | |
| count_only | No | Return only how many records match the domain, as {'count': n}. |