# Shadai Client - Official Python SDK
[](https://www.python.org/downloads/)
[](https://opensource.org/licenses/MIT)
**Beautiful, Pythonic client for Shadai AI services.** Query your knowledge base, orchestrate custom tools with intelligent agents, and more with an intuitive, production-ready API.
## 🆕 What's New in v0.1.29
- **🧠 Memory enabled by default** - All tools now use conversation memory by default for better context continuity
- **💬 Chat history management** - New methods to retrieve and clear session history with pagination
- **📖 Enhanced documentation** - Updated examples and API reference with new features
## ✨ Features
- 🚀 **Easy to use** - Clean, intuitive API design with one-step async patterns
- ⚡ **Async streaming** - Real-time streaming responses for all tools
- 🛠️ **Multiple tools** - Query, summarize, search, engine, and intelligent agent
- 🤖 **Intelligent agent** - Automatic plan → execute → synthesize workflow
- 🧠 **Conversation memory** - Built-in memory enabled by default for context continuity
- 💬 **Chat history management** - Get and clear session history with pagination
- 🔒 **Type-safe** - Full type hints and Pydantic models for better IDE support
- 📦 **Minimal dependencies** - Only requires `aiohttp` and `pydantic`
- 🎯 **Production-ready** - Comprehensive error handling
## 📦 Installation
```bash
pip install shadai-client
```
Or install from source:
```bash
cd client
pip install -e .
```
## 🚀 Quick Start
```python
import asyncio
from shadai import Shadai
async def main():
# Create session and query
async with Shadai(name="my-session") as shadai:
# Ingest documents
await shadai.ingest(folder_path="./documents")
# Query knowledge base
async for chunk in shadai.query("What is machine learning?"):
print(chunk, end="", flush=True)
asyncio.run(main())
```
## 📚 Usage Examples
### Knowledge Base Query
Query your uploaded documents using RAG (Retrieval-Augmented Generation):
```python
async with Shadai(name="research") as shadai:
# Ingest documents
await shadai.ingest(folder_path="./documents")
# Ask questions about your documents
async for chunk in shadai.query("What are the key findings?"):
print(chunk, end="", flush=True)
# Memory is enabled by default for context continuity
async for chunk in shadai.query("Tell me more about that"):
print(chunk, end="", flush=True)
# Disable memory if needed
async for chunk in shadai.query("Independent question", use_memory=False):
print(chunk, end="", flush=True)
```
### Document Summarization
Generate comprehensive summaries of all documents in a session:
```python
async with Shadai(name="research") as shadai:
await shadai.ingest(folder_path="./documents")
async for chunk in shadai.summarize():
print(chunk, end="", flush=True)
```
### Web Search
Search the internet for current information:
```python
async with Shadai(name="news") as shadai:
async for chunk in shadai.web_search("Latest AI developments 2024"):
print(chunk, end="", flush=True)
```
### Chat History Management
Retrieve and manage conversation history for sessions:
```python
async with Shadai(name="chat") as shadai:
# Get chat history with pagination
history = await shadai.get_session_history(
page=1,
page_size=5 # Default: 5, Max: 10
)
print(f"Total messages: {history['count']}")
for message in history["results"]:
print(f"{message['role']}: {message['content']}")
# Clear all chat history
result = await shadai.clear_session_history()
print(result["message"]) # "Session history cleared successfully"
```
### Unified Engine
Orchestrate multiple tools for comprehensive answers:
```python
async with Shadai(name="analysis") as shadai:
await shadai.ingest(folder_path="./documents")
async for chunk in shadai.engine(
prompt="Compare my docs with current trends",
use_knowledge_base=True,
use_web_search=True
):
print(chunk, end="", flush=True)
```
### Intelligent Agent
Orchestrate plan → execute → synthesize workflow with custom tools.
**The planner automatically infers tool arguments from your prompt!**
```python
from shadai import Shadai, tool
# Define tools using @tool decorator
@tool
def search_database(query: str, limit: int = 10) -> str:
"""Search database for user information.
Args:
query: Search query string
limit: Maximum number of results
"""
# Your implementation
return "Search results..."
@tool
def generate_report(data: str, format: str = "text") -> str:
"""Generate a formatted report.
Args:
data: Data to include in report
format: Report format (text, pdf, etc.)
"""
# Your implementation
return "Generated report..."
# Agent automatically infers arguments from your prompt!
async with Shadai(name="agent") as shadai:
async for chunk in shadai.agent(
prompt="Find the top 5 users and create a PDF report",
tools=[search_database, generate_report]
):
print(chunk, end="", flush=True)
```
The agent automatically:
1. **Plans** which tools to use based on your prompt
2. **Infers** the appropriate arguments for each tool from your prompt
3. **Executes** the selected tools locally with inferred arguments
4. **Synthesizes** all outputs into a unified, coherent answer
## 🔧 Configuration
### Environment Variables
```bash
export SHADAI_API_KEY="your-api-key"
export SHADAI_BASE_URL="http://localhost" # Optional
```
### Client Initialization
```python
# Named session (persistent)
async with Shadai(name="my-project") as shadai:
await shadai.ingest(folder_path="./docs")
# Temporal session (auto-deleted)
async with Shadai(temporal=True) as shadai:
async for chunk in shadai.query("Quick question"):
print(chunk, end="")
# Custom configuration
async with Shadai(
name="custom",
api_key="your-api-key",
base_url="https://api.shadai.com",
timeout=60 # seconds
) as shadai:
pass
```
## 🛠️ Available Tools
| Tool | Description | Streaming |
|------|-------------|-----------|
| `query()` | Query knowledge base with RAG | ✅ |
| `summarize()` | Summarize all session documents | ✅ |
| `web_search()` | Search web for current information | ✅ |
| `engine()` | Unified multi-tool orchestration | ✅ |
| `agent()` | Intelligent agent (plan → execute → synthesize) | ✅ |
| `get_session_history()` | Retrieve chat history with pagination | ❌ |
| `clear_session_history()` | Clear all messages in a session | ❌ |
## 📖 API Reference
### Shadai
Main entry point for the client.
```python
Shadai(
name: str = None,
temporal: bool = False,
api_key: str = None,
base_url: str = "http://localhost",
timeout: int = 30
)
```
**Methods:**
- `ingest(folder_path)` → `Dict` - Ingest documents from folder
- `query(query, use_memory=True)` → `AsyncIterator[str]` - Query knowledge base
- `summarize(use_memory=True)` → `AsyncIterator[str]` - Summarize documents
- `web_search(prompt, use_web_search=True, use_memory=True)` → `AsyncIterator[str]` - Search web
- `engine(prompt, **options)` → `AsyncIterator[str]` - Unified engine
- `agent(prompt, tools)` → `AsyncIterator[str]` - Intelligent agent
- `get_session_history(page=1, page_size=5)` → `Dict[str, Any]` - Get chat history
- `clear_session_history()` → `Dict[str, str]` - Clear chat history
### query()
Query your knowledge base with streaming responses. Memory enabled by default.
```python
async with Shadai(name="docs") as shadai:
async for chunk in shadai.query("What is AI?", use_memory=True):
print(chunk, end="")
```
### summarize()
Summarize all documents in a session. Memory enabled by default.
```python
async with Shadai(name="docs") as shadai:
async for chunk in shadai.summarize(use_memory=True):
print(chunk, end="")
```
### web_search()
Search the web for current information. Memory enabled by default.
```python
async with Shadai(name="search") as shadai:
async for chunk in shadai.web_search("Latest AI news"):
print(chunk, end="")
```
### engine()
Unified engine with multiple tool capabilities. Memory enabled by default.
```python
async with Shadai(name="engine") as shadai:
async for chunk in shadai.engine(
prompt="Analyze my documents",
use_knowledge_base=True,
use_web_search=True
):
print(chunk, end="")
```
### get_session_history()
Retrieve chat history with pagination support.
```python
async with Shadai(name="chat") as shadai:
history = await shadai.get_session_history(page=1, page_size=5)
# Response includes: count, next, previous, results
for msg in history["results"]:
print(f"{msg['role']}: {msg['content']}")
```
### clear_session_history()
Clear all messages in a session.
```python
async with Shadai(name="chat") as shadai:
result = await shadai.clear_session_history()
# Returns: {"message": "Session history cleared successfully"}
```
### agent()
Intelligent agent that orchestrates custom tools.
```python
from shadai import tool
@tool
def my_tool(param: str) -> str:
"""Tool description."""
return "result"
async with Shadai(name="agent") as shadai:
async for chunk in shadai.agent(
prompt="Execute task",
tools=[my_tool]
):
print(chunk, end="")
```
## 🚨 Error Handling
```python
from shadai import (
Shadai,
AuthenticationError,
ConnectionError,
ServerError
)
try:
shadai = Shadai(api_key="invalid-key")
await shadai.health()
except AuthenticationError:
print("Invalid API key")
except ConnectionError:
print("Cannot connect to server")
except ServerError as e:
print(f"Server error: {e}")
```
## 📝 Examples
Check the `examples/` directory for complete examples:
- `query_example.py` - Knowledge base queries
- `summary_example.py` - Document summarization
- `websearch_example.py` - Web search
- `agent_example.py` - Intelligent agent workflow
- `agent_synthesis_example.py` - Advanced synthesis with multiple data sources
- `complete_workflow.py` - Full agent workflow with multiple examples
Run examples:
```bash
cd client/
python examples/query_example.py
python examples/summary_example.py
python examples/websearch_example.py
python examples/agent_example.py
python examples/agent_synthesis_example.py
python examples/complete_workflow.py
```
## 🔒 Security
- Always use environment variables for API keys
- Never commit API keys to version control
- Use HTTPS in production (`base_url="https://..."`)
## 🤝 Contributing
Contributions welcome! Please read our contributing guidelines.
## 📄 License
MIT License - see LICENSE file for details.
## 🔗 Links
- **Documentation**: https://docs.shadai.com
- **GitHub**: https://github.com/shadai/shadai-client
- **Issues**: https://github.com/shadai/shadai-client/issues
## 💡 Support
- 📧 Email: support@shadai.com
- 💬 Discord: https://discord.gg/shadai
- 📖 Docs: https://docs.shadai.com
---
Made with ❤️ by the Shadai Team
Raw data
{
"_id": null,
"home_page": null,
"name": "shadai",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.10",
"maintainer_email": null,
"keywords": "shadai, ai, rag, machine-learning, nlp, knowledge-base, mcp, async",
"author": "SHADAI GROUP",
"author_email": "SHADAI GROUP <jaisir@shadai.ai>",
"download_url": "https://files.pythonhosted.org/packages/fd/be/a105ceb03f2498b579c191124d07d512fb9826510108948b8fd82ec4825c/shadai-0.1.30.tar.gz",
"platform": null,
"description": "# Shadai Client - Official Python SDK\n\n[](https://www.python.org/downloads/)\n[](https://opensource.org/licenses/MIT)\n\n**Beautiful, Pythonic client for Shadai AI services.** Query your knowledge base, orchestrate custom tools with intelligent agents, and more with an intuitive, production-ready API.\n\n## \ud83c\udd95 What's New in v0.1.29\n\n- **\ud83e\udde0 Memory enabled by default** - All tools now use conversation memory by default for better context continuity\n- **\ud83d\udcac Chat history management** - New methods to retrieve and clear session history with pagination\n- **\ud83d\udcd6 Enhanced documentation** - Updated examples and API reference with new features\n\n## \u2728 Features\n\n- \ud83d\ude80 **Easy to use** - Clean, intuitive API design with one-step async patterns\n- \u26a1 **Async streaming** - Real-time streaming responses for all tools\n- \ud83d\udee0\ufe0f **Multiple tools** - Query, summarize, search, engine, and intelligent agent\n- \ud83e\udd16 **Intelligent agent** - Automatic plan \u2192 execute \u2192 synthesize workflow\n- \ud83e\udde0 **Conversation memory** - Built-in memory enabled by default for context continuity\n- \ud83d\udcac **Chat history management** - Get and clear session history with pagination\n- \ud83d\udd12 **Type-safe** - Full type hints and Pydantic models for better IDE support\n- \ud83d\udce6 **Minimal dependencies** - Only requires `aiohttp` and `pydantic`\n- \ud83c\udfaf **Production-ready** - Comprehensive error handling\n\n## \ud83d\udce6 Installation\n\n```bash\npip install shadai-client\n```\n\nOr install from source:\n\n```bash\ncd client\npip install -e .\n```\n\n## \ud83d\ude80 Quick Start\n\n```python\nimport asyncio\nfrom shadai import Shadai\n\nasync def main():\n # Create session and query\n async with Shadai(name=\"my-session\") as shadai:\n # Ingest documents\n await shadai.ingest(folder_path=\"./documents\")\n\n # Query knowledge base\n async for chunk in shadai.query(\"What is machine learning?\"):\n print(chunk, end=\"\", flush=True)\n\nasyncio.run(main())\n```\n\n## \ud83d\udcda Usage Examples\n\n### Knowledge Base Query\n\nQuery your uploaded documents using RAG (Retrieval-Augmented Generation):\n\n```python\nasync with Shadai(name=\"research\") as shadai:\n # Ingest documents\n await shadai.ingest(folder_path=\"./documents\")\n\n # Ask questions about your documents\n async for chunk in shadai.query(\"What are the key findings?\"):\n print(chunk, end=\"\", flush=True)\n\n # Memory is enabled by default for context continuity\n async for chunk in shadai.query(\"Tell me more about that\"):\n print(chunk, end=\"\", flush=True)\n\n # Disable memory if needed\n async for chunk in shadai.query(\"Independent question\", use_memory=False):\n print(chunk, end=\"\", flush=True)\n```\n\n### Document Summarization\n\nGenerate comprehensive summaries of all documents in a session:\n\n```python\nasync with Shadai(name=\"research\") as shadai:\n await shadai.ingest(folder_path=\"./documents\")\n\n async for chunk in shadai.summarize():\n print(chunk, end=\"\", flush=True)\n```\n\n### Web Search\n\nSearch the internet for current information:\n\n```python\nasync with Shadai(name=\"news\") as shadai:\n async for chunk in shadai.web_search(\"Latest AI developments 2024\"):\n print(chunk, end=\"\", flush=True)\n```\n\n### Chat History Management\n\nRetrieve and manage conversation history for sessions:\n\n```python\nasync with Shadai(name=\"chat\") as shadai:\n # Get chat history with pagination\n history = await shadai.get_session_history(\n page=1,\n page_size=5 # Default: 5, Max: 10\n )\n\n print(f\"Total messages: {history['count']}\")\n for message in history[\"results\"]:\n print(f\"{message['role']}: {message['content']}\")\n\n # Clear all chat history\n result = await shadai.clear_session_history()\n print(result[\"message\"]) # \"Session history cleared successfully\"\n```\n\n### Unified Engine\n\nOrchestrate multiple tools for comprehensive answers:\n\n```python\nasync with Shadai(name=\"analysis\") as shadai:\n await shadai.ingest(folder_path=\"./documents\")\n\n async for chunk in shadai.engine(\n prompt=\"Compare my docs with current trends\",\n use_knowledge_base=True,\n use_web_search=True\n ):\n print(chunk, end=\"\", flush=True)\n```\n\n### Intelligent Agent\n\nOrchestrate plan \u2192 execute \u2192 synthesize workflow with custom tools.\n**The planner automatically infers tool arguments from your prompt!**\n\n```python\nfrom shadai import Shadai, tool\n\n# Define tools using @tool decorator\n@tool\ndef search_database(query: str, limit: int = 10) -> str:\n \"\"\"Search database for user information.\n\n Args:\n query: Search query string\n limit: Maximum number of results\n \"\"\"\n # Your implementation\n return \"Search results...\"\n\n@tool\ndef generate_report(data: str, format: str = \"text\") -> str:\n \"\"\"Generate a formatted report.\n\n Args:\n data: Data to include in report\n format: Report format (text, pdf, etc.)\n \"\"\"\n # Your implementation\n return \"Generated report...\"\n\n# Agent automatically infers arguments from your prompt!\nasync with Shadai(name=\"agent\") as shadai:\n async for chunk in shadai.agent(\n prompt=\"Find the top 5 users and create a PDF report\",\n tools=[search_database, generate_report]\n ):\n print(chunk, end=\"\", flush=True)\n```\n\nThe agent automatically:\n1. **Plans** which tools to use based on your prompt\n2. **Infers** the appropriate arguments for each tool from your prompt\n3. **Executes** the selected tools locally with inferred arguments\n4. **Synthesizes** all outputs into a unified, coherent answer\n\n## \ud83d\udd27 Configuration\n\n### Environment Variables\n\n```bash\nexport SHADAI_API_KEY=\"your-api-key\"\nexport SHADAI_BASE_URL=\"http://localhost\" # Optional\n```\n\n### Client Initialization\n\n```python\n# Named session (persistent)\nasync with Shadai(name=\"my-project\") as shadai:\n await shadai.ingest(folder_path=\"./docs\")\n\n# Temporal session (auto-deleted)\nasync with Shadai(temporal=True) as shadai:\n async for chunk in shadai.query(\"Quick question\"):\n print(chunk, end=\"\")\n\n# Custom configuration\nasync with Shadai(\n name=\"custom\",\n api_key=\"your-api-key\",\n base_url=\"https://api.shadai.com\",\n timeout=60 # seconds\n) as shadai:\n pass\n```\n\n## \ud83d\udee0\ufe0f Available Tools\n\n| Tool | Description | Streaming |\n|------|-------------|-----------|\n| `query()` | Query knowledge base with RAG | \u2705 |\n| `summarize()` | Summarize all session documents | \u2705 |\n| `web_search()` | Search web for current information | \u2705 |\n| `engine()` | Unified multi-tool orchestration | \u2705 |\n| `agent()` | Intelligent agent (plan \u2192 execute \u2192 synthesize) | \u2705 |\n| `get_session_history()` | Retrieve chat history with pagination | \u274c |\n| `clear_session_history()` | Clear all messages in a session | \u274c |\n\n## \ud83d\udcd6 API Reference\n\n### Shadai\n\nMain entry point for the client.\n\n```python\nShadai(\n name: str = None,\n temporal: bool = False,\n api_key: str = None,\n base_url: str = \"http://localhost\",\n timeout: int = 30\n)\n```\n\n**Methods:**\n- `ingest(folder_path)` \u2192 `Dict` - Ingest documents from folder\n- `query(query, use_memory=True)` \u2192 `AsyncIterator[str]` - Query knowledge base\n- `summarize(use_memory=True)` \u2192 `AsyncIterator[str]` - Summarize documents\n- `web_search(prompt, use_web_search=True, use_memory=True)` \u2192 `AsyncIterator[str]` - Search web\n- `engine(prompt, **options)` \u2192 `AsyncIterator[str]` - Unified engine\n- `agent(prompt, tools)` \u2192 `AsyncIterator[str]` - Intelligent agent\n- `get_session_history(page=1, page_size=5)` \u2192 `Dict[str, Any]` - Get chat history\n- `clear_session_history()` \u2192 `Dict[str, str]` - Clear chat history\n\n### query()\n\nQuery your knowledge base with streaming responses. Memory enabled by default.\n\n```python\nasync with Shadai(name=\"docs\") as shadai:\n async for chunk in shadai.query(\"What is AI?\", use_memory=True):\n print(chunk, end=\"\")\n```\n\n### summarize()\n\nSummarize all documents in a session. Memory enabled by default.\n\n```python\nasync with Shadai(name=\"docs\") as shadai:\n async for chunk in shadai.summarize(use_memory=True):\n print(chunk, end=\"\")\n```\n\n### web_search()\n\nSearch the web for current information. Memory enabled by default.\n\n```python\nasync with Shadai(name=\"search\") as shadai:\n async for chunk in shadai.web_search(\"Latest AI news\"):\n print(chunk, end=\"\")\n```\n\n### engine()\n\nUnified engine with multiple tool capabilities. Memory enabled by default.\n\n```python\nasync with Shadai(name=\"engine\") as shadai:\n async for chunk in shadai.engine(\n prompt=\"Analyze my documents\",\n use_knowledge_base=True,\n use_web_search=True\n ):\n print(chunk, end=\"\")\n```\n\n### get_session_history()\n\nRetrieve chat history with pagination support.\n\n```python\nasync with Shadai(name=\"chat\") as shadai:\n history = await shadai.get_session_history(page=1, page_size=5)\n\n # Response includes: count, next, previous, results\n for msg in history[\"results\"]:\n print(f\"{msg['role']}: {msg['content']}\")\n```\n\n### clear_session_history()\n\nClear all messages in a session.\n\n```python\nasync with Shadai(name=\"chat\") as shadai:\n result = await shadai.clear_session_history()\n # Returns: {\"message\": \"Session history cleared successfully\"}\n```\n\n### agent()\n\nIntelligent agent that orchestrates custom tools.\n\n```python\nfrom shadai import tool\n\n@tool\ndef my_tool(param: str) -> str:\n \"\"\"Tool description.\"\"\"\n return \"result\"\n\nasync with Shadai(name=\"agent\") as shadai:\n async for chunk in shadai.agent(\n prompt=\"Execute task\",\n tools=[my_tool]\n ):\n print(chunk, end=\"\")\n```\n\n## \ud83d\udea8 Error Handling\n\n```python\nfrom shadai import (\n Shadai,\n AuthenticationError,\n ConnectionError,\n ServerError\n)\n\ntry:\n shadai = Shadai(api_key=\"invalid-key\")\n await shadai.health()\nexcept AuthenticationError:\n print(\"Invalid API key\")\nexcept ConnectionError:\n print(\"Cannot connect to server\")\nexcept ServerError as e:\n print(f\"Server error: {e}\")\n```\n\n## \ud83d\udcdd Examples\n\nCheck the `examples/` directory for complete examples:\n\n- `query_example.py` - Knowledge base queries\n- `summary_example.py` - Document summarization\n- `websearch_example.py` - Web search\n- `agent_example.py` - Intelligent agent workflow\n- `agent_synthesis_example.py` - Advanced synthesis with multiple data sources\n- `complete_workflow.py` - Full agent workflow with multiple examples\n\nRun examples:\n\n```bash\ncd client/\npython examples/query_example.py\npython examples/summary_example.py\npython examples/websearch_example.py\npython examples/agent_example.py\npython examples/agent_synthesis_example.py\npython examples/complete_workflow.py\n```\n\n## \ud83d\udd12 Security\n\n- Always use environment variables for API keys\n- Never commit API keys to version control\n- Use HTTPS in production (`base_url=\"https://...\"`)\n\n## \ud83e\udd1d Contributing\n\nContributions welcome! Please read our contributing guidelines.\n\n## \ud83d\udcc4 License\n\nMIT License - see LICENSE file for details.\n\n## \ud83d\udd17 Links\n\n- **Documentation**: https://docs.shadai.com\n- **GitHub**: https://github.com/shadai/shadai-client\n- **Issues**: https://github.com/shadai/shadai-client/issues\n\n## \ud83d\udca1 Support\n\n- \ud83d\udce7 Email: support@shadai.com\n- \ud83d\udcac Discord: https://discord.gg/shadai\n- \ud83d\udcd6 Docs: https://docs.shadai.com\n\n---\n\nMade with \u2764\ufe0f by the Shadai Team\n",
"bugtrack_url": null,
"license": null,
"summary": "SHADAI Client",
"version": "0.1.30",
"project_urls": null,
"split_keywords": [
"shadai",
" ai",
" rag",
" machine-learning",
" nlp",
" knowledge-base",
" mcp",
" async"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "93c2ff83184a37e216d21961fac11bb1940934ace6e22f8830f08d1b2b5e9aa3",
"md5": "7769866884d5a71809781c33ae3c5bd3",
"sha256": "0be78c7e68c0df173ef589688406af4e3077ea23d45f65ec6fd3c36505ec8170"
},
"downloads": -1,
"filename": "shadai-0.1.30-py3-none-any.whl",
"has_sig": false,
"md5_digest": "7769866884d5a71809781c33ae3c5bd3",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.10",
"size": 26194,
"upload_time": "2025-10-17T17:41:44",
"upload_time_iso_8601": "2025-10-17T17:41:44.566518Z",
"url": "https://files.pythonhosted.org/packages/93/c2/ff83184a37e216d21961fac11bb1940934ace6e22f8830f08d1b2b5e9aa3/shadai-0.1.30-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "fdbea105ceb03f2498b579c191124d07d512fb9826510108948b8fd82ec4825c",
"md5": "1dc18301f28a5985c925cdb374b0c8af",
"sha256": "ab32e12d1e8ef84bde11394a02f4de1e9ee63c0fb4ca1612a3e46e9b7d28a6ed"
},
"downloads": -1,
"filename": "shadai-0.1.30.tar.gz",
"has_sig": false,
"md5_digest": "1dc18301f28a5985c925cdb374b0c8af",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.10",
"size": 26969,
"upload_time": "2025-10-17T17:41:45",
"upload_time_iso_8601": "2025-10-17T17:41:45.776276Z",
"url": "https://files.pythonhosted.org/packages/fd/be/a105ceb03f2498b579c191124d07d512fb9826510108948b8fd82ec4825c/shadai-0.1.30.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-10-17 17:41:45",
"github": false,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"lcname": "shadai"
}