Guofang.Tang
4304a3b7c6
feat(agent): support OpenAI-compatible responses ( #18316 )
...
### Summary
Complete the Go Agent OpenAI-compatible response path for `POST
/api/v1/agents/chat/completions` when `openai-compatible` is true. This
endpoint is already documented and routed, but the Go implementation
returned a placeholder response instead of executing the Agent.
2026-08-20 19:13:38 +08:00
Jack
84bed4dec5
refactor(chunker): replace QAChunker/PresentationChunker with PairChunker/PageChunker, drop TagChunker ( #18523 )
2026-08-20 11:53:00 +08:00
Haruko386
86ecdd8588
fix: chat did not pass model config to provider ( #18485 )
...
### Summary
As title
2026-08-19 18:43:15 +08:00
Lynn
993e84106b
Fix: not use connect check result as model verify result ( #18492 )
2026-08-19 15:15:04 +08:00
mkaaad
b46180fa2c
Fix: connector validation error ( #18489 )
...
surface connector validation error detail so test connect can return
detail error
2026-08-19 14:20:18 +08:00
Haruko386
602f55deed
feat[syncer]: add connection test with unified connector validation ( #18281 )
...
### Summary
as title
2026-08-18 11:30:29 +08:00
buua436
1ef4ddddec
fix: align Go ingestion progress and pipeline selection ( #18366 )
...
Fixes Go ingestion progress reporting and pipeline selection:
- Add timestamps to document progress logs.
- Keep document duration and status updated during parsing.
- Start frontend polling immediately after parsing begins.
- Prevent documents explicitly using General from inheriting an old
dataset pipeline.
- Populate missing pipeline operation log fields.
- Remove stale component progress logs between retries.
- Prevent progress values greater than `1`.
2026-08-17 16:58:44 +08:00
Wang Qi
57b907cd1e
Refactor: do not include compliation chunks in retrieval testing ( #18364 )
...
Retrieval Testing: do not include compilation result.
Search: include compilation result.
2026-08-17 16:19:05 +08:00
mkaaad
c3b977f7b6
feat(syncer): Add REST API connector ( #18256 )
...
as title
2026-08-17 10:50:16 +08:00
euvre
00df872e03
fix(search): show honest empty state when mind map has no content ( #18294 )
2026-08-14 20:22:29 +08:00
Jin Hai
fa5762336b
Go: fix context, part2 ( #18296 )
...
Signed-off-by: Jin Hai <haijin.chn@gmail.com >
2026-08-14 19:42:41 +08:00
Haruko386
cdbd82df4f
fix: return total number of docs when sync has no update ( #18255 )
...
### Summary
As title
---------
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
2026-08-14 17:43:55 +08:00
Jack
ae256bcf59
feat(chunker): add ManualChunker for manual-layout PDFs ( #18272 )
...
Add `ManualChunker`, the Go port of Python's `manual` doc-type chunk method (`rag/app/manual.py`). Like `GroupTitleChunker` it merges adjacent text records into heading-bounded groups, but it first re-sorts the records into physical reading order before grouping.
2026-08-14 16:55:08 +08:00
euvre
e1330423ac
fix(agent): keep think tags in persisted agent session messages ( #18222 )
2026-08-14 16:00:08 +08:00
mkaaad
0dbfaa8b67
feat(cli): add sync logs listing commands for the user CLI ( #18195 )
...
### Summary
```
RAGFlow(api/default)> LIST SYNC LOGS WITH PAGE_SIZE 2 PAGE 2;
Total: 764
+----------------------------------+-------------------------+-------------+-----------+----------------------------------+----------------------------------+---------+------------------+------------+--------------+--------+-----------+---------------------+--------------------+---------------------+
| connector_id | docs_removed_from_index | error_count | error_msg | id | kb_id | kb_name | new_docs_indexed | prune_freq | refresh_freq | status | task_type | time_started | total_docs_indexed | update_date |
+----------------------------------+-------------------------+-------------+-----------+----------------------------------+----------------------------------+---------+------------------+------------+--------------+--------+-----------+---------------------+--------------------+---------------------+
| 02b5b14183884445bd55ad6b9d322204 | 0 | 0 | | fb55b5f1fb754475834cd9eac8b52054 | 0e6e28e65b7044e58070e0e4252319a6 | test | 0 | 5 | 0 | 3 | sync | 2026-08-13 09:49:45 | 16 | 2026-08-13 09:49:46 |
| 02b5b14183884445bd55ad6b9d322204 | 0 | 0 | | 3cad779d7d2e4efb8d8d2dbf05d45653 | 0e6e28e65b7044e58070e0e4252319a6 | test | 0 | 5 | 0 | 3 | sync | 2026-08-13 09:49:42 | 16 | 2026-08-13 09:49:43 |
+----------------------------------+-------------------------+-------------+-----------+----------------------------------+----------------------------------+---------+------------------+------------+--------------+--------+-----------+---------------------+--------------------+---------------------+
```
```
RAGFlow(api/default)> LIST SYNC LOGS;
Total: 764
+----------------------------------+-------------------------+-------------+--------------------------------------------------------------------------------------------+----------------------------------+----------------------------------+---------+------------------+------------+--------------+--------+-----------+---------------------+--------------------+---------------------+
| connector_id | docs_removed_from_index | error_count | error_msg | id | kb_id | kb_name | new_docs_indexed | prune_freq | refresh_freq | status | task_type | time_started | total_docs_indexed | update_date |
+----------------------------------+-------------------------+-------------+--------------------------------------------------------------------------------------------+----------------------------------+----------------------------------+---------+------------------+------------+--------------+--------+-----------+---------------------+--------------------+---------------------+
| 02b5b14183884445bd55ad6b9d322204 | 0 | 1 | sync task failed: failed to fetch URL: Get "https://xxxxxxxxxxxx/rss.xml ": EOF | 87592e5623fc4284bf69b9290f322718 | 0e6e28e65b7044e58070e0e4252319a6 | test | 0 | 5 | 0 | 4 | sync | 2026-08-13 09:49:48 | 16 | 2026-08-13 09:51:01 |
| 570138201cf44e1180711f1ebdf8492f | 0 | 1 | sync task failed: failed to fetch URL: Get "https://www.ruanyifeng.com/blog/atom.xml ": EOF | 456adbbf21a147af99adfce4405abd99 | 0e6e28e65b7044e58070e0e4252319a6 | test | 0 | 5 | 1 | 4 | sync | 2026-08-13 09:50:00 | 3 | 2026-08-13 09:50:18 |
| 02b5b14183884445bd55ad6b9d322204 | 0 | 0 | | fb55b5f1fb754475834cd9eac8b52054 | 0e6e28e65b7044e58070e0e4252319a6 | test | 0 | 5 | 0 | 3 | sync | 2026-08-13 09:49:45 | 16 | 2026-08-13 09:49:46 |
| 02b5b14183884445bd55ad6b9d322204 | 0 | 0 | | 3cad779d7d2e4efb8d8d2dbf05d45653 | 0e6e28e65b7044e58070e0e4252319a6 | test | 0 | 5 | 0 | 3 | sync | 2026-08-13 09:49:42 | 16 | 2026-08-13 09:49:43 |
| 02b5b14183884445bd55ad6b9d322204 | 0 | 0 | | dd09320aa5b34d6cbcfa7b03ede68c4a | 0e6e28e65b7044e58070e0e4252319a6 | test | 0 | 5 | 0 | 3 | sync | 2026-08-13 09:49:36 | 16 | 2026-08-13 09:49:38 |
| 02b5b14183884445bd55ad6b9d322204 | 0 | 0 | | afbcee73240f420ca1997e6506f387fb | 0e6e28e65b7044e58070e0e4252319a6 | test | 0 | 5 | 0 | 3 | sync | 2026-08-13 09:49:33 | 16 | 2026-08-13 09:49:34 |
| 02b5b14183884445bd55ad6b9d322204 | 0 | 0 | | 7d018146a0f14a25b7263d5980fdc30f | 0e6e28e65b7044e58070e0e4252319a6 | test | 0 | 5 | 0 | 3 | sync | 2026-08-13 09:49:30 | 16 | 2026-08-13 09:49:32 |
| 02b5b14183884445bd55ad6b9d322204 | 0 | 0 | | 520e0d6f421e40628ab541fc4fee1a69 | 0e6e28e65b7044e58070e0e4252319a6 | test | 0 | 5 | 0 | 3 | sync | 2026-08-13 09:49:27 | 16 | 2026-08-13 09:49:28 |
| 02b5b14183884445bd55ad6b9d322204 | 0 | 0 | | 3d3ce49825de4ef99642e7994ae954e3 | 0e6e28e65b7044e58070e0e4252319a6 | test | 0 | 5 | 0 | 3 | sync | 2026-08-13 09:49:21 | 16 | 2026-08-13 09:49:22 |
| 02b5b14183884445bd55ad6b9d322204 | 0 | 0 | | 1c511f9b4a7c425fb30a956589ca56fa | 0e6e28e65b7044e58070e0e4252319a6 | test | 0 | 5 | 0 | 3 | sync | 2026-08-13 09:49:18 | 16 | 2026-08-13 09:49:19 |
| 02b5b14183884445bd55ad6b9d322204 | 0 | 0 | | b9ab73c3f48c4f47a84fd55b542b32b4 | 0e6e28e65b7044e58070e0e4252319a6 | test | 0 | 5 | 0 | 3 | sync | 2026-08-13 09:49:15 | 16 | 2026-08-13 09:49:16 |
| 02b5b14183884445bd55ad6b9d322204 | 0 | 0 | | db0cad90a7744d758b24d2e3d3828963 | 0e6e28e65b7044e58070e0e4252319a6 | test | 0 | 5 | 0 | 3 | sync | 2026-08-13 09:49:12 | 16 | 2026-08-13 09:49:13 |
| 02b5b14183884445bd55ad6b9d322204 | 0 | 0 | | a501eadb2cce452187f3c86431352c70 | 0e6e28e65b7044e58070e0e4252319a6 | test | 0 | 5 | 0 | 3 | sync | 2026-08-13 09:49:08 | 16 | 2026-08-13 09:49:10 |
| 02b5b14183884445bd55ad6b9d322204 | 0 | 0 | | b4265a3b7baf4466a525b91a9fe21b71 | 0e6e28e65b7044e58070e0e4252319a6 | test | 0 | 5 | 0 | 3 | sync | 2026-08-13 09:49:03 | 16 | 2026-08-13 09:49:05 |
| 02b5b14183884445bd55ad6b9d322204 | 0 | 0 | | a6ad590931c046dda5fc3222b4010c06 | 0e6e28e65b7044e58070e0e4252319a6 | test | 0 | 5 | 0 | 3 | sync | 2026-08-13 09:49:00 | 16 | 2026-08-13 09:49:02 |
......
+----------------------------------+-------------------------+-------------+--------------------------------------------------------------------------------------------+----------------------------------+----------------------------------+---------+------------------+------------+--------------+--------+-----------+---------------------+--------------------+---------------------+
```
list all logs
```
RAGFlow(api/default)> LIST DATASET 'test' SYNC LOGS;
Total: 764
+----------------------------------+-------------------------+-------------+--------------------------------------------------------------------------------------------+----------------------------------+----------------------------------+---------+------------------+------------+--------------+--------+-----------+---------------------+--------------------+---------------------+
| connector_id | docs_removed_from_index | error_count | error_msg | id | kb_id | kb_name | new_docs_indexed | prune_freq | refresh_freq | status | task_type | time_started | total_docs_indexed | update_date |
+----------------------------------+-------------------------+-------------+--------------------------------------------------------------------------------------------+----------------------------------+----------------------------------+---------+------------------+------------+--------------+--------+-----------+---------------------+--------------------+---------------------+
| 02b5b14183884445bd55ad6b9d322204 | 0 | 1 | sync task failed: failed to fetch URL: Get "https://xxxxxxxxxxxx/rss.xml ": EOF | 87592e5623fc4284bf69b9290f322718 | 0e6e28e65b7044e58070e0e4252319a6 | test | 0 | 5 | 0 | 4 | sync | 2026-08-13 09:49:48 | 16 | 2026-08-13 09:51:01 |
| 570138201cf44e1180711f1ebdf8492f | 0 | 1 | sync task failed: failed to fetch URL: Get "https://www.ruanyifeng.com/blog/atom.xml ": EOF | 456adbbf21a147af99adfce4405abd99 | 0e6e28e65b7044e58070e0e4252319a6 | test | 0 | 5 | 1 | 4 | sync | 2026-08-13 09:50:00 | 3 | 2026-08-13 09:50:18 |
| 02b5b14183884445bd55ad6b9d322204 | 0 | 0 | | fb55b5f1fb754475834cd9eac8b52054 | 0e6e28e65b7044e58070e0e4252319a6 | test | 0 | 5 | 0 | 3 | sync | 2026-08-13 09:49:45 | 16 | 2026-08-13 09:49:46 |
| 02b5b14183884445bd55ad6b9d322204 | 0 | 0 | | 3cad779d7d2e4efb8d8d2dbf05d45653 | 0e6e28e65b7044e58070e0e4252319a6 | test | 0 | 5 | 0 | 3 | sync | 2026-08-13 09:49:42 | 16 | 2026-08-13 09:49:43 |
| 02b5b14183884445bd55ad6b9d322204 | 0 | 0 | | dd09320aa5b34d6cbcfa7b03ede68c4a | 0e6e28e65b7044e58070e0e4252319a6 | test | 0 | 5 | 0 | 3 | sync | 2026-08-13 09:49:36 | 16 | 2026-08-13 09:49:38 |
| 02b5b14183884445bd55ad6b9d322204 | 0 | 0 | | afbcee73240f420ca1997e6506f387fb | 0e6e28e65b7044e58070e0e4252319a6 | test | 0 | 5 | 0 | 3 | sync | 2026-08-13 09:49:33 | 16 | 2026-08-13 09:49:34 |
| 02b5b14183884445bd55ad6b9d322204 | 0 | 0 | | 7d018146a0f14a25b7263d5980fdc30f | 0e6e28e65b7044e58070e0e4252319a6 | test | 0 | 5 | 0 | 3 | sync | 2026-08-13 09:49:30 | 16 | 2026-08-13 09:49:32 |
| 02b5b14183884445bd55ad6b9d322204 | 0 | 0 | | 520e0d6f421e40628ab541fc4fee1a69 | 0e6e28e65b7044e58070e0e4252319a6 | test | 0 | 5 | 0 | 3 | sync | 2026-08-13 09:49:27 | 16 | 2026-08-13 09:49:28 |
| 02b5b14183884445bd55ad6b9d322204 | 0 | 0 | | 3d3ce49825de4ef99642e7994ae954e3 | 0e6e28e65b7044e58070e0e4252319a6 | test | 0 | 5 | 0 | 3 | sync | 2026-08-13 09:49:21 | 16 | 2026-08-13 09:49:22 |
| 02b5b14183884445bd55ad6b9d322204 | 0 | 0 | | 1c511f9b4a7c425fb30a956589ca56fa | 0e6e28e65b7044e58070e0e4252319a6 | test | 0 | 5 | 0 | 3 | sync | 2026-08-13 09:49:18 | 16 | 2026-08-13 09:49:19 |
| 02b5b14183884445bd55ad6b9d322204 | 0 | 0 | | b9ab73c3f48c4f47a84fd55b542b32b4 | 0e6e28e65b7044e58070e0e4252319a6 | test | 0 | 5 | 0 | 3 | sync | 2026-08-13 09:49:15 | 16 | 2026-08-13 09:49:16 |
| 02b5b14183884445bd55ad6b9d322204 | 0 | 0 | | db0cad90a7744d758b24d2e3d3828963 | 0e6e28e65b7044e58070e0e4252319a6 | test | 0 | 5 | 0 | 3 | sync | 2026-08-13 09:49:12 | 16 | 2026-08-13 09:49:13 |
| 02b5b14183884445bd55ad6b9d322204 | 0 | 0 | | a501eadb2cce452187f3c86431352c70 | 0e6e28e65b7044e58070e0e4252319a6 | test | 0 | 5 | 0 | 3 | sync | 2026-08-13 09:49:08 | 16 | 2026-08-13 09:49:10 |
| 02b5b14183884445bd55ad6b9d322204 | 0 | 0 | | b4265a3b7baf4466a525b91a9fe21b71 | 0e6e28e65b7044e58070e0e4252319a6 | test | 0 | 5 | 0 | 3 | sync | 2026-08-13 09:49:03 | 16 | 2026-08-13 09:49:05 |
| 02b5b14183884445bd55ad6b9d322204 | 0 | 0 | | a6ad590931c046dda5fc3222b4010c06 | 0e6e28e65b7044e58070e0e4252319a6 | test | 0 | 5 | 0 | 3 | sync | 2026-08-13 09:49:00 | 16 | 2026-08-13 09:49:02 |
......
+----------------------------------+-------------------------+-------------+--------------------------------------------------------------------------------------------+----------------------------------+----------------------------------+---------+------------------+------------+--------------+--------+-----------+---------------------+--------------------+---------------------+
```
2026-08-13 18:39:29 +08:00
Haruko386
96f7c39753
feat[Go]: resuming transmission from the point of interruption during data source synchronisation ( #18176 )
...
### Summary
As title
2026-08-13 18:38:37 +08:00
Zhichang Yu
0784bef5b0
Port dataset-level structure merge for timeline/graph/mindmap ( #18201 )
...
Ports Python dataset-level structure aggregation (timeline, graph, mindmap) to Go. Mindmap emits entity/relation rows and merges like graph. Adds dataset_merge guard, engine gate, resolveDatasetStructureKind, kind-required structure graph GET/DELETE API, per-index task-id fields.
2026-08-13 18:37:47 +08:00
euvre
f240568a78
fix(agent): accept 1D files wire shape in chat/completions ( #18197 )
2026-08-13 14:26:54 +08:00
Zhichang Yu
6677f14bdf
Port dataset nav and structure graph fixes to Go, merge agents list ( #18183 )
...
Fix compilation template config validation for JSONMap; merge template groups into agents list ordered by category/name; install nav service in ingestor; write readable nav cluster/doc names and emit nav_doc leaves;
port tree-to-graph projection and full document structure graph endpoint parity.
2026-08-12 22:46:24 +08:00
euvre
27edad8a76
Go: implement ?type=filter branch for GET /agents ( #18111 )
2026-08-12 14:54:48 +08:00
Jin Hai
38c5d7c338
Go: fix context ( #18061 )
...
Signed-off-by: Jin Hai <haijin.chn@gmail.com >
2026-08-10 20:49:32 +08:00
Jin Hai
dbd062f65e
Go: fix context ( #18060 )
...
Signed-off-by: Jin Hai <haijin.chn@gmail.com >
2026-08-10 19:11:43 +08:00
Jin Hai
c697fcff41
Go: fix go context ( #18052 )
...
Signed-off-by: Jin Hai <haijin.chn@gmail.com >
2026-08-10 18:04:17 +08:00
Jin Hai
c0bc146fcb
Go: fix env variables ( #18032 )
...
Signed-off-by: Jin Hai <haijin.chn@gmail.com >
2026-08-10 14:37:05 +08:00
Zhichang Yu
2e37997ab9
Go knowledge compiler with scheduler-driven dataset compilation ( #17913 )
...
Ports dataset knowledge compilation (wiki/graph/tree/mindmap) to the Go
scheduler with a status contract, aligns wiki storage/retrieval with
Python, sizes prompts by content_length, and resolves embedding batch
size from provider capability.
2026-08-06 15:54:00 +08:00
Jin Hai
cf13082a1a
Revert "feat: Go knowledge compiler with scheduler-driven dataset compilation" ( #17897 )
...
Reverts infiniflow/ragflow#17881
2026-08-05 21:50:28 +08:00
Zhichang Yu
14b943a04a
feat: Go knowledge compiler with scheduler-driven dataset compilation ( #17881 )
...
Ports the dataset knowledge compilation (wiki/graph/tree/mindmap) to the
Go scheduler with a status contract, aligns wiki storage/retrieval with
Python, and sizes prompts by content_length.
2026-08-05 20:00:42 +08:00
EthanZhang
bdcd8aadde
feat(chat): add Querit web search provider ( #17813 )
2026-08-05 09:54:46 +08:00
Jin Hai
c1f960cd47
Go: introduce content_length and max_output ( #17807 )
...
Signed-off-by: Jin Hai <haijin.chn@gmail.com >
2026-08-04 19:08:31 +08:00
Haruko386
0cb078ecc0
fix: can upload file larger than 10MB ( #17801 )
2026-08-04 18:01:04 +08:00
Haruko386
49c24d8bce
fix: unable to control enable think in chat ( #17785 )
2026-08-04 18:00:37 +08:00
euvre
4a9d7f3699
fix: allow empty kb_ids when linking files to datasets ( #17777 )
2026-08-04 15:23:59 +08:00
Haruko386
970be641a4
fix: agent log return zero total number ( #17766 )
...
### Summary
As title
---------
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
2026-08-04 15:03:58 +08:00
euvre
a6da1a05e8
fix(go): accept empty/unknown model_type when adding provider models ( #17653 )
2026-08-04 11:02:40 +08:00
Jin Hai
86021932ae
Go: fix warnings ( #17738 )
...
Signed-off-by: Jin Hai <haijin.chn@gmail.com >
2026-08-03 21:30:01 +08:00
Haruko386
9adcd59586
fix(provider): support editing fetched model types before save ( #17728 )
...
### Summary
As title
now can edit
2026-08-03 18:07:41 +08:00
Jin Hai
bddc941814
Go: add context to storage ( #17690 )
...
Signed-off-by: Jin Hai <haijin.chn@gmail.com >
2026-08-03 15:08:21 +08:00
euvre
04918f88bf
Go: support ids filter in list datasets API ( #17705 )
2026-08-03 13:54:44 +08:00
euvre
8353fc7855
fix: XunFei Spark provider API key verification and model listing ( #17652 )
2026-08-03 11:25:25 +08:00
Jin Hai
266837eb33
Go: add context to redis client ( #17689 )
...
Signed-off-by: Jin Hai <haijin.chn@gmail.com >
2026-08-02 22:50:54 +08:00
Jin Hai
b2521ebf51
Go: refactor log and config ( #17684 )
...
Signed-off-by: Jin Hai <haijin.chn@gmail.com >
2026-08-02 20:55:19 +08:00
Jin Hai
8db965fbb9
Go: remove unused code ( #17680 )
...
Signed-off-by: Jin Hai <haijin.chn@gmail.com >
2026-08-02 00:31:21 +08:00
Zhichang Yu
b811dce1b0
feat(go): port knowledge compilation template/group + wiki artifact/nav/skill REST APIs from Python ( #17656 )
2026-07-31 22:57:43 +08:00
Haruko386
ae8c18bb17
fix: team member can edit permission ( #17633 )
...
### Summary
As title
2026-07-31 20:14:35 +08:00
euvre
29e5181095
fix: don't persist ephemeral sessions in multi-model chat completions ( #17637 )
2026-07-31 19:12:24 +08:00
Jin Hai
165a5db07d
Go: refactor ( #17635 )
...
Signed-off-by: Jin Hai <haijin.chn@gmail.com >
2026-07-31 17:48:35 +08:00
Jin Hai
36ae39bc60
Go: refactor config ( #17544 )
...
Signed-off-by: Jin Hai <haijin.chn@gmail.com >
2026-07-31 17:18:45 +08:00
Haruko386
0108cdac67
fix: write wrong type of metadata ( #17605 )
2026-07-31 16:55:34 +08:00
Hz_
4a43a1d620
fix(go-agent): align logs auth with Python and harden event data ( #17617 )
...
## Summary
- Align Go agent logs access with the Python behavior by checking tenant
access to the target agent instead of requiring the token to be bound
to that agent.
- Marshal canvas lifecycle event payloads safely so non-serializable
inputs do not break Thinking expansion in the UI.
## Testing
- `CGO_ENABLED=0 go test -count=1 -v -run
"Handler|Attachment|Logs|Chatbot|Agentbot|BuildWorkflow|NodeLifecycle|VarRef|Resolve|Extract"./internal/handler/
./internal/agent/canvas/...` PASS
2026-07-31 16:24:25 +08:00
Jack
08666560b5
Test(handler): fix failing TestSearchHandlerUpdateRejectsInvalidSearchID assertion ( #17622 )
...
### Summary
`TestSearchHandlerUpdateRejectsInvalidSearchID` fails on `main`:
```
--- FAIL: TestSearchHandlerUpdateRejectsInvalidSearchID (0.00s)
search_handler_test.go:98: expected 'no authorization' in message, got No authorization.
```
`UpdateSearch` answers an unauthorized `search_id` with `"No
authorization."` (`internal/handler/search.go:337`), which mirrors the
Python API's message verbatim, but the assertion searched for the
lowercase `"no authorization"`.
The fix lowercases the response before the substring check rather than
changing the handler's message: the capitalized text is the contract the
Python API exposes, so the test — not the handler — was wrong.
`bash build.sh --test -run TestSearchHandler ./internal/handler/`
passes.
2026-07-31 15:44:49 +08:00