Simple AI agent framework with cloud tool support
Project description
Poping SDK v2
Pythonic AI agent framework with cloud tool support.
Architecture
poping/ (SDK)
├── __init__.py # Public API
├── client.py # Backend API client
├── agent.py # Agent builder + session
├── tool.py # @tool decorator + registry
├── exceptions.py # Custom exceptions
└── README.md
backend/api/ (Backend)
└── server.py # FastAPI server
Quick Start
1. Install Dependencies
pip install requests # SDK only needs requests
pip install fastapi uvicorn pydantic # Backend server
2. Start Backend API
cd backend/api
python server.py
Backend runs on http://localhost:8000
3. Use SDK
import poping
# Define local tool
@poping.tool(name="calc.add")
def add(a: float, b: float) -> float:
"""Add two numbers"""
return a + b
# Build agent with local + cloud tools
agent = (
poping.agent(llm="claude-3-5-sonnet-20241022")
.with_memory(session={"strategy": "summary"}, toolset=True)
.with_knowledge(["kb_docs"], toolset=True)
.with_tool(
local=[add], # Local tools
cloud=["memory.add", "knowledge.search"] # Cloud tools
)
.build(api_key="your_api_key")
)
# Chat
with agent.session(end_user_id="user_123") as conv:
response = conv.chat("Remember that I like Python")
# → Agent auto-detects and executes cloud tool 'memory.add'
print(response)
Key Features
1. Local + Cloud Tools
Local tools - Python functions decorated with @tool:
@poping.tool(name="search.web")
def search_web(query: str) -> str:
"""Search the web"""
return f"Results for: {query}"
Cloud tools - Backend-hosted services:
memory.add- Add memory itemmemory.search- Search memoryknowledge.search- Search knowledge baseknowledge.query- RAG querydata.query- Query datasetdata.search- Semantic search
Auto-detection: When LLM decides to use a tool, SDK automatically:
- Checks if tool is local → executes Python function
- Checks if tool is cloud → calls backend API
- Returns result to LLM
2. Backend Integration
SDK communicates with backend via REST API:
SDK Tool Execution Flow:
1. Agent receives message from user
2. LLM decides to use tool (e.g., "memory.add")
3. SDK checks tool registry:
- Local? Execute function directly
- Cloud? Call POST /api/v1/tools/execute
4. Backend routes to appropriate module (memory, knowledge, data)
5. Backend executes and returns result
6. SDK sends result back to LLM
7. LLM generates final response
3. Toolset Strategies
When you enable toolset=True on modules:
agent = (
poping.agent(llm="...")
.with_memory(toolset=True) # Adds: memory.add, memory.search
.with_knowledge(["kb_docs"], toolset=True) # Adds: knowledge.search, knowledge.query
.with_data(["ds_users"], toolset=True) # Adds: data.query, data.search
.build()
)
SDK automatically registers corresponding cloud tools.
4. Tool Override
Control tool availability per message:
with agent.session(end_user_id="user_123") as conv:
# Use all configured tools
conv.chat("Search the docs")
# Use specific tools only
conv.chat("Search memory", tool=["memory.search"])
# Disable all tools
conv.chat("Just answer", tool=False)
API Endpoints
Backend exposes these endpoints:
Tools
GET /api/v1/tools/list- List cloud toolsPOST /api/v1/tools/execute- Execute cloud tool
LLM
POST /api/v1/llm/create- Single LLM call (SDK owns tool loop)
Memory
POST /api/v1/memory/{memory_id}/items- Add memoryGET /api/v1/memory/{memory_id}/search- Search memory
Knowledge
GET /api/v1/knowledge/{kb_id}/search- Search KBPOST /api/v1/knowledge/{kb_id}/query- RAG query
Data
POST /api/v1/data/{dataset_id}/records- Insert recordPOST /api/v1/data/{dataset_id}/query- Query datasetGET /api/v1/data/{dataset_id}/search- Semantic search
Environment Variables
export POPING_API_KEY="your_api_key"
export POPING_BASE_URL="http://localhost:8000" # Optional
Then SDK automatically picks up credentials:
agent = poping.agent(llm="...").build() # No api_key needed
Example
See examples/sdk_example.py for complete example with:
- Local tools (@tool decorator)
- Cloud tools (memory, knowledge)
- Session management
- Tool overrides
- Direct tool execution
Implementation Status
✅ Complete:
- SDK structure (client, agent, tool, exceptions)
- @tool decorator for local tools
- Agent builder pattern
- Session management with context manager
- Tool registry (local + cloud)
- Backend API server structure
- Cloud tool endpoints
🔲 TODO:
- Connect backend API to actual backend modules
- Implement LLM integration (Claude API)
- Implement tool call detection and execution loop
- Add streaming support
- Add async/await support
- Add proper authentication/authorization
- Add rate limiting
- Add comprehensive error handling
Design Principles
- Simple API - Pythonic, intuitive, minimal boilerplate
- Cloud tool auto-detection - SDK handles local vs cloud transparently
- Flexible tool strategies - Mix local and cloud tools as needed
- Backend integration - Clean separation between SDK and backend
- Session-based - Context manager for automatic cleanup
Next Steps
- Backend implementation: Connect API endpoints to backend modules
- LLM integration: Add Anthropic Claude API calls
- Tool execution: Implement complete tool call loop
- Testing: Add unit and integration tests
- Documentation: API reference and guides
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 poping-0.0.7.tar.gz.
File metadata
- Download URL: poping-0.0.7.tar.gz
- Upload date:
- Size: 64.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c629fbbedd09ebfe6fd52b0ca8feb2db1e0a32647d0a5910eb53a847b5d86e51
|
|
| MD5 |
ffa027a262be53b0126f655bacb61d81
|
|
| BLAKE2b-256 |
303c6024ca81cfbc91cfb794a69792c432a10fdf97468bff40ecd4fd4e9b64f3
|
File details
Details for the file poping-0.0.7-py3-none-any.whl.
File metadata
- Download URL: poping-0.0.7-py3-none-any.whl
- Upload date:
- Size: 62.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
223c629ef091a19f2d0f3bacd3cf70ca567f720d5f4364a347adfe9ce6370c4b
|
|
| MD5 |
3930bf6d0a4172e6a532a6ca09db6786
|
|
| BLAKE2b-256 |
fe053812ef0430738aed8ab90e3f8c9125ba2fae4c406a254e1220e91bd7d0dc
|