memini-ai-dev 0.2.0__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.
- memini_ai_dev-0.2.0/.github/workflows/ci.yml +38 -0
- memini_ai_dev-0.2.0/.github/workflows/workflow.yml +51 -0
- memini_ai_dev-0.2.0/.gitignore +14 -0
- memini_ai_dev-0.2.0/.python-version +1 -0
- memini_ai_dev-0.2.0/CHANGELOG.md +29 -0
- memini_ai_dev-0.2.0/PKG-INFO +370 -0
- memini_ai_dev-0.2.0/README.md +333 -0
- memini_ai_dev-0.2.0/docs/memory_report.agent.final.converted.md +856 -0
- memini_ai_dev-0.2.0/docs/memory_report.agent.final.md +856 -0
- memini_ai_dev-0.2.0/docs/memory_report.agent.outline.md +126 -0
- memini_ai_dev-0.2.0/docs/memory_report_sec00.md +17 -0
- memini_ai_dev-0.2.0/docs/memory_report_sec01.md +68 -0
- memini_ai_dev-0.2.0/docs/memory_report_sec02.md +125 -0
- memini_ai_dev-0.2.0/docs/memory_report_sec03.md +243 -0
- memini_ai_dev-0.2.0/docs/memory_report_sec04.md +109 -0
- memini_ai_dev-0.2.0/docs/memory_report_sec05.md +84 -0
- memini_ai_dev-0.2.0/docs/memory_report_sec06.md +162 -0
- memini_ai_dev-0.2.0/docs/pgvector_migration.md +583 -0
- memini_ai_dev-0.2.0/docs/reality_check.md +209 -0
- memini_ai_dev-0.2.0/docs/research/memory_providers_cross_verification.md +23 -0
- memini_ai_dev-0.2.0/docs/research/memory_providers_dim01.md +73 -0
- memini_ai_dev-0.2.0/docs/research/memory_providers_dim02.md +109 -0
- memini_ai_dev-0.2.0/docs/research/memory_providers_dim03.md +97 -0
- memini_ai_dev-0.2.0/docs/research/memory_providers_dim04.md +68 -0
- memini_ai_dev-0.2.0/docs/research/memory_providers_insight.md +94 -0
- memini_ai_dev-0.2.0/main.py +12 -0
- memini_ai_dev-0.2.0/pyproject.toml +95 -0
- memini_ai_dev-0.2.0/scripts/migrate_qdrant_to_pgvector.py +198 -0
- memini_ai_dev-0.2.0/src/memini_ai/__init__.py +3 -0
- memini_ai_dev-0.2.0/src/memini_ai/config.py +394 -0
- memini_ai_dev-0.2.0/src/memini_ai/decay.py +811 -0
- memini_ai_dev-0.2.0/src/memini_ai/dialectic.py +1103 -0
- memini_ai_dev-0.2.0/src/memini_ai/entity_extractor.py +439 -0
- memini_ai_dev-0.2.0/src/memini_ai/extractor.py +281 -0
- memini_ai_dev-0.2.0/src/memini_ai/graph.py +323 -0
- memini_ai_dev-0.2.0/src/memini_ai/indexer/__init__.py +47 -0
- memini_ai_dev-0.2.0/src/memini_ai/indexer/chunker.py +460 -0
- memini_ai_dev-0.2.0/src/memini_ai/indexer/constants.py +186 -0
- memini_ai_dev-0.2.0/src/memini_ai/indexer/file_tracker.py +211 -0
- memini_ai_dev-0.2.0/src/memini_ai/indexer/indexer.py +402 -0
- memini_ai_dev-0.2.0/src/memini_ai/indexer/pause_controller.py +89 -0
- memini_ai_dev-0.2.0/src/memini_ai/indexer/snapshot.py +192 -0
- memini_ai_dev-0.2.0/src/memini_ai/indexer/watcher.py +217 -0
- memini_ai_dev-0.2.0/src/memini_ai/knowledge_graph.py +1355 -0
- memini_ai_dev-0.2.0/src/memini_ai/main.py +52 -0
- memini_ai_dev-0.2.0/src/memini_ai/memory/__init__.py +32 -0
- memini_ai_dev-0.2.0/src/memini_ai/memory/database.py +1095 -0
- memini_ai_dev-0.2.0/src/memini_ai/memory/schema.py +305 -0
- memini_ai_dev-0.2.0/src/memini_ai/memory/search.py +486 -0
- memini_ai_dev-0.2.0/src/memini_ai/memory/system.py +530 -0
- memini_ai_dev-0.2.0/src/memini_ai/model/__init__.py +15 -0
- memini_ai_dev-0.2.0/src/memini_ai/model/embeddings.py +106 -0
- memini_ai_dev-0.2.0/src/memini_ai/model/manager.py +199 -0
- memini_ai_dev-0.2.0/src/memini_ai/multi_peer.py +861 -0
- memini_ai_dev-0.2.0/src/memini_ai/postgres/__init__.py +5 -0
- memini_ai_dev-0.2.0/src/memini_ai/postgres/database.py +593 -0
- memini_ai_dev-0.2.0/src/memini_ai/postgres/queries.py +256 -0
- memini_ai_dev-0.2.0/src/memini_ai/postgres/schema.py +288 -0
- memini_ai_dev-0.2.0/src/memini_ai/precompress.py +135 -0
- memini_ai_dev-0.2.0/src/memini_ai/server.py +2383 -0
- memini_ai_dev-0.2.0/src/memini_ai/tiered_loader.py +557 -0
- memini_ai_dev-0.2.0/src/memini_ai/trust_engine.py +299 -0
- memini_ai_dev-0.2.0/src/memini_ai/user_model.py +543 -0
- memini_ai_dev-0.2.0/src/memini_ai/utils/__init__.py +6 -0
- memini_ai_dev-0.2.0/src/memini_ai/utils/hash.py +43 -0
- memini_ai_dev-0.2.0/src/memini_ai/utils/logger.py +50 -0
- memini_ai_dev-0.2.0/tests/__init__.py +1 -0
- memini_ai_dev-0.2.0/tests/conftest.py +44 -0
- memini_ai_dev-0.2.0/tests/integration/__init__.py +1 -0
- memini_ai_dev-0.2.0/tests/integration/test_integration.py +467 -0
- memini_ai_dev-0.2.0/tests/test_chunker.py +260 -0
- memini_ai_dev-0.2.0/tests/test_config.py +279 -0
- memini_ai_dev-0.2.0/tests/test_database.py +411 -0
- memini_ai_dev-0.2.0/tests/test_decay.py +769 -0
- memini_ai_dev-0.2.0/tests/test_dialectic.py +572 -0
- memini_ai_dev-0.2.0/tests/test_embeddings.py +219 -0
- memini_ai_dev-0.2.0/tests/test_entity_extractor.py +265 -0
- memini_ai_dev-0.2.0/tests/test_extractor.py +522 -0
- memini_ai_dev-0.2.0/tests/test_graph.py +823 -0
- memini_ai_dev-0.2.0/tests/test_hash.py +115 -0
- memini_ai_dev-0.2.0/tests/test_indexer.py +435 -0
- memini_ai_dev-0.2.0/tests/test_knowledge_graph.py +514 -0
- memini_ai_dev-0.2.0/tests/test_multi_peer.py +780 -0
- memini_ai_dev-0.2.0/tests/test_postgres_database.py +743 -0
- memini_ai_dev-0.2.0/tests/test_precompress.py +442 -0
- memini_ai_dev-0.2.0/tests/test_schema.py +246 -0
- memini_ai_dev-0.2.0/tests/test_search.py +375 -0
- memini_ai_dev-0.2.0/tests/test_server.py +219 -0
- memini_ai_dev-0.2.0/tests/test_system.py +504 -0
- memini_ai_dev-0.2.0/tests/test_tiered_loader.py +1207 -0
- memini_ai_dev-0.2.0/tests/test_trust_engine.py +725 -0
- memini_ai_dev-0.2.0/tests/test_user_model.py +878 -0
- memini_ai_dev-0.2.0/uv.lock +3056 -0
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
name: CI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [main]
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
ci:
|
|
11
|
+
runs-on: ubuntu-latest
|
|
12
|
+
|
|
13
|
+
steps:
|
|
14
|
+
- name: Checkout code
|
|
15
|
+
uses: actions/checkout@v4
|
|
16
|
+
|
|
17
|
+
- name: Set up Python 3.13
|
|
18
|
+
uses: actions/setup-python@v5
|
|
19
|
+
with:
|
|
20
|
+
python-version: "3.13"
|
|
21
|
+
|
|
22
|
+
- name: Install uv
|
|
23
|
+
uses: astral-sh/setup-uv@v5
|
|
24
|
+
|
|
25
|
+
- name: Sync dependencies (including dev)
|
|
26
|
+
run: uv sync --extra dev
|
|
27
|
+
|
|
28
|
+
- name: Check code formatting
|
|
29
|
+
run: uvx ruff format --check .
|
|
30
|
+
|
|
31
|
+
- name: Lint code
|
|
32
|
+
run: uvx ruff check .
|
|
33
|
+
|
|
34
|
+
- name: Run tests
|
|
35
|
+
run: uv run pytest
|
|
36
|
+
|
|
37
|
+
- name: Build package
|
|
38
|
+
run: uv build
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
name: Release
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
tags:
|
|
6
|
+
- "v*.*.*"
|
|
7
|
+
|
|
8
|
+
jobs:
|
|
9
|
+
release:
|
|
10
|
+
runs-on: ubuntu-latest
|
|
11
|
+
environment: pypi
|
|
12
|
+
permissions:
|
|
13
|
+
contents: write
|
|
14
|
+
id-token: write
|
|
15
|
+
|
|
16
|
+
steps:
|
|
17
|
+
- name: Checkout code
|
|
18
|
+
uses: actions/checkout@v4
|
|
19
|
+
with:
|
|
20
|
+
ref: ${{ github.ref }}
|
|
21
|
+
|
|
22
|
+
- name: Set up Python 3.13
|
|
23
|
+
uses: actions/setup-python@v5
|
|
24
|
+
with:
|
|
25
|
+
python-version: "3.13"
|
|
26
|
+
|
|
27
|
+
- name: Install uv
|
|
28
|
+
uses: astral-sh/setup-uv@v5
|
|
29
|
+
|
|
30
|
+
- name: Sync dependencies
|
|
31
|
+
run: uv sync
|
|
32
|
+
|
|
33
|
+
- name: Build package
|
|
34
|
+
run: uv build
|
|
35
|
+
|
|
36
|
+
- name: Extract tag name
|
|
37
|
+
id: extract_tag
|
|
38
|
+
run: echo "tag_name=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT
|
|
39
|
+
|
|
40
|
+
- name: Create GitHub Release
|
|
41
|
+
uses: softprops/action-gh-release@v2
|
|
42
|
+
with:
|
|
43
|
+
tag_name: ${{ steps.extract_tag.outputs.tag_name }}
|
|
44
|
+
name: ${{ steps.extract_tag.outputs.tag_name }}
|
|
45
|
+
generate_release_notes: true
|
|
46
|
+
files: dist/*
|
|
47
|
+
env:
|
|
48
|
+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
49
|
+
|
|
50
|
+
- name: Publish to PyPI
|
|
51
|
+
uses: pypa/gh-action-pypi-publish@release/v1
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
3.13
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
## [0.2.0] - 2026-05-18
|
|
9
|
+
|
|
10
|
+
### Features
|
|
11
|
+
|
|
12
|
+
- pgvector/pgvectorscale backend with StreamingDiskANN index
|
|
13
|
+
- VectorDatabase ABC for database abstraction
|
|
14
|
+
- PostgresDatabase class with asyncpg support
|
|
15
|
+
- New `postgres/` module with schema and queries
|
|
16
|
+
- Migration script: `scripts/migrate_qdrant_to_pgvector.py`
|
|
17
|
+
- New config options: `MEMINI_DB_URL`, `db_pool_size`, `db_min_size`, `db_max_size`
|
|
18
|
+
|
|
19
|
+
### Tests
|
|
20
|
+
|
|
21
|
+
- 38 new tests for PostgresDatabase
|
|
22
|
+
|
|
23
|
+
### Bug Fixes
|
|
24
|
+
|
|
25
|
+
- N/A
|
|
26
|
+
|
|
27
|
+
### Breaking Changes
|
|
28
|
+
|
|
29
|
+
- None (backward compatible with Qdrant)
|
|
@@ -0,0 +1,370 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: memini-ai-dev
|
|
3
|
+
Version: 0.2.0
|
|
4
|
+
Summary: Local-first semantic memory server with vector search
|
|
5
|
+
Project-URL: Homepage, https://github.com/Veedubin/memini-ai-dev
|
|
6
|
+
Project-URL: Repository, https://github.com/Veedubin/memini-ai-dev
|
|
7
|
+
Author: VeeDubin
|
|
8
|
+
License: MIT
|
|
9
|
+
Keywords: mcp,memory,qdrant,semantic-search,vector-search
|
|
10
|
+
Classifier: Development Status :: 4 - Beta
|
|
11
|
+
Classifier: Intended Audience :: Developers
|
|
12
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
13
|
+
Classifier: Programming Language :: Python :: 3
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
17
|
+
Requires-Python: >=3.11
|
|
18
|
+
Requires-Dist: asyncpg>=0.29.0
|
|
19
|
+
Requires-Dist: fastmcp>=2.0
|
|
20
|
+
Requires-Dist: httpx>=0.27
|
|
21
|
+
Requires-Dist: pydantic-settings>=2.0
|
|
22
|
+
Requires-Dist: pydantic>=2.0
|
|
23
|
+
Requires-Dist: qdrant-client>=1.12
|
|
24
|
+
Requires-Dist: rank-bm25>=0.2
|
|
25
|
+
Requires-Dist: sentence-transformers>=3.0
|
|
26
|
+
Requires-Dist: structlog>=24.0
|
|
27
|
+
Requires-Dist: tenacity>=8.0
|
|
28
|
+
Requires-Dist: torch>=2.0
|
|
29
|
+
Requires-Dist: watchdog>=4.0
|
|
30
|
+
Provides-Extra: dev
|
|
31
|
+
Requires-Dist: mypy>=1.10; extra == 'dev'
|
|
32
|
+
Requires-Dist: pytest-asyncio>=0.23; extra == 'dev'
|
|
33
|
+
Requires-Dist: pytest-cov>=5.0; extra == 'dev'
|
|
34
|
+
Requires-Dist: pytest>=8.0; extra == 'dev'
|
|
35
|
+
Requires-Dist: ruff>=0.6; extra == 'dev'
|
|
36
|
+
Description-Content-Type: text/markdown
|
|
37
|
+
|
|
38
|
+
# Memini-ai v3.0
|
|
39
|
+
|
|
40
|
+
> "I remember" in Latin (pronounced *meh-mee-nee*)
|
|
41
|
+
|
|
42
|
+
Local-first semantic memory server with vector search, MCP-compatible.
|
|
43
|
+
|
|
44
|
+
## Overview
|
|
45
|
+
|
|
46
|
+
Memini-ai is a Python rewrite of [Super-Memory-TS](https://github.com/veedubin/super-memory-ts), designed as a local-first semantic memory server with vector search capabilities. It provides persistent memory storage and retrieval using Qdrant as the backend vector database.
|
|
47
|
+
|
|
48
|
+
### Key Features
|
|
49
|
+
|
|
50
|
+
- **MCP-Compatible**: Works with any MCP-compatible client (OpenCode, Claude Desktop, etc.)
|
|
51
|
+
- **Vector Search**: BGE-Large embeddings (1024-dim) with MiniLM fallback (384-dim)
|
|
52
|
+
- **Hybrid Search**: Combines vector similarity with BM25 text search
|
|
53
|
+
- **Project Isolation**: Memories are isolated by project ID
|
|
54
|
+
- **File Indexing**: Index and search project files with semantic chunking
|
|
55
|
+
- **Graceful Degradation**: Works without Qdrant (returns errors for memory operations)
|
|
56
|
+
- **CPU-First**: Designed to run on CPU, optional GPU acceleration
|
|
57
|
+
|
|
58
|
+
## Installation
|
|
59
|
+
|
|
60
|
+
### Prerequisites
|
|
61
|
+
|
|
62
|
+
- Python 3.11+
|
|
63
|
+
- [Qdrant](https://qdrant.tech/documentation/guides/installation/) running locally or remotely
|
|
64
|
+
|
|
65
|
+
### Quick Start
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
# Install memini-ai
|
|
69
|
+
pip install memini-ai
|
|
70
|
+
|
|
71
|
+
# Start Qdrant (if not running)
|
|
72
|
+
docker run -d --name qdrant -p 6333:6333 qdrant/qdrant
|
|
73
|
+
|
|
74
|
+
# Run the server
|
|
75
|
+
memini-ai --stdio
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### Development Installation
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
# Clone the repository
|
|
82
|
+
git clone https://github.com/veedubin/memini-ai.git
|
|
83
|
+
cd memini-ai
|
|
84
|
+
|
|
85
|
+
# Create virtual environment
|
|
86
|
+
python -m venv .venv
|
|
87
|
+
source .venv/bin/activate # Linux/Mac
|
|
88
|
+
# or: .venv\Scripts\activate # Windows
|
|
89
|
+
|
|
90
|
+
# Install with dev dependencies
|
|
91
|
+
pip install -e ".[dev]"
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
## Configuration
|
|
95
|
+
|
|
96
|
+
Memini-ai can be configured via environment variables or a JSON config file.
|
|
97
|
+
|
|
98
|
+
### Environment Variables
|
|
99
|
+
|
|
100
|
+
| Variable | Default | Description |
|
|
101
|
+
|----------|---------|-------------|
|
|
102
|
+
| `MEMINI_QDRANT_URL` | `http://localhost:6333` | Qdrant server URL |
|
|
103
|
+
| `MEMINI_PROJECT_ID` | auto-generated | Project identifier for isolation |
|
|
104
|
+
| `MEMINI_EMBEDDING_DIM` | `1024` | Embedding dimension (1024 or 384) |
|
|
105
|
+
| `MEMINI_CHUNK_SIZE` | `512` | Chunk size for file indexing |
|
|
106
|
+
| `MEMINI_CHUNK_OVERLAP` | `64` | Overlap between chunks |
|
|
107
|
+
| `MEMINI_BATCH_SIZE` | `32` | Batch size for embedding generation |
|
|
108
|
+
| `MEMINI_WORKERS` | `4` | Number of worker threads |
|
|
109
|
+
| `MEMINI_LOG_LEVEL` | `INFO` | Logging level |
|
|
110
|
+
| `MEMINI_CONFIG_PATH` | None | Path to JSON config file |
|
|
111
|
+
|
|
112
|
+
### JSON Config File
|
|
113
|
+
|
|
114
|
+
```json
|
|
115
|
+
{
|
|
116
|
+
"qdrant": {
|
|
117
|
+
"url": "http://localhost:6333"
|
|
118
|
+
},
|
|
119
|
+
"model": {
|
|
120
|
+
"embedding_dim": 1024
|
|
121
|
+
},
|
|
122
|
+
"indexer": {
|
|
123
|
+
"chunk_size": 512,
|
|
124
|
+
"chunk_overlap": 64
|
|
125
|
+
},
|
|
126
|
+
"logging": {
|
|
127
|
+
"level": "INFO"
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
## Usage
|
|
133
|
+
|
|
134
|
+
### MCP Tools
|
|
135
|
+
|
|
136
|
+
Memini-ai provides 6 MCP tools:
|
|
137
|
+
|
|
138
|
+
#### `query_memories`
|
|
139
|
+
Semantic search over memories.
|
|
140
|
+
|
|
141
|
+
```json
|
|
142
|
+
{
|
|
143
|
+
"query": "What files were modified yesterday?",
|
|
144
|
+
"limit": 10,
|
|
145
|
+
"strategy": "tiered"
|
|
146
|
+
}
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
**Strategies:**
|
|
150
|
+
- `tiered` (default): MiniLM primary + BGE fallback
|
|
151
|
+
- `vector_only`: Pure semantic similarity
|
|
152
|
+
- `text_only`: BM25 keyword search
|
|
153
|
+
- `parallel`: Dual-tier with RRF fusion
|
|
154
|
+
|
|
155
|
+
#### `add_memory`
|
|
156
|
+
Store a new memory entry.
|
|
157
|
+
|
|
158
|
+
```json
|
|
159
|
+
{
|
|
160
|
+
"content": "Remember to update the config file",
|
|
161
|
+
"sourceType": "session",
|
|
162
|
+
"sourcePath": "/path/to/file",
|
|
163
|
+
"metadata": {"key": "value"}
|
|
164
|
+
}
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
#### `search_project`
|
|
168
|
+
Search indexed project files.
|
|
169
|
+
|
|
170
|
+
```json
|
|
171
|
+
{
|
|
172
|
+
"query": "authentication middleware",
|
|
173
|
+
"topK": 20,
|
|
174
|
+
"fileTypes": [".py", ".ts"],
|
|
175
|
+
"paths": ["src/"]
|
|
176
|
+
}
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
#### `index_project`
|
|
180
|
+
Trigger project indexing.
|
|
181
|
+
|
|
182
|
+
```json
|
|
183
|
+
{
|
|
184
|
+
"path": ".",
|
|
185
|
+
"force": false,
|
|
186
|
+
"background": true
|
|
187
|
+
}
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
#### `get_file_contents`
|
|
191
|
+
Reconstruct a file from indexed chunks.
|
|
192
|
+
|
|
193
|
+
```json
|
|
194
|
+
{
|
|
195
|
+
"filePath": "src/main.py",
|
|
196
|
+
"triggerIndex": false
|
|
197
|
+
}
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
#### `get_status`
|
|
201
|
+
Get server component status.
|
|
202
|
+
|
|
203
|
+
```json
|
|
204
|
+
{}
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
### Python API
|
|
208
|
+
|
|
209
|
+
```python
|
|
210
|
+
from memini_ai.memory.system import MemorySystem
|
|
211
|
+
from memini_ai.memory.schema import MemoryEntry, MemorySourceType, SearchOptions, SearchStrategy
|
|
212
|
+
|
|
213
|
+
async def main():
|
|
214
|
+
# Create and initialize
|
|
215
|
+
system = MemorySystem()
|
|
216
|
+
await system.initialize()
|
|
217
|
+
|
|
218
|
+
# Add a memory
|
|
219
|
+
entry = MemoryEntry(
|
|
220
|
+
text="Python list comprehension tutorial",
|
|
221
|
+
source_type=MemorySourceType.session,
|
|
222
|
+
)
|
|
223
|
+
memory_id = await system.add_memory(entry)
|
|
224
|
+
|
|
225
|
+
# Query memories
|
|
226
|
+
options = SearchOptions(topK=10, strategy=SearchStrategy.TIERED)
|
|
227
|
+
results = await system.query_memories("list comprehension", options)
|
|
228
|
+
|
|
229
|
+
# Delete memory
|
|
230
|
+
await system.delete_memory(memory_id)
|
|
231
|
+
|
|
232
|
+
asyncio.run(main())
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
## Docker Compose
|
|
236
|
+
|
|
237
|
+
For local development with Qdrant:
|
|
238
|
+
|
|
239
|
+
```yaml
|
|
240
|
+
version: '3.8'
|
|
241
|
+
|
|
242
|
+
services:
|
|
243
|
+
qdrant:
|
|
244
|
+
image: qdrant/qdrant
|
|
245
|
+
ports:
|
|
246
|
+
- "6333:6333"
|
|
247
|
+
- "6334:6334"
|
|
248
|
+
volumes:
|
|
249
|
+
- qdrant_data:/qdrant/storage
|
|
250
|
+
|
|
251
|
+
memini-ai:
|
|
252
|
+
build: .
|
|
253
|
+
depends_on:
|
|
254
|
+
- qdrant
|
|
255
|
+
environment:
|
|
256
|
+
- MEMINI_QDRANT_URL=http://qdrant:6333
|
|
257
|
+
volumes:
|
|
258
|
+
- .:/app
|
|
259
|
+
|
|
260
|
+
volumes:
|
|
261
|
+
qdrant_data:
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
```bash
|
|
265
|
+
docker-compose up -d
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
## Testing
|
|
269
|
+
|
|
270
|
+
```bash
|
|
271
|
+
# Run all tests
|
|
272
|
+
pytest tests/ -v
|
|
273
|
+
|
|
274
|
+
# Run unit tests only (skip integration)
|
|
275
|
+
pytest tests/ -v --ignore=tests/integration/
|
|
276
|
+
|
|
277
|
+
# Run integration tests (requires Qdrant)
|
|
278
|
+
pytest tests/integration/ -v
|
|
279
|
+
|
|
280
|
+
# Run with coverage
|
|
281
|
+
pytest tests/ --cov=src/memini_ai --cov-report=term-missing
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
### Integration Tests with Docker
|
|
285
|
+
|
|
286
|
+
```bash
|
|
287
|
+
# Start Qdrant for integration tests
|
|
288
|
+
docker run -d --name qdrant-test -p 6333:6333 qdrant/qdrant
|
|
289
|
+
|
|
290
|
+
# Run integration tests
|
|
291
|
+
pytest tests/integration/ -v
|
|
292
|
+
|
|
293
|
+
# Cleanup
|
|
294
|
+
docker stop qdrant-test && docker rm qdrant-test
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
## Quality Gates
|
|
298
|
+
|
|
299
|
+
Before submitting changes, ensure:
|
|
300
|
+
|
|
301
|
+
```bash
|
|
302
|
+
# Lint
|
|
303
|
+
ruff check src/
|
|
304
|
+
|
|
305
|
+
# Format
|
|
306
|
+
ruff format src/
|
|
307
|
+
|
|
308
|
+
# Type check
|
|
309
|
+
mypy src/
|
|
310
|
+
|
|
311
|
+
# Tests
|
|
312
|
+
pytest tests/ -x
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
## Performance
|
|
316
|
+
|
|
317
|
+
Memini-ai is designed for sub-10ms query latency on cached queries.
|
|
318
|
+
|
|
319
|
+
Typical performance:
|
|
320
|
+
- **Query latency**: < 10ms (after warmup)
|
|
321
|
+
- **Indexing**: ~1000 files/second
|
|
322
|
+
- **Memory footprint**: ~500MB (without model)
|
|
323
|
+
|
|
324
|
+
### Performance Tuning
|
|
325
|
+
|
|
326
|
+
```bash
|
|
327
|
+
# Use faster embedding model (384-dim instead of 1024)
|
|
328
|
+
export MEMINI_EMBEDDING_DIM=384
|
|
329
|
+
|
|
330
|
+
# Increase workers for faster indexing
|
|
331
|
+
export MEMINI_WORKERS=8
|
|
332
|
+
|
|
333
|
+
# Larger batch size for embedding generation
|
|
334
|
+
export MEMINI_BATCH_SIZE=64
|
|
335
|
+
```
|
|
336
|
+
|
|
337
|
+
## Architecture
|
|
338
|
+
|
|
339
|
+
```
|
|
340
|
+
memini_ai/
|
|
341
|
+
├── config.py # Configuration management
|
|
342
|
+
├── server.py # FastMCP server (6 tools)
|
|
343
|
+
├── memory/
|
|
344
|
+
│ ├── schema.py # Pydantic models
|
|
345
|
+
│ ├── database.py # Qdrant CRUD operations
|
|
346
|
+
│ ├── search.py # 4 search strategies
|
|
347
|
+
│ └── system.py # MemorySystem coordinator
|
|
348
|
+
├── model/
|
|
349
|
+
│ ├── manager.py # ModelManager singleton
|
|
350
|
+
│ └── embeddings.py # Embedding generation
|
|
351
|
+
├── indexer/
|
|
352
|
+
│ ├── indexer.py # ProjectIndexer
|
|
353
|
+
│ ├── chunker.py # Semantic chunking
|
|
354
|
+
│ ├── watcher.py # File watching
|
|
355
|
+
│ └── file_tracker.py # SQLite persistence
|
|
356
|
+
└── utils/
|
|
357
|
+
├── logger.py # Structured logging
|
|
358
|
+
└── hash.py # SHA-256 utilities
|
|
359
|
+
```
|
|
360
|
+
|
|
361
|
+
## License
|
|
362
|
+
|
|
363
|
+
MIT License - see LICENSE file for details.
|
|
364
|
+
|
|
365
|
+
## Links
|
|
366
|
+
|
|
367
|
+
- [Repository](https://github.com/veedubin/memini-ai)
|
|
368
|
+
- [Documentation](https://github.com/veedubin/memini-ai#readme)
|
|
369
|
+
- [Qdrant](https://qdrant.tech/)
|
|
370
|
+
- [FastMCP](https://github.com/jlowin/fastmcp)
|