ltcai 11.5.2 → 11.6.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 +91 -148
- package/bin/ltcai.js +234 -24
- package/docs/CHANGELOG.md +75 -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 +21 -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-CToZnOHz.js} +1 -1
- package/static/app/assets/{AdminConsole-cf4npybT.js → AdminConsole-D5kbrBu8.js} +1 -1
- package/static/app/assets/{Brain-3VCSHFcn.js → Brain-C6zCdv4S.js} +1 -1
- package/static/app/assets/{BrainHome-Qm8eaztx.js → BrainHome-D4n3EDUt.js} +1 -1
- package/static/app/assets/{BrainSignals-DS9BtKOW.js → BrainSignals-CzeZ-vQ9.js} +1 -1
- package/static/app/assets/{Capture-DiQ219jW.js → Capture-DPcyTczq.js} +1 -1
- package/static/app/assets/{Chronicle-BGvuAchH.js → Chronicle-D3Nx-oWS.js} +1 -1
- package/static/app/assets/{CommandPalette-Bqhm0Urn.js → CommandPalette-DPPvpp28.js} +1 -1
- package/static/app/assets/{Library-BV6NnF0a.js → Library-Co2qTu3I.js} +1 -1
- package/static/app/assets/{LivingBrain-GzenJchP.js → LivingBrain-Bsmzwy8_.js} +1 -1
- package/static/app/assets/{ProductFlow-DEP6-vML.js → ProductFlow-CBLdmesT.js} +1 -1
- package/static/app/assets/{ReviewCard-CNZ7XjWG.js → ReviewCard-CfR6DLs7.js} +1 -1
- package/static/app/assets/{System-CieofHQa.js → System-Ce-P2YL6.js} +1 -1
- package/static/app/assets/arrow-left-DD5jFGHV.js +1 -0
- package/static/app/assets/{bot-B_K1Tdmw.js → bot-C5-XIww2.js} +1 -1
- package/static/app/assets/{brain-DWyaV1L1.js → brain-CFRJUvdX.js} +1 -1
- package/static/app/assets/{button-aTn4s84A.js → button-DI1KcQP-.js} +1 -1
- package/static/app/assets/circle-check-CY20XMCh.js +1 -0
- package/static/app/assets/{circle-pause-xKgeGXkT.js → circle-pause-C8HHyood.js} +1 -1
- package/static/app/assets/{circle-play-DkT6tYPX.js → circle-play-Cufc235E.js} +1 -1
- package/static/app/assets/{cpu-85xYObUC.js → cpu-DW2_JVsv.js} +1 -1
- package/static/app/assets/{download-B5Fm7YXo.js → download-gbdKTBb8.js} +1 -1
- package/static/app/assets/{folder-open-kk2Xa52u.js → folder-open-C9ydyX33.js} +1 -1
- package/static/app/assets/{hard-drive-DkA3zBW_.js → hard-drive-BxNMzBM3.js} +1 -1
- package/static/app/assets/index-BovSWRmQ.css +2 -0
- package/static/app/assets/{index-BMPdTmlY.js → index-q9XyDY7A.js} +3 -3
- package/static/app/assets/{input-B0nRf2jO.js → input-GLD94Y_K.js} +1 -1
- package/static/app/assets/{link-2-Dwb4gnTc.js → link-2-B4Y0gz1S.js} +1 -1
- package/static/app/assets/{permissionCopy-CQDUBrOZ.js → permissionCopy-CxrV0fvU.js} +1 -1
- package/static/app/assets/{primitives-SNp0LRJz.js → primitives-2ANdAsu2.js} +1 -1
- package/static/app/assets/search-DTxtjQ07.js +1 -0
- package/static/app/assets/{share-2-BsrxFglO.js → share-2-DxArfiuI.js} +1 -1
- package/static/app/assets/{shield-alert-5BStfp2_.js → shield-alert-CgftuFFs.js} +1 -1
- package/static/app/assets/{textarea-Cg8IUA-k.js → textarea-BHVBAoCr.js} +1 -1
- package/static/app/assets/{useFocusTrap-CYKvE46M.js → useFocusTrap-Dzq2j_OG.js} +1 -1
- package/static/app/assets/{useMutation-CSn9t1op.js → useMutation-BcqfMLNq.js} +1 -1
- package/static/app/assets/{useQuery-CY2OI2uy.js → useQuery-DBzLKCOv.js} +1 -1
- package/static/app/assets/{utils-Ddol2RWD.js → utils-B-Aah1bO.js} +1 -1
- package/static/app/assets/{workspace-BqDwOz_p.js → workspace-B6fFhoko.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/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/search-BcHqkjoy.js +0 -1
|
@@ -1,98 +0,0 @@
|
|
|
1
|
-
"""Built-in First Value Loop demo corpus (backlog #3, review §3.3 P0).
|
|
2
|
-
|
|
3
|
-
Three small Korean-friendly documents shipped in-repo so a brand-new user can
|
|
4
|
-
one-click seed the Brain and immediately experience a successful recall with
|
|
5
|
-
source highlighting — no folder connection, no model download, fully offline.
|
|
6
|
-
|
|
7
|
-
Contract:
|
|
8
|
-
|
|
9
|
-
* Documents are ingested through the normal :class:`IngestionPipeline`
|
|
10
|
-
(``source_type="note"``) with ``source_uri = demo://<id>`` and metadata
|
|
11
|
-
``{"demo_corpus": true}`` so they are identifiable and removable later.
|
|
12
|
-
* Ingestion is idempotent — the graph layer dedupes by content hash, so
|
|
13
|
-
re-POSTing never duplicates documents.
|
|
14
|
-
* :data:`SUGGESTED_QUESTIONS` are pre-filled questions whose answers exist in
|
|
15
|
-
the corpus (the UI renders them as "ask this" chips).
|
|
16
|
-
"""
|
|
17
|
-
|
|
18
|
-
from __future__ import annotations
|
|
19
|
-
|
|
20
|
-
from typing import Any, Dict, List
|
|
21
|
-
|
|
22
|
-
DEMO_URI_PREFIX = "demo://"
|
|
23
|
-
DEMO_METADATA_FLAG = "demo_corpus"
|
|
24
|
-
|
|
25
|
-
DEMO_DOCUMENTS: List[Dict[str, str]] = [
|
|
26
|
-
{
|
|
27
|
-
"id": "meeting-note",
|
|
28
|
-
"title": "주간 회의록 — 사이드 프로젝트 킥오프",
|
|
29
|
-
"text": (
|
|
30
|
-
"2026-07-20 주간 회의록.\n"
|
|
31
|
-
"참석: 나, 김민준(백엔드), 박서연(디자인).\n"
|
|
32
|
-
"핵심 결정: 사이드 프로젝트 '새싹 가든'의 첫 공개 버전을 8월 15일에 "
|
|
33
|
-
"출시하기로 결정했다. 범위는 식물 기록과 물주기 알림 두 가지로 줄인다.\n"
|
|
34
|
-
"김민준이 알림 백엔드를 맡고, 박서연이 온보딩 화면을 맡는다.\n"
|
|
35
|
-
"다음 회의 전까지 각자 프로토타입을 준비하기로 했다."
|
|
36
|
-
),
|
|
37
|
-
},
|
|
38
|
-
{
|
|
39
|
-
"id": "project-doc",
|
|
40
|
-
"title": "프로젝트 개요 — 새싹 가든",
|
|
41
|
-
"text": (
|
|
42
|
-
"새싹 가든은 집에서 키우는 식물을 기록하는 작은 앱이다.\n"
|
|
43
|
-
"기술 스택: 프론트엔드는 React, 백엔드는 FastAPI, 데이터는 SQLite에 "
|
|
44
|
-
"로컬로 저장한다. 사진은 기기 밖으로 나가지 않는다.\n"
|
|
45
|
-
"첫 버전 목표: 식물 등록, 물주기 알림, 한 줄 관찰 일기.\n"
|
|
46
|
-
"수익화는 생각하지 않고, 주말에 만드는 것을 원칙으로 한다."
|
|
47
|
-
),
|
|
48
|
-
},
|
|
49
|
-
{
|
|
50
|
-
"id": "personal-note",
|
|
51
|
-
"title": "개인 노트 — 독서 메모: 아주 작은 습관의 힘",
|
|
52
|
-
"text": (
|
|
53
|
-
"『아주 작은 습관의 힘』을 읽고 남긴 메모.\n"
|
|
54
|
-
"가장 기억에 남는 문장: 습관은 목표가 아니라 시스템으로 만들어진다.\n"
|
|
55
|
-
"적용해 볼 것: 매일 아침 10분 스트레칭을 양치 직후에 붙여서 시작한다.\n"
|
|
56
|
-
"핵심은 2분 규칙 — 새 습관은 2분 안에 끝나는 크기로 시작하는 것이다."
|
|
57
|
-
),
|
|
58
|
-
},
|
|
59
|
-
]
|
|
60
|
-
|
|
61
|
-
# Pre-filled questions whose answers exist in the corpus above. ``source_uri``
|
|
62
|
-
# lets the UI verify the recall cited the right demo document.
|
|
63
|
-
SUGGESTED_QUESTIONS: List[Dict[str, str]] = [
|
|
64
|
-
{
|
|
65
|
-
"question": "회의에서 결정한 출시일이 언제야?",
|
|
66
|
-
"expected_source_uri": DEMO_URI_PREFIX + "meeting-note",
|
|
67
|
-
"expected_title": "주간 회의록 — 사이드 프로젝트 킥오프",
|
|
68
|
-
},
|
|
69
|
-
{
|
|
70
|
-
"question": "새싹 가든의 기술 스택이 뭐야?",
|
|
71
|
-
"expected_source_uri": DEMO_URI_PREFIX + "project-doc",
|
|
72
|
-
"expected_title": "프로젝트 개요 — 새싹 가든",
|
|
73
|
-
},
|
|
74
|
-
{
|
|
75
|
-
"question": "새 습관을 시작할 때 쓰는 2분 규칙이 뭐였지?",
|
|
76
|
-
"expected_source_uri": DEMO_URI_PREFIX + "personal-note",
|
|
77
|
-
"expected_title": "개인 노트 — 독서 메모: 아주 작은 습관의 힘",
|
|
78
|
-
},
|
|
79
|
-
]
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
def demo_source_uri(doc_id: str) -> str:
|
|
83
|
-
return DEMO_URI_PREFIX + str(doc_id)
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
def suggested_questions() -> List[Dict[str, Any]]:
|
|
87
|
-
"""Copy of the suggestion chips (callers may annotate freely)."""
|
|
88
|
-
return [dict(item) for item in SUGGESTED_QUESTIONS]
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
__all__ = [
|
|
92
|
-
"DEMO_DOCUMENTS",
|
|
93
|
-
"DEMO_METADATA_FLAG",
|
|
94
|
-
"DEMO_URI_PREFIX",
|
|
95
|
-
"SUGGESTED_QUESTIONS",
|
|
96
|
-
"demo_source_uri",
|
|
97
|
-
"suggested_questions",
|
|
98
|
-
]
|
|
@@ -1,126 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Smart Setup Wizard — Environment Scanner, Recommender & Auto-Installer
|
|
3
|
-
Detects hardware, tools, and API keys; returns tailored recommendations;
|
|
4
|
-
streams SSE installation progress.
|
|
5
|
-
|
|
6
|
-
Formerly the root ``setup.py``; renamed in v4 so it no longer collides with
|
|
7
|
-
the setuptools build entrypoint and actually ships in the wheel
|
|
8
|
-
(``pyproject.toml`` py-modules). Packaging is owned entirely by
|
|
9
|
-
``pyproject.toml`` — there is deliberately no root ``setup.py``.
|
|
10
|
-
|
|
11
|
-
Split into cohesive submodules in v11.3.0 (no behaviour change): ``paths``
|
|
12
|
-
(PATH repair + binary lookup + the module-level ``COMMON_PATH_DIRS``),
|
|
13
|
-
``detect`` (hardware/OS/tool probes and ``scan_environment``), ``plans``
|
|
14
|
-
(SSE framing + confirmation-token command plans), ``catalog`` (model tables),
|
|
15
|
-
``recommend`` (``get_recommendations``) and ``install`` (verify/repair and the
|
|
16
|
-
SSE ``install_stream``). This module re-exports every name the single file
|
|
17
|
-
exposed, so ``latticeai.setup.wizard.X`` keeps working.
|
|
18
|
-
|
|
19
|
-
Stubbing note: rebinding one of these names *here* changes only this module's
|
|
20
|
-
name. The submodule that calls it holds its own reference, so a test standing
|
|
21
|
-
in for a helper patches the submodule that uses it.
|
|
22
|
-
"""
|
|
23
|
-
|
|
24
|
-
from __future__ import annotations
|
|
25
|
-
|
|
26
|
-
# The single file had no ``__all__``, so its public surface was "every module
|
|
27
|
-
# global" — including the names it imported for its own use. Every re-export
|
|
28
|
-
# below therefore uses the redundant-alias form: it reproduces exactly that
|
|
29
|
-
# surface, and it marks each name as deliberate rather than a leftover import.
|
|
30
|
-
from latticeai.core.quiet import quiet as quiet
|
|
31
|
-
from latticeai.services.process_audit import (
|
|
32
|
-
CommandConfirmationError as CommandConfirmationError,
|
|
33
|
-
)
|
|
34
|
-
from latticeai.services.process_audit import (
|
|
35
|
-
append_process_audit_event as append_process_audit_event,
|
|
36
|
-
)
|
|
37
|
-
from latticeai.services.process_audit import command_plan as command_plan
|
|
38
|
-
from latticeai.services.process_audit import (
|
|
39
|
-
command_plan_for_commands as command_plan_for_commands,
|
|
40
|
-
)
|
|
41
|
-
from latticeai.services.process_audit import (
|
|
42
|
-
require_command_confirmation as require_command_confirmation,
|
|
43
|
-
)
|
|
44
|
-
from latticeai.services.setup_detection import detect_cuda as detect_cuda
|
|
45
|
-
from latticeai.services.setup_detection import detect_tools as detect_tools
|
|
46
|
-
from latticeai.services.setup_detection import (
|
|
47
|
-
detect_wsl_from_text as detect_wsl_from_text,
|
|
48
|
-
)
|
|
49
|
-
from latticeai.setup.wizard.catalog import (
|
|
50
|
-
_BEST_MODEL_TIERS as _BEST_MODEL_TIERS,
|
|
51
|
-
)
|
|
52
|
-
from latticeai.setup.wizard.catalog import (
|
|
53
|
-
_CROSS_PLATFORM_MODEL_CATALOG as _CROSS_PLATFORM_MODEL_CATALOG,
|
|
54
|
-
)
|
|
55
|
-
from latticeai.setup.wizard.catalog import (
|
|
56
|
-
_MODEL_CATALOG as _MODEL_CATALOG,
|
|
57
|
-
)
|
|
58
|
-
from latticeai.setup.wizard.catalog import (
|
|
59
|
-
_VERSIONED_MODEL_PATTERNS as _VERSIONED_MODEL_PATTERNS,
|
|
60
|
-
)
|
|
61
|
-
from latticeai.setup.wizard.catalog import (
|
|
62
|
-
_best_model_for_engine as _best_model_for_engine,
|
|
63
|
-
)
|
|
64
|
-
from latticeai.setup.wizard.catalog import (
|
|
65
|
-
_catalog_row_family_version as _catalog_row_family_version,
|
|
66
|
-
)
|
|
67
|
-
from latticeai.setup.wizard.catalog import (
|
|
68
|
-
_filter_lower_family_versions as _filter_lower_family_versions,
|
|
69
|
-
)
|
|
70
|
-
from latticeai.setup.wizard.catalog import (
|
|
71
|
-
_version_tuple as _version_tuple,
|
|
72
|
-
)
|
|
73
|
-
from latticeai.setup.wizard.detect import _cmd as _cmd
|
|
74
|
-
from latticeai.setup.wizard.detect import _detect_api_keys as _detect_api_keys
|
|
75
|
-
from latticeai.setup.wizard.detect import _detect_chip as _detect_chip
|
|
76
|
-
from latticeai.setup.wizard.detect import _detect_cpu as _detect_cpu
|
|
77
|
-
from latticeai.setup.wizard.detect import _detect_cuda as _detect_cuda
|
|
78
|
-
from latticeai.setup.wizard.detect import (
|
|
79
|
-
_detect_disk_free_gb as _detect_disk_free_gb,
|
|
80
|
-
)
|
|
81
|
-
from latticeai.setup.wizard.detect import _detect_gpu as _detect_gpu
|
|
82
|
-
from latticeai.setup.wizard.detect import _detect_mlx as _detect_mlx
|
|
83
|
-
from latticeai.setup.wizard.detect import _detect_ram_gb as _detect_ram_gb
|
|
84
|
-
from latticeai.setup.wizard.detect import _detect_tools as _detect_tools
|
|
85
|
-
from latticeai.setup.wizard.detect import _detect_wsl as _detect_wsl
|
|
86
|
-
from latticeai.setup.wizard.detect import (
|
|
87
|
-
_parse_windows_video_controllers as _parse_windows_video_controllers,
|
|
88
|
-
)
|
|
89
|
-
from latticeai.setup.wizard.detect import scan_environment as scan_environment
|
|
90
|
-
from latticeai.setup.wizard.install import _brew_install as _brew_install
|
|
91
|
-
from latticeai.setup.wizard.install import _pip_install as _pip_install
|
|
92
|
-
from latticeai.setup.wizard.install import _repair_action as _repair_action
|
|
93
|
-
from latticeai.setup.wizard.install import _verify_action as _verify_action
|
|
94
|
-
from latticeai.setup.wizard.install import _verify_binary as _verify_binary
|
|
95
|
-
from latticeai.setup.wizard.install import _wait_for_binary as _wait_for_binary
|
|
96
|
-
from latticeai.setup.wizard.install import install_stream as install_stream
|
|
97
|
-
from latticeai.setup.wizard.install import open_url as open_url
|
|
98
|
-
from latticeai.setup.wizard.paths import COMMON_PATH_DIRS as COMMON_PATH_DIRS
|
|
99
|
-
from latticeai.setup.wizard.paths import OFFICIAL_DOWNLOADS as OFFICIAL_DOWNLOADS
|
|
100
|
-
from latticeai.setup.wizard.paths import PACKAGE_MODULES as PACKAGE_MODULES
|
|
101
|
-
from latticeai.setup.wizard.paths import (
|
|
102
|
-
WINDOWS_BINARY_CANDIDATES as WINDOWS_BINARY_CANDIDATES,
|
|
103
|
-
)
|
|
104
|
-
from latticeai.setup.wizard.paths import _component_detail as _component_detail
|
|
105
|
-
from latticeai.setup.wizard.paths import _merge_path_dirs as _merge_path_dirs
|
|
106
|
-
from latticeai.setup.wizard.paths import _module_available as _module_available
|
|
107
|
-
from latticeai.setup.wizard.paths import _package_module as _package_module
|
|
108
|
-
from latticeai.setup.wizard.paths import _persist_extra_path as _persist_extra_path
|
|
109
|
-
from latticeai.setup.wizard.paths import _project_env_file as _project_env_file
|
|
110
|
-
from latticeai.setup.wizard.paths import _update_env_file as _update_env_file
|
|
111
|
-
from latticeai.setup.wizard.paths import _which_any as _which_any
|
|
112
|
-
from latticeai.setup.wizard.paths import _which_detail as _which_detail
|
|
113
|
-
from latticeai.setup.wizard.paths import repair_path_for as repair_path_for
|
|
114
|
-
from latticeai.setup.wizard.plans import _action_command_plan as _action_command_plan
|
|
115
|
-
from latticeai.setup.wizard.plans import _action_commands as _action_commands
|
|
116
|
-
from latticeai.setup.wizard.plans import _attach_action_plan as _attach_action_plan
|
|
117
|
-
from latticeai.setup.wizard.plans import (
|
|
118
|
-
_hydrate_install_actions as _hydrate_install_actions,
|
|
119
|
-
)
|
|
120
|
-
from latticeai.setup.wizard.plans import _sse as _sse
|
|
121
|
-
from latticeai.setup.wizard.plans import (
|
|
122
|
-
_verify_action_confirmation as _verify_action_confirmation,
|
|
123
|
-
)
|
|
124
|
-
from latticeai.setup.wizard.recommend import (
|
|
125
|
-
get_recommendations as get_recommendations,
|
|
126
|
-
)
|
|
@@ -1,175 +0,0 @@
|
|
|
1
|
-
"""The wizard's model catalogue and the per-engine "best model" tiers.
|
|
2
|
-
|
|
3
|
-
Data plus the two pure decisions that read it: hide superseded model
|
|
4
|
-
*generations* (:func:`_filter_lower_family_versions`) and pick the best model a
|
|
5
|
-
machine with this much RAM can actually hold (:func:`_best_model_for_engine`).
|
|
6
|
-
"""
|
|
7
|
-
|
|
8
|
-
from __future__ import annotations
|
|
9
|
-
|
|
10
|
-
import re
|
|
11
|
-
from typing import Dict, List, Tuple
|
|
12
|
-
|
|
13
|
-
from latticeai.services.model_catalog import _version_tuple as _catalog_version_tuple
|
|
14
|
-
|
|
15
|
-
# ── Model Catalog ─────────────────────────────────────────────────────────────
|
|
16
|
-
# (model_id, display_name, size_gb, tag, description, min_ram_gb)
|
|
17
|
-
# 11.2.0: 모든 repo id 를 2026-08-10 Hugging Face API 로 확인했다 — 존재 여부,
|
|
18
|
-
# gated 여부, 정확한 대소문자, siblings 합계 크기. 크기 값은 측정값이다.
|
|
19
|
-
# 삭제: Qwen3-VL 전 라인업(2025-10, Qwen3.5/3.6 이 상위 세대), Llama 4 Scout
|
|
20
|
-
# (vLLM/LM Studio 경로가 gated 인 meta-llama 저장소를 가리켰다).
|
|
21
|
-
_MODEL_CATALOG = [
|
|
22
|
-
("mlx-community/LFM2.5-2.6B-4bit", "LFM2.5 2.6B", 1.5, "LLM", "가장 가벼움 · 한국어 대화 (사진은 못 읽음)", 4),
|
|
23
|
-
("mlx-community/gemma-4-e2b-it-4bit", "Gemma 4 E2B", 3.6, "VLM", "사진을 읽는 가장 작은 모델", 8),
|
|
24
|
-
("mlx-community/gemma-4-e4b-it-4bit", "Gemma 4 E4B", 5.2, "VLM", "E2B 보다 한 단계 위 · 여전히 가벼움", 10),
|
|
25
|
-
("mlx-community/Qwen3.5-9B-MLX-4bit", "Qwen3.5 9B", 6.0, "VLM", "중형 멀티모달 · 균형 추천", 12),
|
|
26
|
-
("mlx-community/gemma-4-12B-it-4bit", "Gemma 4 12B", 6.8, "VLM", "Gemma 4 기본 추천 · 4bit", 16),
|
|
27
|
-
("mlx-community/gpt-oss-20b-MXFP4-Q8", "GPT-OSS 20B", 12.1, "LLM", "범용 · 다운로드 최다 (사진은 못 읽음)", 24),
|
|
28
|
-
("mlx-community/gemma-4-26b-a4b-it-4bit", "Gemma 4 26B A4B", 15.4, "VLM", "MoE · 대형 추천", 32),
|
|
29
|
-
("mlx-community/Qwen3.6-27B-4bit", "Qwen3.6 27B", 16.1, "VLM+", "dense 최상위 · 느리지만 일정함", 48),
|
|
30
|
-
("mlx-community/gemma-4-31b-it-4bit", "Gemma 4 31B", 18.4, "VLM+", "Gemma 4 최대 모델", 48),
|
|
31
|
-
("mlx-community/Qwen3.6-35B-A3B-4bit", "Qwen3.6 35B A3B", 20.4, "VLM+", "MoE 최상위", 48),
|
|
32
|
-
]
|
|
33
|
-
|
|
34
|
-
_CROSS_PLATFORM_MODEL_CATALOG: Dict[str, List[Tuple[str, str, float, str, str, int]]] = {
|
|
35
|
-
"ollama": [
|
|
36
|
-
("ollama:hf.co/LiquidAI/LFM2.5-2.6B-GGUF:Q4_K_M", "LFM2.5 2.6B Q4", 1.7, "LLM", "가장 가벼움 · 한국어 대화", 4),
|
|
37
|
-
("ollama:hf.co/ggml-org/gemma-4-E2B-it-GGUF:Q4_K_M", "Gemma 4 E2B Q4", 3.8, "VLM", "Hugging Face GGUF 기반 Gemma 4", 8),
|
|
38
|
-
("ollama:hf.co/ggml-org/gemma-4-E4B-it-GGUF:Q4_K_M", "Gemma 4 E4B Q4", 5.4, "VLM", "Hugging Face GGUF 기반 Gemma 4", 10),
|
|
39
|
-
("ollama:hf.co/ggml-org/gemma-4-12B-it-GGUF:Q4_K_M", "Gemma 4 12B Q4", 7.9, "VLM", "Hugging Face GGUF 기반 Gemma 4", 16),
|
|
40
|
-
("ollama:hf.co/ggml-org/gpt-oss-20b-GGUF:Q4_K_M", "GPT-OSS 20B Q4", 12.5, "LLM", "범용 · 다운로드 최다", 24),
|
|
41
|
-
("ollama:hf.co/ggml-org/gemma-4-26B-A4B-it-GGUF:Q4_K_M", "Gemma 4 26B Q4", 16.0, "VLM", "MoE · 대형 추천", 32),
|
|
42
|
-
("ollama:hf.co/ggml-org/Qwen3.6-27B-GGUF:Q4_K_M", "Qwen3.6 27B Q4", 16.6, "VLM+", "dense 최상위", 48),
|
|
43
|
-
("ollama:hf.co/ggml-org/gemma-4-31B-it-GGUF:Q4_K_M", "Gemma 4 31B Q4", 18.7, "VLM+", "Gemma 4 최대 모델", 48),
|
|
44
|
-
],
|
|
45
|
-
"lmstudio": [
|
|
46
|
-
("lmstudio:LiquidAI/LFM2.5-2.6B-GGUF", "LFM2.5 2.6B", 1.7, "LLM", "가장 가벼움 · 한국어 대화", 4),
|
|
47
|
-
("lmstudio:ggml-org/gemma-4-E2B-it-GGUF", "Gemma 4 E2B", 3.8, "VLM", "LM Studio GGUF Gemma 4", 8),
|
|
48
|
-
("lmstudio:ggml-org/gemma-4-E4B-it-GGUF", "Gemma 4 E4B", 5.4, "VLM", "LM Studio GGUF Gemma 4", 10),
|
|
49
|
-
("lmstudio:ggml-org/gemma-4-12B-it-GGUF", "Gemma 4 12B", 7.9, "VLM", "LM Studio GGUF Gemma 4", 16),
|
|
50
|
-
("lmstudio:ggml-org/gpt-oss-20b-GGUF", "GPT-OSS 20B", 12.5, "LLM", "범용 · 다운로드 최다", 24),
|
|
51
|
-
("lmstudio:ggml-org/gemma-4-26B-A4B-it-GGUF", "Gemma 4 26B", 16.0, "VLM", "MoE · 대형 추천", 32),
|
|
52
|
-
("lmstudio:ggml-org/Qwen3.6-27B-GGUF", "Qwen3.6 27B", 16.6, "VLM+", "dense 최상위", 48),
|
|
53
|
-
("lmstudio:ggml-org/gemma-4-31B-it-GGUF", "Gemma 4 31B", 18.7, "VLM+", "Gemma 4 최대 모델", 48),
|
|
54
|
-
],
|
|
55
|
-
"vllm": [
|
|
56
|
-
("vllm:LiquidAI/LFM2.5-2.6B", "LFM2.5 2.6B", 5.2, "LLM", "가장 가벼움 · 한국어 대화", 8),
|
|
57
|
-
("vllm:google/gemma-4-E2B-it", "Gemma 4 E2B", 6.0, "VLM", "내 컴퓨터 GPU 실행 도구 권장", 12),
|
|
58
|
-
("vllm:google/gemma-4-E4B-it", "Gemma 4 E4B", 9.0, "VLM", "내 컴퓨터 GPU 실행 도구 권장", 16),
|
|
59
|
-
("vllm:Qwen/Qwen3.5-9B", "Qwen3.5 9B", 18.0, "VLM", "중형 멀티모달 · 균형 추천", 24),
|
|
60
|
-
("vllm:google/gemma-4-12B-it", "Gemma 4 12B", 24.0, "VLM", "Gemma 4 기본 추천", 32),
|
|
61
|
-
("vllm:openai/gpt-oss-20b", "GPT-OSS 20B", 13.5, "LLM", "범용 · 다운로드 최다", 24),
|
|
62
|
-
("vllm:Qwen/Qwen3.6-27B", "Qwen3.6 27B", 54.0, "VLM+", "dense 최상위 · 24GB+ VRAM 권장", 64),
|
|
63
|
-
("vllm:Qwen/Qwen3.6-35B-A3B", "Qwen3.6 35B A3B", 70.0, "VLM+", "MoE 최상위 · 24GB+ VRAM 권장", 80),
|
|
64
|
-
],
|
|
65
|
-
"llamacpp": [
|
|
66
|
-
("llamacpp:LiquidAI/LFM2.5-2.6B-GGUF", "LFM2.5 2.6B GGUF", 1.7, "GGUF", "CPU/Vulkan 백업 · 가장 가벼움", 4),
|
|
67
|
-
("llamacpp:ggml-org/gemma-4-E2B-it-GGUF", "Gemma 4 E2B GGUF", 3.8, "GGUF", "Gemma 4 E2B Q4_K_M", 8),
|
|
68
|
-
("llamacpp:ggml-org/gemma-4-E4B-it-GGUF", "Gemma 4 E4B GGUF", 5.4, "GGUF", "Gemma 4 E4B Q4_K_M", 10),
|
|
69
|
-
("llamacpp:ggml-org/gemma-4-12B-it-GGUF", "Gemma 4 12B GGUF", 7.9, "GGUF", "Gemma 4 12B Q4_K_M", 16),
|
|
70
|
-
("llamacpp:ggml-org/gpt-oss-20b-GGUF", "GPT-OSS 20B GGUF", 12.5, "GGUF", "범용 · 다운로드 최다", 24),
|
|
71
|
-
("llamacpp:ggml-org/gemma-4-26B-A4B-it-GGUF", "Gemma 4 26B GGUF", 16.0, "GGUF", "MoE · 대형 추천", 32),
|
|
72
|
-
("llamacpp:ggml-org/Qwen3.6-27B-GGUF", "Qwen3.6 27B GGUF", 16.6, "GGUF", "dense 최상위", 48),
|
|
73
|
-
("llamacpp:ggml-org/gemma-4-31B-it-GGUF", "Gemma 4 31B GGUF", 18.7, "GGUF", "Gemma 4 31B Q4_K_M", 48),
|
|
74
|
-
],
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
_VERSIONED_MODEL_PATTERNS = (
|
|
78
|
-
("gemma", re.compile(r"\bgemma[-\s]?(\d+(?:\.\d+)?)", re.IGNORECASE)),
|
|
79
|
-
("qwen", re.compile(r"\bqwen[-\s]?(\d+(?:\.\d+)?)", re.IGNORECASE)),
|
|
80
|
-
("llama", re.compile(r"\bllama[-\s]?(\d+(?:\.\d+)?)", re.IGNORECASE)),
|
|
81
|
-
)
|
|
82
|
-
|
|
83
|
-
# RAM(GB) 내림차순 티어. 첫 번째로 조건을 만족하는 항목이 "이 컴퓨터에서 가장
|
|
84
|
-
# 좋은 모델"이 된다. 초경량(≤8) / 경량(16) / 중형(24) / MoE(32) / 대형(48).
|
|
85
|
-
_BEST_MODEL_TIERS: Dict[str, List[Tuple[int, str]]] = {
|
|
86
|
-
"local_mlx": [
|
|
87
|
-
(48, "mlx-community/gemma-4-31b-it-4bit"),
|
|
88
|
-
(32, "mlx-community/gemma-4-26b-a4b-it-4bit"),
|
|
89
|
-
(24, "mlx-community/gemma-4-12B-it-4bit"),
|
|
90
|
-
(16, "mlx-community/Qwen3.5-9B-MLX-4bit"),
|
|
91
|
-
(8, "mlx-community/gemma-4-e2b-it-4bit"),
|
|
92
|
-
(4, "mlx-community/LFM2.5-2.6B-4bit"),
|
|
93
|
-
],
|
|
94
|
-
"ollama": [
|
|
95
|
-
(48, "ollama:hf.co/ggml-org/gemma-4-31B-it-GGUF:Q4_K_M"),
|
|
96
|
-
(32, "ollama:hf.co/ggml-org/gemma-4-26B-A4B-it-GGUF:Q4_K_M"),
|
|
97
|
-
(24, "ollama:hf.co/ggml-org/gemma-4-12B-it-GGUF:Q4_K_M"),
|
|
98
|
-
(16, "ollama:hf.co/ggml-org/gemma-4-E4B-it-GGUF:Q4_K_M"),
|
|
99
|
-
(8, "ollama:hf.co/ggml-org/gemma-4-E2B-it-GGUF:Q4_K_M"),
|
|
100
|
-
(4, "ollama:hf.co/LiquidAI/LFM2.5-2.6B-GGUF:Q4_K_M"),
|
|
101
|
-
],
|
|
102
|
-
"lmstudio": [
|
|
103
|
-
(48, "lmstudio:ggml-org/gemma-4-31B-it-GGUF"),
|
|
104
|
-
(32, "lmstudio:ggml-org/gemma-4-26B-A4B-it-GGUF"),
|
|
105
|
-
(24, "lmstudio:ggml-org/gemma-4-12B-it-GGUF"),
|
|
106
|
-
(16, "lmstudio:ggml-org/gemma-4-E4B-it-GGUF"),
|
|
107
|
-
(8, "lmstudio:ggml-org/gemma-4-E2B-it-GGUF"),
|
|
108
|
-
(4, "lmstudio:LiquidAI/LFM2.5-2.6B-GGUF"),
|
|
109
|
-
],
|
|
110
|
-
# vLLM serves the upstream bf16 repos, which are 3-4x the MLX 4-bit builds
|
|
111
|
-
# (Qwen3.6-27B is 54GB, not 16GB), so its thresholds sit far higher than the
|
|
112
|
-
# local_mlx ones. Picking by RAM alone would nominate a model no consumer
|
|
113
|
-
# GPU can hold.
|
|
114
|
-
"vllm": [
|
|
115
|
-
(96, "vllm:Qwen/Qwen3.6-27B"),
|
|
116
|
-
(32, "vllm:google/gemma-4-12B-it"),
|
|
117
|
-
(24, "vllm:Qwen/Qwen3.5-9B"),
|
|
118
|
-
(16, "vllm:google/gemma-4-E4B-it"),
|
|
119
|
-
(8, "vllm:LiquidAI/LFM2.5-2.6B"),
|
|
120
|
-
],
|
|
121
|
-
"llamacpp": [
|
|
122
|
-
(48, "llamacpp:ggml-org/gemma-4-31B-it-GGUF"),
|
|
123
|
-
(32, "llamacpp:ggml-org/gemma-4-26B-A4B-it-GGUF"),
|
|
124
|
-
(24, "llamacpp:ggml-org/gemma-4-12B-it-GGUF"),
|
|
125
|
-
(16, "llamacpp:ggml-org/gemma-4-E4B-it-GGUF"),
|
|
126
|
-
(8, "llamacpp:ggml-org/gemma-4-E2B-it-GGUF"),
|
|
127
|
-
(4, "llamacpp:LiquidAI/LFM2.5-2.6B-GGUF"),
|
|
128
|
-
],
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
#: The engine catalog owns this parse; the wizard compares the same strings.
|
|
134
|
-
_version_tuple = _catalog_version_tuple
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
def _catalog_row_family_version(row: Tuple[str, str, float, str, str, int]) -> Tuple[str, Tuple[int, ...]] | None:
|
|
138
|
-
text = f"{row[0]} {row[1]}"
|
|
139
|
-
for family, pattern in _VERSIONED_MODEL_PATTERNS:
|
|
140
|
-
match = pattern.search(text)
|
|
141
|
-
if match:
|
|
142
|
-
# Major version only — see model_catalog._model_family_version. The
|
|
143
|
-
# filter hides superseded *generations*; Qwen3.5 and Qwen3.6 are one
|
|
144
|
-
# generation filling two different RAM tiers and must coexist.
|
|
145
|
-
version = _version_tuple(match.group(1))[:1]
|
|
146
|
-
if version:
|
|
147
|
-
return family, version
|
|
148
|
-
return None
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
def _filter_lower_family_versions(
|
|
152
|
-
rows: List[Tuple[str, str, float, str, str, int]],
|
|
153
|
-
) -> List[Tuple[str, str, float, str, str, int]]:
|
|
154
|
-
max_versions: Dict[str, Tuple[int, ...]] = {}
|
|
155
|
-
detected: List[Tuple[Tuple[str, str, float, str, str, int], Tuple[str, Tuple[int, ...]] | None]] = []
|
|
156
|
-
for row in rows:
|
|
157
|
-
version_info = _catalog_row_family_version(row)
|
|
158
|
-
detected.append((row, version_info))
|
|
159
|
-
if not version_info:
|
|
160
|
-
continue
|
|
161
|
-
family, version = version_info
|
|
162
|
-
if version > max_versions.get(family, (0,)):
|
|
163
|
-
max_versions[family] = version
|
|
164
|
-
return [
|
|
165
|
-
row for row, version_info in detected
|
|
166
|
-
if not version_info or version_info[1] >= max_versions.get(version_info[0], version_info[1])
|
|
167
|
-
]
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
def _best_model_for_engine(engine: str, ram_gb: float, rows: List[Tuple[str, str, float, str, str, int]]) -> str:
|
|
171
|
-
available_ids = {row[0] for row in rows}
|
|
172
|
-
for min_ram, model_id in _BEST_MODEL_TIERS.get(engine, []):
|
|
173
|
-
if ram_gb >= min_ram and model_id in available_ids:
|
|
174
|
-
return model_id
|
|
175
|
-
return rows[0][0] if rows else ""
|