fabricatio 0.2.1.dev4__cp312-cp312-win_amd64.whl → 0.2.3.dev0__cp312-cp312-win_amd64.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.
- fabricatio/_rust.cp312-win_amd64.pyd +0 -0
- fabricatio/capabilities/rating.py +79 -1
- fabricatio/config.py +3 -0
- fabricatio/core.py +33 -19
- fabricatio/models/action.py +6 -2
- fabricatio/models/task.py +61 -9
- {fabricatio-0.2.1.dev4.data → fabricatio-0.2.3.dev0.data}/scripts/tdown.exe +0 -0
- {fabricatio-0.2.1.dev4.dist-info → fabricatio-0.2.3.dev0.dist-info}/METADATA +1 -1
- {fabricatio-0.2.1.dev4.dist-info → fabricatio-0.2.3.dev0.dist-info}/RECORD +11 -11
- {fabricatio-0.2.1.dev4.dist-info → fabricatio-0.2.3.dev0.dist-info}/WHEEL +0 -0
- {fabricatio-0.2.1.dev4.dist-info → fabricatio-0.2.3.dev0.dist-info}/licenses/LICENSE +0 -0
Binary file
|
@@ -12,7 +12,7 @@ from fabricatio.models.generic import WithBriefing
|
|
12
12
|
from fabricatio.models.kwargs_types import GenerateKwargs, ValidateKwargs
|
13
13
|
from fabricatio.models.usages import LLMUsage
|
14
14
|
from fabricatio.parser import JsonCapture
|
15
|
-
from more_itertools import flatten
|
15
|
+
from more_itertools import flatten, windowed
|
16
16
|
from pydantic import NonNegativeInt, PositiveInt
|
17
17
|
|
18
18
|
|
@@ -275,3 +275,81 @@ class GiveRating(WithBriefing, LLMUsage):
|
|
275
275
|
validator=_criteria_validator,
|
276
276
|
**kwargs,
|
277
277
|
)
|
278
|
+
|
279
|
+
async def drafting_rating_weights_klee(
|
280
|
+
self,
|
281
|
+
topic: str,
|
282
|
+
criteria: Set[str],
|
283
|
+
**kwargs: Unpack[ValidateKwargs],
|
284
|
+
) -> Dict[str, float]:
|
285
|
+
"""Drafts rating weights for a given topic and criteria using the Klee method.
|
286
|
+
|
287
|
+
Args:
|
288
|
+
topic (str): The topic for the rating weights.
|
289
|
+
criteria (Set[str]): A set of criteria for the rating weights.
|
290
|
+
**kwargs (Unpack[ValidateKwargs]): Additional keyword arguments for the LLM usage.
|
291
|
+
|
292
|
+
Returns:
|
293
|
+
Dict[str, float]: A dictionary representing the drafted rating weights for each criterion.
|
294
|
+
"""
|
295
|
+
if len(criteria) < 2: # noqa: PLR2004
|
296
|
+
raise ValueError("At least two criteria are required to draft rating weights")
|
297
|
+
|
298
|
+
def _validator(resp: str) -> float | None:
|
299
|
+
if (cap := JsonCapture.convert_with(resp, orjson.loads)) is not None and isinstance(cap, float):
|
300
|
+
return cap
|
301
|
+
return None
|
302
|
+
|
303
|
+
criteria = list(criteria) # freeze the order
|
304
|
+
windows = windowed(criteria, 2)
|
305
|
+
|
306
|
+
# get the importance multiplier indicating how important is second criterion compared to the first one
|
307
|
+
relative_weights = await self.aask_validate_batch(
|
308
|
+
questions=[
|
309
|
+
template_manager.render_template(
|
310
|
+
configs.templates.draft_rating_weights_klee_template,
|
311
|
+
{
|
312
|
+
"topic": topic,
|
313
|
+
"first": pair[0],
|
314
|
+
"second": pair[1],
|
315
|
+
},
|
316
|
+
)
|
317
|
+
for pair in windows
|
318
|
+
],
|
319
|
+
validator=_validator,
|
320
|
+
**GenerateKwargs(system_message=f"# your personal briefing: \n{self.briefing}", **kwargs),
|
321
|
+
)
|
322
|
+
weights = [1]
|
323
|
+
for rw in relative_weights:
|
324
|
+
weights.append(weights[-1] * rw)
|
325
|
+
total = sum(weights)
|
326
|
+
return dict(zip(criteria, [w / total for w in weights], strict=True))
|
327
|
+
|
328
|
+
async def composite_score(
|
329
|
+
self,
|
330
|
+
topic: str,
|
331
|
+
to_rate: List[str],
|
332
|
+
reasons_count: PositiveInt = 2,
|
333
|
+
criteria_count: PositiveInt = 5,
|
334
|
+
**kwargs: Unpack[ValidateKwargs],
|
335
|
+
) -> List[float]:
|
336
|
+
"""Calculates the composite scores for a list of items based on a given topic and criteria.
|
337
|
+
|
338
|
+
Args:
|
339
|
+
topic (str): The topic for the rating.
|
340
|
+
to_rate (List[str]): A list of strings to be rated.
|
341
|
+
reasons_count (PositiveInt, optional): The number of reasons to extract from each pair of examples. Defaults to 2.
|
342
|
+
criteria_count (PositiveInt, optional): The number of criteria to draft. Defaults to 5.
|
343
|
+
**kwargs (Unpack[ValidateKwargs]): Additional keyword arguments for the LLM usage.
|
344
|
+
|
345
|
+
Returns:
|
346
|
+
List[float]: A list of composite scores for the items.
|
347
|
+
"""
|
348
|
+
criteria = await self.draft_rating_criteria_from_examples(
|
349
|
+
topic, to_rate, reasons_count, criteria_count, **kwargs
|
350
|
+
)
|
351
|
+
weights = await self.drafting_rating_weights_klee(topic, criteria, **kwargs)
|
352
|
+
logger.info(f"Criteria: {criteria}\nWeights: {weights}")
|
353
|
+
ratings_seq = await self.rate(to_rate, topic, criteria, **kwargs)
|
354
|
+
|
355
|
+
return [sum(ratings[c] * weights[c] for c in criteria) for ratings in ratings_seq]
|
fabricatio/config.py
CHANGED
@@ -172,6 +172,9 @@ class TemplateConfig(BaseModel):
|
|
172
172
|
extract_criteria_from_reasons_template: str = Field(default="extract_criteria_from_reasons")
|
173
173
|
"""The name of the extract criteria from reasons template which will be used to extract criteria from reasons."""
|
174
174
|
|
175
|
+
draft_rating_weights_klee_template: str = Field(default="draft_rating_weights_klee")
|
176
|
+
"""The name of the draft rating weights klee template which will be used to draft rating weights with Klee method."""
|
177
|
+
|
175
178
|
|
176
179
|
class MagikaConfig(BaseModel):
|
177
180
|
"""Magika configuration class."""
|
fabricatio/core.py
CHANGED
@@ -38,11 +38,11 @@ class Env(BaseModel):
|
|
38
38
|
|
39
39
|
@overload
|
40
40
|
def on[**P, R](
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
41
|
+
self,
|
42
|
+
event: str | Event,
|
43
|
+
func: Optional[Callable[P, R]] = None,
|
44
|
+
/,
|
45
|
+
ttl: int = -1,
|
46
46
|
) -> Callable[[Callable[P, R]], Callable[P, R]]:
|
47
47
|
"""
|
48
48
|
Registers an event listener with a specific function that listens indefinitely or for a specified number of times.
|
@@ -58,11 +58,11 @@ class Env(BaseModel):
|
|
58
58
|
...
|
59
59
|
|
60
60
|
def on[**P, R](
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
61
|
+
self,
|
62
|
+
event: str | Event,
|
63
|
+
func: Optional[Callable[P, R]] = None,
|
64
|
+
/,
|
65
|
+
ttl=-1,
|
66
66
|
) -> Callable[[Callable[P, R]], Callable[P, R]] | Self:
|
67
67
|
"""Registers an event listener with a specific function that listens indefinitely or for a specified number of times.
|
68
68
|
|
@@ -78,14 +78,13 @@ class Env(BaseModel):
|
|
78
78
|
event = event.collapse()
|
79
79
|
if func is None:
|
80
80
|
return self._ee.on(event, ttl=ttl)
|
81
|
-
|
82
81
|
self._ee.on(event, func, ttl=ttl)
|
83
82
|
return self
|
84
83
|
|
85
84
|
@overload
|
86
85
|
def once[**P, R](
|
87
|
-
|
88
|
-
|
86
|
+
self,
|
87
|
+
event: str | Event,
|
89
88
|
) -> Callable[[Callable[P, R]], Callable[P, R]]:
|
90
89
|
"""
|
91
90
|
Registers an event listener that listens only once.
|
@@ -100,9 +99,9 @@ class Env(BaseModel):
|
|
100
99
|
|
101
100
|
@overload
|
102
101
|
def once[**P, R](
|
103
|
-
|
104
|
-
|
105
|
-
|
102
|
+
self,
|
103
|
+
event: str | Event,
|
104
|
+
func: Callable[[Callable[P, R]], Callable[P, R]],
|
106
105
|
) -> Self:
|
107
106
|
"""
|
108
107
|
Registers an event listener with a specific function that listens only once.
|
@@ -117,9 +116,9 @@ class Env(BaseModel):
|
|
117
116
|
...
|
118
117
|
|
119
118
|
def once[**P, R](
|
120
|
-
|
121
|
-
|
122
|
-
|
119
|
+
self,
|
120
|
+
event: str | Event,
|
121
|
+
func: Optional[Callable[P, R]] = None,
|
123
122
|
) -> Callable[[Callable[P, R]], Callable[P, R]] | Self:
|
124
123
|
"""Registers an event listener with a specific function that listens only once.
|
125
124
|
|
@@ -163,5 +162,20 @@ class Env(BaseModel):
|
|
163
162
|
event = event.collapse()
|
164
163
|
return await self._ee.emit_async(event, *args, **kwargs)
|
165
164
|
|
165
|
+
def emit_future[**P](self, event: str | Event, *args: P.args, **kwargs: P.kwargs) -> None:
|
166
|
+
"""Emits an event to all registered listeners and returns a future object.
|
167
|
+
|
168
|
+
Args:
|
169
|
+
event (str | Event): The event to emit.
|
170
|
+
*args: Positional arguments to pass to the listeners.
|
171
|
+
**kwargs: Keyword arguments to pass to the listeners.
|
172
|
+
|
173
|
+
Returns:
|
174
|
+
None: The future object.
|
175
|
+
"""
|
176
|
+
if isinstance(event, Event):
|
177
|
+
event = event.collapse()
|
178
|
+
return self._ee.emit_future(event, *args, **kwargs)
|
179
|
+
|
166
180
|
|
167
181
|
env = Env()
|
fabricatio/models/action.py
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
import traceback
|
4
4
|
from abc import abstractmethod
|
5
|
-
from asyncio import Queue
|
5
|
+
from asyncio import Queue, create_task
|
6
6
|
from typing import Any, Dict, Self, Tuple, Type, Union, Unpack
|
7
7
|
|
8
8
|
from fabricatio.capabilities.rating import GiveRating
|
@@ -108,7 +108,11 @@ class WorkFlow(WithBriefing, ToolBoxUsage):
|
|
108
108
|
try:
|
109
109
|
for step in self._instances:
|
110
110
|
logger.debug(f"Executing step: {step.name}")
|
111
|
-
|
111
|
+
act_task = create_task(step.act(await self._context.get()))
|
112
|
+
if task.is_cancelled():
|
113
|
+
act_task.cancel(f"Cancelled by task: {task.name}")
|
114
|
+
break
|
115
|
+
modified_ctx = await act_task
|
112
116
|
await self._context.put(modified_ctx)
|
113
117
|
current_action = step.name
|
114
118
|
logger.info(f"Finished executing workflow: {self.name}")
|
fabricatio/models/task.py
CHANGED
@@ -60,7 +60,7 @@ class Task[T](WithBriefing, WithJsonExample, WithDependency):
|
|
60
60
|
dependencies: List[str] = Field(default_factory=list)
|
61
61
|
"""A list of file paths, These file are needed to read or write to meet a specific requirement of this task, if it is not directly given out, it SHALL just be a empty list meaning `NOT ASSIGNED`"""
|
62
62
|
|
63
|
-
_output: Queue = PrivateAttr(default_factory=
|
63
|
+
_output: Queue[T | None] = PrivateAttr(default_factory=Queue)
|
64
64
|
"""The output queue of the task."""
|
65
65
|
|
66
66
|
_status: TaskStatus = PrivateAttr(default=TaskStatus.Pending)
|
@@ -131,7 +131,7 @@ class Task[T](WithBriefing, WithJsonExample, WithDependency):
|
|
131
131
|
self.description = description
|
132
132
|
return self
|
133
133
|
|
134
|
-
async def get_output(self) -> T:
|
134
|
+
async def get_output(self) -> T | None:
|
135
135
|
"""Get the output of the task.
|
136
136
|
|
137
137
|
Returns:
|
@@ -232,6 +232,7 @@ class Task[T](WithBriefing, WithJsonExample, WithDependency):
|
|
232
232
|
"""
|
233
233
|
logger.info(f"Cancelling task `{self.name}`")
|
234
234
|
self._status = TaskStatus.Cancelled
|
235
|
+
await self._output.put(None)
|
235
236
|
await env.emit_async(self.cancelled_label, self)
|
236
237
|
return self
|
237
238
|
|
@@ -243,27 +244,38 @@ class Task[T](WithBriefing, WithJsonExample, WithDependency):
|
|
243
244
|
"""
|
244
245
|
logger.info(f"Failing task `{self.name}`")
|
245
246
|
self._status = TaskStatus.Failed
|
247
|
+
await self._output.put(None)
|
246
248
|
await env.emit_async(self.failed_label, self)
|
247
249
|
return self
|
248
250
|
|
249
|
-
|
251
|
+
def publish(self, new_namespace: Optional[EventLike] = None) -> Self:
|
250
252
|
"""Publish the task to the event bus.
|
251
253
|
|
254
|
+
Args:
|
255
|
+
new_namespace(EventLike, optional): The new namespace to move the task to.
|
256
|
+
|
252
257
|
Returns:
|
253
|
-
Task: The published instance of the `Task` class
|
258
|
+
Task: The published instance of the `Task` class.
|
254
259
|
"""
|
260
|
+
if new_namespace:
|
261
|
+
self.move_to(new_namespace)
|
255
262
|
logger.info(f"Publishing task `{(label := self.pending_label)}`")
|
256
|
-
|
263
|
+
env.emit_future(label, self)
|
257
264
|
return self
|
258
265
|
|
259
|
-
async def delegate(self) -> T:
|
260
|
-
"""Delegate the task to the event
|
266
|
+
async def delegate(self, new_namespace: Optional[EventLike] = None) -> T | None:
|
267
|
+
"""Delegate the task to the event.
|
268
|
+
|
269
|
+
Args:
|
270
|
+
new_namespace(EventLike, optional): The new namespace to move the task to.
|
261
271
|
|
262
272
|
Returns:
|
263
|
-
T: The output of the task
|
273
|
+
T|None: The output of the task.
|
264
274
|
"""
|
275
|
+
if new_namespace:
|
276
|
+
self.move_to(new_namespace)
|
265
277
|
logger.info(f"Delegating task `{(label := self.pending_label)}`")
|
266
|
-
|
278
|
+
env.emit_future(label, self)
|
267
279
|
return await self.get_output()
|
268
280
|
|
269
281
|
@property
|
@@ -277,3 +289,43 @@ class Task[T](WithBriefing, WithJsonExample, WithDependency):
|
|
277
289
|
configs.templates.task_briefing_template,
|
278
290
|
self.model_dump(),
|
279
291
|
)
|
292
|
+
|
293
|
+
def is_running(self) -> bool:
|
294
|
+
"""Check if the task is running.
|
295
|
+
|
296
|
+
Returns:
|
297
|
+
bool: True if the task is running, False otherwise.
|
298
|
+
"""
|
299
|
+
return self._status == TaskStatus.Running
|
300
|
+
|
301
|
+
def is_finished(self) -> bool:
|
302
|
+
"""Check if the task is finished.
|
303
|
+
|
304
|
+
Returns:
|
305
|
+
bool: True if the task is finished, False otherwise.
|
306
|
+
"""
|
307
|
+
return self._status == TaskStatus.Finished
|
308
|
+
|
309
|
+
def is_failed(self) -> bool:
|
310
|
+
"""Check if the task is failed.
|
311
|
+
|
312
|
+
Returns:
|
313
|
+
bool: True if the task is failed, False otherwise.
|
314
|
+
"""
|
315
|
+
return self._status == TaskStatus.Failed
|
316
|
+
|
317
|
+
def is_cancelled(self) -> bool:
|
318
|
+
"""Check if the task is cancelled.
|
319
|
+
|
320
|
+
Returns:
|
321
|
+
bool: True if the task is cancelled, False otherwise.
|
322
|
+
"""
|
323
|
+
return self._status == TaskStatus.Cancelled
|
324
|
+
|
325
|
+
def is_pending(self) -> bool:
|
326
|
+
"""Check if the task is pending.
|
327
|
+
|
328
|
+
Returns:
|
329
|
+
bool: True if the task is pending, False otherwise.
|
330
|
+
"""
|
331
|
+
return self._status == TaskStatus.Pending
|
Binary file
|
@@ -1,24 +1,24 @@
|
|
1
|
-
fabricatio-0.2.
|
2
|
-
fabricatio-0.2.
|
3
|
-
fabricatio-0.2.
|
1
|
+
fabricatio-0.2.3.dev0.dist-info/METADATA,sha256=AbSeMTWK-eEnD_dWakSjEUsP-XE9mBHA-8_1JK3EYr4,12339
|
2
|
+
fabricatio-0.2.3.dev0.dist-info/WHEEL,sha256=tpW5AN9B-9qsM9WW2FXG2r193YXiqexDadpKp0A2daI,96
|
3
|
+
fabricatio-0.2.3.dev0.dist-info/licenses/LICENSE,sha256=do7J7EiCGbq0QPbMAL_FqLYufXpHnCnXBOuqVPwSV8Y,1088
|
4
4
|
fabricatio/actions/communication.py,sha256=NZxIIncKgJSDyBrqNebUtH_haqtxHa8ld2TZxT3CMdU,429
|
5
5
|
fabricatio/actions/transmission.py,sha256=xpvKqbXqgpi1BWy-vUUvmd8NZ1GhRNfsYUBp-l2jLyk,862
|
6
6
|
fabricatio/actions/__init__.py,sha256=eFmFVPQvtNgFynIXBVr3eP-vWQDWCPng60YY5LXvZgg,115
|
7
|
-
fabricatio/capabilities/rating.py,sha256=
|
7
|
+
fabricatio/capabilities/rating.py,sha256=zmTUvsUfxFgovRQzy4djL2zKRYTHmN6JY7A4lyT5uVQ,14907
|
8
8
|
fabricatio/capabilities/task.py,sha256=d2xtrwQxXWI40UskQCR5YhHarY7ST0ppr8TjY12uWQE,5327
|
9
|
-
fabricatio/config.py,sha256=
|
10
|
-
fabricatio/core.py,sha256=
|
9
|
+
fabricatio/config.py,sha256=wzaaUHZZMRCYc37M_M4qKuLOYtwdEjYtyG77-AGkqCg,11467
|
10
|
+
fabricatio/core.py,sha256=VQ_JKgUGIy2gZ8xsTBZCdr_IP7wC5aPg0_bsOmjQ588,6458
|
11
11
|
fabricatio/decorators.py,sha256=uzsP4tFKQNjDHBkofsjjoJA0IUAaYOtt6YVedoyOqlo,6551
|
12
12
|
fabricatio/fs/curd.py,sha256=faMstgGUiQ4k2AW3OXfvvWWTldTtKXco7QINYaMjmyA,3981
|
13
13
|
fabricatio/fs/readers.py,sha256=Pz1-cdZYtmqr032dsroImlkFXAd0kCYY_9qVpD4UrG4,1045
|
14
14
|
fabricatio/fs/__init__.py,sha256=lWcKYg0v3mv2LnnSegOQaTtlVDODU0vtw_s6iKU5IqQ,122
|
15
15
|
fabricatio/journal.py,sha256=siqimKF0M_QaaOCMxtjr_BJVNyUIAQWILzE9Q4T6-7c,781
|
16
|
-
fabricatio/models/action.py,sha256=
|
16
|
+
fabricatio/models/action.py,sha256=NpklAVUHYO5JIY9YLwYowZ-U8R9CFf5aC10DhLF7gxQ,5924
|
17
17
|
fabricatio/models/events.py,sha256=mrihNEFgQ5o7qFWja1z_qX8dnaTLwPBoJdVlzxQV5oM,2719
|
18
18
|
fabricatio/models/generic.py,sha256=WEjZ96rTyBjaBjkM6e8E4Pg_Naot4xWRvGJteqBiCCI,5133
|
19
19
|
fabricatio/models/kwargs_types.py,sha256=nTtD3wzSpCg-NlrJ43yW6lmfeWzD2V_XGMPlL5mXzyc,1147
|
20
20
|
fabricatio/models/role.py,sha256=gYvleTeKUGDUNKPAC5B0EPMLC4jZ4vHsFHmHiVXkU6c,1830
|
21
|
-
fabricatio/models/task.py,sha256=
|
21
|
+
fabricatio/models/task.py,sha256=ip6VeOV7vgXqhiQFOCjVl3hzc6lgdhfyvxbBuSz2-C0,11529
|
22
22
|
fabricatio/models/tool.py,sha256=WTFnpF6xZ1nJbmIOonLsGQcM-kkDCeZiAFqyil9xg2U,6988
|
23
23
|
fabricatio/models/usages.py,sha256=iLxas1gE7MA55ZtQJJ-qu3W6JP5KLjPgmNKqNYIF6yU,23972
|
24
24
|
fabricatio/models/utils.py,sha256=i_kpcQpct04mQFk1nbcVGV-pl1YThWu4Qk3wbewzKkc,2535
|
@@ -31,6 +31,6 @@ fabricatio/toolboxes/__init__.py,sha256=b13KmASO8q5fBLwew964fn9oH86ER5g-S1PgA4fZ
|
|
31
31
|
fabricatio/_rust.pyi,sha256=0wCqtwWkVxxoqprvk8T27T8QYKIAKHS7xgsmdMNjQKc,1756
|
32
32
|
fabricatio/_rust_instances.py,sha256=dl0-yZ4UvT5g20tQgnPJpmqtkjFGXNG_YK4eLfi_ugQ,279
|
33
33
|
fabricatio/__init__.py,sha256=opIrN8lGyT-h2If4Qez0bRuWBa3uIT9GsM9CZy7_XJ0,1100
|
34
|
-
fabricatio/_rust.cp312-win_amd64.pyd,sha256=
|
35
|
-
fabricatio-0.2.
|
36
|
-
fabricatio-0.2.
|
34
|
+
fabricatio/_rust.cp312-win_amd64.pyd,sha256=MMgVw-oe5Yw0aBgcHHDX4FExLxDD0Xx1mnDmzDM7Wcc,1266176
|
35
|
+
fabricatio-0.2.3.dev0.data/scripts/tdown.exe,sha256=AqyvPpwXz-hImUl93bB9nQO67AtojXG53SDN-Ltor8M,3397120
|
36
|
+
fabricatio-0.2.3.dev0.dist-info/RECORD,,
|
File without changes
|
File without changes
|