Skip to main content

Aparavi Client SDK (Python)

A Python SDK for executing Aparavi pipelines using the Debug Adapter Protocol (DAP). This client provides a simplified interface for connecting to Aparavi DAP servers, executing pipelines, managing data transfer operations, and interacting with AI services.

Features

  • DAP-based communication for reliable pipeline execution
  • Simple execute-and-exit workflow for pipeline automation
  • Comprehensive error handling and logging
  • Automatic API key management for all DAP commands
  • Object-oriented data pipe management with context manager support
  • Parallel file upload capabilities with progress events (default: 64 concurrent)
  • Token-based operations for data pipe commands
  • Type hints with full typing support
  • AI chat functionality with structured JSON responses
  • Event monitoring for real-time pipeline status
  • Automatic reconnection with configurable persistence
  • Command-line interface for pipeline management

Table of Contents

Installation

pip install aparavi-client-python

Note: The distribution files use underscores (aparavi_client_python), but the module is imported as aparavi_client:

from aparavi_client import AparaviClient

The package includes both the SDK library and a CLI tool.

Configuration

Environment Variables

You can configure the client using environment variables or a .env file:

# .env file
APARAVI_APIKEY=your-api-key-here
APARAVI_URI=https://eaas.aparavi.com

The client will automatically parse the .env file if it exists and use the values as defaults. The priority order is:

  1. Constructor parameters (highest priority)
  2. .env file values
  3. Default values (lowest priority)

You can also pass configuration directly to the constructor:

client = AparaviClient(
    uri='https://eaas.aparavi.com',
    auth='your-api-key'
)

Environment Variable Substitution in Pipelines

The SDK automatically performs template variable substitution in pipeline configurations. Any string containing ${APARAVI_*} will be replaced with the corresponding value from your .env file.

Example .env file:

APARAVI_APIKEY=your-api-key
APARAVI_URI=https://eaas.aparavi.com
APARAVI_PROJECT_ID=project-123
APARAVI_INPUT_PATH=/data/input
APARAVI_OUTPUT_PATH=/data/output

Example pipeline configuration:

{
  "pipeline": {
    "project_id": "${APARAVI_PROJECT_ID}",
    "components": [
      {
        "id": "data-processor",
        "provider": "transform",
        "config": {
          "inputPath": "${APARAVI_INPUT_PATH}",
          "outputPath": "${APARAVI_OUTPUT_PATH}",
          "apiKey": "${APARAVI_APIKEY}"
        }
      }
    ]
  }
}

Using the pipeline:

# Variables are automatically substituted when the pipeline starts
result = await client.use(filepath='pipeline.json')

Key features:

  • ✅ Only variables starting with APARAVI_ are substituted (for security)
  • ✅ Unknown variables are left unchanged
  • ✅ Works with nested objects and arrays
  • ✅ Preserves the original pipeline configuration object

CLI Basics

The package includes an aparavi command-line tool for managing pipelines and file uploads.

CLI Commands

Start a pipeline:

aparavi start my-pipeline.json --apikey YOUR_KEY

Upload files:

aparavi upload files/*.csv --pipeline ./pipeline.json --apikey YOUR_KEY
# or with existing task token
aparavi upload files/*.csv --token TASK_TOKEN --apikey YOUR_KEY
# with custom thread count (default is 4)
aparavi upload files/*.csv --token TASK_TOKEN --threads 10 --apikey YOUR_KEY

Monitor pipeline status:

aparavi status --token TASK_TOKEN --apikey YOUR_KEY

Monitor pipeline events:

aparavi events DETAIL,SUMMARY --token TASK_TOKEN --apikey YOUR_KEY
# or monitor all events
aparavi events ALL --token TASK_TOKEN --apikey YOUR_KEY
# with log file
aparavi events ALL --token TASK_TOKEN --log events.log --apikey YOUR_KEY

Stop a pipeline:

aparavi stop --token TASK_TOKEN --apikey YOUR_KEY

SDK Quick Start

Basic Pipeline Execution

from aparavi_client import AparaviClient

# Create client
client = AparaviClient(
    uri='https://eaas.aparavi.com',
    auth='your-api-key'
)

# Connect to server
await client.connect()

# Start pipeline from file
result = await client.use(filepath='pipeline.json')
print(f'Pipeline started with token: {result["token"]}')

# Disconnect
await client.disconnect()

Using Context Manager (Recommended)

from aparavi_client import AparaviClient

# Context manager handles connect/disconnect automatically
async with AparaviClient(uri='https://eaas.aparavi.com', auth='your-api-key') as client:
    # Client is automatically connected
    result = await client.use(filepath='pipeline.json')
    token = result['token']
    
    # Send data
    response = await client.send(token, 'Process this text')
    # Client automatically disconnects here

Persistent Connection with Auto-Reconnect

from aparavi_client import AparaviClient

# Declare connection callbacks
async def on_connected(info: str) -> None:
    print(f'Connected: {info}')

async def on_disconnected(reason: str, has_error: bool) -> None:
    if has_error:
        print(f'Connection lost: {reason}')

# Create client with automatic reconnection enabled
client = AparaviClient(
    uri='https://eaas.aparavi.com',
    auth='your-api-key',
    persist=True,              # Enable automatic reconnection
    reconnect_delay=2.0,       # Wait 2 seconds before reconnection attempts (default: 1.0)
    on_connected=on_connected,
    on_disconnected=on_disconnected
)

await client.connect()
# If connection is lost, the client will automatically attempt to reconnect

Data Transfer with Pipes

# Using context manager (recommended)
import json

async with await client.pipe(token=myToken, mimetype='application/json') as pipe:
    for item in data_items:
        await pipe.write(json.dumps(item).encode())
    results = await pipe.close()

Bulk File Upload (Parallel)

from aparavi_client import AparaviClient

# Declare event handler
async def handle_events(event):
    if event['event'] == 'apaevt_status_upload':
        body = event['body']
        print(f"{body['filepath']}: {body['action']} - {body['bytes_sent']}/{body['file_size']} bytes")

client = AparaviClient(
    auth='your-api-key',
    on_event=handle_events
)

await client.connect()

# Simple file list (default: 64 concurrent uploads)
files = ['doc1.pdf', 'data.csv', 'report.docx']
results = await client.send_files(files, token)

# With custom concurrency control
results = await client.send_files(files, token, max_concurrent=10)

# With metadata and MIME types
files = [
    ('report.pdf', {'department': 'finance'}),
    ('data.csv', {'type': 'sales_data'}, 'text/csv')
]
results = await client.send_files(files, token)

await client.disconnect()

API Reference

AparaviClient

Constructor

AparaviClient(uri: str, auth: str, **kwargs)

Parameters:

  • uri (str): Server URI (default: https://eaas.aparavi.com)
  • auth (str): API key for authentication
  • on_event (callable, optional): Event handler for server events
  • on_connected (callable, optional): Connection established callback
  • on_disconnected (callable, optional): Connection lost callback
  • persist (bool, optional): Enable automatic reconnection (default: False)
  • reconnect_delay (float, optional): Delay between reconnection attempts in seconds (default: 1.0)

Connection Methods

async connect() -> None
Establish connection to the Aparavi server.

async disconnect() -> None
Close connection to the Aparavi server and stop automatic reconnection.

Execution Methods

async use(**kwargs) -> Dict[str, Any]
Start an Aparavi pipeline for processing data. Automatically performs environment variable substitution on the pipeline configuration.

Parameters:

  • pipeline (dict, optional): Pipeline configuration dictionary
  • filepath (str, optional): Path to JSON file containing pipeline configuration
  • token (str, optional): Custom token for the pipeline (auto-generated if not provided)
  • threads (int, optional): Number of threads for execution (default: 1)
  • args (List[str], optional): Command line arguments to pass to pipeline

Returns: Dictionary containing the task token and other metadata

async terminate(token: str) -> None
Terminate a running pipeline.

async get_task_status(token: str) -> Dict[str, Any]
Get the current status of a running pipeline.

Data Methods

async send(token: str, data: Union[str, bytes], objinfo: Dict = {}, mimetype: str = None) -> Dict[str, Any]
Send data directly to a pipeline.

Important: Use this method with pipelines that have webhook, filesys, or dropper as the source component. For chat/Q&A systems, use chat() method instead with a chat source component.

async send_files(files: List, token: str, max_concurrent: int = 64) -> List[Dict[str, Any]]
Upload multiple files in parallel with configurable concurrency.

Parameters:

  • files (list): List of file paths or tuples (filepath, objinfo) or (filepath, objinfo, mimetype)
  • token (str): Task token of the pipeline
  • max_concurrent (int, optional): Maximum concurrent uploads (default: 64)

async pipe(token: str, objinfo: Dict = {}, mimetype: str = None, provider: str = None) -> DataPipe
Create a streaming data pipe for sending large datasets.

Chat Methods

async chat(token: str, question: Question) -> Dict[str, Any]
Ask a question to Aparavi's AI and get an intelligent response.

Important: Use this method with pipelines that have chat as the source component. For document processing/uploads, use send() or send_files() with a webhook source instead.

Example:

from aparavi_client.schema import Question

question = Question()
question.addQuestion('What are the key findings?')

response = await client.chat(token='chat-token', question=question)

Event Methods

async set_events(token: str, event_types: List[str]) -> None
Subscribe to specific types of events from the server.

Example:

await client.set_events(token, ['apaevt_status_upload', 'apaevt_status_processing'])

DataPipe

Created via client.pipe() method. Provides a stream-like interface for uploading data.

async open() -> DataPipe
Open the pipe for data transmission. Must be called before any write() operations.

async write(buffer: bytes) -> None
Write data to the pipe. Can be called multiple times to stream large datasets.

async close() -> Optional[Dict[str, Any]]
Close the pipe and get the processing results.

Question

Question builder for AI chat operations.

Constructor

Question(expectJson: bool = False)

Methods

addQuestion(text: str) -> Question
Add the main question text.

addInstruction(subtitle: str, instructions: str) -> Question
Add specific instructions to guide the AI's response.

addExample(given: str, result: Any) -> Question
Provide an example of the desired response format.

addContext(context: Union[str, Dict[str, Any]]) -> Question
Add contextual information for the AI.

addHistory(history: QuestionHistory) -> Question
Add conversation history for context.

addDocument(doc: Doc) -> Question
Add a document to the question context.

addFilter(filter: DocFilter) -> Question
Add a document filter to narrow the search scope.

Common Patterns

AI Chat with Structured JSON Responses

from aparavi_client import AparaviClient
from aparavi_client.schema import Question

# Start chat pipeline once at the beginning
client = AparaviClient(auth='your-api-key')
await client.connect()

result = await client.use(filepath='chat_pipeline.json')
token = result['token']

# Simple question
async def ask_question(my_question: str) -> str:
    question = Question()
    question.addQuestion(my_question)
    
    response = await client.chat(token=token, question=question)
    
    if 'answers' in response and len(response['answers']) > 0:
        return response['answers'][0]
    return 'No answer received'

# Structured JSON response
async def extract_data(source_document: str):
    question = Question(expectJson=True)
    question.addQuestion('Extract email addresses and phone numbers')
    question.addExample(
        'Find contacts',
        {'emails': ['john@company.com'], 'phones': ['555-1234']}
    )
    question.addContext(source_document)
    
    response = await client.chat(token=token, question=question)
    
    if 'answers' in response and len(response['answers']) > 0:
        return response['answers'][0]
    return {}

# Use the functions
answer = await ask_question('What are the main themes in these documents?')
data = await extract_data('Contact us at john@company.com or 555-1234')

Document Processing Workflow

from aparavi_client import AparaviClient

async def process_documents():
    async with AparaviClient(uri='https://eaas.aparavi.com', auth='api_key') as client:
        # Start document processing pipeline
        result = await client.use(filepath='document_analyzer.json')
        token = result['token']
        
        # Upload files
        files = ['report1.pdf', 'data.xlsx', 'notes.txt']
        results = await client.send_files(files, token)
        
        return results

Event Monitoring

from typing import Dict, Any

async def handle_events(event: Dict[str, Any]) -> None:
    event_type = event['event']
    body = event['body']
    
    if event_type == 'apaevt_status_upload':
        if body['action'] == 'write':
            progress = (body['bytes_sent'] / body['file_size']) * 100
            print(f'Upload progress: {progress:.1f}%')

# Create client with event handler
client = AparaviClient(
    uri='https://eaas.aparavi.com',
    auth='api_key',
    on_event=handle_events
)

await client.connect()

# Start pipeline and subscribe to events
result = await client.use(filepath='pipeline.json')
await client.set_events(result['token'], ['apaevt_status_upload', 'apaevt_status_processing'])

# Monitor status
while True:
    status = await client.get_task_status(result['token'])
    if status['state'] in ['completed', 'failed']:
        break
    await asyncio.sleep(1)

Troubleshooting

Error Handling

from aparavi_client import AparaviClient, AparaviException

try:
    client = AparaviClient(uri='https://eaas.aparavi.com', auth='your-api-key')
    await client.connect()
    
    result = await client.use(filepath='pipeline.json')
    print(f'Pipeline started: {result["token"]}')
    
except AparaviException as e:
    print(f'Aparavi Error: {e}')
except ConnectionError as e:
    print(f'Connection Error: {e}')
except Exception as e:
    print(f'Error: {e}')
finally:
    if client:
        await client.disconnect()

Common Issues

Connection Failed:

  • Ensure you're using the latest version: pip install --upgrade aparavi-client-python
  • Check your network connection and firewall settings

403 Forbidden Error:

  • Your API key is invalid, expired, or lacks permissions
  • Get a new API key from your Aparavi account settings

Pipeline Not Found:

  • Verify the pipeline file path and JSON format
  • Use absolute paths if relative paths don't work

Upload Errors:

  • Ensure files are accessible and not too large
  • Check file permissions

Authentication Errors:

  • Verify your API key is correct
  • Ensure the key has the necessary permissions

Requirements

  • Python 3.8 or higher
  • Valid API key for authentication

License

MIT

Support

Metadata

Release files for aparavi-client-python 1.1.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for aparavi-client-python 1.1.1
File Size Uploaded Provenance
aparavi_client_python-1.1.1.tar.gz 130.9 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for aparavi-client-python 1.1.1
File Interpreter ABI Platform
aparavi_client_python-1.1.1-py3-none-any.whl Python 3 none any Details

Total release size: 319.3 kB

Release files / aparavi_client_python-1.1.1.tar.gz

Download URL aparavi_client_python-1.1.1.tar.gz
Size 130.9 kB
Tags Source
SHA-256 checksum
How to use checksums
7fa824406ac942afed5f4a9cac8cbb9a3a9d03d356767b181a2ef67ece6b74e3
BLAKE2b-256 checksum
How to use checksums
69c5b8c9660820a163fccfdcfc9264db17ef1a9408fd2419e0067e4d201d71f8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.5

Release files / aparavi_client_python-1.1.1-py3-none-any.whl

Download URL aparavi_client_python-1.1.1-py3-none-any.whl
Size 188.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
e07899cb218e620c4cad30f95b7651a36dd1add4a5eb7973d4e384ea672417ef
BLAKE2b-256 checksum
How to use checksums
532b8502692e7ea85bf12b924fab5cb1b0506a2b020c5c3c3ece8500c11ac5e4
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.5

Security for aparavi-client-python 1.1.1

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

1.1.1 This release

2 release files No provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page