mirror of
https://github.com/infiniflow/ragflow.git
synced 2025-12-26 00:46:52 +08:00
### What problem does this PR solve?
This PR integrates SearXNG as a new search tool for Agents. It adds
corresponding form/config UI on the frontend and a new tool
implementation on the backend, enabling aggregated web searches via a
self-hosted SearXNG instance within chats/workflows. It also adds
multilingual copy to support internationalized presentation and
configuration guidance.
### Type of change
- [x] New Feature (non-breaking change which adds functionality)
### What’s Changed
- Frontend: new SearXNG tool configuration, forms, and command wiring
- Main changes under `web/src/pages/agent/`
- New components and form entries are connected to Agent tool selection
and workflow node configuration
- Backend: new tool implementation
- `agent/tools/searxng.py`: connects to a SearXNG instance and performs
search based on the provided instance URL and query parameters
- i18n updates
- Added/updated keys under `web/src/locales/`: `searXNG` and
`searXNGDescription`
- English reference in
[web/src/locales/en.ts](cci:7://file:///c:/Users/ruy_x/Work/CRSC/2025/Software_Development/2025.8/ragflow-pr/ragflow/web/src/locales/en.ts:0:0-0:0):
- `searXNG: 'SearXNG'`
- `searXNGDescription: 'A component that searches via your provided
SearXNG instance URL. Specify TopN and the instance URL.'`
- Other languages have `searXNG` and `searXNGDescription` added as well,
but accuracy is only guaranteed for English, Simplified Chinese, and
Traditional Chinese.
---------
Co-authored-by: xurui <xurui@crscd.com.cn>
71 lines
2.1 KiB
TypeScript
71 lines
2.1 KiB
TypeScript
import { omit, pick } from 'lodash';
|
|
import { useCallback } from 'react';
|
|
import { Operator } from '../constant';
|
|
import { useInitializeOperatorParams } from './use-add-node';
|
|
|
|
export function useAgentToolInitialValues() {
|
|
const { initialFormValuesMap } = useInitializeOperatorParams();
|
|
|
|
const initializeAgentToolValues = useCallback(
|
|
(operatorName: Operator) => {
|
|
const initialValues = initialFormValuesMap[operatorName];
|
|
|
|
switch (operatorName) {
|
|
case Operator.Retrieval:
|
|
return {
|
|
...omit(initialValues, 'query'),
|
|
description: '',
|
|
};
|
|
case (Operator.TavilySearch, Operator.TavilyExtract):
|
|
return {
|
|
api_key: '',
|
|
};
|
|
case Operator.ExeSQL:
|
|
return omit(initialValues, 'sql');
|
|
case Operator.Bing:
|
|
return omit(initialValues, 'query');
|
|
case Operator.YahooFinance:
|
|
return omit(initialValues, 'stock_code');
|
|
|
|
case Operator.Email:
|
|
return pick(
|
|
initialValues,
|
|
'smtp_server',
|
|
'smtp_port',
|
|
'email',
|
|
'password',
|
|
'sender_name',
|
|
);
|
|
|
|
case Operator.DuckDuckGo:
|
|
return pick(initialValues, 'top_n', 'channel');
|
|
|
|
case Operator.Wikipedia:
|
|
return pick(initialValues, 'top_n', 'language');
|
|
case Operator.Google:
|
|
return pick(initialValues, 'api_key', 'country', 'language');
|
|
case Operator.GoogleScholar:
|
|
return omit(initialValues, 'query', 'outputs');
|
|
case Operator.ArXiv:
|
|
return pick(initialValues, 'top_n', 'sort_by');
|
|
case Operator.PubMed:
|
|
return pick(initialValues, 'top_n', 'email');
|
|
case Operator.GitHub:
|
|
return pick(initialValues, 'top_n');
|
|
case Operator.WenCai:
|
|
return pick(initialValues, 'top_n', 'query_type');
|
|
case Operator.Code:
|
|
return {};
|
|
case Operator.SearXNG:
|
|
return pick(initialValues, 'searxng_url', 'top_n');
|
|
|
|
default:
|
|
return initialValues;
|
|
}
|
|
},
|
|
[initialFormValuesMap],
|
|
);
|
|
|
|
return { initializeAgentToolValues };
|
|
}
|