haiku.rag 0.10.1__py3-none-any.whl → 0.10.2__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.
haiku/rag/app.py CHANGED
@@ -1,4 +1,6 @@
1
1
  import asyncio
2
+ import json
3
+ from importlib.metadata import version as pkg_version
2
4
  from pathlib import Path
3
5
 
4
6
  from rich.console import Console
@@ -25,26 +27,141 @@ class HaikuRAGApp:
25
27
  self.db_path = db_path
26
28
  self.console = Console()
27
29
 
30
+ async def info(self):
31
+ """Display read-only information about the database without modifying it."""
32
+
33
+ import lancedb
34
+
35
+ # Basic: show path
36
+ self.console.print("[bold]haiku.rag database info[/bold]")
37
+ self.console.print(
38
+ f" [repr.attrib_name]path[/repr.attrib_name]: {self.db_path}"
39
+ )
40
+
41
+ if not self.db_path.exists():
42
+ self.console.print("[red]Database path does not exist.[/red]")
43
+ return
44
+
45
+ # Connect without going through Store to avoid upgrades/validation writes
46
+ try:
47
+ db = lancedb.connect(self.db_path)
48
+ table_names = set(db.table_names())
49
+ except Exception as e:
50
+ self.console.print(f"[red]Failed to open database: {e}[/red]")
51
+ return
52
+
53
+ try:
54
+ ldb_version = pkg_version("lancedb")
55
+ except Exception:
56
+ ldb_version = "unknown"
57
+ try:
58
+ hr_version = pkg_version("haiku.rag")
59
+ except Exception:
60
+ hr_version = "unknown"
61
+ try:
62
+ docling_version = pkg_version("docling")
63
+ except Exception:
64
+ docling_version = "unknown"
65
+
66
+ # Read settings (if present) to find stored haiku.rag version and embedding config
67
+ stored_version = "unknown"
68
+ embed_provider: str | None = None
69
+ embed_model: str | None = None
70
+ vector_dim: int | None = None
71
+
72
+ if "settings" in table_names:
73
+ settings_tbl = db.open_table("settings")
74
+ arrow = settings_tbl.search().where("id = 'settings'").limit(1).to_arrow()
75
+ rows = arrow.to_pylist() if arrow is not None else []
76
+ if rows:
77
+ raw = rows[0].get("settings") or "{}"
78
+ data = json.loads(raw) if isinstance(raw, str) else (raw or {})
79
+ stored_version = str(data.get("version", stored_version))
80
+ embed_provider = data.get("EMBEDDINGS_PROVIDER")
81
+ embed_model = data.get("EMBEDDINGS_MODEL")
82
+ vector_dim = (
83
+ int(data.get("EMBEDDINGS_VECTOR_DIM")) # pyright: ignore[reportArgumentType]
84
+ if data.get("EMBEDDINGS_VECTOR_DIM") is not None
85
+ else None
86
+ )
87
+
88
+ num_docs = 0
89
+ if "documents" in table_names:
90
+ docs_tbl = db.open_table("documents")
91
+ num_docs = int(docs_tbl.count_rows()) # type: ignore[attr-defined]
92
+
93
+ # Table versions per table (direct API)
94
+ doc_versions = (
95
+ len(list(db.open_table("documents").list_versions()))
96
+ if "documents" in table_names
97
+ else 0
98
+ )
99
+ chunk_versions = (
100
+ len(list(db.open_table("chunks").list_versions()))
101
+ if "chunks" in table_names
102
+ else 0
103
+ )
104
+
105
+ self.console.print(
106
+ f" [repr.attrib_name]haiku.rag version (db)[/repr.attrib_name]: {stored_version}"
107
+ )
108
+ if embed_provider or embed_model or vector_dim:
109
+ provider_part = embed_provider or "unknown"
110
+ model_part = embed_model or "unknown"
111
+ dim_part = f"{vector_dim}" if vector_dim is not None else "unknown"
112
+ self.console.print(
113
+ " [repr.attrib_name]embeddings[/repr.attrib_name]: "
114
+ f"{provider_part}/{model_part} (dim: {dim_part})"
115
+ )
116
+ else:
117
+ self.console.print(
118
+ " [repr.attrib_name]embeddings[/repr.attrib_name]: unknown"
119
+ )
120
+ self.console.print(
121
+ f" [repr.attrib_name]documents[/repr.attrib_name]: {num_docs}"
122
+ )
123
+ self.console.print(
124
+ f" [repr.attrib_name]versions (documents)[/repr.attrib_name]: {doc_versions}"
125
+ )
126
+ self.console.print(
127
+ f" [repr.attrib_name]versions (chunks)[/repr.attrib_name]: {chunk_versions}"
128
+ )
129
+ self.console.rule()
130
+ self.console.print("[bold]Versions[/bold]")
131
+ self.console.print(
132
+ f" [repr.attrib_name]haiku.rag[/repr.attrib_name]: {hr_version}"
133
+ )
134
+ self.console.print(
135
+ f" [repr.attrib_name]lancedb[/repr.attrib_name]: {ldb_version}"
136
+ )
137
+ self.console.print(
138
+ f" [repr.attrib_name]docling[/repr.attrib_name]: {docling_version}"
139
+ )
140
+
28
141
  async def list_documents(self):
29
142
  async with HaikuRAG(db_path=self.db_path) as self.client:
30
143
  documents = await self.client.list_documents()
31
144
  for doc in documents:
32
145
  self._rich_print_document(doc, truncate=True)
33
146
 
34
- async def add_document_from_text(self, text: str):
147
+ async def add_document_from_text(self, text: str, metadata: dict | None = None):
35
148
  async with HaikuRAG(db_path=self.db_path) as self.client:
36
- doc = await self.client.create_document(text)
149
+ doc = await self.client.create_document(text, metadata=metadata)
37
150
  self._rich_print_document(doc, truncate=True)
38
151
  self.console.print(
39
- f"[b]Document with id [cyan]{doc.id}[/cyan] added successfully.[/b]"
152
+ f"[bold green]Document {doc.id} added successfully.[/bold green]"
40
153
  )
41
154
 
42
- async def add_document_from_source(self, source: str, title: str | None = None):
155
+ async def add_document_from_source(
156
+ self, source: str, title: str | None = None, metadata: dict | None = None
157
+ ):
43
158
  async with HaikuRAG(db_path=self.db_path) as self.client:
44
- doc = await self.client.create_document_from_source(source, title=title)
159
+ doc = await self.client.create_document_from_source(
160
+ source, title=title, metadata=metadata
161
+ )
45
162
  self._rich_print_document(doc, truncate=True)
46
163
  self.console.print(
47
- f"[b]Document with id [cyan]{doc.id}[/cyan] added successfully.[/b]"
164
+ f"[bold green]Document {doc.id} added successfully.[/bold green]"
48
165
  )
49
166
 
50
167
  async def get_document(self, doc_id: str):
@@ -59,7 +176,9 @@ class HaikuRAGApp:
59
176
  async with HaikuRAG(db_path=self.db_path) as self.client:
60
177
  deleted = await self.client.delete_document(doc_id)
61
178
  if deleted:
62
- self.console.print(f"[b]Document {doc_id} deleted successfully.[/b]")
179
+ self.console.print(
180
+ f"[bold green]Document {doc_id} deleted successfully.[/bold green]"
181
+ )
63
182
  else:
64
183
  self.console.print(
65
184
  f"[yellow]Document with id {doc_id} not found.[/yellow]"
@@ -69,7 +188,7 @@ class HaikuRAGApp:
69
188
  async with HaikuRAG(db_path=self.db_path) as self.client:
70
189
  results = await self.client.search(query, limit=limit)
71
190
  if not results:
72
- self.console.print("[red]No results found.[/red]")
191
+ self.console.print("[yellow]No results found.[/yellow]")
73
192
  return
74
193
  for chunk, score in results:
75
194
  self._rich_print_search_result(chunk, score)
@@ -202,14 +321,16 @@ class HaikuRAGApp:
202
321
  return
203
322
 
204
323
  self.console.print(
205
- f"[b]Rebuilding database with {total_docs} documents...[/b]"
324
+ f"[bold cyan]Rebuilding database with {total_docs} documents...[/bold cyan]"
206
325
  )
207
326
  with Progress() as progress:
208
327
  task = progress.add_task("Rebuilding...", total=total_docs)
209
328
  async for _ in client.rebuild_database():
210
329
  progress.update(task, advance=1)
211
330
 
212
- self.console.print("[b]Database rebuild completed successfully.[/b]")
331
+ self.console.print(
332
+ "[bold green]Database rebuild completed successfully.[/bold green]"
333
+ )
213
334
  except Exception as e:
214
335
  self.console.print(f"[red]Error rebuilding database: {e}[/red]")
215
336
 
@@ -218,7 +339,9 @@ class HaikuRAGApp:
218
339
  try:
219
340
  async with HaikuRAG(db_path=self.db_path, skip_validation=True) as client:
220
341
  await client.vacuum()
221
- self.console.print("[b]Vacuum completed successfully.[/b]")
342
+ self.console.print(
343
+ "[bold green]Vacuum completed successfully.[/bold green]"
344
+ )
222
345
  except Exception as e:
223
346
  self.console.print(f"[red]Error during vacuum: {e}[/red]")
224
347
 
@@ -240,7 +363,9 @@ class HaikuRAGApp:
240
363
  else:
241
364
  display_value = field_value
242
365
 
243
- self.console.print(f" [cyan]{field_name}[/cyan]: {display_value}")
366
+ self.console.print(
367
+ f" [repr.attrib_name]{field_name}[/repr.attrib_name]: {display_value}"
368
+ )
244
369
 
245
370
  def _rich_print_document(self, doc: Document, truncate: bool = False):
246
371
  """Format a document for display."""
haiku/rag/cli.py CHANGED
@@ -1,7 +1,9 @@
1
1
  import asyncio
2
+ import json
2
3
  import warnings
3
4
  from importlib.metadata import version
4
5
  from pathlib import Path
6
+ from typing import Any
5
7
 
6
8
  import typer
7
9
 
@@ -137,11 +139,41 @@ def list_documents(
137
139
  asyncio.run(app.list_documents())
138
140
 
139
141
 
142
+ def _parse_meta_options(meta: list[str] | None) -> dict[str, Any]:
143
+ """Parse repeated --meta KEY=VALUE options into a dictionary.
144
+
145
+ Raises a Typer error if any entry is malformed.
146
+ """
147
+ result: dict[str, Any] = {}
148
+ if not meta:
149
+ return result
150
+ for item in meta:
151
+ if "=" not in item:
152
+ raise typer.BadParameter("--meta must be in KEY=VALUE format")
153
+ key, value = item.split("=", 1)
154
+ if not key:
155
+ raise typer.BadParameter("--meta key cannot be empty")
156
+ # Best-effort JSON coercion: numbers, booleans, null, arrays/objects
157
+ try:
158
+ parsed = json.loads(value)
159
+ result[key] = parsed
160
+ except Exception:
161
+ # Leave as string if not valid JSON literal
162
+ result[key] = value
163
+ return result
164
+
165
+
140
166
  @cli.command("add", help="Add a document from text input")
141
167
  def add_document_text(
142
168
  text: str = typer.Argument(
143
169
  help="The text content of the document to add",
144
170
  ),
171
+ meta: list[str] | None = typer.Option(
172
+ None,
173
+ "--meta",
174
+ help="Metadata entries as KEY=VALUE (repeatable)",
175
+ metavar="KEY=VALUE",
176
+ ),
145
177
  db: Path = typer.Option(
146
178
  Config.DEFAULT_DATA_DIR / "haiku.rag.lancedb",
147
179
  "--db",
@@ -151,7 +183,8 @@ def add_document_text(
151
183
  from haiku.rag.app import HaikuRAGApp
152
184
 
153
185
  app = HaikuRAGApp(db_path=db)
154
- asyncio.run(app.add_document_from_text(text=text))
186
+ metadata = _parse_meta_options(meta)
187
+ asyncio.run(app.add_document_from_text(text=text, metadata=metadata or None))
155
188
 
156
189
 
157
190
  @cli.command("add-src", help="Add a document from a file path or URL")
@@ -165,6 +198,12 @@ def add_document_src(
165
198
  "--title",
166
199
  help="Optional human-readable title to store with the document",
167
200
  ),
201
+ meta: list[str] | None = typer.Option(
202
+ None,
203
+ "--meta",
204
+ help="Metadata entries as KEY=VALUE (repeatable)",
205
+ metavar="KEY=VALUE",
206
+ ),
168
207
  db: Path = typer.Option(
169
208
  Config.DEFAULT_DATA_DIR / "haiku.rag.lancedb",
170
209
  "--db",
@@ -174,7 +213,12 @@ def add_document_src(
174
213
  from haiku.rag.app import HaikuRAGApp
175
214
 
176
215
  app = HaikuRAGApp(db_path=db)
177
- asyncio.run(app.add_document_from_source(source=source, title=title))
216
+ metadata = _parse_meta_options(meta)
217
+ asyncio.run(
218
+ app.add_document_from_source(
219
+ source=source, title=title, metadata=metadata or None
220
+ )
221
+ )
178
222
 
179
223
 
180
224
  @cli.command("get", help="Get and display a document by its ID")
@@ -347,6 +391,32 @@ def vacuum(
347
391
  asyncio.run(app.vacuum())
348
392
 
349
393
 
394
+ @cli.command("info", help="Show read-only database info (no upgrades or writes)")
395
+ def info(
396
+ db: Path = typer.Option(
397
+ Config.DEFAULT_DATA_DIR / "haiku.rag.lancedb",
398
+ "--db",
399
+ help="Path to the LanceDB database file",
400
+ ),
401
+ ):
402
+ from haiku.rag.app import HaikuRAGApp
403
+
404
+ app = HaikuRAGApp(db_path=db)
405
+ asyncio.run(app.info())
406
+
407
+
408
+ @cli.command("download-models", help="Download Docling and Ollama models per config")
409
+ def download_models_cmd():
410
+ from haiku.rag.utils import prefetch_models
411
+
412
+ try:
413
+ prefetch_models()
414
+ typer.echo("Models downloaded successfully.")
415
+ except Exception as e:
416
+ typer.echo(f"Error downloading models: {e}")
417
+ raise typer.Exit(1)
418
+
419
+
350
420
  @cli.command(
351
421
  "serve", help="Start the haiku.rag MCP server (by default in streamable HTTP mode)"
352
422
  )
haiku/rag/migration.py CHANGED
@@ -51,7 +51,7 @@ class SQLiteToLanceDBMigrator:
51
51
 
52
52
  sqlite_conn.enable_load_extension(True)
53
53
  sqlite_vec.load(sqlite_conn)
54
- self.console.print("[blue]Loaded sqlite-vec extension[/blue]")
54
+ self.console.print("[cyan]Loaded sqlite-vec extension[/cyan]")
55
55
  except Exception as e:
56
56
  self.console.print(
57
57
  f"[yellow]Warning: Could not load sqlite-vec extension: {e}[/yellow]"
@@ -92,7 +92,7 @@ class SQLiteToLanceDBMigrator:
92
92
  sqlite_conn.close()
93
93
 
94
94
  # Optimize and cleanup using centralized vacuum
95
- self.console.print("[blue]Optimizing LanceDB...[/blue]")
95
+ self.console.print("[cyan]Optimizing LanceDB...[/cyan]")
96
96
  try:
97
97
  lance_store.vacuum()
98
98
  self.console.print("[green]✅ Optimization completed[/green]")
@@ -1,4 +1,4 @@
1
1
  from .engine import Store
2
2
  from .models import Chunk, Document
3
3
 
4
- __all__ = ["Store", "Chunk", "Document"]
4
+ __all__ = ["Store", "Chunk", "Document"]
@@ -1,4 +1,4 @@
1
1
  from .chunk import Chunk
2
2
  from .document import Document
3
3
 
4
- __all__ = ["Chunk", "Document"]
4
+ __all__ = ["Chunk", "Document"]
haiku/rag/utils.py CHANGED
@@ -163,3 +163,37 @@ def load_callable(path: str):
163
163
  f"Attribute '{func_name}' in module '{module_part}' is not callable"
164
164
  )
165
165
  return func
166
+
167
+
168
+ def prefetch_models():
169
+ """Prefetch runtime models (Docling + Ollama as configured)."""
170
+ import httpx
171
+ from docling.utils.model_downloader import download_models
172
+
173
+ from haiku.rag.config import Config
174
+
175
+ download_models()
176
+
177
+ # Collect Ollama models from config
178
+ required_models: set[str] = set()
179
+ if Config.EMBEDDINGS_PROVIDER == "ollama":
180
+ required_models.add(Config.EMBEDDINGS_MODEL)
181
+ if Config.QA_PROVIDER == "ollama":
182
+ required_models.add(Config.QA_MODEL)
183
+ if Config.RESEARCH_PROVIDER == "ollama":
184
+ required_models.add(Config.RESEARCH_MODEL)
185
+ if Config.RERANK_PROVIDER == "ollama":
186
+ required_models.add(Config.RERANK_MODEL)
187
+
188
+ if not required_models:
189
+ return
190
+
191
+ base_url = Config.OLLAMA_BASE_URL
192
+
193
+ with httpx.Client(timeout=None) as client:
194
+ for model in sorted(required_models):
195
+ with client.stream(
196
+ "POST", f"{base_url}/api/pull", json={"model": model}
197
+ ) as r:
198
+ for _ in r.iter_lines():
199
+ pass
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: haiku.rag
3
- Version: 0.10.1
3
+ Version: 0.10.2
4
4
  Summary: Agentic Retrieval Augmented Generation (RAG) with LanceDB
5
5
  Author-email: Yiorgis Gozadinos <ggozadinos@gmail.com>
6
6
  License: MIT
@@ -66,7 +66,8 @@ uv pip install haiku.rag
66
66
 
67
67
  # Add documents
68
68
  haiku-rag add "Your content here"
69
- haiku-rag add-src document.pdf
69
+ haiku-rag add "Your content here" --meta author=alice --meta topic=notes
70
+ haiku-rag add-src document.pdf --meta source=manual
70
71
 
71
72
  # Search
72
73
  haiku-rag search "query"
@@ -1,15 +1,15 @@
1
1
  haiku/rag/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- haiku/rag/app.py,sha256=06nsdjrljPNqZew4gsLFIA0BSwv-CxPovJaAYSFzm-w,13265
2
+ haiku/rag/app.py,sha256=-nhri6MLIZvp8DEndfeixTCVj6kutWwfLguyAcNe9S4,18023
3
3
  haiku/rag/chunker.py,sha256=PVe6ysv8UlacUd4Zb3_8RFWIaWDXnzBAy2VDJ4TaUsE,1555
4
- haiku/rag/cli.py,sha256=4aYUXPr54q-7U2-cySNpSnW1ntvD0Jck6oj8vvA6IoI,10830
4
+ haiku/rag/cli.py,sha256=wreAxyXSRnn7f09t9SGe4uAXQjlieUQIpNpOapJT7y8,12910
5
5
  haiku/rag/client.py,sha256=iUaa6YUac3CXFniIm8DsaaNsiyHsi4cp8-fPhF5XuVU,22925
6
6
  haiku/rag/config.py,sha256=SEV2OzaKavYwHZ0LmRzBj-0dbI6YFIRuNiTw9el7SO0,2307
7
7
  haiku/rag/logging.py,sha256=dm65AwADpcQsH5OAPtRA-4hsw0w5DK-sGOvzYkj6jzw,1720
8
8
  haiku/rag/mcp.py,sha256=H7XibtSNUviFeaJVsXzHiRqUm0nJCpA7A1QHuBv6SKQ,5057
9
- haiku/rag/migration.py,sha256=M--KnSF3lxgKjxmokb4vuzGH-pV8eg0C_8e7jvPqW8Y,11058
9
+ haiku/rag/migration.py,sha256=zm0-60PiS1hIQnZz65B7qfsgM7GwZVXFqMFowjpVBs8,11058
10
10
  haiku/rag/monitor.py,sha256=r386nkhdlsU8UECwIuVwnrSlgMk3vNIuUZGNIzkZuec,2770
11
11
  haiku/rag/reader.py,sha256=qkPTMJuQ_o4sK-8zpDl9WFYe_MJ7aL_gUw6rczIpW-g,3274
12
- haiku/rag/utils.py,sha256=hKH8bBBbAVYlLFBOAcErvX-4cuWIaPTbrAFeeLN1HdM,5062
12
+ haiku/rag/utils.py,sha256=dBzhKaOHI9KRiJqHErcXUnqtnXY2AgOK8PCLA3rhO0A,6115
13
13
  haiku/rag/embeddings/__init__.py,sha256=44IfDITGIFTflGT6UEmiYOwpWFVbYv5smLY59D0YeCs,1419
14
14
  haiku/rag/embeddings/base.py,sha256=BnSviKrlzjv3L0sZJs_T-pxfawd-bcTak-rsX-D2f3A,497
15
15
  haiku/rag/embeddings/ollama.py,sha256=LuLlHH6RGoO9_gFCIlbmesuXOj017gTw6z-p8Ez0CfE,595
@@ -35,9 +35,9 @@ haiku/rag/research/nodes/evaluate.py,sha256=Cp2J-jXYZothiQV3zRZFaCsBLaUU0Tm_-ri-
35
35
  haiku/rag/research/nodes/plan.py,sha256=9AkTls01Q3zTLKGgIgSCX9X4VYC8IWjEWii8A_f77YQ,2439
36
36
  haiku/rag/research/nodes/search.py,sha256=2ioc5Ba3ciq2zpFxgzoGkZOvVsJ1TBX9zseURLDJpBg,3591
37
37
  haiku/rag/research/nodes/synthesize.py,sha256=4acKduqWnE11ML7elUksKLozxzWJTkBLSJ2li_YMxgY,1736
38
- haiku/rag/store/__init__.py,sha256=hq0W0DAC7ysqhWSP2M2uHX8cbG6kbr-sWHxhq6qQcY0,103
38
+ haiku/rag/store/__init__.py,sha256=R2IRcxtkFDxqa2sgMirqLq3l2-FPdWr6ydYStaqm5OQ,104
39
39
  haiku/rag/store/engine.py,sha256=BceAeTpDgV92B1A3GVcjsTwlD-c0cZPPvGiXW2Gola0,10215
40
- haiku/rag/store/models/__init__.py,sha256=s0E72zneGlowvZrFWaNxHYjOAUjgWdLxzdYsnvNRVlY,88
40
+ haiku/rag/store/models/__init__.py,sha256=kc7Ctf53Jr483tk4QTIrcgqBbXDz4ZoeYSkFXfPnpks,89
41
41
  haiku/rag/store/models/chunk.py,sha256=3EuZav4QekJIeHBCub48EM8SjNX8HEJ6wVDXGot4PEQ,421
42
42
  haiku/rag/store/models/document.py,sha256=cZXy_jEti-hnhq7FKhuhCfd99ccY9fIHMLovB_Thbb8,425
43
43
  haiku/rag/store/repositories/__init__.py,sha256=Olv5dLfBQINRV3HrsfUpjzkZ7Qm7goEYyMNykgo_DaY,291
@@ -47,8 +47,8 @@ haiku/rag/store/repositories/settings.py,sha256=7XMBMavU8zRgdBoQzQg0Obfa7UKjuVnB
47
47
  haiku/rag/store/upgrades/__init__.py,sha256=RQ8A6rEXBASLb5PD9vdDnEas_m_GgRzzdVu4B88Snqc,1975
48
48
  haiku/rag/store/upgrades/v0_10_1.py,sha256=qNGnxj6hoHaHJ1rKTiALfw0c9NQOi0KAK-VZCD_073A,1959
49
49
  haiku/rag/store/upgrades/v0_9_3.py,sha256=NrjNilQSgDtFWRbL3ZUtzQzJ8tf9u0dDRJtnDFwwbdw,3322
50
- haiku_rag-0.10.1.dist-info/METADATA,sha256=Bu1Nmz3AoD_EquvCvsbcJjGXmFsGDEwqnfaYIBgOLqQ,5879
51
- haiku_rag-0.10.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
52
- haiku_rag-0.10.1.dist-info/entry_points.txt,sha256=G1U3nAkNd5YDYd4v0tuYFbriz0i-JheCsFuT9kIoGCI,48
53
- haiku_rag-0.10.1.dist-info/licenses/LICENSE,sha256=eXZrWjSk9PwYFNK9yUczl3oPl95Z4V9UXH7bPN46iPo,1065
54
- haiku_rag-0.10.1.dist-info/RECORD,,
50
+ haiku_rag-0.10.2.dist-info/METADATA,sha256=Q-yJHHYbis9EtHkAW6I9IhATxh8a2XOinzLj6Z40NZY,5973
51
+ haiku_rag-0.10.2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
52
+ haiku_rag-0.10.2.dist-info/entry_points.txt,sha256=G1U3nAkNd5YDYd4v0tuYFbriz0i-JheCsFuT9kIoGCI,48
53
+ haiku_rag-0.10.2.dist-info/licenses/LICENSE,sha256=eXZrWjSk9PwYFNK9yUczl3oPl95Z4V9UXH7bPN46iPo,1065
54
+ haiku_rag-0.10.2.dist-info/RECORD,,