# What changed in graphql-core

> 31 changes in graphql-core 3 from its official release notes, upgrade guides and advisories: 14 breaking, 8 new APIs and options. Each one cited. Sources checked 2026-10-21. HTML: https://unstale.sh/pypi/graphql-core/

To see which of these apply to a repository, run `npx @unstale/cli init` in it.

## graphql-core 3

### Breaking changes

- AST collection fields are tuples instead of lists. (3.3.0) — [release notes](https://github.com/graphql-python/graphql-core/releases/tag/v3.3.0)
- AST nodes are frozen dataclasses, and all AST collection fields are tuples instead of lists. (3.3.0) — [release notes](https://github.com/graphql-python/graphql-core/releases/tag/v3.3.0)
- create_source_event_stream() now takes a built Executor instead of the request arguments. (3.3.0) — [release notes](https://github.com/graphql-python/graphql-core/releases/tag/v3.3.0)
- Functions and options deprecated in GraphQL.js 16 have been removed. (3.3.0) — [release notes](https://github.com/graphql-python/graphql-core/releases/tag/v3.3.0)
- ExecutionContext has been renamed to Executor. (3.3.0) — [release notes](https://github.com/graphql-python/graphql-core/releases/tag/v3.3.0)
- The execution_context_class parameter has been renamed to executor_class. (3.3.0) — [release notes](https://github.com/graphql-python/graphql-core/releases/tag/v3.3.0)
- The parser option has been removed because directives on directive definitions and extensions are now part of the language. (3.3.0) — [release notes](https://github.com/graphql-python/graphql-core/releases/tag/v3.3.0)
- A Python int that cannot be represented exactly as a float now raises a GraphQLError when coerced to Float. (3.3.0) — [release notes](https://github.com/graphql-python/graphql-core/releases/tag/v3.3.0)
- Input coercion follows the specification more strictly, and default values are validated against their types. (3.3.0) — [release notes](https://github.com/graphql-python/graphql-core/releases/tag/v3.3.0)
- GraphQL-core 3.3.0 supports Python 3.10 to 3.15; Python 3.7 to 3.9 are no longer supported. (3.3.0) — [release notes](https://github.com/graphql-python/graphql-core/releases/tag/v3.3.0)
- Schema validation rejects input objects that cannot be given a finite value and reports circular input object references. (3.3.0) — [release notes](https://github.com/graphql-python/graphql-core/releases/tag/v3.3.0)
- subscribe() stays synchronous when possible, like execute(), and raises a GraphQLError for non-subscription operations. (3.3.0) — [release notes](https://github.com/graphql-python/graphql-core/releases/tag/v3.3.0)
- The parser's token limit now counts every consumed token, including skipped comments, so comment-padded documents can no longer bypass the limit. (3.2.12) — [release notes](https://github.com/graphql-python/graphql-core/releases/tag/v3.2.12)
- The token_count of a parsed document now includes comments. (3.2.12) — [release notes](https://github.com/graphql-python/graphql-core/releases/tag/v3.2.12)

### New APIs and options

- Aborting an operation raises this error with the partial result. (3.3.0) — [release notes](https://github.com/graphql-python/graphql-core/releases/tag/v3.3.0)
- Operations can be aborted with an AbortSignal. (3.3.0) — [release notes](https://github.com/graphql-python/graphql-core/releases/tag/v3.3.0)
- Directives on directive definitions and directive extensions are now part of the language. (3.3.0) — [release notes](https://github.com/graphql-python/graphql-core/releases/tag/v3.3.0)
- Executors support hooks. (3.3.0) — [release notes](https://github.com/graphql-python/graphql-core/releases/tag/v3.3.0)
- Adds incremental delivery with @defer and @stream, following the current spec proposal. (3.3.0) — [release notes](https://github.com/graphql-python/graphql-core/releases/tag/v3.3.0)
- Adds experimental fragment arguments through a parser option. (3.3.0) — [release notes](https://github.com/graphql-python/graphql-core/releases/tag/v3.3.0)
- This new function reports safe changes in addition to breaking and dangerous changes. (3.3.0) — [release notes](https://github.com/graphql-python/graphql-core/releases/tag/v3.3.0)
- Use this new method to get the enclosing scalar inside list literals in custom scalar positions. (3.3.0) — [release notes](https://github.com/graphql-python/graphql-core/releases/tag/v3.3.0)

### Behavior and default changes

- Returns None inside list literals in custom scalar positions; use get_parent_input_type() for the enclosing scalar. (3.3.0) — [release notes](https://github.com/graphql-python/graphql-core/releases/tag/v3.3.0)
- 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. (3.2.12) — [release notes](https://github.com/graphql-python/graphql-core/releases/tag/v3.2.12)

### Fixes and other changes

- An explicit Undefined variable value is treated as omitted, so the variable's default applies. (3.3.0) — [release notes](https://github.com/graphql-python/graphql-core/releases/tag/v3.3.0)
- Returns None inside list literals in custom scalar positions; use get_parent_input_type() for the enclosing scalar. (3.3.0) — [release notes](https://github.com/graphql-python/graphql-core/releases/tag/v3.3.0)
- The error message now correctly says "abstract type" instead of "composite type". (3.2.13) — [release notes](https://github.com/graphql-python/graphql-core/releases/tag/v3.2.13)
- On Python 3.14, graphql_sync() and execute_sync() now report that execution failed to complete synchronously when called outside a running event loop. (3.2.13) — [release notes](https://github.com/graphql-python/graphql-core/releases/tag/v3.2.13)
- Truncated string escape sequences now produce a GraphQLSyntaxError instead of an unhandled IndexError from parse() or graphql_sync(). (3.2.13) — [release notes](https://github.com/graphql-python/graphql-core/releases/tag/v3.2.13)
- Type hints now use uppercase values for the kind of types returned by introspection. (3.2.13) — [release notes](https://github.com/graphql-python/graphql-core/releases/tag/v3.2.13)
- Python 3.15 is now supported. (3.2.13) — [release notes](https://github.com/graphql-python/graphql-core/releases/tag/v3.2.13)
