hammad-python 0.0.14__py3-none-any.whl → 0.0.15__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 (101) hide show
  1. hammad_python-0.0.15.dist-info/METADATA +184 -0
  2. hammad_python-0.0.15.dist-info/RECORD +4 -0
  3. hammad/__init__.py +0 -1
  4. hammad/ai/__init__.py +0 -1
  5. hammad/ai/_utils.py +0 -142
  6. hammad/ai/completions/__init__.py +0 -45
  7. hammad/ai/completions/client.py +0 -684
  8. hammad/ai/completions/create.py +0 -710
  9. hammad/ai/completions/settings.py +0 -100
  10. hammad/ai/completions/types.py +0 -792
  11. hammad/ai/completions/utils.py +0 -486
  12. hammad/ai/embeddings/__init__.py +0 -35
  13. hammad/ai/embeddings/client/__init__.py +0 -1
  14. hammad/ai/embeddings/client/base_embeddings_client.py +0 -26
  15. hammad/ai/embeddings/client/fastembed_text_embeddings_client.py +0 -200
  16. hammad/ai/embeddings/client/litellm_embeddings_client.py +0 -288
  17. hammad/ai/embeddings/create.py +0 -159
  18. hammad/ai/embeddings/types.py +0 -69
  19. hammad/cache/__init__.py +0 -40
  20. hammad/cache/base_cache.py +0 -181
  21. hammad/cache/cache.py +0 -169
  22. hammad/cache/decorators.py +0 -261
  23. hammad/cache/file_cache.py +0 -80
  24. hammad/cache/ttl_cache.py +0 -74
  25. hammad/cli/__init__.py +0 -33
  26. hammad/cli/animations.py +0 -573
  27. hammad/cli/plugins.py +0 -781
  28. hammad/cli/styles/__init__.py +0 -55
  29. hammad/cli/styles/settings.py +0 -139
  30. hammad/cli/styles/types.py +0 -358
  31. hammad/cli/styles/utils.py +0 -480
  32. hammad/data/__init__.py +0 -56
  33. hammad/data/collections/__init__.py +0 -34
  34. hammad/data/collections/base_collection.py +0 -58
  35. hammad/data/collections/collection.py +0 -452
  36. hammad/data/collections/searchable_collection.py +0 -556
  37. hammad/data/collections/vector_collection.py +0 -596
  38. hammad/data/configurations/__init__.py +0 -35
  39. hammad/data/configurations/configuration.py +0 -564
  40. hammad/data/databases/__init__.py +0 -21
  41. hammad/data/databases/database.py +0 -902
  42. hammad/data/models/__init__.py +0 -44
  43. hammad/data/models/base/__init__.py +0 -35
  44. hammad/data/models/base/fields.py +0 -546
  45. hammad/data/models/base/model.py +0 -1078
  46. hammad/data/models/base/utils.py +0 -280
  47. hammad/data/models/pydantic/__init__.py +0 -55
  48. hammad/data/models/pydantic/converters.py +0 -632
  49. hammad/data/models/pydantic/models/__init__.py +0 -28
  50. hammad/data/models/pydantic/models/arbitrary_model.py +0 -46
  51. hammad/data/models/pydantic/models/cacheable_model.py +0 -79
  52. hammad/data/models/pydantic/models/fast_model.py +0 -318
  53. hammad/data/models/pydantic/models/function_model.py +0 -176
  54. hammad/data/models/pydantic/models/subscriptable_model.py +0 -63
  55. hammad/data/types/__init__.py +0 -41
  56. hammad/data/types/file.py +0 -358
  57. hammad/data/types/multimodal/__init__.py +0 -24
  58. hammad/data/types/multimodal/audio.py +0 -96
  59. hammad/data/types/multimodal/image.py +0 -80
  60. hammad/data/types/text.py +0 -1066
  61. hammad/formatting/__init__.py +0 -38
  62. hammad/formatting/json/__init__.py +0 -21
  63. hammad/formatting/json/converters.py +0 -152
  64. hammad/formatting/text/__init__.py +0 -63
  65. hammad/formatting/text/converters.py +0 -723
  66. hammad/formatting/text/markdown.py +0 -131
  67. hammad/formatting/yaml/__init__.py +0 -26
  68. hammad/formatting/yaml/converters.py +0 -5
  69. hammad/logging/__init__.py +0 -35
  70. hammad/logging/decorators.py +0 -834
  71. hammad/logging/logger.py +0 -954
  72. hammad/mcp/__init__.py +0 -50
  73. hammad/mcp/client/__init__.py +0 -1
  74. hammad/mcp/client/client.py +0 -523
  75. hammad/mcp/client/client_service.py +0 -393
  76. hammad/mcp/client/settings.py +0 -178
  77. hammad/mcp/servers/__init__.py +0 -1
  78. hammad/mcp/servers/launcher.py +0 -1161
  79. hammad/performance/__init__.py +0 -36
  80. hammad/performance/imports.py +0 -231
  81. hammad/performance/runtime/__init__.py +0 -32
  82. hammad/performance/runtime/decorators.py +0 -142
  83. hammad/performance/runtime/run.py +0 -299
  84. hammad/py.typed +0 -0
  85. hammad/service/__init__.py +0 -49
  86. hammad/service/create.py +0 -532
  87. hammad/service/decorators.py +0 -285
  88. hammad/typing/__init__.py +0 -407
  89. hammad/web/__init__.py +0 -43
  90. hammad/web/http/__init__.py +0 -1
  91. hammad/web/http/client.py +0 -944
  92. hammad/web/models.py +0 -245
  93. hammad/web/openapi/__init__.py +0 -1
  94. hammad/web/openapi/client.py +0 -740
  95. hammad/web/search/__init__.py +0 -1
  96. hammad/web/search/client.py +0 -988
  97. hammad/web/utils.py +0 -472
  98. hammad_python-0.0.14.dist-info/METADATA +0 -70
  99. hammad_python-0.0.14.dist-info/RECORD +0 -99
  100. {hammad_python-0.0.14.dist-info → hammad_python-0.0.15.dist-info}/WHEEL +0 -0
  101. {hammad_python-0.0.14.dist-info → hammad_python-0.0.15.dist-info}/licenses/LICENSE +0 -0
hammad/web/utils.py DELETED
@@ -1,472 +0,0 @@
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
- "search_web",
21
- "read_web_page",
22
- "read_web_pages",
23
- "search_news",
24
- "extract_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 search_web(
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 _search_web_async():
286
- client = _get_search_client()
287
- return await client.search_web(
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(_search_web_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 search_news(
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 _search_news_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(_search_news_async())
428
-
429
-
430
- def extract_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_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_page_links_async())
@@ -1,70 +0,0 @@
1
- Metadata-Version: 2.4
2
- Name: hammad-python
3
- Version: 0.0.14
4
- Summary: hammad - *Nightly* hyper-fast opinionated resources and modules built for quick development.
5
- Author-email: Hammad Saeed <hammadaidev@gmail.com>
6
- License-File: LICENSE
7
- Requires-Python: >=3.11
8
- Requires-Dist: docstring-parser>=0.16
9
- Requires-Dist: duckduckgo-search>=8.0.4
10
- Requires-Dist: httpx>=0.28.1
11
- Requires-Dist: msgspec>=0.19.0
12
- Requires-Dist: prompt-toolkit>=3.0.51
13
- Requires-Dist: pydantic>=2.11.5
14
- Requires-Dist: python-dotenv>=1.1.0
15
- Requires-Dist: pyyaml>=6.0.2
16
- Requires-Dist: rich>=13.9.4
17
- Requires-Dist: selectolax>=0.3.30
18
- Requires-Dist: sqlalchemy>=2.0.41
19
- Requires-Dist: tantivy>=0.24.0
20
- Requires-Dist: tenacity>=9.0.0
21
- Requires-Dist: typing-inspect>=0.9.0
22
- Requires-Dist: uvloop>=0.21.0
23
- Provides-Extra: ai
24
- Requires-Dist: instructor>=1.9.0; extra == 'ai'
25
- Requires-Dist: litellm>=1.72.4; extra == 'ai'
26
- Requires-Dist: openai-agents>=0.0.19; extra == 'ai'
27
- Requires-Dist: qdrant-client>=1.14.3; extra == 'ai'
28
- Provides-Extra: fastembed
29
- Requires-Dist: fastembed; extra == 'fastembed'
30
- Provides-Extra: serve
31
- Requires-Dist: fastapi>=0.115.8; extra == 'serve'
32
- Requires-Dist: python-multipart>=0.0.19; extra == 'serve'
33
- Requires-Dist: sse-starlette>=1.1.0; extra == 'serve'
34
- Requires-Dist: uvicorn>=0.34.0; extra == 'serve'
35
- Description-Content-Type: text/markdown
36
-
37
- ## hammad-python
38
-
39
- > __Happily Accelerated Micro-Modules (_for_) Application Development__
40
-
41
- ## Introduction
42
-
43
- The `hammad-python` library, is a mix of a love letter and collection of mixed resources for
44
- developing Python applications. This library is meant to be used for rapid prototyping and
45
- development, and is focused on providing styled placeholder tools for common patterns, tasks
46
- and workflows.
47
-
48
- The package is currently built into the following structures:
49
-
50
- - `hammad-python` : Contains most core functionality and resources.
51
- - `hammad-python[ai]` : Contains easy to use resources for Generative AI related tasks such as
52
- generating completions with language models, or creating embeddings.
53
-
54
- ## Installation
55
-
56
- You can install the package using `pip` or `uv`:
57
-
58
- ```bash
59
- pip install hammad-python
60
-
61
- # or install the `ai` extension
62
- # pip install 'hammad-python[ai]'
63
- ```
64
-
65
- ```bash
66
- uv pip install hammad-python
67
-
68
- # or install the `ai` extension
69
- # uv pip install 'hammad-python[ai]'
70
- ```
@@ -1,99 +0,0 @@
1
- hammad/__init__.py,sha256=jlLAU-UQOE0szthvDBf3u77U6I-4quzZZ8_PWuGVPJ4,20
2
- hammad/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
- hammad/ai/__init__.py,sha256=6COUrJFQoIqJIRy6tUhi5Lpml_e4qMxXWYTIIacqtoM,16
4
- hammad/ai/_utils.py,sha256=axsCHv66zfjjhlEbxaF_049fClHjQgHtUReXs8nsMwc,3950
5
- hammad/ai/completions/__init__.py,sha256=3MHiUWn7AVlbXh4vmH1ILG4MYPEYp0-CYSlZR18QO4w,1115
6
- hammad/ai/completions/client.py,sha256=4M40D_a4sbJmakBZD-lusRyEGp5YGaAKcmwBKJEroF4,26679
7
- hammad/ai/completions/create.py,sha256=o1XLpRUPoQs6q4w2DHpdUVAzQA1TqeaIr4ct1rcTMpk,31909
8
- hammad/ai/completions/settings.py,sha256=pM9ft62rMzlG2JBqQU6j-9skT6edbkbK_stajeLfFM0,3093
9
- hammad/ai/completions/types.py,sha256=o6ki8aA9SZ-bVgmUZykKIoGgeI-GqO-rddMpIyZGcsk,28140
10
- hammad/ai/completions/utils.py,sha256=lLEec1XdYBG2rBEALSfsRq88yK6gsU2uBOWH97UbxnI,17305
11
- hammad/ai/embeddings/__init__.py,sha256=HmJBRWdzASa0nEa37GIkJiSbAaLXV-k48omra374kmA,1090
12
- hammad/ai/embeddings/create.py,sha256=voVD6WLvoyIgqIMYOmJKJFxUho8ZIl0YDfbgM4X6B6w,6590
13
- hammad/ai/embeddings/types.py,sha256=FCr2r4IYN-xYBmRXadocDQhDC2foC49X940UTVi9bgo,1772
14
- hammad/ai/embeddings/client/__init__.py,sha256=F2SO89Q6xOYQWNfvAONBJdDLoXIsCxON6I1BxpjEkGQ,34
15
- hammad/ai/embeddings/client/base_embeddings_client.py,sha256=EMT8jDMa0TKIV9XA9Tx9ze7eJ882OuCLL9KucI2EezQ,600
16
- hammad/ai/embeddings/client/fastembed_text_embeddings_client.py,sha256=EWiaS9U-K7gnc2g8qHN-3lHCCgsEaCc-1Hny-DV3rf4,6956
17
- hammad/ai/embeddings/client/litellm_embeddings_client.py,sha256=EMl7V6XiGUGaDs9N_HZaJ2GUJwW8LpWquiNF_yXzP3o,10042
18
- hammad/cache/__init__.py,sha256=Ab97dA3tUUy4fts5kMOlSoVoYPydDShTJSMve6emGgY,964
19
- hammad/cache/base_cache.py,sha256=kYJS2IcQtxhzT7BQBFtOWnhw4VkvAapPhAVkfbW5IeY,6353
20
- hammad/cache/cache.py,sha256=bzDXxjSolrSdIxqES2VMfVZZGTk_8k4x9n0AW4tlifs,4621
21
- hammad/cache/decorators.py,sha256=olYLK5x4JkxHpA8WIiplI45QYmNIzyGjNMrTKNRCSQg,9599
22
- hammad/cache/file_cache.py,sha256=XjLJxM4Ql65OABxz8q1DtA_s8HZQJKywCw6MNVnC6YE,2485
23
- hammad/cache/ttl_cache.py,sha256=-0pJ4lkVgg1OIb98bQFub9n6f4zgWVs-dQfKZe_DmpE,2153
24
- hammad/cli/__init__.py,sha256=Tz0OyzLJHeW6wnKwX-xnA0oN4FE1Z2zm3WntFzE2RNI,743
25
- hammad/cli/animations.py,sha256=q8rMyboRUwmgBwHutPj4oveDjw9BPTu1UjL53XlOb-U,19514
26
- hammad/cli/plugins.py,sha256=61cljGF_V03_6xrBhO0tR-rrlgB44veHh5HXcxMTM3Y,26932
27
- hammad/cli/styles/__init__.py,sha256=PDQEHlMhujetCVurTGRW3LOKZLr7338DQvKCFt4Fyjs,1373
28
- hammad/cli/styles/settings.py,sha256=irChf9RsMij3djx_n9D9duoVIzxLCpd9-BlKl6U_OLk,5532
29
- hammad/cli/styles/types.py,sha256=vNIeQY_23m10K8qVT7Iy-PMwosGL-La-UAZKszHJjEE,7911
30
- hammad/cli/styles/utils.py,sha256=BGFwQIEJHWlTAXed8ZxHeI_phLfEdh-_Mok2fe-jn7g,19356
31
- hammad/data/__init__.py,sha256=0PKUAZMYUk3eb5JAg7e1pUJwb0NtWMhicIo-O7TU-o4,1380
32
- hammad/data/collections/__init__.py,sha256=trapmRN7MUEgLZsJfCanU2rbn8-hSw3uIGjD-uwz-fg,823
33
- hammad/data/collections/base_collection.py,sha256=ZRht7OZjLIT8GxNvMgNxTarbCTY6EUUurEkGHZ3Rsy4,1419
34
- hammad/data/collections/collection.py,sha256=MWjyY3YqZa3U9WH3Br8v-Q_FLP5XWf3p0lIMGzfIeJ4,15758
35
- hammad/data/collections/searchable_collection.py,sha256=vCV_JgMwB57QRi4Cri6dfEUzLCyTBN58_JfWEKL2h_0,21361
36
- hammad/data/collections/vector_collection.py,sha256=x3-pFoi6v9uRCpCmLdcVwJpo-6FVIVw_JTLWV4pYAiY,20901
37
- hammad/data/configurations/__init__.py,sha256=-qd2LClmGgoCvucePfpZVJDP0sXR95b4J3x9lK3MX_o,838
38
- hammad/data/configurations/configuration.py,sha256=M3JBpPjynOMdhjJrV9HiIzuTPKqo6i9dh7NiaCbp_L0,17739
39
- hammad/data/databases/__init__.py,sha256=xlQFbwW9O0UzjZS5uh2BipgRzMFcwz1q7Bg0aDdqFuU,410
40
- hammad/data/databases/database.py,sha256=7ngi-oWAsmAdtLTvpT4axw5ftcMzqsCtJmfmjzw5etk,31160
41
- hammad/data/models/__init__.py,sha256=kGErTmEmWS5fqTRd-ESsetf_aRZTEUgt5k3uYWAx_fw,895
42
- hammad/data/models/base/__init__.py,sha256=uCltlgyHVMk1GdAbqArPBC2xjRVE5U7BGaAfoBrPPcY,812
43
- hammad/data/models/base/fields.py,sha256=n02Qqq1AkcxwGCGEjcBSu63uWSkcyfxisATr7nwc7DA,19173
44
- hammad/data/models/base/model.py,sha256=_qyJ3IRJTwRXqZsYMpuYP8FTbMfLgh75VbTrTt1Wqx8,39121
45
- hammad/data/models/base/utils.py,sha256=kmdWqDcCTB7y4w5pdAfyrOfpzqj1hjKILIklAwbvNxM,9957
46
- hammad/data/models/pydantic/__init__.py,sha256=uv2KhaxACJf5rUURlUjB3gXWcb0EDEDXF98QoK_KQTI,1501
47
- hammad/data/models/pydantic/converters.py,sha256=ePV4GXco_eEZ5cTYH0vk2bv3ywZztvAzwEgenUeQicA,20544
48
- hammad/data/models/pydantic/models/__init__.py,sha256=tEjSun4IPyUfVvYst8e8l9JgvRanAvJt0iLNYiigHdc,670
49
- hammad/data/models/pydantic/models/arbitrary_model.py,sha256=xgCt4e7CyD0CF8Ozk9TNNLa_Kxue4K1QAs8vj6S-WQY,1536
50
- hammad/data/models/pydantic/models/cacheable_model.py,sha256=xnv-5Bf7uf6ELQ-amuZghRDfuuX1eFmaDh7Lz5IRpdU,2821
51
- hammad/data/models/pydantic/models/fast_model.py,sha256=RiVyutUS296tQp7gK7IrHXeLWVtSx9wKU_vf9keuYuU,11728
52
- hammad/data/models/pydantic/models/function_model.py,sha256=6YTGzHAtwlybn3M46dry6JgfGjuo1TntXtHVZ5pqrHQ,6312
53
- hammad/data/models/pydantic/models/subscriptable_model.py,sha256=K5ZqxrDxikKv2iMv7_Xt3liG9AZ73cSNhzuOZpjed7w,1718
54
- hammad/data/types/__init__.py,sha256=asGaCmHSYo7r5mXR8tWA0b3ermLCMGAuZDXXDkR6W3w,770
55
- hammad/data/types/file.py,sha256=gBpQxQCJJJVOFeUS_7NRkhA1pB54b6Wy3NzOH-fmnWY,11116
56
- hammad/data/types/text.py,sha256=rATiwkTsAJ8pWzZ7OBsWX7rDNoKvkeuWsGWd_sbuUaM,33369
57
- hammad/data/types/multimodal/__init__.py,sha256=FrQJ7GoUfI-zen5m2oayzXfDlShKqqSQG4zLXlL-3Nw,431
58
- hammad/data/types/multimodal/audio.py,sha256=HAKWi96F2kJ2dLMDXTeVLYlXPhaFZAH55TCROuirMzo,2786
59
- hammad/data/types/multimodal/image.py,sha256=oI9DMHw6XxV2ma3XIWqK-jwczi5HUNszGzIl_BtEuxA,2274
60
- hammad/formatting/__init__.py,sha256=J4VSLnZk2ImZCBtVg2el0KZFcwQNmU1UyF4wdiz-i5E,776
61
- hammad/formatting/json/__init__.py,sha256=Sv-p-85VFcmVE3vHbgu23jGZB0tzJRFX0HKJDYLc6KA,472
62
- hammad/formatting/json/converters.py,sha256=4AYKxsqDftKtjfxFTIY9mQ0_CbrUmAK_6EBpD2X40pU,5502
63
- hammad/formatting/text/__init__.py,sha256=lpDcwMpKN0ZyMYxGBNd52fAWQ0UhOTkjkNP1WqJ1xjM,1516
64
- hammad/formatting/text/converters.py,sha256=g3z-ZGTaKNVbLFFKBSh6qN2Uz0BSkdxCaN3LR9cAyV8,23806
65
- hammad/formatting/text/markdown.py,sha256=D17NOoGkoXUBhoOGKelKHwi72iqsAwPU5HEFjRJtLQI,3407
66
- hammad/formatting/yaml/__init__.py,sha256=EEkOsh6DYH0F2mIU-mzFXgNqcc_GmqHaIPlKGCnj2tg,472
67
- hammad/formatting/yaml/converters.py,sha256=zvSB8QGb56uvwO0KjXllfTj9g1FmNINOKR06DTjvXw8,153
68
- hammad/logging/__init__.py,sha256=2fMnpKO20HWcyYbgQnGzV02g1t0kbH_c8wLmHIV5Hrk,711
69
- hammad/logging/decorators.py,sha256=xhHRA7WhesgdVMSwK_JvqZhGb90GF3TbYco13Y7aY0w,30119
70
- hammad/logging/logger.py,sha256=8q-7anLeZk07QlPszdt_qzsQPaeuZyDHevV8C6R_okk,31451
71
- hammad/mcp/__init__.py,sha256=aaXwQOI4kJ8Dkbsg9rb8kZ5NJ6NqeT7aDmfQKPJcOAM,1133
72
- hammad/mcp/client/__init__.py,sha256=FdvJqHaup6KgonBRvE570B2X-_GwY-ZlEtsXBLXubcw,24
73
- hammad/mcp/client/client.py,sha256=kRPKAcTenUSp1aL7oCnrOw0AoSqU9dVdf1H_r1rkDaY,17959
74
- hammad/mcp/client/client_service.py,sha256=lZUkNJo9BBrwR8qUtDByzofMx6aJJuer9w2uHZFBCW0,14874
75
- hammad/mcp/client/settings.py,sha256=7bLpJYyiUT_H7zp3SDwLyAt9fmiQwL3L89qVTAZYpi8,5913
76
- hammad/mcp/servers/__init__.py,sha256=lxlhxoBPPhlFAJl87AL-11Qbl1Jhit27lmPDC03Ww8I,25
77
- hammad/mcp/servers/launcher.py,sha256=jQDQOqz-cKK2PSEOxoPBCVsBeTABNNjcwTXSWE4-LQA,41606
78
- hammad/performance/__init__.py,sha256=hAbp_40Uw5LqGy-K2MCoiee1DUazb8GT49_GJ7LQGKs,789
79
- hammad/performance/imports.py,sha256=WwbrufLOkrvqJh3CLp8H_7nmGEE8vcWNbJN74Dk_gGg,7814
80
- hammad/performance/runtime/__init__.py,sha256=xk7rdpDb_s2EIxu2bvpOlhAZh5ZV1ckRIviSapL9wFM,672
81
- hammad/performance/runtime/decorators.py,sha256=TC6JL5MVu9ak2XUNpuzpwPY6nirKDLgbd-iuUNI0YIA,4536
82
- hammad/performance/runtime/run.py,sha256=K6GS6SGs8ktztiBAAgU8oaPpycravjPAgJD_tXAjQpA,10814
83
- hammad/service/__init__.py,sha256=U8wxhj5l9JdeJZXIPT7Eo7gZacxJ2PQ-xN58gy5Lb5g,1232
84
- hammad/service/create.py,sha256=x9N3uAzWeoInnq7HJpUTf3m87sYCFP5jLQK3S91ArLo,16423
85
- hammad/service/decorators.py,sha256=QBZ7iZK1c-tTNoKt6vqnNFN2BT-FdLaGz_f6vOmeY1w,10028
86
- hammad/typing/__init__.py,sha256=jQEwoJVMdgk1VQTLyMiJaU7l5P8JIvcvwcjMazE7iSo,10923
87
- hammad/web/__init__.py,sha256=CbHQXPfybL1qv2yi0_HmeOqNkjzz9xSdXKmot2gSub8,1063
88
- hammad/web/models.py,sha256=q9d4_3UPvHcvG_HuULxKHQuNrllA2S-3CSP3HdU21Cs,5637
89
- hammad/web/utils.py,sha256=7jf_esoIwctKg1qxSaN6yAgzeo70HT1IdSVqoNdHFSQ,15815
90
- hammad/web/http/__init__.py,sha256=jn9Rn7Yg2cypD7duTTNFuW2wQZx9B63Bde4RJJeDYU0,22
91
- hammad/web/http/client.py,sha256=J_W0d1vop92uANQ7YD1o72XAp95Ma67Uz1YolNDF19M,33086
92
- hammad/web/openapi/__init__.py,sha256=JhJQ6_laBmB2djIYFc0vgGha2GsdUe4FP1LDdZCQ5J4,25
93
- hammad/web/openapi/client.py,sha256=1pXz7KAO_0pN4kQZoWKWskXDYGiJ535TsPO1GGCiC0E,26816
94
- hammad/web/search/__init__.py,sha256=e9A6znPIiZCz-4secyHbUs0uUGf5yAqW6wGacgx961U,24
95
- hammad/web/search/client.py,sha256=4VEhctFf_4LRxM2TXsEssSW6tbaZnu0NYaIVMYQrJNs,35434
96
- hammad_python-0.0.14.dist-info/METADATA,sha256=ECSnj__tLbSE19XURH8fuHtt_iplioxoNN0QbSmBWtw,2302
97
- hammad_python-0.0.14.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
98
- hammad_python-0.0.14.dist-info/licenses/LICENSE,sha256=h74yFUWjbBaodcWG5wNmm30npjl8obVcxD-1nQfUp2I,1069
99
- hammad_python-0.0.14.dist-info/RECORD,,