goose-py 0.4.1__tar.gz → 0.5.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {goose_py-0.4.1 → goose_py-0.5.0}/PKG-INFO +1 -1
- {goose_py-0.4.1 → goose_py-0.5.0}/goose/flow.py +38 -17
- {goose_py-0.4.1 → goose_py-0.5.0}/pyproject.toml +1 -1
- {goose_py-0.4.1 → goose_py-0.5.0}/README.md +0 -0
- {goose_py-0.4.1 → goose_py-0.5.0}/goose/__init__.py +0 -0
- {goose_py-0.4.1 → goose_py-0.5.0}/goose/agent.py +0 -0
- {goose_py-0.4.1 → goose_py-0.5.0}/goose/errors.py +0 -0
- {goose_py-0.4.1 → goose_py-0.5.0}/goose/py.typed +0 -0
- {goose_py-0.4.1 → goose_py-0.5.0}/goose/result.py +0 -0
- {goose_py-0.4.1 → goose_py-0.5.0}/goose/store.py +0 -0
@@ -18,14 +18,15 @@ from pydantic import BaseModel
|
|
18
18
|
from goose.agent import (
|
19
19
|
Agent,
|
20
20
|
AssistantMessage,
|
21
|
+
GeminiModel,
|
21
22
|
IAgentLogger,
|
22
23
|
LLMMessage,
|
23
24
|
SystemMessage,
|
24
25
|
UserMessage,
|
25
26
|
)
|
26
27
|
from goose.errors import Honk
|
28
|
+
from goose.result import Result, TextResult
|
27
29
|
from goose.store import IFlowRunStore, InMemoryFlowRunStore
|
28
|
-
from goose.result import Result
|
29
30
|
|
30
31
|
SerializedFlowRun = NewType("SerializedFlowRun", str)
|
31
32
|
|
@@ -65,7 +66,9 @@ class Conversation[R: Result](BaseModel):
|
|
65
66
|
class IAdapter[ResultT: Result](Protocol):
|
66
67
|
__code__: CodeType
|
67
68
|
|
68
|
-
async def __call__(
|
69
|
+
async def __call__(
|
70
|
+
self, *, conversation: Conversation[ResultT], agent: Agent
|
71
|
+
) -> ResultT: ...
|
69
72
|
|
70
73
|
|
71
74
|
class NodeState[ResultT: Result](BaseModel):
|
@@ -307,10 +310,12 @@ class Task[**P, R: Result]:
|
|
307
310
|
/,
|
308
311
|
*,
|
309
312
|
retries: int = 0,
|
313
|
+
adapter_model: GeminiModel = GeminiModel.FLASH,
|
310
314
|
) -> None:
|
311
315
|
self._generator = generator
|
312
|
-
self._adapter: IAdapter[R] | None = None
|
313
316
|
self._retries = retries
|
317
|
+
self._adapter_model = adapter_model
|
318
|
+
self._adapter_model = adapter_model
|
314
319
|
|
315
320
|
@property
|
316
321
|
def result_type(self) -> type[R]:
|
@@ -323,10 +328,6 @@ class Task[**P, R: Result]:
|
|
323
328
|
def name(self) -> str:
|
324
329
|
return self._generator.__name__
|
325
330
|
|
326
|
-
def adapter(self, adapter: IAdapter[R]) -> Self:
|
327
|
-
self._adapter = adapter
|
328
|
-
return self
|
329
|
-
|
330
331
|
async def generate(
|
331
332
|
self, state: NodeState[R], *args: P.args, **kwargs: P.kwargs
|
332
333
|
) -> R:
|
@@ -347,14 +348,14 @@ class Task[**P, R: Result]:
|
|
347
348
|
) -> R:
|
348
349
|
flow_run = self.__get_current_flow_run()
|
349
350
|
node_state = flow_run.get(task=self, index=index)
|
350
|
-
if self._adapter is None:
|
351
|
-
raise Honk("No adapter provided for Task")
|
352
351
|
|
353
352
|
if context is not None:
|
354
353
|
node_state.set_context(context=context)
|
355
354
|
node_state.add_user_message(message=user_message)
|
356
355
|
|
357
|
-
result = await self.
|
356
|
+
result = await self.__adapt(
|
357
|
+
conversation=node_state.conversation, agent=flow_run.agent
|
358
|
+
)
|
358
359
|
node_state.add_result(result=result)
|
359
360
|
flow_run.add_node_state(node_state)
|
360
361
|
|
@@ -367,15 +368,34 @@ class Task[**P, R: Result]:
|
|
367
368
|
flow_run.add_node_state(node_state)
|
368
369
|
return result
|
369
370
|
|
371
|
+
async def __adapt(self, *, conversation: Conversation[R], agent: Agent) -> R:
|
372
|
+
messages: list[UserMessage | AssistantMessage] = []
|
373
|
+
for message_index in range(len(conversation.user_messages)):
|
374
|
+
user_message = conversation.user_messages[message_index]
|
375
|
+
result = conversation.result_messages[message_index]
|
376
|
+
|
377
|
+
if isinstance(result, TextResult):
|
378
|
+
assistant_text = result.text
|
379
|
+
else:
|
380
|
+
assistant_text = result.model_dump_json()
|
381
|
+
assistant_message = AssistantMessage(text=assistant_text)
|
382
|
+
messages.append(assistant_message)
|
383
|
+
messages.append(user_message)
|
384
|
+
|
385
|
+
return await agent(
|
386
|
+
messages=messages,
|
387
|
+
model=self._adapter_model,
|
388
|
+
task_name=f"adapt--{self.name}",
|
389
|
+
system=conversation.context,
|
390
|
+
response_model=self.result_type,
|
391
|
+
)
|
392
|
+
|
370
393
|
def __hash_task_call(self, *args: P.args, **kwargs: P.kwargs) -> int:
|
371
394
|
try:
|
372
395
|
to_hash = str(
|
373
396
|
tuple(args)
|
374
397
|
+ tuple(kwargs.values())
|
375
|
-
+ (
|
376
|
-
self._generator.__code__,
|
377
|
-
self._adapter.__code__ if self._adapter is not None else None,
|
378
|
-
)
|
398
|
+
+ (self._generator.__code__, self._adapter_model)
|
379
399
|
)
|
380
400
|
return hash(to_hash)
|
381
401
|
except TypeError:
|
@@ -392,22 +412,23 @@ class Task[**P, R: Result]:
|
|
392
412
|
def task[**P, R: Result](generator: Callable[P, Awaitable[R]], /) -> Task[P, R]: ...
|
393
413
|
@overload
|
394
414
|
def task[**P, R: Result](
|
395
|
-
*, retries: int = 0
|
415
|
+
*, retries: int = 0, adapter_model: GeminiModel = GeminiModel.FLASH
|
396
416
|
) -> Callable[[Callable[P, Awaitable[R]]], Task[P, R]]: ...
|
397
417
|
def task[**P, R: Result](
|
398
418
|
generator: Callable[P, Awaitable[R]] | None = None,
|
399
419
|
/,
|
400
420
|
*,
|
401
421
|
retries: int = 0,
|
422
|
+
adapter_model: GeminiModel = GeminiModel.FLASH,
|
402
423
|
) -> Task[P, R] | Callable[[Callable[P, Awaitable[R]]], Task[P, R]]:
|
403
424
|
if generator is None:
|
404
425
|
|
405
426
|
def decorator(fn: Callable[P, Awaitable[R]]) -> Task[P, R]:
|
406
|
-
return Task(fn, retries=retries)
|
427
|
+
return Task(fn, retries=retries, adapter_model=adapter_model)
|
407
428
|
|
408
429
|
return decorator
|
409
430
|
|
410
|
-
return Task(generator, retries=retries)
|
431
|
+
return Task(generator, retries=retries, adapter_model=adapter_model)
|
411
432
|
|
412
433
|
|
413
434
|
@overload
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|