feat(agent): add question suggestions with after-answer follow-ups

Enable agents to configure starter prompts and async follow-up questions after completed answers, with durable caching, analytics events, and chat/embed UI integration.
This commit is contained in:
wizardchen
2026-07-14 11:06:13 +08:00
committed by lyingbug
parent a6c85dad28
commit 087fcc9fe7
50 changed files with 3781 additions and 179 deletions
+54
View File
@@ -166,6 +166,10 @@ CREATE TABLE IF NOT EXISTS messages (
is_completed BOOLEAN NOT NULL DEFAULT 0,
is_fallback BOOLEAN NOT NULL DEFAULT 0,
channel VARCHAR(50) NOT NULL DEFAULT '',
agent_id VARCHAR(36) NOT NULL DEFAULT '',
agent_tenant_id INTEGER NOT NULL DEFAULT 0,
model_id VARCHAR(64) NOT NULL DEFAULT '',
execution_context TEXT NOT NULL DEFAULT '{}',
agent_duration_ms INTEGER DEFAULT 0,
knowledge_id VARCHAR(36),
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
@@ -175,6 +179,56 @@ CREATE TABLE IF NOT EXISTS messages (
CREATE INDEX IF NOT EXISTS idx_messages_session_id ON messages(session_id);
CREATE INDEX IF NOT EXISTS idx_messages_knowledge_id ON messages(knowledge_id);
CREATE INDEX IF NOT EXISTS idx_messages_agent_id ON messages(agent_id);
CREATE TABLE IF NOT EXISTS message_suggestion_sets (
id VARCHAR(36) PRIMARY KEY,
tenant_id INTEGER NOT NULL,
session_id VARCHAR(36) NOT NULL,
assistant_message_id VARCHAR(36) NOT NULL,
agent_id VARCHAR(36) NOT NULL DEFAULT '',
agent_tenant_id INTEGER NOT NULL DEFAULT 0,
placement VARCHAR(32) NOT NULL,
config_hash VARCHAR(64) NOT NULL,
locale VARCHAR(16) NOT NULL DEFAULT '',
status VARCHAR(16) NOT NULL,
allow_regenerate BOOLEAN NOT NULL DEFAULT 0,
suppression_reason VARCHAR(64) NOT NULL DEFAULT '',
questions TEXT NOT NULL DEFAULT '[]',
model_id VARCHAR(64) NOT NULL DEFAULT '',
prompt_tokens INTEGER NOT NULL DEFAULT 0,
completion_tokens INTEGER NOT NULL DEFAULT 0,
latency_ms INTEGER NOT NULL DEFAULT 0,
error_code VARCHAR(64) NOT NULL DEFAULT '',
lease_until DATETIME,
generated_at DATETIME,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
);
CREATE UNIQUE INDEX IF NOT EXISTS idx_message_suggestion_sets_cache_key
ON message_suggestion_sets(tenant_id, assistant_message_id, placement, config_hash, locale);
CREATE INDEX IF NOT EXISTS idx_message_suggestion_sets_session
ON message_suggestion_sets(tenant_id, session_id, created_at);
CREATE INDEX IF NOT EXISTS idx_message_suggestion_sets_status
ON message_suggestion_sets(status, lease_until);
CREATE TABLE IF NOT EXISTS message_suggestion_events (
id INTEGER PRIMARY KEY AUTOINCREMENT,
tenant_id INTEGER NOT NULL,
session_id VARCHAR(36) NOT NULL,
suggestion_set_id VARCHAR(36) NOT NULL,
question_id VARCHAR(64) NOT NULL DEFAULT '',
event_type VARCHAR(32) NOT NULL,
actor_id VARCHAR(512) NOT NULL DEFAULT '',
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (suggestion_set_id) REFERENCES message_suggestion_sets(id) ON DELETE CASCADE
);
CREATE INDEX IF NOT EXISTS idx_message_suggestion_events_set
ON message_suggestion_events(suggestion_set_id, created_at);
CREATE INDEX IF NOT EXISTS idx_message_suggestion_events_session
ON message_suggestion_events(tenant_id, session_id, created_at);
CREATE INDEX IF NOT EXISTS idx_message_suggestion_events_type
ON message_suggestion_events(event_type, created_at);
CREATE TABLE IF NOT EXISTS chunks (
id VARCHAR(36) PRIMARY KEY,