This guide covers deployment options and best practices for AIGrok in various environments.
- Python 3.9+
- 4GB RAM minimum
- 2GB disk space
- Internet connection for API access
-
Install from PyPI:
pip install aigrok
-
Create configuration directory:
mkdir -p ~/.config/aigrok -
Create configuration file:
cat > ~/.config/aigrok/config.yaml << EOL models: text: default: "gpt-3.5-turbo" fallback: "ollama/llama2" vision: default: "gpt-4-vision" fallback: "claude-3-opus" EOL
-
Set environment variables:
export AIGROK_MODEL="gpt-4-vision" export AIGROK_FORMAT="text"
FROM python:3.9-slim
# Install system dependencies
RUN apt-get update && apt-get install -y \
build-essential \
&& rm -rf /var/lib/apt/lists/*
# Create app directory
WORKDIR /app
# Install aigrok
RUN pip install aigrok
# Copy configuration
COPY config.yaml /root/.config/aigrok/config.yaml
# Set environment variables
ENV AIGROK_MODEL="gpt-4-vision"
ENV AIGROK_FORMAT="text"
# Run command
ENTRYPOINT ["aigrok"]version: '3.8'
services:
aigrok:
build: .
volumes:
- ./data:/data
- ./config:/root/.config/aigrok
environment:
- AIGROK_MODEL=gpt-4-vision
- AIGROK_FORMAT=text# Build image
docker build -t aigrok .
# Run container
docker run -v $(pwd)/data:/data aigrok "Extract text" /data/document.pdfimport json
from aigrok import process_document
def lambda_handler(event, context):
"""AWS Lambda handler for AIGrok processing."""
try:
file_path = event['file_path']
prompt = event.get('prompt', 'Extract text')
result = process_document(file_path, prompt)
return {
'statusCode': 200,
'body': json.dumps({
'success': result.success,
'text': result.text,
'error': result.error
})
}
except Exception as e:
return {
'statusCode': 500,
'body': json.dumps({
'error': str(e)
})
}AWSTemplateFormatVersion: '2010-09-09'
Resources:
AIGrokService:
Type: AWS::ECS::Service
Properties:
Cluster: !Ref ECSCluster
TaskDefinition: !Ref AIGrokTaskDefinition
DesiredCount: 1
AIGrokTaskDefinition:
Type: AWS::ECS::TaskDefinition
Properties:
Family: aigrok
ContainerDefinitions:
- Name: aigrok
Image: aigrok:latest
Memory: 2048
Environment:
- Name: AIGROK_MODEL
Value: gpt-4-visionsteps:
- name: 'gcr.io/cloud-builders/docker'
args: ['build', '-t', 'gcr.io/$PROJECT_ID/aigrok', '.']
- name: 'gcr.io/cloud-builders/docker'
args: ['push', 'gcr.io/$PROJECT_ID/aigrok']
- name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'
entrypoint: gcloud
args:
- 'run'
- 'deploy'
- 'aigrok'
- '--image'
- 'gcr.io/$PROJECT_ID/aigrok'
- '--platform'
- 'managed'# Create resource group
az group create --name aigrok-rg --location eastus
# Create container instance
az container create \
--resource-group aigrok-rg \
--name aigrok \
--image aigrok:latest \
--dns-name-label aigrok \
--ports 80import logging
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
handlers=[
logging.FileHandler('aigrok.log'),
logging.StreamHandler()
]
)from prometheus_client import Counter, Histogram
REQUESTS = Counter('aigrok_requests_total', 'Total requests')
PROCESSING_TIME = Histogram('aigrok_processing_seconds', 'Processing time'){
"dashboard": {
"id": null,
"title": "AIGrok Metrics",
"panels": [
{
"title": "Request Rate",
"type": "graph",
"targets": [
{
"expr": "rate(aigrok_requests_total[5m])"
}
]
}
]
}
}-
Use environment variables:
export OPENAI_API_KEY="sk-..." export ANTHROPIC_API_KEY="sk-..."
-
Use secrets management:
from azure.keyvault.secrets import SecretClient def get_api_key(key_name: str) -> str: """Get API key from Azure Key Vault.""" client = SecretClient(vault_url=VAULT_URL, credential=credential) return client.get_secret(key_name).value
-
Configure firewall rules:
# Allow only necessary ports ufw allow 80/tcp ufw allow 443/tcp -
Use VPC for cloud deployments:
Resources: AIGrokVPC: Type: AWS::EC2::VPC Properties: CidrBlock: 10.0.0.0/16 EnableDnsSupport: true EnableDnsHostnames: true
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: aigrok-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: aigrok
minReplicas: 1
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50from fastapi import FastAPI, HTTPException
from fastapi_limiter import FastAPILimiter
from fastapi_limiter.depends import RateLimiter
app = FastAPI()
@app.post("/process")
@RateLimiter(times=60, seconds=60)
async def process_document():
"""Process document with rate limiting."""
passfrom fastapi import FastAPI
from aigrok import health_check
app = FastAPI()
@app.get("/health")
async def health():
"""Health check endpoint."""
status = health_check()
return {"status": "healthy" if status else "unhealthy"}-- Clean up old processing records
DELETE FROM processing_history
WHERE created_at < NOW() - INTERVAL '30 days';
-- Optimize tables
VACUUM ANALYZE processing_history;/etc/logrotate.d/aigrok:
/var/log/aigrok/*.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
create 0640 aigrok aigrok
}