AI functions for SQL — completions, classification, extraction, embeddings, and read-only SQL generation across local and hosted model providers
Installing and Loading
INSTALL ai FROM community;
LOAD ai;
Example
-- Use a free local model via Ollama (https://ollama.com)
SET duckdb_ai_provider = 'ollama';
SET duckdb_ai_model = 'gemma4:e4b';
SELECT ai_summarize('DuckDB is an analytical database built for fast local queries.');
-- Or a hosted provider, with the key kept in a DuckDB secret
CREATE SECRET openai_ai (TYPE duckdb_ai, AI_PROVIDER 'openai', API_KEY '...', MODEL 'gpt-4o-mini');
SELECT ai_classify('invoice overdue', 'billing, support', secret := 'openai_ai');
About ai
duckdb_ai adds model-backed analytical functions to SQL: completions
(ai_complete), text tasks (ai_summarize, ai_classify, ai_extract,
ai_translate, ai_redact, ai_filter), structured output validated
against a JSON Schema (ai_complete_json, ai_complete_record,
ai_extract_record), embeddings and similarity (ai_embed,
ai_similarity, ai_rerank), aggregates (ai_agg, ai_summarize_agg),
and a SQL assistant that only returns parser-validated read-only SELECT
statements (ai_sql, ai_query_data).
It supports local Ollama and OpenAI-compatible servers as well as OpenAI,
Azure OpenAI, Anthropic, Gemini, Mistral, DeepSeek, OpenRouter, Databricks,
Snowflake Cortex, and Z.ai. Credentials come from environment variables or
DuckDB TYPE duckdb_ai secrets — never SQL arguments. The runtime includes
concurrency/rate controls, retries with backoff, opt-in response and
provider-side prompt caching, batched embedding requests, a network egress
allowlist, and local usage/cost tracking via ai_usage().
The extension performs no network calls at load time; providers are only
contacted when an ai_* function that needs one is executed. Full docs:
https://github.com/leonardovida/duckdb-ai
Added Functions
| function_name | function_type | description | comment | examples |
|---|---|---|---|---|
| ai_agg | aggregate | NULL | NULL | |
| ai_classify | scalar | NULL | NULL | |
| ai_classify_labels | scalar | NULL | NULL | |
| ai_clear_cache | table | NULL | NULL | |
| ai_clear_usage | table | NULL | NULL | |
| ai_complete | scalar | NULL | NULL | |
| ai_complete_json | scalar | NULL | NULL | |
| ai_complete_record | table | NULL | NULL | |
| ai_completion_request_json | scalar | NULL | NULL | |
| ai_count_tokens | scalar | NULL | NULL | |
| ai_embed | scalar | NULL | NULL | |
| ai_embedding_request_json | scalar | NULL | NULL | |
| ai_explain_sql | table | NULL | NULL | |
| ai_extract | scalar | NULL | NULL | |
| ai_extract_record | scalar | NULL | NULL | |
| ai_filter | scalar | NULL | NULL | |
| ai_fix_grammar | scalar | NULL | NULL | |
| ai_fix_sql | table | NULL | NULL | |
| ai_is_read_only_sql | scalar | NULL | NULL | |
| ai_model_prices | table | NULL | NULL | |
| ai_provider_base_url | scalar | NULL | NULL | |
| ai_provider_protocol | scalar | NULL | NULL | |
| ai_query_data | table | NULL | NULL | |
| ai_recommended_batch_size | scalar | NULL | NULL | |
| ai_redact | scalar | NULL | NULL | |
| ai_rerank | scalar | NULL | NULL | |
| ai_schema_prompt | table | NULL | NULL | |
| ai_secrets | table | NULL | NULL | |
| ai_sentiment | scalar | NULL | NULL | |
| ai_similarity | scalar | NULL | NULL | |
| ai_sql | scalar | NULL | NULL | |
| ai_summarize | scalar | NULL | NULL | |
| ai_summarize_agg | aggregate | NULL | NULL | |
| ai_translate | scalar | NULL | NULL | |
| ai_try_complete | scalar | NULL | NULL | |
| ai_usage | table | NULL | NULL | |
| ai_validate_read_only_sql | scalar | NULL | NULL |
Overloaded Functions
This extension does not add any function overloads.
Added Types
This extension does not add any types.
Added Settings
| name | description | input_type | scope | aliases |
|---|---|---|---|---|
| duckdb_ai_aggregate_model | Default AI model for aggregate functions | VARCHAR | GLOBAL | [] |
| duckdb_ai_allowed_hosts | Comma-separated AI provider host allowlist for duckdb_ai; empty allows all hosts | VARCHAR | GLOBAL | [] |
| duckdb_ai_base_url | Default AI provider base URL override for duckdb_ai | VARCHAR | GLOBAL | [] |
| duckdb_ai_cache | Cache successful AI provider responses in the current DuckDB instance | BOOLEAN | GLOBAL | [] |
| duckdb_ai_cache_ttl_seconds | Maximum response-cache entry age in seconds between 0 and 31536000; 0 disables age expiry, -1 uses default | BIGINT | GLOBAL | [] |
| duckdb_ai_completion_model | Default AI model for completion functions | VARCHAR | GLOBAL | [] |
| duckdb_ai_embedding_model | Default AI model for embedding functions | VARCHAR | GLOBAL | [] |
| duckdb_ai_input_token_price_per_million | Input token price per million tokens for estimated AI usage cost; -1 disables cost estimates | DOUBLE | GLOBAL | [] |
| duckdb_ai_log_endpoint | HTTP endpoint for privacy-minimized AI usage logs | VARCHAR | GLOBAL | [] |
| duckdb_ai_log_format | AI usage log payload format: generic_json or otlp_json | VARCHAR | GLOBAL | [] |
| duckdb_ai_log_include_text | Include prompt and response text in AI usage logs | BOOLEAN | GLOBAL | [] |
| duckdb_ai_log_sample_rate | AI usage log sampling rate between 0 and 1; -1 uses default | DOUBLE | GLOBAL | [] |
| duckdb_ai_log_strict | Fail SQL queries when AI usage log delivery fails | BOOLEAN | GLOBAL | [] |
| duckdb_ai_log_tags | Optional tag string included in AI usage logs | VARCHAR | GLOBAL | [] |
| duckdb_ai_max_concurrent_requests | Maximum concurrent AI provider requests between 0 and 64; 0 disables the limit, -1 uses default | BIGINT | GLOBAL | [] |
| duckdb_ai_min_request_interval_ms | Minimum milliseconds between AI provider request starts between 0 and 60000; -1 uses default | BIGINT | GLOBAL | [] |
| duckdb_ai_model | Default AI model for duckdb_ai | VARCHAR | GLOBAL | [] |
| duckdb_ai_on_error | AI error handling: fail, null, or capture | VARCHAR | GLOBAL | [] |
| duckdb_ai_output_token_price_per_million | Output token price per million tokens for estimated AI usage cost; -1 disables cost estimates | DOUBLE | GLOBAL | [] |
| duckdb_ai_prompt_cache | Enable provider-side prompt caching hints when supported | BOOLEAN | GLOBAL | [] |
| duckdb_ai_provider | Default AI provider for duckdb_ai | VARCHAR | GLOBAL | [] |
| duckdb_ai_response_format | Default AI response format: text, json_object, or json_schema | VARCHAR | GLOBAL | [] |
| duckdb_ai_response_schema | Default AI JSON schema object for structured responses | VARCHAR | GLOBAL | [] |
| duckdb_ai_retry_backoff_ms | AI provider retry backoff in milliseconds between 0 and 60000; -1 uses default | BIGINT | GLOBAL | [] |
| duckdb_ai_retry_count | AI provider retry count between 0 and 10; -1 uses default | BIGINT | GLOBAL | [] |
| duckdb_ai_sql_assistant_model | Default AI model for SQL assistant functions | VARCHAR | GLOBAL | [] |
| duckdb_ai_task_model | Default AI model for text task functions | VARCHAR | GLOBAL | [] |
| duckdb_ai_timeout_seconds | AI provider HTTP timeout in seconds; 0 uses the extension default | BIGINT | GLOBAL | [] |
| duckdb_ai_token_limit_per_minute | Maximum estimated AI provider tokens per rolling minute between 0 and 10000000000; 0 disables the limit, -1 uses default | BIGINT | GLOBAL | [] |
| duckdb_ai_use_builtin_model_prices | Use duckdb_ai built-in model price catalog for estimated AI usage cost | BOOLEAN | GLOBAL | [] |