goose-py 0.11.21__tar.gz → 0.11.23__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.
Files changed (34) hide show
  1. {goose_py-0.11.21 → goose_py-0.11.23}/PKG-INFO +2 -2
  2. {goose_py-0.11.21 → goose_py-0.11.23}/goose/_internal/agent.py +25 -25
  3. {goose_py-0.11.21 → goose_py-0.11.23}/goose/_internal/task.py +8 -3
  4. {goose_py-0.11.21 → goose_py-0.11.23}/pyproject.toml +2 -2
  5. {goose_py-0.11.21 → goose_py-0.11.23}/tests/test_agent.py +4 -3
  6. {goose_py-0.11.21 → goose_py-0.11.23}/tests/test_ask.py +4 -3
  7. {goose_py-0.11.21 → goose_py-0.11.23}/tests/test_refining.py +4 -3
  8. {goose_py-0.11.21 → goose_py-0.11.23}/uv.lock +5 -5
  9. {goose_py-0.11.21 → goose_py-0.11.23}/.envrc +0 -0
  10. {goose_py-0.11.21 → goose_py-0.11.23}/.github/workflows/publish.yml +0 -0
  11. {goose_py-0.11.21 → goose_py-0.11.23}/.gitignore +0 -0
  12. {goose_py-0.11.21 → goose_py-0.11.23}/.python-version +0 -0
  13. {goose_py-0.11.21 → goose_py-0.11.23}/.stubs/jsonpath_ng/__init__.pyi +0 -0
  14. {goose_py-0.11.21 → goose_py-0.11.23}/Makefile +0 -0
  15. {goose_py-0.11.21 → goose_py-0.11.23}/README.md +0 -0
  16. {goose_py-0.11.21 → goose_py-0.11.23}/goose/__init__.py +0 -0
  17. {goose_py-0.11.21 → goose_py-0.11.23}/goose/_internal/conversation.py +0 -0
  18. {goose_py-0.11.21 → goose_py-0.11.23}/goose/_internal/flow.py +0 -0
  19. {goose_py-0.11.21 → goose_py-0.11.23}/goose/_internal/result.py +0 -0
  20. {goose_py-0.11.21 → goose_py-0.11.23}/goose/_internal/state.py +0 -0
  21. {goose_py-0.11.21 → goose_py-0.11.23}/goose/_internal/store.py +0 -0
  22. {goose_py-0.11.21 → goose_py-0.11.23}/goose/_internal/types/__init__.py +0 -0
  23. {goose_py-0.11.21 → goose_py-0.11.23}/goose/_internal/types/telemetry.py +0 -0
  24. {goose_py-0.11.21 → goose_py-0.11.23}/goose/errors.py +0 -0
  25. {goose_py-0.11.21 → goose_py-0.11.23}/goose/flow.py +0 -0
  26. {goose_py-0.11.21 → goose_py-0.11.23}/goose/py.typed +0 -0
  27. {goose_py-0.11.21 → goose_py-0.11.23}/goose/runs.py +0 -0
  28. {goose_py-0.11.21 → goose_py-0.11.23}/goose/task.py +0 -0
  29. {goose_py-0.11.21 → goose_py-0.11.23}/tests/__init__.py +0 -0
  30. {goose_py-0.11.21 → goose_py-0.11.23}/tests/test_downstream_task.py +0 -0
  31. {goose_py-0.11.21 → goose_py-0.11.23}/tests/test_hashing.py +0 -0
  32. {goose_py-0.11.21 → goose_py-0.11.23}/tests/test_looping.py +0 -0
  33. {goose_py-0.11.21 → goose_py-0.11.23}/tests/test_regenerate.py +0 -0
  34. {goose_py-0.11.21 → goose_py-0.11.23}/tests/test_state.py +0 -0
@@ -1,10 +1,10 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: goose-py
3
- Version: 0.11.21
3
+ Version: 0.11.23
4
4
  Summary: A tool for AI workflows based on human-computer collaboration and structured output.
5
5
  Author-email: Nash Taylor <nash@chelle.ai>, Joshua Cook <joshua@chelle.ai>, Michael Sankur <michael@chelle.ai>
6
6
  Requires-Python: >=3.12
7
- Requires-Dist: aikernel==0.1.41
7
+ Requires-Dist: aikernel==0.1.42
8
8
  Requires-Dist: jsonpath-ng>=1.7.0
9
9
  Requires-Dist: pydantic>=2.8.2
10
10
  Description-Content-Type: text/markdown
@@ -5,10 +5,10 @@ from typing import Any, Literal, Protocol, overload
5
5
  from aikernel import (
6
6
  LLMAssistantMessage,
7
7
  LLMModelAlias,
8
+ LLMRouter,
8
9
  LLMSystemMessage,
9
10
  LLMToolMessage,
10
11
  LLMUserMessage,
11
- Router,
12
12
  llm_structured,
13
13
  llm_unstructured,
14
14
  )
@@ -37,13 +37,13 @@ class Agent:
37
37
  self.run_id = run_id
38
38
  self.logger = logger
39
39
 
40
- async def generate[R: Result](
40
+ async def generate[R: Result, M: LLMModelAlias](
41
41
  self,
42
42
  *,
43
43
  messages: list[LLMUserMessage | LLMAssistantMessage | LLMSystemMessage],
44
- model: LLMModelAlias,
44
+ model: M,
45
45
  task_name: str,
46
- router: Router,
46
+ router: LLMRouter[M],
47
47
  response_model: type[R] = TextResult,
48
48
  ) -> R:
49
49
  start_time = datetime.now()
@@ -88,13 +88,13 @@ class Agent:
88
88
 
89
89
  return parsed_response
90
90
 
91
- async def ask(
91
+ async def ask[M: LLMModelAlias](
92
92
  self,
93
93
  *,
94
94
  messages: list[LLMUserMessage | LLMAssistantMessage | LLMSystemMessage],
95
- model: LLMModelAlias,
95
+ model: M,
96
96
  task_name: str,
97
- router: Router,
97
+ router: LLMRouter[M],
98
98
  ) -> str:
99
99
  start_time = datetime.now()
100
100
  typed_messages: list[ExpectedMessage] = [*messages]
@@ -129,12 +129,12 @@ class Agent:
129
129
 
130
130
  return response.text
131
131
 
132
- async def refine[R: Result](
132
+ async def refine[R: Result, M: LLMModelAlias](
133
133
  self,
134
134
  *,
135
135
  messages: list[LLMUserMessage | LLMAssistantMessage | LLMSystemMessage],
136
- model: LLMModelAlias,
137
- router: Router,
136
+ model: M,
137
+ router: LLMRouter[M],
138
138
  task_name: str,
139
139
  response_model: type[R],
140
140
  ) -> R:
@@ -181,58 +181,58 @@ class Agent:
181
181
  return refined_response
182
182
 
183
183
  @overload
184
- async def __call__[R: Result](
184
+ async def __call__[R: Result, M: LLMModelAlias](
185
185
  self,
186
186
  *,
187
187
  messages: list[LLMUserMessage | LLMAssistantMessage | LLMSystemMessage],
188
- model: LLMModelAlias,
189
- router: Router,
188
+ model: M,
189
+ router: LLMRouter[M],
190
190
  task_name: str,
191
191
  mode: Literal["generate"],
192
192
  response_model: type[R],
193
193
  ) -> R: ...
194
194
 
195
195
  @overload
196
- async def __call__[R: Result](
196
+ async def __call__[R: Result, M: LLMModelAlias](
197
197
  self,
198
198
  *,
199
199
  messages: list[LLMUserMessage | LLMAssistantMessage | LLMSystemMessage],
200
- model: LLMModelAlias,
201
- router: Router,
200
+ model: M,
201
+ router: LLMRouter[M],
202
202
  task_name: str,
203
203
  mode: Literal["ask"],
204
204
  response_model: type[R] = TextResult,
205
205
  ) -> str: ...
206
206
 
207
207
  @overload
208
- async def __call__[R: Result](
208
+ async def __call__[R: Result, M: LLMModelAlias](
209
209
  self,
210
210
  *,
211
211
  messages: list[LLMUserMessage | LLMAssistantMessage | LLMSystemMessage],
212
- model: LLMModelAlias,
213
- router: Router,
212
+ model: M,
213
+ router: LLMRouter[M],
214
214
  task_name: str,
215
215
  response_model: type[R],
216
216
  mode: Literal["refine"],
217
217
  ) -> R: ...
218
218
 
219
219
  @overload
220
- async def __call__[R: Result](
220
+ async def __call__[R: Result, M: LLMModelAlias](
221
221
  self,
222
222
  *,
223
223
  messages: list[LLMUserMessage | LLMAssistantMessage | LLMSystemMessage],
224
- model: LLMModelAlias,
225
- router: Router,
224
+ model: M,
225
+ router: LLMRouter[M],
226
226
  task_name: str,
227
227
  response_model: type[R],
228
228
  ) -> R: ...
229
229
 
230
- async def __call__[R: Result](
230
+ async def __call__[R: Result, M: LLMModelAlias](
231
231
  self,
232
232
  *,
233
233
  messages: list[LLMUserMessage | LLMAssistantMessage | LLMSystemMessage],
234
- model: LLMModelAlias,
235
- router: Router,
234
+ model: M,
235
+ router: LLMRouter[M],
236
236
  task_name: str,
237
237
  response_model: type[R] = TextResult,
238
238
  mode: Literal["generate", "ask", "refine"] = "generate",
@@ -2,7 +2,7 @@ import hashlib
2
2
  from collections.abc import Awaitable, Callable
3
3
  from typing import Any, overload
4
4
 
5
- from aikernel import LLMModelAlias, LLMSystemMessage, LLMUserMessage, Router
5
+ from aikernel import LLMModelAlias, LLMRouter, LLMSystemMessage, LLMUserMessage
6
6
  from pydantic import BaseModel
7
7
 
8
8
  from goose._internal.agent import Agent
@@ -45,7 +45,12 @@ class Task[**P, R: Result]:
45
45
  return self.result_type.model_validate_json(state.raw_result)
46
46
 
47
47
  async def ask(
48
- self, *, user_message: LLMUserMessage, router: Router, context: LLMSystemMessage | None = None, index: int = 0
48
+ self,
49
+ *,
50
+ user_message: LLMUserMessage,
51
+ router: LLMRouter[LLMModelAlias],
52
+ context: LLMSystemMessage | None = None,
53
+ index: int = 0,
49
54
  ) -> str:
50
55
  flow_run = self.__get_current_flow_run()
51
56
  node_state = flow_run.get_state(task=self, index=index)
@@ -73,7 +78,7 @@ class Task[**P, R: Result]:
73
78
  self,
74
79
  *,
75
80
  user_message: LLMUserMessage,
76
- router: Router,
81
+ router: LLMRouter[LLMModelAlias],
77
82
  context: LLMSystemMessage | None = None,
78
83
  index: int = 0,
79
84
  ) -> R:
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "goose-py"
3
- version = "0.11.21"
3
+ version = "0.11.23"
4
4
  description = "A tool for AI workflows based on human-computer collaboration and structured output."
5
5
  readme = "README.md"
6
6
  authors = [
@@ -11,7 +11,7 @@ authors = [
11
11
  requires-python = ">=3.12"
12
12
  dependencies = [
13
13
  "jsonpath-ng>=1.7.0",
14
- "aikernel==0.1.41",
14
+ "aikernel==0.1.42",
15
15
  "pydantic>=2.8.2",
16
16
  ]
17
17
 
@@ -1,7 +1,7 @@
1
1
  from unittest.mock import Mock
2
2
 
3
3
  import pytest
4
- from aikernel import LLMMessagePart, LLMUserMessage, Router
4
+ from aikernel import LLMMessagePart, LLMModelAlias, LLMRouter, LLMUserMessage
5
5
  from pytest_mock import MockerFixture
6
6
 
7
7
  from goose import Agent, AgentResponse, FlowArguments, TextResult, flow, task
@@ -22,10 +22,11 @@ def mock_llm_unstructured(mocker: MockerFixture) -> Mock:
22
22
 
23
23
  @task
24
24
  async def use_agent(*, agent: Agent) -> TextResult:
25
- router = Router(
25
+ router = LLMRouter[LLMModelAlias](
26
26
  model_list=[
27
27
  {"model_name": "gemini-2.0-flash-lite", "litellm_params": {"model": "gemini/gemini-2.0-flash-lite"}}
28
- ]
28
+ ],
29
+ fallbacks=[],
29
30
  )
30
31
  return await agent(
31
32
  messages=[LLMUserMessage(parts=[LLMMessagePart(content="Hello")])],
@@ -1,15 +1,16 @@
1
1
  from unittest.mock import Mock
2
2
 
3
3
  import pytest
4
- from aikernel import LLMAssistantMessage, LLMMessagePart, LLMUserMessage, Router
4
+ from aikernel import LLMAssistantMessage, LLMMessagePart, LLMModelAlias, LLMRouter, LLMUserMessage
5
5
  from pytest_mock import MockerFixture
6
6
 
7
7
  from goose import Agent, FlowArguments, flow, task
8
8
  from goose._internal.result import TextResult
9
9
  from goose.errors import Honk
10
10
 
11
- ROUTER = Router(
12
- model_list=[{"model_name": "gemini-2.0-flash-lite", "litellm_params": {"model": "gemini/gemini-2.0-flash-lite"}}]
11
+ ROUTER = LLMRouter[LLMModelAlias](
12
+ model_list=[{"model_name": "gemini-2.0-flash-lite", "litellm_params": {"model": "gemini/gemini-2.0-flash-lite"}}],
13
+ fallbacks=[],
13
14
  )
14
15
 
15
16
 
@@ -3,15 +3,16 @@ import string
3
3
  from unittest.mock import Mock
4
4
 
5
5
  import pytest
6
- from aikernel import LLMMessagePart, LLMSystemMessage, LLMUserMessage, Router
6
+ from aikernel import LLMMessagePart, LLMModelAlias, LLMRouter, LLMSystemMessage, LLMUserMessage
7
7
  from pytest_mock import MockerFixture
8
8
 
9
9
  from goose import Agent, FlowArguments, Result, flow, task
10
10
  from goose._internal.result import FindReplaceResponse, Replacement
11
11
  from goose.errors import Honk
12
12
 
13
- ROUTER = Router(
14
- model_list=[{"model_name": "gemini-2.0-flash-lite", "litellm_params": {"model": "gemini/gemini-2.0-flash-lite"}}]
13
+ ROUTER = LLMRouter[LLMModelAlias](
14
+ model_list=[{"model_name": "gemini-2.0-flash-lite", "litellm_params": {"model": "gemini/gemini-2.0-flash-lite"}}],
15
+ fallbacks=[],
15
16
  )
16
17
 
17
18
 
@@ -3,15 +3,15 @@ requires-python = ">=3.12"
3
3
 
4
4
  [[package]]
5
5
  name = "aikernel"
6
- version = "0.1.41"
6
+ version = "0.1.42"
7
7
  source = { registry = "https://pypi.org/simple" }
8
8
  dependencies = [
9
9
  { name = "litellm" },
10
10
  { name = "pydantic" },
11
11
  ]
12
- sdist = { url = "https://files.pythonhosted.org/packages/81/c0/d8a3616c11f4753e7f1a29fa70112877d4e4d66f7522800ab408c8964cf5/aikernel-0.1.41.tar.gz", hash = "sha256:6298aa904dbd5981b84c150aa4a533e3a816de0024658d5b21f90a8ec039cf09", size = 72588 }
12
+ sdist = { url = "https://files.pythonhosted.org/packages/b5/43/451591e3835257c29e90db4c9cb22cd4c4566d63e1c1ab20652af612686d/aikernel-0.1.42.tar.gz", hash = "sha256:7fb29a14f32119a533502bb2925112c43709a00f2753b3d07b4c7b2c7cb153f6", size = 72593 }
13
13
  wheels = [
14
- { url = "https://files.pythonhosted.org/packages/c1/62/16f9b1ae7ee8096e878ef69f087d411e4c578d8cb9453b0cfd48c077e8e6/aikernel-0.1.41-py3-none-any.whl", hash = "sha256:b069bbbcb3e7676e5ce70ac55ea1fed2085f6f6e68981e29f5aa7f5f56f07735", size = 10567 },
14
+ { url = "https://files.pythonhosted.org/packages/0d/69/677ce38aeb965cda409c8f1efecd85f17fc648dba02f7441034a9bba8c1f/aikernel-0.1.42-py3-none-any.whl", hash = "sha256:b22ee9726e1e2688ef05bf7433fed0f671687d63710fbb507c81719efdbff309", size = 10570 },
15
15
  ]
16
16
 
17
17
  [[package]]
@@ -345,7 +345,7 @@ wheels = [
345
345
 
346
346
  [[package]]
347
347
  name = "goose-py"
348
- version = "0.11.21"
348
+ version = "0.11.23"
349
349
  source = { editable = "." }
350
350
  dependencies = [
351
351
  { name = "aikernel" },
@@ -365,7 +365,7 @@ dev = [
365
365
 
366
366
  [package.metadata]
367
367
  requires-dist = [
368
- { name = "aikernel", specifier = "==0.1.41" },
368
+ { name = "aikernel", specifier = "==0.1.42" },
369
369
  { name = "jsonpath-ng", specifier = ">=1.7.0" },
370
370
  { name = "pydantic", specifier = ">=2.8.2" },
371
371
  ]
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes