Skip to content

fix(agent): restore be_output and test DeepL error return#16363

Merged
yuzhichang merged 7 commits into
infiniflow:mainfrom
Harsh23Kashyap:Harsh23Kashyap/fix/deepl-run-error-test
Jun 28, 2026
Merged

fix(agent): restore be_output and test DeepL error return#16363
yuzhichang merged 7 commits into
infiniflow:mainfrom
Harsh23Kashyap:Harsh23Kashyap/fix/deepl-run-error-test

Conversation

@Harsh23Kashyap

Copy link
Copy Markdown
Contributor

Summary

#16332 fixed the missing return in DeepL's except branch, but ComponentBase.be_output was removed during the agent refactor (#9113) while several components still call it. DeepL (and other tools) would raise AttributeError before any error message could be returned.

  • Restore ComponentBase.be_output as pd.DataFrame([{"content": v}]) (same as pre-refactor behavior)
  • Add regression test that _run returns the **Error**: message when translation fails

Related to #16329

Test plan

  • test_run_returns_error_on_translation_failure
  • Existing test_deepl.py check() tests still pass

@dosubot dosubot Bot added size:XS This PR changes 0-9 lines, ignoring generated files. 🐞 bug Something isn't working, pull request that fix bug. 🧪 test Pull requests that update test cases. labels Jun 25, 2026
@Harsh23Kashyap

Copy link
Copy Markdown
Contributor Author

Could a maintainer add the ci label when convenient? Thanks.

@coderabbitai

coderabbitai Bot commented Jun 25, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 8eeab724-1e38-493d-a413-116edf049f58

📥 Commits

Reviewing files that changed from the base of the PR and between 416abd9 and 2dd8d93.

📒 Files selected for processing (1)
  • test/unit_test/agent/component/test_deepl.py
💤 Files with no reviewable changes (1)
  • test/unit_test/agent/component/test_deepl.py

📝 Walkthrough

Walkthrough

ComponentBase adds a helper that wraps a value in a one-row pandas DataFrame with a content column. The DeepL unit test module adds test scaffolding and a test that checks translation failures return formatted error content.

Changes

DeepL output helper and failure test

Layer / File(s) Summary
Helper and failure test
agent/component/base.py, test/unit_test/agent/component/test_deepl.py
ComponentBase adds be_output(v) for one-row content DataFrames, and the DeepL test module adds a stub canvas, a DeepL factory, and a test asserting _run returns **Error**:boom on translation failure.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 minutes

Possibly related issues

Possibly related PRs

Suggested labels

lgtm

Suggested reviewers

  • yuzhichang

Poem

A bunny hopped through code so bright,
With DataFrames tucked just right.
When DeepL stumbled, error came clear,
**Error**:boom brought cheer here. 🐰

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title is concise and matches the main change: restoring be_output and adding a DeepL error-handling regression test.
Description check ✅ Passed The description clearly explains the bug, fix, and test plan, but it omits the template's Type of change section.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (1)
test/unit_test/agent/component/test_deepl.py (1)

62-62: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Redundant input setup.

get_input is patched at Line 64 to return {"content": ["hello"]}, so seeding cpn._param.inputs here has no effect on the code path under test. Drop it to avoid implying it's exercised.

♻️ Proposed cleanup
 def test_run_returns_error_on_translation_failure():
     cpn = _deepl()
-    cpn._param.inputs = {"content": {"value": ["hello"]}}
 
     with patch.object(DeepL, "get_input", return_value={"content": ["hello"]}):
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@test/unit_test/agent/component/test_deepl.py` at line 62, Remove the
redundant test setup in test_deepl.py by deleting the cpn._param.inputs
assignment, since get_input is already patched to return the needed {"content":
["hello"]}. Keep the test focused on the patched get_input path and rely on that
mocked value instead of seeding internal state on cpn.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In `@test/unit_test/agent/component/test_deepl.py`:
- Line 62: Remove the redundant test setup in test_deepl.py by deleting the
cpn._param.inputs assignment, since get_input is already patched to return the
needed {"content": ["hello"]}. Keep the test focused on the patched get_input
path and rely on that mocked value instead of seeding internal state on cpn.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: a9bc01b6-d235-47d4-a89d-8c19917bb319

📥 Commits

Reviewing files that changed from the base of the PR and between 0af5d43 and 416abd9.

📒 Files selected for processing (2)
  • agent/component/base.py
  • test/unit_test/agent/component/test_deepl.py

@yingfeng yingfeng requested a review from yuzhichang June 25, 2026 13:07
@yingfeng yingfeng added the ci Continue Integration label Jun 25, 2026
@yingfeng yingfeng marked this pull request as draft June 25, 2026 13:07
@yingfeng yingfeng marked this pull request as ready for review June 25, 2026 13:07
@Harsh23Kashyap

Harsh23Kashyap commented Jun 26, 2026

Copy link
Copy Markdown
Contributor Author

Fixed the preflight Ruff failure in 2dd8d93 by removing the unused MagicMock import from test/unit_test/agent/component/test_deepl.py.

Verification:

  • python3 -m py_compile test/unit_test/agent/component/test_deepl.py
  • uvx ruff check test/unit_test/agent/component/test_deepl.py

@codecov

codecov Bot commented Jun 26, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 93.16%. Comparing base (f90be41) to head (66ed42d).

Additional details and impacted files
@@            Coverage Diff             @@
##             main   #16363      +/-   ##
==========================================
- Coverage   94.56%   93.16%   -1.40%     
==========================================
  Files          10       10              
  Lines         717      717              
  Branches      118      118              
==========================================
- Hits          678      668      -10     
- Misses         25       29       +4     
- Partials       14       20       +6     

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@yuzhichang yuzhichang left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I re-reviewed the current head locally. The be_output() restoration and the DeepL failure-path regression test both look correct, and I do not see any remaining blocking issue in the current diff. The only unresolved bot comment is a very low-value cleanup in the test setup, so from my side this is ready to merge.

@yuzhichang yuzhichang merged commit ab1015d into infiniflow:main Jun 28, 2026
4 checks passed
yuzhichang added a commit that referenced this pull request Jun 29, 2026
## Summary

#16332 fixed the missing `return` in DeepL's except branch, but
`ComponentBase.be_output` was removed during the agent refactor (#9113)
while several components still call it. DeepL (and other tools) would
raise `AttributeError` before any error message could be returned.

- Restore `ComponentBase.be_output` as `pd.DataFrame([{"content": v}])`
(same as pre-refactor behavior)
- Add regression test that `_run` returns the `**Error**:` message when
translation fails

Related to #16329

## Test plan

- [x] `test_run_returns_error_on_translation_failure`
- [x] Existing `test_deepl.py` check() tests still pass

---------

Co-authored-by: Harsh Kashyap <harshkashyap@Harshs-MacBook-Pro.local>
Co-authored-by: Zhichang Yu <yuzhichang@gmail.com>
yuzhichang added a commit to yuzhichang/ragflow that referenced this pull request Jun 29, 2026
Ports 5 S-effort PRs from .claude/plans/review-and-port-py-agent-changes.md
Execution snapshot (all merged upstream) to the Go agent side.

Group 1 - tool ports
- infiniflow#15609 ExeSQL SSRF guard: add ValidateDBHost to tool/ssrf.go and
  wire into exesql.InvokableRun. Loopback, link-local, RFC1918, and
  empty host are rejected before any driver dispatch. Allowed hosts
  are dialed via the validated/resolved public IP (DNS-pin).
- infiniflow#15436 HTTP timeout: Go side already routes github/qweather/tushare
  through HTTPHelper (client.Timeout: 30s + per-stage timeouts) and
  jin10 is a stub. Added regression guard tests: default client
  timeout, stage timeouts, and AST scan for bare http.Get/Post calls
  outside the helper.

Group 2 - component ports
- infiniflow#16363 be_output restore + DeepL error: add BeOutput(v) helper
  returning {"content": v} frame; add DeepL translation-failure
  regression test using rewriteHostTransport (avoids mutating
  package globals which raced TestDeepL_BuildRequest).
- infiniflow#15644 Switch no longer matches empty condition: evaluateGroup
  empty-clauses short-circuit now returns false (was true) so an
  "and" condition with no clauses falls through to the next
  condition or end_cpn_ids instead of routing to the empty
  group's "to" target. Mirrors the all([]) is True fix.

Group 4 - API ports
- infiniflow#15374 session_id bind to path agent_id: Go DAO already enforces
  WHERE id = ? AND dialog_id = ? (stronger than the Python
  post-fetch check). Added 3 IDOR regression tests at the service
  level (Get/Get mismatch/Delete) confirming the binding holds.

Total: 32 new tests across 4 new test files. All agent/tool and
agent/component tests pass (320 + 331). All new service IDOR
tests pass (3/3). The one failing test in agent/component
(TestAgent_ReActExhaustsSteps) is a pre-existing flaky test that
also fails on the baseline without my changes.

Refs: .claude/plans/review-and-port-py-agent-changes.md
Refs: infiniflow#15609 infiniflow#15436 infiniflow#16363 infiniflow#15644 infiniflow#15374
yuzhichang added a commit to yuzhichang/ragflow that referenced this pull request Jun 29, 2026
Ports 5 S-effort PRs from .claude/plans/review-and-port-py-agent-changes.md
Execution snapshot (all merged upstream) to the Go agent side.

Group 1 - tool ports
- infiniflow#15609 ExeSQL SSRF guard: add ValidateDBHost to tool/ssrf.go and
  wire into exesql.InvokableRun. Loopback, link-local, RFC1918, and
  empty host are rejected before any driver dispatch. Allowed hosts
  are dialed via the validated/resolved public IP (DNS-pin).
- infiniflow#15436 HTTP timeout: Go side already routes github/qweather/tushare
  through HTTPHelper (client.Timeout: 30s + per-stage timeouts) and
  jin10 is a stub. Added regression guard tests: default client
  timeout, stage timeouts, and AST scan for bare http.Get/Post calls
  outside the helper.

Group 2 - component ports
- infiniflow#16363 be_output restore + DeepL error: add BeOutput(v) helper
  returning {"content": v} frame; add DeepL translation-failure
  regression test using rewriteHostTransport (avoids mutating
  package globals which raced TestDeepL_BuildRequest).
- infiniflow#15644 Switch no longer matches empty condition: evaluateGroup
  empty-clauses short-circuit now returns false (was true) so an
  "and" condition with no clauses falls through to the next
  condition or end_cpn_ids instead of routing to the empty
  group's "to" target. Mirrors the all([]) is True fix.

Group 4 - API ports
- infiniflow#15374 session_id bind to path agent_id: Go DAO already enforces
  WHERE id = ? AND dialog_id = ? (stronger than the Python
  post-fetch check). Added 3 IDOR regression tests at the service
  level (Get/Get mismatch/Delete) confirming the binding holds.

Total: 32 new tests across 4 new test files. All agent/tool and
agent/component tests pass (320 + 331). All new service IDOR
tests pass (3/3). The one failing test in agent/component
(TestAgent_ReActExhaustsSteps) is a pre-existing flaky test that
also fails on the baseline without my changes.

Refs: .claude/plans/review-and-port-py-agent-changes.md
Refs: infiniflow#15609 infiniflow#15436 infiniflow#16363 infiniflow#15644 infiniflow#15374
yuzhichang added a commit to yuzhichang/ragflow that referenced this pull request Jun 29, 2026
Ports 5 S-effort PRs from .claude/plans/review-and-port-py-agent-changes.md
Execution snapshot (all merged upstream) to the Go agent side.

Group 1 - tool ports
- infiniflow#15609 ExeSQL SSRF guard: add ValidateDBHost to tool/ssrf.go and
  wire into exesql.InvokableRun. Loopback, link-local, RFC1918, and
  empty host are rejected before any driver dispatch. Allowed hosts
  are dialed via the validated/resolved public IP (DNS-pin).
- infiniflow#15436 HTTP timeout: Go side already routes github/qweather/tushare
  through HTTPHelper (client.Timeout: 30s + per-stage timeouts) and
  jin10 is a stub. Added regression guard tests: default client
  timeout, stage timeouts, and AST scan for bare http.Get/Post calls
  outside the helper.

Group 2 - component ports
- infiniflow#16363 be_output restore + DeepL error: add BeOutput(v) helper
  returning {"content": v} frame; add DeepL translation-failure
  regression test using rewriteHostTransport (avoids mutating
  package globals which raced TestDeepL_BuildRequest).
- infiniflow#15644 Switch no longer matches empty condition: evaluateGroup
  empty-clauses short-circuit now returns false (was true) so an
  "and" condition with no clauses falls through to the next
  condition or end_cpn_ids instead of routing to the empty
  group's "to" target. Mirrors the all([]) is True fix.

Group 4 - API ports
- infiniflow#15374 session_id bind to path agent_id: Go DAO already enforces
  WHERE id = ? AND dialog_id = ? (stronger than the Python
  post-fetch check). Added 3 IDOR regression tests at the service
  level (Get/Get mismatch/Delete) confirming the binding holds.

Total: 32 new tests across 4 new test files. All agent/tool and
agent/component tests pass (320 + 331). All new service IDOR
tests pass (3/3). The one failing test in agent/component
(TestAgent_ReActExhaustsSteps) is a pre-existing flaky test that
also fails on the baseline without my changes.

Refs: .claude/plans/review-and-port-py-agent-changes.md
Refs: infiniflow#15609 infiniflow#15436 infiniflow#16363 infiniflow#15644 infiniflow#15374
yuzhichang added a commit to yuzhichang/ragflow that referenced this pull request Jun 29, 2026
Ports 5 S-effort PRs from .claude/plans/review-and-port-py-agent-changes.md
Execution snapshot (all merged upstream) to the Go agent side.

Group 1 - tool ports
- infiniflow#15609 ExeSQL SSRF guard: add ValidateDBHost to tool/ssrf.go and
  wire into exesql.InvokableRun. Loopback, link-local, RFC1918, and
  empty host are rejected before any driver dispatch. Allowed hosts
  are dialed via the validated/resolved public IP (DNS-pin).
- infiniflow#15436 HTTP timeout: Go side already routes github/qweather/tushare
  through HTTPHelper (client.Timeout: 30s + per-stage timeouts) and
  jin10 is a stub. Added regression guard tests: default client
  timeout, stage timeouts, and AST scan for bare http.Get/Post calls
  outside the helper.

Group 2 - component ports
- infiniflow#16363 be_output restore + DeepL error: add BeOutput(v) helper
  returning {"content": v} frame; add DeepL translation-failure
  regression test using rewriteHostTransport (avoids mutating
  package globals which raced TestDeepL_BuildRequest).
- infiniflow#15644 Switch no longer matches empty condition: evaluateGroup
  empty-clauses short-circuit now returns false (was true) so an
  "and" condition with no clauses falls through to the next
  condition or end_cpn_ids instead of routing to the empty
  group's "to" target. Mirrors the all([]) is True fix.

Group 4 - API ports
- infiniflow#15374 session_id bind to path agent_id: Go DAO already enforces
  WHERE id = ? AND dialog_id = ? (stronger than the Python
  post-fetch check). Added 3 IDOR regression tests at the service
  level (Get/Get mismatch/Delete) confirming the binding holds.

Total: 32 new tests across 4 new test files. All agent/tool and
agent/component tests pass (320 + 331). All new service IDOR
tests pass (3/3). The one failing test in agent/component
(TestAgent_ReActExhaustsSteps) is a pre-existing flaky test that
also fails on the baseline without my changes.

Refs: .claude/plans/review-and-port-py-agent-changes.md
Refs: infiniflow#15609 infiniflow#15436 infiniflow#16363 infiniflow#15644 infiniflow#15374
yuzhichang added a commit to yuzhichang/ragflow that referenced this pull request Jun 29, 2026
Ports 5 S-effort PRs from .claude/plans/review-and-port-py-agent-changes.md
Execution snapshot (all merged upstream) to the Go agent side.

Group 1 - tool ports
- infiniflow#15609 ExeSQL SSRF guard: add ValidateDBHost to tool/ssrf.go and
  wire into exesql.InvokableRun. Loopback, link-local, RFC1918, and
  empty host are rejected before any driver dispatch. Allowed hosts
  are dialed via the validated/resolved public IP (DNS-pin).
- infiniflow#15436 HTTP timeout: Go side already routes github/qweather/tushare
  through HTTPHelper (client.Timeout: 30s + per-stage timeouts) and
  jin10 is a stub. Added regression guard tests: default client
  timeout, stage timeouts, and AST scan for bare http.Get/Post calls
  outside the helper.

Group 2 - component ports
- infiniflow#16363 be_output restore + DeepL error: add BeOutput(v) helper
  returning {"content": v} frame; add DeepL translation-failure
  regression test using rewriteHostTransport (avoids mutating
  package globals which raced TestDeepL_BuildRequest).
- infiniflow#15644 Switch no longer matches empty condition: evaluateGroup
  empty-clauses short-circuit now returns false (was true) so an
  "and" condition with no clauses falls through to the next
  condition or end_cpn_ids instead of routing to the empty
  group's "to" target. Mirrors the all([]) is True fix.

Group 4 - API ports
- infiniflow#15374 session_id bind to path agent_id: Go DAO already enforces
  WHERE id = ? AND dialog_id = ? (stronger than the Python
  post-fetch check). Added 3 IDOR regression tests at the service
  level (Get/Get mismatch/Delete) confirming the binding holds.

Total: 32 new tests across 4 new test files. All agent/tool and
agent/component tests pass (320 + 331). All new service IDOR
tests pass (3/3). The one failing test in agent/component
(TestAgent_ReActExhaustsSteps) is a pre-existing flaky test that
also fails on the baseline without my changes.

Refs: .claude/plans/review-and-port-py-agent-changes.md
Refs: infiniflow#15609 infiniflow#15436 infiniflow#16363 infiniflow#15644 infiniflow#15374
yuzhichang added a commit to yuzhichang/ragflow that referenced this pull request Jun 30, 2026
Ports 5 S-effort PRs from .claude/plans/review-and-port-py-agent-changes.md
Execution snapshot (all merged upstream) to the Go agent side.

Group 1 - tool ports
- infiniflow#15609 ExeSQL SSRF guard: add ValidateDBHost to tool/ssrf.go and
  wire into exesql.InvokableRun. Loopback, link-local, RFC1918, and
  empty host are rejected before any driver dispatch. Allowed hosts
  are dialed via the validated/resolved public IP (DNS-pin).
- infiniflow#15436 HTTP timeout: Go side already routes github/qweather/tushare
  through HTTPHelper (client.Timeout: 30s + per-stage timeouts) and
  jin10 is a stub. Added regression guard tests: default client
  timeout, stage timeouts, and AST scan for bare http.Get/Post calls
  outside the helper.

Group 2 - component ports
- infiniflow#16363 be_output restore + DeepL error: add BeOutput(v) helper
  returning {"content": v} frame; add DeepL translation-failure
  regression test using rewriteHostTransport (avoids mutating
  package globals which raced TestDeepL_BuildRequest).
- infiniflow#15644 Switch no longer matches empty condition: evaluateGroup
  empty-clauses short-circuit now returns false (was true) so an
  "and" condition with no clauses falls through to the next
  condition or end_cpn_ids instead of routing to the empty
  group's "to" target. Mirrors the all([]) is True fix.

Group 4 - API ports
- infiniflow#15374 session_id bind to path agent_id: Go DAO already enforces
  WHERE id = ? AND dialog_id = ? (stronger than the Python
  post-fetch check). Added 3 IDOR regression tests at the service
  level (Get/Get mismatch/Delete) confirming the binding holds.

Total: 32 new tests across 4 new test files. All agent/tool and
agent/component tests pass (320 + 331). All new service IDOR
tests pass (3/3). The one failing test in agent/component
(TestAgent_ReActExhaustsSteps) is a pre-existing flaky test that
also fails on the baseline without my changes.

Refs: .claude/plans/review-and-port-py-agent-changes.md
Refs: infiniflow#15609 infiniflow#15436 infiniflow#16363 infiniflow#15644 infiniflow#15374

Apply unstaged agent-go-port prep work

docker/.env
  - switch API_PROXY_SCHEME from python to go (Go server is the default)
  - enable SANDBOX_ENABLED=1 and extend COMPOSE_PROFILES with ragflow-go

web/CLAUDE.md
  - document frontend agent conventions: CSS/flex layout debugging,
    scope boundaries, i18n language files, query-key factory pattern,
    request layering (hook -> service -> next-request), shared UI lock,
    utility libs (dayjs, ahooks, lodash)

web/.agents/skills/tanstack-query-best-practices/
  - remove the full tanstack-query-best-practices skill set
    (SKILL.md + 21 rule files, 1,535 lines total)

Lefthook pre-commit was satisfied after stripping two pre-existing
trailing-whitespace lines from docker/.env comments.

chore(hooks): enable auto-fix for staged file checks

Convert lefthook pre-commit to B-mode (check + auto-fix in place)
for the four fixable jobs:

- end-of-file-fixer, trailing-whitespace, mixed-line-ending: these
  wrap tools/hooks/check_files.py, which gains a --fix mode that
  rewrites staged files in place. Lefthook re-stages the fixes via
  stage_fixed: true, so the next commit naturally includes the
  cleanup. The user no longer has to manually strip whitespace,
  append newlines, or normalize line endings.

- web-eslint: ESLint --fix is enabled; safe auto-fixes are applied,
  warnings still surface.

trailing-whitespace now uses a regex ([ \t]+(?=\r?\n|$)) so it
correctly detects/strips whitespace before a line terminator and
preserves CRLF when only stripping whitespace. A previous
splitlines-based rstrip pass would silently miss
whitespace-before-newline.

Checks that only validate (json, yaml) or detect states that need
human review (case-conflict, merge-conflict, broken symlinks)
remain check-only; their --fix flag is accepted but a no-op.

ruff check/format, gofmt, and web-prettier already auto-fixed in
the previous config and were left unchanged.

fix
yuzhichang added a commit to yuzhichang/ragflow that referenced this pull request Jun 30, 2026
Ports 5 S-effort PRs from .claude/plans/review-and-port-py-agent-changes.md
Execution snapshot (all merged upstream) to the Go agent side.

Group 1 - tool ports
- infiniflow#15609 ExeSQL SSRF guard: add ValidateDBHost to tool/ssrf.go and
  wire into exesql.InvokableRun. Loopback, link-local, RFC1918, and
  empty host are rejected before any driver dispatch. Allowed hosts
  are dialed via the validated/resolved public IP (DNS-pin).
- infiniflow#15436 HTTP timeout: Go side already routes github/qweather/tushare
  through HTTPHelper (client.Timeout: 30s + per-stage timeouts) and
  jin10 is a stub. Added regression guard tests: default client
  timeout, stage timeouts, and AST scan for bare http.Get/Post calls
  outside the helper.

Group 2 - component ports
- infiniflow#16363 be_output restore + DeepL error: add BeOutput(v) helper
  returning {"content": v} frame; add DeepL translation-failure
  regression test using rewriteHostTransport (avoids mutating
  package globals which raced TestDeepL_BuildRequest).
- infiniflow#15644 Switch no longer matches empty condition: evaluateGroup
  empty-clauses short-circuit now returns false (was true) so an
  "and" condition with no clauses falls through to the next
  condition or end_cpn_ids instead of routing to the empty
  group's "to" target. Mirrors the all([]) is True fix.

Group 4 - API ports
- infiniflow#15374 session_id bind to path agent_id: Go DAO already enforces
  WHERE id = ? AND dialog_id = ? (stronger than the Python
  post-fetch check). Added 3 IDOR regression tests at the service
  level (Get/Get mismatch/Delete) confirming the binding holds.

Total: 32 new tests across 4 new test files. All agent/tool and
agent/component tests pass (320 + 331). All new service IDOR
tests pass (3/3). The one failing test in agent/component
(TestAgent_ReActExhaustsSteps) is a pre-existing flaky test that
also fails on the baseline without my changes.

Refs: .claude/plans/review-and-port-py-agent-changes.md
Refs: infiniflow#15609 infiniflow#15436 infiniflow#16363 infiniflow#15644 infiniflow#15374

Apply unstaged agent-go-port prep work

docker/.env
  - switch API_PROXY_SCHEME from python to go (Go server is the default)
  - enable SANDBOX_ENABLED=1 and extend COMPOSE_PROFILES with ragflow-go

web/CLAUDE.md
  - document frontend agent conventions: CSS/flex layout debugging,
    scope boundaries, i18n language files, query-key factory pattern,
    request layering (hook -> service -> next-request), shared UI lock,
    utility libs (dayjs, ahooks, lodash)

web/.agents/skills/tanstack-query-best-practices/
  - remove the full tanstack-query-best-practices skill set
    (SKILL.md + 21 rule files, 1,535 lines total)

Lefthook pre-commit was satisfied after stripping two pre-existing
trailing-whitespace lines from docker/.env comments.

chore(hooks): enable auto-fix for staged file checks

Convert lefthook pre-commit to B-mode (check + auto-fix in place)
for the four fixable jobs:

- end-of-file-fixer, trailing-whitespace, mixed-line-ending: these
  wrap tools/hooks/check_files.py, which gains a --fix mode that
  rewrites staged files in place. Lefthook re-stages the fixes via
  stage_fixed: true, so the next commit naturally includes the
  cleanup. The user no longer has to manually strip whitespace,
  append newlines, or normalize line endings.

- web-eslint: ESLint --fix is enabled; safe auto-fixes are applied,
  warnings still surface.

trailing-whitespace now uses a regex ([ \t]+(?=\r?\n|$)) so it
correctly detects/strips whitespace before a line terminator and
preserves CRLF when only stripping whitespace. A previous
splitlines-based rstrip pass would silently miss
whitespace-before-newline.

Checks that only validate (json, yaml) or detect states that need
human review (case-conflict, merge-conflict, broken symlinks)
remain check-only; their --fix flag is accepted but a no-op.

ruff check/format, gofmt, and web-prettier already auto-fixed in
the previous config and were left unchanged.
yuzhichang added a commit that referenced this pull request Jun 30, 2026
)

Mirrors 14 merged upstream PRs into the Go agent port.

PRs ported:
  - #15609 ExeSQL SSRF guard + DNS pin
  - #15436 HTTP timeout on external API tools
  - #16363 be_output restore + DeepL error path
  - #15644 switch no longer matches empty condition
  - #15374 session_id bind to path agent_id (DAO idor guard)
  - #16169 sandbox artifact ownership gate
  - #15457 tenant ownership on agentbots
  - #15145 rerun agent document access check
- #15446 thinking switch (component portion; provider policy lives in
internal/llm)
  - #15426 Invoke URL/proxy SSRF + DNS pin + no-redirects
  - #15238 agentbot thinking-logs beta endpoint
  - #14589 UserFillUp SSE event propagation
  - #14890 anonymous webhook opt-in
- #15068 PipelineChunker new component (text/file_ref/parser_id
dispatch; file-format extraction is a follow-up)

40 files, +2355 / -58 lines. 33 new tests, all targeted package suites
pass (1721 + 4 skipped); 1 pre-existing flaky test unrelated.
@Harsh23Kashyap Harsh23Kashyap deleted the Harsh23Kashyap/fix/deepl-run-error-test branch June 30, 2026 16:54
yuzhichang added a commit to ondery/ragflow that referenced this pull request Jul 1, 2026
…sion/user + input/output to Langfuse for agent runs

Rebuilt on current upstream/main after force-push; cherry-pick of the 7
PR-original commits collapsed into a single net diff to avoid conflicts
with intervening commits pulled in by repeated merges of upstream/main.

Original PR work (commits dropped during rebuild because their content
already lives on upstream/main or was a merge of upstream/main):
  c7339ae Enhance LLMService with token usage reporting
  0266cf0 Implement token usage tracking and Langfuse integration
  ab2b267 Include session_id in run_kwargs
  8bf937c Implement token usage tracking in chat model
  c955988 Enhance token tracking with context variables and functions
  3e88ed5 fix(agent): address CodeRabbit review on token usage tracking
  74b8c8c fix(agent): address CodeRabbit follow-up review

Forced-upstream duplicates dropped (already merged to main):
  70546ea (infiniflow#16396), 5b09910 (infiniflow#16403), 5d7f0fd (infiniflow#16405),
  730f33b (infiniflow#16407), a06343e (infiniflow#16408), f90be41 (infiniflow#16410),
  c4fe68e (infiniflow#16409), d4a0e71 (infiniflow#14773), ef42fd7 (infiniflow#15436),
  ab1015d (infiniflow#16363), db188cc (infiniflow#15446), 56ece68 (infiniflow#15609),
  2589b6e (infiniflow#15644), 74c2944 (infiniflow#15374), 78832ff (infiniflow#14985),
  bf18b59 (infiniflow#15457), 6c87225 (infiniflow#14890), e16d1a0 (infiniflow#15426),
  4712fcb (infiniflow#16169), 0536233 (infiniflow#14589), 08c807a (infiniflow#15145)

Plus 18 'Merge branch main into main' commits dropped (polluted topology).
yuzhichang added a commit to ondery/ragflow that referenced this pull request Jul 1, 2026
…sion/user + input/output to Langfuse for agent runs

Rebuilt on current upstream/main after force-push; cherry-pick of the 7
PR-original commits collapsed into a single net diff to avoid conflicts
with intervening commits pulled in by repeated merges of upstream/main.

Original PR work (commits dropped during rebuild because their content
already lives on upstream/main or was a merge of upstream/main):
  c7339ae Enhance LLMService with token usage reporting
  0266cf0 Implement token usage tracking and Langfuse integration
  ab2b267 Include session_id in run_kwargs
  8bf937c Implement token usage tracking in chat model
  c955988 Enhance token tracking with context variables and functions
  3e88ed5 fix(agent): address CodeRabbit review on token usage tracking
  74b8c8c fix(agent): address CodeRabbit follow-up review

Forced-upstream duplicates dropped (already merged to main):
  70546ea (infiniflow#16396), 5b09910 (infiniflow#16403), 5d7f0fd (infiniflow#16405),
  730f33b (infiniflow#16407), a06343e (infiniflow#16408), f90be41 (infiniflow#16410),
  c4fe68e (infiniflow#16409), d4a0e71 (infiniflow#14773), ef42fd7 (infiniflow#15436),
  ab1015d (infiniflow#16363), db188cc (infiniflow#15446), 56ece68 (infiniflow#15609),
  2589b6e (infiniflow#15644), 74c2944 (infiniflow#15374), 78832ff (infiniflow#14985),
  bf18b59 (infiniflow#15457), 6c87225 (infiniflow#14890), e16d1a0 (infiniflow#15426),
  4712fcb (infiniflow#16169), 0536233 (infiniflow#14589), 08c807a (infiniflow#15145)

Plus 18 'Merge branch main into main' commits dropped (polluted topology).

Co-authored-by: yzc <yuzhichang@gmail.com>
xugangqiang pushed a commit to xugangqiang/ragflow that referenced this pull request Jul 1, 2026
…iniflow#16455)

Mirrors 14 merged upstream PRs into the Go agent port.

PRs ported:
  - infiniflow#15609 ExeSQL SSRF guard + DNS pin
  - infiniflow#15436 HTTP timeout on external API tools
  - infiniflow#16363 be_output restore + DeepL error path
  - infiniflow#15644 switch no longer matches empty condition
  - infiniflow#15374 session_id bind to path agent_id (DAO idor guard)
  - infiniflow#16169 sandbox artifact ownership gate
  - infiniflow#15457 tenant ownership on agentbots
  - infiniflow#15145 rerun agent document access check
- infiniflow#15446 thinking switch (component portion; provider policy lives in
internal/llm)
  - infiniflow#15426 Invoke URL/proxy SSRF + DNS pin + no-redirects
  - infiniflow#15238 agentbot thinking-logs beta endpoint
  - infiniflow#14589 UserFillUp SSE event propagation
  - infiniflow#14890 anonymous webhook opt-in
- infiniflow#15068 PipelineChunker new component (text/file_ref/parser_id
dispatch; file-format extraction is a follow-up)

40 files, +2355 / -58 lines. 33 new tests, all targeted package suites
pass (1721 + 4 skipped); 1 pre-existing flaky test unrelated.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

🐞 bug Something isn't working, pull request that fix bug. ci Continue Integration size:XS This PR changes 0-9 lines, ignoring generated files. 🧪 test Pull requests that update test cases.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants