hammad-python 0.0.18__py3-none-any.whl → 0.0.20__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 (83) hide show
  1. hammad/__init__.py +7 -137
  2. hammad/_internal.py +1 -0
  3. hammad/cli/_runner.py +8 -8
  4. hammad/cli/plugins.py +55 -26
  5. hammad/cli/styles/utils.py +16 -8
  6. hammad/data/__init__.py +1 -5
  7. hammad/data/collections/__init__.py +2 -3
  8. hammad/data/collections/collection.py +41 -22
  9. hammad/data/collections/indexes/__init__.py +1 -1
  10. hammad/data/collections/indexes/qdrant/__init__.py +1 -1
  11. hammad/data/collections/indexes/qdrant/index.py +106 -118
  12. hammad/data/collections/indexes/qdrant/settings.py +14 -14
  13. hammad/data/collections/indexes/qdrant/utils.py +28 -38
  14. hammad/data/collections/indexes/tantivy/__init__.py +1 -1
  15. hammad/data/collections/indexes/tantivy/index.py +57 -59
  16. hammad/data/collections/indexes/tantivy/settings.py +8 -19
  17. hammad/data/collections/indexes/tantivy/utils.py +28 -52
  18. hammad/data/models/__init__.py +2 -7
  19. hammad/data/sql/__init__.py +1 -1
  20. hammad/data/sql/database.py +71 -73
  21. hammad/data/sql/types.py +37 -51
  22. hammad/formatting/__init__.py +2 -1
  23. hammad/formatting/json/converters.py +2 -2
  24. hammad/genai/__init__.py +96 -36
  25. hammad/genai/agents/__init__.py +47 -1
  26. hammad/genai/agents/agent.py +1022 -0
  27. hammad/genai/agents/run.py +615 -0
  28. hammad/genai/agents/types/__init__.py +29 -22
  29. hammad/genai/agents/types/agent_context.py +13 -0
  30. hammad/genai/agents/types/agent_event.py +128 -0
  31. hammad/genai/agents/types/agent_hooks.py +220 -0
  32. hammad/genai/agents/types/agent_messages.py +31 -0
  33. hammad/genai/agents/types/agent_response.py +90 -0
  34. hammad/genai/agents/types/agent_stream.py +242 -0
  35. hammad/genai/models/__init__.py +1 -0
  36. hammad/genai/models/embeddings/__init__.py +39 -0
  37. hammad/genai/{embedding_models/embedding_model.py → models/embeddings/model.py} +45 -41
  38. hammad/genai/{embedding_models → models/embeddings}/run.py +10 -8
  39. hammad/genai/models/embeddings/types/__init__.py +37 -0
  40. hammad/genai/{embedding_models → models/embeddings/types}/embedding_model_name.py +2 -4
  41. hammad/genai/{embedding_models → models/embeddings/types}/embedding_model_response.py +11 -4
  42. hammad/genai/{embedding_models/embedding_model_request.py → models/embeddings/types/embedding_model_run_params.py} +4 -3
  43. hammad/genai/models/embeddings/types/embedding_model_settings.py +47 -0
  44. hammad/genai/models/language/__init__.py +48 -0
  45. hammad/genai/{language_models/language_model.py → models/language/model.py} +481 -204
  46. hammad/genai/{language_models → models/language}/run.py +80 -57
  47. hammad/genai/models/language/types/__init__.py +40 -0
  48. hammad/genai/models/language/types/language_model_instructor_mode.py +47 -0
  49. hammad/genai/models/language/types/language_model_messages.py +28 -0
  50. hammad/genai/{language_models/_types.py → models/language/types/language_model_name.py} +3 -40
  51. hammad/genai/{language_models → models/language/types}/language_model_request.py +17 -25
  52. hammad/genai/{language_models → models/language/types}/language_model_response.py +61 -68
  53. hammad/genai/{language_models → models/language/types}/language_model_response_chunk.py +8 -5
  54. hammad/genai/models/language/types/language_model_settings.py +89 -0
  55. hammad/genai/{language_models/_streaming.py → models/language/types/language_model_stream.py} +221 -243
  56. hammad/genai/{language_models/_utils → models/language/utils}/__init__.py +8 -11
  57. hammad/genai/models/language/utils/requests.py +421 -0
  58. hammad/genai/{language_models/_utils/_structured_outputs.py → models/language/utils/structured_outputs.py} +31 -20
  59. hammad/genai/models/model_provider.py +4 -0
  60. hammad/genai/{multimodal_models.py → models/multimodal.py} +4 -5
  61. hammad/genai/models/reranking.py +26 -0
  62. hammad/genai/types/__init__.py +1 -0
  63. hammad/genai/types/base.py +215 -0
  64. hammad/genai/{agents/types → types}/history.py +101 -88
  65. hammad/genai/{agents/types/tool.py → types/tools.py} +156 -141
  66. hammad/logging/logger.py +2 -1
  67. hammad/mcp/client/__init__.py +2 -3
  68. hammad/mcp/client/client.py +10 -10
  69. hammad/mcp/servers/__init__.py +2 -1
  70. hammad/service/decorators.py +1 -3
  71. hammad/web/models.py +1 -3
  72. hammad/web/search/client.py +10 -22
  73. {hammad_python-0.0.18.dist-info → hammad_python-0.0.20.dist-info}/METADATA +10 -2
  74. hammad_python-0.0.20.dist-info/RECORD +127 -0
  75. hammad/genai/embedding_models/__init__.py +0 -41
  76. hammad/genai/language_models/__init__.py +0 -35
  77. hammad/genai/language_models/_utils/_completions.py +0 -131
  78. hammad/genai/language_models/_utils/_messages.py +0 -89
  79. hammad/genai/language_models/_utils/_requests.py +0 -202
  80. hammad/genai/rerank_models.py +0 -26
  81. hammad_python-0.0.18.dist-info/RECORD +0 -111
  82. {hammad_python-0.0.18.dist-info → hammad_python-0.0.20.dist-info}/WHEEL +0 -0
  83. {hammad_python-0.0.18.dist-info → hammad_python-0.0.20.dist-info}/licenses/LICENSE +0 -0
@@ -576,7 +576,7 @@ def create_mcp_client(
576
576
  timeout: float = 30.0,
577
577
  ) -> MCPClient:
578
578
  """Create an MCP client with the specified transport type.
579
-
579
+
580
580
  Args:
581
581
  service_type: The type of transport to use ("stdio", "sse", or "http").
582
582
  command: Command to run for stdio transport.
@@ -585,10 +585,10 @@ def create_mcp_client(
585
585
  cwd: Working directory for the command (stdio only).
586
586
  url: URL for SSE or HTTP transport.
587
587
  timeout: Connection timeout in seconds.
588
-
588
+
589
589
  Returns:
590
590
  A configured MCPClient instance.
591
-
591
+
592
592
  Raises:
593
593
  ValueError: If required parameters for the transport type are missing.
594
594
  """
@@ -597,28 +597,28 @@ def create_mcp_client(
597
597
  if service_type == "stdio":
598
598
  if command is None:
599
599
  raise ValueError("command is required for stdio transport")
600
-
600
+
601
601
  service = MCPClientServiceStdio(
602
602
  command=command,
603
603
  args=args or [],
604
604
  env=env or {},
605
605
  cwd=Path(cwd) if cwd else None,
606
606
  )
607
-
607
+
608
608
  elif service_type == "sse":
609
609
  if url is None:
610
610
  raise ValueError("url is required for SSE transport")
611
-
611
+
612
612
  service = MCPClientServiceSse(url=url)
613
-
613
+
614
614
  elif service_type == "http":
615
615
  if url is None:
616
616
  raise ValueError("url is required for HTTP transport")
617
-
617
+
618
618
  service = MCPClientServiceStreamableHttp(url=url)
619
-
619
+
620
620
  else:
621
621
  raise ValueError(f"Unsupported service_type: {service_type}")
622
-
622
+
623
623
  settings = MCPClientSettings(timeout=timeout)
624
624
  return MCPClient(service=service, settings=settings)
@@ -20,6 +20,7 @@ __all__ = (
20
20
 
21
21
  __getattr__ = create_getattr_importer(__all__)
22
22
 
23
+
23
24
  def __dir__() -> list[str]:
24
25
  """Get the attributes of the servers module."""
25
- return list(__all__)
26
+ return list(__all__)
@@ -280,6 +280,4 @@ def serve_mcp(
280
280
  # Called as serve_mcp([func1, func2, ...])
281
281
  return handle_multiple_functions(fn)
282
282
  else:
283
- raise TypeError(
284
- f"Expected callable or list of callables, got {type(fn)}"
285
- )
283
+ raise TypeError(f"Expected callable or list of callables, got {type(fn)}")
hammad/web/models.py CHANGED
@@ -202,9 +202,7 @@ class HttpResponse(BaseModel):
202
202
 
203
203
  # NOTE: This is a workaround to avoid the issue with the `json` field
204
204
  # might consider moving to dataclasses
205
- json_data: Optional[Dict[str, Any]] = Field(
206
- alias="json"
207
- )
205
+ json_data: Optional[Dict[str, Any]] = Field(alias="json")
208
206
  """Parsed JSON content if Content-Type is JSON."""
209
207
 
210
208
  text: str
@@ -196,21 +196,18 @@ class AsyncSearchClient:
196
196
  max_results=max_results,
197
197
  )
198
198
  )
199
-
199
+
200
200
  # Convert raw results to SearchResult models
201
201
  search_results = [
202
202
  SearchResult(
203
203
  title=result.get("title", ""),
204
204
  href=result.get("href", ""),
205
- body=result.get("body", "")
205
+ body=result.get("body", ""),
206
206
  )
207
207
  for result in raw_results
208
208
  ]
209
-
210
- return SearchResults(
211
- query=query.strip(),
212
- results=search_results
213
- )
209
+
210
+ return SearchResults(query=query.strip(), results=search_results)
214
211
 
215
212
  async for attempt in AsyncRetrying(
216
213
  stop=stop_after_attempt(retries + 1),
@@ -266,7 +263,7 @@ class AsyncSearchClient:
266
263
  max_results=max_results,
267
264
  )
268
265
  )
269
-
266
+
270
267
  # Convert raw results to NewsResult models
271
268
  news_results = [
272
269
  NewsResult(
@@ -275,15 +272,12 @@ class AsyncSearchClient:
275
272
  body=result.get("body", ""),
276
273
  url=result.get("url", ""),
277
274
  image=result.get("image", ""),
278
- source=result.get("source", "")
275
+ source=result.get("source", ""),
279
276
  )
280
277
  for result in raw_results
281
278
  ]
282
-
283
- return NewsResults(
284
- query=query.strip(),
285
- results=news_results
286
- )
279
+
280
+ return NewsResults(query=query.strip(), results=news_results)
287
281
 
288
282
  async for attempt in AsyncRetrying(
289
283
  stop=stop_after_attempt(retries + 1),
@@ -501,10 +495,7 @@ class AsyncSearchClient:
501
495
  tasks = [fetch_page(url) for url in unique_urls]
502
496
  results = await asyncio.gather(*tasks, return_exceptions=False)
503
497
 
504
- return WebPageResults(
505
- urls=unique_urls,
506
- results=results
507
- )
498
+ return WebPageResults(urls=unique_urls, results=results)
508
499
 
509
500
  async def extract_page_links(
510
501
  self,
@@ -598,10 +589,7 @@ class AsyncSearchClient:
598
589
 
599
590
  links.append(link_info)
600
591
 
601
- return ExtractedLinks(
602
- url=url,
603
- results=links
604
- )
592
+ return ExtractedLinks(url=url, results=links)
605
593
 
606
594
  async for attempt in AsyncRetrying(
607
595
  stop=stop_after_attempt(retries + 1),
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: hammad-python
3
- Version: 0.0.18
3
+ Version: 0.0.20
4
4
  Author-email: Hammad Saeed <hammadaidev@gmail.com>
5
5
  License: MIT License
6
6
 
@@ -28,12 +28,13 @@ Requires-Python: >=3.11
28
28
  Requires-Dist: ddgs>=9.0.0
29
29
  Requires-Dist: httpx>=0.28.1
30
30
  Requires-Dist: msgspec>=0.19.0
31
+ Requires-Dist: nest-asyncio>=1.6.0
31
32
  Requires-Dist: pydantic>=2.11.7
32
33
  Requires-Dist: rich>=14.0.0
33
34
  Requires-Dist: selectolax>=0.3.31
34
35
  Requires-Dist: sqlalchemy>=2.0.41
35
36
  Requires-Dist: tantivy>=0.24.0
36
- Requires-Dist: tenacity>=9.1.2
37
+ Requires-Dist: tenacity>=8.2.3
37
38
  Requires-Dist: typing-inspect>=0.9.0
38
39
  Provides-Extra: ai
39
40
  Requires-Dist: instructor>=1.9.0; extra == 'ai'
@@ -46,6 +47,13 @@ Requires-Dist: litellm>=1.73.6; extra == 'all'
46
47
  Requires-Dist: mcp>=1.10.1; extra == 'all'
47
48
  Requires-Dist: qdrant-client>=1.14.3; extra == 'all'
48
49
  Requires-Dist: uvicorn>=0.34.0; extra == 'all'
50
+ Provides-Extra: genai
51
+ Requires-Dist: fastapi>=0.115.6; extra == 'genai'
52
+ Requires-Dist: instructor>=1.9.0; extra == 'genai'
53
+ Requires-Dist: litellm>=1.73.6; extra == 'genai'
54
+ Requires-Dist: mcp>=1.10.1; extra == 'genai'
55
+ Requires-Dist: qdrant-client>=1.14.3; extra == 'genai'
56
+ Requires-Dist: uvicorn>=0.34.0; extra == 'genai'
49
57
  Provides-Extra: mcp
50
58
  Requires-Dist: mcp>=1.10.1; extra == 'mcp'
51
59
  Provides-Extra: serve
@@ -0,0 +1,127 @@
1
+ hammad/__init__.py,sha256=H9AE2dPsfFRiir-cCi6_Zz48PP8D17oIKnSFx8SO6gk,1050
2
+ hammad/_internal.py,sha256=GJ5QEhFf4qNXYUZd1C5oq9wJ-a4gkUtLePwbz3W4weY,7872
3
+ hammad/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
4
+ hammad/cache/__init__.py,sha256=29vI8UkVITtiEe7fTr9UR5Q0lV7tr_SVe7tLlJmm1Ks,954
5
+ hammad/cache/base_cache.py,sha256=kYJS2IcQtxhzT7BQBFtOWnhw4VkvAapPhAVkfbW5IeY,6353
6
+ hammad/cache/cache.py,sha256=bzDXxjSolrSdIxqES2VMfVZZGTk_8k4x9n0AW4tlifs,4621
7
+ hammad/cache/decorators.py,sha256=olYLK5x4JkxHpA8WIiplI45QYmNIzyGjNMrTKNRCSQg,9599
8
+ hammad/cache/file_cache.py,sha256=XjLJxM4Ql65OABxz8q1DtA_s8HZQJKywCw6MNVnC6YE,2485
9
+ hammad/cache/ttl_cache.py,sha256=-0pJ4lkVgg1OIb98bQFub9n6f4zgWVs-dQfKZe_DmpE,2153
10
+ hammad/cli/__init__.py,sha256=DkBgA8zkdsOmReoPI5dqni5l5DGkaA7TzrIFvmy5MIo,785
11
+ hammad/cli/_runner.py,sha256=XEdao-JplTOGfdynN396ganaV_PKhyP0q5D15y7qA-8,9556
12
+ hammad/cli/animations.py,sha256=h68OuJBkDiYTLdB5pLPgQ2gpPT2c3dNulkDv2BtKHFA,19507
13
+ hammad/cli/plugins.py,sha256=vj6QdWjoqp2X4UC0vm55PIT8hkkuznWE5uAU9FZXHKM,31778
14
+ hammad/cli/styles/__init__.py,sha256=Ok7J_uhJgyswNkBWnDw50oTX9Xk1HPksUl3UbmT1qTI,1363
15
+ hammad/cli/styles/settings.py,sha256=irChf9RsMij3djx_n9D9duoVIzxLCpd9-BlKl6U_OLk,5532
16
+ hammad/cli/styles/types.py,sha256=vNIeQY_23m10K8qVT7Iy-PMwosGL-La-UAZKszHJjEE,7911
17
+ hammad/cli/styles/utils.py,sha256=zzi0JdH1X7O8XWRlMVfJP2jB-OWt7zkpm_LeCHoSKVY,28287
18
+ hammad/data/__init__.py,sha256=WTKbH94kzR6oOrB_T24XLbKgda4pTKbiHf2qyLWyRo4,1824
19
+ hammad/data/collections/__init__.py,sha256=b7NkF_p4fesZ-qOBxz931-vQjnyJB7IGyCpBJlO5G98,1041
20
+ hammad/data/collections/collection.py,sha256=fi7jyT2GmXiGLNajjegBJMbefzggL0PIMHf-81ov7Bo,10833
21
+ hammad/data/collections/indexes/__init__.py,sha256=RmXKWKq2sbtA1swz5vamKKWut-eKfc-Q2tUnij-E-IU,960
22
+ hammad/data/collections/indexes/qdrant/__init__.py,sha256=KU89TIJkYmJPnVxWKHfXntkIYwhn86ejXtWG30hCyHg,49
23
+ hammad/data/collections/indexes/qdrant/index.py,sha256=UzhW64i5Yq5AXyGZjkW4dljgQxwKUbjF6vhzendbjko,25634
24
+ hammad/data/collections/indexes/qdrant/settings.py,sha256=6Q3zT7hDNfKKqC6qI3xLiinm8yTsmyrncIoxLjbPk5o,2445
25
+ hammad/data/collections/indexes/qdrant/utils.py,sha256=_-iUn8O2C5Oaf2WlWBYBWZM4F7WM7B1KXh7FKu4Svkk,6326
26
+ hammad/data/collections/indexes/tantivy/__init__.py,sha256=iHlb8zNlvoKkQJOZgLONq8knYkoHFRQlS1DYKpcVwvE,46
27
+ hammad/data/collections/indexes/tantivy/index.py,sha256=TO5eRJB0ajjeJtDKRs5Q7-0n5vOqlAZgH87h6YIzavw,13628
28
+ hammad/data/collections/indexes/tantivy/settings.py,sha256=8K3CmmiU2geVniiUsRo3PXUAhAAhfqYeCSSvTQhpKH4,1254
29
+ hammad/data/collections/indexes/tantivy/utils.py,sha256=etY_N3BdiF91r7mvD8SYyQhnADPFLeMKA9d56jmlCYE,5454
30
+ hammad/data/configurations/__init__.py,sha256=1vJMpKKItA_aCDtOV7ouNpNAwOXhCJ28H_8dilrAzz0,834
31
+ hammad/data/configurations/configuration.py,sha256=ijm2FAyQjZ66Jo2RlT5hjCiAZdC9EnnghmR7Pj5z0Gw,17737
32
+ hammad/data/models/__init__.py,sha256=M59vT2Wu1Qw1jK2Qhs5KRgxh8MVrSmTRjGUNlM_Rmkw,1154
33
+ hammad/data/models/fields.py,sha256=6H5SbrXhC0KEge5PJNFqN-Ek8RKxt7-eRKC2E7xmoe8,19180
34
+ hammad/data/models/model.py,sha256=gBH6fL9TjSYfAyDHuw-VJdTorML62iisokvTlVzOnhY,39128
35
+ hammad/data/models/utils.py,sha256=KNtr1PlxBizs14gmZqQeG1A7EQ6JHPRrRN0pTr3ucR8,9964
36
+ hammad/data/models/extensions/__init__.py,sha256=dfVDCMBKZYtaMHJRQBShaoMHFcQ6VJcD_5q5Fcc77mQ,128
37
+ hammad/data/models/extensions/pydantic/__init__.py,sha256=2ipoelO4knYSug47Vdt0URHtBNCQIFixJ3tTcawaCtE,1205
38
+ hammad/data/models/extensions/pydantic/converters.py,sha256=_485-4EUQe7-fxlPG2o1wnaU8SDA79AhxMitiUMoIYY,24545
39
+ hammad/data/sql/__init__.py,sha256=sCV7B9pgueKAFjdLvLrY7r1ZWKa0x44lzF5xdYnZ4mo,453
40
+ hammad/data/sql/database.py,sha256=t06bNLQ0WPmg8Be_Xf9u8k5zhy70Iw-akC4Ff2o5PrA,18208
41
+ hammad/data/sql/types.py,sha256=8xLEEK7u6YBFGfh8MJbJeSVNeGZ1RCxF_QvNTu0rel0,3526
42
+ hammad/data/types/__init__.py,sha256=LeyrRKKBbDP2VaTaNEiyJU_1rs52LofD18WUS8rl5gw,758
43
+ hammad/data/types/file.py,sha256=l1mXtyxsmbx0P_U_rnjkgc4N_UQBevAESTAZmBc8eVc,11111
44
+ hammad/data/types/text.py,sha256=rATiwkTsAJ8pWzZ7OBsWX7rDNoKvkeuWsGWd_sbuUaM,33369
45
+ hammad/data/types/multimodal/__init__.py,sha256=LQzomOVQFYnmkQT7hFIxcM261FDXtV3i0uEHB7GXIwU,427
46
+ hammad/data/types/multimodal/audio.py,sha256=rn1G1vwDlt4d30ZumzYBeO0f0OhdtIQBJRCaSkyPHRA,2786
47
+ hammad/data/types/multimodal/image.py,sha256=xp9aWeGkg6FReuFLA63CQ81tv74nFxVtgVjpoDZNjjw,2274
48
+ hammad/formatting/__init__.py,sha256=5WZP0WBgTPF7hRtcz_cSMrQG2fKuOGwhFiBTn2J4A_g,348
49
+ hammad/formatting/json/__init__.py,sha256=V4uODCUQdptfyw_D96R3XDopw1bgNIR2ogiEG-Z-FtQ,525
50
+ hammad/formatting/json/converters.py,sha256=CfEKtoTkeQbaGnpHHY3SAFVFjRjeG115X94L8Jq-14I,5597
51
+ hammad/formatting/text/__init__.py,sha256=ZAA7D4pwKFjeUxHsnm21QKSTtQ7Fj8ncO__m5Ry_eHY,1506
52
+ hammad/formatting/text/converters.py,sha256=g3z-ZGTaKNVbLFFKBSh6qN2Uz0BSkdxCaN3LR9cAyV8,23806
53
+ hammad/formatting/text/markdown.py,sha256=D17NOoGkoXUBhoOGKelKHwi72iqsAwPU5HEFjRJtLQI,3407
54
+ hammad/formatting/yaml/__init__.py,sha256=4dBeXPi0jx7ELT2_sC2fUYaiY8b8wFiUScLODc9ISEw,462
55
+ hammad/formatting/yaml/converters.py,sha256=zvSB8QGb56uvwO0KjXllfTj9g1FmNINOKR06DTjvXw8,153
56
+ hammad/genai/__init__.py,sha256=16L9z0U73uUhBB7JHSL0tHWie2-rI7GAUtQSY94IeZk,3579
57
+ hammad/genai/agents/__init__.py,sha256=R_wW_fbZqMXZZYSErAb81UDRMTaNDlAFzNKfTOm4XYg,1235
58
+ hammad/genai/agents/agent.py,sha256=r9iKJoks2dFc0ifLYhQnYjVN31ULkpBWy_IwrAMKwr0,38899
59
+ hammad/genai/agents/run.py,sha256=G3NLJgg8nXFHfOrh_XR1NpVjGzAgjnA_Ojc_rrMHz9E,23278
60
+ hammad/genai/agents/types/__init__.py,sha256=6X6_P82qe15dyqs-vAcXUk4na4tB-7oMdMf484v87io,1119
61
+ hammad/genai/agents/types/agent_context.py,sha256=u4evwx9B-UKEHMtNcsNlN9q8i12bsW9HhtyvmU0NNTw,313
62
+ hammad/genai/agents/types/agent_event.py,sha256=zNKXXPKKOsIO9MAhE-YNCOxeNg00O7j1mE0R1pA_Xr8,3925
63
+ hammad/genai/agents/types/agent_hooks.py,sha256=wgys4ixiHjX5oux4zVSr9OPXyAZ-iJGk_MhaOKEgMxo,7853
64
+ hammad/genai/agents/types/agent_messages.py,sha256=csjEq42bElaTZYZW2dE6nlFZc142-HgT3bB6h1KMg_w,846
65
+ hammad/genai/agents/types/agent_response.py,sha256=3WTIKP123amnuRzaQ0Jjlipqvug7aRstlqiPnHD9m4Q,2598
66
+ hammad/genai/agents/types/agent_stream.py,sha256=n8RrWfLylfpW0xYj4ZrrUgq-0Z-DVAFl9lfBiSYANb8,7842
67
+ hammad/genai/models/__init__.py,sha256=e4TbEsiKIoXENOEsdIdQcWWt0RnFdTEqCz0nICHQHtM,26
68
+ hammad/genai/models/model_provider.py,sha256=2RdOeqr7KpjyrMqq4YH4OYy1pk6sjzf2CPu1ZHa1Pdk,75
69
+ hammad/genai/models/multimodal.py,sha256=KXUyLXqM1eBgBGZFEbMw3dYbakZFAXoko2xYprronxY,1276
70
+ hammad/genai/models/reranking.py,sha256=oR1j7uomtEQCse-1zkteDTdXklEKu40CvFcAMLAV2XM,451
71
+ hammad/genai/models/embeddings/__init__.py,sha256=XfAsy8nGIDQtbWhQokb28mym6-q1su180pFMTaUp5Eg,954
72
+ hammad/genai/models/embeddings/model.py,sha256=lYi1a5Rs8eX3OFUfo3CkGL5FQk-MSQ1lQaoxC7Yia7I,7066
73
+ hammad/genai/models/embeddings/run.py,sha256=-0WPCGF2otIfPZzQ2VeocuvKFxSyCz66WsfkhORJAV4,5011
74
+ hammad/genai/models/embeddings/types/__init__.py,sha256=j1puexoIpgyYpDkz-1wMy2QjbS5QEZiLlI0BJaus3gY,1068
75
+ hammad/genai/models/embeddings/types/embedding_model_name.py,sha256=LA8E6C-_o7cz8KwFPL0vLYt2OxhTtJikMHsQBwNpKpY,2499
76
+ hammad/genai/models/embeddings/types/embedding_model_response.py,sha256=V2H_VTl1MSBTa6Yubwjb43ZaoIrHORRdy9nYG2kZGyQ,2038
77
+ hammad/genai/models/embeddings/types/embedding_model_run_params.py,sha256=ZGhCXrEEzMF5y-V8neF2a73Gh1emzrYUHVxWkybg5uE,1570
78
+ hammad/genai/models/embeddings/types/embedding_model_settings.py,sha256=KEwvoElXhPMSVCKW2uKwqqT2lSAAthQXmGXaV7Qk5cU,1268
79
+ hammad/genai/models/language/__init__.py,sha256=B92q9f5UIQBMIFoYUja9V61bn5Lzdrk12_bf3DHw6Is,1838
80
+ hammad/genai/models/language/model.py,sha256=sXXAcW7tWX9vxAKT9jPOtIren-IkGXyG-P-ib4EeoQg,38698
81
+ hammad/genai/models/language/run.py,sha256=nqqQYi3iBpkNxW3_JHyyZBNpn79LVWLpnebCBYOaEbA,21468
82
+ hammad/genai/models/language/types/__init__.py,sha256=cdLnoCiVmK6T86-5CZrUJg2rxXKoSk-svyCSviUdgao,1534
83
+ hammad/genai/models/language/types/language_model_instructor_mode.py,sha256=7ywBaY24m-UKRynnX6XsfVf_hsQrM2xHAHugTgV0Vho,1008
84
+ hammad/genai/models/language/types/language_model_messages.py,sha256=e-HZ_YKXq17gwmMlpOmYUYUpBFm7Mu3aRawtjSslWXs,504
85
+ hammad/genai/models/language/types/language_model_name.py,sha256=2V70cZ47L9yIcug6LCcMHcvEJaee7gRN6DUPhLUBlsE,8056
86
+ hammad/genai/models/language/types/language_model_request.py,sha256=ZtzhCx8o6zkEBS3uTFXFLf_poDD7MnIp1y7MbKckOmI,3911
87
+ hammad/genai/models/language/types/language_model_response.py,sha256=pViE4lRNwlXAlNPNNPemKH8Z2tTjeEuU2C5yJnLV2nI,7485
88
+ hammad/genai/models/language/types/language_model_response_chunk.py,sha256=wIzGZw732KsI-a1-uASjATA6qvBuq-7rupWoFjsAgQo,1796
89
+ hammad/genai/models/language/types/language_model_settings.py,sha256=C0EvLXZoOLgPZ4bX7mVFs_CWP-jam27qkseJRGsBAfQ,2794
90
+ hammad/genai/models/language/types/language_model_stream.py,sha256=XgJ83JSbtTdf7jeLQMrDhMfI7zp0pRrdY7JWYbZV_h0,22043
91
+ hammad/genai/models/language/utils/__init__.py,sha256=eoq08gYz2dzgRAge38c-HsadHdv9sNdTxsZ3Af8YfXQ,732
92
+ hammad/genai/models/language/utils/requests.py,sha256=_FAksgbNyD7dQAEB5a6D50DoWG0ENg71HX9DBeIwmJg,13344
93
+ hammad/genai/models/language/utils/structured_outputs.py,sha256=Va7pie9AOvLbJOaDj4VIKG94EO8-47d-aL4CJTM9FAg,3923
94
+ hammad/genai/types/__init__.py,sha256=W0fzUnKhDynt4TkwZX8LCRYfgRTAVomSuWqPmhGu8sg,25
95
+ hammad/genai/types/base.py,sha256=VnGL45w8oR-6rWl2GfGgWX4SjMC-23RGWuN0_H2bH_I,5437
96
+ hammad/genai/types/history.py,sha256=zsfBvGMoFTHZCT7Igae-5_jszu409dVJ_wEmNw7alCk,10208
97
+ hammad/genai/types/tools.py,sha256=2VTH1LhKKtrIOqvq7JitYgtOvApLAoWTZH-4ogNtL9E,16509
98
+ hammad/logging/__init__.py,sha256=VtskZx0bKEAJ9FHTMflhB1CzeFUxLpDT5HPgcecAXUo,701
99
+ hammad/logging/decorators.py,sha256=VbI1x3P4ft0-0BGjXq7nQgiuNqcXAA51CGmoSn47iSw,30122
100
+ hammad/logging/logger.py,sha256=bHmA1osHwbA7B4noyQp1GmlLmNkQvAXQigr-OC4XVH8,31536
101
+ hammad/mcp/__init__.py,sha256=5oTU-BLYjfz6fBHDH9cyWg3DpQ6Qar-jodbCR05SuWo,1123
102
+ hammad/mcp/client/__init__.py,sha256=_SfnKvd5Za-FfFoE5GcXkBY9WcwprZND9SyZ6RY--no,795
103
+ hammad/mcp/client/client.py,sha256=auKCiIJfcZkuVFRapTpqYP4PxoyIfx40gVbMYLBdTzI,20565
104
+ hammad/mcp/client/client_service.py,sha256=quJp02n9tp70l0SJd9jkIuRkdSPeWegzusk-eiV41b0,14990
105
+ hammad/mcp/client/settings.py,sha256=7bLpJYyiUT_H7zp3SDwLyAt9fmiQwL3L89qVTAZYpi8,5913
106
+ hammad/mcp/servers/__init__.py,sha256=QOQGd8NnTyt3bUJ8Bbs_izDiSdmB6ZvCc3HQTQfgmTc,585
107
+ hammad/mcp/servers/launcher.py,sha256=jQDQOqz-cKK2PSEOxoPBCVsBeTABNNjcwTXSWE4-LQA,41606
108
+ hammad/runtime/__init__.py,sha256=I7MuJV-1dvLSUaAiK6TCAo1rm0vQvR617bLd1Q9c99E,662
109
+ hammad/runtime/decorators.py,sha256=5T56nAwwfH0ZKfnLlDGkDNFYaGBBSrH1i4_yX3Dt5GA,4524
110
+ hammad/runtime/run.py,sha256=VFzoXieSaEg1KlDTTepDIsSyISkWXuxHpNs_AgHX5nM,10802
111
+ hammad/service/__init__.py,sha256=B7wnQkT8e2kFwaigpAcXI_PJ8jlQzxcgTtDDH1p4KSU,1222
112
+ hammad/service/create.py,sha256=Z0Vy-nQUKk_zqLuVOKJye6gLdVSU5HNlPgm4irvRgu8,16224
113
+ hammad/service/decorators.py,sha256=s7MB1fBgf1TwDYH80tmpJe12ixtaElkmFlTvtMTMQdQ,9918
114
+ hammad/typing/__init__.py,sha256=P9XCKrn-kxyfSLHpY9vraOLV9vyoBz_DzEm6eIH5xWY,11712
115
+ hammad/web/__init__.py,sha256=8wQPjlpW6t1bbCKUkZMIEJtVbL9Aj6TnTWcmNRdjBRY,1077
116
+ hammad/web/models.py,sha256=YLQ5oKLWmsyVWb1Gtd0x38YMOZginQd4oCgIXCVoRh4,6407
117
+ hammad/web/utils.py,sha256=o-ys9anLDtOTkqvk0Z8gxc-V0lhp0LB03DHFpoj6Ous,15863
118
+ hammad/web/http/__init__.py,sha256=jn9Rn7Yg2cypD7duTTNFuW2wQZx9B63Bde4RJJeDYU0,22
119
+ hammad/web/http/client.py,sha256=LWBSVjvHEuHmOOWq5EUT4zN5w6zSG45bOTk6FiSPHuA,33082
120
+ hammad/web/openapi/__init__.py,sha256=JhJQ6_laBmB2djIYFc0vgGha2GsdUe4FP1LDdZCQ5J4,25
121
+ hammad/web/openapi/client.py,sha256=1pXz7KAO_0pN4kQZoWKWskXDYGiJ535TsPO1GGCiC0E,26816
122
+ hammad/web/search/__init__.py,sha256=e9A6znPIiZCz-4secyHbUs0uUGf5yAqW6wGacgx961U,24
123
+ hammad/web/search/client.py,sha256=LIx2MsHhn6cRTuq5i1mWowRTdIhPobY4GQV3S3bk9lk,36694
124
+ hammad_python-0.0.20.dist-info/METADATA,sha256=H-iyFt1AuR4ys_APfIVmnyp8t4Kkhl2xUehhSbw-EfQ,6570
125
+ hammad_python-0.0.20.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
126
+ hammad_python-0.0.20.dist-info/licenses/LICENSE,sha256=h74yFUWjbBaodcWG5wNmm30npjl8obVcxD-1nQfUp2I,1069
127
+ hammad_python-0.0.20.dist-info/RECORD,,
@@ -1,41 +0,0 @@
1
- """hammad.genai.embedding_models"""
2
-
3
- from typing import TYPE_CHECKING
4
- from ..._internal import create_getattr_importer
5
-
6
- if TYPE_CHECKING:
7
- from .embedding_model import EmbeddingModel
8
- from .embedding_model_request import EmbeddingModelRequest
9
- from .embedding_model_response import EmbeddingModelResponse
10
- from .embedding_model_name import EmbeddingModelName
11
- from .run import (
12
- run_embedding_model,
13
- async_run_embedding_model,
14
- )
15
-
16
-
17
- __all__ = (
18
- # hammad.genai.embedding_models.embedding_model
19
- "EmbeddingModel",
20
-
21
- # hammad.genai.embedding_models.embedding_model_request
22
- "EmbeddingModelRequest",
23
-
24
- # hammad.genai.embedding_models.embedding_model_response
25
- "EmbeddingModelResponse",
26
-
27
- # hammad.genai.embedding_models.embedding_model_name
28
- "EmbeddingModelName",
29
-
30
- # hammad.genai.embedding_models.run
31
- "run_embedding_model",
32
- "async_run_embedding_model",
33
- )
34
-
35
-
36
- __getattr__ = create_getattr_importer(__all__)
37
-
38
-
39
- def __dir__() -> list[str]:
40
- """Get the attributes of the embedding_models module."""
41
- return list(__all__)
@@ -1,35 +0,0 @@
1
- """hammad.genai.language_models"""
2
-
3
- from typing import TYPE_CHECKING
4
- from ..._internal import create_getattr_importer
5
-
6
- if TYPE_CHECKING:
7
- from .language_model import LanguageModel
8
- from .run import run_language_model, async_run_language_model
9
- from .language_model_request import LanguageModelMessagesParam
10
- from .language_model_response import LanguageModelResponse
11
- from .language_model_response_chunk import LanguageModelResponseChunk
12
- from .language_model_request import LanguageModelRequest
13
-
14
- __all__ = (
15
- # hammad.genai.language_models.language_model
16
- "LanguageModel",
17
-
18
- # hammad.genai.language_models.run
19
- "run_language_model",
20
- "async_run_language_model",
21
-
22
- # hammad.genai.language_models.language_model_request
23
- "LanguageModelMessagesParam",
24
- "LanguageModelRequest",
25
-
26
- # hammad.genai.language_models.language_model_response
27
- "LanguageModelResponse",
28
- "LanguageModelResponseChunk",
29
- )
30
-
31
- __getattr__ = create_getattr_importer(__all__)
32
-
33
- def __dir__() -> list[str]:
34
- """Get the attributes of the language_models module."""
35
- return list(__all__)
@@ -1,131 +0,0 @@
1
- """hammad.ai.llms.utils._completions"""
2
-
3
- from __future__ import annotations
4
-
5
- from typing import Any, Dict, List, Optional
6
-
7
- from ....cache import cached
8
-
9
- try:
10
- from openai.types.chat import ChatCompletionMessageParam
11
- except ImportError:
12
- ChatCompletionMessageParam = Any
13
-
14
- from ..language_model_request import LanguageModelMessagesParam
15
- from ..language_model_response import LanguageModelResponse
16
-
17
- __all__ = [
18
- "parse_messages_input",
19
- "handle_completion_request_params",
20
- "handle_completion_response",
21
- ]
22
-
23
-
24
- @cached
25
- def parse_messages_input(
26
- messages: LanguageModelMessagesParam,
27
- instructions: Optional[str] = None,
28
- ) -> List["ChatCompletionMessageParam"]:
29
- """Parse various message input formats into standardized ChatCompletionMessageParam format.
30
-
31
- Args:
32
- messages: Input messages in various formats
33
- instructions: Optional system instructions to prepend
34
-
35
- Returns:
36
- List of ChatCompletionMessageParam objects
37
- """
38
- parsed_messages: List["ChatCompletionMessageParam"] = []
39
-
40
- # Add system instructions if provided
41
- if instructions:
42
- parsed_messages.append({
43
- "role": "system",
44
- "content": instructions
45
- })
46
-
47
- # Handle different input formats
48
- if isinstance(messages, str):
49
- # Simple string input
50
- parsed_messages.append({
51
- "role": "user",
52
- "content": messages
53
- })
54
- elif isinstance(messages, dict):
55
- # Single message dict
56
- parsed_messages.append(messages)
57
- elif isinstance(messages, list):
58
- # List of messages
59
- for msg in messages:
60
- if isinstance(msg, dict):
61
- parsed_messages.append(msg)
62
- elif isinstance(msg, str):
63
- parsed_messages.append({
64
- "role": "user",
65
- "content": msg
66
- })
67
- else:
68
- # Fallback - try to convert to string
69
- parsed_messages.append({
70
- "role": "user",
71
- "content": str(messages)
72
- })
73
-
74
- return parsed_messages
75
-
76
-
77
- @cached
78
- def handle_completion_request_params(params: Dict[str, Any]) -> Dict[str, Any]:
79
- """Filter and process parameters for standard completion requests.
80
-
81
- Args:
82
- params: Raw request parameters
83
-
84
- Returns:
85
- Filtered parameters suitable for LiteLLM completion
86
- """
87
- # Remove structured output specific parameters
88
- excluded_keys = {
89
- "type", "instructor_mode", "response_field_name",
90
- "response_field_instruction", "max_retries", "strict"
91
- }
92
-
93
- filtered_params = {
94
- key: value for key, value in params.items()
95
- if key not in excluded_keys and value is not None
96
- }
97
-
98
- return filtered_params
99
-
100
-
101
- def handle_completion_response(response: Any, model: str) -> LanguageModelResponse[str]:
102
- """Convert a LiteLLM completion response to LanguageModelResponse.
103
-
104
- Args:
105
- response: LiteLLM ModelResponse object
106
- model: Model name used for the request
107
-
108
- Returns:
109
- LanguageModelResponse object with string output
110
- """
111
- # Extract content from the response
112
- content = None
113
- tool_calls = None
114
- refusal = None
115
-
116
- if hasattr(response, "choices") and response.choices:
117
- choice = response.choices[0]
118
- if hasattr(choice, "message"):
119
- message = choice.message
120
- content = getattr(message, "content", None)
121
- tool_calls = getattr(message, "tool_calls", None)
122
- refusal = getattr(message, "refusal", None)
123
-
124
- return LanguageModelResponse(
125
- model=model,
126
- output=content or "",
127
- completion=response,
128
- content=content,
129
- tool_calls=tool_calls,
130
- refusal=refusal,
131
- )
@@ -1,89 +0,0 @@
1
- """hammad.ai.llms.utils._messages"""
2
-
3
- from typing import List
4
-
5
- from ....cache import cached
6
-
7
- try:
8
- from openai.types.chat import ChatCompletionMessageParam
9
- except ImportError:
10
- ChatCompletionMessageParam = Any
11
-
12
- __all__ = [
13
- "format_tool_calls",
14
- "consolidate_system_messages",
15
- ]
16
-
17
-
18
- @cached
19
- def format_tool_calls(messages: List["ChatCompletionMessageParam"]) -> List["ChatCompletionMessageParam"]:
20
- """Format tool calls in messages for better conversation context.
21
-
22
- Args:
23
- messages: List of chat completion messages
24
-
25
- Returns:
26
- Messages with formatted tool calls
27
- """
28
- formatted_messages = []
29
-
30
- for message in messages:
31
- if message.get("role") == "assistant" and message.get("tool_calls"):
32
- # Create a copy of the message
33
- formatted_message = dict(message)
34
-
35
- # Format tool calls into readable content
36
- content_parts = []
37
- if message.get("content"):
38
- content_parts.append(message["content"])
39
-
40
- for tool_call in message["tool_calls"]:
41
- formatted_call = (
42
- f"I called the function `{tool_call['function']['name']}` "
43
- f"with the following arguments:\n{tool_call['function']['arguments']}"
44
- )
45
- content_parts.append(formatted_call)
46
-
47
- formatted_message["content"] = "\n\n".join(content_parts)
48
- # Remove tool_calls from the formatted message
49
- formatted_message.pop("tool_calls", None)
50
-
51
- formatted_messages.append(formatted_message)
52
- else:
53
- formatted_messages.append(message)
54
-
55
- return formatted_messages
56
-
57
-
58
- @cached
59
- def consolidate_system_messages(messages: List["ChatCompletionMessageParam"]) -> List["ChatCompletionMessageParam"]:
60
- """Consolidate multiple system messages into a single system message.
61
-
62
- Args:
63
- messages: List of chat completion messages
64
-
65
- Returns:
66
- Messages with consolidated system messages
67
- """
68
- system_parts = []
69
- other_messages = []
70
-
71
- for message in messages:
72
- if message.get("role") == "system":
73
- if message.get("content"):
74
- system_parts.append(message["content"])
75
- else:
76
- other_messages.append(message)
77
-
78
- # Create consolidated messages
79
- consolidated_messages = []
80
-
81
- if system_parts:
82
- consolidated_messages.append({
83
- "role": "system",
84
- "content": "\n\n".join(system_parts)
85
- })
86
-
87
- consolidated_messages.extend(other_messages)
88
-
89
- return consolidated_messages