langchain-ai / langgraph

Build resilient language agents as graphs.
https://langchain-ai.github.io/langgraph/
MIT License
6.36k stars 1.01k forks source link

typing.TypedDict is not supported in with pydantic in Python < 3.12 #2198

Open n-sviridenko opened 23 hours ago

n-sviridenko commented 23 hours ago

Checked other resources

Example Code

Assume installing any template would do the same, as long as you're on the same dependency versions (but I also tried to upgrade to the latest - didn't work).

The codebase is huge and with a sensitive logic, so I can't upload it here. But you can access the deployment link I provided below to debug.

Error Message and Stack Trace (if applicable)

27/10/2024, 15:20:20
Started server process [1]
27/10/2024, 15:20:20
Waiting for application startup.
27/10/2024, 15:20:21
Postgres pool stats
27/10/2024, 15:20:21
Redis pool stats
27/10/2024, 15:20:21
Registering graph with id 'agent'
27/10/2024, 15:20:21
Starting cron scheduler
27/10/2024, 15:20:21
Application startup complete.
27/10/2024, 15:20:21
Starting 10 background workers
27/10/2024, 15:20:21
Uvicorn running on http://0.0.0.0:8080 (Press CTRL+C to quit)
27/10/2024, 15:20:22
Queue stats
27/10/2024, 15:20:22
Worker stats
27/10/2024, 15:20:48
HTTP Request: GET https://api.smith.langchain.com/auth/public "HTTP/1.1 200 OK"
27/10/2024, 15:20:48
POST /assistants/search 200 147ms
27/10/2024, 15:20:49
HTTP Request: GET https://api.smith.langchain.com/auth/public "HTTP/1.1 200 OK"
27/10/2024, 15:20:49
POST /assistants/search 200 79ms
27/10/2024, 15:20:49
HTTP Request: GET https://api.smith.langchain.com/auth/public "HTTP/1.1 200 OK"
27/10/2024, 15:20:49
HTTP Request: GET https://api.smith.langchain.com/auth/public "HTTP/1.1 200 OK"
27/10/2024, 15:20:49
HTTP Request: GET https://api.smith.langchain.com/auth/public "HTTP/1.1 200 OK"
27/10/2024, 15:20:49
GET /assistants/fe096781-5601-53d2-b2f6-0d3403f7e9ca/subgraphs 200 110ms
27/10/2024, 15:20:49
GET /assistants/fe096781-5601-53d2-b2f6-0d3403f7e9ca/schemas 200 244ms
27/10/2024, 15:20:49
POST /threads/search 200 247ms
27/10/2024, 15:20:49
HTTP Request: GET https://api.smith.langchain.com/auth/public "HTTP/1.1 200 OK"
27/10/2024, 15:20:49
Exception in ASGI application

  + Exception Group Traceback (most recent call last):
  |   File "/usr/local/lib/python3.11/site-packages/starlette/_utils.py", line 76, in collapse_excgroups
  |     yield
  |   File "/usr/local/lib/python3.11/site-packages/starlette/middleware/base.py", line 186, in __call__
  |     async with anyio.create_task_group() as task_group:
  |   File "/usr/local/lib/python3.11/site-packages/anyio/_backends/_asyncio.py", line 763, in __aexit__
  |     raise BaseExceptionGroup(
  | ExceptionGroup: unhandled errors in a TaskGroup (1 sub-exception)
  +-+---------------- 1 ----------------
    | Traceback (most recent call last):
    |   File "/usr/local/lib/python3.11/site-packages/uvicorn/protocols/http/httptools_impl.py", line 401, in run_asgi
    |     result = await app(  # type: ignore[func-returns-value]
    |              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |   File "/usr/local/lib/python3.11/site-packages/uvicorn/middleware/proxy_headers.py", line 60, in __call__
    |     return await self.app(scope, receive, send)
    |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |   File "/usr/local/lib/python3.11/site-packages/starlette/applications.py", line 113, in __call__
    |     await self.middleware_stack(scope, receive, send)
    |   File "/usr/local/lib/python3.11/site-packages/starlette/middleware/errors.py", line 187, in __call__
    |     raise exc
    |   File "/usr/local/lib/python3.11/site-packages/starlette/middleware/errors.py", line 165, in __call__
    |     await self.app(scope, receive, _send)
    |   File "/usr/local/lib/python3.11/site-packages/starlette/middleware/cors.py", line 93, in __call__
    |     await self.simple_response(scope, receive, send, request_headers=headers)
    |   File "/usr/local/lib/python3.11/site-packages/starlette/middleware/cors.py", line 144, in simple_response
    |     await self.app(scope, receive, send)
    |   File "/usr/local/lib/python3.11/site-packages/starlette/middleware/base.py", line 185, in __call__
    |     with collapse_excgroups():
    |   File "/usr/local/lib/python3.11/contextlib.py", line 158, in __exit__
    |     self.gen.throw(typ, value, traceback)
    |   File "/usr/local/lib/python3.11/site-packages/starlette/_utils.py", line 82, in collapse_excgroups
    |     raise exc
    |   File "/usr/local/lib/python3.11/site-packages/starlette/middleware/base.py", line 187, in __call__
    |     response = await self.dispatch_func(request, call_next)
    |                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |   File "/usr/local/lib/python3.11/site-packages/langgraph_license/middleware.py", line 20, in dispatch
    |     response = await call_next(request)
    |                ^^^^^^^^^^^^^^^^^^^^^^^^
    |   File "/usr/local/lib/python3.11/site-packages/starlette/middleware/base.py", line 163, in call_next
    |     raise app_exc
    |   File "/usr/local/lib/python3.11/site-packages/starlette/middleware/base.py", line 149, in coro
    |     await self.app(scope, receive_or_disconnect, send_no_error)
    |   File "/api/langgraph_api/shared/http_logger.py", line 58, in __call__
    |   File "/api/langgraph_api/shared/http_logger.py", line 52, in __call__
    |   File "/usr/local/lib/python3.11/site-packages/starlette/middleware/exceptions.py", line 62, in __call__
    |     await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send)
    |   File "/usr/local/lib/python3.11/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app
    |     raise exc
    |   File "/usr/local/lib/python3.11/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app
    |     await app(scope, receive, sender)
    |   File "/usr/local/lib/python3.11/site-packages/starlette/routing.py", line 715, in __call__
    |     await self.middleware_stack(scope, receive, send)
    |   File "/usr/local/lib/python3.11/site-packages/starlette/routing.py", line 735, in app
    |     await route.handle(scope, receive, send)
    |   File "/usr/local/lib/python3.11/site-packages/starlette/routing.py", line 460, in handle
    |     await self.app(scope, receive, send)
    |   File "/api/langgraph_api/auth/middleware.py", line 36, in __call__
    |   File "/usr/local/lib/python3.11/site-packages/starlette/middleware/authentication.py", line 48, in __call__
    |     await self.app(scope, receive, send)
    |   File "/usr/local/lib/python3.11/site-packages/starlette/routing.py", line 715, in __call__
    |     await self.middleware_stack(scope, receive, send)
    |   File "/usr/local/lib/python3.11/site-packages/starlette/routing.py", line 735, in app
    |     await route.handle(scope, receive, send)
    |   File "/api/langgraph_api/shared/route.py", line 118, in handle
    |   File "/usr/local/lib/python3.11/site-packages/starlette/routing.py", line 288, in handle
    |     await self.app(scope, receive, send)
    |   File "/api/langgraph_api/shared/route.py", line 37, in app
    |   File "/usr/local/lib/python3.11/site-packages/starlette/_exception_handler.py", line 53, in wrapped_app
    |     raise exc
    |   File "/usr/local/lib/python3.11/site-packages/starlette/_exception_handler.py", line 42, in wrapped_app
    |     await app(scope, receive, sender)
    |   File "/api/langgraph_api/shared/route.py", line 32, in app
    |   File "/usr/local/lib/python3.11/site-packages/langgraph_storage/retry.py", line 34, in wrapper
    |     return await func(*args, **kwargs)
    |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |   File "/api/langgraph_api/api/assistants.py", line 145, in get_assistant_graph
    |   File "/usr/local/lib/python3.11/site-packages/langgraph/graph/graph.py", line 526, in get_graph
    |     START: graph.add_node(self.get_input_schema(config), START)
    |                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |   File "/usr/local/lib/python3.11/site-packages/langgraph/graph/state.py", line 501, in get_input_schema
    |     return _get_schema(
    |            ^^^^^^^^^^^^
    |   File "/usr/local/lib/python3.11/site-packages/langgraph/graph/state.py", line 820, in _get_schema
    |     return create_model(
    |            ^^^^^^^^^^^^^
    |   File "/usr/local/lib/python3.11/site-packages/langgraph/utils/pydantic.py", line 24, in create_model
    |     return create_model_v2(
    |            ^^^^^^^^^^^^^^^^
    |   File "/usr/local/lib/python3.11/site-packages/langchain_core/utils/pydantic.py", line 631, in create_model_v2
    |     return _create_model_base(
    |            ^^^^^^^^^^^^^^^^^^^
    |   File "/usr/local/lib/python3.11/site-packages/pydantic/main.py", line 1600, in create_model
    |     return meta(
    |            ^^^^^
    |   File "/usr/local/lib/python3.11/site-packages/pydantic/_internal/_model_construction.py", line 224, in __new__
    |     complete_model_class(
    |   File "/usr/local/lib/python3.11/site-packages/pydantic/_internal/_model_construction.py", line 577, in complete_model_class
    |     schema = cls.__get_pydantic_core_schema__(cls, handler)
    |              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |   File "/usr/local/lib/python3.11/site-packages/pydantic/main.py", line 671, in __get_pydantic_core_schema__
    |     return handler(source)
    |            ^^^^^^^^^^^^^^^
    |   File "/usr/local/lib/python3.11/site-packages/pydantic/_internal/_schema_generation_shared.py", line 83, in __call__
    |     schema = self._handler(source_type)
    |              ^^^^^^^^^^^^^^^^^^^^^^^^^^
    |   File "/usr/local/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py", line 655, in generate_schema
    |     schema = self._generate_schema_inner(obj)
    |              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |   File "/usr/local/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py", line 924, in _generate_schema_inner
    |     return self._model_schema(obj)
    |            ^^^^^^^^^^^^^^^^^^^^^^^
    |   File "/usr/local/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py", line 739, in _model_schema
    |     {k: self._generate_md_field_schema(k, v, decorators) for k, v in fields.items()},
    |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |   File "/usr/local/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py", line 739, in <dictcomp>
    |     {k: self._generate_md_field_schema(k, v, decorators) for k, v in fields.items()},
    |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |   File "/usr/local/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py", line 1115, in _generate_md_field_schema
    |     common_field = self._common_field_schema(name, field_info, decorators)
    |                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |   File "/usr/local/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py", line 1308, in _common_field_schema
    |     schema = self._apply_annotations(
    |              ^^^^^^^^^^^^^^^^^^^^^^^^
    |   File "/usr/local/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py", line 2107, in _apply_annotations
    |     schema = get_inner_schema(source_type)
    |              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |   File "/usr/local/lib/python3.11/site-packages/pydantic/_internal/_schema_generation_shared.py", line 83, in __call__
    |     schema = self._handler(source_type)
    |              ^^^^^^^^^^^^^^^^^^^^^^^^^^
    |   File "/usr/local/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py", line 2088, in inner_handler
    |     schema = self._generate_schema_inner(obj)
    |              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |   File "/usr/local/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py", line 929, in _generate_schema_inner
    |     return self.match_type(obj)
    |            ^^^^^^^^^^^^^^^^^^^^
    |   File "/usr/local/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py", line 999, in match_type
    |     return self._typed_dict_schema(obj, None)
    |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |   File "/usr/local/lib/python3.11/site-packages/pydantic/_internal/_generate_schema.py", line 1461, in _typed_dict_schema
    |     raise PydanticUserError(
    | pydantic.errors.PydanticUserError: Please use `typing_extensions.TypedDict` instead of `typing.TypedDict` on Python < 3.12.
    | 
    | For further information visit https://errors.pydantic.dev/2.9/u/typed-dict-version


### Description

Happening on langsmith, when trying to run a langgraph studio on cloud. Deployment URL: https://smith.langchain.com/o/bc95d4c8-cf10-4e47-9b38-c0bc0a195ff6/host/4648030b-6387-4d60-afb2-77b41c2f812a?tab=1&revisionPeek=891430b7-3548-4f46-84c8-7a07a5845351

This issue seemed to be fixed https://github.com/langchain-ai/langgraph/issues/1856 , but in fact is still ongoing.

### System Info

pip freeze

langchain==0.3.4
langchain-community==0.3.3
langchain-core==0.3.13
langchain-openai==0.2.3
langchain-text-splitters==0.3.0

--

Other deps

openai==1.52.2
psycopg[pool,binary]==3.1.19
python-dotenv==1.0.1
langgraph==0.2.39
langchain-core==0.3.13
langchain-openai==0.2.3

--

running on linux (your cloud)
python 3.11.5
gauravprasadgp commented 18 hours ago

i too have python 3.11 and StateGraph input as TypedDict, try using this specific versions of langgraph==0.0.59