flo-ai 0.0.5.dev4__tar.gz → 0.0.5.dev6__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 (58) hide show
  1. {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/PKG-INFO +3 -3
  2. {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/models/flo_node.py +69 -1
  3. {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/pyproject.toml +2 -3
  4. {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/LICENSE +0 -0
  5. {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/README.md +0 -0
  6. {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/__init__.py +0 -0
  7. {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/builders/__init__.py +0 -0
  8. {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/builders/yaml_builder.py +0 -0
  9. {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/callbacks/__init__.py +0 -0
  10. {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/callbacks/flo_callbacks.py +0 -0
  11. {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/callbacks/flo_execution_logger.py +0 -0
  12. {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/common/README.md +0 -0
  13. {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/common/__init__.py +0 -0
  14. {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/common/flo_langchain_logger.py +0 -0
  15. {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/common/flo_logger.py +0 -0
  16. {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/constants/__init__.py +0 -0
  17. {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/constants/common_constants.py +0 -0
  18. {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/constants/flo_node_contants.py +0 -0
  19. {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/constants/prompt_constants.py +0 -0
  20. {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/core.py +0 -0
  21. {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/error/flo_exception.py +0 -0
  22. {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/factory/agent_factory.py +0 -0
  23. {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/helpers/utils.py +0 -0
  24. {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/models/__init__.py +0 -0
  25. {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/models/delegate.py +0 -0
  26. {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/models/exception.py +0 -0
  27. {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/models/flo_agent.py +0 -0
  28. {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/models/flo_delegation_agent.py +0 -0
  29. {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/models/flo_executable.py +0 -0
  30. {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/models/flo_llm_agent.py +0 -0
  31. {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/models/flo_member.py +0 -0
  32. {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/models/flo_reflection_agent.py +0 -0
  33. {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/models/flo_routed_team.py +0 -0
  34. {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/models/flo_team.py +0 -0
  35. {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/models/flo_tool_agent.py +0 -0
  36. {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/parsers/flo_json_parser.py +0 -0
  37. {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/parsers/flo_parser.py +0 -0
  38. {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/parsers/flo_pydantic_parser.py +0 -0
  39. {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/retrievers/__init__.py +0 -0
  40. {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/retrievers/flo_compression_pipeline.py +0 -0
  41. {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/retrievers/flo_multi_query.py +0 -0
  42. {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/retrievers/flo_retriever.py +0 -0
  43. {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/router/__init__.py +0 -0
  44. {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/router/flo_linear.py +0 -0
  45. {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/router/flo_llm_router.py +0 -0
  46. {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/router/flo_router.py +0 -0
  47. {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/router/flo_router_factory.py +0 -0
  48. {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/router/flo_supervisor.py +0 -0
  49. {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/state/__init__.py +0 -0
  50. {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/state/flo_data_collector.py +0 -0
  51. {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/state/flo_kv_collector.py +0 -0
  52. {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/state/flo_session.py +0 -0
  53. {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/state/flo_state.py +0 -0
  54. {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/storage/data_collector.py +0 -0
  55. {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/tools/__init__.py +0 -0
  56. {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/tools/flo_tool.py +0 -0
  57. {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/yaml/config.py +0 -0
  58. {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/yaml/validators.py +0 -0
@@ -1,18 +1,18 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: flo-ai
3
- Version: 0.0.5.dev4
3
+ Version: 0.0.5.dev6
4
4
  Summary: A easy way to create structured AI agents
5
5
  License: MIT
6
6
  Author: vizsatiz
7
7
  Author-email: vishnu@rootfor.xyz
8
- Requires-Python: >=3.10,<4.0
8
+ Requires-Python: >=3.9,<4.0
9
9
  Classifier: License :: OSI Approved :: MIT License
10
10
  Classifier: Programming Language :: Python :: 3
11
+ Classifier: Programming Language :: Python :: 3.9
11
12
  Classifier: Programming Language :: Python :: 3.10
12
13
  Classifier: Programming Language :: Python :: 3.11
13
14
  Classifier: Programming Language :: Python :: 3.12
14
15
  Requires-Dist: httpx (==0.27.0)
15
- Requires-Dist: ipython (==8.24.0)
16
16
  Requires-Dist: langchain (==0.3.3)
17
17
  Requires-Dist: langchain-community (==0.3.2)
18
18
  Requires-Dist: langgraph (==0.2.38)
@@ -25,15 +25,22 @@ class FloNode:
25
25
  name: str,
26
26
  kind: ExecutableType,
27
27
  delegate: Optional[Delegate] = None,
28
+ async_func: functools.partial = None,
28
29
  ) -> None:
29
30
  self.name = name
30
31
  self.func = func
31
32
  self.kind: ExecutableType = kind
32
33
  self.delegate = delegate
34
+ self.async_func = async_func
33
35
 
34
36
  def invoke(self, query, config):
35
37
  return self.func({STATE_NAME_MESSAGES: [HumanMessage(content=query)]})
36
38
 
39
+ async def ainvoke(self, query, config):
40
+ return await self.async_func(
41
+ {STATE_NAME_MESSAGES: [HumanMessage(content=query)]}
42
+ )
43
+
37
44
  class Builder:
38
45
  def __init__(self, session: FloSession) -> None:
39
46
  self.session = session
@@ -47,7 +54,17 @@ class FloNode:
47
54
  model_name=flo_agent.model_name,
48
55
  data_collector=flo_agent.data_collector,
49
56
  )
50
- return FloNode(agent_func, flo_agent.name, flo_agent.type)
57
+ agent_func_async = functools.partial(
58
+ FloNode.Builder.__async_teamflo_agent_node,
59
+ agent=flo_agent.runnable,
60
+ name=flo_agent.name,
61
+ session=self.session,
62
+ model_name=flo_agent.model_name,
63
+ data_collector=flo_agent.data_collector,
64
+ )
65
+ return FloNode(
66
+ agent_func, flo_agent.name, flo_agent.type, async_func=agent_func_async
67
+ )
51
68
 
52
69
  def build_from_reflection(self, flo_agent: FloReflectionAgent) -> 'FloNode':
53
70
  agent_func = functools.partial(
@@ -154,6 +171,57 @@ class FloNode:
154
171
  ]
155
172
  return {STATE_NAME_MESSAGES: [AIMessage(content=output, name=name)]}
156
173
 
174
+ @staticmethod
175
+ async def __async_teamflo_agent_node(
176
+ state: TeamFloAgentState,
177
+ agent: AgentExecutor,
178
+ name: str,
179
+ session: FloSession,
180
+ model_name: str,
181
+ data_collector: Optional[FloDataCollector] = None,
182
+ ):
183
+ agent_cbs: List[FloAgentCallback] = FloNode.Builder.__filter_callbacks(
184
+ session, FloAgentCallback
185
+ )
186
+ flo_cbs: List[FloCallback] = FloNode.Builder.__filter_callbacks(
187
+ session, FloCallback
188
+ )
189
+ [
190
+ callback.on_agent_start(name, model_name, state['messages'], **{})
191
+ for callback in agent_cbs
192
+ ]
193
+ [
194
+ callback.on_agent_start(name, model_name, state['messages'], **{})
195
+ for callback in flo_cbs
196
+ ]
197
+ try:
198
+ result = await agent.ainvoke(state)
199
+ output = result if isinstance(result, str) else result['output']
200
+ if data_collector is not None:
201
+ get_logger().info(
202
+ 'appending output to data collector', session=session
203
+ )
204
+ data_collector.append(output)
205
+ except Exception as e:
206
+ [
207
+ callback.on_agent_error(name, model_name, e, **{})
208
+ for callback in agent_cbs
209
+ ]
210
+ [
211
+ callback.on_agent_error(name, model_name, e, **{})
212
+ for callback in flo_cbs
213
+ ]
214
+ raise e
215
+ [
216
+ callback.on_agent_end(name, model_name, output, **{})
217
+ for callback in agent_cbs
218
+ ]
219
+ [
220
+ callback.on_agent_start(name, model_name, output, **{})
221
+ for callback in flo_cbs
222
+ ]
223
+ return {STATE_NAME_MESSAGES: [AIMessage(content=output, name=name)]}
224
+
157
225
  @staticmethod
158
226
  def __filter_callbacks(session: FloSession, type: Type):
159
227
  cbs = session.callbacks
@@ -1,16 +1,15 @@
1
1
  [tool.poetry]
2
2
  name = "flo-ai"
3
- version = "0.0.5-dev4"
3
+ version = "0.0.5-dev6"
4
4
  description = "A easy way to create structured AI agents"
5
5
  authors = ["vizsatiz <vishnu@rootfor.xyz>"]
6
6
  license = "MIT"
7
7
  readme = "README.md"
8
8
 
9
9
  [tool.poetry.dependencies]
10
- python = ">=3.10,<4.0"
10
+ python = ">=3.9,<4.0"
11
11
  langchain = "0.3.3"
12
12
  langgraph = "0.2.38"
13
- ipython = "8.24.0"
14
13
  httpx = "0.27.0"
15
14
  pillow = "^10.3.0"
16
15
  pydantic = "^2.9.2"
File without changes
File without changes
File without changes