Saptiva Agents Framework based on AutoGen v0.4+
Project description
Saptiva Agents
A professional multi-agent framework built on AutoGen v0.4+, designed for building production-ready AI agent systems with native Python tools, minimal dependencies, and enterprise-grade reliability.
Table of Contents
- Overview
- Architecture
- Installation
- Quick Start
- Core Concepts
- Creating Custom Tools
- Agent Patterns
- Available Models
- API Reference
- Best Practices
- Migration from v0.2.3
- Contributing
- License
- Links
- Support
Overview
Saptiva Agents is an enterprise-focused framework for building multi-agent AI systems. It provides:
- Native Tool System: Pydantic-based tools with automatic schema generation (no LangChain dependency)
- Minimal Dependencies: 86.7% smaller installation footprint (108 MB vs 754 MB)
- Production Ready: Built on AutoGen v0.4+ with robust error handling and async support
- Type Safe: Full type hints with mypy/pyright compatibility
- Extensible: Easy to create custom agents, tools, and orchestration patterns
Architecture
System Architecture
graph TB
subgraph "Client Layer"
User[User Application]
API[FastAPI REST API]
end
subgraph "Framework Layer"
Framework[SaptivaAgentsFramework]
Framework --> Parser[Request Parser]
Framework --> ModelSelector[Model Selector]
Framework --> AgentFactory[Agent Factory]
end
subgraph "Agent Layer"
Assistant[AssistantAgent]
UserProxy[UserProxyAgent]
Custom[Custom Agents]
end
subgraph "Tool Layer"
SaptivaTool[SaptivaTool Base]
NativeTools[Native Tools]
CustomTools[Custom Tools]
SaptivaTool --> NativeTools
SaptivaTool --> CustomTools
end
subgraph "Model Layer"
ModelClient[SaptivaAIChatCompletionClient]
SaptivaAPI[Saptiva API]
OpenAI[OpenAI Compatible APIs]
ModelClient --> SaptivaAPI
ModelClient --> OpenAI
end
User --> API
API --> Framework
Framework --> Assistant
Framework --> UserProxy
Framework --> Custom
Assistant --> NativeTools
Assistant --> CustomTools
Assistant --> ModelClient
UserProxy --> ModelClient
Custom --> ModelClient
style Framework fill:#e1f5ff
style ModelClient fill:#fff4e1
style SaptivaTool fill:#f0f0f0
Key Components
SaptivaAgentsFrameworkhandles request parsing, model selection, and agent creation.AssistantAgentruns tasks and can call tools;UserProxyAgentenables human-in-the-loop control.SaptivaToolis the native tool base and converts to AutoGenFunctionTool.- Teams like
RoundRobinGroupChatandSelectorGroupChatcoordinate multi-agent runs with termination conditions.
Execution flow (high level): client → framework → agent(s) → tools/model → response.
Installation
Minimal Installation
pip install saptiva-agents
This installs the core framework with 48 packages (~108 MB).
With Optional Features
# With web browsing capabilities (Playwright)
pip install saptiva-agents[web-surfer]
# With development tools
pip install saptiva-agents[dev]
# Full installation
pip install saptiva-agents[all]
Requirements
- Python 3.10 or higher
- Async runtime support (asyncio)
- Saptiva API key or compatible OpenAI-format API
Quick Start
1. Basic Agent
import asyncio
from saptiva_agents import SAPTIVA_LEGACY
from saptiva_agents.base import SaptivaAIChatCompletionClient
from saptiva_agents.agents import AssistantAgent
async def main():
# Initialize model client
model_client = SaptivaAIChatCompletionClient(
model=SAPTIVA_LEGACY,
api_key="your-api-key"
)
# Create agent
agent = AssistantAgent(
name="assistant",
model_client=model_client,
system_message="You are a helpful assistant."
)
# Run task
response = await agent.run(task="Explain async programming in Python")
print(response.messages[-1].content)
await model_client.close()
asyncio.run(main())
2. Agent with Tools
import asyncio
from saptiva_agents import SAPTIVA_TURBO
from saptiva_agents.base import SaptivaAIChatCompletionClient
from saptiva_agents.agents import AssistantAgent
from saptiva_agents.tools import get_weather, wikipedia_search
async def main():
model_client = SaptivaAIChatCompletionClient(
model=SAPTIVA_TURBO, # Model with tool support
api_key="your-api-key"
)
agent = AssistantAgent(
name="research_assistant",
model_client=model_client,
tools=[get_weather, wikipedia_search],
system_message="You can search Wikipedia and check weather."
)
response = await agent.run(
task="What's the weather in Tokyo and tell me about the city"
)
print(response.messages[-1].content)
await model_client.close()
asyncio.run(main())
3. Multi-Agent Team
import asyncio
from saptiva_agents import SAPTIVA_OPS
from saptiva_agents.base import SaptivaAIChatCompletionClient
from saptiva_agents.agents import AssistantAgent, UserProxyAgent
from saptiva_agents.teams import RoundRobinGroupChat
from saptiva_agents.conditions import MaxMessageTermination
async def main():
model_client = SaptivaAIChatCompletionClient(
model=SAPTIVA_OPS,
api_key="your-api-key"
)
# Create specialized agents
researcher = AssistantAgent(
name="researcher",
model_client=model_client,
system_message="You research topics thoroughly."
)
writer = AssistantAgent(
name="writer",
model_client=model_client,
system_message="You write clear, engaging content."
)
user = UserProxyAgent(name="user")
# Create team
team = RoundRobinGroupChat(
participants=[researcher, writer, user],
termination_condition=MaxMessageTermination(max_messages=10)
)
# Run team task
async for message in team.run_stream(
task="Research and write about quantum computing"
):
print(f"{message.source}: {message.content}")
await model_client.close()
asyncio.run(main())
Core Concepts
Agents
Agents are autonomous entities that can:
- Execute tasks using LLMs
- Use tools to interact with external systems
- Collaborate with other agents
- Maintain conversation history
Built-in Agent Types:
from saptiva_agents.agents import (
AssistantAgent, # LLM-powered agent with tool support
UserProxyAgent, # Human-in-the-loop proxy
)
Model Clients
Model clients interface with LLM APIs:
from saptiva_agents.base import SaptivaAIChatCompletionClient
# Basic configuration
client = SaptivaAIChatCompletionClient(
model="Saptiva Turbo",
api_key="your-key",
temperature=0.7,
top_p=0.9
)
# With custom base URL (OpenAI-compatible)
client = SaptivaAIChatCompletionClient(
model="gpt-4",
api_key="your-key",
base_url="https://api.openai.com/v1"
)
Teams
Teams orchestrate multi-agent collaboration:
from saptiva_agents.teams import (
RoundRobinGroupChat, # Sequential turn-taking
SelectorGroupChat, # Dynamic speaker selection
)
# Round-robin coordination
team = RoundRobinGroupChat(
participants=[agent1, agent2, agent3],
termination_condition=MaxMessageTermination(max_messages=20)
)
Termination Conditions
Control when agent execution stops:
from saptiva_agents.conditions import (
MaxMessageTermination, # Stop after N messages
TextMentionTermination, # Stop on specific text
TimeoutTermination, # Stop after timeout
)
# Example: Stop when agent says "DONE"
termination = TextMentionTermination("DONE", sources=["assistant"])
Creating Custom Tools
Method 1: Simple Async Function (Recommended)
async def search_database(query: str, limit: int = 10) -> dict:
"""
Search the database for records matching the query.
Args:
query: Search query string
limit: Maximum number of results to return
Returns:
Dictionary containing search results
"""
# Your implementation
results = await db.search(query, limit)
return {"results": results, "count": len(results)}
# Use directly with agents
agent = AssistantAgent(
name="db_assistant",
model_client=model_client,
tools=[search_database]
)
Method 2: Pydantic Tool Class (For Complex Tools)
from saptiva_agents.tools import SaptivaTool
from pydantic import BaseModel, Field
class DocumentAnalysisTool(SaptivaTool[dict]):
"""Advanced document analysis with state."""
name = "analyze_document"
description = "Analyzes documents and extracts key information"
def __init__(self, api_key: str):
self.api_key = api_key
self.cache = {}
async def _arun(self, document_url: str) -> dict:
"""
Analyze a document from URL.
Args:
document_url: URL of document to analyze
Returns:
Analysis results including entities, summary, sentiment
"""
# Check cache
if document_url in self.cache:
return self.cache[document_url]
# Perform analysis
result = await self._analyze(document_url)
# Cache result
self.cache[document_url] = result
return result
async def _analyze(self, url: str) -> dict:
# Your analysis implementation
return {
"entities": [...],
"summary": "...",
"sentiment": "positive"
}
# Usage
tool = DocumentAnalysisTool(api_key="your-key")
agent = AssistantAgent(
name="doc_analyst",
model_client=model_client,
tools=[tool]
)
Method 3: Factory Function
from saptiva_agents.tools import create_saptiva_tool
async def my_existing_function(param: str) -> str:
return f"Processed: {param}"
# Convert to tool with custom metadata
tool = create_saptiva_tool(
my_existing_function,
name="custom_processor",
description="Processes strings with custom logic"
)
Tool Development Best Practices
- Type Hints Required: All parameters and return values must have type hints
- Docstrings Required: Describe what the tool does (used by LLM)
- Async Preferred: Use async functions for I/O operations
- Error Handling: Return descriptive error messages, don't raise exceptions
- Idempotency: Tools should be safe to call multiple times
Agent Patterns
Architecture Overview
The framework supports four primary multi-agent patterns, each optimized for different use cases:
- Research Agent with Tools — a single agent orchestrates multiple tools for information gathering and synthesis.
- Supervisor–Worker — a supervisor delegates subtasks to specialist agents and merges results.
- Sequential Pipeline — agents transform data in order (validator → analyzer → formatter).
- Consensus Building — multiple evaluators vote and a simple aggregator produces a final decision.
Pattern 1: Research Agent with Tools
from saptiva_agents.tools import wikipedia_search, get_weather
async def create_research_agent(model_client):
"""Agent that can research topics using multiple sources."""
# Define custom research tool
async def search_arxiv(query: str, max_results: int = 5) -> str:
"""Search arXiv for academic papers."""
# Implementation
return "Paper results..."
agent = AssistantAgent(
name="researcher",
model_client=model_client,
tools=[wikipedia_search, search_arxiv, get_weather],
system_message="""You are a research assistant. Use your tools to:
1. Search Wikipedia for general information
2. Search arXiv for academic papers
3. Check weather if location-relevant
Always cite your sources."""
)
return agent
Pattern 2: Supervisor-Worker Pattern
async def create_supervisor_team(model_client):
"""Supervisor coordinates multiple specialist workers."""
# Specialist workers
data_analyst = AssistantAgent(
name="data_analyst",
model_client=model_client,
system_message="You analyze data and provide insights."
)
report_writer = AssistantAgent(
name="writer",
model_client=model_client,
system_message="You write clear, professional reports."
)
# Supervisor with workers as tools
from saptiva_agents.tools import AgentTool
supervisor = AssistantAgent(
name="supervisor",
model_client=model_client,
tools=[
AgentTool(data_analyst, return_value_as_last_message=True),
AgentTool(report_writer, return_value_as_last_message=True)
],
system_message="""You coordinate tasks between specialists:
- Use data_analyst for data analysis tasks
- Use report_writer for writing tasks
- Combine their outputs to complete complex requests"""
)
return supervisor
Pattern 3: Sequential Processing Pipeline
async def create_processing_pipeline(model_client):
"""Chain of agents processing data sequentially."""
agents = [
AssistantAgent(
name="validator",
model_client=model_client,
system_message="Validate and clean input data. Output JSON."
),
AssistantAgent(
name="analyzer",
model_client=model_client,
system_message="Analyze cleaned data. Output insights."
),
AssistantAgent(
name="formatter",
model_client=model_client,
system_message="Format insights into final report."
)
]
async def process(data: str) -> str:
result = data
for agent in agents:
response = await agent.run(task=result)
result = response.messages[-1].content
return result
return process
Pattern 4: Consensus Building
async def create_consensus_team(model_client, num_agents: int = 3):
"""Multiple agents vote on decisions."""
agents = [
AssistantAgent(
name=f"evaluator_{i}",
model_client=model_client,
system_message=f"You are evaluator {i}. Analyze and vote."
)
for i in range(num_agents)
]
async def get_consensus(question: str) -> dict:
votes = []
for agent in agents:
response = await agent.run(task=question)
votes.append(response.messages[-1].content)
# Aggregate votes
return {
"votes": votes,
"consensus": most_common(votes)
}
return get_consensus
Available Models
Text Models (Basic)
| Model | Base | Best For | Use Cases |
|---|---|---|---|
| Saptiva Ops | gpt-oss:20b | Reasoning tasks | Autonomous agents, RAG |
| Saptiva Guard | llama-guard3:8b | Content moderation | Safety, compliance |
Text Models (Tool Calling)
| Model | Base | Best For | Use Cases |
|---|---|---|---|
| Saptiva Cortex | qwen3-tk:30b | Complex reasoning | Advanced logic, analysis |
| Saptiva Turbo | qwen3-it:30b | Tool-heavy workflows | Multi-tool agents, orchestration |
| Saptiva Legacy | llama3.3:70b | Legacy compatibility | Migration, testing |
Multimodal Models
| Model | Base | Best For | Use Cases |
|---|---|---|---|
| Saptiva OCR | Nanonets OCR-s | Document processing | OCR, forms, invoices |
Model Selection Guide
# For simple Q&A without tools
model = SAPTIVA_OPS
# For agents using tools
model = SAPTIVA_TURBO # Recommended
model = SAPTIVA_CORTEX # For complex reasoning
# For document processing
model = SAPTIVA_OCR
# For content safety
model = SAPTIVA_GUARD
Model-to-Agent Pattern Mapping
The following table shows recommended model configurations for different agent patterns and use cases:
| Agent Pattern | Recommended Model | Tool Support | Best For | Example Configuration |
|---|---|---|---|---|
| Basic Assistant | SAPTIVA_OPS |
❌ No | Simple Q&A, conversation, text generation | Single agent without tools |
| Research Agent | SAPTIVA_TURBO |
✅ Yes | Multi-tool coordination, information gathering | Agent with Wikipedia, ArXiv, Weather tools |
| Research Agent (Advanced) | SAPTIVA_CORTEX |
✅ Yes | Complex reasoning with tools, academic research | Agent requiring deep analysis with tools |
| Supervisor-Worker | SAPTIVA_TURBO (Supervisor)SAPTIVA_OPS (Workers) |
✅ Supervisor ❌ Workers |
Task delegation, hierarchical teams | Supervisor coordinates specialist agents |
| Sequential Pipeline | SAPTIVA_OPS |
❌ No | Data transformation, ETL workflows | Chain of validator → analyzer → formatter |
| Sequential Pipeline (Complex) | SAPTIVA_CORTEX |
✅ Yes | Complex transformations with external data | Pipeline with API calls and validation |
| Consensus Building | SAPTIVA_OPS |
❌ No | Decision making, voting systems | Multiple evaluators voting on decisions |
| Document Processing | SAPTIVA_OCR |
❌ No | OCR, form extraction, invoice processing | Agent processing PDFs, images |
| Content Moderation | SAPTIVA_GUARD |
❌ No | Safety filtering, compliance checks | Agent validating user input |
| Multi-Agent Team (Round Robin) | SAPTIVA_OPS |
❌ No | Collaborative brainstorming, discussion | Team with shared conversation context |
| Multi-Agent Team (Tool-Using) | SAPTIVA_TURBO |
✅ Yes | Complex orchestration, external integrations | Team with shared tools and APIs |
| RAG Agent | SAPTIVA_OPS |
✅ Yes | Retrieval-augmented generation | Agent with vector search tool |
| Code Generation | SAPTIVA_CORTEX |
✅ Yes | Programming tasks, code analysis | Agent with code execution tools |
| Customer Support | SAPTIVA_TURBO |
✅ Yes | Ticket handling, knowledge base queries | Agent with FAQ search and CRM tools |
Configuration Examples:
# Research Agent - Recommended: SAPTIVA_TURBO
research_agent = AssistantAgent(
name="researcher",
model_client=SaptivaAIChatCompletionClient(model=SAPTIVA_TURBO),
tools=[wikipedia_search, arxiv_search, get_weather]
)
# Supervisor-Worker - Mixed models
supervisor = AssistantAgent(
name="supervisor",
model_client=SaptivaAIChatCompletionClient(model=SAPTIVA_TURBO), # Needs tool calling
tools=[AgentTool(worker1), AgentTool(worker2)]
)
worker = AssistantAgent(
name="worker",
model_client=SaptivaAIChatCompletionClient(model=SAPTIVA_OPS), # Simple execution
)
# Document Processing - SAPTIVA_OCR
ocr_agent = AssistantAgent(
name="ocr_processor",
model_client=SaptivaAIChatCompletionClient(model=SAPTIVA_OCR),
system_message="Extract text and structure from documents"
)
# Content Moderation - SAPTIVA_GUARD
guard_agent = AssistantAgent(
name="content_guard",
model_client=SaptivaAIChatCompletionClient(model=SAPTIVA_GUARD),
system_message="Analyze content for safety violations"
)
API Reference
Core Classes
SaptivaAIChatCompletionClient
class SaptivaAIChatCompletionClient:
def __init__(
self,
model: str,
api_key: str,
base_url: str = "https://api.saptiva.com/v1",
temperature: float = 0.7,
top_p: float = 0.9,
lang: str = "es"
)
AssistantAgent
class AssistantAgent:
def __init__(
self,
name: str,
model_client: ChatCompletionClient,
tools: List[Tool] = None,
system_message: str = "",
description: str = "",
reflect_on_tool_use: bool = False,
max_tool_iterations: int = 10
)
async def run(self, task: str) -> Response
async def run_stream(self, task: str) -> AsyncIterator[Message]
SaptivaTool
class SaptivaTool(Generic[T]):
name: str
description: str
@abstractmethod
async def _arun(self, *args, **kwargs) -> T:
"""Implement your tool logic here."""
pass
def to_function_tool(self) -> FunctionTool:
"""Convert to AutoGen FunctionTool."""
pass
Built-in Tools
from saptiva_agents.tools import (
# Web & Research
wikipedia_search, # Search Wikipedia
WikipediaSearchTool, # Class-based with fallback
# Utility
get_weather, # Weather information
# Saptiva Services
saptiva_bot_query, # Query Saptiva bot
obtener_texto_en_documento, # Extract text from documents
consultar_curp_get, # CURP lookup (GET)
consultar_curp_post, # CURP lookup (POST)
consultar_cfdi, # CFDI validation
get_verify_sat, # SAT verification
upload_csv, # CSV upload and analysis
)
Best Practices
1. Resource Management
Always close clients properly:
async def main():
client = SaptivaAIChatCompletionClient(...)
try:
agent = AssistantAgent(...)
result = await agent.run(task="...")
finally:
await client.close()
2. Error Handling
from starlette.exceptions import HTTPException
async def safe_agent_call():
try:
response = await agent.run(task="...")
return response
except HTTPException as e:
# Handle API errors
print(f"API Error: {e.detail}")
except Exception as e:
# Handle unexpected errors
print(f"Unexpected error: {e}")
3. Streaming Responses
Use streaming for better UX:
async def stream_response():
async for message in agent.run_stream(task="..."):
print(message.content, end="", flush=True)
4. Tool Design
# Good: Clear, focused tool
async def calculate_tax(amount: float, rate: float) -> float:
"""Calculate tax on an amount."""
return amount * rate
# Bad: Vague, multi-purpose tool
async def do_math(operation: str, *args) -> Any:
"""Do math.""" # Too generic
...
5. System Messages
Be specific about capabilities:
# Good
system_message = """You are a financial analyst. You can:
- Analyze balance sheets
- Calculate financial ratios
- Provide investment recommendations
Always show your calculations."""
# Bad
system_message = "You help with finance." # Too vague
6. Token Management
# Monitor token usage
client = SaptivaAIChatCompletionClient(
model=SAPTIVA_TURBO,
api_key="your-key",
temperature=0.7,
top_p=0.9 # Control output diversity
)
# Keep prompts concise
task = "Summarize this in 3 bullet points: [...]"
7. Production Web Research Config
For VM‑hosted SearXNG (primary) and Tavily (fallback/proxy), use conservative retry and rate‑limit settings to avoid upstream throttling:
# Primary: self‑hosted SearXNG
SAPTIVA_SEARCH_PROVIDER=searxng
SAPTIVA_SEARCH_BASE_URL=http://searxng.internal:8080
SAPTIVA_SEARCH_MAX_RETRIES=3
SAPTIVA_SEARCH_MIN_INTERVAL_S=0.25 # ~4 req/s per worker
# Page reads (avoid bursty crawling)
SAPTIVA_READ_MAX_RETRIES=2
SAPTIVA_READ_MIN_INTERVAL_S=0.10 # ~10 req/s per worker
# Optional fallback / proxy: Tavily
SAPTIVA_TAVILY_API_KEY=your-tavily-key
SAPTIVA_TAVILY_BASE_URL=https://tavily-proxy.internal/search
Enterprise preset (robust, auditable):
from saptiva_agents.teams import DeepResearchTeamConfig
enterprise_config = DeepResearchTeamConfig(
search_provider="searxng",
search_base_url="http://searxng.internal:8080",
search_max_retries=3,
search_min_interval_s=0.25,
read_extractor="trafilatura", # pip install saptiva-agents[web-research]
read_max_retries=2,
read_min_interval_s=0.10,
cache_ttl_s=900,
min_sources=5,
max_turns=16,
)
Startup preset (fast iteration, lower cost):
startup_config = DeepResearchTeamConfig(
search_provider="tavily",
search_api_key=os.getenv("SAPTIVA_TAVILY_API_KEY"),
search_max_retries=1,
search_min_interval_s=0.0,
read_extractor="simple",
cache_ttl_s=300,
min_sources=3,
max_turns=10,
)
8. FAQ: Blocked Domains / JS‑Heavy Sites
Some sites (Crunchbase, Pitchbook, Cloudflare‑protected domains) return HTTP 403 to read_page. DeepResearch v2 will skip these sources and search alternatives. If you must access JS/captcha sites:
- Install Playwright web browsing extra:
pip install saptiva-agents[web-surfer] - Use a WebSurfer‑based agent/team for those URLs, or pre‑fetch content through your own proxy.
- Prefer alternative sources (official docs, blogs, papers) to keep runs reliable.
Migration from v0.2.3
Breaking Changes in v0.2.4
-
LangChain Removed
# Before (v0.2.3) from saptiva_agents.tools.langchain import WikipediaSearch tool = WikipediaSearch() # After (v0.2.4) from saptiva_agents.tools import WikipediaSearchTool tool = WikipediaSearchTool()
-
Dependencies Updated
# Before pip install saptiva-agents # 754 MB, 113 packages # After pip install saptiva-agents # 108 MB, 48 packages
-
Tool Validation Removed
# Before: Manual validation required from saptiva_agents._utils import validate_langchain_instance # After: Automatic with type hints (no manual validation)
Migration Steps
-
Update installation:
pip install --upgrade saptiva-agents
-
Replace LangChain tools:
# Replace WikipediaSearch from saptiva_agents.tools import WikipediaSearchTool tool = WikipediaSearchTool()
-
Remove manual tool validation (handled automatically)
-
Test your agents thoroughly
Contributing
Contributions are welcome! Please read our contributing guidelines before submitting PRs.
Development Setup
# Clone repository
git clone https://github.com/saptiva-ai/saptiva-agents.git
cd saptiva-agents
# Install with dev dependencies
pip install -e ".[dev]"
# Run tests
pytest tests/
# Run linter
ruff check .
License
- Code: MIT License. See
LICENSE-CODE. Portions derived from Microsoft AutoGen remain under MIT. - Documentation: Creative Commons Attribution 4.0 International (CC BY 4.0). See
LICENSEanddocs/ATTRIBUTION.md.
This project is a derivative of Microsoft AutoGen and is not affiliated with or endorsed by Microsoft. See NOTICE.md.
Links
Support
For support, please:
- Check the documentation
- Search existing issues
- Create a new issue with detailed information
Built with AutoGen v0.4+ | Maintained by Saptiva AI
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file saptiva_agents-0.2.5.tar.gz.
File metadata
- Download URL: saptiva_agents-0.2.5.tar.gz
- Upload date:
- Size: 100.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6106120eae162da4e721a2ec054feef038673a0a0907c9890325f10411d30359
|
|
| MD5 |
83407c77747e6a8b73089375a99afc7a
|
|
| BLAKE2b-256 |
a0fdc060c3260221ae8e18734cb43c35e5f997362385a5859b62d7ad7e29ea3e
|
File details
Details for the file saptiva_agents-0.2.5-py3-none-any.whl.
File metadata
- Download URL: saptiva_agents-0.2.5-py3-none-any.whl
- Upload date:
- Size: 95.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
79b4496241276423291f139cf2ea00703b1bfde262e581dfcbf0bd15ec649379
|
|
| MD5 |
d675850aa88d5894a185abc0481b1e51
|
|
| BLAKE2b-256 |
1ee89f86be48a32ccab5ad472b2e25ddfc6df536b58ccbb03148668ec8c716b0
|