minder-cli 0.5.6__tar.gz → 0.5.7__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.5.6 → minder_cli-0.5.7}/PKG-INFO +1 -1
- {minder_cli-0.5.6 → minder_cli-0.5.7}/pyproject.toml +1 -1
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/application/admin/use_cases.py +3 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/bootstrap/transport.py +18 -3
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/config.py +21 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/embedding/local.py +6 -1
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/graph/__init__.py +2 -2
- minder_cli-0.5.7/src/minder/graph/checkpoint.py +162 -0
- minder_cli-0.5.7/src/minder/graph/executor.py +463 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/graph/graph.py +31 -4
- minder_cli-0.5.7/src/minder/graph/memory_graph.py +276 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/graph/nodes/__init__.py +2 -0
- minder_cli-0.5.7/src/minder/graph/nodes/guard.py +127 -0
- minder_cli-0.5.7/src/minder/graph/nodes/parallel_retriever.py +245 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/graph/nodes/planning.py +7 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/graph/nodes/reasoning.py +3 -0
- minder_cli-0.5.7/src/minder/graph/session_graph.py +352 -0
- minder_cli-0.5.7/src/minder/graph/state.py +91 -0
- minder_cli-0.5.7/src/minder/graph/supervisor.py +251 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/llm/llama_cpp_llm.py +6 -1
- minder_cli-0.5.7/src/minder/model_bootstrap.py +205 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/models/__init__.py +3 -0
- minder_cli-0.5.7/src/minder/models/checkpoint.py +25 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/presentation/cli/commands/agent.py +3 -3
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/presentation/cli/commands/ide.py +4 -4
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/presentation/cli/commands/mcp.py +16 -6
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/runtime.py +64 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/server.py +5 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/store/interfaces.py +21 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/store/mongodb/operational_store.py +49 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/store/relational.py +63 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/tools/memory.py +131 -30
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/tools/query.py +83 -40
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/tools/registry.py +1 -1
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/tools/session.py +63 -1
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/tools/workflow.py +49 -2
- minder_cli-0.5.6/src/minder/graph/executor.py +0 -247
- minder_cli-0.5.6/src/minder/graph/nodes/guard.py +0 -64
- minder_cli-0.5.6/src/minder/graph/state.py +0 -27
- {minder_cli-0.5.6 → minder_cli-0.5.7}/.gitignore +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/LICENSE +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/README-pypi.md +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/README.md +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/__init__.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/api/routers/prompts.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/application/__init__.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/application/admin/__init__.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/application/admin/dto.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/application/admin/jobs.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/auth/__init__.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/auth/context.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/auth/middleware.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/auth/principal.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/auth/rate_limiter.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/auth/rbac.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/auth/service.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/bootstrap/__init__.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/bootstrap/agent_seeder.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/bootstrap/providers.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/cache/__init__.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/cache/providers.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/chunking/__init__.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/chunking/code_splitter.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/chunking/splitter.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/cli.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/context_compactor.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/continuity.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/dev.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/embedding/__init__.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/embedding/base.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/embedding/openai.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/graph/edges.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/graph/nodes/clarification.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/graph/nodes/evaluator.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/graph/nodes/llm.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/graph/nodes/reflection.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/graph/nodes/reranker.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/graph/nodes/retriever.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/graph/nodes/verification.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/graph/nodes/workflow_planner.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/graph/runtime.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/learning/__init__.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/learning/error_learner.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/learning/pattern_extractor.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/learning/quality_optimizer.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/learning/skill_synthesizer.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/llm/__init__.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/llm/base.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/llm/factory.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/llm/openai.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/models/agent.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/models/base.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/models/client.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/models/document.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/models/error.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/models/graph.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/models/history.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/models/job.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/models/prompt.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/models/repository.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/models/rule.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/models/session.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/models/skill.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/models/user.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/models/workflow.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/observability/__init__.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/observability/audit.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/observability/logging.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/observability/metrics.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/observability/tracing.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/presentation/__init__.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/presentation/cli/__init__.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/presentation/cli/commands/auth.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/presentation/cli/commands/sync.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/presentation/cli/commands/update.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/presentation/cli/main.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/presentation/cli/utils/common.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/presentation/cli/utils/config.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/presentation/cli/utils/git.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/presentation/cli/utils/version.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/presentation/http/__init__.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/presentation/http/admin/__init__.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/presentation/http/admin/agents.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/presentation/http/admin/api.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/presentation/http/admin/context.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/presentation/http/admin/dashboard.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/presentation/http/admin/jobs.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/presentation/http/admin/memories.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/presentation/http/admin/prompts.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/presentation/http/admin/routes.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/presentation/http/admin/runtime.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/presentation/http/admin/search.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/presentation/http/admin/skills.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/prompts/__init__.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/prompts/formatter.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/resources/__init__.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/retrieval/__init__.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/retrieval/hybrid.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/retrieval/mmr.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/retrieval/multi_hop.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/store/__init__.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/store/document.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/store/error.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/store/feedback.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/store/graph.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/store/history.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/store/milvus/__init__.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/store/milvus/client.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/store/milvus/collections.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/store/milvus/vector_store.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/store/mongodb/__init__.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/store/mongodb/client.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/store/mongodb/graph_store.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/store/mongodb/indexes.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/store/repo_state.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/store/rule.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/store/vector.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/tools/__init__.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/tools/agents.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/tools/auth.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/tools/graph.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/tools/ingest.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/tools/repo_scanner.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/tools/seeds/__init__.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/tools/seeds/default_agents.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/tools/skills.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/transport/__init__.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/transport/base.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/src/minder/transport/sse.py +0 -0
- {minder_cli-0.5.6 → minder_cli-0.5.7}/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.5.
|
|
3
|
+
Version: 0.5.7
|
|
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
|
|
@@ -373,6 +373,9 @@ class AdminConsoleUseCases:
|
|
|
373
373
|
"antigravity": (
|
|
374
374
|
f'{{"mcpServers":{{"minder":{{"serverUrl":"{base_url}/mcp","headers":{{"X-Minder-Client-Key":"<mkc_...>"}}}}}}}}'
|
|
375
375
|
),
|
|
376
|
+
"gemini": (
|
|
377
|
+
f'{{"mcpServers":{{"minder":{{"serverUrl":"{base_url}/mcp","headers":{{"X-Minder-Client-Key":"<mkc_...>"}}}}}}}}'
|
|
378
|
+
),
|
|
376
379
|
"cursor": (
|
|
377
380
|
f'{{"mcpServers":{{"minder":{{"url":"{base_url}/mcp","headers":{{"X-Minder-Client-Key":"<mkc_...>"}}}}}}}}'
|
|
378
381
|
),
|
|
@@ -9,6 +9,7 @@ from minder.auth.service import AuthError
|
|
|
9
9
|
from minder.auth.service import AuthService
|
|
10
10
|
from minder.cache.providers import LRUCacheProvider
|
|
11
11
|
from minder.config import MinderConfig
|
|
12
|
+
from minder.graph import MinderGraph
|
|
12
13
|
from minder.presentation.http.admin.routes import build_http_routes
|
|
13
14
|
from minder.prompts import PromptRegistry
|
|
14
15
|
from minder.resources import ResourceRegistry
|
|
@@ -45,13 +46,20 @@ def build_transport(
|
|
|
45
46
|
agent_tools = AgentTools(store)
|
|
46
47
|
auth_tools = AuthTools(store, auth_service)
|
|
47
48
|
session_tools = SessionTools(store)
|
|
48
|
-
workflow_tools = WorkflowTools(store, repo_state_store)
|
|
49
49
|
memory_tools = MemoryTools(store, config)
|
|
50
50
|
skill_tools = SkillTools(store, config)
|
|
51
51
|
graph_tools = GraphTools(graph_store, store)
|
|
52
|
+
shared_graph = MinderGraph(store, config, graph_tools=graph_tools)
|
|
53
|
+
workflow_tools = WorkflowTools(
|
|
54
|
+
store,
|
|
55
|
+
repo_state_store,
|
|
56
|
+
graph=shared_graph,
|
|
57
|
+
config=config,
|
|
58
|
+
)
|
|
52
59
|
query_tools = QueryTools(
|
|
53
60
|
store,
|
|
54
61
|
config,
|
|
62
|
+
graph=shared_graph,
|
|
55
63
|
vector_store=vector_store,
|
|
56
64
|
graph_tools=graph_tools,
|
|
57
65
|
)
|
|
@@ -302,12 +310,19 @@ def build_transport(
|
|
|
302
310
|
)
|
|
303
311
|
|
|
304
312
|
async def minder_workflow_step(
|
|
305
|
-
*,
|
|
313
|
+
*,
|
|
314
|
+
user=None,
|
|
315
|
+
repo_id: str | None = None,
|
|
316
|
+
repo_path: str | None = None,
|
|
317
|
+
session_id: str | None = None,
|
|
318
|
+
decision: dict[str, Any] | None = None,
|
|
306
319
|
) -> dict[str, Any]: # noqa: ANN001
|
|
307
320
|
del user
|
|
308
321
|
return await workflow_tools.minder_workflow_step(
|
|
309
|
-
repo_id=uuid.UUID(repo_id),
|
|
322
|
+
repo_id=uuid.UUID(repo_id) if repo_id else None,
|
|
310
323
|
repo_path=repo_path,
|
|
324
|
+
session_id=uuid.UUID(session_id) if session_id else None,
|
|
325
|
+
decision=decision,
|
|
311
326
|
)
|
|
312
327
|
|
|
313
328
|
async def minder_workflow_update(
|
|
@@ -92,6 +92,24 @@ class RetrievalConfig(BaseModel):
|
|
|
92
92
|
hybrid_alpha: float = 0.7
|
|
93
93
|
|
|
94
94
|
|
|
95
|
+
class MemoryConfig(BaseModel):
|
|
96
|
+
agentic_recall: bool = False
|
|
97
|
+
recall_min_score: float = 0.4
|
|
98
|
+
recall_max_iterations: int = 3
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
class SessionConfig(BaseModel):
|
|
102
|
+
agentic_restore: bool = False
|
|
103
|
+
restore_recall_count: int = 8
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
class GraphConfig(BaseModel):
|
|
107
|
+
runtime: str = "langgraph"
|
|
108
|
+
enable_parallel_retrieval: bool = False
|
|
109
|
+
enable_checkpointing: bool = True
|
|
110
|
+
checkpoint_ttl_days: int = 7
|
|
111
|
+
|
|
112
|
+
|
|
95
113
|
class CacheConfig(BaseModel):
|
|
96
114
|
enabled: bool = True
|
|
97
115
|
provider: str = "redis" # "redis" is the only supported runtime backend
|
|
@@ -145,6 +163,9 @@ class Settings(BaseSettings):
|
|
|
145
163
|
mongodb: MongoDBConfig = Field(default_factory=MongoDBConfig)
|
|
146
164
|
redis: RedisConfig = Field(default_factory=RedisConfig)
|
|
147
165
|
retrieval: RetrievalConfig = Field(default_factory=RetrievalConfig)
|
|
166
|
+
memory: MemoryConfig = Field(default_factory=MemoryConfig)
|
|
167
|
+
session: SessionConfig = Field(default_factory=SessionConfig)
|
|
168
|
+
graph: GraphConfig = Field(default_factory=GraphConfig)
|
|
148
169
|
cache: CacheConfig = Field(default_factory=CacheConfig)
|
|
149
170
|
rate_limit: RateLimitConfig = Field(default_factory=RateLimitConfig)
|
|
150
171
|
verification: VerificationConfig = Field(default_factory=VerificationConfig)
|
|
@@ -13,7 +13,7 @@ import math
|
|
|
13
13
|
from collections import OrderedDict
|
|
14
14
|
from typing import Any
|
|
15
15
|
|
|
16
|
-
from minder.runtime import llama_cpp_usable
|
|
16
|
+
from minder.runtime import get_writable_hf_cache_dir, llama_cpp_usable
|
|
17
17
|
|
|
18
18
|
logger = logging.getLogger(__name__)
|
|
19
19
|
|
|
@@ -61,11 +61,16 @@ class LocalEmbeddingProvider:
|
|
|
61
61
|
from llama_cpp import Llama
|
|
62
62
|
|
|
63
63
|
logger.info("Initializing Llama.cpp embedding engine for %s", self._model_repo)
|
|
64
|
+
cache_dir = get_writable_hf_cache_dir()
|
|
65
|
+
cache_kwargs: dict[str, Any] = (
|
|
66
|
+
{} if cache_dir is None else {"cache_dir": cache_dir}
|
|
67
|
+
)
|
|
64
68
|
self._model = Llama.from_pretrained(
|
|
65
69
|
repo_id=self._model_repo,
|
|
66
70
|
filename=self._model_file,
|
|
67
71
|
embedding=True,
|
|
68
72
|
verbose=False,
|
|
73
|
+
**cache_kwargs,
|
|
69
74
|
)
|
|
70
75
|
_MODEL_CACHE[cache_key] = self._model
|
|
71
76
|
except Exception as e:
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from collections.abc import AsyncGenerator, Sequence
|
|
4
|
+
import zlib
|
|
5
|
+
from typing import Any
|
|
6
|
+
|
|
7
|
+
from langgraph.checkpoint.base import (
|
|
8
|
+
BaseCheckpointSaver,
|
|
9
|
+
Checkpoint,
|
|
10
|
+
CheckpointMetadata,
|
|
11
|
+
CheckpointTuple,
|
|
12
|
+
)
|
|
13
|
+
from langchain_core.runnables import RunnableConfig
|
|
14
|
+
|
|
15
|
+
from minder.store.interfaces import IOperationalStore
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class MinderCheckpointSaver(BaseCheckpointSaver):
|
|
19
|
+
def __init__(self, store: IOperationalStore) -> None:
|
|
20
|
+
super().__init__()
|
|
21
|
+
self._store = store
|
|
22
|
+
|
|
23
|
+
async def aget_tuple(self, config: RunnableConfig) -> CheckpointTuple | None:
|
|
24
|
+
configurable = config.get("configurable", {})
|
|
25
|
+
thread_id = configurable.get("thread_id")
|
|
26
|
+
if not thread_id:
|
|
27
|
+
return None
|
|
28
|
+
|
|
29
|
+
# Check if the store implements ICheckpointRepository
|
|
30
|
+
if not hasattr(self._store, "get_checkpoint"):
|
|
31
|
+
return None
|
|
32
|
+
|
|
33
|
+
data = await self._store.get_checkpoint(thread_id)
|
|
34
|
+
if data is None:
|
|
35
|
+
return None
|
|
36
|
+
|
|
37
|
+
metadata = data.get("metadata", {})
|
|
38
|
+
type_name = metadata.pop("_checkpoint_type", "msgpack")
|
|
39
|
+
payload = bytes(data["checkpoint"])
|
|
40
|
+
if metadata.pop("_checkpoint_compression", None) == "zlib":
|
|
41
|
+
payload = zlib.decompress(payload)
|
|
42
|
+
checkpoint = self.serde.loads_typed((type_name, payload))
|
|
43
|
+
|
|
44
|
+
return CheckpointTuple(
|
|
45
|
+
config=config,
|
|
46
|
+
checkpoint=checkpoint,
|
|
47
|
+
metadata=metadata,
|
|
48
|
+
parent_config=None, # We don't track full history trees in simple setup
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
async def aput(
|
|
52
|
+
self,
|
|
53
|
+
config: RunnableConfig,
|
|
54
|
+
checkpoint: Checkpoint,
|
|
55
|
+
metadata: CheckpointMetadata,
|
|
56
|
+
new_versions: dict[str, str | float | int],
|
|
57
|
+
) -> RunnableConfig:
|
|
58
|
+
configurable = config.get("configurable", {})
|
|
59
|
+
thread_id = configurable.get("thread_id")
|
|
60
|
+
if not thread_id:
|
|
61
|
+
return config
|
|
62
|
+
|
|
63
|
+
if not hasattr(self._store, "save_checkpoint"):
|
|
64
|
+
return config
|
|
65
|
+
|
|
66
|
+
type_name, payload = self.serde.dumps_typed(checkpoint)
|
|
67
|
+
payload = zlib.compress(payload)
|
|
68
|
+
db_metadata = dict(metadata or {})
|
|
69
|
+
db_metadata["_checkpoint_type"] = type_name
|
|
70
|
+
db_metadata["_checkpoint_compression"] = "zlib"
|
|
71
|
+
|
|
72
|
+
await self._store.save_checkpoint(
|
|
73
|
+
thread_id=thread_id,
|
|
74
|
+
checkpoint_id=checkpoint["id"],
|
|
75
|
+
checkpoint=payload,
|
|
76
|
+
metadata=db_metadata,
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
return {
|
|
80
|
+
"configurable": {
|
|
81
|
+
"thread_id": thread_id,
|
|
82
|
+
"checkpoint_ns": configurable.get("checkpoint_ns", ""),
|
|
83
|
+
"checkpoint_id": checkpoint["id"],
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
async def alist(
|
|
88
|
+
self,
|
|
89
|
+
config: RunnableConfig | None,
|
|
90
|
+
*,
|
|
91
|
+
filter: dict[str, Any] | None = None,
|
|
92
|
+
before: RunnableConfig | None = None,
|
|
93
|
+
limit: int | None = None,
|
|
94
|
+
) -> AsyncGenerator[CheckpointTuple, None]:
|
|
95
|
+
if config is None:
|
|
96
|
+
return
|
|
97
|
+
|
|
98
|
+
configurable = config.get("configurable", {})
|
|
99
|
+
thread_id = configurable.get("thread_id")
|
|
100
|
+
if not thread_id:
|
|
101
|
+
return
|
|
102
|
+
|
|
103
|
+
if not hasattr(self._store, "list_checkpoints"):
|
|
104
|
+
return
|
|
105
|
+
|
|
106
|
+
records = await self._store.list_checkpoints(thread_id, limit=limit or 10)
|
|
107
|
+
for record in records:
|
|
108
|
+
metadata = record.get("metadata", {})
|
|
109
|
+
type_name = metadata.pop("_checkpoint_type", "msgpack")
|
|
110
|
+
payload = bytes(record["checkpoint"])
|
|
111
|
+
if metadata.pop("_checkpoint_compression", None) == "zlib":
|
|
112
|
+
payload = zlib.decompress(payload)
|
|
113
|
+
checkpoint = self.serde.loads_typed((type_name, payload))
|
|
114
|
+
yield CheckpointTuple(
|
|
115
|
+
config={
|
|
116
|
+
"configurable": {
|
|
117
|
+
"thread_id": thread_id,
|
|
118
|
+
"checkpoint_ns": configurable.get("checkpoint_ns", ""),
|
|
119
|
+
"checkpoint_id": record["checkpoint_id"],
|
|
120
|
+
}
|
|
121
|
+
},
|
|
122
|
+
checkpoint=checkpoint,
|
|
123
|
+
metadata=metadata,
|
|
124
|
+
parent_config=None,
|
|
125
|
+
)
|
|
126
|
+
|
|
127
|
+
async def aput_writes(
|
|
128
|
+
self,
|
|
129
|
+
config: RunnableConfig,
|
|
130
|
+
writes: Sequence[tuple[str, Any]],
|
|
131
|
+
task_id: str,
|
|
132
|
+
task_path: str = "",
|
|
133
|
+
) -> None:
|
|
134
|
+
# We only persist full checkpoints for Minder's workflow right now.
|
|
135
|
+
# LangGraph requires this method, but for simple state sync it can be a no-op
|
|
136
|
+
# unless fine-grained node-level recovery is needed.
|
|
137
|
+
pass
|
|
138
|
+
|
|
139
|
+
# Note: Sync versions of these methods must be implemented but can just raise NotImplementedError
|
|
140
|
+
# since we only use async langgraph execution (`ainvoke`).
|
|
141
|
+
|
|
142
|
+
def get_tuple(self, config: RunnableConfig) -> CheckpointTuple | None:
|
|
143
|
+
raise NotImplementedError("MinderCheckpointSaver only supports async.")
|
|
144
|
+
|
|
145
|
+
def put(
|
|
146
|
+
self,
|
|
147
|
+
config: RunnableConfig,
|
|
148
|
+
checkpoint: Checkpoint,
|
|
149
|
+
metadata: CheckpointMetadata,
|
|
150
|
+
new_versions: dict[str, str | float | int],
|
|
151
|
+
) -> RunnableConfig:
|
|
152
|
+
raise NotImplementedError("MinderCheckpointSaver only supports async.")
|
|
153
|
+
|
|
154
|
+
def list(
|
|
155
|
+
self,
|
|
156
|
+
config: RunnableConfig | None,
|
|
157
|
+
*,
|
|
158
|
+
filter: dict[str, Any] | None = None,
|
|
159
|
+
before: RunnableConfig | None = None,
|
|
160
|
+
limit: int | None = None,
|
|
161
|
+
):
|
|
162
|
+
raise NotImplementedError("MinderCheckpointSaver only supports async.")
|