From 1f6dc48644eede5235eccfebeb30e65f7941ec6f Mon Sep 17 00:00:00 2001 From: Tyler Rockwood Date: Wed, 2 Apr 2025 20:50:04 +0000 Subject: [PATCH] introduce redpanda.runtime --- Taskfile.yaml | 14 + .../mcp/resources/caches/directory.yaml | 8 - .../mcp/resources/processors/dev_tools.star | 78 ------ examples/connect_integration/pipeline_dev.py | 75 ------ examples/weather_agent_repl/agents/weather.py | 46 ++++ .../processors}/check_weather_tool.yaml | 0 .../weather_agent_repl/redpanda_agents.yaml | 8 + proto/redpanda/runtime/proto/runtime.proto | 74 +++++ pyproject.toml | 24 +- src/agents/__init__.py | 14 - src/redpanda/agents/__init__.py | 35 +++ .../agent.py => redpanda/agents/_agent.py} | 18 +- .../mcp.py => redpanda/agents/_mcp.py} | 16 +- .../tools.py => redpanda/agents/_tools.py} | 14 + src/{ => redpanda}/agents/py.typed | 0 src/redpanda/runtime/__init__.py | 29 ++ src/redpanda/runtime/_grpc.py | 130 +++++++++ src/redpanda/runtime/proto/runtime_pb2.py | 55 ++++ src/redpanda/runtime/proto/runtime_pb2.pyi | 219 +++++++++++++++ .../runtime/proto/runtime_pb2_grpc.py | 100 +++++++ .../runtime/proto/runtime_pb2_grpc.pyi | 60 +++++ src/redpanda/runtime/py.typed | 0 tests/test_agents.py | 2 +- uv.lock | 253 +++++++++++++----- 24 files changed, 1022 insertions(+), 250 deletions(-) delete mode 100644 examples/connect_integration/mcp/resources/caches/directory.yaml delete mode 100644 examples/connect_integration/mcp/resources/processors/dev_tools.star delete mode 100644 examples/connect_integration/pipeline_dev.py create mode 100644 examples/weather_agent_repl/agents/weather.py rename examples/{connect_integration/mcp/resources/yaml => weather_agent_repl/mcp/resources/processors}/check_weather_tool.yaml (100%) create mode 100644 examples/weather_agent_repl/redpanda_agents.yaml create mode 100644 proto/redpanda/runtime/proto/runtime.proto delete mode 100644 src/agents/__init__.py create mode 100644 src/redpanda/agents/__init__.py rename src/{agents/agent.py => redpanda/agents/_agent.py} (93%) rename src/{agents/mcp.py => redpanda/agents/_mcp.py} (89%) rename src/{agents/tools.py => redpanda/agents/_tools.py} (77%) rename src/{ => redpanda}/agents/py.typed (100%) create mode 100644 src/redpanda/runtime/__init__.py create mode 100644 src/redpanda/runtime/_grpc.py create mode 100644 src/redpanda/runtime/proto/runtime_pb2.py create mode 100644 src/redpanda/runtime/proto/runtime_pb2.pyi create mode 100644 src/redpanda/runtime/proto/runtime_pb2_grpc.py create mode 100644 src/redpanda/runtime/proto/runtime_pb2_grpc.pyi create mode 100644 src/redpanda/runtime/py.typed diff --git a/Taskfile.yaml b/Taskfile.yaml index a3a3830..fd3366f 100644 --- a/Taskfile.yaml +++ b/Taskfile.yaml @@ -68,3 +68,17 @@ tasks: desc: "Deploy documentation to GitHub Pages with mkdocs" cmds: - uv run mkdocs gh-deploy --force --verbose + + protogen: + desc: "Generate protobuf" + vars: + OUT_DIR: src + cmds: + - > + uv run -m grpc_tools.protoc \ + --python_out={{.OUT_DIR}} \ + --mypy_out={{.OUT_DIR}} \ + --grpc_python_out={{.OUT_DIR}} \ + --mypy_grpc_out={{.OUT_DIR}} \ + -I proto + proto/redpanda/runtime/proto/runtime.proto diff --git a/examples/connect_integration/mcp/resources/caches/directory.yaml b/examples/connect_integration/mcp/resources/caches/directory.yaml deleted file mode 100644 index cefa84e..0000000 --- a/examples/connect_integration/mcp/resources/caches/directory.yaml +++ /dev/null @@ -1,8 +0,0 @@ -label: project_directory_file_contents -file: - directory: "${PROJECT_DIR}" - -meta: - mcp: - enabled: true - description: "the project directory where the user stores files" diff --git a/examples/connect_integration/mcp/resources/processors/dev_tools.star b/examples/connect_integration/mcp/resources/processors/dev_tools.star deleted file mode 100644 index 8f30a18..0000000 --- a/examples/connect_integration/mcp/resources/processors/dev_tools.star +++ /dev/null @@ -1,78 +0,0 @@ -validate_file_path = mapping(""" - let file = content().string() - root.file = if $file.contains("..") { - throw("invalid file path") - } else { - $file - } -""") - -mcp_tool( - label = "list_files", - description = "List files in a directory. Use `.` for the current directory.", - processor = processors( - attempt( - validate_file_path, - command( - name="ls", - args_mapping='[["{}", this.file].filepath_join()]'.format(secret("PROJECT_DIR")), - ), - mapping(""" - root.files = content().split("\\n") - if root.files == [""] { - root = "no files found" - } - """) - ), - catch( - mapping( - """root = ["Directory does not exist"]""", - ) - ), - ) -) - -mcp_tool( - label = "lint_connect_configuration_file", - description = "Lint a Connect configuration file, the `value` should be a path to a configuration file.", - processor = processors( - attempt( - validate_file_path, - command( - name="rpk", - args_mapping="""[ - "connect", - "lint", - ["{}", this.file].filepath_join(), - ]""".format(secret("PROJECT_DIR")), - ), - mapping('root = "lint success"'), - ), - catch( - mapping("root.error = error()"), - ) - ) -) - -mcp_tool( - label = "ask_docs_agent", - description = " ".join([ - "Ask the documentation agent for help.", - "This agent has access to the full documentation for Redpanda.", - "The `value` should be the question and mention that's it's for Redpanda Connect specifically.", - ]), - processor = attempt( - mapping("""root.query = content().string()"""), - http( - verb = "POST", - url = "https://api.kapa.ai/query/v1/projects/{project_id}/chat/".format( - project_id=secret("KAPA_PROJECT_ID"), - ), - headers = { - "Content-Type": "application/json", - "X-API-KEY": secret("KAPA_API_KEY"), - }, - timeout = "60s", - ) - ) -) diff --git a/examples/connect_integration/pipeline_dev.py b/examples/connect_integration/pipeline_dev.py deleted file mode 100644 index e317047..0000000 --- a/examples/connect_integration/pipeline_dev.py +++ /dev/null @@ -1,75 +0,0 @@ -import asyncio -from pathlib import Path -from typing import Any, override - -from agents import Agent, RPKMCPEndpoint -from agents.agent import AgentHooks -from agents.tools import Tool - - -class MyHooks(AgentHooks): - @override - async def on_start(self, agent: Agent) -> None: - print("Agent started") - - @override - async def on_end(self, agent: Agent, output: Any) -> None: - print("Agent ended") - - @override - async def on_tool_start( - self, - agent: Agent, - tool: Tool, - args: str, - ) -> None: - print(f"Agent calling tool {tool.name} with args: {args}") - - @override - async def on_tool_end( - self, - agent: Agent, - tool: Tool, - result: str, - ) -> None: - print(f"Agent tool {tool.name} resulted in: {result}") - - -my_agent = Agent( - name="ConnectPipelineDevAgent", - model="openai/gpt-4o", - instructions=""" - You are a development agent that helps an engineer create Redpanda Connect pipelines. - Redpanda Connect is a stream processing tool that allows you to move data between different systems. - Redpanda Connect pipelines are defined in a single YAML file usually called `connect.yaml`. - You have access to the developer's project with filesystem access as well as a file to lint pipelines, - which is usually a good idea to use after modifying the `connect.yaml` file. - Additionally, you have access to another agent that has full access to the Redpanda documentation that - can lookup functionality or how the project works in more depth. However, that agent is not specific - for Redpanda Connect so make sure you provide it with context when asking it questions. Please feel free - to ask multiple questions. - - Always write the output to the directory. - - NOTE: You really need to ask the documentation agent for help. Also there is no opportunity to ask the user - for comfirmation. - """.strip().replace("\n", ""), - mcp=[ - RPKMCPEndpoint(directory=Path("mcp")), - ], - hooks=MyHooks(), -) - - -async def main() -> None: - while True: - try: - prompt = input("> ") - except EOFError: - return - response = await my_agent.run(input=prompt) - print(response) - - -if __name__ == "__main__": - asyncio.run(main()) diff --git a/examples/weather_agent_repl/agents/weather.py b/examples/weather_agent_repl/agents/weather.py new file mode 100644 index 0000000..cc2cac1 --- /dev/null +++ b/examples/weather_agent_repl/agents/weather.py @@ -0,0 +1,46 @@ +import asyncio +import logging +from typing import Any, override + +import redpanda.runtime +from redpanda.agents import Agent, AgentHooks, Tool + + +class MyHooks(AgentHooks): + @override + async def on_start(self, agent: Agent) -> None: + logging.debug("Agent started") + + @override + async def on_end(self, agent: Agent, output: Any) -> None: + logging.debug("Agent ended") + + @override + async def on_tool_start( + self, + agent: Agent, + tool: Tool, + args: str, + ) -> None: + logging.debug(f"Agent calling tool {tool.name} with args: {args}") + + @override + async def on_tool_end( + self, + agent: Agent, + tool: Tool, + result: str, + ) -> None: + logging.debug(f"Agent tool {tool.name} resulted in: {result}") + + +my_agent = Agent( + name="WeatherAgent", + model="openai/gpt-4o", + instructions=""" + You are a helpful AI agent for finding out about the weather. + """.strip(), + hooks=MyHooks(), +) + +asyncio.run(redpanda.runtime.serve(my_agent)) diff --git a/examples/connect_integration/mcp/resources/yaml/check_weather_tool.yaml b/examples/weather_agent_repl/mcp/resources/processors/check_weather_tool.yaml similarity index 100% rename from examples/connect_integration/mcp/resources/yaml/check_weather_tool.yaml rename to examples/weather_agent_repl/mcp/resources/processors/check_weather_tool.yaml diff --git a/examples/weather_agent_repl/redpanda_agents.yaml b/examples/weather_agent_repl/redpanda_agents.yaml new file mode 100644 index 0000000..e41524a --- /dev/null +++ b/examples/weather_agent_repl/redpanda_agents.yaml @@ -0,0 +1,8 @@ +agents: + weather: + input: + stdin: {} + tools: + - check_weather + output: + stdout: {} diff --git a/proto/redpanda/runtime/proto/runtime.proto b/proto/redpanda/runtime/proto/runtime.proto new file mode 100644 index 0000000..845efa5 --- /dev/null +++ b/proto/redpanda/runtime/proto/runtime.proto @@ -0,0 +1,74 @@ +// Copyright 2025 Redpanda Data, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +syntax = "proto3"; + +package redpanda.runtime.v1alpha1; + +import "google/protobuf/timestamp.proto"; + +// `NullValue` is a representation of a null value. +enum NullValue { NULL_VALUE = 0; } + +// `StructValue` represents a struct value which can be used to represent a +// structured data value. +message StructValue { + map fields = 1; +} + +// `ListValue` represents a list value which can be used to represent a list of +// values. +message ListValue { + repeated Value values = 1; +} + +// `Value` represents a dynamically typed value which can be used to represent +// a value passed to an agent. +message Value { + oneof kind { + NullValue null_value = 1; + string string_value = 2; + int64 integer_value = 3; + double double_value = 4; + bool bool_value = 5; + google.protobuf.Timestamp timestamp_value = 6; + bytes bytes_value = 7; + StructValue struct_value = 8; + ListValue list_value = 9; + } +} + +// Message represents a piece of structured data that flows through the runtime. +message Message { + oneof payload { + bytes serialized = 1; + Value structured = 2; + } + StructValue metadata = 3; +} + +// InvokeAgentRequest is the request message for the `InvokeAgent` method. +message InvokeAgentRequest { + Message message = 1; +} + +// InvokeAgentResponse is the response message for the `InvokeAgent` method. +message InvokeAgentResponse { + Message message = 1; +} + +// `Runtime` is the service that provides the ability to invoke an agent. +service Runtime { + rpc InvokeAgent(InvokeAgentRequest) returns (InvokeAgentResponse); +} diff --git a/pyproject.toml b/pyproject.toml index d2072bd..85b513a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,5 +1,5 @@ [project] -name = "redpanda-agent" +name = "redpanda-agents" version = "0.1.0" description = "the best way to vibe code enterprise agents" readme = "README.md" @@ -8,10 +8,13 @@ authors = [ ] requires-python = ">=3.13" dependencies = [ + "aiohttp>=3.11.16", + "grpcio>=1.71.0", + "grpcio-health-checking>=1.71.0", "litellm>=1.63.14", "mcp>=1.5.0", + "protobuf>=5.29.4", "pydantic>=2.10.6", - "pyright>=1.1.397", "websockets>=15.0.1", ] license = "Apache-2.0" @@ -27,17 +30,19 @@ dev = [ "mkdocs", "mkdocs-material", "mkdocstrings[python]", + "grpcio-tools>=1.71.0", + "mypy-protobuf>=3.6.0", ] [tool.uv.workspace] -members = ["agents"] +members = ["redpanda"] [tool.uv.sources] -agents = { workspace = true } - +redpanda = { workspace = true } [tool.ruff] line-length = 100 target-version = "py39" +exclude = ["proto"] [tool.ruff.lint] select = [ @@ -49,7 +54,7 @@ select = [ "C4", # flake8-comprehensions "UP", # pyupgrade ] -isort = { combine-as-imports = true, known-first-party = ["agents"] } +isort = { combine-as-imports = true, known-first-party = ["redpanda"] } [tool.ruff.lint.pydocstyle] convention = "google" @@ -59,12 +64,17 @@ requires = ["hatchling"] build-backend = "hatchling.build" [tool.hatch.build.targets.wheel] -packages = ["src/agents"] +packages = ["src/redpanda"] [tool.ruff.lint.per-file-ignores] "examples/**/*.py" = ["E501"] [tool.pyright] +exclude = [ + "src/redpanda/runtime/proto/**", + "**/__pycache__", + "**/.*", +] reportUnusedCallResult = false reportExplicitAny = false reportAny = false diff --git a/src/agents/__init__.py b/src/agents/__init__.py deleted file mode 100644 index 1be98ca..0000000 --- a/src/agents/__init__.py +++ /dev/null @@ -1,14 +0,0 @@ -from .agent import Agent, AgentHooks -from .mcp import MCPEndpoint, RPKMCPEndpoint, SSEMCPEndpoint, StdioMCPEndpoint, WebsocketMCPEndpoint -from .tools import Tool - -__all__ = [ - "Agent", - "AgentHooks", - "Tool", - "MCPEndpoint", - "StdioMCPEndpoint", - "SSEMCPEndpoint", - "WebsocketMCPEndpoint", - "RPKMCPEndpoint", -] diff --git a/src/redpanda/agents/__init__.py b/src/redpanda/agents/__init__.py new file mode 100644 index 0000000..6141553 --- /dev/null +++ b/src/redpanda/agents/__init__.py @@ -0,0 +1,35 @@ +# Copyright 2025 Redpanda Data, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +from ._agent import Agent, AgentHooks +from ._mcp import ( + MCPEndpoint, + RPKMCPEndpoint, + SSEMCPEndpoint, + StdioMCPEndpoint, + WebsocketMCPEndpoint, +) +from ._tools import Tool + +__all__ = [ + "Agent", + "AgentHooks", + "Tool", + "MCPEndpoint", + "StdioMCPEndpoint", + "SSEMCPEndpoint", + "WebsocketMCPEndpoint", + "RPKMCPEndpoint", +] diff --git a/src/agents/agent.py b/src/redpanda/agents/_agent.py similarity index 93% rename from src/agents/agent.py rename to src/redpanda/agents/_agent.py index 2760fba..93e2ae9 100644 --- a/src/agents/agent.py +++ b/src/redpanda/agents/_agent.py @@ -1,3 +1,17 @@ +# Copyright 2025 Redpanda Data, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + import json from contextlib import AsyncExitStack from typing import Any, override @@ -13,8 +27,8 @@ ) from pydantic import BaseModel -from .mcp import MCPClient, MCPEndpoint, mcp_client -from .tools import Tool, ToolResponse +from ._mcp import MCPClient, MCPEndpoint, mcp_client +from ._tools import Tool, ToolResponse class AgentHooks: diff --git a/src/agents/mcp.py b/src/redpanda/agents/_mcp.py similarity index 89% rename from src/agents/mcp.py rename to src/redpanda/agents/_mcp.py index 557077d..5c330d9 100644 --- a/src/agents/mcp.py +++ b/src/redpanda/agents/_mcp.py @@ -1,3 +1,17 @@ +# Copyright 2025 Redpanda Data, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + import os from contextlib import asynccontextmanager from pathlib import Path @@ -9,7 +23,7 @@ from mcp.client.websocket import websocket_client from mcp.shared.exceptions import McpError -from .tools import Tool, ToolResponse, ToolResponseImageContent, ToolResponseTextContent +from ._tools import Tool, ToolResponse, ToolResponseImageContent, ToolResponseTextContent class MCPEndpoint: diff --git a/src/agents/tools.py b/src/redpanda/agents/_tools.py similarity index 77% rename from src/agents/tools.py rename to src/redpanda/agents/_tools.py index feb57df..ab4ca62 100644 --- a/src/agents/tools.py +++ b/src/redpanda/agents/_tools.py @@ -1,3 +1,17 @@ +# Copyright 2025 Redpanda Data, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + from typing import Any, Literal from pydantic import BaseModel diff --git a/src/agents/py.typed b/src/redpanda/agents/py.typed similarity index 100% rename from src/agents/py.typed rename to src/redpanda/agents/py.typed diff --git a/src/redpanda/runtime/__init__.py b/src/redpanda/runtime/__init__.py new file mode 100644 index 0000000..2761fe4 --- /dev/null +++ b/src/redpanda/runtime/__init__.py @@ -0,0 +1,29 @@ +# Copyright 2025 Redpanda Data, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import os + +from redpanda.agents import Agent, SSEMCPEndpoint +from redpanda.runtime._grpc import RuntimeServer, serve_main + + +async def serve(agent: Agent) -> None: + addr = os.getenv("REDPANDA_CONNECT_AGENT_RUNTIME_MCP_SERVER") + if addr: + agent.mcp.append(SSEMCPEndpoint(addr)) + server = RuntimeServer(agent) + await serve_main(server) + + +__all__ = ["serve"] diff --git a/src/redpanda/runtime/_grpc.py b/src/redpanda/runtime/_grpc.py new file mode 100644 index 0000000..f0e7b4b --- /dev/null +++ b/src/redpanda/runtime/_grpc.py @@ -0,0 +1,130 @@ +# Copyright 2025 Redpanda Data, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import asyncio +import base64 +import json +import signal +from typing import override + +import grpc # pyright: ignore[reportMissingTypeStubs] +import grpc.aio # pyright: ignore[reportMissingTypeStubs] +from grpc_health.v1 import health_pb2, health_pb2_grpc # pyright: ignore[reportMissingTypeStubs] +from grpc_health.v1.health import HealthServicer # pyright: ignore[reportMissingTypeStubs] +from pydantic import BaseModel + +from redpanda.agents import Agent +from redpanda.runtime.proto import runtime_pb2 as pb, runtime_pb2_grpc as grpcpb + + +def _serialize_payload(payload: pb.Value) -> str: + kind = payload.WhichOneof("kind") + if kind == "bool_value": + return "true" if payload.bool_value else "false" + elif kind == "bytes_value": + return base64.standard_b64encode(payload.bytes_value).decode("hex") + elif kind == "double_value": + return str(payload.double_value) + elif kind == "integer_value": + return str(payload.integer_value) + elif kind == "list_value": + return ( + "[" + ",".join([_serialize_payload(item) for item in payload.list_value.values]) + "]" + ) + elif kind == "null_value": + return "null" + elif kind == "string_value": + return json.dumps(payload.string_value) + elif kind == "struct_value": + return ( + "{" + + ",".join( + [ + json.dumps(k) + ":" + _serialize_payload(v) + for k, v in payload.struct_value.fields.items() + ] + ) + + "}" + ) + elif kind == "timestamp_value": + return json.dumps(payload.timestamp_value.ToJsonString()) + else: + raise ValueError(f"Unknown payload kind: {kind}") + + +class RuntimeServer(grpcpb.RuntimeServicer): + agent: Agent + + def __init__(self, agent: Agent): + self.agent = agent + + @override + async def InvokeAgent( + self, + request: pb.InvokeAgentRequest, + context: grpc.aio.ServicerContext[pb.InvokeAgentResponse, pb.InvokeAgentResponse], + ) -> pb.InvokeAgentResponse: + try: + payload: str + if request.message.WhichOneof("payload") == "structured": + payload = _serialize_payload(request.message.structured) + else: + payload = request.message.serialized.decode("utf-8") + output = await self.agent.run(input=payload) + if isinstance(output, BaseModel): + output = output.model_dump_json() + elif not isinstance(output, str): + output = json.dumps(output) + return pb.InvokeAgentResponse( + message=pb.Message( + serialized=output.encode("utf-8"), + metadata=request.message.metadata, + ), + ) + except Exception as e: + context.set_code(grpc.StatusCode.INTERNAL) + context.set_details(str(e)) + raise + + +async def serve_main(runtime_server: RuntimeServer): + health = HealthServicer() + health.set( # pyright: ignore[reportUnknownMemberType] + "plugin", + health_pb2.HealthCheckResponse.ServingStatus.Value("SERVING"), + ) + server = grpc.aio.server() + grpcpb.add_RuntimeServicer_to_server( + runtime_server, + server, + ) + health_pb2_grpc.add_HealthServicer_to_server( # pyright: ignore[reportUnknownMemberType] + health, + server, + ) + port = server.add_insecure_port("127.0.0.1:0") + print(f"1|1|tcp|127.0.0.1:{port}|grpc", flush=True) + await server.start() + + async def stop(sig: int): + await server.stop(grace=None) + loop.remove_signal_handler(sig) + + try: + loop = asyncio.get_event_loop() + for sig in (signal.SIGINT, signal.SIGTERM): + loop.add_signal_handler(sig, lambda sig: asyncio.ensure_future(stop(sig)), sig) + await server.wait_for_termination() + finally: + await server.stop(grace=None) diff --git a/src/redpanda/runtime/proto/runtime_pb2.py b/src/redpanda/runtime/proto/runtime_pb2.py new file mode 100644 index 0000000..9c99444 --- /dev/null +++ b/src/redpanda/runtime/proto/runtime_pb2.py @@ -0,0 +1,55 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# NO CHECKED-IN PROTOBUF GENCODE +# source: redpanda/runtime/proto/runtime.proto +# Protobuf Python Version: 5.29.0 +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import runtime_version as _runtime_version +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import builder as _builder +_runtime_version.ValidateProtobufRuntimeVersion( + _runtime_version.Domain.PUBLIC, + 5, + 29, + 0, + '', + 'redpanda/runtime/proto/runtime.proto' +) +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n$redpanda/runtime/proto/runtime.proto\x12\x19redpanda.runtime.v1alpha1\x1a\x1fgoogle/protobuf/timestamp.proto\"\xa2\x01\n\x0bStructValue\x12\x42\n\x06\x66ields\x18\x01 \x03(\x0b\x32\x32.redpanda.runtime.v1alpha1.StructValue.FieldsEntry\x1aO\n\x0b\x46ieldsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12/\n\x05value\x18\x02 \x01(\x0b\x32 .redpanda.runtime.v1alpha1.Value:\x02\x38\x01\"=\n\tListValue\x12\x30\n\x06values\x18\x01 \x03(\x0b\x32 .redpanda.runtime.v1alpha1.Value\"\xf4\x02\n\x05Value\x12:\n\nnull_value\x18\x01 \x01(\x0e\x32$.redpanda.runtime.v1alpha1.NullValueH\x00\x12\x16\n\x0cstring_value\x18\x02 \x01(\tH\x00\x12\x17\n\rinteger_value\x18\x03 \x01(\x03H\x00\x12\x16\n\x0c\x64ouble_value\x18\x04 \x01(\x01H\x00\x12\x14\n\nbool_value\x18\x05 \x01(\x08H\x00\x12\x35\n\x0ftimestamp_value\x18\x06 \x01(\x0b\x32\x1a.google.protobuf.TimestampH\x00\x12\x15\n\x0b\x62ytes_value\x18\x07 \x01(\x0cH\x00\x12>\n\x0cstruct_value\x18\x08 \x01(\x0b\x32&.redpanda.runtime.v1alpha1.StructValueH\x00\x12:\n\nlist_value\x18\t \x01(\x0b\x32$.redpanda.runtime.v1alpha1.ListValueH\x00\x42\x06\n\x04kind\"\x9c\x01\n\x07Message\x12\x14\n\nserialized\x18\x01 \x01(\x0cH\x00\x12\x36\n\nstructured\x18\x02 \x01(\x0b\x32 .redpanda.runtime.v1alpha1.ValueH\x00\x12\x38\n\x08metadata\x18\x03 \x01(\x0b\x32&.redpanda.runtime.v1alpha1.StructValueB\t\n\x07payload\"I\n\x12InvokeAgentRequest\x12\x33\n\x07message\x18\x01 \x01(\x0b\x32\".redpanda.runtime.v1alpha1.Message\"J\n\x13InvokeAgentResponse\x12\x33\n\x07message\x18\x01 \x01(\x0b\x32\".redpanda.runtime.v1alpha1.Message*\x1b\n\tNullValue\x12\x0e\n\nNULL_VALUE\x10\x00\x32w\n\x07Runtime\x12l\n\x0bInvokeAgent\x12-.redpanda.runtime.v1alpha1.InvokeAgentRequest\x1a..redpanda.runtime.v1alpha1.InvokeAgentResponseb\x06proto3') + +_globals = globals() +_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'redpanda.runtime.proto.runtime_pb2', _globals) +if not _descriptor._USE_C_DESCRIPTORS: + DESCRIPTOR._loaded_options = None + _globals['_STRUCTVALUE_FIELDSENTRY']._loaded_options = None + _globals['_STRUCTVALUE_FIELDSENTRY']._serialized_options = b'8\001' + _globals['_NULLVALUE']._serialized_start=1013 + _globals['_NULLVALUE']._serialized_end=1040 + _globals['_STRUCTVALUE']._serialized_start=101 + _globals['_STRUCTVALUE']._serialized_end=263 + _globals['_STRUCTVALUE_FIELDSENTRY']._serialized_start=184 + _globals['_STRUCTVALUE_FIELDSENTRY']._serialized_end=263 + _globals['_LISTVALUE']._serialized_start=265 + _globals['_LISTVALUE']._serialized_end=326 + _globals['_VALUE']._serialized_start=329 + _globals['_VALUE']._serialized_end=701 + _globals['_MESSAGE']._serialized_start=704 + _globals['_MESSAGE']._serialized_end=860 + _globals['_INVOKEAGENTREQUEST']._serialized_start=862 + _globals['_INVOKEAGENTREQUEST']._serialized_end=935 + _globals['_INVOKEAGENTRESPONSE']._serialized_start=937 + _globals['_INVOKEAGENTRESPONSE']._serialized_end=1011 + _globals['_RUNTIME']._serialized_start=1042 + _globals['_RUNTIME']._serialized_end=1161 +# @@protoc_insertion_point(module_scope) diff --git a/src/redpanda/runtime/proto/runtime_pb2.pyi b/src/redpanda/runtime/proto/runtime_pb2.pyi new file mode 100644 index 0000000..5520389 --- /dev/null +++ b/src/redpanda/runtime/proto/runtime_pb2.pyi @@ -0,0 +1,219 @@ +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +Copyright 2025 Redpanda Data, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +""" + +import builtins +import collections.abc +import google.protobuf.descriptor +import google.protobuf.internal.containers +import google.protobuf.internal.enum_type_wrapper +import google.protobuf.message +import google.protobuf.timestamp_pb2 +import sys +import typing + +if sys.version_info >= (3, 10): + import typing as typing_extensions +else: + import typing_extensions + +DESCRIPTOR: google.protobuf.descriptor.FileDescriptor + +class _NullValue: + ValueType = typing.NewType("ValueType", builtins.int) + V: typing_extensions.TypeAlias = ValueType + +class _NullValueEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[_NullValue.ValueType], builtins.type): + DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor + NULL_VALUE: _NullValue.ValueType # 0 + +class NullValue(_NullValue, metaclass=_NullValueEnumTypeWrapper): + """`NullValue` is a representation of a null value.""" + +NULL_VALUE: NullValue.ValueType # 0 +global___NullValue = NullValue + +@typing.final +class StructValue(google.protobuf.message.Message): + """`StructValue` represents a struct value which can be used to represent a + structured data value. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + @typing.final + class FieldsEntry(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + KEY_FIELD_NUMBER: builtins.int + VALUE_FIELD_NUMBER: builtins.int + key: builtins.str + @property + def value(self) -> global___Value: ... + def __init__( + self, + *, + key: builtins.str = ..., + value: global___Value | None = ..., + ) -> None: ... + def HasField(self, field_name: typing.Literal["value", b"value"]) -> builtins.bool: ... + def ClearField(self, field_name: typing.Literal["key", b"key", "value", b"value"]) -> None: ... + + FIELDS_FIELD_NUMBER: builtins.int + @property + def fields(self) -> google.protobuf.internal.containers.MessageMap[builtins.str, global___Value]: ... + def __init__( + self, + *, + fields: collections.abc.Mapping[builtins.str, global___Value] | None = ..., + ) -> None: ... + def ClearField(self, field_name: typing.Literal["fields", b"fields"]) -> None: ... + +global___StructValue = StructValue + +@typing.final +class ListValue(google.protobuf.message.Message): + """`ListValue` represents a list value which can be used to represent a list of + values. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + VALUES_FIELD_NUMBER: builtins.int + @property + def values(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___Value]: ... + def __init__( + self, + *, + values: collections.abc.Iterable[global___Value] | None = ..., + ) -> None: ... + def ClearField(self, field_name: typing.Literal["values", b"values"]) -> None: ... + +global___ListValue = ListValue + +@typing.final +class Value(google.protobuf.message.Message): + """`Value` represents a dynamically typed value which can be used to represent + a value passed to an agent. + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NULL_VALUE_FIELD_NUMBER: builtins.int + STRING_VALUE_FIELD_NUMBER: builtins.int + INTEGER_VALUE_FIELD_NUMBER: builtins.int + DOUBLE_VALUE_FIELD_NUMBER: builtins.int + BOOL_VALUE_FIELD_NUMBER: builtins.int + TIMESTAMP_VALUE_FIELD_NUMBER: builtins.int + BYTES_VALUE_FIELD_NUMBER: builtins.int + STRUCT_VALUE_FIELD_NUMBER: builtins.int + LIST_VALUE_FIELD_NUMBER: builtins.int + null_value: global___NullValue.ValueType + string_value: builtins.str + integer_value: builtins.int + double_value: builtins.float + bool_value: builtins.bool + bytes_value: builtins.bytes + @property + def timestamp_value(self) -> google.protobuf.timestamp_pb2.Timestamp: ... + @property + def struct_value(self) -> global___StructValue: ... + @property + def list_value(self) -> global___ListValue: ... + def __init__( + self, + *, + null_value: global___NullValue.ValueType = ..., + string_value: builtins.str = ..., + integer_value: builtins.int = ..., + double_value: builtins.float = ..., + bool_value: builtins.bool = ..., + timestamp_value: google.protobuf.timestamp_pb2.Timestamp | None = ..., + bytes_value: builtins.bytes = ..., + struct_value: global___StructValue | None = ..., + list_value: global___ListValue | None = ..., + ) -> None: ... + def HasField(self, field_name: typing.Literal["bool_value", b"bool_value", "bytes_value", b"bytes_value", "double_value", b"double_value", "integer_value", b"integer_value", "kind", b"kind", "list_value", b"list_value", "null_value", b"null_value", "string_value", b"string_value", "struct_value", b"struct_value", "timestamp_value", b"timestamp_value"]) -> builtins.bool: ... + def ClearField(self, field_name: typing.Literal["bool_value", b"bool_value", "bytes_value", b"bytes_value", "double_value", b"double_value", "integer_value", b"integer_value", "kind", b"kind", "list_value", b"list_value", "null_value", b"null_value", "string_value", b"string_value", "struct_value", b"struct_value", "timestamp_value", b"timestamp_value"]) -> None: ... + def WhichOneof(self, oneof_group: typing.Literal["kind", b"kind"]) -> typing.Literal["null_value", "string_value", "integer_value", "double_value", "bool_value", "timestamp_value", "bytes_value", "struct_value", "list_value"] | None: ... + +global___Value = Value + +@typing.final +class Message(google.protobuf.message.Message): + """Message represents a piece of structured data that flows through the runtime.""" + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + SERIALIZED_FIELD_NUMBER: builtins.int + STRUCTURED_FIELD_NUMBER: builtins.int + METADATA_FIELD_NUMBER: builtins.int + serialized: builtins.bytes + @property + def structured(self) -> global___Value: ... + @property + def metadata(self) -> global___StructValue: ... + def __init__( + self, + *, + serialized: builtins.bytes = ..., + structured: global___Value | None = ..., + metadata: global___StructValue | None = ..., + ) -> None: ... + def HasField(self, field_name: typing.Literal["metadata", b"metadata", "payload", b"payload", "serialized", b"serialized", "structured", b"structured"]) -> builtins.bool: ... + def ClearField(self, field_name: typing.Literal["metadata", b"metadata", "payload", b"payload", "serialized", b"serialized", "structured", b"structured"]) -> None: ... + def WhichOneof(self, oneof_group: typing.Literal["payload", b"payload"]) -> typing.Literal["serialized", "structured"] | None: ... + +global___Message = Message + +@typing.final +class InvokeAgentRequest(google.protobuf.message.Message): + """InvokeAgentRequest is the request message for the `InvokeAgent` method.""" + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + MESSAGE_FIELD_NUMBER: builtins.int + @property + def message(self) -> global___Message: ... + def __init__( + self, + *, + message: global___Message | None = ..., + ) -> None: ... + def HasField(self, field_name: typing.Literal["message", b"message"]) -> builtins.bool: ... + def ClearField(self, field_name: typing.Literal["message", b"message"]) -> None: ... + +global___InvokeAgentRequest = InvokeAgentRequest + +@typing.final +class InvokeAgentResponse(google.protobuf.message.Message): + """InvokeAgentResponse is the response message for the `InvokeAgent` method.""" + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + MESSAGE_FIELD_NUMBER: builtins.int + @property + def message(self) -> global___Message: ... + def __init__( + self, + *, + message: global___Message | None = ..., + ) -> None: ... + def HasField(self, field_name: typing.Literal["message", b"message"]) -> builtins.bool: ... + def ClearField(self, field_name: typing.Literal["message", b"message"]) -> None: ... + +global___InvokeAgentResponse = InvokeAgentResponse diff --git a/src/redpanda/runtime/proto/runtime_pb2_grpc.py b/src/redpanda/runtime/proto/runtime_pb2_grpc.py new file mode 100644 index 0000000..20bbaf8 --- /dev/null +++ b/src/redpanda/runtime/proto/runtime_pb2_grpc.py @@ -0,0 +1,100 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +"""Client and server classes corresponding to protobuf-defined services.""" +import grpc +import warnings + +from redpanda.runtime.proto import runtime_pb2 as redpanda_dot_runtime_dot_proto_dot_runtime__pb2 + +GRPC_GENERATED_VERSION = '1.71.0' +GRPC_VERSION = grpc.__version__ +_version_not_supported = False + +try: + from grpc._utilities import first_version_is_lower + _version_not_supported = first_version_is_lower(GRPC_VERSION, GRPC_GENERATED_VERSION) +except ImportError: + _version_not_supported = True + +if _version_not_supported: + raise RuntimeError( + f'The grpc package installed is at version {GRPC_VERSION},' + + f' but the generated code in redpanda/runtime/proto/runtime_pb2_grpc.py depends on' + + f' grpcio>={GRPC_GENERATED_VERSION}.' + + f' Please upgrade your grpc module to grpcio>={GRPC_GENERATED_VERSION}' + + f' or downgrade your generated code using grpcio-tools<={GRPC_VERSION}.' + ) + + +class RuntimeStub(object): + """`Runtime` is the service that provides the ability to invoke an agent. + """ + + def __init__(self, channel): + """Constructor. + + Args: + channel: A grpc.Channel. + """ + self.InvokeAgent = channel.unary_unary( + '/redpanda.runtime.v1alpha1.Runtime/InvokeAgent', + request_serializer=redpanda_dot_runtime_dot_proto_dot_runtime__pb2.InvokeAgentRequest.SerializeToString, + response_deserializer=redpanda_dot_runtime_dot_proto_dot_runtime__pb2.InvokeAgentResponse.FromString, + _registered_method=True) + + +class RuntimeServicer(object): + """`Runtime` is the service that provides the ability to invoke an agent. + """ + + def InvokeAgent(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + +def add_RuntimeServicer_to_server(servicer, server): + rpc_method_handlers = { + 'InvokeAgent': grpc.unary_unary_rpc_method_handler( + servicer.InvokeAgent, + request_deserializer=redpanda_dot_runtime_dot_proto_dot_runtime__pb2.InvokeAgentRequest.FromString, + response_serializer=redpanda_dot_runtime_dot_proto_dot_runtime__pb2.InvokeAgentResponse.SerializeToString, + ), + } + generic_handler = grpc.method_handlers_generic_handler( + 'redpanda.runtime.v1alpha1.Runtime', rpc_method_handlers) + server.add_generic_rpc_handlers((generic_handler,)) + server.add_registered_method_handlers('redpanda.runtime.v1alpha1.Runtime', rpc_method_handlers) + + + # This class is part of an EXPERIMENTAL API. +class Runtime(object): + """`Runtime` is the service that provides the ability to invoke an agent. + """ + + @staticmethod + def InvokeAgent(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/redpanda.runtime.v1alpha1.Runtime/InvokeAgent', + redpanda_dot_runtime_dot_proto_dot_runtime__pb2.InvokeAgentRequest.SerializeToString, + redpanda_dot_runtime_dot_proto_dot_runtime__pb2.InvokeAgentResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) diff --git a/src/redpanda/runtime/proto/runtime_pb2_grpc.pyi b/src/redpanda/runtime/proto/runtime_pb2_grpc.pyi new file mode 100644 index 0000000..3bcf2e2 --- /dev/null +++ b/src/redpanda/runtime/proto/runtime_pb2_grpc.pyi @@ -0,0 +1,60 @@ +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +Copyright 2025 Redpanda Data, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +""" + +import abc +import collections.abc +import grpc +import grpc.aio +import redpanda.runtime.proto.runtime_pb2 +import typing + +_T = typing.TypeVar("_T") + +class _MaybeAsyncIterator(collections.abc.AsyncIterator[_T], collections.abc.Iterator[_T], metaclass=abc.ABCMeta): ... + +class _ServicerContext(grpc.ServicerContext, grpc.aio.ServicerContext): # type: ignore[misc, type-arg] + ... + +class RuntimeStub: + """`Runtime` is the service that provides the ability to invoke an agent.""" + + def __init__(self, channel: typing.Union[grpc.Channel, grpc.aio.Channel]) -> None: ... + InvokeAgent: grpc.UnaryUnaryMultiCallable[ + redpanda.runtime.proto.runtime_pb2.InvokeAgentRequest, + redpanda.runtime.proto.runtime_pb2.InvokeAgentResponse, + ] + +class RuntimeAsyncStub: + """`Runtime` is the service that provides the ability to invoke an agent.""" + + InvokeAgent: grpc.aio.UnaryUnaryMultiCallable[ + redpanda.runtime.proto.runtime_pb2.InvokeAgentRequest, + redpanda.runtime.proto.runtime_pb2.InvokeAgentResponse, + ] + +class RuntimeServicer(metaclass=abc.ABCMeta): + """`Runtime` is the service that provides the ability to invoke an agent.""" + + @abc.abstractmethod + def InvokeAgent( + self, + request: redpanda.runtime.proto.runtime_pb2.InvokeAgentRequest, + context: _ServicerContext, + ) -> typing.Union[redpanda.runtime.proto.runtime_pb2.InvokeAgentResponse, collections.abc.Awaitable[redpanda.runtime.proto.runtime_pb2.InvokeAgentResponse]]: ... + +def add_RuntimeServicer_to_server(servicer: RuntimeServicer, server: typing.Union[grpc.Server, grpc.aio.Server]) -> None: ... diff --git a/src/redpanda/runtime/py.typed b/src/redpanda/runtime/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/tests/test_agents.py b/tests/test_agents.py index be42a86..943ffec 100644 --- a/tests/test_agents.py +++ b/tests/test_agents.py @@ -3,7 +3,7 @@ import pytest from pydantic import BaseModel -import agents +from redpanda import agents class MyModel(BaseModel): diff --git a/uv.lock b/uv.lock index bf9522b..f34500d 100644 --- a/uv.lock +++ b/uv.lock @@ -13,7 +13,7 @@ wheels = [ [[package]] name = "aiohttp" -version = "3.11.14" +version = "3.11.16" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiohappyeyeballs" }, @@ -24,24 +24,24 @@ dependencies = [ { name = "propcache" }, { name = "yarl" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/6c/96/91e93ae5fd04d428c101cdbabce6c820d284d61d2614d00518f4fa52ea24/aiohttp-3.11.14.tar.gz", hash = "sha256:d6edc538c7480fa0a3b2bdd705f8010062d74700198da55d16498e1b49549b9c", size = 7676994 } +sdist = { url = "https://files.pythonhosted.org/packages/f1/d9/1c4721d143e14af753f2bf5e3b681883e1f24b592c0482df6fa6e33597fa/aiohttp-3.11.16.tar.gz", hash = "sha256:16f8a2c9538c14a557b4d309ed4d0a7c60f0253e8ed7b6c9a2859a7582f8b1b8", size = 7676826 } wheels = [ - { url = "https://files.pythonhosted.org/packages/c5/8e/d7f353c5aaf9f868ab382c3d3320dc6efaa639b6b30d5a686bed83196115/aiohttp-3.11.14-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8d14e274828561db91e4178f0057a915f3af1757b94c2ca283cb34cbb6e00b50", size = 698774 }, - { url = "https://files.pythonhosted.org/packages/d5/52/097b98d50f8550883f7d360c6cd4e77668c7442038671bb4b349ced95066/aiohttp-3.11.14-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f30fc72daf85486cdcdfc3f5e0aea9255493ef499e31582b34abadbfaafb0965", size = 461443 }, - { url = "https://files.pythonhosted.org/packages/2b/5c/19c84bb5796be6ca4fd1432012cfd5f88ec02c8b9e0357cdecc48ff2c4fd/aiohttp-3.11.14-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4edcbe34e6dba0136e4cabf7568f5a434d89cc9de5d5155371acda275353d228", size = 453717 }, - { url = "https://files.pythonhosted.org/packages/6d/08/61c2b6f04a4e1329c82ffda53dd0ac4b434681dc003578a1237d318be885/aiohttp-3.11.14-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a7169ded15505f55a87f8f0812c94c9412623c744227b9e51083a72a48b68a5", size = 1666559 }, - { url = "https://files.pythonhosted.org/packages/7c/22/913ad5b4b979ecf69300869551c210b2eb8c22ca4cd472824a1425479775/aiohttp-3.11.14-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad1f2fb9fe9b585ea4b436d6e998e71b50d2b087b694ab277b30e060c434e5db", size = 1721701 }, - { url = "https://files.pythonhosted.org/packages/5b/ea/0ee73ea764b2e1f769c1caf59f299ac017b50632ceaa809960385b68e735/aiohttp-3.11.14-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:20412c7cc3720e47a47e63c0005f78c0c2370020f9f4770d7fc0075f397a9fb0", size = 1779094 }, - { url = "https://files.pythonhosted.org/packages/e6/ca/6ce3da7c3295e0655b3404a309c7002099ca3619aeb04d305cedc77a0a14/aiohttp-3.11.14-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6dd9766da617855f7e85f27d2bf9a565ace04ba7c387323cd3e651ac4329db91", size = 1678406 }, - { url = "https://files.pythonhosted.org/packages/b1/b1/3a13ed54dc6bb57057cc94fec2a742f24a89885cfa84b71930826af40f5f/aiohttp-3.11.14-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:599b66582f7276ebefbaa38adf37585e636b6a7a73382eb412f7bc0fc55fb73d", size = 1604446 }, - { url = "https://files.pythonhosted.org/packages/00/21/fc9f327a121ff0be32ed4ec3ccca65f420549bf3a646b02f8534ba5fe86d/aiohttp-3.11.14-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b41693b7388324b80f9acfabd479bd1c84f0bc7e8f17bab4ecd9675e9ff9c734", size = 1619129 }, - { url = "https://files.pythonhosted.org/packages/56/5b/1a4a45b1f6f95b998c49d3d1e7763a75eeff29f2f5ec7e06d94a359e7d97/aiohttp-3.11.14-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:86135c32d06927339c8c5e64f96e4eee8825d928374b9b71a3c42379d7437058", size = 1657924 }, - { url = "https://files.pythonhosted.org/packages/2f/2d/b6211aa0664b87c93fda2f2f60d5211be514a2d5b4935e1286d54b8aa28d/aiohttp-3.11.14-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:04eb541ce1e03edc1e3be1917a0f45ac703e913c21a940111df73a2c2db11d73", size = 1617501 }, - { url = "https://files.pythonhosted.org/packages/fa/3d/d46ccb1f361a1275a078bfc1509bcd6dc6873e22306d10baa61bc77a0dfc/aiohttp-3.11.14-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:dc311634f6f28661a76cbc1c28ecf3b3a70a8edd67b69288ab7ca91058eb5a33", size = 1684211 }, - { url = "https://files.pythonhosted.org/packages/2d/e2/71d12ee6268ad3bf4ee82a4f2fc7f0b943f480296cb6f61af1afe05b8d24/aiohttp-3.11.14-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:69bb252bfdca385ccabfd55f4cd740d421dd8c8ad438ded9637d81c228d0da49", size = 1715797 }, - { url = "https://files.pythonhosted.org/packages/8d/a7/d0de521dc5ca6e8c766f8d1f373c859925f10b2a96455b16107c1e9b2d60/aiohttp-3.11.14-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:2b86efe23684b58a88e530c4ab5b20145f102916bbb2d82942cafec7bd36a647", size = 1673682 }, - { url = "https://files.pythonhosted.org/packages/f0/86/5c075ebeca7063a49a0da65a4e0aa9e49d741aca9a2fe9552d86906e159b/aiohttp-3.11.14-cp313-cp313-win32.whl", hash = "sha256:b9c60d1de973ca94af02053d9b5111c4fbf97158e139b14f1be68337be267be6", size = 411014 }, - { url = "https://files.pythonhosted.org/packages/4a/e0/2f9e77ef2d4a1dbf05f40b7edf1e1ce9be72bdbe6037cf1db1712b455e3e/aiohttp-3.11.14-cp313-cp313-win_amd64.whl", hash = "sha256:0a29be28e60e5610d2437b5b2fed61d6f3dcde898b57fb048aa5079271e7f6f3", size = 436964 }, + { url = "https://files.pythonhosted.org/packages/52/52/7c712b2d9fb4d5e5fd6d12f9ab76e52baddfee71e3c8203ca7a7559d7f51/aiohttp-3.11.16-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a3814760a1a700f3cfd2f977249f1032301d0a12c92aba74605cfa6ce9f78489", size = 698005 }, + { url = "https://files.pythonhosted.org/packages/51/3e/61057814f7247666d43ac538abcd6335b022869ade2602dab9bf33f607d2/aiohttp-3.11.16-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9b751a6306f330801665ae69270a8a3993654a85569b3469662efaad6cf5cc50", size = 461106 }, + { url = "https://files.pythonhosted.org/packages/4f/85/6b79fb0ea6e913d596d5b949edc2402b20803f51b1a59e1bbc5bb7ba7569/aiohttp-3.11.16-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ad497f38a0d6c329cb621774788583ee12321863cd4bd9feee1effd60f2ad133", size = 453394 }, + { url = "https://files.pythonhosted.org/packages/4b/04/e1bb3fcfbd2c26753932c759593a32299aff8625eaa0bf8ff7d9c0c34a36/aiohttp-3.11.16-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca37057625693d097543bd88076ceebeb248291df9d6ca8481349efc0b05dcd0", size = 1666643 }, + { url = "https://files.pythonhosted.org/packages/0e/27/97bc0fdd1f439b8f060beb3ba8fb47b908dc170280090801158381ad7942/aiohttp-3.11.16-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a5abcbba9f4b463a45c8ca8b7720891200658f6f46894f79517e6cd11f3405ca", size = 1721948 }, + { url = "https://files.pythonhosted.org/packages/2c/4f/bc4c5119e75c05ef15c5670ef1563bbe25d4ed4893b76c57b0184d815e8b/aiohttp-3.11.16-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f420bfe862fb357a6d76f2065447ef6f484bc489292ac91e29bc65d2d7a2c84d", size = 1774454 }, + { url = "https://files.pythonhosted.org/packages/73/5b/54b42b2150bb26fdf795464aa55ceb1a49c85f84e98e6896d211eabc6670/aiohttp-3.11.16-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58ede86453a6cf2d6ce40ef0ca15481677a66950e73b0a788917916f7e35a0bb", size = 1677785 }, + { url = "https://files.pythonhosted.org/packages/10/ee/a0fe68916d3f82eae199b8535624cf07a9c0a0958c7a76e56dd21140487a/aiohttp-3.11.16-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6fdec0213244c39973674ca2a7f5435bf74369e7d4e104d6c7473c81c9bcc8c4", size = 1608456 }, + { url = "https://files.pythonhosted.org/packages/8b/48/83afd779242b7cf7e1ceed2ff624a86d3221e17798061cf9a79e0b246077/aiohttp-3.11.16-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:72b1b03fb4655c1960403c131740755ec19c5898c82abd3961c364c2afd59fe7", size = 1622424 }, + { url = "https://files.pythonhosted.org/packages/6f/27/452f1d5fca1f516f9f731539b7f5faa9e9d3bf8a3a6c3cd7c4b031f20cbd/aiohttp-3.11.16-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:780df0d837276276226a1ff803f8d0fa5f8996c479aeef52eb040179f3156cbd", size = 1660943 }, + { url = "https://files.pythonhosted.org/packages/d6/e1/5c7d63143b8d00c83b958b9e78e7048c4a69903c760c1e329bf02bac57a1/aiohttp-3.11.16-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ecdb8173e6c7aa09eee342ac62e193e6904923bd232e76b4157ac0bfa670609f", size = 1622797 }, + { url = "https://files.pythonhosted.org/packages/46/9e/2ac29cca2746ee8e449e73cd2fcb3d454467393ec03a269d50e49af743f1/aiohttp-3.11.16-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:a6db7458ab89c7d80bc1f4e930cc9df6edee2200127cfa6f6e080cf619eddfbd", size = 1687162 }, + { url = "https://files.pythonhosted.org/packages/ad/6b/eaa6768e02edebaf37d77f4ffb74dd55f5cbcbb6a0dbf798ccec7b0ac23b/aiohttp-3.11.16-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:2540ddc83cc724b13d1838026f6a5ad178510953302a49e6d647f6e1de82bc34", size = 1718518 }, + { url = "https://files.pythonhosted.org/packages/e5/18/dda87cbad29472a51fa058d6d8257dfce168289adaeb358b86bd93af3b20/aiohttp-3.11.16-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:3b4e6db8dc4879015b9955778cfb9881897339c8fab7b3676f8433f849425913", size = 1675254 }, + { url = "https://files.pythonhosted.org/packages/32/d9/d2fb08c614df401d92c12fcbc60e6e879608d5e8909ef75c5ad8d4ad8aa7/aiohttp-3.11.16-cp313-cp313-win32.whl", hash = "sha256:493910ceb2764f792db4dc6e8e4b375dae1b08f72e18e8f10f18b34ca17d0979", size = 410698 }, + { url = "https://files.pythonhosted.org/packages/ce/ed/853e36d5a33c24544cfa46585895547de152dfef0b5c79fa675f6e4b7b87/aiohttp-3.11.16-cp313-cp313-win_amd64.whl", hash = "sha256:42864e70a248f5f6a49fdaf417d9bc62d6e4d8ee9695b24c5916cb4bb666c802", size = 436395 }, ] [[package]] @@ -205,11 +205,11 @@ wheels = [ [[package]] name = "fsspec" -version = "2025.3.0" +version = "2025.3.2" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/34/f4/5721faf47b8c499e776bc34c6a8fc17efdf7fdef0b00f398128bc5dcb4ac/fsspec-2025.3.0.tar.gz", hash = "sha256:a935fd1ea872591f2b5148907d103488fc523295e6c64b835cfad8c3eca44972", size = 298491 } +sdist = { url = "https://files.pythonhosted.org/packages/45/d8/8425e6ba5fcec61a1d16e41b1b71d2bf9344f1fe48012c2b48b9620feae5/fsspec-2025.3.2.tar.gz", hash = "sha256:e52c77ef398680bbd6a98c0e628fbc469491282981209907bbc8aea76a04fdc6", size = 299281 } wheels = [ - { url = "https://files.pythonhosted.org/packages/56/53/eb690efa8513166adef3e0669afd31e95ffde69fb3c52ec2ac7223ed6018/fsspec-2025.3.0-py3-none-any.whl", hash = "sha256:efb87af3efa9103f94ca91a7f8cb7a4df91af9f74fc106c9c7ea0efd7277c1b3", size = 193615 }, + { url = "https://files.pythonhosted.org/packages/44/4b/e0cfc1a6f17e990f3e64b7d941ddc4acdc7b19d6edd51abf495f32b1a9e4/fsspec-2025.3.2-py3-none-any.whl", hash = "sha256:2daf8dc3d1dfa65b6aa37748d112773a7a08416f6c70d96b264c96476ecaf711", size = 194435 }, ] [[package]] @@ -226,14 +226,68 @@ wheels = [ [[package]] name = "griffe" -version = "1.6.3" +version = "1.7.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/bf/28/f61564ce1237727f0daa0b28e18201252e032aa7d7fb0e4fa0b447ecad4b/griffe-1.6.3.tar.gz", hash = "sha256:568cc9e50de04f6c76234bf46dd7f3a264ea3cbb1380fb54818e81e3675a83cf", size = 393810 } +sdist = { url = "https://files.pythonhosted.org/packages/59/08/7df7e90e34d08ad890bd71d7ba19451052f88dc3d2c483d228d1331a4736/griffe-1.7.2.tar.gz", hash = "sha256:98d396d803fab3b680c2608f300872fd57019ed82f0672f5b5323a9ad18c540c", size = 394919 } wheels = [ - { url = "https://files.pythonhosted.org/packages/8a/11/46f2e6370ecf8e9e3ab01ad422fb9ea5b90579bdc4b1a8527aa745b20758/griffe-1.6.3-py3-none-any.whl", hash = "sha256:7a0c559f10d8a9016f4d0b4ceaacc087e31e2370cb1aa9a59006a30d5a279fb3", size = 128922 }, + { url = "https://files.pythonhosted.org/packages/b1/5e/38b408f41064c9fcdbb0ea27c1bd13a1c8657c4846e04dab9f5ea770602c/griffe-1.7.2-py3-none-any.whl", hash = "sha256:1ed9c2e338a75741fc82083fe5a1bc89cb6142efe126194cc313e34ee6af5423", size = 129187 }, +] + +[[package]] +name = "grpcio" +version = "1.71.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1c/95/aa11fc09a85d91fbc7dd405dcb2a1e0256989d67bf89fa65ae24b3ba105a/grpcio-1.71.0.tar.gz", hash = "sha256:2b85f7820475ad3edec209d3d89a7909ada16caab05d3f2e08a7e8ae3200a55c", size = 12549828 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/dd/b00cbb45400d06b26126dcfdbdb34bb6c4f28c3ebbd7aea8228679103ef6/grpcio-1.71.0-cp313-cp313-linux_armv7l.whl", hash = "sha256:cebc1b34ba40a312ab480ccdb396ff3c529377a2fce72c45a741f7215bfe8379", size = 5184138 }, + { url = "https://files.pythonhosted.org/packages/ed/0a/4651215983d590ef53aac40ba0e29dda941a02b097892c44fa3357e706e5/grpcio-1.71.0-cp313-cp313-macosx_10_14_universal2.whl", hash = "sha256:85da336e3649a3d2171e82f696b5cad2c6231fdd5bad52616476235681bee5b3", size = 11310747 }, + { url = "https://files.pythonhosted.org/packages/57/a3/149615b247f321e13f60aa512d3509d4215173bdb982c9098d78484de216/grpcio-1.71.0-cp313-cp313-manylinux_2_17_aarch64.whl", hash = "sha256:f9a412f55bb6e8f3bb000e020dbc1e709627dcb3a56f6431fa7076b4c1aab0db", size = 5653991 }, + { url = "https://files.pythonhosted.org/packages/ca/56/29432a3e8d951b5e4e520a40cd93bebaa824a14033ea8e65b0ece1da6167/grpcio-1.71.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:47be9584729534660416f6d2a3108aaeac1122f6b5bdbf9fd823e11fe6fbaa29", size = 6312781 }, + { url = "https://files.pythonhosted.org/packages/a3/f8/286e81a62964ceb6ac10b10925261d4871a762d2a763fbf354115f9afc98/grpcio-1.71.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c9c80ac6091c916db81131d50926a93ab162a7e97e4428ffc186b6e80d6dda4", size = 5910479 }, + { url = "https://files.pythonhosted.org/packages/35/67/d1febb49ec0f599b9e6d4d0d44c2d4afdbed9c3e80deb7587ec788fcf252/grpcio-1.71.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:789d5e2a3a15419374b7b45cd680b1e83bbc1e52b9086e49308e2c0b5bbae6e3", size = 6013262 }, + { url = "https://files.pythonhosted.org/packages/a1/04/f9ceda11755f0104a075ad7163fc0d96e2e3a9fe25ef38adfc74c5790daf/grpcio-1.71.0-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:1be857615e26a86d7363e8a163fade914595c81fec962b3d514a4b1e8760467b", size = 6643356 }, + { url = "https://files.pythonhosted.org/packages/fb/ce/236dbc3dc77cf9a9242adcf1f62538734ad64727fabf39e1346ad4bd5c75/grpcio-1.71.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:a76d39b5fafd79ed604c4be0a869ec3581a172a707e2a8d7a4858cb05a5a7637", size = 6186564 }, + { url = "https://files.pythonhosted.org/packages/10/fd/b3348fce9dd4280e221f513dd54024e765b21c348bc475516672da4218e9/grpcio-1.71.0-cp313-cp313-win32.whl", hash = "sha256:74258dce215cb1995083daa17b379a1a5a87d275387b7ffe137f1d5131e2cfbb", size = 3601890 }, + { url = "https://files.pythonhosted.org/packages/be/f8/db5d5f3fc7e296166286c2a397836b8b042f7ad1e11028d82b061701f0f7/grpcio-1.71.0-cp313-cp313-win_amd64.whl", hash = "sha256:22c3bc8d488c039a199f7a003a38cb7635db6656fa96437a8accde8322ce2366", size = 4273308 }, +] + +[[package]] +name = "grpcio-health-checking" +version = "1.71.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "grpcio" }, + { name = "protobuf" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8b/0e/62743c098e80dde057afc50f9d681a5ef06cfbd4be377801d0d7e2a0737d/grpcio_health_checking-1.71.0.tar.gz", hash = "sha256:ff9bd55beb97ce3322fda2ae58781c9d6c6fcca6a35ca3b712975d9f75dd30af", size = 16766 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/69/7b/55fafdff4a7ec6b4721484eb1a2483da14db8c106980a82d4736ddcbf047/grpcio_health_checking-1.71.0-py3-none-any.whl", hash = "sha256:b7d9b7a7606ab4cd02d23bd1d3943843f784ffc987c9bfec14c9d058d9e279db", size = 18922 }, +] + +[[package]] +name = "grpcio-tools" +version = "1.71.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "grpcio" }, + { name = "protobuf" }, + { name = "setuptools" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/05/d2/c0866a48c355a6a4daa1f7e27e210c7fa561b1f3b7c0bce2671e89cfa31e/grpcio_tools-1.71.0.tar.gz", hash = "sha256:38dba8e0d5e0fb23a034e09644fdc6ed862be2371887eee54901999e8f6792a8", size = 5326008 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/84/a7/70dc7e9957bcbaccd4dcb6cc11215e0b918f546d55599221522fe0d073e0/grpcio_tools-1.71.0-cp313-cp313-linux_armv7l.whl", hash = "sha256:9a78d07d6c301a25ef5ede962920a522556a1dfee1ccc05795994ceb867f766c", size = 2384758 }, + { url = "https://files.pythonhosted.org/packages/65/79/57320b28d0a0c5ec94095fd571a65292f8ed7e1c47e59ae4021e8a48d49b/grpcio_tools-1.71.0-cp313-cp313-macosx_10_14_universal2.whl", hash = "sha256:580ac88141c9815557e63c9c04f5b1cdb19b4db8d0cb792b573354bde1ee8b12", size = 5951661 }, + { url = "https://files.pythonhosted.org/packages/80/3d/343df5ed7c5dd66fc7a19e4ef3e97ccc4f5d802122b04cd6492f0dcd79f5/grpcio_tools-1.71.0-cp313-cp313-manylinux_2_17_aarch64.whl", hash = "sha256:f7c678e68ece0ae908ecae1c4314a0c2c7f83e26e281738b9609860cc2c82d96", size = 2351571 }, + { url = "https://files.pythonhosted.org/packages/56/2f/b9736e8c84e880c4237f5b880c6c799b4977c5cde190999bc7ab4b2ec445/grpcio_tools-1.71.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:56ecd6cc89b5e5eed1de5eb9cafce86c9c9043ee3840888cc464d16200290b53", size = 2744580 }, + { url = "https://files.pythonhosted.org/packages/76/9b/bdb384967353da7bf64bac4232f4cf8ae43f19d0f2f640978d4d4197e667/grpcio_tools-1.71.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e52a041afc20ab2431d756b6295d727bd7adee813b21b06a3483f4a7a15ea15f", size = 2475978 }, + { url = "https://files.pythonhosted.org/packages/26/71/1411487fd7862d347b98fda5e3beef611a71b2ac2faac62a965d9e2536b3/grpcio_tools-1.71.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:2a1712f12102b60c8d92779b89d0504e0d6f3a59f2b933e5622b8583f5c02992", size = 2853314 }, + { url = "https://files.pythonhosted.org/packages/03/06/59d0523eb1ba2f64edc72cb150152fa1b2e77061cae3ef3ecd3ef2a87f51/grpcio_tools-1.71.0-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:41878cb7a75477e62fdd45e7e9155b3af1b7a5332844021e2511deaf99ac9e6c", size = 3303981 }, + { url = "https://files.pythonhosted.org/packages/c2/71/fb9fb49f2b738ec1dfbbc8cdce0b26e5f9c5fc0edef72e453580620d6a36/grpcio_tools-1.71.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:682e958b476049ccc14c71bedf3f979bced01f6e0c04852efc5887841a32ad6b", size = 2915876 }, + { url = "https://files.pythonhosted.org/packages/bd/0f/0d49f6fe6fa2d09e9820dd9eeb30437e86002303076be2b6ada0fb52b8f2/grpcio_tools-1.71.0-cp313-cp313-win32.whl", hash = "sha256:0ccfb837152b7b858b9f26bb110b3ae8c46675d56130f6c2f03605c4f129be13", size = 948245 }, + { url = "https://files.pythonhosted.org/packages/bb/14/ab131a39187bfea950280b2277a82d2033469fe8c86f73b10b19f53cc5ca/grpcio_tools-1.71.0-cp313-cp313-win_amd64.whl", hash = "sha256:ffff9bc5eacb34dd26b487194f7d44a3e64e752fc2cf049d798021bf25053b87", size = 1119649 }, ] [[package]] @@ -284,7 +338,7 @@ wheels = [ [[package]] name = "huggingface-hub" -version = "0.29.3" +version = "0.30.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "filelock" }, @@ -295,9 +349,9 @@ dependencies = [ { name = "tqdm" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e5/f9/851f34b02970e8143d41d4001b2d49e54ef113f273902103823b8bc95ada/huggingface_hub-0.29.3.tar.gz", hash = "sha256:64519a25716e0ba382ba2d3fb3ca082e7c7eb4a2fc634d200e8380006e0760e5", size = 390123 } +sdist = { url = "https://files.pythonhosted.org/packages/78/be/049689a7197630e75c4bb53021cb209a56617c9bf39b3a0950650d1f96e1/huggingface_hub-0.30.1.tar.gz", hash = "sha256:f379e8b8d0791295602538856638460ae3cf679c7f304201eb80fb98c771950e", size = 400784 } wheels = [ - { url = "https://files.pythonhosted.org/packages/40/0c/37d380846a2e5c9a3c6a73d26ffbcfdcad5fc3eacf42fdf7cff56f2af634/huggingface_hub-0.29.3-py3-none-any.whl", hash = "sha256:0b25710932ac649c08cdbefa6c6ccb8e88eef82927cacdb048efb726429453aa", size = 468997 }, + { url = "https://files.pythonhosted.org/packages/99/e3/2232d0e726d4d6ea69643b9593d97d0e7e6ea69c2fe9ed5de34d476c1c47/huggingface_hub-0.30.1-py3-none-any.whl", hash = "sha256:0f6aa5ec5a4e68e5b9e45d556b4e5ea180c58f5a5ffa734e7f38c9d573028959", size = 481170 }, ] [[package]] @@ -394,7 +448,7 @@ wheels = [ [[package]] name = "litellm" -version = "1.64.1" +version = "1.65.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiohttp" }, @@ -409,9 +463,9 @@ dependencies = [ { name = "tiktoken" }, { name = "tokenizers" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/8f/2a/7a4d04aa0edec4c583acb78657043569741dcc4a5da6aa381ee867bacd94/litellm-1.64.1.tar.gz", hash = "sha256:73bac891b1fbd77ada4d691e967657c53f48c207d9c3ba414ad0ffe3e7ec8f89", size = 6650473 } +sdist = { url = "https://files.pythonhosted.org/packages/da/d0/240bb0e7cb9c490aafff7c1c28e3cf7d68ac2c6089b49f90c64823207cb3/litellm-1.65.1.tar.gz", hash = "sha256:cbc8d7dfa5f7f47e6842796ca0c39682eb874718faab17fa991ab6c2f55e844c", size = 6695530 } wheels = [ - { url = "https://files.pythonhosted.org/packages/88/3e/37577b8741e4afba5d3e290ba7da3258bb738990f3c1d91196b4ca8f406a/litellm-1.64.1-py3-none-any.whl", hash = "sha256:bd7cb4977dee121551f0322d48b4e51e9a508fc2ac2273e7c5405ca69354e352", size = 6974769 }, + { url = "https://files.pythonhosted.org/packages/c1/25/217b796420d9cd9eabb539adb81701cf27f3677aef84a181bb89073491ad/litellm-1.65.1-py3-none-any.whl", hash = "sha256:56478866373c4af13d86e71ab44fd337305dee39a82d742bc496bc56a2d732a1", size = 7032194 }, ] [[package]] @@ -453,7 +507,7 @@ wheels = [ [[package]] name = "mcp" -version = "1.5.0" +version = "1.6.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, @@ -465,9 +519,9 @@ dependencies = [ { name = "starlette" }, { name = "uvicorn" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/6d/c9/c55764824e893fdebe777ac7223200986a275c3191dba9169f8eb6d7c978/mcp-1.5.0.tar.gz", hash = "sha256:5b2766c05e68e01a2034875e250139839498c61792163a7b221fc170c12f5aa9", size = 159128 } +sdist = { url = "https://files.pythonhosted.org/packages/95/d2/f587cb965a56e992634bebc8611c5b579af912b74e04eb9164bd49527d21/mcp-1.6.0.tar.gz", hash = "sha256:d9324876de2c5637369f43161cd71eebfd803df5a95e46225cab8d280e366723", size = 200031 } wheels = [ - { url = "https://files.pythonhosted.org/packages/c1/d1/3ff566ecf322077d861f1a68a1ff025cad337417bd66ad22a7c6f7dfcfaf/mcp-1.5.0-py3-none-any.whl", hash = "sha256:51c3f35ce93cb702f7513c12406bbea9665ef75a08db909200b07da9db641527", size = 73734 }, + { url = "https://files.pythonhosted.org/packages/10/30/20a7f33b0b884a9d14dd3aa94ff1ac9da1479fe2ad66dd9e2736075d2506/mcp-1.6.0-py3-none-any.whl", hash = "sha256:7bd24c6ea042dbec44c754f100984d186620d8b841ec30f1b19eda9b93a634d0", size = 76077 }, ] [[package]] @@ -533,7 +587,7 @@ wheels = [ [[package]] name = "mkdocs-material" -version = "9.6.9" +version = "9.6.11" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "babel" }, @@ -548,9 +602,9 @@ dependencies = [ { name = "pymdown-extensions" }, { name = "requests" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/11/cb/6dd3b6a7925429c0229738098ee874dbf7fa02db55558adb2c5bf86077b2/mkdocs_material-9.6.9.tar.gz", hash = "sha256:a4872139715a1f27b2aa3f3dc31a9794b7bbf36333c0ba4607cf04786c94f89c", size = 3948083 } +sdist = { url = "https://files.pythonhosted.org/packages/5b/7e/c65e330e99daa5813e7594e57a09219ad041ed631604a72588ec7c11b34b/mkdocs_material-9.6.11.tar.gz", hash = "sha256:0b7f4a0145c5074cdd692e4362d232fb25ef5b23328d0ec1ab287af77cc0deff", size = 3951595 } wheels = [ - { url = "https://files.pythonhosted.org/packages/db/7c/ea5a671b2ff5d0e3f3108a7f7d75b541d683e4969aaead2a8f3e59e0fc27/mkdocs_material-9.6.9-py3-none-any.whl", hash = "sha256:6e61b7fb623ce2aa4622056592b155a9eea56ff3487d0835075360be45a4c8d1", size = 8697935 }, + { url = "https://files.pythonhosted.org/packages/19/91/79a15a772151aca0d505f901f6bbd4b85ee1fe54100256a6702056bab121/mkdocs_material-9.6.11-py3-none-any.whl", hash = "sha256:47f21ef9cbf4f0ebdce78a2ceecaa5d413581a55141e4464902224ebbc0b1263", size = 8703720 }, ] [[package]] @@ -564,7 +618,7 @@ wheels = [ [[package]] name = "mkdocstrings" -version = "0.29.0" +version = "0.29.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "jinja2" }, @@ -574,9 +628,9 @@ dependencies = [ { name = "mkdocs-autorefs" }, { name = "pymdown-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/8e/4d/a9484dc5d926295bdf308f1f6c4f07fcc99735b970591edc414d401fcc91/mkdocstrings-0.29.0.tar.gz", hash = "sha256:3657be1384543ce0ee82112c3e521bbf48e41303aa0c229b9ffcccba057d922e", size = 1212185 } +sdist = { url = "https://files.pythonhosted.org/packages/41/e8/d22922664a627a0d3d7ff4a6ca95800f5dde54f411982591b4621a76225d/mkdocstrings-0.29.1.tar.gz", hash = "sha256:8722f8f8c5cd75da56671e0a0c1bbed1df9946c0cef74794d6141b34011abd42", size = 1212686 } wheels = [ - { url = "https://files.pythonhosted.org/packages/15/47/eb876dfd84e48f31ff60897d161b309cf6a04ca270155b0662aae562b3fb/mkdocstrings-0.29.0-py3-none-any.whl", hash = "sha256:8ea98358d2006f60befa940fdebbbc88a26b37ecbcded10be726ba359284f73d", size = 1630824 }, + { url = "https://files.pythonhosted.org/packages/98/14/22533a578bf8b187e05d67e2c1721ce10e3f526610eebaf7a149d557ea7a/mkdocstrings-0.29.1-py3-none-any.whl", hash = "sha256:37a9736134934eea89cbd055a513d40a020d87dfcae9e3052c2a6b8cd4af09b6", size = 1631075 }, ] [package.optional-dependencies] @@ -665,6 +719,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/2a/e2/5d3f6ada4297caebe1a2add3b126fe800c96f56dbe5d1988a2cbe0b267aa/mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d", size = 4695 }, ] +[[package]] +name = "mypy-protobuf" +version = "3.6.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "protobuf" }, + { name = "types-protobuf" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4d/6f/282d64d66bf48ce60e38a6560753f784e0f88ab245ac2fb5e93f701a36cd/mypy-protobuf-3.6.0.tar.gz", hash = "sha256:02f242eb3409f66889f2b1a3aa58356ec4d909cdd0f93115622e9e70366eca3c", size = 24445 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e8/73/d6b999782ae22f16971cc05378b3b33f6a89ede3b9619e8366aa23484bca/mypy_protobuf-3.6.0-py3-none-any.whl", hash = "sha256:56176e4d569070e7350ea620262478b49b7efceba4103d468448f1d21492fd6c", size = 16434 }, +] + [[package]] name = "nodeenv" version = "1.9.1" @@ -676,7 +743,7 @@ wheels = [ [[package]] name = "openai" -version = "1.68.2" +version = "1.70.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, @@ -688,9 +755,9 @@ dependencies = [ { name = "tqdm" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/3f/6b/6b002d5d38794645437ae3ddb42083059d556558493408d39a0fcea608bc/openai-1.68.2.tar.gz", hash = "sha256:b720f0a95a1dbe1429c0d9bb62096a0d98057bcda82516f6e8af10284bdd5b19", size = 413429 } +sdist = { url = "https://files.pythonhosted.org/packages/87/f5/ae0f3cd226c2993b4ac1cc4b5f6ca099764689f403c14922c9356accec66/openai-1.70.0.tar.gz", hash = "sha256:e52a8d54c3efeb08cf58539b5b21a5abef25368b5432965e4de88cdf4e091b2b", size = 409640 } wheels = [ - { url = "https://files.pythonhosted.org/packages/fd/34/cebce15f64eb4a3d609a83ac3568d43005cc9a1cba9d7fde5590fd415423/openai-1.68.2-py3-none-any.whl", hash = "sha256:24484cb5c9a33b58576fdc5acf0e5f92603024a4e39d0b99793dfa1eb14c2b36", size = 606073 }, + { url = "https://files.pythonhosted.org/packages/e2/39/c4b38317d2c702c4bc763957735aaeaf30dfc43b5b824121c49a4ba7ba0f/openai-1.70.0-py3-none-any.whl", hash = "sha256:f6438d053fd8b2e05fd6bef70871e832d9bbdf55e119d0ac5b92726f1ae6f614", size = 599070 }, ] [[package]] @@ -779,43 +846,61 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b8/d3/c3cb8f1d6ae3b37f83e1de806713a9b3642c5895f0215a62e1a4bd6e5e34/propcache-0.3.1-py3-none-any.whl", hash = "sha256:9a8ecf38de50a7f518c21568c80f985e776397b902f1ce0b01f799aba1608b40", size = 12376 }, ] +[[package]] +name = "protobuf" +version = "5.29.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/17/7d/b9dca7365f0e2c4fa7c193ff795427cfa6290147e5185ab11ece280a18e7/protobuf-5.29.4.tar.gz", hash = "sha256:4f1dfcd7997b31ef8f53ec82781ff434a28bf71d9102ddde14d076adcfc78c99", size = 424902 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9a/b2/043a1a1a20edd134563699b0e91862726a0dc9146c090743b6c44d798e75/protobuf-5.29.4-cp310-abi3-win32.whl", hash = "sha256:13eb236f8eb9ec34e63fc8b1d6efd2777d062fa6aaa68268fb67cf77f6839ad7", size = 422709 }, + { url = "https://files.pythonhosted.org/packages/79/fc/2474b59570daa818de6124c0a15741ee3e5d6302e9d6ce0bdfd12e98119f/protobuf-5.29.4-cp310-abi3-win_amd64.whl", hash = "sha256:bcefcdf3976233f8a502d265eb65ea740c989bacc6c30a58290ed0e519eb4b8d", size = 434506 }, + { url = "https://files.pythonhosted.org/packages/46/de/7c126bbb06aa0f8a7b38aaf8bd746c514d70e6a2a3f6dd460b3b7aad7aae/protobuf-5.29.4-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:307ecba1d852ec237e9ba668e087326a67564ef83e45a0189a772ede9e854dd0", size = 417826 }, + { url = "https://files.pythonhosted.org/packages/a2/b5/bade14ae31ba871a139aa45e7a8183d869efe87c34a4850c87b936963261/protobuf-5.29.4-cp38-abi3-manylinux2014_aarch64.whl", hash = "sha256:aec4962f9ea93c431d5714ed1be1c93f13e1a8618e70035ba2b0564d9e633f2e", size = 319574 }, + { url = "https://files.pythonhosted.org/packages/46/88/b01ed2291aae68b708f7d334288ad5fb3e7aa769a9c309c91a0d55cb91b0/protobuf-5.29.4-cp38-abi3-manylinux2014_x86_64.whl", hash = "sha256:d7d3f7d1d5a66ed4942d4fefb12ac4b14a29028b209d4bfb25c68ae172059922", size = 319672 }, + { url = "https://files.pythonhosted.org/packages/12/fb/a586e0c973c95502e054ac5f81f88394f24ccc7982dac19c515acd9e2c93/protobuf-5.29.4-py3-none-any.whl", hash = "sha256:3fde11b505e1597f71b875ef2fc52062b6a9740e5f7c8997ce878b6009145862", size = 172551 }, +] + [[package]] name = "pydantic" -version = "2.10.6" +version = "2.11.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "annotated-types" }, { name = "pydantic-core" }, { name = "typing-extensions" }, + { name = "typing-inspection" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b7/ae/d5220c5c52b158b1de7ca89fc5edb72f304a70a4c540c84c8844bf4008de/pydantic-2.10.6.tar.gz", hash = "sha256:ca5daa827cce33de7a42be142548b0096bf05a7e7b365aebfa5f8eeec7128236", size = 761681 } +sdist = { url = "https://files.pythonhosted.org/packages/93/a3/698b87a4d4d303d7c5f62ea5fbf7a79cab236ccfbd0a17847b7f77f8163e/pydantic-2.11.1.tar.gz", hash = "sha256:442557d2910e75c991c39f4b4ab18963d57b9b55122c8b2a9cd176d8c29ce968", size = 782817 } wheels = [ - { url = "https://files.pythonhosted.org/packages/f4/3c/8cc1cc84deffa6e25d2d0c688ebb80635dfdbf1dbea3e30c541c8cf4d860/pydantic-2.10.6-py3-none-any.whl", hash = "sha256:427d664bf0b8a2b34ff5dd0f5a18df00591adcee7198fbd71981054cef37b584", size = 431696 }, + { url = "https://files.pythonhosted.org/packages/cc/12/f9221a949f2419e2e23847303c002476c26fbcfd62dc7f3d25d0bec5ca99/pydantic-2.11.1-py3-none-any.whl", hash = "sha256:5b6c415eee9f8123a14d859be0c84363fec6b1feb6b688d6435801230b56e0b8", size = 442648 }, ] [[package]] name = "pydantic-core" -version = "2.27.2" +version = "2.33.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/fc/01/f3e5ac5e7c25833db5eb555f7b7ab24cd6f8c322d3a3ad2d67a952dc0abc/pydantic_core-2.27.2.tar.gz", hash = "sha256:eb026e5a4c1fee05726072337ff51d1efb6f59090b7da90d30ea58625b1ffb39", size = 413443 } +sdist = { url = "https://files.pythonhosted.org/packages/b9/05/91ce14dfd5a3a99555fce436318cc0fd1f08c4daa32b3248ad63669ea8b4/pydantic_core-2.33.0.tar.gz", hash = "sha256:40eb8af662ba409c3cbf4a8150ad32ae73514cd7cb1f1a2113af39763dd616b3", size = 434080 } wheels = [ - { url = "https://files.pythonhosted.org/packages/41/b1/9bc383f48f8002f99104e3acff6cba1231b29ef76cfa45d1506a5cad1f84/pydantic_core-2.27.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:7d14bd329640e63852364c306f4d23eb744e0f8193148d4044dd3dacdaacbd8b", size = 1892709 }, - { url = "https://files.pythonhosted.org/packages/10/6c/e62b8657b834f3eb2961b49ec8e301eb99946245e70bf42c8817350cbefc/pydantic_core-2.27.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:82f91663004eb8ed30ff478d77c4d1179b3563df6cdb15c0817cd1cdaf34d154", size = 1811273 }, - { url = "https://files.pythonhosted.org/packages/ba/15/52cfe49c8c986e081b863b102d6b859d9defc63446b642ccbbb3742bf371/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71b24c7d61131bb83df10cc7e687433609963a944ccf45190cfc21e0887b08c9", size = 1823027 }, - { url = "https://files.pythonhosted.org/packages/b1/1c/b6f402cfc18ec0024120602bdbcebc7bdd5b856528c013bd4d13865ca473/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fa8e459d4954f608fa26116118bb67f56b93b209c39b008277ace29937453dc9", size = 1868888 }, - { url = "https://files.pythonhosted.org/packages/bd/7b/8cb75b66ac37bc2975a3b7de99f3c6f355fcc4d89820b61dffa8f1e81677/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce8918cbebc8da707ba805b7fd0b382816858728ae7fe19a942080c24e5b7cd1", size = 2037738 }, - { url = "https://files.pythonhosted.org/packages/c8/f1/786d8fe78970a06f61df22cba58e365ce304bf9b9f46cc71c8c424e0c334/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eda3f5c2a021bbc5d976107bb302e0131351c2ba54343f8a496dc8783d3d3a6a", size = 2685138 }, - { url = "https://files.pythonhosted.org/packages/a6/74/d12b2cd841d8724dc8ffb13fc5cef86566a53ed358103150209ecd5d1999/pydantic_core-2.27.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd8086fa684c4775c27f03f062cbb9eaa6e17f064307e86b21b9e0abc9c0f02e", size = 1997025 }, - { url = "https://files.pythonhosted.org/packages/a0/6e/940bcd631bc4d9a06c9539b51f070b66e8f370ed0933f392db6ff350d873/pydantic_core-2.27.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8d9b3388db186ba0c099a6d20f0604a44eabdeef1777ddd94786cdae158729e4", size = 2004633 }, - { url = "https://files.pythonhosted.org/packages/50/cc/a46b34f1708d82498c227d5d80ce615b2dd502ddcfd8376fc14a36655af1/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:7a66efda2387de898c8f38c0cf7f14fca0b51a8ef0b24bfea5849f1b3c95af27", size = 1999404 }, - { url = "https://files.pythonhosted.org/packages/ca/2d/c365cfa930ed23bc58c41463bae347d1005537dc8db79e998af8ba28d35e/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:18a101c168e4e092ab40dbc2503bdc0f62010e95d292b27827871dc85450d7ee", size = 2130130 }, - { url = "https://files.pythonhosted.org/packages/f4/d7/eb64d015c350b7cdb371145b54d96c919d4db516817f31cd1c650cae3b21/pydantic_core-2.27.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ba5dd002f88b78a4215ed2f8ddbdf85e8513382820ba15ad5ad8955ce0ca19a1", size = 2157946 }, - { url = "https://files.pythonhosted.org/packages/a4/99/bddde3ddde76c03b65dfd5a66ab436c4e58ffc42927d4ff1198ffbf96f5f/pydantic_core-2.27.2-cp313-cp313-win32.whl", hash = "sha256:1ebaf1d0481914d004a573394f4be3a7616334be70261007e47c2a6fe7e50130", size = 1834387 }, - { url = "https://files.pythonhosted.org/packages/71/47/82b5e846e01b26ac6f1893d3c5f9f3a2eb6ba79be26eef0b759b4fe72946/pydantic_core-2.27.2-cp313-cp313-win_amd64.whl", hash = "sha256:953101387ecf2f5652883208769a79e48db18c6df442568a0b5ccd8c2723abee", size = 1990453 }, - { url = "https://files.pythonhosted.org/packages/51/b2/b2b50d5ecf21acf870190ae5d093602d95f66c9c31f9d5de6062eb329ad1/pydantic_core-2.27.2-cp313-cp313-win_arm64.whl", hash = "sha256:ac4dbfd1691affb8f48c2c13241a2e3b60ff23247cbcf981759c768b6633cf8b", size = 1885186 }, + { url = "https://files.pythonhosted.org/packages/79/20/de2ad03ce8f5b3accf2196ea9b44f31b0cd16ac6e8cfc6b21976ed45ec35/pydantic_core-2.33.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:f00e8b59e1fc8f09d05594aa7d2b726f1b277ca6155fc84c0396db1b373c4555", size = 2032214 }, + { url = "https://files.pythonhosted.org/packages/f9/af/6817dfda9aac4958d8b516cbb94af507eb171c997ea66453d4d162ae8948/pydantic_core-2.33.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1a73be93ecef45786d7d95b0c5e9b294faf35629d03d5b145b09b81258c7cd6d", size = 1852338 }, + { url = "https://files.pythonhosted.org/packages/44/f3/49193a312d9c49314f2b953fb55740b7c530710977cabe7183b8ef111b7f/pydantic_core-2.33.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ff48a55be9da6930254565ff5238d71d5e9cd8c5487a191cb85df3bdb8c77365", size = 1896913 }, + { url = "https://files.pythonhosted.org/packages/06/e0/c746677825b2e29a2fa02122a8991c83cdd5b4c5f638f0664d4e35edd4b2/pydantic_core-2.33.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:26a4ea04195638dcd8c53dadb545d70badba51735b1594810e9768c2c0b4a5da", size = 1986046 }, + { url = "https://files.pythonhosted.org/packages/11/ec/44914e7ff78cef16afb5e5273d480c136725acd73d894affdbe2a1bbaad5/pydantic_core-2.33.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:41d698dcbe12b60661f0632b543dbb119e6ba088103b364ff65e951610cb7ce0", size = 2128097 }, + { url = "https://files.pythonhosted.org/packages/fe/f5/c6247d424d01f605ed2e3802f338691cae17137cee6484dce9f1ac0b872b/pydantic_core-2.33.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ae62032ef513fe6281ef0009e30838a01057b832dc265da32c10469622613885", size = 2681062 }, + { url = "https://files.pythonhosted.org/packages/f0/85/114a2113b126fdd7cf9a9443b1b1fe1b572e5bd259d50ba9d5d3e1927fa9/pydantic_core-2.33.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f225f3a3995dbbc26affc191d0443c6c4aa71b83358fd4c2b7d63e2f6f0336f9", size = 2007487 }, + { url = "https://files.pythonhosted.org/packages/e6/40/3c05ed28d225c7a9acd2b34c5c8010c279683a870219b97e9f164a5a8af0/pydantic_core-2.33.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5bdd36b362f419c78d09630cbaebc64913f66f62bda6d42d5fbb08da8cc4f181", size = 2121382 }, + { url = "https://files.pythonhosted.org/packages/8a/22/e70c086f41eebd323e6baa92cc906c3f38ddce7486007eb2bdb3b11c8f64/pydantic_core-2.33.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:2a0147c0bef783fd9abc9f016d66edb6cac466dc54a17ec5f5ada08ff65caf5d", size = 2072473 }, + { url = "https://files.pythonhosted.org/packages/3e/84/d1614dedd8fe5114f6a0e348bcd1535f97d76c038d6102f271433cd1361d/pydantic_core-2.33.0-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:c860773a0f205926172c6644c394e02c25421dc9a456deff16f64c0e299487d3", size = 2249468 }, + { url = "https://files.pythonhosted.org/packages/b0/c0/787061eef44135e00fddb4b56b387a06c303bfd3884a6df9bea5cb730230/pydantic_core-2.33.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:138d31e3f90087f42aa6286fb640f3c7a8eb7bdae829418265e7e7474bd2574b", size = 2254716 }, + { url = "https://files.pythonhosted.org/packages/ae/e2/27262eb04963201e89f9c280f1e10c493a7a37bc877e023f31aa72d2f911/pydantic_core-2.33.0-cp313-cp313-win32.whl", hash = "sha256:d20cbb9d3e95114325780f3cfe990f3ecae24de7a2d75f978783878cce2ad585", size = 1916450 }, + { url = "https://files.pythonhosted.org/packages/13/8d/25ff96f1e89b19e0b70b3cd607c9ea7ca27e1dcb810a9cd4255ed6abf869/pydantic_core-2.33.0-cp313-cp313-win_amd64.whl", hash = "sha256:ca1103d70306489e3d006b0f79db8ca5dd3c977f6f13b2c59ff745249431a606", size = 1956092 }, + { url = "https://files.pythonhosted.org/packages/1b/64/66a2efeff657b04323ffcd7b898cb0354d36dae3a561049e092134a83e9c/pydantic_core-2.33.0-cp313-cp313-win_arm64.whl", hash = "sha256:6291797cad239285275558e0a27872da735b05c75d5237bbade8736f80e4c225", size = 1908367 }, + { url = "https://files.pythonhosted.org/packages/52/54/295e38769133363d7ec4a5863a4d579f331728c71a6644ff1024ee529315/pydantic_core-2.33.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:7b79af799630af263eca9ec87db519426d8c9b3be35016eddad1832bac812d87", size = 1813331 }, + { url = "https://files.pythonhosted.org/packages/4c/9c/0c8ea02db8d682aa1ef48938abae833c1d69bdfa6e5ec13b21734b01ae70/pydantic_core-2.33.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eabf946a4739b5237f4f56d77fa6668263bc466d06a8036c055587c130a46f7b", size = 1986653 }, + { url = "https://files.pythonhosted.org/packages/8e/4f/3fb47d6cbc08c7e00f92300e64ba655428c05c56b8ab6723bd290bae6458/pydantic_core-2.33.0-cp313-cp313t-win_amd64.whl", hash = "sha256:8a1d581e8cdbb857b0e0e81df98603376c1a5c34dc5e54039dcc00f043df81e7", size = 1931234 }, ] [[package]] @@ -944,23 +1029,28 @@ wheels = [ ] [[package]] -name = "redpanda-agent" +name = "redpanda-agents" version = "0.1.0" source = { editable = "." } dependencies = [ + { name = "aiohttp" }, + { name = "grpcio" }, + { name = "grpcio-health-checking" }, { name = "litellm" }, { name = "mcp" }, + { name = "protobuf" }, { name = "pydantic" }, - { name = "pyright" }, { name = "websockets" }, ] [package.dev-dependencies] dev = [ + { name = "grpcio-tools" }, { name = "mkdocs" }, { name = "mkdocs-material" }, { name = "mkdocstrings", extra = ["python"] }, { name = "mypy" }, + { name = "mypy-protobuf" }, { name = "pyright" }, { name = "pytest" }, { name = "pytest-asyncio" }, @@ -969,19 +1059,24 @@ dev = [ [package.metadata] requires-dist = [ + { name = "aiohttp", specifier = ">=3.11.16" }, + { name = "grpcio", specifier = ">=1.71.0" }, + { name = "grpcio-health-checking", specifier = ">=1.71.0" }, { name = "litellm", specifier = ">=1.63.14" }, { name = "mcp", specifier = ">=1.5.0" }, + { name = "protobuf", specifier = ">=5.29.4" }, { name = "pydantic", specifier = ">=2.10.6" }, - { name = "pyright", specifier = ">=1.1.397" }, { name = "websockets", specifier = ">=15.0.1" }, ] [package.metadata.requires-dev] dev = [ + { name = "grpcio-tools", specifier = ">=1.71.0" }, { name = "mkdocs" }, { name = "mkdocs-material" }, { name = "mkdocstrings", extras = ["python"] }, { name = "mypy" }, + { name = "mypy-protobuf", specifier = ">=3.6.0" }, { name = "pyright" }, { name = "pytest" }, { name = "pytest-asyncio" }, @@ -1098,6 +1193,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d6/d4/dd813703af8a1e2ac33bf3feb27e8a5ad514c9f219df80c64d69807e7f71/ruff-0.11.2-py3-none-win_arm64.whl", hash = "sha256:52933095158ff328f4c77af3d74f0379e34fd52f175144cefc1b192e7ccd32b4", size = 10441990 }, ] +[[package]] +name = "setuptools" +version = "78.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a9/5a/0db4da3bc908df06e5efae42b44e75c81dd52716e10192ff36d0c1c8e379/setuptools-78.1.0.tar.gz", hash = "sha256:18fd474d4a82a5f83dac888df697af65afa82dec7323d09c3e37d1f14288da54", size = 1367827 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/21/f43f0a1fa8b06b32812e0975981f4677d28e0f3271601dc88ac5a5b83220/setuptools-78.1.0-py3-none-any.whl", hash = "sha256:3e386e96793c8702ae83d17b853fb93d3e09ef82ec62722e61da5cd22376dcd8", size = 1256108 }, +] + [[package]] name = "six" version = "1.17.0" @@ -1196,6 +1300,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2", size = 78540 }, ] +[[package]] +name = "types-protobuf" +version = "5.29.1.20250403" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/78/6d/62a2e73b966c77609560800004dd49a926920dd4976a9fdd86cf998e7048/types_protobuf-5.29.1.20250403.tar.gz", hash = "sha256:7ff44f15022119c9d7558ce16e78b2d485bf7040b4fadced4dd069bb5faf77a2", size = 59413 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/69/e3/b74dcc2797b21b39d5a4f08a8b08e20369b4ca250d718df7af41a60dd9f0/types_protobuf-5.29.1.20250403-py3-none-any.whl", hash = "sha256:c71de04106a2d54e5b2173d0a422058fae0ef2d058d70cf369fb797bf61ffa59", size = 73874 }, +] + [[package]] name = "typing-extensions" version = "4.13.0" @@ -1205,6 +1318,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e0/86/39b65d676ec5732de17b7e3c476e45bb80ec64eb50737a8dce1a4178aba1/typing_extensions-4.13.0-py3-none-any.whl", hash = "sha256:c8dd92cc0d6425a97c18fbb9d1954e5ff92c1ca881a309c45f06ebc0b79058e5", size = 45683 }, ] +[[package]] +name = "typing-inspection" +version = "0.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/82/5c/e6082df02e215b846b4b8c0b887a64d7d08ffaba30605502639d44c06b82/typing_inspection-0.4.0.tar.gz", hash = "sha256:9765c87de36671694a67904bf2c96e395be9c6439bb6c87b5142569dcdd65122", size = 76222 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/31/08/aa4fdfb71f7de5176385bd9e90852eaf6b5d622735020ad600f2bab54385/typing_inspection-0.4.0-py3-none-any.whl", hash = "sha256:50e72559fcd2a6367a19f7a7e610e6afcb9fac940c650290eed893d61386832f", size = 14125 }, +] + [[package]] name = "urllib3" version = "2.3.0"