This commit is contained in:
team 1
2026-05-02 19:17:59 +02:00
parent 72241c1d00
commit 0fc34f4bc0
8 changed files with 940 additions and 23 deletions

View File

@@ -80,6 +80,131 @@ final class AgentRunnerConfig
return $this->getRequiredString('follow_up_context.reference_anchor.hardness_value_pattern');
}
public function isInputNormalizationEnabled(): bool
{
return $this->getRequiredBool('input_normalization.enabled');
}
public function getInputNormalizationMaxInputChars(): int
{
return $this->getRequiredInt('input_normalization.max_input_chars');
}
public function getInputNormalizationMaxOutputChars(): int
{
return $this->getRequiredInt('input_normalization.max_output_chars');
}
public function getInputNormalizationMaxAddedTokens(): int
{
return $this->getRequiredInt('input_normalization.max_added_tokens');
}
public function getInputNormalizationMaxLengthRatioPercent(): int
{
return $this->getRequiredInt('input_normalization.max_length_ratio_percent');
}
public function getInputNormalizationHeartbeatMessage(): string
{
return $this->getRequiredString('input_normalization.heartbeat_message');
}
public function getInputNormalizationOutputPrefixPattern(): string
{
return $this->getRequiredString('input_normalization.output_prefix_pattern');
}
/**
* @return string[]
*/
public function getInputNormalizationSkipPatterns(): array
{
return $this->getRequiredStringList('input_normalization.skip_patterns');
}
public function getInputNormalizationPrompt(string $prompt): string
{
return $this->implodePromptBlocks([
$this->getInputNormalizationIntro(),
$this->buildRulesBlock($this->getInputNormalizationRules()),
$this->getInputNormalizationOutputFormatBlock(),
$this->getInputNormalizationCurrentUserInputLabel() . ':',
trim($prompt),
]);
}
/**
* @return string[]
*/
public function getInputNormalizationRules(): array
{
return $this->getRequiredStringList('input_normalization.prompt.rules');
}
public function getInputNormalizationIntro(): string
{
return $this->getRequiredString('input_normalization.prompt.intro');
}
public function getInputNormalizationOutputFormatBlock(): string
{
return $this->getRequiredString('input_normalization.prompt.output_format_block');
}
public function getInputNormalizationCurrentUserInputLabel(): string
{
return $this->getRequiredString('input_normalization.prompt.current_user_input_label');
}
public function isInputNormalizationFuzzyRoutingEnabled(): bool
{
return $this->getRequiredBool('input_normalization.fuzzy_routing.enabled');
}
public function getInputNormalizationFuzzyRoutingMinTokenLength(): int
{
return $this->getRequiredInt('input_normalization.fuzzy_routing.min_token_length');
}
public function getInputNormalizationFuzzyRoutingMediumTokenLength(): int
{
return $this->getRequiredInt('input_normalization.fuzzy_routing.medium_token_length');
}
public function getInputNormalizationFuzzyRoutingLongTokenLength(): int
{
return $this->getRequiredInt('input_normalization.fuzzy_routing.long_token_length');
}
public function getInputNormalizationFuzzyRoutingMaxDistanceShort(): int
{
return $this->getRequiredInt('input_normalization.fuzzy_routing.max_distance_short');
}
public function getInputNormalizationFuzzyRoutingMaxDistanceMedium(): int
{
return $this->getRequiredInt('input_normalization.fuzzy_routing.max_distance_medium');
}
public function getInputNormalizationFuzzyRoutingMaxDistanceLong(): int
{
return $this->getRequiredInt('input_normalization.fuzzy_routing.max_distance_long');
}
public function getInputNormalizationFuzzyRoutingMinSimilarityPercent(): int
{
return $this->getRequiredInt('input_normalization.fuzzy_routing.min_similarity_percent');
}
/**
* @return string[]
*/
public function getInputNormalizationFuzzyRoutingTerms(): array
{
return $this->getRequiredStringList('input_normalization.fuzzy_routing.terms');
}
private function getRequiredInt(string $key): int
{
$value = $this->requiredValue($key);

View File

@@ -441,6 +441,33 @@ final readonly class RetriexEffectiveConfigProvider
'product_search_knowledge_chunk_limit' => $this->agentRunnerConfig->getProductSearchKnowledgeChunkLimit(),
'advisory_product_search_knowledge_chunk_limit' => $this->agentRunnerConfig->getAdvisoryProductSearchKnowledgeChunkLimit(),
'optimized_shop_query_prefix_pattern' => $this->agentRunnerConfig->getOptimizedShopQueryPrefixPattern(),
'input_normalization' => [
'enabled' => $this->agentRunnerConfig->isInputNormalizationEnabled(),
'max_input_chars' => $this->agentRunnerConfig->getInputNormalizationMaxInputChars(),
'max_output_chars' => $this->agentRunnerConfig->getInputNormalizationMaxOutputChars(),
'max_added_tokens' => $this->agentRunnerConfig->getInputNormalizationMaxAddedTokens(),
'max_length_ratio_percent' => $this->agentRunnerConfig->getInputNormalizationMaxLengthRatioPercent(),
'heartbeat_message' => $this->agentRunnerConfig->getInputNormalizationHeartbeatMessage(),
'output_prefix_pattern' => $this->agentRunnerConfig->getInputNormalizationOutputPrefixPattern(),
'skip_patterns' => $this->agentRunnerConfig->getInputNormalizationSkipPatterns(),
'prompt' => [
'intro' => $this->agentRunnerConfig->getInputNormalizationIntro(),
'rules' => $this->agentRunnerConfig->getInputNormalizationRules(),
'output_format_block' => $this->agentRunnerConfig->getInputNormalizationOutputFormatBlock(),
'current_user_input_label' => $this->agentRunnerConfig->getInputNormalizationCurrentUserInputLabel(),
],
'fuzzy_routing' => [
'enabled' => $this->agentRunnerConfig->isInputNormalizationFuzzyRoutingEnabled(),
'min_token_length' => $this->agentRunnerConfig->getInputNormalizationFuzzyRoutingMinTokenLength(),
'medium_token_length' => $this->agentRunnerConfig->getInputNormalizationFuzzyRoutingMediumTokenLength(),
'long_token_length' => $this->agentRunnerConfig->getInputNormalizationFuzzyRoutingLongTokenLength(),
'max_distance_short' => $this->agentRunnerConfig->getInputNormalizationFuzzyRoutingMaxDistanceShort(),
'max_distance_medium' => $this->agentRunnerConfig->getInputNormalizationFuzzyRoutingMaxDistanceMedium(),
'max_distance_long' => $this->agentRunnerConfig->getInputNormalizationFuzzyRoutingMaxDistanceLong(),
'min_similarity_percent' => $this->agentRunnerConfig->getInputNormalizationFuzzyRoutingMinSimilarityPercent(),
'terms' => $this->agentRunnerConfig->getInputNormalizationFuzzyRoutingTerms(),
],
],
'messages' => [
'empty_prompt' => $this->agentRunnerConfig->getEmptyPromptMessage(),
'analyze_request' => $this->agentRunnerConfig->getAnalyzeRequestMessage(),
@@ -1027,6 +1054,58 @@ final readonly class RetriexEffectiveConfigProvider
$this->validateStringListMap($agent['shop_query_optimizer'] ?? [], 'agent.shop_query_optimizer', $errors, $warnings);
$this->validateRegexPattern($agent['optimized_shop_query_prefix_pattern'] ?? null, 'agent.optimized_shop_query_prefix_pattern', $errors);
$normalization = is_array($agent['input_normalization'] ?? null) ? $agent['input_normalization'] : [];
$normalizationPrompt = is_array($normalization['prompt'] ?? null) ? $normalization['prompt'] : [];
if (($this->asInt($normalization['max_input_chars'] ?? null) ?? 0) < 1) {
$errors[] = 'agent.input_normalization.max_input_chars must be greater than 0.';
}
if (($this->asInt($normalization['max_output_chars'] ?? null) ?? 0) < 1) {
$errors[] = 'agent.input_normalization.max_output_chars must be greater than 0.';
}
if (($this->asInt($normalization['max_added_tokens'] ?? null) ?? -1) < 0) {
$errors[] = 'agent.input_normalization.max_added_tokens must be greater than or equal to 0.';
}
if (($this->asInt($normalization['max_length_ratio_percent'] ?? null) ?? 0) < 100) {
$errors[] = 'agent.input_normalization.max_length_ratio_percent must be at least 100.';
}
$this->validateRegexPattern($normalization['output_prefix_pattern'] ?? null, 'agent.input_normalization.output_prefix_pattern', $errors);
$this->validateRegexPatternList($normalization['skip_patterns'] ?? [], 'agent.input_normalization.skip_patterns', $errors);
$this->validateStringList($this->toList($normalizationPrompt['rules'] ?? []), 'agent.input_normalization.prompt.rules', $errors, $warnings);
$fuzzyRouting = is_array($normalization['fuzzy_routing'] ?? null) ? $normalization['fuzzy_routing'] : [];
if (($this->asInt($fuzzyRouting['min_token_length'] ?? null) ?? 0) < 1) {
$errors[] = 'agent.input_normalization.fuzzy_routing.min_token_length must be greater than 0.';
}
if (($this->asInt($fuzzyRouting['medium_token_length'] ?? null) ?? 0) < 1) {
$errors[] = 'agent.input_normalization.fuzzy_routing.medium_token_length must be greater than 0.';
}
if (($this->asInt($fuzzyRouting['long_token_length'] ?? null) ?? 0) < 1) {
$errors[] = 'agent.input_normalization.fuzzy_routing.long_token_length must be greater than 0.';
}
if (($this->asInt($fuzzyRouting['max_distance_short'] ?? null) ?? -1) < 0) {
$errors[] = 'agent.input_normalization.fuzzy_routing.max_distance_short must be greater than or equal to 0.';
}
if (($this->asInt($fuzzyRouting['max_distance_medium'] ?? null) ?? -1) < 0) {
$errors[] = 'agent.input_normalization.fuzzy_routing.max_distance_medium must be greater than or equal to 0.';
}
if (($this->asInt($fuzzyRouting['max_distance_long'] ?? null) ?? -1) < 0) {
$errors[] = 'agent.input_normalization.fuzzy_routing.max_distance_long must be greater than or equal to 0.';
}
$minSimilarityPercent = $this->asInt($fuzzyRouting['min_similarity_percent'] ?? null) ?? 0;
if ($minSimilarityPercent < 1 || $minSimilarityPercent > 100) {
$errors[] = 'agent.input_normalization.fuzzy_routing.min_similarity_percent must be between 1 and 100.';
}
$this->validateStringList($this->toList($fuzzyRouting['terms'] ?? []), 'agent.input_normalization.fuzzy_routing.terms', $errors, $warnings);
if (trim((string) ($normalizationPrompt['intro'] ?? '')) === '') {
$errors[] = 'agent.input_normalization.prompt.intro must not be empty.';
}
if (trim((string) ($normalizationPrompt['output_format_block'] ?? '')) === '') {
$errors[] = 'agent.input_normalization.prompt.output_format_block must not be empty.';
}
if (trim((string) ($normalizationPrompt['current_user_input_label'] ?? '')) === '') {
$errors[] = 'agent.input_normalization.prompt.current_user_input_label must not be empty.';
}
$anchorEnrichment = $agent['shop_query_optimizer']['context_anchor_enrichment'] ?? [];
if (is_array($anchorEnrichment)) {
$this->validateStringList($this->toList($anchorEnrichment['trigger_terms'] ?? []), 'agent.shop_query_optimizer.context_anchor_enrichment.trigger_terms', $errors, $warnings);