osbot-utils 2.37.0__py3-none-any.whl → 2.38.0__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.
@@ -10,7 +10,7 @@ class LLM_Request__Execute(Type_Safe):
10
10
  llm_cache : LLM_Request__Cache
11
11
  llm_api : API__LLM__Open_AI
12
12
  use_cache : bool = True
13
- request_builder: LLM_Request__Builder
13
+ request_builder: LLM_Request__Builder # todo: fix the use of LLM_Request__Builder since it not good when we when overwrite it at self.request_builder.llm_request_data = llm_request.request_data
14
14
 
15
15
  @type_safe
16
16
  def execute(self, llm_request: Schema__LLM_Request) -> Schema__LLM_Response:
@@ -1,10 +1,11 @@
1
1
  from typing import Dict, Any, Type
2
2
  from osbot_utils.helpers.llms.actions.Type_Safe__Schema_For__LLMs import Type_Safe__Schema_For__LLMs
3
+ from osbot_utils.helpers.llms.schemas.Schema__LLM_Request import Schema__LLM_Request
3
4
  from osbot_utils.helpers.llms.schemas.Schema__LLM_Request__Data import Schema__LLM_Request__Data
4
5
  from osbot_utils.helpers.llms.schemas.Schema__LLM_Request__Function_Call import Schema__LLM_Request__Function_Call
5
6
  from osbot_utils.helpers.llms.schemas.Schema__LLM_Request__Message__Content import Schema__LLM_Request__Message__Content
6
7
  from osbot_utils.helpers.llms.schemas.Schema__LLM_Request__Message__Role import Schema__LLM_Request__Message__Role
7
- from osbot_utils.helpers.safe_str.Safe_Str__Text import Safe_Str__Text
8
+ from osbot_utils.helpers.safe_str.Safe_Str__Text import Safe_Str__Text
8
9
  from osbot_utils.type_safe.Type_Safe import Type_Safe
9
10
  from osbot_utils.type_safe.decorators.type_safe import type_safe
10
11
 
@@ -25,6 +26,9 @@ class LLM_Request__Builder(Type_Safe):
25
26
  def add_message__system (self, content : str = None): return self.add_message(role=Schema__LLM_Request__Message__Role.SYSTEM , content=content)
26
27
  def add_message__user (self, content : str = None): return self.add_message(role=Schema__LLM_Request__Message__Role.USER , content=content)
27
28
 
29
+ def llm_request(self) -> Schema__LLM_Request:
30
+ return Schema__LLM_Request(request_data=self.llm_request_data)
31
+
28
32
  @type_safe
29
33
  def set__function_call(self, parameters : Type[Type_Safe],
30
34
  function_name : str,
@@ -10,7 +10,7 @@ class LLM_Request__Builder__Open_AI(LLM_Request__Builder):
10
10
  "messages" : [{"role" : msg.role.value, "content": msg.content} for msg in self.llm_request_data.messages]}
11
11
  if self.llm_request_data.function_call:
12
12
  schema = self.schema_generator.export(self.llm_request_data.function_call.parameters)
13
- schema["additionalProperties"] = False # needs to be False when using structured outputs
13
+ self.add_additional_properties_to_schema(schema)
14
14
  payload["response_format" ] = { "type" : "json_schema",
15
15
  "json_schema": { "name" : self.llm_request_data.function_call.function_name,
16
16
  "schema": schema ,
@@ -22,6 +22,18 @@ class LLM_Request__Builder__Open_AI(LLM_Request__Builder):
22
22
 
23
23
  return payload
24
24
 
25
+ def add_additional_properties_to_schema(self, schema: dict) -> dict: # Recursively ensures every nested object in the schema has "additionalProperties": False.
26
+ if schema.get("type") == "object":
27
+ schema["additionalProperties"] = False
28
+ for prop_schema in schema.get("properties", {}).values():
29
+ self.add_additional_properties_to_schema(prop_schema)
30
+
31
+ elif schema.get("type") == "array":
32
+ items_schema = schema.get("items", {})
33
+ self.add_additional_properties_to_schema(items_schema)
34
+
35
+ return schema
36
+
25
37
  # @type_safe
26
38
  # def build_request_with_json_mode(self, request: Schema__LLM_Request
27
39
  # ) -> Dict[str, Any]:
@@ -1,5 +1,6 @@
1
- from osbot_utils.type_safe.shared.Type_Safe__Cache import type_safe_cache
2
- from osbot_utils.utils.Objects import base_classes_names
1
+ from typing import get_args
2
+ from osbot_utils.type_safe.shared.Type_Safe__Cache import type_safe_cache
3
+ from osbot_utils.utils.Objects import base_classes_names
3
4
 
4
5
 
5
6
  class Type_Safe__Convert:
@@ -9,6 +10,10 @@ class Type_Safe__Convert:
9
10
  obj_annotations = target.__annotations__
10
11
  if hasattr(obj_annotations,'get'):
11
12
  attribute_annotation = obj_annotations.get(attr_name)
13
+ args = get_args(attribute_annotation)
14
+ if len(args) == 2 and args[1] is type(None): # todo: find a better way to do this, since this is handling an edge case when origin_attr_type is Optional (which is an shorthand for Union[X, None] )
15
+ attribute_annotation = args[0]
16
+
12
17
  if 'Type_Safe' in base_classes_names(attribute_annotation):
13
18
  return attribute_annotation(**value)
14
19
  return value
osbot_utils/version CHANGED
@@ -1 +1 @@
1
- v2.37.0
1
+ v2.38.0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: osbot_utils
3
- Version: 2.37.0
3
+ Version: 2.38.0
4
4
  Summary: OWASP Security Bot - Utils
5
5
  License: MIT
6
6
  Author: Dinis Cruz
@@ -23,7 +23,7 @@ Description-Content-Type: text/markdown
23
23
 
24
24
  Powerful Python util methods and classes that simplify common apis and tasks.
25
25
 
26
- ![Current Release](https://img.shields.io/badge/release-v2.37.0-blue)
26
+ ![Current Release](https://img.shields.io/badge/release-v2.38.0-blue)
27
27
  [![codecov](https://codecov.io/gh/owasp-sbot/OSBot-Utils/graph/badge.svg?token=GNVW0COX1N)](https://codecov.io/gh/owasp-sbot/OSBot-Utils)
28
28
 
29
29
 
@@ -190,11 +190,11 @@ osbot_utils/helpers/html/Tag__Link.py,sha256=rQ-gZN8EkSv5x1S-smdjvFflwMQHACHQXiO
190
190
  osbot_utils/helpers/html/Tag__Style.py,sha256=LPPlIN7GyMvfCUlbs2eXVMUr9jS0PX5M94A5Ig_jXIs,846
191
191
  osbot_utils/helpers/html/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
192
192
  osbot_utils/helpers/llms/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
193
- osbot_utils/helpers/llms/actions/LLM_Request__Execute.py,sha256=JljneiEJ1ETlCBaH4cmd-bwIlIq_kFi2n2TD1bVGugU,1821
193
+ osbot_utils/helpers/llms/actions/LLM_Request__Execute.py,sha256=vR_7ManwTSyUOIF_eJK3sft1wBVadaGHkZOzspVc7T4,1987
194
194
  osbot_utils/helpers/llms/actions/Type_Safe__Schema_For__LLMs.py,sha256=em9RoSZqSSo6BQBZvEKH8Qv8f8f8oubNpy0LIDsak-E,12024
195
195
  osbot_utils/helpers/llms/actions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
196
- osbot_utils/helpers/llms/builders/LLM_Request__Builder.py,sha256=tfld-1hcjIH2e2qapXGAu2gq9E0k2NswPn5LRKzWfVA,3133
197
- osbot_utils/helpers/llms/builders/LLM_Request__Builder__Open_AI.py,sha256=7CUnNyGqyiD0-jX0pESQJichjx_0ttMmhO7OmqZWHl4,2918
196
+ osbot_utils/helpers/llms/builders/LLM_Request__Builder.py,sha256=c8MN66ijFn9DugbBIGmG0bm9ujS-0kvZDGqJcZsHHYc,3385
197
+ osbot_utils/helpers/llms/builders/LLM_Request__Builder__Open_AI.py,sha256=JwyPDeBUQd70Ltm801y5qvS883IIC7TcfG04D3LWdGI,3430
198
198
  osbot_utils/helpers/llms/builders/LLM_Request__Factory.py,sha256=bpFXVTKpalBL7ZONjaHU5c0-2Rwzzd2vgdD1FpYxfGw,6291
199
199
  osbot_utils/helpers/llms/builders/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
200
200
  osbot_utils/helpers/llms/cache/LLM_Cache__Path_Generator.py,sha256=7kDY-aaUWR4Da6lj5RPwjqTLUTGrOUYhbNfOPM30e40,4442
@@ -351,7 +351,7 @@ osbot_utils/type_safe/methods/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5N
351
351
  osbot_utils/type_safe/methods/type_safe_property.py,sha256=DcJkOIs6swJtkglsZVKLyFSczCGSJISOVwAmvjCOQvo,1425
352
352
  osbot_utils/type_safe/shared/Type_Safe__Annotations.py,sha256=nmVqCbhk4kUYrw_mdYqugxQlv4gM3NUUH89FYTHUg-c,1133
353
353
  osbot_utils/type_safe/shared/Type_Safe__Cache.py,sha256=G03pmpds9sTwU5z5pNLssD_GTvVSIR11nGYbkV5KaiY,7913
354
- osbot_utils/type_safe/shared/Type_Safe__Convert.py,sha256=zvaorttNKZsFUgJE9R0_x34sbY6CGppP45z2KGaVcVg,2421
354
+ osbot_utils/type_safe/shared/Type_Safe__Convert.py,sha256=q1ds7AqgNhZX1pW0SNq_VNWIudfJWHGY60oYvd3YWlo,2849
355
355
  osbot_utils/type_safe/shared/Type_Safe__Json_Compressor.py,sha256=TDbot_NNzCPXBQv0l5mksWueJNfxlVFDBGxIH8Jf_XY,5426
356
356
  osbot_utils/type_safe/shared/Type_Safe__Json_Compressor__Type_Registry.py,sha256=wYOCg7F1nTrRn8HlnZvrs_8A8WL4gxRYRLnXZpGIiuk,1119
357
357
  osbot_utils/type_safe/shared/Type_Safe__Not_Cached.py,sha256=25FAl6SOLxdStco_rm9tgOYLfuKyBWheGdl7vVa56UU,800
@@ -398,8 +398,8 @@ osbot_utils/utils/Toml.py,sha256=Rxl8gx7mni5CvBAK-Ai02EKw-GwtJdd3yeHT2kMloik,166
398
398
  osbot_utils/utils/Version.py,sha256=Ww6ChwTxqp1QAcxOnztkTicShlcx6fbNsWX5xausHrg,422
399
399
  osbot_utils/utils/Zip.py,sha256=pR6sKliUY0KZXmqNzKY2frfW-YVQEVbLKiyqQX_lc-8,14052
400
400
  osbot_utils/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
401
- osbot_utils/version,sha256=-HYKMJJj0R7l-Xfl9YKo2VaYfZDmtHwPvDLtL8vC6pw,8
402
- osbot_utils-2.37.0.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
403
- osbot_utils-2.37.0.dist-info/METADATA,sha256=wGNRK7yAwPpR8l9L2u5kjrFc33T2tq_g4BtuF_n8UMg,1329
404
- osbot_utils-2.37.0.dist-info/WHEEL,sha256=XbeZDeTWKc1w7CSIyre5aMDU_-PohRwTQceYnisIYYY,88
405
- osbot_utils-2.37.0.dist-info/RECORD,,
401
+ osbot_utils/version,sha256=5wV6C9vRtevBlgAl6UzZ00kufvcHsbgatM8FaiKy5Us,8
402
+ osbot_utils-2.38.0.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
403
+ osbot_utils-2.38.0.dist-info/METADATA,sha256=1oshM3ZIVLYEZhR_CgTKhCw7m2wWz62PvYqgCgLm22A,1329
404
+ osbot_utils-2.38.0.dist-info/WHEEL,sha256=XbeZDeTWKc1w7CSIyre5aMDU_-PohRwTQceYnisIYYY,88
405
+ osbot_utils-2.38.0.dist-info/RECORD,,