feat(search): add semantic similar session matching via Voyage AI embeddings

Adds vector-based similar session discovery using the existing Voyage AI
embedding infrastructure and pgvector cosine similarity search.

- New AISessionEmbedding model with vector(1024) column
- session_embedding_service: generate + upsert embeddings, find similar sessions
- Embeddings generated on session create (from problem_summary/domain) and
  updated on resolve (adds resolution_summary)
- GET /ai-sessions/{id}/similar endpoint returns top-N similar sessions
- Migration a7c9e3b1f402 creates ai_session_embeddings table

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-03-20 03:48:09 +00:00
parent ce68fa84ca
commit e356103408
6 changed files with 343 additions and 0 deletions

View File

@@ -331,6 +331,13 @@ async def start_session(
await db.flush()
# Generate session embedding for similar-session matching (fire-and-forget)
try:
from app.services.session_embedding_service import generate_session_embedding
await generate_session_embedding(session.id, db)
except Exception:
logger.warning("Failed to generate session embedding on create", exc_info=True)
return AISessionCreateResponse(
session_id=session.id,
status=session.status,
@@ -492,6 +499,13 @@ async def resolve_session(
await db.flush()
# Update session embedding with resolution data for similar-session matching
try:
from app.services.session_embedding_service import generate_session_embedding
await generate_session_embedding(session.id, db)
except Exception:
logger.warning("Failed to update session embedding on resolve", exc_info=True)
# Push documentation to PSA if ticket is linked
psa_result = await _push_to_psa(session, user_id, db)