keep-skill 0.1.0__py3-none-any.whl → 0.3.0__py3-none-any.whl
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.
- keep/__init__.py +3 -6
- keep/api.py +1052 -145
- keep/cli.py +705 -132
- keep/config.py +172 -41
- keep/context.py +1 -125
- keep/document_store.py +908 -0
- keep/errors.py +33 -0
- keep/indexing.py +1 -1
- keep/logging_config.py +34 -3
- keep/paths.py +81 -17
- keep/pending_summaries.py +52 -40
- keep/providers/embedding_cache.py +59 -46
- keep/providers/embeddings.py +43 -13
- keep/providers/mlx.py +23 -21
- keep/store.py +169 -25
- keep_skill-0.3.0.dist-info/METADATA +218 -0
- keep_skill-0.3.0.dist-info/RECORD +28 -0
- keep_skill-0.1.0.dist-info/METADATA +0 -290
- keep_skill-0.1.0.dist-info/RECORD +0 -26
- {keep_skill-0.1.0.dist-info → keep_skill-0.3.0.dist-info}/WHEEL +0 -0
- {keep_skill-0.1.0.dist-info → keep_skill-0.3.0.dist-info}/entry_points.txt +0 -0
- {keep_skill-0.1.0.dist-info → keep_skill-0.3.0.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,290 +0,0 @@
|
|
|
1
|
-
Metadata-Version: 2.4
|
|
2
|
-
Name: keep-skill
|
|
3
|
-
Version: 0.1.0
|
|
4
|
-
Summary: Semantic memory - remember and search documents by meaning
|
|
5
|
-
Project-URL: Homepage, https://github.com/hughpyle/keep
|
|
6
|
-
Project-URL: Repository, https://github.com/hughpyle/keep
|
|
7
|
-
Author: Hugh Pyle
|
|
8
|
-
License: MIT
|
|
9
|
-
License-File: LICENSE
|
|
10
|
-
Keywords: agents,chromadb,embeddings,semantic-memory,vector-search
|
|
11
|
-
Classifier: Development Status :: 3 - Alpha
|
|
12
|
-
Classifier: Intended Audience :: Developers
|
|
13
|
-
Classifier: License :: OSI Approved :: MIT License
|
|
14
|
-
Classifier: Programming Language :: Python :: 3
|
|
15
|
-
Classifier: Programming Language :: Python :: 3.11
|
|
16
|
-
Classifier: Programming Language :: Python :: 3.12
|
|
17
|
-
Classifier: Programming Language :: Python :: 3.13
|
|
18
|
-
Classifier: Topic :: Software Development :: Libraries
|
|
19
|
-
Classifier: Topic :: Text Processing
|
|
20
|
-
Requires-Python: <3.14,>=3.11
|
|
21
|
-
Requires-Dist: chromadb>=0.4
|
|
22
|
-
Requires-Dist: tomli-w>=1.0
|
|
23
|
-
Requires-Dist: typer>=0.9
|
|
24
|
-
Provides-Extra: anthropic
|
|
25
|
-
Requires-Dist: anthropic>=0.40.0; extra == 'anthropic'
|
|
26
|
-
Provides-Extra: dev
|
|
27
|
-
Requires-Dist: pytest-cov>=4.0; extra == 'dev'
|
|
28
|
-
Requires-Dist: pytest>=7.0; extra == 'dev'
|
|
29
|
-
Provides-Extra: documents
|
|
30
|
-
Requires-Dist: beautifulsoup4>=4.9; extra == 'documents'
|
|
31
|
-
Requires-Dist: pypdf>=5.0; extra == 'documents'
|
|
32
|
-
Provides-Extra: gemini
|
|
33
|
-
Requires-Dist: google-genai>=1.0.0; extra == 'gemini'
|
|
34
|
-
Provides-Extra: local
|
|
35
|
-
Requires-Dist: beautifulsoup4>=4.9; extra == 'local'
|
|
36
|
-
Requires-Dist: mlx-lm>=0.10; (platform_system == 'Darwin' and platform_machine == 'arm64') and extra == 'local'
|
|
37
|
-
Requires-Dist: mlx>=0.10; (platform_system == 'Darwin' and platform_machine == 'arm64') and extra == 'local'
|
|
38
|
-
Requires-Dist: pypdf>=5.0; extra == 'local'
|
|
39
|
-
Requires-Dist: sentence-transformers>=2.2; extra == 'local'
|
|
40
|
-
Provides-Extra: mlx
|
|
41
|
-
Requires-Dist: mlx-lm>=0.10; extra == 'mlx'
|
|
42
|
-
Requires-Dist: mlx>=0.10; extra == 'mlx'
|
|
43
|
-
Provides-Extra: openai
|
|
44
|
-
Requires-Dist: openai>=1.0; extra == 'openai'
|
|
45
|
-
Provides-Extra: openclaw
|
|
46
|
-
Requires-Dist: anthropic>=0.18.0; extra == 'openclaw'
|
|
47
|
-
Requires-Dist: google-genai>=1.0.0; extra == 'openclaw'
|
|
48
|
-
Provides-Extra: sentence-transformers
|
|
49
|
-
Requires-Dist: sentence-transformers>=2.2; extra == 'sentence-transformers'
|
|
50
|
-
Description-Content-Type: text/markdown
|
|
51
|
-
|
|
52
|
-
# keep
|
|
53
|
-
|
|
54
|
-
**Associative memory for reflection and skillful action.**
|
|
55
|
-
|
|
56
|
-
---
|
|
57
|
-
|
|
58
|
-
## What is this?
|
|
59
|
-
|
|
60
|
-
A practice tool for agents who want to develop judgment.
|
|
61
|
-
|
|
62
|
-
An agent who rushes to act without checking memory will repeat mistakes, miss context, and fail to grow. An agent who reflects — before, during, after — becomes skillful. This library provides the mirror: persistent semantic memory that lets you ask "what do I already know?" before acting, and "what did I learn?" after.
|
|
63
|
-
|
|
64
|
-
For the full practice guide, see **[SKILL.md](SKILL.md)**.
|
|
65
|
-
|
|
66
|
-
Technically: semantic search using embeddings, backed by ChromaDB, with tag-based organization and recency decay. Available as CLI and Python API.
|
|
67
|
-
|
|
68
|
-
```python
|
|
69
|
-
from keep import Keeper
|
|
70
|
-
|
|
71
|
-
kp = Keeper()
|
|
72
|
-
|
|
73
|
-
# Before acting: what do I already know?
|
|
74
|
-
results = kp.find("how should we handle auth?")
|
|
75
|
-
|
|
76
|
-
# After learning: capture it for future you
|
|
77
|
-
kp.remember("User prefers OAuth2 with PKCE for authentication")
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
**The practice:**
|
|
81
|
-
- Pause before acting — check what you already know
|
|
82
|
-
- Notice breakdowns — when assumptions surface, that's valuable
|
|
83
|
-
- Reflect after — capture learnings so future you can find them
|
|
84
|
-
|
|
85
|
-
**The technology:**
|
|
86
|
-
- Semantic search (by meaning, not keywords)
|
|
87
|
-
- Persistent across sessions (ChromaDB)
|
|
88
|
-
- Tag-based organization and filtering
|
|
89
|
-
- Recency decay (recent items rank higher)
|
|
90
|
-
- Provider abstraction (local models or APIs)
|
|
91
|
-
- CLI and Python API
|
|
92
|
-
|
|
93
|
-
---
|
|
94
|
-
|
|
95
|
-
## Quick Start
|
|
96
|
-
|
|
97
|
-
### Requirements
|
|
98
|
-
|
|
99
|
-
- **Python:** 3.11, 3.12, or 3.13 (3.14+ not yet supported due to dependency constraints)
|
|
100
|
-
- **Installation time:** 3-5 minutes (ChromaDB dependency resolution + embedding model downloads)
|
|
101
|
-
|
|
102
|
-
### Installation
|
|
103
|
-
|
|
104
|
-
#### For users (just want the `keep` command)
|
|
105
|
-
|
|
106
|
-
```bash
|
|
107
|
-
# With pip:
|
|
108
|
-
pip install 'keep-skill[local]'
|
|
109
|
-
|
|
110
|
-
# Or with uv (faster, auto-manages isolated environment):
|
|
111
|
-
# Install uv first: https://docs.astral.sh/uv/getting-started/installation/
|
|
112
|
-
uv tool install 'keep-skill[local]'
|
|
113
|
-
```
|
|
114
|
-
|
|
115
|
-
#### For developers (working on keep itself)
|
|
116
|
-
|
|
117
|
-
```bash
|
|
118
|
-
git clone https://github.com/hughpyle/keep
|
|
119
|
-
cd keep
|
|
120
|
-
|
|
121
|
-
# Create and activate a virtual environment
|
|
122
|
-
python -m venv .venv
|
|
123
|
-
source .venv/bin/activate # On Windows: .venv\Scripts\activate
|
|
124
|
-
|
|
125
|
-
# Install in editable mode with local models
|
|
126
|
-
pip install -e '.[local,dev]'
|
|
127
|
-
|
|
128
|
-
# Or with uv (faster):
|
|
129
|
-
uv pip install -e '.[local,dev]'
|
|
130
|
-
```
|
|
131
|
-
|
|
132
|
-
#### Optional extras
|
|
133
|
-
|
|
134
|
-
```bash
|
|
135
|
-
# OpenClaw integration (uses your configured models):
|
|
136
|
-
pip install 'keep-skill[openclaw]'
|
|
137
|
-
|
|
138
|
-
# Minimal install (configure providers manually):
|
|
139
|
-
pip install keep-skill
|
|
140
|
-
```
|
|
141
|
-
|
|
142
|
-
**After installation:**
|
|
143
|
-
|
|
144
|
-
```bash
|
|
145
|
-
keep init
|
|
146
|
-
# ⚠️ Remember to add .keep/ to .gitignore
|
|
147
|
-
```
|
|
148
|
-
|
|
149
|
-
```python
|
|
150
|
-
from keep import Keeper
|
|
151
|
-
|
|
152
|
-
kp = Keeper()
|
|
153
|
-
|
|
154
|
-
# Index a file
|
|
155
|
-
kp.update("file:///path/to/document.md", source_tags={"project": "myapp"})
|
|
156
|
-
|
|
157
|
-
# Remember inline content
|
|
158
|
-
kp.remember("Important: rate limit is 100 req/min", source_tags={"topic": "api"})
|
|
159
|
-
|
|
160
|
-
# Semantic search
|
|
161
|
-
results = kp.find("what's the rate limit?", limit=5)
|
|
162
|
-
for r in results:
|
|
163
|
-
print(f"[{r.score:.2f}] {r.summary}")
|
|
164
|
-
|
|
165
|
-
# Tag lookup
|
|
166
|
-
api_docs = kp.query_tag("topic", "api")
|
|
167
|
-
```
|
|
168
|
-
|
|
169
|
-
See [docs/QUICKSTART.md](docs/QUICKSTART.md) for more examples.
|
|
170
|
-
|
|
171
|
-
---
|
|
172
|
-
|
|
173
|
-
## OpenClaw Integration
|
|
174
|
-
|
|
175
|
-
If you have [OpenClaw](https://openclaw.dev) configured, keep automatically uses your configured models:
|
|
176
|
-
|
|
177
|
-
```bash
|
|
178
|
-
# Install with OpenClaw support
|
|
179
|
-
pip install 'keep-skill[openclaw]'
|
|
180
|
-
|
|
181
|
-
# Set your Anthropic API key (if using Claude models)
|
|
182
|
-
export ANTHROPIC_API_KEY=sk-ant-...
|
|
183
|
-
|
|
184
|
-
# Initialize (auto-detects ~/.openclaw/openclaw.json)
|
|
185
|
-
keep init
|
|
186
|
-
# ✓ Detected providers:
|
|
187
|
-
# Embedding: sentence-transformers (local)
|
|
188
|
-
# Summarization: anthropic (claude-sonnet-4)
|
|
189
|
-
```
|
|
190
|
-
|
|
191
|
-
**Benefits:**
|
|
192
|
-
- 🔄 Unified model configuration (DRY principle)
|
|
193
|
-
- 🧠 Best of both: local embeddings + smart summarization
|
|
194
|
-
- 🔒 Privacy-preserving (embeddings stay local)
|
|
195
|
-
- 💰 Cost-effective (~$0.0001/document)
|
|
196
|
-
|
|
197
|
-
See [docs/OPENCLAW-INTEGRATION.md](docs/OPENCLAW-INTEGRATION.md) for details.
|
|
198
|
-
|
|
199
|
-
---
|
|
200
|
-
|
|
201
|
-
## Documentation
|
|
202
|
-
|
|
203
|
-
- **[SKILL.md](SKILL.md)** — The practice guide (start here for how to use memory skillfully)
|
|
204
|
-
- **[docs/QUICKSTART.md](docs/QUICKSTART.md)** — Installation, setup, configuration
|
|
205
|
-
- **[docs/AGENT-GUIDE.md](docs/AGENT-GUIDE.md)** — Detailed agent patterns, Python API
|
|
206
|
-
- **[docs/REFERENCE.md](docs/REFERENCE.md)** — Complete API reference
|
|
207
|
-
- **[docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)** — How it works under the hood
|
|
208
|
-
- **[docs/OPENCLAW-INTEGRATION.md](docs/OPENCLAW-INTEGRATION.md)** — OpenClaw integration guide
|
|
209
|
-
- **[patterns/](patterns/)** — Domain and conversation patterns
|
|
210
|
-
|
|
211
|
-
---
|
|
212
|
-
|
|
213
|
-
## Philosophy
|
|
214
|
-
|
|
215
|
-
### Practice
|
|
216
|
-
|
|
217
|
-
Memory isn't storage — it's a mirror for reflection.
|
|
218
|
-
|
|
219
|
-
The triple check: before acting (what do I know?), during (notice breakdowns), after (capture learning). Breakdowns are valuable — they reveal assumptions. Index them, don't hide them.
|
|
220
|
-
|
|
221
|
-
An agent without memory reacts to each moment as if it were new. An agent with memory reflects, learns, and grows. See **[SKILL.md](SKILL.md)** for the full practice guide.
|
|
222
|
-
|
|
223
|
-
### Technical Design
|
|
224
|
-
|
|
225
|
-
**Schema as Data** — Configuration stored as queryable documents, not hardcoded.
|
|
226
|
-
|
|
227
|
-
**Semantic by Default** — Search by meaning via vector similarity, not keywords.
|
|
228
|
-
|
|
229
|
-
**Lazy Loading** — Dependencies loaded only when needed; missing providers give helpful errors.
|
|
230
|
-
|
|
231
|
-
**Provider Agnostic** — Pluggable backends for embeddings, summarization, and storage.
|
|
232
|
-
|
|
233
|
-
**No Original Content** — Only summaries and embeddings stored. URIs can be re-fetched if needed.
|
|
234
|
-
|
|
235
|
-
---
|
|
236
|
-
|
|
237
|
-
## Status
|
|
238
|
-
|
|
239
|
-
**Current**: v0.1.0 — Early draft
|
|
240
|
-
|
|
241
|
-
**Working:**
|
|
242
|
-
- ✅ Core indexing (`update`, `remember`)
|
|
243
|
-
- ✅ Semantic search (`find`, `find_similar`)
|
|
244
|
-
- ✅ Tag queries and full-text search
|
|
245
|
-
- ✅ Embedding cache for performance
|
|
246
|
-
- ✅ Recency decay (ACT-R style)
|
|
247
|
-
- ✅ CLI interface
|
|
248
|
-
- ✅ Provider abstraction with lazy loading
|
|
249
|
-
|
|
250
|
-
**Planned** (see [later/](later/)):
|
|
251
|
-
- ⏳ Context management (working context, top-of-mind retrieval)
|
|
252
|
-
- ⏳ Private/shared routing
|
|
253
|
-
- ⏳ Relationship graphs between items
|
|
254
|
-
- ⏳ LLM-based tagging
|
|
255
|
-
|
|
256
|
-
---
|
|
257
|
-
|
|
258
|
-
## Requirements
|
|
259
|
-
|
|
260
|
-
- Python 3.11+
|
|
261
|
-
- ChromaDB (vector store)
|
|
262
|
-
- One embedding provider:
|
|
263
|
-
- sentence-transformers (local, default)
|
|
264
|
-
- MLX (Apple Silicon, local)
|
|
265
|
-
- OpenAI (API, requires key)
|
|
266
|
-
|
|
267
|
-
---
|
|
268
|
-
|
|
269
|
-
## License
|
|
270
|
-
|
|
271
|
-
MIT
|
|
272
|
-
|
|
273
|
-
---
|
|
274
|
-
|
|
275
|
-
## Contributing
|
|
276
|
-
|
|
277
|
-
This is an early draft. Issues and PRs welcome, especially for:
|
|
278
|
-
- Additional provider implementations
|
|
279
|
-
- Performance improvements
|
|
280
|
-
- Documentation clarity
|
|
281
|
-
- OpenClaw integration patterns
|
|
282
|
-
|
|
283
|
-
---
|
|
284
|
-
|
|
285
|
-
## Related Projects
|
|
286
|
-
|
|
287
|
-
- [ChromaDB](https://github.com/chroma-core/chroma) — Vector database backend
|
|
288
|
-
- [sentence-transformers](https://github.com/UKPLab/sentence-transformers) — Embedding models
|
|
289
|
-
- [MLX](https://github.com/ml-explore/mlx) — Apple Silicon ML framework
|
|
290
|
-
- [OpenClaw](https://openclaw.dev) — Agent framework (integration target)
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
keep/__init__.py,sha256=NwdXFUPjU-allCi_LrNP0wx_vosyISRkbMvzjfjoLWE,1683
|
|
2
|
-
keep/__main__.py,sha256=3Uu70IhIDIjh8OW6jp9jQQ3dF2lKdJWi_3FtRIQMiMY,104
|
|
3
|
-
keep/api.py,sha256=x-RgHCTiSLiEfrD7SaUief8oNvZfWsapS4HvF4Skf40,23236
|
|
4
|
-
keep/chunking.py,sha256=neAXOLSvVwbUxapbqq7nZrbSNSzMXuhxj-ODoOSodsU,11830
|
|
5
|
-
keep/cli.py,sha256=Y1qAkAERNhY4rbYeQAYXyDnY-L5_zO02OuANEQnNR-Y,14288
|
|
6
|
-
keep/config.py,sha256=afRHZUxU7gpguCAVItZSeb_Q6Nm7vukBdXtd8X3NoKQ,10662
|
|
7
|
-
keep/context.py,sha256=iQGjkOkDeYEba01JqJ54yMTEDxbhT34ijoaURnOXMRo,4627
|
|
8
|
-
keep/indexing.py,sha256=NsiiGvkMJ4tUl7_PJw0aLBl9mKunMVy1M8csSHkd9Pw,6062
|
|
9
|
-
keep/logging_config.py,sha256=gFi-PEPLucztChHByOHEVjt-v6erK76p1EZAlOCHSHk,2453
|
|
10
|
-
keep/paths.py,sha256=_iLYeuqcsAz-PtNhBqtvhOoncc8XxlSq-fahszYMJaU,1662
|
|
11
|
-
keep/pending_summaries.py,sha256=Py0Q6tuq_eTUfTFs0-KEEolYW4oOaYMTF7It9BjLGo4,5165
|
|
12
|
-
keep/store.py,sha256=iIUvl4w7bn_JFWCjmMt7TW8c2JM6gJ1s3kDW6FOSuHs,13074
|
|
13
|
-
keep/types.py,sha256=f6uOSYsYt6mj1ulKn2iRkooi__dWCiOQFPD6he2eID4,2149
|
|
14
|
-
keep/providers/__init__.py,sha256=GFX_12g9OdjmpFUkTekOQBOWvcRW2Ae6yidfVVW2SiI,1095
|
|
15
|
-
keep/providers/base.py,sha256=7Ug4Kj9fK2Dq4zDcZjn-GKsoZBOAlB9b-FMk969ER-g,14590
|
|
16
|
-
keep/providers/documents.py,sha256=EXeSy5i3RUL0kciIC6w3ldAEfbTIyC5fgfzC_WAI0iY,8211
|
|
17
|
-
keep/providers/embedding_cache.py,sha256=JzJmprYk2v5vv5eF9vO1Yegt7VdHkSQguReqvEtOCrM,8360
|
|
18
|
-
keep/providers/embeddings.py,sha256=vB-Ffio4oEHBnu-xCX9SJpN1x661koJiRWYlZps7Jwo,7632
|
|
19
|
-
keep/providers/llm.py,sha256=BxROKOklKbkGsHcSADPNNgWQExgSN6Bg4KPQIxVuB3U,12441
|
|
20
|
-
keep/providers/mlx.py,sha256=9g7Rfl04jL_aWoY9C-OEtjCwhG6zlEWHwFpYGTSHArA,9022
|
|
21
|
-
keep/providers/summarization.py,sha256=MlVTcYipaqp2lT-QYnznp0AMuPVG36QfcTQnvY7Gb-Q,3409
|
|
22
|
-
keep_skill-0.1.0.dist-info/METADATA,sha256=gSyRYmNdU5N-elV6Z6PN5QTIIRo25eTfBea7AQvKwP8,8892
|
|
23
|
-
keep_skill-0.1.0.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
|
|
24
|
-
keep_skill-0.1.0.dist-info/entry_points.txt,sha256=W8yiI4kNeW0IC8ji4EHRWrvdhFxzaqTIePUhJAJAMOo,39
|
|
25
|
-
keep_skill-0.1.0.dist-info/licenses/LICENSE,sha256=zsm0tpvtyUkevcjn5BIvs9jAho8iwxq3Ax9647AaOSg,1086
|
|
26
|
-
keep_skill-0.1.0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|