goose-py 0.3.6__tar.gz → 0.3.7__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.3.6 → goose_py-0.3.7}/PKG-INFO +1 -1
- {goose_py-0.3.6 → goose_py-0.3.7}/goose/flow.py +28 -51
- {goose_py-0.3.6 → goose_py-0.3.7}/pyproject.toml +1 -1
- {goose_py-0.3.6 → goose_py-0.3.7}/README.md +0 -0
- {goose_py-0.3.6 → goose_py-0.3.7}/goose/__init__.py +0 -0
- {goose_py-0.3.6 → goose_py-0.3.7}/goose/agent.py +0 -0
- {goose_py-0.3.6 → goose_py-0.3.7}/goose/errors.py +0 -0
- {goose_py-0.3.6 → goose_py-0.3.7}/goose/py.typed +0 -0
- {goose_py-0.3.6 → goose_py-0.3.7}/goose/store.py +0 -0
@@ -12,7 +12,7 @@ from typing import (
|
|
12
12
|
overload,
|
13
13
|
)
|
14
14
|
|
15
|
-
from pydantic import BaseModel, ConfigDict
|
15
|
+
from pydantic import BaseModel, ConfigDict
|
16
16
|
|
17
17
|
from goose.agent import (
|
18
18
|
Agent,
|
@@ -32,51 +32,34 @@ class Result(BaseModel):
|
|
32
32
|
model_config = ConfigDict(frozen=True)
|
33
33
|
|
34
34
|
|
35
|
-
class GooseResponse[R: Result](BaseModel):
|
36
|
-
result: R
|
37
|
-
|
38
|
-
|
39
35
|
class Conversation[R: Result](BaseModel):
|
40
|
-
|
36
|
+
user_messages: list[UserMessage]
|
37
|
+
result_messages: list[R]
|
41
38
|
context: SystemMessage | None = None
|
42
39
|
|
43
|
-
@field_validator("messages")
|
44
|
-
def alternates_starting_with_result(
|
45
|
-
cls, messages: list[UserMessage | GooseResponse[R]]
|
46
|
-
) -> list[UserMessage | GooseResponse[R]]:
|
47
|
-
if len(messages) == 0:
|
48
|
-
return messages
|
49
|
-
elif isinstance(messages[0], UserMessage):
|
50
|
-
raise Honk(
|
51
|
-
"User cannot start a conversation on a Task, must begin with a Result"
|
52
|
-
)
|
53
|
-
|
54
|
-
last_message_type: type[UserMessage | GooseResponse[R]] = type(messages[0])
|
55
|
-
for message in messages[1:]:
|
56
|
-
if isinstance(message, last_message_type):
|
57
|
-
raise Honk(
|
58
|
-
"Conversation must alternate between User and Result messages"
|
59
|
-
)
|
60
|
-
last_message_type = type(message)
|
61
|
-
|
62
|
-
return messages
|
63
|
-
|
64
40
|
@property
|
65
41
|
def awaiting_response(self) -> bool:
|
66
|
-
return len(self.
|
42
|
+
return len(self.user_messages) == len(self.result_messages)
|
67
43
|
|
68
44
|
def render(self) -> list[LLMMessage]:
|
69
45
|
messages: list[LLMMessage] = []
|
70
46
|
if self.context is not None:
|
71
47
|
messages.append(self.context.render())
|
72
48
|
|
73
|
-
for
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
49
|
+
for message_index in range(len(self.user_messages)):
|
50
|
+
messages.append(
|
51
|
+
AssistantMessage(
|
52
|
+
text=self.result_messages[message_index].model_dump_json()
|
53
|
+
).render()
|
54
|
+
)
|
55
|
+
messages.append(self.user_messages[message_index].render())
|
56
|
+
|
57
|
+
if len(self.result_messages) > len(self.user_messages):
|
58
|
+
messages.append(
|
59
|
+
AssistantMessage(
|
60
|
+
text=self.result_messages[-1].model_dump_json()
|
61
|
+
).render()
|
62
|
+
)
|
80
63
|
|
81
64
|
return messages
|
82
65
|
|
@@ -93,12 +76,11 @@ class NodeState[ResultT: Result](BaseModel):
|
|
93
76
|
|
94
77
|
@property
|
95
78
|
def result(self) -> ResultT:
|
96
|
-
|
97
|
-
if isinstance(last_message, GooseResponse):
|
98
|
-
return last_message.result
|
99
|
-
else:
|
79
|
+
if len(self.conversation.result_messages) == 0:
|
100
80
|
raise Honk("Node awaiting response, has no result")
|
101
81
|
|
82
|
+
return self.conversation.result_messages[-1]
|
83
|
+
|
102
84
|
def set_context(self, *, context: SystemMessage) -> Self:
|
103
85
|
self.conversation.context = context
|
104
86
|
return self
|
@@ -110,19 +92,16 @@ class NodeState[ResultT: Result](BaseModel):
|
|
110
92
|
new_input_hash: int | None = None,
|
111
93
|
overwrite: bool = False,
|
112
94
|
) -> Self:
|
113
|
-
if overwrite:
|
114
|
-
|
115
|
-
self.conversation.messages.append(GooseResponse(result=result))
|
116
|
-
else:
|
117
|
-
self.conversation.messages[-1] = GooseResponse(result=result)
|
95
|
+
if overwrite and len(self.conversation.result_messages) > 0:
|
96
|
+
self.conversation.result_messages[-1] = result
|
118
97
|
else:
|
119
|
-
self.conversation.
|
98
|
+
self.conversation.result_messages.append(result)
|
120
99
|
if new_input_hash is not None:
|
121
100
|
self.last_input_hash = new_input_hash
|
122
101
|
return self
|
123
102
|
|
124
103
|
def add_user_message(self, *, message: UserMessage) -> Self:
|
125
|
-
self.conversation.
|
104
|
+
self.conversation.user_messages.append(message)
|
126
105
|
return self
|
127
106
|
|
128
107
|
|
@@ -178,7 +157,9 @@ class FlowRun:
|
|
178
157
|
return NodeState[task.result_type](
|
179
158
|
task_name=task.name,
|
180
159
|
index=index or 0,
|
181
|
-
conversation=Conversation[task.result_type](
|
160
|
+
conversation=Conversation[task.result_type](
|
161
|
+
user_messages=[], result_messages=[]
|
162
|
+
),
|
182
163
|
last_input_hash=0,
|
183
164
|
)
|
184
165
|
|
@@ -314,10 +295,6 @@ class Task[**P, R: Result]:
|
|
314
295
|
state.add_result(result=result, new_input_hash=input_hash, overwrite=True)
|
315
296
|
return result
|
316
297
|
else:
|
317
|
-
if not isinstance(state.conversation.messages[-1], GooseResponse):
|
318
|
-
raise Honk(
|
319
|
-
"Conversation must alternate between User and Result messages"
|
320
|
-
)
|
321
298
|
return state.result
|
322
299
|
|
323
300
|
async def jam(
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|