fix: correct V3 search filter key and response field names in ae_knowledge

- Filter key is "and" not "and_filters" (V3 API format)
- Entry IDs use journal_entry_id/id, not id_random (id_random is None)
- Dates use updated_on/created_on, not updated_at/created_at
- Total count lives in meta.data_list_count, not top-level total/count
- Inject query_string="%" when and filters present but no query, since
  the V3 search engine requires query_string for filters to apply
- Normalize tags from string to list in both entry_read and entries_list
- Fix order_by to use updated_on (not updated_at) in entries_list
- Correct ARCH__AE_INTEGRATION.md: and_filters → and, or_filters → or

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Scott Idem
2026-04-30 21:12:44 -04:00
parent 71e472bebe
commit 1fa5151d8a
2 changed files with 18 additions and 14 deletions

View File

@@ -122,7 +122,10 @@ def _sync_journal_search(
if priority is not None: if priority is not None:
and_filters.append({"field": "priority", "op": "eq", "value": priority}) and_filters.append({"field": "priority", "op": "eq", "value": priority})
if and_filters: if and_filters:
search_body["and_filters"] = and_filters search_body["and"] = and_filters
# query_string must be present for `and` filters to apply
if "query_string" not in search_body:
search_body["query_string"] = "%"
params: dict = {} params: dict = {}
if journal_id: if journal_id:
@@ -145,7 +148,7 @@ def _sync_journal_search(
return f"Journal search error: {e}" return f"Journal search error: {e}"
entries = data.get("data", []) entries = data.get("data", [])
total = data.get("total") or data.get("count") or len(entries) total = (data.get("meta") or {}).get("data_list_count") or len(entries)
if not entries: if not entries:
desc = query or tags or type_code or topic_code or f"journal {journal_id}" desc = query or tags or type_code or topic_code or f"journal {journal_id}"
@@ -156,12 +159,11 @@ def _sync_journal_search(
for entry in entries: for entry in entries:
title = entry.get("name") or "(untitled)" title = entry.get("name") or "(untitled)"
entry_id = entry.get("id_random", "") entry_id = entry.get("journal_entry_id") or entry.get("id") or ""
journal_name = entry.get("journal_name") or entry.get("parent_name") or "" journal_name = entry.get("journal_name") or entry.get("parent_name") or ""
summary = entry.get("summary") or "" summary = entry.get("summary") or ""
entry_tags = entry.get("tags") or [] entry_tags = entry.get("tags") or []
updated = (entry.get("updated_on") or entry.get("updated_at") or updated = (entry.get("updated_on") or entry.get("created_on") or "")[:10]
entry.get("created_on") or entry.get("created_at") or "")[:10]
content_preview = (entry.get("content") or "")[:400].replace("\n", " ") content_preview = (entry.get("content") or "")[:400].replace("\n", " ")
header = f"**{title}**" header = f"**{title}**"
@@ -357,9 +359,10 @@ def _sync_journal_entry_read(entry_id: str, max_content_chars: int) -> str:
title = entry.get("name") or "(untitled)" title = entry.get("name") or "(untitled)"
journal = entry.get("journal_name") or entry.get("parent_name") or "" journal = entry.get("journal_name") or entry.get("parent_name") or ""
summary = entry.get("summary") or "" summary = entry.get("summary") or ""
tags = entry.get("tags") or [] raw_tags = entry.get("tags") or []
tags = raw_tags if isinstance(raw_tags, list) else [t.strip() for t in str(raw_tags).split(",") if t.strip()]
content = entry.get("content") or "" content = entry.get("content") or ""
updated = (entry.get("updated_at") or entry.get("created_at") or "")[:19].replace("T", " ") updated = (entry.get("updated_on") or entry.get("created_on") or "")[:19].replace("T", " ")
enabled = entry.get("enable", True) enabled = entry.get("enable", True)
lines = [f"# {title}"] lines = [f"# {title}"]
@@ -407,7 +410,7 @@ def _sync_journal_entries_list(journal_id: str, max_results: int, page: int) ->
search_body: dict = { search_body: dict = {
"page_size": max_results, "page_size": max_results,
"page": page, "page": page,
"order_by": "-updated_at", "order_by": "-updated_on",
} }
params = {"for_obj_type": "journal", "for_obj_id": journal_id} params = {"for_obj_type": "journal", "for_obj_id": journal_id}
@@ -426,7 +429,7 @@ def _sync_journal_entries_list(journal_id: str, max_results: int, page: int) ->
return f"Journal entries list error: {e}" return f"Journal entries list error: {e}"
entries = data.get("data", []) entries = data.get("data", [])
total = data.get("total") or data.get("count") or len(entries) total = (data.get("meta") or {}).get("data_list_count") or len(entries)
if not entries: if not entries:
return f"No entries found in journal `{journal_id}`." return f"No entries found in journal `{journal_id}`."
@@ -435,10 +438,11 @@ def _sync_journal_entries_list(journal_id: str, max_results: int, page: int) ->
lines = [f"Entries in journal `{journal_id}` — showing {offset}{offset + len(entries) - 1} of {total}:\n"] lines = [f"Entries in journal `{journal_id}` — showing {offset}{offset + len(entries) - 1} of {total}:\n"]
for i, entry in enumerate(entries, offset): for i, entry in enumerate(entries, offset):
title = entry.get("name") or "(untitled)" title = entry.get("name") or "(untitled)"
entry_id = entry.get("id_random", "") entry_id = entry.get("journal_entry_id") or entry.get("id") or ""
tags = entry.get("tags") or [] raw_tags = entry.get("tags") or []
tags = raw_tags if isinstance(raw_tags, list) else [t.strip() for t in str(raw_tags).split(",") if t.strip()]
summary = entry.get("summary") or "" summary = entry.get("summary") or ""
updated = (entry.get("updated_at") or entry.get("created_at") or "")[:10] updated = (entry.get("updated_on") or entry.get("created_on") or "")[:10]
enabled = entry.get("enable", True) enabled = entry.get("enable", True)
status = "" if enabled else " [disabled]" status = "" if enabled else " [disabled]"

View File

@@ -43,11 +43,11 @@ POST /v3/crud/journal_entry/search
```json ```json
{ {
"query_string": "fulltext search term", "query_string": "fulltext search term",
"and_filters": [ "and": [
{ "field": "tags", "op": "icontains", "value": "networking" }, { "field": "tags", "op": "icontains", "value": "networking" },
{ "field": "created_on", "op": "gte", "value": "2026-01-01" } { "field": "created_on", "op": "gte", "value": "2026-01-01" }
], ],
"or_filters": [...], "or": [...],
"page_size": 20, "page_size": 20,
"page": 1, "page": 1,
"order_by": "-updated_on" "order_by": "-updated_on"