From 5837c7aaea9bf3ff81dbf531536846fa0d698f90 Mon Sep 17 00:00:00 2001 From: ajspig Date: Thu, 15 Jan 2026 14:04:29 -0500 Subject: [PATCH] fix: more clean up --- examples/agno/python/.env.template | 25 -- examples/agno/python/README.md | 21 +- .../python/examples/multi_peer_example.py | 8 +- .../python/examples/multi_tool_example.py | 28 +- .../agno/python/examples/simple_example.py | 8 +- examples/agno/python/pyproject.toml | 8 +- examples/agno/python/src/honcho_agno/tools.py | 14 +- examples/agno/python/tests/test_tools.py | 416 ++++-------------- examples/agno/python/uv.lock | 137 ------ 9 files changed, 118 insertions(+), 547 deletions(-) delete mode 100644 examples/agno/python/.env.template diff --git a/examples/agno/python/.env.template b/examples/agno/python/.env.template deleted file mode 100644 index 0cd2e28b..00000000 --- a/examples/agno/python/.env.template +++ /dev/null @@ -1,25 +0,0 @@ -# Honcho Agno Integration Environment Variables -# Copy this file to .env and fill in the appropriate values - -# ============================================================================= -# OpenAI Settings (for Agno agent) -# ============================================================================= -# OpenAI API key - supports both naming conventions -OPENAI_API_KEY=your-openai-api-key-here -# LLM_OPENAI_API_KEY=your-openai-api-key-here # Alternative name - -# OpenAI model to use (default: gpt-4o) -# OPENAI_MODEL=gpt-4o - -# ============================================================================= -# Honcho Settings -# ============================================================================= -# Environment: 'local' or 'production' (default: production) -# Use 'local' for development with local Honcho server at localhost:8000 -HONCHO_ENVIRONMENT=local - -# API key for production Honcho (required if HONCHO_ENVIRONMENT=production) -# HONCHO_API_KEY=your-honcho-api-key-here - -# Workspace ID (optional, defaults to 'default') -# HONCHO_WORKSPACE_ID=my-workspace diff --git a/examples/agno/python/README.md b/examples/agno/python/README.md index 85048465..d98b23ee 100644 --- a/examples/agno/python/README.md +++ b/examples/agno/python/README.md @@ -59,9 +59,9 @@ The `HonchoTools` toolkit provides three memory tools: | Tool | Description | |------|-------------| -| `get_context` | Retrieve conversation context within token limits | -| `search_messages` | Semantic search through past messages | -| `chat` | Query Honcho for synthesized insights about the conversation | +| `honcho_get_context` | Retrieve conversation context within token limits | +| `honcho_search_messages` | Semantic search through past messages | +| `honcho_chat` | Query Honcho for synthesized insights about the conversation | ## Configuration @@ -114,34 +114,34 @@ Configure via `.env` file in the root honcho directory: ## Tool Details -### get_context +### honcho_get_context Retrieve recent conversation context. ```python -context = honcho_tools.get_context( +context = honcho_tools.honcho_get_context( tokens=2000, # Max tokens to include (optional) include_summary=True, # Include session summary (default: True) ) ``` -### search_messages +### honcho_search_messages Search through past messages semantically. ```python -results = honcho_tools.search_messages( +results = honcho_tools.honcho_search_messages( query="programming preferences", limit=10, # Max results (default: 10) ) ``` -### chat +### honcho_chat Ask questions about the conversation using Honcho's reasoning. ```python -insights = honcho_tools.chat( +insights = honcho_tools.honcho_chat( query="What programming languages does the user prefer?" ) ``` @@ -213,10 +213,7 @@ uv run pytest ### Run Examples -Examples require additional dependencies: - ```bash -uv sync --extra examples uv run python examples/simple_example.py ``` diff --git a/examples/agno/python/examples/multi_peer_example.py b/examples/agno/python/examples/multi_peer_example.py index afaa4245..ff6529e4 100644 --- a/examples/agno/python/examples/multi_peer_example.py +++ b/examples/agno/python/examples/multi_peer_example.py @@ -61,7 +61,7 @@ def create_advisory_session(session_id: str): instructions=[ "You're a successful tech entrepreneur who's been through YC and raised Series B.", "Everything is an opportunity to optimize, scale, or disrupt.", - "Use the chat tool to understand what the user is dealing with and what they care about.", + "Use the honcho_chat tool to understand what the user is dealing with and what they care about.", "Give advice through the lens of productivity, systems thinking, and growth hacking.", "Reference things like morning routines, cold plunges, biohacking, and 10x thinking.", "Be enthusiastic but genuine - you really believe this stuff works.", @@ -84,7 +84,7 @@ def create_advisory_session(session_id: str): instructions=[ "You're a calm, wise meditation teacher who's spent years studying ancient philosophy.", "Draw on Stoicism, Buddhism, Taoism, and other contemplative traditions.", - "Use the chat tool to understand the user's inner state and what they truly seek.", + "Use the honcho_chat tool to understand the user's inner state and what they truly seek.", "Gently guide toward presence, acceptance, and inner peace.", "Reference concepts like impermanence, the present moment, letting go, and wu wei.", "Offer a counterbalance to hustle culture - not everything needs to be optimized.", @@ -140,14 +140,14 @@ def main(): tech_response = tech_bro_agent.run(user_input) tech_content = str(tech_response.content) if tech_response.content else "" session.add_messages([tech_bro_tools.peer.message(tech_content)]) - print(f"🚀 Tech Bro: {tech_content}\n") + print(f"Tech Bro: {tech_content}\n") # Guru responds print("-" * 40) guru_response = guru_agent.run(user_input) guru_content = str(guru_response.content) if guru_response.content else "" session.add_messages([guru_tools.peer.message(guru_content)]) - print(f"🧘 Guru: {guru_content}\n") + print(f"Guru: {guru_content}\n") if __name__ == "__main__": diff --git a/examples/agno/python/examples/multi_tool_example.py b/examples/agno/python/examples/multi_tool_example.py index 7338e878..c532014d 100644 --- a/examples/agno/python/examples/multi_tool_example.py +++ b/examples/agno/python/examples/multi_tool_example.py @@ -2,11 +2,11 @@ Honcho Multi-Tool Example Demonstrates using Honcho tools with an Agno agent: -- chat: Ask questions about the conversation (recommended) -- get_context: Retrieve raw session context -- search_messages: Semantic search through messages +- honcho_chat: Ask questions about the conversation (recommended) +- honcho_get_context: Retrieve raw session context +- honcho_search_messages: Semantic search through messages -The chat tool is the recommended way to understand users +The honcho_chat tool is the recommended way to understand users It reasons over conversation context and provides synthesized insights. Environment Variables: @@ -73,12 +73,12 @@ def main(): tools=[honcho_tools], description=( "A travel planning expert with access to Honcho memory tools. " - "Use chat to understand the traveler's preferences and travel style." + "Use honcho_chat to understand the traveler's preferences and travel style." ), instructions=[ - "Use the chat tool to understand the user's preferences and travel style", + "Use the honcho_chat tool to understand the user's preferences and travel style", "Ask both broad and specific questions like 'What is their travel style?' or 'What is their budget?'", - "Only use get_context or search_messages if you need raw message history", + "Only use honcho_get_context or honcho_search_messages if you need raw message history", "Be specific and actionable in your recommendations", ], ) @@ -86,7 +86,7 @@ def main(): # Run the agent with a planning request print("Asking agent to create a personalized itinerary...\n") response = agent.run( - "Create a 3-day Tokyo itinerary for me. Use the chat tool to ask about " + "Create a 3-day Tokyo itinerary for me. Use the honcho_chat tool to ask about " "my budget, accommodation preferences, and interests, then create " "a personalized plan that matches my travel style." ) @@ -103,25 +103,25 @@ def main(): # Demonstrate chat (recommended) print("\n" + "=" * 70) - print("DIRECT TOOL USAGE: chat (recommended)") + print("DIRECT TOOL USAGE: honcho_chat (recommended)") print("=" * 70) - chat_result = honcho_tools.chat( + chat_result = honcho_tools.honcho_chat( "What are the traveler's key preferences and constraints?" ) print(chat_result) # Demonstrate search capability print("\n" + "=" * 70) - print("DIRECT TOOL USAGE: search_messages") + print("DIRECT TOOL USAGE: honcho_search_messages") print("=" * 70) - search_result = honcho_tools.search_messages("budget money cost", limit=5) + search_result = honcho_tools.honcho_search_messages("budget money cost", limit=5) print(search_result) # Show full conversation context print("\n" + "=" * 70) - print("DIRECT TOOL USAGE: get_context") + print("DIRECT TOOL USAGE: honcho_get_context") print("=" * 70) - print(honcho_tools.get_context()) + print(honcho_tools.honcho_get_context()) if __name__ == "__main__": diff --git a/examples/agno/python/examples/simple_example.py b/examples/agno/python/examples/simple_example.py index fc529951..ec23930b 100644 --- a/examples/agno/python/examples/simple_example.py +++ b/examples/agno/python/examples/simple_example.py @@ -47,8 +47,8 @@ def main(): tools=[honcho_tools], description="A programming mentor that remembers user interests and progress.", instructions=[ - "Use the chat tool to understand the user's preferences and interests", - "Use get_context if you need raw conversation history", + "Use the honcho_chat tool to understand the user's preferences and interests", + "Use honcho_get_context if you need raw conversation history", ], ) @@ -63,7 +63,7 @@ def main(): print("\nAsking the agent for recommendations...") response = agent.run( "Based on what you know about the user, what should they learn next? " - "Use the chat tool to understand their interests first." + "Use the honcho_chat tool to understand their interests first." ) # Save the assistant's response to Honcho @@ -80,7 +80,7 @@ def main(): print("\n" + "=" * 60) print("SESSION CONTEXT") print("=" * 60) - print(honcho_tools.get_context()) + print(honcho_tools.honcho_get_context()) if __name__ == "__main__": diff --git a/examples/agno/python/pyproject.toml b/examples/agno/python/pyproject.toml index 80673023..a8d592e6 100644 --- a/examples/agno/python/pyproject.toml +++ b/examples/agno/python/pyproject.toml @@ -35,13 +35,7 @@ classifiers = [ dependencies = [ "agno>=1.4.0", "honcho-ai>=1.6.0", -] - -[project.optional-dependencies] -examples = [ - "openai>=1.0.0", - "python-dotenv>=1.0.0", -] + ] [project.urls] Homepage = "https://honcho.dev" diff --git a/examples/agno/python/src/honcho_agno/tools.py b/examples/agno/python/src/honcho_agno/tools.py index 8f2c64c8..d2732e4f 100644 --- a/examples/agno/python/src/honcho_agno/tools.py +++ b/examples/agno/python/src/honcho_agno/tools.py @@ -91,12 +91,12 @@ class HonchoTools(Toolkit): # Create or get session self.session: Session = self.honcho.session(self.session_id) - # Register tools - self.register(self.get_context) - self.register(self.search_messages) - self.register(self.chat) + # Register tools with honcho_ prefix to avoid conflicts with other toolkits + self.register(self.honcho_get_context) + self.register(self.honcho_search_messages) + self.register(self.honcho_chat) - def get_context( + def honcho_get_context( self, tokens: int | None = None, include_summary: bool = True, @@ -122,7 +122,7 @@ class HonchoTools(Toolkit): logger.exception("Error retrieving context") return f"Error retrieving context: {e!s}" - def search_messages( + def honcho_search_messages( self, query: str, limit: int = 10, @@ -158,7 +158,7 @@ class HonchoTools(Toolkit): logger.exception("Error searching messages") return f"Error searching messages: {e!s}" - def chat(self, query: str) -> str: + def honcho_chat(self, query: str) -> str: """ Ask a question about what was discussed in this conversation. diff --git a/examples/agno/python/tests/test_tools.py b/examples/agno/python/tests/test_tools.py index ba262ec8..cfa4f696 100644 --- a/examples/agno/python/tests/test_tools.py +++ b/examples/agno/python/tests/test_tools.py @@ -1,373 +1,115 @@ """ Tests for Honcho Agno Tools -Tests the Agno-Honcho tool integration layer using real Honcho SDK. -Focuses on tool interface compliance and result formatting. - -Note: Each HonchoTools instance represents ONE agent identity (peer_id). -The toolkit provides read access; orchestration code handles message saving. +Simple tests verifying tool structure, registration, and initialization. +These tests use minimal mocking - just enough to avoid network calls. """ import uuid +from unittest.mock import MagicMock + +import pytest -from honcho import Honcho from honcho_agno import HonchoTools -class TestHonchoToolsInitialization: +@pytest.fixture +def mock_client(): + """Create a minimal mock Honcho client.""" + client = MagicMock() + client.peer.return_value = MagicMock() + client.session.return_value = MagicMock() + return client + + +class TestInitialization: """Tests for HonchoTools initialization.""" - def test_default_initialization(self): - """Test that toolkit initializes with default parameters.""" - tools = HonchoTools() + def test_initializes_with_client(self, mock_client): + """Test initialization with a provided client.""" + tools = HonchoTools( + peer_id="assistant", + session_id="test-session", + honcho_client=mock_client, + ) - assert tools is not None - assert tools.name == "honcho" - assert tools.honcho is not None - assert tools.session_id is not None + assert tools.honcho is mock_client + assert tools.peer_id == "assistant" + assert tools.session_id == "test-session" + + def test_default_peer_id(self, mock_client): + """Test default peer_id is 'assistant'.""" + tools = HonchoTools(honcho_client=mock_client) assert tools.peer_id == "assistant" - def test_custom_initialization(self): - """Test initialization with custom parameters.""" - custom_session = str(uuid.uuid4()) - tools = HonchoTools( - app_id="test-app", - peer_id="custom-agent", - session_id=custom_session, - ) - - assert tools.peer_id == "custom-agent" - assert tools.session_id == custom_session - - def test_session_auto_generation(self): - """Test that session_id is auto-generated if not provided.""" - tools = HonchoTools( - app_id="test-app", - peer_id="test-agent", - ) + def test_auto_generates_session_id(self, mock_client): + """Test session_id is auto-generated if not provided.""" + tools = HonchoTools(honcho_client=mock_client) assert tools.session_id is not None - # Should be a valid UUID format + # Should be valid UUID uuid.UUID(tools.session_id) - def test_toolkit_represents_single_peer(self): - """Test that toolkit has exactly one peer identity.""" - tools = HonchoTools(peer_id="my-agent") - - # Should have exactly one peer - assert tools.peer is not None - assert tools.peer_id == "my-agent" - # Should NOT have separate user/assistant peers - assert not hasattr(tools, "user") - assert not hasattr(tools, "assistant") - - def test_honcho_client_used_directly(self): - """Test that honcho_client is used when provided.""" - honcho = Honcho(workspace_id="client-workspace") - tools = HonchoTools( - app_id="ignored-app", # Ignored when honcho_client provided - peer_id="test-agent", - honcho_client=honcho, - ) - - # The client should be the one we passed - assert tools.honcho is honcho + def test_toolkit_name(self, mock_client): + """Test toolkit has correct name.""" + tools = HonchoTools(honcho_client=mock_client) + assert tools.name == "honcho" -class TestMultiPeerConversation: +class TestToolRegistration: + """Tests verifying tools are properly registered.""" + + def test_all_tools_registered(self, mock_client): + """Test all expected tools are registered.""" + tools = HonchoTools(honcho_client=mock_client) + + registered = [func.name for func in tools.functions.values()] + + assert "honcho_get_context" in registered + assert "honcho_search_messages" in registered + assert "honcho_chat" in registered + assert len(registered) == 3 + + def test_tools_are_callable(self, mock_client): + """Test tool methods exist and are callable.""" + tools = HonchoTools(honcho_client=mock_client) + + assert callable(tools.honcho_get_context) + assert callable(tools.honcho_search_messages) + assert callable(tools.honcho_chat) + + +class TestMultiPeerPattern: """Tests for multi-peer conversation patterns.""" - def test_multiple_toolkits_same_session(self): - """Test multiple toolkits (agents) sharing a session.""" - session_id = f"shared-session-{uuid.uuid4().hex[:8]}" - honcho = Honcho(workspace_id="test-app") + def test_multiple_toolkits_share_session(self, mock_client): + """Test multiple toolkits can share a session ID.""" + session_id = "shared-session" - # Two agents with different identities - agent1_tools = HonchoTools( - app_id="test-app", + agent1 = HonchoTools( peer_id="agent-alpha", session_id=session_id, - honcho_client=honcho, + honcho_client=mock_client, ) - agent2_tools = HonchoTools( - app_id="test-app", + agent2 = HonchoTools( peer_id="agent-beta", session_id=session_id, - honcho_client=honcho, + honcho_client=mock_client, ) - # Both should share the same session - assert agent1_tools.session_id == agent2_tools.session_id - # But have different peer identities - assert agent1_tools.peer_id != agent2_tools.peer_id + assert agent1.session_id == agent2.session_id + assert agent1.peer_id != agent2.peer_id - def test_messages_added_via_orchestration(self): - """Test that messages are added via session, not toolkit methods.""" - session_id = f"orch-session-{uuid.uuid4().hex[:8]}" - honcho = Honcho(workspace_id="test-app") - - # Create toolkit + def test_each_toolkit_has_one_peer(self, mock_client): + """Test each toolkit represents exactly one peer.""" tools = HonchoTools( - app_id="test-app", - peer_id="assistant", - session_id=session_id, - honcho_client=honcho, + peer_id="my-agent", + honcho_client=mock_client, ) - # User messages added directly via Honcho (orchestration pattern) - user_peer = honcho.peer("user") - tools.session.add_messages([user_peer.message("Hello from user")]) - - # Agent messages also added via orchestration - tools.session.add_messages([tools.peer.message("Hello from assistant")]) - - # Context should show both messages - context = tools.get_context() - assert isinstance(context, str) - - -class TestGetContext: - """Tests for get_context tool.""" - - def test_get_empty_context(self): - """Test getting context from empty session.""" - tools = HonchoTools( - app_id="test-app", - peer_id=f"agent-{uuid.uuid4().hex[:8]}", - session_id=f"empty-session-{uuid.uuid4().hex[:8]}", - ) - - result = tools.get_context() - - assert isinstance(result, str) - - def test_get_context_with_messages(self): - """Test getting context after adding messages.""" - session_id = f"context-session-{uuid.uuid4().hex[:8]}" - honcho = Honcho(workspace_id="test-app") - - tools = HonchoTools( - app_id="test-app", - peer_id="assistant", - session_id=session_id, - honcho_client=honcho, - ) - - # Add messages via orchestration - user = honcho.peer("user") - tools.session.add_messages([ - user.message("I like pizza"), - tools.peer.message("Great choice!"), - ]) - - result = tools.get_context() - - assert isinstance(result, str) - assert len(result) > 0 - - def test_get_context_with_token_limit(self): - """Test getting context with token limit.""" - session_id = f"token-session-{uuid.uuid4().hex[:8]}" - honcho = Honcho(workspace_id="test-app") - - tools = HonchoTools( - app_id="test-app", - peer_id="assistant", - session_id=session_id, - honcho_client=honcho, - ) - - tools.session.add_messages([tools.peer.message("This is a test message")]) - - result = tools.get_context(tokens=1000) - - assert isinstance(result, str) - - def test_get_context_without_summary(self): - """Test getting context without summary.""" - session_id = f"nosummary-session-{uuid.uuid4().hex[:8]}" - honcho = Honcho(workspace_id="test-app") - - tools = HonchoTools( - app_id="test-app", - peer_id="assistant", - session_id=session_id, - honcho_client=honcho, - ) - - tools.session.add_messages([tools.peer.message("Test message")]) - - result = tools.get_context(include_summary=False) - - assert isinstance(result, str) - - -class TestSearchMessages: - """Tests for search_messages tool.""" - - def test_search_returns_formatted_string(self): - """Test that search returns formatted results.""" - session_id = f"search-session-{uuid.uuid4().hex[:8]}" - honcho = Honcho(workspace_id="test-app") - - tools = HonchoTools( - app_id="test-app", - peer_id="assistant", - session_id=session_id, - honcho_client=honcho, - ) - - # Add searchable content - tools.session.add_messages([ - tools.peer.message("I enjoy Python programming and data science") - ]) - - result = tools.search_messages("programming", limit=5) - - assert isinstance(result, str) - assert "Search Results" in result or "No messages found" in result - - def test_search_with_limit(self): - """Test search with custom limit.""" - session_id = f"search-limit-session-{uuid.uuid4().hex[:8]}" - honcho = Honcho(workspace_id="test-app") - - tools = HonchoTools( - app_id="test-app", - peer_id="assistant", - session_id=session_id, - honcho_client=honcho, - ) - - # Add multiple messages - messages = [tools.peer.message(f"Test message number {i} about coding") for i in range(5)] - tools.session.add_messages(messages) - - result = tools.search_messages("coding", limit=3) - - assert isinstance(result, str) - - def test_search_no_results(self): - """Test search with no matching results.""" - tools = HonchoTools( - app_id="test-app", - peer_id=f"agent-{uuid.uuid4().hex[:8]}", - session_id=f"search-empty-session-{uuid.uuid4().hex[:8]}", - ) - - result = tools.search_messages("xyznonexistent123abcdef", limit=5) - - assert isinstance(result, str) - # Should indicate no results found - assert "No messages found" in result or "0 found" in result.lower() - - -class TestChat: - """Tests for chat tool.""" - - def test_chat_returns_response(self): - """Test that chat returns a response string.""" - session_id = f"chat-session-{uuid.uuid4().hex[:8]}" - honcho = Honcho(workspace_id="test-app") - - tools = HonchoTools( - app_id="test-app", - peer_id="assistant", - session_id=session_id, - honcho_client=honcho, - ) - - # Add context first - user = honcho.peer("user") - tools.session.add_messages([ - user.message("The user loves hiking and outdoor activities"), - user.message("They also enjoy photography"), - ]) - - result = tools.chat("What does this person enjoy?") - - assert isinstance(result, str) - assert len(result) > 0 - - def test_chat_without_context(self): - """Test chat with minimal context.""" - tools = HonchoTools( - app_id="test-app", - peer_id=f"agent-{uuid.uuid4().hex[:8]}", - session_id=f"chat-empty-session-{uuid.uuid4().hex[:8]}", - ) - - result = tools.chat("What are the user's preferences?") - - assert isinstance(result, str) - - -class TestToolsIntegration: - """Integration tests for all tools working together.""" - - def test_all_tools_in_sequence(self): - """Test using all tools in a realistic sequence.""" - session_id = f"integration-session-{uuid.uuid4().hex[:8]}" - honcho = Honcho(workspace_id="test-app") - - tools = HonchoTools( - app_id="test-app", - peer_id="assistant", - session_id=session_id, - honcho_client=honcho, - ) - - # Add message via orchestration - user = honcho.peer("user") - tools.session.add_messages([ - user.message("I'm interested in AI and machine learning") - ]) - - # Get context - context_result = tools.get_context() - assert isinstance(context_result, str) - - # Search messages - search_result = tools.search_messages("AI", limit=10) - assert isinstance(search_result, str) - - # Chat - chat_result = tools.chat("What topics are mentioned?") - assert isinstance(chat_result, str) - - def test_multi_agent_conversation(self): - """Test realistic multi-agent conversation.""" - session_id = f"multi-agent-{uuid.uuid4().hex[:8]}" - honcho = Honcho(workspace_id="test-app") - - # User peer managed directly - session = honcho.session(session_id) - user = honcho.peer("user") - - # Two agent toolkits - tech_agent = HonchoTools( - app_id="test-app", - peer_id="tech-advisor", - session_id=session_id, - honcho_client=honcho, - ) - - biz_agent = HonchoTools( - app_id="test-app", - peer_id="business-advisor", - session_id=session_id, - honcho_client=honcho, - ) - - # Conversation flow via orchestration - session.add_messages([user.message("I want to build a SaaS product")]) - session.add_messages([tech_agent.peer.message("Consider microservices architecture")]) - session.add_messages([biz_agent.peer.message("Focus on a niche market first")]) - - # Both agents can see full context - tech_context = tech_agent.get_context() - biz_context = biz_agent.get_context() - - assert isinstance(tech_context, str) - assert isinstance(biz_context, str) + assert tools.peer is not None + assert tools.peer_id == "my-agent" + # Should not have multiple peer attributes + assert not hasattr(tools, "user") + assert not hasattr(tools, "assistant_peer") diff --git a/examples/agno/python/uv.lock b/examples/agno/python/uv.lock index 5f0dee82..f1059c1b 100644 --- a/examples/agno/python/uv.lock +++ b/examples/agno/python/uv.lock @@ -176,12 +176,6 @@ dependencies = [ { name = "honcho-ai" }, ] -[package.optional-dependencies] -examples = [ - { name = "openai" }, - { name = "python-dotenv" }, -] - [package.dev-dependencies] dev = [ { name = "basedpyright" }, @@ -192,10 +186,7 @@ dev = [ requires-dist = [ { name = "agno", specifier = ">=1.4.0" }, { name = "honcho-ai", specifier = ">=1.6.0" }, - { name = "openai", marker = "extra == 'examples'", specifier = ">=1.0.0" }, - { name = "python-dotenv", marker = "extra == 'examples'", specifier = ">=1.0.0" }, ] -provides-extras = ["examples"] [package.metadata.requires-dev] dev = [ @@ -303,103 +294,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, ] -[[package]] -name = "jiter" -version = "0.12.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/45/9d/e0660989c1370e25848bb4c52d061c71837239738ad937e83edca174c273/jiter-0.12.0.tar.gz", hash = "sha256:64dfcd7d5c168b38d3f9f8bba7fc639edb3418abcc74f22fdbe6b8938293f30b", size = 168294, upload-time = "2025-11-09T20:49:23.302Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3b/91/13cb9505f7be74a933f37da3af22e029f6ba64f5669416cb8b2774bc9682/jiter-0.12.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:e7acbaba9703d5de82a2c98ae6a0f59ab9770ab5af5fa35e43a303aee962cf65", size = 316652, upload-time = "2025-11-09T20:46:41.021Z" }, - { url = "https://files.pythonhosted.org/packages/4e/76/4e9185e5d9bb4e482cf6dec6410d5f78dfeb374cfcecbbe9888d07c52daa/jiter-0.12.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:364f1a7294c91281260364222f535bc427f56d4de1d8ffd718162d21fbbd602e", size = 319829, upload-time = "2025-11-09T20:46:43.281Z" }, - { url = "https://files.pythonhosted.org/packages/86/af/727de50995d3a153138139f259baae2379d8cb0522c0c00419957bc478a6/jiter-0.12.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85ee4d25805d4fb23f0a5167a962ef8e002dbfb29c0989378488e32cf2744b62", size = 350568, upload-time = "2025-11-09T20:46:45.075Z" }, - { url = "https://files.pythonhosted.org/packages/6a/c1/d6e9f4b7a3d5ac63bcbdfddeb50b2dcfbdc512c86cffc008584fdc350233/jiter-0.12.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:796f466b7942107eb889c08433b6e31b9a7ed31daceaecf8af1be26fb26c0ca8", size = 369052, upload-time = "2025-11-09T20:46:46.818Z" }, - { url = "https://files.pythonhosted.org/packages/eb/be/00824cd530f30ed73fa8a4f9f3890a705519e31ccb9e929f1e22062e7c76/jiter-0.12.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:35506cb71f47dba416694e67af996bbdefb8e3608f1f78799c2e1f9058b01ceb", size = 481585, upload-time = "2025-11-09T20:46:48.319Z" }, - { url = "https://files.pythonhosted.org/packages/74/b6/2ad7990dff9504d4b5052eef64aa9574bd03d722dc7edced97aad0d47be7/jiter-0.12.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:726c764a90c9218ec9e4f99a33d6bf5ec169163f2ca0fc21b654e88c2abc0abc", size = 380541, upload-time = "2025-11-09T20:46:49.643Z" }, - { url = "https://files.pythonhosted.org/packages/b5/c7/f3c26ecbc1adbf1db0d6bba99192143d8fe8504729d9594542ecc4445784/jiter-0.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa47810c5565274810b726b0dc86d18dce5fd17b190ebdc3890851d7b2a0e74", size = 364423, upload-time = "2025-11-09T20:46:51.731Z" }, - { url = "https://files.pythonhosted.org/packages/18/51/eac547bf3a2d7f7e556927278e14c56a0604b8cddae75815d5739f65f81d/jiter-0.12.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f8ec0259d3f26c62aed4d73b198c53e316ae11f0f69c8fbe6682c6dcfa0fcce2", size = 389958, upload-time = "2025-11-09T20:46:53.432Z" }, - { url = "https://files.pythonhosted.org/packages/2c/1f/9ca592e67175f2db156cff035e0d817d6004e293ee0c1d73692d38fcb596/jiter-0.12.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:79307d74ea83465b0152fa23e5e297149506435535282f979f18b9033c0bb025", size = 522084, upload-time = "2025-11-09T20:46:54.848Z" }, - { url = "https://files.pythonhosted.org/packages/83/ff/597d9cdc3028f28224f53e1a9d063628e28b7a5601433e3196edda578cdd/jiter-0.12.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cf6e6dd18927121fec86739f1a8906944703941d000f0639f3eb6281cc601dca", size = 513054, upload-time = "2025-11-09T20:46:56.487Z" }, - { url = "https://files.pythonhosted.org/packages/24/6d/1970bce1351bd02e3afcc5f49e4f7ef3dabd7fb688f42be7e8091a5b809a/jiter-0.12.0-cp310-cp310-win32.whl", hash = "sha256:b6ae2aec8217327d872cbfb2c1694489057b9433afce447955763e6ab015b4c4", size = 206368, upload-time = "2025-11-09T20:46:58.638Z" }, - { url = "https://files.pythonhosted.org/packages/e3/6b/eb1eb505b2d86709b59ec06681a2b14a94d0941db091f044b9f0e16badc0/jiter-0.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:c7f49ce90a71e44f7e1aa9e7ec415b9686bbc6a5961e57eab511015e6759bc11", size = 204847, upload-time = "2025-11-09T20:47:00.295Z" }, - { url = "https://files.pythonhosted.org/packages/32/f9/eaca4633486b527ebe7e681c431f529b63fe2709e7c5242fc0f43f77ce63/jiter-0.12.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d8f8a7e317190b2c2d60eb2e8aa835270b008139562d70fe732e1c0020ec53c9", size = 316435, upload-time = "2025-11-09T20:47:02.087Z" }, - { url = "https://files.pythonhosted.org/packages/10/c1/40c9f7c22f5e6ff715f28113ebaba27ab85f9af2660ad6e1dd6425d14c19/jiter-0.12.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2218228a077e784c6c8f1a8e5d6b8cb1dea62ce25811c356364848554b2056cd", size = 320548, upload-time = "2025-11-09T20:47:03.409Z" }, - { url = "https://files.pythonhosted.org/packages/6b/1b/efbb68fe87e7711b00d2cfd1f26bb4bfc25a10539aefeaa7727329ffb9cb/jiter-0.12.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9354ccaa2982bf2188fd5f57f79f800ef622ec67beb8329903abf6b10da7d423", size = 351915, upload-time = "2025-11-09T20:47:05.171Z" }, - { url = "https://files.pythonhosted.org/packages/15/2d/c06e659888c128ad1e838123d0638f0efad90cc30860cb5f74dd3f2fc0b3/jiter-0.12.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8f2607185ea89b4af9a604d4c7ec40e45d3ad03ee66998b031134bc510232bb7", size = 368966, upload-time = "2025-11-09T20:47:06.508Z" }, - { url = "https://files.pythonhosted.org/packages/6b/20/058db4ae5fb07cf6a4ab2e9b9294416f606d8e467fb74c2184b2a1eeacba/jiter-0.12.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3a585a5e42d25f2e71db5f10b171f5e5ea641d3aa44f7df745aa965606111cc2", size = 482047, upload-time = "2025-11-09T20:47:08.382Z" }, - { url = "https://files.pythonhosted.org/packages/49/bb/dc2b1c122275e1de2eb12905015d61e8316b2f888bdaac34221c301495d6/jiter-0.12.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bd9e21d34edff5a663c631f850edcb786719c960ce887a5661e9c828a53a95d9", size = 380835, upload-time = "2025-11-09T20:47:09.81Z" }, - { url = "https://files.pythonhosted.org/packages/23/7d/38f9cd337575349de16da575ee57ddb2d5a64d425c9367f5ef9e4612e32e/jiter-0.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a612534770470686cd5431478dc5a1b660eceb410abade6b1b74e320ca98de6", size = 364587, upload-time = "2025-11-09T20:47:11.529Z" }, - { url = "https://files.pythonhosted.org/packages/f0/a3/b13e8e61e70f0bb06085099c4e2462647f53cc2ca97614f7fedcaa2bb9f3/jiter-0.12.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3985aea37d40a908f887b34d05111e0aae822943796ebf8338877fee2ab67725", size = 390492, upload-time = "2025-11-09T20:47:12.993Z" }, - { url = "https://files.pythonhosted.org/packages/07/71/e0d11422ed027e21422f7bc1883c61deba2d9752b720538430c1deadfbca/jiter-0.12.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b1207af186495f48f72529f8d86671903c8c10127cac6381b11dddc4aaa52df6", size = 522046, upload-time = "2025-11-09T20:47:14.6Z" }, - { url = "https://files.pythonhosted.org/packages/9f/59/b968a9aa7102a8375dbbdfbd2aeebe563c7e5dddf0f47c9ef1588a97e224/jiter-0.12.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ef2fb241de583934c9915a33120ecc06d94aa3381a134570f59eed784e87001e", size = 513392, upload-time = "2025-11-09T20:47:16.011Z" }, - { url = "https://files.pythonhosted.org/packages/ca/e4/7df62002499080dbd61b505c5cb351aa09e9959d176cac2aa8da6f93b13b/jiter-0.12.0-cp311-cp311-win32.whl", hash = "sha256:453b6035672fecce8007465896a25b28a6b59cfe8fbc974b2563a92f5a92a67c", size = 206096, upload-time = "2025-11-09T20:47:17.344Z" }, - { url = "https://files.pythonhosted.org/packages/bb/60/1032b30ae0572196b0de0e87dce3b6c26a1eff71aad5fe43dee3082d32e0/jiter-0.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:ca264b9603973c2ad9435c71a8ec8b49f8f715ab5ba421c85a51cde9887e421f", size = 204899, upload-time = "2025-11-09T20:47:19.365Z" }, - { url = "https://files.pythonhosted.org/packages/49/d5/c145e526fccdb834063fb45c071df78b0cc426bbaf6de38b0781f45d956f/jiter-0.12.0-cp311-cp311-win_arm64.whl", hash = "sha256:cb00ef392e7d684f2754598c02c409f376ddcef857aae796d559e6cacc2d78a5", size = 188070, upload-time = "2025-11-09T20:47:20.75Z" }, - { url = "https://files.pythonhosted.org/packages/92/c9/5b9f7b4983f1b542c64e84165075335e8a236fa9e2ea03a0c79780062be8/jiter-0.12.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:305e061fa82f4680607a775b2e8e0bcb071cd2205ac38e6ef48c8dd5ebe1cf37", size = 314449, upload-time = "2025-11-09T20:47:22.999Z" }, - { url = "https://files.pythonhosted.org/packages/98/6e/e8efa0e78de00db0aee82c0cf9e8b3f2027efd7f8a71f859d8f4be8e98ef/jiter-0.12.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5c1860627048e302a528333c9307c818c547f214d8659b0705d2195e1a94b274", size = 319855, upload-time = "2025-11-09T20:47:24.779Z" }, - { url = "https://files.pythonhosted.org/packages/20/26/894cd88e60b5d58af53bec5c6759d1292bd0b37a8b5f60f07abf7a63ae5f/jiter-0.12.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df37577a4f8408f7e0ec3205d2a8f87672af8f17008358063a4d6425b6081ce3", size = 350171, upload-time = "2025-11-09T20:47:26.469Z" }, - { url = "https://files.pythonhosted.org/packages/f5/27/a7b818b9979ac31b3763d25f3653ec3a954044d5e9f5d87f2f247d679fd1/jiter-0.12.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:75fdd787356c1c13a4f40b43c2156276ef7a71eb487d98472476476d803fb2cf", size = 365590, upload-time = "2025-11-09T20:47:27.918Z" }, - { url = "https://files.pythonhosted.org/packages/ba/7e/e46195801a97673a83746170b17984aa8ac4a455746354516d02ca5541b4/jiter-0.12.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1eb5db8d9c65b112aacf14fcd0faae9913d07a8afea5ed06ccdd12b724e966a1", size = 479462, upload-time = "2025-11-09T20:47:29.654Z" }, - { url = "https://files.pythonhosted.org/packages/ca/75/f833bfb009ab4bd11b1c9406d333e3b4357709ed0570bb48c7c06d78c7dd/jiter-0.12.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:73c568cc27c473f82480abc15d1301adf333a7ea4f2e813d6a2c7d8b6ba8d0df", size = 378983, upload-time = "2025-11-09T20:47:31.026Z" }, - { url = "https://files.pythonhosted.org/packages/71/b3/7a69d77943cc837d30165643db753471aff5df39692d598da880a6e51c24/jiter-0.12.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4321e8a3d868919bcb1abb1db550d41f2b5b326f72df29e53b2df8b006eb9403", size = 361328, upload-time = "2025-11-09T20:47:33.286Z" }, - { url = "https://files.pythonhosted.org/packages/b0/ac/a78f90caf48d65ba70d8c6efc6f23150bc39dc3389d65bbec2a95c7bc628/jiter-0.12.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0a51bad79f8cc9cac2b4b705039f814049142e0050f30d91695a2d9a6611f126", size = 386740, upload-time = "2025-11-09T20:47:34.703Z" }, - { url = "https://files.pythonhosted.org/packages/39/b6/5d31c2cc8e1b6a6bcf3c5721e4ca0a3633d1ab4754b09bc7084f6c4f5327/jiter-0.12.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:2a67b678f6a5f1dd6c36d642d7db83e456bc8b104788262aaefc11a22339f5a9", size = 520875, upload-time = "2025-11-09T20:47:36.058Z" }, - { url = "https://files.pythonhosted.org/packages/30/b5/4df540fae4e9f68c54b8dab004bd8c943a752f0b00efd6e7d64aa3850339/jiter-0.12.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efe1a211fe1fd14762adea941e3cfd6c611a136e28da6c39272dbb7a1bbe6a86", size = 511457, upload-time = "2025-11-09T20:47:37.932Z" }, - { url = "https://files.pythonhosted.org/packages/07/65/86b74010e450a1a77b2c1aabb91d4a91dd3cd5afce99f34d75fd1ac64b19/jiter-0.12.0-cp312-cp312-win32.whl", hash = "sha256:d779d97c834b4278276ec703dc3fc1735fca50af63eb7262f05bdb4e62203d44", size = 204546, upload-time = "2025-11-09T20:47:40.47Z" }, - { url = "https://files.pythonhosted.org/packages/1c/c7/6659f537f9562d963488e3e55573498a442503ced01f7e169e96a6110383/jiter-0.12.0-cp312-cp312-win_amd64.whl", hash = "sha256:e8269062060212b373316fe69236096aaf4c49022d267c6736eebd66bbbc60bb", size = 205196, upload-time = "2025-11-09T20:47:41.794Z" }, - { url = "https://files.pythonhosted.org/packages/21/f4/935304f5169edadfec7f9c01eacbce4c90bb9a82035ac1de1f3bd2d40be6/jiter-0.12.0-cp312-cp312-win_arm64.whl", hash = "sha256:06cb970936c65de926d648af0ed3d21857f026b1cf5525cb2947aa5e01e05789", size = 186100, upload-time = "2025-11-09T20:47:43.007Z" }, - { url = "https://files.pythonhosted.org/packages/3d/a6/97209693b177716e22576ee1161674d1d58029eb178e01866a0422b69224/jiter-0.12.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:6cc49d5130a14b732e0612bc76ae8db3b49898732223ef8b7599aa8d9810683e", size = 313658, upload-time = "2025-11-09T20:47:44.424Z" }, - { url = "https://files.pythonhosted.org/packages/06/4d/125c5c1537c7d8ee73ad3d530a442d6c619714b95027143f1b61c0b4dfe0/jiter-0.12.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:37f27a32ce36364d2fa4f7fdc507279db604d27d239ea2e044c8f148410defe1", size = 318605, upload-time = "2025-11-09T20:47:45.973Z" }, - { url = "https://files.pythonhosted.org/packages/99/bf/a840b89847885064c41a5f52de6e312e91fa84a520848ee56c97e4fa0205/jiter-0.12.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbc0944aa3d4b4773e348cda635252824a78f4ba44328e042ef1ff3f6080d1cf", size = 349803, upload-time = "2025-11-09T20:47:47.535Z" }, - { url = "https://files.pythonhosted.org/packages/8a/88/e63441c28e0db50e305ae23e19c1d8fae012d78ed55365da392c1f34b09c/jiter-0.12.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:da25c62d4ee1ffbacb97fac6dfe4dcd6759ebdc9015991e92a6eae5816287f44", size = 365120, upload-time = "2025-11-09T20:47:49.284Z" }, - { url = "https://files.pythonhosted.org/packages/0a/7c/49b02714af4343970eb8aca63396bc1c82fa01197dbb1e9b0d274b550d4e/jiter-0.12.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:048485c654b838140b007390b8182ba9774621103bd4d77c9c3f6f117474ba45", size = 479918, upload-time = "2025-11-09T20:47:50.807Z" }, - { url = "https://files.pythonhosted.org/packages/69/ba/0a809817fdd5a1db80490b9150645f3aae16afad166960bcd562be194f3b/jiter-0.12.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:635e737fbb7315bef0037c19b88b799143d2d7d3507e61a76751025226b3ac87", size = 379008, upload-time = "2025-11-09T20:47:52.211Z" }, - { url = "https://files.pythonhosted.org/packages/5f/c3/c9fc0232e736c8877d9e6d83d6eeb0ba4e90c6c073835cc2e8f73fdeef51/jiter-0.12.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e017c417b1ebda911bd13b1e40612704b1f5420e30695112efdbed8a4b389ed", size = 361785, upload-time = "2025-11-09T20:47:53.512Z" }, - { url = "https://files.pythonhosted.org/packages/96/61/61f69b7e442e97ca6cd53086ddc1cf59fb830549bc72c0a293713a60c525/jiter-0.12.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:89b0bfb8b2bf2351fba36bb211ef8bfceba73ef58e7f0c68fb67b5a2795ca2f9", size = 386108, upload-time = "2025-11-09T20:47:54.893Z" }, - { url = "https://files.pythonhosted.org/packages/e9/2e/76bb3332f28550c8f1eba3bf6e5efe211efda0ddbbaf24976bc7078d42a5/jiter-0.12.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:f5aa5427a629a824a543672778c9ce0c5e556550d1569bb6ea28a85015287626", size = 519937, upload-time = "2025-11-09T20:47:56.253Z" }, - { url = "https://files.pythonhosted.org/packages/84/d6/fa96efa87dc8bff2094fb947f51f66368fa56d8d4fc9e77b25d7fbb23375/jiter-0.12.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ed53b3d6acbcb0fd0b90f20c7cb3b24c357fe82a3518934d4edfa8c6898e498c", size = 510853, upload-time = "2025-11-09T20:47:58.32Z" }, - { url = "https://files.pythonhosted.org/packages/8a/28/93f67fdb4d5904a708119a6ab58a8f1ec226ff10a94a282e0215402a8462/jiter-0.12.0-cp313-cp313-win32.whl", hash = "sha256:4747de73d6b8c78f2e253a2787930f4fffc68da7fa319739f57437f95963c4de", size = 204699, upload-time = "2025-11-09T20:47:59.686Z" }, - { url = "https://files.pythonhosted.org/packages/c4/1f/30b0eb087045a0abe2a5c9c0c0c8da110875a1d3be83afd4a9a4e548be3c/jiter-0.12.0-cp313-cp313-win_amd64.whl", hash = "sha256:e25012eb0c456fcc13354255d0338cd5397cce26c77b2832b3c4e2e255ea5d9a", size = 204258, upload-time = "2025-11-09T20:48:01.01Z" }, - { url = "https://files.pythonhosted.org/packages/2c/f4/2b4daf99b96bce6fc47971890b14b2a36aef88d7beb9f057fafa032c6141/jiter-0.12.0-cp313-cp313-win_arm64.whl", hash = "sha256:c97b92c54fe6110138c872add030a1f99aea2401ddcdaa21edf74705a646dd60", size = 185503, upload-time = "2025-11-09T20:48:02.35Z" }, - { url = "https://files.pythonhosted.org/packages/39/ca/67bb15a7061d6fe20b9b2a2fd783e296a1e0f93468252c093481a2f00efa/jiter-0.12.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:53839b35a38f56b8be26a7851a48b89bc47e5d88e900929df10ed93b95fea3d6", size = 317965, upload-time = "2025-11-09T20:48:03.783Z" }, - { url = "https://files.pythonhosted.org/packages/18/af/1788031cd22e29c3b14bc6ca80b16a39a0b10e611367ffd480c06a259831/jiter-0.12.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94f669548e55c91ab47fef8bddd9c954dab1938644e715ea49d7e117015110a4", size = 345831, upload-time = "2025-11-09T20:48:05.55Z" }, - { url = "https://files.pythonhosted.org/packages/05/17/710bf8472d1dff0d3caf4ced6031060091c1320f84ee7d5dcbed1f352417/jiter-0.12.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:351d54f2b09a41600ffea43d081522d792e81dcfb915f6d2d242744c1cc48beb", size = 361272, upload-time = "2025-11-09T20:48:06.951Z" }, - { url = "https://files.pythonhosted.org/packages/fb/f1/1dcc4618b59761fef92d10bcbb0b038b5160be653b003651566a185f1a5c/jiter-0.12.0-cp313-cp313t-win_amd64.whl", hash = "sha256:2a5e90604620f94bf62264e7c2c038704d38217b7465b863896c6d7c902b06c7", size = 204604, upload-time = "2025-11-09T20:48:08.328Z" }, - { url = "https://files.pythonhosted.org/packages/d9/32/63cb1d9f1c5c6632a783c0052cde9ef7ba82688f7065e2f0d5f10a7e3edb/jiter-0.12.0-cp313-cp313t-win_arm64.whl", hash = "sha256:88ef757017e78d2860f96250f9393b7b577b06a956ad102c29c8237554380db3", size = 185628, upload-time = "2025-11-09T20:48:09.572Z" }, - { url = "https://files.pythonhosted.org/packages/a8/99/45c9f0dbe4a1416b2b9a8a6d1236459540f43d7fb8883cff769a8db0612d/jiter-0.12.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:c46d927acd09c67a9fb1416df45c5a04c27e83aae969267e98fba35b74e99525", size = 312478, upload-time = "2025-11-09T20:48:10.898Z" }, - { url = "https://files.pythonhosted.org/packages/4c/a7/54ae75613ba9e0f55fcb0bc5d1f807823b5167cc944e9333ff322e9f07dd/jiter-0.12.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:774ff60b27a84a85b27b88cd5583899c59940bcc126caca97eb2a9df6aa00c49", size = 318706, upload-time = "2025-11-09T20:48:12.266Z" }, - { url = "https://files.pythonhosted.org/packages/59/31/2aa241ad2c10774baf6c37f8b8e1f39c07db358f1329f4eb40eba179c2a2/jiter-0.12.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5433fab222fb072237df3f637d01b81f040a07dcac1cb4a5c75c7aa9ed0bef1", size = 351894, upload-time = "2025-11-09T20:48:13.673Z" }, - { url = "https://files.pythonhosted.org/packages/54/4f/0f2759522719133a9042781b18cc94e335b6d290f5e2d3e6899d6af933e3/jiter-0.12.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f8c593c6e71c07866ec6bfb790e202a833eeec885022296aff6b9e0b92d6a70e", size = 365714, upload-time = "2025-11-09T20:48:15.083Z" }, - { url = "https://files.pythonhosted.org/packages/dc/6f/806b895f476582c62a2f52c453151edd8a0fde5411b0497baaa41018e878/jiter-0.12.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:90d32894d4c6877a87ae00c6b915b609406819dce8bc0d4e962e4de2784e567e", size = 478989, upload-time = "2025-11-09T20:48:16.706Z" }, - { url = "https://files.pythonhosted.org/packages/86/6c/012d894dc6e1033acd8db2b8346add33e413ec1c7c002598915278a37f79/jiter-0.12.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:798e46eed9eb10c3adbbacbd3bdb5ecd4cf7064e453d00dbef08802dae6937ff", size = 378615, upload-time = "2025-11-09T20:48:18.614Z" }, - { url = "https://files.pythonhosted.org/packages/87/30/d718d599f6700163e28e2c71c0bbaf6dace692e7df2592fd793ac9276717/jiter-0.12.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b3f1368f0a6719ea80013a4eb90ba72e75d7ea67cfc7846db2ca504f3df0169a", size = 364745, upload-time = "2025-11-09T20:48:20.117Z" }, - { url = "https://files.pythonhosted.org/packages/8f/85/315b45ce4b6ddc7d7fceca24068543b02bdc8782942f4ee49d652e2cc89f/jiter-0.12.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:65f04a9d0b4406f7e51279710b27484af411896246200e461d80d3ba0caa901a", size = 386502, upload-time = "2025-11-09T20:48:21.543Z" }, - { url = "https://files.pythonhosted.org/packages/74/0b/ce0434fb40c5b24b368fe81b17074d2840748b4952256bab451b72290a49/jiter-0.12.0-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:fd990541982a24281d12b67a335e44f117e4c6cbad3c3b75c7dea68bf4ce3a67", size = 519845, upload-time = "2025-11-09T20:48:22.964Z" }, - { url = "https://files.pythonhosted.org/packages/e8/a3/7a7a4488ba052767846b9c916d208b3ed114e3eb670ee984e4c565b9cf0d/jiter-0.12.0-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:b111b0e9152fa7df870ecaebb0bd30240d9f7fff1f2003bcb4ed0f519941820b", size = 510701, upload-time = "2025-11-09T20:48:24.483Z" }, - { url = "https://files.pythonhosted.org/packages/c3/16/052ffbf9d0467b70af24e30f91e0579e13ded0c17bb4a8eb2aed3cb60131/jiter-0.12.0-cp314-cp314-win32.whl", hash = "sha256:a78befb9cc0a45b5a5a0d537b06f8544c2ebb60d19d02c41ff15da28a9e22d42", size = 205029, upload-time = "2025-11-09T20:48:25.749Z" }, - { url = "https://files.pythonhosted.org/packages/e4/18/3cf1f3f0ccc789f76b9a754bdb7a6977e5d1d671ee97a9e14f7eb728d80e/jiter-0.12.0-cp314-cp314-win_amd64.whl", hash = "sha256:e1fe01c082f6aafbe5c8faf0ff074f38dfb911d53f07ec333ca03f8f6226debf", size = 204960, upload-time = "2025-11-09T20:48:27.415Z" }, - { url = "https://files.pythonhosted.org/packages/02/68/736821e52ecfdeeb0f024b8ab01b5a229f6b9293bbdb444c27efade50b0f/jiter-0.12.0-cp314-cp314-win_arm64.whl", hash = "sha256:d72f3b5a432a4c546ea4bedc84cce0c3404874f1d1676260b9c7f048a9855451", size = 185529, upload-time = "2025-11-09T20:48:29.125Z" }, - { url = "https://files.pythonhosted.org/packages/30/61/12ed8ee7a643cce29ac97c2281f9ce3956eb76b037e88d290f4ed0d41480/jiter-0.12.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:e6ded41aeba3603f9728ed2b6196e4df875348ab97b28fc8afff115ed42ba7a7", size = 318974, upload-time = "2025-11-09T20:48:30.87Z" }, - { url = "https://files.pythonhosted.org/packages/2d/c6/f3041ede6d0ed5e0e79ff0de4c8f14f401bbf196f2ef3971cdbe5fd08d1d/jiter-0.12.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a947920902420a6ada6ad51892082521978e9dd44a802663b001436e4b771684", size = 345932, upload-time = "2025-11-09T20:48:32.658Z" }, - { url = "https://files.pythonhosted.org/packages/d5/5d/4d94835889edd01ad0e2dbfc05f7bdfaed46292e7b504a6ac7839aa00edb/jiter-0.12.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:add5e227e0554d3a52cf390a7635edaffdf4f8fce4fdbcef3cc2055bb396a30c", size = 367243, upload-time = "2025-11-09T20:48:34.093Z" }, - { url = "https://files.pythonhosted.org/packages/fd/76/0051b0ac2816253a99d27baf3dda198663aff882fa6ea7deeb94046da24e/jiter-0.12.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f9b1cda8fcb736250d7e8711d4580ebf004a46771432be0ae4796944b5dfa5d", size = 479315, upload-time = "2025-11-09T20:48:35.507Z" }, - { url = "https://files.pythonhosted.org/packages/70/ae/83f793acd68e5cb24e483f44f482a1a15601848b9b6f199dacb970098f77/jiter-0.12.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:deeb12a2223fe0135c7ff1356a143d57f95bbf1f4a66584f1fc74df21d86b993", size = 380714, upload-time = "2025-11-09T20:48:40.014Z" }, - { url = "https://files.pythonhosted.org/packages/b1/5e/4808a88338ad2c228b1126b93fcd8ba145e919e886fe910d578230dabe3b/jiter-0.12.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c596cc0f4cb574877550ce4ecd51f8037469146addd676d7c1a30ebe6391923f", size = 365168, upload-time = "2025-11-09T20:48:41.462Z" }, - { url = "https://files.pythonhosted.org/packages/0c/d4/04619a9e8095b42aef436b5aeb4c0282b4ff1b27d1db1508df9f5dc82750/jiter-0.12.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5ab4c823b216a4aeab3fdbf579c5843165756bd9ad87cc6b1c65919c4715f783", size = 387893, upload-time = "2025-11-09T20:48:42.921Z" }, - { url = "https://files.pythonhosted.org/packages/17/ea/d3c7e62e4546fdc39197fa4a4315a563a89b95b6d54c0d25373842a59cbe/jiter-0.12.0-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:e427eee51149edf962203ff8db75a7514ab89be5cb623fb9cea1f20b54f1107b", size = 520828, upload-time = "2025-11-09T20:48:44.278Z" }, - { url = "https://files.pythonhosted.org/packages/cc/0b/c6d3562a03fd767e31cb119d9041ea7958c3c80cb3d753eafb19b3b18349/jiter-0.12.0-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:edb868841f84c111255ba5e80339d386d937ec1fdce419518ce1bd9370fac5b6", size = 511009, upload-time = "2025-11-09T20:48:45.726Z" }, - { url = "https://files.pythonhosted.org/packages/aa/51/2cb4468b3448a8385ebcd15059d325c9ce67df4e2758d133ab9442b19834/jiter-0.12.0-cp314-cp314t-win32.whl", hash = "sha256:8bbcfe2791dfdb7c5e48baf646d37a6a3dcb5a97a032017741dea9f817dca183", size = 205110, upload-time = "2025-11-09T20:48:47.033Z" }, - { url = "https://files.pythonhosted.org/packages/b2/c5/ae5ec83dec9c2d1af805fd5fe8f74ebded9c8670c5210ec7820ce0dbeb1e/jiter-0.12.0-cp314-cp314t-win_amd64.whl", hash = "sha256:2fa940963bf02e1d8226027ef461e36af472dea85d36054ff835aeed944dd873", size = 205223, upload-time = "2025-11-09T20:48:49.076Z" }, - { url = "https://files.pythonhosted.org/packages/97/9a/3c5391907277f0e55195550cf3fa8e293ae9ee0c00fb402fec1e38c0c82f/jiter-0.12.0-cp314-cp314t-win_arm64.whl", hash = "sha256:506c9708dd29b27288f9f8f1140c3cb0e3d8ddb045956d7757b1fa0e0f39a473", size = 185564, upload-time = "2025-11-09T20:48:50.376Z" }, - { url = "https://files.pythonhosted.org/packages/fe/54/5339ef1ecaa881c6948669956567a64d2670941925f245c434f494ffb0e5/jiter-0.12.0-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:4739a4657179ebf08f85914ce50332495811004cc1747852e8b2041ed2aab9b8", size = 311144, upload-time = "2025-11-09T20:49:10.503Z" }, - { url = "https://files.pythonhosted.org/packages/27/74/3446c652bffbd5e81ab354e388b1b5fc1d20daac34ee0ed11ff096b1b01a/jiter-0.12.0-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:41da8def934bf7bec16cb24bd33c0ca62126d2d45d81d17b864bd5ad721393c3", size = 305877, upload-time = "2025-11-09T20:49:12.269Z" }, - { url = "https://files.pythonhosted.org/packages/a1/f4/ed76ef9043450f57aac2d4fbeb27175aa0eb9c38f833be6ef6379b3b9a86/jiter-0.12.0-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c44ee814f499c082e69872d426b624987dbc5943ab06e9bbaa4f81989fdb79e", size = 340419, upload-time = "2025-11-09T20:49:13.803Z" }, - { url = "https://files.pythonhosted.org/packages/21/01/857d4608f5edb0664aa791a3d45702e1a5bcfff9934da74035e7b9803846/jiter-0.12.0-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd2097de91cf03eaa27b3cbdb969addf83f0179c6afc41bbc4513705e013c65d", size = 347212, upload-time = "2025-11-09T20:49:15.643Z" }, - { url = "https://files.pythonhosted.org/packages/cb/f5/12efb8ada5f5c9edc1d4555fe383c1fb2eac05ac5859258a72d61981d999/jiter-0.12.0-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:e8547883d7b96ef2e5fe22b88f8a4c8725a56e7f4abafff20fd5272d634c7ecb", size = 309974, upload-time = "2025-11-09T20:49:17.187Z" }, - { url = "https://files.pythonhosted.org/packages/85/15/d6eb3b770f6a0d332675141ab3962fd4a7c270ede3515d9f3583e1d28276/jiter-0.12.0-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:89163163c0934854a668ed783a2546a0617f71706a2551a4a0666d91ab365d6b", size = 304233, upload-time = "2025-11-09T20:49:18.734Z" }, - { url = "https://files.pythonhosted.org/packages/8c/3e/e7e06743294eea2cf02ced6aa0ff2ad237367394e37a0e2b4a1108c67a36/jiter-0.12.0-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d96b264ab7d34bbb2312dedc47ce07cd53f06835eacbc16dde3761f47c3a9e7f", size = 338537, upload-time = "2025-11-09T20:49:20.317Z" }, - { url = "https://files.pythonhosted.org/packages/2f/9c/6753e6522b8d0ef07d3a3d239426669e984fb0eba15a315cdbc1253904e4/jiter-0.12.0-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c24e864cb30ab82311c6425655b0cdab0a98c5d973b065c66a3f020740c2324c", size = 346110, upload-time = "2025-11-09T20:49:21.817Z" }, -] - [[package]] name = "markdown-it-py" version = "4.0.0" @@ -437,25 +331,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a3/f1/0578d65b4e3dc572967fd702221ea1f42e1e60accfb6b0dd8d8f15410139/nodejs_wheel_binaries-24.13.0-py2.py3-none-win_arm64.whl", hash = "sha256:2e3431d869d6b2dbeef1d469ad0090babbdcc8baaa72c01dd3cc2c6121c96af5", size = 39054688, upload-time = "2026-01-14T11:05:30.739Z" }, ] -[[package]] -name = "openai" -version = "2.15.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "anyio" }, - { name = "distro" }, - { name = "httpx" }, - { name = "jiter" }, - { name = "pydantic" }, - { name = "sniffio" }, - { name = "tqdm" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/94/f4/4690ecb5d70023ce6bfcfeabfe717020f654bde59a775058ec6ac4692463/openai-2.15.0.tar.gz", hash = "sha256:42eb8cbb407d84770633f31bf727d4ffb4138711c670565a41663d9439174fba", size = 627383, upload-time = "2026-01-09T22:10:08.603Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/b5/df/c306f7375d42bafb379934c2df4c2fa3964656c8c782bac75ee10c102818/openai-2.15.0-py3-none-any.whl", hash = "sha256:6ae23b932cd7230f7244e52954daa6602716d6b9bf235401a107af731baea6c3", size = 1067879, upload-time = "2026-01-09T22:10:06.446Z" }, -] - [[package]] name = "packaging" version = "25.0" @@ -824,18 +699,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/23/d1/136eb2cb77520a31e1f64cbae9d33ec6df0d78bdf4160398e86eec8a8754/tomli-2.4.0-py3-none-any.whl", hash = "sha256:1f776e7d669ebceb01dee46484485f43a4048746235e683bcdffacdf1fb4785a", size = 14477, upload-time = "2026-01-11T11:22:37.446Z" }, ] -[[package]] -name = "tqdm" -version = "4.67.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "colorama", marker = "sys_platform == 'win32'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/a8/4b/29b4ef32e036bb34e4ab51796dd745cdba7ed47ad142a9f4a1eb8e0c744d/tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2", size = 169737, upload-time = "2024-11-24T20:12:22.481Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d0/30/dc54f88dd4a2b5dc8a0279bdd7270e735851848b762aeb1c1184ed1f6b14/tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2", size = 78540, upload-time = "2024-11-24T20:12:19.698Z" }, -] - [[package]] name = "typer" version = "0.21.1"