Skip to content

Support Python 3.14 #326

Description

@adubovik

Pydantic V1 doesn't work in Python 3.14. We need to take care of it.

Make sure that the following case works as expected:

  1. Python 3.14
  2. Client has Pydantic V2 installed as a dependency
  3. PYDANTIC_V2 env var is unset
  4. Client only imports the telemetry code from DIAL SDK:
from aidial_sdk.telemetry.init import init_telemetry, TelemetryConfig

init_telemetry(
    app=None,
    config=TelemetryConfig(
        service_name="service-name"
    )
)

Currently, the following error is thrown:

Stack trace
.\aidial_sdk\_pydantic\__init__.py:58: UserWarning: Core Pydantic V1 functionality isn't compatible with Python 3.14 or greater.
  from pydantic.v1 import (
Process SpawnProcess-1:
Traceback (most recent call last):
  File ".\pythoncore-3.14-64\Lib\multiprocessing\process.py", line 320, in _bootstrap
    self.run()
    ~~~~~~~~^^
  File ".\pythoncore-3.14-64\Lib\multiprocessing\process.py", line 108, in run
    self._target(*self._args, **self._kwargs)
    ~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File ".\uvicorn\_subprocess.py", line 80, in subprocess_started
    target(sockets=sockets)
    ~~~~~~^^^^^^^^^^^^^^^^^
  File ".\uvicorn\server.py", line 67, in run
    return asyncio_run(self.serve(sockets=sockets), loop_factory=self.config.get_loop_factory())
  File ".\pythoncore-3.14-64\Lib\asyncio\runners.py", line 204, in run
    return runner.run(main)
           ~~~~~~~~~~^^^^^^
  File ".\pythoncore-3.14-64\Lib\asyncio\runners.py", line 127, in run
    return self._loop.run_until_complete(task)
           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^
  File ".\pythoncore-3.14-64\Lib\asyncio\base_events.py", line 719, in run_until_complete
    return future.result()
           ~~~~~~~~~~~~~^^
  File ".\uvicorn\server.py", line 71, in serve
    await self._serve(sockets)
  File ".\uvicorn\server.py", line 78, in _serve
    config.load()
    ~~~~~~~~~~~^^
  File ".\uvicorn\config.py", line 439, in load
    self.loaded_app = import_from_string(self.app)
                      ~~~~~~~~~~~~~~~~~~^^^^^^^^^^
  File ".\uvicorn\importer.py", line 19, in import_from_string
    module = importlib.import_module(module_str)
  File ".\pythoncore-3.14-64\Lib\importlib\__init__.py", line 88, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
           ~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "<frozen importlib._bootstrap>", line 1398, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1371, in _find_and_load
  File "<frozen importlib._bootstrap>", line 1342, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 938, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 759, in exec_module
  File "<frozen importlib._bootstrap>", line 491, in _call_with_frames_removed
  File "C:\Users\Aliaksei_Labanau\projects\chatgpt\ai-dial-admin-evaluation-metrics\aidial_admin_evaluation_metrics\app.py", line 14, in <module>
    from aidial_sdk.telemetry.init import init_telemetry, TelemetryConfig
  File ".\aidial_sdk\__init__.py", line 1, in <module>
    from aidial_sdk.application import DIALApp
  File ".\aidial_sdk\application.py", line 17, in <module>
    from aidial_sdk.chat_completion.base import ChatCompletion
  File ".\aidial_sdk\chat_completion\__init__.py", line 1, in <module>
    from aidial_sdk.chat_completion.base import ChatCompletion
  File ".\aidial_sdk\chat_completion\base.py", line 4, in <module>
    from aidial_sdk.chat_completion.request import Request
  File ".\aidial_sdk\chat_completion\request.py", line 16, in <module>
    from aidial_sdk.deployment.from_request_mixin import FromRequestDeploymentMixin
  File ".\aidial_sdk\deployment\from_request_mixin.py", line 45, in <module>
    class FromRequestDeploymentMixin(FromRequestMixin):
    ...<164 lines>...
            return await _get_request_json_body(request)
  File ".\pydantic\v1\main.py", line 221, in __new__
    inferred = ModelField.infer(
        name=var_name,
    ...<3 lines>...
        config=config,
    )
  File ".\pydantic\v1\fields.py", line 504, in infer
    return cls(
        name=name,
    ...<7 lines>...
        field_info=field_info,
    )
  File ".\pydantic\v1\fields.py", line 434, in __init__
    self.prepare()
    ~~~~~~~~~~~~^^
  File ".\pydantic\v1\fields.py", line 544, in prepare
    self._set_default_and_type()
    ~~~~~~~~~~~~~~~~~~~~~~~~~~^^
  File ".\pydantic\v1\fields.py", line 576, in _set_default_and_type
    raise errors_.ConfigError(f'unable to infer type for attribute "{self.name}"')
pydantic.v1.errors.ConfigError: unable to infer type for attribute "base_url"

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    Status
    No status

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions