* fix: prevent silent memory loss on consolidation LLM failure
When all LLM retries are exhausted during consolidation, memories were
being marked consolidated_at unconditionally, permanently excluding them
from future consolidation runs without producing any observations.
Fix with two complementary mechanisms:
- Adaptive batch splitting: on LLM failure, the batch is halved and
retried recursively down to batch_size=1, recovering most transient
failures (rate limits, Pydantic validation on long prompts) without
operator intervention
- consolidation_failed_at column: only single-memory batches that still
fail after all retries are marked here instead of consolidated_at, so
they remain visible and retryable
- New API endpoint POST /v1/default/banks/{bank_id}/consolidation/retry-failed
resets these memories for the next consolidation run
* chore: regenerate OpenAPI spec
* fix: rename consolidation endpoint from /retry-failed to /recover
* fix: add consolidation_failed_at column, adaptive batch splitting, and recovery API
- Migration a3b4c5d6e7f8: add consolidation_failed_at TIMESTAMPTZ column to
memory_units with an index for efficient failure queries; properly chains off
g7h8i9j0k1l2 (backsweep_orphan_observations)
- Consolidator: filter pending memories with consolidation_failed_at IS NULL
so failed memories are not re-fetched in an infinite loop
- Consolidator: adaptive batch splitting — when a batch exhausts all 3 LLM
retries, halve it and retry sub-batches recursively; only single-memory
batches that also exhaust all retries get consolidation_failed_at set
- New tests (9 total) covering: adaptive splitting recovers all memories,
larger batch splitting, single-memory permanent failure, exclusion from
next run, partial batch failure, recover resets columns, recover returns
0 when none failed, recover-then-consolidate succeeds, HTTP endpoint
* chore: regenerate Go, Python, TypeScript clients with recover consolidation endpoint
* feat: add Recover Consolidation action to bank Actions dropdown
* style: apply ruff formatting to http.py and config.py
* fix: handle consolidation scope in large batch test mock LLM
The mock LLM was returning {"facts": ...} for ALL calls including consolidation.
Consolidation doesn't use skip_validation=True so it expects a _ConsolidationBatchResponse
instance, not a raw dict. Before this PR consolidation silently swallowed the AttributeError
(failed=False was returned); now failed=True triggers adaptive splitting and timeouts.
Fix: return _ConsolidationBatchResponse() when scope=="consolidation".
* fix: restrict claude-agent-sdk to macOS platform only (no Linux wheel available)
Also fix pre-existing type errors: use setattr for XLM-RoBERTa monkey-patch
and add missing reranker_local_fp16/bucket_batching/batch_size fields to main.py config constructor.
* fix: add UV_INDEX_STRATEGY=unsafe-best-match to fix markupsafe cp314 wheel conflict
PyTorch CPU index serves markupsafe==3.0.3 with only cp314 wheels.
uv's default first-index strategy stops at the first index with any version
even if no compatible wheel exists. unsafe-best-match searches all indices
for the best compatible wheel, falling back to PyPI for markupsafe.
* fix: use explicit pytorch index to prevent markupsafe wheel conflict
Configure the pytorch CPU index as explicit=true in pyproject.toml so it is
ONLY used for torch (via [tool.uv.sources]). All other packages (including
markupsafe) are resolved exclusively from PyPI, preventing the pytorch index
from serving incompatible cp314-only wheels for non-pytorch packages.
Remove UV_INDEX and UV_INDEX_STRATEGY from CI workflow (no longer needed
since the index is now configured in pyproject.toml).
* ci: trigger CI run
* ci: retry trigger
* ci: trigger after remote URL fix
* ci: add workflow_dispatch to unblock manual trigger
* fix: remove empty env blocks left after UV_INDEX removal
* fix: add type: ignore for optional claude_agent_sdk imports (macOS-only)
* fix: correct type: ignore rules for claude_agent_sdk and fix utcnow deprecation
112 lines
5.4 KiB
Text
112 lines
5.4 KiB
Text
hindsight_client_api/__init__.py
|
|
hindsight_client_api/api/__init__.py
|
|
hindsight_client_api/api/banks_api.py
|
|
hindsight_client_api/api/directives_api.py
|
|
hindsight_client_api/api/documents_api.py
|
|
hindsight_client_api/api/entities_api.py
|
|
hindsight_client_api/api/files_api.py
|
|
hindsight_client_api/api/memory_api.py
|
|
hindsight_client_api/api/mental_models_api.py
|
|
hindsight_client_api/api/monitoring_api.py
|
|
hindsight_client_api/api/operations_api.py
|
|
hindsight_client_api/api/webhooks_api.py
|
|
hindsight_client_api/api_client.py
|
|
hindsight_client_api/api_response.py
|
|
hindsight_client_api/configuration.py
|
|
hindsight_client_api/exceptions.py
|
|
hindsight_client_api/models/__init__.py
|
|
hindsight_client_api/models/add_background_request.py
|
|
hindsight_client_api/models/async_operation_submit_response.py
|
|
hindsight_client_api/models/background_response.py
|
|
hindsight_client_api/models/bank_config_response.py
|
|
hindsight_client_api/models/bank_config_update.py
|
|
hindsight_client_api/models/bank_list_item.py
|
|
hindsight_client_api/models/bank_list_response.py
|
|
hindsight_client_api/models/bank_profile_response.py
|
|
hindsight_client_api/models/bank_stats_response.py
|
|
hindsight_client_api/models/budget.py
|
|
hindsight_client_api/models/cancel_operation_response.py
|
|
hindsight_client_api/models/child_operation_status.py
|
|
hindsight_client_api/models/chunk_data.py
|
|
hindsight_client_api/models/chunk_include_options.py
|
|
hindsight_client_api/models/chunk_response.py
|
|
hindsight_client_api/models/clear_memory_observations_response.py
|
|
hindsight_client_api/models/consolidation_response.py
|
|
hindsight_client_api/models/create_bank_request.py
|
|
hindsight_client_api/models/create_directive_request.py
|
|
hindsight_client_api/models/create_mental_model_request.py
|
|
hindsight_client_api/models/create_mental_model_response.py
|
|
hindsight_client_api/models/create_webhook_request.py
|
|
hindsight_client_api/models/delete_document_response.py
|
|
hindsight_client_api/models/delete_response.py
|
|
hindsight_client_api/models/directive_list_response.py
|
|
hindsight_client_api/models/directive_response.py
|
|
hindsight_client_api/models/disposition_traits.py
|
|
hindsight_client_api/models/document_response.py
|
|
hindsight_client_api/models/entity_detail_response.py
|
|
hindsight_client_api/models/entity_include_options.py
|
|
hindsight_client_api/models/entity_input.py
|
|
hindsight_client_api/models/entity_list_item.py
|
|
hindsight_client_api/models/entity_list_response.py
|
|
hindsight_client_api/models/entity_observation_response.py
|
|
hindsight_client_api/models/entity_state_response.py
|
|
hindsight_client_api/models/features_info.py
|
|
hindsight_client_api/models/file_retain_response.py
|
|
hindsight_client_api/models/graph_data_response.py
|
|
hindsight_client_api/models/http_validation_error.py
|
|
hindsight_client_api/models/include_options.py
|
|
hindsight_client_api/models/list_documents_response.py
|
|
hindsight_client_api/models/list_memory_units_response.py
|
|
hindsight_client_api/models/list_tags_response.py
|
|
hindsight_client_api/models/memory_item.py
|
|
hindsight_client_api/models/mental_model_list_response.py
|
|
hindsight_client_api/models/mental_model_response.py
|
|
hindsight_client_api/models/mental_model_trigger.py
|
|
hindsight_client_api/models/model_not.py
|
|
hindsight_client_api/models/observation_scopes.py
|
|
hindsight_client_api/models/operation_response.py
|
|
hindsight_client_api/models/operation_status_response.py
|
|
hindsight_client_api/models/operations_list_response.py
|
|
hindsight_client_api/models/recall_request.py
|
|
hindsight_client_api/models/recall_request_tag_groups_inner.py
|
|
hindsight_client_api/models/recall_response.py
|
|
hindsight_client_api/models/recall_result.py
|
|
hindsight_client_api/models/recover_consolidation_response.py
|
|
hindsight_client_api/models/reflect_based_on.py
|
|
hindsight_client_api/models/reflect_directive.py
|
|
hindsight_client_api/models/reflect_fact.py
|
|
hindsight_client_api/models/reflect_include_options.py
|
|
hindsight_client_api/models/reflect_llm_call.py
|
|
hindsight_client_api/models/reflect_mental_model.py
|
|
hindsight_client_api/models/reflect_request.py
|
|
hindsight_client_api/models/reflect_response.py
|
|
hindsight_client_api/models/reflect_tool_call.py
|
|
hindsight_client_api/models/reflect_trace.py
|
|
hindsight_client_api/models/retain_request.py
|
|
hindsight_client_api/models/retain_response.py
|
|
hindsight_client_api/models/retry_operation_response.py
|
|
hindsight_client_api/models/source_facts_include_options.py
|
|
hindsight_client_api/models/tag_group_and.py
|
|
hindsight_client_api/models/tag_group_leaf.py
|
|
hindsight_client_api/models/tag_group_not.py
|
|
hindsight_client_api/models/tag_group_or.py
|
|
hindsight_client_api/models/tag_item.py
|
|
hindsight_client_api/models/timestamp.py
|
|
hindsight_client_api/models/token_usage.py
|
|
hindsight_client_api/models/tool_calls_include_options.py
|
|
hindsight_client_api/models/update_directive_request.py
|
|
hindsight_client_api/models/update_disposition_request.py
|
|
hindsight_client_api/models/update_document_request.py
|
|
hindsight_client_api/models/update_document_response.py
|
|
hindsight_client_api/models/update_mental_model_request.py
|
|
hindsight_client_api/models/update_webhook_request.py
|
|
hindsight_client_api/models/validation_error.py
|
|
hindsight_client_api/models/validation_error_loc_inner.py
|
|
hindsight_client_api/models/version_response.py
|
|
hindsight_client_api/models/webhook_delivery_list_response.py
|
|
hindsight_client_api/models/webhook_delivery_response.py
|
|
hindsight_client_api/models/webhook_http_config.py
|
|
hindsight_client_api/models/webhook_list_response.py
|
|
hindsight_client_api/models/webhook_response.py
|
|
hindsight_client_api/rest.py
|
|
hindsight_client_api_README.md
|