hammad-python 0.0.19__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 +1 -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.19.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.19.dist-info/RECORD +0 -111
  82. {hammad_python-0.0.19.dist-info → hammad_python-0.0.20.dist-info}/WHEEL +0 -0
  83. {hammad_python-0.0.19.dist-info → hammad_python-0.0.20.dist-info}/licenses/LICENSE +0 -0
hammad/data/sql/types.py CHANGED
@@ -17,11 +17,11 @@ import uuid
17
17
 
18
18
  __all__ = (
19
19
  "DatabaseItemType",
20
- "DatabaseItemFilters",
20
+ "DatabaseItemFilters",
21
21
  "DatabaseItem",
22
22
  "QueryOperator",
23
23
  "QueryCondition",
24
- "QueryFilter"
24
+ "QueryFilter",
25
25
  )
26
26
 
27
27
 
@@ -35,21 +35,21 @@ DatabaseItemFilters: TypeAlias = Dict[str, object]
35
35
 
36
36
 
37
37
  QueryOperator = Literal[
38
- "eq", # equal
39
- "ne", # not equal
40
- "gt", # greater than
41
- "gte", # greater than or equal
42
- "lt", # less than
43
- "lte", # less than or equal
44
- "in", # in list
38
+ "eq", # equal
39
+ "ne", # not equal
40
+ "gt", # greater than
41
+ "gte", # greater than or equal
42
+ "lt", # less than
43
+ "lte", # less than or equal
44
+ "in", # in list
45
45
  "not_in", # not in list
46
- "like", # SQL LIKE
47
- "ilike", # case insensitive LIKE
48
- "is_null", # IS NULL
49
- "is_not_null", # IS NOT NULL
50
- "contains", # for JSON contains
51
- "startswith", # string starts with
52
- "endswith", # string ends with
46
+ "like", # SQL LIKE
47
+ "ilike", # case insensitive LIKE
48
+ "is_null", # IS NULL
49
+ "is_not_null", # IS NOT NULL
50
+ "contains", # for JSON contains
51
+ "startswith", # string starts with
52
+ "endswith", # string ends with
53
53
  ]
54
54
  """Supported query operators for database queries."""
55
55
 
@@ -57,24 +57,24 @@ QueryOperator = Literal[
57
57
  @dataclass
58
58
  class QueryCondition:
59
59
  """Represents a single query condition for database filtering."""
60
-
60
+
61
61
  field: str
62
62
  """The field name to filter on."""
63
-
63
+
64
64
  operator: QueryOperator
65
65
  """The operator to use for comparison."""
66
-
66
+
67
67
  value: Any = None
68
68
  """The value to compare against (not needed for is_null/is_not_null)."""
69
69
 
70
70
 
71
- @dataclass
71
+ @dataclass
72
72
  class QueryFilter:
73
73
  """Represents a collection of query conditions with logical operators."""
74
-
74
+
75
75
  conditions: list[QueryCondition] = field(default_factory=list)
76
76
  """List of individual query conditions."""
77
-
77
+
78
78
  logic: Literal["and", "or"] = "and"
79
79
  """Logical operator to combine conditions."""
80
80
 
@@ -83,52 +83,37 @@ class QueryFilter:
83
83
  class DatabaseItem(Generic[DatabaseItemType]):
84
84
  """Base class for all items that can be stored within a database."""
85
85
 
86
- id: str = field(
87
- default_factory=lambda: str(uuid.uuid4())
88
- )
86
+ id: str = field(default_factory=lambda: str(uuid.uuid4()))
89
87
  """The unique identifier for this item."""
90
88
 
91
- item: DatabaseItemType = field(
92
- default_factory=lambda: None
93
- )
89
+ item: DatabaseItemType = field(default_factory=lambda: None)
94
90
  """The item that is stored within this database item."""
95
91
 
96
- created_at: datetime = field(
97
- default_factory=lambda: datetime.now(timezone.utc)
98
- )
92
+ created_at: datetime = field(default_factory=lambda: datetime.now(timezone.utc))
99
93
  """The timestamp when this item was created."""
100
94
 
101
- updated_at: datetime = field(
102
- default_factory=lambda: datetime.now(timezone.utc)
103
- )
95
+ updated_at: datetime = field(default_factory=lambda: datetime.now(timezone.utc))
104
96
  """The timestamp when this item was last updated."""
105
97
 
106
- ttl: Optional[int] = field(
107
- default=None
108
- )
98
+ ttl: Optional[int] = field(default=None)
109
99
  """The time to live for this item in seconds."""
110
100
 
111
- filters: DatabaseItemFilters = field(
112
- default_factory=dict
113
- )
101
+ filters: DatabaseItemFilters = field(default_factory=dict)
114
102
  """The filters that are associated with this item."""
115
-
116
- table_name: str = field(
117
- default="default"
118
- )
103
+
104
+ table_name: str = field(default="default")
119
105
  """The table/collection name where this item is stored."""
120
-
121
- score: Optional[float] = field(
122
- default=None
123
- )
106
+
107
+ score: Optional[float] = field(default=None)
124
108
  """The similarity score for this item (used in vector search results)."""
125
109
 
126
110
  def is_expired(self) -> bool:
127
111
  """Check if this item has expired based on its TTL."""
128
112
  if self.ttl is None:
129
113
  return False
130
-
114
+
131
115
  from datetime import timedelta
116
+
132
117
  expires_at = self.created_at + timedelta(seconds=self.ttl)
133
118
  return datetime.now(timezone.utc) >= expires_at
134
119
 
@@ -136,6 +121,7 @@ class DatabaseItem(Generic[DatabaseItemType]):
136
121
  """Calculate when this item will expire."""
137
122
  if self.ttl is None:
138
123
  return None
139
-
124
+
140
125
  from datetime import timedelta
141
- return self.created_at + timedelta(seconds=self.ttl)
126
+
127
+ return self.created_at + timedelta(seconds=self.ttl)
@@ -16,5 +16,6 @@ __all__ = (
16
16
 
17
17
  __getattr__ = create_getattr_importer(__all__)
18
18
 
19
+
19
20
  def __dir__() -> list[str]:
20
- return list(__all__)
21
+ return list(__all__)
@@ -153,6 +153,6 @@ def convert_to_json_schema(t: Any) -> dict:
153
153
 
154
154
 
155
155
  def convert_to_json(
156
- target : Any,
156
+ target: Any,
157
157
  ) -> str:
158
- return encode_json(target).decode()
158
+ return encode_json(target).decode()
hammad/genai/__init__.py CHANGED
@@ -3,76 +3,136 @@
3
3
  from typing import TYPE_CHECKING
4
4
  from .._internal import create_getattr_importer
5
5
 
6
+
6
7
  if TYPE_CHECKING:
7
- from .embedding_models import (
8
+ from .agents import (
9
+ Agent,
10
+ AgentEvent,
11
+ AgentResponse,
12
+ AgentStream,
13
+ AgentContext,
14
+ AgentMessages,
15
+ AgentResponseChunk,
16
+ )
17
+ from .agents.run import (
18
+ run_agent,
19
+ run_agent_iter,
20
+ async_run_agent,
21
+ async_run_agent_iter,
22
+ )
23
+ from .models.embeddings import (
24
+ Embedding,
8
25
  EmbeddingModel,
9
- EmbeddingModelRequest,
10
26
  EmbeddingModelResponse,
27
+ EmbeddingModelSettings,
11
28
  run_embedding_model,
12
- async_run_embedding_model
29
+ async_run_embedding_model,
13
30
  )
14
- from .language_models import (
31
+ from .models.language import (
15
32
  LanguageModel,
33
+ LanguageModelInstructorMode,
34
+ LanguageModelMessages,
35
+ LanguageModelName,
16
36
  LanguageModelRequest,
17
37
  LanguageModelResponse,
38
+ LanguageModelResponseChunk,
39
+ LanguageModelSettings,
40
+ LanguageModelStream,
18
41
  run_language_model,
19
42
  async_run_language_model,
20
43
  )
21
- from .rerank_models import (
22
- run_rerank_model,
23
- async_run_rerank_model,
24
- )
25
- from .multimodal_models import (
26
- run_image_generation_model,
27
- async_run_image_generation_model,
44
+ from .models.reranking import run_reranking_model, async_run_reranking_model
45
+ from .models.multimodal import (
28
46
  run_image_edit_model,
29
- async_run_image_edit_model,
47
+ run_image_generation_model,
30
48
  run_image_variation_model,
31
- async_run_image_variation_model,
32
-
33
- run_tts_model,
34
- async_run_tts_model,
35
49
  run_transcription_model,
50
+ run_tts_model,
51
+ async_run_image_edit_model,
52
+ async_run_image_generation_model,
53
+ async_run_image_variation_model,
36
54
  async_run_transcription_model,
55
+ async_run_tts_model,
56
+ )
57
+ from .types.base import (
58
+ BaseGenAIModel,
59
+ BaseGenAIModelEvent,
60
+ BaseGenAIModelResponse,
61
+ BaseGenAIModelSettings,
62
+ BaseGenAIModelStream,
63
+ )
64
+ from .types.history import History
65
+ from .types.tools import (
66
+ Tool,
67
+ define_tool,
68
+ execute_tools_from_language_model_response,
37
69
  )
38
70
 
39
71
 
40
- __all__ = (
41
- # hammad.genai.embedding_models
72
+ __all__ = [
73
+ # hammad.genai.agents.agent
74
+ "Agent",
75
+ "AgentEvent",
76
+ "AgentResponse",
77
+ "AgentStream",
78
+ "AgentContext",
79
+ "AgentMessages",
80
+ "AgentResponseChunk",
81
+ # hammad.genai.agents.run
82
+ "run_agent",
83
+ "run_agent_iter",
84
+ "async_run_agent",
85
+ "async_run_agent_iter",
86
+ # hammad.genai.models.embeddings
87
+ "Embedding",
42
88
  "EmbeddingModel",
43
- "EmbeddingModelRequest",
44
89
  "EmbeddingModelResponse",
90
+ "EmbeddingModelSettings",
45
91
  "run_embedding_model",
46
92
  "async_run_embedding_model",
47
-
48
- # hammad.genai.language_models
93
+ # hammad.genai.models.language
49
94
  "LanguageModel",
95
+ "LanguageModelInstructorMode",
96
+ "LanguageModelMessages",
97
+ "LanguageModelName",
50
98
  "LanguageModelRequest",
51
99
  "LanguageModelResponse",
100
+ "LanguageModelResponseChunk",
101
+ "LanguageModelSettings",
102
+ "LanguageModelStream",
52
103
  "run_language_model",
53
104
  "async_run_language_model",
54
-
55
- # hammad.genai.rerank_models
56
- "run_rerank_model",
57
- "async_run_rerank_model",
58
-
59
- # hammad.genai.multimodal_models
60
- "run_image_generation_model",
61
- "async_run_image_generation_model",
105
+ # hammad.genai.models.reranking
106
+ "run_reranking_model",
107
+ "async_run_reranking_model",
108
+ # hammad.genai.models.multimodal
62
109
  "run_image_edit_model",
63
- "async_run_image_edit_model",
110
+ "run_image_generation_model",
64
111
  "run_image_variation_model",
65
- "async_run_image_variation_model",
66
- "run_tts_model",
67
- "async_run_tts_model",
68
112
  "run_transcription_model",
113
+ "run_tts_model",
114
+ "async_run_image_edit_model",
115
+ "async_run_image_generation_model",
116
+ "async_run_image_variation_model",
69
117
  "async_run_transcription_model",
70
- )
118
+ "async_run_tts_model",
119
+ # hammad.genai.types.base
120
+ "BaseGenAIModel",
121
+ "BaseGenAIModelEvent",
122
+ "BaseGenAIModelResponse",
123
+ "BaseGenAIModelSettings",
124
+ "BaseGenAIModelStream",
125
+ # hammad.genai.types.history
126
+ "History",
127
+ # hammad.genai.types.tools
128
+ "Tool",
129
+ "define_tool",
130
+ "execute_tools_from_language_model_response",
131
+ ]
71
132
 
72
133
 
73
134
  __getattr__ = create_getattr_importer(__all__)
74
135
 
75
136
 
76
137
  def __dir__() -> list[str]:
77
- """Get the attributes of the genai module."""
78
- return list(__all__)
138
+ return __all__
@@ -1 +1,47 @@
1
- """hammad.genai.agents"""
1
+ """hammad.genai.agents"""
2
+
3
+ from typing import TYPE_CHECKING
4
+ from ..._internal import create_getattr_importer
5
+
6
+
7
+ if TYPE_CHECKING:
8
+ from .agent import Agent
9
+
10
+ # Types
11
+ from .types.agent_context import AgentContext
12
+ from .types.agent_event import AgentEvent
13
+ from .types.agent_hooks import HookManager, HookDecorator
14
+ from .types.agent_messages import AgentMessages
15
+ from .types.agent_response import (
16
+ AgentResponse,
17
+ _create_agent_response_from_language_model_response,
18
+ )
19
+ from .types.agent_stream import AgentStream, AgentResponseChunk
20
+
21
+
22
+ __all__ = [
23
+ # hammad.genai.agents.agent
24
+ "Agent",
25
+ # hammad.genai.agents.types.agent_context
26
+ "AgentContext",
27
+ # hammad.genai.agents.types.agent_event
28
+ "AgentEvent",
29
+ # hammad.genai.agents.types.agent_hooks
30
+ "HookManager",
31
+ "HookDecorator",
32
+ # hammad.genai.agents.types.agent_messages
33
+ "AgentMessages",
34
+ # hammad.genai.agents.types.agent_response
35
+ "AgentResponse",
36
+ "_create_agent_response_from_language_model_response",
37
+ # hammad.genai.agents.types.agent_stream
38
+ "AgentStream",
39
+ "AgentResponseChunk",
40
+ ]
41
+
42
+
43
+ __getattr__ = create_getattr_importer(__all__)
44
+
45
+
46
+ def __dir__() -> list[str]:
47
+ return __all__