goose-py 0.1.0__tar.gz → 0.1.2__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.1.0 → goose_py-0.1.2}/PKG-INFO +1 -1
- {goose_py-0.1.0 → goose_py-0.1.2}/goose/core.py +12 -13
- goose_py-0.1.2/goose/errors.py +2 -0
- {goose_py-0.1.0 → goose_py-0.1.2}/goose/types.py +6 -0
- {goose_py-0.1.0 → goose_py-0.1.2}/pyproject.toml +1 -1
- goose_py-0.1.0/goose/regenerator.py +0 -5
- {goose_py-0.1.0 → goose_py-0.1.2}/README.md +0 -0
- {goose_py-0.1.0 → goose_py-0.1.2}/goose/__init__.py +0 -0
- {goose_py-0.1.0 → goose_py-0.1.2}/goose/agent.py +0 -0
- {goose_py-0.1.0 → goose_py-0.1.2}/goose/conversation.py +0 -0
- {goose_py-0.1.0 → goose_py-0.1.2}/goose/py.typed +0 -0
@@ -9,8 +9,8 @@ from graphlib import TopologicalSorter
|
|
9
9
|
from pydantic import BaseModel
|
10
10
|
|
11
11
|
from goose.agent import Agent
|
12
|
+
from goose.errors import Honk
|
12
13
|
from goose.conversation import Conversation, ConversationState
|
13
|
-
from goose.regenerator import default_regenerator
|
14
14
|
from goose.types import AgentResponse, UserMessage
|
15
15
|
|
16
16
|
|
@@ -41,7 +41,7 @@ class Task[**P, R: BaseModel]:
|
|
41
41
|
) -> None:
|
42
42
|
self.retries = retries
|
43
43
|
self._generator = generator
|
44
|
-
self._regenerator: IRegenerator[R] =
|
44
|
+
self._regenerator: IRegenerator[R] | None = None
|
45
45
|
self._signature = inspect.signature(generator)
|
46
46
|
self.__validate_fn()
|
47
47
|
|
@@ -49,7 +49,7 @@ class Task[**P, R: BaseModel]:
|
|
49
49
|
def result_type(self) -> type[R]:
|
50
50
|
return_type = self._generator.__annotations__.get("return")
|
51
51
|
if return_type is None:
|
52
|
-
raise
|
52
|
+
raise Honk("Task must have a return type annotation")
|
53
53
|
|
54
54
|
return return_type
|
55
55
|
|
@@ -65,6 +65,9 @@ class Task[**P, R: BaseModel]:
|
|
65
65
|
return await self._generator(*args, **kwargs)
|
66
66
|
|
67
67
|
async def regenerate(self, *, result: R, conversation: Conversation[R]) -> R:
|
68
|
+
if self._regenerator is None:
|
69
|
+
raise Honk("Task does not have a regenerator implemented")
|
70
|
+
|
68
71
|
return await self._regenerator(result=result, conversation=conversation)
|
69
72
|
|
70
73
|
def __call__(self, *args: P.args, **kwargs: P.kwargs) -> "Node[R]":
|
@@ -76,7 +79,7 @@ class Task[**P, R: BaseModel]:
|
|
76
79
|
param.kind == inspect.Parameter.POSITIONAL_ONLY
|
77
80
|
for param in self._signature.parameters.values()
|
78
81
|
):
|
79
|
-
raise
|
82
|
+
raise Honk("Positional-only parameters are not supported in Tasks")
|
80
83
|
|
81
84
|
|
82
85
|
class Node[R: BaseModel]:
|
@@ -97,7 +100,7 @@ class Node[R: BaseModel]:
|
|
97
100
|
self._result: R | NoResult = NoResult()
|
98
101
|
current_flow = Flow.get_current()
|
99
102
|
if current_flow is None:
|
100
|
-
raise
|
103
|
+
raise Honk("Cannot create a node without an active flow")
|
101
104
|
self.id = current_flow.add_node(node=self)
|
102
105
|
|
103
106
|
@property
|
@@ -107,7 +110,7 @@ class Node[R: BaseModel]:
|
|
107
110
|
@property
|
108
111
|
def result(self) -> R:
|
109
112
|
if isinstance(self._result, NoResult):
|
110
|
-
raise
|
113
|
+
raise Honk("Cannot access result of a node before it has run")
|
111
114
|
return self._result
|
112
115
|
|
113
116
|
async def generate(self) -> None:
|
@@ -192,9 +195,7 @@ class Flow:
|
|
192
195
|
for node_state in flow_state.nodes:
|
193
196
|
matching_node = nodes_by_name.get(node_state.name)
|
194
197
|
if matching_node is None:
|
195
|
-
raise
|
196
|
-
f"Node {node_state.name} from state not found in flow"
|
197
|
-
)
|
198
|
+
raise Honk(f"Node {node_state.name} from state not found in flow")
|
198
199
|
|
199
200
|
matching_node.load_state(state=node_state)
|
200
201
|
|
@@ -215,7 +216,7 @@ class Flow:
|
|
215
216
|
|
216
217
|
async def regenerate(self, *, target: Node[Any], message: UserMessage) -> None:
|
217
218
|
if not target.has_result:
|
218
|
-
raise
|
219
|
+
raise Honk("Cannot regenerate a node without a result")
|
219
220
|
|
220
221
|
await target.regenerate(message=message)
|
221
222
|
|
@@ -265,9 +266,7 @@ class Flow:
|
|
265
266
|
|
266
267
|
def __enter__(self) -> Self:
|
267
268
|
if self._current.get() is not None:
|
268
|
-
raise
|
269
|
-
"Cannot enter a new flow while another flow is already active"
|
270
|
-
)
|
269
|
+
raise Honk("Cannot enter a new flow while another flow is already active")
|
271
270
|
self._current.set(self)
|
272
271
|
return self
|
273
272
|
|
@@ -14,12 +14,18 @@ class GeminiModel(StrEnum):
|
|
14
14
|
|
15
15
|
|
16
16
|
class UserMediaContentType(StrEnum):
|
17
|
+
# images
|
17
18
|
JPEG = "image/jpeg"
|
18
19
|
PNG = "image/png"
|
19
20
|
WEBP = "image/webp"
|
21
|
+
|
22
|
+
# audio
|
20
23
|
MP3 = "audio/mpeg"
|
21
24
|
WAV = "audio/wav"
|
22
25
|
|
26
|
+
# files
|
27
|
+
PDF = "application/pdf"
|
28
|
+
|
23
29
|
|
24
30
|
class LLMTextMessagePart(TypedDict):
|
25
31
|
type: Literal["text"]
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|