Skip to main content
Pre-release

This release is a pre-release and may not be stable for production use.

Django AI SDK

A Django SDK for building AI-powered applications with support for multiple LLM providers, RAG (Retrieval-Augmented Generation), and streaming responses.

Project Status: Read This First

This is an early preview. We're actively iterating on the API and learning from real usage. Here's what that means for you:

  • Expect breaking changes: APIs will shift as we find better patterns.
  • Migrations might be reset: Don't rely on database schema stability between versions.
  • Not for production: Use this for experimentation, prototypes, and side projects. Keep critical workloads elsewhere.
  • Watch the repo: Things change quickly. Star & watch to stay in the loop.
  • Your feedback shapes the SDK: Break things, open issues, tell us what hurts.

We'd love to have you along for the ride, just keep your seatbelt on.

Install

pip install django-ai-sdk

Or with uv:

uv add django-ai-sdk

Quick Start

1. Add to INSTALLED_APPS

# settings.py
INSTALLED_APPS = [
    ...
    "django_ai_sdk",
]

Then run python manage.py migrate.

2. Define your agent

# agents.py
from django.conf import settings
from django_ai_sdk import Agent
from django_ai_sdk.adapters.base import Stream
from haystack import Pipeline
from haystack.components.generators.chat import OpenAIChatGenerator
from haystack.utils import Secret


class HelpDeskAgent(Agent):
    name = "Help Desk"
    model = "gpt-4o"
    instructions = "You are a helpful support agent."

    async def get_pipeline_adapter(self, thread_id=None, user=None):
        storage_adapter = await self.get_storage_adapter(thread_id)
        generator = OpenAIChatGenerator(
            model=self.get_model(),
            api_key=Secret.from_token(settings.OPENAI_API_KEY),
        )
        return Stream(
            pipeline=Pipeline(),
            generator=generator,
            storage_adapter=storage_adapter,
        )

For non-streaming tasks (title generation, structured output), use Run instead:

from django_ai_sdk.adapters.base import Run

    async def get_run_adapter(self, thread_id=None, user=None):
        generator = OpenAIChatGenerator(
            model=self.get_model(),
            api_key=Secret.from_token(settings.OPENAI_API_KEY),
        )
        return Run(generator=generator)

3. Return a streaming response

# views.py
from .agents import HelpDeskAgent

agent = HelpDeskAgent()


@router.post("/chat")
async def chat(request, payload: ChatRequest):
    return await agent.as_view(
        payload.messages,
        thread_id=payload.thread_id,
    )

Integrations

An integration gives an agent tools from a third party: an MCP server, or an API you wrap yourself. Each one is a small Django app that registers itself on ready().

Enable a shipped integration by installing its app and naming it on an agent:

# settings.py
INSTALLED_APPS = [
    "django_ai_sdk",
    "django_ai_sdk.integrations.mcp",  # required by any MCP-backed integration
    "django_ai_sdk.integrations.github",  # also: .linear, .notion, .weather
]

# INSTALLED_APPS decides which integrations exist; this configures them. The same
# shape as DATABASES or CACHES, keyed by integration name.
AI_SDK_INTEGRATIONS = {
    "github": {"TOKEN": env("GITHUB_MCP_TOKEN")},
}
class HelpDeskAgent(Agent):
    integrations = ["github"]

A missing credential never breaks boot: the integration reports that it needs setup and contributes no tools. Alongside secrets, each entry accepts URL, TOOLS, LABEL, SCOPE and AUTH, so a self-hosted server, a narrower tool allow-list, or per-user OAuth instead of a shared token is a settings change rather than a subclass.

It's an ordinary dict, so pulling values from a vault or an ini file needs no hook. Just call whatever you like inside it.

Adding your own

Three files, no models and no migrations:

# myapp/integrations/zendesk/apps.py
from django_ai_sdk.integrations import IntegrationAppConfig


class ZendeskConfig(IntegrationAppConfig):
    default = True  # Django needs this to pick your AppConfig over the base
    name = "myapp.integrations.zendesk"
    integration = "myapp.integrations.zendesk.integration.ZendeskIntegration"
# myapp/integrations/zendesk/integration.py
from django_ai_sdk.integrations import MCPIntegration


class ZendeskIntegration(MCPIntegration):
    name = "zendesk"  # registry key, and the AI_SDK_INTEGRATIONS key
    label = "Zendesk"
    url = "https://mcp.zendesk.example/mcp"
    auth = "token"  # "static" | "token" | "oauth"
    default_tools = []  # [] discovers every tool the server offers

Add "myapp.integrations.zendesk" to INSTALLED_APPS, add "zendesk": {"TOKEN": env("ZENDESK_API_TOKEN")} to AI_SDK_INTEGRATIONS, and list "zendesk" on an agent. For an API you wrap by hand, subclass APIIntegration and set tools to @haystack.tools.tool-decorated functions. django_ai_sdk/integrations/weather/ is a complete, credential-free example, and github/, linear/ and notion/ cover token and OAuth MCP servers.

Tools are namespaced per integration (zendesk_search_tickets), so two servers exposing the same tool name don't collide. Tool lists are cached stale-while-revalidate behind a per-integration circuit breaker, so a slow or dead server costs one bounded wait and then reports itself as degraded.

HTTP endpoints

The SDK ships no integrations router; it doesn't pick your web framework. Build list/connect/disconnect/reconnect over IntegrationService (demo/apps/integrations/views/ninja.py is a working reference), and include the OAuth callback, which must sit at a fixed URL:

(path("api/integrations/", include("django_ai_sdk.integrations.mcp.urls")),)

Features

  • RAG Pipelines: BM25, ChromaDB, and Qdrant hybrid search with query expansion.
  • Streaming Responses: Built-in SSE streaming. Works with Vercel AI SDK protocol.
  • Conversation Storage: Automatic message persistence. Thread-based history out of the box.
  • Tool Calling: MCP, memory, and custom tools, all managed by your Agent.
  • Artifacts: 16 structured UI types (tables, plans, approval cards, code blocks, and more) submitted by the LLM via tool calls.
  • File Processing: Document upload with pipeline-based processing (text, CSV, JSON, DOCX, PPTX, XLSX. Extraction transforms for metadata embedding.
  • Integrations: Third-party tools as self-registering Django apps, with caching, circuit breaking and OAuth built in. See Integrations.
  • Reindexing: Hot-reload documents. Cached embeddings with simple refresh API.

Documentation

Full documentation and examples: github.com/django-ai-sdk/django-ai-sdk

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

django_ai_sdk-0.1.1a14.tar.gz (159.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

django_ai_sdk-0.1.1a14-py3-none-any.whl (202.8 kB view details)

Uploaded Python 3

File details

Details for the file django_ai_sdk-0.1.1a14.tar.gz.

File metadata

  • Download URL: django_ai_sdk-0.1.1a14.tar.gz
  • Upload date:
  • Size: 159.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.2 {"installer":{"name":"uv","version":"0.11.2","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for django_ai_sdk-0.1.1a14.tar.gz
Algorithm Hash digest
SHA256 44b366a5f6087fdda7984a2ad72efb7eb755ab34ba92737334a3ff7760f00317
MD5 980a1819368f62f4873ce7053a3b095d
BLAKE2b-256 4676985e6d58f9886d50bd1738086b9e8d2e27bbee13374b36468e04f843aa46

See more details on using hashes here.

File details

Details for the file django_ai_sdk-0.1.1a14-py3-none-any.whl.

File metadata

  • Download URL: django_ai_sdk-0.1.1a14-py3-none-any.whl
  • Upload date:
  • Size: 202.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.2 {"installer":{"name":"uv","version":"0.11.2","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for django_ai_sdk-0.1.1a14-py3-none-any.whl
Algorithm Hash digest
SHA256 ecfce3717d1fd97a1bfff831a01edec053467f21af48f30a0795bb273800a918
MD5 73548535a8f00ed3f2e147e4d79273c0
BLAKE2b-256 4160c3bf37ae90749ec9ca7223b23da6d060090fd9d45df9cce29f845df6c6c3

See more details on using hashes here.

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