This project provides adaptors and methods to integrate with the Quraite platform
Project description
Quraite Python SDK
The Quraite Python SDK provides adapters and methods to integrate AI agent frameworks with the Quraite platform. It offers a unified interface for different agent frameworks, automatic tracing and observability, and easy local server setup with tunneling capabilities.
Features
- 🔌 Framework Adapters: Support for multiple AI agent frameworks (LangGraph, Pydantic AI, Agno, Google ADK, OpenAI Agents, Smolagents, AWS Bedrock, Flowise, Langflow, N8n, and more)
- 📊 Automatic Tracing: Built-in OpenTelemetry-based tracing for agent execution, tool calls, and performance metrics
- 🚀 Local Server: Easy-to-use local server with optional tunneling (Cloudflare/ngrok) for public access
- 📦 Standardized Schema: Unified message and response formats across all frameworks
- 🔍 Observability: Track token usage, costs, latency, and model information for each agent invocation
Installation
Basic Installation
pip install quraite
Framework-Specific Installation
Install with optional dependencies for specific frameworks:
# LangGraph
pip install 'quraite[langgraph]'
# Pydantic AI
pip install 'quraite[pydantic-ai]'
# Agno
pip install 'quraite[agno]'
# Google ADK
pip install 'quraite[google-adk]'
# OpenAI Agents
pip install 'quraite[openai-agents]'
# Smolagents
pip install 'quraite[smolagents]'
# AWS Bedrock
pip install 'quraite[bedrock]'
# Multiple frameworks
pip install 'quraite[langgraph,pydantic-ai,agno]'
Quick Start
Example: LangGraph Agent with Local Server
Pass your compiled LangGraph agent to the adapter and expose it as an HTTP API:
import uvicorn
from dotenv import load_dotenv
from openinference.instrumentation import TracerProvider
from openinference.instrumentation.langchain import LangChainInstrumentor
from quraite.adapters import LanggraphAdapter
from quraite.serve.local_agent import LocalAgentServer
from quraite.tracing.span_exporter import QuraiteInMemorySpanExporter
from quraite.tracing.span_processor import QuraiteSimpleSpanProcessor
load_dotenv()
# Set up tracing (optional)
tracer_provider = TracerProvider()
quraite_span_exporter = QuraiteInMemorySpanExporter()
quraite_span_processor = QuraiteSimpleSpanProcessor(quraite_span_exporter)
tracer_provider.add_span_processor(quraite_span_processor)
LangChainInstrumentor().instrument(tracer_provider=tracer_provider)
# Your compiled LangGraph agent (created elsewhere)
# agent = create_agent(...)
# Wrap with Quraite adapter
adapter = LanggraphAdapter(
agent_graph=agent, # Pass your compiled LangGraph agent here
tracer_provider=tracer_provider, # Optional: for tracing
)
# Create and start server with Cloudflare tunnel
server = LocalAgentServer(
wrapped_agent=adapter,
agent_id="your-agent-id", # Optional: for Quraite platform integration
)
app = server.create_app(
port=8080,
host="0.0.0.0",
tunnel="cloudflare", # Options: "cloudflare", "ngrok", or "none"
)
if __name__ == "__main__":
uvicorn.run("local_server:app", host="0.0.0.0", port=8080)
The server exposes:
GET /- Health check endpointPOST /v1/agents/completions- Agent invocation endpoint
When using tunnel="cloudflare" or tunnel="ngrok", your agent will be publicly accessible via the generated URL.
Supported Frameworks
| Framework | Adapter | Installation |
|---|---|---|
| LangGraph | LanggraphAdapter |
pip install 'quraite[langgraph]' |
| Pydantic AI | PydanticAIAdapter |
pip install 'quraite[pydantic-ai]' |
| Agno | AgnoAdapter |
pip install 'quraite[agno]' |
| Google ADK | GoogleADKAdapter |
pip install 'quraite[google-adk]' |
| OpenAI Agents | OpenaiAgentsAdapter |
pip install 'quraite[openai-agents]' |
| Smolagents | SmolagentsAdapter |
pip install 'quraite[smolagents]' |
| AWS Bedrock | BedrockAgentsAdapter |
pip install 'quraite[bedrock]' |
| Flowise | FlowiseAdapter |
Included in base package |
| Langflow | LangflowAdapter |
Included in base package |
| N8n | N8nAdapter |
Included in base package |
| HTTP | HttpAdapter |
Included in base package |
| LangGraph Server | LanggraphServerAdapter |
pip install 'quraite[langgraph]' |
Core Concepts
Adapters
Adapters provide a unified interface (BaseAdapter) for different agent frameworks. Each adapter:
- Converts framework-specific agents to a standard interface
- Handles message format conversion
- Supports optional tracing integration
- Provides async invocation via
ainvoke()
Tracing
The SDK includes built-in OpenTelemetry-based tracing that captures:
- Agent Trajectory: Complete conversation flow with all messages
- Tool Calls: Tool invocations with inputs and outputs
- Performance Metrics: Token usage, costs, latency
- Model Information: Model name and provider details
To enable tracing:
from openinference.instrumentation import TracerProvider
from quraite.tracing.span_exporter import QuraiteInMemorySpanExporter
from quraite.tracing.span_processor import QuraiteSimpleSpanProcessor
tracer_provider = TracerProvider()
quraite_span_exporter = QuraiteInMemorySpanExporter()
quraite_span_processor = QuraiteSimpleSpanProcessor(quraite_span_exporter)
tracer_provider.add_span_processor(quraite_span_processor)
# Instrument your framework (example for LangChain)
from openinference.instrumentation.langchain import LangChainInstrumentor
LangChainInstrumentor().instrument(tracer_provider=tracer_provider)
Message Schema
The SDK uses a standardized message format:
from quraite.schema.message import (
UserMessage,
AssistantMessage,
ToolMessage,
SystemMessage,
MessageContentText,
ToolCall,
)
# User message
user_msg = UserMessage(
content=[MessageContentText(text="Hello, world!")]
)
# Assistant message with tool calls
assistant_msg = AssistantMessage(
content=[MessageContentText(text="I'll calculate that for you.")],
tool_calls=[
ToolCall(
id="call_123",
name="add",
arguments={"a": 10, "b": 5}
)
]
)
# Tool message
tool_msg = ToolMessage(
tool_call_id="call_123",
content=[MessageContentText(text="15")]
)
Response Format
Agent invocations return an AgentInvocationResponse:
from quraite.schema.response import AgentInvocationResponse
response: AgentInvocationResponse = await adapter.ainvoke(
input=[user_msg],
session_id="session-123"
)
# Access trajectory (list of messages)
trajectory = response.agent_trajectory
# Access trace (if tracing enabled)
trace = response.agent_trace
# Access final response text
final_response = response.agent_final_response
Examples
The repository includes comprehensive examples for each supported framework:
langgraph_calculator_agent- LangGraph calculator agentpydantic_calculator_agent- Pydantic AI calculator agentagno_calculator_agent- Agno calculator agentgoogle_adk_weather_agent- Google ADK weather agentopenai_flight_booking_agent- OpenAI Agents flight bookingsmolagents_sql_agent- Smolagents SQL agentbedrock_restaurant_support_agent- AWS Bedrock agent- And more...
Each example includes:
- Agent implementation
- Adapter setup
- Local server configuration
- Environment variable examples
API Reference
BaseAdapter
All adapters inherit from BaseAdapter:
from quraite.adapters.base import BaseAdapter
class MyAdapter(BaseAdapter):
async def ainvoke(
self,
input: List[AgentMessage],
session_id: str | None,
) -> AgentInvocationResponse:
# Implementation
pass
LocalAgentServer
Create a local HTTP server for your agent:
from quraite.serve.local_agent import LocalAgentServer
server = LocalAgentServer(
wrapped_agent=adapter,
agent_id="optional-agent-id",
)
app = server.create_app(
port=8080,
host="0.0.0.0",
tunnel="cloudflare", # or "ngrok" or "none"
)
Development
Setup
# Clone the repository
git clone https://github.com/innowhyte/quraite-python.git
cd quraite-python
# Install dependencies
pip install -e ".[dev,test]"
Running Tests
pytest
Building
make build
Publishing
# Update version
make update-version v=0.4.0
# Build
make build
# Publish to Test PyPI
make publish
# Enter username as "__token__" and then enter your API key
Requirements
- Python 3.10+
- See
pyproject.tomlfor full dependency list
License
See LICENSE file for details.
Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
Support
For issues, questions, or contributions, please visit the Quraite platform or open an issue on GitHub.
Changelog
See the repository's commit history for detailed changes.
Project details
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 quraite-0.1.1.tar.gz.
File metadata
- Download URL: quraite-0.1.1.tar.gz
- Upload date:
- Size: 129.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
83dfa268b1d0fb5521d0eee09a7dae9ca09ffd9fd25743669ac739cf665a8efa
|
|
| MD5 |
f0ff35b562eea50168e226281067f5d1
|
|
| BLAKE2b-256 |
a9f364a91fa6cf487dfd91a9f950951cce1201eaa79cfcd41f01d5d8d0da1584
|
File details
Details for the file quraite-0.1.1-py3-none-any.whl.
File metadata
- Download URL: quraite-0.1.1-py3-none-any.whl
- Upload date:
- Size: 165.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.9.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e8c208f8d32b864698c75bf37978495e60fcc669523de2cb44ee0f43e13e1434
|
|
| MD5 |
d30cabf9762fea5263bbb041f8bcf673
|
|
| BLAKE2b-256 |
0f3b6bcd001fb2bf34cd90cd4fdcb1ece3f4d74651852afea14f1ba7de0f47c2
|