unique_toolkit 1.42.8__py3-none-any.whl → 1.43.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.
Files changed (33) hide show
  1. unique_toolkit/_common/experimental/write_up_agent/README.md +848 -0
  2. unique_toolkit/_common/experimental/write_up_agent/__init__.py +22 -0
  3. unique_toolkit/_common/experimental/write_up_agent/agent.py +170 -0
  4. unique_toolkit/_common/experimental/write_up_agent/config.py +42 -0
  5. unique_toolkit/_common/experimental/write_up_agent/examples/data.csv +13 -0
  6. unique_toolkit/_common/experimental/write_up_agent/examples/example_usage.py +78 -0
  7. unique_toolkit/_common/experimental/write_up_agent/examples/report.md +154 -0
  8. unique_toolkit/_common/experimental/write_up_agent/schemas.py +36 -0
  9. unique_toolkit/_common/experimental/write_up_agent/services/__init__.py +13 -0
  10. unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/__init__.py +19 -0
  11. unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/exceptions.py +29 -0
  12. unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/service.py +150 -0
  13. unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/utils.py +130 -0
  14. unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/__init__.py +27 -0
  15. unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/config.py +56 -0
  16. unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/exceptions.py +79 -0
  17. unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/prompts/config.py +34 -0
  18. unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/prompts/system_prompt.j2 +15 -0
  19. unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/prompts/user_prompt.j2 +21 -0
  20. unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/service.py +369 -0
  21. unique_toolkit/_common/experimental/write_up_agent/services/template_handler/__init__.py +29 -0
  22. unique_toolkit/_common/experimental/write_up_agent/services/template_handler/default_template.j2 +37 -0
  23. unique_toolkit/_common/experimental/write_up_agent/services/template_handler/exceptions.py +39 -0
  24. unique_toolkit/_common/experimental/write_up_agent/services/template_handler/service.py +191 -0
  25. unique_toolkit/_common/experimental/write_up_agent/services/template_handler/utils.py +182 -0
  26. unique_toolkit/_common/experimental/write_up_agent/utils.py +24 -0
  27. unique_toolkit/agentic/feature_flags/__init__.py +6 -0
  28. unique_toolkit/agentic/feature_flags/feature_flags.py +32 -0
  29. unique_toolkit/agentic/message_log_manager/service.py +88 -12
  30. {unique_toolkit-1.42.8.dist-info → unique_toolkit-1.43.0.dist-info}/METADATA +7 -1
  31. {unique_toolkit-1.42.8.dist-info → unique_toolkit-1.43.0.dist-info}/RECORD +33 -5
  32. {unique_toolkit-1.42.8.dist-info → unique_toolkit-1.43.0.dist-info}/LICENSE +0 -0
  33. {unique_toolkit-1.42.8.dist-info → unique_toolkit-1.43.0.dist-info}/WHEEL +0 -0
@@ -0,0 +1,182 @@
1
+ """Template utilities."""
2
+
3
+ from jinja2 import Environment
4
+ from jinja2.nodes import For, Getattr, Name
5
+ from pydantic import BaseModel
6
+
7
+
8
+ class TemplateStructureInfo(BaseModel):
9
+ """Information about the structure expected by a Jinja template.
10
+
11
+ Attributes:
12
+ grouping_columns: List of column names detected from {{ group.column }} patterns
13
+ row_columns: List of column names detected from {{ row.column }} patterns
14
+ expects_groups: True if template iterates over 'groups' variable
15
+ expects_rows: True if template iterates over 'rows' variable
16
+ """
17
+
18
+ grouping_columns: list[str]
19
+ row_columns: list[str]
20
+ expects_groups: bool
21
+ expects_rows: bool
22
+
23
+
24
+ # TODO [UN-16142]: Simplify template logic
25
+ def parse_template(template_str: str) -> TemplateStructureInfo:
26
+ """
27
+ Parse a Jinja template to extract structure information.
28
+
29
+ The parser detects:
30
+ - {% for X in groups %} → expects_groups = True, X becomes the group variable
31
+ - {{ X.column_name }} → grouping_columns contains 'column_name' (excluding 'rows', 'instructions')
32
+ - {% for Y in rows %} or {% for Y in X.rows %} → expects_rows = True
33
+ - {{ row.column_name }} → row_columns contains 'column_name'
34
+
35
+ Args:
36
+ template_str: Jinja template string to parse
37
+
38
+ Returns:
39
+ TemplateStructureInfo with detected structure
40
+
41
+ Raises:
42
+ Exception: If template parsing fails
43
+
44
+ Example:
45
+ >>> template = '''
46
+ ... {% for g in groups %}
47
+ ... Region: {{ g.region }}
48
+ ... {% for row in g.rows %}
49
+ ... - {{ row.product }}: ${{ row.price }}
50
+ ... {% endfor %}
51
+ ... {% endfor %}
52
+ ... '''
53
+ >>> info = parse_template(template)
54
+ >>> info.grouping_columns
55
+ ['region']
56
+ >>> info.row_columns
57
+ ['product', 'price']
58
+ >>> info.expects_groups
59
+ True
60
+ """
61
+ env = Environment()
62
+
63
+ try:
64
+ ast = env.parse(template_str)
65
+ except Exception as e:
66
+ raise ValueError(f"Failed to parse Jinja template: {e}") from e
67
+
68
+ # First, find what variable name is used for groups iteration
69
+ # e.g., {% for g in groups %} -> group_var = 'g'
70
+ group_var = None
71
+ for node in ast.find_all(For):
72
+ if isinstance(node.iter, Name) and node.iter.name == "groups":
73
+ if isinstance(node.target, Name):
74
+ group_var = node.target.name
75
+ break
76
+
77
+ # Detect if template expects 'groups' and 'rows' loops
78
+ expects_groups = _check_for_loop_variable(ast, "groups")
79
+ expects_rows = _check_for_loop_variable(ast, "rows")
80
+
81
+ # Extract column references
82
+ # For grouping columns, use the group variable name (e.g., 'g', 'group', etc.)
83
+ if group_var:
84
+ grouping_columns_raw = _extract_attribute_references(ast, group_var)
85
+ # Filter out special attributes that are not DataFrame grouping columns:
86
+ # - 'rows': structural template variable for row data
87
+ # - 'llm_response': reserved for LLM-generated summaries
88
+ # - 'instructions': structural template variable for group-specific instructions
89
+ # - anything starting with '_': internal/computed variables
90
+ grouping_columns = sorted(
91
+ [
92
+ col
93
+ for col in grouping_columns_raw
94
+ if col not in ["rows", "llm_response", "instructions"]
95
+ and not col.startswith("_")
96
+ ]
97
+ )
98
+ else:
99
+ # Fallback to 'group' if no explicit group var found
100
+ grouping_columns = sorted(list(_extract_attribute_references(ast, "group")))
101
+ grouping_columns = sorted(
102
+ [
103
+ col
104
+ for col in grouping_columns
105
+ if col not in ["rows", "llm_response", "instructions"]
106
+ and not col.startswith("_")
107
+ ]
108
+ )
109
+
110
+ row_columns = sorted(list(_extract_attribute_references(ast, "row")))
111
+
112
+ return TemplateStructureInfo(
113
+ grouping_columns=grouping_columns,
114
+ row_columns=row_columns,
115
+ expects_groups=expects_groups,
116
+ expects_rows=expects_rows,
117
+ )
118
+
119
+
120
+ def _extract_attribute_references(node, target_var: str) -> set[str]:
121
+ """
122
+ Recursively extract attribute references for a specific variable.
123
+
124
+ For example, if target_var='group', this extracts:
125
+ - 'region' from {{ group.region }}
126
+ - 'region' from {{ group.group.region }} (nested access)
127
+
128
+ Args:
129
+ node: Jinja2 AST node to traverse
130
+ target_var: Variable name to look for (e.g., 'group', 'row')
131
+
132
+ Returns:
133
+ Set of attribute names referenced on the target variable
134
+ """
135
+ attributes = set()
136
+
137
+ if isinstance(node, Getattr):
138
+ # Check if this is an attribute access on our target variable
139
+ if isinstance(node.node, Name) and node.node.name == target_var:
140
+ attributes.add(node.attr)
141
+ # Handle nested attributes like group.group.section
142
+ # If node.node is also Getattr, check if it eventually resolves to target_var
143
+ elif isinstance(node.node, Getattr):
144
+ # Recursively extract from nested getattr
145
+ nested_attrs = _extract_attribute_references(node.node, target_var)
146
+ if nested_attrs:
147
+ # If the nested part references our target, add this attr too
148
+ attributes.add(node.attr)
149
+ # Recursively check the node being accessed
150
+ attributes.update(_extract_attribute_references(node.node, target_var))
151
+
152
+ # Process all child nodes
153
+ for child in node.iter_child_nodes():
154
+ attributes.update(_extract_attribute_references(child, target_var))
155
+
156
+ return attributes
157
+
158
+
159
+ def _check_for_loop_variable(node, loop_var: str) -> bool:
160
+ """
161
+ Check if a for-loop iterates over a specific variable.
162
+
163
+ For example, checks if template contains {% for X in groups %}.
164
+
165
+ Args:
166
+ node: Jinja2 AST node to traverse
167
+ loop_var: Variable name to look for (e.g., 'groups', 'rows')
168
+
169
+ Returns:
170
+ True if a for-loop over the variable is found
171
+ """
172
+ if isinstance(node, For):
173
+ # Check if this for-loop iterates over our target variable
174
+ if isinstance(node.iter, Name) and node.iter.name == loop_var:
175
+ return True
176
+
177
+ # Recursively check child nodes
178
+ for child in node.iter_child_nodes():
179
+ if _check_for_loop_variable(child, loop_var):
180
+ return True
181
+
182
+ return False
@@ -0,0 +1,24 @@
1
+ from pathlib import Path
2
+
3
+
4
+ def template_loader(parent_dir: Path, template_name: str) -> str:
5
+ """
6
+ Load a Jinja2 template file from the filesystem.
7
+
8
+ Args:
9
+ parent_dir: Path object pointing to the directory containing the template
10
+ template_name: Name of the template file to load (e.g., 'template.j2')
11
+
12
+ Returns:
13
+ Template content as a string
14
+
15
+ Raises:
16
+ FileNotFoundError: If the template file does not exist
17
+ IOError: If there's an error reading the template file
18
+
19
+ Example:
20
+ >>> from pathlib import Path
21
+ >>> template = template_loader(Path(__file__).parent, "my_template.j2")
22
+ """
23
+ template_path = parent_dir / template_name
24
+ return template_path.read_text()
@@ -0,0 +1,6 @@
1
+ from unique_toolkit.agentic.feature_flags.feature_flags import (
2
+ FeatureFlags,
3
+ feature_flags,
4
+ )
5
+
6
+ __all__ = ["FeatureFlags", "feature_flags"]
@@ -0,0 +1,32 @@
1
+ from pydantic import Field
2
+ from pydantic_settings import BaseSettings, SettingsConfigDict
3
+
4
+
5
+ class FeatureFlags(BaseSettings):
6
+ """Feature flags loaded from environment variables.
7
+
8
+ Environment variables are automatically loaded based on field names.
9
+ For example, `feature_flag_enable_new_answers_ui_un_14411` will be loaded from
10
+ `FEATURE_FLAG_ENABLE_NEW_ANSWERS_UI_UN_14411`.
11
+ """
12
+
13
+ feature_flag_enable_new_answers_ui_un_14411: str = Field(
14
+ default="",
15
+ description="Enable new answers UI (UN-14411). Can be 'true' or comma-separated company IDs.",
16
+ )
17
+
18
+ model_config = SettingsConfigDict(
19
+ extra="ignore",
20
+ case_sensitive=False,
21
+ )
22
+
23
+ def is_new_answers_ui_enabled(self, company_id: str | None = None) -> bool:
24
+ """Check if new answers UI is enabled for the given company."""
25
+ value = self.feature_flag_enable_new_answers_ui_un_14411
26
+ return value.lower() == "true" or bool(
27
+ company_id and company_id in [id.strip() for id in value.split(",")]
28
+ )
29
+
30
+
31
+ # Initialize once at module load - import this where needed
32
+ feature_flags = FeatureFlags()
@@ -8,6 +8,7 @@ from collections import defaultdict
8
8
  from logging import getLogger
9
9
 
10
10
  from unique_toolkit.chat.schemas import (
11
+ MessageLog,
11
12
  MessageLogDetails,
12
13
  MessageLogStatus,
13
14
  MessageLogUncitedReferences,
@@ -61,29 +62,23 @@ class MessageStepLogger:
61
62
  self,
62
63
  *,
63
64
  text: str,
65
+ status: MessageLogStatus = MessageLogStatus.COMPLETED,
64
66
  details: MessageLogDetails | None = None,
65
- references: list[ContentReference],
66
- ) -> None:
67
+ references: list[ContentReference] = [],
68
+ ) -> MessageLog | None:
67
69
  """
68
70
  Create a full message log entry with question, hits, and references.
69
-
70
- Args:
71
- text: The prepared string for the message log entry
72
- details: Some formal details about the message log entry
73
- references: List of ContentReference objects to reference
71
+ The created message log entry is returned. If the message log entry is not created, None is returned.
74
72
  """
75
-
76
- # Creating a new message log entry with the found hits.
77
73
  if not self._chat_service._assistant_message_id:
78
74
  _LOGGER.warning(
79
75
  "Assistant message id is not set. Skipping message log entry creation."
80
76
  )
81
77
  return
82
-
83
- _ = self._chat_service.create_message_log(
78
+ return self._chat_service.create_message_log(
84
79
  message_id=self._chat_service._assistant_message_id,
85
80
  text=text,
86
- status=MessageLogStatus.COMPLETED,
81
+ status=status,
87
82
  order=self._get_next_message_order(
88
83
  message_id=self._chat_service._assistant_message_id
89
84
  ),
@@ -91,3 +86,84 @@ class MessageStepLogger:
91
86
  uncited_references=MessageLogUncitedReferences(data=references),
92
87
  references=[],
93
88
  )
89
+
90
+ def update_message_log_entry(
91
+ self,
92
+ *,
93
+ message_log: MessageLog,
94
+ text: str | None = None,
95
+ status: MessageLogStatus,
96
+ details: MessageLogDetails | None = None,
97
+ references: list[ContentReference] = [],
98
+ ) -> MessageLog:
99
+ """
100
+ Update a message log entry with a new status.
101
+ The updated message log entry is returned. If the message log entry is not updated, None is returned.
102
+ """
103
+ if message_log.message_log_id is None:
104
+ _LOGGER.warning(
105
+ "Message log id is not set. Skipping message log entry update."
106
+ )
107
+ return message_log
108
+ return self._chat_service.update_message_log(
109
+ message_log_id=message_log.message_log_id,
110
+ order=message_log.order,
111
+ text=text,
112
+ status=status,
113
+ details=details or MessageLogDetails(data=[]),
114
+ uncited_references=MessageLogUncitedReferences(data=references),
115
+ references=[],
116
+ )
117
+
118
+ def create_or_update_message_log(
119
+ self,
120
+ *,
121
+ active_message_log: MessageLog | None,
122
+ header: str,
123
+ progress_message: str | None = None,
124
+ status: MessageLogStatus = MessageLogStatus.RUNNING,
125
+ details: MessageLogDetails | None = None,
126
+ references: list[ContentReference] | None = [],
127
+ ) -> MessageLog | None:
128
+ """
129
+ Create a new message log entry or update an existing one.
130
+
131
+ This is a convenience method that handles the common pattern of:
132
+ - Creating a new message log if active_message_log is None
133
+ - Updating the existing message log otherwise
134
+
135
+ Args:
136
+ active_message_log: The current active message log, or None if none exists
137
+ header: The header to show in bold (e.g., "Internal Search", "Web Search")
138
+ progress_message: Optional progress message to append after the display name
139
+ status: The status of the message log
140
+ details: Optional message log details
141
+ references: Optional list of content references
142
+
143
+ Returns:
144
+ The created or updated MessageLog, or None if the operation failed
145
+ """
146
+ text = (
147
+ f"**{header}**\n{progress_message}"
148
+ if progress_message is not None
149
+ else f"**{header}**"
150
+ )
151
+
152
+ if references is None:
153
+ references = []
154
+
155
+ if active_message_log is None:
156
+ return self.create_message_log_entry(
157
+ text=text,
158
+ details=details,
159
+ references=references,
160
+ status=status,
161
+ )
162
+ else:
163
+ return self.update_message_log_entry(
164
+ message_log=active_message_log,
165
+ text=text,
166
+ status=status,
167
+ details=details,
168
+ references=references,
169
+ )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: unique_toolkit
3
- Version: 1.42.8
3
+ Version: 1.43.0
4
4
  Summary:
5
5
  License: Proprietary
6
6
  Author: Cedric Klinkert
@@ -124,6 +124,12 @@ All notable changes to this project will be documented in this file.
124
124
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
125
125
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
126
126
 
127
+ ## [1.43.0] - 2026-01-11
128
+ - Add `WriteUpAgent` as an experimental service
129
+
130
+ ## [1.42.9] - 2026-01-11
131
+ - Include feature flag to have message logs compatible with new ChatUI
132
+
127
133
  ## [1.42.8] - 2026-01-08
128
134
  - Add validator to `BaseMetadata` in case `additional_sheet_information` is empty
129
135
  - Add more code snippets to create references and pull file metadata
@@ -20,6 +20,32 @@ unique_toolkit/_common/exception.py,sha256=ho0uBcPeZXU2w15IrSBhO5w7KUgxp1HcKAQrf
20
20
  unique_toolkit/_common/execution.py,sha256=ocPGGfUwa851207HNTLYiBJ1pNzJp4VhMZ49OPP33gU,8022
21
21
  unique_toolkit/_common/experimental/endpoint_builder.py,sha256=pEDwgeDzt67qbyaM98u8X7UAy29mQIw9Qufjz2bxgEA,11410
22
22
  unique_toolkit/_common/experimental/endpoint_requestor.py,sha256=YnDr8wASAEjZjLAeBmOWuFn4wUIZslTHBN_aApWeJBA,16079
23
+ unique_toolkit/_common/experimental/write_up_agent/README.md,sha256=ygmSpks3to5yye_XddLTpBXTiW61bW8w0hg2T33UP7U,28701
24
+ unique_toolkit/_common/experimental/write_up_agent/__init__.py,sha256=ka0eMrZiIAZVaoAbM-SPIT7heMd7rsuqVHDNIaNOQBQ,534
25
+ unique_toolkit/_common/experimental/write_up_agent/agent.py,sha256=bn-ftCx2GBRK2-yw9YspAob8zzHFX-X8Bk9Nx95Uczw,5835
26
+ unique_toolkit/_common/experimental/write_up_agent/config.py,sha256=5nGku-_feFWhM6RBI-Y4QRv9CG4Bgi7RKGOk65LsybY,1640
27
+ unique_toolkit/_common/experimental/write_up_agent/examples/data.csv,sha256=JHaYFBvmsSYOP7Ay1IKdMjBApsU-AJ902IDWp_85Lho,1569
28
+ unique_toolkit/_common/experimental/write_up_agent/examples/example_usage.py,sha256=--4rnjQ9_MY9FzHHl6LBAaqF6HM1TeqoZbouxssZxXY,2484
29
+ unique_toolkit/_common/experimental/write_up_agent/examples/report.md,sha256=nANN1HMNWq4WpJ6AwX1IsO2zEGCVAqhevp-P6tpXHyY,10640
30
+ unique_toolkit/_common/experimental/write_up_agent/schemas.py,sha256=DUZ_RrjtqrtTUkqcecs-lW8eCOEAwB1Qxw_hrOXm3HE,861
31
+ unique_toolkit/_common/experimental/write_up_agent/services/__init__.py,sha256=w2SR53rQl1yM9dYKxP9dJWF6qiovN2oyyGis0-aCslc,341
32
+ unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/__init__.py,sha256=hd2IktiTyCiwE_JJTC43zmu-67LL2vDhaLoi1tgZH_U,539
33
+ unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/exceptions.py,sha256=6F9VmWD5j3GI7JbHzakoYUM83y8rFWTTMVjTD6YQni8,855
34
+ unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/service.py,sha256=gaXXjIpTBNMPD_8KD94i6eSl4q1Em7iqIcmLFLhwHAM,5981
35
+ unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/utils.py,sha256=E-Yupm2d-Xo6wXha669L4B7g4cKa3qL03iJe7nIF5Ts,3382
36
+ unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/__init__.py,sha256=u5Z2-XhEXbmMoH2X2PmonkMe5rr1VGc-XYp3gdCXOig,750
37
+ unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/config.py,sha256=944Wn47t3MrC2f85zRA7vzrtuVKV22Um9olHLsv81B4,1927
38
+ unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/exceptions.py,sha256=6hbP4ZbbvCGQVOVzUav2sfIkU-sVbst1K2grNCvo2Rk,1996
39
+ unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/prompts/config.py,sha256=ep8NJNyBEbKIN7FudkeAfFaHzl1JygJxfNR2Ab0MHU0,1153
40
+ unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/prompts/system_prompt.j2,sha256=U66WhKnA-_AHM-APCzHVRn2bu5rZMqRwyZ2kvAmF2xA,674
41
+ unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/prompts/user_prompt.j2,sha256=9OMngS80URT4g96c0pYWjIcZn2Jn-C2aSFUdE7uIfCs,709
42
+ unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/service.py,sha256=aIUc7HUbqBkBZGxXhwdhwQPYEcXoLy1NLCfAKOMav9E,12825
43
+ unique_toolkit/_common/experimental/write_up_agent/services/template_handler/__init__.py,sha256=dyUAoV0uL-eEtSQQQ7XV8YMnNvwcyowiquZrgbhzNII,800
44
+ unique_toolkit/_common/experimental/write_up_agent/services/template_handler/default_template.j2,sha256=mL2l4rvrQFEHvjZ8uf2uQFujoKsnT1CoYHbEC45zHDY,1036
45
+ unique_toolkit/_common/experimental/write_up_agent/services/template_handler/exceptions.py,sha256=FGkJsbEeLwGDtFROH0TMxMFeXo4zfF40pXbLk6peYAo,1256
46
+ unique_toolkit/_common/experimental/write_up_agent/services/template_handler/service.py,sha256=lg9rIbQKTzPhQTSWMt66z1X3hHnu8v7uIylV7Jn9vyY,6494
47
+ unique_toolkit/_common/experimental/write_up_agent/services/template_handler/utils.py,sha256=FeJhTAU7AUlSFCfFwmEzzI22PtAdFJluzsGeiEPK49Q,6393
48
+ unique_toolkit/_common/experimental/write_up_agent/utils.py,sha256=I_OCDXCxY6uZk_fNQg_bIXHwjnN7ND_ngcisThnGGIc,739
23
49
  unique_toolkit/_common/feature_flags/schema.py,sha256=X32VqH4VMK7bhEfSd8Wbddl8FVs7Gh7ucuIEbmqc4Kw,268
24
50
  unique_toolkit/_common/pydantic/rjsf_tags.py,sha256=T3AZIF8wny3fFov66s258nEl1GqfKevFouTtG6k9PqU,31219
25
51
  unique_toolkit/_common/pydantic_helpers.py,sha256=Yg1CHD603wVrqvinHiyh3stjIK3MjuexUe9aQQUfmXs,5406
@@ -59,6 +85,8 @@ unique_toolkit/agentic/evaluation/output_parser.py,sha256=0FDo8YY_Dc4qlTNeYyQkzn
59
85
  unique_toolkit/agentic/evaluation/schemas.py,sha256=m9JMCUmeqP8KhsJOVEzsz6dRXUe1uKw-bxRDtn5qwvM,3156
60
86
  unique_toolkit/agentic/evaluation/tests/test_context_relevancy_service.py,sha256=4tDxHTApbaTMxN1sNS8WCqj2BweRk6YqZ5_zHP45jto,7977
61
87
  unique_toolkit/agentic/evaluation/tests/test_output_parser.py,sha256=RN_HcBbU6qy_e_PoYyUFcjWnp3ymJ6-gLj6TgEOupAI,3107
88
+ unique_toolkit/agentic/feature_flags/__init__.py,sha256=LhE2cHoa9AYBOR7TjiIToOn46sttm9paKcrzE7gnDPM,149
89
+ unique_toolkit/agentic/feature_flags/feature_flags.py,sha256=4jPH0GGGt5-tQ6PJWNpMBIlYzNrQIIqBLx8W02lwxD0,1140
62
90
  unique_toolkit/agentic/history_manager/history_construction_with_contents.py,sha256=kzxpVzTtQqL8TjdIvOy7gkRVxD4BsOMyimECryg7vdc,9060
63
91
  unique_toolkit/agentic/history_manager/history_manager.py,sha256=7V7_173XkAjc8otBACF0G3dbqRs34FSlURbBPrE95Wk,9537
64
92
  unique_toolkit/agentic/history_manager/loop_token_reducer.py,sha256=3c-uonDovtanEJUpAO4zlA4-n9MS_Ws_V0Yb6G7hPM0,20172
@@ -77,7 +105,7 @@ unique_toolkit/agentic/loop_runner/runners/qwen/__init__.py,sha256=b2zAQIjtPy_BB
77
105
  unique_toolkit/agentic/loop_runner/runners/qwen/helpers.py,sha256=JBnxeYKu8HiUq3VHjnb8XdHCe1c3cJ3OwagckF4UvnU,1763
78
106
  unique_toolkit/agentic/loop_runner/runners/qwen/qwen_runner.py,sha256=7tYfTkNKwxYVn6C1Htya5QEIK2BfWkxCPNkdMoaZGq0,4920
79
107
  unique_toolkit/agentic/message_log_manager/__init__.py,sha256=3-KY_sGkPbNoSnrzwPY0FQIJNnsz4NHXvocXgGRUeuE,169
80
- unique_toolkit/agentic/message_log_manager/service.py,sha256=AiuIq2dKQg9Y8bEYgGcve1X8-WRRdqPZXaZXXLJxfFM,3057
108
+ unique_toolkit/agentic/message_log_manager/service.py,sha256=DeixRsgmyDdWsL-4e12flB9d-Uy7s0X52upPIbTn6vA,5895
81
109
  unique_toolkit/agentic/postprocessor/postprocessor_manager.py,sha256=CoKzVFeLIr1eRP3ZLnmUJ8KNsFLyvK5iuvUilbcGAm0,7662
82
110
  unique_toolkit/agentic/reference_manager/reference_manager.py,sha256=x51CT0D8HHu2LzgXdHGy0leOYpjnsxVbPZ2nc28G9mA,4005
83
111
  unique_toolkit/agentic/responses_api/__init__.py,sha256=9WTO-ef7fGE9Y1QtZJFm8Q_jkwK8Srtl-HWvpAD2Wxs,668
@@ -215,7 +243,7 @@ unique_toolkit/short_term_memory/service.py,sha256=5PeVBu1ZCAfyDb2HLVvlmqSbyzBBu
215
243
  unique_toolkit/smart_rules/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
216
244
  unique_toolkit/smart_rules/compile.py,sha256=Ozhh70qCn2yOzRWr9d8WmJeTo7AQurwd3tStgBMPFLA,1246
217
245
  unique_toolkit/test_utilities/events.py,sha256=_mwV2bs5iLjxS1ynDCjaIq-gjjKhXYCK-iy3dRfvO3g,6410
218
- unique_toolkit-1.42.8.dist-info/LICENSE,sha256=GlN8wHNdh53xwOPg44URnwag6TEolCjoq3YD_KrWgss,193
219
- unique_toolkit-1.42.8.dist-info/METADATA,sha256=su-BJN4NWsxuKBdWmeWGF2tGzPDwh0Da_ea8stKGzWE,47356
220
- unique_toolkit-1.42.8.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
221
- unique_toolkit-1.42.8.dist-info/RECORD,,
246
+ unique_toolkit-1.43.0.dist-info/LICENSE,sha256=GlN8wHNdh53xwOPg44URnwag6TEolCjoq3YD_KrWgss,193
247
+ unique_toolkit-1.43.0.dist-info/METADATA,sha256=U8yIrcN5YfB4croDaIhvb17P0l6HSWYo5qxEHl9h7Yc,47528
248
+ unique_toolkit-1.43.0.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
249
+ unique_toolkit-1.43.0.dist-info/RECORD,,