Skip to main content

Python Examples

Complete examples for integrating DocBit AI into your Python application.

Installation

pip install requests

Basic Client

import os
import requests
from typing import List, Optional, Dict, Any

class DocBitClient:
    def __init__(self, api_key: str = None):
        self.api_key = api_key or os.environ.get('DOCBIT_API_KEY')
        self.base_url = 'https://api.docbit.ai'
    
    def _headers(self, org_id: str, user_id: str, roles: List[str]) -> Dict[str, str]:
        return {
            'Authorization': f'ApiKey {self.api_key}',
            'Content-Type': 'application/json',
            'X-External-Org-Id': org_id,
            'X-External-User-Id': user_id,
            'X-External-Roles': ','.join(roles)
        }
    
    def chat(
        self,
        org_id: str,
        user_id: str,
        roles: List[str],
        message: str,
        conversation_id: Optional[str] = None
    ) -> Dict[str, Any]:
        response = requests.post(
            f'{self.base_url}/api/ai/chat',
            json={
                'message': message,
                'conversationId': conversation_id
            },
            headers=self._headers(org_id, user_id, roles)
        )
        response.raise_for_status()
        return response.json()

# Usage
client = DocBitClient()

answer = client.chat(
    org_id='acme',
    user_id='user-456',
    roles=['hr', 'all-staff'],
    message='What is our vacation policy?'
)

print(answer['content'])

Streaming Chat

import json

def stream_chat(
    client: DocBitClient,
    org_id: str,
    user_id: str,
    roles: List[str],
    message: str
):
    response = requests.post(
        f'{client.base_url}/api/ai/chat/stream',
        json={'message': message},
        headers=client._headers(org_id, user_id, roles),
        stream=True
    )
    response.raise_for_status()
    
    for line in response.iter_lines():
        if line:
            line = line.decode('utf-8')
            if line.startswith('data: '):
                data = json.loads(line[6:])
                yield data

# Usage
for event in stream_chat(client, 'acme', 'user-456', ['employee'], 'What are the benefits?'):
    if 'token' in event:
        print(event['token'], end='', flush=True)
    elif 'citations' in event:
        print('\n\nCitations:', event['citations'])

Upload Document

def upload_document(
    client: DocBitClient,
    org_id: str,
    user_id: str,
    roles: List[str],
    file_path: str,
    acl_roles: List[str] = None
) -> Dict[str, Any]:
    with open(file_path, 'rb') as f:
        files = {'file': f}
        data = {}
        
        if acl_roles:
            data['aclRoles'] = acl_roles
        
        headers = client._headers(org_id, user_id, roles)
        del headers['Content-Type']  # Let requests set multipart
        
        response = requests.post(
            f'{client.base_url}/api/documents/upload',
            files=files,
            data=data,
            headers=headers
        )
        response.raise_for_status()
        return response.json()

# Upload HR document
upload_document(
    client,
    'acme',
    'admin-1',
    ['admin'],
    './hr-policy.pdf',
    acl_roles=['hr']
)

FastAPI Integration

from fastapi import FastAPI, Depends, HTTPException
from pydantic import BaseModel

app = FastAPI()

class AskRequest(BaseModel):
    question: str

class User(BaseModel):
    id: str
    org_id: str
    roles: List[str]

async def get_current_user() -> User:
    # Your auth logic here
    return User(id='user-456', org_id='acme', roles=['employee'])

@app.post('/ask')
async def ask(request: AskRequest, user: User = Depends(get_current_user)):
    try:
        client = DocBitClient()
        result = client.chat(
            org_id=user.org_id,
            user_id=user.id,
            roles=user.roles,
            message=request.question
        )
        return result
    except requests.HTTPError as e:
        raise HTTPException(
            status_code=e.response.status_code,
            detail=e.response.json().get('error', 'API Error')
        )

Django Integration

# views.py
from django.http import JsonResponse
from django.views.decorators.http import require_POST
from django.contrib.auth.decorators import login_required
import json

@login_required
@require_POST
def ask_question(request):
    client = DocBitClient()
    data = json.loads(request.body)
    
    # Get roles from your user model
    user = request.user
    roles = list(user.groups.values_list('name', flat=True))
    
    try:
        result = client.chat(
            org_id=user.organization.id,
            user_id=str(user.id),
            roles=roles,
            message=data['question']
        )
        return JsonResponse(result)
    except requests.HTTPError as e:
        return JsonResponse(
            {'error': e.response.json().get('error')},
            status=e.response.status_code
        )

Error Handling

from requests.exceptions import HTTPError
import time

def safe_chat(client, org_id, user_id, roles, message, retries=3):
    for attempt in range(retries):
        try:
            return client.chat(org_id, user_id, roles, message)
        except HTTPError as e:
            status = e.response.status_code
            
            if status == 429:  # Rate limited
                wait = 2 ** attempt
                print(f'Rate limited, waiting {wait}s...')
                time.sleep(wait)
                continue
            elif status == 401:
                raise Exception('Authentication failed. Check API key.')
            elif status == 400:
                error = e.response.json().get('error', 'Bad request')
                raise Exception(f'Bad request: {error}')
            else:
                raise
    
    raise Exception('Max retries exceeded')

Async Client

import aiohttp
import asyncio

class AsyncDocBitClient:
    def __init__(self, api_key: str = None):
        self.api_key = api_key or os.environ.get('DOCBIT_API_KEY')
        self.base_url = 'https://api.docbit.ai'
    
    async def chat(
        self,
        org_id: str,
        user_id: str,
        roles: List[str],
        message: str
    ) -> Dict[str, Any]:
        async with aiohttp.ClientSession() as session:
            async with session.post(
                f'{self.base_url}/api/ai/chat',
                json={'message': message},
                headers={
                    'Authorization': f'ApiKey {self.api_key}',
                    'Content-Type': 'application/json',
                    'X-External-Org-Id': org_id,
                    'X-External-User-Id': user_id,
                    'X-External-Roles': ','.join(roles)
                }
            ) as response:
                response.raise_for_status()
                return await response.json()

# Usage
async def main():
    client = AsyncDocBitClient()
    result = await client.chat('acme', 'user-456', ['hr'], 'What is the policy?')
    print(result['content'])

asyncio.run(main())