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.
Files changed (439) hide show
  1. package/README.md +91 -148
  2. package/bin/ltcai.js +234 -24
  3. package/docs/CHANGELOG.md +75 -0
  4. package/docs/COMMUNITY_AND_PLUGINS.md +1 -1
  5. package/docs/DEVELOPMENT.md +8 -6
  6. package/docs/ENTERPRISE.md +2 -1
  7. package/docs/MULTI_AGENT_RUNTIME.md +12 -5
  8. package/docs/ONBOARDING.md +1 -1
  9. package/docs/OPERATIONS.md +6 -3
  10. package/docs/REALTIME_COLLABORATION.md +1 -1
  11. package/docs/TRUST_MODEL.md +1 -1
  12. package/docs/WHY_LATTICE.md +1 -1
  13. package/docs/WORKFLOW_DESIGNER.md +3 -2
  14. package/docs/kg-schema.md +1 -1
  15. package/docs/v11.6.0_ONE_DOOR_PLAN.md +170 -0
  16. package/lattice_brain/__init__.py +42 -79
  17. package/lattice_brain/graph/__init__.py +9 -24
  18. package/lattice_brain/graph/_kg_common/__init__.py +13 -24
  19. package/lattice_brain/ingestion/__init__.py +19 -58
  20. package/lattice_brain/ingestion/pipeline.py +20 -398
  21. package/lattice_brain/multimodal/__init__.py +7 -18
  22. package/lattice_brain/multimodal/images.py +6 -264
  23. package/lattice_brain/multimodal/video.py +8 -247
  24. package/lattice_brain/runtime/__init__.py +8 -79
  25. package/lattice_brain/runtime/hooks.py +22 -584
  26. package/latticeai/__init__.py +1 -1
  27. package/latticeai/api/agent_worker_seam.py +7 -80
  28. package/latticeai/api/health.py +6 -20
  29. package/latticeai/api/local_files.py +16 -613
  30. package/latticeai/api/models.py +12 -87
  31. package/latticeai/api/search.py +17 -255
  32. package/latticeai/api/tools.py +69 -750
  33. package/latticeai/api/voice_capture.py +8 -70
  34. package/latticeai/api/worker_compute.py +842 -0
  35. package/latticeai/api/worker_seams.py +216 -0
  36. package/latticeai/app_factory.py +23 -232
  37. package/latticeai/cli/entrypoint.py +36 -249
  38. package/latticeai/core/agent_permission.py +16 -91
  39. package/latticeai/core/messages.py +89 -531
  40. package/latticeai/runtime/access_runtime.py +0 -14
  41. package/latticeai/runtime/bootstrap.py +10 -21
  42. package/latticeai/runtime/brain_runtime.py +35 -43
  43. package/latticeai/runtime/build_phases/__init__.py +21 -37
  44. package/latticeai/runtime/build_phases/features.py +99 -389
  45. package/latticeai/runtime/build_phases/foundation.py +82 -392
  46. package/latticeai/runtime/build_phases/web.py +91 -408
  47. package/latticeai/runtime/build_phases/worker_profile.py +244 -0
  48. package/latticeai/runtime/lifespan_runtime.py +7 -16
  49. package/latticeai/runtime/platform_services_runtime.py +1 -15
  50. package/latticeai/runtime/runtime_context.py +13 -130
  51. package/latticeai/runtime/security_runtime.py +10 -103
  52. package/latticeai/services/architecture_readiness.py +82 -43
  53. package/latticeai/services/model_runtime/__init__.py +2 -11
  54. package/latticeai/services/model_runtime/service.py +4 -28
  55. package/latticeai/services/p_reinforce.py +10 -261
  56. package/latticeai/services/product_readiness.py +31 -38
  57. package/latticeai/services/search_service.py +37 -795
  58. package/latticeai/services/tool_dispatch.py +30 -386
  59. package/latticeai/services/voice_capture.py +13 -107
  60. package/latticeai/tools/__init__.py +22 -49
  61. package/latticeai/tools/commands.py +0 -163
  62. package/latticeai/tools/computer.py +0 -39
  63. package/latticeai/tools/documents.py +1 -134
  64. package/latticeai/tools/filesystem.py +1 -247
  65. package/latticeai/tools/knowledge.py +1 -52
  66. package/latticeai/tools/local_files.py +0 -20
  67. package/latticeai/worker_app.py +75 -0
  68. package/package.json +2 -3
  69. package/requirements.txt +0 -5
  70. package/scripts/agent_eval.py +16 -28
  71. package/scripts/brain_quality_eval.py +20 -183
  72. package/scripts/bump_version.py +5 -5
  73. package/scripts/check_current_release_docs.mjs +7 -4
  74. package/scripts/check_openapi_drift.mjs +10 -0
  75. package/scripts/check_server_i18n.mjs +2 -18
  76. package/scripts/compose_openapi.py +377 -0
  77. package/scripts/export_openapi.py +32 -4
  78. package/scripts/gen_messages_catalog_fixture.py +302 -0
  79. package/scripts/gen_openapi_fragments.py +365 -0
  80. package/scripts/gen_redact_fixture.py +196 -0
  81. package/scripts/gen_worker_allowlist_fixture.py +115 -0
  82. package/scripts/generate_agent_parity_fixtures.py +33 -14
  83. package/scripts/openapi_route_families.json +2161 -0
  84. package/scripts/release_screen_claims.json +21 -0
  85. package/scripts/run_integration_tests.mjs +134 -29
  86. package/scripts/run_sidecar_e2e.mjs +104 -11
  87. package/scripts/wheel_smoke.py +32 -22
  88. package/src-tauri/Cargo.lock +375 -9
  89. package/src-tauri/Cargo.toml +1 -1
  90. package/src-tauri/src/backend.rs +151 -45
  91. package/src-tauri/src/main.rs +18 -18
  92. package/src-tauri/src/topology.rs +58 -88
  93. package/src-tauri/tauri.conf.json +1 -2
  94. package/static/app/asset-manifest.json +41 -41
  95. package/static/app/assets/{Act-DcQizkl1.js → Act-CToZnOHz.js} +1 -1
  96. package/static/app/assets/{AdminConsole-cf4npybT.js → AdminConsole-D5kbrBu8.js} +1 -1
  97. package/static/app/assets/{Brain-3VCSHFcn.js → Brain-C6zCdv4S.js} +1 -1
  98. package/static/app/assets/{BrainHome-Qm8eaztx.js → BrainHome-D4n3EDUt.js} +1 -1
  99. package/static/app/assets/{BrainSignals-DS9BtKOW.js → BrainSignals-CzeZ-vQ9.js} +1 -1
  100. package/static/app/assets/{Capture-DiQ219jW.js → Capture-DPcyTczq.js} +1 -1
  101. package/static/app/assets/{Chronicle-BGvuAchH.js → Chronicle-D3Nx-oWS.js} +1 -1
  102. package/static/app/assets/{CommandPalette-Bqhm0Urn.js → CommandPalette-DPPvpp28.js} +1 -1
  103. package/static/app/assets/{Library-BV6NnF0a.js → Library-Co2qTu3I.js} +1 -1
  104. package/static/app/assets/{LivingBrain-GzenJchP.js → LivingBrain-Bsmzwy8_.js} +1 -1
  105. package/static/app/assets/{ProductFlow-DEP6-vML.js → ProductFlow-CBLdmesT.js} +1 -1
  106. package/static/app/assets/{ReviewCard-CNZ7XjWG.js → ReviewCard-CfR6DLs7.js} +1 -1
  107. package/static/app/assets/{System-CieofHQa.js → System-Ce-P2YL6.js} +1 -1
  108. package/static/app/assets/arrow-left-DD5jFGHV.js +1 -0
  109. package/static/app/assets/{bot-B_K1Tdmw.js → bot-C5-XIww2.js} +1 -1
  110. package/static/app/assets/{brain-DWyaV1L1.js → brain-CFRJUvdX.js} +1 -1
  111. package/static/app/assets/{button-aTn4s84A.js → button-DI1KcQP-.js} +1 -1
  112. package/static/app/assets/circle-check-CY20XMCh.js +1 -0
  113. package/static/app/assets/{circle-pause-xKgeGXkT.js → circle-pause-C8HHyood.js} +1 -1
  114. package/static/app/assets/{circle-play-DkT6tYPX.js → circle-play-Cufc235E.js} +1 -1
  115. package/static/app/assets/{cpu-85xYObUC.js → cpu-DW2_JVsv.js} +1 -1
  116. package/static/app/assets/{download-B5Fm7YXo.js → download-gbdKTBb8.js} +1 -1
  117. package/static/app/assets/{folder-open-kk2Xa52u.js → folder-open-C9ydyX33.js} +1 -1
  118. package/static/app/assets/{hard-drive-DkA3zBW_.js → hard-drive-BxNMzBM3.js} +1 -1
  119. package/static/app/assets/index-BovSWRmQ.css +2 -0
  120. package/static/app/assets/{index-BMPdTmlY.js → index-q9XyDY7A.js} +3 -3
  121. package/static/app/assets/{input-B0nRf2jO.js → input-GLD94Y_K.js} +1 -1
  122. package/static/app/assets/{link-2-Dwb4gnTc.js → link-2-B4Y0gz1S.js} +1 -1
  123. package/static/app/assets/{permissionCopy-CQDUBrOZ.js → permissionCopy-CxrV0fvU.js} +1 -1
  124. package/static/app/assets/{primitives-SNp0LRJz.js → primitives-2ANdAsu2.js} +1 -1
  125. package/static/app/assets/search-DTxtjQ07.js +1 -0
  126. package/static/app/assets/{share-2-BsrxFglO.js → share-2-DxArfiuI.js} +1 -1
  127. package/static/app/assets/{shield-alert-5BStfp2_.js → shield-alert-CgftuFFs.js} +1 -1
  128. package/static/app/assets/{textarea-Cg8IUA-k.js → textarea-BHVBAoCr.js} +1 -1
  129. package/static/app/assets/{useFocusTrap-CYKvE46M.js → useFocusTrap-Dzq2j_OG.js} +1 -1
  130. package/static/app/assets/{useMutation-CSn9t1op.js → useMutation-BcqfMLNq.js} +1 -1
  131. package/static/app/assets/{useQuery-CY2OI2uy.js → useQuery-DBzLKCOv.js} +1 -1
  132. package/static/app/assets/{utils-Ddol2RWD.js → utils-B-Aah1bO.js} +1 -1
  133. package/static/app/assets/{workspace-BqDwOz_p.js → workspace-B6fFhoko.js} +1 -1
  134. package/static/app/index.html +4 -4
  135. package/static/sw.js +1 -1
  136. package/lattice_brain/archive.py +0 -522
  137. package/lattice_brain/context.py +0 -325
  138. package/lattice_brain/conversations.py +0 -382
  139. package/lattice_brain/core.py +0 -82
  140. package/lattice_brain/graph/_kg_contract.py +0 -249
  141. package/lattice_brain/graph/curator.py +0 -676
  142. package/lattice_brain/graph/discovery.py +0 -595
  143. package/lattice_brain/graph/discovery_index/__init__.py +0 -35
  144. package/lattice_brain/graph/discovery_index/cleanup.py +0 -182
  145. package/lattice_brain/graph/discovery_index/extract.py +0 -137
  146. package/lattice_brain/graph/discovery_index/scan.py +0 -411
  147. package/lattice_brain/graph/discovery_index/upsert.py +0 -495
  148. package/lattice_brain/graph/documents.py +0 -380
  149. package/lattice_brain/graph/fusion.py +0 -395
  150. package/lattice_brain/graph/identity.py +0 -175
  151. package/lattice_brain/graph/image_vectors.py +0 -230
  152. package/lattice_brain/graph/ingest.py +0 -829
  153. package/lattice_brain/graph/network.py +0 -205
  154. package/lattice_brain/graph/proactive.py +0 -724
  155. package/lattice_brain/graph/projection/__init__.py +0 -42
  156. package/lattice_brain/graph/projection/curation.py +0 -500
  157. package/lattice_brain/graph/projection/v2_schema.py +0 -518
  158. package/lattice_brain/graph/provenance.py +0 -524
  159. package/lattice_brain/graph/rerank.py +0 -163
  160. package/lattice_brain/graph/retrieval/__init__.py +0 -54
  161. package/lattice_brain/graph/retrieval/context.py +0 -197
  162. package/lattice_brain/graph/retrieval/graph_view.py +0 -319
  163. package/lattice_brain/graph/retrieval/hybrid.py +0 -488
  164. package/lattice_brain/graph/retrieval/maintenance.py +0 -121
  165. package/lattice_brain/graph/retrieval/signals.py +0 -95
  166. package/lattice_brain/graph/retrieval_docgen.py +0 -253
  167. package/lattice_brain/graph/retrieval_policy.py +0 -180
  168. package/lattice_brain/graph/retrieval_reads.py +0 -769
  169. package/lattice_brain/graph/retrieval_vector/__init__.py +0 -42
  170. package/lattice_brain/graph/retrieval_vector/fingerprint.py +0 -97
  171. package/lattice_brain/graph/retrieval_vector/indexing.py +0 -347
  172. package/lattice_brain/graph/retrieval_vector/search.py +0 -560
  173. package/lattice_brain/graph/retrieval_vector/status.py +0 -374
  174. package/lattice_brain/graph/schema.py +0 -792
  175. package/lattice_brain/graph/store.py +0 -268
  176. package/lattice_brain/graph/vector_index/__init__.py +0 -85
  177. package/lattice_brain/graph/vector_index/base.py +0 -167
  178. package/lattice_brain/graph/vector_index/brute_force.py +0 -110
  179. package/lattice_brain/graph/vector_index/hnsw.py +0 -290
  180. package/lattice_brain/graph/vector_index/jobs.py +0 -287
  181. package/lattice_brain/graph/vector_index/quantized.py +0 -148
  182. package/lattice_brain/graph/vector_index/selector.py +0 -161
  183. package/lattice_brain/graph/write_master.py +0 -308
  184. package/lattice_brain/ingestion/_contract.py +0 -90
  185. package/lattice_brain/ingestion/folder_scan.py +0 -57
  186. package/lattice_brain/ingestion/folders.py +0 -258
  187. package/lattice_brain/ingestion/jobs_api.py +0 -107
  188. package/lattice_brain/ingestion/routing.py +0 -295
  189. package/lattice_brain/ingestion_jobs.py +0 -380
  190. package/lattice_brain/memory.py +0 -75
  191. package/lattice_brain/portability/__init__.py +0 -90
  192. package/lattice_brain/portability/_contract.py +0 -42
  193. package/lattice_brain/portability/backups.py +0 -338
  194. package/lattice_brain/portability/bundles.py +0 -136
  195. package/lattice_brain/portability/constants.py +0 -93
  196. package/lattice_brain/portability/fsops.py +0 -138
  197. package/lattice_brain/portability/service.py +0 -41
  198. package/lattice_brain/portability/sharing.py +0 -710
  199. package/lattice_brain/quality.py +0 -543
  200. package/lattice_brain/retrieval_benchmark_fixtures.py +0 -92
  201. package/lattice_brain/runtime/agent_runtime.py +0 -859
  202. package/lattice_brain/runtime/contracts.py +0 -460
  203. package/lattice_brain/runtime/multi_agent.py +0 -942
  204. package/lattice_brain/runtime/statuses.py +0 -10
  205. package/lattice_brain/sealed_box.py +0 -240
  206. package/lattice_brain/self_model.py +0 -675
  207. package/lattice_brain/sensitivity.py +0 -94
  208. package/lattice_brain/storage/__init__.py +0 -22
  209. package/lattice_brain/storage/base.py +0 -100
  210. package/lattice_brain/storage/docker.py +0 -105
  211. package/lattice_brain/storage/factory.py +0 -31
  212. package/lattice_brain/storage/migration.py +0 -191
  213. package/lattice_brain/storage/postgres.py +0 -123
  214. package/lattice_brain/storage/sqlite.py +0 -143
  215. package/lattice_brain/synthesis.py +0 -824
  216. package/lattice_brain/workflow.py +0 -497
  217. package/latticeai/api/admin.py +0 -471
  218. package/latticeai/api/agent_registry.py +0 -105
  219. package/latticeai/api/agents.py +0 -228
  220. package/latticeai/api/auth.py +0 -383
  221. package/latticeai/api/automation_intelligence.py +0 -401
  222. package/latticeai/api/brain_intelligence.py +0 -199
  223. package/latticeai/api/browser.py +0 -493
  224. package/latticeai/api/change_proposals.py +0 -89
  225. package/latticeai/api/chat.py +0 -572
  226. package/latticeai/api/chat_agent_http.py +0 -892
  227. package/latticeai/api/chat_contracts.py +0 -73
  228. package/latticeai/api/chat_documents.py +0 -276
  229. package/latticeai/api/chat_helpers.py +0 -460
  230. package/latticeai/api/chat_history.py +0 -101
  231. package/latticeai/api/chat_hybrid.py +0 -113
  232. package/latticeai/api/chat_intents.py +0 -646
  233. package/latticeai/api/chat_stream.py +0 -216
  234. package/latticeai/api/chronicle.py +0 -63
  235. package/latticeai/api/command_center.py +0 -51
  236. package/latticeai/api/computer_use.py +0 -474
  237. package/latticeai/api/evidence_actions.py +0 -48
  238. package/latticeai/api/features.py +0 -70
  239. package/latticeai/api/funnel_metrics.py +0 -31
  240. package/latticeai/api/garden.py +0 -34
  241. package/latticeai/api/hooks.py +0 -165
  242. package/latticeai/api/index_jobs.py +0 -145
  243. package/latticeai/api/invitations.py +0 -100
  244. package/latticeai/api/knowledge_graph.py +0 -536
  245. package/latticeai/api/marketplace.py +0 -105
  246. package/latticeai/api/mcp.py +0 -482
  247. package/latticeai/api/memory.py +0 -270
  248. package/latticeai/api/network.py +0 -81
  249. package/latticeai/api/network_boundary.py +0 -225
  250. package/latticeai/api/permission_mode.py +0 -61
  251. package/latticeai/api/permissions.py +0 -436
  252. package/latticeai/api/plugins.py +0 -126
  253. package/latticeai/api/portability.py +0 -391
  254. package/latticeai/api/project_sessions.py +0 -114
  255. package/latticeai/api/realtime.py +0 -118
  256. package/latticeai/api/review_queue.py +0 -364
  257. package/latticeai/api/security_dashboard.py +0 -604
  258. package/latticeai/api/setup.py +0 -319
  259. package/latticeai/api/static_routes.py +0 -354
  260. package/latticeai/api/ui_redirects.py +0 -26
  261. package/latticeai/api/workflow_designer.py +0 -394
  262. package/latticeai/api/workspace.py +0 -856
  263. package/latticeai/api/workspace_scope.py +0 -125
  264. package/latticeai/core/agent/__init__.py +0 -93
  265. package/latticeai/core/agent/_contract.py +0 -79
  266. package/latticeai/core/agent/context.py +0 -57
  267. package/latticeai/core/agent/deps.py +0 -125
  268. package/latticeai/core/agent/execution.py +0 -622
  269. package/latticeai/core/agent/planning.py +0 -145
  270. package/latticeai/core/agent/recovery.py +0 -157
  271. package/latticeai/core/agent/runtime.py +0 -210
  272. package/latticeai/core/agent/verification.py +0 -231
  273. package/latticeai/core/agent_eval.py +0 -739
  274. package/latticeai/core/agent_helpers.py +0 -493
  275. package/latticeai/core/agent_profiles.py +0 -110
  276. package/latticeai/core/agent_prompts.py +0 -171
  277. package/latticeai/core/agent_registry.py +0 -232
  278. package/latticeai/core/agent_state.py +0 -41
  279. package/latticeai/core/agent_trace.py +0 -104
  280. package/latticeai/core/artifact_ledger.py +0 -109
  281. package/latticeai/core/audit.py +0 -260
  282. package/latticeai/core/builtin_hooks.py +0 -105
  283. package/latticeai/core/context_builder.py +0 -394
  284. package/latticeai/core/document_generator.py +0 -103
  285. package/latticeai/core/enterprise.py +0 -154
  286. package/latticeai/core/enterprise_admin.py +0 -158
  287. package/latticeai/core/file_generation/__init__.py +0 -115
  288. package/latticeai/core/file_generation/bundles.py +0 -76
  289. package/latticeai/core/file_generation/extraction.py +0 -154
  290. package/latticeai/core/file_generation/inference.py +0 -235
  291. package/latticeai/core/file_generation/orchestration.py +0 -152
  292. package/latticeai/core/file_generation/prompting.py +0 -117
  293. package/latticeai/core/file_generation/repair.py +0 -114
  294. package/latticeai/core/file_generation/sanitize.py +0 -61
  295. package/latticeai/core/file_generation/validation.py +0 -201
  296. package/latticeai/core/invitations.py +0 -132
  297. package/latticeai/core/legacy_compatibility.py +0 -243
  298. package/latticeai/core/logging_safety.py +0 -46
  299. package/latticeai/core/marketplace.py +0 -293
  300. package/latticeai/core/mcp_catalog.py +0 -452
  301. package/latticeai/core/mcp_registry.py +0 -506
  302. package/latticeai/core/network_boundary.py +0 -168
  303. package/latticeai/core/oidc.py +0 -208
  304. package/latticeai/core/plugins.py +0 -432
  305. package/latticeai/core/product_hardening.py +0 -218
  306. package/latticeai/core/project_sessions.py +0 -337
  307. package/latticeai/core/realtime.py +0 -238
  308. package/latticeai/core/run_explain.py +0 -426
  309. package/latticeai/core/run_store.py +0 -252
  310. package/latticeai/core/timezones.py +0 -80
  311. package/latticeai/core/workspace_computer_memory.py +0 -84
  312. package/latticeai/core/workspace_graph_trace.py +0 -155
  313. package/latticeai/core/workspace_indexing.py +0 -102
  314. package/latticeai/core/workspace_memory.py +0 -77
  315. package/latticeai/core/workspace_onboarding.py +0 -104
  316. package/latticeai/core/workspace_os.py +0 -978
  317. package/latticeai/core/workspace_os_constants.py +0 -126
  318. package/latticeai/core/workspace_os_state.py +0 -180
  319. package/latticeai/core/workspace_os_utils.py +0 -103
  320. package/latticeai/core/workspace_permissions.py +0 -101
  321. package/latticeai/core/workspace_plugins.py +0 -97
  322. package/latticeai/core/workspace_relationships.py +0 -99
  323. package/latticeai/core/workspace_reorganization.py +0 -335
  324. package/latticeai/core/workspace_review_items.py +0 -112
  325. package/latticeai/core/workspace_runs.py +0 -726
  326. package/latticeai/core/workspace_skills.py +0 -109
  327. package/latticeai/core/workspace_snapshots.py +0 -198
  328. package/latticeai/core/workspace_timeline.py +0 -110
  329. package/latticeai/integrations/__init__.py +0 -0
  330. package/latticeai/integrations/telegram_bot/__init__.py +0 -123
  331. package/latticeai/integrations/telegram_bot/__main__.py +0 -17
  332. package/latticeai/integrations/telegram_bot/config.py +0 -86
  333. package/latticeai/integrations/telegram_bot/dispatch.py +0 -311
  334. package/latticeai/integrations/telegram_bot/flows.py +0 -478
  335. package/latticeai/integrations/telegram_bot/helpers.py +0 -322
  336. package/latticeai/integrations/telegram_bot/screens.py +0 -394
  337. package/latticeai/runtime/audit_runtime.py +0 -76
  338. package/latticeai/runtime/automation_runtime.py +0 -81
  339. package/latticeai/runtime/chat_wiring.py +0 -141
  340. package/latticeai/runtime/context_runtime.py +0 -66
  341. package/latticeai/runtime/feature_toggle_wiring.py +0 -157
  342. package/latticeai/runtime/history_runtime.py +0 -163
  343. package/latticeai/runtime/history_writer.py +0 -138
  344. package/latticeai/runtime/hooks_runtime.py +0 -77
  345. package/latticeai/runtime/model_wiring.py +0 -68
  346. package/latticeai/runtime/namespace_runtime.py +0 -163
  347. package/latticeai/runtime/network_boundary_wiring.py +0 -117
  348. package/latticeai/runtime/network_config_runtime.py +0 -56
  349. package/latticeai/runtime/permission_mode_wiring.py +0 -112
  350. package/latticeai/runtime/persistence_runtime.py +0 -159
  351. package/latticeai/runtime/platform_runtime_wiring.py +0 -89
  352. package/latticeai/runtime/review_wiring.py +0 -42
  353. package/latticeai/runtime/router_registration.py +0 -693
  354. package/latticeai/runtime/service_singletons.py +0 -55
  355. package/latticeai/runtime/sso_config_runtime.py +0 -128
  356. package/latticeai/runtime/user_key_runtime.py +0 -106
  357. package/latticeai/runtime/web_runtime.py +0 -92
  358. package/latticeai/server_app.py +0 -51
  359. package/latticeai/services/app_context.py +0 -130
  360. package/latticeai/services/automation_execution.py +0 -266
  361. package/latticeai/services/automation_intelligence.py +0 -614
  362. package/latticeai/services/brain_automation.py +0 -191
  363. package/latticeai/services/brain_intelligence/__init__.py +0 -58
  364. package/latticeai/services/brain_intelligence/_contract.py +0 -71
  365. package/latticeai/services/brain_intelligence/consistency.py +0 -193
  366. package/latticeai/services/brain_intelligence/constants.py +0 -47
  367. package/latticeai/services/brain_intelligence/digest.py +0 -258
  368. package/latticeai/services/brain_intelligence/health.py +0 -331
  369. package/latticeai/services/brain_intelligence/proposals.py +0 -259
  370. package/latticeai/services/brain_intelligence/sampling.py +0 -84
  371. package/latticeai/services/brain_intelligence/service.py +0 -48
  372. package/latticeai/services/change_proposals.py +0 -471
  373. package/latticeai/services/chat_service.py +0 -243
  374. package/latticeai/services/chronicle.py +0 -555
  375. package/latticeai/services/cloud_egress_audit.py +0 -85
  376. package/latticeai/services/cloud_extraction.py +0 -129
  377. package/latticeai/services/cloud_streaming.py +0 -268
  378. package/latticeai/services/cloud_token_guard.py +0 -84
  379. package/latticeai/services/command_center.py +0 -548
  380. package/latticeai/services/evidence_actions.py +0 -258
  381. package/latticeai/services/feature_toggles.py +0 -502
  382. package/latticeai/services/folder_watch.py +0 -520
  383. package/latticeai/services/funnel_metrics.py +0 -307
  384. package/latticeai/services/hybrid_chat.py +0 -316
  385. package/latticeai/services/hybrid_context.py +0 -228
  386. package/latticeai/services/hybrid_policy.py +0 -129
  387. package/latticeai/services/interop_bridges.py +0 -978
  388. package/latticeai/services/local_knowledge.py +0 -465
  389. package/latticeai/services/memory_service/__init__.py +0 -52
  390. package/latticeai/services/memory_service/_contract.py +0 -100
  391. package/latticeai/services/memory_service/brief.py +0 -431
  392. package/latticeai/services/memory_service/constants.py +0 -57
  393. package/latticeai/services/memory_service/maintenance.py +0 -138
  394. package/latticeai/services/memory_service/manager.py +0 -186
  395. package/latticeai/services/memory_service/proof.py +0 -136
  396. package/latticeai/services/memory_service/recall.py +0 -225
  397. package/latticeai/services/memory_service/service.py +0 -48
  398. package/latticeai/services/memory_service/stores.py +0 -110
  399. package/latticeai/services/mode_store.py +0 -132
  400. package/latticeai/services/model_recommendation.py +0 -224
  401. package/latticeai/services/model_runtime/cloud.py +0 -87
  402. package/latticeai/services/network_boundary_service.py +0 -117
  403. package/latticeai/services/obsidian_bridge.py +0 -609
  404. package/latticeai/services/openai_compatible_adapter.py +0 -101
  405. package/latticeai/services/permission_mode_service.py +0 -122
  406. package/latticeai/services/platform_runtime.py +0 -366
  407. package/latticeai/services/review_queue.py +0 -380
  408. package/latticeai/services/router_context.py +0 -59
  409. package/latticeai/services/run_executor.py +0 -387
  410. package/latticeai/services/self_model_service.py +0 -171
  411. package/latticeai/services/setup_detection.py +0 -147
  412. package/latticeai/services/triggers.py +0 -378
  413. package/latticeai/services/upload_service.py +0 -172
  414. package/latticeai/services/workspace_service.py +0 -165
  415. package/latticeai/setup/__init__.py +0 -25
  416. package/latticeai/setup/auto_setup.py +0 -846
  417. package/latticeai/setup/demo_corpus.py +0 -98
  418. package/latticeai/setup/wizard/__init__.py +0 -126
  419. package/latticeai/setup/wizard/catalog.py +0 -175
  420. package/latticeai/setup/wizard/detect.py +0 -302
  421. package/latticeai/setup/wizard/install.py +0 -348
  422. package/latticeai/setup/wizard/paths.py +0 -165
  423. package/latticeai/setup/wizard/plans.py +0 -74
  424. package/latticeai/setup/wizard/recommend.py +0 -320
  425. package/scripts/bench_agent_smoke.py +0 -409
  426. package/scripts/bench_models.py +0 -540
  427. package/scripts/bench_vector_index.py +0 -295
  428. package/scripts/funnel_soft_gate.py +0 -192
  429. package/scripts/generate_agent_loop_fixtures.py +0 -994
  430. package/scripts/generate_rust_parity_fixtures.py +0 -908
  431. package/scripts/migrate_brain_storage.py +0 -57
  432. package/scripts/parity_fixture_corpus_context.py +0 -162
  433. package/scripts/parity_fixture_corpus_docgen.py +0 -341
  434. package/scripts/profile_kg.py +0 -355
  435. package/server.py +0 -30
  436. package/static/app/assets/arrow-left-kfsrk0mv.js +0 -1
  437. package/static/app/assets/circle-check-qqLug9nU.js +0 -1
  438. package/static/app/assets/index-DxmOfNRi.css +0 -2
  439. 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 ""