goose-py 0.3.0__tar.gz → 0.3.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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: goose-py
3
- Version: 0.3.0
3
+ Version: 0.3.2
4
4
  Summary: A tool for AI workflows based on human-computer collaboration and structured output.
5
5
  Home-page: https://github.com/chelle-ai/goose
6
6
  Keywords: ai,yaml,configuration,llm
@@ -2,7 +2,7 @@ import base64
2
2
  import logging
3
3
  from datetime import datetime
4
4
  from enum import StrEnum
5
- from typing import Any, Awaitable, Callable, ClassVar, Literal, NotRequired, TypedDict
5
+ from typing import Any, ClassVar, Literal, NotRequired, Protocol, TypedDict
6
6
 
7
7
  from litellm import acompletion
8
8
  from pydantic import BaseModel, computed_field
@@ -112,7 +112,7 @@ class AgentResponse[R: BaseModel](BaseModel):
112
112
  }
113
113
 
114
114
  response: R
115
- run_name: str
115
+ run_id: str
116
116
  flow_name: str
117
117
  task_name: str
118
118
  model: GeminiModel
@@ -144,16 +144,20 @@ class AgentResponse[R: BaseModel](BaseModel):
144
144
  return self.input_cost + self.output_cost
145
145
 
146
146
 
147
+ class IAgentLogger(Protocol):
148
+ async def __call__(self, *, response: AgentResponse[Any]) -> None: ...
149
+
150
+
147
151
  class Agent:
148
152
  def __init__(
149
153
  self,
150
154
  *,
151
155
  flow_name: str,
152
- run_name: str,
153
- logger: Callable[[AgentResponse[Any]], Awaitable[None]] | None = None,
156
+ run_id: str,
157
+ logger: IAgentLogger | None = None,
154
158
  ) -> None:
155
159
  self.flow_name = flow_name
156
- self.run_name = run_name
160
+ self.run_id = run_id
157
161
  self.logger = logger
158
162
 
159
163
  async def __call__[R: BaseModel](
@@ -189,7 +193,7 @@ class Agent:
189
193
  end_time = datetime.now()
190
194
  agent_response = AgentResponse(
191
195
  response=parsed_response,
192
- run_name=self.run_name,
196
+ run_id=self.run_id,
193
197
  flow_name=self.flow_name,
194
198
  task_name=task_name,
195
199
  model=model,
@@ -202,7 +206,7 @@ class Agent:
202
206
  )
203
207
 
204
208
  if self.logger is not None:
205
- await self.logger(agent_response)
209
+ await self.logger(response=agent_response)
206
210
  else:
207
211
  logging.info(agent_response.model_dump())
208
212
 
@@ -14,7 +14,14 @@ from typing import (
14
14
 
15
15
  from pydantic import BaseModel, ConfigDict, field_validator
16
16
 
17
- from goose.agent import Agent, AssistantMessage, LLMMessage, SystemMessage, UserMessage
17
+ from goose.agent import (
18
+ Agent,
19
+ AssistantMessage,
20
+ IAgentLogger,
21
+ LLMMessage,
22
+ SystemMessage,
23
+ UserMessage,
24
+ )
18
25
  from goose.errors import Honk
19
26
 
20
27
  SerializedFlowRun = NewType("SerializedFlowRun", str)
@@ -122,12 +129,17 @@ class FlowRun:
122
129
  def __init__(self) -> None:
123
130
  self._node_states: dict[tuple[str, int], str] = {}
124
131
  self._last_requested_indices: dict[str, int] = {}
125
- self._name = ""
132
+ self._flow_name = ""
133
+ self._id = ""
126
134
  self._agent: Agent | None = None
127
135
 
128
136
  @property
129
- def name(self) -> str:
130
- return self._name
137
+ def flow_name(self) -> str:
138
+ return self._flow_name
139
+
140
+ @property
141
+ def id(self) -> str:
142
+ return self._id
131
143
 
132
144
  @property
133
145
  def agent(self) -> Agent:
@@ -169,14 +181,24 @@ class FlowRun:
169
181
  last_input_hash=0,
170
182
  )
171
183
 
172
- def start(self, *, name: str) -> None:
184
+ def start(
185
+ self,
186
+ *,
187
+ flow_name: str,
188
+ run_id: str,
189
+ agent_logger: IAgentLogger | None = None,
190
+ ) -> None:
173
191
  self._last_requested_indices = {}
174
- self._name = name
175
- self._agent = Agent(flow_name=self.name, run_name=name)
192
+ self._flow_name = flow_name
193
+ self._id = run_id
194
+ self._agent = Agent(
195
+ flow_name=self.flow_name, run_id=self.id, logger=agent_logger
196
+ )
176
197
 
177
198
  def end(self) -> None:
178
199
  self._last_requested_indices = {}
179
- self._name = ""
200
+ self._flow_name = ""
201
+ self._id = ""
180
202
  self._agent = None
181
203
 
182
204
  def dump(self) -> SerializedFlowRun:
@@ -209,10 +231,16 @@ _current_flow_run: ContextVar[FlowRun | None] = ContextVar(
209
231
 
210
232
  class Flow[**P]:
211
233
  def __init__(
212
- self, fn: Callable[P, Awaitable[None]], /, *, name: str | None = None
234
+ self,
235
+ fn: Callable[P, Awaitable[None]],
236
+ /,
237
+ *,
238
+ name: str | None = None,
239
+ agent_logger: IAgentLogger | None = None,
213
240
  ) -> None:
214
241
  self._fn = fn
215
242
  self._name = name
243
+ self._agent_logger = agent_logger
216
244
 
217
245
  @property
218
246
  def name(self) -> str:
@@ -226,14 +254,18 @@ class Flow[**P]:
226
254
  return run
227
255
 
228
256
  @contextmanager
229
- def start_run(self, *, name: str, run: FlowRun | None = None) -> Iterator[FlowRun]:
230
- if run is None:
257
+ def start_run(
258
+ self, *, run_id: str, preload: FlowRun | None = None
259
+ ) -> Iterator[FlowRun]:
260
+ if preload is None:
231
261
  run = FlowRun()
262
+ else:
263
+ run = preload
232
264
 
233
265
  old_run = _current_flow_run.get()
234
266
  _current_flow_run.set(run)
235
267
 
236
- run.start(name=name)
268
+ run.start(flow_name=self.name, run_id=run_id, agent_logger=self._agent_logger)
237
269
  yield run
238
270
  run.end()
239
271
 
@@ -354,16 +386,20 @@ def task[**P, R: Result](
354
386
  def flow[**P](fn: Callable[P, Awaitable[None]], /) -> Flow[P]: ...
355
387
  @overload
356
388
  def flow[**P](
357
- *, name: str | None = None
389
+ *, name: str | None = None, agent_logger: IAgentLogger | None = None
358
390
  ) -> Callable[[Callable[P, Awaitable[None]]], Flow[P]]: ...
359
391
  def flow[**P](
360
- fn: Callable[P, Awaitable[None]] | None = None, /, *, name: str | None = None
392
+ fn: Callable[P, Awaitable[None]] | None = None,
393
+ /,
394
+ *,
395
+ name: str | None = None,
396
+ agent_logger: IAgentLogger | None = None,
361
397
  ) -> Flow[P] | Callable[[Callable[P, Awaitable[None]]], Flow[P]]:
362
398
  if fn is None:
363
399
 
364
400
  def decorator(fn: Callable[P, Awaitable[None]]) -> Flow[P]:
365
- return Flow(fn, name=name)
401
+ return Flow(fn, name=name, agent_logger=agent_logger)
366
402
 
367
403
  return decorator
368
404
 
369
- return Flow(fn, name=name)
405
+ return Flow(fn, name=name, agent_logger=agent_logger)
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "goose-py"
3
- version = "0.3.0"
3
+ version = "0.3.2"
4
4
  description = "A tool for AI workflows based on human-computer collaboration and structured output."
5
5
  authors = [
6
6
  "Nash Taylor <nash@chelle.ai>",
File without changes
File without changes
File without changes
File without changes