pypi / graphql-core
graphql-core
What changed in graphql-core 3, from its official release notes, upgrade guides and advisories. Sources checked 2026-10-21.
14 breaking8 new APIs and options2 behavior and defaults7 fixes and other
See which of these apply to your code, ranked, in your agent:
npx @unstale/cli initgraphql-core 331 changes
Breaking changes 14
AST collection fields are tuples instead of lists.
AST nodes are frozen dataclasses, and all AST collection fields are tuples instead of lists.
create_source_event_stream() now takes a built Executor instead of the request arguments.
Functions and options deprecated in GraphQL.js 16 have been removed.
ExecutionContext has been renamed to Executor.
The execution_context_class parameter has been renamed to executor_class.
The parser option has been removed because directives on directive definitions and extensions are now part of the language.
A Python int that cannot be represented exactly as a float now raises a GraphQLError when coerced to Float.
Input coercion follows the specification more strictly, and default values are validated against their types.
GraphQL-core 3.3.0 supports Python 3.10 to 3.15; Python 3.7 to 3.9 are no longer supported.
Schema validation rejects input objects that cannot be given a finite value and reports circular input object references.
subscribe() stays synchronous when possible, like execute(), and raises a GraphQLError for non-subscription operations.
The parser's token limit now counts every consumed token, including skipped comments, so comment-padded documents can no longer bypass the limit.
The token_count of a parsed document now includes comments.
New APIs and options 8
Aborting an operation raises this error with the partial result.
Operations can be aborted with an AbortSignal.
Directives on directive definitions and directive extensions are now part of the language.
Executors support hooks.
Adds incremental delivery with @defer and @stream, following the current spec proposal.
Adds experimental fragment arguments through a parser option.
This new function reports safe changes in addition to breaking and dangerous changes.
Use this new method to get the enclosing scalar inside list literals in custom scalar positions.
Behavior and default changes 2
Returns None inside list literals in custom scalar positions; use get_parent_input_type() for the enclosing scalar.
Validation enforces a per-document field-comparison budget and aborts with a GraphQLError when exhausted. The default is 250,000 comparisons and can be adjusted by assigning to this constant.
Fixes and other changes 7
An explicit Undefined variable value is treated as omitted, so the variable's default applies.
Returns None inside list literals in custom scalar positions; use get_parent_input_type() for the enclosing scalar.
The error message now correctly says "abstract type" instead of "composite type".
On Python 3.14, graphql_sync() and execute_sync() now report that execution failed to complete synchronously when called outside a running event loop.
Truncated string escape sequences now produce a GraphQLSyntaxError instead of an unhandled IndexError from parse() or graphql_sync().
Type hints now use uppercase values for the kind of types returned by introspection.
Python 3.15 is now supported.