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.
- {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/PKG-INFO +3 -3
- {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/models/flo_node.py +69 -1
- {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/pyproject.toml +2 -3
- {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/LICENSE +0 -0
- {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/README.md +0 -0
- {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/__init__.py +0 -0
- {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/builders/__init__.py +0 -0
- {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/builders/yaml_builder.py +0 -0
- {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/callbacks/__init__.py +0 -0
- {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/callbacks/flo_callbacks.py +0 -0
- {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/callbacks/flo_execution_logger.py +0 -0
- {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/common/README.md +0 -0
- {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/common/__init__.py +0 -0
- {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/common/flo_langchain_logger.py +0 -0
- {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/common/flo_logger.py +0 -0
- {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/constants/__init__.py +0 -0
- {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/constants/common_constants.py +0 -0
- {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/constants/flo_node_contants.py +0 -0
- {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/constants/prompt_constants.py +0 -0
- {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/core.py +0 -0
- {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/error/flo_exception.py +0 -0
- {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/factory/agent_factory.py +0 -0
- {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/helpers/utils.py +0 -0
- {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/models/__init__.py +0 -0
- {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/models/delegate.py +0 -0
- {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/models/exception.py +0 -0
- {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/models/flo_agent.py +0 -0
- {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/models/flo_delegation_agent.py +0 -0
- {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/models/flo_executable.py +0 -0
- {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/models/flo_llm_agent.py +0 -0
- {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/models/flo_member.py +0 -0
- {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/models/flo_reflection_agent.py +0 -0
- {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/models/flo_routed_team.py +0 -0
- {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/models/flo_team.py +0 -0
- {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/models/flo_tool_agent.py +0 -0
- {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/parsers/flo_json_parser.py +0 -0
- {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/parsers/flo_parser.py +0 -0
- {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/parsers/flo_pydantic_parser.py +0 -0
- {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/retrievers/__init__.py +0 -0
- {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/retrievers/flo_compression_pipeline.py +0 -0
- {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/retrievers/flo_multi_query.py +0 -0
- {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/retrievers/flo_retriever.py +0 -0
- {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/router/__init__.py +0 -0
- {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/router/flo_linear.py +0 -0
- {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/router/flo_llm_router.py +0 -0
- {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/router/flo_router.py +0 -0
- {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/router/flo_router_factory.py +0 -0
- {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/router/flo_supervisor.py +0 -0
- {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/state/__init__.py +0 -0
- {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/state/flo_data_collector.py +0 -0
- {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/state/flo_kv_collector.py +0 -0
- {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/state/flo_session.py +0 -0
- {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/state/flo_state.py +0 -0
- {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/storage/data_collector.py +0 -0
- {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/tools/__init__.py +0 -0
- {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/tools/flo_tool.py +0 -0
- {flo_ai-0.0.5.dev4 → flo_ai-0.0.5.dev6}/flo_ai/yaml/config.py +0 -0
- {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.
|
|
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.
|
|
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
|
-
|
|
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-
|
|
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
|
+
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|