{"id":"arize-phoenix","title":"Arize Phoenix (arize-phoenix)","library":"arize-phoenix","description":"Open-source AI observability and evaluation platform from Arize AI. Phoenix provides tracing, evaluation, prompt management, datasets, and experiments for LLM applications. Built on OpenTelemetry and OpenInference. Can be run locally, self-hosted (Docker/K8s), or accessed via cloud at app.phoenix.arize.com. CRITICAL: Phoenix is a separate product from Arize AX (the enterprise cloud platform). They share the Arize brand but use different packages, credentials, and endpoints: Phoenix uses phoenix.otel + PHOENIX_API_KEY; Arize AX uses arize.otel + ARIZE_SPACE_ID + ARIZE_API_KEY. arize-phoenix is the full-platform bundle. For production deployments, the modular sub-packages (arize-phoenix-otel, arize-phoenix-client, arize-phoenix-evals) are preferred. LICENSE: Elastic License 2.0 (ELv2) — NOT MIT/Apache. Restrictions apply to providing Phoenix as a managed service to third parties.","status":"active","version":"13.3.0","install":[{"cmd":"pip install arize-phoenix","lang":"bash","label":"Full platform (server + all APIs) — for local dev / self-hosting"},{"cmd":"pip install arize-phoenix-otel arize-phoenix-client arize-phoenix-evals","lang":"bash","label":"Modular install — preferred for production app code against a deployed Phoenix server"},{"cmd":"pip install 'arize-phoenix[evals]'","lang":"bash","label":"Full platform + evals extra"},{"cmd":"pip install 'arize-phoenix[pg]'","lang":"bash","label":"Full platform + PostgreSQL backend (instead of default SQLite)"}],"dependencies":[],"imports":[{"symbol":"register (phoenix.otel)","correct":"from phoenix.otel import register","wrong":"from arize.otel import register","note":"Phoenix OTel registration. arize.otel.register sends to Arize AX. phoenix.otel.register sends to Phoenix. They look identical — wrong import sends traces to the wrong backend silently."},{"symbol":"Client (phoenix.client)","correct":"from phoenix.client import Client","wrong":"from arize import ArizeClient","note":"Phoenix REST client. ArizeClient is for Arize AX. Different platforms, different credentials."},{"symbol":"llm_classify (evals)","correct":"from phoenix.evals import llm_classify, OpenAIModel","note":"Primary evaluation API. Requires arize-phoenix-evals installed separately (not included in arize-phoenix-otel)."}],"quickstart":{"code":"# === OPTION A: Local dev (run Phoenix server + instrument your app) ===\n\n# 1. Launch Phoenix server locally\nimport phoenix as px\npx.launch_app()  # Opens UI at http://localhost:6006\n\n# 2. Instrument with OTel\nfrom phoenix.otel import register\nfrom openinference.instrumentation.openai import OpenAIInstrumentor\n\ntracer_provider = register(\n    project_name='my-app',\n    # auto_instrument=True  # Only works if openinference-instrumentation-* pkgs are installed\n)\nOpenAIInstrumentor().instrument(tracer_provider=tracer_provider)\n\nimport openai\nclient = openai.OpenAI()\nresponse = client.chat.completions.create(\n    model='gpt-4o',\n    messages=[{'role': 'user', 'content': 'Hello!'}]\n)\n# Trace visible in Phoenix UI at http://localhost:6006\n\n# === OPTION B: Production (app code → deployed Phoenix server) ===\nimport os\nos.environ['PHOENIX_COLLECTOR_ENDPOINT'] = 'https://app.phoenix.arize.com/s/my-space'\nos.environ['PHOENIX_API_KEY'] = 'your-phoenix-api-key'\n\nfrom phoenix.otel import register\ntracer_provider = register(project_name='prod-app', batch=True)\nOpenAIInstrumentor().instrument(tracer_provider=tracer_provider)\n\n# === Phoenix Client (REST API) ===\nfrom phoenix.client import Client\nph = Client()  # reads PHOENIX_BASE_URL and PHOENIX_API_KEY from env\n\n# Query traces\nspans = ph.spans.query(project_name='my-app')\n\n# === Evaluations ===\nfrom phoenix.evals import llm_classify, OpenAIModel\nmodel = OpenAIModel(model='gpt-4o')\nresults = llm_classify(\n    dataframe=spans_df,\n    model=model,\n    template='hallucination',  # built-in template\n    rails=['factual', 'hallucinated']\n)","lang":"python","description":"For local dev, px.launch_app() starts the Phoenix server in-process. For production deployments, run Phoenix as a separate service (Docker/K8s) and use the modular sub-packages in your app code. Never mix Phoenix and Arize AX credentials."},"env_vars":{"required":[{"name":"PHOENIX_API_KEY","note":"API key for Phoenix cloud (app.phoenix.arize.com) or authenticated self-hosted instances. NOT the same as ARIZE_API_KEY (that's for Arize AX)."},{"name":"PHOENIX_COLLECTOR_ENDPOINT","note":"OTLP trace collector URL. Cloud: https://app.phoenix.arize.com/s/<your-space>. Local: http://localhost:6006/v1/traces (default when running locally)."}],"optional":[{"name":"PHOENIX_BASE_URL","note":"Base URL for the Phoenix Client (REST API). Defaults to http://localhost:6006 for local server."},{"name":"PHOENIX_PROJECT_NAME","note":"Default project name for grouping traces. Defaults to 'default'."},{"name":"PHOENIX_CLIENT_HEADERS","note":"Custom HTTP headers for client and OTEL. Format: 'key=value,key2=value2' (equals-separated, NOT colon-separated)."}]},"warnings":[{"severity":"breaking","message":"Phoenix (arize-phoenix) and Arize AX (arize) are two completely different products that share the Arize brand. They have different packages, different credentials, different endpoints, and different import paths. The most dangerous confusion: both have a register() function (phoenix.otel.register vs arize.otel.register) that look identical but export to completely different backends. Using the wrong one sends traces to the wrong service silently with no error.","affected_versions":"all","fix":"Phoenix: from phoenix.otel import register + PHOENIX_API_KEY + PHOENIX_COLLECTOR_ENDPOINT. Arize AX: from arize.otel import register + ARIZE_API_KEY + ARIZE_SPACE_ID. Confirm which product you have an account for before writing any code."},{"severity":"breaking","message":"auto_instrument=True in register() does NOT work out of the box. It only instruments providers for which you have separately installed the corresponding openinference-instrumentation-* package. For example, to auto-trace OpenAI calls, you must install openinference-instrumentation-openai separately. If the instrumentation package is absent, auto_instrument silently skips that provider.","affected_versions":"all","fix":"Install the specific instrumentors you need: pip install openinference-instrumentation-openai openinference-instrumentation-anthropic openinference-instrumentation-langchain etc. Or install all at once: pip install openinference-instrumentation."},{"severity":"gotcha","message":"arize-phoenix is licensed under Elastic License 2.0 (ELv2), NOT MIT or Apache. ELv2 prohibits providing Phoenix as a managed service to third parties (i.e., you cannot resell or host Phoenix as a product feature that your own customers access directly). Internal use and self-hosting for your own team are fully permitted.","affected_versions":"all","fix":"For SaaS products where your customers would access Phoenix UI/APIs directly, consult Arize AI about a commercial license. For internal observability tooling, ELv2 permits free self-hosting."},{"severity":"gotcha","message":"pip install arize-phoenix installs the full platform bundle including a FastAPI server, SQLite/PostgreSQL ORM, and a bundled React frontend — it's a heavy install (~100MB+). In production app code (your LLM service), you almost never want the full bundle. You only need arize-phoenix-otel (for tracing) and/or arize-phoenix-client (for querying).","affected_versions":"all","fix":"In app service requirements.txt: pip install arize-phoenix-otel arize-phoenix-client. Reserve pip install arize-phoenix for the dedicated Phoenix server process."},{"severity":"gotcha","message":"PHOENIX_CLIENT_HEADERS uses equals-sign-separated key=value format (matching OTel conventions), not HTTP colon-separated format. PHOENIX_CLIENT_HEADERS='Authorization=Bearer token' is correct. Using 'Authorization: Bearer token' (colon) silently fails.","affected_versions":"all","fix":"Always use equals sign: PHOENIX_CLIENT_HEADERS='Authorization=Bearer <token>'."},{"severity":"gotcha","message":"By default, arize-phoenix collects basic web analytics (page views, UI interactions) from the Phoenix UI. This applies to the hosted server only — not to trace data or LLM inputs/outputs. Self-hosted instances have this disabled by default as of recent versions.","affected_versions":"all","fix":"If analytics collection is a concern for self-hosted deployments, review your version's telemetry settings. Trace data and LLM content are never collected by Phoenix's own telemetry."}],"last_verified":"2026-02-28","next_check":"2026-05-28","source_url":"https://github.com/Arize-ai/phoenix","language":"en","source_language":"en","tags":["arize-phoenix","phoenix","tracing","observability","llm-monitoring","opentelemetry","openinference","evaluation","self-hosted","open-source","elv2"]}