hammad-python 0.0.15__py3-none-any.whl → 0.0.16__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.
Files changed (111) hide show
  1. hammad/__init__.py +178 -0
  2. hammad/_internal.py +237 -0
  3. hammad/cache/__init__.py +40 -0
  4. hammad/cache/base_cache.py +181 -0
  5. hammad/cache/cache.py +169 -0
  6. hammad/cache/decorators.py +261 -0
  7. hammad/cache/file_cache.py +80 -0
  8. hammad/cache/ttl_cache.py +74 -0
  9. hammad/cli/__init__.py +35 -0
  10. hammad/cli/_runner.py +265 -0
  11. hammad/cli/animations.py +573 -0
  12. hammad/cli/plugins.py +836 -0
  13. hammad/cli/styles/__init__.py +55 -0
  14. hammad/cli/styles/settings.py +139 -0
  15. hammad/cli/styles/types.py +358 -0
  16. hammad/cli/styles/utils.py +626 -0
  17. hammad/data/__init__.py +83 -0
  18. hammad/data/collections/__init__.py +44 -0
  19. hammad/data/collections/collection.py +274 -0
  20. hammad/data/collections/indexes/__init__.py +37 -0
  21. hammad/data/collections/indexes/qdrant/__init__.py +1 -0
  22. hammad/data/collections/indexes/qdrant/index.py +735 -0
  23. hammad/data/collections/indexes/qdrant/settings.py +94 -0
  24. hammad/data/collections/indexes/qdrant/utils.py +220 -0
  25. hammad/data/collections/indexes/tantivy/__init__.py +1 -0
  26. hammad/data/collections/indexes/tantivy/index.py +428 -0
  27. hammad/data/collections/indexes/tantivy/settings.py +51 -0
  28. hammad/data/collections/indexes/tantivy/utils.py +200 -0
  29. hammad/data/configurations/__init__.py +35 -0
  30. hammad/data/configurations/configuration.py +564 -0
  31. hammad/data/models/__init__.py +55 -0
  32. hammad/data/models/extensions/__init__.py +4 -0
  33. hammad/data/models/extensions/pydantic/__init__.py +42 -0
  34. hammad/data/models/extensions/pydantic/converters.py +759 -0
  35. hammad/data/models/fields.py +546 -0
  36. hammad/data/models/model.py +1078 -0
  37. hammad/data/models/utils.py +280 -0
  38. hammad/data/sql/__init__.py +23 -0
  39. hammad/data/sql/database.py +578 -0
  40. hammad/data/sql/types.py +141 -0
  41. hammad/data/types/__init__.py +39 -0
  42. hammad/data/types/file.py +358 -0
  43. hammad/data/types/multimodal/__init__.py +24 -0
  44. hammad/data/types/multimodal/audio.py +96 -0
  45. hammad/data/types/multimodal/image.py +80 -0
  46. hammad/data/types/text.py +1066 -0
  47. hammad/formatting/__init__.py +20 -0
  48. hammad/formatting/json/__init__.py +27 -0
  49. hammad/formatting/json/converters.py +158 -0
  50. hammad/formatting/text/__init__.py +63 -0
  51. hammad/formatting/text/converters.py +723 -0
  52. hammad/formatting/text/markdown.py +131 -0
  53. hammad/formatting/yaml/__init__.py +26 -0
  54. hammad/formatting/yaml/converters.py +5 -0
  55. hammad/genai/__init__.py +78 -0
  56. hammad/genai/agents/__init__.py +1 -0
  57. hammad/genai/agents/types/__init__.py +35 -0
  58. hammad/genai/agents/types/history.py +277 -0
  59. hammad/genai/agents/types/tool.py +490 -0
  60. hammad/genai/embedding_models/__init__.py +41 -0
  61. hammad/genai/embedding_models/embedding_model.py +193 -0
  62. hammad/genai/embedding_models/embedding_model_name.py +77 -0
  63. hammad/genai/embedding_models/embedding_model_request.py +65 -0
  64. hammad/genai/embedding_models/embedding_model_response.py +69 -0
  65. hammad/genai/embedding_models/run.py +161 -0
  66. hammad/genai/language_models/__init__.py +35 -0
  67. hammad/genai/language_models/_streaming.py +622 -0
  68. hammad/genai/language_models/_types.py +276 -0
  69. hammad/genai/language_models/_utils/__init__.py +31 -0
  70. hammad/genai/language_models/_utils/_completions.py +131 -0
  71. hammad/genai/language_models/_utils/_messages.py +89 -0
  72. hammad/genai/language_models/_utils/_requests.py +202 -0
  73. hammad/genai/language_models/_utils/_structured_outputs.py +124 -0
  74. hammad/genai/language_models/language_model.py +734 -0
  75. hammad/genai/language_models/language_model_request.py +135 -0
  76. hammad/genai/language_models/language_model_response.py +219 -0
  77. hammad/genai/language_models/language_model_response_chunk.py +53 -0
  78. hammad/genai/language_models/run.py +530 -0
  79. hammad/genai/multimodal_models.py +48 -0
  80. hammad/genai/rerank_models.py +26 -0
  81. hammad/logging/__init__.py +35 -0
  82. hammad/logging/decorators.py +834 -0
  83. hammad/logging/logger.py +954 -0
  84. hammad/mcp/__init__.py +50 -0
  85. hammad/mcp/client/__init__.py +36 -0
  86. hammad/mcp/client/client.py +624 -0
  87. hammad/mcp/client/client_service.py +400 -0
  88. hammad/mcp/client/settings.py +178 -0
  89. hammad/mcp/servers/__init__.py +25 -0
  90. hammad/mcp/servers/launcher.py +1161 -0
  91. hammad/runtime/__init__.py +32 -0
  92. hammad/runtime/decorators.py +142 -0
  93. hammad/runtime/run.py +299 -0
  94. hammad/service/__init__.py +49 -0
  95. hammad/service/create.py +527 -0
  96. hammad/service/decorators.py +285 -0
  97. hammad/typing/__init__.py +435 -0
  98. hammad/web/__init__.py +43 -0
  99. hammad/web/http/__init__.py +1 -0
  100. hammad/web/http/client.py +944 -0
  101. hammad/web/models.py +277 -0
  102. hammad/web/openapi/__init__.py +1 -0
  103. hammad/web/openapi/client.py +740 -0
  104. hammad/web/search/__init__.py +1 -0
  105. hammad/web/search/client.py +1035 -0
  106. hammad/web/utils.py +472 -0
  107. {hammad_python-0.0.15.dist-info → hammad_python-0.0.16.dist-info}/METADATA +8 -1
  108. hammad_python-0.0.16.dist-info/RECORD +110 -0
  109. hammad_python-0.0.15.dist-info/RECORD +0 -4
  110. {hammad_python-0.0.15.dist-info → hammad_python-0.0.16.dist-info}/WHEEL +0 -0
  111. {hammad_python-0.0.15.dist-info → hammad_python-0.0.16.dist-info}/licenses/LICENSE +0 -0
hammad/web/utils.py ADDED
@@ -0,0 +1,472 @@
1
+ """hammad.web.utils"""
2
+
3
+ import asyncio
4
+ from typing import Any, Dict, Optional, Union, Literal, List, overload, TYPE_CHECKING
5
+
6
+ if TYPE_CHECKING:
7
+ from .http.client import HttpResponse
8
+
9
+ from .models import (
10
+ SearchResults,
11
+ NewsResults,
12
+ WebPageResult,
13
+ WebPageResults,
14
+ ExtractedLinks,
15
+ HttpResponse as HttpResponseModel,
16
+ )
17
+
18
+ __all__ = (
19
+ "run_web_request",
20
+ "run_web_search",
21
+ "read_web_page",
22
+ "read_web_pages",
23
+ "run_news_search",
24
+ "extract_web_page_links",
25
+ )
26
+
27
+
28
+ # Module-level singleton for performance
29
+ _search_client = None
30
+
31
+
32
+ def _get_search_client():
33
+ """Get a SearchClient instance using lazy import and singleton pattern."""
34
+ global _search_client
35
+ if _search_client is None:
36
+ from .search.client import AsyncSearchClient as SearchClient
37
+
38
+ _search_client = SearchClient()
39
+ return _search_client
40
+
41
+
42
+ @overload
43
+ def run_web_request(
44
+ type: Literal["http"],
45
+ method: Literal["GET", "POST", "PUT", "PATCH", "DELETE", "HEAD", "OPTIONS"],
46
+ url: str,
47
+ *,
48
+ headers: Optional[Dict[str, str]] = None,
49
+ params: Optional[Dict[str, Any]] = None,
50
+ json_data: Optional[Dict[str, Any]] = None,
51
+ form_data: Optional[Dict[str, Any]] = None,
52
+ content: Optional[Union[str, bytes]] = None,
53
+ timeout: Optional[float] = None,
54
+ follow_redirects: bool = True,
55
+ base_url: Optional[str] = None,
56
+ default_headers: Optional[Dict[str, str]] = None,
57
+ verify_ssl: bool = True,
58
+ # Semantic authentication parameters
59
+ api_key: Optional[str] = None,
60
+ api_key_header: str = "X-API-Key",
61
+ bearer_token: Optional[str] = None,
62
+ basic_auth: Optional[tuple[str, str]] = None,
63
+ user_agent: Optional[str] = None,
64
+ retry_attempts: int = 0,
65
+ retry_delay: float = 1.0,
66
+ ) -> "HttpResponse": ...
67
+
68
+
69
+ @overload
70
+ def run_web_request(
71
+ type: Literal["openapi"],
72
+ openapi_spec: Union[str, Dict[str, Any]],
73
+ operation_id: str,
74
+ *,
75
+ parameters: Optional[Dict[str, Any]] = None,
76
+ request_body: Optional[Dict[str, Any]] = None,
77
+ headers: Optional[Dict[str, str]] = None,
78
+ base_url: Optional[str] = None,
79
+ default_headers: Optional[Dict[str, str]] = None,
80
+ timeout: float = 30.0,
81
+ follow_redirects: bool = True,
82
+ verify_ssl: bool = True,
83
+ # Semantic authentication parameters
84
+ api_key: Optional[str] = None,
85
+ api_key_header: str = "X-API-Key",
86
+ bearer_token: Optional[str] = None,
87
+ basic_auth: Optional[tuple[str, str]] = None,
88
+ user_agent: Optional[str] = None,
89
+ ) -> "HttpResponse": ...
90
+
91
+
92
+ def run_web_request(
93
+ type: Literal["http", "openapi"], *args, **kwargs
94
+ ) -> "HttpResponse":
95
+ """
96
+ Create and execute a request using either HTTP or OpenAPI toolkits.
97
+
98
+ This function initializes the appropriate toolkit and sends the request,
99
+ returning the HTTP response.
100
+
101
+ Args:
102
+ type: Type of request - "http" for direct HTTP requests or "openapi" for OpenAPI operations
103
+
104
+ HTTP-specific args:
105
+ method: HTTP method
106
+ url: Request URL
107
+ headers: Request headers
108
+ params: Query parameters
109
+ json_data: JSON request body
110
+ form_data: Form data
111
+ content: Raw content
112
+ timeout: Request timeout
113
+ follow_redirects: Whether to follow redirects
114
+ base_url: Base URL for requests
115
+ default_headers: Default headers
116
+ verify_ssl: Whether to verify SSL certificates
117
+
118
+ OpenAPI-specific args:
119
+ openapi_spec: OpenAPI specification (dict, JSON string, or YAML string)
120
+ operation_id: OpenAPI operation ID to execute
121
+ parameters: Operation parameters
122
+ request_body: Request body for the operation
123
+ headers: Additional headers
124
+ base_url: Base URL override
125
+ default_headers: Default headers
126
+ timeout: Request timeout
127
+ follow_redirects: Whether to follow redirects
128
+ verify_ssl: Whether to verify SSL certificates
129
+
130
+ Returns:
131
+ HttpResponse object containing the response data
132
+
133
+ Raises:
134
+ ValueError: For invalid request type or missing required parameters
135
+ HttpToolkitError: For HTTP-related errors
136
+ OpenApiToolkitError: For OpenAPI-related errors
137
+ """
138
+
139
+ async def _run_web_request_async():
140
+ if type == "http":
141
+ if len(args) < 2:
142
+ raise ValueError(
143
+ "HTTP requests require method and url as positional arguments"
144
+ )
145
+
146
+ method, url = args[0], args[1]
147
+
148
+ # Import here to avoid circular imports
149
+ from .http.client import HttpClient as HttpToolkit
150
+
151
+ # Initialize the HTTP toolkit
152
+ toolkit = HttpToolkit(
153
+ base_url=kwargs.get("base_url"),
154
+ default_headers=kwargs.get("default_headers", {}),
155
+ timeout=kwargs.get("timeout", 30.0),
156
+ follow_redirects=kwargs.get("follow_redirects", True),
157
+ verify_ssl=kwargs.get("verify_ssl", True),
158
+ api_key=kwargs.get("api_key"),
159
+ api_key_header=kwargs.get("api_key_header", "X-API-Key"),
160
+ bearer_token=kwargs.get("bearer_token"),
161
+ basic_auth=kwargs.get("basic_auth"),
162
+ user_agent=kwargs.get("user_agent"),
163
+ )
164
+
165
+ # Execute the request based on method
166
+ if method.upper() == "GET":
167
+ return await toolkit.get(
168
+ url,
169
+ headers=kwargs.get("headers"),
170
+ params=kwargs.get("params"),
171
+ timeout=kwargs.get("timeout"),
172
+ retry_attempts=kwargs.get("retry_attempts", 0),
173
+ retry_delay=kwargs.get("retry_delay", 1.0),
174
+ )
175
+ elif method.upper() == "POST":
176
+ return await toolkit.post(
177
+ url,
178
+ headers=kwargs.get("headers"),
179
+ json_data=kwargs.get("json_data"),
180
+ form_data=kwargs.get("form_data"),
181
+ timeout=kwargs.get("timeout"),
182
+ retry_attempts=kwargs.get("retry_attempts", 0),
183
+ )
184
+ elif method.upper() == "PUT":
185
+ return await toolkit.put(
186
+ url,
187
+ headers=kwargs.get("headers"),
188
+ json_data=kwargs.get("json_data"),
189
+ form_data=kwargs.get("form_data"),
190
+ timeout=kwargs.get("timeout"),
191
+ retry_attempts=kwargs.get("retry_attempts", 0),
192
+ )
193
+ elif method.upper() == "PATCH":
194
+ return await toolkit.patch(
195
+ url,
196
+ headers=kwargs.get("headers"),
197
+ json_data=kwargs.get("json_data"),
198
+ form_data=kwargs.get("form_data"),
199
+ timeout=kwargs.get("timeout"),
200
+ retry_attempts=kwargs.get("retry_attempts", 0),
201
+ )
202
+ elif method.upper() == "DELETE":
203
+ return await toolkit.delete(
204
+ url,
205
+ headers=kwargs.get("headers"),
206
+ timeout=kwargs.get("timeout"),
207
+ retry_attempts=kwargs.get("retry_attempts", 0),
208
+ )
209
+ else:
210
+ raise ValueError(f"Unsupported HTTP method: {method}")
211
+
212
+ elif type == "openapi":
213
+ from .openapi.client import OpenAPIClient as OpenApiToolkit
214
+
215
+ if len(args) < 2:
216
+ raise ValueError(
217
+ "OpenAPI requests require openapi_spec and operation_id as positional arguments"
218
+ )
219
+
220
+ openapi_spec, operation_id = args[0], args[1]
221
+
222
+ # Initialize the OpenAPI toolkit
223
+ toolkit = OpenApiToolkit(
224
+ openapi_spec=openapi_spec,
225
+ base_url=kwargs.get("base_url"),
226
+ default_headers=kwargs.get("default_headers"),
227
+ timeout=kwargs.get("timeout", 30.0),
228
+ follow_redirects=kwargs.get("follow_redirects", True),
229
+ verify_ssl=kwargs.get("verify_ssl", True),
230
+ api_key=kwargs.get("api_key"),
231
+ api_key_header=kwargs.get("api_key_header", "X-API-Key"),
232
+ bearer_token=kwargs.get("bearer_token"),
233
+ basic_auth=kwargs.get("basic_auth"),
234
+ user_agent=kwargs.get("user_agent"),
235
+ )
236
+
237
+ # Execute the OpenAPI operation
238
+ return await toolkit.execute_operation(
239
+ operation_id=operation_id,
240
+ parameters=kwargs.get("parameters"),
241
+ request_body=kwargs.get("request_body"),
242
+ headers=kwargs.get("headers"),
243
+ )
244
+
245
+ else:
246
+ raise ValueError(
247
+ f"Invalid request type: {type}. Must be 'http' or 'openapi'"
248
+ )
249
+
250
+ return asyncio.run(_run_web_request_async())
251
+
252
+
253
+ def run_web_search(
254
+ query: str,
255
+ *,
256
+ max_results: int = 10,
257
+ region: str = "wt-wt",
258
+ safesearch: Literal["on", "moderate", "off"] = "moderate",
259
+ timelimit: Optional[Literal["d", "w", "m", "y"]] = None,
260
+ backend: Literal["auto", "html", "lite"] = "auto",
261
+ retry_attempts: int = 3,
262
+ retry_delay: float = 1.0,
263
+ ) -> SearchResults:
264
+ """
265
+ Search the web using DuckDuckGo search.
266
+
267
+ Args:
268
+ query: Search query string
269
+ max_results: Maximum number of results to return (default: 10)
270
+ region: Search region (default: "wt-wt" for worldwide)
271
+ safesearch: Safe search setting (default: "moderate")
272
+ timelimit: Time limit for results (d=day, w=week, m=month, y=year)
273
+ backend: Search backend to use (default: "auto")
274
+ retry_attempts: Number of retry attempts for rate limit errors (default: 3)
275
+ retry_delay: Initial delay between retries in seconds (default: 1.0)
276
+
277
+ Returns:
278
+ List of search result dictionaries with 'title', 'href', and 'body' keys
279
+
280
+ Raises:
281
+ ValueError: If query is empty
282
+ Exception: If search fails after all retries
283
+ """
284
+
285
+ async def _run_web_search_async():
286
+ client = _get_search_client()
287
+ return await client.web_search(
288
+ query=query,
289
+ max_results=max_results,
290
+ region=region,
291
+ safesearch=safesearch,
292
+ timelimit=timelimit,
293
+ backend=backend,
294
+ )
295
+
296
+ return asyncio.run(_run_web_search_async())
297
+
298
+
299
+ def read_web_page(
300
+ url: str,
301
+ *,
302
+ timeout: float = 30.0,
303
+ headers: Optional[Dict[str, str]] = None,
304
+ extract_text: bool = True,
305
+ extract_links: bool = False,
306
+ extract_images: bool = False,
307
+ css_selector: Optional[str] = None,
308
+ ) -> WebPageResult:
309
+ """
310
+ Read and parse a single web page using selectolax.
311
+
312
+ Args:
313
+ url: URL to fetch and parse
314
+ timeout: Request timeout in seconds (default: 30.0)
315
+ headers: Optional HTTP headers to send
316
+ extract_text: Whether to extract text content (default: True)
317
+ extract_links: Whether to extract links (default: False)
318
+ extract_images: Whether to extract images (default: False)
319
+ css_selector: Optional CSS selector to extract specific elements
320
+
321
+ Returns:
322
+ Dictionary containing parsed content and metadata
323
+
324
+ Raises:
325
+ httpx.HTTPError: If request fails
326
+ Exception: If parsing fails
327
+ """
328
+
329
+ async def _read_web_page_async():
330
+ client = _get_search_client()
331
+ return await client.read_web_page(
332
+ url=url,
333
+ timeout=timeout,
334
+ headers=headers,
335
+ extract_text=extract_text,
336
+ extract_links=extract_links,
337
+ extract_images=extract_images,
338
+ css_selector=css_selector,
339
+ )
340
+
341
+ return asyncio.run(_read_web_page_async())
342
+
343
+
344
+ def read_web_pages(
345
+ urls: List[str],
346
+ *,
347
+ timeout: float = 30.0,
348
+ headers: Optional[Dict[str, str]] = None,
349
+ extract_text: bool = True,
350
+ extract_links: bool = False,
351
+ extract_images: bool = False,
352
+ css_selector: Optional[str] = None,
353
+ max_concurrent: int = 5,
354
+ ) -> WebPageResults:
355
+ """
356
+ Read and parse multiple web pages concurrently using selectolax.
357
+
358
+ Args:
359
+ urls: List of URLs to fetch and parse
360
+ timeout: Request timeout in seconds (default: 30.0)
361
+ headers: Optional HTTP headers to send
362
+ extract_text: Whether to extract text content (default: True)
363
+ extract_links: Whether to extract links (default: False)
364
+ extract_images: Whether to extract images (default: False)
365
+ css_selector: Optional CSS selector to extract specific elements
366
+ max_concurrent: Maximum number of concurrent requests (default: 5)
367
+
368
+ Returns:
369
+ List of dictionaries containing parsed content and metadata
370
+
371
+ Raises:
372
+ Exception: If any critical error occurs
373
+ """
374
+
375
+ async def _read_web_pages_async():
376
+ client = _get_search_client()
377
+ return await client.read_web_pages(
378
+ urls=urls,
379
+ timeout=timeout,
380
+ headers=headers,
381
+ extract_text=extract_text,
382
+ extract_links=extract_links,
383
+ extract_images=extract_images,
384
+ css_selector=css_selector,
385
+ max_concurrent=max_concurrent,
386
+ )
387
+
388
+ return asyncio.run(_read_web_pages_async())
389
+
390
+
391
+ def run_news_search(
392
+ query: str,
393
+ *,
394
+ max_results: int = 10,
395
+ region: str = "wt-wt",
396
+ safesearch: Literal["on", "moderate", "off"] = "moderate",
397
+ timelimit: Optional[Literal["d", "w", "m"]] = None,
398
+ ) -> NewsResults:
399
+ """
400
+ Search for news using DuckDuckGo news search.
401
+
402
+ Args:
403
+ query: Search query string
404
+ max_results: Maximum number of results to return (default: 10)
405
+ region: Search region (default: "wt-wt" for worldwide)
406
+ safesearch: Safe search setting (default: "moderate")
407
+ timelimit: Time limit for results (d=day, w=week, m=month)
408
+
409
+ Returns:
410
+ List of news result dictionaries with date, title, body, url, image, and source
411
+
412
+ Raises:
413
+ ValueError: If query is empty
414
+ Exception: If search fails
415
+ """
416
+
417
+ async def _run_news_search_async():
418
+ client = _get_search_client()
419
+ return await client.search_news(
420
+ query=query,
421
+ max_results=max_results,
422
+ region=region,
423
+ safesearch=safesearch,
424
+ timelimit=timelimit,
425
+ )
426
+
427
+ return asyncio.run(_run_news_search_async())
428
+
429
+
430
+ def extract_web_page_links(
431
+ url: str,
432
+ *,
433
+ timeout: float = 30.0,
434
+ headers: Optional[Dict[str, str]] = None,
435
+ css_selector: str = "a[href]",
436
+ include_external: bool = True,
437
+ include_internal: bool = True,
438
+ base_url: Optional[str] = None,
439
+ ) -> ExtractedLinks:
440
+ """
441
+ Extract links from a web page using selectolax.
442
+
443
+ Args:
444
+ url: URL to fetch and extract links from
445
+ timeout: Request timeout in seconds (default: 30.0)
446
+ headers: Optional HTTP headers to send
447
+ css_selector: CSS selector for links (default: "a[href]")
448
+ include_external: Whether to include external links (default: True)
449
+ include_internal: Whether to include internal links (default: True)
450
+ base_url: Base URL for resolving relative links (uses page URL if not provided)
451
+
452
+ Returns:
453
+ List of link dictionaries with href, text, title, and type (internal/external)
454
+
455
+ Raises:
456
+ httpx.HTTPError: If request fails
457
+ Exception: If parsing fails
458
+ """
459
+
460
+ async def _extract_web_page_links_async():
461
+ client = _get_search_client()
462
+ return await client.extract_page_links(
463
+ url=url,
464
+ timeout=timeout,
465
+ headers=headers,
466
+ css_selector=css_selector,
467
+ include_external=include_external,
468
+ include_internal=include_internal,
469
+ base_url=base_url,
470
+ )
471
+
472
+ return asyncio.run(_extract_web_page_links_async())
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: hammad-python
3
- Version: 0.0.15
3
+ Version: 0.0.16
4
4
  Author-email: Hammad Saeed <hammadaidev@gmail.com>
5
5
  License: MIT License
6
6
 
@@ -39,6 +39,13 @@ Provides-Extra: ai
39
39
  Requires-Dist: instructor>=1.9.0; extra == 'ai'
40
40
  Requires-Dist: litellm>=1.73.6; extra == 'ai'
41
41
  Requires-Dist: qdrant-client>=1.14.3; extra == 'ai'
42
+ Provides-Extra: all
43
+ Requires-Dist: fastapi>=0.115.6; extra == 'all'
44
+ Requires-Dist: instructor>=1.9.0; extra == 'all'
45
+ Requires-Dist: litellm>=1.73.6; extra == 'all'
46
+ Requires-Dist: mcp>=1.10.1; extra == 'all'
47
+ Requires-Dist: qdrant-client>=1.14.3; extra == 'all'
48
+ Requires-Dist: uvicorn>=0.34.0; extra == 'all'
42
49
  Provides-Extra: mcp
43
50
  Requires-Dist: mcp>=1.10.1; extra == 'mcp'
44
51
  Provides-Extra: serve
@@ -0,0 +1,110 @@
1
+ hammad/__init__.py,sha256=oFJJe9k2BTTPxkvJwsbr7d_HejtUl9clSsgxsHPU_Mk,3619
2
+ hammad/_internal.py,sha256=00ZXmXIlE3P_cewYrPsJuO38vYqhHY2XnFzFpzXgoyY,7871
3
+ hammad/cache/__init__.py,sha256=29vI8UkVITtiEe7fTr9UR5Q0lV7tr_SVe7tLlJmm1Ks,954
4
+ hammad/cache/base_cache.py,sha256=kYJS2IcQtxhzT7BQBFtOWnhw4VkvAapPhAVkfbW5IeY,6353
5
+ hammad/cache/cache.py,sha256=bzDXxjSolrSdIxqES2VMfVZZGTk_8k4x9n0AW4tlifs,4621
6
+ hammad/cache/decorators.py,sha256=olYLK5x4JkxHpA8WIiplI45QYmNIzyGjNMrTKNRCSQg,9599
7
+ hammad/cache/file_cache.py,sha256=XjLJxM4Ql65OABxz8q1DtA_s8HZQJKywCw6MNVnC6YE,2485
8
+ hammad/cache/ttl_cache.py,sha256=-0pJ4lkVgg1OIb98bQFub9n6f4zgWVs-dQfKZe_DmpE,2153
9
+ hammad/cli/__init__.py,sha256=DkBgA8zkdsOmReoPI5dqni5l5DGkaA7TzrIFvmy5MIo,785
10
+ hammad/cli/_runner.py,sha256=hZVS_hQbxazfdWFog9V1pQeD11XU7pT7H8_Gop8Xd5c,9539
11
+ hammad/cli/animations.py,sha256=h68OuJBkDiYTLdB5pLPgQ2gpPT2c3dNulkDv2BtKHFA,19507
12
+ hammad/cli/plugins.py,sha256=433XcqVmNB50_CqeL2_HOziFwacU9tQeluys7ZegZ4s,30802
13
+ hammad/cli/styles/__init__.py,sha256=Ok7J_uhJgyswNkBWnDw50oTX9Xk1HPksUl3UbmT1qTI,1363
14
+ hammad/cli/styles/settings.py,sha256=irChf9RsMij3djx_n9D9duoVIzxLCpd9-BlKl6U_OLk,5532
15
+ hammad/cli/styles/types.py,sha256=vNIeQY_23m10K8qVT7Iy-PMwosGL-La-UAZKszHJjEE,7911
16
+ hammad/cli/styles/utils.py,sha256=hIpQcDFjyJpRE0gp3RRXVlWfZ83hMGAKD_uQZmAIwrk,28292
17
+ hammad/data/__init__.py,sha256=5htef4M7fsd0wPuGIT0bpBpHeImYEn8pBsS7SxG4Tkk,1827
18
+ hammad/data/collections/__init__.py,sha256=xC1DzECEdL6WU01WDu41eAIcVadUGLWctcD_xspdxb4,1045
19
+ hammad/data/collections/collection.py,sha256=Qg1Kq9nhe6x0U60UXvosVBU08Boxi1qsZZ3SmfqtkT0,10779
20
+ hammad/data/collections/indexes/__init__.py,sha256=MKwemZ59F1No5deRYpft_Dg6x9yUcz0PC0fvEE7eF9o,959
21
+ hammad/data/collections/indexes/qdrant/__init__.py,sha256=yFS70aPt9QRYVjRT5hU8_29OqMNMgmujtMyY1vIStBE,48
22
+ hammad/data/collections/indexes/qdrant/index.py,sha256=KJVON-RDgMJbhTIGvRT6mFIV2cGKLI21g3IZRsMkUGU,26665
23
+ hammad/data/collections/indexes/qdrant/settings.py,sha256=hr5eXTAbesGHDcseA6whIIAUfWMm7zcvIQbRVMlzBdQ,2505
24
+ hammad/data/collections/indexes/qdrant/utils.py,sha256=kqLo1yRhpF20L0t1k54PG3BqG8m7sbXqkov_H9FktDA,6576
25
+ hammad/data/collections/indexes/tantivy/__init__.py,sha256=ugbv5tChrgyM5jN-czXOu5DLsweMgWiqKt5YAKFayDw,45
26
+ hammad/data/collections/indexes/tantivy/index.py,sha256=m02-NPlnSnKrGysZt8L2BtudFZtthNwo6yKcQzgbaO0,13954
27
+ hammad/data/collections/indexes/tantivy/settings.py,sha256=ACR67704pqLsTwCvSpLhi52Oun5s9E5LpUH_OrQwlM4,1397
28
+ hammad/data/collections/indexes/tantivy/utils.py,sha256=fi0EckbRdvLUKSWAAhId8j6JrQ7iI76Y3Ytm3g7udsM,5599
29
+ hammad/data/configurations/__init__.py,sha256=1vJMpKKItA_aCDtOV7ouNpNAwOXhCJ28H_8dilrAzz0,834
30
+ hammad/data/configurations/configuration.py,sha256=ijm2FAyQjZ66Jo2RlT5hjCiAZdC9EnnghmR7Pj5z0Gw,17737
31
+ hammad/data/models/__init__.py,sha256=1s7_qeAA94i0-1wKkfAi4Ee83EZwNaNldJKOvBpPiBE,1172
32
+ hammad/data/models/fields.py,sha256=6H5SbrXhC0KEge5PJNFqN-Ek8RKxt7-eRKC2E7xmoe8,19180
33
+ hammad/data/models/model.py,sha256=gBH6fL9TjSYfAyDHuw-VJdTorML62iisokvTlVzOnhY,39128
34
+ hammad/data/models/utils.py,sha256=KNtr1PlxBizs14gmZqQeG1A7EQ6JHPRrRN0pTr3ucR8,9964
35
+ hammad/data/models/extensions/__init__.py,sha256=dfVDCMBKZYtaMHJRQBShaoMHFcQ6VJcD_5q5Fcc77mQ,128
36
+ hammad/data/models/extensions/pydantic/__init__.py,sha256=2ipoelO4knYSug47Vdt0URHtBNCQIFixJ3tTcawaCtE,1205
37
+ hammad/data/models/extensions/pydantic/converters.py,sha256=_485-4EUQe7-fxlPG2o1wnaU8SDA79AhxMitiUMoIYY,24545
38
+ hammad/data/sql/__init__.py,sha256=ewHFbnGeqYr2Fs51du5dqepUC98qa4eBSQWnbtuYq40,452
39
+ hammad/data/sql/database.py,sha256=S2-MCmgYzgtjwFGzFQjVBUxZMrtdvBj9IGZxh_mKnGo,18780
40
+ hammad/data/sql/types.py,sha256=B89Xu6x0qQCxlRNe8ob-lJAWfHONKCeFUK0TIjyFB5E,3707
41
+ hammad/data/types/__init__.py,sha256=LeyrRKKBbDP2VaTaNEiyJU_1rs52LofD18WUS8rl5gw,758
42
+ hammad/data/types/file.py,sha256=l1mXtyxsmbx0P_U_rnjkgc4N_UQBevAESTAZmBc8eVc,11111
43
+ hammad/data/types/text.py,sha256=rATiwkTsAJ8pWzZ7OBsWX7rDNoKvkeuWsGWd_sbuUaM,33369
44
+ hammad/data/types/multimodal/__init__.py,sha256=LQzomOVQFYnmkQT7hFIxcM261FDXtV3i0uEHB7GXIwU,427
45
+ hammad/data/types/multimodal/audio.py,sha256=rn1G1vwDlt4d30ZumzYBeO0f0OhdtIQBJRCaSkyPHRA,2786
46
+ hammad/data/types/multimodal/image.py,sha256=xp9aWeGkg6FReuFLA63CQ81tv74nFxVtgVjpoDZNjjw,2274
47
+ hammad/formatting/__init__.py,sha256=CkPXIGHLP7xUfRiIPsqBZUCw98uW5HnD1H7uQXZHl8k,346
48
+ hammad/formatting/json/__init__.py,sha256=V4uODCUQdptfyw_D96R3XDopw1bgNIR2ogiEG-Z-FtQ,525
49
+ hammad/formatting/json/converters.py,sha256=usnqYc5N9GHOkTIJKNKiJ3GO9oQo5zYOGmupvJkqUjk,5597
50
+ hammad/formatting/text/__init__.py,sha256=ZAA7D4pwKFjeUxHsnm21QKSTtQ7Fj8ncO__m5Ry_eHY,1506
51
+ hammad/formatting/text/converters.py,sha256=g3z-ZGTaKNVbLFFKBSh6qN2Uz0BSkdxCaN3LR9cAyV8,23806
52
+ hammad/formatting/text/markdown.py,sha256=D17NOoGkoXUBhoOGKelKHwi72iqsAwPU5HEFjRJtLQI,3407
53
+ hammad/formatting/yaml/__init__.py,sha256=4dBeXPi0jx7ELT2_sC2fUYaiY8b8wFiUScLODc9ISEw,462
54
+ hammad/formatting/yaml/converters.py,sha256=zvSB8QGb56uvwO0KjXllfTj9g1FmNINOKR06DTjvXw8,153
55
+ hammad/genai/__init__.py,sha256=tDBxnxcDfa1M2LVGfyj8YnY47yg197aTvW4qWVwTFjM,1952
56
+ hammad/genai/multimodal_models.py,sha256=nBoc-KiWkeOXotAiYiZRnU9DrbDR7Gex0mgYvt6QTbo,1291
57
+ hammad/genai/rerank_models.py,sha256=JFiIQ8AuQVoYcFQHR9iuq_tiocwvlIq1bFTWbGF-_T0,434
58
+ hammad/genai/agents/__init__.py,sha256=AyFkBd70jrLGWa6va1BoiNPutdkwySgeCv_lo97aZB4,25
59
+ hammad/genai/agents/types/__init__.py,sha256=vrIY5_Z2gYINnd5BO5ZbxKS0mW7aqcTWW_1icYFn1Ew,618
60
+ hammad/genai/agents/types/history.py,sha256=YN7vudPkhI1mnQgtf12nw-p2xaqxc4rtc9lruo_RWCw,10043
61
+ hammad/genai/agents/types/tool.py,sha256=EqPaJ2c8z6S5poA-eq8ex6acJ0Vc2_kQ2ePY5triwlU,16780
62
+ hammad/genai/embedding_models/__init__.py,sha256=GAjlkZjX2tMRKqP6AKY0rokRSiRZRpa4T-NbtpldEfc,1085
63
+ hammad/genai/embedding_models/embedding_model.py,sha256=9JiJLarsl2PwP_IGPXPU1Vkh6CpQZJVN7y1VAXPYS-U,6968
64
+ hammad/genai/embedding_models/embedding_model_name.py,sha256=bsHc-3Xx6X5EU6LuiPPlkyZa4W_oTwW4AJhm4hBAs8Y,2504
65
+ hammad/genai/embedding_models/embedding_model_request.py,sha256=nZyUmUaNHR4OTJXFLDE9BACFJ-D8QMECxcDxtlVWPWg,1562
66
+ hammad/genai/embedding_models/embedding_model_response.py,sha256=xrHDej5Ic-R-JAyc6LeDqomCL88w-nv3B42cBZIdTnE,1809
67
+ hammad/genai/embedding_models/run.py,sha256=mq_G5kGkZYf7ZdpCeh7mtyb5GBjrK67065C6R9TgrvY,5083
68
+ hammad/genai/language_models/__init__.py,sha256=BbIFRpC-z02kvUHmPHP7Yo3wrXUkwPGcskB84N3Qz74,1103
69
+ hammad/genai/language_models/_streaming.py,sha256=Rmjnhl_QRu1FpaBBSbX8ijZbyqpNKOJxjyGZ1sY_UYw,23884
70
+ hammad/genai/language_models/_types.py,sha256=9VorMf71rOV5ftBEItsMJmgBocZZPKWrP8yhncA-wd0,8906
71
+ hammad/genai/language_models/language_model.py,sha256=ZOBJjZd0kpHda9hCUcTlxR7-9WB-ZX5wGGJcMZasthY,28782
72
+ hammad/genai/language_models/language_model_request.py,sha256=blGgLaZvEfFUVmT2NHPH9OuCQrfhHQhenRk6QLeTWeI,4378
73
+ hammad/genai/language_models/language_model_response.py,sha256=epq9_kM-KPDoRXWk9SiD07w_i7rOXdCtdOHRGUJgA6g,7709
74
+ hammad/genai/language_models/language_model_response_chunk.py,sha256=2-hJfW0wSdxXTRKxmYZH97PjC9oiOtghzPt4FhPWXRE,1735
75
+ hammad/genai/language_models/run.py,sha256=dA7Ws44H0rpB_WAyWIPKoR5XfHva9FjMC1tNYKOh8mk,21239
76
+ hammad/genai/language_models/_utils/__init__.py,sha256=MjS_wQ5AaGvP806cQ3EboOABHJH3EHkm7Llpdf6uYQM,789
77
+ hammad/genai/language_models/_utils/_completions.py,sha256=nDPMKrIjiMO2FKrxbLgOc4oitiVcAk-c3iVDXKLb3PY,3777
78
+ hammad/genai/language_models/_utils/_messages.py,sha256=WupMWUbEC_QDuDp3ML-AfbCqK8HBRGptn3PqX7ywA0Y,2684
79
+ hammad/genai/language_models/_utils/_requests.py,sha256=_-6wK-3nkHYiVMEN2yxDur5ALOXeiK5wX96MvCTQS5w,7200
80
+ hammad/genai/language_models/_utils/_structured_outputs.py,sha256=Uo60SMM6r6SDtdJnh2tmvdgs9znmmpRvzfMgnAkm8zs,3880
81
+ hammad/logging/__init__.py,sha256=VtskZx0bKEAJ9FHTMflhB1CzeFUxLpDT5HPgcecAXUo,701
82
+ hammad/logging/decorators.py,sha256=VbI1x3P4ft0-0BGjXq7nQgiuNqcXAA51CGmoSn47iSw,30122
83
+ hammad/logging/logger.py,sha256=GQ2SvrRe0igWlVExZKS99QtCENtwP9uX-5FbsvUAazY,31475
84
+ hammad/mcp/__init__.py,sha256=5oTU-BLYjfz6fBHDH9cyWg3DpQ6Qar-jodbCR05SuWo,1123
85
+ hammad/mcp/client/__init__.py,sha256=i6aAYLoMkm78hOog4OssnT7jgkUXHDBQsdtvDLirSmA,795
86
+ hammad/mcp/client/client.py,sha256=ZAyeBEZKXg_ft7wirri1R4w4RXlMuet_z0yDuLxH3-M,20637
87
+ hammad/mcp/client/client_service.py,sha256=quJp02n9tp70l0SJd9jkIuRkdSPeWegzusk-eiV41b0,14990
88
+ hammad/mcp/client/settings.py,sha256=7bLpJYyiUT_H7zp3SDwLyAt9fmiQwL3L89qVTAZYpi8,5913
89
+ hammad/mcp/servers/__init__.py,sha256=5S5JrdkzMRmW1iIlZeQOblx7SFj8sTpG6w0tKLZrNMM,583
90
+ hammad/mcp/servers/launcher.py,sha256=jQDQOqz-cKK2PSEOxoPBCVsBeTABNNjcwTXSWE4-LQA,41606
91
+ hammad/runtime/__init__.py,sha256=qXmY4zP75nv7tRGDe-AizHB76KfDNdXHafnGQCiho8Y,667
92
+ hammad/runtime/decorators.py,sha256=5T56nAwwfH0ZKfnLlDGkDNFYaGBBSrH1i4_yX3Dt5GA,4524
93
+ hammad/runtime/run.py,sha256=VFzoXieSaEg1KlDTTepDIsSyISkWXuxHpNs_AgHX5nM,10802
94
+ hammad/service/__init__.py,sha256=B7wnQkT8e2kFwaigpAcXI_PJ8jlQzxcgTtDDH1p4KSU,1222
95
+ hammad/service/create.py,sha256=Z0Vy-nQUKk_zqLuVOKJye6gLdVSU5HNlPgm4irvRgu8,16224
96
+ hammad/service/decorators.py,sha256=bw-fgnvIjivLjbXUrBxcx-fsEZZI4Evl5zxNnC1HA-o,9940
97
+ hammad/typing/__init__.py,sha256=P9XCKrn-kxyfSLHpY9vraOLV9vyoBz_DzEm6eIH5xWY,11712
98
+ hammad/web/__init__.py,sha256=qg1DcwWRtDhRdQKwEiS2I-GT8ftdHhQ_WYpWzldSJ4Y,1053
99
+ hammad/web/models.py,sha256=LivyMeLnjyRYqCNYzJRu_--IYjOzBiySYXYB9obqlnU,6421
100
+ hammad/web/utils.py,sha256=o-ys9anLDtOTkqvk0Z8gxc-V0lhp0LB03DHFpoj6Ous,15863
101
+ hammad/web/http/__init__.py,sha256=jn9Rn7Yg2cypD7duTTNFuW2wQZx9B63Bde4RJJeDYU0,22
102
+ hammad/web/http/client.py,sha256=LWBSVjvHEuHmOOWq5EUT4zN5w6zSG45bOTk6FiSPHuA,33082
103
+ hammad/web/openapi/__init__.py,sha256=JhJQ6_laBmB2djIYFc0vgGha2GsdUe4FP1LDdZCQ5J4,25
104
+ hammad/web/openapi/client.py,sha256=1pXz7KAO_0pN4kQZoWKWskXDYGiJ535TsPO1GGCiC0E,26816
105
+ hammad/web/search/__init__.py,sha256=e9A6znPIiZCz-4secyHbUs0uUGf5yAqW6wGacgx961U,24
106
+ hammad/web/search/client.py,sha256=T1--L-EWe8AA9nZPxEehhHTNmWkGCcbQrhZxY84zTYs,36964
107
+ hammad_python-0.0.16.dist-info/METADATA,sha256=viS2fJ0oeUr6yjSPwlfVzK0_6K_jPtlG5h7uJcPDW9c,6214
108
+ hammad_python-0.0.16.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
109
+ hammad_python-0.0.16.dist-info/licenses/LICENSE,sha256=h74yFUWjbBaodcWG5wNmm30npjl8obVcxD-1nQfUp2I,1069
110
+ hammad_python-0.0.16.dist-info/RECORD,,
@@ -1,4 +0,0 @@
1
- hammad_python-0.0.15.dist-info/METADATA,sha256=76e_P5ZnWxhhfnyhA0B91cnlFtAxepwavtFancGsUuw,5907
2
- hammad_python-0.0.15.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
3
- hammad_python-0.0.15.dist-info/licenses/LICENSE,sha256=h74yFUWjbBaodcWG5wNmm30npjl8obVcxD-1nQfUp2I,1069
4
- hammad_python-0.0.15.dist-info/RECORD,,