fix: more clean up
This commit is contained in:
parent
86cc5f6735
commit
5837c7aaea
|
|
@ -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
|
||||
|
|
@ -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
|
||||
```
|
||||
|
||||
|
|
|
|||
|
|
@ -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__":
|
||||
|
|
|
|||
|
|
@ -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__":
|
||||
|
|
|
|||
|
|
@ -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__":
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
||||
|
|
|
|||
|
|
@ -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")
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
Loading…
Reference in New Issue