From 0f8fc7f21cfa50ccb23aa05a1269a8fc2ecaae08 Mon Sep 17 00:00:00 2001 From: Benjamin McCormick Date: Thu, 30 Oct 2025 14:57:25 -0400 Subject: [PATCH 01/13] chore: remove old unuseful code --- src/crud/representation.py | 108 +---------------------- tests/deriver/conftest.py | 1 - tests/deriver/test_deriver_processing.py | 1 - 3 files changed, 3 insertions(+), 107 deletions(-) diff --git a/src/crud/representation.py b/src/crud/representation.py index 09eaeae7..93fc6744 100644 --- a/src/crud/representation.py +++ b/src/crud/representation.py @@ -176,41 +176,6 @@ class RepresentationManager: return new_documents - async def get_relevant_observations( - self, - query: str, - *, - top_k: int = 5, - max_distance: float = 0.3, - level: str | None = None, - conversation_context: str = "", - ) -> Representation: - """ - Unified method to get relevant observations with flexible options. - - Args: - query: The search query - top_k: Number of results to return - max_distance: Maximum distance for semantic similarity - level: Optional reasoning level to filter by - conversation_context: Additional conversation context - - Returns: - Representation - """ - async with tracked_db("representation_manager.get_relevant_observations") as db: - documents = await self._get_observations_internal( - db, - query, - top_k, - max_distance, - level, - conversation_context, - ) - - # convert documents to representation - return Representation.from_documents(documents) - async def get_working_representation( self, *, @@ -331,7 +296,6 @@ class RepresentationManager: top_k: int, max_distance: float | None = None, level: str | None = None, - conversation_context: str = "", ) -> list[models.Document]: """Query documents by semantic similarity.""" try: @@ -340,7 +304,6 @@ class RepresentationManager: db, query, level, - conversation_context, top_k, max_distance, ) @@ -350,7 +313,7 @@ class RepresentationManager: workspace_name=self.workspace_name, observer=self.observer, observed=self.observed, - query=self._build_truncated_query(query, conversation_context), + query=query, max_distance=max_distance, top_k=top_k, ) @@ -413,11 +376,10 @@ class RepresentationManager: top_k: int, max_distance: float, level: str | None, - conversation_context: str, ) -> list[models.Document]: """Internal method that does the actual observation retrieval.""" return await self._query_documents_semantic( - db, query, top_k, max_distance, level, conversation_context + db, query, top_k, max_distance, level ) async def _query_documents_for_level( @@ -425,7 +387,6 @@ class RepresentationManager: db: AsyncSession, query: str, level: str, - conversation_context: str, count: int, max_distance: float | None = None, ) -> list[models.Document]: @@ -435,7 +396,7 @@ class RepresentationManager: workspace_name=self.workspace_name, observer=self.observer, observed=self.observed, - query=self._build_truncated_query(query, conversation_context), + query=query, max_distance=max_distance, top_k=count * FILTER_OVERSAMPLING_FACTOR, filters=self._build_filter_conditions(level), @@ -462,69 +423,6 @@ class RepresentationManager: return conditions[0] if len(conditions) == 1 else {"AND": conditions} - def _build_truncated_query( - self, - query: str, - conversation_context: str = "", - max_tokens: int | None = None, - ) -> str: - """Build a query that fits within token limits with clear priorities. - - Args: - query: The search query - conversation_context: Optional conversation context to include - max_tokens: Maximum tokens allowed (defaults to setting with buffer) - - Returns: - Truncated query string that fits within token limits - """ - max_tokens = max_tokens or (settings.MAX_EMBEDDING_TOKENS - 100) - encoding = embedding_client.encoding - - # Pre-calculate all token counts once - query_prefix = "Current message: " - context_prefix = "\nContext: " - - prefix_tokens = len(encoding.encode(query_prefix)) - context_prefix_tokens = len(encoding.encode(context_prefix)) - query_tokens = encoding.encode(query) - - # Simple case: query alone fits - if prefix_tokens + len(query_tokens) <= max_tokens: - if not conversation_context: - return f"{query_prefix}{query}" - - # Try to add context - context_tokens = encoding.encode(conversation_context) - total_without_context = ( - prefix_tokens + len(query_tokens) + context_prefix_tokens - ) - - if total_without_context + len(context_tokens) <= max_tokens: - return f"{query_prefix}{query}{context_prefix}{conversation_context}" - - # Truncate context to fit - available_context_tokens = max_tokens - total_without_context - if available_context_tokens > 0: - truncated_context = encoding.decode( - context_tokens[-available_context_tokens:] - ) - return f"{query_prefix}{query}{context_prefix}{truncated_context}" - else: - # No room left for context; keep full query intact - return f"{query_prefix}{query}" - - # Query itself is too long - truncate it - available_query_tokens = max_tokens - prefix_tokens - if available_query_tokens > 0: - # Keep the end (recency) of the query - truncated_query = encoding.decode(query_tokens[-available_query_tokens:]) - return f"{query_prefix}{truncated_query}" - - # Pathological case - just return what we can - logger.warning("Token limit too restrictive: %s", max_tokens) - return encoding.decode(query_tokens[:max_tokens]) - # Module-level functions for backward compatibility and convenience diff --git a/tests/deriver/conftest.py b/tests/deriver/conftest.py index 89410656..479ba516 100644 --- a/tests/deriver/conftest.py +++ b/tests/deriver/conftest.py @@ -294,6 +294,5 @@ def mock_representation_manager(monkeypatch: pytest.MonkeyPatch) -> AsyncMock: mock_manager = AsyncMock(spec=RepresentationManager) mock_manager.save_representation.return_value = 0 - mock_manager.get_relevant_observations = AsyncMock(return_value=MagicMock()) return mock_manager diff --git a/tests/deriver/test_deriver_processing.py b/tests/deriver/test_deriver_processing.py index 002377df..9cc23bdc 100644 --- a/tests/deriver/test_deriver_processing.py +++ b/tests/deriver/test_deriver_processing.py @@ -100,7 +100,6 @@ class TestDeriverProcessing: await mock_representation_manager.save_representation( Representation(explicit=[], deductive=[]) ) - mock_representation_manager.get_relevant_observations.return_value = [] # type: ignore[attr-defined] # Verify the methods were called assert mock_representation_manager.save_representation.called # type: ignore[attr-defined] From ca4a70f6fb244077dba8caee652b7ba73c5d7b65 Mon Sep 17 00:00:00 2001 From: Benjamin McCormick Date: Thu, 30 Oct 2025 16:12:48 -0400 Subject: [PATCH 02/13] fix: [critical] update prompt to fix wording around deriving from multiple turns and remove bars feat: add DEDUPLICATE config flag, when true, uses cosine+token similarly in tandem to dedup --- .env.template | 1 + config.toml.example | 1 + src/config.py | 3 ++ src/crud/document.py | 78 +++++++++++++++++++++++++++++++++++++- src/crud/representation.py | 3 +- src/deriver/prompts.py | 6 +-- 6 files changed, 86 insertions(+), 6 deletions(-) diff --git a/.env.template b/.env.template index a91ede16..9e90ade3 100644 --- a/.env.template +++ b/.env.template @@ -83,6 +83,7 @@ LLM_ANTHROPIC_API_KEY=your-anthropic-api-key-here # DERIVER_STALE_SESSION_TIMEOUT_MINUTES=5 # DERIVER_PROVIDER=google # DERIVER_MODEL=gemini-2.0-flash-lite +# DERIVER_DEDUPLICATE=true # DERIVER_MAX_OUTPUT_TOKENS=2500 # only applied when using Anthropic as provider # DERIVER_THINKING_BUDGET_TOKENS=1024 diff --git a/config.toml.example b/config.toml.example index 50f618ba..bc514eb6 100644 --- a/config.toml.example +++ b/config.toml.example @@ -64,6 +64,7 @@ POLLING_SLEEP_INTERVAL_SECONDS = 1.0 STALE_SESSION_TIMEOUT_MINUTES = 5 PROVIDER = "google" MODEL = "gemini-2.0-flash-lite" +DEDUPLICATE = true MAX_OUTPUT_TOKENS = 2500 THINKING_BUDGET_TOKENS = 1024 # only applied when using Anthropic diff --git a/src/config.py b/src/config.py index 6458717e..c9670508 100644 --- a/src/config.py +++ b/src/config.py @@ -199,6 +199,9 @@ class DeriverSettings(HonchoSettings): PROVIDER: SupportedProviders = "google" MODEL: str = "gemini-2.5-flash-lite" + # Whether to deduplicate documents when creating them + DEDUPLICATE: bool = True + MAX_OUTPUT_TOKENS: Annotated[int, Field(default=10_000, gt=0, le=100_000)] = 10_000 # Thinking budget tokens are only applied when using Anthropic as provider THINKING_BUDGET_TOKENS: Annotated[int, Field(default=1024, gt=0, le=5000)] = 1024 diff --git a/src/crud/document.py b/src/crud/document.py index 127b5d7b..272f3ab3 100644 --- a/src/crud/document.py +++ b/src/crud/document.py @@ -103,9 +103,10 @@ async def create_documents( *, observer: str, observed: str, + deduplicate: bool = False, ) -> int: """ - Create multiple documents with NO duplicate detection. + Create multiple documents with optional duplicate detection. Args: db: Database session @@ -120,6 +121,16 @@ async def create_documents( honcho_documents: list[models.Document] = [] for doc in documents: try: + # for each document, if deduplicate is True, perform a process + # that checks against existing documents and either rejects this document + # as a duplicate OR deletes an existing document that is a duplicate. + if deduplicate: + is_duplicate = await is_rejected_duplicate( + db, doc, workspace_name, observer=observer, observed=observed + ) + if is_duplicate: + continue + metadata_dict = doc.metadata.model_dump(exclude_none=True) honcho_documents.append( models.Document( @@ -147,3 +158,68 @@ async def create_documents( ) from e return len(honcho_documents) + + +async def is_rejected_duplicate( + db: AsyncSession, + doc: schemas.DocumentCreate, + workspace_name: str, + *, + observer: str, + observed: str, +) -> bool: + """ + Check if a document is a duplicate of an existing document. + + Uses: 1) Cosine similarity (>=0.95), 2) Token diff for retention. + + Returns True if both: + - the document is deemed a duplicate of an existing document + - the existing document is deemed a superior duplicate + + If the document is not a duplicate, returns False. + + If the document is a duplicate AND the new document is superior, + deletes the existing document and returns False. + """ + # Step 1: Find potential duplicates using cosine similarity + similar_docs = await query_documents( + db=db, + workspace_name=workspace_name, + query=doc.content, + observer=observer, + observed=observed, + max_distance=0.05, + top_k=1, + embedding=doc.embedding, + ) + + if not similar_docs: + return False + + existing_doc = similar_docs[0] + + # Step 2: Determine which has more information using token set difference + tokens_new = set(embedding_client.encoding.encode(doc.content)) + tokens_existing = set(embedding_client.encoding.encode(existing_doc.content)) + + unique_new = len(tokens_new - tokens_existing) + unique_existing = len(tokens_existing - tokens_new) + + score_new = len(tokens_new) + (unique_new * 10) + score_existing = len(tokens_existing) + (unique_existing * 10) + + # If new document has more or equal information, keep it and delete existing + if score_new >= score_existing: + logger.warning( + f"[DUPLICATE DETECTION] Deleting existing in favor of new. new='{doc.content}', existing='{existing_doc.content}'." + ) + await db.delete(existing_doc) + await db.flush() # Flush to make deletion visible in this transaction + return False # Don't reject the new document + + # Existing document has more information, reject the new one + logger.warning( + f"[DUPLICATE DETECTION] Rejecting new in favor of existing. new='{doc.content}', existing='{existing_doc.content}'." + ) + return True diff --git a/src/crud/representation.py b/src/crud/representation.py index 93fc6744..790912f1 100644 --- a/src/crud/representation.py +++ b/src/crud/representation.py @@ -160,13 +160,14 @@ class RepresentationManager: ) ) - # Use bulk creation with NO duplicate detection + # Use bulk creation with optional duplicate detection new_documents = await crud.create_documents( db, documents_to_create, self.workspace_name, observer=self.observer, observed=self.observed, + deduplicate=settings.DERIVER.DEDUPLICATE, ) try: diff --git a/src/deriver/prompts.py b/src/deriver/prompts.py index 2ef199eb..4a414f88 100644 --- a/src/deriver/prompts.py +++ b/src/deriver/prompts.py @@ -65,11 +65,9 @@ Current understanding of {peer_id}: You are an agent who critically analyzes messages from {peer_id} through rigorous logical reasoning to produce only conclusions about them that are CERTAIN. TARGET USER TO ANALYZE -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ You are analyzing: {peer_id} The conversation may include messages from multiple participants, but you MUST focus ONLY on deriving conclusions about {peer_id}. Only use other participants' messages as context for understanding {peer_id}. -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ IMPORTANT NAMING RULES • When you write a conclusion about {peer_id}, always start the sentence with their name (e.g. "Anthony is 25 years old"). @@ -87,7 +85,7 @@ Here are strict definitions for the reasoning modes you are to employ: - Current date and time (which is: {message_created_at}) - Timestamps from conversation history - Follow strict literal necessity--if stated directly in message, extract a conclusion - - Latest message MUST be a premise, previous messages and timestamps may be used to contextualize + - New turn MUST be a premise, previous messages and timestamps may be used to contextualize - Transforms a single message (premise) into ONE OR MULTIPLE conclusions - Derive EVERYTHING that can be explicitly concluded - Make sure EVERY conclusion is sufficiently contextualized, i.e. ensure each conclusion contains enough specific information about subjects and objects to make it self-contained and useful (e.g. instead of "Ann is nervous about the interview", use "Ann is nervous about the job interview at the pharmacy") @@ -128,7 +126,7 @@ Based on our definitions and examples, here's a summary of the logical reasoning - Explicit/Deductive/Temporal/General → Further Deductive: Can use certain conclusions and known facts to deduce additional certain conclusions - Probabilistic Deductive ↛ Further Deductive: If a deductive conclusion includes probabilistic qualifiers (likely, potentially, typically, might, etc) it may NOT be used as a premise for further deductions -**INSTRUCTIONS:** Given the above, first think critically about what it means to do explicit and deductive reasoning, then consider how to apply that to the latest message, finally do explicit and deductive reasoning about the user to reach useful, contextually-rich conclusions. +**INSTRUCTIONS:** Given the above, first think critically about what it means to do explicit and deductive reasoning, then consider how to apply that to all new turns, finally do explicit and deductive reasoning about the user to reach useful, contextually-rich conclusions. You must extract observations from all new turns. {peer_card_section} From 9bdd8741a514c52da02a15ca524a933e0aa517d7 Mon Sep 17 00:00:00 2001 From: Benjamin McCormick Date: Thu, 30 Oct 2025 16:52:23 -0400 Subject: [PATCH 03/13] feat: add --test-count arg to longmem.py --- tests/bench/longmem.py | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/tests/bench/longmem.py b/tests/bench/longmem.py index 6557ad74..c7182be2 100644 --- a/tests/bench/longmem.py +++ b/tests/bench/longmem.py @@ -870,7 +870,7 @@ Evaluate whether the actual response correctly answers the question based on the return results async def run_all_questions( - self, test_file: Path, batch_size: int = 10 + self, test_file: Path, batch_size: int = 10, test_count: int | None = None ) -> tuple[list[TestResult], float]: """ Run all questions in a longmemeval test file. @@ -878,11 +878,20 @@ Evaluate whether the actual response correctly answers the question based on the Args: test_file: Path to the longmemeval JSON file batch_size: Number of questions to run concurrently in each batch + test_count: Optional number of tests to run (runs first N tests) Returns: Tuple of (list of test results, total duration) """ questions = self.load_test_file(test_file) + + # Limit to first N questions if test_count is specified + if test_count is not None and test_count > 0: + questions = questions[:test_count] + print( + f"limiting to first {len(questions)} {'question' if len(questions) == 1 else 'questions'} from {test_file}" + ) + print( f"found {len(questions)} {'question' if len(questions) == 1 else 'questions'} in {test_file}" ) @@ -1140,6 +1149,7 @@ Examples: %(prog)s --test-file tests/bench/longmemeval_data/longmemeval_s.json # Run longmemeval tests %(prog)s --test-file test.json --pool-size 4 # Use 4 Honcho instances %(prog)s --test-file test.json --base-api-port 8000 --pool-size 4 # Custom base port with pool + %(prog)s --test-file test.json --test-count 50 # Run only first 50 tests """, ) @@ -1208,6 +1218,12 @@ Examples: help="Use get_context + judge LLM instead of dialectic .chat endpoint (default: False)", ) + parser.add_argument( + "--test-count", + type=int, + help="Number of tests to run from the test file (default: all tests)", + ) + args = parser.parse_args() # Validate arguments @@ -1223,6 +1239,10 @@ Examples: print(f"Error: Pool size must be positive, got {args.pool_size}") return 1 + if args.test_count is not None and args.test_count <= 0: + print(f"Error: Test count must be positive, got {args.test_count}") + return 1 + # Create test runner runner = LongMemEvalRunner( base_api_port=args.base_api_port, @@ -1237,7 +1257,7 @@ Examples: try: # Run all questions results, total_elapsed = await runner.run_all_questions( - args.test_file, args.batch_size + args.test_file, args.batch_size, args.test_count ) runner.print_summary(results, total_elapsed_seconds=total_elapsed) From 342d72184aae72e67ab0f8a0c4b5eac77eaf31e2 Mon Sep 17 00:00:00 2001 From: doria <93405247+dr-frmr@users.noreply.github.com> Date: Mon, 3 Nov 2025 11:25:29 -0500 Subject: [PATCH 04/13] feat: rework langfuse setup to work more cleanly; fix bug in dream scheduling (#253) --- src/crud/representation.py | 3 +- src/deriver/consumer.py | 75 ++++++---------------------------- src/deriver/deriver.py | 16 ++------ src/deriver/enqueue.py | 2 +- src/dialectic/chat.py | 14 +------ src/dreamer/dream_scheduler.py | 13 +++--- src/dreamer/dreamer.py | 2 + src/utils/clients.py | 24 ++--------- src/utils/langfuse_client.py | 40 ------------------ src/utils/logging.py | 50 +++++++++++++++++++---- src/utils/summarizer.py | 4 +- tests/utils/test_clients.py | 19 --------- 12 files changed, 77 insertions(+), 185 deletions(-) delete mode 100644 src/utils/langfuse_client.py diff --git a/src/crud/representation.py b/src/crud/representation.py index 09eaeae7..13aefce7 100644 --- a/src/crud/representation.py +++ b/src/crud/representation.py @@ -14,7 +14,7 @@ from src.dependencies import tracked_db from src.dreamer.dream_scheduler import check_and_schedule_dream from src.embedding_client import embedding_client from src.utils.formatting import format_datetime_utc -from src.utils.logging import accumulate_metric, conditional_observe +from src.utils.logging import accumulate_metric from src.utils.representation import ( DeductiveObservation, ExplicitObservation, @@ -41,7 +41,6 @@ class RepresentationManager: self.observer: str = observer self.observed: str = observed - @conditional_observe async def save_representation( self, representation: Representation, diff --git a/src/deriver/consumer.py b/src/deriver/consumer.py index 20e0b1b0..6cafc0fc 100644 --- a/src/deriver/consumer.py +++ b/src/deriver/consumer.py @@ -7,13 +7,11 @@ from rich.console import Console from sqlalchemy import select from src import models -from src.config import settings from src.dependencies import tracked_db from src.deriver.deriver import process_representation_tasks_batch from src.dreamer.dreamer import process_dream from src.models import Message from src.utils import summarizer -from src.utils.langfuse_client import get_langfuse_client from src.utils.logging import log_performance_metrics from src.utils.queue_payload import ( DreamPayload, @@ -27,8 +25,6 @@ logging.getLogger("sqlalchemy.engine.Engine").disabled = True console = Console(markup=True) -lf = get_langfuse_client() if settings.LANGFUSE_PUBLIC_KEY else None - async def process_item(task_type: str, queue_payload: dict[str, Any]) -> None: """Process a single item from the queue.""" @@ -80,39 +76,16 @@ async def process_item(task_type: str, queue_payload: dict[str, Any]) -> None: message_public_id = message.public_id with sentry_sdk.start_transaction(name="process_summary_task", op="deriver"): - if lf: - with lf.start_as_current_span( - name="summary_processing", - input={ - "workspace_name": validated.workspace_name, - "session_name": validated.session_name, - "message_id": validated.message_id, - }, - metadata={ - "summary_model": settings.SUMMARY.MODEL, - }, - ): - await summarizer.summarize_if_needed( - validated.workspace_name, - validated.session_name, - validated.message_id, - validated.message_seq_in_session, - message_public_id, - ) - log_performance_metrics( - "summary", f"{validated.workspace_name}_{validated.message_id}" - ) - else: - await summarizer.summarize_if_needed( - validated.workspace_name, - validated.session_name, - validated.message_id, - validated.message_seq_in_session, - message_public_id, - ) - log_performance_metrics( - "summary", f"{validated.workspace_name}_{validated.message_id}" - ) + await summarizer.summarize_if_needed( + validated.workspace_name, + validated.session_name, + validated.message_id, + validated.message_seq_in_session, + message_public_id, + ) + log_performance_metrics( + "summary", f"{validated.workspace_name}_{validated.message_id}" + ) elif task_type == "dream": with sentry_sdk.start_transaction(name="process_dream_task", op="deriver"): @@ -162,28 +135,6 @@ async def process_representation_batch( len(messages), ) - if lf: - with lf.start_as_current_span( - name="representation_processing", - input={ - "payloads": [ - { - "message_id": msg.id, - "observer": observer, - "observed": observed, - "session_name": msg.session_name, - } - for msg in messages - ] - }, - metadata={ - "critical_analysis_model": settings.DERIVER.MODEL, - }, - ): - await process_representation_tasks_batch( - messages, observer=observer, observed=observed - ) - else: - await process_representation_tasks_batch( - messages, observer=observer, observed=observed - ) + await process_representation_tasks_batch( + messages, observer=observer, observed=observed + ) diff --git a/src/deriver/deriver.py b/src/deriver/deriver.py index 15900e86..5990a29b 100644 --- a/src/deriver/deriver.py +++ b/src/deriver/deriver.py @@ -12,7 +12,6 @@ from src.models import Message from src.utils import summarizer from src.utils.clients import honcho_llm_call from src.utils.formatting import format_new_turn_with_timestamp -from src.utils.langfuse_client import get_langfuse_client from src.utils.logging import ( accumulate_metric, conditional_observe, @@ -33,9 +32,8 @@ from .prompts import ( logger = logging.getLogger(__name__) logging.getLogger("sqlalchemy.engine.Engine").disabled = True -lf = get_langfuse_client() if settings.LANGFUSE_PUBLIC_KEY else None - +@conditional_observe(name="Critical Analysis Call") async def critical_analysis_call( peer_id: str, peer_card: list[str] | None, @@ -78,6 +76,7 @@ async def critical_analysis_call( return response.content +@conditional_observe(name="Peer Card Call") async def peer_card_call( old_peer_card: list[str] | None, new_observations: Representation, @@ -281,9 +280,6 @@ async def process_representation_tasks_batch( log_performance_metrics("deriver", f"{latest_message.id}_{observer}") - if lf: - lf.update_current_trace(output=final_observations.format_as_markdown()) - class CertaintyReasoner: """Certainty reasoner for analyzing and deriving insights.""" @@ -308,7 +304,7 @@ class CertaintyReasoner: self.observer = observer self.estimated_input_tokens: int = estimated_input_tokens - @conditional_observe + @conditional_observe(name="Deriver") @sentry_sdk.trace async def reason( self, @@ -364,11 +360,6 @@ class CertaintyReasoner: latest_message.created_at, ) - if lf: - lf.update_current_generation( - output=reasoning_response.format_as_markdown(), - ) - analysis_duration_ms = (time.perf_counter() - analysis_start) * 1000 accumulate_metric( f"deriver_{latest_message.id}_{self.observer}", @@ -413,7 +404,6 @@ class CertaintyReasoner: return reasoning_response - @conditional_observe @sentry_sdk.trace async def _update_peer_card( self, diff --git a/src/deriver/enqueue.py b/src/deriver/enqueue.py index 9405f6fa..9731b91c 100644 --- a/src/deriver/enqueue.py +++ b/src/deriver/enqueue.py @@ -32,7 +32,7 @@ async def enqueue(payload: list[dict[str, Any]]) -> None: # Generate work unit keys for dreams that might be affected by this message dream_keys: list[str] = get_affected_dream_keys(message) for dream_key in dream_keys: - if dream_scheduler.cancel_dream(dream_key): + if await dream_scheduler.cancel_dream(dream_key): cancelled_dreams.add(dream_key) if cancelled_dreams: diff --git a/src/dialectic/chat.py b/src/dialectic/chat.py index b134b043..d90977e9 100644 --- a/src/dialectic/chat.py +++ b/src/dialectic/chat.py @@ -18,9 +18,9 @@ from src.config import settings from src.dependencies import tracked_db from src.utils import summarizer from src.utils.clients import HonchoLLMCallStreamChunk, honcho_llm_call -from src.utils.langfuse_client import get_langfuse_client from src.utils.logging import ( accumulate_metric, + conditional_observe, log_performance_metrics, ) from src.utils.representation import Representation @@ -34,9 +34,6 @@ logger = logging.getLogger(__name__) # Load environment variables load_dotenv() -# Create langfuse client -lf = get_langfuse_client() if settings.LANGFUSE_PUBLIC_KEY else None - async def dialectic_call( query: str, @@ -151,6 +148,7 @@ async def dialectic_stream( return response +@conditional_observe(name="Dialectic") async def chat( workspace_name: str, session_name: str | None, @@ -189,14 +187,6 @@ async def chat( context_window_size -= estimate_tokens(query) - if lf: - lf.update_current_trace( - metadata={ - "query_generation_model": settings.DIALECTIC.QUERY_GENERATION_MODEL, - "query_generation_provider": settings.DIALECTIC.QUERY_GENERATION_PROVIDER, - "dialectic_model": settings.DIALECTIC.MODEL, - } - ) accumulate_metric( f"dialectic_chat_{dialectic_chat_uuid}", "query", diff --git a/src/dreamer/dream_scheduler.py b/src/dreamer/dream_scheduler.py index 8c572e1c..a56edd3f 100644 --- a/src/dreamer/dream_scheduler.py +++ b/src/dreamer/dream_scheduler.py @@ -1,4 +1,5 @@ import asyncio +import contextlib from datetime import datetime, timezone from logging import getLogger from typing import Any @@ -80,7 +81,7 @@ class DreamScheduler: cls._instance = None cls._initialized = False - def schedule_dream( + async def schedule_dream( self, work_unit_key: str, workspace_name: str, @@ -95,7 +96,7 @@ class DreamScheduler: return # Cancel any existing dream for this collection - self.cancel_dream(work_unit_key) + await self.cancel_dream(work_unit_key) task = asyncio.create_task( self._delayed_dream( @@ -110,12 +111,14 @@ class DreamScheduler: self.pending_dreams[work_unit_key] = task task.add_done_callback(lambda t: self.pending_dreams.pop(work_unit_key, None)) - def cancel_dream(self, work_unit_key: str) -> bool: + async def cancel_dream(self, work_unit_key: str) -> bool: """Cancel a pending dream. Returns True if a dream was cancelled.""" if work_unit_key in self.pending_dreams: task = self.pending_dreams.pop(work_unit_key) task.cancel() - logger.debug(f"Cancelled pending dream for {work_unit_key}") + # Wait for the task to actually finish (including its done callback) + with contextlib.suppress(asyncio.CancelledError): + await task return True return False @@ -331,7 +334,7 @@ async def check_and_schedule_dream( } ) - dream_scheduler.schedule_dream( + await dream_scheduler.schedule_dream( collection_work_unit_key, collection.workspace_name, current_document_count, diff --git a/src/dreamer/dreamer.py b/src/dreamer/dreamer.py index bac32db9..9ee43bb8 100644 --- a/src/dreamer/dreamer.py +++ b/src/dreamer/dreamer.py @@ -11,6 +11,7 @@ from src.dreamer.prompts import consolidation_prompt from src.embedding_client import embedding_client from src.utils.clients import honcho_llm_call from src.utils.formatting import format_datetime_utc +from src.utils.logging import conditional_observe from src.utils.queue_payload import DreamPayload from src.utils.representation import ( ExplicitObservation, @@ -176,6 +177,7 @@ async def _consolidate_cluster( ) +@conditional_observe(name="[Dream] Consolidate Call") async def consolidate_call( representation: Representation, ) -> Representation: diff --git a/src/utils/clients.py b/src/utils/clients.py index 920af15a..9a0628ef 100644 --- a/src/utils/clients.py +++ b/src/utils/clients.py @@ -1,7 +1,6 @@ import json import logging -from collections.abc import AsyncIterator, Callable -from functools import wraps +from collections.abc import AsyncIterator from typing import Any, Generic, Literal, TypeVar, cast, overload from anthropic import AsyncAnthropic @@ -18,7 +17,7 @@ from tenacity import retry, stop_after_attempt, wait_exponential from src.config import settings from src.utils.json_parser import validate_and_repair_json -from src.utils.langfuse_client import get_langfuse_client +from src.utils.logging import conditional_observe from src.utils.representation import PromptRepresentation from src.utils.types import SupportedProviders @@ -27,8 +26,6 @@ logger = logging.getLogger(__name__) T = TypeVar("T") M = TypeVar("M", bound=BaseModel) -lf = get_langfuse_client() if settings.LANGFUSE_PUBLIC_KEY else None - CLIENTS: dict[ SupportedProviders, AsyncAnthropic | AsyncOpenAI | genai.Client | AsyncGroq, @@ -168,6 +165,7 @@ async def honcho_llm_call( ) -> AsyncIterator[HonchoLLMCallStreamChunk]: ... +@conditional_observe(name="LLM Call") async def honcho_llm_call( provider: SupportedProviders, model: str, @@ -191,10 +189,6 @@ async def honcho_llm_call( decorated = honcho_llm_call_inner - # apply langfuse if enabled - if settings.LANGFUSE_PUBLIC_KEY: - decorated = with_langfuse(decorated) - # apply tracking if track_name: decorated = ai_track(track_name)(decorated) @@ -781,15 +775,3 @@ async def handle_streaming_response( is_done=True, finish_reasons=[chunk.choices[0].finish_reason], ) - - -def with_langfuse(func: Callable[..., Any]) -> Callable[..., Any]: - @wraps(func) - async def wrapper(*args: Any, **kwargs: Any) -> Any: - if lf: - with lf.start_as_current_generation(name="LLM Call"): - return await func(*args, **kwargs) - else: - return await func(*args, **kwargs) - - return wrapper diff --git a/src/utils/langfuse_client.py b/src/utils/langfuse_client.py deleted file mode 100644 index c6e68c0b..00000000 --- a/src/utils/langfuse_client.py +++ /dev/null @@ -1,40 +0,0 @@ -""" -Centralized Langfuse client management. - -This module provides a singleton Langfuse client to avoid multiple initialization -errors when modules import get_client() at the module level. -""" - -from typing import Any - -from langfuse import get_client - -_langfuse_client: Any = None - - -def get_langfuse_client() -> Any: - """ - Get the singleton Langfuse client instance. - - This function ensures that get_client() is only called once, regardless of - how many modules import this function. This prevents multiple authentication - error messages when LANGFUSE_PUBLIC_KEY is not configured. - - Returns: - Any: The singleton Langfuse client instance - """ - global _langfuse_client - - if _langfuse_client is None: - _langfuse_client = get_client() - - return _langfuse_client - - -# For backward compatibility, provide the client as a module-level variable -# but only initialize it when first accessed -def __getattr__(name: str): - """Lazy initialization of module-level 'lf' attribute.""" - if name == "lf": - return get_langfuse_client() - raise AttributeError(f"module '{__name__}' has no attribute '{name}'") diff --git a/src/utils/logging.py b/src/utils/logging.py index ca615899..2002b7bd 100644 --- a/src/utils/logging.py +++ b/src/utils/logging.py @@ -6,9 +6,10 @@ and a conditional observe decorator that only applies when Langfuse is configure import datetime from collections.abc import Callable -from typing import Any +from typing import ParamSpec, TypeVar, overload from fastapi import Request +from langfuse import observe # pyright: ignore from rich import box from rich.console import Console, Group, RenderableType from rich.panel import Panel @@ -27,25 +28,56 @@ console = Console(markup=True) COLLECT_METRICS_LOCAL = settings.COLLECT_METRICS_LOCAL +P = ParamSpec("P") +R = TypeVar("R") -def conditional_observe(func: Callable[..., Any]) -> Callable[..., Any]: + +@overload +def conditional_observe( + func: Callable[P, R], +) -> Callable[P, R]: ... + + +@overload +def conditional_observe( + *, + name: str, +) -> Callable[[Callable[P, R]], Callable[P, R]]: ... + + +def conditional_observe( + func: Callable[P, R] | None = None, + *, + name: str | None = None, +) -> Callable[P, R] | Callable[[Callable[P, R]], Callable[P, R]]: """ Conditionally apply the @observe decorator only when LANGFUSE_PUBLIC_KEY is present. + Can be used in two ways: + 1. As a decorator: @conditional_observe + 2. As a decorator factory: @conditional_observe(name="...") + Args: - func: The function to potentially decorate + func: The function to potentially decorate (when used as @conditional_observe) + name: Optional name for the observation (when used as @conditional_observe(name="...")) Returns: The decorated function if Langfuse is configured, otherwise the original function """ - if settings.LANGFUSE_PUBLIC_KEY: - # Import here to avoid circular imports and only import when needed - from langfuse import observe # pyright: ignore - return observe()(func) + def decorator(f: Callable[P, R]) -> Callable[P, R]: + if settings.LANGFUSE_PUBLIC_KEY: + observe_name = name if name is not None else f.__name__ + return observe(name=observe_name)(f) + else: + return f + + if func is not None: + # Used as @conditional_observe (without parentheses) + return decorator(func) else: - # Return the function unchanged if Langfuse is not configured - return func + # Used as @conditional_observe(name="...") (with parentheses and keyword args) + return decorator # dict[task_name, list[tuple[metric_name, metric_value, metric_unit]]] diff --git a/src/utils/summarizer.py b/src/utils/summarizer.py index be21009d..065e3f99 100644 --- a/src/utils/summarizer.py +++ b/src/utils/summarizer.py @@ -14,7 +14,7 @@ from src.dependencies import tracked_db from src.exceptions import ResourceNotFoundException from src.utils.clients import HonchoLLMCallResponse, honcho_llm_call from src.utils.formatting import utc_now_iso -from src.utils.logging import accumulate_metric +from src.utils.logging import accumulate_metric, conditional_observe from .. import crud, models @@ -79,6 +79,7 @@ class SummaryType(Enum): LONG = "honcho_chat_summary_long" +@conditional_observe(name="Create Short Summary") async def create_short_summary( messages: list[models.Message], input_tokens: int, @@ -129,6 +130,7 @@ Produce as thorough a summary as possible in {output_words} words or less. ) +@conditional_observe(name="Create Long Summary") async def create_long_summary( messages: list[models.Message], previous_summary: str | None = None, diff --git a/tests/utils/test_clients.py b/tests/utils/test_clients.py index c6552926..54909d8d 100644 --- a/tests/utils/test_clients.py +++ b/tests/utils/test_clients.py @@ -32,7 +32,6 @@ from src.utils.clients import ( handle_streaming_response, honcho_llm_call, honcho_llm_call_inner, - with_langfuse, ) @@ -89,24 +88,6 @@ class TestLLMCallResponse: assert chunk.finish_reasons == [] -class TestLangfuseIntegration: - """Tests for Langfuse integration""" - - @pytest.mark.asyncio - async def test_with_langfuse_decorator(self): - """Test Langfuse decorator functionality""" - - @with_langfuse - async def test_func(): - return "decorated" - - # Mock the langfuse client - with patch("src.utils.clients.lf") as mock_lf: - result = await test_func() - assert result == "decorated" - mock_lf.start_as_current_generation.assert_called_once_with(name="LLM Call") - - @pytest.mark.asyncio class TestAnthropicClient: """Tests for Anthropic client functionality""" From 1df47e61c8e57ab4d98469bbe7fd7c96884837bd Mon Sep 17 00:00:00 2001 From: doria <93405247+dr-frmr@users.noreply.github.com> Date: Mon, 3 Nov 2025 11:26:44 -0500 Subject: [PATCH 05/13] fix: remove list webhook db call (not needed, causes race condition) (#257) * fix: remove get_workspace call from list_webhooks (not necessary, causes race condition) * fix: remove old test --- src/crud/webhook.py | 5 +---- src/routers/webhooks.py | 2 +- src/webhooks/webhook_delivery.py | 2 +- tests/routes/test_webhooks.py | 7 ------- 4 files changed, 3 insertions(+), 13 deletions(-) diff --git a/src/crud/webhook.py b/src/crud/webhook.py index 1dcc29a8..65b05569 100644 --- a/src/crud/webhook.py +++ b/src/crud/webhook.py @@ -63,7 +63,7 @@ async def get_or_create_webhook_endpoint( async def list_webhook_endpoints( - db: AsyncSession, workspace_name: str + workspace_name: str, ) -> Select[tuple[models.WebhookEndpoint]]: """ List all webhook endpoints, optionally filtered by workspace. @@ -75,9 +75,6 @@ async def list_webhook_endpoints( Returns: List of webhook endpoints """ - # Verify workspace exists - await get_workspace(db, workspace_name) - return select(models.WebhookEndpoint).where( models.WebhookEndpoint.workspace_name == workspace_name ) diff --git a/src/routers/webhooks.py b/src/routers/webhooks.py index c6ae2017..aa3256c1 100644 --- a/src/routers/webhooks.py +++ b/src/routers/webhooks.py @@ -61,7 +61,7 @@ async def list_webhook_endpoints( if not jwt_params.ad and jwt_params.w is not None and jwt_params.w != workspace_id: raise AuthenticationException("Unauthorized access to resource") - stmt = await crud.list_webhook_endpoints(db, workspace_id) + stmt = await crud.list_webhook_endpoints(workspace_id) return await apaginate(db, stmt) diff --git a/src/webhooks/webhook_delivery.py b/src/webhooks/webhook_delivery.py index d9587009..316fdccc 100644 --- a/src/webhooks/webhook_delivery.py +++ b/src/webhooks/webhook_delivery.py @@ -82,7 +82,7 @@ async def _get_webhook_urls(db: AsyncSession, workspace_name: str) -> list[str]: Get all webhook endpoint URLs for a workspace. """ try: - endpoints = await list_webhook_endpoints(db, workspace_name) + endpoints = await list_webhook_endpoints(workspace_name) result = await db.execute(endpoints) return [endpoint.url for endpoint in result.scalars().all()] except Exception: diff --git a/tests/routes/test_webhooks.py b/tests/routes/test_webhooks.py index ed176473..8272dc9f 100644 --- a/tests/routes/test_webhooks.py +++ b/tests/routes/test_webhooks.py @@ -95,13 +95,6 @@ async def test_list_webhook_endpoints_with_data( assert "http://example2.com/webhook" in endpoint_urls -@pytest.mark.asyncio -async def test_list_webhook_endpoints_missing_workspace(client: TestClient): - response = client.get("/v2/workspaces/nonexistent-workspace/webhooks") - assert response.status_code == 404 - assert response.json() == {"detail": "Workspace nonexistent-workspace not found"} - - @pytest.mark.asyncio async def test_delete_webhook_endpoint( client: TestClient, sample_data: tuple[Workspace, Peer] From 097f3b31a0c21393678c6e2fb73637b60508da53 Mon Sep 17 00:00:00 2001 From: Rajat Ahuja Date: Mon, 3 Nov 2025 14:58:12 -0500 Subject: [PATCH 06/13] align DB state to sqlalchemy model definitions (#245) * feat: align DB schema with sqlalchemy model definitions * test: add test for new migration file * fix: add pk for message embeddings table * fix: add naming constraint * fix: align more indexes + unique constraints --> rm redundancy * fix: add missing indexes * Fix Server Default Migrations and add in appropriate Server Defaults (#252) * fix: Improve alembic migration reliability * fix: Ensure alembic migrations use a session pooler (#247) * fix: Ensure alembic migrations use a session pooler * fix: bump batch size; fix document delete in 08894082221a (#249) * chore: add alembic logging * fix (alembic): remove order by in batches * fix: fkey -> fk * chore: code rabbit --------- Co-authored-by: Rajat Ahuja * fix: Add server defaults to appropriate columns * chore: (tests) Add alembic migration test --------- Co-authored-by: Rajat Ahuja * fix: align models with alembic check --------- Co-authored-by: Vineeth Voruganti <13438633+VVoruganti@users.noreply.github.com> --- migrations/env.py | 13 +- migrations/script.py.mako | 10 +- migrations/utils.py | 86 ++++ ...07_align_schema_with_declarative_models.py | 341 +++++++++++++++ ..._replace_collection_name_with_observer_.py | 7 +- ...421aff_rename_metamessage_type_to_label.py | 5 +- ...9adf9_add_server_defaults_to_timestamp_.py | 387 ++++++++++++++++++ src/db.py | 2 + src/models.py | 170 +++++--- tests/alembic/revisions/__init__.py | 2 + ...07_align_schema_with_declarative_models.py | 42 ++ ...9adf9_add_server_defaults_to_timestamp_.py | 284 +++++++++++++ 12 files changed, 1285 insertions(+), 64 deletions(-) create mode 100644 migrations/versions/066e87ca5b07_align_schema_with_declarative_models.py create mode 100644 migrations/versions/e9b705f9adf9_add_server_defaults_to_timestamp_.py create mode 100644 tests/alembic/revisions/test_066e87ca5b07_align_schema_with_declarative_models.py create mode 100644 tests/alembic/revisions/test_e9b705f9adf9_add_server_defaults_to_timestamp_.py diff --git a/migrations/env.py b/migrations/env.py index f0a8197c..4ee654bd 100644 --- a/migrations/env.py +++ b/migrations/env.py @@ -1,4 +1,4 @@ -import logging +import logging # noqa: I001 import sys from logging.config import fileConfig from pathlib import Path @@ -12,6 +12,10 @@ from src.config import settings # Import your models from src.db import Base +# Import all models so they register with Base.metadata +import src.models # noqa: F401 + + # Set up logging more verbosely logging.basicConfig() logging.getLogger("sqlalchemy.engine").setLevel(logging.INFO) @@ -166,6 +170,13 @@ def run_migrations_online() -> None: connection=connection, target_metadata=target_metadata, version_table_schema=target_metadata.schema, + include_schemas=True, + include_object=lambda obj, name, type_, reflected, compare_to: ( + # Only include objects from our target schema + getattr(obj, "schema", None) == target_metadata.schema + if hasattr(obj, "schema") + else True + ), ) with context.begin_transaction(): diff --git a/migrations/script.py.mako b/migrations/script.py.mako index fbc4b07d..bba30146 100644 --- a/migrations/script.py.mako +++ b/migrations/script.py.mako @@ -5,18 +5,20 @@ Revises: ${down_revision | comma,n} Create Date: ${create_date} """ -from typing import Sequence, Union +from collections.abc import Sequence from alembic import op import sqlalchemy as sa ${imports if imports else ""} +from migrations.utils import get_schema # revision identifiers, used by Alembic. revision: str = ${repr(up_revision)} -down_revision: Union[str, None] = ${repr(down_revision)} -branch_labels: Union[str, Sequence[str], None] = ${repr(branch_labels)} -depends_on: Union[str, Sequence[str], None] = ${repr(depends_on)} +down_revision: str | None = ${repr(down_revision)} +branch_labels: str | Sequence[str] | None = ${repr(branch_labels)} +depends_on: str | Sequence[str] | None = ${repr(depends_on)} +schema = get_schema() def upgrade() -> None: ${upgrades if upgrades else "pass"} diff --git a/migrations/utils.py b/migrations/utils.py index 4333ae46..1dc74d86 100644 --- a/migrations/utils.py +++ b/migrations/utils.py @@ -71,3 +71,89 @@ def constraint_exists( else: raise ValueError(f"Invalid constraint type: {type}") return any(constraint["name"] == constraint_name for constraint in constraints) + + +def make_column_non_nullable_safe(table_name: str, column_name: str) -> None: + """ + Make a column non-nullable using a non-blocking approach to minimize lock duration. + + WARNING: Only use this if you can guarantee that: + 1. No NULL values currently exist in the column + 2. The application code is already writing non-NULL values to this column or + 3. The column has never accepted NULLs in practice + + This uses a 4-step process to avoid long exclusive locks: + 1. Add CHECK constraint with NOT VALID (instant, no scan) + 2. Validate the constraint (scans but allows concurrent read/writes to the table) + 3. Set column NOT NULL (fast since we've validated the constraint) + 4. Drop the redundant CHECK constraint + + Args: + table_name: The name of the table + column_name: The name of the column to make non-nullable + """ + schema = get_schema() + conn = op.get_bind() + constraint_name = f"{table_name}_{column_name}_not_null" + + # Step 1: Check if the column is already non-nullable + inspector = sa.inspect(op.get_bind()) + columns = inspector.get_columns(table_name, schema=schema) + column_info = next((col for col in columns if col["name"] == column_name), None) + if column_info is None: + raise ValueError(f"Column {table_name}.{column_name} does not exist") + if not column_info["nullable"]: + print(f"Column {table_name}.{column_name} is already non-nullable, skipping...") + return + + # Step 2: Add CHECK constraint without validation (instant) + # Note: op.create_check_constraint() doesn't support NOT VALID, so use raw SQL + + # Get the identifier preparer for safe quoting + dialect = conn.dialect + preparer = dialect.identifier_preparer + + quoted_schema = preparer.quote(schema) + quoted_table = preparer.quote(table_name) + quoted_constraint = preparer.quote(constraint_name) + quoted_column = preparer.quote(column_name) + + # Step 2: Add CHECK constraint without validation (instant) + # Note: op.create_check_constraint() doesn't support NOT VALID, so use raw SQL + if not constraint_exists(table_name, constraint_name, "check"): + conn.execute( + sa.text( + f""" + ALTER TABLE {quoted_schema}.{quoted_table} + ADD CONSTRAINT {quoted_constraint} + CHECK ({quoted_column} IS NOT NULL) + NOT VALID + """ + ) + ) + + # Step 3: Validate constraint (scans but allows concurrent operations) + conn.execute( + sa.text( + f""" + ALTER TABLE {quoted_schema}.{quoted_table} + VALIDATE CONSTRAINT {quoted_constraint} + """ + ) + ) + + # Step 4: Set NOT NULL (fast with validated constraint) + op.alter_column( + table_name, + column_name, + nullable=False, + schema=schema, + ) + + # Step 5: Drop the redundant CHECK constraint + op.drop_constraint( + constraint_name, + table_name, + type_="check", + schema=schema, + ) diff --git a/migrations/versions/066e87ca5b07_align_schema_with_declarative_models.py b/migrations/versions/066e87ca5b07_align_schema_with_declarative_models.py new file mode 100644 index 00000000..72966bf0 --- /dev/null +++ b/migrations/versions/066e87ca5b07_align_schema_with_declarative_models.py @@ -0,0 +1,341 @@ +"""align_schema_with_declarative_models + +Revision ID: 066e87ca5b07 +Revises: bb6fb3a7a643 +Create Date: 2025-10-27 12:36:51.614959 + +""" + +from collections.abc import Sequence + +import sqlalchemy as sa +from alembic import op + +from migrations.utils import ( + column_exists, + constraint_exists, + fk_exists, + get_schema, + index_exists, + make_column_non_nullable_safe, +) + +# revision identifiers, used by Alembic. +revision: str = "066e87ca5b07" +down_revision: str | None = "bb6fb3a7a643" +branch_labels: str | Sequence[str] | None = None +depends_on: str | Sequence[str] | None = None + +schema = get_schema() + + +def upgrade() -> None: + """ + The application code has been previously updated to ensure none of the following columns have NULL values but the actual DB schema is out of sync with our SQLAlchemy model definitions. + This migration fixes this by making the columns non-nullable using a non-blocking approach to minimize lock duration. + """ + conn = op.get_bind() + + # Make peers.workspace_name non-nullable + if column_exists("peers", "workspace_name"): + make_column_non_nullable_safe("peers", "workspace_name") + + # Make sessions.workspace_name non-nullable + if column_exists("sessions", "workspace_name"): + make_column_non_nullable_safe("sessions", "workspace_name") + + # Make active_queue_sessions.work_unit_key non-nullable + if column_exists("active_queue_sessions", "work_unit_key"): + make_column_non_nullable_safe("active_queue_sessions", "work_unit_key") + + # Make documents.embedding non-nullable + if column_exists("documents", "embedding"): + make_column_non_nullable_safe("documents", "embedding") + + # Add primary key constraint to message_embeddings.id + if column_exists("message_embeddings", "id") and not constraint_exists( + "message_embeddings", "pk_message_embeddings", "primary" + ): + conn.execute( + sa.text( + f""" + ALTER TABLE {schema}.message_embeddings + ADD CONSTRAINT pk_message_embeddings + PRIMARY KEY (id) + """ + ) + ) + + # Rename indexes on peers table + inspector = sa.inspect(conn) + index_renames = [ + ("peers", "ix_users_created_at", "ix_peers_created_at"), + ("peers", "ix_users_name", "ix_peers_name"), + ("workspaces", "ix_apps_created_at", "ix_workspaces_created_at"), + ("workspaces", "ix_apps_name", "ix_workspaces_name"), + ] + for table_name, old_name, new_name in index_renames: + if index_exists(table_name, old_name, inspector): + conn.execute( + sa.text(f"ALTER INDEX {schema}.{old_name} RENAME TO {new_name}") + ) + + # Drop redundant indexes + if index_exists("workspaces", "ix_apps_public_id", inspector): + op.drop_index("ix_apps_public_id", table_name="workspaces", schema=schema) + if index_exists("peers", "ix_users_public_id", inspector): + op.drop_index("ix_users_public_id", table_name="peers", schema=schema) + if index_exists("sessions", "ix_sessions_public_id", inspector): + op.drop_index("ix_sessions_public_id", table_name="sessions", schema=schema) + if index_exists("documents", "ix_documents_public_id", inspector): + op.drop_index("ix_documents_public_id", table_name="documents", schema=schema) + if index_exists("collections", "ix_collections_public_id", inspector): + op.drop_index( + "ix_collections_public_id", table_name="collections", schema=schema + ) + + # Drop redundant unique constraints + if constraint_exists("workspaces", "uq_apps_public_id", "unique", inspector): + op.drop_constraint( + "uq_apps_public_id", "workspaces", type_="unique", schema=schema + ) + + if constraint_exists("peers", "uq_users_public_id", "unique", inspector): + op.drop_constraint("uq_users_public_id", "peers", type_="unique", schema=schema) + + if constraint_exists("sessions", "uq_sessions_public_id", "unique", inspector): + op.drop_constraint( + "uq_sessions_public_id", "sessions", type_="unique", schema=schema + ) + + if constraint_exists( + "collections", "uq_collections_public_id", "unique", inspector + ): + op.drop_constraint( + "uq_collections_public_id", "collections", type_="unique", schema=schema + ) + + if constraint_exists("documents", "uq_documents_public_id", "unique", inspector): + op.drop_constraint( + "uq_documents_public_id", "documents", type_="unique", schema=schema + ) + + # Drop unnecessary index on active queue + if index_exists( + "active_queue_sessions", + f"ix_{schema}_active_queue_sessions_work_unit_key", + inspector, + ): + op.drop_index( + f"ix_{schema}_active_queue_sessions_work_unit_key", + table_name="active_queue_sessions", + schema=schema, + ) + + # Add FK constraint on queue.session_id to sessions.id + if not fk_exists("queue", "fk_queue_session_id"): + # Add constraint without validation (fast, doesn't scan) + conn.execute( + sa.text( + f""" + ALTER TABLE {schema}.queue + ADD CONSTRAINT fk_queue_session_id + FOREIGN KEY (session_id) + REFERENCES {schema}.sessions(id) + NOT VALID + """ + ) + ) + # Validate constraint (scans but allows concurrent reads) + conn.execute( + sa.text( + f"ALTER TABLE {schema}.queue VALIDATE CONSTRAINT fk_queue_session_id" + ) + ) + + # Create missing indexes + if not index_exists("peers", "ix_peers_workspace_name", inspector): + op.create_index( + "ix_peers_workspace_name", "peers", ["workspace_name"], schema=schema + ) + + if not index_exists("collections", "ix_collections_workspace_name", inspector): + op.create_index( + "ix_collections_workspace_name", + "collections", + ["workspace_name"], + schema=schema, + ) + + if not index_exists("documents", "ix_documents_workspace_name", inspector): + op.create_index( + "ix_documents_workspace_name", + "documents", + ["workspace_name"], + schema=schema, + ) + + if not fk_exists("session_peers", "fk_session_peers_workspace_name", inspector): + # Add constraint without validation (fast, doesn't scan) + conn.execute( + sa.text( + f""" + ALTER TABLE {schema}.session_peers + ADD CONSTRAINT fk_session_peers_workspace_name + FOREIGN KEY (workspace_name) + REFERENCES {schema}.workspaces(name) + NOT VALID + """ + ) + ) + # Validate constraint (scans but allows concurrent reads) + conn.execute( + sa.text( + f"ALTER TABLE {schema}.session_peers VALIDATE CONSTRAINT fk_session_peers_workspace_name" + ) + ) + + +def downgrade() -> None: + conn = op.get_bind() + inspector = sa.inspect(conn) + + if fk_exists("session_peers", "fk_session_peers_workspace_name", inspector): + op.drop_constraint( + "fk_session_peers_workspace_name", + table_name="session_peers", + type_="foreignkey", + schema=schema, + ) + + if index_exists("documents", "ix_documents_workspace_name", inspector): + op.drop_index( + "ix_documents_workspace_name", table_name="documents", schema=schema + ) + + if index_exists("peers", "ix_peers_workspace_name", inspector): + op.drop_index("ix_peers_workspace_name", table_name="peers", schema=schema) + if index_exists("collections", "ix_collections_workspace_name", inspector): + op.drop_index( + "ix_collections_workspace_name", table_name="collections", schema=schema + ) + + # First, drop the FK constraint (we'll recreate it later if needed) + if fk_exists("queue", "fk_queue_session_id"): + op.drop_constraint( + "fk_queue_session_id", + "queue", + type_="foreignkey", + schema=schema, + ) + + if not index_exists( + "active_queue_sessions", + f"ix_{schema}_active_queue_sessions_work_unit_key", + inspector, + ): + op.create_index( + f"ix_{schema}_active_queue_sessions_work_unit_key", + table_name="active_queue_sessions", + columns=["work_unit_key"], + schema=schema, + ) + + # Recreate the redundant unique constraints + if not constraint_exists("sessions", "uq_sessions_public_id", "unique", inspector): + op.create_unique_constraint( + "uq_sessions_public_id", "sessions", ["id"], schema=schema + ) + if not constraint_exists("peers", "uq_users_public_id", "unique", inspector): + op.create_unique_constraint( + "uq_users_public_id", "peers", ["id"], schema=schema + ) + if not constraint_exists("workspaces", "uq_apps_public_id", "unique", inspector): + op.create_unique_constraint( + "uq_apps_public_id", "workspaces", ["id"], schema=schema + ) + + if not constraint_exists( + "collections", "uq_collections_public_id", "unique", inspector + ): + op.create_unique_constraint( + "uq_collections_public_id", "collections", ["id"], schema=schema + ) + if not constraint_exists( + "documents", "uq_documents_public_id", "unique", inspector + ): + op.create_unique_constraint( + "uq_documents_public_id", "documents", ["id"], schema=schema + ) + + # Recreate the redundant indexes + if not index_exists("sessions", "ix_sessions_public_id", inspector): + op.create_index("ix_sessions_public_id", "sessions", ["id"], schema=schema) + if not index_exists("peers", "ix_users_public_id", inspector): + op.create_index("ix_users_public_id", "peers", ["id"], schema=schema) + if not index_exists("workspaces", "ix_apps_public_id", inspector): + op.create_index("ix_apps_public_id", "workspaces", ["id"], schema=schema) + if not index_exists("documents", "ix_documents_public_id", inspector): + op.create_index("ix_documents_public_id", "documents", ["id"], schema=schema) + if not index_exists("collections", "ix_collections_public_id", inspector): + op.create_index( + "ix_collections_public_id", + "collections", + ["id"], + schema=schema, + ) + + # Rename indexes on peers table back to original names + index_renames = [ + ("peers", "ix_peers_created_at", "ix_users_created_at"), + ("peers", "ix_peers_name", "ix_users_name"), + ("workspaces", "ix_workspaces_created_at", "ix_apps_created_at"), + ("workspaces", "ix_workspaces_name", "ix_apps_name"), + ] + for table_name, new_name, old_name in index_renames: + if index_exists(table_name, new_name, inspector): + conn.execute( + sa.text(f"ALTER INDEX {schema}.{new_name} RENAME TO {old_name}") + ) + + # Drop primary key constraint from message_embeddings.id + if constraint_exists("message_embeddings", "pk_message_embeddings", "primary"): + op.drop_constraint( + "pk_message_embeddings", "message_embeddings", "primary", schema=schema + ) + + # Make documents.embedding nullable + if column_exists("documents", "embedding"): + op.alter_column( + "documents", + "embedding", + nullable=True, + schema=schema, + ) + + # Make active_queue_sessions.work_unit_key nullable + if column_exists("active_queue_sessions", "work_unit_key"): + op.alter_column( + "active_queue_sessions", + "work_unit_key", + nullable=True, + schema=schema, + ) + + # Make sessions.workspace_name nullable + if column_exists("sessions", "workspace_name"): + op.alter_column( + "sessions", + "workspace_name", + nullable=True, + schema=schema, + ) + + # Make peers.workspace_name nullable + if column_exists("peers", "workspace_name"): + op.alter_column( + "peers", + "workspace_name", + nullable=True, + schema=schema, + ) diff --git a/migrations/versions/08894082221a_replace_collection_name_with_observer_.py b/migrations/versions/08894082221a_replace_collection_name_with_observer_.py index 481ae33f..e38111b0 100644 --- a/migrations/versions/08894082221a_replace_collection_name_with_observer_.py +++ b/migrations/versions/08894082221a_replace_collection_name_with_observer_.py @@ -53,7 +53,7 @@ def upgrade() -> None: connection.execute( text( f""" - INSERT INTO {schema}.sessions (id, name, workspace_name, is_active) VALUES (:session_id, '__global_observations__', :workspace_name, true) ON CONFLICT DO NOTHING + INSERT INTO {schema}.sessions (id, name, workspace_name, is_active, metadata, internal_metadata, configuration, created_at) VALUES (:session_id, '__global_observations__', :workspace_name, true, '{{}}', '{{}}', '{{}}', NOW()) ON CONFLICT DO NOTHING """ ), {"session_id": session_id, "workspace_name": workspace_name}, @@ -446,7 +446,10 @@ def upgrade() -> None: schema=schema, ) - # Step 17: Drop the name column from collections + # Step 17: Drop the name_length check constraint before dropping the name column from collections + if constraint_exists("collections", "name_length", "check", inspector): + op.drop_constraint("name_length", "collections", schema=schema) + if column_exists("collections", "name", inspector): op.drop_column("collections", "name", schema=schema) diff --git a/migrations/versions/20f89a421aff_rename_metamessage_type_to_label.py b/migrations/versions/20f89a421aff_rename_metamessage_type_to_label.py index fb04c186..114eefa2 100644 --- a/migrations/versions/20f89a421aff_rename_metamessage_type_to_label.py +++ b/migrations/versions/20f89a421aff_rename_metamessage_type_to_label.py @@ -11,6 +11,8 @@ from collections.abc import Sequence import sqlalchemy as sa from alembic import op +from migrations.utils import constraint_exists + # revision identifiers, used by Alembic. revision: str = "20f89a421aff" down_revision: str | None = "556a16564f50" @@ -61,7 +63,8 @@ def upgrade() -> None: ) # Rename check constraint - op.execute("ALTER TABLE metamessages DROP CONSTRAINT metamessage_type_length;") + if constraint_exists("metamessages", "metamessage_type_length", "check"): + op.execute("ALTER TABLE metamessages DROP CONSTRAINT metamessage_type_length;") op.create_check_constraint("label_length", "metamessages", "length(label) <= 512") # ### end Alembic commands ### diff --git a/migrations/versions/e9b705f9adf9_add_server_defaults_to_timestamp_.py b/migrations/versions/e9b705f9adf9_add_server_defaults_to_timestamp_.py new file mode 100644 index 00000000..b23ba032 --- /dev/null +++ b/migrations/versions/e9b705f9adf9_add_server_defaults_to_timestamp_.py @@ -0,0 +1,387 @@ +"""add server defaults to timestamp boolean and jsonb columns + +Revision ID: e9b705f9adf9 +Revises: 066e87ca5b07 +Create Date: 2025-10-29 12:08:36.803611 + +""" + +from collections.abc import Sequence + +import sqlalchemy as sa +from alembic import op + +from migrations.utils import get_schema + +# revision identifiers, used by Alembic. +revision: str = "e9b705f9adf9" +down_revision: str | None = "066e87ca5b07" +branch_labels: str | Sequence[str] | None = None +depends_on: str | Sequence[str] | None = None + + +schema = get_schema() + + +def upgrade() -> None: + # Add server defaults for timestamp columns + op.alter_column( + "workspaces", + "created_at", + server_default=sa.func.now(), + schema=schema, + ) + op.alter_column( + "peers", + "created_at", + server_default=sa.func.now(), + schema=schema, + ) + op.alter_column( + "sessions", + "created_at", + server_default=sa.func.now(), + schema=schema, + ) + op.alter_column( + "messages", + "created_at", + server_default=sa.func.now(), + schema=schema, + ) + op.alter_column( + "message_embeddings", + "created_at", + server_default=sa.func.now(), + schema=schema, + ) + op.alter_column( + "collections", + "created_at", + server_default=sa.func.now(), + schema=schema, + ) + op.alter_column( + "documents", + "created_at", + server_default=sa.func.now(), + schema=schema, + ) + op.alter_column( + "queue", + "created_at", + server_default=sa.func.now(), + schema=schema, + ) + op.alter_column( + "webhook_endpoints", + "created_at", + server_default=sa.func.now(), + schema=schema, + ) + op.alter_column( + "session_peers", + "joined_at", + server_default=sa.func.now(), + schema=schema, + ) + op.alter_column( + "active_queue_sessions", + "last_updated", + server_default=sa.func.now(), + schema=schema, + ) + + # Add server defaults for JSONB columns + op.alter_column( + "workspaces", + "metadata", + server_default=sa.text("'{}'::jsonb"), + schema=schema, + ) + op.alter_column( + "workspaces", + "internal_metadata", + server_default=sa.text("'{}'::jsonb"), + schema=schema, + ) + op.alter_column( + "workspaces", + "configuration", + server_default=sa.text("'{}'::jsonb"), + schema=schema, + ) + op.alter_column( + "peers", + "metadata", + server_default=sa.text("'{}'::jsonb"), + schema=schema, + ) + op.alter_column( + "peers", + "internal_metadata", + server_default=sa.text("'{}'::jsonb"), + schema=schema, + ) + op.alter_column( + "peers", + "configuration", + server_default=sa.text("'{}'::jsonb"), + schema=schema, + ) + op.alter_column( + "sessions", + "metadata", + server_default=sa.text("'{}'::jsonb"), + schema=schema, + ) + op.alter_column( + "sessions", + "internal_metadata", + server_default=sa.text("'{}'::jsonb"), + schema=schema, + ) + op.alter_column( + "sessions", + "configuration", + server_default=sa.text("'{}'::jsonb"), + schema=schema, + ) + op.alter_column( + "messages", + "metadata", + server_default=sa.text("'{}'::jsonb"), + schema=schema, + ) + op.alter_column( + "messages", + "internal_metadata", + server_default=sa.text("'{}'::jsonb"), + schema=schema, + ) + op.alter_column( + "collections", + "metadata", + server_default=sa.text("'{}'::jsonb"), + schema=schema, + ) + op.alter_column( + "collections", + "internal_metadata", + server_default=sa.text("'{}'::jsonb"), + schema=schema, + ) + op.alter_column( + "documents", + "internal_metadata", + server_default=sa.text("'{}'::jsonb"), + schema=schema, + ) + op.alter_column( + "session_peers", + "configuration", + server_default=sa.text("'{}'::jsonb"), + schema=schema, + ) + op.alter_column( + "session_peers", + "internal_metadata", + server_default=sa.text("'{}'::jsonb"), + schema=schema, + ) + + # Add server defaults for boolean columns + op.alter_column( + "sessions", + "is_active", + server_default=sa.text("true"), + schema=schema, + ) + op.alter_column( + "queue", + "processed", + server_default=sa.text("false"), + schema=schema, + ) + + +def downgrade() -> None: + # Remove server defaults for timestamp columns + op.alter_column( + "workspaces", + "created_at", + server_default=None, + schema=schema, + ) + op.alter_column( + "peers", + "created_at", + server_default=None, + schema=schema, + ) + op.alter_column( + "sessions", + "created_at", + server_default=None, + schema=schema, + ) + op.alter_column( + "messages", + "created_at", + server_default=None, + schema=schema, + ) + op.alter_column( + "message_embeddings", + "created_at", + server_default=None, + schema=schema, + ) + op.alter_column( + "collections", + "created_at", + server_default=None, + schema=schema, + ) + op.alter_column( + "documents", + "created_at", + server_default=None, + schema=schema, + ) + op.alter_column( + "queue", + "created_at", + server_default=None, + schema=schema, + ) + op.alter_column( + "webhook_endpoints", + "created_at", + server_default=None, + schema=schema, + ) + op.alter_column( + "session_peers", + "joined_at", + server_default=None, + schema=schema, + ) + op.alter_column( + "active_queue_sessions", + "last_updated", + server_default=None, + schema=schema, + ) + + # Remove server defaults for JSONB columns + op.alter_column( + "workspaces", + "metadata", + server_default=None, + schema=schema, + ) + op.alter_column( + "workspaces", + "internal_metadata", + server_default=None, + schema=schema, + ) + op.alter_column( + "workspaces", + "configuration", + server_default=None, + schema=schema, + ) + op.alter_column( + "peers", + "metadata", + server_default=None, + schema=schema, + ) + op.alter_column( + "peers", + "internal_metadata", + server_default=None, + schema=schema, + ) + op.alter_column( + "peers", + "configuration", + server_default=None, + schema=schema, + ) + op.alter_column( + "sessions", + "metadata", + server_default=None, + schema=schema, + ) + op.alter_column( + "sessions", + "internal_metadata", + server_default=None, + schema=schema, + ) + op.alter_column( + "sessions", + "configuration", + server_default=None, + schema=schema, + ) + op.alter_column( + "messages", + "metadata", + server_default=None, + schema=schema, + ) + op.alter_column( + "messages", + "internal_metadata", + server_default=None, + schema=schema, + ) + op.alter_column( + "collections", + "metadata", + server_default=None, + schema=schema, + ) + op.alter_column( + "collections", + "internal_metadata", + server_default=None, + schema=schema, + ) + op.alter_column( + "documents", + "internal_metadata", + server_default=None, + schema=schema, + ) + op.alter_column( + "session_peers", + "configuration", + server_default=None, + schema=schema, + ) + op.alter_column( + "session_peers", + "internal_metadata", + server_default=None, + schema=schema, + ) + + # Remove server defaults for boolean columns + op.alter_column( + "sessions", + "is_active", + server_default=None, + schema=schema, + ) + op.alter_column( + "queue", + "processed", + server_default=None, + schema=schema, + ) diff --git a/src/db.py b/src/db.py index 9d37d321..100663d2 100644 --- a/src/db.py +++ b/src/db.py @@ -46,6 +46,8 @@ SessionLocal = async_sessionmaker( ) table_schema = settings.DB.SCHEMA +# Note: column_0_N_name expands to include all columns in multi-column constraints +# e.g., "workspace_id_tenant_id" for a composite constraint on both columns meta = MetaData() meta.schema = table_schema Base = declarative_base(metadata=meta) diff --git a/src/models.py b/src/models.py index b66e31cf..2efad02f 100644 --- a/src/models.py +++ b/src/models.py @@ -51,13 +51,25 @@ session_peers_table = Table( nullable=False, ), Column("peer_name", TEXT, primary_key=True, nullable=False), - Column("configuration", JSONB, default=dict), - Column("internal_metadata", JSONB, default=dict), + Column( + "configuration", + JSONB, + default=dict, + nullable=False, + server_default=text("'{}'::jsonb"), + ), + Column( + "internal_metadata", + JSONB, + default=dict, + nullable=False, + server_default=text("'{}'::jsonb"), + ), Column( "joined_at", DateTime(timezone=True), nullable=False, - default=func.now(), + server_default=func.now(), ), Column( "left_at", @@ -81,22 +93,28 @@ session_peers_table = Table( class Workspace(Base): __tablename__: str = "workspaces" id: Mapped[str] = mapped_column(TEXT, default=generate_nanoid, primary_key=True) - name: Mapped[str] = mapped_column(TEXT, index=True, unique=True) + name: Mapped[str] = mapped_column(TEXT, unique=True) peers = relationship("Peer", back_populates="workspace") webhook_endpoints = relationship("WebhookEndpoint", back_populates="workspace") created_at: Mapped[datetime.datetime] = mapped_column( - DateTime(timezone=True), index=True, default=func.now() + DateTime(timezone=True), server_default=func.now() + ) + h_metadata: Mapped[dict[str, Any]] = mapped_column( + "metadata", JSONB, default=dict, server_default=text("'{}'::jsonb") ) - h_metadata: Mapped[dict[str, Any]] = mapped_column("metadata", JSONB, default=dict) internal_metadata: Mapped[dict[str, Any]] = mapped_column( "internal_metadata", JSONB, default=dict ) - configuration: Mapped[dict[str, Any]] = mapped_column(JSONB, default=dict) + configuration: Mapped[dict[str, Any]] = mapped_column( + JSONB, default=dict, server_default=text("'{}'::jsonb") + ) __table_args__ = ( CheckConstraint("length(id) = 21", name="id_length"), CheckConstraint("length(name) <= 512", name="name_length"), CheckConstraint("id ~ '^[A-Za-z0-9_-]+$'", name="id_format"), + Index("ix_workspaces_created_at", "created_at"), + Index("ix_workspaces_name", "name"), ) @@ -104,18 +122,22 @@ class Workspace(Base): class Peer(Base): __tablename__: str = "peers" id: Mapped[str] = mapped_column(TEXT, default=generate_nanoid, primary_key=True) - name: Mapped[str] = mapped_column(TEXT, index=True) - h_metadata: Mapped[dict[str, Any]] = mapped_column("metadata", JSONB, default=dict) + name: Mapped[str] = mapped_column(TEXT, nullable=False) + h_metadata: Mapped[dict[str, Any]] = mapped_column( + "metadata", JSONB, default=dict, server_default=text("'{}'::jsonb") + ) internal_metadata: Mapped[dict[str, Any]] = mapped_column( - "internal_metadata", JSONB, default=dict + "internal_metadata", JSONB, default=dict, server_default=text("'{}'::jsonb") ) created_at: Mapped[datetime.datetime] = mapped_column( - DateTime(timezone=True), index=True, default=func.now() + DateTime(timezone=True), server_default=func.now() ) workspace_name: Mapped[str] = mapped_column( - ForeignKey("workspaces.name"), index=True, nullable=False + ForeignKey("workspaces.name"), nullable=False + ) + configuration: Mapped[dict[str, Any]] = mapped_column( + JSONB, default=dict, server_default=text("'{}'::jsonb") ) - configuration: Mapped[dict[str, Any]] = mapped_column(JSONB, default=dict) workspace = relationship("Workspace", back_populates="peers") sessions = relationship( @@ -128,6 +150,9 @@ class Peer(Base): CheckConstraint("length(name) <= 512", name="name_length"), CheckConstraint("id ~ '^[A-Za-z0-9_-]+$'", name="id_format"), Index("idx_peers_workspace_lookup", "workspace_name", "name"), + Index("ix_peers_created_at", "created_at"), + Index("ix_peers_name", "name"), + Index("ix_peers_workspace_name", "workspace_name"), ) def __repr__(self) -> str: @@ -138,20 +163,24 @@ class Peer(Base): class Session(Base): __tablename__: str = "sessions" id: Mapped[str] = mapped_column(TEXT, primary_key=True, default=generate_nanoid) - name: Mapped[str] = mapped_column(TEXT, index=True) - is_active: Mapped[bool] = mapped_column(default=True) - h_metadata: Mapped[dict[str, Any]] = mapped_column("metadata", JSONB, default=dict) + name: Mapped[str] = mapped_column(TEXT) + is_active: Mapped[bool] = mapped_column(default=True, server_default=text("true")) + h_metadata: Mapped[dict[str, Any]] = mapped_column( + "metadata", JSONB, default=dict, server_default=text("'{}'::jsonb") + ) internal_metadata: Mapped[dict[str, Any]] = mapped_column( - "internal_metadata", JSONB, default=dict + "internal_metadata", JSONB, default=dict, server_default=text("'{}'::jsonb") ) created_at: Mapped[datetime.datetime] = mapped_column( - DateTime(timezone=True), index=True, default=func.now() + DateTime(timezone=True), server_default=func.now() ) messages = relationship("Message", back_populates="session") workspace_name: Mapped[str] = mapped_column( - ForeignKey("workspaces.name"), index=True, nullable=False + ForeignKey("workspaces.name"), nullable=False + ) + configuration: Mapped[dict[str, Any]] = mapped_column( + JSONB, default=dict, server_default=text("'{}'::jsonb") ) - configuration: Mapped[dict[str, Any]] = mapped_column(JSONB, default=dict) peers = relationship( "Peer", secondary=session_peers_table, back_populates="sessions" @@ -162,6 +191,7 @@ class Session(Base): CheckConstraint("length(name) <= 512", name="name_length"), CheckConstraint("length(id) = 21", name="id_length"), CheckConstraint("id ~ '^[A-Za-z0-9_-]+$'", name="id_format"), + Index("ix_sessions_created_at", "created_at"), ) def __repr__(self) -> str: @@ -175,26 +205,30 @@ class Message(Base): BigInteger, Identity(), primary_key=True, autoincrement=True ) public_id: Mapped[str] = mapped_column( - TEXT, index=True, unique=True, default=generate_nanoid + TEXT, + unique=True, + default=generate_nanoid, ) # NOTE: Messages in Honcho 2.0 could historically be stored outside of a session. # We have since assigned all of these messages to a default session. - session_name: Mapped[str] = mapped_column(index=True, nullable=False) + session_name: Mapped[str] = mapped_column(TEXT, nullable=False) content: Mapped[str] = mapped_column(TEXT) - h_metadata: Mapped[dict[str, Any]] = mapped_column("metadata", JSONB, default=dict) + h_metadata: Mapped[dict[str, Any]] = mapped_column( + "metadata", JSONB, default=dict, server_default=text("'{}'::jsonb") + ) internal_metadata: Mapped[dict[str, Any]] = mapped_column( - "internal_metadata", JSONB, default=dict + "internal_metadata", JSONB, default=dict, server_default=text("'{}'::jsonb") ) token_count: Mapped[int] = mapped_column(Integer, default=0, nullable=False) - seq_in_session: Mapped[int] = mapped_column(BigInteger, nullable=False, index=True) + seq_in_session: Mapped[int] = mapped_column(BigInteger, nullable=False) created_at: Mapped[datetime.datetime] = mapped_column( - DateTime(timezone=True), index=True, default=func.now() + DateTime(timezone=True), server_default=func.now() ) session = relationship("Session", back_populates="messages") - peer_name: Mapped[str] = mapped_column(index=True) + peer_name: Mapped[str] = mapped_column(TEXT) workspace_name: Mapped[str] = mapped_column( - ForeignKey("workspaces.name"), index=True + ForeignKey("workspaces.name"), ) __table_args__ = ( @@ -229,6 +263,11 @@ class Message(Base): text("to_tsvector('english', content)"), postgresql_using="gin", ), + Index("ix_messages_created_at", "created_at"), + Index("ix_messages_id", "id"), + Index("ix_messages_peer_name", "peer_name"), + Index("ix_messages_public_id", "public_id"), + Index("ix_messages_workspace_name", "workspace_name"), ) @override @@ -246,15 +285,15 @@ class MessageEmbedding(Base): content: Mapped[str] = mapped_column(TEXT) embedding: MappedColumn[Any] = mapped_column(Vector(1536)) message_id: Mapped[str] = mapped_column( - ForeignKey("messages.public_id"), index=True + ForeignKey("messages.public_id"), ) workspace_name: Mapped[str] = mapped_column( - ForeignKey("workspaces.name"), index=True + ForeignKey("workspaces.name"), ) - session_name: Mapped[str] = mapped_column(TEXT, index=True, nullable=False) - peer_name: Mapped[str | None] = mapped_column(TEXT, index=True) + session_name: Mapped[str] = mapped_column(TEXT, nullable=False) + peer_name: Mapped[str] = mapped_column(TEXT) created_at: Mapped[datetime.datetime] = mapped_column( - DateTime(timezone=True), index=True, default=func.now() + DateTime(timezone=True), server_default=func.now() ) # Relationship to Message @@ -278,6 +317,11 @@ class MessageEmbedding(Base): postgresql_with={"m": 16, "ef_construction": 64}, postgresql_ops={"embedding": "vector_cosine_ops"}, ), + Index("idx_message_embeddings_created_at", "created_at"), + Index("idx_message_embeddings_message_id", "message_id"), + Index("idx_message_embeddings_peer_name", "peer_name"), + Index("idx_message_embeddings_session_name", "session_name"), + Index("idx_message_embeddings_workspace_name", "workspace_name"), ) @@ -286,20 +330,22 @@ class Collection(Base): __tablename__: str = "collections" id: Mapped[str] = mapped_column(TEXT, default=generate_nanoid, primary_key=True) - observer: Mapped[str] = mapped_column(TEXT, index=True) - observed: Mapped[str] = mapped_column(TEXT, index=True) + observer: Mapped[str] = mapped_column(TEXT) + observed: Mapped[str] = mapped_column(TEXT) created_at: Mapped[datetime.datetime] = mapped_column( - DateTime(timezone=True), index=True, default=func.now() + DateTime(timezone=True), server_default=func.now() + ) + h_metadata: Mapped[dict[str, Any]] = mapped_column( + "metadata", JSONB, default=dict, server_default=text("'{}'::jsonb") ) - h_metadata: Mapped[dict[str, Any]] = mapped_column("metadata", JSONB, default=dict) internal_metadata: Mapped[dict[str, Any]] = mapped_column( - "internal_metadata", JSONB, default=dict + "internal_metadata", JSONB, default=dict, server_default=text("'{}'::jsonb") ) documents = relationship( "Document", back_populates="collection", cascade="all, delete, delete-orphan" ) workspace_name: Mapped[str] = mapped_column( - ForeignKey("workspaces.name"), index=True + ForeignKey("workspaces.name"), ) __table_args__ = ( @@ -321,6 +367,10 @@ class Collection(Base): ["observed", "workspace_name"], ["peers.name", "peers.workspace_name"], ), + Index("idx_collections_observer", "observer"), + Index("idx_collections_observed", "observed"), + Index("ix_collections_created_at", "created_at"), + Index("ix_collections_workspace_name", "workspace_name"), ) @@ -329,20 +379,18 @@ class Document(Base): __tablename__: str = "documents" id: Mapped[str] = mapped_column(TEXT, default=generate_nanoid, primary_key=True) internal_metadata: Mapped[dict[str, Any]] = mapped_column( - "internal_metadata", JSONB, default=dict + "internal_metadata", JSONB, default=dict, server_default=text("'{}'::jsonb") ) content: Mapped[str] = mapped_column(TEXT) embedding: MappedColumn[Any] = mapped_column(Vector(1536)) created_at: Mapped[datetime.datetime] = mapped_column( - DateTime(timezone=True), index=True, default=func.now() + DateTime(timezone=True), server_default=func.now() ) - observer: Mapped[str] = mapped_column(TEXT, index=True) - observed: Mapped[str] = mapped_column(TEXT, index=True) - workspace_name: Mapped[str] = mapped_column( - ForeignKey("workspaces.name"), index=True - ) - session_name: Mapped[str] = mapped_column(TEXT, index=True) + observer: Mapped[str] = mapped_column(TEXT) + observed: Mapped[str] = mapped_column(TEXT) + workspace_name: Mapped[str] = mapped_column(ForeignKey("workspaces.name")) + session_name: Mapped[str] = mapped_column(TEXT) collection = relationship("Collection", back_populates="documents") __table_args__ = ( @@ -383,6 +431,11 @@ class Document(Base): "embedding": "vector_cosine_ops" }, # Cosine distance operator ), + Index("idx_documents_observer", "observer"), + Index("idx_documents_observed", "observed"), + Index("idx_documents_session_name", "session_name"), + Index("ix_documents_created_at", "created_at"), + Index("ix_documents_workspace_name", "workspace_name"), ) @@ -395,17 +448,22 @@ class QueueItem(Base): id: Mapped[int] = mapped_column( BigInteger, Identity(), primary_key=True, autoincrement=True ) - session_id: Mapped[str] = mapped_column( - ForeignKey("sessions.id"), index=True, nullable=True - ) + session_id: Mapped[str] = mapped_column(ForeignKey("sessions.id"), nullable=True) work_unit_key: Mapped[str] = mapped_column(TEXT, nullable=False) task_type: Mapped[TaskType] = mapped_column(TEXT, nullable=False) payload: Mapped[dict[str, Any]] = mapped_column(JSONB, nullable=False) - processed: Mapped[bool] = mapped_column(Boolean, default=False) + processed: Mapped[bool] = mapped_column( + Boolean, default=False, server_default=text("false") + ) error: Mapped[str | None] = mapped_column(TEXT, nullable=True) created_at: Mapped[datetime.datetime] = mapped_column( - DateTime(timezone=True), index=True, default=func.now() + DateTime(timezone=True), server_default=func.now() + ) + + __table_args__ = ( + Index("ix_queue_created_at", "created_at"), + Index("ix_queue_session_id", "session_id"), ) def __repr__(self) -> str: @@ -418,10 +476,10 @@ class ActiveQueueSession(Base): id: Mapped[str] = mapped_column(TEXT, default=generate_nanoid, primary_key=True) - work_unit_key: Mapped[str] = mapped_column(TEXT, unique=True, index=True) + work_unit_key: Mapped[str] = mapped_column(TEXT, unique=True) last_updated: Mapped[datetime.datetime] = mapped_column( - DateTime(timezone=True), default=func.now(), onupdate=func.now() + DateTime(timezone=True), server_default=func.now(), onupdate=func.now() ) @@ -430,11 +488,11 @@ class WebhookEndpoint(Base): __tablename__: str = "webhook_endpoints" id: Mapped[str] = mapped_column(TEXT, default=generate_nanoid, primary_key=True) workspace_name: Mapped[str] = mapped_column( - ForeignKey("workspaces.name"), index=True, nullable=False + ForeignKey("workspaces.name"), nullable=False ) url: Mapped[str] = mapped_column(TEXT, nullable=False) created_at: Mapped[datetime.datetime] = mapped_column( - DateTime(timezone=True), default=func.now() + DateTime(timezone=True), server_default=func.now() ) workspace = relationship("Workspace", back_populates="webhook_endpoints") diff --git a/tests/alembic/revisions/__init__.py b/tests/alembic/revisions/__init__.py index 359e7b1f..988130db 100644 --- a/tests/alembic/revisions/__init__.py +++ b/tests/alembic/revisions/__init__.py @@ -2,6 +2,7 @@ from . import ( test_05486ce795d5_make_session_name_required_on_messages, + test_066e87ca5b07_align_schema_with_declarative_models, test_08894082221a_replace_collection_name_with_observer_, test_20f89a421aff_rename_metamessage_type_to_label, test_66e63cf2cf77_add_indexes_to_documents_table, @@ -19,6 +20,7 @@ from . import ( __all__ = [ "test_05486ce795d5_make_session_name_required_on_messages", + "test_066e87ca5b07_align_schema_with_declarative_models", "test_08894082221a_replace_collection_name_with_observer_", "test_20f89a421aff_rename_metamessage_type_to_label", "test_556a16564f50_add_user_id_and_app_id_to_tables", diff --git a/tests/alembic/revisions/test_066e87ca5b07_align_schema_with_declarative_models.py b/tests/alembic/revisions/test_066e87ca5b07_align_schema_with_declarative_models.py new file mode 100644 index 00000000..40d396bc --- /dev/null +++ b/tests/alembic/revisions/test_066e87ca5b07_align_schema_with_declarative_models.py @@ -0,0 +1,42 @@ +"""Hooks for revision 066e87ca5b07 (align_schema_with_declarative_models).""" + +from __future__ import annotations + +from tests.alembic.registry import register_after_upgrade, register_before_upgrade +from tests.alembic.verifier import MigrationVerifier + + +@register_before_upgrade("066e87ca5b07") +def prepare_align_schema_with_declarative_models(verifier: MigrationVerifier) -> None: + """Seed state and assertions before upgrading to 066e87ca5b07.""" + # Assert columns exist but are nullable before migration + verifier.assert_column_exists( + "active_queue_sessions", "work_unit_key", exists=True, nullable=True + ) + verifier.assert_column_exists("documents", "embedding", exists=True, nullable=True) + + # Assert FK constraint does not exist yet + verifier.assert_constraint_exists( + "queue", "fk_queue_session_id", "foreign_key", exists=False + ) + + +@register_after_upgrade("066e87ca5b07") +def verify_align_schema_with_declarative_models(verifier: MigrationVerifier) -> None: + """Add assertions validating the effects of 066e87ca5b07.""" + # Assert columns are now non-nullable + verifier.assert_column_exists( + "peers", "workspace_name", exists=True, nullable=False + ) + verifier.assert_column_exists( + "sessions", "workspace_name", exists=True, nullable=False + ) + verifier.assert_column_exists( + "active_queue_sessions", "work_unit_key", exists=True, nullable=False + ) + verifier.assert_column_exists("documents", "embedding", exists=True, nullable=False) + + # Assert FK constraint now exists + verifier.assert_constraint_exists( + "queue", "fk_queue_session_id", "foreign_key", exists=True + ) diff --git a/tests/alembic/revisions/test_e9b705f9adf9_add_server_defaults_to_timestamp_.py b/tests/alembic/revisions/test_e9b705f9adf9_add_server_defaults_to_timestamp_.py new file mode 100644 index 00000000..31d9c6c4 --- /dev/null +++ b/tests/alembic/revisions/test_e9b705f9adf9_add_server_defaults_to_timestamp_.py @@ -0,0 +1,284 @@ +"""Hooks for revision e9b705f9adf9 (add server defaults to timestamp, boolean, and jsonb columns).""" + +from __future__ import annotations + +from nanoid import generate as generate_nanoid +from sqlalchemy import text + +from tests.alembic.registry import register_after_upgrade, register_before_upgrade +from tests.alembic.verifier import MigrationVerifier + +# Test data IDs +WORKSPACE_ID = generate_nanoid() +PEER_ID = generate_nanoid() +SESSION_ID = generate_nanoid() +MESSAGE_ID = generate_nanoid() +COLLECTION_ID = generate_nanoid() +DOCUMENT_ID = generate_nanoid() + + +@register_before_upgrade("e9b705f9adf9") +def prepare_add_server_defaults(verifier: MigrationVerifier) -> None: + """Seed state before upgrading to e9b705f9adf9. + + This migration adds server defaults to timestamp, JSONB, and boolean columns. + We verify that columns exist but don't have server defaults before the migration. + """ + conn = verifier.conn + schema = verifier.schema + inspector = verifier.get_inspector() + + # Sample timestamp columns to check - they should exist but without server defaults + for table, column in [ + ("workspaces", "created_at"), + ("peers", "created_at"), + ("sessions", "created_at"), + ("messages", "created_at"), + ("collections", "created_at"), + ("documents", "created_at"), + ("queue", "created_at"), + ]: + columns = inspector.get_columns(table, schema=schema) + col_info = next((c for c in columns if c["name"] == column), None) + assert ( + col_info is not None + ), f"Column {table}.{column} should exist before migration" + + # Create test data to ensure existing rows work after migration + conn.execute( + text( + f'INSERT INTO "{schema}"."workspaces" ' + + '("id", "name", "created_at", "metadata", "internal_metadata", "configuration") ' + + "VALUES (:id, :name, NOW(), :metadata, :internal_metadata, :configuration)" + ), + { + "id": WORKSPACE_ID, + "name": "test-workspace", + "metadata": "{}", + "internal_metadata": "{}", + "configuration": "{}", + }, + ) + + conn.execute( + text( + f'INSERT INTO "{schema}"."peers" ' + + '("id", "name", "workspace_name", "created_at", "metadata", "internal_metadata", "configuration") ' + + "VALUES (:id, :name, :workspace_name, NOW(), :metadata, :internal_metadata, :configuration)" + ), + { + "id": PEER_ID, + "name": "test-peer", + "workspace_name": "test-workspace", + "metadata": "{}", + "internal_metadata": "{}", + "configuration": "{}", + }, + ) + + conn.execute( + text( + f'INSERT INTO "{schema}"."sessions" ' + + '("id", "name", "workspace_name", "created_at", "is_active", "metadata", "internal_metadata", "configuration") ' + + "VALUES (:id, :name, :workspace_name, NOW(), true, :metadata, :internal_metadata, :configuration)" + ), + { + "id": SESSION_ID, + "name": "test-session", + "workspace_name": "test-workspace", + "metadata": "{}", + "internal_metadata": "{}", + "configuration": "{}", + }, + ) + + +@register_after_upgrade("e9b705f9adf9") +def verify_add_server_defaults(verifier: MigrationVerifier) -> None: + """Validate server defaults were added correctly to all columns.""" + conn = verifier.conn + schema = verifier.schema + inspector = verifier.get_inspector() + + # Verify timestamp columns have server defaults (now() function) + timestamp_columns = [ + ("workspaces", "created_at"), + ("peers", "created_at"), + ("sessions", "created_at"), + ("messages", "created_at"), + ("message_embeddings", "created_at"), + ("collections", "created_at"), + ("documents", "created_at"), + ("queue", "created_at"), + ("webhook_endpoints", "created_at"), + ("session_peers", "joined_at"), + ("active_queue_sessions", "last_updated"), + ] + + for table, column in timestamp_columns: + columns = inspector.get_columns(table, schema=schema) + col_info = next((c for c in columns if c["name"] == column), None) + assert ( + col_info is not None + ), f"Column {table}.{column} not found after migration" + + # Check that a server default exists + default = col_info.get("default") + assert default is not None, ( + f"Column {table}.{column} should have a server default after migration, " + f"but default is None" + ) + + # Verify JSONB columns have server defaults (empty object '{}') + jsonb_columns = [ + ("workspaces", "metadata"), + ("workspaces", "internal_metadata"), + ("workspaces", "configuration"), + ("peers", "metadata"), + ("peers", "internal_metadata"), + ("peers", "configuration"), + ("sessions", "metadata"), + ("sessions", "internal_metadata"), + ("sessions", "configuration"), + ("messages", "metadata"), + ("messages", "internal_metadata"), + ("collections", "metadata"), + ("collections", "internal_metadata"), + ("documents", "internal_metadata"), + ("session_peers", "configuration"), + ("session_peers", "internal_metadata"), + ] + + for table, column in jsonb_columns: + columns = inspector.get_columns(table, schema=schema) + col_info = next((c for c in columns if c["name"] == column), None) + assert ( + col_info is not None + ), f"Column {table}.{column} not found after migration" + + # Check that a server default exists + default = col_info.get("default") + assert default is not None, ( + f"Column {table}.{column} should have a server default after migration, " + f"but default is None" + ) + + # Verify boolean columns have server defaults + boolean_columns = [ + ("sessions", "is_active", "true"), + ("queue", "processed", "false"), + ] + + for table, column, expected_default in boolean_columns: + columns = inspector.get_columns(table, schema=schema) + col_info = next((c for c in columns if c["name"] == column), None) + assert ( + col_info is not None + ), f"Column {table}.{column} not found after migration" + + # Check that a server default exists + default = col_info.get("default") + assert default is not None, ( + f"Column {table}.{column} should have a server default after migration, " + f"but default is None" + ) + + assert ( + default == expected_default + ), f"Column {table}.{column} should have a server default of {expected_default} after migration, but default is {default}" + + # Test that defaults actually work by inserting rows without explicit values + test_workspace_id = generate_nanoid() + conn.execute( + text( + f'INSERT INTO "{schema}"."workspaces" ("id", "name") ' + + "VALUES (:id, :name)" + ), + {"id": test_workspace_id, "name": "test-defaults-workspace"}, + ) + + # Verify the inserted workspace has default values + workspace = conn.execute( + text( + 'SELECT "created_at", "metadata", "internal_metadata", "configuration" ' + + f'FROM "{schema}"."workspaces" WHERE "id" = :id' + ), + {"id": test_workspace_id}, + ).one() + + assert workspace.created_at is not None, "created_at should be auto-populated" + assert workspace.metadata == {}, "metadata should default to empty object" + assert ( + workspace.internal_metadata == {} + ), "internal_metadata should default to empty object" + assert workspace.configuration == {}, "configuration should default to empty object" + + # Test peer defaults + test_peer_id = generate_nanoid() + conn.execute( + text( + f'INSERT INTO "{schema}"."peers" ("id", "name", "workspace_name") ' + + "VALUES (:id, :name, :workspace_name)" + ), + { + "id": test_peer_id, + "name": "test-defaults-peer", + "workspace_name": "test-defaults-workspace", + }, + ) + + peer = conn.execute( + text( + 'SELECT "created_at", "metadata", "internal_metadata", "configuration" ' + + f'FROM "{schema}"."peers" WHERE "id" = :id' + ), + {"id": test_peer_id}, + ).one() + + assert peer.created_at is not None, "peer created_at should be auto-populated" + assert peer.metadata == {}, "peer metadata should default to empty object" + assert ( + peer.internal_metadata == {} + ), "peer internal_metadata should default to empty object" + assert peer.configuration == {}, "peer configuration should default to empty object" + + # Test session defaults (including boolean is_active) + test_session_id = generate_nanoid() + conn.execute( + text( + f'INSERT INTO "{schema}"."sessions" ("id", "name", "workspace_name") ' + + "VALUES (:id, :name, :workspace_name)" + ), + { + "id": test_session_id, + "name": "test-defaults-session", + "workspace_name": "test-defaults-workspace", + }, + ) + + session = conn.execute( + text( + 'SELECT "created_at", "is_active", "metadata", "internal_metadata", "configuration" ' + + f'FROM "{schema}"."sessions" WHERE "id" = :id' + ), + {"id": test_session_id}, + ).one() + + assert session.created_at is not None, "session created_at should be auto-populated" + assert session.is_active is True, "session is_active should default to true" + assert session.metadata == {}, "session metadata should default to empty object" + assert ( + session.internal_metadata == {} + ), "session internal_metadata should default to empty object" + assert ( + session.configuration == {} + ), "session configuration should default to empty object" + + # Verify pre-existing data still exists + existing_workspace = conn.execute( + text(f'SELECT "id" FROM "{schema}"."workspaces" WHERE "id" = :id'), + {"id": WORKSPACE_ID}, + ).one_or_none() + assert ( + existing_workspace is not None + ), "Pre-existing workspace should still exist after migration" From 1d0934a5685cb73111e910e58f07e25bb7bd88d2 Mon Sep 17 00:00:00 2001 From: Rajat Ahuja Date: Mon, 3 Nov 2025 15:33:48 -0500 Subject: [PATCH 07/13] fix: message seq in session N+1 (#261) * fix: message seq in session N+1 * test: behavior of enqueue * fix: test * chore: Code Rabbit Comments --------- Co-authored-by: Vineeth Voruganti <13438633+VVoruganti@users.noreply.github.com> --- src/routers/messages.py | 4 +- tests/integration/test_enqueue.py | 144 ++++++++++++++++++++++++++++++ 2 files changed, 146 insertions(+), 2 deletions(-) diff --git a/src/routers/messages.py b/src/routers/messages.py index 259fc9d7..5cbc9efe 100644 --- a/src/routers/messages.py +++ b/src/routers/messages.py @@ -71,7 +71,7 @@ async def create_messages_for_session( "peer_name": message.peer_name, "created_at": message.created_at, "message_public_id": message.public_id, - "message_seq_in_session": message.seq_in_session, + "seq_in_session": message.seq_in_session, } for message in created_messages ] @@ -135,7 +135,7 @@ async def create_messages_with_file( "peer_name": message.peer_name, "created_at": message.created_at, "message_public_id": message.public_id, - "message_seq_in_session": message.seq_in_session, + "seq_in_session": message.seq_in_session, } for message in created_messages ] diff --git a/tests/integration/test_enqueue.py b/tests/integration/test_enqueue.py index 5b1870e8..6e5fda30 100644 --- a/tests/integration/test_enqueue.py +++ b/tests/integration/test_enqueue.py @@ -9,6 +9,7 @@ from sqlalchemy.ext.asyncio import AsyncSession from src import crud, models, schemas from src.deriver import enqueue +from src.deriver.enqueue import generate_queue_records from src.models import Peer, QueueItem, Workspace @@ -1379,3 +1380,146 @@ class TestAdvancedEnqueueEdgeCases: assert len(actual_payloads) == len(expected_payloads) for expected in expected_payloads: assert expected in actual_payloads + + +@pytest.mark.asyncio +class TestGenerateQueueRecordsSeqInSession: + """Unit tests for generate_queue_records function focusing on seq_in_session handling""" + + async def test_generate_queue_records_uses_seq_from_payload_not_crud( + self, + db_session: AsyncSession, + sample_data: tuple[Workspace, Peer], + ): + """ + Test that generate_queue_records uses seq_in_session from payload + instead of making a CRUD call to get_message_seq_in_session. + """ + + test_workspace, test_peer = sample_data + + # Create a test session + test_session = models.Session( + workspace_name=test_workspace.name, name=str(generate_nanoid()) + ) + db_session.add(test_session) + await db_session.commit() + + # Create a message payload with seq_in_session included + message_payload = { + "message_id": 12345, + "peer_name": test_peer.name, + "workspace_name": test_workspace.name, + "session_name": test_session.name, + "content": "Test message", + "seq_in_session": 20, # Multiple of MESSAGES_PER_SHORT_SUMMARY to trigger summary creation + "created_at": datetime.now(timezone.utc), # Required by create_payload + } + + # Mock the CRUD function to track if it's called + # Also enable summary generation in settings + with ( + patch("src.deriver.enqueue.crud.get_message_seq_in_session") as mock_crud, + patch("src.deriver.enqueue.settings.SUMMARY.ENABLED", new=True), + ): + mock_crud.return_value = 200 + mock_db_session = AsyncMock() + + peers_config: dict[str, list[Any]] = { + test_peer.name: [ + {"observe_me": True}, + {"observe_others": True}, + ] + } + records = await generate_queue_records( + db_session=mock_db_session, + message=message_payload, + peers_with_configuration=peers_config, + session_id=test_session.id, + deriver_disabled=False, + ) + + mock_crud.assert_not_called() + + assert len(records) > 0 + + summary_records = [r for r in records if r["task_type"] == "summary"] + assert len(summary_records) > 0, "Expected summary records to be created" + for record in summary_records: + assert ( + record["payload"]["message_seq_in_session"] + != mock_crud.return_value + ) + assert record["payload"]["message_seq_in_session"] == 20 + + async def test_generate_queue_records_falls_back_to_crud_when_seq_missing( + self, + db_session: AsyncSession, + sample_data: tuple[Workspace, Peer], + ): + """ + Test that generate_queue_records falls back to CRUD call + when seq_in_session is missing from payload. + + This is the fallback behavior for backward compatibility. + """ + + test_workspace, test_peer = sample_data + + # Create a test session + test_session = models.Session( + workspace_name=test_workspace.name, name=str(generate_nanoid()) + ) + db_session.add(test_session) + await db_session.commit() + + # Create a message payload WITHOUT seq_in_session + message_payload = { + "message_id": 12345, + "peer_name": test_peer.name, + "workspace_name": test_workspace.name, + "session_name": test_session.name, + "content": "Test message", + "created_at": datetime.now(timezone.utc), + # seq_in_session is MISSING + } + + # Mock the CRUD function and enable summary generation in settings + with ( + patch("src.deriver.enqueue.crud.get_message_seq_in_session") as mock_crud, + patch("src.deriver.enqueue.settings.SUMMARY.ENABLED", True), + ): + mock_crud.return_value = ( + 60 # Multiple of MESSAGES_PER_LONG_SUMMARY to trigger summary creation + ) + + mock_db_session = AsyncMock() + + peers_config: dict[str, list[Any]] = { + test_peer.name: [ + {"observe_me": True}, + {"observe_others": True}, + ] + } + records = await generate_queue_records( + db_session=mock_db_session, + message=message_payload, + peers_with_configuration=peers_config, + session_id=test_session.id, + deriver_disabled=False, + ) + + # The CRUD function SHOULD have been called as fallback + mock_crud.assert_called_once_with( + mock_db_session, + workspace_name=test_workspace.name, + session_name=test_session.name, + message_id=12345, + ) + + # Verify that records were created with the fallback value + summary_records = [r for r in records if r["task_type"] == "summary"] + assert len(summary_records) > 0, "Expected summary records to be created" + for record in summary_records: + # Should use the value from CRUD fallback (60) + assert record["payload"]["message_seq_in_session"] == 60 From a25be3c13645a76d92140a27e6254c71326bc50c Mon Sep 17 00:00:00 2001 From: Vineeth Voruganti <13438633+VVoruganti@users.noreply.github.com> Date: Tue, 4 Nov 2025 10:41:58 -0500 Subject: [PATCH 08/13] chore: Readme & Changelog Updates (#263) * chore: Readme & Changelog Updates * chore: (typos) Clarify Changelog --- CHANGELOG.md | 13 +++++++++++++ README.md | 2 +- docs/changelog/compatibility-guide.mdx | 5 +++-- docs/changelog/introduction.mdx | 16 +++++++++++++++- docs/docs.json | 2 +- pyproject.toml | 11 ++++++++++- src/main.py | 2 +- uv.lock | 2 +- 8 files changed, 45 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1fdd2e90..68b7e316 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,19 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/) and this project adheres to [Semantic Versioning](http://semver.org/). +## [2.4.2] - 2025-11-03 + +### Fixed + +- Langfuse tracing to have readable waterfalls +- Alembic Migrations to match models.py +- message_in_seq correctly included in webhook payload + +### Changed + +- Alembic to always use a session pooler +- Statement timeout during alembic operations to 5 min + ## [2.4.1] - 2025-10-24 ### Added diff --git a/README.md b/README.md index 452f487b..baac9e39 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ --- -![Static Badge](https://img.shields.io/badge/Version-2.4.1-blue) +![Static Badge](https://img.shields.io/badge/Version-2.4.2-blue) [![PyPI version](https://img.shields.io/pypi/v/honcho-ai.svg)](https://pypi.org/project/honcho-ai/) [![NPM version](https://img.shields.io/npm/v/@honcho-ai/sdk.svg)](https://npmjs.org/package/@honcho-ai/sdk) [![Discord](https://img.shields.io/discord/1016845111637839922?style=flat&logo=discord&logoColor=23ffffff&label=Plastic%20Labs&labelColor=235865F2)](https://discord.gg/plasticlabs) diff --git a/docs/changelog/compatibility-guide.mdx b/docs/changelog/compatibility-guide.mdx index edcc8fdd..2b9f67a7 100644 --- a/docs/changelog/compatibility-guide.mdx +++ b/docs/changelog/compatibility-guide.mdx @@ -8,7 +8,7 @@ This guide helps you understand which versions of Honcho's API are compatible wi ## Version Compatibility -### Honcho API v2.4.1 (Current) +### Honcho API v2.4.2 (Current) @@ -35,7 +35,8 @@ This guide helps you understand which versions of Honcho's API are compatible wi | Honcho API Version | TypeScript SDK | Python SDK | |-------------------|---------------|------------| -| v2.4.1 (Current) | v1.5.0 | v1.5.0 | +| v2.4.2 (Current) | v1.5.0 | v1.5.0 | +| v2.4.1 | v1.5.0 | v1.5.0 | | v2.4.0 | v1.5.0 | v1.5.0 | | v2.3.3 | v1.4.1 | v1.4.1 | | v2.3.2 | v1.4.0 | v1.4.0 | diff --git a/docs/changelog/introduction.mdx b/docs/changelog/introduction.mdx index 4edab9dc..ff9946a5 100644 --- a/docs/changelog/introduction.mdx +++ b/docs/changelog/introduction.mdx @@ -27,7 +27,21 @@ Welcome to the Honcho changelog! This section documents all notable changes to t ### Honcho API and SDK Changelogs - + + ### Fixed + + - Langfuse tracing to have readable waterfalls + - Alembic Migrations to match models.py + - message_in_seq correctly included in webhook payload + + + ### Changed + + - Alembic to always use a session pooler + - Statement timeout during alembic operations to 5 min + + + ### Added - Alembic migration validation test suite diff --git a/docs/docs.json b/docs/docs.json index 4a9a6412..74f0f139 100644 --- a/docs/docs.json +++ b/docs/docs.json @@ -19,7 +19,7 @@ "navigation": { "versions": [ { - "version": "v2.4.1", + "version": "v2.4.2", "api": { "openapi": [ "openapi.documented.yml" diff --git a/pyproject.toml b/pyproject.toml index 6c9b037c..f39dcec5 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "honcho" -version = "2.4.1" +version = "2.4.2" description = "Honcho Server" authors = [ {name = "Plastic Labs", email = "hello@plasticlabs.ai"}, @@ -85,6 +85,15 @@ addopts = "--strict-markers --cov=src/ --cov=sdks/python/src/honcho --cov-report testpaths = ["tests"] pythonpath = ["src"] +[tool.coverage.report] +exclude_lines = [ + "pragma: no cover", + "def __repr__", + "raise AssertionError", + "raise NotImplementedError", + "if __name__ == .__main__.:", + "if TYPE_CHECKING:", +] [tool.basedpyright] # BasedPyright currently seems like the best type checker option, much faster diff --git a/src/main.py b/src/main.py index 412822d2..0ea88272 100644 --- a/src/main.py +++ b/src/main.py @@ -123,7 +123,7 @@ app = FastAPI( title="Honcho API", summary="The Identity Layer for the Agentic World", description="""Honcho is a platform for giving agents user-centric memory and social cognition""", - version="2.4.1", + version="2.4.2", contact={ "name": "Plastic Labs", "url": "https://honcho.dev", diff --git a/uv.lock b/uv.lock index dfe736ee..43347634 100644 --- a/uv.lock +++ b/uv.lock @@ -673,7 +673,7 @@ wheels = [ [[package]] name = "honcho" -version = "2.4.1" +version = "2.4.2" source = { virtual = "." } dependencies = [ { name = "alembic" }, From 822059b81a7fd4ce73ceae68d6e78108d7b7b123 Mon Sep 17 00:00:00 2001 From: Vineeth Voruganti <13438633+VVoruganti@users.noreply.github.com> Date: Wed, 5 Nov 2025 17:40:53 -0500 Subject: [PATCH 09/13] Step Function Improvement on Docs (#241) * feat: Release PR for v2.4.0 * chore: initial re-organization pass * chore: in progress edits * fix: WIP Restructure * fix: docs introduction section * fix: Populates new features pages * fix: Code Rabbit grammatical catches * chore: make system diagram visible by default --- docs/changelog/compatibility-guide.mdx | 1 - docs/docs.json | 115 +++++-------- docs/images/overview/honcho-overview-dark.svg | 4 + .../images/overview/honcho-overview-light.png | Bin 0 -> 423666 bytes .../images/overview/honcho-overview-light.svg | 4 + .../honcho-overview-no-background.png | Bin 0 -> 428132 bytes docs/images/overview/honcho-overview.svg | 4 + .../overview-shields.mdx | 0 .../core-concepts/architecture.mdx | 51 ++++-- .../core-concepts/configuration.mdx | 2 +- .../documentation/core-concepts/features.mdx | 44 ----- .../features}/dialectic-endpoint.mdx | 0 .../core-concepts/features}/file-uploads.mdx | 0 .../core-concepts/features}/get-context.mdx | 2 +- .../features/local-vs-global.mdx | 68 ++++++++ .../core-concepts/features/queue-status.mdx | 132 +++++++++++++++ .../core-concepts/features}/search.mdx | 0 .../core-concepts/features/storing-data.mdx | 61 +++++++ .../features}/streaming-response.mdx | 0 .../core-concepts/features}/using-filters.mdx | 0 .../core-concepts/features}/working-rep.mdx | 0 .../documentation/introduction/overview.mdx | 134 +++++++-------- .../documentation/introduction/quickstart.mdx | 158 ++++++++++++++---- .../documentation/introduction/vibecoding.mdx | 12 +- docs/v2/documentation/reference/platform.mdx | 4 +- docs/v2/guides/overview.mdx | 46 ++--- 26 files changed, 566 insertions(+), 276 deletions(-) create mode 100644 docs/images/overview/honcho-overview-dark.svg create mode 100644 docs/images/overview/honcho-overview-light.png create mode 100644 docs/images/overview/honcho-overview-light.svg create mode 100644 docs/images/overview/honcho-overview-no-background.png create mode 100644 docs/images/overview/honcho-overview.svg rename docs/{_snippets => snippets}/overview-shields.mdx (100%) delete mode 100644 docs/v2/documentation/core-concepts/features.mdx rename docs/v2/{guides => documentation/core-concepts/features}/dialectic-endpoint.mdx (100%) rename docs/v2/{guides => documentation/core-concepts/features}/file-uploads.mdx (100%) rename docs/v2/{guides => documentation/core-concepts/features}/get-context.mdx (99%) create mode 100644 docs/v2/documentation/core-concepts/features/local-vs-global.mdx create mode 100644 docs/v2/documentation/core-concepts/features/queue-status.mdx rename docs/v2/{guides => documentation/core-concepts/features}/search.mdx (100%) create mode 100644 docs/v2/documentation/core-concepts/features/storing-data.mdx rename docs/v2/{guides => documentation/core-concepts/features}/streaming-response.mdx (100%) rename docs/v2/{guides => documentation/core-concepts/features}/using-filters.mdx (100%) rename docs/v2/{guides => documentation/core-concepts/features}/working-rep.mdx (100%) diff --git a/docs/changelog/compatibility-guide.mdx b/docs/changelog/compatibility-guide.mdx index 2b9f67a7..883ee2d6 100644 --- a/docs/changelog/compatibility-guide.mdx +++ b/docs/changelog/compatibility-guide.mdx @@ -30,7 +30,6 @@ This guide helps you understand which versions of Honcho's API are compatible wi - ## Version Compatibility Table | Honcho API Version | TypeScript SDK | Python SDK | diff --git a/docs/docs.json b/docs/docs.json index 74f0f139..323fca93 100644 --- a/docs/docs.json +++ b/docs/docs.json @@ -3,27 +3,20 @@ "theme": "mint", "name": "Honcho", "colors": { - "primary": "#86BCF2", + "primary": "#66AAFF", "dark": "#151E27", - "light": "#B5D9FD" + "light": "#86BCF2" }, "favicon": "/favicon.svg", "contextual": { - "options": [ - "copy", - "view", - "chatgpt", - "claude" - ] + "options": ["copy", "view", "chatgpt", "claude"] }, "navigation": { "versions": [ { "version": "v2.4.2", "api": { - "openapi": [ - "openapi.documented.yml" - ] + "openapi": ["openapi.documented.yml"] }, "tabs": [ { @@ -41,10 +34,19 @@ "group": "Core Concepts", "pages": [ "v2/documentation/core-concepts/architecture", - "v2/documentation/core-concepts/glossary", - "v2/documentation/core-concepts/features", + "v2/documentation/core-concepts/features/storing-data", + "v2/documentation/core-concepts/features/dialectic-endpoint", + "v2/documentation/core-concepts/features/get-context", + "v2/documentation/core-concepts/features/search", + "v2/documentation/core-concepts/features/working-rep", + "v2/documentation/core-concepts/features/streaming-response", + "v2/documentation/core-concepts/features/using-filters", + "v2/documentation/core-concepts/features/file-uploads", + "v2/documentation/core-concepts/features/queue-status", + "v2/documentation/core-concepts/features/local-vs-global", "v2/documentation/core-concepts/configuration", - "v2/documentation/core-concepts/summarizer" + "v2/documentation/core-concepts/summarizer", + "v2/documentation/core-concepts/glossary" ] }, { @@ -61,54 +63,21 @@ "groups": [ { "group": "Getting Started", - "pages": [ - "v2/guides/overview", - "v2/guides/mcp" - ] + "pages": ["v2/guides/overview", "v2/guides/mcp"] }, { "group": "Application Interfaces", - "pages": [ - "v2/guides/discord", - "v2/guides/telegram" - ] - }, - { - "group": "Design Patterns", - "pages": [ - "v2/guides/dialectic-endpoint", - "v2/guides/get-context", - "v2/guides/search", - "v2/guides/working-rep", - "v2/guides/streaming-response", - "v2/guides/using-filters", - "v2/guides/file-uploads" - ] - } - ] - }, - { - "tab": "Contributing", - "groups": [ - { - "group": "Contributing", - "pages": [ - "v2/contributing/guidelines", - "v2/contributing/self-hosting", - "v2/contributing/configuration", - "v2/contributing/license" - ] + "pages": ["v2/guides/discord", "v2/guides/telegram"] } ] }, + { "tab": "API Reference", "groups": [ { "group": "API Documentation", - "pages": [ - "v2/api-reference/introduction" - ] + "pages": ["v2/api-reference/introduction"] }, { "group": "workspaces", @@ -192,15 +161,27 @@ ] } ] + }, + { + "tab": "Contributing", + "groups": [ + { + "group": "Contributing", + "pages": [ + "v2/contributing/guidelines", + "v2/contributing/self-hosting", + "v2/contributing/configuration", + "v2/contributing/license" + ] + } + ] } ] }, { "version": "v1.1.0", "api": { - "openapi": [ - "openapi.json" - ] + "openapi": ["openapi.json"] }, "tabs": [ { @@ -230,23 +211,15 @@ "groups": [ { "group": "Getting Started", - "pages": [ - "v1/guides/overview", - "v1/guides/streaming-response" - ] + "pages": ["v1/guides/overview", "v1/guides/streaming-response"] }, { "group": "Application Interfaces", - "pages": [ - "v1/guides/discord", - "v1/guides/honcho-mcp" - ] + "pages": ["v1/guides/discord", "v1/guides/honcho-mcp"] }, { "group": "Personal Memory", - "pages": [ - "v1/guides/dialectic-endpoint" - ] + "pages": ["v1/guides/dialectic-endpoint"] } ] }, @@ -255,9 +228,7 @@ "groups": [ { "group": "API Documentation", - "pages": [ - "v1/api-reference/introduction" - ] + "pages": ["v1/api-reference/introduction"] }, { "group": "apps", @@ -305,9 +276,7 @@ }, { "group": "keys", - "pages": [ - "v1/api-reference/endpoint/keys/create-key" - ] + "pages": ["v1/api-reference/endpoint/keys/create-key"] }, { "group": "metamessages", @@ -360,9 +329,9 @@ "global": { "anchors": [ { - "anchor": "Managed Platform", + "anchor": "Dashboard", "href": "https://app.honcho.dev", - "icon": "book-open-cover" + "icon": "table-columns" }, { "anchor": "Community", diff --git a/docs/images/overview/honcho-overview-dark.svg b/docs/images/overview/honcho-overview-dark.svg new file mode 100644 index 00000000..753eb87b --- /dev/null +++ b/docs/images/overview/honcho-overview-dark.svg @@ -0,0 +1,4 @@ + + +Store Messages inHonchoIngestionHoncho Store Messages in LongTerm MemoryLong Term Memory StoreSends Message toReasoning EngineHoncho APIHonchoReasoningEngineMessagesPeer CardsSummariesRepresentationsSends Derived Insights to LongTerm MemoryMessagesHoncho APIGet ContextChatSearchWorking RepresentationsRetreival diff --git a/docs/images/overview/honcho-overview-light.png b/docs/images/overview/honcho-overview-light.png new file mode 100644 index 0000000000000000000000000000000000000000..3a5b50e591d79206128c4161117b42e09b65218a GIT binary patch literal 423666 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 SZf@a@I!`y)29 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

AVijJ_}9{6rE%=yh^ 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

fNBvirLjkD=jnY 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 z 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 Bi`W1F literal 0 HcmV?d00001 diff --git a/docs/images/overview/honcho-overview-light.svg b/docs/images/overview/honcho-overview-light.svg new file mode 100644 index 00000000..704f7ec9 --- /dev/null +++ b/docs/images/overview/honcho-overview-light.svg @@ -0,0 +1,4 @@ + + +Store Messages inHonchoIngestionHoncho Store Messages in LongTerm MemoryLong Term Memory StoreSends Message toReasoning EngineHoncho APIHonchoReasoningEngineMessagesPeer CardsSummariesRepresentationsSends Derived Insights to LongTerm MemoryMessagesHoncho APIGet ContextChatSearchWorking RepresentationsRetreival diff --git a/docs/images/overview/honcho-overview-no-background.png b/docs/images/overview/honcho-overview-no-background.png new file mode 100644 index 0000000000000000000000000000000000000000..320ee0d88f2cf96fe25d8402c499a3d3a6130754 GIT binary patch literal 428132 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�_^g#`7L^$7Kt5^aB`GXZ8iaRr=1a7KZVe`s8 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≶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 literal 0 HcmV?d00001 diff --git a/docs/images/overview/honcho-overview.svg b/docs/images/overview/honcho-overview.svg new file mode 100644 index 00000000..a861b327 --- /dev/null +++ b/docs/images/overview/honcho-overview.svg @@ -0,0 +1,4 @@ + + +Store Messages inHonchoHoncho StoreMessages in LongTerm MemoryLong Term Memory StoreSends Message toReasoning EngineHoncho APIHonchoReasoningEngineMessagesPeer CardsSummariesRepresentationsSends DerivedInsights to LongTerm MemoryMessagesHoncho APIGet ContextChatSearchWorking Representations diff --git a/docs/_snippets/overview-shields.mdx b/docs/snippets/overview-shields.mdx similarity index 100% rename from docs/_snippets/overview-shields.mdx rename to docs/snippets/overview-shields.mdx diff --git a/docs/v2/documentation/core-concepts/architecture.mdx b/docs/v2/documentation/core-concepts/architecture.mdx index 5980d90b..1b6c7eaf 100644 --- a/docs/v2/documentation/core-concepts/architecture.mdx +++ b/docs/v2/documentation/core-concepts/architecture.mdx @@ -7,17 +7,15 @@ sidebarTitle: "Architecture" The goal of this page is to build an intuition for the primitives in Honcho and how they fit together -Honcho has 3 main components that work together to manage agent identity and context. +Honcho has 2 main components that work together to manage agent identity and context. -- **The Storage API**: The Memory layer for storing interaction history for your agents -- **The Deriver**: The background processing layer that builds representations of users and agents -- **The Dialectic API**: The natural language API for chatting with representations +- **The Memory Layer**: The Memory layer for storing interaction history for your agents +- **The Reasoning Layer**: The background processing layer that builds representations of users and agents Below we'll deep dive into these different areas, discussing the data primitives, the flow of data through the system, artifacts Honcho produces, and how to use them. - ## Data Model Honcho has a hierarchical data model centered around the entities below. @@ -37,9 +35,9 @@ Honcho has a hierarchical data model centered around the entities below. style SM fill:#e8f5e9,stroke:#2e7d32,color:#000 ``` -There are `Workspaces` at the top that contain `Peers` and `Sessions`. A `Peer` -can be part of many `Sessions` and a `Session` can have many `Peers`. `Sessions` -hold messages that are sent by `Peers`. +A `Workspaces` has `Peers` & `Sessions` +A `Peer` can be in multiple `Sessions` and can send `Messages` in a `Session`. +A `Session` can have many `Peers` and stores `Messages` sent by its `Peers`. ### Workspaces @@ -126,19 +124,38 @@ with a single peer and structure the data as messages. - File uploads (PDFs, text files, JSON documents) -## Deriver +## Reasoning Layer -At the core of developing representations of Peers, we have the Deriver. The -Deriver refers to a set of processes in Honcho that enqueue new messages sent -by peers and reasons over them to extract facts, insights, and context. +The raw data you store in Honcho is useful, but it's not in a format that's most +useful for an LLM to consume. There may be too many tokens that need to be +compacted, key facts about what happened may be hard to piece together because +they involve messages from across different sessions, etc. + +To solve this problem, Honcho has a reasoning layer that continually processes +incoming data to form the most informationally dense and useful representations of `Peers` +that we can then expose to agents. Honcho does the following tasks in +the reasoning engine. + +- **Fact Derivation** +- **Generate Summaries** +- **Generate Peer Cards** +- **Dreaming** + + +Honcho will reason about each `Message` it +ingests to generate new facts and insights that are spelled out and easy to +consume in an LLM prompt. + +We refer to this module of Honcho as the `Deriver`, because it's constantly +deriving new insights from messages. The sum total of all these generated +insights are what we refer to as a `Representation`, all the data related to who +and what a `Peer` is. Depending on the configuration of a `Peer` or `Session`, the deriver will behave differently and update different representations. -Facts derived here are used in the Dialectic chat endpoint to generate -context-aware responses that can correctly reference both concrete facts -extracted from messages and social insights deduced from facts, tone, and -opinion. +Facts derived here are used in the Dialectic chat endpoint, get_context +endpoint, Deriver tasks are processed in parallel, but tasks affecting the same peer representation will always be processed serially in order of message creation, so as to properly understand their cumulative effect. @@ -149,7 +166,7 @@ There are two types of tasks that the deriver currently does: - **Representation Tasks**: Generate/update peer representations - **Summary Tasks**: Generate conversation summaries -### Peer Representations +### Local & Global Representations Peer representations are more of an abstract concept, as they are made up of various pieces of data stored throughout Honcho. There are however diff --git a/docs/v2/documentation/core-concepts/configuration.mdx b/docs/v2/documentation/core-concepts/configuration.mdx index ff57dc8e..bc8635b9 100644 --- a/docs/v2/documentation/core-concepts/configuration.mdx +++ b/docs/v2/documentation/core-concepts/configuration.mdx @@ -1,5 +1,5 @@ --- -title: 'Configuration' +title: 'Configure Reasoning' description: 'Customizing how Honcho handles peers and sessions' icon: 'wrench' --- diff --git a/docs/v2/documentation/core-concepts/features.mdx b/docs/v2/documentation/core-concepts/features.mdx deleted file mode 100644 index cc1d402e..00000000 --- a/docs/v2/documentation/core-concepts/features.mdx +++ /dev/null @@ -1,44 +0,0 @@ ---- -title: 'Features' -description: 'Key features and capabilities of Honcho' -icon: 'star' ---- - -This page is a quick overview of the features within Honcho. In-depth -guides are available for each feature in the [Spellbooks - Design Patterns](../../guides/overview#design-patterns) section. - -### Local vs Global Representation -Peers in Honcho are abstract entities that can represent humans, agents, or NPCs. Honcho has a two-layer approach to forming representations of Peers. -- **Global Representation**: Representation owned by a Peer that is constructed from everything the Peer has sent within Honcho. -- **Local Representation**: The representation that a Peer forms of other Peers, based on the messages those other Peers have sent (as observed by the Peer forming the representation). -- At the Session level, you can configure which Peers are able to observe messages from other Peers in that Session. This determines which Peers form representations of others within the Session. - -### Queue Status -To help developers understand when a Peer's representation is fully up to date, Honcho exposes the ability to poll the status of Peer-centric queues that construct representations. -- If no Session is specified, the queue status reflects pending work for the Peer's global representation. -- If a Session is specified, the queue status reflects pending work for the Peer's working representation in that Session. - -### Search -Honcho implements a powerful search endpoint that allows you to search for messages across a workspace, session, or peer with complex [filters](/v2/guides/using-filters). - -The search process combines full-text and semantic search using reciprocal rank fusion. By default, all messages ingested into Honcho have embeddings generated and stored in the database, enabling semantic search -- if this feature is disabled, the search process will only use full-text search. - -Results are returned in the form of a list of Message objects, and you may choose how many results to return. The default is 10 results, with a maximum of 100. - -In the SDK, search is available on `Workspace`, `Session`, and `Peer` objects, and an optional `filters` parameter may be used to apply a narrower search scope such as a time range or developer-defined metadata attached to messages. - -Note that results are not ordered by recency, only relevance. Results can be sorted by timestamp or a filter on the `created_at` field can limit results to recent messages. - -[Look here for examples of how to use search in the SDK](/v2/guides/search). - -### Scoped API Keys -Builders can create scoped API keys to control access to different resources within Honcho. -- **Workspace-Level Keys**: Access to everything scoped to a Workspace. -- **Peer-Level Keys**: Access to everything scoped to a Peer. -- **Session-Level Keys**: Access to everything scoped to a Session. - -### Get Context -Honcho provides a powerful context retrieval feature that delivers formatted conversation context from sessions, making it easy to integrate with LLMs like OpenAI, Anthropic, and others. -- By default, the context includes a blend of summary and messages which covers the entire history of the session. -- Summaries are generated automatically at intervals, and recent messages are included based on your specified token budget for the context. -- You can set any token limit, and if you prefer, you can disable summaries so that the context consists entirely of the most recent messages up to your chosen limit. diff --git a/docs/v2/guides/dialectic-endpoint.mdx b/docs/v2/documentation/core-concepts/features/dialectic-endpoint.mdx similarity index 100% rename from docs/v2/guides/dialectic-endpoint.mdx rename to docs/v2/documentation/core-concepts/features/dialectic-endpoint.mdx diff --git a/docs/v2/guides/file-uploads.mdx b/docs/v2/documentation/core-concepts/features/file-uploads.mdx similarity index 100% rename from docs/v2/guides/file-uploads.mdx rename to docs/v2/documentation/core-concepts/features/file-uploads.mdx diff --git a/docs/v2/guides/get-context.mdx b/docs/v2/documentation/core-concepts/features/get-context.mdx similarity index 99% rename from docs/v2/guides/get-context.mdx rename to docs/v2/documentation/core-concepts/features/get-context.mdx index 6722a548..fb4e7fab 100644 --- a/docs/v2/guides/get-context.mdx +++ b/docs/v2/documentation/core-concepts/features/get-context.mdx @@ -1,5 +1,5 @@ --- -title: 'Working with Session Context' +title: 'Get Context' description: 'Learn how to use get_context() to retrieve and format conversation context for LLM integration' icon: 'messages' --- diff --git a/docs/v2/documentation/core-concepts/features/local-vs-global.mdx b/docs/v2/documentation/core-concepts/features/local-vs-global.mdx new file mode 100644 index 00000000..e5670229 --- /dev/null +++ b/docs/v2/documentation/core-concepts/features/local-vs-global.mdx @@ -0,0 +1,68 @@ +--- +title: Local vs Global Representations +description: Model directional relationships between Peers in Honcho +icon: location-pin +--- + +One of the unique affordances of Honcho is that it allows developers to model +directional relationships between Peers. What I mean by this is you can model +how one `Peer` thinks about another `Peer`. + +There are many use cases where you don't want every agent or human to know +everything about another user such as games or multi-agent workflows. To +illustrate this, the following examples shows 2 conversations. + +Conversation #1 (With Bob and Alice) +``` +Alice: I had a great breakfast today. +Bob: What did you eat? +Alice: I had pancakes and eggs and bacon +``` + +Conversation #2 (With Alice and Charlie) +``` +Alice: I actually didn't eat any breakfast today. +Charlie: Oh that's too bad. +Alice: But I lied to Bob and told him I did, so back me up if you see them. +``` + +Alice told Bob a lie in this conversation. If we stored both of these +conversations in Honcho with Alice, Bob, and Charlie as `Peers` and let them +use Honcho to get insights on each other then Bob would immediately know this +deception. For example: + + + ```python Python + # Bob could run + alice.chat("What did Alice eat today?") + # Response: Alice did not eat anything today + ``` + + +This is a problem. Bob shouldn't be able to know everything about Alice in this +situation. So to support these situations we support what we call **Local +Representations**. + +By default insights generated for a `Peer` are scoped globally. This means every +message sent by that `Peer` in any conversation updates the same representation +of that `Peer`. However, we can enable **Local Representations** so Bob can +form a representation Alice based only on what they observe Alice do. + +This feature is illustrated in the graphic below: +Peer Representations + +We can enable local representation for a `Peer` by setting `observe_others=True`. +This is shown in the [Configure +Reasoning](/v2/documentation/core-concepts/configuration) page. + +Now if we used Bob's local representation of Alice then Bob would only get +insights on what they've seen Alice say to them. + +```python +bob.chat(target="alice", query="What did Alice eat today?") +# Response: Alice ate pancakes, eggs, and bacon +``` + + + Local Representations are turned off by default + diff --git a/docs/v2/documentation/core-concepts/features/queue-status.mdx b/docs/v2/documentation/core-concepts/features/queue-status.mdx new file mode 100644 index 00000000..ed28161f --- /dev/null +++ b/docs/v2/documentation/core-concepts/features/queue-status.mdx @@ -0,0 +1,132 @@ +--- +title: Queue Status +description: Learn how to check the status of the Deriver +icon: lines-leaning +--- + +Whenever `Messages` are stored in Honcho, a background process called the +[Deriver](/docs/v2/documentation/core-concepts/architecture#reasoning-layer) is +triggered to reason about the conversation and generate insights. + +The Deriver is an asynchronous process and, depending on load may not immediately +generated insights for the latest message you've sent. To help with this, Honcho +provides several utilities to check the status of the Deriver. + + +```python Python +from honcho import Honcho +honcho = Honcho() + +status = honcho.get_deriver_status() +honcho.poll_deriver_status() +``` + +```typescript typescript +import { Honcho } from '@honcho-ai/sdk'; + +const honcho = new Honcho({}); + +const status = await honcho.getDeriverStatus(); +await honcho.pollDeriverStatus(); +``` + + +Output types + + +```python Python +class DeriverStatus(BaseModel): + completed_work_units: int + """Completed work units""" + + in_progress_work_units: int + """Work units currently being processed""" + + pending_work_units: int + """Work units waiting to be processed""" + + total_work_units: int + """Total work units""" + + sessions: Optional[Dict[str, Sessions]] = None + """Per-session status when not filtered by session""" +``` +```typescript TypeScript +Promise<{ + totalWorkUnits: number + completedWorkUnits: number + inProgressWorkUnits: number + pendingWorkUnits: number + sessions?: Record + }> + +``` + + +Whenever a `Message` is sent it will generate several tasks. These could +be tasks such as generating insights, cleaning up a representation, summarizing +a conversation etc. These tasks are defined based on who is sending the +message, what `Session` the message is in, and potentially who is observing the +message. We call the combination of these parameters a `work_unit` + +This has a few different implications. + +- tasks within the same work_unit are processed sequentially, but multiple +work_units will be processed in parallel +- If local representations are turned in a Session then a `Message` will + generate an additional work unit for every `Peer` that has `observe_others=True` + +The `get_deriver_status` and `poll_deriver_status` methods can take additional +parameters to scope the status to a specific work unit + + +```python Python +def get_deriver_status( + self, + observer_id: str | None = None, + sender_id: str | None = None, + session_id: str | None = None, + ) -> DeriverStatus: +``` +```typescript TypeScript + +export const DeriverStatusOptionsSchema = z.object({ + observerId: z.string().optional(), + senderId: z.string().optional(), + sessionId: z.string().optional(), + timeoutMs: z + .number() + .positive('Timeout must be a positive number') + .optional(), +}) + +``` + + +Additionally, there are deriver status and polling deriver status methods +available on the `Session` objects in each of the SDKs. + +Below are the function signatures for the session level deriver status method + + +```python python +@validate_call + def get_deriver_status( + self, + observer_id: str | None = None, + sender_id: str | None = None, + ) -> DeriverStatus: +``` + +```typescript TypeScript +async getDeriverStatus( + options?: Omit + ): Promise<{ + totalWorkUnits: number + completedWorkUnits: number + inProgressWorkUnits: number + pendingWorkUnits: number + sessions?: Record + }> +``` + diff --git a/docs/v2/guides/search.mdx b/docs/v2/documentation/core-concepts/features/search.mdx similarity index 100% rename from docs/v2/guides/search.mdx rename to docs/v2/documentation/core-concepts/features/search.mdx diff --git a/docs/v2/documentation/core-concepts/features/storing-data.mdx b/docs/v2/documentation/core-concepts/features/storing-data.mdx new file mode 100644 index 00000000..0ec7f4b4 --- /dev/null +++ b/docs/v2/documentation/core-concepts/features/storing-data.mdx @@ -0,0 +1,61 @@ +--- +title: Storing Data +description: "Store Data in Honcho to Generate Memories and Insights" +icon: "memory" +--- + +The most basic building block of Honcho's data model is the `Message` object. +A `Message` is sent by a `Peer` and saved in a `Session` + + + + ```python Python + from honcho import Honcho + + honcho = Honcho() + + peer = honcho.peer("sample-peer") + + session = honcho.session("sample-session") + + message = peer.message("Hello, world!", session_id=session.id) + + session.add_messages([message]) + ``` + + ```typescript TypeScript + import { Honcho } from '@honcho-ai/sdk'; + + const honcho = new Honcho({}); + + const peer = await honcho.peer('sample-peer'); + + const session = await honcho.session('sample-session'); + + const message = peer.message('Hello, world!'); + + await session.addMessages([message]); +``` + + +Once a `Message` is saved in Honcho, it will kick off a background task that +looks at the new data to generate insights about the `Peer` that sent the `Message` + +This is the default behavior of Honcho and can be turned off by [configuring the +Peer or Session](/v2/documentation/core-concepts/configuration) + +This pattern of having a Peer, Session, and Messages is highly flexible and +works for many different use cases and agent setups. Some use cases may only +need a single Peer, but many Sessions. Others will only use a single `Session` +for their entire app. These are flexible components that work in any situation. + +## Chat Bots + +A common use case for Honcho to is to build a chatbot like ChatGPT or Claude. +In this case you can simply + +- Make a `Peer` for the User +- Make a `Peer` for the AI + +Then you can make a `Session` for each thread of conversation and save +`Messages` from the user and assistant in each turn of conversation diff --git a/docs/v2/guides/streaming-response.mdx b/docs/v2/documentation/core-concepts/features/streaming-response.mdx similarity index 100% rename from docs/v2/guides/streaming-response.mdx rename to docs/v2/documentation/core-concepts/features/streaming-response.mdx diff --git a/docs/v2/guides/using-filters.mdx b/docs/v2/documentation/core-concepts/features/using-filters.mdx similarity index 100% rename from docs/v2/guides/using-filters.mdx rename to docs/v2/documentation/core-concepts/features/using-filters.mdx diff --git a/docs/v2/guides/working-rep.mdx b/docs/v2/documentation/core-concepts/features/working-rep.mdx similarity index 100% rename from docs/v2/guides/working-rep.mdx rename to docs/v2/documentation/core-concepts/features/working-rep.mdx diff --git a/docs/v2/documentation/introduction/overview.mdx b/docs/v2/documentation/introduction/overview.mdx index 1fb4f199..e94a85de 100644 --- a/docs/v2/documentation/introduction/overview.mdx +++ b/docs/v2/documentation/introduction/overview.mdx @@ -5,108 +5,102 @@ icon: "brain" sidebarTitle: "Overview" --- -When building agents developers often run into the same walls: +Honcho is an AI-native memory library for building agents with +[state-of-the-art](https://blog.plasticlabs.ai/research/Introducing-Neuromancer-XR) +long-term memory. -> "My agent forgets everything between chats" +Agents using Honcho have perfect recall with a wide variety of tools to traverse +their history and get the exact context they need when they need it. -You need memory: session management, message storage, context handling. It's table stakes, but surprisingly complex to get right. +It then goes beyond basic memory by reasoning about the stored history +to expand the latent information available to your agent. Agents using Honcho +will understand who they are, who they are interacting with, what happened, and +when it happened — all without you having to think about it. -> "My agent treats everyone exactly the same" +Use it to build -You need personalization: user modeling, preference learning, behavioral adaptation. Now you're building a [social cognition](../core-concepts/glossary#social-cognition) engine. +- Highly personalized experiences +- Agents with social cognition +- Agents with rich identity that evolve over time +- Multi-agent systems with complex social dynamics -> "I'm writing infrastructure instead of features" - -You need Honcho - -Honcho's Hiearchy of Agents - -Honcho delivers production-ready memory infrastructure from day one. Store -conversations, manage sessions, get perfectly formatted context for any LLM. -But here's the magic: while your agents are chatting, Honcho is learning. It -builds Theory of Mind models automatically, transforming raw conversations into -rich psychological understanding. ```python -# Start simple - just add messages +# Start simple by just adding messages session.add_messages([alice.message("I learn best with examples")]) -# Get powerful - query user psychology +# Honcho will automatically reason about the message to generate insights about Alice + +# Get insights by chatting with the agent insight = peer.chat("How should I explain this concept?") # > "This user learns best through concrete examples..." ``` -Your agents evolve from goldfish to counselor, on the same infrastructure. That's Honcho. - Designed for developers and agents alike: -- **Natural Language Queries**: Chat with Honcho in natural language via the [Dialectic API](../core-concepts/architecture#dialectic-api) and let agents backchannel -- **Automatic Context Management**: Smart summarization that respects token limits -- **Native multi-agent support**: Break out of User/Assistant Paradigms and build complex multi-agent systems +- **Natural Language Queries**: Chat with Honcho in natural language via the [Dialectic API](../core-concepts/architecture#dialectic-api) to get insights about your users and agents +- **Automatic Context Management**: Smart conversation summaries to have infinite chats +- **Native multi-agent support**: Sessions can natively have as many participants as you need - **Agent-first interfaces**: MCP connections and APIs designed for agents to consume and use as tools - **Provider Agnostic**: Works with any LLM or Agent Framework ## How It Works -### Storage + + + High Level Honcho Diagram + + -Developers use Honcho to store information about their users and application via -two integrated layers: +At a high level Honcho works very simply: -Basic Honcho Flowchart +1. Store messages sent by users and agents in Honcho +2. Honcho reasons about the messages to generate insights about each entity in +the system +3. At runtime your agents can leverage insights from Honcho to get the exact +context they need -**Memory Layer**: Captures all user interactions - messages, preferences, and -behavioral patterns - in a peer-centric data model that scales from individual -conversations to complex multi-agent scenarios. This also queues up messages for -the reasoning layer to process. +There are several API endpoints to leverage the memory & insights in Honcho. -**Reasoning Layer**: Continuously analyzes stored interactions to build -psychological profiles using [theory of mind](../core-concepts/glossary#theory-of-mind) -inference, extracting patterns about communication style, decision-making -preferences, and mental models. +### Get Context -### Retrieval +This is the easiest way to leverage Honcho. simply call get context and get the +most relevant information for your conversation. This endpoint is highly +customizable so you can specify parameters such as: -Once data is stored and generated within Honcho, the API exposes several -different ways to retrieve and use those insights. +- A number of tokens you want +- An option to include summaries of the conversation +- An option to get a profile of a specific user (Peer Card & Representation) -**[Dialectic API](/v2/guides/dialectic-endpoint)**: This is the -flagship endpoint that allows developers to send natural language queries to -Honcho to chat with the representation of each user in your system to get -dynamic, in-context actionable insights. +### Search -Example Queries +This endpoint lets you search across Honcho for relevant messages using a +hybrid search strategy that combines full-text and semantic search. + +You can optionally scope the endpoint to a specific workspace, peer, or session. + +### Working Representation + +This endpoint gives you a snapshot of a user or what we call a +**Representation**. Essentially, a list of explicit and deductive facts about +the user that are relevant to the current conversation. + +Plug this into your prompt to get a quick overview of the user. + +### Dialectic API + +This endpoint lets you chat with Honcho about any entity in your system. Honcho +will leverage what it has remembered and learned about the entity to provide in-context actionable insights. + +This is especially helpful when you want your agent to back-channel with Honcho to +change its behavior at runtime. + +Example Queries: - "What's the best way to explain technical concepts to this user?" - "Is this user more task-oriented or relationship-oriented?" - "What time of day is this user most engaged?" - "How does this user prefer to receive feedback?" - "What are this user's core values based on our conversations?" -**[Get Context](/v2/guides/get-context)**: This endpoint abstracts context window -constraints and continuously retrieves the most relevant and recent data from a -conversation. Provide a token budget and Honcho will return a combination of -summaries and messages that provide session context. Use this for creating -long-running conversations. We crafted our summaries to provide the most -[coverage of a session possible](../core-concepts/summarizer). - -**[Search](/v2/guides/search)**: This endpoint allows you to search across Honcho -for relevant messages either at the workspace, peer, or session level. This -endpoint uses a hybrid search strategy that combines text search and cosine -similarity. - -**[Working Representations](/v2/guides/working-rep)**: Get a cached, snapshot -of a user in the context of a session. Instead of waiting for an LLM to -synthesize an in-context response via the Dialectic endpoint, use this to get -recent insights you can plug into your context window. - -## Ideal For - -**Personalized AI assistants** that need to understand individual psychology, not just remember conversations. - -**Customer-facing agents** that must adapt their approach based on user communication preferences and emotional context. - -**Multi-agent systems** where AI needs to understand human collaborators' working styles and decision-making patterns. - -**NPCs** where you want autonomous agents with a rich and deep personality that isn't the average sycophantic llm ## Getting Started @@ -115,7 +109,7 @@ Ready to integrate Honcho into your application? Get up and running with Honcho in minutes Understand Honcho's +href="/v2/documentation/core-concepts/architecture"> Understand Honcho's fundamental concepts ## Community & Support diff --git a/docs/v2/documentation/introduction/quickstart.mdx b/docs/v2/documentation/introduction/quickstart.mdx index 30175b5e..fb5ff35a 100644 --- a/docs/v2/documentation/introduction/quickstart.mdx +++ b/docs/v2/documentation/introduction/quickstart.mdx @@ -62,7 +62,7 @@ The Honcho client is the main entry point for interacting with Honcho's API. By from honcho import Honcho # Initialize client (uses demo environment and default workspace) -client = Honcho() +honcho = Honcho() ``` @@ -70,7 +70,7 @@ client = Honcho() import { Honcho } from '@honcho-ai/sdk'; // Initialize client (uses demo environment and default workspace) -const client = new Honcho({}); +const honcho = new Honcho({}); ``` @@ -83,7 +83,7 @@ import os from honcho import Honcho # Production environment with API key -client = Honcho( +honcho = Honcho( api_key=os.environ["HONCHO_API_KEY"], environment="production", # Create a workspace, otherwise set to "default" @@ -95,7 +95,7 @@ client = Honcho( import { Honcho } from '@honcho-ai/sdk'; // Production environment with API key -const client = new Honcho({ +const honcho = new Honcho({ apiKey: process.env.HONCHO_API_KEY!, environment: "production", // Create a workspace, otherwise set to "default" @@ -110,13 +110,13 @@ Peers represent individual users, AI agents, or any conversational entity in you ```python Python -alice = client.peer("alice") -bob = client.peer("bob") +alice = honcho.peer("alice") +bob = honcho.peer("bob") ``` ```typescript TypeScript -const alice = await client.peer("alice") -const bob = await client.peer("bob") +const alice = await honcho.peer("alice") +const bob = await honcho.peer("bob") ``` @@ -126,12 +126,12 @@ Sessions are independent conversations that can include multiple peers: ```python Python -session = client.session("session_1") +session = honcho.session("session_1") session.add_peers([alice, bob]) ``` ```typescript TypeScript -const session = await client.session("session_1") +const session = await honcho.session("session_1") await session.addPeers([alice, bob]) ``` @@ -171,7 +171,7 @@ Now ask Honcho what it's learned - this is where the magic happens: ```python Python # Ask what Bob is like -response = alice.chat("Tell me about Bob's interests and habits") +response = bob.chat("Tell me about Bob's interests and habits") print(response) # Returns rich context like: @@ -182,36 +182,128 @@ print(response) ``` ```typescript TypeScript -(async () => { - // Ask what Bob is like - const response = await alice.chat("Tell me about Bob's interests and habits"); - console.log(response); +bob.chat("Tell me about Bob's interests and habits").then((response) => { + console.log(response); + // Returns rich context like: + // "Bob is health-conscious and has been working on getting back in shape. + // He regularly goes to the gym, particularly in the evenings, and finds + // exercise helps him relax. He's encouraging about fitness and willing + // to share advice about workout routines." +}) +``` + - // Returns rich context like: - // "Bob is health-conscious and has been working on getting back in shape. - // He regularly goes to the gym, particularly in the evenings, and finds - // exercise helps him relax. He's encouraging about fitness and willing - // to share advice about workout routines." -})(); +## 7. Putting it all together + + +```python Python +import os +from honcho import Honcho + +# Create your client +honcho = Honcho( + api_key=os.environ["HONCHO_API_KEY"], + environment="production", + # Create a workspace, otherwise set to "default" + # workspaceId="your-workspace-id" +) + +# Get your Peers +alice = honcho.peer("alice") +bob = honcho.peer("bob") + +# Make a Session and add your Peers +session = honcho.session("session_1") +session.add_peers([alice, bob]) + +# Add messages sent by your Peers +session.add_messages([ + alice.message("Hi Bob, how are you?"), + bob.message("I'm good, thank you!"), + alice.message("What are you doing today after work?"), + bob.message("I'm going to the gym! I've been trying to get back in shape."), + alice.message("That's great! I should probably start exercising too."), + bob.message("You should! I find that evening workouts help me relax."), +]) + +# Get insights about your Peers +response = bob.chat("Tell me about Bob's interests and habits") +print(response) + +# Returns rich context like: +# "Bob is health-conscious and has been working on getting back in shape. +# He regularly goes to the gym, particularly in the evenings, and finds +# exercise helps him relax. He's encouraging about fitness and willing +# to share advice about workout routines." +``` + +```typescript TypeScript +import { Honcho } from '@honcho-ai/sdk'; + +// Create your client +const honcho = new Honcho({ + apiKey: process.env.HONCHO_API_KEY!, + environment: "production", + // Create a workspace, otherwise set to "default" + // workspace: "your-workspace-id" +}); + +// Get your Peers +const alice = await honcho.peer("alice") +const bob = await honcho.peer("bob") + +// Make a Session and add your peers +const session = await honcho.session("session_1") +await session.addPeers([alice, bob]) + +// Add messages sent by your Peers +await session.addMessages([ + alice.message("Hi Bob, how are you?"), + bob.message("I'm good, thank you!"), + alice.message("What are you doing today after work?"), + bob.message("I'm going to the gym! I've been trying to get back in shape."), + alice.message("That's great! I should probably start exercising too."), + bob.message("You should! I find that evening workouts help me relax."), +]) + +// Get insights about your peers +bob.chat("Tell me about Bob's interests and habits").then((response) => { + console.log(response); + // Returns rich context like: + // "Bob is health-conscious and has been working on getting back in shape. + // He regularly goes to the gym, particularly in the evenings, and finds + // exercise helps him relax. He's encouraging about fitness and willing + // to share advice about workout routines." +}) ``` ## What Just Happened? -Honcho automatically built rich psychological profiles from just a few messages: +You just got through building a simple conversation between two people, Alice +and Bob. We: -- **Theory of Mind Processing**: Understanding personality, preferences, and patterns -- **Ambient Learning**: No surveys or explicit training - just natural conversation -- **Rich Context**: Far more detailed than simple conversation history +1. Set up our connection to Honcho. +2. Setup who the participants of our conversation are, these are called `Peers`. +3. Made a `Session` and added our `Peers` to it. +4. Sent messages from our `Peers` +5. Chat with Honcho to get insights about one of the `Peers` in the conversation -The response isn't just retrieving stored text - it's synthesizing insights about Bob's personality, habits, and communication style. +As soon as you save a message in Honcho, it will start to reason about it to +pull out insights and develop a profile of the user. This is the default +behavior and can be toggled off via [the configuration](/v2/documentation/core-concepts/configuration). ## Next Steps -This covers the core concepts: **peers**, **sessions**, **messages**, and **dialectic queries**. - -- For production use, [sign up for the managed platform](https://app.honcho.dev) or get an [overview here](../reference/platform). -- For detailed API reference, check out our [SDK documentation](../reference/sdk). -- For more examples, explore our [guides](../guides/overview). - ---- + + + Learn about the data primitives in Honcho and how they work together + + + Sign up for Managed Honcho and get started building agents now. + + + Check out spellbooks to see different examples apps built with Honcho + + diff --git a/docs/v2/documentation/introduction/vibecoding.mdx b/docs/v2/documentation/introduction/vibecoding.mdx index 31f98ff6..7127c8e6 100644 --- a/docs/v2/documentation/introduction/vibecoding.mdx +++ b/docs/v2/documentation/introduction/vibecoding.mdx @@ -5,7 +5,17 @@ description: "Universal starter prompt for building with Honcho" sidebarTitle: 'Vibecoding Setup' --- -Copy this prompt into Cursor, Claude, or any AI coding assistant to start building with Honcho. +These docs are designed to be easily consumable for LLMs. Each page has a button +the lets you copy the page as Markdown or paste directly into ChatGPT or Claude. + +Additionally, we follow the llms.txt standard. There are both an llms.txt and +llms-full.txt available. + +- [llms.txt](/llms.txt) +- [llms-full.txt](/llms-full.txt) + +Additionally, we provide a starter prompt to paste into a coding assistant to +quickly get started building with Honcho. ## 🚀 Universal Starter Prompt diff --git a/docs/v2/documentation/reference/platform.mdx b/docs/v2/documentation/reference/platform.mdx index 98b3cbb3..3b01717a 100644 --- a/docs/v2/documentation/reference/platform.mdx +++ b/docs/v2/documentation/reference/platform.mdx @@ -1,8 +1,8 @@ --- -title: "Managed Honcho Platform" +title: "The Honcho Dashboard" icon: "rocket" description: "Build socially intelligent agents without worrying about infrastructure" -sidebarTitle: "Platform Overview" +sidebarTitle: "Dashboard Overview" --- diff --git a/docs/v2/guides/overview.mdx b/docs/v2/guides/overview.mdx index 79a08be8..dcaf5b48 100644 --- a/docs/v2/guides/overview.mdx +++ b/docs/v2/guides/overview.mdx @@ -11,40 +11,20 @@ AI development often feels like magic - you craft the right prompt and get exact Whether you're integrating Honcho into existing platforms, exploring advanced features, or getting up and running quickly, these guides provide concrete examples and implementation patterns. -## What You'll Find Here +Each spellbook focuses on a specific use case with working code you can adapt to your needs. The goal is to get you from idea to working prototype as quickly as possible, then provide the depth you need to scale and customize. -### Getting Started -**[Overview](/v2/guides/overview)** - You are here - -**[MCP Integration](/v2/guides/mcp)** - Get Honcho running with a single prompt in Cursor or Claude Code - -### Application Interfaces +## Application Interfaces Ready-to-use integration patterns for popular platforms: -**[Discord Bot](/v2/guides/discord)** - Build a Discord bot that remembers users across conversations - -**[Telegram Bot](/v2/guides/telegram)** - Create a Telegram bot with persistent user understanding - -### Design Patterns -Implementation patterns for Honcho's core capabilities: - -**[Dialectic Endpoint](/v2/guides/dialectic-endpoint)** - Query user psychology in natural language - -**[Working with Session Context](/v2/guides/get-context)** - Manage conversation flow and context windows - -**[Search](/v2/guides/search)** - Search your data using natural language - -**[Working Representations](/v2/guides/working-rep)** - Understanding and customizing user models - -**[Streaming Responses](/v2/guides/streaming-response)** - Handle real-time interactions efficiently - -**[Using Filters](/v2/guides/using-filters)** - Control what data gets processed and how - -**[File Uploads](/v2/guides/file-uploads)** - Upload PDF, text, or JSON files to create messages - -## Philosophy - -These aren't just API documentation - they're implementation patterns that solve real problems. Each spellbook focuses on a specific use case with working code you can adapt to your needs. - -The goal is to get you from idea to working prototype as quickly as possible, then provide the depth you need to scale and customize. + + + Build a Discord bot that remembers users across conversations + + + Create a Telegram bot with persistent user understanding + + +Get Honcho running with a single prompt in Cursor or Claude Code + + From 641eb9991ea1444ae17413c366cd230411c84d9d Mon Sep 17 00:00:00 2001 From: Vineeth Voruganti <13438633+VVoruganti@users.noreply.github.com> Date: Fri, 7 Nov 2025 12:05:07 -0500 Subject: [PATCH 10/13] chore: docs formatting --- docs/v2/documentation/core-concepts/architecture.mdx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/v2/documentation/core-concepts/architecture.mdx b/docs/v2/documentation/core-concepts/architecture.mdx index 1b6c7eaf..3a58147d 100644 --- a/docs/v2/documentation/core-concepts/architecture.mdx +++ b/docs/v2/documentation/core-concepts/architecture.mdx @@ -35,9 +35,9 @@ Honcho has a hierarchical data model centered around the entities below. style SM fill:#e8f5e9,stroke:#2e7d32,color:#000 ``` -A `Workspaces` has `Peers` & `Sessions` -A `Peer` can be in multiple `Sessions` and can send `Messages` in a `Session`. -A `Session` can have many `Peers` and stores `Messages` sent by its `Peers`. +- A `Workspaces` has `Peers` & `Sessions` +- A `Peer` can be in multiple `Sessions` and can send `Messages` in a `Session`. +- A `Session` can have many `Peers` and stores `Messages` sent by its `Peers`. ### Workspaces From 8e3f24d4f8098cdd3474c38226f46b1b9f6ea906 Mon Sep 17 00:00:00 2001 From: Rajat Ahuja Date: Fri, 7 Nov 2025 13:04:28 -0500 Subject: [PATCH 11/13] feat: add caching (redis) (#265) * feat: init redis cache * feat: initialize redis client * fix: add fakeredis client * fix: update docker compose * fix: various coderabbit comments * fix: update docker-compose.yml.example * fix: CR comments 2 * fix: clean up client * fix: cache key class; workspace LRU; constants -> utils * fix: CodeRabbit comments * feat: add redis to harness * fix: use cashews * fix: add locking for cache stampedes * fix: clean up PR * f: unify cache key templates and stop caching None * fix: alter prefixes + prime cache on get_or_create() * fix: re-add fakeredis * chore: Code Rabbit nits * CR comments; make client more resilient * fix: BPR * fix: set redis once but clear cache in between every test * fix: attempt fix contextvar error * fix: make TestClient rely on redis patch * fix: potential working fix * fix: namespace inheritance; address comments * fix: namespace inheritance; address comments --------- Co-authored-by: Vineeth Voruganti <13438633+VVoruganti@users.noreply.github.com> --- .env.template | 15 +- .gitignore | 1 + README.md | 7 +- config.toml.example | 10 +- docker-compose.yml.example | 12 + docs/v2/contributing/configuration.mdx | 346 +++++++++++++++++++------ pyproject.toml | 3 + src/cache/__init__.py | 11 + src/cache/client.py | 123 +++++++++ src/config.py | 34 ++- src/crud/peer.py | 83 ++++-- src/crud/peer_card.py | 11 +- src/crud/session.py | 122 +++++---- src/crud/workspace.py | 87 ++++++- src/deriver/queue_manager.py | 9 + src/main.py | 15 +- src/prometheus.py | 4 +- tests/bench/harness.py | 143 +++++++++- tests/conftest.py | 78 +++++- uv.lock | 64 +++++ 20 files changed, 1007 insertions(+), 171 deletions(-) create mode 100644 src/cache/__init__.py create mode 100644 src/cache/client.py diff --git a/.env.template b/.env.template index a91ede16..f4369f65 100644 --- a/.env.template +++ b/.env.template @@ -21,6 +21,8 @@ LOG_LEVEL=INFO # LANGFUSE_HOST= # LANGFUSE_PUBLIC_KEY= +# NAMESPACE="honcho" + # ============================================================================= # Database Settings (REQUIRED) # ============================================================================= @@ -144,5 +146,14 @@ LLM_ANTHROPIC_API_KEY=your-anthropic-api-key-here # ============================================================================= # Metrics (Optional) # ============================================================================= -# ENABLED=false -# NAMESPACE=honcho +# METRICS_ENABLED=false +# METRICS_NAMESPACE=honcho + +# ============================================================================= +# Cache +# ============================================================================= +# CACHE_ENABLED=false +# CACHE_URL="redis://localhost:6379/0" +# CACHE_NAMESPACE="honcho" +# CACHE_DEFAULT_TTL_SECONDS=300 +# CACHE_DEFAULT_LOCK_TTL_SECONDS=5 diff --git a/.gitignore b/.gitignore index f75448c4..17d9597c 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ api/docker-compose.yml *.db data +redis-data docker-compose.yml compose.yml diff --git a/README.md b/README.md index baac9e39..b83733f9 100644 --- a/README.md +++ b/README.md @@ -396,13 +396,18 @@ cp config.toml.example config.toml Then modify the values as needed. The TOML file is organized into sections: -- `[app]` - Application-level settings (log level, host, port, embedding settings) +- `[app]` - Application-level settings (log level, session limits, embedding settings, metrics) - `[db]` - Database connection and pool settings - `[auth]` - Authentication configuration +- `[cache]` - Redis cache configuration - `[llm]` - LLM provider API keys and general settings - `[dialectic]` - Dialectic API configuration (provider, model, search settings) - `[deriver]` - Background worker settings and theory of mind configuration +- `[peer_card]` - Peer card generation settings - `[summary]` - Session summarization settings +- `[dream]` - Dream processing configuration +- `[webhook]` - Webhook configuration +- `[metrics]` - Metrics collection settings - `[sentry]` - Error tracking and monitoring settings ### Using Environment Variables diff --git a/config.toml.example b/config.toml.example index 50f618ba..8667cb15 100644 --- a/config.toml.example +++ b/config.toml.example @@ -15,7 +15,7 @@ MAX_EMBEDDING_TOKENS = 8192 MAX_EMBEDDING_TOKENS_PER_REQUEST = 300000 # LANGFUSE_HOST = "https://api.langfuse.com" # LANGFUSE_PUBLIC_KEY = "your-public-key-here" - +NAMESPACE="honcho" # Database settings [db] @@ -111,3 +111,11 @@ MAX_WORKSPACE_LIMIT = 10 [metrics] ENABLED = false NAMESPACE = "honcho" + +# Cache settings +[cache] +ENABLED = false +URL = "redis://localhost:6379/0" +NAMESPACE="honcho" +DEFAULT_TTL_SECONDS = 300 +DEFAULT_LOCK_TTL_SECONDS = 5 diff --git a/docker-compose.yml.example b/docker-compose.yml.example index e11e93ad..123ec5c5 100644 --- a/docker-compose.yml.example +++ b/docker-compose.yml.example @@ -45,3 +45,15 @@ services: interval: 5s timeout: 5s retries: 5 + redis: + image: redis:8.2 + restart: always + ports: + - 6379:6379 + volumes: + - ./redis-data:/data + healthcheck: + test: ["CMD-SHELL", "redis-cli ping"] + interval: 5s + timeout: 5s + retries: 5 diff --git a/docs/v2/contributing/configuration.mdx b/docs/v2/contributing/configuration.mdx index da5f2d6a..1233f511 100644 --- a/docs/v2/contributing/configuration.mdx +++ b/docs/v2/contributing/configuration.mdx @@ -46,14 +46,19 @@ cp config.toml.example config.toml Then modify the values as needed. The TOML file is organized into sections: -- `[app]` - Application-level settings (log level, host, port, embedding settings) -- `[db]` - Database connection and pool settings -- `[auth]` - Authentication configuration -- `[llm]` - LLM provider API keys and general settings -- `[dialectic]` - Dialectic API configuration (provider, model, search settings) -- `[deriver]` - Background worker settings and theory of mind configuration -- `[summary]` - Session summarization settings -- `[sentry]` - Error tracking and monitoring settings +- `[app]` - Application-level settings (log level, session limits, embedding settings, Langfuse integration, local metrics collection) +- `[db]` - Database connection and pool settings (connection URI, pool size, timeouts, connection recycling) +- `[auth]` - Authentication configuration (enable/disable auth, JWT secret) +- `[cache]` - Redis cache configuration (enable/disable caching, Redis URL, TTL settings, lock configuration for cache stampede prevention) +- `[llm]` - LLM provider API keys (Anthropic, OpenAI, Gemini, Groq, OpenAI-compatible endpoints) and general LLM settings +- `[dialectic]` - Dialectic API configuration (provider, model, query generation settings, semantic search parameters, context window size) +- `[deriver]` - Background worker settings (worker count, polling intervals, queue management) and theory of mind configuration (model, tokens, observation limits) +- `[peer_card]` - Peer card generation settings (provider, model, token limits) +- `[summary]` - Session summarization settings (frequency thresholds, provider, model, token limits for short and long summaries) +- `[dream]` - Dream processing configuration (enable/disable, thresholds, idle timeouts, dream types, LLM settings) +- `[webhook]` - Webhook configuration (webhook secret, workspace limits) +- `[metrics]` - Metrics collection settings (enable/disable metrics, namespace) +- `[sentry]` - Error tracking and monitoring settings (enable/disable, DSN, environment, sample rates) ### Using Environment Variables @@ -107,28 +112,33 @@ The application will use the production connection URI while keeping the pool si ### Application Settings +Application-level settings control core behavior of the Honcho server including logging, session limits, message handling, and optional integrations. + **Basic Application Configuration:** ```bash # Logging and server settings -LOG_LEVEL=INFO # DEBUG, INFO, WARNING, ERROR -SESSION_PEERS_LIMIT=10 -GET_CONTEXT_MAX_TOKENS=100000 +LOG_LEVEL=INFO # DEBUG, INFO, WARNING, ERROR, CRITICAL -# Embedding settings (optional) -EMBED_MESSAGES=false -MAX_EMBEDDING_TOKENS=8192 -MAX_EMBEDDING_TOKENS_PER_REQUEST=300000 +# Session and context limits +SESSION_OBSERVERS_LIMIT=10 # Maximum number of observers per session +GET_CONTEXT_MAX_TOKENS=100000 # Maximum tokens for context retrieval +MAX_MESSAGE_SIZE=25000 # Maximum message size in characters + +# Embedding settings +EMBED_MESSAGES=true # Enable vector embeddings for messages +MAX_EMBEDDING_TOKENS=8192 # Maximum tokens per embedding +MAX_EMBEDDING_TOKENS_PER_REQUEST=300000 # Batch embedding limit ``` -**Environment-specific settings:** +**Optional Integrations:** ```bash -# Development -LOG_LEVEL=DEBUG -FASTAPI_HOST=127.0.0.1 +# Langfuse integration for LLM observability +LANGFUSE_HOST=https://cloud.langfuse.com +LANGFUSE_PUBLIC_KEY=your-langfuse-public-key -# Production -LOG_LEVEL=WARNING -FASTAPI_HOST=0.0.0.0 +# Local metrics collection +COLLECT_METRICS_LOCAL=false +LOCAL_METRICS_FILE=metrics.jsonl ``` ### Database Configuration @@ -196,6 +206,36 @@ AUTH_JWT_SECRET=your-super-secret-jwt-key python scripts/generate_jwt_secret.py ``` +### Cache Configuration + +Honcho supports Redis caching to improve performance by caching frequently accessed data like peers, sessions, and working representations. Caching also includes lock mechanisms to prevent cache stampede scenarios. + +**Redis Cache Settings:** +```bash +# Enable/disable Redis caching +CACHE_ENABLED=false # Set to true to enable caching + +# Redis connection +CACHE_URL=redis://localhost:6379/0?suppress=false + +# Cache namespace and TTL +CACHE_NAMESPACE=honcho # Prefix for all cache keys +CACHE_DEFAULT_TTL_SECONDS=300 # How long items stay in cache (5 minutes) + +# Lock settings for preventing cache stampede +CACHE_DEFAULT_LOCK_TTL_SECONDS=5 # Lock duration when fetching from DB on cache miss +``` + +**When to Enable Caching:** +- High-traffic production environments +- Applications with many repeated reads of the same data +- When you need to reduce database load + +**Note:** Caching requires a Redis instance. You can run Redis locally with Docker: +```bash +docker run -d -p 6379:6379 redis:latest +``` + ## LLM Provider Configuration Honcho supports multiple LLM providers for different tasks. API keys are configured in the `[llm]` section, while specific features use their own configuration sections. @@ -221,6 +261,9 @@ LLM_OPENAI_COMPATIBLE_BASE_URL=https://your-openai-compatible-endpoint.com ```bash # Default settings for all LLM calls LLM_DEFAULT_MAX_TOKENS=2500 + +# Embedding provider (used when EMBED_MESSAGES=true) +LLM_EMBEDDING_PROVIDER=openai # Options: openai, gemini ``` ### Feature-Specific Model Configuration @@ -228,67 +271,147 @@ LLM_DEFAULT_MAX_TOKENS=2500 Different features can use different providers and models: **Dialectic API:** + +The Dialectic API provides theory-of-mind informed responses by integrating long-term facts with current context. + ```bash # Main dialectic model (default: Anthropic) DIALECTIC_PROVIDER=anthropic DIALECTIC_MODEL=claude-sonnet-4-20250514 DIALECTIC_MAX_OUTPUT_TOKENS=2500 -DIALECTIC_THINKING_BUDGET_TOKENS=1024 +DIALECTIC_THINKING_BUDGET_TOKENS=1024 # Only used with Anthropic provider +DIALECTIC_CONTEXT_WINDOW_SIZE=100000 # Maximum context window tokens -# Query generation for dialectic (default: Groq) +# Query generation for dialectic searches +DIALECTIC_PERFORM_QUERY_GENERATION=false # Enable query generation for semantic search DIALECTIC_QUERY_GENERATION_PROVIDER=groq DIALECTIC_QUERY_GENERATION_MODEL=llama-3.1-8b-instant # Semantic search settings -DIALECTIC_SEMANTIC_SEARCH_TOP_K=10 -DIALECTIC_SEMANTIC_SEARCH_MAX_DISTANCE=0.85 +DIALECTIC_SEMANTIC_SEARCH_TOP_K=10 # Number of results to retrieve +DIALECTIC_SEMANTIC_SEARCH_MAX_DISTANCE=0.85 # Maximum distance for relevance ``` -**Deriver:** +**Deriver (Theory of Mind):** + +The Deriver is a background processing system that extracts facts from messages and builds theory-of-mind representations of peers. + ```bash -# Deriver model (default: Google) +# LLM settings for deriver DERIVER_PROVIDER=google -DERIVER_MODEL=gemini-2.0-flash-lite +DERIVER_MODEL=gemini-2.5-flash-lite +DERIVER_MAX_OUTPUT_TOKENS=10000 +DERIVER_THINKING_BUDGET_TOKENS=1024 # Only used with Anthropic provider +DERIVER_MAX_INPUT_TOKENS=23000 # Maximum input tokens for deriver # Worker settings -DERIVER_WORKERS=1 -DERIVER_STALE_SESSION_TIMEOUT_MINUTES=5 -DERIVER_POLLING_SLEEP_INTERVAL_SECONDS=1.0 +DERIVER_WORKERS=1 # Number of background worker processes +DERIVER_POLLING_SLEEP_INTERVAL_SECONDS=1.0 # Time between queue checks +DERIVER_STALE_SESSION_TIMEOUT_MINUTES=5 # Timeout for stale sessions -# Peer card settings -DERIVER_PEER_CARD_PROVIDER=openai -DERIVER_PEER_CARD_MODEL=gpt-5-nano-2025-08-07 -DERIVER_PEER_CARD_MAX_OUTPUT_TOKENS=2000 +# Queue management +DERIVER_QUEUE_ERROR_RETENTION_SECONDS=2592000 # Keep errored items for 30 days -# Maximum number of observations to store in working representation -# This is applied to both explicit and deductive observations -DERIVER_WORKING_REPRESENTATION_MAX_OBSERVATIONS=100 +# Working representation settings +DERIVER_WORKING_REPRESENTATION_MAX_OBSERVATIONS=50 # Max observations stored +DERIVER_REPRESENTATION_BATCH_MAX_TOKENS=4096 # Max tokens per batch +``` + +**Peer Card:** + +Peer cards are short, structured summaries of peer identity and characteristics. + +```bash +# Enable/disable peer card generation +PEER_CARD_ENABLED=true + +# LLM settings for peer card generation +PEER_CARD_PROVIDER=openai +PEER_CARD_MODEL=gpt-5-nano-2025-08-07 +PEER_CARD_MAX_OUTPUT_TOKENS=4000 # Includes thinking tokens for GPT-5 models ``` **Summary Generation:** -```bash -# Summary model (default: Google) -SUMMARY_PROVIDER=google -SUMMARY_MODEL=gemini-1.5-flash-latest -SUMMARY_MAX_TOKENS_SHORT=1000 -SUMMARY_MAX_TOKENS_LONG=2000 -SUMMARY_THINKING_BUDGET_TOKENS=512 -# Summary frequency -SUMMARY_MESSAGES_PER_SHORT_SUMMARY=20 -SUMMARY_MESSAGES_PER_LONG_SUMMARY=60 +Session summaries provide compressed context for long conversations. Honcho creates two types: short summaries (frequent) and long summaries (comprehensive). + +```bash +# Enable/disable summarization +SUMMARY_ENABLED=true + +# LLM settings for summary generation +SUMMARY_PROVIDER=openai +SUMMARY_MODEL=gpt-4o-mini-2024-07-18 +SUMMARY_MAX_TOKENS_SHORT=1000 # Max tokens for short summaries +SUMMARY_MAX_TOKENS_LONG=4000 # Max tokens for long summaries +SUMMARY_THINKING_BUDGET_TOKENS=512 # Only used with Anthropic provider + +# Summary frequency thresholds +SUMMARY_MESSAGES_PER_SHORT_SUMMARY=20 # Create short summary every N messages +SUMMARY_MESSAGES_PER_LONG_SUMMARY=60 # Create long summary every N messages ``` ### Default Provider Usage By default, Honcho uses: -- **Anthropic** for dialectic API responses -- **Groq** for query generation -- **Google** for deriving theory of mind and summarization +- **Anthropic** (Claude) for dialectic API responses +- **Groq** for query generation (fast, cost-effective) +- **Google** (Gemini) for theory of mind derivation +- **OpenAI** (GPT) for peer cards and summarization - **OpenAI** for embeddings (if `EMBED_MESSAGES=true`) -You only need to set the API keys for the providers you plan to use. +You only need to set the API keys for the providers you plan to use. All providers are configurable per feature. +## Additional Features Configuration + +### Dream Processing + +Dream processing consolidates and refines peer representations during idle periods, similar to how human memory consolidation works during sleep. + +**Dream Settings:** +```bash +# Enable/disable dream processing +DREAM_ENABLED=true + +# Trigger thresholds +DREAM_DOCUMENT_THRESHOLD=50 # Minimum documents to trigger a dream +DREAM_IDLE_TIMEOUT_MINUTES=60 # Minutes of inactivity before dream can start +DREAM_MIN_HOURS_BETWEEN_DREAMS=8 # Minimum hours between dreams for a peer + +# Dream types to enable +DREAM_ENABLED_TYPES=["consolidate"] # Currently supported: consolidate + +# LLM settings for dream processing +DREAM_PROVIDER=openai +DREAM_MODEL=gpt-4o-mini-2024-07-18 +DREAM_MAX_OUTPUT_TOKENS=2000 +``` + +### Webhook Configuration + +Webhooks allow you to receive real-time notifications when events occur in Honcho (e.g., new messages, session updates). + +**Webhook Settings:** +```bash +# Webhook secret for signing payloads (optional but recommended) +WEBHOOK_SECRET=your-webhook-signing-secret + +# Limit on webhooks per workspace +WEBHOOK_MAX_WORKSPACE_LIMIT=10 +``` + +### Metrics Collection + +Enable metrics collection for monitoring Honcho performance and usage. + +**Metrics Settings:** +```bash +# Enable/disable metrics collection +METRICS_ENABLED=false + +# Namespace for metrics (used in metric names) +METRICS_NAMESPACE=honcho +``` ## Monitoring Configuration @@ -296,13 +419,17 @@ You only need to set the API keys for the providers you plan to use. **Sentry Settings:** ```bash -# Enable/disable Sentry +# Enable/disable Sentry error tracking SENTRY_ENABLED=false # Sentry configuration SENTRY_DSN=https://your-sentry-dsn@sentry.io/project-id -SENTRY_TRACES_SAMPLE_RATE=0.1 -SENTRY_PROFILES_SAMPLE_RATE=0.1 +SENTRY_RELEASE=2.4.0 # Optional: track which version errors come from +SENTRY_ENVIRONMENT=production # Environment name (development, staging, production) + +# Sampling rates (0.0 to 1.0) +SENTRY_TRACES_SAMPLE_RATE=0.1 # 10% of transactions tracked +SENTRY_PROFILES_SAMPLE_RATE=0.1 # 10% of transactions profiled ``` ## Environment-Specific Examples @@ -313,7 +440,7 @@ SENTRY_PROFILES_SAMPLE_RATE=0.1 ```toml [app] LOG_LEVEL = "DEBUG" -SESSION_PEERS_LIMIT = 10 +SESSION_OBSERVERS_LIMIT = 10 EMBED_MESSAGES = false [db] @@ -323,21 +450,40 @@ POOL_SIZE = 5 [auth] USE_AUTH = false +[cache] +ENABLED = false + [dialectic] PROVIDER = "anthropic" MODEL = "claude-sonnet-4-20250514" -QUERY_GENERATION_PROVIDER = "groq" -QUERY_GENERATION_MODEL = "llama-3.1-8b-instant" +PERFORM_QUERY_GENERATION = false MAX_OUTPUT_TOKENS = 2500 -[summary] -PROVIDER = "google" -MODEL = "gemini-1.5-flash-latest" -MAX_TOKENS_SHORT = 1000 -MAX_TOKENS_LONG = 2000 - [deriver] WORKERS = 1 +PROVIDER = "google" +MODEL = "gemini-2.5-flash-lite" + +[peer_card] +ENABLED = true +PROVIDER = "openai" +MODEL = "gpt-5-nano-2025-08-07" + +[summary] +ENABLED = true +PROVIDER = "openai" +MODEL = "gpt-4o-mini-2024-07-18" +MAX_TOKENS_SHORT = 1000 +MAX_TOKENS_LONG = 4000 + +[dream] +ENABLED = true + +[webhook] +MAX_WORKSPACE_LIMIT = 10 + +[metrics] +ENABLED = false [sentry] ENABLED = false @@ -349,7 +495,12 @@ ENABLED = false LOG_LEVEL=DEBUG DB_CONNECTION_URI=postgresql+psycopg://postgres:postgres@localhost:5432/honcho_dev AUTH_USE_AUTH=false -ANTHROPIC_API_KEY=your-dev-anthropic-key +CACHE_ENABLED=false + +# LLM Provider API Keys +LLM_ANTHROPIC_API_KEY=your-dev-anthropic-key +LLM_OPENAI_API_KEY=your-dev-openai-key +LLM_GEMINI_API_KEY=your-dev-gemini-key ``` ### Production Configuration @@ -358,7 +509,7 @@ ANTHROPIC_API_KEY=your-dev-anthropic-key ```toml [app] LOG_LEVEL = "WARNING" -SESSION_PEERS_LIMIT = 10 +SESSION_OBSERVERS_LIMIT = 10 EMBED_MESSAGES = true [db] @@ -369,27 +520,50 @@ MAX_OVERFLOW = 40 [auth] USE_AUTH = true +[cache] +ENABLED = true +URL = "redis://redis:6379/0" +DEFAULT_TTL_SECONDS = 300 + [dialectic] PROVIDER = "anthropic" MODEL = "claude-sonnet-4-20250514" -QUERY_GENERATION_PROVIDER = "groq" -QUERY_GENERATION_MODEL = "llama-3.1-8b-instant" +PERFORM_QUERY_GENERATION = false MAX_OUTPUT_TOKENS = 2500 -[summary] -PROVIDER = "google" -MODEL = "gemini-1.5-flash-latest" -MAX_TOKENS_SHORT = 1000 -MAX_TOKENS_LONG = 2000 - [deriver] WORKERS = 4 PROVIDER = "google" -MODEL = "gemini-2.0-flash-lite" +MODEL = "gemini-2.5-flash-lite" + +[peer_card] +ENABLED = true +PROVIDER = "openai" +MODEL = "gpt-5-nano-2025-08-07" + +[summary] +ENABLED = true +PROVIDER = "openai" +MODEL = "gpt-4o-mini-2024-07-18" +MAX_TOKENS_SHORT = 1000 +MAX_TOKENS_LONG = 4000 + +[dream] +ENABLED = true +PROVIDER = "openai" +MODEL = "gpt-4o-mini-2024-07-18" + +[webhook] +MAX_WORKSPACE_LIMIT = 10 + +[metrics] +ENABLED = true [sentry] ENABLED = true +ENVIRONMENT = "production" TRACES_SAMPLE_RATE = 0.1 +PROFILES_SAMPLE_RATE = 0.1 ``` **Environment variables for production:** @@ -397,11 +571,27 @@ TRACES_SAMPLE_RATE = 0.1 # .env.production LOG_LEVEL=WARNING DB_CONNECTION_URI=postgresql+psycopg://honcho_user:secure_password@prod-db:5432/honcho_prod + +# Authentication AUTH_USE_AUTH=true AUTH_JWT_SECRET=your-super-secret-jwt-key -ANTHROPIC_API_KEY=your-prod-anthropic-key -GEMINI_API_KEY=your-prod-gemini-key + +# Cache +CACHE_ENABLED=true +CACHE_URL=redis://redis:6379/0 + +# LLM Provider API Keys +LLM_ANTHROPIC_API_KEY=your-prod-anthropic-key +LLM_OPENAI_API_KEY=your-prod-openai-key +LLM_GEMINI_API_KEY=your-prod-gemini-key +LLM_GROQ_API_KEY=your-prod-groq-key + +# Webhooks +WEBHOOK_SECRET=your-webhook-signing-secret + +# Monitoring SENTRY_DSN=https://your-sentry-dsn@sentry.io/project-id +SENTRY_ENVIRONMENT=production ``` ## Migration Management diff --git a/pyproject.toml b/pyproject.toml index f39dcec5..8c0bf144 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -33,6 +33,8 @@ dependencies = [ "typing-extensions>=4.11.0", "prometheus-client>=0.20.0", "json-repair>=0.49.0", + "redis>=6.0.0", + "cashews[redis]>=7.4.3", ] [tool.uv] dev-dependencies = [ @@ -47,6 +49,7 @@ dev-dependencies = [ "pre-commit>=4.2.0", "pytest-cov>=6.2.1", "honcho-ai", + "fakeredis>=2.32.0", ] [tool.uv.workspace] diff --git a/src/cache/__init__.py b/src/cache/__init__.py new file mode 100644 index 00000000..44e5b5fe --- /dev/null +++ b/src/cache/__init__.py @@ -0,0 +1,11 @@ +"""Cache module for Honcho.""" + +from src.cache.client import ( + close_cache, + init_cache, +) + +__all__ = [ + "close_cache", + "init_cache", +] diff --git a/src/cache/client.py b/src/cache/client.py new file mode 100644 index 00000000..8f06ca46 --- /dev/null +++ b/src/cache/client.py @@ -0,0 +1,123 @@ +from __future__ import annotations + +import asyncio +import logging +from typing import cast + +import sentry_sdk +from cashews import cache +from cashews.picklers import PicklerType +from redis import exceptions as redis_exc +from tenacity import ( + AsyncRetrying, + retry_if_exception_type, + stop_after_delay, + wait_exponential_jitter, +) + +from src.config import settings + +logger = logging.getLogger(__name__) + + +_cache_lock = asyncio.Lock() + + +def is_cache_enabled() -> bool: + return settings.CACHE.ENABLED + + +def get_cache_namespace() -> str: + # CACHE.NAMESPACE is guaranteed to be non-None by AppSettings.propagate_namespace validator + return cast(str, settings.CACHE.NAMESPACE) + + +async def init_cache() -> None: + """Initialize and verify cache connection if enabled.""" + async with _cache_lock: + # Close existing backends to force recreation with new ContextVars + await cache.close() + + if not is_cache_enabled(): + # Use in-memory cache when caching is disabled + logger.info("Cache disabled, using in-memory cache") + cache.setup("mem://", pickle_type=PicklerType.SQLALCHEMY) # pyright: ignore[reportUnknownMemberType] + return + + # Setup cache with Redis backend + try: + cache.setup( # pyright: ignore[reportUnknownMemberType] + settings.CACHE.URL, + pickle_type=PicklerType.SQLALCHEMY, + ) + + except Exception as setup_err: + logger.warning( + "Cache setup failed for %s: %s. Falling back to in-memory cache", + settings.CACHE.URL, + setup_err, + ) + if settings.SENTRY.ENABLED: + sentry_sdk.capture_exception(setup_err) + # Fallback to in-memory cache + cache.setup("mem://", pickle_type=PicklerType.SQLALCHEMY) # pyright: ignore[reportUnknownMemberType] + return + + cache.enable() + # Retry Redis ping with exponential backoff + try: + async for attempt in AsyncRetrying( + wait=wait_exponential_jitter(initial=0.2, max=2.0), + stop=stop_after_delay(5), # give it a bit more headroom + retry=retry_if_exception_type( + ( + redis_exc.TimeoutError, + redis_exc.ConnectionError, + asyncio.TimeoutError, + TimeoutError, + ) + ), + reraise=True, + ): + with attempt: + async with asyncio.timeout(2): + await cache.ping() + logger.info("Connected to cache at %s", settings.CACHE.URL) + except ( + redis_exc.TimeoutError, + redis_exc.ConnectionError, + asyncio.TimeoutError, + TimeoutError, + ) as e: + logger.warning( + "Failed to connect to cache at %s: %s. Falling back to in-memory cache", + settings.CACHE.URL, + e, + ) + if settings.SENTRY.ENABLED: + sentry_sdk.capture_exception(e) + # Fallback to in-memory cache + await cache.close() + cache.setup("mem://", pickle_type=PicklerType.SQLALCHEMY) # pyright: ignore[reportUnknownMemberType] + except Exception as e: + logger.warning( + "Unexpected cache error at %s: %s. Falling back to in-memory cache", + settings.CACHE.URL, + e, + ) + if settings.SENTRY.ENABLED: + sentry_sdk.capture_exception(e) + # Fallback to in-memory cache + await cache.close() + cache.setup("mem://", pickle_type=PicklerType.SQLALCHEMY) # pyright: ignore[reportUnknownMemberType] + + +async def close_cache() -> None: + await cache.close() + + +__all__ = [ + "init_cache", + "close_cache", + "cache", +] diff --git a/src/config.py b/src/config.py index 6458717e..82e2b97a 100644 --- a/src/config.py +++ b/src/config.py @@ -50,6 +50,7 @@ class TomlConfigSettingsSource(PydanticBaseSettingsSource): "DB": "db", "AUTH": "auth", "SENTRY": "sentry", + "CACHE": "cache", "LLM": "llm", "DERIVER": "deriver", "PEER_CARD": "peer_card", @@ -290,7 +291,22 @@ class MetricsSettings(HonchoSettings): model_config = SettingsConfigDict(env_prefix="METRICS_", extra="ignore") # pyright: ignore ENABLED: bool = False - NAMESPACE: str = "honcho" + NAMESPACE: str | None = None + + +class CacheSettings(HonchoSettings): + model_config = SettingsConfigDict(env_prefix="CACHE_", extra="ignore") # pyright: ignore + + ENABLED: bool = False + URL: str = "redis://localhost:6379/0?suppress=false" + NAMESPACE: str | None = None + DEFAULT_TTL_SECONDS: Annotated[int, Field(default=300, ge=1, le=86_400)] = ( + 300 # how long to keep items in cache + ) + + DEFAULT_LOCK_TTL_SECONDS: Annotated[int, Field(default=5, ge=1, le=86_400)] = ( + 5 # how long to hold a lock on a resource when fetching DB after cache miss + ) class DreamSettings(HonchoSettings): @@ -334,6 +350,8 @@ class AppSettings(HonchoSettings): COLLECT_METRICS_LOCAL: bool = False LOCAL_METRICS_FILE: str = "metrics.jsonl" + NAMESPACE: str = "honcho" # Top-level namespace for all settings, can be overridden by nested-model settings + # Nested settings models DB: DBSettings = Field(default_factory=DBSettings) AUTH: AuthSettings = Field(default_factory=AuthSettings) @@ -345,6 +363,7 @@ class AppSettings(HonchoSettings): SUMMARY: SummarySettings = Field(default_factory=SummarySettings) WEBHOOK: WebhookSettings = Field(default_factory=WebhookSettings) METRICS: MetricsSettings = Field(default_factory=MetricsSettings) + CACHE: CacheSettings = Field(default_factory=CacheSettings) DREAM: DreamSettings = Field(default_factory=DreamSettings) @field_validator("LOG_LEVEL") @@ -354,6 +373,19 @@ class AppSettings(HonchoSettings): raise ValueError(f"Invalid log level: {v}") return log_level + @model_validator(mode="after") + def propagate_namespace(self) -> "AppSettings": + """Propagate top-level NAMESPACE to nested settings if not explicitly set. + + After this validator runs, CACHE.NAMESPACE and METRICS.NAMESPACE are guaranteed + to exist. + """ + if self.CACHE.NAMESPACE is None: + self.CACHE.NAMESPACE = self.NAMESPACE + if self.METRICS.NAMESPACE is None: + self.METRICS.NAMESPACE = self.NAMESPACE + return self + # Create a single global instance of the settings settings: AppSettings = AppSettings() diff --git a/src/crud/peer.py b/src/crud/peer.py index cad234c8..acacd235 100644 --- a/src/crud/peer.py +++ b/src/crud/peer.py @@ -1,16 +1,35 @@ from logging import getLogger from typing import Any +from cashews import NOT_NONE from sqlalchemy import Select, select from sqlalchemy.exc import IntegrityError from sqlalchemy.ext.asyncio import AsyncSession from src import models, schemas +from src.cache.client import cache, get_cache_namespace +from src.config import settings +from src.crud.workspace import get_or_create_workspace from src.exceptions import ConflictException, ResourceNotFoundException from src.utils.filter import apply_filter logger = getLogger(__name__) +PEER_CACHE_KEY_TEMPLATE = "workspace:{workspace_name}:peer:{peer_name}" +PEER_LOCK_PREFIX = f"{get_cache_namespace()}:lock" + + +def peer_cache_key(workspace_name: str, peer_name: str) -> str: + """Generate cache key for peer.""" + return ( + get_cache_namespace() + + ":" + + PEER_CACHE_KEY_TEMPLATE.format( + workspace_name=workspace_name, + peer_name=peer_name, + ) + ) + async def get_or_create_peers( db: AsyncSession, @@ -35,6 +54,8 @@ async def get_or_create_peers( Raises: ConflictException: If we fail to get or create the peers """ + + await get_or_create_workspace(db, schemas.WorkspaceCreate(name=workspace_name)) peer_names = [p.name for p in peers] stmt = ( select(models.Peer) @@ -75,8 +96,6 @@ async def get_or_create_peers( try: db.add_all(new_peers) await db.commit() - # Return combined list of existing and new peers - return existing_peers + new_peers except IntegrityError: await db.rollback() if _retry: @@ -85,6 +104,37 @@ async def get_or_create_peers( ) from None return await get_or_create_peers(db, workspace_name, peers, _retry=True) + # Invalidate cache for all updated/created peers - read-through pattern + for peer_obj in existing_peers + new_peers: + cache_key = peer_cache_key(workspace_name, peer_obj.name) + await cache.delete(cache_key) + + # Return combined list of existing and new peers + return existing_peers + new_peers + + +@cache( + key=PEER_CACHE_KEY_TEMPLATE, + ttl=f"{settings.CACHE.DEFAULT_TTL_SECONDS}s", + prefix=get_cache_namespace(), + condition=NOT_NONE, +) +@cache.locked( + key=PEER_CACHE_KEY_TEMPLATE, + ttl=f"{settings.CACHE.DEFAULT_LOCK_TTL_SECONDS}s", + prefix=PEER_LOCK_PREFIX, +) +async def _fetch_peer( + db: AsyncSession, + workspace_name: str, + peer_name: str, +) -> models.Peer | None: + return await db.scalar( + select(models.Peer) + .where(models.Peer.workspace_name == workspace_name) + .where(models.Peer.name == peer_name) + ) + async def get_peer( db: AsyncSession, @@ -105,21 +155,16 @@ async def get_peer( Raises: ResourceNotFoundException: If the peer does not exist """ - # Try to get the existing peer - stmt = ( - select(models.Peer) - .where(models.Peer.workspace_name == workspace_name) - .where(models.Peer.name == peer.name) - ) - result = await db.execute(stmt) - existing_peer = result.scalar_one_or_none() + existing_peer = await _fetch_peer(db, workspace_name, peer.name) + if existing_peer is None: + raise ResourceNotFoundException( + f"Peer {peer.name} not found in workspace {workspace_name}" + ) - if existing_peer is not None: - return existing_peer + # Merge cached object into session (cached objects are detached) + existing_peer = await db.merge(existing_peer, load=False) - raise ResourceNotFoundException( - f"Peer {peer.name} not found in workspace {workspace_name}" - ) + return existing_peer async def get_peers( @@ -166,7 +211,13 @@ async def update_peer( honcho_peer.configuration = peer.configuration await db.commit() - logger.debug(f"Peer {peer_name} updated successfully") + await db.refresh(honcho_peer) + + # Invalidate cache - read-through pattern + cache_key = peer_cache_key(workspace_name, honcho_peer.name) + await cache.delete(cache_key) + + logger.debug("Peer %s updated successfully", peer_name) return honcho_peer diff --git a/src/crud/peer_card.py b/src/crud/peer_card.py index 295d0de8..f04205ed 100644 --- a/src/crud/peer_card.py +++ b/src/crud/peer_card.py @@ -7,7 +7,8 @@ from sqlalchemy import update from sqlalchemy.ext.asyncio import AsyncSession from src import exceptions, models, schemas -from src.crud.peer import get_peer +from src.cache.client import cache +from src.crud.peer import get_peer, peer_cache_key logger = logging.getLogger(__name__) @@ -81,14 +82,20 @@ async def set_peer_card( } ) ) + .returning(models.Peer) ) result = await db.execute(stmt) - if result.rowcount == 0: + updated_peer = result.scalar_one_or_none() + if updated_peer is None: raise exceptions.ResourceNotFoundException( f"Peer {observer} not found in workspace {workspace_name}" ) await db.commit() + # Invalidate cache - read-through pattern + cache_key = peer_cache_key(workspace_name, observer) + await cache.delete(cache_key) + def construct_peer_card_label(*, observer: str, observed: str) -> str: if observer == observed: diff --git a/src/crud/session.py b/src/crud/session.py index cfb77660..625626e7 100644 --- a/src/crud/session.py +++ b/src/crud/session.py @@ -1,6 +1,7 @@ from logging import getLogger from typing import Any +from cashews import NOT_NONE from nanoid import generate as generate_nanoid from sqlalchemy import Select, case, cast, func, insert, select, update from sqlalchemy.dialects.postgresql import insert as pg_insert @@ -9,6 +10,7 @@ from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.types import BigInteger, Boolean from src import models, schemas +from src.cache.client import cache, get_cache_namespace from src.config import settings from src.exceptions import ( ConflictException, @@ -18,12 +20,48 @@ from src.exceptions import ( from src.utils.filter import apply_filter from .peer import get_or_create_peers, get_peer - -# Import workspace and peer functions that are needed from .workspace import get_or_create_workspace logger = getLogger(__name__) +SESSION_CACHE_KEY_TEMPLATE = "workspace:{workspace_name}:session:{session_name}" +SESSION_LOCK_PREFIX = f"{get_cache_namespace()}:lock" + + +def session_cache_key(workspace_name: str, session_name: str) -> str: + """Generate cache key for session.""" + return ( + get_cache_namespace() + + ":" + + SESSION_CACHE_KEY_TEMPLATE.format( + workspace_name=workspace_name, + session_name=session_name, + ) + ) + + +@cache( + key=SESSION_CACHE_KEY_TEMPLATE, + ttl=f"{settings.CACHE.DEFAULT_TTL_SECONDS}s", + prefix=get_cache_namespace(), + condition=NOT_NONE, +) +@cache.locked( + key=SESSION_CACHE_KEY_TEMPLATE, + ttl=f"{settings.CACHE.DEFAULT_LOCK_TTL_SECONDS}s", + prefix=SESSION_LOCK_PREFIX, +) +async def _fetch_session( + db: AsyncSession, + workspace_name: str, + session_name: str, +) -> models.Session | None: + return await db.scalar( + select(models.Session) + .where(models.Session.workspace_name == workspace_name) + .where(models.Session.name == session_name) + ) + def count_observers_in_config( peer_configs: dict[str, schemas.SessionPeerConfig], @@ -79,15 +117,14 @@ async def get_or_create_session( ConflictException: If we fail to get or create the session """ - stmt = ( - select(models.Session) - .where(models.Session.workspace_name == workspace_name) - .where(models.Session.name == session.name) - ) + if not session.name: + raise ValueError("Session name must be provided") - result = await db.execute(stmt) + honcho_session = await _fetch_session(db, workspace_name, session.name) - honcho_session = result.scalar_one_or_none() + # Merge cached object into session if it exists (cached objects are detached) + if honcho_session is not None: + honcho_session = await db.merge(honcho_session, load=False) # Check if session already exists if honcho_session is None: @@ -148,6 +185,12 @@ async def get_or_create_session( ) await db.commit() + await db.refresh(honcho_session) + + cache_key = session_cache_key(workspace_name, session.name) + await cache.set( + cache_key, honcho_session, expire=settings.CACHE.DEFAULT_TTL_SECONDS + ) return honcho_session @@ -170,22 +213,17 @@ async def get_session( Raises: ResourceNotFoundException: If the session does not exist """ - stmt = ( - select(models.Session) - .where(models.Session.workspace_name == workspace_name) - .where(models.Session.name == session_name) - ) + session = await _fetch_session(db, workspace_name, session_name) - result = await db.execute(stmt) - - honcho_session = result.scalar_one_or_none() - - if honcho_session is None: + if session is None: raise ResourceNotFoundException( f"Session {session_name} not found in workspace {workspace_name}" ) - return honcho_session + # Merge cached object into session (cached objects are detached) + session = await db.merge(session, load=False) + + return session async def update_session( @@ -220,6 +258,12 @@ async def update_session( honcho_session.configuration = session.configuration await db.commit() + await db.refresh(honcho_session) + + # Invalidate cache - read-through pattern + cache_key = session_cache_key(workspace_name, session_name) + await cache.delete(cache_key) + logger.debug("Session %s updated successfully", session_name) return honcho_session @@ -241,22 +285,16 @@ async def delete_session( Raises: ResourceNotFoundException: If the session does not exist """ - stmt = ( - select(models.Session) - .where(models.Session.workspace_name == workspace_name) - .where(models.Session.name == session_name) - ) - result = await db.execute(stmt) - honcho_session = result.scalar_one_or_none() - - if honcho_session is None: - logger.warning( - f"Session {session_name} not found in workspace {workspace_name}" - ) - raise ResourceNotFoundException("Session not found") + honcho_session = await get_session(db, session_name, workspace_name) honcho_session.is_active = False await db.commit() + await db.refresh(honcho_session) + + # Invalidate cache - read-through pattern + cache_key = session_cache_key(workspace_name, session_name) + await cache.delete(cache_key) + logger.debug("Session %s marked as inactive", session_name) return True @@ -359,7 +397,10 @@ async def clone_session( db.add(new_session_peer) await db.commit() + await db.refresh(new_session) logger.debug("Session %s cloned successfully", original_session_name) + + # Cache will be populated on next read - read-through pattern return new_session @@ -385,18 +426,7 @@ async def remove_peers_from_session( ResourceNotFoundException: If the session does not exist """ # Verify session exists - stmt = ( - select(models.Session) - .where(models.Session.workspace_name == workspace_name) - .where(models.Session.name == session_name) - ) - result = await db.execute(stmt) - session = result.scalar_one_or_none() - - if session is None: - raise ResourceNotFoundException( - f"Session {session_name} not found in workspace {workspace_name}" - ) + await get_session(db, session_name, workspace_name) # Soft delete specified session peers by setting left_at timestamp update_stmt = ( @@ -409,7 +439,7 @@ async def remove_peers_from_session( ) .values(left_at=func.now()) ) - result = await db.execute(update_stmt) + await db.execute(update_stmt) await db.commit() return True diff --git a/src/crud/workspace.py b/src/crud/workspace.py index d9af943c..c872b728 100644 --- a/src/crud/workspace.py +++ b/src/crud/workspace.py @@ -1,16 +1,51 @@ from logging import getLogger from typing import Any +from cashews import NOT_NONE from sqlalchemy import Select, delete, func, select from sqlalchemy.exc import IntegrityError from sqlalchemy.ext.asyncio import AsyncSession from src import models, schemas +from src.cache.client import cache, get_cache_namespace +from src.config import settings from src.exceptions import ConflictException, ResourceNotFoundException from src.utils.filter import apply_filter logger = getLogger(__name__) +WORKSPACE_CACHE_KEY_TEMPLATE = "workspace:{workspace_name}" +WORKSPACE_LOCK_PREFIX = f"{get_cache_namespace()}:lock" + + +def workspace_cache_key(workspace_name: str) -> str: + """Generate cache key for workspace.""" + return ( + get_cache_namespace() + + ":" + + WORKSPACE_CACHE_KEY_TEMPLATE.format(workspace_name=workspace_name) + ) + + +@cache( + key=WORKSPACE_CACHE_KEY_TEMPLATE, + ttl=f"{settings.CACHE.DEFAULT_TTL_SECONDS}s", + prefix=get_cache_namespace(), + condition=NOT_NONE, +) +@cache.locked( + key=WORKSPACE_CACHE_KEY_TEMPLATE, + ttl=f"{settings.CACHE.DEFAULT_LOCK_TTL_SECONDS}s", + prefix=WORKSPACE_LOCK_PREFIX, +) +async def _fetch_workspace( + db: AsyncSession, workspace_name: str +) -> models.Workspace | None: + """Fetch a workspace from the database.""" + return await db.scalar( + select(models.Workspace).where(models.Workspace.name == workspace_name) + ) + async def get_or_create_workspace( db: AsyncSession, @@ -31,14 +66,17 @@ async def get_or_create_workspace( Raises: ConflictException: If we fail to get or create the workspace """ - # Try to get the existing workspace - stmt = select(models.Workspace).where(models.Workspace.name == workspace.name) - result = await db.execute(stmt) - existing_workspace = result.scalar_one_or_none() + if not workspace.name: + raise ValueError("Workspace name must be provided") + + # Check if workspace already exists + existing_workspace = await _fetch_workspace(db, workspace.name) if existing_workspace is not None: # Workspace already exists logger.debug("Found existing workspace: %s", workspace.name) + # Merge cached object into session (cached objects are detached) + existing_workspace = await db.merge(existing_workspace, load=False) return existing_workspace # Workspace doesn't exist, create a new one @@ -50,7 +88,14 @@ async def get_or_create_workspace( try: db.add(honcho_workspace) await db.commit() + await db.refresh(honcho_workspace) + logger.debug("Workspace created successfully: %s", workspace.name) + + cache_key = workspace_cache_key(workspace.name) + await cache.set( + cache_key, honcho_workspace, expire=settings.CACHE.DEFAULT_TTL_SECONDS + ) return honcho_workspace except IntegrityError: await db.rollback() @@ -94,15 +139,15 @@ async def get_workspace( Raises: ResourceNotFoundException: If the workspace does not exist """ - # Try to get the existing peer - stmt = select(models.Workspace).where(models.Workspace.name == workspace_name) - result = await db.execute(stmt) - existing_workspace = result.scalar_one_or_none() + existing_workspace = await _fetch_workspace(db, workspace_name) - if existing_workspace is not None: - return existing_workspace + if existing_workspace is None: + raise ResourceNotFoundException(f"Workspace {workspace_name} not found") - raise ResourceNotFoundException(f"Workspace {workspace_name} not found") + # Merge cached object into session (cached objects are detached) + existing_workspace = await db.merge(existing_workspace, load=False) + + return existing_workspace async def update_workspace( @@ -134,6 +179,12 @@ async def update_workspace( honcho_workspace.configuration = workspace.configuration await db.commit() + await db.refresh(honcho_workspace) + + # Invalidate cache + cache_key = workspace_cache_key(workspace_name) + await cache.delete(cache_key) + logger.debug("Workspace with id %s updated successfully", honcho_workspace.id) return honcho_workspace @@ -241,10 +292,18 @@ async def delete_workspace(db: AsyncSession, workspace_name: str) -> schemas.Wor ) await db.delete(honcho_workspace) await db.commit() + + cache_key = workspace_cache_key(workspace_name) + workspace_pattern = f"{cache_key}*" + await cache.delete_match(workspace_pattern) + logger.debug("Workspace %s deleted", workspace_name) - except Exception as e: - logger.error("Failed to delete workspace %s: %s", workspace_name, e) + except Exception: + logger.exception( + "Failed to delete workspace %s", + workspace_name, + ) await db.rollback() - raise e + raise return workspace_snapshot diff --git a/src/deriver/queue_manager.py b/src/deriver/queue_manager.py index 356ae3ba..953895a2 100644 --- a/src/deriver/queue_manager.py +++ b/src/deriver/queue_manager.py @@ -16,6 +16,7 @@ from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.sql import func from src import models, prometheus +from src.cache.client import close_cache, init_cache from src.config import settings from src.dependencies import tracked_db from src.deriver.consumer import ( @@ -766,6 +767,13 @@ class QueueManager: async def main(): logger.debug("Starting queue manager") + try: + await init_cache() + except Exception as e: + logger.warning( + "Error initializing cache in queue manager; proceeding without cache: %s", e + ) + manager = QueueManager() try: await manager.initialize() @@ -773,4 +781,5 @@ async def main(): logger.error(f"Error in main: {str(e)}") sentry_sdk.capture_exception(e) finally: + await close_cache() logger.debug("Main function exiting") diff --git a/src/main.py b/src/main.py index 0ea88272..bb354dec 100644 --- a/src/main.py +++ b/src/main.py @@ -16,6 +16,7 @@ from sentry_sdk.integrations.fastapi import FastApiIntegration from sentry_sdk.integrations.starlette import StarletteIntegration from src import prometheus +from src.cache.client import close_cache, init_cache from src.config import settings from src.db import engine, request_context from src.exceptions import HonchoException @@ -109,8 +110,18 @@ if SENTRY_ENABLED: @asynccontextmanager async def lifespan(_: FastAPI): - yield - await engine.dispose() + try: + await init_cache() + except Exception as e: + logger.warning( + "Error initializing cache in api process; proceeding without cache: %s", e + ) + + try: + yield + finally: + await close_cache() + await engine.dispose() app = FastAPI( diff --git a/src/prometheus.py b/src/prometheus.py index 85bda9ec..f19d30f3 100644 --- a/src/prometheus.py +++ b/src/prometheus.py @@ -5,6 +5,7 @@ This module defines all Prometheus metrics for all Honcho processes and exposes """ import logging +from typing import cast from prometheus_client import ( CONTENT_TYPE_LATEST, @@ -28,7 +29,8 @@ class NamespacedCounter(Counter): def labels(self, **kwargs: str) -> "NamespacedCounter": """Override labels to automatically appends namespace label""" - kwargs["namespace"] = settings.METRICS.NAMESPACE + # METRICS.NAMESPACE is guaranteed to be non-None by AppSettings.propagate_namespace validator + kwargs["namespace"] = cast(str, settings.METRICS.NAMESPACE) return super().labels(**kwargs) diff --git a/tests/bench/harness.py b/tests/bench/harness.py index 09bb7840..1e3f1a2c 100755 --- a/tests/bench/harness.py +++ b/tests/bench/harness.py @@ -11,6 +11,7 @@ This script: """ import argparse +import asyncio import os import shutil import subprocess @@ -22,6 +23,8 @@ from pathlib import Path import yaml +from src.cache.client import close_cache, init_cache + class HonchoHarness: """ @@ -65,6 +68,9 @@ class HonchoHarness: # Update the database port compose_data["services"]["database"]["ports"] = [f"{self.db_port}:5432"] + # Update the Redis port + compose_data["services"]["redis"]["ports"] = ["6379:6379"] + # Add a unique project name to avoid conflicts compose_data["name"] = f"honcho_harness_{self.db_port}" @@ -111,13 +117,15 @@ class HonchoHarness: def get_database_env_vars(self) -> dict[str, str]: """ - Get environment variables for database configuration and required API keys. + Get environment variables for database configuration, cache configuration, and required API keys. Returns: - Dictionary of environment variables for database connection and API keys + Dictionary of environment variables for database connection, cache, and API keys """ return { "DB_CONNECTION_URI": f"postgresql+psycopg://testuser:testpwd@localhost:{self.db_port}/honcho", + "CACHE_ENABLED": "true", + "CACHE_URL": "redis://localhost:6379/0", } def start_database(self) -> None: @@ -149,6 +157,99 @@ class HonchoHarness: print("Database started successfully") + def start_redis(self) -> None: + """ + Start the Redis cache server using Docker Compose. + """ + print("Starting Redis cache server on port 6379...") + + # Change to the temp directory and start the redis service + result = subprocess.run( + [ + "docker-compose", + "-f", + str(self.docker_compose_file), + "-p", + f"honcho_harness_{self.db_port}", + "up", + "-d", + "redis", + ], + cwd=self.temp_dir, + capture_output=True, + text=True, + ) + + if result.returncode != 0: + print(f"Failed to start Redis: {result.stderr}") + sys.exit(1) + + print("Redis started successfully") + + def wait_for_redis(self, timeout: int = 30) -> bool: + """ + Wait for Redis to be ready. + + Args: + timeout: Maximum time to wait in seconds + + Returns: + True if Redis is ready, False otherwise + """ + print("Waiting for Redis to be ready...") + start_time = time.time() + redis_port = 6379 + + while time.time() - start_time < timeout: + try: + import redis + + # Test Redis connection + r = redis.Redis( + host="localhost", port=redis_port, decode_responses=True + ) + r.ping() # pyright: ignore[reportUnknownMemberType] + print("Redis is ready!") + return True + except Exception: + pass + + time.sleep(1) # Check every second + + print("Redis failed to become ready within timeout") + return False + + async def init_cache(self) -> None: + """ + Initialize the Redis cache connection. + """ + try: + # Add the project root to the path so we can import Honcho modules + sys.path.insert(0, str(self.project_root)) + + # Set environment variables for cache configuration + env = self.get_database_env_vars() + for key, value in env.items(): + os.environ[key] = value + + await init_cache() + print(f"[Instance {self.instance_id}] Cache initialized successfully") + except Exception as e: + print(f"[Instance {self.instance_id}] Failed to initialize cache: {e}") + + async def close_cache(self) -> None: + """ + Close the Redis cache connection. + """ + try: + # Add the project root to the path so we can import Honcho modules + sys.path.insert(0, str(self.project_root)) + + await close_cache() + print(f"[Instance {self.instance_id}] Cache closed successfully") + except Exception as e: + print(f"[Instance {self.instance_id}] Failed to close cache: {e}") + def wait_for_database(self, timeout: int = 60) -> bool: """ Wait for the database to be ready. @@ -576,10 +677,16 @@ except Exception as e: except Exception as e: print(f"Error removing temp directory: {e}") + # Close cache + try: + asyncio.run(self.close_cache()) + except Exception as e: + print(f"Error closing cache: {e}") + # Restore .env file self.restore_env_file() - def run(self) -> None: + async def run(self) -> None: """ Run the complete Honcho harness. """ @@ -606,11 +713,22 @@ except Exception as e: # Start database self.start_database() + # Start Redis + self.start_redis() + # Wait for database to be ready if not self.wait_for_database(): print("Database failed to start. Exiting.") sys.exit(1) + # Wait for Redis to be ready + if not self.wait_for_redis(): + print("Redis failed to start. Exiting.") + sys.exit(1) + + # Initialize cache + await self.init_cache() + # Provision database self.provision_database() @@ -700,7 +818,7 @@ class HonchoHarnessPool: ) self.harnesses.append(harness) - def run(self) -> None: + async def run(self) -> None: """ Run all Honcho harnesses in the pool. """ @@ -748,6 +866,9 @@ class HonchoHarnessPool: # Start database harness.start_database() + # Start Redis + harness.start_redis() + # Wait for database to be ready if not harness.wait_for_database(): print( @@ -755,6 +876,16 @@ class HonchoHarnessPool: ) sys.exit(1) + # Wait for Redis to be ready + if not harness.wait_for_redis(): + print( + f"Redis failed to start for instance {harness.instance_id}. Exiting." + ) + sys.exit(1) + + # Initialize cache + await harness.init_cache() + # Provision database harness.provision_database() @@ -903,7 +1034,7 @@ Examples: base_api_port=args.api_port, project_root=args.project_root, ) - pool.run() + asyncio.run(pool.run()) else: harness = HonchoHarness( db_port=args.port, @@ -911,7 +1042,7 @@ Examples: project_root=args.project_root, instance_id=0, ) - harness.run() + asyncio.run(harness.run()) if __name__ == "__main__": diff --git a/tests/conftest.py b/tests/conftest.py index 4b7cb9c1..1278ce78 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -6,6 +6,9 @@ from unittest.mock import AsyncMock, MagicMock, patch import jwt import pytest import pytest_asyncio +from cashews.backends.interface import ControlMixin +from cashews.picklers import PicklerType +from fakeredis import FakeAsyncRedis from fastapi import Request from fastapi.responses import JSONResponse from fastapi.testclient import TestClient @@ -26,6 +29,7 @@ from sqlalchemy_utils import ( ) from src import models +from src.cache.client import cache from src.config import settings from src.db import Base from src.dependencies import get_db @@ -164,8 +168,79 @@ async def db_session(db_engine: AsyncEngine): await session.rollback() +@pytest_asyncio.fixture(scope="session") +async def fake_cache_session(): + """Set up fakeredis for caching once per test session.""" + # Store original settings + original_enabled = settings.CACHE.ENABLED + original_url = settings.CACHE.URL + + # Create a fake redis instance that persists for the session + fake_redis = FakeAsyncRedis(decode_responses=True) + + # Patch redis creation to use fakeredis + # Cashews uses redis.asyncio.from_url to create connections + def fake_redis_from_url(*_args: Any, **_kwargs: Any): + return fake_redis + + # Patch the cashews backend's _disable property to avoid ContextVar issues + # This works around cashews' ContextVar not being properly initialized in TestClient context + + original_disable_property = ControlMixin._disable # pyright: ignore[reportPrivateUsage] + + @property # type: ignore + def patched_disable_property(self): # pyright: ignore + try: + return original_disable_property.fget(self) # pyright: ignore[reportOptionalCall] + except LookupError: + # Return empty set as default if ContextVar not set in current context + return set() # pyright: ignore + + # Start patching + redis_patch = patch("redis.asyncio.from_url", fake_redis_from_url) + redis_patch.start() + ControlMixin._disable = patched_disable_property # pyright: ignore[reportPrivateUsage, reportAttributeAccessIssue] + + try: + # Enable caching and set URL for tests + settings.CACHE.ENABLED = True + settings.CACHE.URL = "redis://fake-redis:6379/0" + + # Setup cache for tests that don't use TestClient (direct CRUD tests) + # For TestClient tests, the app's lifespan handler will also call cache.setup() + # The ContextVar patch above handles any context issues + cache.setup( # pyright: ignore[reportUnknownMemberType] + "redis://fake-redis:6379/0", pickle_type=PicklerType.SQLALCHEMY, enable=True + ) + + yield fake_redis + finally: + # Stop the patches + redis_patch.stop() + ControlMixin._disable = original_disable_property # pyright: ignore[reportPrivateUsage, reportAttributeAccessIssue] + + # Restore original settings + settings.CACHE.ENABLED = original_enabled + settings.CACHE.URL = original_url + + +@pytest_asyncio.fixture(scope="function", autouse=True) +async def fake_cache(fake_cache_session: FakeAsyncRedis): + """Clear cache between tests.""" + # Clear cache before each test + await fake_cache_session.flushall() # pyright: ignore[reportUnknownMemberType] + + yield cache + + # Clear cache after each test + await fake_cache_session.flushall() # pyright: ignore[reportUnknownMemberType] + + @pytest.fixture(scope="function") -async def client(db_session: AsyncSession): +async def client( + db_session: AsyncSession, + fake_cache_session: FakeAsyncRedis, # pyright: ignore[reportUnusedParameter] +) -> AsyncGenerator[TestClient, Any]: """Create a FastAPI TestClient for the scope of a single test function""" # Register exception handlers for tests @@ -491,6 +566,7 @@ def mock_tracked_db(db_session: AsyncSession): patch("src.dependencies.tracked_db", mock_tracked_db_context), patch("src.deriver.queue_manager.tracked_db", mock_tracked_db_context), patch("src.routers.sessions.tracked_db", mock_tracked_db_context), + patch("src.routers.peers.tracked_db", mock_tracked_db_context), patch("src.crud.representation.tracked_db", mock_tracked_db_context), patch("src.routers.peers.tracked_db", mock_tracked_db_context), patch("src.dreamer.dreamer.tracked_db", mock_tracked_db_context), diff --git a/uv.lock b/uv.lock index 43347634..87614adf 100644 --- a/uv.lock +++ b/uv.lock @@ -70,6 +70,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/6f/12/e5e0282d673bb9746bacfb6e2dba8719989d3660cdb2ea79aee9a9651afb/anyio-4.10.0-py3-none-any.whl", hash = "sha256:60e474ac86736bbfd6f210f7a61218939c318f43f9972497381f1c5e930ed3d1", size = 107213, upload-time = "2025-08-04T08:54:24.882Z" }, ] +[[package]] +name = "async-timeout" +version = "5.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a5/ae/136395dfbfe00dfc94da3f3e136d0b13f394cba8f4841120e34226265780/async_timeout-5.0.1.tar.gz", hash = "sha256:d9321a7a3d5a6a5e187e824d2fa0793ce379a202935782d555d6e9d2735677d3", size = 9274, upload-time = "2024-11-06T16:41:39.6Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fe/ba/e2081de779ca30d473f21f5b30e0e737c438205440784c7dfc81efc2b029/async_timeout-5.0.1-py3-none-any.whl", hash = "sha256:39e3809566ff85354557ec2398b55e096c8364bacac9405a7a1fa429e77fe76c", size = 6233, upload-time = "2024-11-06T16:41:37.9Z" }, +] + [[package]] name = "attrs" version = "25.3.0" @@ -118,6 +127,20 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/72/76/20fa66124dbe6be5cafeb312ece67de6b61dd91a0247d1ea13db4ebb33c2/cachetools-5.5.2-py3-none-any.whl", hash = "sha256:d26a22bcc62eb95c3beabd9f1ee5e820d3d2704fe2967cbe350e20c8ffcd3f0a", size = 10080, upload-time = "2025-02-20T21:01:16.647Z" }, ] +[[package]] +name = "cashews" +version = "7.4.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/52/d9/e7b3daee814680e9a4a02835beb8c13b489a4422e902a7f39371c811ed2b/cashews-7.4.3.tar.gz", hash = "sha256:72cc1931b558e1bbe1e80395f9be6707131ffe21768f55e359d3e760c802fbb1", size = 92426, upload-time = "2025-10-11T21:08:41.761Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c5/6b/40059c0d5fe32b6434aae14b55afe6a7e6d158826582a5a44101bb5daaed/cashews-7.4.3-py3-none-any.whl", hash = "sha256:33449b26b44c36d3ab6e73f91f71ade1e29e918e85a820238f1947beaae26322", size = 79729, upload-time = "2025-10-11T21:08:40.236Z" }, +] + +[package.optional-dependencies] +redis = [ + { name = "redis" }, +] + [[package]] name = "certifi" version = "2025.8.3" @@ -464,6 +487,20 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/36/f4/c6e662dade71f56cd2f3735141b265c3c79293c109549c1e6933b0651ffc/exceptiongroup-1.3.0-py3-none-any.whl", hash = "sha256:4d111e6e0c13d0644cad6ddaa7ed0261a0b36971f6d23e7ec9b4b9097da78a10", size = 16674, upload-time = "2025-05-10T17:42:49.33Z" }, ] +[[package]] +name = "fakeredis" +version = "2.32.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "redis" }, + { name = "sortedcontainers" }, + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e1/2e/94ca3f2ff35f086d7d3eeb924054e328b2ac851f0a20302d942c8d29726c/fakeredis-2.32.0.tar.gz", hash = "sha256:63d745b40eb6c8be4899cf2a53187c097ccca3afbca04fdbc5edc8b936cd1d59", size = 171097, upload-time = "2025-10-07T10:46:58.876Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0e/1b/84ab7fd197eba5243b6625c78fbcffaa4cf6ac7dda42f95d22165f52187e/fakeredis-2.32.0-py3-none-any.whl", hash = "sha256:c9da8228de84060cfdb72c3cf4555c18c59ba7a5ae4d273f75e4822d6f01ecf8", size = 118422, upload-time = "2025-10-07T10:46:57.643Z" }, +] + [[package]] name = "fastapi" version = "0.116.1" @@ -677,6 +714,7 @@ version = "2.4.2" source = { virtual = "." } dependencies = [ { name = "alembic" }, + { name = "cashews", extra = ["redis"] }, { name = "fastapi", extra = ["standard"] }, { name = "fastapi-pagination" }, { name = "google-genai" }, @@ -695,6 +733,7 @@ dependencies = [ { name = "pydantic-settings" }, { name = "pyjwt" }, { name = "python-dotenv" }, + { name = "redis" }, { name = "rich" }, { name = "sentry-sdk", extra = ["anthropic", "fastapi", "sqlalchemy"] }, { name = "sqlalchemy" }, @@ -707,6 +746,7 @@ dependencies = [ dev = [ { name = "basedpyright" }, { name = "coverage" }, + { name = "fakeredis" }, { name = "honcho-ai" }, { name = "interrogate" }, { name = "pre-commit" }, @@ -721,6 +761,7 @@ dev = [ [package.metadata] requires-dist = [ { name = "alembic", specifier = ">=1.14.0" }, + { name = "cashews", extras = ["redis"], specifier = ">=7.4.3" }, { name = "fastapi", extras = ["standard"], specifier = ">=0.111.0" }, { name = "fastapi-pagination", specifier = ">=0.12.24" }, { name = "google-genai", specifier = ">=1.32.0" }, @@ -739,6 +780,7 @@ requires-dist = [ { name = "pydantic-settings", specifier = ">=2.10.1" }, { name = "pyjwt", specifier = ">=2.10.0" }, { name = "python-dotenv", specifier = ">=1.0.0" }, + { name = "redis", specifier = ">=6.0.0" }, { name = "rich", specifier = ">=13.7.1" }, { name = "sentry-sdk", extras = ["anthropic", "fastapi", "sqlalchemy"], specifier = ">=2.3.1" }, { name = "sqlalchemy", specifier = ">=2.0.30" }, @@ -751,6 +793,7 @@ requires-dist = [ dev = [ { name = "basedpyright", specifier = ">=1.29.4" }, { name = "coverage", specifier = ">=7.6.0" }, + { name = "fakeredis", specifier = ">=2.32.0" }, { name = "honcho-ai", editable = "sdks/python" }, { name = "interrogate", specifier = ">=1.7.0" }, { name = "pre-commit", specifier = ">=4.2.0" }, @@ -1967,6 +2010,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/fa/de/02b54f42487e3d3c6efb3f89428677074ca7bf43aae402517bc7cca949f3/PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", size = 156446, upload-time = "2024-08-06T20:33:04.33Z" }, ] +[[package]] +name = "redis" +version = "6.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "async-timeout", marker = "python_full_version < '3.11.3'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0d/d6/e8b92798a5bd67d659d51a18170e91c16ac3b59738d91894651ee255ed49/redis-6.4.0.tar.gz", hash = "sha256:b01bc7282b8444e28ec36b261df5375183bb47a07eb9c603f284e89cbc5ef010", size = 4647399, upload-time = "2025-08-07T08:10:11.441Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e8/02/89e2ed7e85db6c93dfa9e8f691c5087df4e3551ab39081a4d7c6d1f90e05/redis-6.4.0-py3-none-any.whl", hash = "sha256:f0544fa9604264e9464cdf4814e7d4830f74b165d52f2a330a760a88dd248b7f", size = 279847, upload-time = "2025-08-07T08:10:09.84Z" }, +] + [[package]] name = "regex" version = "2025.7.34" @@ -2261,6 +2316,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235, upload-time = "2024-02-25T23:20:01.196Z" }, ] +[[package]] +name = "sortedcontainers" +version = "2.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e8/c4/ba2f8066cceb6f23394729afe52f3bf7adec04bf9ed2c820b39e19299111/sortedcontainers-2.4.0.tar.gz", hash = "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88", size = 30594, upload-time = "2021-05-16T22:03:42.897Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/32/46/9cb0e58b2deb7f82b84065f37f3bffeb12413f947f9388e4cac22c4621ce/sortedcontainers-2.4.0-py2.py3-none-any.whl", hash = "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0", size = 29575, upload-time = "2021-05-16T22:03:41.177Z" }, +] + [[package]] name = "sqlalchemy" version = "2.0.42" From d7bdcc3bc1418687d4a32241effa23ef0bb47a2f Mon Sep 17 00:00:00 2001 From: Rajat Ahuja Date: Fri, 7 Nov 2025 13:22:24 -0500 Subject: [PATCH 12/13] feat: codify queue columns (#254) * feat: codify queue columns * fix: batch with python loop control * fix: cleanup merge * fix: down revision * fix: batch delete in migration * feat: only run alembic tests for changed migration / test (#264) * feat: only run alembic tests for changed migration / test * fix: Run full test suite if alembic testing infra changes * feat: codify times_derived + level on Document (#260) * feat: codify times_derived + level on Document * fix: CR comment * fix: CodeRabbit comments * fix: batch migrations; move types; remove fields from payload * fix: rm duplicate table args * fix: add messages.id FK --- .pre-commit-config.yaml | 6 +- ...codify_document_level_and_times_derived.py | 164 +++++++++ ...odify_workspace_name_and_message_id_in_.py | 252 +++++++++++++ scripts/run_alembic_tests.py | 141 ++++++++ src/crud/document.py | 2 + src/crud/representation.py | 6 +- src/deriver/consumer.py | 55 ++- src/deriver/enqueue.py | 33 +- src/deriver/queue_manager.py | 20 +- src/dreamer/dream_scheduler.py | 17 +- src/dreamer/dreamer.py | 23 +- src/models.py | 38 +- src/schemas.py | 17 +- src/utils/queue_payload.py | 31 +- src/utils/representation.py | 4 +- src/utils/types.py | 2 + src/utils/work_unit.py | 6 +- src/webhooks/events.py | 13 +- src/webhooks/webhook_delivery.py | 10 +- tests/alembic/revisions/__init__.py | 4 + ...codify_document_level_and_times_derived.py | 315 ++++++++++++++++ ...odify_workspace_name_and_message_id_in_.py | 336 ++++++++++++++++++ tests/crud/test_workspace.py | 1 + tests/deriver/conftest.py | 42 ++- tests/deriver/test_deriver_processing.py | 18 +- tests/deriver/test_queue_processing.py | 101 ++++-- tests/integration/test_representation.py | 14 +- tests/routes/test_queue_status.py | 11 +- tests/test_schema_validations.py | 7 +- 29 files changed, 1503 insertions(+), 186 deletions(-) create mode 100644 migrations/versions/b8183c5ffb48_codify_document_level_and_times_derived.py create mode 100644 migrations/versions/ec8f94139b02_codify_workspace_name_and_message_id_in_.py create mode 100755 scripts/run_alembic_tests.py create mode 100644 tests/alembic/revisions/test_b8183c5ffb48_codify_document_level_and_times_derived.py create mode 100644 tests/alembic/revisions/test_ec8f94139b02_codify_workspace_name_and_message_id_in_.py diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 7cc0de63..6d5a3f6c 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -74,11 +74,11 @@ repos: # Run Alembic tests only when migrations change - id: pytest-alembic name: pytest (alembic migrations) - entry: uv run pytest tests/alembic/ + entry: uv run python scripts/run_alembic_tests.py language: system - files: ^(migrations/.*\.py|tests/alembic/.*\.py)$ + files: ^(migrations/versions/.*\.py|tests/alembic/.*\.py)$ stages: [pre-push] - pass_filenames: false + pass_filenames: true require_serial: true # Ensure each alembic migration revision has a corresponding test file diff --git a/migrations/versions/b8183c5ffb48_codify_document_level_and_times_derived.py b/migrations/versions/b8183c5ffb48_codify_document_level_and_times_derived.py new file mode 100644 index 00000000..2e8c2a6b --- /dev/null +++ b/migrations/versions/b8183c5ffb48_codify_document_level_and_times_derived.py @@ -0,0 +1,164 @@ +"""codify_document_level_and_times_derived + +Revision ID: b8183c5ffb48 +Revises: ec8f94139b02 +Create Date: 2025-10-31 12:48:54.597269 + +""" + +from collections.abc import Sequence + +import sqlalchemy as sa +from alembic import op +from sqlalchemy import text + +from migrations.utils import column_exists, constraint_exists, get_schema + +# revision identifiers, used by Alembic. +revision: str = "b8183c5ffb48" +down_revision: str | None = "ec8f94139b02" +branch_labels: str | Sequence[str] | None = None +depends_on: str | Sequence[str] | None = None + +schema = get_schema() + + +def upgrade() -> None: + """Codify level and times_derived from internal_metadata into explicit columns.""" + connection = op.get_bind() + inspector = sa.inspect(connection) + + # Step 1: Add level column (nullable initially) + if not column_exists("documents", "level", inspector): + op.add_column( + "documents", + sa.Column( + "level", + sa.TEXT(), + nullable=True, + ), + schema=schema, + ) + + # Step 2: Add times_derived column (nullable initially) + if not column_exists("documents", "times_derived", inspector): + op.add_column( + "documents", + sa.Column("times_derived", sa.Integer(), nullable=True), + schema=schema, + ) + + # Step 3: Populate level and times_derived from internal_metadata in batches + # Default to 'explicit' for level and 1 for times_derived if not present in metadata + batch_size = 5000 + while True: + result = connection.execute( + text( + f""" + WITH batch AS ( + SELECT id + FROM {schema}.documents + WHERE level IS NULL OR times_derived IS NULL + LIMIT :batch_size + ) + UPDATE {schema}.documents d + SET + level = COALESCE( + d.internal_metadata->>'level', + 'explicit' + ), + times_derived = COALESCE( + (d.internal_metadata->>'times_derived')::integer, + 1 + ) + FROM batch + WHERE d.id = batch.id + """ + ), + {"batch_size": batch_size}, + ) + if result.rowcount == 0: + break + + # Step 4: Make level NOT NULL with server default + op.alter_column( + "documents", + "level", + nullable=False, + server_default=text("'explicit'"), + schema=schema, + ) + + # Step 5: Make times_derived NOT NULL with server default + op.alter_column( + "documents", + "times_derived", + nullable=False, + server_default=text("1"), + schema=schema, + ) + + # Step 6: Add CHECK constraint for level + if not constraint_exists("documents", "level_valid", "check", inspector): + op.create_check_constraint( + "level_valid", + "documents", + "level IN ('explicit', 'deductive')", + schema=schema, + ) + + +def downgrade() -> None: + """Restore level and times_derived to internal_metadata.""" + connection = op.get_bind() + inspector = sa.inspect(connection) + + # Step 1: Drop CHECK constraint for level + if constraint_exists("documents", "level_valid", "check", inspector): + op.drop_constraint( + "level_valid", + "documents", + type_="check", + schema=schema, + ) + + # Step 2: Copy level and times_derived back to internal_metadata in batches (optional, for safety) + batch_size = 5000 + while True: + result = connection.execute( + text( + f""" + WITH batch AS ( + SELECT id + FROM {schema}.documents + WHERE internal_metadata IS NULL + OR NOT (internal_metadata ? 'level') + OR NOT (internal_metadata ? 'times_derived') + LIMIT :batch_size + ) + UPDATE {schema}.documents d + SET internal_metadata = jsonb_set( + jsonb_set( + COALESCE(d.internal_metadata, '{{}}'::jsonb), + '{{level}}', + to_jsonb(d.level) + ), + '{{times_derived}}', + to_jsonb(d.times_derived) + ) + FROM batch + WHERE d.id = batch.id + """ + ), + {"batch_size": batch_size}, + ) + if result.rowcount == 0: + break + + # Step 3: Drop the level column + if column_exists("documents", "level", inspector): + op.drop_column("documents", "level", schema=schema) + + # Step 4: Drop the times_derived column + if column_exists("documents", "times_derived", inspector): + op.drop_column("documents", "times_derived", schema=schema) diff --git a/migrations/versions/ec8f94139b02_codify_workspace_name_and_message_id_in_.py b/migrations/versions/ec8f94139b02_codify_workspace_name_and_message_id_in_.py new file mode 100644 index 00000000..ae7210cb --- /dev/null +++ b/migrations/versions/ec8f94139b02_codify_workspace_name_and_message_id_in_.py @@ -0,0 +1,252 @@ +"""codify workspace_name and message_id in queue table + +Revision ID: ec8f94139b02 +Revises: e9b705f9adf9 +Create Date: 2025-10-28 17:39:51.778665 + +""" + +from collections.abc import Sequence + +import sqlalchemy as sa +from alembic import op + +from migrations.utils import column_exists, fk_exists, get_schema, index_exists + +# revision identifiers, used by Alembic. +revision: str = "ec8f94139b02" +down_revision: str | None = "e9b705f9adf9" +branch_labels: str | Sequence[str] | None = None +depends_on: str | Sequence[str] | None = None + + +schema = get_schema() + + +def upgrade() -> None: + # Step 1: Drop rows where workspace_name is NULL in payload + # This removes invalid/corrupted queue items + conn = op.get_bind() + batch_size = 10000 + while True: + result = conn.execute( + sa.text( + f""" + DELETE FROM "{schema}".queue + WHERE id IN ( + SELECT id FROM "{schema}".queue + WHERE payload->>'workspace_name' IS NULL + LIMIT :batch_size + ) + """ + ), + {"batch_size": batch_size}, + ) + if result.rowcount == 0: + break + + # Step 2: Add workspace_name column (nullable initially for backfill) + op.add_column( + "queue", + sa.Column("workspace_name", sa.TEXT(), nullable=True), + schema=schema, + ) + + # Step 3: Add message_id column (nullable, as not all tasks have message_id) + op.add_column( + "queue", + sa.Column("message_id", sa.BigInteger(), nullable=True), + schema=schema, + ) + + # Step 4: Backfill workspace_name and message_id from payload in batches + batch_size = 5000 + while True: + result = conn.execute( + sa.text( + f""" + WITH batch AS ( + SELECT id + FROM "{schema}".queue + WHERE workspace_name IS NULL + OR (message_id IS NULL AND payload ? 'message_id' AND payload->>'message_id' IS NOT NULL) + LIMIT :batch_size + ) + UPDATE "{schema}".queue q + SET + workspace_name = COALESCE(q.workspace_name, q.payload->>'workspace_name'), + message_id = COALESCE( + q.message_id, + CASE + WHEN q.payload ? 'message_id' AND q.payload->>'message_id' IS NOT NULL + THEN (q.payload->>'message_id')::bigint + END + ) + FROM batch + WHERE q.id = batch.id + """ + ), + {"batch_size": batch_size}, + ) + if result.rowcount == 0: + break + + # Step 5: Remove workspace_name and message_id from JSONB payloads in batches + while True: + result = conn.execute( + sa.text( + f""" + WITH batch AS ( + SELECT id + FROM "{schema}".queue + WHERE payload ? 'workspace_name' OR payload ? 'message_id' + LIMIT :batch_size + ) + UPDATE "{schema}".queue q + SET payload = q.payload - 'workspace_name' - 'message_id' + FROM batch + WHERE q.id = batch.id + """ + ), + {"batch_size": batch_size}, + ) + if result.rowcount == 0: + break + + # Step 6: Make workspace_name non-nullable + op.alter_column("queue", "workspace_name", nullable=False, schema=schema) + + # Step 7: Add foreign key constraint on workspace_name -> workspaces.name + op.create_foreign_key( + "fk_queue_workspace_name", + "queue", + "workspaces", + ["workspace_name"], + ["name"], + source_schema=schema, + referent_schema=schema, + ) + + # Step 7b: Add foreign key constraint on message_id -> messages.id + op.create_foreign_key( + "fk_queue_message_id", + "queue", + "messages", + ["message_id"], + ["id"], + source_schema=schema, + referent_schema=schema, + ) + + # Step 8: Add index on workspace_name (for FK performance and filtering) + op.create_index( + op.f("ix_queue_workspace_name"), + "queue", + ["workspace_name"], + unique=False, + schema=schema, + ) + + # Step 9: Add partial index on message_id WHERE message_id IS NOT NULL + # This optimizes JOINs with the messages table + op.create_index( + "ix_queue_message_id_not_null", + "queue", + ["message_id"], + unique=False, + schema=schema, + postgresql_where=sa.text("message_id IS NOT NULL"), + ) + + # Step 10: Add composite index on (workspace_name, processed) + # This optimizes queries that filter unprocessed items by workspace + op.create_index( + "ix_queue_workspace_name_processed", + "queue", + ["workspace_name", "processed"], + unique=False, + schema=schema, + ) + + # Step 11: Add composite index on (work_unit_key, processed, id) + # This is critical for the hot path: "get next unprocessed item for this work unit" + # Covers: WHERE work_unit_key = ? AND NOT processed ORDER BY id + op.create_index( + "ix_queue_work_unit_key_processed_id", + "queue", + ["work_unit_key", "processed", "id"], + unique=False, + schema=schema, + ) + + +def downgrade() -> None: + inspector = sa.inspect(op.get_bind()) + + # Drop indexes + if index_exists("queue", "ix_queue_work_unit_key_processed_id", inspector): + op.drop_index( + "ix_queue_work_unit_key_processed_id", table_name="queue", schema=schema + ) + + if index_exists("queue", "ix_queue_workspace_name_processed", inspector): + op.drop_index( + "ix_queue_workspace_name_processed", table_name="queue", schema=schema + ) + + if index_exists("queue", "ix_queue_message_id_not_null", inspector): + op.drop_index("ix_queue_message_id_not_null", table_name="queue", schema=schema) + + if index_exists("queue", "ix_queue_workspace_name", inspector): + op.drop_index( + op.f("ix_queue_workspace_name"), table_name="queue", schema=schema + ) + + # Drop foreign key constraints + if fk_exists("queue", "fk_queue_message_id", inspector): + op.drop_constraint("fk_queue_message_id", "queue", schema=schema) + + if fk_exists("queue", "fk_queue_workspace_name", inspector): + op.drop_constraint("fk_queue_workspace_name", "queue", schema=schema) + + # Restore workspace_name and message_id to payload in batches + conn = op.get_bind() + batch_size = 5000 + + if column_exists("queue", "workspace_name", inspector) or column_exists( + "queue", "message_id", inspector + ): + while True: + result = conn.execute( + sa.text( + f""" + WITH batch AS ( + SELECT id + FROM "{schema}".queue + WHERE (workspace_name IS NOT NULL AND NOT (payload ? 'workspace_name')) + OR (message_id IS NOT NULL AND NOT (payload ? 'message_id')) + LIMIT :batch_size + ) + UPDATE "{schema}".queue q + SET payload = q.payload + || CASE WHEN q.workspace_name IS NOT NULL AND NOT (q.payload ? 'workspace_name') + THEN jsonb_build_object('workspace_name', q.workspace_name) + ELSE '{{}}'::jsonb END + || CASE WHEN q.message_id IS NOT NULL AND NOT (q.payload ? 'message_id') + THEN jsonb_build_object('message_id', q.message_id) + ELSE '{{}}'::jsonb END + FROM batch + WHERE q.id = batch.id + """ + ), + {"batch_size": batch_size}, + ) + if result.rowcount == 0: + break + + # Drop columns + if column_exists("queue", "message_id", inspector): + op.drop_column("queue", "message_id", schema=schema) + + if column_exists("queue", "workspace_name", inspector): + op.drop_column("queue", "workspace_name", schema=schema) diff --git a/scripts/run_alembic_tests.py b/scripts/run_alembic_tests.py new file mode 100755 index 00000000..8a2439e6 --- /dev/null +++ b/scripts/run_alembic_tests.py @@ -0,0 +1,141 @@ +#!/usr/bin/env python3 +""" +Run alembic tests selectively based on changed files. + +Note that this script is actively used within our precommit hooks and should not be removed. +If this script is moved, the corresponding precommit hook will need to be updated. + +This script determines which specific alembic tests to run based on: +1. If a test file changed, run the test for that revision +2. If a migration file changed, run the corresponding test + +The alembic test system uses a parameterized test in test_pipeline.py that runs +for each revision. We filter these tests using pytest's -k flag with the revision IDs. + +Usage: python scripts/run_alembic_tests.py ... +""" + +import re +import subprocess +import sys +from pathlib import Path + + +def extract_revision_id(filepath: Path) -> str | None: + """Extract the revision ID from a migration or test filename. + + Migration files: {revision_id}_{description}.py + Test files: test_{revision_id}_{description}.py + + Returns the revision_id (e.g., "05486ce795d5") or None if not found. + """ + filename = filepath.name + + # Remove .py extension + if not filename.endswith(".py"): + return None + + filename = filename[:-3] + + # Remove test_ prefix if present + if filename.startswith("test_"): + filename = filename[5:] + + # Extract revision ID (first part before underscore) + # Revision IDs are typically 12 characters of hex + match = re.match(r"^([a-f0-9]{12})_", filename) + if match: + return match.group(1) + + return None + + +def main(): + if len(sys.argv) < 2: + print("No files to check, skipping alembic tests") + sys.exit(0) + + changed_files = [Path(f) for f in sys.argv[1:]] + + # Paths + repo_root = Path(__file__).parent.parent + migrations_dir = repo_root / "migrations" / "versions" + tests_dir = repo_root / "tests" / "alembic" / "revisions" + alembic_tests_dir = repo_root / "tests" / "alembic" + + # Collect revision IDs to test + revision_ids: set[str] = set() + run_full_suite = False + + for filepath in changed_files: + filepath = Path(filepath).resolve() + + # Check if file is under tests/alembic (including subdirectories) + # If it's not a revision-specific test file, run full suite + if ( + filepath.parent == alembic_tests_dir + or alembic_tests_dir in filepath.parents + ) and not (filepath.parent == tests_dir and filepath.name.startswith("test_")): + run_full_suite = True + print( + f"Infrastructure file changed: {filepath.name} -> will run full test suite" + ) + continue + + # Case 1: Test file changed - extract its revision ID + if filepath.parent == tests_dir and filepath.name.startswith("test_"): + revision_id = extract_revision_id(filepath) + if revision_id: + revision_ids.add(revision_id) + print( + f"Test file changed: {filepath.name} -> testing revision {revision_id}" + ) + + # Case 2: Migration file changed - extract its revision ID + elif filepath.parent == migrations_dir: + revision_id = extract_revision_id(filepath) + if revision_id: + revision_ids.add(revision_id) + print( + f"Migration changed: {filepath.name} -> testing revision {revision_id}" + ) + + if run_full_suite: + # Run full test suite without -k filter + print("\nRunning full alembic test suite due to infrastructure file changes\n") + cmd = [ + "uv", + "run", + "pytest", + "tests/alembic/test_pipeline.py", + ] + elif revision_ids: + # Build a -k expression to filter tests by revision ID + # pytest -k "rev1 or rev2 or rev3" + k_expression = " or ".join(sorted(revision_ids)) + + print( + f"\nRunning tests for {len(revision_ids)} revision(s): {', '.join(sorted(revision_ids))}" + ) + print() + + # Run pytest on test_pipeline.py with -k filter + cmd = [ + "uv", + "run", + "pytest", + "tests/alembic/test_pipeline.py", + "-k", + k_expression, + ] + else: + print("No alembic tests to run") + sys.exit(0) + + result = subprocess.run(cmd, cwd=repo_root) + + sys.exit(result.returncode) + + +if __name__ == "__main__": + main() diff --git a/src/crud/document.py b/src/crud/document.py index 127b5d7b..012e4f73 100644 --- a/src/crud/document.py +++ b/src/crud/document.py @@ -127,6 +127,8 @@ async def create_documents( observer=observer, observed=observed, content=doc.content, + level=doc.level, + times_derived=doc.times_derived, internal_metadata=metadata_dict, embedding=doc.embedding, session_name=doc.session_name, diff --git a/src/crud/representation.py b/src/crud/representation.py index 13aefce7..4a41cdc6 100644 --- a/src/crud/representation.py +++ b/src/crud/representation.py @@ -145,7 +145,6 @@ class RepresentationManager: metadata: schemas.DocumentMetadata = schemas.DocumentMetadata( message_ids=[message_id_range], - level=obs_level, premises=obs_premises, message_created_at=format_datetime_utc(message_created_at), ) @@ -154,6 +153,7 @@ class RepresentationManager: schemas.DocumentCreate( content=obs_content, session_name=session_name, + level=obs_level, metadata=metadata, embedding=embedding, ) @@ -397,7 +397,7 @@ class RepresentationManager: models.Document.observer == self.observer, models.Document.observed == self.observed, ) - .order_by(models.Document.internal_metadata["times_derived"].desc()) + .order_by(models.Document.times_derived.desc()) ) result = await db.execute(stmt) @@ -454,7 +454,7 @@ class RepresentationManager: conditions: list[dict[str, Any]] = [] if level: - conditions.append({"internal_metadata": {"level": level}}) + conditions.append({"level": level}) if not conditions: return {} diff --git a/src/deriver/consumer.py b/src/deriver/consumer.py index 6cafc0fc..9dbfb6bb 100644 --- a/src/deriver/consumer.py +++ b/src/deriver/consumer.py @@ -1,5 +1,4 @@ import logging -from typing import Any import sentry_sdk from pydantic import ValidationError @@ -26,8 +25,12 @@ logging.getLogger("sqlalchemy.engine.Engine").disabled = True console = Console(markup=True) -async def process_item(task_type: str, queue_payload: dict[str, Any]) -> None: +async def process_item(queue_item: models.QueueItem) -> None: """Process a single item from the queue.""" + task_type = queue_item.task_type + queue_payload = queue_item.payload + workspace_name = queue_item.workspace_name + if task_type == "webhook": try: validated = WebhookPayload(**queue_payload) @@ -39,7 +42,7 @@ async def process_item(task_type: str, queue_payload: dict[str, Any]) -> None: ) raise ValueError(f"Invalid payload structure: {str(e)}") from e async with tracked_db() as db: - await webhook_delivery.deliver_webhook(db, validated) + await webhook_delivery.deliver_webhook(db, validated, workspace_name) elif task_type == "summary": try: @@ -52,17 +55,21 @@ async def process_item(task_type: str, queue_payload: dict[str, Any]) -> None: ) raise ValueError(f"Invalid payload structure: {str(e)}") from e + # Use workspace_name and message_id from QueueItem columns + message_id = queue_item.message_id + + if message_id is None: + raise ValueError("Summary tasks require a message_id") + message_public_id = validated.message_public_id if not message_public_id: - logger.debug( - "Fetching message public ID for message %s", validated.message_id - ) + logger.debug("Fetching message public ID for message %s", message_id) async with tracked_db(operation_name="summary_fallback") as db: stmt = ( select(models.Message) - .where(models.Message.workspace_name == validated.workspace_name) + .where(models.Message.workspace_name == workspace_name) .where(models.Message.session_name == validated.session_name) - .where(models.Message.id == validated.message_id) + .where(models.Message.id == message_id) ) result = await db.execute(stmt) @@ -70,22 +77,20 @@ async def process_item(task_type: str, queue_payload: dict[str, Any]) -> None: if message is None: logger.error( "Failed to fetch message with ID %s for process_summary_task", - validated.message_id, + message_id, ) return message_public_id = message.public_id with sentry_sdk.start_transaction(name="process_summary_task", op="deriver"): await summarizer.summarize_if_needed( - validated.workspace_name, + workspace_name, validated.session_name, - validated.message_id, + message_id, validated.message_seq_in_session, message_public_id, ) - log_performance_metrics( - "summary", f"{validated.workspace_name}_{validated.message_id}" - ) + log_performance_metrics("summary", f"{workspace_name}_{message_id}") elif task_type == "dream": with sentry_sdk.start_transaction(name="process_dream_task", op="deriver"): @@ -98,7 +103,7 @@ async def process_item(task_type: str, queue_payload: dict[str, Any]) -> None: queue_payload, ) raise ValueError(f"Invalid payload structure: {str(e)}") from e - await process_dream(validated) + await process_dream(validated, workspace_name) else: raise ValueError(f"Invalid task type: {task_type}") @@ -109,29 +114,21 @@ async def process_representation_batch( observer: str | None, observed: str | None, ) -> None: - """Validate incoming queue payloads and dispatch to the appropriate handler. - - This function centralizes payload validation using a simple mapping from - task type to Pydantic model. After validation, routes the request to - the correct processor without repeating type checks elsewhere. - + """Prepares and processes a batch of messages for representation tasks. Args: - task_type: The type of task to process - queue_payloads: List of payload dictionaries to process - observed (optional): For representation tasks, the observed from work_unit_key - to identify which messages should be focused on - observer (optional): For representation tasks, the observer from work_unit_key - to identify which messages should be focused on + messages: List of messages to process + observer: The observer of the messages + observed: The observed of the messages """ if not messages or not messages[0]: - logger.debug("process_representation_batch received no payloads") + logger.debug("process_representation_batch received no messages") return if observed is None or observer is None: raise ValueError("observed and observer are required for representation tasks") logger.debug( - "process_representation_batch received %s payloads", + "process_representation_batch received %s messages", len(messages), ) diff --git a/src/deriver/enqueue.py b/src/deriver/enqueue.py index 9731b91c..cf15c5d0 100644 --- a/src/deriver/enqueue.py +++ b/src/deriver/enqueue.py @@ -11,7 +11,7 @@ from src.dreamer.dream_scheduler import get_affected_dream_keys, get_dream_sched from src.exceptions import ValidationException from src.models import QueueItem from src.utils.queue_payload import create_payload -from src.utils.work_unit import get_work_unit_key +from src.utils.work_unit import construct_work_unit_key logger = logging.getLogger(__name__) @@ -159,8 +159,16 @@ def create_representation_record( session_id: Optional session ID Returns: - Queue record dictionary + Queue record dictionary with workspace_name and message_id as separate fields """ + workspace_name = message.get("workspace_name") + message_id = message.get("message_id") + + if not isinstance(workspace_name, str): + raise TypeError("workspace_name is required and must be a string") + if not isinstance(message_id, int): + raise TypeError("message_id is required and must be an integer") + processed_payload = create_payload( message=message, task_type="representation", @@ -168,10 +176,12 @@ def create_representation_record( observed=observed, ) return { - "work_unit_key": get_work_unit_key(processed_payload), + "work_unit_key": construct_work_unit_key(workspace_name, processed_payload), "payload": processed_payload, "session_id": session_id, "task_type": "representation", + "workspace_name": workspace_name, + "message_id": message_id, } @@ -185,23 +195,32 @@ def create_summary_record( Args: message: The message payload - observed: Name of the sender - observer: Name of the target session_id: Session ID + message_seq_in_session: The sequence number of the message in the session Returns: - Queue record dictionary + Queue record dictionary with workspace_name and message_id as separate fields """ + workspace_name = message.get("workspace_name") + message_id = message.get("message_id") + + if not isinstance(workspace_name, str): + raise ValueError("workspace_name is required and must be a string") + if not isinstance(message_id, int): + raise ValueError("message_id is required and must be an integer") + processed_payload = create_payload( message=message, task_type="summary", message_seq_in_session=message_seq_in_session, ) return { - "work_unit_key": get_work_unit_key(processed_payload), + "work_unit_key": construct_work_unit_key(workspace_name, processed_payload), "payload": processed_payload, "session_id": session_id, "task_type": "summary", + "workspace_name": workspace_name, + "message_id": message_id, } diff --git a/src/deriver/queue_manager.py b/src/deriver/queue_manager.py index 953895a2..df2f1465 100644 --- a/src/deriver/queue_manager.py +++ b/src/deriver/queue_manager.py @@ -10,7 +10,7 @@ import sentry_sdk from dotenv import load_dotenv from nanoid import generate as generate_nanoid from sentry_sdk.integrations.asyncio import AsyncioIntegration -from sqlalchemy import BigInteger, and_, delete, select, update +from sqlalchemy import and_, delete, select, update from sqlalchemy.dialects.postgresql import insert from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.sql import func @@ -464,9 +464,7 @@ class QueueManager: break try: - await process_item( - work_unit.task_type, queue_item.payload - ) + await process_item(queue_item) await self.mark_queue_items_as_processed( [queue_item], work_unit_key ) @@ -615,8 +613,7 @@ class QueueManager: .select_from(models.QueueItem) .join( models.Message, - func.cast(models.QueueItem.payload["message_id"].astext, BigInteger) - == models.Message.id, + models.QueueItem.message_id == models.Message.id, ) .where(~models.QueueItem.processed) .where(models.Message.session_name == parsed_key.session_name) @@ -662,10 +659,7 @@ class QueueManager: and_( models.QueueItem.work_unit_key == work_unit_key, ~models.QueueItem.processed, - func.cast( - models.QueueItem.payload["message_id"].astext, BigInteger - ) - == models.Message.id, + models.QueueItem.message_id == models.Message.id, ), ) .where(allowed_condition) @@ -690,7 +684,11 @@ class QueueManager: if items_to_process: max_queue_item_message_id = max( - [qi.payload["message_id"] for qi in items_to_process] + [ + qi.message_id + for qi in items_to_process + if qi.message_id is not None + ] ) messages_context = [ # remove any messages that are after the last message_id from queue items m for m in messages_context if m.id <= max_queue_item_message_id diff --git a/src/dreamer/dream_scheduler.py b/src/dreamer/dream_scheduler.py index a56edd3f..f28dead9 100644 --- a/src/dreamer/dream_scheduler.py +++ b/src/dreamer/dream_scheduler.py @@ -12,7 +12,7 @@ from src import models from src.config import settings from src.dependencies import tracked_db from src.utils.queue_payload import create_dream_payload -from src.utils.work_unit import get_work_unit_key, parse_work_unit_key +from src.utils.work_unit import construct_work_unit_key, parse_work_unit_key logger = getLogger(__name__) @@ -48,13 +48,13 @@ def get_affected_dream_keys(message: dict[str, Any]) -> list[str]: return [] # Generate dream work unit key for this peer's collection - dream_key = get_work_unit_key( + dream_key = construct_work_unit_key( + workspace_name, { "task_type": "dream", - "workspace_name": workspace_name, "observer": peer_name, "observed": peer_name, - } + }, ) return [dream_key] @@ -193,7 +193,6 @@ class DreamScheduler: ) -> None: """Execute the dream by enqueueing it and updating collection metadata.""" dream_payload = create_dream_payload( - workspace_name=workspace_name, dream_type="consolidate", observer=observer, observed=observed, @@ -205,6 +204,8 @@ class DreamScheduler: "payload": dream_payload, "session_id": None, "task_type": "dream", + "workspace_name": workspace_name, + "message_id": None, # Dreams don't have a message_id } await db.execute(insert(models.QueueItem), [dream_record]) @@ -325,13 +326,13 @@ async def check_and_schedule_dream( dream_scheduler = get_dream_scheduler() if dream_scheduler: - collection_work_unit_key = get_work_unit_key( + collection_work_unit_key = construct_work_unit_key( + collection.workspace_name, { "task_type": "dream", - "workspace_name": collection.workspace_name, "observer": collection.observer, "observed": collection.observed, - } + }, ) await dream_scheduler.schedule_dream( diff --git a/src/dreamer/dreamer.py b/src/dreamer/dreamer.py index 9ee43bb8..da73b86e 100644 --- a/src/dreamer/dreamer.py +++ b/src/dreamer/dreamer.py @@ -24,6 +24,7 @@ logger = logging.getLogger(__name__) @sentry_sdk.trace async def process_dream( payload: DreamPayload, + workspace_name: str, ) -> None: """ Process a dream task by performing collection maintenance operations. @@ -32,12 +33,12 @@ async def process_dream( payload: The dream task payload containing workspace, peer, and dream type information """ logger.info( - f"Processing dream task: {payload.dream_type} for {payload.workspace_name}/{payload.observer}/{payload.observed}" + f"Processing dream task: {payload.dream_type} for {workspace_name}/{payload.observer}/{payload.observed}" ) try: if payload.dream_type == "consolidate": - await _process_consolidate_dream(payload) + await _process_consolidate_dream(payload, workspace_name) ## TODO other dream types except Exception as e: @@ -50,7 +51,9 @@ async def process_dream( # Don't re-raise - we want to mark the dream task as processed even if it fails -async def _process_consolidate_dream(payload: DreamPayload) -> None: +async def _process_consolidate_dream( + payload: DreamPayload, workspace_name: str +) -> None: """ Process a consolidation dream task. @@ -63,7 +66,7 @@ async def _process_consolidate_dream(payload: DreamPayload) -> None: logger.info( f""" (っ- ‸ - ς)ᶻ z 𐰁 ᶻ z 𐰁 ᶻ z 𐰁\n -DREAM: consolidating documents for {payload.workspace_name}/{payload.observer}/{payload.observed}\n +DREAM: consolidating documents for {workspace_name}/{payload.observer}/{payload.observed}\n 𐰁 z ᶻ 𐰁 z ᶻ 𐰁 z ᶻ(っ- ‸ - ς)""" ) @@ -71,7 +74,7 @@ DREAM: consolidating documents for {payload.workspace_name}/{payload.observer}/{ async with tracked_db("dream_consolidate") as db: documents = await crud.get_all_documents( db, - payload.workspace_name, + workspace_name, observer=payload.observer, observed=payload.observed, ) @@ -88,7 +91,7 @@ DREAM: consolidating documents for {payload.workspace_name}/{payload.observer}/{ for cluster in clusters: await _consolidate_cluster( cluster, - payload.workspace_name, + workspace_name, db, observer=payload.observer, observed=payload.observed, @@ -118,9 +121,7 @@ async def _consolidate_cluster( logger.info("consolidated representation:\n%s", consolidated_representation) # TODO: less hacky preservation of times_derived - total_times_derived = sum( - doc.internal_metadata.get("times_derived", 1) for doc in cluster - ) + total_times_derived = sum(doc.times_derived for doc in cluster) new_documents = [ *consolidated_representation.explicit, @@ -141,10 +142,8 @@ async def _consolidate_cluster( # NOTE: other kinds of observations here in the future metadata = schemas.DocumentMetadata( - times_derived=total_times_derived, message_ids=obs.message_ids, message_created_at=format_datetime_utc(obs.created_at), - level=level, premises=premises, ) @@ -154,6 +153,8 @@ async def _consolidate_cluster( schemas.DocumentCreate( content=content, session_name=obs.session_name, + level=level, + times_derived=total_times_derived, metadata=metadata, embedding=embedding, ) diff --git a/src/models.py b/src/models.py index 2efad02f..f0042cd0 100644 --- a/src/models.py +++ b/src/models.py @@ -1,6 +1,6 @@ import datetime from logging import getLogger -from typing import Any, Literal, final +from typing import Any, final from dotenv import load_dotenv from nanoid import generate as generate_nanoid @@ -26,6 +26,8 @@ from sqlalchemy.orm.properties import MappedColumn from sqlalchemy.sql import func from typing_extensions import override +from src.utils.types import DocumentLevel, TaskType + from .db import Base load_dotenv(override=True) @@ -382,6 +384,12 @@ class Document(Base): "internal_metadata", JSONB, default=dict, server_default=text("'{}'::jsonb") ) content: Mapped[str] = mapped_column(TEXT) + level: Mapped[DocumentLevel] = mapped_column( + TEXT, nullable=False, server_default="explicit" + ) + times_derived: Mapped[int] = mapped_column( + Integer, nullable=False, server_default=text("1") + ) embedding: MappedColumn[Any] = mapped_column(Vector(1536)) created_at: Mapped[datetime.datetime] = mapped_column( DateTime(timezone=True), server_default=func.now() @@ -397,6 +405,7 @@ class Document(Base): CheckConstraint("length(id) = 21", name="id_length"), CheckConstraint("length(content) <= 65535", name="content_length"), CheckConstraint("id ~ '^[A-Za-z0-9_-]+$'", name="id_format"), + CheckConstraint("level IN ('explicit', 'deductive')", name="level_valid"), # Composite foreign key constraint for collections ForeignKeyConstraint( ["observer", "observed", "workspace_name"], @@ -439,9 +448,6 @@ class Document(Base): ) -TaskType = Literal["webhook", "summary", "representation", "dream"] - - @final class QueueItem(Base): __tablename__: str = "queue" @@ -460,14 +466,36 @@ class QueueItem(Base): created_at: Mapped[datetime.datetime] = mapped_column( DateTime(timezone=True), server_default=func.now() ) + workspace_name: Mapped[str] = mapped_column( + ForeignKey("workspaces.name"), nullable=False + ) + message_id: Mapped[int | None] = mapped_column( + BigInteger, ForeignKey("messages.id"), nullable=True + ) __table_args__ = ( Index("ix_queue_created_at", "created_at"), Index("ix_queue_session_id", "session_id"), + Index( + "ix_queue_workspace_name", + "workspace_name", + ), + Index( + "ix_queue_message_id_not_null", + "message_id", + postgresql_where=text("message_id IS NOT NULL"), + ), + Index("ix_queue_workspace_name_processed", "workspace_name", "processed"), + Index( + "ix_queue_work_unit_key_processed_id", + "work_unit_key", + "processed", + "id", + ), ) def __repr__(self) -> str: - return f"QueueItem(id={self.id}, session_id={self.session_id}, work_unit_key={self.work_unit_key}, task_type={self.task_type}, payload={self.payload}, processed={self.processed})" + return f"QueueItem(id={self.id}, session_id={self.session_id}, work_unit_key={self.work_unit_key}, task_type={self.task_type}, payload={self.payload}, processed={self.processed}, workspace_name={self.workspace_name}, message_id={self.message_id})" @final diff --git a/src/schemas.py b/src/schemas.py index a1eac978..4d99dd42 100644 --- a/src/schemas.py +++ b/src/schemas.py @@ -288,20 +288,12 @@ class DocumentBase(BaseModel): class DocumentMetadata(BaseModel): - times_derived: int | None = Field( - default=None, - ge=1, - description="The number of times that a semantic duplicate document to this one has been derived", - ) message_ids: list[tuple[int, int]] = Field( description="The ID range(s) of the messages that this document was derived from. Acts as a link to the primary source of the document. Note that as a document gets deduplicated, additional ranges will be added, because the same document could be derived from completely separate message ranges." ) message_created_at: str = Field( description="The timestamp of the message that this document was derived from. Note that this is not the same as the created_at timestamp of the document. This timestamp is usually only saved with second-level precision." ) - level: Literal["explicit", "deductive"] = Field( - description="The level of the document (explicit or deductive)" - ) premises: list[str] | None = Field( default=None, description="The premises of the deduction -- only applicable for deductive observations", @@ -313,6 +305,15 @@ class DocumentCreate(DocumentBase): session_name: str = Field( description="The session from which the document was derived" ) + level: Literal["explicit", "deductive"] = Field( + default="explicit", + description="The level of the document (explicit or deductive)", + ) + times_derived: int = Field( + default=1, + ge=1, + description="The number of times that a semantic duplicate document to this one has been derived", + ) metadata: DocumentMetadata = Field() embedding: list[float] = Field() diff --git a/src/utils/queue_payload.py b/src/utils/queue_payload.py index e4d4a964..b267f04a 100644 --- a/src/utils/queue_payload.py +++ b/src/utils/queue_payload.py @@ -14,9 +14,7 @@ class RepresentationPayload(BasePayload): """Payload for representation tasks.""" task_type: Literal["representation"] = "representation" - workspace_name: str session_name: str - message_id: int content: str observer: str observed: str @@ -33,9 +31,7 @@ class SummaryPayload(BasePayload): """Payload for summary tasks.""" task_type: Literal["summary"] = "summary" - workspace_name: str session_name: str - message_id: int message_seq_in_session: int # Optional for backward compatibility with older queue items message_public_id: str | None = None @@ -45,7 +41,6 @@ class WebhookPayload(BasePayload): """Payload for webhook delivery tasks.""" task_type: Literal["webhook"] = "webhook" - workspace_name: str event_type: str data: dict[str, Any] @@ -54,35 +49,33 @@ class DreamPayload(BasePayload): """Payload for dream tasks.""" task_type: Literal["dream"] = "dream" - workspace_name: str dream_type: Literal["consolidate"] = "consolidate" observer: str observed: str def create_webhook_payload( - workspace_name: str, event_type: str, data: dict[str, Any], ) -> dict[str, Any]: - return WebhookPayload( - workspace_name=workspace_name, event_type=event_type, data=data - ).model_dump(mode="json") + """Create a webhook payload.""" + return WebhookPayload(event_type=event_type, data=data).model_dump( + mode="json", exclude_none=True + ) def create_dream_payload( - workspace_name: str, dream_type: Literal["consolidate"] = "consolidate", *, observer: str, observed: str, ) -> dict[str, Any]: + """Create a dream payload.""" return DreamPayload( - workspace_name=workspace_name, dream_type=dream_type, observer=observer, observed=observed, - ).model_dump(mode="json") + ).model_dump(mode="json", exclude_none=True) def create_payload( @@ -96,6 +89,10 @@ def create_payload( """ Create a processed payload from a message for queue processing. + Note: workspace_name and message_id are no longer included in the returned payload + as they are now stored in dedicated columns on the queue table. The caller is + responsible for extracting and passing these values separately. + Args: message: The original message dictionary task_type: Type of task ('representation' or 'summary') @@ -104,7 +101,7 @@ def create_payload( message_seq_in_session: Required for summary tasks, must be None for representation Returns: - Processed payload dictionary ready for queue processing + Processed payload dictionary ready for queue processing (without workspace_name and message_id) Raises: ValueError: If the payload doesn't match the expected schema @@ -142,9 +139,7 @@ def create_payload( validated_payload = RepresentationPayload( content=content, - workspace_name=workspace_name, session_name=session_name, - message_id=message_id, created_at=created_at, observer=observer, observed=observed, @@ -161,16 +156,14 @@ def create_payload( ) validated_payload = SummaryPayload( - workspace_name=workspace_name, session_name=session_name, - message_id=message_id, message_seq_in_session=message_seq_in_session, message_public_id=message_public_id, ) # Convert back to dict for compatibility with JSON serialization # mode='json' ensures datetime is converted to ISO string - payload = validated_payload.model_dump(mode="json") + payload = validated_payload.model_dump(mode="json", exclude_none=True) except Exception as e: raise ValueError(f"Failed to create valid payload: {str(e)}") from e diff --git a/src/utils/representation.py b/src/utils/representation.py index 30ebe71d..c0f499f0 100644 --- a/src/utils/representation.py +++ b/src/utils/representation.py @@ -271,7 +271,7 @@ class Representation(BaseModel): session_name=doc.session_name, ) for doc in documents - if doc.internal_metadata.get("level") == "explicit" + if doc.level == "explicit" ], deductive=[ DeductiveObservation( @@ -284,7 +284,7 @@ class Representation(BaseModel): premises=doc.internal_metadata.get("premises", []), ) for doc in documents - if doc.internal_metadata.get("level") == "deductive" + if doc.level == "deductive" ], ) diff --git a/src/utils/types.py b/src/utils/types.py index 317e545a..80dfc389 100644 --- a/src/utils/types.py +++ b/src/utils/types.py @@ -1,3 +1,5 @@ from typing import Literal SupportedProviders = Literal["anthropic", "openai", "google", "groq", "custom", "vllm"] +TaskType = Literal["webhook", "summary", "representation", "dream"] +DocumentLevel = Literal["explicit", "deductive"] diff --git a/src/utils/work_unit.py b/src/utils/work_unit.py index d7fd12bb..660baa16 100644 --- a/src/utils/work_unit.py +++ b/src/utils/work_unit.py @@ -15,11 +15,14 @@ class ParsedWorkUnit(BaseModel): observed: str | None -def get_work_unit_key(payload: dict[str, Any] | ParsedWorkUnit) -> str: +def construct_work_unit_key( + workspace_name: str, payload: dict[str, Any] | ParsedWorkUnit +) -> str: """ Generate a work unit key for a given task type, workspace name, and event type. Args: + workspace_name: The name of the workspace the work unit belongs to payload: Dictionary containing work unit information Returns: @@ -31,7 +34,6 @@ def get_work_unit_key(payload: dict[str, Any] | ParsedWorkUnit) -> str: if isinstance(payload, ParsedWorkUnit): payload = payload.model_dump() - workspace_name: str | None = payload.get("workspace_name") task_type: str | None = payload.get("task_type") if not workspace_name or not task_type: raise ValueError( diff --git a/src/webhooks/events.py b/src/webhooks/events.py index f942bb5d..a37eab89 100644 --- a/src/webhooks/events.py +++ b/src/webhooks/events.py @@ -7,7 +7,7 @@ from pydantic import BaseModel from src.dependencies import tracked_db from src.models import QueueItem from src.utils.queue_payload import create_webhook_payload -from src.utils.work_unit import get_work_unit_key +from src.utils.work_unit import construct_work_unit_key logger = logging.getLogger(__name__) @@ -51,23 +51,26 @@ async def publish_webhook_event(event: WebhookEvent) -> None: event: The webhook event to publish. """ try: + # Note: workspace_name is no longer included in the payload + # It's stored directly on the queue item payload = create_webhook_payload( - workspace_name=event.workspace_id, event_type=event.type.value, data=event.model_dump(mode="json", exclude={"type"}), ) async with tracked_db("publish_webhook_event") as db: queue_item = QueueItem( - work_unit_key=get_work_unit_key( + work_unit_key=construct_work_unit_key( + event.workspace_id, { "task_type": "webhook", - "workspace_name": event.workspace_id, - } + }, ), payload=payload, session_id=None, task_type="webhook", + workspace_name=event.workspace_id, + message_id=None, # Webhooks don't have a message_id ) db.add(queue_item) await db.commit() diff --git a/src/webhooks/webhook_delivery.py b/src/webhooks/webhook_delivery.py index 316fdccc..d26aa404 100644 --- a/src/webhooks/webhook_delivery.py +++ b/src/webhooks/webhook_delivery.py @@ -15,16 +15,18 @@ from src.utils.queue_payload import WebhookPayload logger = logging.getLogger(__name__) -async def deliver_webhook(db: AsyncSession, payload: WebhookPayload) -> None: +async def deliver_webhook( + db: AsyncSession, payload: WebhookPayload, workspace_name: str +) -> None: """ Deliver a single webhook event to its configured endpoints. """ async with httpx.AsyncClient(timeout=30.0) as client: try: - webhook_urls = await _get_webhook_urls(db, payload.workspace_name) + webhook_urls = await _get_webhook_urls(db, workspace_name) if not webhook_urls: logger.debug( - f"No webhook endpoints for workspace {payload.workspace_name}, skipping." + f"No webhook endpoints for workspace {workspace_name}, skipping." ) return @@ -72,7 +74,7 @@ async def deliver_webhook(db: AsyncSession, payload: WebhookPayload) -> None: ) except httpx.RequestError: - logger.exception(f"Error sending webhook for {payload.workspace_name}.") + logger.exception(f"Error sending webhook for {workspace_name}.") except Exception: logger.exception("Unexpected error delivering webhook.") diff --git a/tests/alembic/revisions/__init__.py b/tests/alembic/revisions/__init__.py index 988130db..fedc98c5 100644 --- a/tests/alembic/revisions/__init__.py +++ b/tests/alembic/revisions/__init__.py @@ -13,9 +13,11 @@ from . import ( test_917195d9b5e9_add_messageembedding_table, test_a1b2c3d4e5f6_initial_schema, test_b765d82110bd_change_metamessages_to_user_level_with_, + test_b8183c5ffb48_codify_document_level_and_times_derived, test_bb6fb3a7a643_add_message_seq_in_session_column, test_c3828084f472_add_indexes_for_messages_and_, test_d429de0e5338_adopt_peer_paradigm, + test_ec8f94139b02_codify_workspace_name_and_message_id_in_, ) __all__ = [ @@ -31,7 +33,9 @@ __all__ = [ "test_917195d9b5e9_add_messageembedding_table", "test_a1b2c3d4e5f6_initial_schema", "test_b765d82110bd_change_metamessages_to_user_level_with_", + "test_b8183c5ffb48_codify_document_level_and_times_derived", "test_bb6fb3a7a643_add_message_seq_in_session_column", "test_c3828084f472_add_indexes_for_messages_and_", "test_d429de0e5338_adopt_peer_paradigm", + "test_ec8f94139b02_codify_workspace_name_and_message_id_in_", ] diff --git a/tests/alembic/revisions/test_b8183c5ffb48_codify_document_level_and_times_derived.py b/tests/alembic/revisions/test_b8183c5ffb48_codify_document_level_and_times_derived.py new file mode 100644 index 00000000..c3e3d3a0 --- /dev/null +++ b/tests/alembic/revisions/test_b8183c5ffb48_codify_document_level_and_times_derived.py @@ -0,0 +1,315 @@ +"""Hooks for revision b8183c5ffb48 (codify_document_level_and_times_derived).""" + +from __future__ import annotations + +import json + +from nanoid import generate as generate_nanoid +from sqlalchemy import text + +from tests.alembic.registry import register_after_upgrade, register_before_upgrade +from tests.alembic.verifier import MigrationVerifier + +# Test data constants +WORKSPACE_NAME = "test-workspace" +OBSERVER_NAME = "test-observer" +OBSERVED_NAME = "test-observed" +SESSION_NAME = "test-session" + + +@register_before_upgrade("b8183c5ffb48") +def prepare_codify_document_level_and_times_derived( + verifier: MigrationVerifier, +) -> None: + """Seed state and assertions before upgrading to b8183c5ffb48.""" + # Verify columns don't exist yet + verifier.assert_column_exists("documents", "level", exists=False) + verifier.assert_column_exists("documents", "times_derived", exists=False) + + # Verify CHECK constraint doesn't exist yet + verifier.assert_constraint_exists("documents", "level_valid", "check", exists=False) + + conn = verifier.conn + schema = verifier.schema + + # Create workspace + conn.execute( + text( + f'INSERT INTO "{schema}"."workspaces" ("id", "name") VALUES (:ws_id, :ws_name)' + ), + {"ws_id": generate_nanoid(), "ws_name": WORKSPACE_NAME}, + ) + + # Create peers (observer and observed) + conn.execute( + text( + f'INSERT INTO "{schema}"."peers" ("id", "name", "workspace_name") ' + + "VALUES (:observer_id, :observer_name, :ws_name), " + + "(:observed_id, :observed_name, :ws_name)" + ), + { + "observer_id": generate_nanoid(), + "observer_name": OBSERVER_NAME, + "ws_name": WORKSPACE_NAME, + "observed_id": generate_nanoid(), + "observed_name": OBSERVED_NAME, + }, + ) + + # Create session + conn.execute( + text( + f'INSERT INTO "{schema}"."sessions" ("id", "name", "workspace_name") ' + + "VALUES (:session_id, :session_name, :ws_name)" + ), + { + "session_id": generate_nanoid(), + "session_name": SESSION_NAME, + "ws_name": WORKSPACE_NAME, + }, + ) + + # Create collection (required for documents) + conn.execute( + text( + f'INSERT INTO "{schema}"."collections" ("id", "observer", "observed", "workspace_name") ' + + "VALUES (:collection_id, :observer, :observed, :ws_name)" + ), + { + "collection_id": generate_nanoid(), + "observer": OBSERVER_NAME, + "observed": OBSERVED_NAME, + "ws_name": WORKSPACE_NAME, + }, + ) + + # Create documents with different scenarios + # Scenario 1: Document with both level and times_derived in internal_metadata + conn.execute( + text( + f'INSERT INTO "{schema}"."documents" ' + + '("id", "content", "internal_metadata", "embedding", "observer", "observed", "workspace_name", "session_name") ' + + "VALUES (:id, :content, :metadata, :embedding, :observer, :observed, :ws_name, :session_name)" + ), + { + "id": generate_nanoid(), + "content": "Document with explicit level and times_derived=3", + "metadata": json.dumps({"level": "explicit", "times_derived": 3}), + "embedding": [0.1] * 1536, + "observer": OBSERVER_NAME, + "observed": OBSERVED_NAME, + "ws_name": WORKSPACE_NAME, + "session_name": SESSION_NAME, + }, + ) + + # Scenario 2: Document with deductive level in internal_metadata + conn.execute( + text( + f'INSERT INTO "{schema}"."documents" ' + + '("id", "content", "internal_metadata", "embedding", "observer", "observed", "workspace_name", "session_name") ' + + "VALUES (:id, :content, :metadata, :embedding, :observer, :observed, :ws_name, :session_name)" + ), + { + "id": generate_nanoid(), + "content": "Document with deductive level and times_derived=5", + "metadata": json.dumps({"level": "deductive", "times_derived": 5}), + "embedding": [0.2] * 1536, + "observer": OBSERVER_NAME, + "observed": OBSERVED_NAME, + "ws_name": WORKSPACE_NAME, + "session_name": SESSION_NAME, + }, + ) + + # Scenario 3: Document without level or times_derived (should get defaults) + conn.execute( + text( + f'INSERT INTO "{schema}"."documents" ' + + '("id", "content", "internal_metadata", "embedding", "observer", "observed", "workspace_name", "session_name") ' + + "VALUES (:id, :content, :metadata, :embedding, :observer, :observed, :ws_name, :session_name)" + ), + { + "id": generate_nanoid(), + "content": "Document without level or times_derived fields", + "metadata": json.dumps({"other_field": "value"}), + "embedding": [0.3] * 1536, + "observer": OBSERVER_NAME, + "observed": OBSERVED_NAME, + "ws_name": WORKSPACE_NAME, + "session_name": SESSION_NAME, + }, + ) + + # Scenario 4: Document with only level in metadata + conn.execute( + text( + f'INSERT INTO "{schema}"."documents" ' + + '("id", "content", "internal_metadata", "embedding", "observer", "observed", "workspace_name", "session_name") ' + + "VALUES (:id, :content, :metadata, :embedding, :observer, :observed, :ws_name, :session_name)" + ), + { + "id": generate_nanoid(), + "content": "Document with only level field", + "metadata": json.dumps({"level": "explicit"}), + "embedding": [0.4] * 1536, + "observer": OBSERVER_NAME, + "observed": OBSERVED_NAME, + "ws_name": WORKSPACE_NAME, + "session_name": SESSION_NAME, + }, + ) + + # Scenario 5: Document with only times_derived in metadata + conn.execute( + text( + f'INSERT INTO "{schema}"."documents" ' + + '("id", "content", "internal_metadata", "embedding", "observer", "observed", "workspace_name", "session_name") ' + + "VALUES (:id, :content, :metadata, :embedding, :observer, :observed, :ws_name, :session_name)" + ), + { + "id": generate_nanoid(), + "content": "Document with only times_derived field", + "metadata": json.dumps({"times_derived": 7}), + "embedding": [0.5] * 1536, + "observer": OBSERVER_NAME, + "observed": OBSERVED_NAME, + "ws_name": WORKSPACE_NAME, + "session_name": SESSION_NAME, + }, + ) + + # Verify we have exactly 5 documents + count = conn.execute(text(f'SELECT COUNT(*) FROM "{schema}"."documents"')).scalar() + assert count == 5, f"Expected 5 documents but found {count}" + + +@register_after_upgrade("b8183c5ffb48") +def verify_codify_document_level_and_times_derived(verifier: MigrationVerifier) -> None: + """Add assertions validating the effects of b8183c5ffb48.""" + # Verify columns were added with correct nullability + verifier.assert_column_exists("documents", "level", nullable=False) + verifier.assert_column_exists("documents", "times_derived", nullable=False) + + # Verify CHECK constraint exists + verifier.assert_constraint_exists("documents", "level_valid", "check") + + conn = verifier.conn + schema = verifier.schema + + # Verify all rows have non-null values after migration + verifier.assert_no_nulls("documents", "level") + verifier.assert_no_nulls("documents", "times_derived") + + # Verify data transformation: level extracted from internal_metadata + explicit_count = conn.execute( + text(f'SELECT COUNT(*) FROM "{schema}"."documents" WHERE "level" = :level'), + {"level": "explicit"}, + ).scalar() + deductive_count = conn.execute( + text(f'SELECT COUNT(*) FROM "{schema}"."documents" WHERE "level" = :level'), + {"level": "deductive"}, + ).scalar() + + # 3 documents should have explicit (scenarios 1, 3, 4) + # 1 document should have deductive (scenario 2) + # 1 document should have default explicit (scenario 5) + assert explicit_count == 4, f"Expected 4 explicit documents, got {explicit_count}" + assert deductive_count == 1, f"Expected 1 deductive document, got {deductive_count}" + + # Verify specific times_derived values were migrated correctly + times_derived_3 = conn.execute( + text( + f'SELECT COUNT(*) FROM "{schema}"."documents" ' + + 'WHERE "times_derived" = 3 AND "content" LIKE :pattern' + ), + {"pattern": "%explicit level and times_derived=3%"}, + ).scalar() + assert ( + times_derived_3 == 1 + ), f"Expected 1 document with times_derived=3, got {times_derived_3}" + + times_derived_5 = conn.execute( + text( + f'SELECT COUNT(*) FROM "{schema}"."documents" ' + + 'WHERE "times_derived" = 5 AND "content" LIKE :pattern' + ), + {"pattern": "%deductive level and times_derived=5%"}, + ).scalar() + assert ( + times_derived_5 == 1 + ), f"Expected 1 document with times_derived=5, got {times_derived_5}" + + times_derived_7 = conn.execute( + text( + f'SELECT COUNT(*) FROM "{schema}"."documents" ' + + 'WHERE "times_derived" = 7 AND "content" LIKE :pattern' + ), + {"pattern": "%only times_derived field%"}, + ).scalar() + assert ( + times_derived_7 == 1 + ), f"Expected 1 document with times_derived=7, got {times_derived_7}" + + # Verify default times_derived=1 was applied to documents without it + times_derived_1 = conn.execute( + text(f'SELECT COUNT(*) FROM "{schema}"."documents" WHERE "times_derived" = 1') + ).scalar() + assert ( + times_derived_1 == 2 + ), f"Expected 2 documents with times_derived=1, got {times_derived_1}" + + # Verify internal_metadata still contains the original data (NOT removed by migration) + level_in_metadata = conn.execute( + text( + f'SELECT COUNT(*) FROM "{schema}"."documents" WHERE internal_metadata ? \'level\'' + ) + ).scalar() + # 3 documents had level in metadata (scenarios 1, 2, 4) + assert ( + level_in_metadata == 3 + ), f"Expected 3 documents with level in metadata, got {level_in_metadata}" + + times_derived_in_metadata = conn.execute( + text( + f'SELECT COUNT(*) FROM "{schema}"."documents" WHERE internal_metadata ? \'times_derived\'' + ) + ).scalar() + # 3 documents had times_derived in metadata (scenarios 1, 2, 5) + assert ( + times_derived_in_metadata == 3 + ), f"Expected 3 documents with times_derived in metadata, got {times_derived_in_metadata}" + + # Verify server defaults work for new documents + new_doc_id = generate_nanoid() + conn.execute( + text( + f'INSERT INTO "{schema}"."documents" ' + + '("id", "content", "internal_metadata", "embedding", "observer", "observed", "workspace_name", "session_name") ' + + "VALUES (:id, :content, :metadata, :embedding, :observer, :observed, :ws_name, :session_name)" + ), + { + "id": new_doc_id, + "content": "New document after migration", + "metadata": json.dumps({}), + "embedding": [0.6] * 1536, + "observer": OBSERVER_NAME, + "observed": OBSERVED_NAME, + "ws_name": WORKSPACE_NAME, + "session_name": SESSION_NAME, + }, + ) + + # Verify the new document got default values + new_doc = conn.execute( + text( + f'SELECT "level", "times_derived" FROM "{schema}"."documents" WHERE "id" = :id' + ), + {"id": new_doc_id}, + ).one() + assert ( + new_doc.level == "explicit" + ), f"Expected new document to have level='explicit', got {new_doc.level}" + assert ( + new_doc.times_derived == 1 + ), f"Expected new document to have times_derived=1, got {new_doc.times_derived}" diff --git a/tests/alembic/revisions/test_ec8f94139b02_codify_workspace_name_and_message_id_in_.py b/tests/alembic/revisions/test_ec8f94139b02_codify_workspace_name_and_message_id_in_.py new file mode 100644 index 00000000..cbef748a --- /dev/null +++ b/tests/alembic/revisions/test_ec8f94139b02_codify_workspace_name_and_message_id_in_.py @@ -0,0 +1,336 @@ +"""Hooks for revision ec8f94139b02 (codify_workspace_name_and_message_id_in_).""" + +from __future__ import annotations + +import json + +from nanoid import generate as generate_nanoid +from sqlalchemy import text + +from tests.alembic.registry import register_after_upgrade, register_before_upgrade +from tests.alembic.verifier import MigrationVerifier + +# Test data constants +WORKSPACE_NAME_1 = "test-workspace-1" +WORKSPACE_NAME_2 = "test-workspace-2" +PEER_NAME_1 = "test-peer-1" +PEER_NAME_2 = "test-peer-2" +SESSION_NAME_1 = "test-session-1" +SESSION_NAME_2 = "test-session-2" + +# Indexes that should be created by the migration +_INDEXES = ( + ("queue", "ix_queue_workspace_name"), + ("queue", "ix_queue_message_id_not_null"), + ("queue", "ix_queue_workspace_name_processed"), + ("queue", "ix_queue_work_unit_key_processed_id"), +) + + +@register_before_upgrade("ec8f94139b02") +def prepare_codify_workspace_name_and_message_id_in( + verifier: MigrationVerifier, +) -> None: + """Seed state and assertions before upgrading to ec8f94139b02.""" + # Verify columns don't exist yet + verifier.assert_column_exists("queue", "workspace_name", exists=False) + verifier.assert_column_exists("queue", "message_id", exists=False) + + # Verify foreign key constraints don't exist yet + verifier.assert_constraint_exists( + "queue", "fk_queue_workspace_name", "foreign_key", exists=False + ) + verifier.assert_constraint_exists( + "queue", "fk_queue_message_id", "foreign_key", exists=False + ) + + # Verify indexes don't exist yet + verifier.assert_indexes_not_exist(_INDEXES) + + conn = verifier.conn + schema = verifier.schema + + # Create workspaces + conn.execute( + text( + f'INSERT INTO "{schema}"."workspaces" ("id", "name") ' + + "VALUES (:ws_id_1, :ws_name_1), (:ws_id_2, :ws_name_2)" + ), + { + "ws_id_1": generate_nanoid(), + "ws_name_1": WORKSPACE_NAME_1, + "ws_id_2": generate_nanoid(), + "ws_name_2": WORKSPACE_NAME_2, + }, + ) + + # Create peers + conn.execute( + text( + f'INSERT INTO "{schema}"."peers" ("id", "name", "workspace_name") ' + + "VALUES (:peer_id_1, :peer_name_1, :ws_name_1), " + + "(:peer_id_2, :peer_name_2, :ws_name_2)" + ), + { + "peer_id_1": generate_nanoid(), + "peer_name_1": PEER_NAME_1, + "ws_name_1": WORKSPACE_NAME_1, + "peer_id_2": generate_nanoid(), + "peer_name_2": PEER_NAME_2, + "ws_name_2": WORKSPACE_NAME_2, + }, + ) + + # Create sessions + conn.execute( + text( + f'INSERT INTO "{schema}"."sessions" ("id", "name", "workspace_name") ' + + "VALUES (:session_id_1, :session_name_1, :ws_name_1), " + + "(:session_id_2, :session_name_2, :ws_name_2)" + ), + { + "session_id_1": generate_nanoid(), + "session_name_1": SESSION_NAME_1, + "ws_name_1": WORKSPACE_NAME_1, + "session_id_2": generate_nanoid(), + "session_name_2": SESSION_NAME_2, + "ws_name_2": WORKSPACE_NAME_2, + }, + ) + + # Create some messages to reference in queue items + message_ids: list[str] = [] + for i in range(10): + message_id: str = generate_nanoid() + message_ids.append(message_id) + workspace = WORKSPACE_NAME_1 if i % 2 == 0 else WORKSPACE_NAME_2 + session = SESSION_NAME_1 if i % 2 == 0 else SESSION_NAME_2 + peer = PEER_NAME_1 if i % 2 == 0 else PEER_NAME_2 + + conn.execute( + text( + f'INSERT INTO "{schema}"."messages" ' + + '("public_id", "workspace_name", "session_name", "peer_name", "content", "seq_in_session") ' + + "VALUES (:msg_id, :ws_name, :session_name, :peer_name, :content, :seq)" + ), + { + "msg_id": message_id, + "ws_name": workspace, + "session_name": session, + "peer_name": peer, + "content": f"test message {i}", + "seq": i, + }, + ) + + # Get internal message IDs for queue references + message_db_ids: list[int] = [] + for msg_id in message_ids: + result = conn.execute( + text(f'SELECT "id" FROM "{schema}"."messages" WHERE "public_id" = :msg_id'), + {"msg_id": msg_id}, + ).one() + message_db_ids.append(result.id) + + # Bulk insert 100k queue items with workspace_name and message_id in payload + # Use efficient batch insert with generate_series + conn.execute(text("SET LOCAL synchronous_commit = OFF")) + + # Insert queue items in three categories: + # 1. Items with both workspace_name and message_id (60k) + # 2. Items with workspace_name but NO message_id (30k) + # 3. Items with workspace_name and NULL message_id value (10k) + + # Category 1: Both workspace_name and message_id (60k items) + conn.execute( + text( + f'INSERT INTO "{schema}"."queue" ' + + '("work_unit_key", "task_type", "payload", "processed") ' + + "SELECT " + + " 'work-unit-' || gs::text, " + + " 'representation', " + + " jsonb_build_object(" + + " 'workspace_name', CASE WHEN gs % 2 = 0 THEN :ws_name_1 ELSE :ws_name_2 END, " + + " 'message_id', :msg_db_id_0 + (gs % 10), " + + " 'other_field', 'value-' || gs::text" + + " ), " + + " false " + + "FROM generate_series(1, :n) AS gs" + ), + { + "ws_name_1": WORKSPACE_NAME_1, + "ws_name_2": WORKSPACE_NAME_2, + "msg_db_id_0": message_db_ids[0], + "n": 60_000, + }, + ) + + # Category 2: Only workspace_name, no message_id key (30k items) + conn.execute( + text( + f'INSERT INTO "{schema}"."queue" ' + + '("work_unit_key", "task_type", "payload", "processed") ' + + "SELECT " + + " 'work-unit-no-msg-' || gs::text, " + + " 'summary', " + + " jsonb_build_object(" + + " 'workspace_name', CASE WHEN gs % 2 = 0 THEN :ws_name_1 ELSE :ws_name_2 END, " + + " 'other_field', 'value-' || gs::text" + + " ), " + + " false " + + "FROM generate_series(60001, :n) AS gs" + ), + { + "ws_name_1": WORKSPACE_NAME_1, + "ws_name_2": WORKSPACE_NAME_2, + "n": 90_000, + }, + ) + + # Category 3: workspace_name with explicit NULL message_id (10k items) + conn.execute( + text( + f'INSERT INTO "{schema}"."queue" ' + + '("work_unit_key", "task_type", "payload", "processed") ' + + "SELECT " + + " 'work-unit-null-msg-' || gs::text, " + + " 'representation', " + + " jsonb_build_object(" + + " 'workspace_name', CASE WHEN gs % 2 = 0 THEN :ws_name_1 ELSE :ws_name_2 END, " + + " 'message_id', NULL::bigint, " + + " 'other_field', 'value-' || gs::text" + + " ), " + + " false " + + "FROM generate_series(90001, :n) AS gs" + ), + { + "ws_name_1": WORKSPACE_NAME_1, + "ws_name_2": WORKSPACE_NAME_2, + "n": 100_000, + }, + ) + + # Verify we have exactly 100k queue items + count = conn.execute(text(f'SELECT COUNT(*) FROM "{schema}"."queue"')).scalar() + assert count == 100_000, f"Expected 100k queue items but found {count}" + + +@register_after_upgrade("ec8f94139b02") +def verify_codify_workspace_name_and_message_id_in(verifier: MigrationVerifier) -> None: + """Add assertions validating the effects of ec8f94139b02.""" + # Verify columns were added with correct nullability + verifier.assert_column_exists("queue", "workspace_name", nullable=False) + verifier.assert_column_exists("queue", "message_id", nullable=True) + + # Verify all indexes were created + verifier.assert_indexes_exist(_INDEXES) + + # Verify foreign key constraints exist + verifier.assert_constraint_exists("queue", "fk_queue_workspace_name", "foreign_key") + verifier.assert_constraint_exists("queue", "fk_queue_message_id", "foreign_key") + + conn = verifier.conn + schema = verifier.schema + + # Verify all rows have non-null workspace_name after migration + verifier.assert_no_nulls("queue", "workspace_name") + + # Verify data transformation: workspace_name extracted from payload + ws1_count = conn.execute( + text( + f'SELECT COUNT(*) FROM "{schema}"."queue" ' + + 'WHERE "workspace_name" = :ws_name' + ), + {"ws_name": WORKSPACE_NAME_1}, + ).scalar() + ws2_count = conn.execute( + text( + f'SELECT COUNT(*) FROM "{schema}"."queue" ' + + 'WHERE "workspace_name" = :ws_name' + ), + {"ws_name": WORKSPACE_NAME_2}, + ).scalar() + + # Should be roughly 50/50 split (we alternate in the insert) + assert ( + ws1_count == 50_000 + ), f"Expected 50k items with workspace_name_1, got {ws1_count}" + assert ( + ws2_count == 50_000 + ), f"Expected 50k items with workspace_name_2, got {ws2_count}" + + # Verify data transformation: message_id extracted from payload where it exists + msg_id_count = conn.execute( + text( + f'SELECT COUNT(*) FROM "{schema}"."queue" ' + + 'WHERE "message_id" IS NOT NULL' + ) + ).scalar() + + # Should be 60k items with message_id (category 1 only) + assert ( + msg_id_count == 60_000 + ), f"Expected 60k items with message_id, got {msg_id_count}" + + # Verify items without message_id in payload have NULL in column + null_msg_id_count = conn.execute( + text(f'SELECT COUNT(*) FROM "{schema}"."queue" ' + 'WHERE "message_id" IS NULL') + ).scalar() + + # Should be 40k items (30k without key + 10k with NULL value) + assert ( + null_msg_id_count == 40_000 + ), f"Expected 40k items with NULL message_id, got {null_msg_id_count}" + + # Verify workspace_name was removed from payload + ws_in_payload_count = conn.execute( + text( + f'SELECT COUNT(*) FROM "{schema}"."queue" ' + + "WHERE payload ? 'workspace_name'" + ) + ).scalar() + assert ( + ws_in_payload_count == 0 + ), f"Found {ws_in_payload_count} items still with workspace_name in payload" + + # Verify message_id was removed from payload + msg_in_payload_count = conn.execute( + text( + f'SELECT COUNT(*) FROM "{schema}"."queue" ' + "WHERE payload ? 'message_id'" + ) + ).scalar() + assert ( + msg_in_payload_count == 0 + ), f"Found {msg_in_payload_count} items still with message_id in payload" + + # Verify other_field remains in payload (data preservation) + other_field_count = conn.execute( + text( + f'SELECT COUNT(*) FROM "{schema}"."queue" ' + + "WHERE payload ? 'other_field'" + ) + ).scalar() + assert ( + other_field_count == 100_000 + ), f"Expected all 100k items to retain other_field in payload, got {other_field_count}" + + # Spot check: verify a specific queue item was transformed correctly + sample_item = conn.execute( + text( + 'SELECT "workspace_name", "message_id", "payload" ' + + f'FROM "{schema}"."queue" ' + + "WHERE work_unit_key = 'work-unit-1' " + + "LIMIT 1" + ) + ).one() + + assert sample_item.workspace_name == WORKSPACE_NAME_2 # gs=1 is odd, so workspace 2 + assert sample_item.message_id is not None # Category 1 item + payload = ( + json.loads(sample_item.payload) + if isinstance(sample_item.payload, str) + else sample_item.payload + ) + assert "workspace_name" not in payload + assert "message_id" not in payload + assert payload.get("other_field") == "value-1" diff --git a/tests/crud/test_workspace.py b/tests/crud/test_workspace.py index 18601128..d8ea00a5 100644 --- a/tests/crud/test_workspace.py +++ b/tests/crud/test_workspace.py @@ -318,6 +318,7 @@ class TestWorkspaceCRUD: work_unit_key=f"representation:{test_workspace.name}:{session.name}:{test_peer.name}:{test_peer.name}", task_type="representation", payload={"test": "data"}, + workspace_name=test_workspace.name, ) db_session.add(queue_item) await db_session.flush() diff --git a/tests/deriver/conftest.py b/tests/deriver/conftest.py index 89410656..6ece4892 100644 --- a/tests/deriver/conftest.py +++ b/tests/deriver/conftest.py @@ -1,7 +1,7 @@ import asyncio -from collections.abc import Callable, Generator +from collections.abc import Awaitable, Callable, Generator, Sequence from datetime import datetime, timezone -from typing import Any, Literal +from typing import Any, Literal, TypeAlias, cast from unittest.mock import AsyncMock, MagicMock, patch import pytest @@ -11,7 +11,10 @@ from sqlalchemy.ext.asyncio import AsyncSession from src import crud, models, schemas from src.utils.queue_payload import create_payload -from src.utils.work_unit import get_work_unit_key +from src.utils.work_unit import construct_work_unit_key + +QueuePayload: TypeAlias = dict[str, Any] +QueuePayloadEntry: TypeAlias = QueuePayload | tuple[QueuePayload, int | None] @pytest.fixture @@ -155,18 +158,29 @@ def create_queue_payload() -> Callable[..., Any]: @pytest.fixture async def add_queue_items( db_session: AsyncSession, -) -> Callable[[list[dict[str, Any]], str], Any]: +) -> Callable[ + [Sequence[QueuePayloadEntry], str, str], Awaitable[list[models.QueueItem]] +]: """Helper function to add queue items to the database""" async def _add_items( - payloads: list[dict[str, Any]], session_id: str + payloads: Sequence[QueuePayloadEntry], + session_id: str, + workspace_name: str, ) -> list[models.QueueItem]: """Add queue items to the database and return them""" queue_items: list[models.QueueItem] = [] - for payload in payloads: + for payload_entry in payloads: + payload: QueuePayload + message_id: int | None + if isinstance(payload_entry, tuple): + payload, message_id = payload_entry + else: + payload = payload_entry + message_id = cast(int | None, payload.get("message_id")) # Generate work_unit_key from the payload - task_type = payload.get("task_type", "unknown") - work_unit_key = get_work_unit_key(payload) + task_type = cast(str, payload.get("task_type", "unknown")) + work_unit_key = construct_work_unit_key(workspace_name, payload) queue_item = models.QueueItem( session_id=session_id, @@ -174,6 +188,8 @@ async def add_queue_items( work_unit_key=work_unit_key, payload=payload, processed=False, + workspace_name=workspace_name, + message_id=message_id, ) db_session.add(queue_item) queue_items.append(queue_item) @@ -203,7 +219,7 @@ async def sample_queue_items( messages = sample_messages # Create various types of queue payloads - payloads: list[dict[str, Any]] = [] + payloads: list[tuple[dict[str, Any], int]] = [] # Create representation payloads for each message for message in messages: @@ -214,7 +230,7 @@ async def sample_queue_items( observer=message.peer_name, observed=message.peer_name, ) - payloads.append(payload1) + payloads.append((payload1, message.id)) # Representation for observer peer payload2 = create_queue_payload( @@ -223,7 +239,7 @@ async def sample_queue_items( observer=peer2.name, # peer2 observes others observed=message.peer_name, ) - payloads.append(payload2) + payloads.append((payload2, message.id)) # Create summary payloads for session for i, message in enumerate(messages): @@ -232,10 +248,10 @@ async def sample_queue_items( task_type="summary", message_seq_in_session=i + 1, ) - payloads.append(payload) + payloads.append((payload, message.id)) # Add all payloads as queue items - queue_items = await add_queue_items(payloads, session.id) + queue_items = await add_queue_items(payloads, session.id, session.workspace_name) return queue_items diff --git a/tests/deriver/test_deriver_processing.py b/tests/deriver/test_deriver_processing.py index 002377df..4ebb86f7 100644 --- a/tests/deriver/test_deriver_processing.py +++ b/tests/deriver/test_deriver_processing.py @@ -9,6 +9,7 @@ import pytest from src import models from src.deriver.deriver import process_representation_tasks_batch from src.utils.representation import Representation +from src.utils.work_unit import construct_work_unit_key @pytest.mark.asyncio @@ -32,14 +33,12 @@ class TestDeriverProcessing: sample_session_with_peers: tuple[models.Session, list[models.Peer]], ): """Test that work unit keys are generated correctly""" - from src.utils.work_unit import get_work_unit_key session, peers = sample_session_with_peers peer1, peer2, _ = peers # Create a payload for representation task representation_payload = { - "workspace_name": "workspace1", "session_name": session.name, "observer": peer2.name, "observed": peer1.name, @@ -47,22 +46,25 @@ class TestDeriverProcessing: } # Generate work unit key for representation - work_unit_key = get_work_unit_key(representation_payload) - expected_key = ( - f"representation:workspace1:{session.name}:{peer2.name}:{peer1.name}" + work_unit_key = construct_work_unit_key( + session.workspace_name, representation_payload ) + expected_key = f"representation:{session.workspace_name}:{session.name}:{peer2.name}:{peer1.name}" assert work_unit_key == expected_key # Create a payload for summary task summary_payload = { - "workspace_name": "workspace1", "session_name": session.name, "task_type": "summary", } # Generate work unit key for summary - summary_work_unit_key = get_work_unit_key(summary_payload) - expected_summary_key = f"summary:workspace1:{session.name}:None:None" + summary_work_unit_key = construct_work_unit_key( + session.workspace_name, summary_payload + ) + expected_summary_key = ( + f"summary:{session.workspace_name}:{session.name}:None:None" + ) assert summary_work_unit_key == expected_summary_key async def test_mock_queue_manager( diff --git a/tests/deriver/test_queue_processing.py b/tests/deriver/test_queue_processing.py index d620392a..dfb85605 100644 --- a/tests/deriver/test_queue_processing.py +++ b/tests/deriver/test_queue_processing.py @@ -10,7 +10,7 @@ from sqlalchemy.ext.asyncio import AsyncSession from src import models from src.config import settings from src.deriver.queue_manager import QueueManager, WorkerOwnership -from src.utils.work_unit import get_work_unit_key +from src.utils.work_unit import construct_work_unit_key @pytest.mark.asyncio @@ -139,7 +139,7 @@ class TestQueueProcessing: for message in messages: await db_session.refresh(message) - payloads: list[Any] = [] + payloads: list[tuple[dict[str, Any], int]] = [] for message in messages: payload = create_queue_payload( # type: ignore[reportUnknownArgumentType] message=message, @@ -147,9 +147,9 @@ class TestQueueProcessing: observed=peer.name, observer=peer.name, ) - payloads.append(payload) + payloads.append((payload, message.id)) - items = await add_queue_items(payloads, session.id) + items = await add_queue_items(payloads, session.id, session.workspace_name) # Determine ascending order by DB id ordered = ( ( @@ -304,20 +304,23 @@ class TestQueueProcessing: await db_session.refresh(message) # Create queue items with token counts - payloads = [ - create_queue_payload( # type: ignore[reportUnknownArgumentType] - message=msg, - task_type="representation", - observed=peer.name, - observer=peer.name, + payload_entries = [ + ( + create_queue_payload( # type: ignore[reportUnknownArgumentType] + message=msg, + task_type="representation", + observed=peer.name, + observer=peer.name, + ), + msg, ) for msg in messages ] queue_items: list[models.QueueItem] = [] - for payload in payloads: + for payload, message in payload_entries: task_type = payload.get("task_type", "unknown") - work_unit_key = get_work_unit_key(payload) + work_unit_key = construct_work_unit_key(session.workspace_name, payload) queue_item = models.QueueItem( session_id=session.id, @@ -325,6 +328,8 @@ class TestQueueProcessing: work_unit_key=work_unit_key, payload=payload, processed=False, + workspace_name=session.workspace_name, + message_id=message.id, ) db_session.add(queue_item) queue_items.append(queue_item) @@ -430,7 +435,7 @@ class TestQueueProcessing: observed=peer.name, observer=target.name, ) - work_unit_key = get_work_unit_key(payload) + work_unit_key = construct_work_unit_key(session.workspace_name, payload) queue_item = models.QueueItem( session_id=session.id, @@ -438,6 +443,8 @@ class TestQueueProcessing: work_unit_key=work_unit_key, payload=payload, processed=False, + workspace_name=session.workspace_name, + message_id=message.id, ) db_session.add(queue_item) @@ -596,7 +603,7 @@ class TestQueueProcessing: observed=peer.name, observer=target.name, ) - work_unit_key = get_work_unit_key(payload) + work_unit_key = construct_work_unit_key(session.workspace_name, payload) queue_item = models.QueueItem( session_id=session.id, @@ -604,6 +611,8 @@ class TestQueueProcessing: work_unit_key=work_unit_key, payload=payload, processed=False, + workspace_name=session.workspace_name, + message_id=message.id, ) db_session.add(queue_item) @@ -702,7 +711,6 @@ class TestQueueProcessing: token_counts = [500, 600] messages = [ models.Message( - id=999, session_name=session.name, workspace_name=session.workspace_name, peer_name=peer.name, @@ -711,7 +719,6 @@ class TestQueueProcessing: seq_in_session=1, ), models.Message( - id=1000, session_name=session.name, workspace_name=session.workspace_name, peer_name=peer.name, @@ -721,6 +728,15 @@ class TestQueueProcessing: ), ] + # Save messages to database first + for message in messages: + db_session.add(message) + await db_session.commit() + + # Refresh to get the actual IDs + for message in messages: + await db_session.refresh(message) + # Create payloads and queue items queue_items: list[models.QueueItem] = [] for i, message in enumerate(messages): @@ -729,7 +745,7 @@ class TestQueueProcessing: ) payload["token_count"] = token_counts[i] - work_unit_key = get_work_unit_key(payload) + work_unit_key = construct_work_unit_key(session.workspace_name, payload) queue_item = models.QueueItem( session_id=session.id, @@ -737,6 +753,8 @@ class TestQueueProcessing: work_unit_key=work_unit_key, payload=payload, processed=False, + workspace_name=session.workspace_name, + message_id=message.id, ) db_session.add(queue_item) queue_items.append(queue_item) @@ -747,10 +765,11 @@ class TestQueueProcessing: processed_batches: list[dict[str, Any]] = [] async def mock_process_item( - task_type: str, - queue_payload: dict[str, Any], # pyright: ignore[reportUnusedParameter] + queue_item: models.QueueItem, ) -> None: - processed_batches.append({"task_type": task_type, "payload_count": 1}) + processed_batches.append( + {"task_type": queue_item.task_type, "payload_count": 1} + ) qm = QueueManager() work_unit_key = queue_items[0].work_unit_key @@ -838,21 +857,24 @@ class TestQueueProcessing: await db_session.refresh(message) # Create queue items - payloads = [ - create_queue_payload( # type: ignore[reportUnknownArgumentType] - message=msg, - task_type="representation", - observed=peer.name, - observer=peer.name, + payload_entries = [ + ( + create_queue_payload( # type: ignore[reportUnknownArgumentType] + message=msg, + task_type="representation", + observed=peer.name, + observer=peer.name, + ), + msg, ) for msg in messages ] # Add items to queue queue_items: list[models.QueueItem] = [] - for payload in payloads: + for payload, message in payload_entries: task_type = payload.get("task_type", "unknown") - work_unit_key = get_work_unit_key(payload) + work_unit_key = construct_work_unit_key(session.workspace_name, payload) queue_item = models.QueueItem( session_id=session.id, @@ -860,6 +882,8 @@ class TestQueueProcessing: work_unit_key=work_unit_key, payload=payload, processed=False, + workspace_name=session.workspace_name, + message_id=message.id, ) db_session.add(queue_item) queue_items.append(queue_item) @@ -949,21 +973,24 @@ class TestQueueProcessing: await db_session.refresh(message) # Create queue items - payloads = [ - create_queue_payload( # type: ignore[reportUnknownArgumentType] - message=msg, - task_type="representation", - observed=peer.name, - observer=peer.name, + payload_entries = [ + ( + create_queue_payload( # type: ignore[reportUnknownArgumentType] + message=msg, + task_type="representation", + observed=peer.name, + observer=peer.name, + ), + msg, ) for msg in messages ] # Add items to queue queue_items: list[models.QueueItem] = [] - for payload in payloads: + for payload, message in payload_entries: task_type = payload.get("task_type", "unknown") - work_unit_key = get_work_unit_key(payload) + work_unit_key = construct_work_unit_key(session.workspace_name, payload) queue_item = models.QueueItem( session_id=session.id, @@ -971,6 +998,8 @@ class TestQueueProcessing: work_unit_key=work_unit_key, payload=payload, processed=False, + workspace_name=session.workspace_name, + message_id=message.id, ) db_session.add(queue_item) queue_items.append(queue_item) diff --git a/tests/integration/test_representation.py b/tests/integration/test_representation.py index 15d8dd37..f3e112b5 100644 --- a/tests/integration/test_representation.py +++ b/tests/integration/test_representation.py @@ -222,8 +222,8 @@ class TestDocumentCreationWorkflow: observed=observed_peer.name, content="User likes dogs", session_name="test_session", + level="explicit", internal_metadata={ - "level": "explicit", "message_ids": [(1, 1)], "session_name": "test_session", }, @@ -274,7 +274,9 @@ class TestDocumentCreationWorkflow: observed=observed_peer.name, content="Highly derived observation", session_name=session.name, - internal_metadata={"level": "explicit", "times_derived": 5}, + level="explicit", + times_derived=5, + internal_metadata={}, embedding=[0.1] * 1536, ) db_session.add(highly_derived_doc) @@ -286,7 +288,9 @@ class TestDocumentCreationWorkflow: observed=observed_peer.name, content="Less derived observation", session_name=session.name, - internal_metadata={"level": "explicit", "times_derived": 2}, + level="explicit", + times_derived=2, + internal_metadata={}, embedding=[0.2] * 1536, ) db_session.add(less_derived_doc) @@ -315,8 +319,8 @@ class TestDocumentCreationWorkflow: observer="test_peer", observed="test_peer", content="User said they like programming", + level="explicit", internal_metadata={ - "level": "explicit", "message_ids": [(1, 1)], }, session_name="test_session", @@ -329,8 +333,8 @@ class TestDocumentCreationWorkflow: observer="test_peer", observed="test_peer", content="User is likely a software developer", + level="deductive", internal_metadata={ - "level": "deductive", "message_ids": [(1, 1)], "premises": ["User said they like programming"], }, diff --git a/tests/routes/test_queue_status.py b/tests/routes/test_queue_status.py index 85fd048f..bc50dcc7 100644 --- a/tests/routes/test_queue_status.py +++ b/tests/routes/test_queue_status.py @@ -3,7 +3,7 @@ from fastapi.testclient import TestClient from sqlalchemy.ext.asyncio import AsyncSession from src import models -from src.utils.work_unit import get_work_unit_key +from src.utils.work_unit import construct_work_unit_key @pytest.mark.asyncio @@ -157,9 +157,10 @@ class TestDeriverStatusEndpoint: queue_item = models.QueueItem( session_id=session.id, task_type="representation", - work_unit_key=get_work_unit_key(payload), + work_unit_key=construct_work_unit_key(workspace.name, payload), payload=payload, processed=False, + workspace_name=workspace.name, ) queue_items.append(queue_item) db_session.add_all(queue_items) @@ -231,9 +232,10 @@ class TestDeriverStatusEndpoint: queue_item = models.QueueItem( session_id=session.id, task_type="representation", - work_unit_key=get_work_unit_key(payload), + work_unit_key=construct_work_unit_key(workspace.name, payload), payload=payload, processed=False, + workspace_name=workspace.name, ) queue_items.append(queue_item) db_session.add_all(queue_items) @@ -292,9 +294,10 @@ class TestDeriverStatusEndpoint: queue_item = models.QueueItem( session_id=session.id, task_type="representation", - work_unit_key=get_work_unit_key(payload), + work_unit_key=construct_work_unit_key(workspace.name, payload), payload=payload, processed=False, + workspace_name=workspace.name, ) db_session.add(queue_item) await db_session.commit() diff --git a/tests/test_schema_validations.py b/tests/test_schema_validations.py index 86ad1b37..775c32b8 100644 --- a/tests/test_schema_validations.py +++ b/tests/test_schema_validations.py @@ -95,17 +95,18 @@ class TestDocumentValidations: def test_valid_document_create(self): metadata = DocumentMetadata( message_ids=[(1, 1)], - level="explicit", premises=[], message_created_at="2021-01-01T00:00:00Z", ) doc = DocumentCreate( content="test content", session_name="test", + level="explicit", metadata=metadata, embedding=[0.1, 0.2, 0.3], ) assert doc.content == "test content" + assert doc.level == "explicit" assert doc.metadata == metadata def test_document_content_too_short(self): @@ -113,9 +114,9 @@ class TestDocumentValidations: DocumentCreate( content="", session_name="test", + level="explicit", metadata=DocumentMetadata( message_ids=[(1, 1)], - level="explicit", premises=[], message_created_at="2021-01-01T00:00:00Z", ), @@ -129,9 +130,9 @@ class TestDocumentValidations: DocumentCreate( content="a" * 100001, session_name="test", + level="explicit", metadata=DocumentMetadata( message_ids=[(1, 1)], - level="explicit", premises=[], message_created_at="2021-01-01T00:00:00Z", ), From d4801d35a08bdc054f6aa33e492415a831396f43 Mon Sep 17 00:00:00 2001 From: Rajat Ahuja Date: Tue, 11 Nov 2025 12:48:29 -0500 Subject: [PATCH 13/13] fix: pin cashews version to 7.4.1 (#267) --- pyproject.toml | 2 +- uv.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 8c0bf144..da2400ac 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -34,7 +34,7 @@ dependencies = [ "prometheus-client>=0.20.0", "json-repair>=0.49.0", "redis>=6.0.0", - "cashews[redis]>=7.4.3", + "cashews[redis]==7.4.1", ] [tool.uv] dev-dependencies = [ diff --git a/uv.lock b/uv.lock index 87614adf..01ae81c3 100644 --- a/uv.lock +++ b/uv.lock @@ -129,11 +129,11 @@ wheels = [ [[package]] name = "cashews" -version = "7.4.3" +version = "7.4.1" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/52/d9/e7b3daee814680e9a4a02835beb8c13b489a4422e902a7f39371c811ed2b/cashews-7.4.3.tar.gz", hash = "sha256:72cc1931b558e1bbe1e80395f9be6707131ffe21768f55e359d3e760c802fbb1", size = 92426, upload-time = "2025-10-11T21:08:41.761Z" } +sdist = { url = "https://files.pythonhosted.org/packages/9e/02/6c63550c84263219367e027038ccdac9bff900775262027ac35b6de91973/cashews-7.4.1.tar.gz", hash = "sha256:9d4ac7b0d0e20ec96680af60ae15dc26c19ccc267baa84a472c54bef86a93a8a", size = 91757, upload-time = "2025-07-14T22:39:48.137Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/c5/6b/40059c0d5fe32b6434aae14b55afe6a7e6d158826582a5a44101bb5daaed/cashews-7.4.3-py3-none-any.whl", hash = "sha256:33449b26b44c36d3ab6e73f91f71ade1e29e918e85a820238f1947beaae26322", size = 79729, upload-time = "2025-10-11T21:08:40.236Z" }, + { url = "https://files.pythonhosted.org/packages/f8/e6/e77b27292b560725c35e478e90bdc9fe84c6ec849daac4360b4150083b4f/cashews-7.4.1-py3-none-any.whl", hash = "sha256:868019e9c8b0a75f345ea58b71197640b20dc2fe0892eb5ef6537f5652299ba4", size = 79356, upload-time = "2025-07-14T22:39:46.719Z" }, ] [package.optional-dependencies] @@ -761,7 +761,7 @@ dev = [ [package.metadata] requires-dist = [ { name = "alembic", specifier = ">=1.14.0" }, - { name = "cashews", extras = ["redis"], specifier = ">=7.4.3" }, + { name = "cashews", extras = ["redis"], specifier = "==7.4.1" }, { name = "fastapi", extras = ["standard"], specifier = ">=0.111.0" }, { name = "fastapi-pagination", specifier = ">=0.12.24" }, { name = "google-genai", specifier = ">=1.32.0" },