Commit Graph
62 Commits
Author SHA1 Message Date
Liu AnandJin Hai ba575b0ce2 Test: Adjust the priority of some test cases from P1/P2 to P3. (#19461)
### Summary

as title

Co-authored-by: Jin Hai <haijin.chn@gmail.com>
2026-09-09 23:58:00 +08:00
mkaaadandcoderabbitai[bot] d29a4fc26b fix(py-go-connector): enforce kb authorization in rebuild (#19190)
Based on community PR #15272 by @rene0422

---------

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
2026-09-03 12:01:28 +08:00
Yash Raj Pandey bfccb5177d Stop splitting resume documents into per-page parsing tasks (#18713) 2026-09-03 10:40:29 +08:00
MarMar Labs cd27ae4c6e fix(memory): put the keyword weight in the text slot of the fusion expression (#18989)
Fix memory search hybrid weights inverted (slot 1 is vector weight, not keyword). Now matches build_fusion_expr. At 0.7, memory search becomes keyword-dominant (was vector-dominant).
2026-09-01 16:14:36 +08:00
Martin Civáň 867e4187eb Fix don't send an empty tools array (#19015)
Fix non-streaming chat sending empty tools=[] (rejected by strict providers). Restored mdl.is_tools check and added helper to omit tools field when unbound.
2026-09-01 13:55:37 +08:00
MarMar Labs bf5cf26df6 fix(test): give the rag_agent dialog stub the retrieval settings it now reads (#19081) 2026-09-01 12:25:38 +08:00
euvre 2af732d607 fix(chat): images uploaded in chat UI were ignored by vision models (agentic loop / Go attachment drop) (#18884) 2026-08-31 19:35:02 +08:00
Martin Civáň 1757425903 fix: retrieve with the assistant's configured settings (#19016)
Fix agentic search ignoring chat retrieval settings — now passes knn_top_k, weights, threshold, and top_n. knn_top_k critical for HNSW recall on large indices.
2026-08-31 19:03:28 +08:00
georgelichenandChen Li f300b154b0 fix(chat): keep reasoning chats grounded when LLM lacks tool calling (#18983)
Fix reasoning + KB requests using models without tool-calling — now fall back to async_chat RAG path instead of answering from general knowledge. 

Co-authored-by: Chen Li <george_lichne@163.com>
2026-08-31 14:28:12 +08:00
Yingfeng 862ee95df2 Refine agentic search (#18798) 2026-08-28 23:56:14 +08:00
Chakshu Dhannawat 146765f32e fix(agentic_rag): include configured system prompt in RAGTools.sys_prompt() (#18927)
Fixes #18833. 

When the reasoning level is enabled, `dialog_service.rag_agent()` builds a custom system prompt and passes it to `RAGTools`. `RAGTools.sys_prompt()`, however, returned only the router instructions, so the configured system prompt was dropped from the outer LLM.

This change prepends the configured system prompt to the router prompt when one is provided, and adds regression tests.
2026-08-28 12:10:47 +08:00
ChendongPang 03d0ad2ace fix(api): derive SQL retrieval tenant from dataset owner, not chat tenant (#18518) 2026-08-28 09:57:12 +08:00
SYED ALI ABBAS RAHIL 82e4147b83 fix(api): honor dialog system prompt in reasoning-enabled chat (#18842)
### Problem

When a chat assistant has a configured system prompt and the reasoning
level is set to anything other than `NONE`, the request goes through
`rag_agent()` / the agentic RAG harness. That path generated the final
answer with a fixed `FINAL_ANSWER_SYSTEM` prompt and never injected the
user-configured system prompt, so the assistant ignored
role/tone/language instructions (reported in #18833).
2026-08-27 14:53:06 +08:00
Wang Qi 92c69db79e Refactor: expose knn top_k and knn num_candidaties (#18737)
Follow on #18300
2026-08-25 17:16:36 +08:00
Mpider-San aa57022bfd Fix: cross-KB document id collision in data source sync (#18116) (#18244)
### What problem does this PR solve?

Closes #18116.

Fix cross-KB document ID collision (#18116). Older ID derivation excluded kb_id, causing two KBs to fight over one row. Unified derivation to be KB-scoped, with fallback for existing rows. Stranded rows are reclaimed, dataset deletion now cleans up state, and upgraded instances update in place. Tests added.
2026-08-25 15:15:46 +08:00
Wang Qi 4c6f745c1e Refactor: rename prefetch_size to rerank_candidates (#18718) 2026-08-25 11:35:53 +08:00
Bharadwaj PendyalaandJin Hai 89fc1abac9 fix(chat): stop rag_agent forwarding message bookkeeping keys to the provider (#18663)
### Summary

Fixes #18653. Groq rejects every chat request on v0.27.0 with `property
'conversationId' is unsupported`, while the same chat works on Ollama.

Closes #18653

Co-authored-by: Jin Hai <haijin.chn@gmail.com>
2026-08-25 10:36:27 +08:00
Wang Qi 5659476a30 Fix: correct rerank #17296 - add prefetch_size (#18300) 2026-08-24 16:09:07 +08:00
Sevenzuo aa49146a63 fix: preserve empty chat fields on GaussDB (#18445) 2026-08-21 16:45:10 +08:00
Jiang, Guomin 09af859357 fix(metadata): batch large document ID filters (#17394)
## Summary

- batch `DocMetadataService._search_metadata()` requests whose
`condition["id"]` list exceeds 10,000 IDs
- combine the per-batch results so metadata reads, summaries, and batch
updates avoid a single oversized Elasticsearch `terms` query
- add regression coverage for 20,001 IDs, verifying three bounded
backend searches and complete metadata results

Fixes #17393
2026-08-21 15:21:45 +08:00
Lynn b8b35aa9ab Fix: kimi k3 temperature (#18564) 2026-08-21 10:11:06 +08:00
0067470903 fix: apply order_by return value in deep-pagination helpers (unordered OFFSET/LIMIT can skip/dupe rows) (#17325)
### Summary

The fix is one line per helper — assign the `order_by(...)` result back
so the
ordering is actually applied to the query.

Co-authored-by: rsnetworkinginc <rsnetworkinginc@users.noreply.github.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-20 19:39:02 +08:00
Sevenzuo 1f0285ee9b fix: preserve blocking GaussDB advisory locks (#18506) 2026-08-20 16:39:43 +08:00
Christian UhlandKrim f806001b3f fix(db): make negative GET_LOCK timeouts work on MariaDB (#18529)
### Summary

The fix turns a negative timeout into a finite 60 second wait inside
`MysqlDatabaseLock`, which both servers accept. Callers keep expressing
"block until available", and the equivalent PostgreSQL and GaussDB work
on the same `-1` semantics (#16346, #18506) is untouched. Non-negative
timeouts keep their current behaviour.

---------

Co-authored-by: Krim <git@krim.dev>
2026-08-20 16:33:46 +08:00
WangshuandClaude Sonnet 5 77884f4a7c test: pin bare tenant_model.id resolution in resolve_model_config (#18528)
## Summary
- Adds a regression test for #18398

Fixes #18398

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-20 16:17:30 +08:00
LoongandLoong 1e147e0c0b fix(memory): normalize invalid extraction timestamps (#18463)
## Summary

- allow ISO 8601 normalization callers to provide an explicit fallback
while preserving the existing default behavior
- use the extraction conversation time when `valid_at` is missing or
invalid
- clear an invalid optional `invalid_at` instead of writing an
unparseable value
- include the rejected timestamp value in the error log

This addresses the timestamp write-through portion of #18415. It is
intentionally separate from #18462, which fixes the semantic output
prompt.

Co-authored-by: Loong <184861530+yzl0ng@users.noreply.github.com>
2026-08-19 18:31:51 +08:00
Loong bf9f06c566 fix(memory): honor custom extraction prompts (#18461)
### Summary

- Forward each memory's stored system_prompt and user_prompt to
extract_by_llm.
- Cover both immediate save and queued extraction paths with focused
regression tests.
- Preserve the existing default-prompt fallback when stored prompts are
empty.

Fixes #18413.
2026-08-19 18:28:36 +08:00
Sevenzuo dd1f335ba2 fix: preserve extensionless document suffix on GaussDB (#18483)
### Summary

RAGFlow's "Create empty document" flow accepts names without a file
extension. The `POST /datasets/<dataset_id>/documents?type=empty` route
calls `_upload_empty_document()`, where `Path(name).suffix.lstrip(".")`
returns `""`.

In GaussDB's A/ORA compatibility mode, that empty string is persisted as
SQL `NULL`. Because `document.suffix` was defined as `NOT NULL`, the
insert failed with a constraint violation.
2026-08-19 18:26:14 +08:00
zws202606 d02723ca76 feat: Gaussdb adaptation (#17703) 2026-08-18 09:53:11 +08:00
S c6ba54bc72 fix: stop three recurring errors on doc delete (#17685) (#17686)
Follow-up to #17526 ("Refactor: merge dataset scope graph"), which introduced two code paths that touch Infinity columns the deployed schema does not declare. This PR makes the runtime robust against the old schema while also adding the new column to the new schema so freshly created tables are correct.
2026-08-16 09:25:51 +08:00
euvre 0d198fccec Fix DateTimeTzField crashing on driver-native datetimes and unparseable values (#18264) 2026-08-14 15:56:05 +08:00
euvre b1de7e8136 Fix: allow datasets sharing a base embedding model to be searched together (#18166) 2026-08-13 09:51:44 +08:00
buua436 1d141aff18 fix: optimize dataflow indexing and logs (#17737) 2026-08-03 19:15:44 +08:00
SYED ALI ABBAS RAHIL bda703b588 test: add regression coverage for metadata filter pagination beyond push-down cap (#16932)
### Summary

#16524 reports that a manual metadata filter matching more documents
than the ES push-down cap (`filter_doc_ids_by_meta_pushdown`'s default
`limit=10000`) drops documents once the request falls back to the
in-memory path — e.g. a `canon Not in ["0"]` filter over a
39,573-document KB where ~38,500 matching documents never come back.

I traced through the current code path for this exact scenario:
- `_filter_doc_ids_by_metadata_es` correctly detects when the match
total exceeds the push-down cap and bails to the in-memory fallback
instead of returning a truncated slice.
- `get_flatted_meta_by_kbs` (fixed by #16095) now fully paginates
through every document in the KB rather than stopping after the first
page.
- `es_conn.py`'s `search()` already switches to `search_after`-based
pagination once `offset + limit` would exceed ES's `max_result_window`
(10,000), so the outer pagination loop doesn't get cut off by that
ceiling either.
- `meta_filter()` then aggregates over the complete flattened metadata
with no additional cap.

I couldn't reproduce the drop against current `main` following that
path. This PR adds a test that simulates the exact reported scenario
(12,000 synthetic documents, `canon Not in ["0"]` matching all but 30 of
them) against a fake, paginated `docStoreConn` standing in for
Elasticsearch — both assertions pass on current `main`.

To make sure this is a meaningful regression test and not a false
positive, I temporarily reverted `get_flatted_meta_by_kbs` to stop after
the first page (the pre-#16095 behavior) and confirmed the test
correctly fails (970 of the expected 11,970 documents), then restored
the original code before committing.

Given all of that, it looks like #16524 may already be fixed by the
combination of #16095 and the existing `search_after` handling in
`es_conn.py`, but I could be missing something about the reporter's
specific deployment or a scenario I haven't considered (e.g. a
downstream cap once matched doc_ids feed into the content-chunk
retrieval query). I've left a comment on the issue with this same
analysis so a maintainer familiar with the history here can confirm or
point me at what I'm missing. Either way, this test is a useful
regression guard for the pagination behavior going forward.
2026-07-16 09:33:48 +08:00
buua436 6a77523bf0 refa: resolve tenant model refs consistently (#16744) 2026-07-09 14:02:08 +08:00
Lynn 1430d0e431 Fix: provider name (#16733) 2026-07-09 10:19:10 +08:00
Lynn 0ae5961e1c Feat: v0.27.0 model provider (#16604) 2026-07-08 09:47:29 +08:00
Öndery 28a41ed070 fix(task_executor): fix Langfuse flush/shutdown deadlock that freezes document parsing (#16502) 2026-07-07 19:06:30 +08:00
S f477d3329d Fix: ValueError: too many values to unpack in list_tenant_added_models for model IDs containing '@' (#16467) (#16468) 2026-07-07 09:40:27 +08:00
Wang Qi a0e65637eb Delete canvas_app.py and evaluation_service.py (#16614)
Follow on PR #13295
2026-07-03 21:03:54 +08:00
Wang Qi 6a4b9be426 Refactor: reformat all code for lefthook using ruff and gofmt (#16585) 2026-07-03 12:53:39 +08:00
Harsh Kashyap d770217b25 fix(api): fall back to factory max_tokens for tenant models (#16364) 2026-07-01 16:00:13 +08:00
Zhichang Yu f58fae5fb7 feat(go-agent): Ported retrieval node, added Keenable web search tool (#16396)
Ported retrieval node, added Keenable web search tool
- [x] New Feature (non-breaking change which adds functionality)
2026-06-29 09:45:16 +08:00
Harsh Kashyap 49312cace3 fix(api): align use_sql Markdown separator with Source header (#16317) 2026-06-25 19:00:01 +08:00
Lynn 70792de899 Fix: v0.26.1 model provider (#16073)
### What problem does this PR solve?

Fix:
- Pass session_id to langfuse.
- Get correct status for add model_type.

### Type of change

- [x] Bug Fix (non-breaking change which fixes an issue)
2026-06-16 16:21:43 +08:00
buua436 8e235b7b95 fix: add legacy chat/completions mode (#16014)
### What problem does this PR solve?
Adds a legacy mode for /chat/completions that restores v0.23.0-style
output by converting start_to_think/end_to_think back into raw
<think></think> markers and streaming cumulative answer text.

### Type of change
- [x] Bug Fix (non-breaking change which fixes an issue)
2026-06-16 10:34:06 +08:00
Jonathan Chang de06c9a60b feat: Langfuse session grouping for multi-turn chat traces (#15679)
## Summary

This PR passes `session_id` into Langfuse trace observations so
multi-turn chat messages can be grouped under the same session in
Langfuse.

Changes include:
- Propagate `session_id` from chat/session APIs into
`dialog_service.async_chat`.
- Pass `session_id` into Langfuse `start_observation(...)`.
- Share Langfuse `trace_context` with chat, embedding, rerank, and TTS
model bundles where applicable.
- Add unit coverage to verify Langfuse observations receive
`session_id`.
- Update affected test stubs for the new optional Langfuse context
arguments.

## Related Issue
Closes: #15636 

## Change Type
- [x] Feature
- [x] Bug fix
- [x] Test
- [ ] Refactor
- [ ] Documentation
- [ ] Breaking change

## Real Behavior Proof

Before this change:

- Langfuse observations were created without `session_id`.
- Multi-turn chat traces could not be grouped by session in Langfuse.

After this change:

- Chat/session flows pass `session_id` into `async_chat`.
- Langfuse observations include `session_id`.
- Related model bundles receive shared trace context and session
metadata.

Validation result:

```bash
uv run python -m py_compile \
  api/db/services/tenant_llm_service.py \
  api/db/services/llm_service.py \
  api/db/services/dialog_service.py \
  api/db/services/conversation_service.py \
  api/apps/restful_apis/chat_api.py \
  test/unit_test/api/db/services/test_dialog_service_final_answer.py \
  test/unit_test/api/db/services/test_dialog_service_use_sql_source_columns.py
```
Passed.

```bash
uv run pytest \
  test/unit_test/api/db/services/test_dialog_service_final_answer.py \
  test/unit_test/api/db/services/test_dialog_service_use_sql_source_columns.py -q
```
Result:

```text
11 passed in 16.89s
```

```bash
git diff --check
```
Passed.
## Checklist

- [x] Analyzed the issue requirement.
- [x] Checked existing Langfuse trace integration.
- [x] Implemented only the requested session grouping behavior.
- [x] Added/updated unit tests.
- [x] Ran focused tests successfully.
- [x] Ran Python compile validation.
- [x] Ran whitespace diff validation.
2026-06-12 10:18:06 +08:00
bohdansolovieandWang Qi 381091df71 fix(dialog): guard async_ask() against empty or invalid kb_ids (#15530)
Fixes #15529 .

### Problem

`async_ask()` accessed `kbs[0]` without verifying that
`KnowledgebaseService.get_by_ids()` returned any knowledge bases. Empty
or stale `kb_ids` raised `IndexError`, which surfaced as HTTP 500 on
search/bot SSE endpoints.

### Fix

- Add an early guard when `kbs` is empty, yielding a final SSE error
event (consistent with `gen_mindmap()` in the same module).
- Add regression tests for empty `kb_ids` and deleted/invalid KB IDs.

### Test plan

- [ ] `pytest
test/unit_test/api/db/services/test_dialog_service_final_answer.py -k
"async_ask_empty or async_ask_stale"`
- [ ] Manual: `POST /api/v1/searchbots/ask` with invalid `kb_ids`
returns SSE error, not HTTP 500

---------

Co-authored-by: Wang Qi <wangq8@outlook.com>
2026-06-11 15:52:59 +08:00
Lynnandbill dc4b82523b Feat: tenant llm provider (#14595)
### What problem does this PR solve?

Python implementation of the Go-based model_provider API suite.

### Type of change

- [x] New Feature (non-breaking change which adds functionality)

---------

Co-authored-by: bill <yibie_jingnian@163.com>
2026-05-29 17:39:41 +08:00
kpdevandkiannidev faf77a5a8a feat(evaluation): track token usage in evaluation results (#13487)
## Summary

Implements the TODO in `evaluation_service.py`: **Track token usage** in
evaluation results.

## Changes

- **Import** `num_tokens_from_string` from `common.token_utils`
- **Prompt tokens**: Use the full prompt returned by `async_chat` when
available (includes system prompt + knowledge base + query), otherwise
fall back to the question token count
- **Completion tokens**: Count tokens in the generated answer
- **Storage**: Store `token_usage` as `{prompt_tokens,
completion_tokens, total_tokens}` in each `EvaluationResult` instead of
`None`

## Why

The evaluation pipeline previously saved `token_usage: None` for every
result. This change allows downstream consumers (e.g. evaluation
dashboards, cost tracking) to see approximate token usage per test case
using the same tokenizer (tiktoken cl100k_base) used elsewhere in
RAGFlow.

## Testing

- No new tests added; existing evaluation flow unchanged
- Token counting uses existing `num_tokens_from_string` utility

---------

Co-authored-by: kiannidev <kiannidev@users.noreply.github.com>
2026-05-22 15:19:53 +08:00