hamtaa-texttools 1.1.1__py3-none-any.whl → 1.1.16__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.
- {hamtaa_texttools-1.1.1.dist-info → hamtaa_texttools-1.1.16.dist-info}/METADATA +98 -26
- hamtaa_texttools-1.1.16.dist-info/RECORD +31 -0
- texttools/__init__.py +6 -8
- texttools/batch/batch_config.py +26 -0
- texttools/batch/batch_runner.py +105 -151
- texttools/batch/{batch_manager.py → internals/batch_manager.py} +39 -40
- texttools/batch/internals/utils.py +16 -0
- texttools/prompts/README.md +4 -4
- texttools/prompts/categorize.yaml +77 -0
- texttools/prompts/detect_entity.yaml +22 -0
- texttools/prompts/extract_keywords.yaml +68 -18
- texttools/tools/async_tools.py +804 -0
- texttools/tools/internals/async_operator.py +90 -69
- texttools/tools/internals/models.py +183 -0
- texttools/tools/internals/operator_utils.py +54 -0
- texttools/tools/internals/prompt_loader.py +13 -14
- texttools/tools/internals/sync_operator.py +201 -0
- texttools/tools/sync_tools.py +804 -0
- hamtaa_texttools-1.1.1.dist-info/RECORD +0 -30
- texttools/batch/__init__.py +0 -4
- texttools/prompts/categorizer.yaml +0 -28
- texttools/tools/__init__.py +0 -4
- texttools/tools/async_the_tool.py +0 -414
- texttools/tools/internals/base_operator.py +0 -91
- texttools/tools/internals/operator.py +0 -179
- texttools/tools/internals/output_models.py +0 -59
- texttools/tools/the_tool.py +0 -412
- {hamtaa_texttools-1.1.1.dist-info → hamtaa_texttools-1.1.16.dist-info}/WHEEL +0 -0
- {hamtaa_texttools-1.1.1.dist-info → hamtaa_texttools-1.1.16.dist-info}/licenses/LICENSE +0 -0
- {hamtaa_texttools-1.1.1.dist-info → hamtaa_texttools-1.1.16.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,804 @@
|
|
|
1
|
+
from datetime import datetime
|
|
2
|
+
from typing import Literal, Any
|
|
3
|
+
from collections.abc import Callable
|
|
4
|
+
|
|
5
|
+
from openai import OpenAI
|
|
6
|
+
|
|
7
|
+
from texttools.tools.internals.sync_operator import Operator
|
|
8
|
+
import texttools.tools.internals.models as Models
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class TheTool:
|
|
12
|
+
"""
|
|
13
|
+
Each method configures the operator with a specific YAML prompt,
|
|
14
|
+
output schema, and flags, then delegates execution to `operator.run()`.
|
|
15
|
+
|
|
16
|
+
Usage:
|
|
17
|
+
client = OpenAI(...)
|
|
18
|
+
tool = TheTool(client, model="model-name")
|
|
19
|
+
result = tool.categorize("text ...", with_analysis=True)
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
def __init__(
|
|
23
|
+
self,
|
|
24
|
+
client: OpenAI,
|
|
25
|
+
model: str,
|
|
26
|
+
):
|
|
27
|
+
self._operator = Operator(client=client, model=model)
|
|
28
|
+
|
|
29
|
+
def categorize(
|
|
30
|
+
self,
|
|
31
|
+
text: str,
|
|
32
|
+
categories: list[str] | Models.CategoryTree,
|
|
33
|
+
with_analysis: bool = False,
|
|
34
|
+
user_prompt: str | None = None,
|
|
35
|
+
temperature: float | None = 0.0,
|
|
36
|
+
logprobs: bool = False,
|
|
37
|
+
top_logprobs: int | None = None,
|
|
38
|
+
mode: Literal["category_list", "category_tree"] = "category_list",
|
|
39
|
+
validator: Callable[[Any], bool] | None = None,
|
|
40
|
+
max_validation_retries: int | None = None,
|
|
41
|
+
priority: int | None = 0,
|
|
42
|
+
) -> Models.ToolOutput:
|
|
43
|
+
"""
|
|
44
|
+
Categorize a text into a category / category tree.
|
|
45
|
+
|
|
46
|
+
Arguments:
|
|
47
|
+
text: The input text to categorize
|
|
48
|
+
categories: The category / category_tree to give to LLM
|
|
49
|
+
with_analysis: Whether to include detailed reasoning analysis
|
|
50
|
+
user_prompt: Additional instructions for the categorization
|
|
51
|
+
temperature: Controls randomness (0.0 = deterministic, 1.0 = creative)
|
|
52
|
+
logprobs: Whether to return token probability information
|
|
53
|
+
top_logprobs: Number of top token alternatives to return if logprobs enabled
|
|
54
|
+
validator: Custom validation function to validate the output
|
|
55
|
+
max_validation_retries: Maximum number of retry attempts if validation fails
|
|
56
|
+
priority: Task execution priority (if enabled by vLLM and model)
|
|
57
|
+
|
|
58
|
+
Returns:
|
|
59
|
+
ToolOutput: Object containing:
|
|
60
|
+
- result (str): The assigned category
|
|
61
|
+
- logprobs (list | None): Probability data if logprobs enabled
|
|
62
|
+
- analysis (str | None): Detailed reasoning if with_analysis enabled
|
|
63
|
+
- errors (list(str) | None): Errors occured during tool call
|
|
64
|
+
"""
|
|
65
|
+
start = datetime.now()
|
|
66
|
+
|
|
67
|
+
if mode == "category_tree":
|
|
68
|
+
# Initializations
|
|
69
|
+
output = Models.ToolOutput()
|
|
70
|
+
levels = categories.get_level_count()
|
|
71
|
+
parent_id = 0
|
|
72
|
+
final_output = []
|
|
73
|
+
|
|
74
|
+
for _ in range(levels):
|
|
75
|
+
# Get child nodes for current parent
|
|
76
|
+
parent_node = categories.find_node(parent_id)
|
|
77
|
+
children = categories.find_children(parent_node)
|
|
78
|
+
|
|
79
|
+
# Check if child nodes exist
|
|
80
|
+
if not children:
|
|
81
|
+
output.errors.append(
|
|
82
|
+
f"No categories found for parent_id {parent_id} in the tree"
|
|
83
|
+
)
|
|
84
|
+
end = datetime.now()
|
|
85
|
+
output.execution_time = (end - start).total_seconds()
|
|
86
|
+
return output
|
|
87
|
+
|
|
88
|
+
# Extract category names and descriptions
|
|
89
|
+
category_list = [
|
|
90
|
+
f"Category Name: {node.name}, Description: {node.description}"
|
|
91
|
+
for node in children
|
|
92
|
+
]
|
|
93
|
+
category_names = [node.name for node in children]
|
|
94
|
+
|
|
95
|
+
# Run categorization for this level
|
|
96
|
+
level_output = self._operator.run(
|
|
97
|
+
# User parameters
|
|
98
|
+
text=text,
|
|
99
|
+
category_list=category_list,
|
|
100
|
+
with_analysis=with_analysis,
|
|
101
|
+
user_prompt=user_prompt,
|
|
102
|
+
temperature=temperature,
|
|
103
|
+
logprobs=logprobs,
|
|
104
|
+
top_logprobs=top_logprobs,
|
|
105
|
+
mode=mode,
|
|
106
|
+
validator=validator,
|
|
107
|
+
max_validation_retries=max_validation_retries,
|
|
108
|
+
priority=priority,
|
|
109
|
+
# Internal parameters
|
|
110
|
+
prompt_file="categorize.yaml",
|
|
111
|
+
output_model=Models.create_dynamic_model(category_names),
|
|
112
|
+
output_lang=None,
|
|
113
|
+
)
|
|
114
|
+
|
|
115
|
+
# Check for errors from operator
|
|
116
|
+
if level_output.errors:
|
|
117
|
+
output.errors.extend(level_output.errors)
|
|
118
|
+
end = datetime.now()
|
|
119
|
+
output.execution_time = (end - start).total_seconds()
|
|
120
|
+
return output
|
|
121
|
+
|
|
122
|
+
# Get the chosen category
|
|
123
|
+
chosen_category = level_output.result
|
|
124
|
+
|
|
125
|
+
# Find the corresponding node
|
|
126
|
+
parent_node = categories.find_node(chosen_category)
|
|
127
|
+
if parent_node is None:
|
|
128
|
+
output.errors.append(
|
|
129
|
+
f"Category '{chosen_category}' not found in tree after selection"
|
|
130
|
+
)
|
|
131
|
+
end = datetime.now()
|
|
132
|
+
output.execution_time = (end - start).total_seconds()
|
|
133
|
+
return output
|
|
134
|
+
|
|
135
|
+
parent_id = parent_node.node_id
|
|
136
|
+
final_output.append(parent_node.name)
|
|
137
|
+
|
|
138
|
+
# Copy analysis/logprobs/process from the last level's output
|
|
139
|
+
output.analysis = level_output.analysis
|
|
140
|
+
output.logprobs = level_output.logprobs
|
|
141
|
+
output.process = level_output.process
|
|
142
|
+
|
|
143
|
+
output.result = final_output
|
|
144
|
+
end = datetime.now()
|
|
145
|
+
output.execution_time = (end - start).total_seconds()
|
|
146
|
+
return output
|
|
147
|
+
|
|
148
|
+
else:
|
|
149
|
+
output = self._operator.run(
|
|
150
|
+
# User parameters
|
|
151
|
+
text=text,
|
|
152
|
+
category_list=categories,
|
|
153
|
+
with_analysis=with_analysis,
|
|
154
|
+
user_prompt=user_prompt,
|
|
155
|
+
temperature=temperature,
|
|
156
|
+
logprobs=logprobs,
|
|
157
|
+
top_logprobs=top_logprobs,
|
|
158
|
+
mode=mode,
|
|
159
|
+
validator=validator,
|
|
160
|
+
max_validation_retries=max_validation_retries,
|
|
161
|
+
priority=priority,
|
|
162
|
+
# Internal parameters
|
|
163
|
+
prompt_file="categorize.yaml",
|
|
164
|
+
output_model=Models.create_dynamic_model(categories),
|
|
165
|
+
output_lang=None,
|
|
166
|
+
)
|
|
167
|
+
end = datetime.now()
|
|
168
|
+
output.execution_time = (end - start).total_seconds()
|
|
169
|
+
return output
|
|
170
|
+
|
|
171
|
+
def extract_keywords(
|
|
172
|
+
self,
|
|
173
|
+
text: str,
|
|
174
|
+
with_analysis: bool = False,
|
|
175
|
+
output_lang: str | None = None,
|
|
176
|
+
user_prompt: str | None = None,
|
|
177
|
+
temperature: float | None = 0.0,
|
|
178
|
+
logprobs: bool = False,
|
|
179
|
+
top_logprobs: int | None = None,
|
|
180
|
+
mode: Literal["auto", "threshold", "count"] = "auto",
|
|
181
|
+
number_of_keywords: int | None = None,
|
|
182
|
+
validator: Callable[[Any], bool] | None = None,
|
|
183
|
+
max_validation_retries: int | None = None,
|
|
184
|
+
priority: int | None = 0,
|
|
185
|
+
) -> Models.ToolOutput:
|
|
186
|
+
"""
|
|
187
|
+
Extract salient keywords from text.
|
|
188
|
+
|
|
189
|
+
Arguments:
|
|
190
|
+
text: The input text to extract keywords from
|
|
191
|
+
with_analysis: Whether to include detailed reasoning analysis
|
|
192
|
+
output_lang: Language for the output response
|
|
193
|
+
user_prompt: Additional instructions for keyword extraction
|
|
194
|
+
temperature: Controls randomness (0.0 = deterministic, 1.0 = creative)
|
|
195
|
+
logprobs: Whether to return token probability information
|
|
196
|
+
top_logprobs: Number of top token alternatives to return if logprobs enabled
|
|
197
|
+
validator: Custom validation function to validate the output
|
|
198
|
+
max_validation_retries: Maximum number of retry attempts if validation fails
|
|
199
|
+
priority: Task execution priority (if enabled by vLLM and model)
|
|
200
|
+
|
|
201
|
+
Returns:
|
|
202
|
+
ToolOutput: Object containing:
|
|
203
|
+
- result (list[str]): List of extracted keywords
|
|
204
|
+
- logprobs (list | None): Probability data if logprobs enabled
|
|
205
|
+
- analysis (str | None): Detailed reasoning if with_analysis enabled
|
|
206
|
+
- errors (list(str) | None): Errors occured during tool call
|
|
207
|
+
"""
|
|
208
|
+
start = datetime.now()
|
|
209
|
+
output = self._operator.run(
|
|
210
|
+
# User parameters
|
|
211
|
+
text=text,
|
|
212
|
+
with_analysis=with_analysis,
|
|
213
|
+
output_lang=output_lang,
|
|
214
|
+
user_prompt=user_prompt,
|
|
215
|
+
temperature=temperature,
|
|
216
|
+
logprobs=logprobs,
|
|
217
|
+
top_logprobs=top_logprobs,
|
|
218
|
+
mode=mode,
|
|
219
|
+
number_of_keywords=number_of_keywords,
|
|
220
|
+
validator=validator,
|
|
221
|
+
max_validation_retries=max_validation_retries,
|
|
222
|
+
priority=priority,
|
|
223
|
+
# Internal parameters
|
|
224
|
+
prompt_file="extract_keywords.yaml",
|
|
225
|
+
output_model=Models.ListStrOutput,
|
|
226
|
+
)
|
|
227
|
+
end = datetime.now()
|
|
228
|
+
output.execution_time = (end - start).total_seconds()
|
|
229
|
+
return output
|
|
230
|
+
|
|
231
|
+
def extract_entities(
|
|
232
|
+
self,
|
|
233
|
+
text: str,
|
|
234
|
+
with_analysis: bool = False,
|
|
235
|
+
output_lang: str | None = None,
|
|
236
|
+
user_prompt: str | None = None,
|
|
237
|
+
temperature: float | None = 0.0,
|
|
238
|
+
logprobs: bool = False,
|
|
239
|
+
top_logprobs: int | None = None,
|
|
240
|
+
validator: Callable[[Any], bool] | None = None,
|
|
241
|
+
max_validation_retries: int | None = None,
|
|
242
|
+
priority: int | None = 0,
|
|
243
|
+
) -> Models.ToolOutput:
|
|
244
|
+
"""
|
|
245
|
+
Perform Named Entity Recognition (NER) over the input text.
|
|
246
|
+
|
|
247
|
+
Arguments:
|
|
248
|
+
text: The input text to extract entities from
|
|
249
|
+
with_analysis: Whether to include detailed reasoning analysis
|
|
250
|
+
output_lang: Language for the output response
|
|
251
|
+
user_prompt: Additional instructions for entity extraction
|
|
252
|
+
temperature: Controls randomness (0.0 = deterministic, 1.0 = creative)
|
|
253
|
+
logprobs: Whether to return token probability information
|
|
254
|
+
top_logprobs: Number of top token alternatives to return if logprobs enabled
|
|
255
|
+
validator: Custom validation function to validate the output
|
|
256
|
+
max_validation_retries: Maximum number of retry attempts if validation fails
|
|
257
|
+
priority: Task execution priority (if enabled by vLLM and model)
|
|
258
|
+
|
|
259
|
+
Returns:
|
|
260
|
+
ToolOutput: Object containing:
|
|
261
|
+
- result (list[dict]): List of entities with 'text' and 'type' keys
|
|
262
|
+
- logprobs (list | None): Probability data if logprobs enabled
|
|
263
|
+
- analysis (str | None): Detailed reasoning if with_analysis enabled
|
|
264
|
+
- errors (list(str) | None): Errors occured during tool call
|
|
265
|
+
"""
|
|
266
|
+
start = datetime.now()
|
|
267
|
+
output = self._operator.run(
|
|
268
|
+
# User parameters
|
|
269
|
+
text=text,
|
|
270
|
+
with_analysis=with_analysis,
|
|
271
|
+
output_lang=output_lang,
|
|
272
|
+
user_prompt=user_prompt,
|
|
273
|
+
temperature=temperature,
|
|
274
|
+
logprobs=logprobs,
|
|
275
|
+
top_logprobs=top_logprobs,
|
|
276
|
+
validator=validator,
|
|
277
|
+
max_validation_retries=max_validation_retries,
|
|
278
|
+
priority=priority,
|
|
279
|
+
# Internal parameters
|
|
280
|
+
prompt_file="extract_entities.yaml",
|
|
281
|
+
output_model=Models.ListDictStrStrOutput,
|
|
282
|
+
mode=None,
|
|
283
|
+
)
|
|
284
|
+
end = datetime.now()
|
|
285
|
+
output.execution_time = (end - start).total_seconds()
|
|
286
|
+
return output
|
|
287
|
+
|
|
288
|
+
def is_question(
|
|
289
|
+
self,
|
|
290
|
+
text: str,
|
|
291
|
+
with_analysis: bool = False,
|
|
292
|
+
user_prompt: str | None = None,
|
|
293
|
+
temperature: float | None = 0.0,
|
|
294
|
+
logprobs: bool = False,
|
|
295
|
+
top_logprobs: int | None = None,
|
|
296
|
+
validator: Callable[[Any], bool] | None = None,
|
|
297
|
+
max_validation_retries: int | None = None,
|
|
298
|
+
priority: int | None = 0,
|
|
299
|
+
) -> Models.ToolOutput:
|
|
300
|
+
"""
|
|
301
|
+
Detect if the input is phrased as a question.
|
|
302
|
+
|
|
303
|
+
Arguments:
|
|
304
|
+
text: The input text to analyze
|
|
305
|
+
with_analysis: Whether to include detailed reasoning analysis
|
|
306
|
+
user_prompt: Additional instructions for question detection
|
|
307
|
+
temperature: Controls randomness (0.0 = deterministic, 1.0 = creative)
|
|
308
|
+
logprobs: Whether to return token probability information
|
|
309
|
+
top_logprobs: Number of top token alternatives to return if logprobs enabled
|
|
310
|
+
validator: Custom validation function to validate the output
|
|
311
|
+
max_validation_retries: Maximum number of retry attempts if validation fails
|
|
312
|
+
priority: Task execution priority (if enabled by vLLM and model)
|
|
313
|
+
|
|
314
|
+
Returns:
|
|
315
|
+
ToolOutput: Object containing:
|
|
316
|
+
- result (bool): True if text is a question, False otherwise
|
|
317
|
+
- logprobs (list | None): Probability data if logprobs enabled
|
|
318
|
+
- analysis (str | None): Detailed reasoning if with_analysis enabled
|
|
319
|
+
- errors (list(str) | None): Errors occured during tool call
|
|
320
|
+
"""
|
|
321
|
+
start = datetime.now()
|
|
322
|
+
output = self._operator.run(
|
|
323
|
+
# User parameters
|
|
324
|
+
text=text,
|
|
325
|
+
with_analysis=with_analysis,
|
|
326
|
+
user_prompt=user_prompt,
|
|
327
|
+
temperature=temperature,
|
|
328
|
+
logprobs=logprobs,
|
|
329
|
+
top_logprobs=top_logprobs,
|
|
330
|
+
validator=validator,
|
|
331
|
+
max_validation_retries=max_validation_retries,
|
|
332
|
+
priority=priority,
|
|
333
|
+
# Internal parameters
|
|
334
|
+
prompt_file="is_question.yaml",
|
|
335
|
+
output_model=Models.BoolOutput,
|
|
336
|
+
mode=None,
|
|
337
|
+
output_lang=None,
|
|
338
|
+
)
|
|
339
|
+
end = datetime.now()
|
|
340
|
+
output.execution_time = (end - start).total_seconds()
|
|
341
|
+
return output
|
|
342
|
+
|
|
343
|
+
def text_to_question(
|
|
344
|
+
self,
|
|
345
|
+
text: str,
|
|
346
|
+
with_analysis: bool = False,
|
|
347
|
+
output_lang: str | None = None,
|
|
348
|
+
user_prompt: str | None = None,
|
|
349
|
+
temperature: float | None = 0.0,
|
|
350
|
+
logprobs: bool = False,
|
|
351
|
+
top_logprobs: int | None = None,
|
|
352
|
+
validator: Callable[[Any], bool] | None = None,
|
|
353
|
+
max_validation_retries: int | None = None,
|
|
354
|
+
priority: int | None = 0,
|
|
355
|
+
) -> Models.ToolOutput:
|
|
356
|
+
"""
|
|
357
|
+
Generate a single question from the given text.
|
|
358
|
+
|
|
359
|
+
Arguments:
|
|
360
|
+
text: The input text to generate a question from
|
|
361
|
+
with_analysis: Whether to include detailed reasoning analysis
|
|
362
|
+
output_lang: Language for the output question
|
|
363
|
+
user_prompt: Additional instructions for question generation
|
|
364
|
+
temperature: Controls randomness (0.0 = deterministic, 1.0 = creative)
|
|
365
|
+
logprobs: Whether to return token probability information
|
|
366
|
+
top_logprobs: Number of top token alternatives to return if logprobs enabled
|
|
367
|
+
validator: Custom validation function to validate the output
|
|
368
|
+
max_validation_retries: Maximum number of retry attempts if validation fails
|
|
369
|
+
priority: Task execution priority (if enabled by vLLM and model)
|
|
370
|
+
|
|
371
|
+
Returns:
|
|
372
|
+
ToolOutput: Object containing:
|
|
373
|
+
- result (str): The generated question
|
|
374
|
+
- logprobs (list | None): Probability data if logprobs enabled
|
|
375
|
+
- analysis (str | None): Detailed reasoning if with_analysis enabled
|
|
376
|
+
- errors (list(str) | None): Errors occured during tool call
|
|
377
|
+
"""
|
|
378
|
+
start = datetime.now()
|
|
379
|
+
output = self._operator.run(
|
|
380
|
+
# User parameters
|
|
381
|
+
text=text,
|
|
382
|
+
with_analysis=with_analysis,
|
|
383
|
+
output_lang=output_lang,
|
|
384
|
+
user_prompt=user_prompt,
|
|
385
|
+
temperature=temperature,
|
|
386
|
+
logprobs=logprobs,
|
|
387
|
+
top_logprobs=top_logprobs,
|
|
388
|
+
validator=validator,
|
|
389
|
+
max_validation_retries=max_validation_retries,
|
|
390
|
+
priority=priority,
|
|
391
|
+
# Internal parameters
|
|
392
|
+
prompt_file="text_to_question.yaml",
|
|
393
|
+
output_model=Models.StrOutput,
|
|
394
|
+
mode=None,
|
|
395
|
+
)
|
|
396
|
+
end = datetime.now()
|
|
397
|
+
output.execution_time = (end - start).total_seconds()
|
|
398
|
+
return output
|
|
399
|
+
|
|
400
|
+
def merge_questions(
|
|
401
|
+
self,
|
|
402
|
+
text: list[str],
|
|
403
|
+
with_analysis: bool = False,
|
|
404
|
+
output_lang: str | None = None,
|
|
405
|
+
user_prompt: str | None = None,
|
|
406
|
+
temperature: float | None = 0.0,
|
|
407
|
+
logprobs: bool = False,
|
|
408
|
+
top_logprobs: int | None = None,
|
|
409
|
+
mode: Literal["default", "reason"] = "default",
|
|
410
|
+
validator: Callable[[Any], bool] | None = None,
|
|
411
|
+
max_validation_retries: int | None = None,
|
|
412
|
+
priority: int | None = 0,
|
|
413
|
+
) -> Models.ToolOutput:
|
|
414
|
+
"""
|
|
415
|
+
Merge multiple questions into a single unified question.
|
|
416
|
+
|
|
417
|
+
Arguments:
|
|
418
|
+
text: List of questions to merge
|
|
419
|
+
with_analysis: Whether to include detailed reasoning analysis
|
|
420
|
+
output_lang: Language for the output merged question
|
|
421
|
+
user_prompt: Additional instructions for question merging
|
|
422
|
+
temperature: Controls randomness (0.0 = deterministic, 1.0 = creative)
|
|
423
|
+
logprobs: Whether to return token probability information
|
|
424
|
+
top_logprobs: Number of top token alternatives to return if logprobs enabled
|
|
425
|
+
mode: Merging strategy - 'default' for direct merge, 'reason' for reasoned merge
|
|
426
|
+
validator: Custom validation function to validate the output
|
|
427
|
+
max_validation_retries: Maximum number of retry attempts if validation fails
|
|
428
|
+
priority: Task execution priority (if enabled by vLLM and model)
|
|
429
|
+
|
|
430
|
+
Returns:
|
|
431
|
+
ToolOutput: Object containing:
|
|
432
|
+
- result (str): The merged question
|
|
433
|
+
- logprobs (list | None): Probability data if logprobs enabled
|
|
434
|
+
- analysis (str | None): Detailed reasoning if with_analysis enabled
|
|
435
|
+
- errors (list(str) | None): Errors occured during tool call
|
|
436
|
+
"""
|
|
437
|
+
start = datetime.now()
|
|
438
|
+
text = ", ".join(text)
|
|
439
|
+
output = self._operator.run(
|
|
440
|
+
# User parameters
|
|
441
|
+
text=text,
|
|
442
|
+
with_analysis=with_analysis,
|
|
443
|
+
output_lang=output_lang,
|
|
444
|
+
user_prompt=user_prompt,
|
|
445
|
+
temperature=temperature,
|
|
446
|
+
logprobs=logprobs,
|
|
447
|
+
top_logprobs=top_logprobs,
|
|
448
|
+
validator=validator,
|
|
449
|
+
max_validation_retries=max_validation_retries,
|
|
450
|
+
priority=priority,
|
|
451
|
+
# Internal parameters
|
|
452
|
+
prompt_file="merge_questions.yaml",
|
|
453
|
+
output_model=Models.StrOutput,
|
|
454
|
+
mode=mode,
|
|
455
|
+
)
|
|
456
|
+
end = datetime.now()
|
|
457
|
+
output.execution_time = (end - start).total_seconds()
|
|
458
|
+
return output
|
|
459
|
+
|
|
460
|
+
def rewrite(
|
|
461
|
+
self,
|
|
462
|
+
text: str,
|
|
463
|
+
with_analysis: bool = False,
|
|
464
|
+
output_lang: str | None = None,
|
|
465
|
+
user_prompt: str | None = None,
|
|
466
|
+
temperature: float | None = 0.0,
|
|
467
|
+
logprobs: bool = False,
|
|
468
|
+
top_logprobs: int | None = None,
|
|
469
|
+
mode: Literal["positive", "negative", "hard_negative"] = "positive",
|
|
470
|
+
validator: Callable[[Any], bool] | None = None,
|
|
471
|
+
max_validation_retries: int | None = None,
|
|
472
|
+
priority: int | None = 0,
|
|
473
|
+
) -> Models.ToolOutput:
|
|
474
|
+
"""
|
|
475
|
+
Rewrite a text with different modes.
|
|
476
|
+
|
|
477
|
+
Arguments:
|
|
478
|
+
text: The input text to rewrite
|
|
479
|
+
with_analysis: Whether to include detailed reasoning analysis
|
|
480
|
+
output_lang: Language for the output rewritten text
|
|
481
|
+
user_prompt: Additional instructions for rewriting
|
|
482
|
+
temperature: Controls randomness (0.0 = deterministic, 1.0 = creative)
|
|
483
|
+
logprobs: Whether to return token probability information
|
|
484
|
+
top_logprobs: Number of top token alternatives to return if logprobs enabled
|
|
485
|
+
mode: Rewriting mode - 'positive', 'negative', or 'hard_negative'
|
|
486
|
+
validator: Custom validation function to validate the output
|
|
487
|
+
max_validation_retries: Maximum number of retry attempts if validation fails
|
|
488
|
+
priority: Task execution priority (if enabled by vLLM and model)
|
|
489
|
+
|
|
490
|
+
Returns:
|
|
491
|
+
ToolOutput: Object containing:
|
|
492
|
+
- result (str): The rewritten text
|
|
493
|
+
- logprobs (list | None): Probability data if logprobs enabled
|
|
494
|
+
- analysis (str | None): Detailed reasoning if with_analysis enabled
|
|
495
|
+
- errors (list(str) | None): Errors occured during tool call
|
|
496
|
+
"""
|
|
497
|
+
start = datetime.now()
|
|
498
|
+
output = self._operator.run(
|
|
499
|
+
# User parameters
|
|
500
|
+
text=text,
|
|
501
|
+
with_analysis=with_analysis,
|
|
502
|
+
output_lang=output_lang,
|
|
503
|
+
user_prompt=user_prompt,
|
|
504
|
+
temperature=temperature,
|
|
505
|
+
logprobs=logprobs,
|
|
506
|
+
top_logprobs=top_logprobs,
|
|
507
|
+
validator=validator,
|
|
508
|
+
max_validation_retries=max_validation_retries,
|
|
509
|
+
priority=priority,
|
|
510
|
+
# Internal parameters
|
|
511
|
+
prompt_file="rewrite.yaml",
|
|
512
|
+
output_model=Models.StrOutput,
|
|
513
|
+
mode=mode,
|
|
514
|
+
)
|
|
515
|
+
end = datetime.now()
|
|
516
|
+
output.execution_time = (end - start).total_seconds()
|
|
517
|
+
return output
|
|
518
|
+
|
|
519
|
+
def subject_to_question(
|
|
520
|
+
self,
|
|
521
|
+
text: str,
|
|
522
|
+
number_of_questions: int,
|
|
523
|
+
with_analysis: bool = False,
|
|
524
|
+
output_lang: str | None = None,
|
|
525
|
+
user_prompt: str | None = None,
|
|
526
|
+
temperature: float | None = 0.0,
|
|
527
|
+
logprobs: bool = False,
|
|
528
|
+
top_logprobs: int | None = None,
|
|
529
|
+
validator: Callable[[Any], bool] | None = None,
|
|
530
|
+
max_validation_retries: int | None = None,
|
|
531
|
+
priority: int | None = 0,
|
|
532
|
+
) -> Models.ToolOutput:
|
|
533
|
+
"""
|
|
534
|
+
Generate a list of questions about a subject.
|
|
535
|
+
|
|
536
|
+
Arguments:
|
|
537
|
+
text: The subject text to generate questions about
|
|
538
|
+
number_of_questions: Number of questions to generate
|
|
539
|
+
with_analysis: Whether to include detailed reasoning analysis
|
|
540
|
+
output_lang: Language for the output questions
|
|
541
|
+
user_prompt: Additional instructions for question generation
|
|
542
|
+
temperature: Controls randomness (0.0 = deterministic, 1.0 = creative)
|
|
543
|
+
logprobs: Whether to return token probability information
|
|
544
|
+
top_logprobs: Number of top token alternatives to return if logprobs enabled
|
|
545
|
+
validator: Custom validation function to validate the output
|
|
546
|
+
max_validation_retries: Maximum number of retry attempts if validation fails
|
|
547
|
+
priority: Task execution priority (if enabled by vLLM and model)
|
|
548
|
+
|
|
549
|
+
Returns:
|
|
550
|
+
ToolOutput: Object containing:
|
|
551
|
+
- result (list[str]): List of generated questions
|
|
552
|
+
- logprobs (list | None): Probability data if logprobs enabled
|
|
553
|
+
- analysis (str | None): Detailed reasoning if with_analysis enabled
|
|
554
|
+
- errors (list(str) | None): Errors occured during tool call
|
|
555
|
+
"""
|
|
556
|
+
start = datetime.now()
|
|
557
|
+
output = self._operator.run(
|
|
558
|
+
# User parameters
|
|
559
|
+
text=text,
|
|
560
|
+
number_of_questions=number_of_questions,
|
|
561
|
+
with_analysis=with_analysis,
|
|
562
|
+
output_lang=output_lang,
|
|
563
|
+
user_prompt=user_prompt,
|
|
564
|
+
temperature=temperature,
|
|
565
|
+
logprobs=logprobs,
|
|
566
|
+
top_logprobs=top_logprobs,
|
|
567
|
+
validator=validator,
|
|
568
|
+
max_validation_retries=max_validation_retries,
|
|
569
|
+
priority=priority,
|
|
570
|
+
# Internal parameters
|
|
571
|
+
prompt_file="subject_to_question.yaml",
|
|
572
|
+
output_model=Models.ReasonListStrOutput,
|
|
573
|
+
mode=None,
|
|
574
|
+
)
|
|
575
|
+
end = datetime.now()
|
|
576
|
+
output.execution_time = (end - start).total_seconds()
|
|
577
|
+
return output
|
|
578
|
+
|
|
579
|
+
def summarize(
|
|
580
|
+
self,
|
|
581
|
+
text: str,
|
|
582
|
+
with_analysis: bool = False,
|
|
583
|
+
output_lang: str | None = None,
|
|
584
|
+
user_prompt: str | None = None,
|
|
585
|
+
temperature: float | None = 0.0,
|
|
586
|
+
logprobs: bool = False,
|
|
587
|
+
top_logprobs: int | None = None,
|
|
588
|
+
validator: Callable[[Any], bool] | None = None,
|
|
589
|
+
max_validation_retries: int | None = None,
|
|
590
|
+
priority: int | None = 0,
|
|
591
|
+
) -> Models.ToolOutput:
|
|
592
|
+
"""
|
|
593
|
+
Summarize the given subject text.
|
|
594
|
+
|
|
595
|
+
Arguments:
|
|
596
|
+
text: The input text to summarize
|
|
597
|
+
with_analysis: Whether to include detailed reasoning analysis
|
|
598
|
+
output_lang: Language for the output summary
|
|
599
|
+
user_prompt: Additional instructions for summarization
|
|
600
|
+
temperature: Controls randomness (0.0 = deterministic, 1.0 = creative)
|
|
601
|
+
logprobs: Whether to return token probability information
|
|
602
|
+
top_logprobs: Number of top token alternatives to return if logprobs enabled
|
|
603
|
+
validator: Custom validation function to validate the output
|
|
604
|
+
max_validation_retries: Maximum number of retry attempts if validation fails
|
|
605
|
+
priority: Task execution priority (if enabled by vLLM and model)
|
|
606
|
+
|
|
607
|
+
Returns:
|
|
608
|
+
ToolOutput: Object containing:
|
|
609
|
+
- result (str): The summary text
|
|
610
|
+
- logprobs (list | None): Probability data if logprobs enabled
|
|
611
|
+
- analysis (str | None): Detailed reasoning if with_analysis enabled
|
|
612
|
+
- errors (list(str) | None): Errors occured during tool call
|
|
613
|
+
"""
|
|
614
|
+
start = datetime.now()
|
|
615
|
+
output = self._operator.run(
|
|
616
|
+
# User parameters
|
|
617
|
+
text=text,
|
|
618
|
+
with_analysis=with_analysis,
|
|
619
|
+
output_lang=output_lang,
|
|
620
|
+
user_prompt=user_prompt,
|
|
621
|
+
temperature=temperature,
|
|
622
|
+
logprobs=logprobs,
|
|
623
|
+
top_logprobs=top_logprobs,
|
|
624
|
+
validator=validator,
|
|
625
|
+
max_validation_retries=max_validation_retries,
|
|
626
|
+
priority=priority,
|
|
627
|
+
# Internal parameters
|
|
628
|
+
prompt_file="summarize.yaml",
|
|
629
|
+
output_model=Models.StrOutput,
|
|
630
|
+
mode=None,
|
|
631
|
+
)
|
|
632
|
+
end = datetime.now()
|
|
633
|
+
output.execution_time = (end - start).total_seconds()
|
|
634
|
+
return output
|
|
635
|
+
|
|
636
|
+
def translate(
|
|
637
|
+
self,
|
|
638
|
+
text: str,
|
|
639
|
+
target_language: str,
|
|
640
|
+
with_analysis: bool = False,
|
|
641
|
+
user_prompt: str | None = None,
|
|
642
|
+
temperature: float | None = 0.0,
|
|
643
|
+
logprobs: bool = False,
|
|
644
|
+
top_logprobs: int | None = None,
|
|
645
|
+
validator: Callable[[Any], bool] | None = None,
|
|
646
|
+
max_validation_retries: int | None = None,
|
|
647
|
+
priority: int | None = 0,
|
|
648
|
+
) -> Models.ToolOutput:
|
|
649
|
+
"""
|
|
650
|
+
Translate text between languages.
|
|
651
|
+
|
|
652
|
+
Arguments:
|
|
653
|
+
text: The input text to translate
|
|
654
|
+
target_language: The target language for translation
|
|
655
|
+
with_analysis: Whether to include detailed reasoning analysis
|
|
656
|
+
user_prompt: Additional instructions for translation
|
|
657
|
+
temperature: Controls randomness (0.0 = deterministic, 1.0 = creative)
|
|
658
|
+
logprobs: Whether to return token probability information
|
|
659
|
+
top_logprobs: Number of top token alternatives to return if logprobs enabled
|
|
660
|
+
validator: Custom validation function to validate the output
|
|
661
|
+
max_validation_retries: Maximum number of retry attempts if validation fails
|
|
662
|
+
priority: Task execution priority (if enabled by vLLM and model)
|
|
663
|
+
|
|
664
|
+
Returns:
|
|
665
|
+
ToolOutput: Object containing:
|
|
666
|
+
- result (str): The translated text
|
|
667
|
+
- logprobs (list | None): Probability data if logprobs enabled
|
|
668
|
+
- analysis (str | None): Detailed reasoning if with_analysis enabled
|
|
669
|
+
- errors (list(str) | None): Errors occured during tool call
|
|
670
|
+
"""
|
|
671
|
+
start = datetime.now()
|
|
672
|
+
output = self._operator.run(
|
|
673
|
+
# User parameters
|
|
674
|
+
text=text,
|
|
675
|
+
target_language=target_language,
|
|
676
|
+
with_analysis=with_analysis,
|
|
677
|
+
user_prompt=user_prompt,
|
|
678
|
+
temperature=temperature,
|
|
679
|
+
logprobs=logprobs,
|
|
680
|
+
top_logprobs=top_logprobs,
|
|
681
|
+
validator=validator,
|
|
682
|
+
max_validation_retries=max_validation_retries,
|
|
683
|
+
priority=priority,
|
|
684
|
+
# Internal parameters
|
|
685
|
+
prompt_file="translate.yaml",
|
|
686
|
+
output_model=Models.StrOutput,
|
|
687
|
+
mode=None,
|
|
688
|
+
output_lang=None,
|
|
689
|
+
)
|
|
690
|
+
end = datetime.now()
|
|
691
|
+
output.execution_time = (end - start).total_seconds()
|
|
692
|
+
return output
|
|
693
|
+
|
|
694
|
+
def detect_entity(
|
|
695
|
+
self,
|
|
696
|
+
text: str,
|
|
697
|
+
with_analysis: bool = False,
|
|
698
|
+
output_lang: str | None = None,
|
|
699
|
+
user_prompt: str | None = None,
|
|
700
|
+
temperature: float | None = 0.0,
|
|
701
|
+
logprobs: bool = False,
|
|
702
|
+
top_logprobs: int | None = None,
|
|
703
|
+
validator: Callable[[Any], bool] | None = None,
|
|
704
|
+
max_validation_retries: int | None = None,
|
|
705
|
+
priority: int | None = 0,
|
|
706
|
+
) -> Models.ToolOutput:
|
|
707
|
+
"""
|
|
708
|
+
Detects entities in a given text based on the entity_detector.yaml prompt.
|
|
709
|
+
|
|
710
|
+
Arguments:
|
|
711
|
+
text: The input text
|
|
712
|
+
with_analysis: Whether to include detailed reasoning analysis
|
|
713
|
+
output_lang: Language for the output summary
|
|
714
|
+
user_prompt: Additional instructions for summarization
|
|
715
|
+
temperature: Controls randomness (0.0 = deterministic, 1.0 = creative)
|
|
716
|
+
logprobs: Whether to return token probability information
|
|
717
|
+
top_logprobs: Number of top token alternatives to return if logprobs enabled
|
|
718
|
+
validator: Custom validation function to validate the output
|
|
719
|
+
max_validation_retries: Maximum number of retry attempts if validation fails
|
|
720
|
+
priority: Task execution priority (if enabled by vLLM and model)
|
|
721
|
+
|
|
722
|
+
Returns:
|
|
723
|
+
ToolOutput: Object containing:
|
|
724
|
+
- result (list[Entity]): The entities
|
|
725
|
+
- logprobs (list | None): Probability data if logprobs enabled
|
|
726
|
+
- analysis (str | None): Detailed reasoning if with_analysis enabled
|
|
727
|
+
- errors (list(str) | None): Errors occured during tool call
|
|
728
|
+
"""
|
|
729
|
+
start = datetime.now()
|
|
730
|
+
output = self._operator.run(
|
|
731
|
+
# User parameters
|
|
732
|
+
text=text,
|
|
733
|
+
with_analysis=with_analysis,
|
|
734
|
+
output_lang=output_lang,
|
|
735
|
+
user_prompt=user_prompt,
|
|
736
|
+
temperature=temperature,
|
|
737
|
+
logprobs=logprobs,
|
|
738
|
+
top_logprobs=top_logprobs,
|
|
739
|
+
validator=validator,
|
|
740
|
+
max_validation_retries=max_validation_retries,
|
|
741
|
+
priority=priority,
|
|
742
|
+
# Internal parameters
|
|
743
|
+
prompt_file="detect_entity.yaml",
|
|
744
|
+
output_model=Models.EntityDetectorOutput,
|
|
745
|
+
mode=None,
|
|
746
|
+
)
|
|
747
|
+
end = datetime.now()
|
|
748
|
+
output.execution_time = (end - start).total_seconds()
|
|
749
|
+
return output
|
|
750
|
+
|
|
751
|
+
def run_custom(
|
|
752
|
+
self,
|
|
753
|
+
prompt: str,
|
|
754
|
+
output_model: Any,
|
|
755
|
+
output_lang: str | None = None,
|
|
756
|
+
temperature: float | None = None,
|
|
757
|
+
logprobs: bool | None = None,
|
|
758
|
+
top_logprobs: int | None = None,
|
|
759
|
+
validator: Callable[[Any], bool] | None = None,
|
|
760
|
+
max_validation_retries: int | None = None,
|
|
761
|
+
priority: int | None = 0,
|
|
762
|
+
) -> Models.ToolOutput:
|
|
763
|
+
"""
|
|
764
|
+
Custom tool that can do almost anything!
|
|
765
|
+
|
|
766
|
+
Arguments:
|
|
767
|
+
text: The user prompt
|
|
768
|
+
output_lang: Language for the output summary
|
|
769
|
+
temperature: Controls randomness (0.0 = deterministic, 1.0 = creative)
|
|
770
|
+
logprobs: Whether to return token probability information
|
|
771
|
+
top_logprobs: Number of top token alternatives to return if logprobs enabled
|
|
772
|
+
validator: Custom validation function to validate the output
|
|
773
|
+
max_validation_retries: Maximum number of retry attempts if validation fails
|
|
774
|
+
priority: Task execution priority (if enabled by vLLM and model)
|
|
775
|
+
|
|
776
|
+
Returns:
|
|
777
|
+
ToolOutput: Object containing:
|
|
778
|
+
- result (str): The translated text
|
|
779
|
+
- logprobs (list | None): Probability data if logprobs enabled
|
|
780
|
+
- analysis (str | None): Detailed reasoning if with_analysis enabled
|
|
781
|
+
- errors (list(str) | None): Errors occured during tool call
|
|
782
|
+
"""
|
|
783
|
+
start = datetime.now()
|
|
784
|
+
output = self._operator.run(
|
|
785
|
+
# User paramaeters
|
|
786
|
+
text=prompt,
|
|
787
|
+
output_model=output_model,
|
|
788
|
+
output_model_str=output_model.model_json_schema(),
|
|
789
|
+
output_lang=output_lang,
|
|
790
|
+
temperature=temperature,
|
|
791
|
+
logprobs=logprobs,
|
|
792
|
+
top_logprobs=top_logprobs,
|
|
793
|
+
validator=validator,
|
|
794
|
+
max_validation_retries=max_validation_retries,
|
|
795
|
+
priority=priority,
|
|
796
|
+
# Internal parameters
|
|
797
|
+
prompt_file="run_custom.yaml",
|
|
798
|
+
user_prompt=None,
|
|
799
|
+
with_analysis=False,
|
|
800
|
+
mode=None,
|
|
801
|
+
)
|
|
802
|
+
end = datetime.now()
|
|
803
|
+
output.execution_time = (end - start).total_seconds()
|
|
804
|
+
return output
|