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.
- unique_toolkit/_common/experimental/write_up_agent/README.md +848 -0
- unique_toolkit/_common/experimental/write_up_agent/__init__.py +22 -0
- unique_toolkit/_common/experimental/write_up_agent/agent.py +170 -0
- unique_toolkit/_common/experimental/write_up_agent/config.py +42 -0
- unique_toolkit/_common/experimental/write_up_agent/examples/data.csv +13 -0
- unique_toolkit/_common/experimental/write_up_agent/examples/example_usage.py +78 -0
- unique_toolkit/_common/experimental/write_up_agent/examples/report.md +154 -0
- unique_toolkit/_common/experimental/write_up_agent/schemas.py +36 -0
- unique_toolkit/_common/experimental/write_up_agent/services/__init__.py +13 -0
- unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/__init__.py +19 -0
- unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/exceptions.py +29 -0
- unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/service.py +150 -0
- unique_toolkit/_common/experimental/write_up_agent/services/dataframe_handler/utils.py +130 -0
- unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/__init__.py +27 -0
- unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/config.py +56 -0
- unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/exceptions.py +79 -0
- unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/prompts/config.py +34 -0
- unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/prompts/system_prompt.j2 +15 -0
- unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/prompts/user_prompt.j2 +21 -0
- unique_toolkit/_common/experimental/write_up_agent/services/generation_handler/service.py +369 -0
- unique_toolkit/_common/experimental/write_up_agent/services/template_handler/__init__.py +29 -0
- unique_toolkit/_common/experimental/write_up_agent/services/template_handler/default_template.j2 +37 -0
- unique_toolkit/_common/experimental/write_up_agent/services/template_handler/exceptions.py +39 -0
- unique_toolkit/_common/experimental/write_up_agent/services/template_handler/service.py +191 -0
- unique_toolkit/_common/experimental/write_up_agent/services/template_handler/utils.py +182 -0
- unique_toolkit/_common/experimental/write_up_agent/utils.py +24 -0
- unique_toolkit/agentic/feature_flags/__init__.py +6 -0
- unique_toolkit/agentic/feature_flags/feature_flags.py +32 -0
- unique_toolkit/agentic/message_log_manager/service.py +88 -12
- {unique_toolkit-1.42.8.dist-info → unique_toolkit-1.43.0.dist-info}/METADATA +7 -1
- {unique_toolkit-1.42.8.dist-info → unique_toolkit-1.43.0.dist-info}/RECORD +33 -5
- {unique_toolkit-1.42.8.dist-info → unique_toolkit-1.43.0.dist-info}/LICENSE +0 -0
- {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,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=
|
|
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.
|
|
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=
|
|
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.
|
|
219
|
-
unique_toolkit-1.
|
|
220
|
-
unique_toolkit-1.
|
|
221
|
-
unique_toolkit-1.
|
|
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,,
|
|
File without changes
|
|
File without changes
|