[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6ADVXJ7AD86NT01SQ30A5TT":3,"skill-same:01M6ADVXJ7AD86NT01SQ30A5TT":142},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":42,"linkOnly":43,"markdownContent":44,"markdownBody":45,"frontMatter":46,"refName":56,"commitSha":57,"skillDirectory":58,"forksCount":59,"repositoryHtmlUrl":60,"repositoryHomepageUrl":61,"ownerHtmlUrl":62,"ownerBlogUrl":63,"ownerDescription":64,"updatedAt":65,"install":66,"resources":79},"01M6ADVXJ7AD86NT01SQ30A5TT","observability-phoenix",null,"Open-source AI observability platform for LLM tracing, evaluation, and monitoring. Use when debugging LLM applications with detailed traces, running evaluations on datasets, or monitoring production AI systems with real-time insights.","davila7\u002Fclaude-code-templates","davila7","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F6216945?v=4","01M6ADEWWFPS191NFM0Y1EX1JH","Daniel Avila","01M6ADJHGM78PHQRD3XZTFDVKK",33481,"MIT","https:\u002F\u002Fgithub.com\u002Fdavila7\u002Fclaude-code-templates\u002Fblob\u002Fmain\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fai-research\u002Fobservability-phoenix\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41],"observability","observability phoenix","real-time","running","when","source","for","orchestra","insights","LLM Applications","platform","time","observability platform","open","research","OpenTelemetry","Arize","Phoenix","llm ops","Evaluation","monitoring","tracing","debugging","2026-11-10 10:12:30",false,"---\nname: observability-phoenix\ndescription: Open-source AI observability platform for LLM tracing, evaluation, and monitoring. Use when debugging LLM applications with detailed traces, running evaluations on datasets, or monitoring production AI systems with real-time insights.\nversion: 1.0.0\nauthor: Orchestra Research\nlicense: MIT\ntags: [Observability, Phoenix, Arize, Tracing, Evaluation, Monitoring, LLM Ops, OpenTelemetry]\ndependencies: [arize-phoenix>=12.0.0]\n---\n\n# Phoenix - AI Observability Platform\n\nOpen-source AI observability and evaluation platform for LLM applications with tracing, evaluation, datasets, experiments, and real-time monitoring.\n\n## When to use Phoenix\n\n**Use Phoenix when:**\n- Debugging LLM application issues with detailed traces\n- Running systematic evaluations on datasets\n- Monitoring production LLM systems in real-time\n- Building experiment pipelines for prompt\u002Fmodel comparison\n- Self-hosted observability without vendor lock-in\n\n**Key features:**\n- **Tracing**: OpenTelemetry-based trace collection for any LLM framework\n- **Evaluation**: LLM-as-judge evaluators for quality assessment\n- **Datasets**: Versioned test sets for regression testing\n- **Experiments**: Compare prompts, models, and configurations\n- **Playground**: Interactive prompt testing with multiple models\n- **Open-source**: Self-hosted with PostgreSQL or SQLite\n\n**Use alternatives instead:**\n- **LangSmith**: Managed platform with LangChain-first integration\n- **Weights & Biases**: Deep learning experiment tracking focus\n- **Arize Cloud**: Managed Phoenix with enterprise features\n- **MLflow**: General ML lifecycle, model registry focus\n\n## Quick start\n\n### Installation\n\n```bash\npip install arize-phoenix\n\n# With specific backends\npip install arize-phoenix[embeddings]  # Embedding analysis\npip install arize-phoenix-otel         # OpenTelemetry config\npip install arize-phoenix-evals        # Evaluation framework\npip install arize-phoenix-client       # Lightweight REST client\n```\n\n### Launch Phoenix server\n\n```python\nimport phoenix as px\n\n# Launch in notebook (ThreadServer mode)\nsession = px.launch_app()\n\n# View UI\nsession.view()  # Embedded iframe\nprint(session.url)  # http:\u002F\u002Flocalhost:6006\n```\n\n### Command-line server (production)\n\n```bash\n# Start Phoenix server\nphoenix serve\n\n# With PostgreSQL\nexport PHOENIX_SQL_DATABASE_URL=\"postgresql:\u002F\u002Fuser:pass@host\u002Fdb\"\nphoenix serve --port 6006\n```\n\n### Basic tracing\n\n```python\nfrom phoenix.otel import register\nfrom openinference.instrumentation.openai import OpenAIInstrumentor\n\n# Configure OpenTelemetry with Phoenix\ntracer_provider = register(\n    project_name=\"my-llm-app\",\n    endpoint=\"http:\u002F\u002Flocalhost:6006\u002Fv1\u002Ftraces\"\n)\n\n# Instrument OpenAI SDK\nOpenAIInstrumentor().instrument(tracer_provider=tracer_provider)\n\n# All OpenAI calls are now traced\nfrom openai import OpenAI\nclient = OpenAI()\nresponse = client.chat.completions.create(\n    model=\"gpt-4o\",\n    messages=[{\"role\": \"user\", \"content\": \"Hello!\"}]\n)\n```\n\n## Core concepts\n\n### Traces and spans\n\nA **trace** represents a complete execution flow, while **spans** are individual operations within that trace.\n\n```python\nfrom phoenix.otel import register\nfrom opentelemetry import trace\n\n# Setup tracing\ntracer_provider = register(project_name=\"my-app\")\ntracer = trace.get_tracer(__name__)\n\n# Create custom spans\nwith tracer.start_as_current_span(\"process_query\") as span:\n    span.set_attribute(\"input.value\", query)\n\n    # Child spans are automatically nested\n    with tracer.start_as_current_span(\"retrieve_context\"):\n        context = retriever.search(query)\n\n    with tracer.start_as_current_span(\"generate_response\"):\n        response = llm.generate(query, context)\n\n    span.set_attribute(\"output.value\", response)\n```\n\n### Projects\n\nProjects organize related traces:\n\n```python\nimport os\nos.environ[\"PHOENIX_PROJECT_NAME\"] = \"production-chatbot\"\n\n# Or per-trace\nfrom phoenix.otel import register\ntracer_provider = register(project_name=\"experiment-v2\")\n```\n\n## Framework instrumentation\n\n### OpenAI\n\n```python\nfrom phoenix.otel import register\nfrom openinference.instrumentation.openai import OpenAIInstrumentor\n\ntracer_provider = register()\nOpenAIInstrumentor().instrument(tracer_provider=tracer_provider)\n```\n\n### LangChain\n\n```python\nfrom phoenix.otel import register\nfrom openinference.instrumentation.langchain import LangChainInstrumentor\n\ntracer_provider = register()\nLangChainInstrumentor().instrument(tracer_provider=tracer_provider)\n\n# All LangChain operations traced\nfrom langchain_openai import ChatOpenAI\nllm = ChatOpenAI(model=\"gpt-4o\")\nresponse = llm.invoke(\"Hello!\")\n```\n\n### LlamaIndex\n\n```python\nfrom phoenix.otel import register\nfrom openinference.instrumentation.llama_index import LlamaIndexInstrumentor\n\ntracer_provider = register()\nLlamaIndexInstrumentor().instrument(tracer_provider=tracer_provider)\n```\n\n### Anthropic\n\n```python\nfrom phoenix.otel import register\nfrom openinference.instrumentation.anthropic import AnthropicInstrumentor\n\ntracer_provider = register()\nAnthropicInstrumentor().instrument(tracer_provider=tracer_provider)\n```\n\n## Evaluation framework\n\n### Built-in evaluators\n\n```python\nfrom phoenix.evals import (\n    OpenAIModel,\n    HallucinationEvaluator,\n    RelevanceEvaluator,\n    ToxicityEvaluator,\n    llm_classify\n)\n\n# Setup model for evaluation\neval_model = OpenAIModel(model=\"gpt-4o\")\n\n# Evaluate hallucination\nhallucination_eval = HallucinationEvaluator(eval_model)\nresults = hallucination_eval.evaluate(\n    input=\"What is the capital of France?\",\n    output=\"The capital of France is Paris.\",\n    reference=\"Paris is the capital of France.\"\n)\n```\n\n### Custom evaluators\n\n```python\nfrom phoenix.evals import llm_classify\n\n# Define custom evaluation\ndef evaluate_helpfulness(input_text, output_text):\n    template = \"\"\"\n    Evaluate if the response is helpful for the given question.\n\n    Question: {input}\n    Response: {output}\n\n    Is this response helpful? Answer 'helpful' or 'not_helpful'.\n    \"\"\"\n\n    result = llm_classify(\n        model=eval_model,\n        template=template,\n        input=input_text,\n        output=output_text,\n        rails=[\"helpful\", \"not_helpful\"]\n    )\n    return result\n```\n\n### Run evaluations on dataset\n\n```python\nfrom phoenix import Client\nfrom phoenix.evals import run_evals\n\nclient = Client()\n\n# Get spans to evaluate\nspans_df = client.get_spans_dataframe(\n    project_name=\"my-app\",\n    filter_condition=\"span_kind == 'LLM'\"\n)\n\n# Run evaluations\neval_results = run_evals(\n    dataframe=spans_df,\n    evaluators=[\n        HallucinationEvaluator(eval_model),\n        RelevanceEvaluator(eval_model)\n    ],\n    provide_explanation=True\n)\n\n# Log results back to Phoenix\nclient.log_evaluations(eval_results)\n```\n\n## Datasets and experiments\n\n### Create dataset\n\n```python\nfrom phoenix import Client\n\nclient = Client()\n\n# Create dataset\ndataset = client.create_dataset(\n    name=\"qa-test-set\",\n    description=\"QA evaluation dataset\"\n)\n\n# Add examples\nclient.add_examples_to_dataset(\n    dataset_name=\"qa-test-set\",\n    examples=[\n        {\n            \"input\": {\"question\": \"What is Python?\"},\n            \"output\": {\"answer\": \"A programming language\"}\n        },\n        {\n            \"input\": {\"question\": \"What is ML?\"},\n            \"output\": {\"answer\": \"Machine learning\"}\n        }\n    ]\n)\n```\n\n### Run experiment\n\n```python\nfrom phoenix import Client\nfrom phoenix.experiments import run_experiment\n\nclient = Client()\n\ndef my_model(input_data):\n    \"\"\"Your model function.\"\"\"\n    question = input_data[\"question\"]\n    return {\"answer\": generate_answer(question)}\n\ndef accuracy_evaluator(input_data, output, expected):\n    \"\"\"Custom evaluator.\"\"\"\n    return {\n        \"score\": 1.0 if expected[\"answer\"].lower() in output[\"answer\"].lower() else 0.0,\n        \"label\": \"correct\" if expected[\"answer\"].lower() in output[\"answer\"].lower() else \"incorrect\"\n    }\n\n# Run experiment\nresults = run_experiment(\n    dataset_name=\"qa-test-set\",\n    task=my_model,\n    evaluators=[accuracy_evaluator],\n    experiment_name=\"baseline-v1\"\n)\n\nprint(f\"Average accuracy: {results.aggregate_metrics['accuracy']}\")\n```\n\n## Client API\n\n### Query traces and spans\n\n```python\nfrom phoenix import Client\n\nclient = Client(endpoint=\"http:\u002F\u002Flocalhost:6006\")\n\n# Get spans as DataFrame\nspans_df = client.get_spans_dataframe(\n    project_name=\"my-app\",\n    filter_condition=\"span_kind == 'LLM'\",\n    limit=1000\n)\n\n# Get specific span\nspan = client.get_span(span_id=\"abc123\")\n\n# Get trace\ntrace = client.get_trace(trace_id=\"xyz789\")\n```\n\n### Log feedback\n\n```python\nfrom phoenix import Client\n\nclient = Client()\n\n# Log user feedback\nclient.log_annotation(\n    span_id=\"abc123\",\n    name=\"user_rating\",\n    annotator_kind=\"HUMAN\",\n    score=0.8,\n    label=\"helpful\",\n    metadata={\"comment\": \"Good response\"}\n)\n```\n\n### Export data\n\n```python\n# Export to pandas\ndf = client.get_spans_dataframe(project_name=\"my-app\")\n\n# Export traces\ntraces = client.list_traces(project_name=\"my-app\")\n```\n\n## Production deployment\n\n### Docker\n\n```bash\ndocker run -p 6006:6006 arizephoenix\u002Fphoenix:latest\n```\n\n### With PostgreSQL\n\n```bash\n# Set database URL\nexport PHOENIX_SQL_DATABASE_URL=\"postgresql:\u002F\u002Fuser:pass@host:5432\u002Fphoenix\"\n\n# Start server\nphoenix serve --host 0.0.0.0 --port 6006\n```\n\n### Environment variables\n\n| Variable | Description | Default |\n|----------|-------------|---------|\n| `PHOENIX_PORT` | HTTP server port | `6006` |\n| `PHOENIX_HOST` | Server bind address | `127.0.0.1` |\n| `PHOENIX_GRPC_PORT` | gRPC\u002FOTLP port | `4317` |\n| `PHOENIX_SQL_DATABASE_URL` | Database connection | SQLite temp |\n| `PHOENIX_WORKING_DIR` | Data storage directory | OS temp |\n| `PHOENIX_ENABLE_AUTH` | Enable authentication | `false` |\n| `PHOENIX_SECRET` | JWT signing secret | Required if auth enabled |\n\n### With authentication\n\n```bash\nexport PHOENIX_ENABLE_AUTH=true\nexport PHOENIX_SECRET=\"your-secret-key-min-32-chars\"\nexport PHOENIX_ADMIN_SECRET=\"admin-bootstrap-token\"\n\nphoenix serve\n```\n\n## Best practices\n\n1. **Use projects**: Separate traces by environment (dev\u002Fstaging\u002Fprod)\n2. **Add metadata**: Include user IDs, session IDs for debugging\n3. **Evaluate regularly**: Run automated evaluations in CI\u002FCD\n4. **Version datasets**: Track test set changes over time\n5. **Monitor costs**: Track token usage via Phoenix dashboards\n6. **Self-host**: Use PostgreSQL for production deployments\n\n## Common issues\n\n**Traces not appearing:**\n```python\nfrom phoenix.otel import register\n\n# Verify endpoint\ntracer_provider = register(\n    project_name=\"my-app\",\n    endpoint=\"http:\u002F\u002Flocalhost:6006\u002Fv1\u002Ftraces\"  # Correct endpoint\n)\n\n# Force flush\nfrom opentelemetry import trace\ntrace.get_tracer_provider().force_flush()\n```\n\n**High memory in notebook:**\n```python\n# Close session when done\nsession = px.launch_app()\n# ... do work ...\nsession.close()\npx.close_app()\n```\n\n**Database connection issues:**\n```bash\n# Verify PostgreSQL connection\npsql $PHOENIX_SQL_DATABASE_URL -c \"SELECT 1\"\n\n# Check Phoenix logs\nphoenix serve --log-level debug\n```\n\n## References\n\n- **[Advanced Usage](references\u002Fadvanced-usage.md)** - Custom evaluators, experiments, production setup\n- **[Troubleshooting](references\u002Ftroubleshooting.md)** - Common issues, debugging, performance\n\n## Resources\n\n- **Documentation**: https:\u002F\u002Fdocs.arize.com\u002Fphoenix\n- **Repository**: https:\u002F\u002Fgithub.com\u002FArize-ai\u002Fphoenix\n- **Docker Hub**: https:\u002F\u002Fhub.docker.com\u002Fr\u002Farizephoenix\u002Fphoenix\n- **Version**: 12.0.0+\n- **License**: Apache 2.0\n","# Phoenix - AI Observability Platform\n\nOpen-source AI observability and evaluation platform for LLM applications with tracing, evaluation, datasets, experiments, and real-time monitoring.\n\n## When to use Phoenix\n\n**Use Phoenix when:**\n- Debugging LLM application issues with detailed traces\n- Running systematic evaluations on datasets\n- Monitoring production LLM systems in real-time\n- Building experiment pipelines for prompt\u002Fmodel comparison\n- Self-hosted observability without vendor lock-in\n\n**Key features:**\n- **Tracing**: OpenTelemetry-based trace collection for any LLM framework\n- **Evaluation**: LLM-as-judge evaluators for quality assessment\n- **Datasets**: Versioned test sets for regression testing\n- **Experiments**: Compare prompts, models, and configurations\n- **Playground**: Interactive prompt testing with multiple models\n- **Open-source**: Self-hosted with PostgreSQL or SQLite\n\n**Use alternatives instead:**\n- **LangSmith**: Managed platform with LangChain-first integration\n- **Weights & Biases**: Deep learning experiment tracking focus\n- **Arize Cloud**: Managed Phoenix with enterprise features\n- **MLflow**: General ML lifecycle, model registry focus\n\n## Quick start\n\n### Installation\n\n```bash\npip install arize-phoenix\n\n# With specific backends\npip install arize-phoenix[embeddings]  # Embedding analysis\npip install arize-phoenix-otel         # OpenTelemetry config\npip install arize-phoenix-evals        # Evaluation framework\npip install arize-phoenix-client       # Lightweight REST client\n```\n\n### Launch Phoenix server\n\n```python\nimport phoenix as px\n\n# Launch in notebook (ThreadServer mode)\nsession = px.launch_app()\n\n# View UI\nsession.view()  # Embedded iframe\nprint(session.url)  # http:\u002F\u002Flocalhost:6006\n```\n\n### Command-line server (production)\n\n```bash\n# Start Phoenix server\nphoenix serve\n\n# With PostgreSQL\nexport PHOENIX_SQL_DATABASE_URL=\"postgresql:\u002F\u002Fuser:pass@host\u002Fdb\"\nphoenix serve --port 6006\n```\n\n### Basic tracing\n\n```python\nfrom phoenix.otel import register\nfrom openinference.instrumentation.openai import OpenAIInstrumentor\n\n# Configure OpenTelemetry with Phoenix\ntracer_provider = register(\n    project_name=\"my-llm-app\",\n    endpoint=\"http:\u002F\u002Flocalhost:6006\u002Fv1\u002Ftraces\"\n)\n\n# Instrument OpenAI SDK\nOpenAIInstrumentor().instrument(tracer_provider=tracer_provider)\n\n# All OpenAI calls are now traced\nfrom openai import OpenAI\nclient = OpenAI()\nresponse = client.chat.completions.create(\n    model=\"gpt-4o\",\n    messages=[{\"role\": \"user\", \"content\": \"Hello!\"}]\n)\n```\n\n## Core concepts\n\n### Traces and spans\n\nA **trace** represents a complete execution flow, while **spans** are individual operations within that trace.\n\n```python\nfrom phoenix.otel import register\nfrom opentelemetry import trace\n\n# Setup tracing\ntracer_provider = register(project_name=\"my-app\")\ntracer = trace.get_tracer(__name__)\n\n# Create custom spans\nwith tracer.start_as_current_span(\"process_query\") as span:\n    span.set_attribute(\"input.value\", query)\n\n    # Child spans are automatically nested\n    with tracer.start_as_current_span(\"retrieve_context\"):\n        context = retriever.search(query)\n\n    with tracer.start_as_current_span(\"generate_response\"):\n        response = llm.generate(query, context)\n\n    span.set_attribute(\"output.value\", response)\n```\n\n### Projects\n\nProjects organize related traces:\n\n```python\nimport os\nos.environ[\"PHOENIX_PROJECT_NAME\"] = \"production-chatbot\"\n\n# Or per-trace\nfrom phoenix.otel import register\ntracer_provider = register(project_name=\"experiment-v2\")\n```\n\n## Framework instrumentation\n\n### OpenAI\n\n```python\nfrom phoenix.otel import register\nfrom openinference.instrumentation.openai import OpenAIInstrumentor\n\ntracer_provider = register()\nOpenAIInstrumentor().instrument(tracer_provider=tracer_provider)\n```\n\n### LangChain\n\n```python\nfrom phoenix.otel import register\nfrom openinference.instrumentation.langchain import LangChainInstrumentor\n\ntracer_provider = register()\nLangChainInstrumentor().instrument(tracer_provider=tracer_provider)\n\n# All LangChain operations traced\nfrom langchain_openai import ChatOpenAI\nllm = ChatOpenAI(model=\"gpt-4o\")\nresponse = llm.invoke(\"Hello!\")\n```\n\n### LlamaIndex\n\n```python\nfrom phoenix.otel import register\nfrom openinference.instrumentation.llama_index import LlamaIndexInstrumentor\n\ntracer_provider = register()\nLlamaIndexInstrumentor().instrument(tracer_provider=tracer_provider)\n```\n\n### Anthropic\n\n```python\nfrom phoenix.otel import register\nfrom openinference.instrumentation.anthropic import AnthropicInstrumentor\n\ntracer_provider = register()\nAnthropicInstrumentor().instrument(tracer_provider=tracer_provider)\n```\n\n## Evaluation framework\n\n### Built-in evaluators\n\n```python\nfrom phoenix.evals import (\n    OpenAIModel,\n    HallucinationEvaluator,\n    RelevanceEvaluator,\n    ToxicityEvaluator,\n    llm_classify\n)\n\n# Setup model for evaluation\neval_model = OpenAIModel(model=\"gpt-4o\")\n\n# Evaluate hallucination\nhallucination_eval = HallucinationEvaluator(eval_model)\nresults = hallucination_eval.evaluate(\n    input=\"What is the capital of France?\",\n    output=\"The capital of France is Paris.\",\n    reference=\"Paris is the capital of France.\"\n)\n```\n\n### Custom evaluators\n\n```python\nfrom phoenix.evals import llm_classify\n\n# Define custom evaluation\ndef evaluate_helpfulness(input_text, output_text):\n    template = \"\"\"\n    Evaluate if the response is helpful for the given question.\n\n    Question: {input}\n    Response: {output}\n\n    Is this response helpful? Answer 'helpful' or 'not_helpful'.\n    \"\"\"\n\n    result = llm_classify(\n        model=eval_model,\n        template=template,\n        input=input_text,\n        output=output_text,\n        rails=[\"helpful\", \"not_helpful\"]\n    )\n    return result\n```\n\n### Run evaluations on dataset\n\n```python\nfrom phoenix import Client\nfrom phoenix.evals import run_evals\n\nclient = Client()\n\n# Get spans to evaluate\nspans_df = client.get_spans_dataframe(\n    project_name=\"my-app\",\n    filter_condition=\"span_kind == 'LLM'\"\n)\n\n# Run evaluations\neval_results = run_evals(\n    dataframe=spans_df,\n    evaluators=[\n        HallucinationEvaluator(eval_model),\n        RelevanceEvaluator(eval_model)\n    ],\n    provide_explanation=True\n)\n\n# Log results back to Phoenix\nclient.log_evaluations(eval_results)\n```\n\n## Datasets and experiments\n\n### Create dataset\n\n```python\nfrom phoenix import Client\n\nclient = Client()\n\n# Create dataset\ndataset = client.create_dataset(\n    name=\"qa-test-set\",\n    description=\"QA evaluation dataset\"\n)\n\n# Add examples\nclient.add_examples_to_dataset(\n    dataset_name=\"qa-test-set\",\n    examples=[\n        {\n            \"input\": {\"question\": \"What is Python?\"},\n            \"output\": {\"answer\": \"A programming language\"}\n        },\n        {\n            \"input\": {\"question\": \"What is ML?\"},\n            \"output\": {\"answer\": \"Machine learning\"}\n        }\n    ]\n)\n```\n\n### Run experiment\n\n```python\nfrom phoenix import Client\nfrom phoenix.experiments import run_experiment\n\nclient = Client()\n\ndef my_model(input_data):\n    \"\"\"Your model function.\"\"\"\n    question = input_data[\"question\"]\n    return {\"answer\": generate_answer(question)}\n\ndef accuracy_evaluator(input_data, output, expected):\n    \"\"\"Custom evaluator.\"\"\"\n    return {\n        \"score\": 1.0 if expected[\"answer\"].lower() in output[\"answer\"].lower() else 0.0,\n        \"label\": \"correct\" if expected[\"answer\"].lower() in output[\"answer\"].lower() else \"incorrect\"\n    }\n\n# Run experiment\nresults = run_experiment(\n    dataset_name=\"qa-test-set\",\n    task=my_model,\n    evaluators=[accuracy_evaluator],\n    experiment_name=\"baseline-v1\"\n)\n\nprint(f\"Average accuracy: {results.aggregate_metrics['accuracy']}\")\n```\n\n## Client API\n\n### Query traces and spans\n\n```python\nfrom phoenix import Client\n\nclient = Client(endpoint=\"http:\u002F\u002Flocalhost:6006\")\n\n# Get spans as DataFrame\nspans_df = client.get_spans_dataframe(\n    project_name=\"my-app\",\n    filter_condition=\"span_kind == 'LLM'\",\n    limit=1000\n)\n\n# Get specific span\nspan = client.get_span(span_id=\"abc123\")\n\n# Get trace\ntrace = client.get_trace(trace_id=\"xyz789\")\n```\n\n### Log feedback\n\n```python\nfrom phoenix import Client\n\nclient = Client()\n\n# Log user feedback\nclient.log_annotation(\n    span_id=\"abc123\",\n    name=\"user_rating\",\n    annotator_kind=\"HUMAN\",\n    score=0.8,\n    label=\"helpful\",\n    metadata={\"comment\": \"Good response\"}\n)\n```\n\n### Export data\n\n```python\n# Export to pandas\ndf = client.get_spans_dataframe(project_name=\"my-app\")\n\n# Export traces\ntraces = client.list_traces(project_name=\"my-app\")\n```\n\n## Production deployment\n\n### Docker\n\n```bash\ndocker run -p 6006:6006 arizephoenix\u002Fphoenix:latest\n```\n\n### With PostgreSQL\n\n```bash\n# Set database URL\nexport PHOENIX_SQL_DATABASE_URL=\"postgresql:\u002F\u002Fuser:pass@host:5432\u002Fphoenix\"\n\n# Start server\nphoenix serve --host 0.0.0.0 --port 6006\n```\n\n### Environment variables\n\n| Variable | Description | Default |\n|----------|-------------|---------|\n| `PHOENIX_PORT` | HTTP server port | `6006` |\n| `PHOENIX_HOST` | Server bind address | `127.0.0.1` |\n| `PHOENIX_GRPC_PORT` | gRPC\u002FOTLP port | `4317` |\n| `PHOENIX_SQL_DATABASE_URL` | Database connection | SQLite temp |\n| `PHOENIX_WORKING_DIR` | Data storage directory | OS temp |\n| `PHOENIX_ENABLE_AUTH` | Enable authentication | `false` |\n| `PHOENIX_SECRET` | JWT signing secret | Required if auth enabled |\n\n### With authentication\n\n```bash\nexport PHOENIX_ENABLE_AUTH=true\nexport PHOENIX_SECRET=\"your-secret-key-min-32-chars\"\nexport PHOENIX_ADMIN_SECRET=\"admin-bootstrap-token\"\n\nphoenix serve\n```\n\n## Best practices\n\n1. **Use projects**: Separate traces by environment (dev\u002Fstaging\u002Fprod)\n2. **Add metadata**: Include user IDs, session IDs for debugging\n3. **Evaluate regularly**: Run automated evaluations in CI\u002FCD\n4. **Version datasets**: Track test set changes over time\n5. **Monitor costs**: Track token usage via Phoenix dashboards\n6. **Self-host**: Use PostgreSQL for production deployments\n\n## Common issues\n\n**Traces not appearing:**\n```python\nfrom phoenix.otel import register\n\n# Verify endpoint\ntracer_provider = register(\n    project_name=\"my-app\",\n    endpoint=\"http:\u002F\u002Flocalhost:6006\u002Fv1\u002Ftraces\"  # Correct endpoint\n)\n\n# Force flush\nfrom opentelemetry import trace\ntrace.get_tracer_provider().force_flush()\n```\n\n**High memory in notebook:**\n```python\n# Close session when done\nsession = px.launch_app()\n# ... do work ...\nsession.close()\npx.close_app()\n```\n\n**Database connection issues:**\n```bash\n# Verify PostgreSQL connection\npsql $PHOENIX_SQL_DATABASE_URL -c \"SELECT 1\"\n\n# Check Phoenix logs\nphoenix serve --log-level debug\n```\n\n## References\n\n- **[Advanced Usage](references\u002Fadvanced-usage.md)** - Custom evaluators, experiments, production setup\n- **[Troubleshooting](references\u002Ftroubleshooting.md)** - Common issues, debugging, performance\n\n## Resources\n\n- **Documentation**: https:\u002F\u002Fdocs.arize.com\u002Fphoenix\n- **Repository**: https:\u002F\u002Fgithub.com\u002FArize-ai\u002Fphoenix\n- **Docker Hub**: https:\u002F\u002Fhub.docker.com\u002Fr\u002Farizephoenix\u002Fphoenix\n- **Version**: 12.0.0+\n- **License**: Apache 2.0\n",{"name":5,"tags":47,"author":52,"license":15,"version":53,"description":7,"dependencies":54},[48,36,35,49,38,50,51,34],"Observability","Tracing","Monitoring","LLM Ops","Orchestra Research","1.0.0",[55],"arize-phoenix>=12.0.0","main","2b749c82b5d11fac39d9a6e021ce3f5b8a541bd1","cli-tool\u002Fcomponents\u002Fskills\u002Fai-research\u002Fobservability-phoenix",3931,"https:\u002F\u002Fgithub.com\u002Fdavila7\u002Fclaude-code-templates","https:\u002F\u002Faitmpl.com","https:\u002F\u002Fgithub.com\u002Fdavila7","https:\u002F\u002Fdanielavila.me","Building AI dev tools with LLMs","2026-11-14 06:14:46",{"source":8,"skillName":5,"commands":67,"prompt":77,"zipAvailable":78},[68,71,74],{"tool":69,"command":70},"npx","npx skills add davila7\u002Fclaude-code-templates --skill observability-phoenix",{"tool":72,"command":73},"bunx","bunx skills add davila7\u002Fclaude-code-templates --skill observability-phoenix",{"tool":75,"command":76},"pnpm","pnpm dlx skills add davila7\u002Fclaude-code-templates --skill observability-phoenix","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fdavila7\u002Fclaude-code-templates\u002Fblob\u002Fmain\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fai-research\u002Fobservability-phoenix\u002FSKILL.md",true,[80,86,92,96,100,104,110,114,118,122,126,130,134,138],{"path":81,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":84,"sourceHtmlUrl":85},"forms.md","REFERENCE","参考文档",11854,"https:\u002F\u002Fgithub.com\u002Fdavila7\u002Fclaude-code-templates\u002Fblob\u002Fmain\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fdocument-processing\u002Fpdf\u002Fforms.md",{"path":87,"resourceType":88,"resourceTypeDesc":89,"sizeBytes":90,"sourceHtmlUrl":91},"LICENSE.txt","LICENSE","许可证",1467,"https:\u002F\u002Fgithub.com\u002Fdavila7\u002Fclaude-code-templates\u002Fblob\u002Fmain\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fdocument-processing\u002Fpdf\u002FLICENSE.txt",{"path":93,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":94,"sourceHtmlUrl":95},"reference.md",16692,"https:\u002F\u002Fgithub.com\u002Fdavila7\u002Fclaude-code-templates\u002Fblob\u002Fmain\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fdocument-processing\u002Fpdf\u002Freference.md",{"path":97,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":98,"sourceHtmlUrl":99},"references\u002Fadvanced-usage.md",15277,"https:\u002F\u002Fgithub.com\u002Fdavila7\u002Fclaude-code-templates\u002Fblob\u002Fmain\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fai-research\u002Fobservability-phoenix\u002Freferences\u002Fadvanced-usage.md",{"path":101,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":102,"sourceHtmlUrl":103},"references\u002Ftroubleshooting.md",10944,"https:\u002F\u002Fgithub.com\u002Fdavila7\u002Fclaude-code-templates\u002Fblob\u002Fmain\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fai-research\u002Fobservability-phoenix\u002Freferences\u002Ftroubleshooting.md",{"path":105,"resourceType":106,"resourceTypeDesc":107,"sizeBytes":108,"sourceHtmlUrl":109},"scripts\u002Fcheck_bounding_boxes_test.py","SCRIPT","脚本",8818,"https:\u002F\u002Fgithub.com\u002Fdavila7\u002Fclaude-code-templates\u002Fblob\u002Fmain\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fdocument-processing\u002Fpdf\u002Fscripts\u002Fcheck_bounding_boxes_test.py",{"path":111,"resourceType":106,"resourceTypeDesc":107,"sizeBytes":112,"sourceHtmlUrl":113},"scripts\u002Fcheck_bounding_boxes.py",2774,"https:\u002F\u002Fgithub.com\u002Fdavila7\u002Fclaude-code-templates\u002Fblob\u002Fmain\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fdocument-processing\u002Fpdf\u002Fscripts\u002Fcheck_bounding_boxes.py",{"path":115,"resourceType":106,"resourceTypeDesc":107,"sizeBytes":116,"sourceHtmlUrl":117},"scripts\u002Fcheck_fillable_fields.py",268,"https:\u002F\u002Fgithub.com\u002Fdavila7\u002Fclaude-code-templates\u002Fblob\u002Fmain\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fdocument-processing\u002Fpdf\u002Fscripts\u002Fcheck_fillable_fields.py",{"path":119,"resourceType":106,"resourceTypeDesc":107,"sizeBytes":120,"sourceHtmlUrl":121},"scripts\u002Fconvert_pdf_to_images.py",1008,"https:\u002F\u002Fgithub.com\u002Fdavila7\u002Fclaude-code-templates\u002Fblob\u002Fmain\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fdocument-processing\u002Fpdf\u002Fscripts\u002Fconvert_pdf_to_images.py",{"path":123,"resourceType":106,"resourceTypeDesc":107,"sizeBytes":124,"sourceHtmlUrl":125},"scripts\u002Fcreate_validation_image.py",1258,"https:\u002F\u002Fgithub.com\u002Fdavila7\u002Fclaude-code-templates\u002Fblob\u002Fmain\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fdocument-processing\u002Fpdf\u002Fscripts\u002Fcreate_validation_image.py",{"path":127,"resourceType":106,"resourceTypeDesc":107,"sizeBytes":128,"sourceHtmlUrl":129},"scripts\u002Fextract_form_field_info.py",4300,"https:\u002F\u002Fgithub.com\u002Fdavila7\u002Fclaude-code-templates\u002Fblob\u002Fmain\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fdocument-processing\u002Fpdf\u002Fscripts\u002Fextract_form_field_info.py",{"path":131,"resourceType":106,"resourceTypeDesc":107,"sizeBytes":132,"sourceHtmlUrl":133},"scripts\u002Fextract_form_structure.py",3945,"https:\u002F\u002Fgithub.com\u002Fdavila7\u002Fclaude-code-templates\u002Fblob\u002Fmain\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fdocument-processing\u002Fpdf\u002Fscripts\u002Fextract_form_structure.py",{"path":135,"resourceType":106,"resourceTypeDesc":107,"sizeBytes":136,"sourceHtmlUrl":137},"scripts\u002Ffill_fillable_fields.py",3819,"https:\u002F\u002Fgithub.com\u002Fdavila7\u002Fclaude-code-templates\u002Fblob\u002Fmain\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fdocument-processing\u002Fpdf\u002Fscripts\u002Ffill_fillable_fields.py",{"path":139,"resourceType":106,"resourceTypeDesc":107,"sizeBytes":140,"sourceHtmlUrl":141},"scripts\u002Ffill_pdf_form_with_annotations.py",3235,"https:\u002F\u002Fgithub.com\u002Fdavila7\u002Fclaude-code-templates\u002Fblob\u002Fmain\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fdocument-processing\u002Fpdf\u002Fscripts\u002Ffill_pdf_form_with_annotations.py",[143,173,200,233,268,291],{"skillNo":144,"name":145,"nameZh":6,"description":146,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":147,"categories":148,"keywords":154,"publishedAt":42},"01M70NHBTQ8BV0A2SCAZXEPHCX","wealthville-pool-scoring","Score DeFi liquidity pools before providing liquidity. Returns a 0-100 pool score and an Enter\u002FHold\u002FExit\u002FReduce\u002FAvoid verdict with calibrated confidence for ~68,800 Solana pools and 575 EVM pools, plus a public miss-inclusive track record. Use when asked whether a pool is worth LPing into, which pools look best right now, or how accurate the scores have actually been.","https:\u002F\u002Fgithub.com\u002Fdavila7\u002Fclaude-code-templates\u002Fblob\u002Fmain\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fweb-data\u002Fwealthville-pool-scoring\u002FSKILL.md",[149],{"categoryNo":150,"categoryName":151,"taxonomyType":152,"taxonomyTypeDesc":153},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[155,156,157,158,159,25,160,161,162,23,163,164,165,166,167,168,169,170,171,172],"scoring","pool","wealthville pool scoring","liquidity","which","exit","now","use","reduce","with","record","track","verdict","evm","solana","how","public","look",{"skillNo":174,"name":175,"nameZh":6,"description":176,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":177,"categories":178,"keywords":180,"publishedAt":42},"01M70MB6VR8ERJ4EM8D5KHBMEV","technical-debt-auditor","Scans a codebase and produces a quantified technical debt report with a prioritized remediation plan. Analyzes dead code, TODO\u002FFIXME\u002FHACK markers, dependency staleness, complexity hotspots, code duplication signals, test coverage gaps, unused exports, and outdated patterns. Use this skill when the user asks to audit their codebase for tech debt, wants a health check of their code quality, says things like \"where should I focus refactoring\", \"find code smells\", \"audit my codebase\", \"what technical debt do we have\", \"prioritize cleanup work\", or asks about code quality metrics. Also trigger when the user mentions \"code rot\", \"legacy cleanup\", \"refactoring priorities\", or wants to understand the overall health of a project before a major effort. Trigger even if the user doesn't say \"technical debt\" explicitly — any request to systematically assess code quality and identify improvement priorities belongs here.","https:\u002F\u002Fgithub.com\u002Fdavila7\u002Fclaude-code-templates\u002Fblob\u002Fmain\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fdevelopment\u002Ftechnical-debt-auditor\u002FSKILL.md",[179],{"categoryNo":150,"categoryName":151,"taxonomyType":152,"taxonomyTypeDesc":153},[181,182,183,184,185,186,187,188,189,190,191,23,192,193,194,195,196,197,198,199],"technical debt","debt","technical","technical debt auditor","auditor","coverage","complexity","markers","project","cleanup","unused","code","todo","work","plan","focus","signals","audit","dependency",{"skillNo":201,"name":202,"nameZh":6,"description":203,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":204,"categories":205,"keywords":215,"publishedAt":42},"01M70KPYH9QNHCNME5GJQGE22K","readonly-sql-guard","Make an agent's database access provably read-only. Use when an agent runs caller-supplied SQL against a production\u002FERP\u002Fanalytics database (a \"query\" MCP tool, text-to-SQL, an admin console), or when reviewing DB-access code for write\u002FDDL\u002Fside-effect\u002Ftransaction-escape risks. Checks what a statement CALLS, not just its shape.","https:\u002F\u002Fgithub.com\u002Fdavila7\u002Fclaude-code-templates\u002Fblob\u002Fmain\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fdatabase\u002Freadonly-sql-guard\u002FSKILL.md",[206,209,210],{"categoryNo":207,"categoryName":208,"taxonomyType":152,"taxonomyTypeDesc":153},"01JBSEEDCAT000000000000010","后端与接口",{"categoryNo":150,"categoryName":151,"taxonomyType":152,"taxonomyTypeDesc":153},{"categoryNo":211,"categoryName":212,"taxonomyType":213,"taxonomyTypeDesc":214},"01JBSEEDCAT000000000000033","数据分析师","PROFESSION","适用职业",[216,217,218,219,220,221,222,25,223,224,225,226,227,228,229,162,230,231,23,232],"readonly","guard","sql guard","sql","readonly sql guard","erp","effect","read-only","db","just","tool","calls","only","MCP","access","database","query",{"skillNo":234,"name":235,"nameZh":6,"description":236,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":237,"licenseFileUrl":238,"sourceHtmlUrl":239,"categories":240,"keywords":244,"publishedAt":42},"01M6AFY6F7CC2BBZP1QD6VTNVC","web-artifacts-builder","Suite of tools for creating elaborate, multi-component claude.ai HTML artifacts using modern frontend web technologies (React, Tailwind CSS, shadcn\u002Fui). Use for complex artifacts requiring state management, routing, or shadcn\u002Fui components - not for simple single-file HTML\u002FJSX artifacts.","Apache-2.0","https:\u002F\u002Fgithub.com\u002Fdavila7\u002Fclaude-code-templates\u002Fblob\u002Fmain\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Futilities\u002Fweb-artifacts-builder\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Fdavila7\u002Fclaude-code-templates\u002Fblob\u002Fmain\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Futilities\u002Fweb-artifacts-builder\u002FSKILL.md",[241],{"categoryNo":242,"categoryName":243,"taxonomyType":152,"taxonomyTypeDesc":153},"01JBSEEDCAT000000000000009","前端开发",[245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,25,267],"artifacts builder","web","web artifacts builder","artifacts","builder","state","routing","state management","component","css","frontend","ui","Tools","file","components","shadcn","react","Tailwind","suite","jsx","html","single-file","ui components",{"skillNo":269,"name":270,"nameZh":6,"description":271,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":237,"licenseFileUrl":272,"sourceHtmlUrl":273,"categories":274,"keywords":279,"publishedAt":42},"01M6AFWF33SFV9Z3SF4PEEE4BF","webapp-testing","Toolkit for interacting with and testing local web applications using Playwright. Supports verifying frontend functionality, debugging UI behavior, capturing browser screenshots, and viewing browser logs.","https:\u002F\u002Fgithub.com\u002Fdavila7\u002Fclaude-code-templates\u002Fblob\u002Fmain\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fsecurity\u002Fwebapp-testing\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Fdavila7\u002Fclaude-code-templates\u002Fblob\u002Fmain\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fsecurity\u002Fwebapp-testing\u002FSKILL.md",[275,278],{"categoryNo":276,"categoryName":277,"taxonomyType":152,"taxonomyTypeDesc":153},"01JBSEEDCAT000000000000008","测试与质量",{"categoryNo":242,"categoryName":243,"taxonomyType":152,"taxonomyTypeDesc":153},[280,281,282,283,284,246,285,255,256,41,286,287,288,25,289,164,290],"webapp testing","testing","webapp","browser","playwright","applications","toolkit","logs","screenshots","local","behavior",{"skillNo":292,"name":293,"nameZh":6,"description":294,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":237,"licenseFileUrl":295,"sourceHtmlUrl":296,"categories":297,"keywords":305,"publishedAt":42},"01M6AF67Q67JJJ5V51JR2P52KA","discernment-nudge","After you give a substantive answer or draft that the user may act on — advice or recommendations, drafted artifacts such as goals, plans, pitches, proposals, or emails, estimates or projections, analysis or interpretation of data, factual claims they may rely on, or a multi-step argument — invoke this skill BEFORE finalizing your reply and then, if it applies, append 2-3 short follow-up questions, each tied to something specific in what you just produced, that help the user check key facts, probe the reasoning or assumptions, and notice missing context. Do this at most once per conversation. Skip it when the user asked a trivial how-to or simple lookup, wants a purely educational explanation, asked you only to format, convert, or assemble a file from content they provided, is writing code they will run, is doing creative writing or casual chat, or already asked you to double-check, cite, or review — the skill file explains these boundaries and the exact output format.","https:\u002F\u002Fgithub.com\u002Fdavila7\u002Fclaude-code-templates\u002Fblob\u002Fmain\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fproductivity\u002Fdiscernment-nudge\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Fdavila7\u002Fclaude-code-templates\u002Fblob\u002Fmain\u002Fcli-tool\u002Fcomponents\u002Fskills\u002Fproductivity\u002Fdiscernment-nudge\u002FSKILL.md",[298,301,302],{"categoryNo":299,"categoryName":300,"taxonomyType":152,"taxonomyTypeDesc":153},"01JBSEEDCAT000000000000018","写作与文案",{"categoryNo":150,"categoryName":151,"taxonomyType":152,"taxonomyTypeDesc":153},{"categoryNo":303,"categoryName":304,"taxonomyType":213,"taxonomyTypeDesc":214},"01JBSEEDCAT000000000000036","内容创作者",[306,307,308,309,310,311,312,313,248,314,258,192,315,316,317,318,319,228,320,23,321,322,323,324,325,170,326],"discernment nudge","nudge","interpretation","help","run","reasoning","data","writing","lookup","content","review","conversation","short","up","invoke","you","analysis","claims","argument","assemble","recommendations"]