unique_toolkit 0.8.19__tar.gz → 0.8.20__tar.gz

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 (114) hide show
  1. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/CHANGELOG.md +2 -0
  2. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/PKG-INFO +3 -1
  3. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/pyproject.toml +1 -1
  4. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/content/service.py +73 -0
  5. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/tools/schemas.py +1 -0
  6. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/tools/tool.py +1 -0
  7. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/tools/tool_manager.py +21 -10
  8. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/LICENSE +0 -0
  9. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/README.md +0 -0
  10. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/__init__.py +0 -0
  11. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/_common/_base_service.py +0 -0
  12. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/_common/_time_utils.py +0 -0
  13. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/_common/default_language_model.py +0 -0
  14. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/_common/exception.py +0 -0
  15. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/_common/token/image_token_counting.py +0 -0
  16. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/_common/token/token_counting.py +0 -0
  17. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/_common/validate_required_values.py +0 -0
  18. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/_common/validators.py +0 -0
  19. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/app/__init__.py +0 -0
  20. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/app/dev_util.py +0 -0
  21. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/app/init_logging.py +0 -0
  22. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/app/init_sdk.py +0 -0
  23. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/app/performance/async_tasks.py +0 -0
  24. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/app/performance/async_wrapper.py +0 -0
  25. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/app/schemas.py +0 -0
  26. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/app/unique_settings.py +0 -0
  27. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/app/verification.py +0 -0
  28. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/chat/__init__.py +0 -0
  29. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/chat/constants.py +0 -0
  30. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/chat/functions.py +0 -0
  31. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/chat/schemas.py +0 -0
  32. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/chat/service.py +0 -0
  33. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/chat/state.py +0 -0
  34. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/chat/utils.py +0 -0
  35. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/content/__init__.py +0 -0
  36. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/content/constants.py +0 -0
  37. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/content/functions.py +0 -0
  38. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/content/schemas.py +0 -0
  39. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/content/utils.py +0 -0
  40. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/debug_info_manager/debug_info_manager.py +0 -0
  41. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/embedding/__init__.py +0 -0
  42. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/embedding/constants.py +0 -0
  43. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/embedding/functions.py +0 -0
  44. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/embedding/schemas.py +0 -0
  45. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/embedding/service.py +0 -0
  46. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/embedding/utils.py +0 -0
  47. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/evals/config.py +0 -0
  48. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/evals/context_relevancy/prompts.py +0 -0
  49. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/evals/context_relevancy/schema.py +0 -0
  50. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/evals/context_relevancy/service.py +0 -0
  51. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/evals/evaluation_manager.py +0 -0
  52. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/evals/exception.py +0 -0
  53. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/evals/hallucination/constants.py +0 -0
  54. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/evals/hallucination/hallucination_evaluation.py +0 -0
  55. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/evals/hallucination/prompts.py +0 -0
  56. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/evals/hallucination/service.py +0 -0
  57. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/evals/hallucination/utils.py +0 -0
  58. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/evals/output_parser.py +0 -0
  59. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/evals/schemas.py +0 -0
  60. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/evals/tests/test_context_relevancy_service.py +0 -0
  61. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/evals/tests/test_output_parser.py +0 -0
  62. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/evaluators/__init__.py +0 -0
  63. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/evaluators/config.py +0 -0
  64. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/evaluators/constants.py +0 -0
  65. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/evaluators/context_relevancy/constants.py +0 -0
  66. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/evaluators/context_relevancy/prompts.py +0 -0
  67. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/evaluators/context_relevancy/service.py +0 -0
  68. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/evaluators/context_relevancy/utils.py +0 -0
  69. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/evaluators/exception.py +0 -0
  70. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/evaluators/hallucination/constants.py +0 -0
  71. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/evaluators/hallucination/prompts.py +0 -0
  72. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/evaluators/hallucination/service.py +0 -0
  73. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/evaluators/hallucination/utils.py +0 -0
  74. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/evaluators/output_parser.py +0 -0
  75. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/evaluators/schemas.py +0 -0
  76. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/framework_utilities/langchain/client.py +0 -0
  77. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/framework_utilities/langchain/history.py +0 -0
  78. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/framework_utilities/openai/client.py +0 -0
  79. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/framework_utilities/openai/message_builder.py +0 -0
  80. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/framework_utilities/utils.py +0 -0
  81. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/history_manager/history_construction_with_contents.py +0 -0
  82. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/history_manager/history_manager.py +0 -0
  83. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/history_manager/loop_token_reducer.py +0 -0
  84. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/history_manager/utils.py +0 -0
  85. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/language_model/__init__.py +0 -0
  86. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/language_model/builder.py +0 -0
  87. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/language_model/constants.py +0 -0
  88. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/language_model/functions.py +0 -0
  89. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/language_model/infos.py +0 -0
  90. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/language_model/prompt.py +0 -0
  91. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/language_model/reference.py +0 -0
  92. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/language_model/schemas.py +0 -0
  93. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/language_model/service.py +0 -0
  94. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/language_model/utils.py +0 -0
  95. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/postprocessor/postprocessor_manager.py +0 -0
  96. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/protocols/support.py +0 -0
  97. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/reference_manager/reference_manager.py +0 -0
  98. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/short_term_memory/__init__.py +0 -0
  99. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/short_term_memory/constants.py +0 -0
  100. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/short_term_memory/functions.py +0 -0
  101. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/short_term_memory/persistent_short_term_memory_manager.py +0 -0
  102. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/short_term_memory/schemas.py +0 -0
  103. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/short_term_memory/service.py +0 -0
  104. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/smart_rules/__init__.py +0 -0
  105. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/smart_rules/compile.py +0 -0
  106. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/thinking_manager/thinking_manager.py +0 -0
  107. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/tools/config.py +0 -0
  108. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/tools/factory.py +0 -0
  109. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/tools/test/test_tool_progress_reporter.py +0 -0
  110. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/tools/tool_progress_reporter.py +0 -0
  111. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/tools/utils/execution/execution.py +0 -0
  112. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/tools/utils/source_handling/schema.py +0 -0
  113. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/tools/utils/source_handling/source_formatting.py +0 -0
  114. {unique_toolkit-0.8.19 → unique_toolkit-0.8.20}/unique_toolkit/tools/utils/source_handling/tests/test_source_formatting.py +0 -0
@@ -5,6 +5,8 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [0.8.20] - 2025-08-24
9
+ - Fixed forced-tool-calls
8
10
 
9
11
  ## [0.8.19] - 2025-08-24
10
12
  - Enforce usage of ruff using pipeline
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: unique_toolkit
3
- Version: 0.8.19
3
+ Version: 0.8.20
4
4
  Summary:
5
5
  License: Proprietary
6
6
  Author: Martin Fadler
@@ -114,6 +114,8 @@ All notable changes to this project will be documented in this file.
114
114
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
115
115
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
116
116
 
117
+ ## [0.8.20] - 2025-08-24
118
+ - Fixed forced-tool-calls
117
119
 
118
120
  ## [0.8.19] - 2025-08-24
119
121
  - Enforce usage of ruff using pipeline
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "unique_toolkit"
3
- version = "0.8.19"
3
+ version = "0.8.20"
4
4
  description = ""
5
5
  authors = [
6
6
  "Martin Fadler <martin.fadler@unique.ch>",
@@ -1,4 +1,6 @@
1
1
  import logging
2
+ import mimetypes
3
+ from enum import StrEnum
2
4
  from pathlib import Path
3
5
  from typing import Any, overload
4
6
 
@@ -33,6 +35,29 @@ from unique_toolkit.content.schemas import (
33
35
  logger = logging.getLogger(f"toolkit.{DOMAIN_NAME}.{__name__}")
34
36
 
35
37
 
38
+ class FileMimeType(StrEnum):
39
+ PDF = "application/pdf"
40
+ DOCX = "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
41
+ DOC = "application/msword"
42
+ XLSX = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
43
+ XLS = "application/vnd.ms-excel"
44
+ PPTX = "application/vnd.openxmlformats-officedocument.presentationml.presentation"
45
+ CSV = "text/csv"
46
+ HTML = "text/html"
47
+ MD = "text/markdown"
48
+ TXT = "text/plain"
49
+
50
+
51
+ class ImageMimeType(StrEnum):
52
+ JPEG = "image/jpeg"
53
+ PNG = "image/png"
54
+ GIF = "image/gif"
55
+ BMP = "image/bmp"
56
+ WEBP = "image/webp"
57
+ TIFF = "image/tiff"
58
+ SVG = "image/svg+xml"
59
+
60
+
36
61
  class ContentService:
37
62
  """
38
63
  Provides methods for searching, downloading and uploading content in the knowledge base.
@@ -622,3 +647,51 @@ class ContentService:
622
647
  content_id=content_id,
623
648
  chat_id=chat_id,
624
649
  )
650
+
651
+ def get_documents_uploaded_to_chat(self) -> list[Content]:
652
+ chat_contents = self.search_contents(
653
+ where={
654
+ "ownerId": {
655
+ "equals": self._chat_id,
656
+ },
657
+ },
658
+ )
659
+
660
+ content: list[Content] = []
661
+ for c in chat_contents:
662
+ if self.is_file_content(c.key):
663
+ content.append(c)
664
+
665
+ return content
666
+
667
+ def get_images_uploaded_to_chat(self) -> list[Content]:
668
+ chat_contents = self.search_contents(
669
+ where={
670
+ "ownerId": {
671
+ "equals": self._chat_id,
672
+ },
673
+ },
674
+ )
675
+
676
+ content: list[Content] = []
677
+ for c in chat_contents:
678
+ if self.is_image_content(c.key):
679
+ content.append(c)
680
+
681
+ return content
682
+
683
+ def is_file_content(self, filename: str) -> bool:
684
+ mimetype, _ = mimetypes.guess_type(filename)
685
+
686
+ if not mimetype:
687
+ return False
688
+
689
+ return mimetype in FileMimeType.__members__.values()
690
+
691
+ def is_image_content(self, filename: str) -> bool:
692
+ mimetype, _ = mimetypes.guess_type(filename)
693
+
694
+ if not mimetype:
695
+ return False
696
+
697
+ return mimetype in ImageMimeType.__members__.values()
@@ -132,6 +132,7 @@ class Source(BaseModel):
132
132
  class ToolPrompts(BaseModel):
133
133
  name: str
134
134
  display_name: str
135
+ tool_system_prompt: str
135
136
  tool_description: str
136
137
  tool_format_information_for_system_prompt: str
137
138
  input_model: dict[str, Any]
@@ -109,6 +109,7 @@ class Tool(ABC, Generic[ConfigType]):
109
109
  name=self.name,
110
110
  display_name=self.display_name(),
111
111
  tool_description=self.tool_description().description,
112
+ tool_system_prompt=self.tool_description_for_system_prompt(),
112
113
  tool_format_information_for_system_prompt=self.tool_format_information_for_system_prompt(),
113
114
  input_model=self.tool_description_as_json(),
114
115
  )
@@ -1,5 +1,6 @@
1
1
  import asyncio
2
2
  from logging import Logger, getLogger
3
+ from typing import Any
3
4
 
4
5
  from pydantic import BaseModel, Field
5
6
 
@@ -18,13 +19,6 @@ from unique_toolkit.tools.tool_progress_reporter import ToolProgressReporter
18
19
  from unique_toolkit.tools.utils.execution.execution import Result, SafeTaskExecutor
19
20
 
20
21
 
21
- class ForcedToolOption:
22
- type: str = "function"
23
-
24
- def __init__(self, name: str):
25
- self.name = name
26
-
27
-
28
22
  class ToolManagerConfig(BaseModel):
29
23
  tools: list[ToolBuildConfig] = Field(
30
24
  default=[],
@@ -122,13 +116,20 @@ class ToolManager:
122
116
  return tool
123
117
  return None
124
118
 
125
- def get_forced_tools(self) -> list[ForcedToolOption]:
119
+ def get_forced_tools(self) -> list[dict[str, Any]]:
126
120
  return [
127
- ForcedToolOption(t.name)
121
+ self._convert_to_forced_tool(t.name)
128
122
  for t in self._tools
129
123
  if t.name in self._tool_choices
130
124
  ]
131
125
 
126
+ def add_forced_tool(self, name):
127
+ tool = self.get_tool_by_name(name)
128
+ if not tool:
129
+ raise ValueError(f"Tool {name} not found")
130
+ self._tools.append(tool)
131
+ self._tool_choices.append(tool.name)
132
+
132
133
  def get_tool_definitions(
133
134
  self,
134
135
  ) -> list[LanguageModelTool | LanguageModelToolDescription]:
@@ -198,7 +199,9 @@ class ToolManager:
198
199
  ) -> ToolCallResponse:
199
200
  self._logger.info(f"Processing tool call: {tool_call.name}")
200
201
 
201
- tool_instance = self.get_tool_by_name(tool_call.name)
202
+ tool_instance = self.get_tool_by_name(
203
+ tool_call.name
204
+ ) # we need to copy this as it will have problematic interference on multi calls.
202
205
 
203
206
  if tool_instance:
204
207
  # Execute the tool
@@ -254,3 +257,11 @@ class ToolManager:
254
257
  f"Filtered out {len(tool_calls) - len(unique_tool_calls)} duplicate tool calls."
255
258
  )
256
259
  return unique_tool_calls
260
+
261
+ from typing import Any
262
+
263
+ def _convert_to_forced_tool(self, tool_name: str) -> dict[str, Any]:
264
+ return {
265
+ "type": "function",
266
+ "function": {"name": tool_name},
267
+ }
File without changes