haiku.rag 0.12.0__tar.gz → 0.12.1__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.

Potentially problematic release.


This version of haiku.rag might be problematic. Click here for more details.

Files changed (90) hide show
  1. haiku_rag-0.12.1/.dockerignore +55 -0
  2. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/PKG-INFO +4 -2
  3. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/README.md +2 -0
  4. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/pyproject.toml +4 -4
  5. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/src/haiku/rag/a2a/client.py +52 -55
  6. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/src/haiku/rag/app.py +12 -5
  7. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/src/haiku/rag/cli.py +2 -2
  8. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/src/haiku/rag/client.py +47 -4
  9. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/src/haiku/rag/embeddings/base.py +8 -0
  10. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/src/haiku/rag/embeddings/ollama.py +8 -0
  11. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/src/haiku/rag/embeddings/openai.py +8 -0
  12. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/src/haiku/rag/embeddings/vllm.py +8 -0
  13. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/src/haiku/rag/embeddings/voyageai.py +8 -0
  14. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/uv.lock +65 -65
  15. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/.gitignore +0 -0
  16. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/.pre-commit-config.yaml +0 -0
  17. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/.python-version +0 -0
  18. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/LICENSE +0 -0
  19. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/mkdocs.yml +0 -0
  20. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/server.json +0 -0
  21. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/src/evaluations/__init__.py +0 -0
  22. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/src/evaluations/benchmark.py +0 -0
  23. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/src/evaluations/config.py +0 -0
  24. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/src/evaluations/datasets/__init__.py +0 -0
  25. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/src/evaluations/datasets/repliqa.py +0 -0
  26. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/src/evaluations/datasets/wix.py +0 -0
  27. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/src/evaluations/llm_judge.py +0 -0
  28. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/src/evaluations/prompts.py +0 -0
  29. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/src/haiku/rag/__init__.py +0 -0
  30. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/src/haiku/rag/a2a/__init__.py +0 -0
  31. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/src/haiku/rag/a2a/context.py +0 -0
  32. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/src/haiku/rag/a2a/models.py +0 -0
  33. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/src/haiku/rag/a2a/prompts.py +0 -0
  34. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/src/haiku/rag/a2a/skills.py +0 -0
  35. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/src/haiku/rag/a2a/storage.py +0 -0
  36. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/src/haiku/rag/a2a/worker.py +0 -0
  37. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/src/haiku/rag/chunker.py +0 -0
  38. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/src/haiku/rag/config.py +0 -0
  39. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/src/haiku/rag/embeddings/__init__.py +0 -0
  40. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/src/haiku/rag/graph/__init__.py +0 -0
  41. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/src/haiku/rag/graph/base.py +0 -0
  42. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/src/haiku/rag/graph/common.py +0 -0
  43. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/src/haiku/rag/graph/models.py +0 -0
  44. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/src/haiku/rag/graph/nodes/__init__.py +0 -0
  45. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/src/haiku/rag/graph/nodes/analysis.py +0 -0
  46. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/src/haiku/rag/graph/nodes/plan.py +0 -0
  47. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/src/haiku/rag/graph/nodes/search.py +0 -0
  48. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/src/haiku/rag/graph/nodes/synthesize.py +0 -0
  49. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/src/haiku/rag/graph/prompts.py +0 -0
  50. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/src/haiku/rag/logging.py +0 -0
  51. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/src/haiku/rag/mcp.py +0 -0
  52. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/src/haiku/rag/migration.py +0 -0
  53. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/src/haiku/rag/monitor.py +0 -0
  54. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/src/haiku/rag/qa/__init__.py +0 -0
  55. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/src/haiku/rag/qa/agent.py +0 -0
  56. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/src/haiku/rag/qa/deep/__init__.py +0 -0
  57. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/src/haiku/rag/qa/deep/dependencies.py +0 -0
  58. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/src/haiku/rag/qa/deep/graph.py +0 -0
  59. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/src/haiku/rag/qa/deep/models.py +0 -0
  60. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/src/haiku/rag/qa/deep/nodes.py +0 -0
  61. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/src/haiku/rag/qa/deep/prompts.py +0 -0
  62. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/src/haiku/rag/qa/deep/state.py +0 -0
  63. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/src/haiku/rag/qa/prompts.py +0 -0
  64. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/src/haiku/rag/reader.py +0 -0
  65. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/src/haiku/rag/reranking/__init__.py +0 -0
  66. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/src/haiku/rag/reranking/base.py +0 -0
  67. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/src/haiku/rag/reranking/cohere.py +0 -0
  68. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/src/haiku/rag/reranking/mxbai.py +0 -0
  69. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/src/haiku/rag/reranking/vllm.py +0 -0
  70. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/src/haiku/rag/research/__init__.py +0 -0
  71. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/src/haiku/rag/research/common.py +0 -0
  72. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/src/haiku/rag/research/dependencies.py +0 -0
  73. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/src/haiku/rag/research/graph.py +0 -0
  74. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/src/haiku/rag/research/models.py +0 -0
  75. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/src/haiku/rag/research/prompts.py +0 -0
  76. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/src/haiku/rag/research/state.py +0 -0
  77. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/src/haiku/rag/research/stream.py +0 -0
  78. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/src/haiku/rag/store/__init__.py +0 -0
  79. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/src/haiku/rag/store/engine.py +0 -0
  80. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/src/haiku/rag/store/models/__init__.py +0 -0
  81. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/src/haiku/rag/store/models/chunk.py +0 -0
  82. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/src/haiku/rag/store/models/document.py +0 -0
  83. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/src/haiku/rag/store/repositories/__init__.py +0 -0
  84. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/src/haiku/rag/store/repositories/chunk.py +0 -0
  85. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/src/haiku/rag/store/repositories/document.py +0 -0
  86. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/src/haiku/rag/store/repositories/settings.py +0 -0
  87. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/src/haiku/rag/store/upgrades/__init__.py +0 -0
  88. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/src/haiku/rag/store/upgrades/v0_10_1.py +0 -0
  89. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/src/haiku/rag/store/upgrades/v0_9_3.py +0 -0
  90. {haiku_rag-0.12.0 → haiku_rag-0.12.1}/src/haiku/rag/utils.py +0 -0
@@ -0,0 +1,55 @@
1
+ # Python
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+ *.so
6
+ .Python
7
+ build/
8
+ develop-eggs/
9
+ dist/
10
+ downloads/
11
+ eggs/
12
+ .eggs/
13
+ lib/
14
+ lib64/
15
+ parts/
16
+ sdist/
17
+ var/
18
+ wheels/
19
+ *.egg-info/
20
+ .installed.cfg
21
+ *.egg
22
+
23
+ # Virtual environments (uv best practice)
24
+ .venv/
25
+ venv/
26
+ env/
27
+
28
+ # Data
29
+ *.lancedb/
30
+ data/
31
+ docs/
32
+
33
+ # IDE
34
+ .vscode/
35
+ .idea/
36
+ *.swp
37
+ *.swo
38
+ *~
39
+
40
+ # OS
41
+ .DS_Store
42
+ Thumbs.db
43
+
44
+ # Git
45
+ .git/
46
+ .gitignore
47
+
48
+ # Development
49
+ tests/
50
+ .pytest_cache/
51
+ .coverage
52
+ htmlcov/
53
+
54
+ # Examples
55
+ examples/
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: haiku.rag
3
- Version: 0.12.0
3
+ Version: 0.12.1
4
4
  Summary: Agentic Retrieval Augmented Generation (RAG) with LanceDB
5
5
  Author-email: Yiorgis Gozadinos <ggozadinos@gmail.com>
6
6
  License: MIT
@@ -24,7 +24,7 @@ Requires-Dist: httpx>=0.28.1
24
24
  Requires-Dist: lancedb>=0.25.2
25
25
  Requires-Dist: pydantic-ai>=1.0.18
26
26
  Requires-Dist: pydantic-graph>=1.0.18
27
- Requires-Dist: pydantic>=2.12.1
27
+ Requires-Dist: pydantic>=2.12.2
28
28
  Requires-Dist: python-dotenv>=1.1.1
29
29
  Requires-Dist: rich>=14.2.0
30
30
  Requires-Dist: tiktoken>=0.12.0
@@ -211,4 +211,6 @@ Full documentation at: https://ggozad.github.io/haiku.rag/
211
211
  - [CLI](https://ggozad.github.io/haiku.rag/cli/) - Command reference
212
212
  - [Python API](https://ggozad.github.io/haiku.rag/python/) - Complete API docs
213
213
  - [Agents](https://ggozad.github.io/haiku.rag/agents/) - QA agent and multi-agent research
214
+ - [MCP Server](https://ggozad.github.io/haiku.rag/mcp/) - Model Context Protocol integration
215
+ - [A2A Agent](https://ggozad.github.io/haiku.rag/a2a/) - Agent-to-Agent protocol support
214
216
  - [Benchmarks](https://ggozad.github.io/haiku.rag/benchmarks/) - Performance Benchmarks
@@ -171,4 +171,6 @@ Full documentation at: https://ggozad.github.io/haiku.rag/
171
171
  - [CLI](https://ggozad.github.io/haiku.rag/cli/) - Command reference
172
172
  - [Python API](https://ggozad.github.io/haiku.rag/python/) - Complete API docs
173
173
  - [Agents](https://ggozad.github.io/haiku.rag/agents/) - QA agent and multi-agent research
174
+ - [MCP Server](https://ggozad.github.io/haiku.rag/mcp/) - Model Context Protocol integration
175
+ - [A2A Agent](https://ggozad.github.io/haiku.rag/a2a/) - Agent-to-Agent protocol support
174
176
  - [Benchmarks](https://ggozad.github.io/haiku.rag/benchmarks/) - Performance Benchmarks
@@ -2,7 +2,7 @@
2
2
 
3
3
  name = "haiku.rag"
4
4
  description = "Agentic Retrieval Augmented Generation (RAG) with LanceDB"
5
- version = "0.12.0"
5
+ version = "0.12.1"
6
6
  authors = [{ name = "Yiorgis Gozadinos", email = "ggozadinos@gmail.com" }]
7
7
  license = { text = "MIT" }
8
8
  readme = { file = "README.md", content-type = "text/markdown" }
@@ -27,7 +27,7 @@ dependencies = [
27
27
  "fastmcp>=2.12.4",
28
28
  "httpx>=0.28.1",
29
29
  "lancedb>=0.25.2",
30
- "pydantic>=2.12.1",
30
+ "pydantic>=2.12.2",
31
31
  "pydantic-ai>=1.0.18",
32
32
  "pydantic-graph>=1.0.18",
33
33
  "python-dotenv>=1.1.1",
@@ -50,7 +50,7 @@ requires = ["hatchling"]
50
50
  build-backend = "hatchling.build"
51
51
 
52
52
  [tool.hatch.build]
53
- exclude = ["/docs", "/examples", "/tests", "/.github"]
53
+ exclude = ["/docs", "/examples", "/tests", "/docker", "/.github"]
54
54
 
55
55
  [tool.hatch.build.targets.wheel]
56
56
  packages = ["src/haiku"]
@@ -63,7 +63,7 @@ dev = [
63
63
  "mkdocs-material>=9.6.14",
64
64
  "pydantic-evals>=1.0.8",
65
65
  "pre-commit>=4.2.0",
66
- "pyright>=1.1.405",
66
+ "pyright>=1.1.406",
67
67
  "pytest>=8.4.2",
68
68
  "pytest-asyncio>=1.2.0",
69
69
  "pytest-cov>=7.0.0",
@@ -7,9 +7,18 @@ from rich.console import Console
7
7
  from rich.markdown import Markdown
8
8
  from rich.prompt import Prompt
9
9
 
10
+ try:
11
+ from fasta2a.client import A2AClient as FastA2AClient
12
+ from fasta2a.schema import Message, TextPart
13
+ except ImportError as e:
14
+ raise ImportError(
15
+ "A2A support requires the 'a2a' extra. "
16
+ "Install with: uv pip install 'haiku.rag[a2a]'"
17
+ ) from e
18
+
10
19
 
11
20
  class A2AClient:
12
- """Simple A2A protocol client."""
21
+ """Interactive A2A protocol client."""
13
22
 
14
23
  def __init__(self, base_url: str = "http://localhost:8000"):
15
24
  """Initialize A2A client.
@@ -18,11 +27,12 @@ class A2AClient:
18
27
  base_url: Base URL of the A2A server
19
28
  """
20
29
  self.base_url = base_url.rstrip("/")
21
- self.client = httpx.AsyncClient(timeout=60.0)
30
+ http_client = httpx.AsyncClient(timeout=60.0)
31
+ self._client = FastA2AClient(base_url=base_url, http_client=http_client)
22
32
 
23
33
  async def close(self):
24
34
  """Close the HTTP client."""
25
- await self.client.aclose()
35
+ await self._client.http_client.aclose()
26
36
 
27
37
  async def get_agent_card(self) -> dict[str, Any]:
28
38
  """Fetch the agent card from the A2A server.
@@ -30,7 +40,9 @@ class A2AClient:
30
40
  Returns:
31
41
  Agent card dictionary with agent capabilities and metadata
32
42
  """
33
- response = await self.client.get(f"{self.base_url}/.well-known/agent-card.json")
43
+ response = await self._client.http_client.get(
44
+ f"{self.base_url}/.well-known/agent-card.json"
45
+ )
34
46
  response.raise_for_status()
35
47
  return response.json()
36
48
 
@@ -53,46 +65,38 @@ class A2AClient:
53
65
  if context_id is None:
54
66
  context_id = str(uuid.uuid4())
55
67
 
56
- message_id = str(uuid.uuid4())
57
-
58
- payload: dict[str, Any] = {
59
- "jsonrpc": "2.0",
60
- "method": "message/send",
61
- "params": {
62
- "contextId": context_id,
63
- "message": {
64
- "kind": "message",
65
- "role": "user",
66
- "messageId": message_id,
67
- "parts": [{"kind": "text", "text": text}],
68
- },
69
- },
70
- "id": 1,
71
- }
68
+ message = Message(
69
+ kind="message",
70
+ role="user",
71
+ message_id=str(uuid.uuid4()),
72
+ parts=[TextPart(kind="text", text=text)],
73
+ )
72
74
 
75
+ metadata: dict[str, Any] = {"contextId": context_id}
73
76
  if skill_id:
74
- payload["params"]["skillId"] = skill_id
77
+ metadata["skillId"] = skill_id
75
78
 
76
- response = await self.client.post(
77
- self.base_url,
78
- json=payload,
79
- headers={"Content-Type": "application/json"},
80
- )
81
- response.raise_for_status()
82
- initial_response = response.json()
79
+ response = await self._client.send_message(message, metadata=metadata)
83
80
 
84
- # Extract task ID from response
85
- result = initial_response.get("result", {})
86
- task_id = result.get("id")
81
+ if "error" in response:
82
+ return {"error": response["error"]}
87
83
 
88
- if not task_id:
89
- return initial_response
84
+ result = response.get("result")
85
+ if not result:
86
+ return {"result": result}
90
87
 
91
- # Poll for task completion
92
- return await self.wait_for_task(task_id)
88
+ # Result can be either Task or Message - check if it's a Task with an id
89
+ if result.get("kind") == "task":
90
+ task_id = result.get("id")
91
+ if task_id:
92
+ # Poll for task completion
93
+ return await self.wait_for_task(task_id)
94
+
95
+ # Return the message directly
96
+ return {"result": result}
93
97
 
94
98
  async def wait_for_task(
95
- self, task_id: str, max_wait: int = 60, poll_interval: float = 0.5
99
+ self, task_id: str, max_wait: int = 120, poll_interval: float = 0.5
96
100
  ) -> dict[str, Any]:
97
101
  """Poll for task completion.
98
102
 
@@ -109,27 +113,19 @@ class A2AClient:
109
113
  start_time = time.time()
110
114
 
111
115
  while time.time() - start_time < max_wait:
112
- payload = {
113
- "jsonrpc": "2.0",
114
- "method": "tasks/get",
115
- "params": {"id": task_id},
116
- "id": 2,
117
- }
118
-
119
- response = await self.client.post(
120
- self.base_url,
121
- json=payload,
122
- headers={"Content-Type": "application/json"},
123
- )
124
- response.raise_for_status()
125
- task = response.json()
126
-
127
- result = task.get("result", {})
128
- status = result.get("status", {})
129
- state = status.get("state")
116
+ task_response = await self._client.get_task(task_id)
117
+
118
+ if "error" in task_response:
119
+ return {"error": task_response["error"]}
120
+
121
+ task = task_response.get("result")
122
+ if not task:
123
+ raise Exception("No task in response")
124
+
125
+ state = task.get("status", {}).get("state")
130
126
 
131
127
  if state == "completed":
132
- return task
128
+ return {"result": task}
133
129
  elif state == "failed":
134
130
  raise Exception(f"Task failed: {task}")
135
131
 
@@ -191,6 +187,7 @@ def print_response(response: dict[str, Any], console: Console):
191
187
 
192
188
  # Print artifacts summary with details
193
189
  if artifacts:
190
+ console.rule("[dim]Artifacts generated[/dim]")
194
191
  summary_lines = []
195
192
 
196
193
  for artifact in artifacts:
@@ -160,13 +160,20 @@ class HaikuRAGApp:
160
160
  self, source: str, title: str | None = None, metadata: dict | None = None
161
161
  ):
162
162
  async with HaikuRAG(db_path=self.db_path) as self.client:
163
- doc = await self.client.create_document_from_source(
163
+ result = await self.client.create_document_from_source(
164
164
  source, title=title, metadata=metadata
165
165
  )
166
- self._rich_print_document(doc, truncate=True)
167
- self.console.print(
168
- f"[bold green]Document {doc.id} added successfully.[/bold green]"
169
- )
166
+ if isinstance(result, list):
167
+ for doc in result:
168
+ self._rich_print_document(doc, truncate=True)
169
+ self.console.print(
170
+ f"[bold green]{len(result)} documents added successfully.[/bold green]"
171
+ )
172
+ else:
173
+ self._rich_print_document(result, truncate=True)
174
+ self.console.print(
175
+ f"[bold green]Document {result.id} added successfully.[/bold green]"
176
+ )
170
177
 
171
178
  async def get_document(self, doc_id: str):
172
179
  async with HaikuRAG(db_path=self.db_path) as self.client:
@@ -128,10 +128,10 @@ def add_document_text(
128
128
  asyncio.run(app.add_document_from_text(text=text, metadata=metadata or None))
129
129
 
130
130
 
131
- @cli.command("add-src", help="Add a document from a file path or URL")
131
+ @cli.command("add-src", help="Add a document from a file path, directory, or URL")
132
132
  def add_document_src(
133
133
  source: str = typer.Argument(
134
- help="The file path or URL of the document to add",
134
+ help="The file path, directory, or URL of the document(s) to add",
135
135
  ),
136
136
  title: str | None = typer.Option(
137
137
  None,
@@ -106,8 +106,8 @@ class HaikuRAG:
106
106
 
107
107
  async def create_document_from_source(
108
108
  self, source: str | Path, title: str | None = None, metadata: dict | None = None
109
- ) -> Document:
110
- """Create or update a document from a file path or URL.
109
+ ) -> Document | list[Document]:
110
+ """Create or update document(s) from a file path, directory, or URL.
111
111
 
112
112
  Checks if a document with the same URI already exists:
113
113
  - If MD5 is unchanged, returns existing document
@@ -115,11 +115,13 @@ class HaikuRAG:
115
115
  - If no document exists, creates a new one
116
116
 
117
117
  Args:
118
- source: File path (as string or Path) or URL to parse
118
+ source: File path, directory (as string or Path), or URL to parse
119
+ title: Optional title (only used for single files, not directories)
119
120
  metadata: Optional metadata dictionary
120
121
 
121
122
  Returns:
122
- Document instance (created, updated, or existing)
123
+ Document instance (created, updated, or existing) for single files/URLs
124
+ List of Document instances for directories
123
125
 
124
126
  Raises:
125
127
  ValueError: If the file/URL cannot be parsed or doesn't exist
@@ -142,6 +144,45 @@ class HaikuRAG:
142
144
  else:
143
145
  # Handle as regular file path
144
146
  source_path = Path(source) if isinstance(source, str) else source
147
+
148
+ # Handle directories
149
+ if source_path.is_dir():
150
+ documents = []
151
+ supported_extensions = set(FileReader.extensions)
152
+ for file_path in source_path.rglob("*"):
153
+ if (
154
+ file_path.is_file()
155
+ and file_path.suffix.lower() in supported_extensions
156
+ ):
157
+ doc = await self._create_document_from_file(
158
+ file_path, title=None, metadata=metadata
159
+ )
160
+ documents.append(doc)
161
+ return documents
162
+
163
+ # Handle single file
164
+ return await self._create_document_from_file(
165
+ source_path, title=title, metadata=metadata
166
+ )
167
+
168
+ async def _create_document_from_file(
169
+ self, source_path: Path, title: str | None = None, metadata: dict | None = None
170
+ ) -> Document:
171
+ """Create or update a document from a single file path.
172
+
173
+ Args:
174
+ source_path: Path to the file
175
+ title: Optional title
176
+ metadata: Optional metadata dictionary
177
+
178
+ Returns:
179
+ Document instance (created, updated, or existing)
180
+
181
+ Raises:
182
+ ValueError: If the file cannot be parsed or doesn't exist
183
+ """
184
+ metadata = metadata or {}
185
+
145
186
  if source_path.suffix.lower() not in FileReader.extensions:
146
187
  raise ValueError(f"Unsupported file extension: {source_path.suffix}")
147
188
 
@@ -592,6 +633,8 @@ class HaikuRAG:
592
633
  new_doc = await self.create_document_from_source(
593
634
  source=doc.uri, metadata=doc.metadata or {}
594
635
  )
636
+ # URIs always point to single files/URLs, never directories
637
+ assert isinstance(new_doc, Document)
595
638
  assert new_doc.id is not None, (
596
639
  "New document ID should not be None"
597
640
  )
@@ -1,3 +1,5 @@
1
+ from typing import overload
2
+
1
3
  from haiku.rag.config import Config
2
4
 
3
5
 
@@ -9,6 +11,12 @@ class EmbedderBase:
9
11
  self._model = model
10
12
  self._vector_dim = vector_dim
11
13
 
14
+ @overload
15
+ async def embed(self, text: str) -> list[float]: ...
16
+
17
+ @overload
18
+ async def embed(self, text: list[str]) -> list[list[float]]: ...
19
+
12
20
  async def embed(self, text: str | list[str]) -> list[float] | list[list[float]]:
13
21
  raise NotImplementedError(
14
22
  "Embedder is an abstract class. Please implement the embed method in a subclass."
@@ -1,3 +1,5 @@
1
+ from typing import overload
2
+
1
3
  from openai import AsyncOpenAI
2
4
 
3
5
  from haiku.rag.config import Config
@@ -5,6 +7,12 @@ from haiku.rag.embeddings.base import EmbedderBase
5
7
 
6
8
 
7
9
  class Embedder(EmbedderBase):
10
+ @overload
11
+ async def embed(self, text: str) -> list[float]: ...
12
+
13
+ @overload
14
+ async def embed(self, text: list[str]) -> list[list[float]]: ...
15
+
8
16
  async def embed(self, text: str | list[str]) -> list[float] | list[list[float]]:
9
17
  client = AsyncOpenAI(base_url=f"{Config.OLLAMA_BASE_URL}/v1", api_key="dummy")
10
18
  if not text:
@@ -1,9 +1,17 @@
1
+ from typing import overload
2
+
1
3
  from openai import AsyncOpenAI
2
4
 
3
5
  from haiku.rag.embeddings.base import EmbedderBase
4
6
 
5
7
 
6
8
  class Embedder(EmbedderBase):
9
+ @overload
10
+ async def embed(self, text: str) -> list[float]: ...
11
+
12
+ @overload
13
+ async def embed(self, text: list[str]) -> list[list[float]]: ...
14
+
7
15
  async def embed(self, text: str | list[str]) -> list[float] | list[list[float]]:
8
16
  client = AsyncOpenAI()
9
17
  if not text:
@@ -1,3 +1,5 @@
1
+ from typing import overload
2
+
1
3
  from openai import AsyncOpenAI
2
4
 
3
5
  from haiku.rag.config import Config
@@ -5,6 +7,12 @@ from haiku.rag.embeddings.base import EmbedderBase
5
7
 
6
8
 
7
9
  class Embedder(EmbedderBase):
10
+ @overload
11
+ async def embed(self, text: str) -> list[float]: ...
12
+
13
+ @overload
14
+ async def embed(self, text: list[str]) -> list[list[float]]: ...
15
+
8
16
  async def embed(self, text: str | list[str]) -> list[float] | list[list[float]]:
9
17
  client = AsyncOpenAI(
10
18
  base_url=f"{Config.VLLM_EMBEDDINGS_BASE_URL}/v1", api_key="dummy"
@@ -1,9 +1,17 @@
1
1
  try:
2
+ from typing import overload
3
+
2
4
  from voyageai.client import Client # type: ignore
3
5
 
4
6
  from haiku.rag.embeddings.base import EmbedderBase
5
7
 
6
8
  class Embedder(EmbedderBase):
9
+ @overload
10
+ async def embed(self, text: str) -> list[float]: ...
11
+
12
+ @overload
13
+ async def embed(self, text: list[str]) -> list[list[float]]: ...
14
+
7
15
  async def embed(self, text: str | list[str]) -> list[float] | list[list[float]]:
8
16
  client = Client()
9
17
  if not text:
@@ -1123,7 +1123,7 @@ wheels = [
1123
1123
 
1124
1124
  [[package]]
1125
1125
  name = "haiku-rag"
1126
- version = "0.12.0"
1126
+ version = "0.12.1"
1127
1127
  source = { editable = "." }
1128
1128
  dependencies = [
1129
1129
  { name = "docling" },
@@ -1174,7 +1174,7 @@ requires-dist = [
1174
1174
  { name = "httpx", specifier = ">=0.28.1" },
1175
1175
  { name = "lancedb", specifier = ">=0.25.2" },
1176
1176
  { name = "mxbai-rerank", marker = "extra == 'mxbai'", specifier = ">=0.1.6" },
1177
- { name = "pydantic", specifier = ">=2.12.1" },
1177
+ { name = "pydantic", specifier = ">=2.12.2" },
1178
1178
  { name = "pydantic-ai", specifier = ">=1.0.18" },
1179
1179
  { name = "pydantic-graph", specifier = ">=1.0.18" },
1180
1180
  { name = "python-dotenv", specifier = ">=1.1.1" },
@@ -1194,7 +1194,7 @@ dev = [
1194
1194
  { name = "mkdocs-material", specifier = ">=9.6.14" },
1195
1195
  { name = "pre-commit", specifier = ">=4.2.0" },
1196
1196
  { name = "pydantic-evals", specifier = ">=1.0.8" },
1197
- { name = "pyright", specifier = ">=1.1.405" },
1197
+ { name = "pyright", specifier = ">=1.1.406" },
1198
1198
  { name = "pytest", specifier = ">=8.4.2" },
1199
1199
  { name = "pytest-asyncio", specifier = ">=1.2.0" },
1200
1200
  { name = "pytest-cov", specifier = ">=7.0.0" },
@@ -2946,7 +2946,7 @@ wheels = [
2946
2946
 
2947
2947
  [[package]]
2948
2948
  name = "pydantic"
2949
- version = "2.12.1"
2949
+ version = "2.12.2"
2950
2950
  source = { registry = "https://pypi.org/simple" }
2951
2951
  dependencies = [
2952
2952
  { name = "annotated-types" },
@@ -2954,9 +2954,9 @@ dependencies = [
2954
2954
  { name = "typing-extensions" },
2955
2955
  { name = "typing-inspection" },
2956
2956
  ]
2957
- sdist = { url = "https://files.pythonhosted.org/packages/3c/a7/d0d7b3c128948ece6676a6a21b9036e3ca53765d35052dbcc8c303886a44/pydantic-2.12.1.tar.gz", hash = "sha256:0af849d00e1879199babd468ec9db13b956f6608e9250500c1a9d69b6a62824e", size = 815997, upload-time = "2025-10-13T21:00:41.219Z" }
2957
+ sdist = { url = "https://files.pythonhosted.org/packages/8d/35/d319ed522433215526689bad428a94058b6dd12190ce7ddd78618ac14b28/pydantic-2.12.2.tar.gz", hash = "sha256:7b8fa15b831a4bbde9d5b84028641ac3080a4ca2cbd4a621a661687e741624fd", size = 816358, upload-time = "2025-10-14T15:02:21.842Z" }
2958
2958
  wheels = [
2959
- { url = "https://files.pythonhosted.org/packages/f5/69/ce4e60e5e67aa0c339a5dc3391a02b4036545efb6308c54dc4aa9425386f/pydantic-2.12.1-py3-none-any.whl", hash = "sha256:665931f5b4ab40c411439e66f99060d631d1acc58c3d481957b9123343d674d1", size = 460511, upload-time = "2025-10-13T21:00:38.935Z" },
2959
+ { url = "https://files.pythonhosted.org/packages/6c/98/468cb649f208a6f1279448e6e5247b37ae79cf5e4041186f1e2ef3d16345/pydantic-2.12.2-py3-none-any.whl", hash = "sha256:25ff718ee909acd82f1ff9b1a4acfd781bb23ab3739adaa7144f19a6a4e231ae", size = 460628, upload-time = "2025-10-14T15:02:19.623Z" },
2960
2960
  ]
2961
2961
 
2962
2962
  [package.optional-dependencies]
@@ -3051,69 +3051,69 @@ vertexai = [
3051
3051
 
3052
3052
  [[package]]
3053
3053
  name = "pydantic-core"
3054
- version = "2.41.3"
3054
+ version = "2.41.4"
3055
3055
  source = { registry = "https://pypi.org/simple" }
3056
3056
  dependencies = [
3057
3057
  { name = "typing-extensions" },
3058
3058
  ]
3059
- sdist = { url = "https://files.pythonhosted.org/packages/00/e9/3916abb671bffb00845408c604ff03480dc8dc273310d8268547a37be0fb/pydantic_core-2.41.3.tar.gz", hash = "sha256:cdebb34b36ad05e8d77b4e797ad38a2a775c2a07a8fa386d4f6943b7778dcd39", size = 457489, upload-time = "2025-10-13T19:34:51.666Z" }
3060
- wheels = [
3061
- { url = "https://files.pythonhosted.org/packages/20/11/3149cae2a61ddd11c206cde9dab7598a53cfabe8e69850507876988d2047/pydantic_core-2.41.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:7bdc8b70bc4b68e4d891b46d018012cac7bbfe3b981a7c874716dde09ff09fd5", size = 2098919, upload-time = "2025-10-13T19:31:28.727Z" },
3062
- { url = "https://files.pythonhosted.org/packages/53/64/1717c7c5b092c64e5022b0d02b11703c2c94c31d897366b6c8d160b7d1de/pydantic_core-2.41.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:446361e93f4ffe509edae5862fb89a0d24cbc8f2935f05c6584c2f2ca6e7b6df", size = 1910372, upload-time = "2025-10-13T19:31:30.351Z" },
3063
- { url = "https://files.pythonhosted.org/packages/99/ba/0231b5dde6c1c436e0d58aed7d63f927694d92c51aff739bf692142ce6e6/pydantic_core-2.41.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9af9a9ae24b866ce58462a7de61c33ff035e052b7a9c05c29cf496bd6a16a63f", size = 1952392, upload-time = "2025-10-13T19:31:32.345Z" },
3064
- { url = "https://files.pythonhosted.org/packages/cd/5d/1adbfa682a56544d70b42931f19de44a4e58a4fc2152da343a2fdfd4cad5/pydantic_core-2.41.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fc836eb8561f04fede7b73747463bd08715be0f55c427e0f0198aa2f1d92f913", size = 2041093, upload-time = "2025-10-13T19:31:34.534Z" },
3065
- { url = "https://files.pythonhosted.org/packages/7f/d3/9d14041f0b125a5d6388957cace43f9dfb80d862e56a0685dde431a20b6a/pydantic_core-2.41.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:16f80f366472eb6a3744149289c263e5ef182c8b18422192166b67625fef3c50", size = 2214331, upload-time = "2025-10-13T19:31:36.575Z" },
3066
- { url = "https://files.pythonhosted.org/packages/5b/cd/384988d065596fafecf9baeab0c66ef31610013b26eec3b305a80ab5f669/pydantic_core-2.41.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d699904cd13d0f509bdbb17f0784abb332d4aa42df4b0a8b65932096fcd4b21", size = 2344450, upload-time = "2025-10-13T19:31:38.905Z" },
3067
- { url = "https://files.pythonhosted.org/packages/a3/13/1b0dd34fce51a746823a347d7f9e02c6ea09078ec91c5f656594c23d2047/pydantic_core-2.41.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:485398dacc5dddb2be280fd3998367531eccae8631f4985d048c2406a5ee5ecc", size = 2070507, upload-time = "2025-10-13T19:31:41.093Z" },
3068
- { url = "https://files.pythonhosted.org/packages/29/a6/0f8d6d67d917318d842fe8dba2489b0c5989ce01fc1ed58bf204f80663df/pydantic_core-2.41.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6dfe0898272bf675941cd1ea701677341357b77acadacabbd43d71e09763dceb", size = 2185401, upload-time = "2025-10-13T19:31:42.785Z" },
3069
- { url = "https://files.pythonhosted.org/packages/e9/23/b8a82253736f2efd3b79338dfe53866b341b68868fbce7111ff6b040b680/pydantic_core-2.41.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:86ffbf5291c367a56b5718590dc3452890f2c1ac7b76d8f4a1e66df90bd717f6", size = 2131929, upload-time = "2025-10-13T19:31:46.226Z" },
3070
- { url = "https://files.pythonhosted.org/packages/7c/16/efe252cbf852ebfcb4978820e7681d83ae45c526cbfc0cf847f70de49850/pydantic_core-2.41.3-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:c58c5acda77802eedde3aaf22be09e37cfec060696da64bf6e6ffb2480fdabd0", size = 2307223, upload-time = "2025-10-13T19:31:48.176Z" },
3071
- { url = "https://files.pythonhosted.org/packages/e9/ea/7d8eba2c37769d8768871575be449390beb2452a2289b0090ea7fa63f920/pydantic_core-2.41.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:40db5705aec66371ca5792415c3e869137ae2bab48c48608db3f84986ccaf016", size = 2312962, upload-time = "2025-10-13T19:31:50.028Z" },
3072
- { url = "https://files.pythonhosted.org/packages/02/c4/b617e33c3b6f4a99c7d252cc42df958d14627a09a1a935141fb9abe44189/pydantic_core-2.41.3-cp312-cp312-win32.whl", hash = "sha256:668fcb317a0b3c84781796891128111c32f83458d436b022014ed0ea07f66e1b", size = 1988735, upload-time = "2025-10-13T19:31:51.778Z" },
3073
- { url = "https://files.pythonhosted.org/packages/24/fc/05bb0249782893b52baa7732393c0bac9422d6aab46770253f57176cddba/pydantic_core-2.41.3-cp312-cp312-win_amd64.whl", hash = "sha256:248a5d1dac5382454927edf32660d0791d2df997b23b06a8cac6e3375bc79cee", size = 2032239, upload-time = "2025-10-13T19:31:53.915Z" },
3074
- { url = "https://files.pythonhosted.org/packages/75/1d/7637f6aaafdbc27205296bde9843096bd449192986b5523869444f844b82/pydantic_core-2.41.3-cp312-cp312-win_arm64.whl", hash = "sha256:347a23094c98b7ea2ba6fff93b52bd2931a48c9c1790722d9e841f30e4b7afcd", size = 1969072, upload-time = "2025-10-13T19:31:55.7Z" },
3075
- { url = "https://files.pythonhosted.org/packages/9f/a6/7533cba20b8b66e209d8d2acbb9ccc0bc1b883b0654776d676e02696ef5d/pydantic_core-2.41.3-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:a8596700fdd3ee12b0d9c1f2395f4c32557e7ebfbfacdc08055b0bcbe7d2827e", size = 2105686, upload-time = "2025-10-13T19:31:57.675Z" },
3076
- { url = "https://files.pythonhosted.org/packages/84/d7/2d15cb9dfb9f94422fb4a8820cbfeb397e3823087c2361ef46df5c172000/pydantic_core-2.41.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:624503f918e472c0eed6935020c01b6a6b4bcdb7955a848da5c8805d40f15c0f", size = 1910554, upload-time = "2025-10-13T19:32:00.037Z" },
3077
- { url = "https://files.pythonhosted.org/packages/4c/fc/cbd1caa19e88fd64df716a37b49e5864c1ac27dbb9eb870b8977a584fa42/pydantic_core-2.41.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:36388958d0c614df9f5de1a5f88f4b79359016b9ecdfc352037788a628616aa2", size = 1957559, upload-time = "2025-10-13T19:32:02.603Z" },
3078
- { url = "https://files.pythonhosted.org/packages/3b/fe/da942ae51f602173556c627304dc24b9fa8bd04423bce189bf397ba0419e/pydantic_core-2.41.3-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3c50eba144add9104cf43ef9a3d81c37ebf48bfd0924b584b78ec2e03ec91daf", size = 2051084, upload-time = "2025-10-13T19:32:05.056Z" },
3079
- { url = "https://files.pythonhosted.org/packages/c8/62/0abd59a7107d1ef502b9cfab68145c6bb87115c2d9e883afbf18b98fe6db/pydantic_core-2.41.3-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c6ea2102958eb5ad560d570c49996e215a6939d9bffd0e9fd3b9e808a55008cc", size = 2218098, upload-time = "2025-10-13T19:32:06.837Z" },
3080
- { url = "https://files.pythonhosted.org/packages/72/b1/93a36aa119b70126f3f0d06b6f9a81ca864115962669d8a85deb39c82ecc/pydantic_core-2.41.3-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd0d26f1e4335d5f84abfc880da0afa080c8222410482f9ee12043bb05f55ec8", size = 2341954, upload-time = "2025-10-13T19:32:08.583Z" },
3081
- { url = "https://files.pythonhosted.org/packages/0f/be/7c2563b53b71ff3e41950b0ffa9eeba3d702091c6d59036fff8a39050528/pydantic_core-2.41.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41c38700094045b12c0cff35c8585954de66cf6dd63909fed1c2e6b8f38e1e1e", size = 2069474, upload-time = "2025-10-13T19:32:10.808Z" },
3082
- { url = "https://files.pythonhosted.org/packages/ba/ac/2394004db9f6e03712c1e52f40f0979750fa87721f6baf5f76ad92b8be46/pydantic_core-2.41.3-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4061cc82d7177417fdb90e23e67b27425ecde2652cfd2053b5b4661a489ddc19", size = 2190633, upload-time = "2025-10-13T19:32:12.731Z" },
3083
- { url = "https://files.pythonhosted.org/packages/7d/31/7b70c2d1fe41f450f8022f5523edaaea19c17a2d321fab03efd03aea1fe8/pydantic_core-2.41.3-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:b1d9699a4dae10a7719951cca1e30b591ef1dd9cdda9fec39282a283576c0241", size = 2137097, upload-time = "2025-10-13T19:32:14.634Z" },
3084
- { url = "https://files.pythonhosted.org/packages/4e/ae/f872198cffc8564f52c4ef83bcd3e324e5ac914e168c6b812f5ce3f80aab/pydantic_core-2.41.3-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:d5099f1b97e79f0e45cb6a236a5bd1a20078ed50b1b28f3d17f6c83ff3585baa", size = 2316771, upload-time = "2025-10-13T19:32:16.586Z" },
3085
- { url = "https://files.pythonhosted.org/packages/23/50/f0fce3a9a7554ced178d943e1eada58b15fca896e9eb75d50244fc12007c/pydantic_core-2.41.3-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:b5ff0467a8c1b6abb0ab9c9ea80e2e3a9788592e44c726c2db33fdaf1b5e7d0b", size = 2319449, upload-time = "2025-10-13T19:32:18.503Z" },
3086
- { url = "https://files.pythonhosted.org/packages/15/1f/86a6948408e8388604c02ffde651a2e39b711bd1ab6eeaff376094553a10/pydantic_core-2.41.3-cp313-cp313-win32.whl", hash = "sha256:edfe9b4cee4a91da7247c25732f24504071f3e101c050694d18194b7d2d320bf", size = 1995352, upload-time = "2025-10-13T19:32:20.5Z" },
3087
- { url = "https://files.pythonhosted.org/packages/1f/4b/6dac37c3f62684dc459a31623d8ae97ee433fd68bb827e5c64dd831a5087/pydantic_core-2.41.3-cp313-cp313-win_amd64.whl", hash = "sha256:44af3276c0c2c14efde6590523e4d7e04bcd0e46e0134f0dbef1be0b64b2d3e3", size = 2031894, upload-time = "2025-10-13T19:32:23.11Z" },
3088
- { url = "https://files.pythonhosted.org/packages/fd/75/3d9ba041a3fcb147279fbb37d2468efe62606809fec97b8de78174335ef4/pydantic_core-2.41.3-cp313-cp313-win_arm64.whl", hash = "sha256:59aeed341f92440d51fdcc82c8e930cfb234f1843ed1d4ae1074f5fb9789a64b", size = 1974036, upload-time = "2025-10-13T19:32:25.219Z" },
3089
- { url = "https://files.pythonhosted.org/packages/50/68/45842628ccdb384df029f884ef915306d195c4f08b66ca4d99867edc6338/pydantic_core-2.41.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:ef37228238b3a280170ac43a010835c4a7005742bc8831c2c1a9560de4595dbe", size = 1876856, upload-time = "2025-10-13T19:32:27.504Z" },
3090
- { url = "https://files.pythonhosted.org/packages/99/73/336a82910c6a482a0ba9a255c08dcc456ebca9735df96d7a82dffe17626a/pydantic_core-2.41.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5cb19f36253152c509abe76c1d1b185436e0c75f392a82934fe37f4a1264449", size = 1884665, upload-time = "2025-10-13T19:32:29.567Z" },
3091
- { url = "https://files.pythonhosted.org/packages/34/87/ec610a7849561e0ef7c25b74ef934d154454c3aac8fb595b899557f3c6ab/pydantic_core-2.41.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:91be4756e05367ce19a70e1db3b77f01f9e40ca70d26fb4cdfa993e53a08964a", size = 2043067, upload-time = "2025-10-13T19:32:31.506Z" },
3092
- { url = "https://files.pythonhosted.org/packages/db/b4/5f2b0cf78752f9111177423bd5f2bc0815129e587c13401636b8900a417e/pydantic_core-2.41.3-cp313-cp313t-win_amd64.whl", hash = "sha256:ce7d8f4353f82259b55055bd162bbaf599f6c40cd0c098e989eeb95f9fdc022f", size = 1996799, upload-time = "2025-10-13T19:32:33.612Z" },
3093
- { url = "https://files.pythonhosted.org/packages/49/7f/07e7f19a6a44a52abd48846e348e11fa1b3de5ed7c0231d53f055ffb365f/pydantic_core-2.41.3-cp313-cp313t-win_arm64.whl", hash = "sha256:f06a9e81da60e5a0ef584f6f4790f925c203880ae391bf363d97126fd1790b21", size = 1969574, upload-time = "2025-10-13T19:32:35.533Z" },
3094
- { url = "https://files.pythonhosted.org/packages/f1/d8/db32fbced75853c1d8e7ada8cb2b837ade99b2f281de569908de3e29f0bf/pydantic_core-2.41.3-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:0c77e8e72344e34052ea26905fa7551ecb75fc12795ca1a8e44f816918f4c718", size = 2103383, upload-time = "2025-10-13T19:32:37.522Z" },
3095
- { url = "https://files.pythonhosted.org/packages/de/28/5bcb3327b3777994633f4cb459c5dc34a9cbe6cf0ac449d3e8f1e74bdaaa/pydantic_core-2.41.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:32be442a017e82a6c496a52ef5db5f5ac9abf31c3064f5240ee15a1d27cc599e", size = 1904974, upload-time = "2025-10-13T19:32:39.513Z" },
3096
- { url = "https://files.pythonhosted.org/packages/71/8d/c9d8cad7c02d63869079fb6fb61b8ab27adbeeda0bf130c684fe43daa126/pydantic_core-2.41.3-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:af10c78f0e9086d2d883ddd5a6482a613ad435eb5739cf1467b1f86169e63d91", size = 1956879, upload-time = "2025-10-13T19:32:41.849Z" },
3097
- { url = "https://files.pythonhosted.org/packages/15/b1/8a84b55631a45375a467df288d8f905bec0abadb1e75bce3b32402b49733/pydantic_core-2.41.3-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6212874118704e27d177acee5b90b83556b14b2eb88aae01bae51cd9efe27019", size = 2051787, upload-time = "2025-10-13T19:32:43.86Z" },
3098
- { url = "https://files.pythonhosted.org/packages/c3/97/a84ea9cb7ba4dbfd43865e5dd536b22c78ee763d82d501c6f6a553403c00/pydantic_core-2.41.3-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c6a24c82674a3a8e7f7306e57e98219e5c1cdfc0f57bc70986930dda136230b2", size = 2217830, upload-time = "2025-10-13T19:32:46.053Z" },
3099
- { url = "https://files.pythonhosted.org/packages/1a/2c/64233c77410e314dbb7f2e8112be7f56de57cf64198a32d8ab3f7b74adf4/pydantic_core-2.41.3-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8e0c81dc047c18059410c959a437540abcefea6a882d6e43b9bf45c291eaacd9", size = 2341131, upload-time = "2025-10-13T19:32:48.402Z" },
3100
- { url = "https://files.pythonhosted.org/packages/23/3d/915b90eb0de93bd522b293fd1a986289f5d576c72e640f3bb426b496d095/pydantic_core-2.41.3-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c0d7e1a9f80f00a8180b9194ecef66958eb03f3c3ae2d77195c9d665ac0a61e", size = 2063797, upload-time = "2025-10-13T19:32:50.458Z" },
3101
- { url = "https://files.pythonhosted.org/packages/4d/25/a65665caa86e496e19feef48e6bd9263c1a46f222e8f9b0818f67bd98dc3/pydantic_core-2.41.3-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2868fabfc35ec0738539ce0d79aab37aeffdcb9682b9b91f0ac4b0ba31abb1eb", size = 2193041, upload-time = "2025-10-13T19:32:52.686Z" },
3102
- { url = "https://files.pythonhosted.org/packages/cd/46/a7f7e17f99ee691a7d93a53aa41bf7d1b1d425945b6e9bc8020498a413e1/pydantic_core-2.41.3-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:cb4f40c93307e1c50996e4edcddf338e1f3f1fb86fb69b654111c6050ae3b081", size = 2136119, upload-time = "2025-10-13T19:32:54.737Z" },
3103
- { url = "https://files.pythonhosted.org/packages/5f/92/c27c1f3edd06e04af71358aa8f4d244c8bc6726e3fb47e00157d3dffe66f/pydantic_core-2.41.3-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:287cbcd3407a875eaf0b1efa2e5288493d5b79bfd3629459cf0b329ad8a9071a", size = 2317223, upload-time = "2025-10-13T19:32:56.927Z" },
3104
- { url = "https://files.pythonhosted.org/packages/51/6c/20aabe3c32888fb13d4726e405716fed14b1d4d1d4292d585862c1458b7b/pydantic_core-2.41.3-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:5253835aa145049205a67056884555a936f9b3fea7c3ce860bff62be6a1ae4d1", size = 2320425, upload-time = "2025-10-13T19:32:59.454Z" },
3105
- { url = "https://files.pythonhosted.org/packages/67/d2/476d4bc6b3070e151ae920167f27f26415e12f8fcc6cf5a47a613aba7267/pydantic_core-2.41.3-cp314-cp314-win32.whl", hash = "sha256:69297795efe5349156d18eebea818b75d29a1d3d1d5f26a250f22ab4220aacd6", size = 1994216, upload-time = "2025-10-13T19:33:01.484Z" },
3106
- { url = "https://files.pythonhosted.org/packages/16/ca/2cd8515584b3d665ca3c4d946364c2a9932d0d5648694c2a10d273cde81c/pydantic_core-2.41.3-cp314-cp314-win_amd64.whl", hash = "sha256:e1c133e3447c2f6d95e47ede58fff0053370758112a1d39117d0af8c93584049", size = 2026522, upload-time = "2025-10-13T19:33:03.546Z" },
3107
- { url = "https://files.pythonhosted.org/packages/77/61/c9f2791d7188594f0abdc1b7fe8ec3efc123ee2d9c553fd3b6da2d9fd53d/pydantic_core-2.41.3-cp314-cp314-win_arm64.whl", hash = "sha256:54534eecbb7a331521f832e15fc307296f491ee1918dacfd4d5b900da6ee3332", size = 1969070, upload-time = "2025-10-13T19:33:05.604Z" },
3108
- { url = "https://files.pythonhosted.org/packages/b5/eb/45f9a91f8c09f4cfb62f78dce909b20b6047ce4fd8d89310fcac5ad62e54/pydantic_core-2.41.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:6b4be10152098b43c093a4b5e9e9da1ac7a1c954c1934d4438d07ba7b7bcf293", size = 1876593, upload-time = "2025-10-13T19:33:07.814Z" },
3109
- { url = "https://files.pythonhosted.org/packages/99/f8/5c9d0959e0e1f260eea297a5ecc1dc29a14e03ee6a533e805407e8403c1a/pydantic_core-2.41.3-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe4ebd676c158a7994253161151b476dbbef2acbd2f547cfcfdf332cf67cc29", size = 1882977, upload-time = "2025-10-13T19:33:10.109Z" },
3110
- { url = "https://files.pythonhosted.org/packages/8b/f4/7ab918e35f55e7beee471ba8c67dfc4c9c19a8904e4867bfda7f9c76a72e/pydantic_core-2.41.3-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:984ca0113b39dda1d7c358d6db03dd6539ef244d0558351806c1327239e035bf", size = 2041033, upload-time = "2025-10-13T19:33:12.216Z" },
3111
- { url = "https://files.pythonhosted.org/packages/a6/c8/5b12e5a36410ebcd0082ae5b0258150d72762e306f298cc3fe731b5574ec/pydantic_core-2.41.3-cp314-cp314t-win_amd64.whl", hash = "sha256:2a7dd8a6f5a9a2f8c7f36e4fc0982a985dbc4ac7176ee3df9f63179b7295b626", size = 1994462, upload-time = "2025-10-13T19:33:14.421Z" },
3112
- { url = "https://files.pythonhosted.org/packages/6b/f6/c6f3b7244a2a0524f4a04052e3d590d3be0ba82eb1a2f0fe5d068237701e/pydantic_core-2.41.3-cp314-cp314t-win_arm64.whl", hash = "sha256:b387f08b378924fa82bd86e03c9d61d6daca1a73ffb3947bdcfe12ea14c41f68", size = 1973551, upload-time = "2025-10-13T19:33:16.87Z" },
3113
- { url = "https://files.pythonhosted.org/packages/68/e6/a41dec3d50cfbd7445334459e847f97a62c5658d2c6da268886928ffd357/pydantic_core-2.41.3-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:a6ded5abbb7391c0db9e002aaa5f0e3a49a024b0a22e2ed09ab69087fd5ab8a8", size = 2112077, upload-time = "2025-10-13T19:34:00.77Z" },
3114
- { url = "https://files.pythonhosted.org/packages/44/38/e136a52ae85265a07999439cd8dcd24ba4e83e23d61e40000cd74b426f19/pydantic_core-2.41.3-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:43abc869cce9104ff35cb4eff3028e9a87346c95fe44e0173036bf4d782bdc3d", size = 1920464, upload-time = "2025-10-13T19:34:03.454Z" },
3115
- { url = "https://files.pythonhosted.org/packages/3e/5d/a3f509f682818ded836bd006adce08d731d81c77694a26a0a1a448f3e351/pydantic_core-2.41.3-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb3c63f4014a603caee687cd5c3c63298d2c8951b7acb2ccd0befbf2e1c0b8ad", size = 1951926, upload-time = "2025-10-13T19:34:05.983Z" },
3116
- { url = "https://files.pythonhosted.org/packages/59/0e/cb30ad2a0147cc7763c0c805ee1c534f6ed5d5db7bc8cf8ebaf34b4c9dab/pydantic_core-2.41.3-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88461e25f62e58db4d8b180e2612684f31b5844db0a8f8c1c421498c97bc197b", size = 2139233, upload-time = "2025-10-13T19:34:08.396Z" },
3059
+ sdist = { url = "https://files.pythonhosted.org/packages/df/18/d0944e8eaaa3efd0a91b0f1fc537d3be55ad35091b6a87638211ba691964/pydantic_core-2.41.4.tar.gz", hash = "sha256:70e47929a9d4a1905a67e4b687d5946026390568a8e952b92824118063cee4d5", size = 457557, upload-time = "2025-10-14T10:23:47.909Z" }
3060
+ wheels = [
3061
+ { url = "https://files.pythonhosted.org/packages/e9/81/d3b3e95929c4369d30b2a66a91db63c8ed0a98381ae55a45da2cd1cc1288/pydantic_core-2.41.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:ab06d77e053d660a6faaf04894446df7b0a7e7aba70c2797465a0a1af00fc887", size = 2099043, upload-time = "2025-10-14T10:20:28.561Z" },
3062
+ { url = "https://files.pythonhosted.org/packages/58/da/46fdac49e6717e3a94fc9201403e08d9d61aa7a770fab6190b8740749047/pydantic_core-2.41.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c53ff33e603a9c1179a9364b0a24694f183717b2e0da2b5ad43c316c956901b2", size = 1910699, upload-time = "2025-10-14T10:20:30.217Z" },
3063
+ { url = "https://files.pythonhosted.org/packages/1e/63/4d948f1b9dd8e991a5a98b77dd66c74641f5f2e5225fee37994b2e07d391/pydantic_core-2.41.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:304c54176af2c143bd181d82e77c15c41cbacea8872a2225dd37e6544dce9999", size = 1952121, upload-time = "2025-10-14T10:20:32.246Z" },
3064
+ { url = "https://files.pythonhosted.org/packages/b2/a7/e5fc60a6f781fc634ecaa9ecc3c20171d238794cef69ae0af79ac11b89d7/pydantic_core-2.41.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:025ba34a4cf4fb32f917d5d188ab5e702223d3ba603be4d8aca2f82bede432a4", size = 2041590, upload-time = "2025-10-14T10:20:34.332Z" },
3065
+ { url = "https://files.pythonhosted.org/packages/70/69/dce747b1d21d59e85af433428978a1893c6f8a7068fa2bb4a927fba7a5ff/pydantic_core-2.41.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b9f5f30c402ed58f90c70e12eff65547d3ab74685ffe8283c719e6bead8ef53f", size = 2219869, upload-time = "2025-10-14T10:20:35.965Z" },
3066
+ { url = "https://files.pythonhosted.org/packages/83/6a/c070e30e295403bf29c4df1cb781317b6a9bac7cd07b8d3acc94d501a63c/pydantic_core-2.41.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dd96e5d15385d301733113bcaa324c8bcf111275b7675a9c6e88bfb19fc05e3b", size = 2345169, upload-time = "2025-10-14T10:20:37.627Z" },
3067
+ { url = "https://files.pythonhosted.org/packages/f0/83/06d001f8043c336baea7fd202a9ac7ad71f87e1c55d8112c50b745c40324/pydantic_core-2.41.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98f348cbb44fae6e9653c1055db7e29de67ea6a9ca03a5fa2c2e11a47cff0e47", size = 2070165, upload-time = "2025-10-14T10:20:39.246Z" },
3068
+ { url = "https://files.pythonhosted.org/packages/14/0a/e567c2883588dd12bcbc110232d892cf385356f7c8a9910311ac997ab715/pydantic_core-2.41.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ec22626a2d14620a83ca583c6f5a4080fa3155282718b6055c2ea48d3ef35970", size = 2189067, upload-time = "2025-10-14T10:20:41.015Z" },
3069
+ { url = "https://files.pythonhosted.org/packages/f4/1d/3d9fca34273ba03c9b1c5289f7618bc4bd09c3ad2289b5420481aa051a99/pydantic_core-2.41.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3a95d4590b1f1a43bf33ca6d647b990a88f4a3824a8c4572c708f0b45a5290ed", size = 2132997, upload-time = "2025-10-14T10:20:43.106Z" },
3070
+ { url = "https://files.pythonhosted.org/packages/52/70/d702ef7a6cd41a8afc61f3554922b3ed8d19dd54c3bd4bdbfe332e610827/pydantic_core-2.41.4-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:f9672ab4d398e1b602feadcffcdd3af44d5f5e6ddc15bc7d15d376d47e8e19f8", size = 2307187, upload-time = "2025-10-14T10:20:44.849Z" },
3071
+ { url = "https://files.pythonhosted.org/packages/68/4c/c06be6e27545d08b802127914156f38d10ca287a9e8489342793de8aae3c/pydantic_core-2.41.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:84d8854db5f55fead3b579f04bda9a36461dab0730c5d570e1526483e7bb8431", size = 2305204, upload-time = "2025-10-14T10:20:46.781Z" },
3072
+ { url = "https://files.pythonhosted.org/packages/b0/e5/35ae4919bcd9f18603419e23c5eaf32750224a89d41a8df1a3704b69f77e/pydantic_core-2.41.4-cp312-cp312-win32.whl", hash = "sha256:9be1c01adb2ecc4e464392c36d17f97e9110fbbc906bcbe1c943b5b87a74aabd", size = 1972536, upload-time = "2025-10-14T10:20:48.39Z" },
3073
+ { url = "https://files.pythonhosted.org/packages/1e/c2/49c5bb6d2a49eb2ee3647a93e3dae7080c6409a8a7558b075027644e879c/pydantic_core-2.41.4-cp312-cp312-win_amd64.whl", hash = "sha256:d682cf1d22bab22a5be08539dca3d1593488a99998f9f412137bc323179067ff", size = 2031132, upload-time = "2025-10-14T10:20:50.421Z" },
3074
+ { url = "https://files.pythonhosted.org/packages/06/23/936343dbcba6eec93f73e95eb346810fc732f71ba27967b287b66f7b7097/pydantic_core-2.41.4-cp312-cp312-win_arm64.whl", hash = "sha256:833eebfd75a26d17470b58768c1834dfc90141b7afc6eb0429c21fc5a21dcfb8", size = 1969483, upload-time = "2025-10-14T10:20:52.35Z" },
3075
+ { url = "https://files.pythonhosted.org/packages/13/d0/c20adabd181a029a970738dfe23710b52a31f1258f591874fcdec7359845/pydantic_core-2.41.4-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:85e050ad9e5f6fe1004eec65c914332e52f429bc0ae12d6fa2092407a462c746", size = 2105688, upload-time = "2025-10-14T10:20:54.448Z" },
3076
+ { url = "https://files.pythonhosted.org/packages/00/b6/0ce5c03cec5ae94cca220dfecddc453c077d71363b98a4bbdb3c0b22c783/pydantic_core-2.41.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e7393f1d64792763a48924ba31d1e44c2cfbc05e3b1c2c9abb4ceeadd912cced", size = 1910807, upload-time = "2025-10-14T10:20:56.115Z" },
3077
+ { url = "https://files.pythonhosted.org/packages/68/3e/800d3d02c8beb0b5c069c870cbb83799d085debf43499c897bb4b4aaff0d/pydantic_core-2.41.4-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94dab0940b0d1fb28bcab847adf887c66a27a40291eedf0b473be58761c9799a", size = 1956669, upload-time = "2025-10-14T10:20:57.874Z" },
3078
+ { url = "https://files.pythonhosted.org/packages/60/a4/24271cc71a17f64589be49ab8bd0751f6a0a03046c690df60989f2f95c2c/pydantic_core-2.41.4-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:de7c42f897e689ee6f9e93c4bec72b99ae3b32a2ade1c7e4798e690ff5246e02", size = 2051629, upload-time = "2025-10-14T10:21:00.006Z" },
3079
+ { url = "https://files.pythonhosted.org/packages/68/de/45af3ca2f175d91b96bfb62e1f2d2f1f9f3b14a734afe0bfeff079f78181/pydantic_core-2.41.4-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:664b3199193262277b8b3cd1e754fb07f2c6023289c815a1e1e8fb415cb247b1", size = 2224049, upload-time = "2025-10-14T10:21:01.801Z" },
3080
+ { url = "https://files.pythonhosted.org/packages/af/8f/ae4e1ff84672bf869d0a77af24fd78387850e9497753c432875066b5d622/pydantic_core-2.41.4-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d95b253b88f7d308b1c0b417c4624f44553ba4762816f94e6986819b9c273fb2", size = 2342409, upload-time = "2025-10-14T10:21:03.556Z" },
3081
+ { url = "https://files.pythonhosted.org/packages/18/62/273dd70b0026a085c7b74b000394e1ef95719ea579c76ea2f0cc8893736d/pydantic_core-2.41.4-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1351f5bbdbbabc689727cb91649a00cb9ee7203e0a6e54e9f5ba9e22e384b84", size = 2069635, upload-time = "2025-10-14T10:21:05.385Z" },
3082
+ { url = "https://files.pythonhosted.org/packages/30/03/cf485fff699b4cdaea469bc481719d3e49f023241b4abb656f8d422189fc/pydantic_core-2.41.4-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1affa4798520b148d7182da0615d648e752de4ab1a9566b7471bc803d88a062d", size = 2194284, upload-time = "2025-10-14T10:21:07.122Z" },
3083
+ { url = "https://files.pythonhosted.org/packages/f9/7e/c8e713db32405dfd97211f2fc0a15d6bf8adb7640f3d18544c1f39526619/pydantic_core-2.41.4-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7b74e18052fea4aa8dea2fb7dbc23d15439695da6cbe6cfc1b694af1115df09d", size = 2137566, upload-time = "2025-10-14T10:21:08.981Z" },
3084
+ { url = "https://files.pythonhosted.org/packages/04/f7/db71fd4cdccc8b75990f79ccafbbd66757e19f6d5ee724a6252414483fb4/pydantic_core-2.41.4-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:285b643d75c0e30abda9dc1077395624f314a37e3c09ca402d4015ef5979f1a2", size = 2316809, upload-time = "2025-10-14T10:21:10.805Z" },
3085
+ { url = "https://files.pythonhosted.org/packages/76/63/a54973ddb945f1bca56742b48b144d85c9fc22f819ddeb9f861c249d5464/pydantic_core-2.41.4-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:f52679ff4218d713b3b33f88c89ccbf3a5c2c12ba665fb80ccc4192b4608dbab", size = 2311119, upload-time = "2025-10-14T10:21:12.583Z" },
3086
+ { url = "https://files.pythonhosted.org/packages/f8/03/5d12891e93c19218af74843a27e32b94922195ded2386f7b55382f904d2f/pydantic_core-2.41.4-cp313-cp313-win32.whl", hash = "sha256:ecde6dedd6fff127c273c76821bb754d793be1024bc33314a120f83a3c69460c", size = 1981398, upload-time = "2025-10-14T10:21:14.584Z" },
3087
+ { url = "https://files.pythonhosted.org/packages/be/d8/fd0de71f39db91135b7a26996160de71c073d8635edfce8b3c3681be0d6d/pydantic_core-2.41.4-cp313-cp313-win_amd64.whl", hash = "sha256:d081a1f3800f05409ed868ebb2d74ac39dd0c1ff6c035b5162356d76030736d4", size = 2030735, upload-time = "2025-10-14T10:21:16.432Z" },
3088
+ { url = "https://files.pythonhosted.org/packages/72/86/c99921c1cf6650023c08bfab6fe2d7057a5142628ef7ccfa9921f2dda1d5/pydantic_core-2.41.4-cp313-cp313-win_arm64.whl", hash = "sha256:f8e49c9c364a7edcbe2a310f12733aad95b022495ef2a8d653f645e5d20c1564", size = 1973209, upload-time = "2025-10-14T10:21:18.213Z" },
3089
+ { url = "https://files.pythonhosted.org/packages/36/0d/b5706cacb70a8414396efdda3d72ae0542e050b591119e458e2490baf035/pydantic_core-2.41.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:ed97fd56a561f5eb5706cebe94f1ad7c13b84d98312a05546f2ad036bafe87f4", size = 1877324, upload-time = "2025-10-14T10:21:20.363Z" },
3090
+ { url = "https://files.pythonhosted.org/packages/de/2d/cba1fa02cfdea72dfb3a9babb067c83b9dff0bbcb198368e000a6b756ea7/pydantic_core-2.41.4-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a870c307bf1ee91fc58a9a61338ff780d01bfae45922624816878dce784095d2", size = 1884515, upload-time = "2025-10-14T10:21:22.339Z" },
3091
+ { url = "https://files.pythonhosted.org/packages/07/ea/3df927c4384ed9b503c9cc2d076cf983b4f2adb0c754578dfb1245c51e46/pydantic_core-2.41.4-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d25e97bc1f5f8f7985bdc2335ef9e73843bb561eb1fa6831fdfc295c1c2061cf", size = 2042819, upload-time = "2025-10-14T10:21:26.683Z" },
3092
+ { url = "https://files.pythonhosted.org/packages/6a/ee/df8e871f07074250270a3b1b82aad4cd0026b588acd5d7d3eb2fcb1471a3/pydantic_core-2.41.4-cp313-cp313t-win_amd64.whl", hash = "sha256:d405d14bea042f166512add3091c1af40437c2e7f86988f3915fabd27b1e9cd2", size = 1995866, upload-time = "2025-10-14T10:21:28.951Z" },
3093
+ { url = "https://files.pythonhosted.org/packages/fc/de/b20f4ab954d6d399499c33ec4fafc46d9551e11dc1858fb7f5dca0748ceb/pydantic_core-2.41.4-cp313-cp313t-win_arm64.whl", hash = "sha256:19f3684868309db5263a11bace3c45d93f6f24afa2ffe75a647583df22a2ff89", size = 1970034, upload-time = "2025-10-14T10:21:30.869Z" },
3094
+ { url = "https://files.pythonhosted.org/packages/54/28/d3325da57d413b9819365546eb9a6e8b7cbd9373d9380efd5f74326143e6/pydantic_core-2.41.4-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:e9205d97ed08a82ebb9a307e92914bb30e18cdf6f6b12ca4bedadb1588a0bfe1", size = 2102022, upload-time = "2025-10-14T10:21:32.809Z" },
3095
+ { url = "https://files.pythonhosted.org/packages/9e/24/b58a1bc0d834bf1acc4361e61233ee217169a42efbdc15a60296e13ce438/pydantic_core-2.41.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:82df1f432b37d832709fbcc0e24394bba04a01b6ecf1ee87578145c19cde12ac", size = 1905495, upload-time = "2025-10-14T10:21:34.812Z" },
3096
+ { url = "https://files.pythonhosted.org/packages/fb/a4/71f759cc41b7043e8ecdaab81b985a9b6cad7cec077e0b92cff8b71ecf6b/pydantic_core-2.41.4-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc3b4cc4539e055cfa39a3763c939f9d409eb40e85813257dcd761985a108554", size = 1956131, upload-time = "2025-10-14T10:21:36.924Z" },
3097
+ { url = "https://files.pythonhosted.org/packages/b0/64/1e79ac7aa51f1eec7c4cda8cbe456d5d09f05fdd68b32776d72168d54275/pydantic_core-2.41.4-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b1eb1754fce47c63d2ff57fdb88c351a6c0150995890088b33767a10218eaa4e", size = 2052236, upload-time = "2025-10-14T10:21:38.927Z" },
3098
+ { url = "https://files.pythonhosted.org/packages/e9/e3/a3ffc363bd4287b80f1d43dc1c28ba64831f8dfc237d6fec8f2661138d48/pydantic_core-2.41.4-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e6ab5ab30ef325b443f379ddb575a34969c333004fca5a1daa0133a6ffaad616", size = 2223573, upload-time = "2025-10-14T10:21:41.574Z" },
3099
+ { url = "https://files.pythonhosted.org/packages/28/27/78814089b4d2e684a9088ede3790763c64693c3d1408ddc0a248bc789126/pydantic_core-2.41.4-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:31a41030b1d9ca497634092b46481b937ff9397a86f9f51bd41c4767b6fc04af", size = 2342467, upload-time = "2025-10-14T10:21:44.018Z" },
3100
+ { url = "https://files.pythonhosted.org/packages/92/97/4de0e2a1159cb85ad737e03306717637842c88c7fd6d97973172fb183149/pydantic_core-2.41.4-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a44ac1738591472c3d020f61c6df1e4015180d6262ebd39bf2aeb52571b60f12", size = 2063754, upload-time = "2025-10-14T10:21:46.466Z" },
3101
+ { url = "https://files.pythonhosted.org/packages/0f/50/8cb90ce4b9efcf7ae78130afeb99fd1c86125ccdf9906ef64b9d42f37c25/pydantic_core-2.41.4-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d72f2b5e6e82ab8f94ea7d0d42f83c487dc159c5240d8f83beae684472864e2d", size = 2196754, upload-time = "2025-10-14T10:21:48.486Z" },
3102
+ { url = "https://files.pythonhosted.org/packages/34/3b/ccdc77af9cd5082723574a1cc1bcae7a6acacc829d7c0a06201f7886a109/pydantic_core-2.41.4-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:c4d1e854aaf044487d31143f541f7aafe7b482ae72a022c664b2de2e466ed0ad", size = 2137115, upload-time = "2025-10-14T10:21:50.63Z" },
3103
+ { url = "https://files.pythonhosted.org/packages/ca/ba/e7c7a02651a8f7c52dc2cff2b64a30c313e3b57c7d93703cecea76c09b71/pydantic_core-2.41.4-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:b568af94267729d76e6ee5ececda4e283d07bbb28e8148bb17adad93d025d25a", size = 2317400, upload-time = "2025-10-14T10:21:52.959Z" },
3104
+ { url = "https://files.pythonhosted.org/packages/2c/ba/6c533a4ee8aec6b812c643c49bb3bd88d3f01e3cebe451bb85512d37f00f/pydantic_core-2.41.4-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:6d55fb8b1e8929b341cc313a81a26e0d48aa3b519c1dbaadec3a6a2b4fcad025", size = 2312070, upload-time = "2025-10-14T10:21:55.419Z" },
3105
+ { url = "https://files.pythonhosted.org/packages/22/ae/f10524fcc0ab8d7f96cf9a74c880243576fd3e72bd8ce4f81e43d22bcab7/pydantic_core-2.41.4-cp314-cp314-win32.whl", hash = "sha256:5b66584e549e2e32a1398df11da2e0a7eff45d5c2d9db9d5667c5e6ac764d77e", size = 1982277, upload-time = "2025-10-14T10:21:57.474Z" },
3106
+ { url = "https://files.pythonhosted.org/packages/b4/dc/e5aa27aea1ad4638f0c3fb41132f7eb583bd7420ee63204e2d4333a3bbf9/pydantic_core-2.41.4-cp314-cp314-win_amd64.whl", hash = "sha256:557a0aab88664cc552285316809cab897716a372afaf8efdbef756f8b890e894", size = 2024608, upload-time = "2025-10-14T10:21:59.557Z" },
3107
+ { url = "https://files.pythonhosted.org/packages/3e/61/51d89cc2612bd147198e120a13f150afbf0bcb4615cddb049ab10b81b79e/pydantic_core-2.41.4-cp314-cp314-win_arm64.whl", hash = "sha256:3f1ea6f48a045745d0d9f325989d8abd3f1eaf47dd00485912d1a3a63c623a8d", size = 1967614, upload-time = "2025-10-14T10:22:01.847Z" },
3108
+ { url = "https://files.pythonhosted.org/packages/0d/c2/472f2e31b95eff099961fa050c376ab7156a81da194f9edb9f710f68787b/pydantic_core-2.41.4-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:6c1fe4c5404c448b13188dd8bd2ebc2bdd7e6727fa61ff481bcc2cca894018da", size = 1876904, upload-time = "2025-10-14T10:22:04.062Z" },
3109
+ { url = "https://files.pythonhosted.org/packages/4a/07/ea8eeb91173807ecdae4f4a5f4b150a520085b35454350fc219ba79e66a3/pydantic_core-2.41.4-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:523e7da4d43b113bf8e7b49fa4ec0c35bf4fe66b2230bfc5c13cc498f12c6c3e", size = 1882538, upload-time = "2025-10-14T10:22:06.39Z" },
3110
+ { url = "https://files.pythonhosted.org/packages/1e/29/b53a9ca6cd366bfc928823679c6a76c7a4c69f8201c0ba7903ad18ebae2f/pydantic_core-2.41.4-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5729225de81fb65b70fdb1907fcf08c75d498f4a6f15af005aabb1fdadc19dfa", size = 2041183, upload-time = "2025-10-14T10:22:08.812Z" },
3111
+ { url = "https://files.pythonhosted.org/packages/c7/3d/f8c1a371ceebcaf94d6dd2d77c6cf4b1c078e13a5837aee83f760b4f7cfd/pydantic_core-2.41.4-cp314-cp314t-win_amd64.whl", hash = "sha256:de2cfbb09e88f0f795fd90cf955858fc2c691df65b1f21f0aa00b99f3fbc661d", size = 1993542, upload-time = "2025-10-14T10:22:11.332Z" },
3112
+ { url = "https://files.pythonhosted.org/packages/8a/ac/9fc61b4f9d079482a290afe8d206b8f490e9fd32d4fc03ed4fc698214e01/pydantic_core-2.41.4-cp314-cp314t-win_arm64.whl", hash = "sha256:d34f950ae05a83e0ede899c595f312ca976023ea1db100cd5aa188f7005e3ab0", size = 1973897, upload-time = "2025-10-14T10:22:13.444Z" },
3113
+ { url = "https://files.pythonhosted.org/packages/c4/48/ae937e5a831b7c0dc646b2ef788c27cd003894882415300ed21927c21efa/pydantic_core-2.41.4-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:4f5d640aeebb438517150fdeec097739614421900e4a08db4a3ef38898798537", size = 2112087, upload-time = "2025-10-14T10:22:56.818Z" },
3114
+ { url = "https://files.pythonhosted.org/packages/5e/db/6db8073e3d32dae017da7e0d16a9ecb897d0a4d92e00634916e486097961/pydantic_core-2.41.4-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:4a9ab037b71927babc6d9e7fc01aea9e66dc2a4a34dff06ef0724a4049629f94", size = 1920387, upload-time = "2025-10-14T10:22:59.342Z" },
3115
+ { url = "https://files.pythonhosted.org/packages/0d/c1/dd3542d072fcc336030d66834872f0328727e3b8de289c662faa04aa270e/pydantic_core-2.41.4-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4dab9484ec605c3016df9ad4fd4f9a390bc5d816a3b10c6550f8424bb80b18c", size = 1951495, upload-time = "2025-10-14T10:23:02.089Z" },
3116
+ { url = "https://files.pythonhosted.org/packages/2b/c6/db8d13a1f8ab3f1eb08c88bd00fd62d44311e3456d1e85c0e59e0a0376e7/pydantic_core-2.41.4-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd8a5028425820731d8c6c098ab642d7b8b999758e24acae03ed38a66eca8335", size = 2139008, upload-time = "2025-10-14T10:23:04.539Z" },
3117
3117
  ]
3118
3118
 
3119
3119
  [[package]]
File without changes
File without changes
File without changes
File without changes
File without changes