okb 1.1.0__py3-none-any.whl → 1.1.0a0__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.
okb/modal_llm.py CHANGED
@@ -2,34 +2,20 @@
2
2
  Modal-based GPU LLM service for document classification.
3
3
 
4
4
  Provides on-demand GPU access for LLM inference using open models.
5
+ Uses Llama 3.2 3B by default - fast and efficient for classification tasks.
5
6
 
6
7
  Usage:
7
- # Deploy with default model (Phi-3)
8
8
  modal deploy modal_llm.py
9
9
 
10
- # Deploy with specific model
11
- OKB_LLM_MODEL=meta-llama/Llama-3.2-3B-Instruct modal deploy modal_llm.py
12
-
13
10
  Then call from Python:
14
11
  llm = modal.Cls.from_name("knowledge-llm", "LLM")()
15
12
  response = llm.complete.remote("Classify this document", system="You are a classifier")
16
13
  """
17
14
 
18
- import os
19
-
20
15
  import modal
21
16
 
22
17
  app = modal.App("knowledge-llm")
23
18
 
24
- # Model is set via environment variable at deploy time
25
- # Default to Phi-3 which doesn't require HuggingFace approval
26
- DEFAULT_MODEL = "microsoft/Phi-3-mini-4k-instruct"
27
- MODEL_ID = os.environ.get("OKB_LLM_MODEL", DEFAULT_MODEL)
28
-
29
- # GPU type - L4 recommended for speed/cost balance
30
- DEFAULT_GPU = "L4"
31
- GPU_TYPE = os.environ.get("OKB_MODAL_GPU", DEFAULT_GPU)
32
-
33
19
  # Container image with transformers and torch
34
20
  llm_image = (
35
21
  modal.Image.debian_slim(python_version="3.11")
@@ -38,19 +24,17 @@ llm_image = (
38
24
  "torch>=2.0.0",
39
25
  "accelerate>=0.27.0",
40
26
  "bitsandbytes>=0.42.0", # For quantization
41
- "hf_transfer", # Fast downloads
42
27
  )
43
- .env({
44
- "HF_HUB_ENABLE_HF_TRANSFER": "1",
45
- "OKB_LLM_MODEL": MODEL_ID,
46
- "OKB_MODAL_GPU": GPU_TYPE,
47
- })
28
+ .env({"HF_HUB_ENABLE_HF_TRANSFER": "1"})
48
29
  )
49
30
 
31
+ # Default model - Llama 3.2 3B is fast and good for classification
32
+ DEFAULT_MODEL = "meta-llama/Llama-3.2-3B-Instruct"
33
+
50
34
 
51
35
  @app.cls(
52
36
  image=llm_image,
53
- gpu=GPU_TYPE,
37
+ gpu="T4", # T4 is sufficient for 3B model with quantization
54
38
  timeout=300,
55
39
  scaledown_window=300, # Keep warm for 5 min
56
40
  retries=1,
@@ -58,16 +42,14 @@ llm_image = (
58
42
  class LLM:
59
43
  """GPU-accelerated LLM for document classification."""
60
44
 
45
+ model_id: str = DEFAULT_MODEL
46
+
61
47
  @modal.enter()
62
48
  def load_model(self):
63
49
  """Load model once when container starts."""
64
- import os
65
-
66
50
  import torch
67
51
  from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig
68
52
 
69
- # Read model from environment (set at deploy time)
70
- self.model_id = os.environ.get("OKB_LLM_MODEL", "microsoft/Phi-3-mini-4k-instruct")
71
53
  print(f"Loading model: {self.model_id}")
72
54
 
73
55
  # Use 4-bit quantization for memory efficiency
@@ -95,11 +95,11 @@ class GitHubSource:
95
95
  token: ${GITHUB_TOKEN}
96
96
 
97
97
  Usage:
98
- okb sync run github --repo owner/repo # README + docs/ (default)
99
- okb sync run github --repo owner/repo --source # All source files
100
- okb sync run github --repo owner/repo --issues # Include issues
101
- okb sync run github --repo owner/repo --prs # Include PRs
102
- okb sync run github --repo owner/repo --wiki # Include wiki
98
+ lkb sync run github --repo owner/repo # README + docs/ (default)
99
+ lkb sync run github --repo owner/repo --source # All source files
100
+ lkb sync run github --repo owner/repo --issues # Include issues
101
+ lkb sync run github --repo owner/repo --prs # Include PRs
102
+ lkb sync run github --repo owner/repo --wiki # Include wiki
103
103
  """
104
104
 
105
105
  name = "github"
okb/tokens.py CHANGED
@@ -22,7 +22,6 @@ from psycopg.rows import dict_row
22
22
  class TokenInfo:
23
23
  """Information about a token."""
24
24
 
25
- id: int
26
25
  token_hash: str
27
26
  database: str
28
27
  permissions: str # 'ro' or 'rw'
@@ -144,7 +143,7 @@ def list_tokens(db_url: str) -> list[TokenInfo]:
144
143
  with psycopg.connect(db_url, row_factory=dict_row) as conn:
145
144
  results = conn.execute(
146
145
  """
147
- SELECT id, token_hash, permissions, description, created_at, last_used_at
146
+ SELECT token_hash, permissions, description, created_at, last_used_at
148
147
  FROM tokens
149
148
  ORDER BY created_at DESC
150
149
  """
@@ -152,7 +151,6 @@ def list_tokens(db_url: str) -> list[TokenInfo]:
152
151
 
153
152
  return [
154
153
  TokenInfo(
155
- id=r["id"],
156
154
  token_hash=r["token_hash"],
157
155
  database=db_name,
158
156
  permissions=r["permissions"],
@@ -173,7 +171,7 @@ def delete_token(db_url: str, token_or_prefix: str) -> bool:
173
171
 
174
172
  Args:
175
173
  db_url: Database connection URL
176
- token_or_prefix: Full token or token prefix (e.g., 'okb_personal_ro')
174
+ token_or_prefix: Full token or token prefix (e.g., 'lkb_personal_ro')
177
175
 
178
176
  Returns:
179
177
  True if token was deleted, False if not found
@@ -201,25 +199,6 @@ def delete_token(db_url: str, token_or_prefix: str) -> bool:
201
199
  return False
202
200
 
203
201
 
204
- def delete_token_by_id(db_url: str, token_id: int) -> bool:
205
- """Delete a token by its ID.
206
-
207
- Args:
208
- db_url: Database connection URL
209
- token_id: Token ID from the tokens table
210
-
211
- Returns:
212
- True if token was deleted, False if not found
213
- """
214
- with psycopg.connect(db_url) as conn:
215
- result = conn.execute(
216
- "DELETE FROM tokens WHERE id = %s RETURNING id",
217
- (token_id,),
218
- ).fetchone()
219
- conn.commit()
220
- return result is not None
221
-
222
-
223
202
  def verify_token(token: str, get_db_url_fn) -> TokenInfo | None:
224
203
  """Verify a token and return its info if valid.
225
204
 
@@ -246,7 +225,7 @@ def verify_token(token: str, get_db_url_fn) -> TokenInfo | None:
246
225
  with psycopg.connect(db_url, row_factory=dict_row) as conn:
247
226
  result = conn.execute(
248
227
  """
249
- SELECT id, token_hash, permissions, description, created_at, last_used_at
228
+ SELECT token_hash, permissions, description, created_at, last_used_at
250
229
  FROM tokens
251
230
  WHERE token_hash = %s
252
231
  """,
@@ -264,7 +243,6 @@ def verify_token(token: str, get_db_url_fn) -> TokenInfo | None:
264
243
  conn.commit()
265
244
 
266
245
  return TokenInfo(
267
- id=result["id"],
268
246
  token_hash=result["token_hash"],
269
247
  database=database,
270
248
  permissions=result["permissions"],
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: okb
3
- Version: 1.1.0
3
+ Version: 1.1.0a0
4
4
  Summary: Personal knowledge base with semantic search for LLMs
5
5
  Requires-Python: >=3.11
6
6
  Classifier: Programming Language :: Python :: 3
@@ -85,8 +85,6 @@ okb ingest ~/notes ~/docs
85
85
  | `okb db start` | Start pgvector database container |
86
86
  | `okb db stop` | Stop database container |
87
87
  | `okb db status` | Show database status |
88
- | `okb db migrate [name]` | Apply pending migrations (optionally for specific db) |
89
- | `okb db list` | List configured databases |
90
88
  | `okb db destroy` | Remove container and volume (destructive) |
91
89
  | `okb ingest <paths>` | Ingest documents into knowledge base |
92
90
  | `okb ingest <paths> --local` | Ingest using local GPU/CPU embedding (no Modal) |
@@ -95,11 +93,10 @@ okb ingest ~/notes ~/docs
95
93
  | `okb watch <paths>` | Watch directories for changes |
96
94
  | `okb config init` | Create default config file |
97
95
  | `okb config show` | Show current configuration |
98
- | `okb config path` | Print config file path |
99
96
  | `okb modal deploy` | Deploy GPU embedder to Modal |
100
97
  | `okb token create` | Create API token for HTTP server |
101
98
  | `okb token list` | List tokens for a database |
102
- | `okb token revoke [TOKEN] --id <n>` | Revoke token by full value or ID |
99
+ | `okb token revoke` | Revoke an API token |
103
100
  | `okb sync list` | List available API sources (plugins) |
104
101
  | `okb sync list-projects <source>` | List projects from source (for config) |
105
102
  | `okb sync run <sources>` | Sync data from external APIs |
@@ -111,18 +108,6 @@ okb ingest ~/notes ~/docs
111
108
  | `okb llm status` | Show LLM config and connectivity |
112
109
  | `okb llm deploy` | Deploy Modal LLM for open model inference |
113
110
  | `okb llm clear-cache` | Clear LLM response cache |
114
- | `okb enrich run` | Extract TODOs and entities from documents |
115
- | `okb enrich run --dry-run` | Show what would be enriched |
116
- | `okb enrich pending` | List entities awaiting review |
117
- | `okb enrich approve <id>` | Approve a pending entity |
118
- | `okb enrich reject <id>` | Reject a pending entity |
119
- | `okb enrich analyze` | Analyze database and update description/topics |
120
- | `okb enrich consolidate` | Run entity consolidation (duplicates, clusters) |
121
- | `okb enrich merge-proposals` | List pending merge proposals |
122
- | `okb enrich approve-merge <id>` | Approve an entity merge |
123
- | `okb enrich reject-merge <id>` | Reject an entity merge |
124
- | `okb enrich clusters` | List topic clusters |
125
- | `okb enrich relationships` | List entity relationships |
126
111
 
127
112
 
128
113
  ## Configuration
@@ -157,7 +142,7 @@ chunking:
157
142
  Use `--db <name>` to target a specific database with any command.
158
143
 
159
144
  Environment variables override config file settings:
160
- - `OKB_DATABASE_URL` - Database connection string
145
+ - `KB_DATABASE_URL` - Database connection string
161
146
  - `OKB_DOCKER_PORT` - Docker port mapping
162
147
  - `OKB_CONTAINER_NAME` - Docker container name
163
148
 
@@ -178,7 +163,7 @@ Merge: scalars replace, lists extend, dicts deep-merge.
178
163
 
179
164
  ### LLM Integration (Optional)
180
165
 
181
- Enable LLM-based document classification, filtering, and enrichment:
166
+ Enable LLM-based document classification and filtering:
182
167
 
183
168
  ```yaml
184
169
  llm:
@@ -194,25 +179,11 @@ llm:
194
179
  | `claude` | `export ANTHROPIC_API_KEY=...` | ~$0.25/1M tokens |
195
180
  | `modal` | `okb llm deploy` | ~$0.02/min GPU |
196
181
 
197
- **Modal LLM Setup** (no API key needed, runs on Modal's GPUs):
198
-
182
+ For Modal (no API key needed):
199
183
  ```yaml
200
184
  llm:
201
185
  provider: modal
202
- model: microsoft/Phi-3-mini-4k-instruct # Recommended: no gating
203
- ```
204
-
205
- Non-gated models (work immediately):
206
- - `microsoft/Phi-3-mini-4k-instruct` - Good quality, 4K context
207
- - `Qwen/Qwen2-1.5B-Instruct` - Smaller/faster
208
-
209
- Gated models (require HuggingFace approval + token):
210
- - `meta-llama/Llama-3.2-3B-Instruct` - Requires accepting license at HuggingFace
211
- - Setup: `modal secret create huggingface HF_TOKEN=hf_...`
212
-
213
- Deploy after configuring:
214
- ```bash
215
- okb llm deploy
186
+ model: meta-llama/Llama-3.2-3B-Instruct
216
187
  ```
217
188
 
218
189
  **Pre-ingest filtering** - skip low-value content during sync:
@@ -226,36 +197,6 @@ plugins:
226
197
  action_on_skip: discard # or "archive"
227
198
  ```
228
199
 
229
- ### Document Enrichment
230
-
231
- Extract TODOs and entities (people, projects, technologies) from documents using LLM:
232
-
233
- ```bash
234
- okb enrich run # Enrich un-enriched documents
235
- okb enrich run --dry-run # Preview what would be enriched
236
- okb enrich run --source-type markdown # Only markdown files
237
- okb enrich run --query "meeting" # Filter by semantic search
238
- ```
239
-
240
- Entities are created as pending suggestions for review:
241
- ```bash
242
- okb enrich pending # List pending entities
243
- okb enrich approve <id> # Approve → creates entity document
244
- okb enrich reject <id> # Reject → hidden from future suggestions
245
- ```
246
-
247
- Configure enrichment behavior:
248
- ```yaml
249
- enrichment:
250
- enabled: true
251
- extract_todos: true
252
- extract_entities: true
253
- auto_create_todos: true # TODOs created immediately
254
- auto_create_entities: false # Entities go to pending review
255
- min_confidence_todo: 0.7
256
- min_confidence_entity: 0.8
257
- ```
258
-
259
200
  CLI commands:
260
201
  ```bash
261
202
  okb llm status # Show config and connectivity
@@ -328,20 +269,6 @@ Then configure Claude Code to connect via SSE:
328
269
  | `add_todo` | Create a TODO item in the knowledge base |
329
270
  | `trigger_sync` | Sync API sources (Todoist, GitHub, Dropbox Paper) |
330
271
  | `trigger_rescan` | Check indexed files for changes and re-ingest |
331
- | `list_sync_sources` | List available API sync sources with status |
332
- | `enrich_document` | Run LLM enrichment to extract TODOs/entities |
333
- | `list_pending_entities` | List entities awaiting review |
334
- | `approve_entity` | Approve a pending entity |
335
- | `reject_entity` | Reject a pending entity |
336
- | `analyze_knowledge_base` | Analyze content and generate description/topics |
337
- | `find_entity_duplicates` | Find potential duplicate entities |
338
- | `merge_entities` | Merge duplicate entities |
339
- | `list_pending_merges` | List pending merge proposals |
340
- | `approve_merge` | Approve a merge proposal |
341
- | `reject_merge` | Reject a merge proposal |
342
- | `get_topic_clusters` | Get topic clusters from consolidation |
343
- | `get_entity_relationships` | Get relationships between entities |
344
- | `run_consolidation` | Run full entity consolidation pipeline |
345
272
 
346
273
  ## Contextual Chunking
347
274
 
@@ -364,10 +291,6 @@ project: student-app
364
291
  category: backend
365
292
  ---
366
293
 
367
- # Your Document Title
368
-
369
- Content here...
370
- ```
371
294
 
372
295
  ## Plugin System
373
296
 
@@ -1,25 +1,16 @@
1
1
  okb/__init__.py,sha256=2yaWIYQbho7N2O2zwTn3ZH11b8b3SaoDVlxluVTqwy4,92
2
- okb/cli.py,sha256=8v_SaXFOrJYrCPSr6JgIqqzFHHYpPlHvan4CLaYUDTs,88639
3
- okb/config.py,sha256=vKDC6b6Tm3_XZzvn7nA9WlGCWzCT8vtV9AvLes02YW8,28562
2
+ okb/cli.py,sha256=y8Vr9Scy7PyAtgrCb2yIsN3kRvhwUvxpnpiF6RVV_MA,47735
3
+ okb/config.py,sha256=DKmX2fgteGdh0QMsA-Immu-mZcvLjHWeB8HIf9rcM5o,22898
4
4
  okb/data/init.sql,sha256=QpsicUN7PQ7d8zyOCRNChOu5XKdUVC3xySlRDPyKSN8,2728
5
- okb/http_server.py,sha256=JFW5sXuZ0V0egHb_fyytNBORbNdqf9btAhQ_BUYiGUc,27636
5
+ okb/http_server.py,sha256=jcpNWB1aGtcHE7h0U4gCxA4lZyqWHGgsiArv7DyPSZw,20595
6
6
  okb/ingest.py,sha256=D5plxCC2tQXZenMNUa482dUDqsyuaq2APAQqaIgRAqU,54505
7
7
  okb/llm/__init__.py,sha256=4jelqgXvF-eEPyLCuAmcxagN0H923wI9pBJJZKv4r0E,2368
8
- okb/llm/analyze.py,sha256=BKW308AtjWStZcZiMKaRqFmQsuTclp3Qp3W4nsdw4vk,18569
9
8
  okb/llm/base.py,sha256=gOm7zBiNdHrj7xxJfpb-4qZdYxWM0lA0vKfrBStO60E,2279
10
9
  okb/llm/cache.py,sha256=rxRPMNBtP336MSpGWA8F7rDZnF0O2RM3rEsNtoxS0Zk,6142
11
- okb/llm/consolidate.py,sha256=TjXBWzzlJrX3_z0CysrFAxclp1K7XGgMb_SI5hdK7Y8,23178
12
- okb/llm/enrich.py,sha256=Yc09xvXynuiCATK451J5sBQ9lkPPllio8vAPYOEVDFo,23133
13
- okb/llm/extractors/__init__.py,sha256=8sHgtgtydF4CBFiIOfURYcyunVxK770qp_aMz4jxnFU,317
14
- okb/llm/extractors/base.py,sha256=p_PIMdUoEw8-C5jG8TcbG73jegE5ovmIGbbbdDrRFVs,1250
15
- okb/llm/extractors/cross_doc.py,sha256=nw1-nHSHKxGlL95rfHFkStdbzpy4H3eRclyUyn2YE1A,18114
16
- okb/llm/extractors/dedup.py,sha256=TVDBhNX7rPmpipO2WckAhe_Oj1LmSRPce-EceZ6FdbM,16562
17
- okb/llm/extractors/entity.py,sha256=woIF5AeXD2dmFDoiOVCPgMUVWQPYHOmg1KE-ZRB3o0E,9925
18
- okb/llm/extractors/todo.py,sha256=LdAyioQ5fZ-KJC_W_-CAU8OlMvju3Oci7E7aueoTnpI,4345
19
10
  okb/llm/filter.py,sha256=y20bc3vHtp5gj7T7AhsJ45ZkAkBgztj6WPjsVAmvEeo,5447
20
- okb/llm/providers.py,sha256=SpbEpJYSQHc43qyvBdv2IuUNKsf0_NfDmnooNM1tzHc,9838
11
+ okb/llm/providers.py,sha256=AdVw9FFgv58-KJEfXv9JqWlkxBl-LcRWOao95CsjqWA,9718
21
12
  okb/local_embedder.py,sha256=zzjBUFp4IH2xsvKyKjKZyX9dJuE_3PDMHMwpyRYSISQ,2098
22
- okb/mcp_server.py,sha256=IUEGo4xmo2HhvKHhgeADqvNxICk4dBTX-6BNSmi8fkY,98610
13
+ okb/mcp_server.py,sha256=BnMxyGf524sK-8CYPyL3ZM_DEqWFsXpF7_66xj3-Ecs,59407
23
14
  okb/migrate.py,sha256=2faYL-SHiQCkGXpTUlBFMCj0B-6JYCHqZl9u6vOlui8,1693
24
15
  okb/migrations/0001.initial-schema.sql,sha256=0s5pj9Ad6f0u_mxODAM_-DbDI3aI37Wdu5XMPAzAIqw,2577
25
16
  okb/migrations/0002.sync-state.sql,sha256=w34dOA9sPg60NMS1aHvOhORff1k_Di9cO2ghwVQSPHU,696
@@ -27,23 +18,20 @@ okb/migrations/0003.structured-fields.sql,sha256=rPCSrdtotCoRpOfjHf1Ifx0pfizpYS9
27
18
  okb/migrations/0004.tokens.sql,sha256=VtcLfA1_SVVQLkEKZ-av_93Fg0ksVWLm1tlR7nJXoaQ,448
28
19
  okb/migrations/0005.database-metadata.sql,sha256=0X4LyuUUX34s3ph2C70FnBBau5HEBwR4xyY-hwPEX90,709
29
20
  okb/migrations/0006.llm-cache.sql,sha256=azjPpj00WH_8tx4JI8PJKZ1AOAJEhbkneVvYa3ZRZ1w,493
30
- okb/migrations/0008.enrichment.sql,sha256=pkKtyuFgRiPhZ7YAyYr6yihT2R-Tx64hE18iqphqFAw,2160
31
- okb/migrations/0009.entity-consolidation.sql,sha256=Q2TBHJqMa1fvAqaopa20KdJCIxqldDAeOPGC5YiuzxY,5800
32
- okb/migrations/0010.token-id.sql,sha256=odFPvY3z63f6Zfx8j5qBj2LobvPafpT2hDi_MwBBf6Q,231
33
21
  okb/modal_embedder.py,sha256=V1cpGWrtEo1MGkrD9Nc-5wRmf9e7IwKPsQj7nVuLlyg,3469
34
- okb/modal_llm.py,sha256=NpCykbjlhUUdQNQ4NMLu-uEBFJbYwJDV2NdnwUZeG84,5903
22
+ okb/modal_llm.py,sha256=4rYE3VZ_T09HXCgTIYFLu1s_C2FRC9y4dgMUGqJuO2M,5368
35
23
  okb/plugins/__init__.py,sha256=50LNAH4bvfIw5CHT82sknGjdCldQ-4ds0wxo1zM9E2k,324
36
24
  okb/plugins/base.py,sha256=6TIN1UIItmuIsP4NDJhuRMH0ngKkQiGmtHTeYj1K8OU,3171
37
25
  okb/plugins/registry.py,sha256=fN7NfoOaRnMyXSWT2srd6vEr4riJjmncQFfberf0IE8,3741
38
26
  okb/plugins/sources/__init__.py,sha256=n58rAbcJC45JbofUY6IA526rSRjkYn4_tGjWma3TOUI,214
39
27
  okb/plugins/sources/dropbox_paper.py,sha256=Oi59NbJGQrwjE2Xhcinc2InKRc27Gdg7l8xVTbKLkI8,7493
40
- okb/plugins/sources/github.py,sha256=YlwsY2hRKlGTyHL5L4vCC1TP-b6WJzEYbPDEXnB4y-I,16309
28
+ okb/plugins/sources/github.py,sha256=ozdTZPkU8h2-ZIx5o1FB58QBZ6P0eoVntluWL3vG87I,16309
41
29
  okb/plugins/sources/todoist.py,sha256=B22tKYFZhuDhZHhpRdGWDGho9y7FBNgGlI1g2nf13-8,8849
42
30
  okb/rescan.py,sha256=dVdQEkVUjsrtOKAGZc0LC2uwcnkjB8hn2SOVWHnY-R8,8396
43
31
  okb/scripts/__init__.py,sha256=HPp8YCtIeo9XMOtOGCtntiwYr9eCxAJ1MF9Lo9WVzUA,53
44
32
  okb/scripts/watch.py,sha256=b8oGPTN3flNdNQJETeqQ1RNZ8U1LiKvHntLwvHRIviA,6354
45
- okb/tokens.py,sha256=3Of_PwNCTTexXC3d-EAiPjLdsbyk2F_dTeY30O3mqp8,8635
46
- okb-1.1.0.dist-info/METADATA,sha256=3Hq4DxyrlEZYa3DhKbbBY1irBmyFZ76gJGGDt9QCPOc,13836
47
- okb-1.1.0.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
48
- okb-1.1.0.dist-info/entry_points.txt,sha256=YX6b8BlV9sSAXrneoIm3dkXtRcgHhSzbDaOpJ0yCKRs,230
49
- okb-1.1.0.dist-info/RECORD,,
33
+ okb/tokens.py,sha256=JJ1C-mvtnT2O0cmjSu57PI9Nt53Sl9DqbmPuLnHlN6g,8043
34
+ okb-1.1.0a0.dist-info/METADATA,sha256=IhNkQv-lucqtYIaXcNfxkKFkSD5Avo3Vy5buDbXHELo,10578
35
+ okb-1.1.0a0.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
36
+ okb-1.1.0a0.dist-info/entry_points.txt,sha256=YX6b8BlV9sSAXrneoIm3dkXtRcgHhSzbDaOpJ0yCKRs,230
37
+ okb-1.1.0a0.dist-info/RECORD,,