minder-cli 0.4.9__tar.gz → 0.5.1__tar.gz
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.
- {minder_cli-0.4.9 → minder_cli-0.5.1}/PKG-INFO +7 -11
- {minder_cli-0.4.9 → minder_cli-0.5.1}/README.md +5 -8
- {minder_cli-0.4.9 → minder_cli-0.5.1}/pyproject.toml +2 -3
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/application/admin/use_cases.py +3 -5
- minder_cli-0.5.1/src/minder/bootstrap/agent_seeder.py +25 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/bootstrap/transport.py +119 -45
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/config.py +8 -10
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/continuity.py +4 -4
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/embedding/local.py +53 -33
- minder_cli-0.5.1/src/minder/graph/executor.py +247 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/graph/graph.py +2 -2
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/learning/error_learner.py +1 -1
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/learning/quality_optimizer.py +1 -1
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/learning/skill_synthesizer.py +1 -1
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/llm/__init__.py +2 -2
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/llm/factory.py +7 -10
- minder_cli-0.5.1/src/minder/llm/llama_cpp_llm.py +257 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/models/__init__.py +5 -0
- minder_cli-0.5.1/src/minder/models/agent.py +47 -0
- minder_cli-0.5.1/src/minder/presentation/cli/commands/agent.py +339 -0
- minder_cli-0.5.1/src/minder/presentation/http/admin/agents.py +114 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/presentation/http/admin/context.py +2 -2
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/presentation/http/admin/memories.py +5 -9
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/presentation/http/admin/routes.py +2 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/presentation/http/admin/search.py +3 -7
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/presentation/http/admin/skills.py +2 -7
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/prompts/formatter.py +1 -1
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/resources/__init__.py +1 -1
- minder_cli-0.5.1/src/minder/runtime.py +66 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/server.py +13 -22
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/store/interfaces.py +29 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/store/mongodb/indexes.py +6 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/store/mongodb/operational_store.py +94 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/store/relational.py +106 -1
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/tools/__init__.py +0 -3
- minder_cli-0.5.1/src/minder/tools/agents.py +104 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/tools/memory.py +8 -10
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/tools/query.py +2 -2
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/tools/registry.py +34 -15
- minder_cli-0.5.1/src/minder/tools/seeds/__init__.py +0 -0
- minder_cli-0.5.1/src/minder/tools/seeds/default_agents.py +108 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/tools/skills.py +14 -21
- minder_cli-0.4.9/src/minder/graph/executor.py +0 -138
- minder_cli-0.4.9/src/minder/llm/litert.py +0 -331
- minder_cli-0.4.9/src/minder/presentation/cli/commands/agent.py +0 -418
- minder_cli-0.4.9/src/minder/runtime.py +0 -15
- minder_cli-0.4.9/src/minder/tools/search.py +0 -15
- {minder_cli-0.4.9 → minder_cli-0.5.1}/.gitignore +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/LICENSE +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/README-pypi.md +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/__init__.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/api/routers/prompts.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/application/__init__.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/application/admin/__init__.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/application/admin/dto.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/application/admin/jobs.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/auth/__init__.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/auth/context.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/auth/middleware.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/auth/principal.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/auth/rate_limiter.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/auth/rbac.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/auth/service.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/bootstrap/__init__.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/bootstrap/providers.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/cache/__init__.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/cache/providers.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/chunking/__init__.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/chunking/code_splitter.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/chunking/splitter.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/cli.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/context_compactor.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/dev.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/embedding/__init__.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/embedding/base.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/embedding/openai.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/graph/__init__.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/graph/edges.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/graph/nodes/__init__.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/graph/nodes/clarification.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/graph/nodes/evaluator.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/graph/nodes/guard.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/graph/nodes/llm.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/graph/nodes/planning.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/graph/nodes/reasoning.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/graph/nodes/reflection.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/graph/nodes/reranker.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/graph/nodes/retriever.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/graph/nodes/verification.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/graph/nodes/workflow_planner.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/graph/runtime.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/graph/state.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/learning/__init__.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/learning/pattern_extractor.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/llm/base.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/llm/openai.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/models/base.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/models/client.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/models/document.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/models/error.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/models/graph.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/models/history.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/models/job.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/models/prompt.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/models/repository.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/models/rule.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/models/session.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/models/skill.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/models/user.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/models/workflow.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/observability/__init__.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/observability/audit.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/observability/logging.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/observability/metrics.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/observability/tracing.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/presentation/__init__.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/presentation/cli/__init__.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/presentation/cli/commands/auth.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/presentation/cli/commands/ide.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/presentation/cli/commands/mcp.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/presentation/cli/commands/sync.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/presentation/cli/commands/update.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/presentation/cli/main.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/presentation/cli/utils/common.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/presentation/cli/utils/config.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/presentation/cli/utils/git.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/presentation/cli/utils/version.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/presentation/http/__init__.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/presentation/http/admin/__init__.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/presentation/http/admin/api.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/presentation/http/admin/dashboard.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/presentation/http/admin/jobs.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/presentation/http/admin/prompts.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/presentation/http/admin/runtime.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/prompts/__init__.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/retrieval/__init__.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/retrieval/hybrid.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/retrieval/mmr.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/retrieval/multi_hop.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/store/__init__.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/store/document.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/store/error.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/store/feedback.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/store/graph.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/store/history.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/store/milvus/__init__.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/store/milvus/client.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/store/milvus/collections.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/store/milvus/vector_store.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/store/mongodb/__init__.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/store/mongodb/client.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/store/mongodb/graph_store.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/store/repo_state.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/store/rule.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/store/vector.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/tools/auth.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/tools/graph.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/tools/ingest.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/tools/repo_scanner.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/tools/session.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/tools/workflow.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/transport/__init__.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/transport/base.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/transport/sse.py +0 -0
- {minder_cli-0.4.9 → minder_cli-0.5.1}/src/minder/transport/stdio.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: minder-cli
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.5.1
|
|
4
4
|
Summary: Minder CLI is the command-line interface for the Minder self-hosted MCP platform.
|
|
5
5
|
Project-URL: Homepage, https://github.com/hiimtrung/minder
|
|
6
6
|
Project-URL: Repository, https://github.com/hiimtrung/minder
|
|
@@ -19,10 +19,9 @@ Requires-Dist: fastapi>=0.136.0
|
|
|
19
19
|
Requires-Dist: httpx>=0.28.0
|
|
20
20
|
Provides-Extra: server
|
|
21
21
|
Requires-Dist: aiosqlite>=0.21.0; extra == 'server'
|
|
22
|
-
Requires-Dist: fastembed>=0.5.1; extra == 'server'
|
|
23
22
|
Requires-Dist: langgraph>=1.1.8; extra == 'server'
|
|
24
23
|
Requires-Dist: litellm>=1.83.1; extra == 'server'
|
|
25
|
-
Requires-Dist:
|
|
24
|
+
Requires-Dist: llama-cpp-python>=0.3.7; extra == 'server'
|
|
26
25
|
Requires-Dist: mcp>=1.26.0; extra == 'server'
|
|
27
26
|
Requires-Dist: motor>=3.7.0; extra == 'server'
|
|
28
27
|
Requires-Dist: passlib[bcrypt]>=1.7.4; extra == 'server'
|
|
@@ -67,25 +66,22 @@ Developer → minder-cli → Minder Server ←→ AI agents (Codex / Copilot / C
|
|
|
67
66
|
│
|
|
68
67
|
┌─────┴──────┐
|
|
69
68
|
│ │
|
|
70
|
-
|
|
69
|
+
llama.cpp llama.cpp
|
|
71
70
|
(LLM gen) (embedding)
|
|
72
71
|
```
|
|
73
72
|
|
|
74
|
-
- **LLM inference**:
|
|
75
|
-
- **Embedding inference**:
|
|
73
|
+
- **LLM inference**: llama-cpp-python — GGUF models auto-downloaded from HuggingFace, hardware-accelerated (Metal on Mac, CPU elsewhere)
|
|
74
|
+
- **Embedding inference**: llama-cpp-python — dedicated GGUF embedding model, in-process, no HTTP overhead
|
|
76
75
|
|
|
77
76
|
## Quick Start
|
|
78
77
|
|
|
79
78
|
### Run the server
|
|
80
79
|
|
|
81
80
|
```bash
|
|
82
|
-
# 1.
|
|
83
|
-
./scripts/download_models.sh
|
|
84
|
-
|
|
85
|
-
# 2. Start infra (MongoDB + Redis + Milvus)
|
|
81
|
+
# 1. Start infra (MongoDB + Redis + Milvus)
|
|
86
82
|
docker compose -f docker/docker-compose.local.yml up -d
|
|
87
83
|
|
|
88
|
-
#
|
|
84
|
+
# 2. Run Minder Server (GGUF models auto-download on first start)
|
|
89
85
|
uv run python -m minder.server
|
|
90
86
|
```
|
|
91
87
|
|
|
@@ -27,25 +27,22 @@ Developer → minder-cli → Minder Server ←→ AI agents (Codex / Copilot / C
|
|
|
27
27
|
│
|
|
28
28
|
┌─────┴──────┐
|
|
29
29
|
│ │
|
|
30
|
-
|
|
30
|
+
llama.cpp llama.cpp
|
|
31
31
|
(LLM gen) (embedding)
|
|
32
32
|
```
|
|
33
33
|
|
|
34
|
-
- **LLM inference**:
|
|
35
|
-
- **Embedding inference**:
|
|
34
|
+
- **LLM inference**: llama-cpp-python — GGUF models auto-downloaded from HuggingFace, hardware-accelerated (Metal on Mac, CPU elsewhere)
|
|
35
|
+
- **Embedding inference**: llama-cpp-python — dedicated GGUF embedding model, in-process, no HTTP overhead
|
|
36
36
|
|
|
37
37
|
## Quick Start
|
|
38
38
|
|
|
39
39
|
### Run the server
|
|
40
40
|
|
|
41
41
|
```bash
|
|
42
|
-
# 1.
|
|
43
|
-
./scripts/download_models.sh
|
|
44
|
-
|
|
45
|
-
# 2. Start infra (MongoDB + Redis + Milvus)
|
|
42
|
+
# 1. Start infra (MongoDB + Redis + Milvus)
|
|
46
43
|
docker compose -f docker/docker-compose.local.yml up -d
|
|
47
44
|
|
|
48
|
-
#
|
|
45
|
+
# 2. Run Minder Server (GGUF models auto-download on first start)
|
|
49
46
|
uv run python -m minder.server
|
|
50
47
|
```
|
|
51
48
|
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "minder-cli"
|
|
7
|
-
version = "0.
|
|
7
|
+
version = "0.5.1"
|
|
8
8
|
description = "Minder CLI is the command-line interface for the Minder self-hosted MCP platform."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.14"
|
|
@@ -26,10 +26,9 @@ dependencies = [
|
|
|
26
26
|
[project.optional-dependencies]
|
|
27
27
|
server = [
|
|
28
28
|
"aiosqlite>=0.21.0",
|
|
29
|
-
"fastembed>=0.5.1",
|
|
30
29
|
"langgraph>=1.1.8",
|
|
31
30
|
"litellm>=1.83.1",
|
|
32
|
-
"
|
|
31
|
+
"llama-cpp-python>=0.3.7",
|
|
33
32
|
"mcp>=1.26.0",
|
|
34
33
|
"motor>=3.7.0",
|
|
35
34
|
"passlib[bcrypt]>=1.7.4",
|
|
@@ -66,21 +66,19 @@ _UNSET: Any = object() # sentinel for optional update fields
|
|
|
66
66
|
DASHBOARD_TOOL_SCOPE_OPTIONS = [tool.name for tool in SCOPEABLE_TOOLS]
|
|
67
67
|
|
|
68
68
|
DASHBOARD_TOOL_SCOPE_PRESETS: dict[str, list[str]] = {
|
|
69
|
-
"Query Only": ["
|
|
69
|
+
"Query Only": ["minder_search_code", "minder_search_errors", "minder_memory_recall"],
|
|
70
70
|
"Read Only": [
|
|
71
|
-
"minder_query",
|
|
72
71
|
"minder_search_code",
|
|
73
72
|
"minder_search_errors",
|
|
74
|
-
"minder_search",
|
|
75
73
|
"minder_memory_recall",
|
|
74
|
+
"minder_skill_recall",
|
|
76
75
|
"minder_workflow_get",
|
|
77
76
|
],
|
|
78
77
|
"Full Dev Assistant": [
|
|
79
|
-
"minder_query",
|
|
80
78
|
"minder_search_code",
|
|
81
79
|
"minder_search_errors",
|
|
82
|
-
"minder_search",
|
|
83
80
|
"minder_memory_recall",
|
|
81
|
+
"minder_skill_recall",
|
|
84
82
|
"minder_workflow_get",
|
|
85
83
|
"minder_workflow_step",
|
|
86
84
|
],
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"""Seed default SubAgent definitions on first startup."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import logging
|
|
6
|
+
|
|
7
|
+
from minder.store.interfaces import IOperationalStore
|
|
8
|
+
from minder.tools.seeds.default_agents import DEFAULT_AGENTS
|
|
9
|
+
|
|
10
|
+
logger = logging.getLogger(__name__)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
async def seed_default_agents(store: IOperationalStore) -> None:
|
|
14
|
+
"""Insert default agents only if they do not already exist.
|
|
15
|
+
|
|
16
|
+
Never overwrites user-modified defaults — guards by name existence check.
|
|
17
|
+
"""
|
|
18
|
+
for defn in DEFAULT_AGENTS:
|
|
19
|
+
name = defn["name"]
|
|
20
|
+
existing = await store.get_agent_by_name(name)
|
|
21
|
+
if existing is not None:
|
|
22
|
+
logger.debug("SubAgent %r already exists, skipping seed", name)
|
|
23
|
+
continue
|
|
24
|
+
await store.create_agent(**defn)
|
|
25
|
+
logger.info("Seeded default SubAgent: %r", name)
|
|
@@ -19,12 +19,12 @@ from minder.store.interfaces import (
|
|
|
19
19
|
IVectorStore,
|
|
20
20
|
)
|
|
21
21
|
from minder.store.repo_state import RepoStateStore
|
|
22
|
+
from minder.tools.agents import AgentTools
|
|
22
23
|
from minder.tools.auth import AuthTools
|
|
23
24
|
from minder.tools.graph import GraphTools
|
|
24
25
|
from minder.tools.memory import MemoryTools
|
|
25
26
|
from minder.tools.query import QueryTools
|
|
26
27
|
from minder.tools.registry import TOOL_DESCRIPTIONS
|
|
27
|
-
from minder.tools.search import SearchTools
|
|
28
28
|
from minder.tools.session import SessionTools
|
|
29
29
|
from minder.tools.skills import SkillTools
|
|
30
30
|
from minder.tools.workflow import WorkflowTools
|
|
@@ -42,12 +42,12 @@ def build_transport(
|
|
|
42
42
|
auth_service = AuthService(store, config, cache=cache)
|
|
43
43
|
cache_provider = cache or LRUCacheProvider()
|
|
44
44
|
repo_state_store = RepoStateStore(config.workflow.repo_state_dir)
|
|
45
|
+
agent_tools = AgentTools(store)
|
|
45
46
|
auth_tools = AuthTools(store, auth_service)
|
|
46
47
|
session_tools = SessionTools(store)
|
|
47
48
|
workflow_tools = WorkflowTools(store, repo_state_store)
|
|
48
49
|
memory_tools = MemoryTools(store, config)
|
|
49
50
|
skill_tools = SkillTools(store, config)
|
|
50
|
-
search_tools = SearchTools(store, config)
|
|
51
51
|
graph_tools = GraphTools(graph_store, store)
|
|
52
52
|
query_tools = QueryTools(
|
|
53
53
|
store,
|
|
@@ -518,37 +518,6 @@ def build_transport(
|
|
|
518
518
|
excerpt_kind=excerpt_kind,
|
|
519
519
|
)
|
|
520
520
|
|
|
521
|
-
async def minder_search(
|
|
522
|
-
*, user=None, query: str, limit: int = 5
|
|
523
|
-
) -> list[dict[str, Any]]: # noqa: ANN001
|
|
524
|
-
del user
|
|
525
|
-
return await search_tools.minder_search(query, limit=limit)
|
|
526
|
-
|
|
527
|
-
async def minder_query(
|
|
528
|
-
*,
|
|
529
|
-
user=None,
|
|
530
|
-
principal: Principal | None = None,
|
|
531
|
-
query: str,
|
|
532
|
-
repo_path: str,
|
|
533
|
-
session_id: str | None = None,
|
|
534
|
-
repo_id: str | None = None,
|
|
535
|
-
workflow_name: str | None = None,
|
|
536
|
-
) -> dict[str, Any]: # noqa: ANN001
|
|
537
|
-
if user is None and principal is None:
|
|
538
|
-
raise AuthError("AUTH_MISSING_TOKEN", "Authenticated principal required")
|
|
539
|
-
ensure_client_repo_access(principal, repo_path=repo_path)
|
|
540
|
-
return await query_tools.minder_query(
|
|
541
|
-
query,
|
|
542
|
-
repo_path=repo_path,
|
|
543
|
-
session_id=uuid.UUID(session_id) if session_id else None,
|
|
544
|
-
user_id=user.id if user else None,
|
|
545
|
-
repo_id=uuid.UUID(repo_id) if repo_id else None,
|
|
546
|
-
workflow_name=workflow_name,
|
|
547
|
-
allowed_repo_scopes=(
|
|
548
|
-
principal.repo_scope if isinstance(principal, ClientPrincipal) else None
|
|
549
|
-
),
|
|
550
|
-
)
|
|
551
|
-
|
|
552
521
|
async def minder_search_code(
|
|
553
522
|
*,
|
|
554
523
|
user=None,
|
|
@@ -801,18 +770,6 @@ def build_transport(
|
|
|
801
770
|
require_auth=True,
|
|
802
771
|
description=TOOL_DESCRIPTIONS["minder_skill_import_git"],
|
|
803
772
|
)
|
|
804
|
-
transport.register_tool(
|
|
805
|
-
"minder_search",
|
|
806
|
-
minder_search,
|
|
807
|
-
require_auth=True,
|
|
808
|
-
description=TOOL_DESCRIPTIONS["minder_search"],
|
|
809
|
-
)
|
|
810
|
-
transport.register_tool(
|
|
811
|
-
"minder_query",
|
|
812
|
-
minder_query,
|
|
813
|
-
require_auth=True,
|
|
814
|
-
description=TOOL_DESCRIPTIONS["minder_query"],
|
|
815
|
-
)
|
|
816
773
|
transport.register_tool(
|
|
817
774
|
"minder_search_code",
|
|
818
775
|
minder_search_code,
|
|
@@ -838,6 +795,123 @@ def build_transport(
|
|
|
838
795
|
description=TOOL_DESCRIPTIONS["minder_find_impact"],
|
|
839
796
|
)
|
|
840
797
|
|
|
798
|
+
async def minder_agent_list(
|
|
799
|
+
*,
|
|
800
|
+
user=None, # noqa: ANN001
|
|
801
|
+
workflow_step: str | None = None,
|
|
802
|
+
tag: str | None = None,
|
|
803
|
+
is_default: bool | None = None,
|
|
804
|
+
) -> list[dict[str, Any]]:
|
|
805
|
+
del user
|
|
806
|
+
return await agent_tools.minder_agent_list(
|
|
807
|
+
workflow_step=workflow_step,
|
|
808
|
+
tag=tag,
|
|
809
|
+
is_default=is_default,
|
|
810
|
+
)
|
|
811
|
+
|
|
812
|
+
async def minder_agent_get(
|
|
813
|
+
*,
|
|
814
|
+
user=None, # noqa: ANN001
|
|
815
|
+
name: str,
|
|
816
|
+
) -> dict[str, Any] | None:
|
|
817
|
+
del user
|
|
818
|
+
return await agent_tools.minder_agent_get(name)
|
|
819
|
+
|
|
820
|
+
async def minder_agent_store(
|
|
821
|
+
*,
|
|
822
|
+
user=None, # noqa: ANN001
|
|
823
|
+
name: str,
|
|
824
|
+
title: str,
|
|
825
|
+
description: str,
|
|
826
|
+
system_prompt: str,
|
|
827
|
+
tools: list[str] | None = None,
|
|
828
|
+
workflow_steps: list[str] | None = None,
|
|
829
|
+
artifact_types: list[str] | None = None,
|
|
830
|
+
tags: list[str] | None = None,
|
|
831
|
+
is_default: bool = False,
|
|
832
|
+
) -> dict[str, Any]:
|
|
833
|
+
del user
|
|
834
|
+
return await agent_tools.minder_agent_store(
|
|
835
|
+
name,
|
|
836
|
+
title=title,
|
|
837
|
+
description=description,
|
|
838
|
+
system_prompt=system_prompt,
|
|
839
|
+
tools=tools,
|
|
840
|
+
workflow_steps=workflow_steps,
|
|
841
|
+
artifact_types=artifact_types,
|
|
842
|
+
tags=tags,
|
|
843
|
+
is_default=is_default,
|
|
844
|
+
)
|
|
845
|
+
|
|
846
|
+
async def minder_agent_update(
|
|
847
|
+
*,
|
|
848
|
+
user=None, # noqa: ANN001
|
|
849
|
+
name: str,
|
|
850
|
+
title: str | None = None,
|
|
851
|
+
description: str | None = None,
|
|
852
|
+
system_prompt: str | None = None,
|
|
853
|
+
tools: list[str] | None = None,
|
|
854
|
+
workflow_steps: list[str] | None = None,
|
|
855
|
+
artifact_types: list[str] | None = None,
|
|
856
|
+
tags: list[str] | None = None,
|
|
857
|
+
is_default: bool | None = None,
|
|
858
|
+
) -> dict[str, Any] | None:
|
|
859
|
+
del user
|
|
860
|
+
kwargs = {
|
|
861
|
+
k: v
|
|
862
|
+
for k, v in {
|
|
863
|
+
"title": title,
|
|
864
|
+
"description": description,
|
|
865
|
+
"system_prompt": system_prompt,
|
|
866
|
+
"tools": tools,
|
|
867
|
+
"workflow_steps": workflow_steps,
|
|
868
|
+
"artifact_types": artifact_types,
|
|
869
|
+
"tags": tags,
|
|
870
|
+
"is_default": is_default,
|
|
871
|
+
}.items()
|
|
872
|
+
if v is not None
|
|
873
|
+
}
|
|
874
|
+
return await agent_tools.minder_agent_update(name, **kwargs)
|
|
875
|
+
|
|
876
|
+
async def minder_agent_delete(
|
|
877
|
+
*,
|
|
878
|
+
user=None, # noqa: ANN001
|
|
879
|
+
name: str,
|
|
880
|
+
) -> dict[str, Any]:
|
|
881
|
+
del user
|
|
882
|
+
return await agent_tools.minder_agent_delete(name)
|
|
883
|
+
|
|
884
|
+
transport.register_tool(
|
|
885
|
+
"minder_agent_list",
|
|
886
|
+
minder_agent_list,
|
|
887
|
+
require_auth=True,
|
|
888
|
+
description=TOOL_DESCRIPTIONS["minder_agent_list"],
|
|
889
|
+
)
|
|
890
|
+
transport.register_tool(
|
|
891
|
+
"minder_agent_get",
|
|
892
|
+
minder_agent_get,
|
|
893
|
+
require_auth=True,
|
|
894
|
+
description=TOOL_DESCRIPTIONS["minder_agent_get"],
|
|
895
|
+
)
|
|
896
|
+
transport.register_tool(
|
|
897
|
+
"minder_agent_store",
|
|
898
|
+
minder_agent_store,
|
|
899
|
+
require_auth=True,
|
|
900
|
+
description=TOOL_DESCRIPTIONS["minder_agent_store"],
|
|
901
|
+
)
|
|
902
|
+
transport.register_tool(
|
|
903
|
+
"minder_agent_update",
|
|
904
|
+
minder_agent_update,
|
|
905
|
+
require_auth=True,
|
|
906
|
+
description=TOOL_DESCRIPTIONS["minder_agent_update"],
|
|
907
|
+
)
|
|
908
|
+
transport.register_tool(
|
|
909
|
+
"minder_agent_delete",
|
|
910
|
+
minder_agent_delete,
|
|
911
|
+
require_auth=True,
|
|
912
|
+
description=TOOL_DESCRIPTIONS["minder_agent_delete"],
|
|
913
|
+
)
|
|
914
|
+
|
|
841
915
|
ResourceRegistry.register(transport.app, store, graph_store=graph_store)
|
|
842
916
|
PromptRegistry.register(transport.app, store=store)
|
|
843
917
|
return transport
|
|
@@ -31,21 +31,19 @@ class AuthConfig(BaseModel):
|
|
|
31
31
|
|
|
32
32
|
|
|
33
33
|
class EmbeddingConfig(BaseModel):
|
|
34
|
-
provider: str = "
|
|
35
|
-
runtime: str = "auto" # "auto" | "
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
dimensions: int =
|
|
34
|
+
provider: str = "llama_cpp"
|
|
35
|
+
runtime: str = "auto" # "auto" | "llama_cpp" | "mock"
|
|
36
|
+
llama_cpp_model_repo: str = "ggml-org/embeddinggemma-300M-GGUF"
|
|
37
|
+
llama_cpp_model_file: str = "*.gguf"
|
|
38
|
+
dimensions: int = 768
|
|
39
39
|
openai_api_key: Optional[str] = None
|
|
40
40
|
openai_model: str = "text-embedding-3-small"
|
|
41
41
|
|
|
42
42
|
|
|
43
43
|
class LLMConfig(BaseModel):
|
|
44
|
-
provider: str = "
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
litert_backend: str = "auto" # "auto" (GPU on Mac, CPU elsewhere) | "cpu" | "gpu"
|
|
48
|
-
litert_cache_dir: str = "~/.minder/cache/litert"
|
|
44
|
+
provider: str = "llama_cpp" # "llama_cpp" | "openai"
|
|
45
|
+
llama_cpp_model_repo: str = "ggml-org/gemma-4-E2B-it-GGUF"
|
|
46
|
+
llama_cpp_model_file: str = "*.gguf"
|
|
49
47
|
context_length: int = 16384
|
|
50
48
|
temperature: float = 0.1
|
|
51
49
|
openai_api_key: Optional[str] = None
|
|
@@ -52,10 +52,10 @@ def allowed_tools_for_step(step_name: str | None) -> list[str]:
|
|
|
52
52
|
if "test" in normalized:
|
|
53
53
|
return base_tools + ["minder_search_code", "minder_search_errors"]
|
|
54
54
|
if "implement" in normalized:
|
|
55
|
-
return base_tools + ["minder_search_code", "
|
|
55
|
+
return base_tools + ["minder_search_code", "minder_skill_recall"]
|
|
56
56
|
if "review" in normalized:
|
|
57
|
-
return base_tools + ["
|
|
58
|
-
return base_tools + ["
|
|
57
|
+
return base_tools + ["minder_skill_recall", "minder_search_code"]
|
|
58
|
+
return base_tools + ["minder_memory_recall", "minder_search_code"]
|
|
59
59
|
|
|
60
60
|
|
|
61
61
|
def forbidden_actions_for_step(
|
|
@@ -325,7 +325,7 @@ class ContinuitySynthesizer:
|
|
|
325
325
|
).items()
|
|
326
326
|
},
|
|
327
327
|
}, {
|
|
328
|
-
"provider":
|
|
328
|
+
"provider": self._config.llm.provider,
|
|
329
329
|
"model": self._config.llm.provider,
|
|
330
330
|
"runtime": self._llm.runtime,
|
|
331
331
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"""
|
|
2
|
-
Local Embedding provider — delegates to
|
|
2
|
+
Local Embedding provider — delegates to llama-cpp-python using GGUF models.
|
|
3
3
|
|
|
4
4
|
Falls back to a deterministic hash-based stub if initialization fails.
|
|
5
5
|
"""
|
|
@@ -11,9 +11,10 @@ import hashlib
|
|
|
11
11
|
import logging
|
|
12
12
|
import math
|
|
13
13
|
from collections import OrderedDict
|
|
14
|
-
from pathlib import Path
|
|
15
14
|
from typing import Any
|
|
16
15
|
|
|
16
|
+
from minder.runtime import llama_cpp_usable
|
|
17
|
+
|
|
17
18
|
logger = logging.getLogger(__name__)
|
|
18
19
|
|
|
19
20
|
|
|
@@ -26,42 +27,53 @@ MAX_TEXT_LENGTH = 8000 # Safety truncation to avoid over-context (~2000 tokens)
|
|
|
26
27
|
class LocalEmbeddingProvider:
|
|
27
28
|
def __init__(
|
|
28
29
|
self,
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
dimensions: int =
|
|
30
|
+
llama_cpp_model_repo: str = "ggml-org/embeddinggemma-300M-GGUF",
|
|
31
|
+
llama_cpp_model_file: str = "*Q4_K_M.gguf",
|
|
32
|
+
dimensions: int = 768,
|
|
32
33
|
runtime: str = "auto",
|
|
33
34
|
) -> None:
|
|
34
|
-
self.
|
|
35
|
-
self.
|
|
35
|
+
self._model_repo = llama_cpp_model_repo
|
|
36
|
+
self._model_file = llama_cpp_model_file
|
|
36
37
|
self._dimensions = dimensions
|
|
37
38
|
self._runtime = runtime
|
|
38
39
|
self._model: Any | None = None
|
|
39
|
-
self.
|
|
40
|
+
self._initialized = False
|
|
41
|
+
|
|
42
|
+
def _ensure_initialized(self) -> None:
|
|
43
|
+
if not self._initialized:
|
|
44
|
+
self._init_model()
|
|
45
|
+
self._initialized = True
|
|
40
46
|
|
|
41
47
|
def _init_model(self) -> None:
|
|
42
48
|
if self._runtime == "mock":
|
|
43
49
|
return
|
|
44
50
|
|
|
45
|
-
cache_key = f"{self.
|
|
51
|
+
cache_key = f"{self._model_repo}:{self._model_file}"
|
|
46
52
|
if cache_key in _MODEL_CACHE:
|
|
47
53
|
self._model = _MODEL_CACHE[cache_key]
|
|
48
54
|
return
|
|
49
55
|
|
|
56
|
+
if not llama_cpp_usable():
|
|
57
|
+
logger.warning(
|
|
58
|
+
"CPU does not support AVX2; llama.cpp unavailable. Using mock embedding."
|
|
59
|
+
)
|
|
60
|
+
return
|
|
61
|
+
|
|
50
62
|
try:
|
|
51
|
-
from
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
threads=4,
|
|
63
|
+
from llama_cpp import Llama
|
|
64
|
+
|
|
65
|
+
logger.info("Initializing Llama.cpp embedding engine for %s", self._model_repo)
|
|
66
|
+
self._model = Llama.from_pretrained(
|
|
67
|
+
repo_id=self._model_repo,
|
|
68
|
+
filename=self._model_file,
|
|
69
|
+
embedding=True,
|
|
70
|
+
verbose=False,
|
|
60
71
|
)
|
|
61
72
|
_MODEL_CACHE[cache_key] = self._model
|
|
62
73
|
except Exception as e:
|
|
63
74
|
logger.warning(
|
|
64
|
-
|
|
75
|
+
"Failed to initialize Llama.cpp model %s: %s. Using mock.",
|
|
76
|
+
self._model_repo, e,
|
|
65
77
|
)
|
|
66
78
|
self._model = None
|
|
67
79
|
|
|
@@ -69,9 +81,10 @@ class LocalEmbeddingProvider:
|
|
|
69
81
|
def runtime(self) -> str:
|
|
70
82
|
if self._runtime != "auto":
|
|
71
83
|
return self._runtime
|
|
72
|
-
return "
|
|
84
|
+
return "llama_cpp" if self._model is not None else "mock"
|
|
73
85
|
|
|
74
86
|
def embed(self, text: str) -> list[float]:
|
|
87
|
+
self._ensure_initialized()
|
|
75
88
|
if not text:
|
|
76
89
|
return [0.0] * self._dimensions
|
|
77
90
|
|
|
@@ -85,16 +98,14 @@ class LocalEmbeddingProvider:
|
|
|
85
98
|
|
|
86
99
|
# 3. Perform embedding
|
|
87
100
|
embedding: list[float]
|
|
88
|
-
if self.runtime == "
|
|
101
|
+
if self.runtime == "llama_cpp" and self._model is not None:
|
|
89
102
|
try:
|
|
90
|
-
#
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
else:
|
|
95
|
-
embedding = self._hash_embed(safe_text)
|
|
103
|
+
# llama_cpp returns a dict with 'data'
|
|
104
|
+
result = self._model.create_embedding(safe_text)
|
|
105
|
+
vector = result["data"][0]["embedding"]
|
|
106
|
+
embedding = vector[: self._dimensions]
|
|
96
107
|
except Exception as e:
|
|
97
|
-
logger.warning(f"
|
|
108
|
+
logger.warning(f"Llama.cpp failed during embedding inference: {e}")
|
|
98
109
|
embedding = self._hash_embed(safe_text)
|
|
99
110
|
else:
|
|
100
111
|
embedding = self._hash_embed(safe_text)
|
|
@@ -107,6 +118,7 @@ class LocalEmbeddingProvider:
|
|
|
107
118
|
return embedding
|
|
108
119
|
|
|
109
120
|
def embed_many(self, texts: list[str]) -> list[list[float]]:
|
|
121
|
+
self._ensure_initialized()
|
|
110
122
|
if not texts:
|
|
111
123
|
return []
|
|
112
124
|
|
|
@@ -130,17 +142,19 @@ class LocalEmbeddingProvider:
|
|
|
130
142
|
return results
|
|
131
143
|
|
|
132
144
|
# 2. Batch embed the missing ones
|
|
133
|
-
if self.runtime == "
|
|
145
|
+
if self.runtime == "llama_cpp" and self._model is not None:
|
|
134
146
|
try:
|
|
135
|
-
|
|
147
|
+
# pass list of strings directly
|
|
148
|
+
res = self._model.create_embedding(to_embed_texts)
|
|
149
|
+
embeddings = [data["embedding"] for data in res["data"]]
|
|
136
150
|
for i, emb in enumerate(embeddings):
|
|
137
151
|
idx = to_embed_indices[i]
|
|
138
|
-
vector = emb
|
|
152
|
+
vector = emb[: self._dimensions]
|
|
139
153
|
results[idx] = vector
|
|
140
154
|
# Update cache
|
|
141
155
|
_EMBEDDING_CACHE[to_embed_texts[i]] = vector
|
|
142
156
|
except Exception as e:
|
|
143
|
-
logger.warning(f"
|
|
157
|
+
logger.warning(f"Llama.cpp batch embedding failed: {e}")
|
|
144
158
|
for i, idx in enumerate(to_embed_indices):
|
|
145
159
|
vector = self._hash_embed(to_embed_texts[i])
|
|
146
160
|
results[idx] = vector
|
|
@@ -178,7 +192,13 @@ class LocalEmbeddingProvider:
|
|
|
178
192
|
def clear_caches() -> None:
|
|
179
193
|
"""Clear global model and embedding caches to reclaim memory."""
|
|
180
194
|
global _MODEL_CACHE, _EMBEDDING_CACHE
|
|
195
|
+
for model in _MODEL_CACHE.values():
|
|
196
|
+
try:
|
|
197
|
+
if hasattr(model, "close"):
|
|
198
|
+
model.close()
|
|
199
|
+
except Exception:
|
|
200
|
+
pass
|
|
181
201
|
_MODEL_CACHE.clear()
|
|
182
202
|
_EMBEDDING_CACHE.clear()
|
|
183
203
|
gc.collect()
|
|
184
|
-
logger.debug("Cleared
|
|
204
|
+
logger.debug("Cleared Llama.cpp embedding global caches.")
|