hammad-python 0.0.19__py3-none-any.whl → 0.0.21__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.
- hammad/__init__.py +7 -137
- hammad/_internal.py +1 -0
- hammad/cli/_runner.py +8 -8
- hammad/cli/plugins.py +55 -26
- hammad/cli/styles/utils.py +16 -8
- hammad/data/__init__.py +1 -5
- hammad/data/collections/__init__.py +2 -3
- hammad/data/collections/collection.py +41 -22
- hammad/data/collections/indexes/__init__.py +1 -1
- hammad/data/collections/indexes/qdrant/__init__.py +1 -1
- hammad/data/collections/indexes/qdrant/index.py +106 -118
- hammad/data/collections/indexes/qdrant/settings.py +14 -14
- hammad/data/collections/indexes/qdrant/utils.py +28 -38
- hammad/data/collections/indexes/tantivy/__init__.py +1 -1
- hammad/data/collections/indexes/tantivy/index.py +57 -59
- hammad/data/collections/indexes/tantivy/settings.py +8 -19
- hammad/data/collections/indexes/tantivy/utils.py +28 -52
- hammad/data/models/__init__.py +2 -7
- hammad/data/sql/__init__.py +1 -1
- hammad/data/sql/database.py +71 -73
- hammad/data/sql/types.py +37 -51
- hammad/formatting/__init__.py +2 -1
- hammad/formatting/json/converters.py +2 -2
- hammad/genai/__init__.py +96 -36
- hammad/genai/agents/__init__.py +47 -1
- hammad/genai/agents/agent.py +1298 -0
- hammad/genai/agents/run.py +615 -0
- hammad/genai/agents/types/__init__.py +29 -22
- hammad/genai/agents/types/agent_context.py +13 -0
- hammad/genai/agents/types/agent_event.py +128 -0
- hammad/genai/agents/types/agent_hooks.py +220 -0
- hammad/genai/agents/types/agent_messages.py +31 -0
- hammad/genai/agents/types/agent_response.py +122 -0
- hammad/genai/agents/types/agent_stream.py +318 -0
- hammad/genai/models/__init__.py +1 -0
- hammad/genai/models/embeddings/__init__.py +39 -0
- hammad/genai/{embedding_models/embedding_model.py → models/embeddings/model.py} +45 -41
- hammad/genai/{embedding_models → models/embeddings}/run.py +10 -8
- hammad/genai/models/embeddings/types/__init__.py +37 -0
- hammad/genai/{embedding_models → models/embeddings/types}/embedding_model_name.py +2 -4
- hammad/genai/{embedding_models → models/embeddings/types}/embedding_model_response.py +11 -4
- hammad/genai/{embedding_models/embedding_model_request.py → models/embeddings/types/embedding_model_run_params.py} +4 -3
- hammad/genai/models/embeddings/types/embedding_model_settings.py +47 -0
- hammad/genai/models/language/__init__.py +48 -0
- hammad/genai/{language_models/language_model.py → models/language/model.py} +496 -204
- hammad/genai/{language_models → models/language}/run.py +80 -57
- hammad/genai/models/language/types/__init__.py +40 -0
- hammad/genai/models/language/types/language_model_instructor_mode.py +47 -0
- hammad/genai/models/language/types/language_model_messages.py +28 -0
- hammad/genai/{language_models/_types.py → models/language/types/language_model_name.py} +3 -40
- hammad/genai/{language_models → models/language/types}/language_model_request.py +17 -25
- hammad/genai/{language_models → models/language/types}/language_model_response.py +60 -67
- hammad/genai/{language_models → models/language/types}/language_model_response_chunk.py +8 -5
- hammad/genai/models/language/types/language_model_settings.py +89 -0
- hammad/genai/{language_models/_streaming.py → models/language/types/language_model_stream.py} +221 -243
- hammad/genai/{language_models/_utils → models/language/utils}/__init__.py +8 -11
- hammad/genai/models/language/utils/requests.py +421 -0
- hammad/genai/{language_models/_utils/_structured_outputs.py → models/language/utils/structured_outputs.py} +31 -20
- hammad/genai/models/model_provider.py +4 -0
- hammad/genai/{multimodal_models.py → models/multimodal.py} +4 -5
- hammad/genai/models/reranking.py +26 -0
- hammad/genai/types/__init__.py +1 -0
- hammad/genai/types/base.py +215 -0
- hammad/genai/{agents/types → types}/history.py +101 -88
- hammad/genai/{agents/types/tool.py → types/tools.py} +157 -140
- hammad/logging/logger.py +9 -1
- hammad/mcp/client/__init__.py +2 -3
- hammad/mcp/client/client.py +10 -10
- hammad/mcp/servers/__init__.py +2 -1
- hammad/service/decorators.py +1 -3
- hammad/web/models.py +1 -3
- hammad/web/search/client.py +10 -22
- {hammad_python-0.0.19.dist-info → hammad_python-0.0.21.dist-info}/METADATA +10 -2
- hammad_python-0.0.21.dist-info/RECORD +127 -0
- hammad/genai/embedding_models/__init__.py +0 -41
- hammad/genai/language_models/__init__.py +0 -35
- hammad/genai/language_models/_utils/_completions.py +0 -131
- hammad/genai/language_models/_utils/_messages.py +0 -89
- hammad/genai/language_models/_utils/_requests.py +0 -202
- hammad/genai/rerank_models.py +0 -26
- hammad_python-0.0.19.dist-info/RECORD +0 -111
- {hammad_python-0.0.19.dist-info → hammad_python-0.0.21.dist-info}/WHEEL +0 -0
- {hammad_python-0.0.19.dist-info → hammad_python-0.0.21.dist-info}/licenses/LICENSE +0 -0
hammad/mcp/client/client.py
CHANGED
@@ -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)
|
hammad/mcp/servers/__init__.py
CHANGED
hammad/service/decorators.py
CHANGED
@@ -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
|
hammad/web/search/client.py
CHANGED
@@ -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.
|
3
|
+
Version: 0.0.21
|
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>=
|
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=9dA1GGVR9bQo2KAnmpvyBYNtOhhbxq7bXuKcb9NpwD0,54902
|
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=3-6zMMKQXbFXN4VSf_J-y_GeO9sxQTNjC_uW8x6E0m0,3795
|
66
|
+
hammad/genai/agents/types/agent_stream.py,sha256=57Pd4lyDRQnkjeM0x3KDkqBXEDjP8lCyK836kX8wlJM,11076
|
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=zdQHI_vC3QXsCKnAtxqOtnzKqSTSa5rkgv86GnKrmm8,39378
|
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=vxNunQ8ZXds-9hawMkXfNoTkWlEeyRy7kgWhlNt6xoc,7493
|
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=3p7qhZcilP_NOCOnufCkubTeYN0yC7Ij5bqrUy-FYow,16554
|
98
|
+
hammad/logging/__init__.py,sha256=VtskZx0bKEAJ9FHTMflhB1CzeFUxLpDT5HPgcecAXUo,701
|
99
|
+
hammad/logging/decorators.py,sha256=VbI1x3P4ft0-0BGjXq7nQgiuNqcXAA51CGmoSn47iSw,30122
|
100
|
+
hammad/logging/logger.py,sha256=vqinFHYUiCdHxJntsvXRjNextwOfBkXBOlLXduEk5VM,31705
|
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.21.dist-info/METADATA,sha256=rqHKqJ3Ipe4XisXufat4OwBws3-MgShyRN0PFrUM58Q,6570
|
125
|
+
hammad_python-0.0.21.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
126
|
+
hammad_python-0.0.21.dist-info/licenses/LICENSE,sha256=h74yFUWjbBaodcWG5wNmm30npjl8obVcxD-1nQfUp2I,1069
|
127
|
+
hammad_python-0.0.21.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
|