Search Shortcut cmd + k | ctrl + k

Ask your tables questions in plain language — filter, rank and classify rows with a condition you write as a sentence

Maintainer(s): judoaseeta

Compatibility Matrix

This table covers all DuckDB releases that have not reached end-of-life, including LTS releases, and shows the 2 most recent patch releases of each. Older patch releases are not listed, but the extension may be available for them as well.

Platform 1.4.4 1.4.5 1.5.5 1.5.6 2.0.0
Linux AMD64
Linux ARM64
macOS AMD64
macOS ARM64
Windows AMD64
Windows ARM64
WebAssembly

Installing and Loading

INSTALL jev FROM community;
LOAD jev;

Example

-- Judging rows needs a TypeSafe API key (https://console.typesafe.ai)
SET jev_api_key = '...';

CREATE TABLE tickets AS SELECT * FROM (VALUES
  ('card declined again, I want my money back'),
  ('how do I export a dashboard to PDF?')) t(body);

-- A boolean, so it composes with the rest of SQL
SELECT * FROM tickets WHERE jev(tickets, 'the customer wants a refund');

-- The probability behind it, for ranking and for picking a threshold
SELECT body, jev_prob(tickets, 'the customer is angry') AS p
FROM tickets ORDER BY p DESC;

-- One of n, per row
SELECT jev_choice(tickets, 'which team should handle this?',
                  ['billing', 'technical', 'sales']) AS team, count(*)
FROM tickets GROUP BY 1;

About jev

jev lets you filter, rank and classify rows with plain-language conditions. Every row is judged by TypeSafe's Jev, a model that returns calibrated probabilities instead of generated text, so there is no index, no embeddings and no vector column.

Function Returns Purpose
jev(row, condition [, threshold]) BOOLEAN WHERE predicate. Threshold: argument → jev_threshold → 0.5
jev_prob(row, condition) DOUBLE Probability 0..1 that the row satisfies the condition
jev_score(row, question, levels) DOUBLE Probability-weighted position on ordered levels (0 .. n-1)
jev_score_norm(row, question, levels) DOUBLE The same, normalised to 0..1
jev_choice(row, question, options) VARCHAR The most likely option, returned verbatim
jev_confidence(row, question, kind, options) DOUBLE Confidence of a score / choice answer
jev_eval(row, question [, kind [, options]]) JSON The full answer: probabilities, legend, confidence
jev_stats() JSON Requests, tokens, estimated cost, cache hits
jev_cache_clear() BOOLEAN Forget the cached judgments

row is the table itself, an alias, a subquery alias, or any single expression: DuckDB hands the whole row over as a struct, and the column names are part of what the model reads.

How it works

DuckDB gives a scalar function a vector of up to 2048 rows at a time, so the batch is already there. Rows go out jev_batch_size (20) per request — one shared state, one question per row, which amortises the per-request overhead — over a process-wide pool of jev_concurrency (16) kept-alive connections. Answers are cached by row content, so re-running a query, changing the threshold or sorting by probability is free, and rows that a cheaper predicate rejects first are never judged.

This is a port of pg-jev (pgjev.com), which does the same for PostgreSQL, and speaks the same API.

Settings

jev_api_key (falls back to the TYPESAFE_API_KEY environment variable), jev_api_url, jev_model, jev_threshold, jev_batch_size, jev_concurrency, jev_timeout, jev_max_retries, jev_max_rows_per_statement, jev_max_chars_per_statement, jev_cache_max_entries.

Row contents are sent to a third-party API, so do not point it at data you may not share.

Added Functions

function_name function_type description comment examples
jev scalar NULL NULL  
jev_cache_clear scalar NULL NULL  
jev_choice scalar NULL NULL  
jev_confidence scalar NULL NULL  
jev_eval scalar NULL NULL  
jev_prob scalar NULL NULL  
jev_score scalar NULL NULL  
jev_score_norm scalar NULL NULL  
jev_stats scalar NULL NULL  
jev_version 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
jev_api_key TypeSafe API key. Falls back to the TYPESAFE_API_KEY environment variable VARCHAR GLOBAL []
jev_api_url Endpoint that answers the questions (proxies, mocks, self-hosted) VARCHAR GLOBAL []
jev_batch_size Rows per API request. Accuracy drops measurably above ~20-25 UBIGINT GLOBAL []
jev_cache_max_entries Answers kept in the session cache before the oldest are dropped UBIGINT GLOBAL []
jev_concurrency Requests in flight at once, across all DuckDB threads UBIGINT GLOBAL []
jev_max_chars_per_statement Refuse to send more characters of row data than this per statement. 0 = no limit UBIGINT GLOBAL []
jev_max_retries Attempts for a retryable failure (429, 5xx, dropped connection) UBIGINT GLOBAL []
jev_max_rows_per_statement Refuse to send more rows than this per statement. 0 = no limit UBIGINT GLOBAL []
jev_model Model name, or a pinned version such as jev-1.13.0 VARCHAR GLOBAL []
jev_threshold Probability at which jev() returns true DOUBLE GLOBAL []
jev_timeout Seconds a single API request may take DOUBLE GLOBAL []