fix: more clean up

This commit is contained in:
ajspig 2026-01-15 14:04:29 -05:00
parent 86cc5f6735
commit 5837c7aaea
9 changed files with 118 additions and 547 deletions

View File

@ -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

View File

@ -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
```

View File

@ -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__":

View File

@ -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__":

View File

@ -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__":

View File

@ -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"

View File

@ -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.

View File

@ -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")

View File

@ -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"