feat: one-shot audio entity extraction y pre-fill de formularios
- AiBot: NLU ahora extrae entities (finca, valor, etc.) del audio - BotRouter: guarda __nlu_entities en metadata antes de enrutar - NormalBot: handleCollectAndPost pre-rellena campos desde entities y capAskNext salta los ya completados - NormalBot: handleCollectForEach registra ítem directo si entities trae finca+valor coincidente, sin iterar todo el listado - BotRouter: mid-flow audio va a NormalBot directamente (no NLU) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 4.6
parent
d0c1b1d3be
commit
54a93adea9
+11
-4
@@ -174,11 +174,18 @@ class BotRouter
|
||||
$result = AiBot::routeOrChat($company, $context, $input);
|
||||
|
||||
if ($result['action'] === 'route') {
|
||||
$key = $result['key'];
|
||||
$botCtx = ConversationContext::getOrCreate((int)$company['id'], $context['from'], 'normal');
|
||||
ConversationContext::updateNode((int)$botCtx['id'], $key);
|
||||
$key = $result['key'];
|
||||
$botCtx = ConversationContext::getOrCreate((int)$company['id'], $context['from'], 'normal');
|
||||
$ctxId = (int)$botCtx['id'];
|
||||
$entities = $result['entities'] ?? [];
|
||||
if (!empty($entities)) {
|
||||
$m = ConversationContext::getMetadata($ctxId);
|
||||
$m['__nlu_entities'] = $entities;
|
||||
ConversationContext::updateMetadata($ctxId, $m);
|
||||
self::log("NLU: entities extraídas → " . json_encode($entities));
|
||||
}
|
||||
ConversationContext::updateNode($ctxId, $key);
|
||||
self::log("NLU: {$context['from']} → flow [{$key}]");
|
||||
// Ejecutar con input vacío — NormalBot retoma current_node
|
||||
return NormalBot::process($company, $context, '');
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user