# Share a DeepEval Report — LLM Test Results Someone Else Can Open

Canonical: https://commareports.com/agents/share-deepeval-report
Published: 2026-09-12

> DeepEval runs on pytest, so it emits a pytest HTML report like any other suite. Publish it to Comma and the failing test cases get a URL, anchored comments and a revision per run.

# Share a DeepEval report

DeepEval's best design decision is that an LLM eval is a test. It runs under
pytest, it fails a build, and it produces the same artifact every other pytest
suite produces.

Which means the sharing problem is the same one too: the HTML report is a file
on the runner, and the runner is gone in an hour.

## Produce one self-contained file

```bash
pytest --html=deepeval.html --self-contained-html test_llm.py
```

`--self-contained-html` matters. Without it the report references a CSS and JS
directory next to the file, and a report you send as one file renders as
unstyled text on the other end — the usual cause of
[broken CSS in a shared report](/html-report-broken-css).

Then publish it from the same job:

```bash
curl -fsS -X PATCH "https://commareports.com/api/v1/reports/$REPORT_ID" \
  -H "Authorization: Bearer $COMMA_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d "$(jq -n --rawfile html deepeval.html \
        --arg title "LLM suite — $GIT_SHA" '{title: $title, html: $html}')"
```

Guard the step with `if: always()` on GitHub Actions, `when: always` on
GitLab. See [publishing from CI](/docs/ci) for the per-provider form.

## What the review layer adds

A DeepEval failure says `AnswerRelevancyMetric score 0.58 < 0.7`. Whether that
is a model regression or a bad threshold is a judgment call, and judgment calls
need a thread:

- **Anchored threads** — "this threshold is too strict for this intent" sits on
  the failing case. See [commenting on HTML](/comment-on-html).
- **Revisions** — one report id per suite, one revision per run.
- **Access per report** — private, team-only, or domain-gated, since test cases
  usually encode real prompts. See the [sharing model](/docs/sharing).

## Close the loop with the agent

The agent that edits the prompt can read the comments back through
[the MCP server](/docs/mcp) and re-run the suite —
[let an agent respond to comments](/agents/let-an-agent-respond-to-comments)
covers the loop, and a [routine](/features/routines/daily-claude-eval-refresh)
keeps it running without a human kicking it off.

## Limits

- **Entry HTML: 5 MB.** Self-contained pytest reports inline their assets; a
  suite with long model outputs per case can approach the cap. Split by metric
  or truncate the captured output.
- **Assets: 25 MB per file, 250 MB and 500 files per report.**
- **60 requests/minute per token.**

## Try it

Comma is free — unlimited reports, unlimited commenters, unlimited revision
history.

**[Publish a DeepEval report →](https://commareports.com/)**

### Related

- [Share an LLM eval report](/agents/share-llm-eval-report) · [Share a Ragas evaluation report](/agents/share-ragas-eval-report)
- [Share a pytest report](/share-pytest-report) · [Share a promptfoo report](/share-promptfoo-report)
- [Share a Braintrust eval report](/agents/share-braintrust-eval-report) · [Publish from CI](/docs/ci)
