mrkeyoor.com_
Mon 05 Oct 07:11 UTC
Dataevaluationupdated 05 Oct 2026

pg-jev review

pg-jev is a PostgreSQL extension that lets SQL queries filter, rank, score, or classify rows with plain-language questions. It sends row data to TypeSafe's Jev model, or a compatible local server, and returns probabilities or fixed choices instead of generated prose.

Verdict

Our pg-jev run installed 35 packages in 21 seconds and built in 6 seconds, but pytest exited 5 after finding 0 tests. Use v0.2.1 for exploratory semantic filtering on self-hosted PostgreSQL when you can bound spend, restrict the input columns, and inspect the probability distribution. Skip it when you need managed-database compatibility, indexed retrieval, or a mature release history.

We ran it

Lab card: what happened when we ran pg-jevScreenshot of pg-jev (pgjev.com)
Install✓ · 21s35 packages · 37 MB
Build✓ · 6s
Tests✗ · 6s0 passed · 0 failed of 0 (pytest)
Known vulns0(pip-audit)
Repo41 files~250 lines of source · 0.3 MB · 2 CI workflows · Dockerfile · tests dir

Answers from our run

Does pg-jev build from source?

Dependencies installed in 21 seconds (35 packages), and the build succeeded in 6 seconds. We cloned commit 8d9598d into a clean Debian container with 3 CPUs and no project-specific setup.

Do pg-jev's tests pass?

Yes: 0 of 0 passed when we ran the project's own test command (pytest). Some failures need services or credentials a bare container does not have.

Does pg-jev have known vulnerabilities in its dependencies?

pip-audit found none in the dependency tree at the time of our run.

Who should not use pg-jev?

Supabase, Neon, RDS, and other managed PostgreSQL users: v0.2.1 requires superuser access and plpython3u, which those hosts withhold.

What are the alternatives to pg-jev?

pgvector, PostgresML, ParadeDB. Our pg-jev run installed 35 packages in 21 seconds and built in 6 seconds, but pytest exited 5 after finding 0 tests.

Setup2/5Fast build, but needs superuser, PL/Python, and a model endpoint
Docs5/5Clear install paths, query rules, settings, costs, and caveats
Community3/5870 stars and current issue activity, but the project is weeks old
Maturity2/5v0.2.1 is active, while our pytest run collected no tests

Who it’s for

PostgreSQL 14-17 operators who control the server and can install plpython3u as a superuser.
Analysts exploring semantic categories that are difficult to express with exact SQL predicates.
Teams that can pre-filter rows, set spend limits, and review model probabilities before automating decisions.
Claude Code, Codex, or Cursor users who want the bundled installation and query-writing skill.

Who it’s NOT for

Supabase, Neon, RDS, and other managed PostgreSQL users: v0.2.1 requires superuser access and plpython3u, which those hosts withhold.
Teams that cannot send row contents to a third-party service: TypeSafe is the default endpoint, though a compatible local server is supported.
Large-table workloads that need an index-backed semantic query: jev() performs a full scan and its answer cache can grow for the life of each backend session.
Developers who expect a single-column call: open issue 8 says the required view-based workaround is awkward when a table has many unrelated columns.
Release gates that run pytest by convention: our command exited 5 after collecting 0 tests; the repository documents a separate pg_regress path.

Setup reality

Our sandbox installed commit 8d9598d in 21 seconds, adding 35 packages and using 37 MB. The build succeeded in 6 seconds. Pytest failed with exit 5 in 6 seconds after reporting 0 passed, 0 failed, and no tests ran in 0.01s. Pip-audit found 0 known vulnerabilities.

Real use needs PostgreSQL 14 through 17, plpython3u, a superuser for extension creation, and a TypeSafe API key. A compatible local endpoint can replace TypeSafe and does not require a key unless that endpoint enforces one.

Managed hosts that withhold superuser or untrusted Python cannot run it. Calls can send whole rows outside PostgreSQL, while per-statement row and character limits are off by default. The answer cache lasts for the backend session and can grow with new row and question pairs.

A plain-language predicate still scans every eligible row

Version 0.2.1 turns a question such as the customer is angry into an ordinary PostgreSQL function call. jev() returns a boolean, jev_prob() returns a probability, and related functions assign a fixed choice or a score along named levels. The model produces judgments rather than prose, so the result can sit inside WHERE, ORDER BY, or GROUP BY without parsing a chat response. That is a neat fit for exploratory classification where exact SQL cannot express the distinction.

The cost model follows the executor. Every row that reaches jev() is judged, because the extension has no index or stored embedding to consult. Cheap SQL predicates should reject rows first, and LIMIT can stop read-ahead once enough results arrive. The default batch contains 20 rows, while up to twice the configured concurrency may be in flight. This suits a bounded slice of a table. A broad recurring query belongs in a materialized workflow or an indexed retrieval system.

What happened when we ran it

Our sandbox installed commit 8d9598d in 21 seconds. The step added 35 Python packages and occupied 37 MB on disk. The build then succeeded in 6 seconds. Our measurement setup was a fresh Debian container with 3 CPUs, 8 GB of RAM, Python 3.12, no secrets, and no elevated privileges. Pip-audit reported 0 known vulnerabilities in the installed Python environment.

The test step failed with exit 5 after 6 seconds. Pytest reported 0 passed and 0 failed out of 0, and the log ended with no tests ran in 0.01s. That means our command found no pytest cases; it does not show a product assertion failing. We measured the generic Python path, while the repository documents make docker-test for PostgreSQL and mock-API cases through pg_regress. We did not run that SQL regression route.

The checkout was 0.3 MB, with 41 files and roughly 250 lines of source. It includes a Dockerfile, 2 CI workflow files, and a regression test tree. Those signals make the empty pytest collection understandable, but they do not convert our failed command into a pass. A team whose standard gate invokes pytest will need to teach it the project's Make target.

PostgreSQL 14 through 17 and PL/Python rule out common managed hosts

The README limits pg-jev v0.2.1 to PostgreSQL 14 through 17 and requires plpython3u. Creating it needs a superuser because PL/Python is untrusted. The documentation explicitly excludes Supabase, Neon, RDS, and similar services that withhold either capability. Source installation uses PGXS to copy a control file and SQL into the server's extension directory; there is no native module to compile. PGXN and a project Dockerfile provide two other routes.

Running a query adds a service dependency. The default endpoint is TypeSafe's hosted Jev API, authenticated by an API key placed in the PostgreSQL server environment, a role setting, or a session. Version 0.2.1 also accepts a compatible local endpoint without a key. That option keeps rows on your network, but you still have to operate the model service and match the expected /v1/systemone request and response contract.

Whole rows leave PostgreSQL unless you make a narrower view

In v0.2.1, a call such as jev(tickets, ...) serializes the row supplied to the function. The README tells users to create a view containing only the needed columns when privacy or token use matters. Open issue 8 captures the resulting friction: someone classifying one name column from a 30-column table must create a view instead of passing the column directly. That is manageable for a stable production query and clumsy during quick analysis.

TypeSafe receives row contents by default, so regulated or confidential tables need a field-by-field review before anyone runs the function. Two guard settings can cap rows or characters sent during one statement, but both default to 0, which means off. Set them at the role or database level for shared systems. Relying on every analyst to remember a session command leaves both disclosure and spend controls optional.

The per-session cache saves repeat calls and can keep growing

In v0.2.1, answers are cached by row content and question inside the PostgreSQL backend session. Changing a threshold or rerunning the same question can reuse those results. New row and question pairs keep adding entries until jev_cache_clear() runs or the backend exits. The jev.max_prefetch_rows setting limits read-ahead behavior, not total answer-cache memory. A connection pool with several persistent backends can therefore maintain several separate caches.

The same boundary affects repeatability. jev-latest is the default model name, while a versioned model can be pinned in configuration. Pin the model, preserve the exact question, inspect jev_stats(), and record the threshold if a judgment influences a durable business decision. The extension supplies probabilities, but your application still decides what uncertainty is acceptable. Exact dates, arithmetic, and equality checks should stay in SQL.

Version 0.2.1 is active and still very young

GitHub showed 870 stars, 1 open issue, and a last push on October 3, 2026. Release v0.2.1 arrived that day, adding keyless local endpoints and clarifying cache bounds. Issue 8 opened on October 4, so there is current user activity as well as recent code movement. The repository itself was created on September 17, 2026. A fast early release cycle is encouraging, though 18 days cannot establish long-term upgrade or production behavior.

pg-jev earns a trial when you own PostgreSQL and need a human-like judgment over a small, carefully selected row set. Begin with a view that exposes only allowed columns, add an indexed SQL pre-filter, set both statement guards, and examine probabilities before choosing a cutoff. If the query must scan a large table every day, or the database lives on a managed host, the extension's central tradeoff has already made the decision for you.

Alternatives

ProjectWhat it isPick it when
pgvectorA PostgreSQL extension for exact and approximate vector similarity search.pick this instead when reusable embeddings and indexed nearest-neighbor search fit the query better than model judgment on every row.
PostgresMLA PostgreSQL-centered platform for running machine-learning and AI workloads near the data.pick this instead when you want a broader in-database model platform and can operate its heavier stack.
ParadeDBA PostgreSQL distribution focused on full-text, vector, and hybrid search.pick this instead when indexed retrieval and ranking matter more than asking a model to judge each eligible row.

What people are saying

  1. [velocity-scout] realZachi/pg-jev

Sources

  1. pg-jev repository and README
  2. pg-jev v0.2.1 release
  3. pg-jev issue 8: applying Jev to one column
  4. pg-jev CI workflow
  5. pg-jev PostgreSQL license

More data reviews

live · hftbacktest · github-stars-history · Threat-Intelligence-Hackers-Forums · Trader-Archives · seriousdb · the whole board →