# Compatibility ## Python and its libraries | | Supported | |---|---| | Python | 3.11, 3.12, 3.13, 3.14 | | psycopg | 3.3.4 or later, with its binary build | | psycopg-pool | 3.3.1 or later | | msgspec | 0.19 or later | | pyarrow (`arrow` extra) | 17 or later | | pandas (`pandas` extra) | 2.2 or later | | polars (`polars` extra) | 1.0 or later | | opentelemetry-api (`otel` extra) | 1.33 or later | The package ships type information (`py.typed`) and is checked under `mypy --strict` and pyright's strict mode. ## AgensGraph servers The driver reads AgensGraph **2.17 and later**, and refuses an older server when connecting. Each release is tested against the 2.17 and 2.18 lines and against the development branch, each with pgvector built for it. It learns which server it is talking to from the version the server sends when the connection opens, so the check costs no round trip. That version has had several shapes, all read the same way: | Reported | Line | |---|---| | `2.16`, `2.17.0` | the release's two or three numbers | | `2.18.6.0` | from 2.18, four: the line, the PostgreSQL minor version, and the AgensGraph release | | `2.18.6.0-rc1` | a release candidate | | `2.18-devel` | a development build | Only the first two numbers are read: the AgensGraph line and the PostgreSQL major version under it. What follows says which build of the line it is, not what it can do. `conn.capabilities.reported` is the string as sent and `conn.capabilities.version` its two numbers. ### What differs between lines Graph values in both renderings, the write counters, catalog inspection and reconciliation, bulk loading and commit resolution work the same on every supported line. What differs: | | 2.17 | 2.18 | From 2.18.6 | |---|---|---|---| | a property in a column of its own, [`PromotedProperty`](../schema/declaring.md#properties-with-a-column-of-their-own) | no | yes | yes | | the GQL clauses (`LET`, `NEXT`, `FILTER`, `FINISH`, `FOR`, `CALL`) | no | yes | yes | | `ORDER BY` a vertex or an edge | no | yes | yes | | a parameter in `size(%s)` | no | yes | yes | | `LIMIT` in the middle of a [streamed](../guide/running-statements.md#streaming-a-large-result) statement | accepted | refused | refused | | `describe().meta_gathered` reports whether the triples are current | no: whether any exist, or no edges do | yes | yes | | the server reports `graph_path` changes to the client | no | no | yes | `Capabilities` answers the first three from the version. A version describes a release rather than the build in front of you, and development builds of one line have differed; where it matters, `conn.can_promote_properties()` asks the catalog instead. On a server that does not report `graph_path`, the driver follows the session's graph by watching the statements it sends, and asks the server when it cannot tell; from 2.18.6 it reads the server's report at no cost. A graph write refused in a read-only transaction raises `ReadOnlyGraphWrite` on every line, although the server's message changed in 2.18. ## pgvector [Embedding vectors](../data/vectors.md) need pgvector created in the database. `halfvec` and `sparsevec` need pgvector 0.7 or later, and the iterative index scan settings 0.8 or later. `conn.vector_version()` reports the version in use.