diff --git a/adapters/postgres/interaction_repository.go b/adapters/postgres/interaction_repository.go index 537810b..617e97f 100644 --- a/adapters/postgres/interaction_repository.go +++ b/adapters/postgres/interaction_repository.go @@ -3,6 +3,7 @@ package postgres import ( "context" + "git.cin.su/m/Assistant/contracts/identity" "git.cin.su/m/Assistant/contracts/interaction" "github.com/jackc/pgx/v5/pgxpool" ) @@ -98,3 +99,22 @@ func (r *InteractionRepository) Utterances(ctx context.Context, id interaction.C } return out, rows.Err() } + +// RecentUtterancesForPrincipal provides durable conversational context when a +// client starts a fresh conversation instead of carrying the previous ID. +func (r *InteractionRepository) RecentUtterancesForPrincipal(ctx context.Context, actorID identity.ActorID, principalID identity.PrincipalID, limit int) ([]interaction.HumanUtterance, error) { + rows, err := r.pool.Query(ctx, `SELECT utterance_id,conversation_id,actor_id,principal_id,channel,received_at_unix_millis,correlation_id,content,content_ref,speech_act,interpretation_state,corrects_utterance_id FROM interaction.utterances WHERE actor_id=$1 AND principal_id=$2 ORDER BY received_at_unix_millis DESC, utterance_id DESC LIMIT $3`, actorID, principalID, limit) + if err != nil { + return nil, err + } + defer rows.Close() + var out []interaction.HumanUtterance + for rows.Next() { + var u interaction.HumanUtterance + if err := rows.Scan(&u.ID, &u.ConversationID, &u.ActorID, &u.PrincipalID, &u.Channel, &u.ReceivedAtUnixMillis, &u.CorrelationID, &u.Content, &u.ContentRef, &u.SpeechAct, &u.InterpretationState, &u.CorrectsUtteranceID); err != nil { + return nil, err + } + out = append(out, u) + } + return out, rows.Err() +} diff --git a/cmd/core-runtime/main.go b/cmd/core-runtime/main.go index a6060fc..7951eec 100644 --- a/cmd/core-runtime/main.go +++ b/cmd/core-runtime/main.go @@ -513,6 +513,8 @@ func main() { var conversationHistory []interaction.HumanUtterance if request.ConversationID != "" { conversationHistory, _ = interactionRepository.Utterances(r.Context(), conversation.ID) + } else { + conversationHistory, _ = interactionRepository.RecentUtterancesForPrincipal(r.Context(), session.ActorID, session.PrincipalID, 64) } if request.ConversationID != "" && interactiondomain.IsRetryRequest(utterance.Content) { if len(conversationHistory) > 0 {