Django AI Services Framework — DB-driven LLM routing, quality tiers, NL2SQL
Project description
iil-aifw — Django AI Services Framework
DB-driven LLM provider, model & usage management for Django projects.
Installation
pip install iil-aifw
# With NL2SQL support:
pip install "iil-aifw[nl2sql]"
Quick Start
# settings.py
INSTALLED_APPS = [
...
"aifw",
]
# Run migrations
python manage.py migrate aifw
python manage.py init_aifw_config # seed default providers & models
from aifw.service import sync_completion
result = sync_completion(
action_code="story_writing",
messages=[{"role": "user", "content": "Write a short story about a dragon."}],
)
if result.success:
print(result.content)
else:
print(result.error)
Features
- DB-driven model routing — swap LLM providers/models via Django Admin, zero code changes
- Multi-provider — OpenAI, Anthropic, Google, Ollama, any LiteLLM-compatible provider
- Quality-level routing — map subscription tiers to model quality (economy/balanced/premium)
- Async & sync —
completion()async,sync_completion()sync,completion_with_fallback() - Streaming —
sync_completion_stream()for DjangoStreamingHttpResponse - Usage logging — automatic token & latency tracking per action, per tenant
- Fallback models — configure primary + fallback model per action type
- NL2SQL — natural language → SQL engine with few-shot examples and self-healing retry
- Hybrid cache — process-local (30s) + Django cache framework (600s, Redis-aware)
Core API
from aifw.service import (
completion, # async
sync_completion, # sync wrapper
completion_with_fallback, # async, tries fallback model on error
sync_completion_with_fallback,
sync_completion_stream, # streaming generator
get_quality_level_for_tier, # tier name → QualityLevel int
check_action_code, # bool — action code exists in DB
)
Quality-Level Routing (v0.6.0)
Each AIActionType row can be scoped to a quality_level (1–9) and/or priority
('fast'|'balanced'|'quality'). A NULL in either dimension acts as catch-all.
Lookup uses a deterministic 4-step cascade: exact → ql-only → prio-only → catch-all.
from aifw.constants import QualityLevel
from aifw.service import get_quality_level_for_tier, sync_completion
# Map a subscription tier to a quality level (DB-driven via TierQualityMapping)
ql = get_quality_level_for_tier("pro") # → QualityLevel.BALANCED (5)
ql = get_quality_level_for_tier("premium") # → QualityLevel.PREMIUM (8)
ql = get_quality_level_for_tier("freemium") # → QualityLevel.ECONOMY (2)
result = sync_completion(
"story_writing",
messages,
quality_level=ql,
priority="quality",
)
Multi-Tenant Usage Tracking (v0.5.0)
result = sync_completion(
"story_writing",
messages,
tenant_id=user.organization_id,
object_id=f"story-{story.pk}",
metadata={"source": "web", "plan": "pro"},
)
Streaming (v0.4.0)
from aifw.service import sync_completion_stream
from django.http import StreamingHttpResponse
def stream_story(request):
def generate():
for chunk in sync_completion_stream("story_writing", messages):
yield chunk
return StreamingHttpResponse(generate(), content_type="text/plain")
Django Models
| Model | Purpose |
|---|---|
LLMProvider |
Provider config (API key env var, base URL) |
LLMModel |
Model config (max tokens, cost per million tokens) |
AIActionType |
Action → model mapping; supports quality_level + priority dimensions |
AIUsageLog |
Token/latency/cost tracking per request, with tenant_id + metadata |
TierQualityMapping |
Subscription tier → quality_level mapping (DB-driven) |
NL2SQL (v0.7.0+)
# settings.py
INSTALLED_APPS = [
...
"aifw",
"aifw.nl2sql", # activates NL2SQL models + migrations
]
python manage.py migrate aifw_nl2sql
python manage.py seed_nl2sql_examples # seed verified few-shot examples
from aifw.nl2sql import NL2SQLEngine
engine = NL2SQLEngine(schema_xml="<schema>...</schema>")
result = engine.query("How many open orders do we have?")
if result.success:
print(result.sql)
print(result.rows)
- Few-shot examples injected automatically from
NL2SQLExamplemodel - Self-healing retry — on SQL execution error, a second LLM call includes the error as context
- Feedback capture —
NL2SQLFeedbackauto-created on every execution error - Management commands:
seed_nl2sql_examples,promote_feedback,validate_schema
Management Commands
python manage.py init_aifw_config # seed default providers & models
python manage.py check_aifw_config # CI gate — verify all action codes have a catch-all row
python manage.py seed_nl2sql_examples # seed NL2SQL few-shot examples
python manage.py promote_feedback # promote corrected feedback → NL2SQLExample
python manage.py validate_schema # validate schema-XML against real DB (exit 1 on error)
Cache Tuning
# Environment variables (optional)
AIFW_LOCAL_CACHE_TTL=30 # process-local TTL in seconds (default: 30)
AIFW_CACHE_TTL=600 # shared cache TTL in seconds (default: 600)
from aifw.service import invalidate_action_cache, invalidate_tier_cache
invalidate_action_cache("story_writing") # clear one action's cache entries
invalidate_action_cache() # clear all
invalidate_tier_cache("pro") # clear one tier
Constants
from aifw.constants import QualityLevel
QualityLevel.ECONOMY # 2
QualityLevel.BALANCED # 5
QualityLevel.PREMIUM # 8
QualityLevel.ALL # (2, 5, 8)
Changelog
See CHANGELOG.md.
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 iil_aifw-0.9.0.tar.gz.
File metadata
- Download URL: iil_aifw-0.9.0.tar.gz
- Upload date:
- Size: 59.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
621dad7f2da504e2c669964b9b8dbd94e568f6c2f946b4e5a2eb5667934566db
|
|
| MD5 |
84f6851ad9b2b908acdf88dfe58e4952
|
|
| BLAKE2b-256 |
3865a781be1708c34ed2ef52f5c8e9142fe10fe14f6e358739ba3d4da41d43f7
|
File details
Details for the file iil_aifw-0.9.0-py3-none-any.whl.
File metadata
- Download URL: iil_aifw-0.9.0-py3-none-any.whl
- Upload date:
- Size: 57.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
60ccf5fc7d3997a321b5602ff79991c3a45d5148df7b3ae0ce5b33da0e84839f
|
|
| MD5 |
5f1e586ec8da448d6a5aa88e9a52fbbe
|
|
| BLAKE2b-256 |
59c2dd6d83676add6442d877acb01d22f1a5d6b73a560f95f69da5249cb25304
|