Feat: Add loop operator node. #10427 (#11449)

### What problem does this PR solve?

Feat: Add loop operator node. #10427

### Type of change


- [x] New Feature (non-breaking change which adds functionality)
This commit is contained in:
balibabu
2025-11-27 15:55:46 +08:00
committed by GitHub
parent b6314164c5
commit f57f32cf3a
51 changed files with 1246 additions and 1138 deletions

View File

@ -61,7 +61,6 @@ export const AgentOperatorList = [
Operator.Categorize,
Operator.Message,
Operator.RewriteQuestion,
Operator.KeywordExtract,
Operator.Switch,
Operator.Iteration,
Operator.WaitingDialogue,
@ -79,10 +78,6 @@ export const DataOperationsOperatorOptions = [
export const SwitchElseTo = 'end_cpn_ids';
const initialQueryBaseValues = {
query: [],
};
export const initialRetrievalValues = {
query: AgentGlobalsSysQueryWithBrace,
top_n: 8,
@ -139,11 +134,6 @@ export const initialMessageValues = {
content: [''],
};
export const initialKeywordExtractValues = {
...initialLlmBaseValues,
top_n: 3,
...initialQueryBaseValues,
};
export const initialDuckValues = {
top_n: 10,
channel: Channel.Text,
@ -275,14 +265,6 @@ export const initialGithubValues = {
},
};
export const initialQWeatherValues = {
web_apikey: 'xxx',
type: 'weather',
user_type: 'free',
time_period: 'now',
...initialQueryBaseValues,
};
export const initialExeSqlValues = {
sql: '',
db_type: 'mysql',
@ -331,8 +313,6 @@ export const initialWenCaiValues = {
},
};
export const initialAkShareValues = { top_n: 10, ...initialQueryBaseValues };
export const initialYahooFinanceValues = {
stock_code: '',
info: true,
@ -349,22 +329,6 @@ export const initialYahooFinanceValues = {
},
};
export const initialJin10Values = {
type: 'flash',
secret_key: 'xxx',
flash_type: '1',
contain: '',
filter: '',
...initialQueryBaseValues,
};
export const initialTuShareValues = {
token: 'xxx',
src: 'eastmoney',
start_date: '2024-01-01 09:00:00',
...initialQueryBaseValues,
};
export const initialNoteValues = {
text: '',
};
@ -624,6 +588,13 @@ export const initialVariableAssignerValues = {};
export const initialVariableAggregatorValues = { outputs: {}, groups: [] };
export const initialLoopValues = {
loop_variables: [],
loop_termination_condition: [],
maximum_loop_count: 10,
outputs: {},
};
export const CategorizeAnchorPointPositions = [
{ top: 1, right: 34 },
{ top: 8, right: 18 },
@ -659,11 +630,6 @@ export const RestrictedUpstreamMap = {
Operator.RewriteQuestion,
Operator.Relevant,
],
[Operator.KeywordExtract]: [
Operator.Begin,
Operator.Message,
Operator.Relevant,
],
[Operator.DuckDuckGo]: [Operator.Begin, Operator.Retrieval],
[Operator.Wikipedia]: [Operator.Begin, Operator.Retrieval],
[Operator.PubMed]: [Operator.Begin, Operator.Retrieval],
@ -672,15 +638,11 @@ export const RestrictedUpstreamMap = {
[Operator.Bing]: [Operator.Begin, Operator.Retrieval],
[Operator.GoogleScholar]: [Operator.Begin, Operator.Retrieval],
[Operator.GitHub]: [Operator.Begin, Operator.Retrieval],
[Operator.QWeather]: [Operator.Begin, Operator.Retrieval],
[Operator.SearXNG]: [Operator.Begin, Operator.Retrieval],
[Operator.ExeSQL]: [Operator.Begin],
[Operator.Switch]: [Operator.Begin],
[Operator.WenCai]: [Operator.Begin],
[Operator.AkShare]: [Operator.Begin],
[Operator.YahooFinance]: [Operator.Begin],
[Operator.Jin10]: [Operator.Begin],
[Operator.TuShare]: [Operator.Begin],
[Operator.Crawler]: [Operator.Begin],
[Operator.Note]: [],
[Operator.Invoke]: [Operator.Begin],
@ -706,6 +668,9 @@ export const RestrictedUpstreamMap = {
[Operator.Tokenizer]: [Operator.Begin],
[Operator.Extractor]: [Operator.Begin],
[Operator.File]: [Operator.Begin],
[Operator.Loop]: [Operator.Begin],
[Operator.LoopStart]: [Operator.Begin],
[Operator.ExitLoop]: [Operator.Begin],
};
export const NodeMap = {
@ -715,7 +680,6 @@ export const NodeMap = {
[Operator.Message]: 'messageNode',
[Operator.Relevant]: 'relevantNode',
[Operator.RewriteQuestion]: 'rewriteNode',
[Operator.KeywordExtract]: 'keywordNode',
[Operator.DuckDuckGo]: 'ragNode',
[Operator.Wikipedia]: 'ragNode',
[Operator.PubMed]: 'ragNode',
@ -724,15 +688,11 @@ export const NodeMap = {
[Operator.Bing]: 'ragNode',
[Operator.GoogleScholar]: 'ragNode',
[Operator.GitHub]: 'ragNode',
[Operator.QWeather]: 'ragNode',
[Operator.SearXNG]: 'ragNode',
[Operator.ExeSQL]: 'ragNode',
[Operator.Switch]: 'switchNode',
[Operator.WenCai]: 'ragNode',
[Operator.AkShare]: 'ragNode',
[Operator.YahooFinance]: 'ragNode',
[Operator.Jin10]: 'ragNode',
[Operator.TuShare]: 'ragNode',
[Operator.Note]: 'noteNode',
[Operator.Crawler]: 'ragNode',
[Operator.Invoke]: 'ragNode',
@ -758,6 +718,9 @@ export const NodeMap = {
[Operator.ListOperations]: 'listOperationsNode',
[Operator.VariableAssigner]: 'variableAssignerNode',
[Operator.VariableAggregator]: 'variableAggregatorNode',
[Operator.Loop]: 'loopNode',
[Operator.LoopStart]: 'loopStartNode',
[Operator.ExitLoop]: 'exitLoopNode',
};
export enum BeginQueryType {
@ -891,3 +854,82 @@ export const ArrayFields = [
TypesWithArray.ArrayString,
TypesWithArray.ArrayObject,
];
export enum InputMode {
Constant = 'constant',
Variable = 'variable',
}
export enum LoopTerminationComparisonOperator {
Contains = ComparisonOperator.Contains,
NotContains = ComparisonOperator.NotContains,
StartWith = ComparisonOperator.StartWith,
EndWith = ComparisonOperator.EndWith,
Is = 'is',
IsNot = 'is not',
}
export const LoopTerminationStringComparisonOperator = [
LoopTerminationComparisonOperator.Contains,
LoopTerminationComparisonOperator.NotContains,
LoopTerminationComparisonOperator.StartWith,
LoopTerminationComparisonOperator.EndWith,
LoopTerminationComparisonOperator.Is,
LoopTerminationComparisonOperator.IsNot,
ComparisonOperator.Empty,
ComparisonOperator.NotEmpty,
];
export const LoopTerminationBooleanComparisonOperator = [
LoopTerminationComparisonOperator.Is,
LoopTerminationComparisonOperator.IsNot,
ComparisonOperator.Empty,
ComparisonOperator.NotEmpty,
];
// object or object array
export const LoopTerminationObjectComparisonOperator = [
ComparisonOperator.Empty,
ComparisonOperator.NotEmpty,
];
// string array or number array
export const LoopTerminationStringArrayComparisonOperator = [
LoopTerminationComparisonOperator.Contains,
LoopTerminationComparisonOperator.NotContains,
ComparisonOperator.Empty,
ComparisonOperator.NotEmpty,
];
export const LoopTerminationBooleanArrayComparisonOperator = [
LoopTerminationComparisonOperator.Is,
LoopTerminationComparisonOperator.IsNot,
ComparisonOperator.Empty,
ComparisonOperator.NotEmpty,
];
export const LoopTerminationNumberComparisonOperator = [
ComparisonOperator.Equal,
ComparisonOperator.NotEqual,
ComparisonOperator.GreatThan,
ComparisonOperator.LessThan,
ComparisonOperator.GreatEqual,
ComparisonOperator.LessEqual,
ComparisonOperator.Empty,
ComparisonOperator.NotEmpty,
];
export const LoopTerminationStringComparisonOperatorMap = {
[TypesWithArray.String]: LoopTerminationStringComparisonOperator,
[TypesWithArray.Number]: LoopTerminationNumberComparisonOperator,
[TypesWithArray.Boolean]: LoopTerminationBooleanComparisonOperator,
[TypesWithArray.Object]: LoopTerminationObjectComparisonOperator,
[TypesWithArray.ArrayString]: LoopTerminationStringArrayComparisonOperator,
[TypesWithArray.ArrayNumber]: LoopTerminationStringArrayComparisonOperator,
[TypesWithArray.ArrayBoolean]: LoopTerminationBooleanArrayComparisonOperator,
[TypesWithArray.ArrayObject]: LoopTerminationObjectComparisonOperator,
};
export enum AgentVariableType {
Begin = 'begin',
Conversation = 'conversation',
}