From 7e55469d7f06b47ac3df26f9d2f1f419068674ef Mon Sep 17 00:00:00 2001 From: vizsatiz Date: Fri, 15 Nov 2024 14:41:48 +0530 Subject: [PATCH 1/8] Setting up callbacks --- examples/llm_extensibility.py | 2 + examples/simple_blogging_team.py | 4 +- flo_ai/common/flo_langchain_logger.py | 8 +- flo_ai/models/flo_node.py | 53 +++++++-- flo_ai/router/flo_router.py | 4 +- flo_ai/state/flo_callbacks.py | 162 ++++++++++++++++++++++++++ flo_ai/state/flo_session.py | 13 ++- 7 files changed, 229 insertions(+), 17 deletions(-) create mode 100644 flo_ai/state/flo_callbacks.py diff --git a/examples/llm_extensibility.py b/examples/llm_extensibility.py index 6176d97f..b8377ccc 100644 --- a/examples/llm_extensibility.py +++ b/examples/llm_extensibility.py @@ -83,3 +83,5 @@ def email_tool(to: str, message: str): if '__end__' not in s: print(s) print('----') + +flo.draw_to_file diff --git a/examples/simple_blogging_team.py b/examples/simple_blogging_team.py index 9692f287..7d09e0c2 100644 --- a/examples/simple_blogging_team.py +++ b/examples/simple_blogging_team.py @@ -33,7 +33,7 @@ llm = ChatOpenAI(temperature=0, model_name='gpt-4o-mini') session = ( - FloSession(llm, log_level='INFO') + FloSession(llm) .register_tool(name='TavilySearchResults', tool=TavilySearchResults()) .register_tool( name='DummyTool', @@ -43,5 +43,5 @@ Flo.set_log_level('INFO') flo: Flo = Flo.build(session, yaml=yaml_data) -# data = flo.invoke(input_prompt) +data = flo.invoke(input_prompt) # print((data['messages'][-1]).content) diff --git a/flo_ai/common/flo_langchain_logger.py b/flo_ai/common/flo_langchain_logger.py index 3ea56f8a..dbe37d4a 100644 --- a/flo_ai/common/flo_langchain_logger.py +++ b/flo_ai/common/flo_langchain_logger.py @@ -2,11 +2,12 @@ from langchain.callbacks.base import BaseCallbackHandler from langchain.schema import AgentAction, AgentFinish, LLMResult from flo_ai.common.flo_logger import get_logger - +from flo_ai.state.flo_callbacks import FloToolCallback class FloLangchainLogger(BaseCallbackHandler): - def __init__(self, session_id: str): + def __init__(self, session_id: str, tool_callbacks: List[FloToolCallback] = []): self.session_id = session_id + self.tool_callbacks = tool_callbacks def on_llm_start( self, serialized: Dict[str, Any], prompts: List[str], **kwargs: Any @@ -41,14 +42,17 @@ def on_tool_start( self, serialized: Dict[str, Any], input_str: str, **kwargs: Any ) -> None: get_logger().debug(f'onToolStart: {input_str}', self) + [x.on_tool_start(serialized["name"], kwargs["inputs"], kwargs) for x in self.tool_callbacks] def on_tool_end(self, output: str, **kwargs: Any) -> None: get_logger().debug(f'onToolEnd: {output}', self) + [x.on_tool_end(kwargs["name"], output, kwargs) for x in self.tool_callbacks] def on_tool_error( self, error: Union[Exception, KeyboardInterrupt], **kwargs: Any ) -> None: get_logger().debug(f'onToolError: {error}', self) + [x.on_tool_error(kwargs["name"], error, kwargs) for x in self.tool_callbacks] def on_text(self, text: str, **kwargs: Any) -> None: get_logger().debug(f'onText: {text}', self) diff --git a/flo_ai/models/flo_node.py b/flo_ai/models/flo_node.py index a8272075..97c84a91 100644 --- a/flo_ai/models/flo_node.py +++ b/flo_ai/models/flo_node.py @@ -6,7 +6,9 @@ from langchain_core.messages import HumanMessage from flo_ai.yaml.config import AgentConfig, TeamConfig from flo_ai.models.flo_executable import ExecutableType -from typing import Union +from flo_ai.state.flo_session import FloSession +from typing import Union, Type, List +from flo_ai.state.flo_callbacks import FloAgentCallback, FloRouterCallback, FloCallback class FloNode: @@ -23,19 +25,24 @@ def __init__( self.config: Union[AgentConfig | TeamConfig] = config class Builder: + + def __init__(self, session: FloSession) -> None: + self.session = session + def build_from_agent(self, flo_agent: FloAgent) -> 'FloNode': agent_func = functools.partial( FloNode.Builder.__teamflo_agent_node, agent=flo_agent.runnable, name=flo_agent.name, agent_config=flo_agent.config, + session=self.session ) return FloNode(agent_func, flo_agent.name, flo_agent.type, flo_agent.config) def build_from_team(self, flo_team: FloRoutedTeam) -> 'FloNode': team_chain = ( functools.partial( - FloNode.Builder.__teamflo_team_node, members=flo_team.runnable.nodes + FloNode.Builder.__teamflo_team_node, members=flo_team.runnable.nodes, session=self.session ) | flo_team.runnable ) @@ -56,6 +63,7 @@ def build_from_router(self, flo_router) -> 'FloNode': agent=flo_router.executor, name=flo_router.router_name, agent_config=flo_router.config, + session=self.session ) return FloNode( router_func, flo_router.router_name, flo_router.type, flo_router.config @@ -67,10 +75,27 @@ def __teamflo_agent_node( agent: AgentExecutor, name: str, agent_config: AgentConfig, + session: FloSession ): - result = agent.invoke(state) - output = result if isinstance(result, str) else result['output'] + agent_cbs: List[FloAgentCallback] = FloNode.Builder.__filter_callbacks(session, FloAgentCallback) + flo_cbs: List[FloCallback] = FloNode.Builder.__filter_callbacks(session, FloCallback) + [x.on_agent_start(name, state["messages"], {}) for x in agent_cbs] + [x.on_agent_start(name, state["messages"], {}) for x in flo_cbs] + try: + result = agent.invoke(state) + output = result if isinstance(result, str) else result['output'] + except Exception as e: + [x.on_agent_error(name, e, {}) for x in agent_cbs] + [x.on_agent_error(name, e, {}) for x in flo_cbs] + raise e + [x.on_agent_end(name, output, {}) for x in agent_cbs] + [x.on_agent_start(name, output, {}) for x in flo_cbs] return {STATE_NAME_MESSAGES: [HumanMessage(content=output, name=name)]} + + @staticmethod + def __filter_callbacks(session: FloSession, type: Type): + cbs = session.callbacks + return list(filter(lambda x: isinstance(x, type), cbs)) @staticmethod def __teamflo_router_node( @@ -78,10 +103,22 @@ def __teamflo_router_node( agent: AgentExecutor, name: str, agent_config: AgentConfig, + session: FloSession ): - result = agent.invoke(state) - nextNode = result if isinstance(result, str) else result['next'] - return {'next': nextNode} + agent_cbs: List[FloRouterCallback] = FloNode.Builder.__filter_callbacks(session, FloRouterCallback) + flo_cbs: List[FloCallback] = FloNode.Builder.__filter_callbacks(session, FloCallback) + [x.on_router_start(name, state["messages"], {}) for x in agent_cbs] + [x.on_router_start(name, state["messages"], {}) for x in flo_cbs] + try: + result = agent.invoke(state) + nextNode = result if isinstance(result, str) else result['next'] + except Exception as e: + [x.on_router_error(name, e, {}) for x in agent_cbs] + [x.on_router_error(name, e, {}) for x in flo_cbs] + raise e + [x.on_router_end(name, nextNode, {}) for x in agent_cbs] + [x.on_router_start(name, nextNode, {}) for x in flo_cbs] + return {'next': nextNode } @staticmethod def __get_last_message(state: TeamFloAgentState) -> str: @@ -89,7 +126,7 @@ def __get_last_message(state: TeamFloAgentState) -> str: @staticmethod def __join_graph(response: dict): - return {STATE_NAME_MESSAGES: [response[STATE_NAME_MESSAGES][-1]]} + return { STATE_NAME_MESSAGES: [response[STATE_NAME_MESSAGES][-1]] } @staticmethod def __teamflo_team_node(message: str, members: list[str]): diff --git a/flo_ai/router/flo_router.py b/flo_ai/router/flo_router.py index 17a55589..a912507c 100644 --- a/flo_ai/router/flo_router.py +++ b/flo_ai/router/flo_router.py @@ -47,7 +47,7 @@ def build_graph(): pass def build_node(self, flo_member: FloMember) -> FloNode: - node_builder = FloNode.Builder() + node_builder = FloNode.Builder(self.session) if flo_member.type == ExecutableType.router: return node_builder.build_from_router(flo_member) if flo_member.type == ExecutableType.team: @@ -56,7 +56,7 @@ def build_node(self, flo_member: FloMember) -> FloNode: return FloNode( flo_member.executor, flo_member.name, flo_member.type, flo_member.config ) - node_builder = FloNode.Builder() + node_builder = FloNode.Builder(self.session) return node_builder.build_from_agent(flo_member) def router_fn(self, state: TeamFloAgentState): diff --git a/flo_ai/state/flo_callbacks.py b/flo_ai/state/flo_callbacks.py new file mode 100644 index 00000000..3f5df081 --- /dev/null +++ b/flo_ai/state/flo_callbacks.py @@ -0,0 +1,162 @@ +from typing import Any, Union, Callable, Optional, Dict +from dataclasses import dataclass, field +from flo_ai.common.flo_logger import get_logger + +@dataclass +class FloCallbackResponse: + type: str + name: Optional[str] = None + input: Optional[str] = None + output: Optional[str] = None + error: Union[Exception, KeyboardInterrupt, None] = None + args: Dict = field(default_factory=dict) + +class FloToolCallback(): + + def __init__(self) -> None: + pass + + async def on_tool_start( + self, name: str, input: Any, **kwargs: Any + ) -> Optional[FloCallbackResponse]: + pass + + async def on_tool_end(self, name: str, output: Any, **kwargs: Any) -> Optional[FloCallbackResponse]: + pass + + async def on_tool_error( + self, name: str, error: Union[Exception, KeyboardInterrupt], **kwargs: Any + ) -> Optional[FloCallbackResponse]: + pass + +class FloAgentCallback(): + + async def __init__(self) -> None: + pass + + async def on_agent_start( + self, name: str, input: Any, **kwargs: Any + ) -> Optional[FloCallbackResponse]: + pass + + async def on_agent_end( + self, name: str, output: Any, **kwargs: Any + ) -> Optional[FloCallbackResponse]: + pass + + async def on_agent_error( + self, name: str, error: Union[Exception, KeyboardInterrupt], **kwargs: Any + ) -> Optional[FloCallbackResponse]: + pass + +class FloRouterCallback(): + def __init__(self) -> None: + pass + + async def on_router_start( + self, name: str, input: Any, **kwargs: Any + ) -> Optional[FloCallbackResponse]: + pass + + async def on_router_end( + self, name: str, output: Any, **kwargs: Any + ) -> Optional[FloCallbackResponse]: + pass + + async def on_router_error( + self, name: str, error: Union[Exception, KeyboardInterrupt], **kwargs: Any + ) -> None: + Optional[FloCallbackResponse] + +def __safe_call_cb(func, cb_response: FloRouterCallback, ignore_error = True): + try: + func(cb_response) + except Exception as e: + if ignore_error: + get_logger().warning(e) + else: + raise e + +class FunctionalFloToolCallbackImpl(FloToolCallback): + + def __init__(self, func: Callable, ignore_error: bool = True) -> None: + super().__init__() + self.func = func + self.ignore_error = ignore_error + + async def on_tool_start(self, name: str, input: Any, **kwargs: Any) -> Optional[FloCallbackResponse]: + cb_response = FloRouterCallback("on_tool_start", name, input=input, args=kwargs) + __safe_call_cb(self.func, cb_response, self.ignore_error) + return cb_response + + async def on_tool_end(self, name: str, output: Any, **kwargs: Any) -> Optional[FloCallbackResponse]: + cb_response = FloRouterCallback("on_tool_end", name, output=output, args=kwargs) + __safe_call_cb(self.func, cb_response, self.ignore_error) + return cb_response + + async def on_tool_error(self, name: str, error: Union[Exception, KeyboardInterrupt], **kwargs: Any) -> Optional[FloCallbackResponse]: + cb_response = FloRouterCallback("on_tool_error", name, error=error, args=kwargs) + __safe_call_cb(self.func, cb_response, self.ignore_error) + return cb_response + +class FunctionalFloAgentCallbackImpl(FloAgentCallback): + + def __init__(self, func: Callable, ignore_error: bool = True) -> None: + super().__init__() + self.func = func + self.ignore_error = ignore_error + + async def on_tool_start(self, name: str, input: Any, **kwargs: Any) -> Any: + cb_response = FloRouterCallback("on_agent_start", name, input=input, args=kwargs) + __safe_call_cb(self.func, cb_response, self.ignore_error) + return cb_response + + async def on_tool_end(self, name: str, output: Any, **kwargs: Any) -> None: + cb_response = FloRouterCallback("on_agent_end", name, output=output, args=kwargs) + __safe_call_cb(self.func, cb_response, self.ignore_error) + return cb_response + + async def on_tool_error(self, name: str, error: Union[Exception, KeyboardInterrupt], **kwargs: Any) -> None: + cb_response = FloRouterCallback("on_agent_error", name, error=error, args=kwargs) + __safe_call_cb(self.func, cb_response, self.ignore_error) + return cb_response + +class FunctionalFloRouterCallbackImpl(FloRouterCallback): + + def __init__(self, func: Callable, ignore_error: bool = True) -> None: + super().__init__() + self.func = func + self.ignore_error = ignore_error + + async def on_tool_start(self, name: str, input: Any, **kwargs: Any) -> Any: + cb_response = FloRouterCallback("on_router_start", name, input=input, args=kwargs) + __safe_call_cb(self.func, cb_response, self.ignore_error) + return cb_response + + async def on_tool_end(self, name: str, output: Any, **kwargs: Any) -> None: + cb_response = FloRouterCallback("on_router_end", name, output=output, args=kwargs) + __safe_call_cb(self.func, cb_response, self.ignore_error) + return cb_response + + async def on_tool_error(self, name: str, error: Union[Exception, KeyboardInterrupt], **kwargs: Any) -> None: + cb_response = FloRouterCallback("on_router_error", name, error=error, args=kwargs) + __safe_call_cb(self.func, cb_response, self.ignore_error) + return cb_response + +class FloCallback(FunctionalFloToolCallbackImpl, FunctionalFloAgentCallbackImpl, FunctionalFloRouterCallbackImpl): + def __init__(self, func: Callable, ignore_error: bool = True) -> None: + FunctionalFloToolCallbackImpl.__init__(self, func, ignore_error) + FunctionalFloAgentCallbackImpl.__init__(self, func, ignore_error) + FunctionalFloRouterCallbackImpl.__init__(self, func, ignore_error) + +def flo_tool_callback(func: Callable, ignore_error = True) -> FloToolCallback: + return FunctionalFloToolCallbackImpl(func, ignore_error) + +def flo_agent_callback(func: Callable, ignore_error = True) -> FloToolCallback: + return FunctionalFloAgentCallbackImpl(func, ignore_error) + +def flo_router_callback(func: Callable, ignore_error = True) -> FloRouterCallback: + return FunctionalFloRouterCallbackImpl(func, ignore_error) + +def flo_call_back(func: Callable, ignore_error = True) -> FloRouterCallback: + return FloCallback(func, ignore_error) diff --git a/flo_ai/state/flo_session.py b/flo_ai/state/flo_session.py index 38cbd1bc..08b0aa90 100644 --- a/flo_ai/state/flo_session.py +++ b/flo_ai/state/flo_session.py @@ -6,6 +6,7 @@ from flo_ai.common.flo_langchain_logger import FloLangchainLogger from flo_ai.yaml.config import FloRoutedTeamConfig, FloAgentConfig from flo_ai.helpers.utils import random_str +from flo_ai.state.flo_callbacks import FloToolCallback, FloAgentCallback, FloRouterCallback from typing import Optional @@ -19,6 +20,7 @@ def _handle_agent_error(error) -> str: class FloSession: + def __init__( self, default_llm: BaseLanguageModel = None, @@ -26,7 +28,6 @@ def __init__( max_loop: int = 3, llm: BaseLanguageModel = None, log_level: Optional[str] = None, - callbacks: Optional[FloLangchainLogger] = None, on_agent_error=_handle_agent_error, ) -> None: if log_level: @@ -48,10 +49,10 @@ def __init__( self.loop_size: int = loop_size self.max_loop: int = max_loop self.on_agent_error = on_agent_error - + self.langchain_logger = FloLangchainLogger(self.session_id) + self.callbacks: list = [] self.config: Union[FloRoutedTeamConfig, FloAgentConfig] = None get_logger().info('New session created ...', self) - self.langchain_logger = FloLangchainLogger(self.session_id) def resolve_llm( self, default_llm: BaseLanguageModel = None, llm: BaseLanguageModel = None @@ -76,6 +77,12 @@ def register_model(self, name: str, model: BaseLanguageModel): self.models[name] = model get_logger().info(f"Model '{name}' registered for session {self.session_id}") return self + + def register_callback(self, callback: Union[FloRouterCallback, FloAgentCallback, FloToolCallback]): + self.callbacks.append(callback) + tool_callbacks = list(filter(lambda x: isinstance(x, FloToolCallback), self.callbacks)) + self.langchain_logger = FloLangchainLogger(self.session_id, tool_callbacks) + return self def append(self, node: str) -> int: get_logger().debug(f'Appending node: {node}') From 160cf214660e6a1d6162a90d228b40c8ba7831a8 Mon Sep 17 00:00:00 2001 From: vizsatiz Date: Fri, 15 Nov 2024 15:33:29 +0530 Subject: [PATCH 2/8] Adding callbacks to models --- flo_ai/models/flo_agent.py | 7 ++++-- flo_ai/models/flo_node.py | 39 ++++++++++++++++------------- flo_ai/router/flo_linear.py | 1 + flo_ai/router/flo_llm_router.py | 4 +-- flo_ai/router/flo_router.py | 2 ++ flo_ai/router/flo_router_factory.py | 4 +-- flo_ai/router/flo_supervisor.py | 7 ++++-- flo_ai/state/flo_callbacks.py | 39 +++++++++++++++-------------- flo_ai/state/flo_session.py | 2 +- 9 files changed, 60 insertions(+), 45 deletions(-) diff --git a/flo_ai/models/flo_agent.py b/flo_ai/models/flo_agent.py index 0ba124f3..61a29916 100644 --- a/flo_ai/models/flo_agent.py +++ b/flo_ai/models/flo_agent.py @@ -13,9 +13,10 @@ class FloAgent(ExecutableFlo): def __init__( - self, agent: Runnable, executor: AgentExecutor, config: AgentConfig + self, agent: Runnable, executor: AgentExecutor, config: AgentConfig, model_nick_name: str ) -> None: super().__init__(config.name, executor, ExecutableType.agentic) + self.model_nick_name = model_nick_name self.agent: Runnable = (agent,) self.executor: AgentExecutor = executor self.config: AgentConfig = config @@ -30,9 +31,11 @@ def __init__( role: Optional[str] = None, llm: Union[BaseLanguageModel, None] = None, on_error: Union[str, Callable] = True, + model_nick_name: Union[str, None] = "default" ) -> None: prompt: Union[ChatPromptTemplate, str] = config.job self.name: str = config.name + self.model_nick_name = model_nick_name self.llm = llm if llm is not None else session.llm self.config = config system_prompts = ( @@ -60,4 +63,4 @@ def build(self) -> AgentExecutor: return_intermediate_steps=True, handle_parsing_errors=self.on_error, ) - return FloAgent(agent, executor, self.config) + return FloAgent(agent, executor, self.config, model_nick_name=self.model_nick_name) diff --git a/flo_ai/models/flo_node.py b/flo_ai/models/flo_node.py index 97c84a91..e157f347 100644 --- a/flo_ai/models/flo_node.py +++ b/flo_ai/models/flo_node.py @@ -7,6 +7,7 @@ from flo_ai.yaml.config import AgentConfig, TeamConfig from flo_ai.models.flo_executable import ExecutableType from flo_ai.state.flo_session import FloSession +from flo_ai.router.flo_router import FloRouter from typing import Union, Type, List from flo_ai.state.flo_callbacks import FloAgentCallback, FloRouterCallback, FloCallback @@ -35,7 +36,8 @@ def build_from_agent(self, flo_agent: FloAgent) -> 'FloNode': agent=flo_agent.runnable, name=flo_agent.name, agent_config=flo_agent.config, - session=self.session + session=self.session, + model_name=flo_agent.model_nick_name ) return FloNode(agent_func, flo_agent.name, flo_agent.type, flo_agent.config) @@ -57,13 +59,14 @@ def build_from_team(self, flo_team: FloRoutedTeam) -> 'FloNode': flo_team.config, ) - def build_from_router(self, flo_router) -> 'FloNode': + def build_from_router(self, flo_router: FloRouter) -> 'FloNode': router_func = functools.partial( FloNode.Builder.__teamflo_router_node, agent=flo_router.executor, name=flo_router.router_name, agent_config=flo_router.config, - session=self.session + session=self.session, + model_name=flo_router.model_name ) return FloNode( router_func, flo_router.router_name, flo_router.type, flo_router.config @@ -75,21 +78,22 @@ def __teamflo_agent_node( agent: AgentExecutor, name: str, agent_config: AgentConfig, - session: FloSession + session: FloSession, + model_name: str ): agent_cbs: List[FloAgentCallback] = FloNode.Builder.__filter_callbacks(session, FloAgentCallback) flo_cbs: List[FloCallback] = FloNode.Builder.__filter_callbacks(session, FloCallback) - [x.on_agent_start(name, state["messages"], {}) for x in agent_cbs] - [x.on_agent_start(name, state["messages"], {}) for x in flo_cbs] + [x.on_agent_start(name, model_name, state["messages"], {}) for x in agent_cbs] + [x.on_agent_start(name, model_name, state["messages"], {}) for x in flo_cbs] try: result = agent.invoke(state) output = result if isinstance(result, str) else result['output'] except Exception as e: - [x.on_agent_error(name, e, {}) for x in agent_cbs] - [x.on_agent_error(name, e, {}) for x in flo_cbs] + [x.on_agent_error(name, model_name, e, {}) for x in agent_cbs] + [x.on_agent_error(name, model_name, e, {}) for x in flo_cbs] raise e - [x.on_agent_end(name, output, {}) for x in agent_cbs] - [x.on_agent_start(name, output, {}) for x in flo_cbs] + [x.on_agent_end(name, model_name, output, {}) for x in agent_cbs] + [x.on_agent_start(name, model_name, output, {}) for x in flo_cbs] return {STATE_NAME_MESSAGES: [HumanMessage(content=output, name=name)]} @staticmethod @@ -103,21 +107,22 @@ def __teamflo_router_node( agent: AgentExecutor, name: str, agent_config: AgentConfig, - session: FloSession + session: FloSession, + model_name: str ): agent_cbs: List[FloRouterCallback] = FloNode.Builder.__filter_callbacks(session, FloRouterCallback) flo_cbs: List[FloCallback] = FloNode.Builder.__filter_callbacks(session, FloCallback) - [x.on_router_start(name, state["messages"], {}) for x in agent_cbs] - [x.on_router_start(name, state["messages"], {}) for x in flo_cbs] + [x.on_router_start(name, model_name, state["messages"], {}) for x in agent_cbs] + [x.on_router_start(name, model_name, state["messages"], {}) for x in flo_cbs] try: result = agent.invoke(state) nextNode = result if isinstance(result, str) else result['next'] except Exception as e: - [x.on_router_error(name, e, {}) for x in agent_cbs] - [x.on_router_error(name, e, {}) for x in flo_cbs] + [x.on_router_error(name, model_name, e, {}) for x in agent_cbs] + [x.on_router_error(name, model_name, e, {}) for x in flo_cbs] raise e - [x.on_router_end(name, nextNode, {}) for x in agent_cbs] - [x.on_router_start(name, nextNode, {}) for x in flo_cbs] + [x.on_router_end(name, model_name, nextNode, {}) for x in agent_cbs] + [x.on_router_start(name, model_name, nextNode, {}) for x in flo_cbs] return {'next': nextNode } @staticmethod diff --git a/flo_ai/router/flo_linear.py b/flo_ai/router/flo_linear.py index 0f0e57b4..01d6a518 100644 --- a/flo_ai/router/flo_linear.py +++ b/flo_ai/router/flo_linear.py @@ -16,6 +16,7 @@ def __init__(self, session: FloSession, config: TeamConfig, flo_team: FloTeam): flo_team=flo_team, executor=None, config=config, + model_name=None ) self.router_config = config.router diff --git a/flo_ai/router/flo_llm_router.py b/flo_ai/router/flo_llm_router.py index bca970d3..a1f58f36 100644 --- a/flo_ai/router/flo_llm_router.py +++ b/flo_ai/router/flo_llm_router.py @@ -20,10 +20,10 @@ class NextAgent(BaseModel): class FloLLMRouter(FloRouter): def __init__( - self, session: FloSession, executor: Runnable, flo_team: FloTeam, name: str + self, session: FloSession, executor: Runnable, flo_team: FloTeam, name: str, model_name: str ) -> None: super().__init__( - session=session, name=name, flo_team=flo_team, executor=executor + session=session, name=name, flo_team=flo_team, executor=executor, model_name=model_name ) def build_graph(self): diff --git a/flo_ai/router/flo_router.py b/flo_ai/router/flo_router.py index a912507c..7f18e249 100644 --- a/flo_ai/router/flo_router.py +++ b/flo_ai/router/flo_router.py @@ -29,6 +29,7 @@ def __init__( flo_team: FloTeam, executor, config: TeamConfig = None, + model_name: Union[str, None] = "default" ): self.router_name = name self.session: FloSession = session @@ -38,6 +39,7 @@ def __init__( self.type: ExecutableType = ExecutableType.router self.executor = executor self.config = config + self.model_name = model_name def build_routed_team(self) -> FloRoutedTeam: return self.build_graph() diff --git a/flo_ai/router/flo_router_factory.py b/flo_ai/router/flo_router_factory.py index 82460271..0b1e2f23 100644 --- a/flo_ai/router/flo_router_factory.py +++ b/flo_ai/router/flo_router_factory.py @@ -21,13 +21,13 @@ def create( ) if router_kind == 'supervisor': return FloSupervisor.Builder( - session, team_config, flo_team, llm=router_model + session, team_config, flo_team, llm=router_model, model_nick_name=team_config.router.model ).build() elif router_kind == 'linear': return FloLinear.Builder(session, team_config, flo_team).build() elif router_kind == 'llm': return FloLLMRouter.Builder( - session, team_config, flo_team, llm=router_model + session, team_config, flo_team, llm=router_model, model_nick_name=team_config.router.model ).build() else: raise Exception(f"""Unknown router type: {router_kind}. diff --git a/flo_ai/router/flo_supervisor.py b/flo_ai/router/flo_supervisor.py index a537d88d..bc78bc28 100644 --- a/flo_ai/router/flo_supervisor.py +++ b/flo_ai/router/flo_supervisor.py @@ -21,10 +21,10 @@ class FloSupervisor(FloLLMRouter): def __init__( - self, session: FloSession, executor: Runnable, flo_team: FloTeam, name: str + self, session: FloSession, executor: Runnable, flo_team: FloTeam, name: str, model_name: str="default" ) -> None: super().__init__( - session=session, name=name, flo_team=flo_team, executor=executor + session=session, name=name, flo_team=flo_team, executor=executor, model_name=model_name ) class Builder: @@ -34,10 +34,12 @@ def __init__( team_config: TeamConfig, flo_team: FloTeam, llm: Union[BaseLanguageModel, None] = None, + model_nick_name: str = "default" ) -> None: self.name = team_config.router.name self.session = session self.llm = llm if llm is not None else session.llm + self.model_name = model_nick_name self.flo_team = flo_team self.agents = flo_team.members self.members = [agent.name for agent in flo_team.members] @@ -71,4 +73,5 @@ def build(self): flo_team=self.flo_team, name=self.name, session=self.session, + model_name=self.model_name ) diff --git a/flo_ai/state/flo_callbacks.py b/flo_ai/state/flo_callbacks.py index 3f5df081..7223eeb8 100644 --- a/flo_ai/state/flo_callbacks.py +++ b/flo_ai/state/flo_callbacks.py @@ -6,6 +6,7 @@ class FloCallbackResponse: type: str name: Optional[str] = None + model_name: Optional[str] = None input: Optional[str] = None output: Optional[str] = None error: Union[Exception, KeyboardInterrupt, None] = None @@ -35,17 +36,17 @@ async def __init__(self) -> None: pass async def on_agent_start( - self, name: str, input: Any, **kwargs: Any + self, name: str, model_name: str, input: Any, **kwargs: Any ) -> Optional[FloCallbackResponse]: pass async def on_agent_end( - self, name: str, output: Any, **kwargs: Any + self, name: str, model_name: str, output: Any, **kwargs: Any ) -> Optional[FloCallbackResponse]: pass async def on_agent_error( - self, name: str, error: Union[Exception, KeyboardInterrupt], **kwargs: Any + self, name: str, model_name: str, error: Union[Exception, KeyboardInterrupt], **kwargs: Any ) -> Optional[FloCallbackResponse]: pass @@ -54,21 +55,21 @@ def __init__(self) -> None: pass async def on_router_start( - self, name: str, input: Any, **kwargs: Any + self, name: str, model_name: str, input: Any, **kwargs: Any ) -> Optional[FloCallbackResponse]: pass async def on_router_end( - self, name: str, output: Any, **kwargs: Any + self, name: str, model_name: str, output: Any, **kwargs: Any ) -> Optional[FloCallbackResponse]: pass async def on_router_error( - self, name: str, error: Union[Exception, KeyboardInterrupt], **kwargs: Any + self, name: str, model_name: str, error: Union[Exception, KeyboardInterrupt], **kwargs: Any ) -> None: Optional[FloCallbackResponse] -def __safe_call_cb(func, cb_response: FloRouterCallback, ignore_error = True): +def __safe_call_cb(func, cb_response: FloCallbackResponse, ignore_error = True): try: func(cb_response) except Exception as e: @@ -106,18 +107,18 @@ def __init__(self, func: Callable, ignore_error: bool = True) -> None: self.func = func self.ignore_error = ignore_error - async def on_tool_start(self, name: str, input: Any, **kwargs: Any) -> Any: - cb_response = FloRouterCallback("on_agent_start", name, input=input, args=kwargs) + async def on_tool_start(self, name: str, model_name: str, input: Any, **kwargs: Any) -> Any: + cb_response = FloCallbackResponse("on_agent_start", name, input=input, args=kwargs, model_name=model_name) __safe_call_cb(self.func, cb_response, self.ignore_error) return cb_response - async def on_tool_end(self, name: str, output: Any, **kwargs: Any) -> None: - cb_response = FloRouterCallback("on_agent_end", name, output=output, args=kwargs) + async def on_tool_end(self, name: str, model_name: str, output: Any, **kwargs: Any) -> None: + cb_response = FloCallbackResponse("on_agent_end", name, output=output, args=kwargs, model_name=model_name) __safe_call_cb(self.func, cb_response, self.ignore_error) return cb_response - async def on_tool_error(self, name: str, error: Union[Exception, KeyboardInterrupt], **kwargs: Any) -> None: - cb_response = FloRouterCallback("on_agent_error", name, error=error, args=kwargs) + async def on_tool_error(self, name: str, model_name: str, error: Union[Exception, KeyboardInterrupt], **kwargs: Any) -> None: + cb_response = FloCallbackResponse("on_agent_error", name, error=error, args=kwargs, model_name=model_name) __safe_call_cb(self.func, cb_response, self.ignore_error) return cb_response @@ -128,18 +129,18 @@ def __init__(self, func: Callable, ignore_error: bool = True) -> None: self.func = func self.ignore_error = ignore_error - async def on_tool_start(self, name: str, input: Any, **kwargs: Any) -> Any: - cb_response = FloRouterCallback("on_router_start", name, input=input, args=kwargs) + async def on_tool_start(self, name: str, model_name: str, input: Any, **kwargs: Any) -> Any: + cb_response = FloCallbackResponse("on_router_start", name, input=input, args=kwargs, model_name=model_name) __safe_call_cb(self.func, cb_response, self.ignore_error) return cb_response - async def on_tool_end(self, name: str, output: Any, **kwargs: Any) -> None: - cb_response = FloRouterCallback("on_router_end", name, output=output, args=kwargs) + async def on_tool_end(self, name: str, model_name: str, output: Any, **kwargs: Any) -> None: + cb_response = FloCallbackResponse("on_router_end", name, output=output, args=kwargs, model_name=model_name) __safe_call_cb(self.func, cb_response, self.ignore_error) return cb_response - async def on_tool_error(self, name: str, error: Union[Exception, KeyboardInterrupt], **kwargs: Any) -> None: - cb_response = FloRouterCallback("on_router_error", name, error=error, args=kwargs) + async def on_tool_error(self, name: str, model_name: str, error: Union[Exception, KeyboardInterrupt], **kwargs: Any) -> None: + cb_response = FloCallbackResponse("on_router_error", name, error=error, args=kwargs, model_name=model_name) __safe_call_cb(self.func, cb_response, self.ignore_error) return cb_response diff --git a/flo_ai/state/flo_session.py b/flo_ai/state/flo_session.py index 08b0aa90..52423982 100644 --- a/flo_ai/state/flo_session.py +++ b/flo_ai/state/flo_session.py @@ -14,7 +14,7 @@ def _handle_agent_error(error) -> str: error_message = str(error)[:50] return f""" - Following error happened while agent execution, please retry with the fix for the same: + Following error happened while aogent execution, please retry with the fix for the same: {error_message} """ From 07b4cff860b104079cf2de81bd0624aefa447213 Mon Sep 17 00:00:00 2001 From: vizsatiz Date: Fri, 15 Nov 2024 15:38:00 +0530 Subject: [PATCH 3/8] Renaming to model_name --- flo_ai/models/flo_agent.py | 2 +- flo_ai/models/flo_node.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/flo_ai/models/flo_agent.py b/flo_ai/models/flo_agent.py index 61a29916..e84a78eb 100644 --- a/flo_ai/models/flo_agent.py +++ b/flo_ai/models/flo_agent.py @@ -16,7 +16,7 @@ def __init__( self, agent: Runnable, executor: AgentExecutor, config: AgentConfig, model_nick_name: str ) -> None: super().__init__(config.name, executor, ExecutableType.agentic) - self.model_nick_name = model_nick_name + self.model_name = model_nick_name self.agent: Runnable = (agent,) self.executor: AgentExecutor = executor self.config: AgentConfig = config diff --git a/flo_ai/models/flo_node.py b/flo_ai/models/flo_node.py index e157f347..52c05e25 100644 --- a/flo_ai/models/flo_node.py +++ b/flo_ai/models/flo_node.py @@ -37,7 +37,7 @@ def build_from_agent(self, flo_agent: FloAgent) -> 'FloNode': name=flo_agent.name, agent_config=flo_agent.config, session=self.session, - model_name=flo_agent.model_nick_name + model_name=flo_agent.model_name ) return FloNode(agent_func, flo_agent.name, flo_agent.type, flo_agent.config) From f7290ecfce96459dbf36ff3dc99d9e020cb2c7d7 Mon Sep 17 00:00:00 2001 From: vizsatiz Date: Fri, 15 Nov 2024 16:46:40 +0530 Subject: [PATCH 4/8] Completing callbacks for agent start and ends --- examples/llm_extensibility.py | 7 +++++ flo_ai/models/flo_node.py | 29 +++++++++--------- flo_ai/state/flo_callbacks.py | 58 +++++++++++++++++------------------ 3 files changed, 50 insertions(+), 44 deletions(-) diff --git a/examples/llm_extensibility.py b/examples/llm_extensibility.py index b8377ccc..f96a8d80 100644 --- a/examples/llm_extensibility.py +++ b/examples/llm_extensibility.py @@ -3,6 +3,7 @@ from pydantic import BaseModel, Field from langchain_openai import ChatOpenAI from flo_ai.tools.flo_tool import flotool +from flo_ai.state.flo_callbacks import flo_agent_callback, FloCallbackResponse from dotenv import load_dotenv import warnings @@ -37,8 +38,14 @@ class SendEmailInput(BaseModel): def email_tool(to: str, message: str): return f'Email sent successfully to: {to}' +@flo_agent_callback +def agent_callback(response: FloCallbackResponse): + print("------------- START AGENT CALLBACK -----------") + print(response) + print("------------- END AGENT CALLBACK -----------") session.register_tool('SendEmailTool', email_tool) +session.register_callback(agent_callback) agent_yaml = """ apiVersion: flo/alpha-v1 diff --git a/flo_ai/models/flo_node.py b/flo_ai/models/flo_node.py index 52c05e25..01050c51 100644 --- a/flo_ai/models/flo_node.py +++ b/flo_ai/models/flo_node.py @@ -7,7 +7,6 @@ from flo_ai.yaml.config import AgentConfig, TeamConfig from flo_ai.models.flo_executable import ExecutableType from flo_ai.state.flo_session import FloSession -from flo_ai.router.flo_router import FloRouter from typing import Union, Type, List from flo_ai.state.flo_callbacks import FloAgentCallback, FloRouterCallback, FloCallback @@ -59,7 +58,7 @@ def build_from_team(self, flo_team: FloRoutedTeam) -> 'FloNode': flo_team.config, ) - def build_from_router(self, flo_router: FloRouter) -> 'FloNode': + def build_from_router(self, flo_router) -> 'FloNode': router_func = functools.partial( FloNode.Builder.__teamflo_router_node, agent=flo_router.executor, @@ -83,23 +82,23 @@ def __teamflo_agent_node( ): agent_cbs: List[FloAgentCallback] = FloNode.Builder.__filter_callbacks(session, FloAgentCallback) flo_cbs: List[FloCallback] = FloNode.Builder.__filter_callbacks(session, FloCallback) - [x.on_agent_start(name, model_name, state["messages"], {}) for x in agent_cbs] - [x.on_agent_start(name, model_name, state["messages"], {}) for x in flo_cbs] + [callback.on_agent_start(name, model_name, state["messages"], **{}) for callback in agent_cbs] + [callback.on_agent_start(name, model_name, state["messages"], **{}) for callback in flo_cbs] try: result = agent.invoke(state) output = result if isinstance(result, str) else result['output'] except Exception as e: - [x.on_agent_error(name, model_name, e, {}) for x in agent_cbs] - [x.on_agent_error(name, model_name, e, {}) for x in flo_cbs] + [callback.on_agent_error(name, model_name, e, **{}) for callback in agent_cbs] + [callback.on_agent_error(name, model_name, e, **{}) for callback in flo_cbs] raise e - [x.on_agent_end(name, model_name, output, {}) for x in agent_cbs] - [x.on_agent_start(name, model_name, output, {}) for x in flo_cbs] + [callback.on_agent_end(name, model_name, output, **{}) for callback in agent_cbs] + [callback.on_agent_start(name, model_name, output, **{}) for callback in flo_cbs] return {STATE_NAME_MESSAGES: [HumanMessage(content=output, name=name)]} @staticmethod def __filter_callbacks(session: FloSession, type: Type): cbs = session.callbacks - return list(filter(lambda x: isinstance(x, type), cbs)) + return list(filter(lambda callback: isinstance(callback, type), cbs)) @staticmethod def __teamflo_router_node( @@ -112,17 +111,17 @@ def __teamflo_router_node( ): agent_cbs: List[FloRouterCallback] = FloNode.Builder.__filter_callbacks(session, FloRouterCallback) flo_cbs: List[FloCallback] = FloNode.Builder.__filter_callbacks(session, FloCallback) - [x.on_router_start(name, model_name, state["messages"], {}) for x in agent_cbs] - [x.on_router_start(name, model_name, state["messages"], {}) for x in flo_cbs] + [callback.on_router_start(name, model_name, state["messages"], **{}) for callback in agent_cbs] + [callback.on_router_start(name, model_name, state["messages"], **{}) for callback in flo_cbs] try: result = agent.invoke(state) nextNode = result if isinstance(result, str) else result['next'] except Exception as e: - [x.on_router_error(name, model_name, e, {}) for x in agent_cbs] - [x.on_router_error(name, model_name, e, {}) for x in flo_cbs] + [callback.on_router_error(name, model_name, e, **{}) for callback in agent_cbs] + [callback.on_router_error(name, model_name, e, **{}) for callback in flo_cbs] raise e - [x.on_router_end(name, model_name, nextNode, {}) for x in agent_cbs] - [x.on_router_start(name, model_name, nextNode, {}) for x in flo_cbs] + [callback.on_router_end(name, model_name, nextNode, **{}) for callback in agent_cbs] + [callback.on_router_start(name, model_name, nextNode, **{}) for callback in flo_cbs] return {'next': nextNode } @staticmethod diff --git a/flo_ai/state/flo_callbacks.py b/flo_ai/state/flo_callbacks.py index 7223eeb8..71e7bda7 100644 --- a/flo_ai/state/flo_callbacks.py +++ b/flo_ai/state/flo_callbacks.py @@ -17,35 +17,35 @@ class FloToolCallback(): def __init__(self) -> None: pass - async def on_tool_start( + def on_tool_start( self, name: str, input: Any, **kwargs: Any ) -> Optional[FloCallbackResponse]: pass - async def on_tool_end(self, name: str, output: Any, **kwargs: Any) -> Optional[FloCallbackResponse]: + def on_tool_end(self, name: str, output: Any, **kwargs: Any) -> Optional[FloCallbackResponse]: pass - async def on_tool_error( + def on_tool_error( self, name: str, error: Union[Exception, KeyboardInterrupt], **kwargs: Any ) -> Optional[FloCallbackResponse]: pass class FloAgentCallback(): - async def __init__(self) -> None: + def __init__(self) -> None: pass - async def on_agent_start( + def on_agent_start( self, name: str, model_name: str, input: Any, **kwargs: Any ) -> Optional[FloCallbackResponse]: pass - async def on_agent_end( + def on_agent_end( self, name: str, model_name: str, output: Any, **kwargs: Any ) -> Optional[FloCallbackResponse]: pass - async def on_agent_error( + def on_agent_error( self, name: str, model_name: str, error: Union[Exception, KeyboardInterrupt], **kwargs: Any ) -> Optional[FloCallbackResponse]: pass @@ -54,22 +54,22 @@ class FloRouterCallback(): def __init__(self) -> None: pass - async def on_router_start( + def on_router_start( self, name: str, model_name: str, input: Any, **kwargs: Any ) -> Optional[FloCallbackResponse]: pass - async def on_router_end( + def on_router_end( self, name: str, model_name: str, output: Any, **kwargs: Any ) -> Optional[FloCallbackResponse]: pass - async def on_router_error( + def on_router_error( self, name: str, model_name: str, error: Union[Exception, KeyboardInterrupt], **kwargs: Any ) -> None: Optional[FloCallbackResponse] -def __safe_call_cb(func, cb_response: FloCallbackResponse, ignore_error = True): +def safe_call_cb(func, cb_response: FloCallbackResponse, ignore_error = True): try: func(cb_response) except Exception as e: @@ -85,19 +85,19 @@ def __init__(self, func: Callable, ignore_error: bool = True) -> None: self.func = func self.ignore_error = ignore_error - async def on_tool_start(self, name: str, input: Any, **kwargs: Any) -> Optional[FloCallbackResponse]: + def on_tool_start(self, name: str, input: Any, **kwargs: Any) -> Optional[FloCallbackResponse]: cb_response = FloRouterCallback("on_tool_start", name, input=input, args=kwargs) - __safe_call_cb(self.func, cb_response, self.ignore_error) + safe_call_cb(self.func, cb_response, self.ignore_error) return cb_response - async def on_tool_end(self, name: str, output: Any, **kwargs: Any) -> Optional[FloCallbackResponse]: + def on_tool_end(self, name: str, output: Any, **kwargs: Any) -> Optional[FloCallbackResponse]: cb_response = FloRouterCallback("on_tool_end", name, output=output, args=kwargs) - __safe_call_cb(self.func, cb_response, self.ignore_error) + safe_call_cb(self.func, cb_response, self.ignore_error) return cb_response - async def on_tool_error(self, name: str, error: Union[Exception, KeyboardInterrupt], **kwargs: Any) -> Optional[FloCallbackResponse]: + def on_tool_error(self, name: str, error: Union[Exception, KeyboardInterrupt], **kwargs: Any) -> Optional[FloCallbackResponse]: cb_response = FloRouterCallback("on_tool_error", name, error=error, args=kwargs) - __safe_call_cb(self.func, cb_response, self.ignore_error) + safe_call_cb(self.func, cb_response, self.ignore_error) return cb_response class FunctionalFloAgentCallbackImpl(FloAgentCallback): @@ -107,19 +107,19 @@ def __init__(self, func: Callable, ignore_error: bool = True) -> None: self.func = func self.ignore_error = ignore_error - async def on_tool_start(self, name: str, model_name: str, input: Any, **kwargs: Any) -> Any: + def on_agent_start(self, name: str, model_name: str, input: Any, **kwargs: Any) -> Any: cb_response = FloCallbackResponse("on_agent_start", name, input=input, args=kwargs, model_name=model_name) - __safe_call_cb(self.func, cb_response, self.ignore_error) + safe_call_cb(self.func, cb_response, self.ignore_error) return cb_response - async def on_tool_end(self, name: str, model_name: str, output: Any, **kwargs: Any) -> None: + def on_agent_end(self, name: str, model_name: str, output: Any, **kwargs: Any) -> None: cb_response = FloCallbackResponse("on_agent_end", name, output=output, args=kwargs, model_name=model_name) - __safe_call_cb(self.func, cb_response, self.ignore_error) + safe_call_cb(self.func, cb_response, self.ignore_error) return cb_response - async def on_tool_error(self, name: str, model_name: str, error: Union[Exception, KeyboardInterrupt], **kwargs: Any) -> None: + def on_agent_error(self, name: str, model_name: str, error: Union[Exception, KeyboardInterrupt], **kwargs: Any) -> None: cb_response = FloCallbackResponse("on_agent_error", name, error=error, args=kwargs, model_name=model_name) - __safe_call_cb(self.func, cb_response, self.ignore_error) + safe_call_cb(self.func, cb_response, self.ignore_error) return cb_response class FunctionalFloRouterCallbackImpl(FloRouterCallback): @@ -129,19 +129,19 @@ def __init__(self, func: Callable, ignore_error: bool = True) -> None: self.func = func self.ignore_error = ignore_error - async def on_tool_start(self, name: str, model_name: str, input: Any, **kwargs: Any) -> Any: + def on_router_start(self, name: str, model_name: str, input: Any, **kwargs: Any) -> Any: cb_response = FloCallbackResponse("on_router_start", name, input=input, args=kwargs, model_name=model_name) - __safe_call_cb(self.func, cb_response, self.ignore_error) + safe_call_cb(self.func, cb_response, self.ignore_error) return cb_response - async def on_tool_end(self, name: str, model_name: str, output: Any, **kwargs: Any) -> None: + def on_router_end(self, name: str, model_name: str, output: Any, **kwargs: Any) -> None: cb_response = FloCallbackResponse("on_router_end", name, output=output, args=kwargs, model_name=model_name) - __safe_call_cb(self.func, cb_response, self.ignore_error) + safe_call_cb(self.func, cb_response, self.ignore_error) return cb_response - async def on_tool_error(self, name: str, model_name: str, error: Union[Exception, KeyboardInterrupt], **kwargs: Any) -> None: + def on_router_error(self, name: str, model_name: str, error: Union[Exception, KeyboardInterrupt], **kwargs: Any) -> None: cb_response = FloCallbackResponse("on_router_error", name, error=error, args=kwargs, model_name=model_name) - __safe_call_cb(self.func, cb_response, self.ignore_error) + safe_call_cb(self.func, cb_response, self.ignore_error) return cb_response class FloCallback(FunctionalFloToolCallbackImpl, FunctionalFloAgentCallbackImpl, FunctionalFloRouterCallbackImpl): From 92202922cdfc510542b3266bb623c261e3f2249e Mon Sep 17 00:00:00 2001 From: vizsatiz Date: Fri, 15 Nov 2024 16:55:40 +0530 Subject: [PATCH 5/8] Fixing precommit hook issues --- examples/llm_extensibility.py | 6 +- flo_ai/common/flo_langchain_logger.py | 10 +- flo_ai/models/flo_agent.py | 12 ++- flo_ai/models/flo_node.py | 95 ++++++++++++----- flo_ai/router/flo_linear.py | 2 +- flo_ai/router/flo_llm_router.py | 13 ++- flo_ai/router/flo_router.py | 2 +- flo_ai/router/flo_router_factory.py | 12 ++- flo_ai/router/flo_supervisor.py | 17 ++- flo_ai/state/flo_callbacks.py | 144 ++++++++++++++++++-------- flo_ai/state/flo_session.py | 17 ++- 11 files changed, 240 insertions(+), 90 deletions(-) diff --git a/examples/llm_extensibility.py b/examples/llm_extensibility.py index f96a8d80..431a1f7f 100644 --- a/examples/llm_extensibility.py +++ b/examples/llm_extensibility.py @@ -38,11 +38,13 @@ class SendEmailInput(BaseModel): def email_tool(to: str, message: str): return f'Email sent successfully to: {to}' + @flo_agent_callback def agent_callback(response: FloCallbackResponse): - print("------------- START AGENT CALLBACK -----------") + print('------------- START AGENT CALLBACK -----------') print(response) - print("------------- END AGENT CALLBACK -----------") + print('------------- END AGENT CALLBACK -----------') + session.register_tool('SendEmailTool', email_tool) session.register_callback(agent_callback) diff --git a/flo_ai/common/flo_langchain_logger.py b/flo_ai/common/flo_langchain_logger.py index dbe37d4a..6fc98441 100644 --- a/flo_ai/common/flo_langchain_logger.py +++ b/flo_ai/common/flo_langchain_logger.py @@ -4,6 +4,7 @@ from flo_ai.common.flo_logger import get_logger from flo_ai.state.flo_callbacks import FloToolCallback + class FloLangchainLogger(BaseCallbackHandler): def __init__(self, session_id: str, tool_callbacks: List[FloToolCallback] = []): self.session_id = session_id @@ -42,17 +43,20 @@ def on_tool_start( self, serialized: Dict[str, Any], input_str: str, **kwargs: Any ) -> None: get_logger().debug(f'onToolStart: {input_str}', self) - [x.on_tool_start(serialized["name"], kwargs["inputs"], kwargs) for x in self.tool_callbacks] + [ + x.on_tool_start(serialized['name'], kwargs['inputs'], kwargs) + for x in self.tool_callbacks + ] def on_tool_end(self, output: str, **kwargs: Any) -> None: get_logger().debug(f'onToolEnd: {output}', self) - [x.on_tool_end(kwargs["name"], output, kwargs) for x in self.tool_callbacks] + [x.on_tool_end(kwargs['name'], output, kwargs) for x in self.tool_callbacks] def on_tool_error( self, error: Union[Exception, KeyboardInterrupt], **kwargs: Any ) -> None: get_logger().debug(f'onToolError: {error}', self) - [x.on_tool_error(kwargs["name"], error, kwargs) for x in self.tool_callbacks] + [x.on_tool_error(kwargs['name'], error, kwargs) for x in self.tool_callbacks] def on_text(self, text: str, **kwargs: Any) -> None: get_logger().debug(f'onText: {text}', self) diff --git a/flo_ai/models/flo_agent.py b/flo_ai/models/flo_agent.py index e84a78eb..d3d3d409 100644 --- a/flo_ai/models/flo_agent.py +++ b/flo_ai/models/flo_agent.py @@ -13,7 +13,11 @@ class FloAgent(ExecutableFlo): def __init__( - self, agent: Runnable, executor: AgentExecutor, config: AgentConfig, model_nick_name: str + self, + agent: Runnable, + executor: AgentExecutor, + config: AgentConfig, + model_nick_name: str, ) -> None: super().__init__(config.name, executor, ExecutableType.agentic) self.model_name = model_nick_name @@ -31,7 +35,7 @@ def __init__( role: Optional[str] = None, llm: Union[BaseLanguageModel, None] = None, on_error: Union[str, Callable] = True, - model_nick_name: Union[str, None] = "default" + model_nick_name: Union[str, None] = 'default', ) -> None: prompt: Union[ChatPromptTemplate, str] = config.job self.name: str = config.name @@ -63,4 +67,6 @@ def build(self) -> AgentExecutor: return_intermediate_steps=True, handle_parsing_errors=self.on_error, ) - return FloAgent(agent, executor, self.config, model_nick_name=self.model_nick_name) + return FloAgent( + agent, executor, self.config, model_nick_name=self.model_nick_name + ) diff --git a/flo_ai/models/flo_node.py b/flo_ai/models/flo_node.py index 01050c51..6bfd6aad 100644 --- a/flo_ai/models/flo_node.py +++ b/flo_ai/models/flo_node.py @@ -25,7 +25,6 @@ def __init__( self.config: Union[AgentConfig | TeamConfig] = config class Builder: - def __init__(self, session: FloSession) -> None: self.session = session @@ -36,14 +35,16 @@ def build_from_agent(self, flo_agent: FloAgent) -> 'FloNode': name=flo_agent.name, agent_config=flo_agent.config, session=self.session, - model_name=flo_agent.model_name + model_name=flo_agent.model_name, ) return FloNode(agent_func, flo_agent.name, flo_agent.type, flo_agent.config) def build_from_team(self, flo_team: FloRoutedTeam) -> 'FloNode': team_chain = ( functools.partial( - FloNode.Builder.__teamflo_team_node, members=flo_team.runnable.nodes, session=self.session + FloNode.Builder.__teamflo_team_node, + members=flo_team.runnable.nodes, + session=self.session, ) | flo_team.runnable ) @@ -65,7 +66,7 @@ def build_from_router(self, flo_router) -> 'FloNode': name=flo_router.router_name, agent_config=flo_router.config, session=self.session, - model_name=flo_router.model_name + model_name=flo_router.model_name, ) return FloNode( router_func, flo_router.router_name, flo_router.type, flo_router.config @@ -78,23 +79,45 @@ def __teamflo_agent_node( name: str, agent_config: AgentConfig, session: FloSession, - model_name: str + model_name: str, ): - agent_cbs: List[FloAgentCallback] = FloNode.Builder.__filter_callbacks(session, FloAgentCallback) - flo_cbs: List[FloCallback] = FloNode.Builder.__filter_callbacks(session, FloCallback) - [callback.on_agent_start(name, model_name, state["messages"], **{}) for callback in agent_cbs] - [callback.on_agent_start(name, model_name, state["messages"], **{}) for callback in flo_cbs] + agent_cbs: List[FloAgentCallback] = FloNode.Builder.__filter_callbacks( + session, FloAgentCallback + ) + flo_cbs: List[FloCallback] = FloNode.Builder.__filter_callbacks( + session, FloCallback + ) + [ + callback.on_agent_start(name, model_name, state['messages'], **{}) + for callback in agent_cbs + ] + [ + callback.on_agent_start(name, model_name, state['messages'], **{}) + for callback in flo_cbs + ] try: result = agent.invoke(state) output = result if isinstance(result, str) else result['output'] except Exception as e: - [callback.on_agent_error(name, model_name, e, **{}) for callback in agent_cbs] - [callback.on_agent_error(name, model_name, e, **{}) for callback in flo_cbs] + [ + callback.on_agent_error(name, model_name, e, **{}) + for callback in agent_cbs + ] + [ + callback.on_agent_error(name, model_name, e, **{}) + for callback in flo_cbs + ] raise e - [callback.on_agent_end(name, model_name, output, **{}) for callback in agent_cbs] - [callback.on_agent_start(name, model_name, output, **{}) for callback in flo_cbs] + [ + callback.on_agent_end(name, model_name, output, **{}) + for callback in agent_cbs + ] + [ + callback.on_agent_start(name, model_name, output, **{}) + for callback in flo_cbs + ] return {STATE_NAME_MESSAGES: [HumanMessage(content=output, name=name)]} - + @staticmethod def __filter_callbacks(session: FloSession, type: Type): cbs = session.callbacks @@ -107,22 +130,44 @@ def __teamflo_router_node( name: str, agent_config: AgentConfig, session: FloSession, - model_name: str + model_name: str, ): - agent_cbs: List[FloRouterCallback] = FloNode.Builder.__filter_callbacks(session, FloRouterCallback) - flo_cbs: List[FloCallback] = FloNode.Builder.__filter_callbacks(session, FloCallback) - [callback.on_router_start(name, model_name, state["messages"], **{}) for callback in agent_cbs] - [callback.on_router_start(name, model_name, state["messages"], **{}) for callback in flo_cbs] + agent_cbs: List[FloRouterCallback] = FloNode.Builder.__filter_callbacks( + session, FloRouterCallback + ) + flo_cbs: List[FloCallback] = FloNode.Builder.__filter_callbacks( + session, FloCallback + ) + [ + callback.on_router_start(name, model_name, state['messages'], **{}) + for callback in agent_cbs + ] + [ + callback.on_router_start(name, model_name, state['messages'], **{}) + for callback in flo_cbs + ] try: result = agent.invoke(state) nextNode = result if isinstance(result, str) else result['next'] except Exception as e: - [callback.on_router_error(name, model_name, e, **{}) for callback in agent_cbs] - [callback.on_router_error(name, model_name, e, **{}) for callback in flo_cbs] + [ + callback.on_router_error(name, model_name, e, **{}) + for callback in agent_cbs + ] + [ + callback.on_router_error(name, model_name, e, **{}) + for callback in flo_cbs + ] raise e - [callback.on_router_end(name, model_name, nextNode, **{}) for callback in agent_cbs] - [callback.on_router_start(name, model_name, nextNode, **{}) for callback in flo_cbs] - return {'next': nextNode } + [ + callback.on_router_end(name, model_name, nextNode, **{}) + for callback in agent_cbs + ] + [ + callback.on_router_start(name, model_name, nextNode, **{}) + for callback in flo_cbs + ] + return {'next': nextNode} @staticmethod def __get_last_message(state: TeamFloAgentState) -> str: @@ -130,7 +175,7 @@ def __get_last_message(state: TeamFloAgentState) -> str: @staticmethod def __join_graph(response: dict): - return { STATE_NAME_MESSAGES: [response[STATE_NAME_MESSAGES][-1]] } + return {STATE_NAME_MESSAGES: [response[STATE_NAME_MESSAGES][-1]]} @staticmethod def __teamflo_team_node(message: str, members: list[str]): diff --git a/flo_ai/router/flo_linear.py b/flo_ai/router/flo_linear.py index 01d6a518..846e7529 100644 --- a/flo_ai/router/flo_linear.py +++ b/flo_ai/router/flo_linear.py @@ -16,7 +16,7 @@ def __init__(self, session: FloSession, config: TeamConfig, flo_team: FloTeam): flo_team=flo_team, executor=None, config=config, - model_name=None + model_name=None, ) self.router_config = config.router diff --git a/flo_ai/router/flo_llm_router.py b/flo_ai/router/flo_llm_router.py index a1f58f36..66f319f3 100644 --- a/flo_ai/router/flo_llm_router.py +++ b/flo_ai/router/flo_llm_router.py @@ -20,10 +20,19 @@ class NextAgent(BaseModel): class FloLLMRouter(FloRouter): def __init__( - self, session: FloSession, executor: Runnable, flo_team: FloTeam, name: str, model_name: str + self, + session: FloSession, + executor: Runnable, + flo_team: FloTeam, + name: str, + model_name: str, ) -> None: super().__init__( - session=session, name=name, flo_team=flo_team, executor=executor, model_name=model_name + session=session, + name=name, + flo_team=flo_team, + executor=executor, + model_name=model_name, ) def build_graph(self): diff --git a/flo_ai/router/flo_router.py b/flo_ai/router/flo_router.py index 7f18e249..eb15388b 100644 --- a/flo_ai/router/flo_router.py +++ b/flo_ai/router/flo_router.py @@ -29,7 +29,7 @@ def __init__( flo_team: FloTeam, executor, config: TeamConfig = None, - model_name: Union[str, None] = "default" + model_name: Union[str, None] = 'default', ): self.router_name = name self.session: FloSession = session diff --git a/flo_ai/router/flo_router_factory.py b/flo_ai/router/flo_router_factory.py index 0b1e2f23..8ce6e5f5 100644 --- a/flo_ai/router/flo_router_factory.py +++ b/flo_ai/router/flo_router_factory.py @@ -21,13 +21,21 @@ def create( ) if router_kind == 'supervisor': return FloSupervisor.Builder( - session, team_config, flo_team, llm=router_model, model_nick_name=team_config.router.model + session, + team_config, + flo_team, + llm=router_model, + model_nick_name=team_config.router.model, ).build() elif router_kind == 'linear': return FloLinear.Builder(session, team_config, flo_team).build() elif router_kind == 'llm': return FloLLMRouter.Builder( - session, team_config, flo_team, llm=router_model, model_nick_name=team_config.router.model + session, + team_config, + flo_team, + llm=router_model, + model_nick_name=team_config.router.model, ).build() else: raise Exception(f"""Unknown router type: {router_kind}. diff --git a/flo_ai/router/flo_supervisor.py b/flo_ai/router/flo_supervisor.py index bc78bc28..c1f731ba 100644 --- a/flo_ai/router/flo_supervisor.py +++ b/flo_ai/router/flo_supervisor.py @@ -21,10 +21,19 @@ class FloSupervisor(FloLLMRouter): def __init__( - self, session: FloSession, executor: Runnable, flo_team: FloTeam, name: str, model_name: str="default" + self, + session: FloSession, + executor: Runnable, + flo_team: FloTeam, + name: str, + model_name: str = 'default', ) -> None: super().__init__( - session=session, name=name, flo_team=flo_team, executor=executor, model_name=model_name + session=session, + name=name, + flo_team=flo_team, + executor=executor, + model_name=model_name, ) class Builder: @@ -34,7 +43,7 @@ def __init__( team_config: TeamConfig, flo_team: FloTeam, llm: Union[BaseLanguageModel, None] = None, - model_nick_name: str = "default" + model_nick_name: str = 'default', ) -> None: self.name = team_config.router.name self.session = session @@ -73,5 +82,5 @@ def build(self): flo_team=self.flo_team, name=self.name, session=self.session, - model_name=self.model_name + model_name=self.model_name, ) diff --git a/flo_ai/state/flo_callbacks.py b/flo_ai/state/flo_callbacks.py index 71e7bda7..5ae0afdb 100644 --- a/flo_ai/state/flo_callbacks.py +++ b/flo_ai/state/flo_callbacks.py @@ -2,18 +2,19 @@ from dataclasses import dataclass, field from flo_ai.common.flo_logger import get_logger + @dataclass class FloCallbackResponse: type: str - name: Optional[str] = None + name: Optional[str] = None model_name: Optional[str] = None input: Optional[str] = None output: Optional[str] = None error: Union[Exception, KeyboardInterrupt, None] = None args: Dict = field(default_factory=dict) -class FloToolCallback(): +class FloToolCallback: def __init__(self) -> None: pass @@ -22,7 +23,9 @@ def on_tool_start( ) -> Optional[FloCallbackResponse]: pass - def on_tool_end(self, name: str, output: Any, **kwargs: Any) -> Optional[FloCallbackResponse]: + def on_tool_end( + self, name: str, output: Any, **kwargs: Any + ) -> Optional[FloCallbackResponse]: pass def on_tool_error( @@ -30,8 +33,8 @@ def on_tool_error( ) -> Optional[FloCallbackResponse]: pass -class FloAgentCallback(): +class FloAgentCallback: def __init__(self) -> None: pass @@ -46,11 +49,16 @@ def on_agent_end( pass def on_agent_error( - self, name: str, model_name: str, error: Union[Exception, KeyboardInterrupt], **kwargs: Any + self, + name: str, + model_name: str, + error: Union[Exception, KeyboardInterrupt], + **kwargs: Any, ) -> Optional[FloCallbackResponse]: pass -class FloRouterCallback(): + +class FloRouterCallback: def __init__(self) -> None: pass @@ -65,99 +73,151 @@ def on_router_end( pass def on_router_error( - self, name: str, model_name: str, error: Union[Exception, KeyboardInterrupt], **kwargs: Any + self, + name: str, + model_name: str, + error: Union[Exception, KeyboardInterrupt], + **kwargs: Any, ) -> None: Optional[FloCallbackResponse] -def safe_call_cb(func, cb_response: FloCallbackResponse, ignore_error = True): - try: + +def safe_call_cb(func, cb_response: FloCallbackResponse, ignore_error=True): + try: func(cb_response) except Exception as e: if ignore_error: - get_logger().warning(e) + get_logger().warning(e) else: raise e -class FunctionalFloToolCallbackImpl(FloToolCallback): +class FunctionalFloToolCallbackImpl(FloToolCallback): def __init__(self, func: Callable, ignore_error: bool = True) -> None: super().__init__() self.func = func self.ignore_error = ignore_error - def on_tool_start(self, name: str, input: Any, **kwargs: Any) -> Optional[FloCallbackResponse]: - cb_response = FloRouterCallback("on_tool_start", name, input=input, args=kwargs) + def on_tool_start( + self, name: str, input: Any, **kwargs: Any + ) -> Optional[FloCallbackResponse]: + cb_response = FloRouterCallback('on_tool_start', name, input=input, args=kwargs) safe_call_cb(self.func, cb_response, self.ignore_error) return cb_response - - def on_tool_end(self, name: str, output: Any, **kwargs: Any) -> Optional[FloCallbackResponse]: - cb_response = FloRouterCallback("on_tool_end", name, output=output, args=kwargs) + + def on_tool_end( + self, name: str, output: Any, **kwargs: Any + ) -> Optional[FloCallbackResponse]: + cb_response = FloRouterCallback('on_tool_end', name, output=output, args=kwargs) safe_call_cb(self.func, cb_response, self.ignore_error) return cb_response - def on_tool_error(self, name: str, error: Union[Exception, KeyboardInterrupt], **kwargs: Any) -> Optional[FloCallbackResponse]: - cb_response = FloRouterCallback("on_tool_error", name, error=error, args=kwargs) + def on_tool_error( + self, name: str, error: Union[Exception, KeyboardInterrupt], **kwargs: Any + ) -> Optional[FloCallbackResponse]: + cb_response = FloRouterCallback('on_tool_error', name, error=error, args=kwargs) safe_call_cb(self.func, cb_response, self.ignore_error) return cb_response - -class FunctionalFloAgentCallbackImpl(FloAgentCallback): + +class FunctionalFloAgentCallbackImpl(FloAgentCallback): def __init__(self, func: Callable, ignore_error: bool = True) -> None: super().__init__() self.func = func self.ignore_error = ignore_error - def on_agent_start(self, name: str, model_name: str, input: Any, **kwargs: Any) -> Any: - cb_response = FloCallbackResponse("on_agent_start", name, input=input, args=kwargs, model_name=model_name) + def on_agent_start( + self, name: str, model_name: str, input: Any, **kwargs: Any + ) -> Any: + cb_response = FloCallbackResponse( + 'on_agent_start', name, input=input, args=kwargs, model_name=model_name + ) safe_call_cb(self.func, cb_response, self.ignore_error) return cb_response - - def on_agent_end(self, name: str, model_name: str, output: Any, **kwargs: Any) -> None: - cb_response = FloCallbackResponse("on_agent_end", name, output=output, args=kwargs, model_name=model_name) + + def on_agent_end( + self, name: str, model_name: str, output: Any, **kwargs: Any + ) -> None: + cb_response = FloCallbackResponse( + 'on_agent_end', name, output=output, args=kwargs, model_name=model_name + ) safe_call_cb(self.func, cb_response, self.ignore_error) return cb_response - def on_agent_error(self, name: str, model_name: str, error: Union[Exception, KeyboardInterrupt], **kwargs: Any) -> None: - cb_response = FloCallbackResponse("on_agent_error", name, error=error, args=kwargs, model_name=model_name) + def on_agent_error( + self, + name: str, + model_name: str, + error: Union[Exception, KeyboardInterrupt], + **kwargs: Any, + ) -> None: + cb_response = FloCallbackResponse( + 'on_agent_error', name, error=error, args=kwargs, model_name=model_name + ) safe_call_cb(self.func, cb_response, self.ignore_error) return cb_response -class FunctionalFloRouterCallbackImpl(FloRouterCallback): +class FunctionalFloRouterCallbackImpl(FloRouterCallback): def __init__(self, func: Callable, ignore_error: bool = True) -> None: super().__init__() self.func = func self.ignore_error = ignore_error - def on_router_start(self, name: str, model_name: str, input: Any, **kwargs: Any) -> Any: - cb_response = FloCallbackResponse("on_router_start", name, input=input, args=kwargs, model_name=model_name) + def on_router_start( + self, name: str, model_name: str, input: Any, **kwargs: Any + ) -> Any: + cb_response = FloCallbackResponse( + 'on_router_start', name, input=input, args=kwargs, model_name=model_name + ) safe_call_cb(self.func, cb_response, self.ignore_error) return cb_response - - def on_router_end(self, name: str, model_name: str, output: Any, **kwargs: Any) -> None: - cb_response = FloCallbackResponse("on_router_end", name, output=output, args=kwargs, model_name=model_name) + + def on_router_end( + self, name: str, model_name: str, output: Any, **kwargs: Any + ) -> None: + cb_response = FloCallbackResponse( + 'on_router_end', name, output=output, args=kwargs, model_name=model_name + ) safe_call_cb(self.func, cb_response, self.ignore_error) return cb_response - def on_router_error(self, name: str, model_name: str, error: Union[Exception, KeyboardInterrupt], **kwargs: Any) -> None: - cb_response = FloCallbackResponse("on_router_error", name, error=error, args=kwargs, model_name=model_name) + def on_router_error( + self, + name: str, + model_name: str, + error: Union[Exception, KeyboardInterrupt], + **kwargs: Any, + ) -> None: + cb_response = FloCallbackResponse( + 'on_router_error', name, error=error, args=kwargs, model_name=model_name + ) safe_call_cb(self.func, cb_response, self.ignore_error) return cb_response - -class FloCallback(FunctionalFloToolCallbackImpl, FunctionalFloAgentCallbackImpl, FunctionalFloRouterCallbackImpl): + + +class FloCallback( + FunctionalFloToolCallbackImpl, + FunctionalFloAgentCallbackImpl, + FunctionalFloRouterCallbackImpl, +): def __init__(self, func: Callable, ignore_error: bool = True) -> None: FunctionalFloToolCallbackImpl.__init__(self, func, ignore_error) FunctionalFloAgentCallbackImpl.__init__(self, func, ignore_error) FunctionalFloRouterCallbackImpl.__init__(self, func, ignore_error) - -def flo_tool_callback(func: Callable, ignore_error = True) -> FloToolCallback: + + +def flo_tool_callback(func: Callable, ignore_error=True) -> FloToolCallback: return FunctionalFloToolCallbackImpl(func, ignore_error) -def flo_agent_callback(func: Callable, ignore_error = True) -> FloToolCallback: + +def flo_agent_callback(func: Callable, ignore_error=True) -> FloToolCallback: return FunctionalFloAgentCallbackImpl(func, ignore_error) -def flo_router_callback(func: Callable, ignore_error = True) -> FloRouterCallback: + +def flo_router_callback(func: Callable, ignore_error=True) -> FloRouterCallback: return FunctionalFloRouterCallbackImpl(func, ignore_error) -def flo_call_back(func: Callable, ignore_error = True) -> FloRouterCallback: + +def flo_call_back(func: Callable, ignore_error=True) -> FloRouterCallback: return FloCallback(func, ignore_error) diff --git a/flo_ai/state/flo_session.py b/flo_ai/state/flo_session.py index 52423982..ed1b8b1d 100644 --- a/flo_ai/state/flo_session.py +++ b/flo_ai/state/flo_session.py @@ -6,7 +6,11 @@ from flo_ai.common.flo_langchain_logger import FloLangchainLogger from flo_ai.yaml.config import FloRoutedTeamConfig, FloAgentConfig from flo_ai.helpers.utils import random_str -from flo_ai.state.flo_callbacks import FloToolCallback, FloAgentCallback, FloRouterCallback +from flo_ai.state.flo_callbacks import ( + FloToolCallback, + FloAgentCallback, + FloRouterCallback, +) from typing import Optional @@ -20,7 +24,6 @@ def _handle_agent_error(error) -> str: class FloSession: - def __init__( self, default_llm: BaseLanguageModel = None, @@ -77,10 +80,14 @@ def register_model(self, name: str, model: BaseLanguageModel): self.models[name] = model get_logger().info(f"Model '{name}' registered for session {self.session_id}") return self - - def register_callback(self, callback: Union[FloRouterCallback, FloAgentCallback, FloToolCallback]): + + def register_callback( + self, callback: Union[FloRouterCallback, FloAgentCallback, FloToolCallback] + ): self.callbacks.append(callback) - tool_callbacks = list(filter(lambda x: isinstance(x, FloToolCallback), self.callbacks)) + tool_callbacks = list( + filter(lambda x: isinstance(x, FloToolCallback), self.callbacks) + ) self.langchain_logger = FloLangchainLogger(self.session_id, tool_callbacks) return self From 9604cfe54726c7249fa4ba459c5d887ec6a630e8 Mon Sep 17 00:00:00 2001 From: vizsatiz Date: Fri, 15 Nov 2024 17:00:14 +0530 Subject: [PATCH 6/8] Updating poetry lock --- poetry.lock | 546 +++++++++++++++++++++++++--------------------------- 1 file changed, 266 insertions(+), 280 deletions(-) diff --git a/poetry.lock b/poetry.lock index 9dbadde3..e74aaf95 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.4 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. [[package]] name = "aiohappyeyeballs" @@ -13,112 +13,98 @@ files = [ [[package]] name = "aiohttp" -version = "3.10.10" +version = "3.11.2" description = "Async http client/server framework (asyncio)" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "aiohttp-3.10.10-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:be7443669ae9c016b71f402e43208e13ddf00912f47f623ee5994e12fc7d4b3f"}, - {file = "aiohttp-3.10.10-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7b06b7843929e41a94ea09eb1ce3927865387e3e23ebe108e0d0d09b08d25be9"}, - {file = "aiohttp-3.10.10-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:333cf6cf8e65f6a1e06e9eb3e643a0c515bb850d470902274239fea02033e9a8"}, - {file = "aiohttp-3.10.10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:274cfa632350225ce3fdeb318c23b4a10ec25c0e2c880eff951a3842cf358ac1"}, - {file = "aiohttp-3.10.10-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d9e5e4a85bdb56d224f412d9c98ae4cbd032cc4f3161818f692cd81766eee65a"}, - {file = "aiohttp-3.10.10-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2b606353da03edcc71130b52388d25f9a30a126e04caef1fd637e31683033abd"}, - {file = "aiohttp-3.10.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab5a5a0c7a7991d90446a198689c0535be89bbd6b410a1f9a66688f0880ec026"}, - {file = "aiohttp-3.10.10-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:578a4b875af3e0daaf1ac6fa983d93e0bbfec3ead753b6d6f33d467100cdc67b"}, - {file = "aiohttp-3.10.10-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8105fd8a890df77b76dd3054cddf01a879fc13e8af576805d667e0fa0224c35d"}, - {file = "aiohttp-3.10.10-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3bcd391d083f636c06a68715e69467963d1f9600f85ef556ea82e9ef25f043f7"}, - {file = "aiohttp-3.10.10-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fbc6264158392bad9df19537e872d476f7c57adf718944cc1e4495cbabf38e2a"}, - {file = "aiohttp-3.10.10-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:e48d5021a84d341bcaf95c8460b152cfbad770d28e5fe14a768988c461b821bc"}, - {file = "aiohttp-3.10.10-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:2609e9ab08474702cc67b7702dbb8a80e392c54613ebe80db7e8dbdb79837c68"}, - {file = "aiohttp-3.10.10-cp310-cp310-win32.whl", hash = "sha256:84afcdea18eda514c25bc68b9af2a2b1adea7c08899175a51fe7c4fb6d551257"}, - {file = "aiohttp-3.10.10-cp310-cp310-win_amd64.whl", hash = "sha256:9c72109213eb9d3874f7ac8c0c5fa90e072d678e117d9061c06e30c85b4cf0e6"}, - {file = "aiohttp-3.10.10-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c30a0eafc89d28e7f959281b58198a9fa5e99405f716c0289b7892ca345fe45f"}, - {file = "aiohttp-3.10.10-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:258c5dd01afc10015866114e210fb7365f0d02d9d059c3c3415382ab633fcbcb"}, - {file = "aiohttp-3.10.10-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:15ecd889a709b0080f02721255b3f80bb261c2293d3c748151274dfea93ac871"}, - {file = "aiohttp-3.10.10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3935f82f6f4a3820270842e90456ebad3af15810cf65932bd24da4463bc0a4c"}, - {file = "aiohttp-3.10.10-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:413251f6fcf552a33c981c4709a6bba37b12710982fec8e558ae944bfb2abd38"}, - {file = "aiohttp-3.10.10-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d1720b4f14c78a3089562b8875b53e36b51c97c51adc53325a69b79b4b48ebcb"}, - {file = "aiohttp-3.10.10-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:679abe5d3858b33c2cf74faec299fda60ea9de62916e8b67e625d65bf069a3b7"}, - {file = "aiohttp-3.10.10-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:79019094f87c9fb44f8d769e41dbb664d6e8fcfd62f665ccce36762deaa0e911"}, - {file = "aiohttp-3.10.10-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:fe2fb38c2ed905a2582948e2de560675e9dfbee94c6d5ccdb1301c6d0a5bf092"}, - {file = "aiohttp-3.10.10-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:a3f00003de6eba42d6e94fabb4125600d6e484846dbf90ea8e48a800430cc142"}, - {file = "aiohttp-3.10.10-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:1bbb122c557a16fafc10354b9d99ebf2f2808a660d78202f10ba9d50786384b9"}, - {file = "aiohttp-3.10.10-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:30ca7c3b94708a9d7ae76ff281b2f47d8eaf2579cd05971b5dc681db8caac6e1"}, - {file = "aiohttp-3.10.10-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:df9270660711670e68803107d55c2b5949c2e0f2e4896da176e1ecfc068b974a"}, - {file = "aiohttp-3.10.10-cp311-cp311-win32.whl", hash = "sha256:aafc8ee9b742ce75044ae9a4d3e60e3d918d15a4c2e08a6c3c3e38fa59b92d94"}, - {file = "aiohttp-3.10.10-cp311-cp311-win_amd64.whl", hash = "sha256:362f641f9071e5f3ee6f8e7d37d5ed0d95aae656adf4ef578313ee585b585959"}, - {file = "aiohttp-3.10.10-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:9294bbb581f92770e6ed5c19559e1e99255e4ca604a22c5c6397b2f9dd3ee42c"}, - {file = "aiohttp-3.10.10-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a8fa23fe62c436ccf23ff930149c047f060c7126eae3ccea005f0483f27b2e28"}, - {file = "aiohttp-3.10.10-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5c6a5b8c7926ba5d8545c7dd22961a107526562da31a7a32fa2456baf040939f"}, - {file = "aiohttp-3.10.10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:007ec22fbc573e5eb2fb7dec4198ef8f6bf2fe4ce20020798b2eb5d0abda6138"}, - {file = "aiohttp-3.10.10-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9627cc1a10c8c409b5822a92d57a77f383b554463d1884008e051c32ab1b3742"}, - {file = "aiohttp-3.10.10-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:50edbcad60d8f0e3eccc68da67f37268b5144ecc34d59f27a02f9611c1d4eec7"}, - {file = "aiohttp-3.10.10-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a45d85cf20b5e0d0aa5a8dca27cce8eddef3292bc29d72dcad1641f4ed50aa16"}, - {file = "aiohttp-3.10.10-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0b00807e2605f16e1e198f33a53ce3c4523114059b0c09c337209ae55e3823a8"}, - {file = "aiohttp-3.10.10-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f2d4324a98062be0525d16f768a03e0bbb3b9fe301ceee99611dc9a7953124e6"}, - {file = "aiohttp-3.10.10-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:438cd072f75bb6612f2aca29f8bd7cdf6e35e8f160bc312e49fbecab77c99e3a"}, - {file = "aiohttp-3.10.10-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:baa42524a82f75303f714108fea528ccacf0386af429b69fff141ffef1c534f9"}, - {file = "aiohttp-3.10.10-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:a7d8d14fe962153fc681f6366bdec33d4356f98a3e3567782aac1b6e0e40109a"}, - {file = "aiohttp-3.10.10-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c1277cd707c465cd09572a774559a3cc7c7a28802eb3a2a9472588f062097205"}, - {file = "aiohttp-3.10.10-cp312-cp312-win32.whl", hash = "sha256:59bb3c54aa420521dc4ce3cc2c3fe2ad82adf7b09403fa1f48ae45c0cbde6628"}, - {file = "aiohttp-3.10.10-cp312-cp312-win_amd64.whl", hash = "sha256:0e1b370d8007c4ae31ee6db7f9a2fe801a42b146cec80a86766e7ad5c4a259cf"}, - {file = "aiohttp-3.10.10-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ad7593bb24b2ab09e65e8a1d385606f0f47c65b5a2ae6c551db67d6653e78c28"}, - {file = "aiohttp-3.10.10-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:1eb89d3d29adaf533588f209768a9c02e44e4baf832b08118749c5fad191781d"}, - {file = "aiohttp-3.10.10-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3fe407bf93533a6fa82dece0e74dbcaaf5d684e5a51862887f9eaebe6372cd79"}, - {file = "aiohttp-3.10.10-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50aed5155f819873d23520919e16703fc8925e509abbb1a1491b0087d1cd969e"}, - {file = "aiohttp-3.10.10-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4f05e9727ce409358baa615dbeb9b969db94324a79b5a5cea45d39bdb01d82e6"}, - {file = "aiohttp-3.10.10-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3dffb610a30d643983aeb185ce134f97f290f8935f0abccdd32c77bed9388b42"}, - {file = "aiohttp-3.10.10-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa6658732517ddabe22c9036479eabce6036655ba87a0224c612e1ae6af2087e"}, - {file = "aiohttp-3.10.10-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:741a46d58677d8c733175d7e5aa618d277cd9d880301a380fd296975a9cdd7bc"}, - {file = "aiohttp-3.10.10-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e00e3505cd80440f6c98c6d69269dcc2a119f86ad0a9fd70bccc59504bebd68a"}, - {file = "aiohttp-3.10.10-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ffe595f10566f8276b76dc3a11ae4bb7eba1aac8ddd75811736a15b0d5311414"}, - {file = "aiohttp-3.10.10-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:bdfcf6443637c148c4e1a20c48c566aa694fa5e288d34b20fcdc58507882fed3"}, - {file = "aiohttp-3.10.10-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:d183cf9c797a5291e8301790ed6d053480ed94070637bfaad914dd38b0981f67"}, - {file = "aiohttp-3.10.10-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:77abf6665ae54000b98b3c742bc6ea1d1fb31c394bcabf8b5d2c1ac3ebfe7f3b"}, - {file = "aiohttp-3.10.10-cp313-cp313-win32.whl", hash = "sha256:4470c73c12cd9109db8277287d11f9dd98f77fc54155fc71a7738a83ffcc8ea8"}, - {file = "aiohttp-3.10.10-cp313-cp313-win_amd64.whl", hash = "sha256:486f7aabfa292719a2753c016cc3a8f8172965cabb3ea2e7f7436c7f5a22a151"}, - {file = "aiohttp-3.10.10-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:1b66ccafef7336a1e1f0e389901f60c1d920102315a56df85e49552308fc0486"}, - {file = "aiohttp-3.10.10-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:acd48d5b80ee80f9432a165c0ac8cbf9253eaddb6113269a5e18699b33958dbb"}, - {file = "aiohttp-3.10.10-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3455522392fb15ff549d92fbf4b73b559d5e43dc522588f7eb3e54c3f38beee7"}, - {file = "aiohttp-3.10.10-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45c3b868724137f713a38376fef8120c166d1eadd50da1855c112fe97954aed8"}, - {file = "aiohttp-3.10.10-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:da1dee8948d2137bb51fbb8a53cce6b1bcc86003c6b42565f008438b806cccd8"}, - {file = "aiohttp-3.10.10-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c5ce2ce7c997e1971b7184ee37deb6ea9922ef5163c6ee5aa3c274b05f9e12fa"}, - {file = "aiohttp-3.10.10-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28529e08fde6f12eba8677f5a8608500ed33c086f974de68cc65ab218713a59d"}, - {file = "aiohttp-3.10.10-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f7db54c7914cc99d901d93a34704833568d86c20925b2762f9fa779f9cd2e70f"}, - {file = "aiohttp-3.10.10-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:03a42ac7895406220124c88911ebee31ba8b2d24c98507f4a8bf826b2937c7f2"}, - {file = "aiohttp-3.10.10-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:7e338c0523d024fad378b376a79faff37fafb3c001872a618cde1d322400a572"}, - {file = "aiohttp-3.10.10-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:038f514fe39e235e9fef6717fbf944057bfa24f9b3db9ee551a7ecf584b5b480"}, - {file = "aiohttp-3.10.10-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:64f6c17757251e2b8d885d728b6433d9d970573586a78b78ba8929b0f41d045a"}, - {file = "aiohttp-3.10.10-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:93429602396f3383a797a2a70e5f1de5df8e35535d7806c9f91df06f297e109b"}, - {file = "aiohttp-3.10.10-cp38-cp38-win32.whl", hash = "sha256:c823bc3971c44ab93e611ab1a46b1eafeae474c0c844aff4b7474287b75fe49c"}, - {file = "aiohttp-3.10.10-cp38-cp38-win_amd64.whl", hash = "sha256:54ca74df1be3c7ca1cf7f4c971c79c2daf48d9aa65dea1a662ae18926f5bc8ce"}, - {file = "aiohttp-3.10.10-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:01948b1d570f83ee7bbf5a60ea2375a89dfb09fd419170e7f5af029510033d24"}, - {file = "aiohttp-3.10.10-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9fc1500fd2a952c5c8e3b29aaf7e3cc6e27e9cfc0a8819b3bce48cc1b849e4cc"}, - {file = "aiohttp-3.10.10-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f614ab0c76397661b90b6851a030004dac502e48260ea10f2441abd2207fbcc7"}, - {file = "aiohttp-3.10.10-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00819de9e45d42584bed046314c40ea7e9aea95411b38971082cad449392b08c"}, - {file = "aiohttp-3.10.10-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05646ebe6b94cc93407b3bf34b9eb26c20722384d068eb7339de802154d61bc5"}, - {file = "aiohttp-3.10.10-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:998f3bd3cfc95e9424a6acd7840cbdd39e45bc09ef87533c006f94ac47296090"}, - {file = "aiohttp-3.10.10-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d9010c31cd6fa59438da4e58a7f19e4753f7f264300cd152e7f90d4602449762"}, - {file = "aiohttp-3.10.10-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7ea7ffc6d6d6f8a11e6f40091a1040995cdff02cfc9ba4c2f30a516cb2633554"}, - {file = "aiohttp-3.10.10-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ef9c33cc5cbca35808f6c74be11eb7f5f6b14d2311be84a15b594bd3e58b5527"}, - {file = "aiohttp-3.10.10-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ce0cdc074d540265bfeb31336e678b4e37316849d13b308607efa527e981f5c2"}, - {file = "aiohttp-3.10.10-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:597a079284b7ee65ee102bc3a6ea226a37d2b96d0418cc9047490f231dc09fe8"}, - {file = "aiohttp-3.10.10-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:7789050d9e5d0c309c706953e5e8876e38662d57d45f936902e176d19f1c58ab"}, - {file = "aiohttp-3.10.10-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:e7f8b04d83483577fd9200461b057c9f14ced334dcb053090cea1da9c8321a91"}, - {file = "aiohttp-3.10.10-cp39-cp39-win32.whl", hash = "sha256:c02a30b904282777d872266b87b20ed8cc0d1501855e27f831320f471d54d983"}, - {file = "aiohttp-3.10.10-cp39-cp39-win_amd64.whl", hash = "sha256:edfe3341033a6b53a5c522c802deb2079eee5cbfbb0af032a55064bd65c73a23"}, - {file = "aiohttp-3.10.10.tar.gz", hash = "sha256:0631dd7c9f0822cc61c88586ca76d5b5ada26538097d0f1df510b082bad3411a"}, + {file = "aiohttp-3.11.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:783741f534c14957fbe657d62a34b947ec06db23d45a2fd4a8aeb73d9c84d7e6"}, + {file = "aiohttp-3.11.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:435f7a08d8aa42371a94e7c141205a9cb092ba551084b5e0c57492e6673601a3"}, + {file = "aiohttp-3.11.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c681f34e2814bc6e1eef49752b338061b94a42c92734d0be9513447d3f83718c"}, + {file = "aiohttp-3.11.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:73a664478ae1ea011b5a710fb100b115ca8b2146864fa0ce4143ff944df714b8"}, + {file = "aiohttp-3.11.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f1d06c8fd8b453c3e553c956bd3b8395100401060430572174bb7876dd95ad49"}, + {file = "aiohttp-3.11.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b1f4844909321ef2c1cee50ddeccbd6018cd8c8d1ddddda3f553e94a5859497"}, + {file = "aiohttp-3.11.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdc6f8dce09281ae534eaf08a54f0d38612398375f28dad733a8885f3bf9b978"}, + {file = "aiohttp-3.11.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d2d942421cf3a1d1eceae8fa192f1fbfb74eb9d3e207d35ad2696bd2ce2c987c"}, + {file = "aiohttp-3.11.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:08ebe7a1d6c1e5ca766d68407280d69658f5f98821c2ba6c41c63cabfed159af"}, + {file = "aiohttp-3.11.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:2793d3297f3e49015140e6d3ea26142c967e07998e2fb00b6ee8d041138fbc4e"}, + {file = "aiohttp-3.11.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:4a23475d8d5c56e447b7752a1e2ac267c1f723f765e406c81feddcd16cdc97bc"}, + {file = "aiohttp-3.11.2-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:556564d89e2f4a6e8fe000894c03e4e84cf0b6cfa5674e425db122633ee244d1"}, + {file = "aiohttp-3.11.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:57993f406ce3f114b2a6756d7809be3ffd0cc40f33e8f8b9a4aa1b027fd4e3eb"}, + {file = "aiohttp-3.11.2-cp310-cp310-win32.whl", hash = "sha256:177b000efaf8d2f7012c649e8aee5b0bf488677b1162be5e7511aa4f9d567607"}, + {file = "aiohttp-3.11.2-cp310-cp310-win_amd64.whl", hash = "sha256:ff5d22eece44528023254b595c670dfcf9733ac6af74c4b6cb4f6a784dc3870c"}, + {file = "aiohttp-3.11.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:50e0aee4adc9abcd2109c618a8d1b2c93b85ac277b24a003ab147d91e068b06d"}, + {file = "aiohttp-3.11.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9aa4e68f1e4f303971ec42976fb170204fb5092de199034b57199a1747e78a2d"}, + {file = "aiohttp-3.11.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d84930b4145991214602372edd7305fc76b700220db79ac0dd57d3afd0f0a1ca"}, + {file = "aiohttp-3.11.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b4ec8afd362356b8798c8caa806e91deb3f0602d8ffae8e91d2d3ced2a90c35e"}, + {file = "aiohttp-3.11.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fb0544a0e8294a5a5e20d3cacdaaa9a911d7c0a9150f5264aef36e7d8fdfa07e"}, + {file = "aiohttp-3.11.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7b0a1618060e3f5aa73d3526ca2108a16a1b6bf86612cd0bb2ddcbef9879d06"}, + {file = "aiohttp-3.11.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d878a0186023ac391861958035174d0486f3259cabf8fd94e591985468da3ea"}, + {file = "aiohttp-3.11.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e33a7eddcd07545ccf5c3ab230f60314a17dc33e285475e8405e26e21f02660"}, + {file = "aiohttp-3.11.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4d7fad8c456d180a6d2f44c41cfab4b80e2e81451815825097db48b8293f59d5"}, + {file = "aiohttp-3.11.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8d954ba0eae7f33884d27dc00629ca4389d249eb8d26ca07c30911257cae8c96"}, + {file = "aiohttp-3.11.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:afa55e863224e664a782effa62245df73fdfc55aee539bed6efacf35f6d4e4b7"}, + {file = "aiohttp-3.11.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:10a5f91c319d9d4afba812f72984816b5fcd20742232ff7ecc1610ffbf3fc64d"}, + {file = "aiohttp-3.11.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6e8e19a80ba194db5c06915a9df23c0c06e0e9ca9a4db9386a6056cca555a027"}, + {file = "aiohttp-3.11.2-cp311-cp311-win32.whl", hash = "sha256:9c8d1db4f65bbc9d75b7b271d68fb996f1c8c81a525263862477d93611856c2d"}, + {file = "aiohttp-3.11.2-cp311-cp311-win_amd64.whl", hash = "sha256:2adb967454e10e69478ba4a8d8afbba48a7c7a8619216b7c807f8481cc66ddfb"}, + {file = "aiohttp-3.11.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f833a80d9de9307d736b6af58c235b17ef7f90ebea7b9c49cd274dec7a66a2f1"}, + {file = "aiohttp-3.11.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:382f853516664d2ebfc75dc01da4a10fdef5edcb335fe7b45cf471ce758ecb18"}, + {file = "aiohttp-3.11.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d3a2bcf6c81639a165da93469e1e0aff67c956721f3fa9c0560f07dd1e505116"}, + {file = "aiohttp-3.11.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:de3b4d5fb5d69749104b880a157f38baeea7765c93d9cd3837cedd5b84729e10"}, + {file = "aiohttp-3.11.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0a90a0dc4b054b5af299a900bf950fe8f9e3e54322bc405005f30aa5cacc5c98"}, + {file = "aiohttp-3.11.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:32334f35824811dd20a12cc90825d000e6b50faaeaa71408d42269151a66140d"}, + {file = "aiohttp-3.11.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0cba0b8d25aa2d450762f3dd6df85498f5e7c3ad0ddeb516ef2b03510f0eea32"}, + {file = "aiohttp-3.11.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bbb2dbc2701ab7e9307ca3a8fa4999c5b28246968e0a0202a5afabf48a42e22"}, + {file = "aiohttp-3.11.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:97fba98fc5d9ccd3d33909e898d00f2494d6a9eec7cbda3d030632e2c8bb4d00"}, + {file = "aiohttp-3.11.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0ebdf5087e2ce903d8220cc45dcece90c2199ae4395fd83ca616fcc81010db2c"}, + {file = "aiohttp-3.11.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:122768e3ae9ce74f981b46edefea9c6e5a40aea38aba3ac50168e6370459bf20"}, + {file = "aiohttp-3.11.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5587da333b7d280a312715b843d43e734652aa382cba824a84a67c81f75b338b"}, + {file = "aiohttp-3.11.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:85de9904bc360fd29a98885d2bfcbd4e02ab33c53353cb70607f2bea2cb92468"}, + {file = "aiohttp-3.11.2-cp312-cp312-win32.whl", hash = "sha256:b470de64d17156c37e91effc109d3b032b39867000e2c126732fe01d034441f9"}, + {file = "aiohttp-3.11.2-cp312-cp312-win_amd64.whl", hash = "sha256:3f617a48b70f4843d54f52440ea1e58da6bdab07b391a3a6aed8d3b311a4cc04"}, + {file = "aiohttp-3.11.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:5d90b5a3b0f32a5fecf5dd83d828713986c019585f5cddf40d288ff77f366615"}, + {file = "aiohttp-3.11.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d23854e5867650d40cba54d49956aad8081452aa80b2cf0d8c310633f4f48510"}, + {file = "aiohttp-3.11.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:486273d3b5af75a80c31c311988931bdd2a4b96a74d5c7f422bad948f99988ef"}, + {file = "aiohttp-3.11.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9075313f8e41b481e4cb10af405054564b0247dc335db5398ed05f8ec38787e2"}, + {file = "aiohttp-3.11.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:44b69c69c194ffacbc50165911cf023a4b1b06422d1e1199d3aea82eac17004e"}, + {file = "aiohttp-3.11.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b339d91ac9060bd6ecdc595a82dc151045e5d74f566e0864ef3f2ba0887fec42"}, + {file = "aiohttp-3.11.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64e8f5178958a9954043bc8cd10a5ae97352c3f2fc99aa01f2aebb0026010910"}, + {file = "aiohttp-3.11.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3129151378f858cdc4a0a4df355c9a0d060ab49e2eea7e62e9f085bac100551b"}, + {file = "aiohttp-3.11.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:14eb6c628432720e41b4fab1ada879d56cfe7034159849e083eb536b4c2afa99"}, + {file = "aiohttp-3.11.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:e57a10aacedcf24666f4c90d03e599f71d172d1c5e00dcf48205c445806745b0"}, + {file = "aiohttp-3.11.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:66e58a2e8c7609a3545c4b38fb8b01a6b8346c4862e529534f7674c5265a97b8"}, + {file = "aiohttp-3.11.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:9b6d15adc9768ff167614ca853f7eeb6ee5f1d55d5660e3af85ce6744fed2b82"}, + {file = "aiohttp-3.11.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:2914061f5ca573f990ec14191e6998752fa8fe50d518e3405410353c3f44aa5d"}, + {file = "aiohttp-3.11.2-cp313-cp313-win32.whl", hash = "sha256:1c2496182e577042e0e07a328d91c949da9e77a2047c7291071e734cd7a6e780"}, + {file = "aiohttp-3.11.2-cp313-cp313-win_amd64.whl", hash = "sha256:cccb2937bece1310c5c0163d0406aba170a2e5fb1f0444d7b0e7fdc9bd6bb713"}, + {file = "aiohttp-3.11.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:994cb893936dd2e1803655ae8667a45066bfd53360b148e22b4e3325cc5ea7a3"}, + {file = "aiohttp-3.11.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3666c750b73ce463a413692e3a57c60f7089e2d9116a2aa5a0f0eaf2ae325148"}, + {file = "aiohttp-3.11.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6ad9a7d2a3a0f235184426425f80bd3b26c66b24fd5fddecde66be30c01ebe6e"}, + {file = "aiohttp-3.11.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c979fc92aba66730b66099cd5becb42d869a26c0011119bc1c2478408a8bf7a"}, + {file = "aiohttp-3.11.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:766d0ebf8703d28f854f945982aa09224d5a27a29594c70d921c43c3930fe7ac"}, + {file = "aiohttp-3.11.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:79efd1ee3827b2f16797e14b1e45021206c3271249b4d0025014466d416d7413"}, + {file = "aiohttp-3.11.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d6e069b882c1fdcbe5577dc4be372eda705180197140577a4cddb648c29d22e"}, + {file = "aiohttp-3.11.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5e9a766c346b2ed7e88937919d84ed64b4ef489dad1d8939f806ee52901dc142"}, + {file = "aiohttp-3.11.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2b02a68b9445c70d7f5c8b578c5f5e5866b1d67ca23eb9e8bc8658ae9e3e2c74"}, + {file = "aiohttp-3.11.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:374baefcb1b6275f350da605951f5f02487a9bc84a574a7d5b696439fabd49a3"}, + {file = "aiohttp-3.11.2-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:d2f991c18132f3e505c108147925372ffe4549173b7c258cf227df1c5977a635"}, + {file = "aiohttp-3.11.2-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:34f37c59b12bc3afc52bab6fcd9cd3be82ff01c4598a84cbea934ccb3a9c54a0"}, + {file = "aiohttp-3.11.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:33af11eca7bb0f5c6ffaf5e7d9d2336c2448f9c6279b93abdd6f3c35f9ee321f"}, + {file = "aiohttp-3.11.2-cp39-cp39-win32.whl", hash = "sha256:83a70e22e0f6222effe7f29fdeba6c6023f9595e59a0479edacfbd7de4b77bb7"}, + {file = "aiohttp-3.11.2-cp39-cp39-win_amd64.whl", hash = "sha256:c28c1677ea33ccb8b14330560094cc44d3ff4fad617a544fd18beb90403fe0f1"}, + {file = "aiohttp-3.11.2.tar.gz", hash = "sha256:68d1f46f9387db3785508f5225d3acbc5825ca13d9c29f2b5cce203d5863eb79"}, ] [package.dependencies] aiohappyeyeballs = ">=2.3.0" aiosignal = ">=1.1.2" -async-timeout = {version = ">=4.0,<5.0", markers = "python_version < \"3.11\""} +async-timeout = {version = ">=4.0,<6.0", markers = "python_version < \"3.11\""} attrs = ">=17.3.0" frozenlist = ">=1.1.1" multidict = ">=4.5,<7.0" -yarl = ">=1.12.0,<2.0" +propcache = ">=0.2.0" +yarl = ">=1.17.0,<2.0" [package.extras] speedups = ["Brotli", "aiodns (>=3.2.0)", "brotlicffi"] @@ -942,13 +928,13 @@ tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipyth [[package]] name = "fastapi" -version = "0.115.4" +version = "0.115.5" description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" optional = false python-versions = ">=3.8" files = [ - {file = "fastapi-0.115.4-py3-none-any.whl", hash = "sha256:0b504a063ffb3cf96a5e27dc1bc32c80ca743a2528574f9cdc77daa2d31b4742"}, - {file = "fastapi-0.115.4.tar.gz", hash = "sha256:db653475586b091cb8b2fec2ac54a680ac6a158e07406e1abae31679e8826349"}, + {file = "fastapi-0.115.5-py3-none-any.whl", hash = "sha256:596b95adbe1474da47049e802f9a65ab2ffa9c2b07e7efee70eb8a66c9f2f796"}, + {file = "fastapi-0.115.5.tar.gz", hash = "sha256:0e7a4d0dc0d01c68df21887cce0945e72d3c48b9f4f79dfe7a7d53aa08fbb289"}, ] [package.dependencies] @@ -1152,13 +1138,13 @@ requests = ["requests (>=2.20.0,<3.0.0.dev0)"] [[package]] name = "googleapis-common-protos" -version = "1.65.0" +version = "1.66.0" description = "Common protobufs used in Google APIs" optional = false python-versions = ">=3.7" files = [ - {file = "googleapis_common_protos-1.65.0-py2.py3-none-any.whl", hash = "sha256:2972e6c496f435b92590fd54045060867f3fe9be2c82ab148fc8885035479a63"}, - {file = "googleapis_common_protos-1.65.0.tar.gz", hash = "sha256:334a29d07cddc3aa01dee4988f9afd9b2916ee2ff49d6b757155dc0d197852c0"}, + {file = "googleapis_common_protos-1.66.0-py2.py3-none-any.whl", hash = "sha256:d7abcd75fabb2e0ec9f74466401f6c119a0b498e27370e9be4c94cb7e382b8ed"}, + {file = "googleapis_common_protos-1.66.0.tar.gz", hash = "sha256:c3e7b33d15fdca5374cc0a7346dd92ffa847425cc4ea941d970f13680052ec8c"}, ] [package.dependencies] @@ -1644,103 +1630,103 @@ test-extra = ["curio", "ipython[test]", "matplotlib (!=3.2.0)", "nbformat", "num [[package]] name = "jedi" -version = "0.19.1" +version = "0.19.2" description = "An autocompletion tool for Python that can be used for text editors." optional = false python-versions = ">=3.6" files = [ - {file = "jedi-0.19.1-py2.py3-none-any.whl", hash = "sha256:e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0"}, - {file = "jedi-0.19.1.tar.gz", hash = "sha256:cf0496f3651bc65d7174ac1b7d043eff454892c708a87d1b683e57b569927ffd"}, + {file = "jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9"}, + {file = "jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0"}, ] [package.dependencies] -parso = ">=0.8.3,<0.9.0" +parso = ">=0.8.4,<0.9.0" [package.extras] docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] -testing = ["Django", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] +testing = ["Django", "attrs", "colorama", "docopt", "pytest (<9.0.0)"] [[package]] name = "jiter" -version = "0.7.0" +version = "0.7.1" description = "Fast iterable JSON parser." optional = false python-versions = ">=3.8" files = [ - {file = "jiter-0.7.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:e14027f61101b3f5e173095d9ecf95c1cac03ffe45a849279bde1d97e559e314"}, - {file = "jiter-0.7.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:979ec4711c2e37ac949561858bd42028884c9799516a923e1ff0b501ef341a4a"}, - {file = "jiter-0.7.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:662d5d3cca58ad6af7a3c6226b641c8655de5beebcb686bfde0df0f21421aafa"}, - {file = "jiter-0.7.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1d89008fb47043a469f97ad90840b97ba54e7c3d62dc7cbb6cbf938bd0caf71d"}, - {file = "jiter-0.7.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a8b16c35c846a323ce9067170d5ab8c31ea3dbcab59c4f7608bbbf20c2c3b43f"}, - {file = "jiter-0.7.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c9e82daaa1b0a68704f9029b81e664a5a9de3e466c2cbaabcda5875f961702e7"}, - {file = "jiter-0.7.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:43a87a9f586636e1f0dd3651a91f79b491ea0d9fd7cbbf4f5c463eebdc48bda7"}, - {file = "jiter-0.7.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2ec05b1615f96cc3e4901678bc863958611584072967d9962f9e571d60711d52"}, - {file = "jiter-0.7.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:a5cb97e35370bde7aa0d232a7f910f5a0fbbc96bc0a7dbaa044fd5cd6bcd7ec3"}, - {file = "jiter-0.7.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cb316dacaf48c8c187cea75d0d7f835f299137e6fdd13f691dff8f92914015c7"}, - {file = "jiter-0.7.0-cp310-none-win32.whl", hash = "sha256:243f38eb4072763c54de95b14ad283610e0cd3bf26393870db04e520f60eebb3"}, - {file = "jiter-0.7.0-cp310-none-win_amd64.whl", hash = "sha256:2221d5603c139f6764c54e37e7c6960c469cbcd76928fb10d15023ba5903f94b"}, - {file = "jiter-0.7.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:91cec0ad755bd786c9f769ce8d843af955df6a8e56b17658771b2d5cb34a3ff8"}, - {file = "jiter-0.7.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:feba70a28a27d962e353e978dbb6afd798e711c04cb0b4c5e77e9d3779033a1a"}, - {file = "jiter-0.7.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a9d866ec066c3616cacb8535dbda38bb1d470b17b25f0317c4540182bc886ce2"}, - {file = "jiter-0.7.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8e7a7a00b6f9f18289dd563596f97ecaba6c777501a8ba04bf98e03087bcbc60"}, - {file = "jiter-0.7.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9aaf564094c7db8687f2660605e099f3d3e6ea5e7135498486674fcb78e29165"}, - {file = "jiter-0.7.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a4d27e09825c1b3c7a667adb500ce8b840e8fc9f630da8454b44cdd4fb0081bb"}, - {file = "jiter-0.7.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ca7c287da9c1d56dda88da1d08855a787dbb09a7e2bd13c66a2e288700bd7c7"}, - {file = "jiter-0.7.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:db19a6d160f093cbc8cd5ea2abad420b686f6c0e5fb4f7b41941ebc6a4f83cda"}, - {file = "jiter-0.7.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6e46a63c7f877cf7441ffc821c28287cfb9f533ae6ed707bde15e7d4dfafa7ae"}, - {file = "jiter-0.7.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7ba426fa7ff21cb119fa544b75dd3fbee6a70e55a5829709c0338d07ccd30e6d"}, - {file = "jiter-0.7.0-cp311-none-win32.whl", hash = "sha256:c07f55a64912b0c7982377831210836d2ea92b7bd343fca67a32212dd72e38e0"}, - {file = "jiter-0.7.0-cp311-none-win_amd64.whl", hash = "sha256:ed27b2c43e1b5f6c7fedc5c11d4d8bfa627de42d1143d87e39e2e83ddefd861a"}, - {file = "jiter-0.7.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:ac7930bcaaeb1e229e35c91c04ed2e9f39025b86ee9fc3141706bbf6fff4aeeb"}, - {file = "jiter-0.7.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:571feae3e7c901a8eedde9fd2865b0dfc1432fb15cab8c675a8444f7d11b7c5d"}, - {file = "jiter-0.7.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a8af4df8a262fa2778b68c2a03b6e9d1cb4d43d02bea6976d46be77a3a331af1"}, - {file = "jiter-0.7.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bd028d4165097a611eb0c7494d8c1f2aebd46f73ca3200f02a175a9c9a6f22f5"}, - {file = "jiter-0.7.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c6b487247c7836810091e9455efe56a52ec51bfa3a222237e1587d04d3e04527"}, - {file = "jiter-0.7.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e6d28a92f28814e1a9f2824dc11f4e17e1df1f44dc4fdeb94c5450d34bcb2602"}, - {file = "jiter-0.7.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90443994bbafe134f0b34201dad3ebe1c769f0599004084e046fb249ad912425"}, - {file = "jiter-0.7.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f9abf464f9faac652542ce8360cea8e68fba2b78350e8a170248f9bcc228702a"}, - {file = "jiter-0.7.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:db7a8d99fc5f842f7d2852f06ccaed066532292c41723e5dff670c339b649f88"}, - {file = "jiter-0.7.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:15cf691ebd8693b70c94627d6b748f01e6d697d9a6e9f2bc310934fcfb7cf25e"}, - {file = "jiter-0.7.0-cp312-none-win32.whl", hash = "sha256:9dcd54fa422fb66ca398bec296fed5f58e756aa0589496011cfea2abb5be38a5"}, - {file = "jiter-0.7.0-cp312-none-win_amd64.whl", hash = "sha256:cc989951f73f9375b8eacd571baaa057f3d7d11b7ce6f67b9d54642e7475bfad"}, - {file = "jiter-0.7.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:24cecd18df540963cd27c08ca5ce1d0179f229ff78066d9eecbe5add29361340"}, - {file = "jiter-0.7.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d41b46236b90b043cca73785674c23d2a67d16f226394079d0953f94e765ed76"}, - {file = "jiter-0.7.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b160db0987171365c153e406a45dcab0ee613ae3508a77bfff42515cb4ce4d6e"}, - {file = "jiter-0.7.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d1c8d91e0f0bd78602eaa081332e8ee4f512c000716f5bc54e9a037306d693a7"}, - {file = "jiter-0.7.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:997706c683195eeff192d2e5285ce64d2a610414f37da3a3f2625dcf8517cf90"}, - {file = "jiter-0.7.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7ea52a8a0ff0229ab2920284079becd2bae0688d432fca94857ece83bb49c541"}, - {file = "jiter-0.7.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d77449d2738cf74752bb35d75ee431af457e741124d1db5e112890023572c7c"}, - {file = "jiter-0.7.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a8203519907a1d81d6cb00902c98e27c2d0bf25ce0323c50ca594d30f5f1fbcf"}, - {file = "jiter-0.7.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41d15ccc53931c822dd7f1aebf09faa3cda2d7b48a76ef304c7dbc19d1302e51"}, - {file = "jiter-0.7.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:febf3179b2fabf71fbd2fd52acb8594163bb173348b388649567a548f356dbf6"}, - {file = "jiter-0.7.0-cp313-none-win32.whl", hash = "sha256:4a8e2d866e7eda19f012444e01b55079d8e1c4c30346aaac4b97e80c54e2d6d3"}, - {file = "jiter-0.7.0-cp313-none-win_amd64.whl", hash = "sha256:7417c2b928062c496f381fb0cb50412eee5ad1d8b53dbc0e011ce45bb2de522c"}, - {file = "jiter-0.7.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:9c62c737b5368e51e74960a08fe1adc807bd270227291daede78db24d5fbf556"}, - {file = "jiter-0.7.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e4640722b1bef0f6e342fe4606aafaae0eb4f4be5c84355bb6867f34400f6688"}, - {file = "jiter-0.7.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f367488c3b9453eab285424c61098faa1cab37bb49425e69c8dca34f2dfe7d69"}, - {file = "jiter-0.7.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0cf5d42beb3514236459454e3287db53d9c4d56c4ebaa3e9d0efe81b19495129"}, - {file = "jiter-0.7.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cc5190ea1113ee6f7252fa8a5fe5a6515422e378356c950a03bbde5cafbdbaab"}, - {file = "jiter-0.7.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:63ee47a149d698796a87abe445fc8dee21ed880f09469700c76c8d84e0d11efd"}, - {file = "jiter-0.7.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48592c26ea72d3e71aa4bea0a93454df907d80638c3046bb0705507b6704c0d7"}, - {file = "jiter-0.7.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:79fef541199bd91cfe8a74529ecccb8eaf1aca38ad899ea582ebbd4854af1e51"}, - {file = "jiter-0.7.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:d1ef6bb66041f2514739240568136c81b9dcc64fd14a43691c17ea793b6535c0"}, - {file = "jiter-0.7.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:aca4d950863b1c238e315bf159466e064c98743eef3bd0ff9617e48ff63a4715"}, - {file = "jiter-0.7.0-cp38-none-win32.whl", hash = "sha256:897745f230350dcedb8d1ebe53e33568d48ea122c25e6784402b6e4e88169be7"}, - {file = "jiter-0.7.0-cp38-none-win_amd64.whl", hash = "sha256:b928c76a422ef3d0c85c5e98c498ce3421b313c5246199541e125b52953e1bc0"}, - {file = "jiter-0.7.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:c9b669ff6f8ba08270dee9ccf858d3b0203b42314a428a1676762f2d390fbb64"}, - {file = "jiter-0.7.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b5be919bacd73ca93801c3042bce6e95cb9c555a45ca83617b9b6c89df03b9c2"}, - {file = "jiter-0.7.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a282e1e8a396dabcea82d64f9d05acf7efcf81ecdd925b967020dcb0e671c103"}, - {file = "jiter-0.7.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:17ecb1a578a56e97a043c72b463776b5ea30343125308f667fb8fce4b3796735"}, - {file = "jiter-0.7.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7b6045fa0527129218cdcd8a8b839f678219686055f31ebab35f87d354d9c36e"}, - {file = "jiter-0.7.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:189cc4262a92e33c19d4fd24018f5890e4e6da5b2581f0059938877943f8298c"}, - {file = "jiter-0.7.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c138414839effbf30d185e30475c6dc8a16411a1e3681e5fd4605ab1233ac67a"}, - {file = "jiter-0.7.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2791604acef33da6b72d5ecf885a32384bcaf9aa1e4be32737f3b8b9588eef6a"}, - {file = "jiter-0.7.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ae60ec89037a78d60bbf3d8b127f1567769c8fa24886e0abed3f622791dea478"}, - {file = "jiter-0.7.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:836f03dea312967635233d826f783309b98cfd9ccc76ac776e224cfcef577862"}, - {file = "jiter-0.7.0-cp39-none-win32.whl", hash = "sha256:ebc30ae2ce4bc4986e1764c404b4ea1924f926abf02ce92516485098f8545374"}, - {file = "jiter-0.7.0-cp39-none-win_amd64.whl", hash = "sha256:abf596f951370c648f37aa9899deab296c42a3829736e598b0dd10b08f77a44d"}, - {file = "jiter-0.7.0.tar.gz", hash = "sha256:c061d9738535497b5509f8970584f20de1e900806b239a39a9994fc191dad630"}, + {file = "jiter-0.7.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:262e96d06696b673fad6f257e6a0abb6e873dc22818ca0e0600f4a1189eb334f"}, + {file = "jiter-0.7.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:be6de02939aac5be97eb437f45cfd279b1dc9de358b13ea6e040e63a3221c40d"}, + {file = "jiter-0.7.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:935f10b802bc1ce2b2f61843e498c7720aa7f4e4bb7797aa8121eab017293c3d"}, + {file = "jiter-0.7.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9cd3cccccabf5064e4bb3099c87bf67db94f805c1e62d1aefd2b7476e90e0ee2"}, + {file = "jiter-0.7.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4aa919ebfc5f7b027cc368fe3964c0015e1963b92e1db382419dadb098a05192"}, + {file = "jiter-0.7.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ae2d01e82c94491ce4d6f461a837f63b6c4e6dd5bb082553a70c509034ff3d4"}, + {file = "jiter-0.7.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f9568cd66dbbdab67ae1b4c99f3f7da1228c5682d65913e3f5f95586b3cb9a9"}, + {file = "jiter-0.7.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9ecbf4e20ec2c26512736284dc1a3f8ed79b6ca7188e3b99032757ad48db97dc"}, + {file = "jiter-0.7.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b1a0508fddc70ce00b872e463b387d49308ef02b0787992ca471c8d4ba1c0fa1"}, + {file = "jiter-0.7.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f84c9996664c460f24213ff1e5881530abd8fafd82058d39af3682d5fd2d6316"}, + {file = "jiter-0.7.1-cp310-none-win32.whl", hash = "sha256:c915e1a1960976ba4dfe06551ea87063b2d5b4d30759012210099e712a414d9f"}, + {file = "jiter-0.7.1-cp310-none-win_amd64.whl", hash = "sha256:75bf3b7fdc5c0faa6ffffcf8028a1f974d126bac86d96490d1b51b3210aa0f3f"}, + {file = "jiter-0.7.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:ad04a23a91f3d10d69d6c87a5f4471b61c2c5cd6e112e85136594a02043f462c"}, + {file = "jiter-0.7.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e47a554de88dff701226bb5722b7f1b6bccd0b98f1748459b7e56acac2707a5"}, + {file = "jiter-0.7.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e44fff69c814a2e96a20b4ecee3e2365e9b15cf5fe4e00869d18396daa91dab"}, + {file = "jiter-0.7.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:df0a1d05081541b45743c965436f8b5a1048d6fd726e4a030113a2699a6046ea"}, + {file = "jiter-0.7.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f22cf8f236a645cb6d8ffe2a64edb5d2b66fb148bf7c75eea0cb36d17014a7bc"}, + {file = "jiter-0.7.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:da8589f50b728ea4bf22e0632eefa125c8aa9c38ed202a5ee6ca371f05eeb3ff"}, + {file = "jiter-0.7.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f20de711224f2ca2dbb166a8d512f6ff48c9c38cc06b51f796520eb4722cc2ce"}, + {file = "jiter-0.7.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8a9803396032117b85ec8cbf008a54590644a062fedd0425cbdb95e4b2b60479"}, + {file = "jiter-0.7.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3d8bae77c82741032e9d89a4026479061aba6e646de3bf5f2fc1ae2bbd9d06e0"}, + {file = "jiter-0.7.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3dc9939e576bbc68c813fc82f6620353ed68c194c7bcf3d58dc822591ec12490"}, + {file = "jiter-0.7.1-cp311-none-win32.whl", hash = "sha256:f7605d24cd6fab156ec89e7924578e21604feee9c4f1e9da34d8b67f63e54892"}, + {file = "jiter-0.7.1-cp311-none-win_amd64.whl", hash = "sha256:f3ea649e7751a1a29ea5ecc03c4ada0a833846c59c6da75d747899f9b48b7282"}, + {file = "jiter-0.7.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:ad36a1155cbd92e7a084a568f7dc6023497df781adf2390c345dd77a120905ca"}, + {file = "jiter-0.7.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7ba52e6aaed2dc5c81a3d9b5e4ab95b039c4592c66ac973879ba57c3506492bb"}, + {file = "jiter-0.7.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2b7de0b6f6728b678540c7927587e23f715284596724be203af952418acb8a2d"}, + {file = "jiter-0.7.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9463b62bd53c2fb85529c700c6a3beb2ee54fde8bef714b150601616dcb184a6"}, + {file = "jiter-0.7.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:627164ec01d28af56e1f549da84caf0fe06da3880ebc7b7ee1ca15df106ae172"}, + {file = "jiter-0.7.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:25d0e5bf64e368b0aa9e0a559c3ab2f9b67e35fe7269e8a0d81f48bbd10e8963"}, + {file = "jiter-0.7.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c244261306f08f8008b3087059601997016549cb8bb23cf4317a4827f07b7d74"}, + {file = "jiter-0.7.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7ded4e4b75b68b843b7cea5cd7c55f738c20e1394c68c2cb10adb655526c5f1b"}, + {file = "jiter-0.7.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:80dae4f1889b9d09e5f4de6b58c490d9c8ce7730e35e0b8643ab62b1538f095c"}, + {file = "jiter-0.7.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5970cf8ec943b51bce7f4b98d2e1ed3ada170c2a789e2db3cb484486591a176a"}, + {file = "jiter-0.7.1-cp312-none-win32.whl", hash = "sha256:701d90220d6ecb3125d46853c8ca8a5bc158de8c49af60fd706475a49fee157e"}, + {file = "jiter-0.7.1-cp312-none-win_amd64.whl", hash = "sha256:7824c3ecf9ecf3321c37f4e4d4411aad49c666ee5bc2a937071bdd80917e4533"}, + {file = "jiter-0.7.1-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:097676a37778ba3c80cb53f34abd6943ceb0848263c21bf423ae98b090f6c6ba"}, + {file = "jiter-0.7.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3298af506d4271257c0a8f48668b0f47048d69351675dd8500f22420d4eec378"}, + {file = "jiter-0.7.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:12fd88cfe6067e2199964839c19bd2b422ca3fd792949b8f44bb8a4e7d21946a"}, + {file = "jiter-0.7.1-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:dacca921efcd21939123c8ea8883a54b9fa7f6545c8019ffcf4f762985b6d0c8"}, + {file = "jiter-0.7.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de3674a5fe1f6713a746d25ad9c32cd32fadc824e64b9d6159b3b34fd9134143"}, + {file = "jiter-0.7.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65df9dbae6d67e0788a05b4bad5706ad40f6f911e0137eb416b9eead6ba6f044"}, + {file = "jiter-0.7.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ba9a358d59a0a55cccaa4957e6ae10b1a25ffdabda863c0343c51817610501d"}, + {file = "jiter-0.7.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:576eb0f0c6207e9ede2b11ec01d9c2182973986514f9c60bc3b3b5d5798c8f50"}, + {file = "jiter-0.7.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:e550e29cdf3577d2c970a18f3959e6b8646fd60ef1b0507e5947dc73703b5627"}, + {file = "jiter-0.7.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:81d968dbf3ce0db2e0e4dec6b0a0d5d94f846ee84caf779b07cab49f5325ae43"}, + {file = "jiter-0.7.1-cp313-none-win32.whl", hash = "sha256:f892e547e6e79a1506eb571a676cf2f480a4533675f834e9ae98de84f9b941ac"}, + {file = "jiter-0.7.1-cp313-none-win_amd64.whl", hash = "sha256:0302f0940b1455b2a7fb0409b8d5b31183db70d2b07fd177906d83bf941385d1"}, + {file = "jiter-0.7.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:c65a3ce72b679958b79d556473f192a4dfc5895e8cc1030c9f4e434690906076"}, + {file = "jiter-0.7.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e80052d3db39f9bb8eb86d207a1be3d9ecee5e05fdec31380817f9609ad38e60"}, + {file = "jiter-0.7.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70a497859c4f3f7acd71c8bd89a6f9cf753ebacacf5e3e799138b8e1843084e3"}, + {file = "jiter-0.7.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c1288bc22b9e36854a0536ba83666c3b1fb066b811019d7b682c9cf0269cdf9f"}, + {file = "jiter-0.7.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b096ca72dd38ef35675e1d3b01785874315182243ef7aea9752cb62266ad516f"}, + {file = "jiter-0.7.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8dbbd52c50b605af13dbee1a08373c520e6fcc6b5d32f17738875847fea4e2cd"}, + {file = "jiter-0.7.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af29c5c6eb2517e71ffa15c7ae9509fa5e833ec2a99319ac88cc271eca865519"}, + {file = "jiter-0.7.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f114a4df1e40c03c0efbf974b376ed57756a1141eb27d04baee0680c5af3d424"}, + {file = "jiter-0.7.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:191fbaee7cf46a9dd9b817547bf556facde50f83199d07fc48ebeff4082f9df4"}, + {file = "jiter-0.7.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0e2b445e5ee627fb4ee6bbceeb486251e60a0c881a8e12398dfdff47c56f0723"}, + {file = "jiter-0.7.1-cp38-none-win32.whl", hash = "sha256:47ac4c3cf8135c83e64755b7276339b26cd3c7ddadf9e67306ace4832b283edf"}, + {file = "jiter-0.7.1-cp38-none-win_amd64.whl", hash = "sha256:60b49c245cd90cde4794f5c30f123ee06ccf42fb8730a019a2870cd005653ebd"}, + {file = "jiter-0.7.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:8f212eeacc7203256f526f550d105d8efa24605828382cd7d296b703181ff11d"}, + {file = "jiter-0.7.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d9e247079d88c00e75e297e6cb3a18a039ebcd79fefc43be9ba4eb7fb43eb726"}, + {file = "jiter-0.7.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f0aacaa56360139c53dcf352992b0331f4057a0373bbffd43f64ba0c32d2d155"}, + {file = "jiter-0.7.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bc1b55314ca97dbb6c48d9144323896e9c1a25d41c65bcb9550b3e0c270ca560"}, + {file = "jiter-0.7.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f281aae41b47e90deb70e7386558e877a8e62e1693e0086f37d015fa1c102289"}, + {file = "jiter-0.7.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:93c20d2730a84d43f7c0b6fb2579dc54335db742a59cf9776d0b80e99d587382"}, + {file = "jiter-0.7.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e81ccccd8069110e150613496deafa10da2f6ff322a707cbec2b0d52a87b9671"}, + {file = "jiter-0.7.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0a7d5e85766eff4c9be481d77e2226b4c259999cb6862ccac5ef6621d3c8dcce"}, + {file = "jiter-0.7.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f52ce5799df5b6975439ecb16b1e879d7655e1685b6e3758c9b1b97696313bfb"}, + {file = "jiter-0.7.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e0c91a0304373fdf97d56f88356a010bba442e6d995eb7773cbe32885b71cdd8"}, + {file = "jiter-0.7.1-cp39-none-win32.whl", hash = "sha256:5c08adf93e41ce2755970e8aa95262298afe2bf58897fb9653c47cd93c3c6cdc"}, + {file = "jiter-0.7.1-cp39-none-win_amd64.whl", hash = "sha256:6592f4067c74176e5f369228fb2995ed01400c9e8e1225fb73417183a5e635f0"}, + {file = "jiter-0.7.1.tar.gz", hash = "sha256:448cf4f74f7363c34cdef26214da527e8eeffd88ba06d0b80b485ad0667baf5d"}, ] [[package]] @@ -1930,13 +1916,13 @@ tenacity = ">=8.1.0,<8.4.0 || >8.4.0,<9.0.0" [[package]] name = "langchain-core" -version = "0.3.15" +version = "0.3.18" description = "Building applications with LLMs through composability" optional = false python-versions = "<4.0,>=3.9" files = [ - {file = "langchain_core-0.3.15-py3-none-any.whl", hash = "sha256:3d4ca6dbb8ed396a6ee061063832a2451b0ce8c345570f7b086ffa7288e4fa29"}, - {file = "langchain_core-0.3.15.tar.gz", hash = "sha256:b1a29787a4ffb7ec2103b4e97d435287201da7809b369740dd1e32f176325aba"}, + {file = "langchain_core-0.3.18-py3-none-any.whl", hash = "sha256:c38bb198152082e76859402bfff08f785ac66bcfd44c04d132708e16ee5f999c"}, + {file = "langchain_core-0.3.18.tar.gz", hash = "sha256:a14e9b9c0525b6fc9a7e4fe7f54a48b272d91ea855b1b081b364fabb966ae7af"}, ] [package.dependencies] @@ -1972,17 +1958,17 @@ pymongo = ">=4.6.1,<5.0" [[package]] name = "langchain-openai" -version = "0.2.6" +version = "0.2.8" description = "An integration package connecting OpenAI and LangChain" optional = false python-versions = "<4.0,>=3.9" files = [ - {file = "langchain_openai-0.2.6-py3-none-any.whl", hash = "sha256:d56e4d9183bdd1a5fb5f3ed9d287f15108e01d631ded170dd330a566f2927b95"}, - {file = "langchain_openai-0.2.6.tar.gz", hash = "sha256:7054e5f64498ad8e59d77cdc210103f5ea4f67258997edc48ae237298adeb316"}, + {file = "langchain_openai-0.2.8-py3-none-any.whl", hash = "sha256:0116b104d203377d2f4f61095e1d3ce1ba50e446d1a75397eaf0d1fcdf2c0d7b"}, + {file = "langchain_openai-0.2.8.tar.gz", hash = "sha256:48d22fa05bb8f7b371be47d05c7a3f42a68ff0e704647b86cc1bfc44e140f01b"}, ] [package.dependencies] -langchain-core = ">=0.3.15,<0.4.0" +langchain-core = ">=0.3.17,<0.4.0" openai = ">=1.54.0,<2.0.0" tiktoken = ">=0.7,<1" @@ -2034,13 +2020,13 @@ langgraph-sdk = ">=0.1.32,<0.2.0" [[package]] name = "langgraph-checkpoint" -version = "2.0.2" +version = "2.0.4" description = "Library with base interfaces for LangGraph checkpoint savers." optional = false python-versions = "<4.0.0,>=3.9.0" files = [ - {file = "langgraph_checkpoint-2.0.2-py3-none-any.whl", hash = "sha256:6e5dfd90e1fc71b91ccff75939ada1114e5d7f824df5f24c62d39bed69039ee2"}, - {file = "langgraph_checkpoint-2.0.2.tar.gz", hash = "sha256:c1d033e4e4855f580fa56830327eb86513b64ab5be527245363498e76b19a0b9"}, + {file = "langgraph_checkpoint-2.0.4-py3-none-any.whl", hash = "sha256:0039b937d5de951145acc196e7cf64e2e38cc9475c75040855cbf9edcc69ff89"}, + {file = "langgraph_checkpoint-2.0.4.tar.gz", hash = "sha256:17a20857090f805629a062986da739f003030e90388292e01614adcfb323d502"}, ] [package.dependencies] @@ -2049,13 +2035,13 @@ msgpack = ">=1.1.0,<2.0.0" [[package]] name = "langgraph-sdk" -version = "0.1.35" +version = "0.1.36" description = "SDK for interacting with LangGraph API" optional = false python-versions = "<4.0.0,>=3.9.0" files = [ - {file = "langgraph_sdk-0.1.35-py3-none-any.whl", hash = "sha256:b137c324fbce96afe39cc6a189c61fc042164068f0f6f02ac8de864d8ece6e05"}, - {file = "langgraph_sdk-0.1.35.tar.gz", hash = "sha256:414cfbc172b883446197763f3645d86bbc6a5b8ce9693c1df3fb6ce7d854a994"}, + {file = "langgraph_sdk-0.1.36-py3-none-any.whl", hash = "sha256:b11e1f0bc67631134d09d50c812dc73f9eb30394764ae1144d7d2a786a715355"}, + {file = "langgraph_sdk-0.1.36.tar.gz", hash = "sha256:2a2c651b7851ba15aeaab7e4e3ea7fd8357ef1cb0b592f264916fa990cdda6e7"}, ] [package.dependencies] @@ -2065,13 +2051,13 @@ orjson = ">=3.10.1" [[package]] name = "langsmith" -version = "0.1.142" +version = "0.1.143" description = "Client library to connect to the LangSmith LLM Tracing and Evaluation Platform." optional = false python-versions = "<4.0,>=3.8.1" files = [ - {file = "langsmith-0.1.142-py3-none-any.whl", hash = "sha256:f639ca23c9a0bb77af5fb881679b2f66ff1f21f19d0bebf4e51375e7585a8b38"}, - {file = "langsmith-0.1.142.tar.gz", hash = "sha256:f8a84d100f3052233ff0a1d66ae14c5dfc20b7e41a1601de011384f16ee6cb82"}, + {file = "langsmith-0.1.143-py3-none-any.whl", hash = "sha256:ba0d827269e9b03a90fababe41fa3e4e3f833300b95add10184f7e67167dde6f"}, + {file = "langsmith-0.1.143.tar.gz", hash = "sha256:4c5159e5cd84b3f8499433009e72d2076dd2daf6c044ac8a3611b30d0d0161c5"}, ] [package.dependencies] @@ -2604,13 +2590,13 @@ sympy = "*" [[package]] name = "openai" -version = "1.54.3" +version = "1.54.4" description = "The official Python library for the openai API" optional = false python-versions = ">=3.8" files = [ - {file = "openai-1.54.3-py3-none-any.whl", hash = "sha256:f18dbaf09c50d70c4185b892a2a553f80681d1d866323a2da7f7be2f688615d5"}, - {file = "openai-1.54.3.tar.gz", hash = "sha256:7511b74eeb894ac0b0253dc71f087a15d2e4d71d22d0088767205143d880cca6"}, + {file = "openai-1.54.4-py3-none-any.whl", hash = "sha256:0d95cef99346bf9b6d7fbf57faf61a673924c3e34fa8af84c9ffe04660673a7e"}, + {file = "openai-1.54.4.tar.gz", hash = "sha256:50f3656e45401c54e973fa05dc29f3f0b0d19348d685b2f7ddb4d92bf7b1b6bf"}, ] [package.dependencies] @@ -2896,12 +2882,12 @@ testing = ["docopt", "pytest"] [[package]] name = "peewee" -version = "3.17.7" +version = "3.17.8" description = "a little orm" optional = false python-versions = "*" files = [ - {file = "peewee-3.17.7.tar.gz", hash = "sha256:6aefc700bd530fc6ac23fa19c9c5b47041751d92985b799169c8e318e97eabaa"}, + {file = "peewee-3.17.8.tar.gz", hash = "sha256:ce1d05db3438830b989a1b9d0d0aa4e7f6134d5f6fd57686eeaa26a3e6485a8c"}, ] [[package]] @@ -4466,13 +4452,13 @@ testing = ["black (==22.3)", "datasets", "numpy", "pytest", "requests", "ruff"] [[package]] name = "tomli" -version = "2.0.2" +version = "2.1.0" description = "A lil' TOML parser" optional = false python-versions = ">=3.8" files = [ - {file = "tomli-2.0.2-py3-none-any.whl", hash = "sha256:2ebe24485c53d303f690b0ec092806a085f07af5a5aa1464f3931eec36caaa38"}, - {file = "tomli-2.0.2.tar.gz", hash = "sha256:d46d457a85337051c36524bc5349dd91b1877838e2979ac5ced3e710ed8a60ed"}, + {file = "tomli-2.1.0-py3-none-any.whl", hash = "sha256:a5c57c3d1c56f5ccdf89f6523458f60ef716e210fc47c4cfb188c5ba473e0391"}, + {file = "tomli-2.1.0.tar.gz", hash = "sha256:3f646cae2aec94e17d04973e4249548320197cfabdf130015d023de4b74d8ab8"}, ] [[package]] @@ -4826,80 +4812,80 @@ test = ["websockets"] [[package]] name = "websockets" -version = "14.0" +version = "14.1" description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" optional = false python-versions = ">=3.9" files = [ - {file = "websockets-14.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:064a72c0602c2d2c2586143561e0f179ef9b98e0825dc4a3d5cdf55a81898ed6"}, - {file = "websockets-14.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9dc5a2726fd16c266d35838db086fa4e621bb049e3bbe498ab9d54ad5068f726"}, - {file = "websockets-14.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1e541e4c8983b118a584c306070878e7f9670b7781e04184b6e05f9fc92e8a0e"}, - {file = "websockets-14.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23b13edb4df2d4e5d6dc747d83e6b244e267a6615ede90f18ef13dfb2b6feb87"}, - {file = "websockets-14.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:288365a33049dae3065cdb2c2dd4b48df4b64839c565761c4f3f0c360460a561"}, - {file = "websockets-14.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:79e2494047826a56f2951b2ada9dc139d2c3aff63122e86953cafe64ac0fde75"}, - {file = "websockets-14.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:5a5b76b47b62de16d26439d362b18d71394ca4376eb2c8838352be64b27ba8af"}, - {file = "websockets-14.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:7ed4111f305770e35070e49fbb9fbf757a9b6c9a31bb86d352eb4031d4aa976f"}, - {file = "websockets-14.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9af48a2f4cc5e2e34cf69969079865100e418c27caa26c1e3369efcc20c81e17"}, - {file = "websockets-14.0-cp310-cp310-win32.whl", hash = "sha256:a97c10043bf74d7667be69383312007d54a507fac8fa101be492cc91e279d94d"}, - {file = "websockets-14.0-cp310-cp310-win_amd64.whl", hash = "sha256:5f86250ee98f6098479936b7d596418b6e4c919dfa156508e9d6ac5f8bfbe764"}, - {file = "websockets-14.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3c12e6c1331ee8833fcb565c033f7eb4cb5642af37cef81211c222b617b170df"}, - {file = "websockets-14.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:445a53bce8344e62df4ed9a22fdd1f06cad8e404ead64b2a1f19bd826c8dad1b"}, - {file = "websockets-14.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3e4be641fed120790241ae15fde27374a62cadaadcc0bd2b4ce35790bd284fb6"}, - {file = "websockets-14.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b886b6d14cd089396155e6beb2935268bf995057bf24c3e5fd609af55c584a03"}, - {file = "websockets-14.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9b8a85d62709a86a9a55d4720502e88968483ee7f365bd852b75935dec04e0d"}, - {file = "websockets-14.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:08d62f438a591c016c5d4c79eaf9a8f7a85b6c3ea88793d676c00c930a41e775"}, - {file = "websockets-14.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:189e9f074f2a77f7cf54634797b29be28116ee564ece421c7653030a2cef48f0"}, - {file = "websockets-14.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:0b406f2387dbaf301996b7b2cf41519c1fbba7d5c9626406dd56f72075a60a00"}, - {file = "websockets-14.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a3741f4394ba3d55a64949ee11ffdba19e2a2bdaa1319a96a7ab93bf8bd2b9b2"}, - {file = "websockets-14.0-cp311-cp311-win32.whl", hash = "sha256:b639ea88a46f4629645b398c9e7be0366c92e4910203a6314f78469f5e631dc5"}, - {file = "websockets-14.0-cp311-cp311-win_amd64.whl", hash = "sha256:715b238c1772ed28b98af8830df41c5d68941729e22384fe1433db495b1d5438"}, - {file = "websockets-14.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f988f141a9be7a74d2e98d446b2f5411038bad14cdab80f9d1644b2329a71b48"}, - {file = "websockets-14.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7fd212e7022c70b4f8246dee4449dde30ff50c7e8e1d61ac87b7879579badd03"}, - {file = "websockets-14.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4c06f014fd8fa3827e5fd03ec012945e2139901f261fcc401e0622476cad9c5c"}, - {file = "websockets-14.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fad8f03dc976e710db785abf9deb76eb259312fb54d77b568c73f0162cef96e"}, - {file = "websockets-14.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6cff048a155024a580fee9f9a66b0ad9fc82683f6470c26eb76dd9280e6f459e"}, - {file = "websockets-14.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56ec8098dcc47817c8aee8037165f0fe30fec8efe543c66e0924781a4bfcbdfd"}, - {file = "websockets-14.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ee5fb667aec4ae723d40ada9854128df427b35b526c600cd352ca0240aad4dd7"}, - {file = "websockets-14.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:2752c98237057f27594a8393d498edd9db37e06abcfb99176d9cb6fb989dc883"}, - {file = "websockets-14.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e9ff528498d9e5c543bee388023ca91870678ac50724d675853ba85b4f0a459e"}, - {file = "websockets-14.0-cp312-cp312-win32.whl", hash = "sha256:8982909857b09220ee31d9a45699fce26f8e5b94a10efa7fe07004d4f4200a33"}, - {file = "websockets-14.0-cp312-cp312-win_amd64.whl", hash = "sha256:61b60c2a07b6d25f7ce8cc0101d55fb0f1af388bec1eddfe0181085c2206e7b0"}, - {file = "websockets-14.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7cf000319db10a0cb5c7ce91bfd2a8699086b5cc0b5c5b83b92eec22a0448b2f"}, - {file = "websockets-14.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0bae3caf386d418e83b62e8c1c4cec1b13348fac43e530b9894d6c7c02d921b5"}, - {file = "websockets-14.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8eb46ac94d5c131336dc997a568f5579501958b14a507e6aa4840f6d856da980"}, - {file = "websockets-14.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:12c345585b1da70cd27a298b0b9a81aa18da7a690672f771b427db59c632d8aa"}, - {file = "websockets-14.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:81758da7c76b4e2ddabc4a98a51f3c3aca8585a6d3a8662b5061613303bd5f68"}, - {file = "websockets-14.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4eae86193fd667667f35367d292b912685cb22c3f9f1dd6deaa3fdd713ab5976"}, - {file = "websockets-14.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7078dd0eac3a1dccf2c6f474004dbe8a4e936dbd19d37bbfb6efa70c923ae04e"}, - {file = "websockets-14.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2a418d596536a470f6f8e94cbb1fde66fe65e03d68c403eee0f2198b129e139a"}, - {file = "websockets-14.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7d66eeab61956e231f35659e6d5b66dc04a3d51e65f2b8f71862dc6a8ba710d1"}, - {file = "websockets-14.0-cp313-cp313-win32.whl", hash = "sha256:b24f7286a5c4e350284623cf708662f0881fe7bc1146c1a1fe7e6a9be01a8d6b"}, - {file = "websockets-14.0-cp313-cp313-win_amd64.whl", hash = "sha256:fb260539dd2b64e93c9f2c59caa70d36d2020fb8e26fa17f62459ad50ebf6c24"}, - {file = "websockets-14.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0913596e0072202be8729dab05266398b72ee57c4232f48d52fe2a0370d0b53f"}, - {file = "websockets-14.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6f2e7710f3c468519f9d5b01a291c407f809f8f831e5a204b238e02447046d78"}, - {file = "websockets-14.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0ae0e14729038208711d2e2f769280621c22cd253e3dac00f809fa38c6ccb79d"}, - {file = "websockets-14.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4875d1c3ab3d1d9a9d8485dc1f4c2aaa63947824af03301911ea58d1e881e096"}, - {file = "websockets-14.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:678990bc5a1e4fa36e18d340d439079a21e6b8d249848b7066cad1a6cbd34b82"}, - {file = "websockets-14.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bdaf3b31f8343dcc6c20d068c10eb29325dd70f5dc321ebb5fbeaa280436e70e"}, - {file = "websockets-14.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:633bbda2d30bc695900f6a07de4e5d92a4e8e8d0d8a536bb3c2051bee4dc3856"}, - {file = "websockets-14.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:1c4ca7cc5a02f909789dad259dffe61be4f38ffb26dc5e26ab2dca2c7d7c87de"}, - {file = "websockets-14.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5ade11f4939b885303d28b53d512e96e1a8ea8fbebedd6fef3e2e1afe633cc2a"}, - {file = "websockets-14.0-cp39-cp39-win32.whl", hash = "sha256:281b5ab9514eb241e347a46367a2374cb60cf8f420c4283948aa188f05e7810c"}, - {file = "websockets-14.0-cp39-cp39-win_amd64.whl", hash = "sha256:72fe11675685412917363481b79c56e68175e62352f84ca4788ac264f9ea6ed0"}, - {file = "websockets-14.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:3f1a697262e28682222f18fae70eb0800dfa50c6eb96b0561c6beb83d6cf78ca"}, - {file = "websockets-14.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:1e0e543e0e81c55e68552bd3c081282721c710a6379a2a78e1ec793853479b25"}, - {file = "websockets-14.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2786c74cbcb0263fd541e4a075aa8c932bdcaa91e5bbb8649c65304799acdd64"}, - {file = "websockets-14.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:176b39547950ff3520728bd1eadd0fa02c68492a1fabca636bab7883dd390905"}, - {file = "websockets-14.0-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86626d560ceb9d846d128b9c7bd2d0f247dbb62fb49c386762d109583140bf48"}, - {file = "websockets-14.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ca447967131023e98fcb4867f05cf8584adb424b9108180b2414745a6ff41c31"}, - {file = "websockets-14.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:c4eb304743ab285f8f057344d115259fbe31e42151b9aae7610db83d2a7379b1"}, - {file = "websockets-14.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:cc7dbe53276429b2ca511a04a3979ce27aa2088fdd28c119c6913dccdfd0e909"}, - {file = "websockets-14.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f6dd785f7a521189b1233d3c86c0b66fb73d4769a1d253ce5b31081c5946f05f"}, - {file = "websockets-14.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:77697c303b874daf1c76d4e167cd5d6871c26964bc189e4bdb40427067d53a86"}, - {file = "websockets-14.0-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20979614e4d7266f15018c154255d35dfb9fc828fdf6b4924166b6728fed359f"}, - {file = "websockets-14.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:3fb3d9e3940ea15b30404200e768e6111c3ee2956c60ceb001cae057961ab058"}, - {file = "websockets-14.0-py3-none-any.whl", hash = "sha256:1a3bca8cfb66614e23a65aa5d6b87190876ec6f3247094939f9db877db55319c"}, - {file = "websockets-14.0.tar.gz", hash = "sha256:be90aa6dab180fed523c0c10a6729ad16c9ba79067402d01a4d8aa7ce48d4084"}, + {file = "websockets-14.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a0adf84bc2e7c86e8a202537b4fd50e6f7f0e4a6b6bf64d7ccb96c4cd3330b29"}, + {file = "websockets-14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:90b5d9dfbb6d07a84ed3e696012610b6da074d97453bd01e0e30744b472c8179"}, + {file = "websockets-14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2177ee3901075167f01c5e335a6685e71b162a54a89a56001f1c3e9e3d2ad250"}, + {file = "websockets-14.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f14a96a0034a27f9d47fd9788913924c89612225878f8078bb9d55f859272b0"}, + {file = "websockets-14.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f874ba705deea77bcf64a9da42c1f5fc2466d8f14daf410bc7d4ceae0a9fcb0"}, + {file = "websockets-14.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9607b9a442392e690a57909c362811184ea429585a71061cd5d3c2b98065c199"}, + {file = "websockets-14.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:bea45f19b7ca000380fbd4e02552be86343080120d074b87f25593ce1700ad58"}, + {file = "websockets-14.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:219c8187b3ceeadbf2afcf0f25a4918d02da7b944d703b97d12fb01510869078"}, + {file = "websockets-14.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ad2ab2547761d79926effe63de21479dfaf29834c50f98c4bf5b5480b5838434"}, + {file = "websockets-14.1-cp310-cp310-win32.whl", hash = "sha256:1288369a6a84e81b90da5dbed48610cd7e5d60af62df9851ed1d1d23a9069f10"}, + {file = "websockets-14.1-cp310-cp310-win_amd64.whl", hash = "sha256:e0744623852f1497d825a49a99bfbec9bea4f3f946df6eb9d8a2f0c37a2fec2e"}, + {file = "websockets-14.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:449d77d636f8d9c17952628cc7e3b8faf6e92a17ec581ec0c0256300717e1512"}, + {file = "websockets-14.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a35f704be14768cea9790d921c2c1cc4fc52700410b1c10948511039be824aac"}, + {file = "websockets-14.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b1f3628a0510bd58968c0f60447e7a692933589b791a6b572fcef374053ca280"}, + {file = "websockets-14.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c3deac3748ec73ef24fc7be0b68220d14d47d6647d2f85b2771cb35ea847aa1"}, + {file = "websockets-14.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7048eb4415d46368ef29d32133134c513f507fff7d953c18c91104738a68c3b3"}, + {file = "websockets-14.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6cf0ad281c979306a6a34242b371e90e891bce504509fb6bb5246bbbf31e7b6"}, + {file = "websockets-14.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cc1fc87428c1d18b643479caa7b15db7d544652e5bf610513d4a3478dbe823d0"}, + {file = "websockets-14.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f95ba34d71e2fa0c5d225bde3b3bdb152e957150100e75c86bc7f3964c450d89"}, + {file = "websockets-14.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9481a6de29105d73cf4515f2bef8eb71e17ac184c19d0b9918a3701c6c9c4f23"}, + {file = "websockets-14.1-cp311-cp311-win32.whl", hash = "sha256:368a05465f49c5949e27afd6fbe0a77ce53082185bbb2ac096a3a8afaf4de52e"}, + {file = "websockets-14.1-cp311-cp311-win_amd64.whl", hash = "sha256:6d24fc337fc055c9e83414c94e1ee0dee902a486d19d2a7f0929e49d7d604b09"}, + {file = "websockets-14.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:ed907449fe5e021933e46a3e65d651f641975a768d0649fee59f10c2985529ed"}, + {file = "websockets-14.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:87e31011b5c14a33b29f17eb48932e63e1dcd3fa31d72209848652310d3d1f0d"}, + {file = "websockets-14.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bc6ccf7d54c02ae47a48ddf9414c54d48af9c01076a2e1023e3b486b6e72c707"}, + {file = "websockets-14.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9777564c0a72a1d457f0848977a1cbe15cfa75fa2f67ce267441e465717dcf1a"}, + {file = "websockets-14.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a655bde548ca98f55b43711b0ceefd2a88a71af6350b0c168aa77562104f3f45"}, + {file = "websockets-14.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3dfff83ca578cada2d19e665e9c8368e1598d4e787422a460ec70e531dbdd58"}, + {file = "websockets-14.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6a6c9bcf7cdc0fd41cc7b7944447982e8acfd9f0d560ea6d6845428ed0562058"}, + {file = "websockets-14.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4b6caec8576e760f2c7dd878ba817653144d5f369200b6ddf9771d64385b84d4"}, + {file = "websockets-14.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:eb6d38971c800ff02e4a6afd791bbe3b923a9a57ca9aeab7314c21c84bf9ff05"}, + {file = "websockets-14.1-cp312-cp312-win32.whl", hash = "sha256:1d045cbe1358d76b24d5e20e7b1878efe578d9897a25c24e6006eef788c0fdf0"}, + {file = "websockets-14.1-cp312-cp312-win_amd64.whl", hash = "sha256:90f4c7a069c733d95c308380aae314f2cb45bd8a904fb03eb36d1a4983a4993f"}, + {file = "websockets-14.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:3630b670d5057cd9e08b9c4dab6493670e8e762a24c2c94ef312783870736ab9"}, + {file = "websockets-14.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:36ebd71db3b89e1f7b1a5deaa341a654852c3518ea7a8ddfdf69cc66acc2db1b"}, + {file = "websockets-14.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5b918d288958dc3fa1c5a0b9aa3256cb2b2b84c54407f4813c45d52267600cd3"}, + {file = "websockets-14.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00fe5da3f037041da1ee0cf8e308374e236883f9842c7c465aa65098b1c9af59"}, + {file = "websockets-14.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8149a0f5a72ca36720981418eeffeb5c2729ea55fa179091c81a0910a114a5d2"}, + {file = "websockets-14.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77569d19a13015e840b81550922056acabc25e3f52782625bc6843cfa034e1da"}, + {file = "websockets-14.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cf5201a04550136ef870aa60ad3d29d2a59e452a7f96b94193bee6d73b8ad9a9"}, + {file = "websockets-14.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:88cf9163ef674b5be5736a584c999e98daf3aabac6e536e43286eb74c126b9c7"}, + {file = "websockets-14.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:836bef7ae338a072e9d1863502026f01b14027250a4545672673057997d5c05a"}, + {file = "websockets-14.1-cp313-cp313-win32.whl", hash = "sha256:0d4290d559d68288da9f444089fd82490c8d2744309113fc26e2da6e48b65da6"}, + {file = "websockets-14.1-cp313-cp313-win_amd64.whl", hash = "sha256:8621a07991add373c3c5c2cf89e1d277e49dc82ed72c75e3afc74bd0acc446f0"}, + {file = "websockets-14.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:01bb2d4f0a6d04538d3c5dfd27c0643269656c28045a53439cbf1c004f90897a"}, + {file = "websockets-14.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:414ffe86f4d6f434a8c3b7913655a1a5383b617f9bf38720e7c0799fac3ab1c6"}, + {file = "websockets-14.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8fda642151d5affdee8a430bd85496f2e2517be3a2b9d2484d633d5712b15c56"}, + {file = "websockets-14.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd7c11968bc3860d5c78577f0dbc535257ccec41750675d58d8dc66aa47fe52c"}, + {file = "websockets-14.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a032855dc7db987dff813583d04f4950d14326665d7e714d584560b140ae6b8b"}, + {file = "websockets-14.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b7e7ea2f782408c32d86b87a0d2c1fd8871b0399dd762364c731d86c86069a78"}, + {file = "websockets-14.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:39450e6215f7d9f6f7bc2a6da21d79374729f5d052333da4d5825af8a97e6735"}, + {file = "websockets-14.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ceada5be22fa5a5a4cdeec74e761c2ee7db287208f54c718f2df4b7e200b8d4a"}, + {file = "websockets-14.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:3fc753451d471cff90b8f467a1fc0ae64031cf2d81b7b34e1811b7e2691bc4bc"}, + {file = "websockets-14.1-cp39-cp39-win32.whl", hash = "sha256:14839f54786987ccd9d03ed7f334baec0f02272e7ec4f6e9d427ff584aeea8b4"}, + {file = "websockets-14.1-cp39-cp39-win_amd64.whl", hash = "sha256:d9fd19ecc3a4d5ae82ddbfb30962cf6d874ff943e56e0c81f5169be2fda62979"}, + {file = "websockets-14.1-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:e5dc25a9dbd1a7f61eca4b7cb04e74ae4b963d658f9e4f9aad9cd00b688692c8"}, + {file = "websockets-14.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:04a97aca96ca2acedf0d1f332c861c5a4486fdcba7bcef35873820f940c4231e"}, + {file = "websockets-14.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df174ece723b228d3e8734a6f2a6febbd413ddec39b3dc592f5a4aa0aff28098"}, + {file = "websockets-14.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:034feb9f4286476f273b9a245fb15f02c34d9586a5bc936aff108c3ba1b21beb"}, + {file = "websockets-14.1-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:660c308dabd2b380807ab64b62985eaccf923a78ebc572bd485375b9ca2b7dc7"}, + {file = "websockets-14.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:5a42d3ecbb2db5080fc578314439b1d79eef71d323dc661aa616fb492436af5d"}, + {file = "websockets-14.1-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:ddaa4a390af911da6f680be8be4ff5aaf31c4c834c1a9147bc21cbcbca2d4370"}, + {file = "websockets-14.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:a4c805c6034206143fbabd2d259ec5e757f8b29d0a2f0bf3d2fe5d1f60147a4a"}, + {file = "websockets-14.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:205f672a6c2c671a86d33f6d47c9b35781a998728d2c7c2a3e1cf3333fcb62b7"}, + {file = "websockets-14.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef440054124728cc49b01c33469de06755e5a7a4e83ef61934ad95fc327fbb0"}, + {file = "websockets-14.1-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7591d6f440af7f73c4bd9404f3772bfee064e639d2b6cc8c94076e71b2471c1"}, + {file = "websockets-14.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:25225cc79cfebc95ba1d24cd3ab86aaa35bcd315d12fa4358939bd55e9bd74a5"}, + {file = "websockets-14.1-py3-none-any.whl", hash = "sha256:4d4fc827a20abe6d544a119896f6b78ee13fe81cbfef416f3f2ddf09a03f0e2e"}, + {file = "websockets-14.1.tar.gz", hash = "sha256:398b10c77d471c0aab20a845e7a60076b6390bfdaac7a6d2edb0d2c59d75e8d8"}, ] [[package]] @@ -5093,13 +5079,13 @@ propcache = ">=0.2.0" [[package]] name = "zipp" -version = "3.20.2" +version = "3.21.0" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "zipp-3.20.2-py3-none-any.whl", hash = "sha256:a817ac80d6cf4b23bf7f2828b7cabf326f15a001bea8b1f9b49631780ba28350"}, - {file = "zipp-3.20.2.tar.gz", hash = "sha256:bc9eb26f4506fda01b81bcde0ca78103b6e62f991b381fec825435c836edbc29"}, + {file = "zipp-3.21.0-py3-none-any.whl", hash = "sha256:ac1bbe05fd2991f160ebce24ffbac5f6d11d83dc90891255885223d42b3cd931"}, + {file = "zipp-3.21.0.tar.gz", hash = "sha256:2c9958f6430a2040341a52eb608ed6dd93ef4392e02ffe219417c1b28b5dd1f4"}, ] [package.extras] @@ -5113,4 +5099,4 @@ type = ["pytest-mypy"] [metadata] lock-version = "2.0" python-versions = ">=3.10,<4.0" -content-hash = "e79cf016126b346a5c982216d64408333a26914df79755ac59453deede7b2438" +content-hash = "3ad12f0341463e8a6e776a8cb40728587ea309d2a1166c5a20bfbb987a6d761e" From 38766a9bea4ae7fed34c6348c8d1c9791048858d Mon Sep 17 00:00:00 2001 From: vizsatiz Date: Fri, 15 Nov 2024 17:35:31 +0530 Subject: [PATCH 7/8] Removing line --- examples/llm_extensibility.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/examples/llm_extensibility.py b/examples/llm_extensibility.py index 431a1f7f..2de0f2f5 100644 --- a/examples/llm_extensibility.py +++ b/examples/llm_extensibility.py @@ -92,5 +92,3 @@ def agent_callback(response: FloCallbackResponse): if '__end__' not in s: print(s) print('----') - -flo.draw_to_file From 06ea9cf6005db0f9343f51887e1e025ea721c857 Mon Sep 17 00:00:00 2001 From: vizsatiz Date: Fri, 15 Nov 2024 20:14:40 +0530 Subject: [PATCH 8/8] Fix for properly registering the agent models --- flo_ai/core.py | 8 ++++++-- flo_ai/factory/agent_factory.py | 15 ++++++++++++--- flo_ai/models/flo_agent.py | 6 +++--- flo_ai/models/flo_delegation_agent.py | 11 +++++++++-- flo_ai/models/flo_llm_agent.py | 9 +++++++-- flo_ai/models/flo_reflection_agent.py | 9 +++++++-- flo_ai/models/flo_tool_agent.py | 14 +++++++++++--- 7 files changed, 55 insertions(+), 17 deletions(-) diff --git a/flo_ai/core.py b/flo_ai/core.py index d583230e..19b2e621 100644 --- a/flo_ai/core.py +++ b/flo_ai/core.py @@ -16,6 +16,7 @@ set_logger_internal, FloLogConfig, ) +from langchain.tools import StructuredTool class Flo: @@ -90,11 +91,14 @@ def draw_to_file(self, filename: str, xray=True): def validate_invoke(self, session: FloSession): async_coroutines = filter( lambda x: ( - hasattr(x, 'coroutine') and asyncio.iscoroutinefunction(x.coroutine) + isinstance(x, StructuredTool) + and hasattr(x, 'coroutine') + and asyncio.iscoroutinefunction(x.coroutine) ), session.tools.values(), ) - if len(list(async_coroutines)) > 0: + async_tools = list(async_coroutines) + if len(async_tools) > 0: raise FloException( f"""You seem to have atleast one async tool registered in this session. Please use flo.async_invoke or flo.async_stream. Checkout {DOCUMENTATION_WEBSITE}""" ) diff --git a/flo_ai/factory/agent_factory.py b/flo_ai/factory/agent_factory.py index 0e400bf2..1b2ef557 100644 --- a/flo_ai/factory/agent_factory.py +++ b/flo_ai/factory/agent_factory.py @@ -60,21 +60,30 @@ def __create_agentic_agent( agent_model = AgentFactory.__resolve_model(session, agent.model) tools = [tool_map[tool.name] for tool in agent.tools] flo_agent: FloAgent = FloAgent.Builder( - session, agent, tools, llm=agent_model, on_error=session.on_agent_error + session, + agent, + tools, + llm=agent_model, + on_error=session.on_agent_error, + model_name=agent.model, ).build() return flo_agent @staticmethod def __create_llm_agent(session: FloSession, agent: AgentConfig) -> FloLLMAgent: agent_model = AgentFactory.__resolve_model(session, agent.model) - builder = FloLLMAgent.Builder(session, agent, llm=agent_model) + builder = FloLLMAgent.Builder( + session, agent, llm=agent_model, model_name=agent.model + ) llm_agent: FloLLMAgent = builder.build() return llm_agent @staticmethod def __create_runnable_agent(session: FloSession, agent: AgentConfig) -> FloLLMAgent: runnable = session.tools[agent.tools[0].name] - return FloToolAgent.Builder(session, agent, runnable).build() + return FloToolAgent.Builder( + session, agent, runnable, model_name=agent.model + ).build() @staticmethod def __create_reflection_agent( diff --git a/flo_ai/models/flo_agent.py b/flo_ai/models/flo_agent.py index d3d3d409..12d59ef1 100644 --- a/flo_ai/models/flo_agent.py +++ b/flo_ai/models/flo_agent.py @@ -35,11 +35,11 @@ def __init__( role: Optional[str] = None, llm: Union[BaseLanguageModel, None] = None, on_error: Union[str, Callable] = True, - model_nick_name: Union[str, None] = 'default', + model_name: Union[str, None] = 'default', ) -> None: prompt: Union[ChatPromptTemplate, str] = config.job self.name: str = config.name - self.model_nick_name = model_nick_name + self.model_name = model_name self.llm = llm if llm is not None else session.llm self.config = config system_prompts = ( @@ -68,5 +68,5 @@ def build(self) -> AgentExecutor: handle_parsing_errors=self.on_error, ) return FloAgent( - agent, executor, self.config, model_nick_name=self.model_nick_name + agent, executor, self.config, model_nick_name=self.model_name ) diff --git a/flo_ai/models/flo_delegation_agent.py b/flo_ai/models/flo_delegation_agent.py index a04cb571..7c39544e 100644 --- a/flo_ai/models/flo_delegation_agent.py +++ b/flo_ai/models/flo_delegation_agent.py @@ -10,10 +10,13 @@ class FloDelegatorAgent(ExecutableFlo): - def __init__(self, executor: Runnable, config: AgentConfig) -> None: + def __init__( + self, executor: Runnable, config: AgentConfig, model_name: str + ) -> None: super().__init__(config.name, executor, ExecutableType.delegator) self.executor: Runnable = executor self.config: AgentConfig = config + self.model_name = model_name class Builder: def __init__( @@ -21,6 +24,7 @@ def __init__( session: FloSession, agentConfig: AgentConfig, llm: Optional[BaseLanguageModel] = None, + model_name: str = None, ) -> None: self.config = agentConfig delegator_base_system_message = ( @@ -28,6 +32,7 @@ def __init__( ' following {member_type}: {members}. Given the following rules,' ' respond with the worker to act next ' ) + self.model_name = model_name self.llm = session.llm if llm is None else llm self.options = [x.name for x in agentConfig.to] self.llm_router_prompt = ChatPromptTemplate.from_messages( @@ -75,4 +80,6 @@ def build(self): | JsonOutputFunctionsParser() ) - return FloDelegatorAgent(executor=chain, config=self.config) + return FloDelegatorAgent( + executor=chain, config=self.config, model_name=self.model_name + ) diff --git a/flo_ai/models/flo_llm_agent.py b/flo_ai/models/flo_llm_agent.py index fce815b6..fa6c83a7 100644 --- a/flo_ai/models/flo_llm_agent.py +++ b/flo_ai/models/flo_llm_agent.py @@ -10,10 +10,13 @@ class FloLLMAgent(ExecutableFlo): - def __init__(self, executor: Runnable, config: AgentConfig) -> None: + def __init__( + self, executor: Runnable, config: AgentConfig, model_name: str + ) -> None: super().__init__(config.name, executor, ExecutableType.llm) self.executor: Runnable = executor self.config: AgentConfig = config + self.model_name: str = model_name class Builder: def __init__( @@ -21,7 +24,9 @@ def __init__( session: FloSession, config: AgentConfig, llm: Union[BaseLanguageModel, None] = None, + model_name: str = None, ) -> None: + self.model_name = model_name prompt: Union[ChatPromptTemplate, str] = config.job self.name: str = config.name @@ -42,4 +47,4 @@ def __init__( def build(self) -> Runnable: executor = self.prompt | self.llm | StrOutputParser() - return FloLLMAgent(executor, self.config) + return FloLLMAgent(executor, self.config, self.model_name) diff --git a/flo_ai/models/flo_reflection_agent.py b/flo_ai/models/flo_reflection_agent.py index 72903c04..94e85162 100644 --- a/flo_ai/models/flo_reflection_agent.py +++ b/flo_ai/models/flo_reflection_agent.py @@ -10,9 +10,12 @@ class FloReflectionAgent(ExecutableFlo): - def __init__(self, executor: Runnable, config: AgentConfig) -> None: + def __init__( + self, executor: Runnable, config: AgentConfig, model_name: str + ) -> None: super().__init__(config.name, executor, ExecutableType.reflection) self.config = config + self.model_name = model_name class Builder: def __init__( @@ -20,11 +23,13 @@ def __init__( session: FloSession, config: AgentConfig, llm: Union[BaseLanguageModel, None] = None, + model_name: str = None, ) -> None: prompt_message: Union[ChatPromptTemplate, str] = config.job self.name: str = config.name self.llm = llm if llm is not None else session.llm self.config = config + self.model_name = model_name system_prompts = ( [ @@ -43,4 +48,4 @@ def __init__( def build(self): executor = self.prompt | self.llm | StrOutputParser() - return FloReflectionAgent(executor, self.config) + return FloReflectionAgent(executor, self.config, self.model_name) diff --git a/flo_ai/models/flo_tool_agent.py b/flo_ai/models/flo_tool_agent.py index 37869650..18dc973b 100644 --- a/flo_ai/models/flo_tool_agent.py +++ b/flo_ai/models/flo_tool_agent.py @@ -6,18 +6,26 @@ class FloToolAgent(ExecutableFlo): - def __init__(self, executor: Runnable, config: AgentConfig) -> None: + def __init__( + self, executor: Runnable, config: AgentConfig, model_name: str + ) -> None: super().__init__(config.name, executor, ExecutableType.tool) self.executor: Runnable = executor self.config: AgentConfig = config + self.model_name: str = model_name class Builder: def __init__( - self, session: FloSession, config: AgentConfig, tool_runnable: Runnable + self, + session: FloSession, + config: AgentConfig, + tool_runnable: Runnable, + model_name: str, ) -> None: self.name: str = config.name self.runnable = tool_runnable self.config = config + self.model_name = model_name def build(self) -> Runnable: - return FloToolAgent(self.runnable, self.config) + return FloToolAgent(self.runnable, self.configs, self, self.model_name)