ltcai 11.5.2 → 11.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +93 -148
- package/bin/ltcai.js +234 -24
- package/docs/CHANGELOG.md +119 -0
- package/docs/COMMUNITY_AND_PLUGINS.md +1 -1
- package/docs/DEVELOPMENT.md +8 -6
- package/docs/ENTERPRISE.md +2 -1
- package/docs/MULTI_AGENT_RUNTIME.md +12 -5
- package/docs/ONBOARDING.md +1 -1
- package/docs/OPERATIONS.md +6 -3
- package/docs/REALTIME_COLLABORATION.md +1 -1
- package/docs/TRUST_MODEL.md +1 -1
- package/docs/WHY_LATTICE.md +1 -1
- package/docs/WORKFLOW_DESIGNER.md +3 -2
- package/docs/kg-schema.md +1 -1
- package/docs/v11.6.0_ONE_DOOR_PLAN.md +170 -0
- package/lattice_brain/__init__.py +42 -79
- package/lattice_brain/graph/__init__.py +9 -24
- package/lattice_brain/graph/_kg_common/__init__.py +13 -24
- package/lattice_brain/ingestion/__init__.py +19 -58
- package/lattice_brain/ingestion/pipeline.py +20 -398
- package/lattice_brain/multimodal/__init__.py +7 -18
- package/lattice_brain/multimodal/images.py +6 -264
- package/lattice_brain/multimodal/video.py +8 -247
- package/lattice_brain/runtime/__init__.py +8 -79
- package/lattice_brain/runtime/hooks.py +22 -584
- package/latticeai/__init__.py +1 -1
- package/latticeai/api/agent_worker_seam.py +7 -80
- package/latticeai/api/health.py +6 -20
- package/latticeai/api/local_files.py +16 -613
- package/latticeai/api/models.py +12 -87
- package/latticeai/api/search.py +17 -255
- package/latticeai/api/tools.py +69 -750
- package/latticeai/api/voice_capture.py +8 -70
- package/latticeai/api/worker_compute.py +842 -0
- package/latticeai/api/worker_seams.py +216 -0
- package/latticeai/app_factory.py +23 -232
- package/latticeai/cli/entrypoint.py +36 -249
- package/latticeai/core/agent_permission.py +16 -91
- package/latticeai/core/messages.py +89 -531
- package/latticeai/runtime/access_runtime.py +0 -14
- package/latticeai/runtime/bootstrap.py +10 -21
- package/latticeai/runtime/brain_runtime.py +35 -43
- package/latticeai/runtime/build_phases/__init__.py +21 -37
- package/latticeai/runtime/build_phases/features.py +99 -389
- package/latticeai/runtime/build_phases/foundation.py +82 -392
- package/latticeai/runtime/build_phases/web.py +91 -408
- package/latticeai/runtime/build_phases/worker_profile.py +244 -0
- package/latticeai/runtime/lifespan_runtime.py +7 -16
- package/latticeai/runtime/platform_services_runtime.py +1 -15
- package/latticeai/runtime/runtime_context.py +13 -130
- package/latticeai/runtime/security_runtime.py +10 -103
- package/latticeai/services/architecture_readiness.py +82 -43
- package/latticeai/services/model_runtime/__init__.py +2 -11
- package/latticeai/services/model_runtime/service.py +4 -28
- package/latticeai/services/p_reinforce.py +10 -261
- package/latticeai/services/product_readiness.py +31 -38
- package/latticeai/services/search_service.py +37 -795
- package/latticeai/services/tool_dispatch.py +30 -386
- package/latticeai/services/voice_capture.py +13 -107
- package/latticeai/tools/__init__.py +22 -49
- package/latticeai/tools/commands.py +0 -163
- package/latticeai/tools/computer.py +0 -39
- package/latticeai/tools/documents.py +1 -134
- package/latticeai/tools/filesystem.py +1 -247
- package/latticeai/tools/knowledge.py +1 -52
- package/latticeai/tools/local_files.py +0 -20
- package/latticeai/worker_app.py +75 -0
- package/package.json +2 -3
- package/requirements.txt +0 -5
- package/scripts/agent_eval.py +16 -28
- package/scripts/brain_quality_eval.py +20 -183
- package/scripts/bump_version.py +5 -5
- package/scripts/check_current_release_docs.mjs +7 -4
- package/scripts/check_openapi_drift.mjs +10 -0
- package/scripts/check_server_i18n.mjs +2 -18
- package/scripts/compose_openapi.py +377 -0
- package/scripts/export_openapi.py +32 -4
- package/scripts/gen_messages_catalog_fixture.py +302 -0
- package/scripts/gen_openapi_fragments.py +365 -0
- package/scripts/gen_redact_fixture.py +196 -0
- package/scripts/gen_worker_allowlist_fixture.py +115 -0
- package/scripts/generate_agent_parity_fixtures.py +33 -14
- package/scripts/openapi_route_families.json +2161 -0
- package/scripts/release_screen_claims.json +54 -0
- package/scripts/run_integration_tests.mjs +134 -29
- package/scripts/run_sidecar_e2e.mjs +104 -11
- package/scripts/wheel_smoke.py +32 -22
- package/src-tauri/Cargo.lock +375 -9
- package/src-tauri/Cargo.toml +1 -1
- package/src-tauri/src/backend.rs +151 -45
- package/src-tauri/src/main.rs +18 -18
- package/src-tauri/src/topology.rs +58 -88
- package/src-tauri/tauri.conf.json +1 -2
- package/static/app/asset-manifest.json +41 -41
- package/static/app/assets/{Act-DcQizkl1.js → Act-BPcVAbOL.js} +1 -1
- package/static/app/assets/AdminConsole-Bw1ATQL0.js +1 -0
- package/static/app/assets/{Brain-3VCSHFcn.js → Brain-CT92Kos0.js} +2 -2
- package/static/app/assets/{BrainHome-Qm8eaztx.js → BrainHome-CFBkt1K_.js} +1 -1
- package/static/app/assets/{BrainSignals-DS9BtKOW.js → BrainSignals-ReLWF2H8.js} +1 -1
- package/static/app/assets/Capture-BsTokYkk.js +1 -0
- package/static/app/assets/{Chronicle-BGvuAchH.js → Chronicle-B6f0T9id.js} +1 -1
- package/static/app/assets/{CommandPalette-Bqhm0Urn.js → CommandPalette-CuvjTv1u.js} +1 -1
- package/static/app/assets/{Library-BV6NnF0a.js → Library-BGJbG9Hd.js} +1 -1
- package/static/app/assets/{LivingBrain-GzenJchP.js → LivingBrain-DGYK_Jsa.js} +1 -1
- package/static/app/assets/{ProductFlow-DEP6-vML.js → ProductFlow-DXBC6brE.js} +1 -1
- package/static/app/assets/{ReviewCard-CNZ7XjWG.js → ReviewCard-HXRle3qq.js} +2 -2
- package/static/app/assets/System-CMHSO9qM.js +1 -0
- package/static/app/assets/arrow-left-BfmkskWx.js +1 -0
- package/static/app/assets/{bot-B_K1Tdmw.js → bot-Cn8bWRuq.js} +1 -1
- package/static/app/assets/{brain-DWyaV1L1.js → brain-CQJberbE.js} +1 -1
- package/static/app/assets/{button-aTn4s84A.js → button-Ct9f2_oT.js} +1 -1
- package/static/app/assets/circle-check-DruOxB-4.js +1 -0
- package/static/app/assets/{circle-pause-xKgeGXkT.js → circle-pause-CmzC_apg.js} +1 -1
- package/static/app/assets/{circle-play-DkT6tYPX.js → circle-play-D8mW2aQ7.js} +1 -1
- package/static/app/assets/{cpu-85xYObUC.js → cpu-DZcdd0PZ.js} +1 -1
- package/static/app/assets/{download-B5Fm7YXo.js → download-bv1KEPGQ.js} +1 -1
- package/static/app/assets/{folder-open-kk2Xa52u.js → folder-open-d-Pip5gr.js} +1 -1
- package/static/app/assets/{hard-drive-DkA3zBW_.js → hard-drive-D20iavUb.js} +1 -1
- package/static/app/assets/index-D9x-kSNy.css +2 -0
- package/static/app/assets/{index-BMPdTmlY.js → index-Do83hDzJ.js} +3 -3
- package/static/app/assets/{input-B0nRf2jO.js → input-BLXVNmj1.js} +1 -1
- package/static/app/assets/{link-2-Dwb4gnTc.js → link-2-BPJOFlAy.js} +1 -1
- package/static/app/assets/{permissionCopy-CQDUBrOZ.js → permissionCopy-ChdJd493.js} +1 -1
- package/static/app/assets/primitives-Cv5tbZBY.js +1 -0
- package/static/app/assets/search-CT9aho2j.js +1 -0
- package/static/app/assets/{share-2-BsrxFglO.js → share-2-YNX_NtMU.js} +1 -1
- package/static/app/assets/{shield-alert-5BStfp2_.js → shield-alert-DuQ3zrVL.js} +1 -1
- package/static/app/assets/{textarea-Cg8IUA-k.js → textarea-DqwLnli4.js} +1 -1
- package/static/app/assets/{useFocusTrap-CYKvE46M.js → useFocusTrap-ZVI98jaW.js} +1 -1
- package/static/app/assets/{useMutation-CSn9t1op.js → useMutation-CVC4qv_D.js} +1 -1
- package/static/app/assets/{useQuery-CY2OI2uy.js → useQuery-C7BeG4HU.js} +1 -1
- package/static/app/assets/{utils-Ddol2RWD.js → utils-CiFtIdZq.js} +1 -1
- package/static/app/assets/{workspace-BqDwOz_p.js → workspace-DQz9vIId.js} +1 -1
- package/static/app/index.html +4 -4
- package/static/sw.js +1 -1
- package/lattice_brain/archive.py +0 -522
- package/lattice_brain/context.py +0 -325
- package/lattice_brain/conversations.py +0 -382
- package/lattice_brain/core.py +0 -82
- package/lattice_brain/graph/_kg_contract.py +0 -249
- package/lattice_brain/graph/curator.py +0 -676
- package/lattice_brain/graph/discovery.py +0 -595
- package/lattice_brain/graph/discovery_index/__init__.py +0 -35
- package/lattice_brain/graph/discovery_index/cleanup.py +0 -182
- package/lattice_brain/graph/discovery_index/extract.py +0 -137
- package/lattice_brain/graph/discovery_index/scan.py +0 -411
- package/lattice_brain/graph/discovery_index/upsert.py +0 -495
- package/lattice_brain/graph/documents.py +0 -380
- package/lattice_brain/graph/fusion.py +0 -395
- package/lattice_brain/graph/identity.py +0 -175
- package/lattice_brain/graph/image_vectors.py +0 -230
- package/lattice_brain/graph/ingest.py +0 -829
- package/lattice_brain/graph/network.py +0 -205
- package/lattice_brain/graph/proactive.py +0 -724
- package/lattice_brain/graph/projection/__init__.py +0 -42
- package/lattice_brain/graph/projection/curation.py +0 -500
- package/lattice_brain/graph/projection/v2_schema.py +0 -518
- package/lattice_brain/graph/provenance.py +0 -524
- package/lattice_brain/graph/rerank.py +0 -163
- package/lattice_brain/graph/retrieval/__init__.py +0 -54
- package/lattice_brain/graph/retrieval/context.py +0 -197
- package/lattice_brain/graph/retrieval/graph_view.py +0 -319
- package/lattice_brain/graph/retrieval/hybrid.py +0 -488
- package/lattice_brain/graph/retrieval/maintenance.py +0 -121
- package/lattice_brain/graph/retrieval/signals.py +0 -95
- package/lattice_brain/graph/retrieval_docgen.py +0 -253
- package/lattice_brain/graph/retrieval_policy.py +0 -180
- package/lattice_brain/graph/retrieval_reads.py +0 -769
- package/lattice_brain/graph/retrieval_vector/__init__.py +0 -42
- package/lattice_brain/graph/retrieval_vector/fingerprint.py +0 -97
- package/lattice_brain/graph/retrieval_vector/indexing.py +0 -347
- package/lattice_brain/graph/retrieval_vector/search.py +0 -560
- package/lattice_brain/graph/retrieval_vector/status.py +0 -374
- package/lattice_brain/graph/schema.py +0 -792
- package/lattice_brain/graph/store.py +0 -268
- package/lattice_brain/graph/vector_index/__init__.py +0 -85
- package/lattice_brain/graph/vector_index/base.py +0 -167
- package/lattice_brain/graph/vector_index/brute_force.py +0 -110
- package/lattice_brain/graph/vector_index/hnsw.py +0 -290
- package/lattice_brain/graph/vector_index/jobs.py +0 -287
- package/lattice_brain/graph/vector_index/quantized.py +0 -148
- package/lattice_brain/graph/vector_index/selector.py +0 -161
- package/lattice_brain/graph/write_master.py +0 -308
- package/lattice_brain/ingestion/_contract.py +0 -90
- package/lattice_brain/ingestion/folder_scan.py +0 -57
- package/lattice_brain/ingestion/folders.py +0 -258
- package/lattice_brain/ingestion/jobs_api.py +0 -107
- package/lattice_brain/ingestion/routing.py +0 -295
- package/lattice_brain/ingestion_jobs.py +0 -380
- package/lattice_brain/memory.py +0 -75
- package/lattice_brain/portability/__init__.py +0 -90
- package/lattice_brain/portability/_contract.py +0 -42
- package/lattice_brain/portability/backups.py +0 -338
- package/lattice_brain/portability/bundles.py +0 -136
- package/lattice_brain/portability/constants.py +0 -93
- package/lattice_brain/portability/fsops.py +0 -138
- package/lattice_brain/portability/service.py +0 -41
- package/lattice_brain/portability/sharing.py +0 -710
- package/lattice_brain/quality.py +0 -543
- package/lattice_brain/retrieval_benchmark_fixtures.py +0 -92
- package/lattice_brain/runtime/agent_runtime.py +0 -859
- package/lattice_brain/runtime/contracts.py +0 -460
- package/lattice_brain/runtime/multi_agent.py +0 -942
- package/lattice_brain/runtime/statuses.py +0 -10
- package/lattice_brain/sealed_box.py +0 -240
- package/lattice_brain/self_model.py +0 -675
- package/lattice_brain/sensitivity.py +0 -94
- package/lattice_brain/storage/__init__.py +0 -22
- package/lattice_brain/storage/base.py +0 -100
- package/lattice_brain/storage/docker.py +0 -105
- package/lattice_brain/storage/factory.py +0 -31
- package/lattice_brain/storage/migration.py +0 -191
- package/lattice_brain/storage/postgres.py +0 -123
- package/lattice_brain/storage/sqlite.py +0 -143
- package/lattice_brain/synthesis.py +0 -824
- package/lattice_brain/workflow.py +0 -497
- package/latticeai/api/admin.py +0 -471
- package/latticeai/api/agent_registry.py +0 -105
- package/latticeai/api/agents.py +0 -228
- package/latticeai/api/auth.py +0 -383
- package/latticeai/api/automation_intelligence.py +0 -401
- package/latticeai/api/brain_intelligence.py +0 -199
- package/latticeai/api/browser.py +0 -493
- package/latticeai/api/change_proposals.py +0 -89
- package/latticeai/api/chat.py +0 -572
- package/latticeai/api/chat_agent_http.py +0 -892
- package/latticeai/api/chat_contracts.py +0 -73
- package/latticeai/api/chat_documents.py +0 -276
- package/latticeai/api/chat_helpers.py +0 -460
- package/latticeai/api/chat_history.py +0 -101
- package/latticeai/api/chat_hybrid.py +0 -113
- package/latticeai/api/chat_intents.py +0 -646
- package/latticeai/api/chat_stream.py +0 -216
- package/latticeai/api/chronicle.py +0 -63
- package/latticeai/api/command_center.py +0 -51
- package/latticeai/api/computer_use.py +0 -474
- package/latticeai/api/evidence_actions.py +0 -48
- package/latticeai/api/features.py +0 -70
- package/latticeai/api/funnel_metrics.py +0 -31
- package/latticeai/api/garden.py +0 -34
- package/latticeai/api/hooks.py +0 -165
- package/latticeai/api/index_jobs.py +0 -145
- package/latticeai/api/invitations.py +0 -100
- package/latticeai/api/knowledge_graph.py +0 -536
- package/latticeai/api/marketplace.py +0 -105
- package/latticeai/api/mcp.py +0 -482
- package/latticeai/api/memory.py +0 -270
- package/latticeai/api/network.py +0 -81
- package/latticeai/api/network_boundary.py +0 -225
- package/latticeai/api/permission_mode.py +0 -61
- package/latticeai/api/permissions.py +0 -436
- package/latticeai/api/plugins.py +0 -126
- package/latticeai/api/portability.py +0 -391
- package/latticeai/api/project_sessions.py +0 -114
- package/latticeai/api/realtime.py +0 -118
- package/latticeai/api/review_queue.py +0 -364
- package/latticeai/api/security_dashboard.py +0 -604
- package/latticeai/api/setup.py +0 -319
- package/latticeai/api/static_routes.py +0 -354
- package/latticeai/api/ui_redirects.py +0 -26
- package/latticeai/api/workflow_designer.py +0 -394
- package/latticeai/api/workspace.py +0 -856
- package/latticeai/api/workspace_scope.py +0 -125
- package/latticeai/core/agent/__init__.py +0 -93
- package/latticeai/core/agent/_contract.py +0 -79
- package/latticeai/core/agent/context.py +0 -57
- package/latticeai/core/agent/deps.py +0 -125
- package/latticeai/core/agent/execution.py +0 -622
- package/latticeai/core/agent/planning.py +0 -145
- package/latticeai/core/agent/recovery.py +0 -157
- package/latticeai/core/agent/runtime.py +0 -210
- package/latticeai/core/agent/verification.py +0 -231
- package/latticeai/core/agent_eval.py +0 -739
- package/latticeai/core/agent_helpers.py +0 -493
- package/latticeai/core/agent_profiles.py +0 -110
- package/latticeai/core/agent_prompts.py +0 -171
- package/latticeai/core/agent_registry.py +0 -232
- package/latticeai/core/agent_state.py +0 -41
- package/latticeai/core/agent_trace.py +0 -104
- package/latticeai/core/artifact_ledger.py +0 -109
- package/latticeai/core/audit.py +0 -260
- package/latticeai/core/builtin_hooks.py +0 -105
- package/latticeai/core/context_builder.py +0 -394
- package/latticeai/core/document_generator.py +0 -103
- package/latticeai/core/enterprise.py +0 -154
- package/latticeai/core/enterprise_admin.py +0 -158
- package/latticeai/core/file_generation/__init__.py +0 -115
- package/latticeai/core/file_generation/bundles.py +0 -76
- package/latticeai/core/file_generation/extraction.py +0 -154
- package/latticeai/core/file_generation/inference.py +0 -235
- package/latticeai/core/file_generation/orchestration.py +0 -152
- package/latticeai/core/file_generation/prompting.py +0 -117
- package/latticeai/core/file_generation/repair.py +0 -114
- package/latticeai/core/file_generation/sanitize.py +0 -61
- package/latticeai/core/file_generation/validation.py +0 -201
- package/latticeai/core/invitations.py +0 -132
- package/latticeai/core/legacy_compatibility.py +0 -243
- package/latticeai/core/logging_safety.py +0 -46
- package/latticeai/core/marketplace.py +0 -293
- package/latticeai/core/mcp_catalog.py +0 -452
- package/latticeai/core/mcp_registry.py +0 -506
- package/latticeai/core/network_boundary.py +0 -168
- package/latticeai/core/oidc.py +0 -208
- package/latticeai/core/plugins.py +0 -432
- package/latticeai/core/product_hardening.py +0 -218
- package/latticeai/core/project_sessions.py +0 -337
- package/latticeai/core/realtime.py +0 -238
- package/latticeai/core/run_explain.py +0 -426
- package/latticeai/core/run_store.py +0 -252
- package/latticeai/core/timezones.py +0 -80
- package/latticeai/core/workspace_computer_memory.py +0 -84
- package/latticeai/core/workspace_graph_trace.py +0 -155
- package/latticeai/core/workspace_indexing.py +0 -102
- package/latticeai/core/workspace_memory.py +0 -77
- package/latticeai/core/workspace_onboarding.py +0 -104
- package/latticeai/core/workspace_os.py +0 -978
- package/latticeai/core/workspace_os_constants.py +0 -126
- package/latticeai/core/workspace_os_state.py +0 -180
- package/latticeai/core/workspace_os_utils.py +0 -103
- package/latticeai/core/workspace_permissions.py +0 -101
- package/latticeai/core/workspace_plugins.py +0 -97
- package/latticeai/core/workspace_relationships.py +0 -99
- package/latticeai/core/workspace_reorganization.py +0 -335
- package/latticeai/core/workspace_review_items.py +0 -112
- package/latticeai/core/workspace_runs.py +0 -726
- package/latticeai/core/workspace_skills.py +0 -109
- package/latticeai/core/workspace_snapshots.py +0 -198
- package/latticeai/core/workspace_timeline.py +0 -110
- package/latticeai/integrations/__init__.py +0 -0
- package/latticeai/integrations/telegram_bot/__init__.py +0 -123
- package/latticeai/integrations/telegram_bot/__main__.py +0 -17
- package/latticeai/integrations/telegram_bot/config.py +0 -86
- package/latticeai/integrations/telegram_bot/dispatch.py +0 -311
- package/latticeai/integrations/telegram_bot/flows.py +0 -478
- package/latticeai/integrations/telegram_bot/helpers.py +0 -322
- package/latticeai/integrations/telegram_bot/screens.py +0 -394
- package/latticeai/runtime/audit_runtime.py +0 -76
- package/latticeai/runtime/automation_runtime.py +0 -81
- package/latticeai/runtime/chat_wiring.py +0 -141
- package/latticeai/runtime/context_runtime.py +0 -66
- package/latticeai/runtime/feature_toggle_wiring.py +0 -157
- package/latticeai/runtime/history_runtime.py +0 -163
- package/latticeai/runtime/history_writer.py +0 -138
- package/latticeai/runtime/hooks_runtime.py +0 -77
- package/latticeai/runtime/model_wiring.py +0 -68
- package/latticeai/runtime/namespace_runtime.py +0 -163
- package/latticeai/runtime/network_boundary_wiring.py +0 -117
- package/latticeai/runtime/network_config_runtime.py +0 -56
- package/latticeai/runtime/permission_mode_wiring.py +0 -112
- package/latticeai/runtime/persistence_runtime.py +0 -159
- package/latticeai/runtime/platform_runtime_wiring.py +0 -89
- package/latticeai/runtime/review_wiring.py +0 -42
- package/latticeai/runtime/router_registration.py +0 -693
- package/latticeai/runtime/service_singletons.py +0 -55
- package/latticeai/runtime/sso_config_runtime.py +0 -128
- package/latticeai/runtime/user_key_runtime.py +0 -106
- package/latticeai/runtime/web_runtime.py +0 -92
- package/latticeai/server_app.py +0 -51
- package/latticeai/services/app_context.py +0 -130
- package/latticeai/services/automation_execution.py +0 -266
- package/latticeai/services/automation_intelligence.py +0 -614
- package/latticeai/services/brain_automation.py +0 -191
- package/latticeai/services/brain_intelligence/__init__.py +0 -58
- package/latticeai/services/brain_intelligence/_contract.py +0 -71
- package/latticeai/services/brain_intelligence/consistency.py +0 -193
- package/latticeai/services/brain_intelligence/constants.py +0 -47
- package/latticeai/services/brain_intelligence/digest.py +0 -258
- package/latticeai/services/brain_intelligence/health.py +0 -331
- package/latticeai/services/brain_intelligence/proposals.py +0 -259
- package/latticeai/services/brain_intelligence/sampling.py +0 -84
- package/latticeai/services/brain_intelligence/service.py +0 -48
- package/latticeai/services/change_proposals.py +0 -471
- package/latticeai/services/chat_service.py +0 -243
- package/latticeai/services/chronicle.py +0 -555
- package/latticeai/services/cloud_egress_audit.py +0 -85
- package/latticeai/services/cloud_extraction.py +0 -129
- package/latticeai/services/cloud_streaming.py +0 -268
- package/latticeai/services/cloud_token_guard.py +0 -84
- package/latticeai/services/command_center.py +0 -548
- package/latticeai/services/evidence_actions.py +0 -258
- package/latticeai/services/feature_toggles.py +0 -502
- package/latticeai/services/folder_watch.py +0 -520
- package/latticeai/services/funnel_metrics.py +0 -307
- package/latticeai/services/hybrid_chat.py +0 -316
- package/latticeai/services/hybrid_context.py +0 -228
- package/latticeai/services/hybrid_policy.py +0 -129
- package/latticeai/services/interop_bridges.py +0 -978
- package/latticeai/services/local_knowledge.py +0 -465
- package/latticeai/services/memory_service/__init__.py +0 -52
- package/latticeai/services/memory_service/_contract.py +0 -100
- package/latticeai/services/memory_service/brief.py +0 -431
- package/latticeai/services/memory_service/constants.py +0 -57
- package/latticeai/services/memory_service/maintenance.py +0 -138
- package/latticeai/services/memory_service/manager.py +0 -186
- package/latticeai/services/memory_service/proof.py +0 -136
- package/latticeai/services/memory_service/recall.py +0 -225
- package/latticeai/services/memory_service/service.py +0 -48
- package/latticeai/services/memory_service/stores.py +0 -110
- package/latticeai/services/mode_store.py +0 -132
- package/latticeai/services/model_recommendation.py +0 -224
- package/latticeai/services/model_runtime/cloud.py +0 -87
- package/latticeai/services/network_boundary_service.py +0 -117
- package/latticeai/services/obsidian_bridge.py +0 -609
- package/latticeai/services/openai_compatible_adapter.py +0 -101
- package/latticeai/services/permission_mode_service.py +0 -122
- package/latticeai/services/platform_runtime.py +0 -366
- package/latticeai/services/review_queue.py +0 -380
- package/latticeai/services/router_context.py +0 -59
- package/latticeai/services/run_executor.py +0 -387
- package/latticeai/services/self_model_service.py +0 -171
- package/latticeai/services/setup_detection.py +0 -147
- package/latticeai/services/triggers.py +0 -378
- package/latticeai/services/upload_service.py +0 -172
- package/latticeai/services/workspace_service.py +0 -165
- package/latticeai/setup/__init__.py +0 -25
- package/latticeai/setup/auto_setup.py +0 -846
- package/latticeai/setup/demo_corpus.py +0 -98
- package/latticeai/setup/wizard/__init__.py +0 -126
- package/latticeai/setup/wizard/catalog.py +0 -175
- package/latticeai/setup/wizard/detect.py +0 -302
- package/latticeai/setup/wizard/install.py +0 -348
- package/latticeai/setup/wizard/paths.py +0 -165
- package/latticeai/setup/wizard/plans.py +0 -74
- package/latticeai/setup/wizard/recommend.py +0 -320
- package/scripts/bench_agent_smoke.py +0 -409
- package/scripts/bench_models.py +0 -540
- package/scripts/bench_vector_index.py +0 -295
- package/scripts/funnel_soft_gate.py +0 -192
- package/scripts/generate_agent_loop_fixtures.py +0 -994
- package/scripts/generate_rust_parity_fixtures.py +0 -908
- package/scripts/migrate_brain_storage.py +0 -57
- package/scripts/parity_fixture_corpus_context.py +0 -162
- package/scripts/parity_fixture_corpus_docgen.py +0 -341
- package/scripts/profile_kg.py +0 -355
- package/server.py +0 -30
- package/static/app/assets/AdminConsole-cf4npybT.js +0 -1
- package/static/app/assets/Capture-DiQ219jW.js +0 -1
- package/static/app/assets/System-CieofHQa.js +0 -1
- package/static/app/assets/arrow-left-kfsrk0mv.js +0 -1
- package/static/app/assets/circle-check-qqLug9nU.js +0 -1
- package/static/app/assets/index-DxmOfNRi.css +0 -2
- package/static/app/assets/primitives-SNp0LRJz.js +0 -1
- package/static/app/assets/search-BcHqkjoy.js +0 -1
package/latticeai/api/models.py
CHANGED
|
@@ -1,8 +1,16 @@
|
|
|
1
|
-
"""Model / engine API router.
|
|
1
|
+
"""Model / engine API router — the MLX lifecycle this process owns.
|
|
2
2
|
|
|
3
|
-
Extracted from ``server_app.py`` in v1.3.0
|
|
4
|
-
``/
|
|
5
|
-
|
|
3
|
+
Extracted from ``server_app.py`` in v1.3.0 with the whole ``/models*`` +
|
|
4
|
+
``/engines*`` + ``/setup/set-api-key`` surface. v11.6.0 kept the eight routes
|
|
5
|
+
that are *this interpreter's* business — loading, switching and unloading MLX
|
|
6
|
+
models, and the resolve → download-if-consented → load → smoke prepare flow —
|
|
7
|
+
and moved the rest to ``lattice-host``: engine installation and cloud-key
|
|
8
|
+
verification are host operations, ``/setup/set-api-key`` is account state, and
|
|
9
|
+
the two catalogue reads (``/models/compat-profiles``, ``/models/recommendations``)
|
|
10
|
+
are product views.
|
|
11
|
+
|
|
12
|
+
The download itself stays because it is ``huggingface_hub`` / ``ollama``
|
|
13
|
+
running here (v11.6.0 gateway integration §4a).
|
|
6
14
|
|
|
7
15
|
Mirrors the established router-factory convention: the heavy provider/runtime
|
|
8
16
|
helpers are injected as bound service callables. This module owns the sole
|
|
@@ -66,15 +74,6 @@ class LoadModelRequest(BaseModel):
|
|
|
66
74
|
allow_download: bool = False
|
|
67
75
|
|
|
68
76
|
|
|
69
|
-
class InstallEngineRequest(BaseModel):
|
|
70
|
-
engine: str
|
|
71
|
-
confirmation_token: Optional[str] = None
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
class SetApiKeyRequest(BaseModel):
|
|
75
|
-
provider: str
|
|
76
|
-
key: str
|
|
77
|
-
user_email: Optional[str] = None
|
|
78
77
|
|
|
79
78
|
|
|
80
79
|
class PullModelRequest(BaseModel):
|
|
@@ -89,21 +88,12 @@ class PrepareModelRequest(BaseModel):
|
|
|
89
88
|
allow_download: bool = False
|
|
90
89
|
|
|
91
90
|
|
|
92
|
-
class VerifyCloudRequest(BaseModel):
|
|
93
|
-
force: bool = False
|
|
94
|
-
provider: Optional[str] = None
|
|
95
|
-
|
|
96
91
|
|
|
97
92
|
def create_models_router(
|
|
98
93
|
*,
|
|
99
94
|
model_router: Any,
|
|
100
95
|
require_user: Callable[[Request], str],
|
|
101
96
|
require_admin: Callable[[Request], tuple],
|
|
102
|
-
get_current_user: Callable[[Request], Optional[str]],
|
|
103
|
-
load_users: Callable[[], Dict],
|
|
104
|
-
get_user_role: Callable[..., str],
|
|
105
|
-
install_engine: Callable[..., Dict],
|
|
106
|
-
verify_cloud_models: Callable[..., Any],
|
|
107
97
|
normalize_local_model_request: Callable[..., str],
|
|
108
98
|
download_hf_model: Callable[..., Dict],
|
|
109
99
|
prepare_and_load_model: Callable[..., Any],
|
|
@@ -114,10 +104,8 @@ def create_models_router(
|
|
|
114
104
|
engine_status: Callable[[], List[Dict]],
|
|
115
105
|
filter_lower_family_versions: Callable[[List[Dict]], List[Dict]],
|
|
116
106
|
list_compat_profiles: Callable[[], Any],
|
|
117
|
-
set_user_api_key: Callable[..., None],
|
|
118
107
|
engine_model_catalog: Dict,
|
|
119
108
|
model_engine_aliases: Dict,
|
|
120
|
-
cloud_verify_ttl_seconds: int,
|
|
121
109
|
is_public_mode: bool,
|
|
122
110
|
allow_local_models: bool,
|
|
123
111
|
require_auth: bool,
|
|
@@ -127,7 +115,6 @@ def create_models_router(
|
|
|
127
115
|
_router = model_router
|
|
128
116
|
ENGINE_MODEL_CATALOG = engine_model_catalog
|
|
129
117
|
MODEL_ENGINE_ALIASES = model_engine_aliases
|
|
130
|
-
CLOUD_VERIFY_TTL_SECONDS = cloud_verify_ttl_seconds
|
|
131
118
|
IS_PUBLIC_MODE = is_public_mode
|
|
132
119
|
ALLOW_LOCAL_MODELS = allow_local_models
|
|
133
120
|
REQUIRE_AUTH = require_auth
|
|
@@ -302,29 +289,6 @@ def create_models_router(
|
|
|
302
289
|
|
|
303
290
|
# ── Engines ───────────────────────────────────────────────────────────
|
|
304
291
|
|
|
305
|
-
@router.post("/engines/install")
|
|
306
|
-
async def engines_install(req: InstallEngineRequest, request: Request):
|
|
307
|
-
_authorize_model_admin(request)
|
|
308
|
-
try:
|
|
309
|
-
# `install_engine` shells out with a 900s timeout. On the event loop
|
|
310
|
-
# that is a fifteen-minute freeze of the entire server — no chat, no
|
|
311
|
-
# status, no UI — for one admin installing an engine.
|
|
312
|
-
if req.confirmation_token:
|
|
313
|
-
return await asyncio.to_thread(
|
|
314
|
-
install_engine, req.engine, confirmation_token=req.confirmation_token
|
|
315
|
-
)
|
|
316
|
-
return await asyncio.to_thread(install_engine, req.engine)
|
|
317
|
-
except ModelRuntimeError as exc:
|
|
318
|
-
_raise_model_http(exc)
|
|
319
|
-
|
|
320
|
-
@router.post("/engines/verify-cloud")
|
|
321
|
-
async def engines_verify_cloud(req: VerifyCloudRequest, request: Request):
|
|
322
|
-
_authorize_model_admin(request)
|
|
323
|
-
try:
|
|
324
|
-
results = await verify_cloud_models(force=req.force, provider_filter=req.provider)
|
|
325
|
-
except ModelRuntimeError as exc:
|
|
326
|
-
_raise_model_http(exc)
|
|
327
|
-
return {"verified": results, "ttl_seconds": CLOUD_VERIFY_TTL_SECONDS}
|
|
328
292
|
|
|
329
293
|
@router.post("/engines/pull-model")
|
|
330
294
|
async def pull_ollama_model(req: PullModelRequest, request: Request):
|
|
@@ -452,22 +416,6 @@ def create_models_router(
|
|
|
452
416
|
headers={"Cache-Control": "no-cache", "X-Accel-Buffering": "no"},
|
|
453
417
|
)
|
|
454
418
|
|
|
455
|
-
@router.post("/setup/set-api-key")
|
|
456
|
-
async def set_api_key(req: SetApiKeyRequest, request: Request):
|
|
457
|
-
from latticeai.models.router import OPENAI_COMPATIBLE_PROVIDERS
|
|
458
|
-
config = OPENAI_COMPATIBLE_PROVIDERS.get(req.provider)
|
|
459
|
-
if not config:
|
|
460
|
-
raise http_error(400, "models.unknown_provider", resolve_language(request))
|
|
461
|
-
if not req.key.strip():
|
|
462
|
-
raise http_error(400, "models.api_key_empty", resolve_language(request))
|
|
463
|
-
current_user = require_user(request)
|
|
464
|
-
if REQUIRE_AUTH and req.user_email and _normalized_identity(req.user_email) != _normalized_identity(current_user):
|
|
465
|
-
raise http_error(403, "models.other_user_api_key", resolve_language(request))
|
|
466
|
-
target_email = str(_effective_email(current_user, req.user_email) or "").strip()
|
|
467
|
-
if not target_email:
|
|
468
|
-
raise http_error(400, "models.sign_in_required", resolve_language(request))
|
|
469
|
-
set_user_api_key(target_email, req.provider, req.key.strip())
|
|
470
|
-
return {"ok": True, "provider": req.provider, "user_email": target_email, "scope": "user"}
|
|
471
419
|
|
|
472
420
|
# ── Models ────────────────────────────────────────────────────────────
|
|
473
421
|
|
|
@@ -503,10 +451,6 @@ def create_models_router(
|
|
|
503
451
|
},
|
|
504
452
|
}
|
|
505
453
|
|
|
506
|
-
@router.get("/models/compat-profiles")
|
|
507
|
-
async def list_model_compat_profiles(request: Request):
|
|
508
|
-
require_user(request)
|
|
509
|
-
return {"profiles": _list_compat_profiles()}
|
|
510
454
|
|
|
511
455
|
@router.post("/models/load")
|
|
512
456
|
async def load_model(req: LoadModelRequest, request: Request):
|
|
@@ -562,24 +506,5 @@ def create_models_router(
|
|
|
562
506
|
_router.unload_all()
|
|
563
507
|
return {"status": "ok", "unloaded": unloaded}
|
|
564
508
|
|
|
565
|
-
@router.get("/models/recommendations")
|
|
566
|
-
async def model_recommendations(request: Request, engine: str = "local_mlx"):
|
|
567
|
-
"""Hardware-aware tri-state model recommendation for this machine.
|
|
568
|
-
|
|
569
|
-
5.2.0: now includes rich capability fields (hf_repo_id, verification,
|
|
570
|
-
hardware, load_strategy, license, safety_notes) from the structured registry.
|
|
571
|
-
"""
|
|
572
|
-
require_user(request)
|
|
573
|
-
from latticeai.services.model_recommendation import recommend_catalog
|
|
574
|
-
from latticeai.setup.auto_setup import probe as auto_setup_probe
|
|
575
|
-
|
|
576
|
-
profile = await asyncio.to_thread(lambda: auto_setup_probe().to_json())
|
|
577
|
-
catalog = recommend_catalog(profile, engine=engine)
|
|
578
|
-
try:
|
|
579
|
-
from latticeai.services.model_catalog import get_verified_models
|
|
580
|
-
reg_meta = {"version": "5.2.0", "verified_total": len(get_verified_models())}
|
|
581
|
-
except Exception:
|
|
582
|
-
reg_meta = {"version": "5.2.0"}
|
|
583
|
-
return {"profile": profile, "recommendations": catalog, "registry": reg_meta}
|
|
584
509
|
|
|
585
510
|
return router
|
package/latticeai/api/search.py
CHANGED
|
@@ -1,89 +1,25 @@
|
|
|
1
|
-
"""
|
|
1
|
+
"""The embedder report — what this worker will turn text into.
|
|
2
|
+
|
|
3
|
+
v3 shipped this module as the knowledge-graph / vector / hybrid search API: 15
|
|
4
|
+
routes over the store, the ANN index and the fusion ranker. v11.6.0 moved
|
|
5
|
+
retrieval into ``lattice-retrieval`` and the index write door into
|
|
6
|
+
``lattice-jobs``, and what stays in Python is the half that is a fact about
|
|
7
|
+
*this process*: which embedding provider resolved, at what width, and whether
|
|
8
|
+
it is the one that was asked for.
|
|
9
|
+
|
|
10
|
+
``GET /api/embeddings/status`` therefore reports the **embedder**, not the
|
|
11
|
+
index. Index completeness is a native jobs route now, and reporting it from
|
|
12
|
+
here would have meant re-opening a store the worker no longer holds.
|
|
13
|
+
"""
|
|
2
14
|
|
|
3
15
|
from __future__ import annotations
|
|
4
16
|
|
|
5
17
|
from typing import Any, Callable, Dict, NoReturn, Optional
|
|
6
18
|
|
|
7
19
|
from fastapi import APIRouter, HTTPException, Request
|
|
8
|
-
from pydantic import BaseModel, Field
|
|
9
20
|
|
|
10
21
|
from latticeai.core.embedding_providers import embedding_provider_profiles
|
|
11
|
-
from latticeai.services.search_service import
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
class SearchRequest(BaseModel):
|
|
15
|
-
query: str = Field(..., min_length=1)
|
|
16
|
-
limit: int = 30
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
class VectorSearchRequest(SearchRequest):
|
|
20
|
-
min_score: float = 0.0
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
class HybridSearchRequest(SearchRequest):
|
|
24
|
-
keyword_limit: int = 30
|
|
25
|
-
vector_limit: int = 30
|
|
26
|
-
graph_limit: int = 30
|
|
27
|
-
weights: Optional[Dict[str, float]] = None
|
|
28
|
-
#: Opt in to scoring this text query against the *image* index too
|
|
29
|
-
#: (v11.2.0). Only possible when a shared-space vision model is
|
|
30
|
-
#: configured; when it is not, the response says so instead of quietly
|
|
31
|
-
#: returning the text-only ranking as if fusion had happened.
|
|
32
|
-
image_fusion: bool = False
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
class GraphSearchRequest(SearchRequest):
|
|
36
|
-
#: How far to walk out from the directly-matching nodes. The service
|
|
37
|
-
#: clamps this to 0–3; 0 means "matches only, no expansion".
|
|
38
|
-
expand_depth: int = 1
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
class GraphNodeRequest(BaseModel):
|
|
42
|
-
node_id: str = Field(..., min_length=1)
|
|
43
|
-
include_neighbors: bool = True
|
|
44
|
-
depth: int = 1
|
|
45
|
-
limit: int = 100
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
class RelationshipSearchRequest(BaseModel):
|
|
49
|
-
query: str = ""
|
|
50
|
-
node_id: str = ""
|
|
51
|
-
relationship_type: str = ""
|
|
52
|
-
limit: int = 30
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
class IndexRebuildRequest(BaseModel):
|
|
56
|
-
full: bool = False
|
|
57
|
-
include_nodes: bool = True
|
|
58
|
-
include_chunks: bool = True
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
class _ScopedSearchService:
|
|
62
|
-
"""Injects the caller's workspace scope into every search call —
|
|
63
|
-
enforcement lives at this one chokepoint, not in each handler."""
|
|
64
|
-
|
|
65
|
-
_SCOPED = {
|
|
66
|
-
"keyword_search",
|
|
67
|
-
"vector_search",
|
|
68
|
-
"graph_search",
|
|
69
|
-
"hybrid_search",
|
|
70
|
-
"graph",
|
|
71
|
-
"node",
|
|
72
|
-
"relationships",
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
def __init__(self, service: SearchService, allowed):
|
|
76
|
-
self._service = service
|
|
77
|
-
self._allowed = allowed
|
|
78
|
-
|
|
79
|
-
def __getattr__(self, name):
|
|
80
|
-
attr = getattr(self._service, name)
|
|
81
|
-
if name in self._SCOPED:
|
|
82
|
-
def scoped(*args, **kwargs):
|
|
83
|
-
kwargs.setdefault("allowed_workspaces", self._allowed)
|
|
84
|
-
return attr(*args, **kwargs)
|
|
85
|
-
return scoped
|
|
86
|
-
return attr
|
|
22
|
+
from latticeai.services.search_service import SearchService
|
|
87
23
|
|
|
88
24
|
|
|
89
25
|
def create_search_router(
|
|
@@ -91,188 +27,14 @@ def create_search_router(
|
|
|
91
27
|
service: SearchService,
|
|
92
28
|
require_user: Callable[[Request], str],
|
|
93
29
|
embedding_info: Optional[Callable[[], Dict[str, Any]]] = None,
|
|
94
|
-
allowed_workspaces_for: Optional[Callable[[Optional[str]], Any]] = None,
|
|
95
30
|
) -> APIRouter:
|
|
96
31
|
router = APIRouter()
|
|
97
32
|
|
|
98
|
-
def
|
|
99
|
-
|
|
100
|
-
allowed = None
|
|
101
|
-
if allowed_workspaces_for is not None and user:
|
|
102
|
-
allowed = allowed_workspaces_for(user)
|
|
103
|
-
return _ScopedSearchService(service, allowed)
|
|
104
|
-
|
|
105
|
-
def _raise_graph_error(exc: Exception) -> NoReturn:
|
|
106
|
-
# NoReturn, not None: every handler ends with this in its except
|
|
33
|
+
def _raise_embedder_error(exc: Exception) -> NoReturn:
|
|
34
|
+
# NoReturn, not None: both handlers end with this in their except
|
|
107
35
|
# branch, and without it each one reads as a missing return.
|
|
108
36
|
raise HTTPException(status_code=404, detail=str(exc)) from exc
|
|
109
37
|
|
|
110
|
-
@router.post("/api/search/hybrid")
|
|
111
|
-
async def hybrid_search(req: HybridSearchRequest, request: Request) -> Dict[str, Any]:
|
|
112
|
-
try:
|
|
113
|
-
return _guarded(request).hybrid_search(
|
|
114
|
-
req.query,
|
|
115
|
-
limit=req.limit,
|
|
116
|
-
keyword_limit=req.keyword_limit,
|
|
117
|
-
vector_limit=req.vector_limit,
|
|
118
|
-
graph_limit=req.graph_limit,
|
|
119
|
-
weights=req.weights or DEFAULT_HYBRID_WEIGHTS,
|
|
120
|
-
image_fusion=req.image_fusion,
|
|
121
|
-
)
|
|
122
|
-
except ValueError as exc:
|
|
123
|
-
_raise_graph_error(exc)
|
|
124
|
-
|
|
125
|
-
@router.get("/api/search/hybrid")
|
|
126
|
-
async def hybrid_search_get(
|
|
127
|
-
q: str, request: Request, limit: int = 30, image_fusion: bool = False,
|
|
128
|
-
) -> Dict[str, Any]:
|
|
129
|
-
try:
|
|
130
|
-
return _guarded(request).hybrid_search(q, limit=limit, image_fusion=image_fusion)
|
|
131
|
-
except ValueError as exc:
|
|
132
|
-
_raise_graph_error(exc)
|
|
133
|
-
|
|
134
|
-
@router.get("/api/search/image-query")
|
|
135
|
-
async def image_query_status(request: Request) -> Dict[str, Any]:
|
|
136
|
-
"""Whether a typed question can reach the image index on this install."""
|
|
137
|
-
require_user(request)
|
|
138
|
-
return service.image_query_status()
|
|
139
|
-
|
|
140
|
-
@router.post("/api/search/keyword")
|
|
141
|
-
async def keyword_search(req: SearchRequest, request: Request) -> Dict[str, Any]:
|
|
142
|
-
try:
|
|
143
|
-
return _guarded(request).keyword_search(req.query, limit=req.limit)
|
|
144
|
-
except ValueError as exc:
|
|
145
|
-
_raise_graph_error(exc)
|
|
146
|
-
|
|
147
|
-
@router.get("/api/search/keyword")
|
|
148
|
-
async def keyword_search_get(q: str, request: Request, limit: int = 30) -> Dict[str, Any]:
|
|
149
|
-
try:
|
|
150
|
-
return _guarded(request).keyword_search(q, limit=limit)
|
|
151
|
-
except ValueError as exc:
|
|
152
|
-
_raise_graph_error(exc)
|
|
153
|
-
|
|
154
|
-
@router.post("/api/search/vector")
|
|
155
|
-
async def vector_search(req: VectorSearchRequest, request: Request) -> Dict[str, Any]:
|
|
156
|
-
try:
|
|
157
|
-
return _guarded(request).vector_search(req.query, limit=req.limit, min_score=req.min_score)
|
|
158
|
-
except ValueError as exc:
|
|
159
|
-
_raise_graph_error(exc)
|
|
160
|
-
|
|
161
|
-
@router.get("/api/search/vector")
|
|
162
|
-
async def vector_search_get(
|
|
163
|
-
q: str,
|
|
164
|
-
request: Request,
|
|
165
|
-
limit: int = 30,
|
|
166
|
-
min_score: float = 0.0,
|
|
167
|
-
) -> Dict[str, Any]:
|
|
168
|
-
try:
|
|
169
|
-
return _guarded(request).vector_search(q, limit=limit, min_score=min_score)
|
|
170
|
-
except ValueError as exc:
|
|
171
|
-
_raise_graph_error(exc)
|
|
172
|
-
|
|
173
|
-
@router.post("/api/search/graph")
|
|
174
|
-
async def graph_search(req: GraphSearchRequest, request: Request) -> Dict[str, Any]:
|
|
175
|
-
"""Relationship-aware search: direct matches plus what they connect to.
|
|
176
|
-
|
|
177
|
-
The third retrieval channel. It was in ``_ScopedSearchService._SCOPED``
|
|
178
|
-
from the start — so the workspace guard was ready for it — but no
|
|
179
|
-
handler ever called it, which made the allow-list entry the only
|
|
180
|
-
evidence the channel was supposed to be reachable at all.
|
|
181
|
-
"""
|
|
182
|
-
try:
|
|
183
|
-
return _guarded(request).graph_search(
|
|
184
|
-
req.query,
|
|
185
|
-
limit=req.limit,
|
|
186
|
-
expand_depth=req.expand_depth,
|
|
187
|
-
)
|
|
188
|
-
except ValueError as exc:
|
|
189
|
-
_raise_graph_error(exc)
|
|
190
|
-
|
|
191
|
-
@router.get("/api/graph")
|
|
192
|
-
async def graph(request: Request, limit: int = 300) -> Dict[str, Any]:
|
|
193
|
-
try:
|
|
194
|
-
return _guarded(request).graph(limit=limit)
|
|
195
|
-
except ValueError as exc:
|
|
196
|
-
_raise_graph_error(exc)
|
|
197
|
-
|
|
198
|
-
@router.get("/api/graph/node")
|
|
199
|
-
async def graph_node(
|
|
200
|
-
node_id: str,
|
|
201
|
-
request: Request,
|
|
202
|
-
include_neighbors: bool = True,
|
|
203
|
-
depth: int = 1,
|
|
204
|
-
limit: int = 100,
|
|
205
|
-
) -> Dict[str, Any]:
|
|
206
|
-
try:
|
|
207
|
-
return _guarded(request).node(
|
|
208
|
-
node_id,
|
|
209
|
-
include_neighbors=include_neighbors,
|
|
210
|
-
depth=depth,
|
|
211
|
-
limit=limit,
|
|
212
|
-
)
|
|
213
|
-
except ValueError as exc:
|
|
214
|
-
raise HTTPException(status_code=404, detail=str(exc)) from exc
|
|
215
|
-
|
|
216
|
-
@router.post("/api/graph/node")
|
|
217
|
-
async def graph_node_post(req: GraphNodeRequest, request: Request) -> Dict[str, Any]:
|
|
218
|
-
try:
|
|
219
|
-
return _guarded(request).node(
|
|
220
|
-
req.node_id,
|
|
221
|
-
include_neighbors=req.include_neighbors,
|
|
222
|
-
depth=req.depth,
|
|
223
|
-
limit=req.limit,
|
|
224
|
-
)
|
|
225
|
-
except ValueError as exc:
|
|
226
|
-
raise HTTPException(status_code=404, detail=str(exc)) from exc
|
|
227
|
-
|
|
228
|
-
@router.get("/api/graph/relationship")
|
|
229
|
-
async def graph_relationship(
|
|
230
|
-
request: Request,
|
|
231
|
-
q: str = "",
|
|
232
|
-
node_id: str = "",
|
|
233
|
-
relationship_type: str = "",
|
|
234
|
-
limit: int = 30,
|
|
235
|
-
) -> Dict[str, Any]:
|
|
236
|
-
try:
|
|
237
|
-
return _guarded(request).relationships(
|
|
238
|
-
query=q,
|
|
239
|
-
node_id=node_id,
|
|
240
|
-
relationship_type=relationship_type,
|
|
241
|
-
limit=limit,
|
|
242
|
-
)
|
|
243
|
-
except ValueError as exc:
|
|
244
|
-
_raise_graph_error(exc)
|
|
245
|
-
|
|
246
|
-
@router.post("/api/graph/relationship")
|
|
247
|
-
async def graph_relationship_post(req: RelationshipSearchRequest, request: Request) -> Dict[str, Any]:
|
|
248
|
-
try:
|
|
249
|
-
return _guarded(request).relationships(
|
|
250
|
-
query=req.query,
|
|
251
|
-
node_id=req.node_id,
|
|
252
|
-
relationship_type=req.relationship_type,
|
|
253
|
-
limit=req.limit,
|
|
254
|
-
)
|
|
255
|
-
except ValueError as exc:
|
|
256
|
-
_raise_graph_error(exc)
|
|
257
|
-
|
|
258
|
-
@router.get("/api/index/status")
|
|
259
|
-
async def index_status(request: Request) -> Dict[str, Any]:
|
|
260
|
-
try:
|
|
261
|
-
return _guarded(request).index_status()
|
|
262
|
-
except ValueError as exc:
|
|
263
|
-
_raise_graph_error(exc)
|
|
264
|
-
|
|
265
|
-
@router.post("/api/index/rebuild")
|
|
266
|
-
async def index_rebuild(req: IndexRebuildRequest, request: Request) -> Dict[str, Any]:
|
|
267
|
-
try:
|
|
268
|
-
return _guarded(request).rebuild_index(
|
|
269
|
-
full=req.full,
|
|
270
|
-
include_nodes=req.include_nodes,
|
|
271
|
-
include_chunks=req.include_chunks,
|
|
272
|
-
)
|
|
273
|
-
except ValueError as exc:
|
|
274
|
-
_raise_graph_error(exc)
|
|
275
|
-
|
|
276
38
|
@router.get("/api/embeddings/status")
|
|
277
39
|
async def embeddings_status(request: Request, refresh: bool = False) -> Dict[str, Any]:
|
|
278
40
|
require_user(request)
|
|
@@ -280,7 +42,7 @@ def create_search_router(
|
|
|
280
42
|
try:
|
|
281
43
|
return service.embeddings_status(resolved=resolved, refresh=refresh)
|
|
282
44
|
except ValueError as exc:
|
|
283
|
-
|
|
45
|
+
_raise_embedder_error(exc)
|
|
284
46
|
|
|
285
47
|
@router.get("/api/embeddings/providers")
|
|
286
48
|
async def embeddings_providers(request: Request) -> Dict[str, Any]:
|