Skip to content

[OPIK-8831] [FE] [BE] feat: send one media part per list entry from a single Playground variable - #8981

Draft
aadereiko wants to merge 4 commits into
mainfrom
sasha/playground-multiple-images-per-prompt
Draft

aadereiko wants to merge 4 commits into
mainfrom
sasha/playground-multiple-images-per-prompt

Conversation

@aadereiko

@aadereiko aadereiko commented Oct 16, 2026 •

Copy link
Copy Markdown
Collaborator

Details

A user wants to send a different number of images per dataset item in one Playground prompt. Today an image, video or audio slot always becomes exactly one part, so the only option is fixed slots ({{image_1}}, {{image_2}}, ...). A list in one column doesn't work:

  • Dataset runs (rendered in the browser): the list is turned into text. A JSON list becomes url1,url2 (how JS joins an array), and a list from a CSV upload stays ["url1", ...]. The provider gets one broken URL and the row shows "Run failed: invalid image input". A 1-item list only works by accident.
  • Test-suite runs (/v1/private/experiments/execute): ExperimentMessageRenderer renders variables in text parts only, so the provider gets the literal {{images}} as the image URL. Fixed slots are broken there too: they send {{image_1}} and {{image_2}}.

The change: if a media slot holds exactly one variable ({{images}}, {{ images }}, {{{images}}} or {{& images}}) and its value is a list, the slot becomes one part per item, in order. An empty list sends no part. A JSON-array string counts as a list, because CSV uploads store every cell as text. Anything else (a single URL, https://cdn/{{id}}.png, an object, broken JSON) renders exactly as before.

  • FE: getMediaUrlsFromListVariable in lib/llm.ts; usePromptDatasetItemCombination now uses flatMap over the content parts, since one part can turn into several.
  • BE: ExperimentMessageRenderer.renderMessages renders variables in image_url / video_url / audio_url URLs and expands lists the same way. Extra fields on a part (like detail) are kept on every copy.
  • Docs: a short "Images, video, and audio" subsection on the Playground page.

Two more fixes, found while testing on the PR env:

  • FE (containsTruncatedMedia in lib/media.ts): the Playground reads dataset rows from the list API with truncate=true, which cuts every cell at 10,001 chars. Only base64 images that are real JSON strings get an [image] marker; a list of videos, audio or URLs, or a list stored as JSON text (as CSV uploads store it), comes back cut with no marker. So the Playground didn't load the full row and sent the cut text as one broken URL ("File URL is invalid" on GPT, an empty answer on Gemini). A string that starts like a list of strings but no longer parses as JSON now counts as cut, and the full row is loaded. A complete list still parses and is not re-fetched, and text like [link] to the docs doesn't match.
  • BE (ExperimentMessageRenderer.toLangChain4jMessage, also broken on main): test-suite runs mapped only text and image_url parts. video_url and audio_url parts were sent as their JSON text, and Gemini made up an answer (two room videos became "Minecraft"). They're now sent as video/audio parts.

Not covered here: Gemini on Vertex AI with base64 media needs #8954. Online-evaluation judges and the Python SDK ChatPrompt don't expand lists, and test-suite runs only see top-level columns ({{input.images}} resolves on dataset runs only, as before).

Change checklist

  • User facing
  • Documentation update

Issues

  • OPIK-8831

Related: CUST_7336, OPIK_8790 (same customer thread).

AI-WATERMARK

AI-WATERMARK: yes

  • If yes:
    • Tools: Claude Code
    • Model(s): claude-opus-5-5
    • Scope: fix, tests, docs, PR text
    • Human verification: pending review

Testing

  • npm run test (FE, full suite): 272 files, 4,214 tests pass; npx tsc --noEmit and ESLint are clean. New: llm.test.ts (getMediaUrlsFromListVariable: tag variants, nested path, JSON text, non-string items, empty list, and the cases that must stay one part) and usePromptDatasetItemCombination.mediaList.test.ts (6 tests through the hook: order between text parts, CSV text, empty list, list also used in text, video/audio, fixed slots unchanged), and media.test.ts ("cut lists": cut video/URL/JSON-text lists are detected; complete lists and [link] text are not).
  • mvn test -Dtest=ExperimentMessageRendererTest: 57 tests, 0 failures (17 new). New tests cover the same list sources and non-list values, video/audio, the empty list, the final ChatCompletionRequest, and video/audio parts reaching it as media.
  • The new FE and BE tests fail on main's code (glued url1,url2 URL; literal {{images}}; cut lists not detected; video/audio sent as text).
  • Live, local stack (scripts/dev-runner.sh), one dataset and one test suite with 4 items: 1 image (JSON list), 2 images (JSON text, as from CSV), 3 and 5 images, plus image_1 / image_2 columns for the fixed-slot case. Each image is a labelled PNG ("1 RED", "2 BLUE", ...).
    • Two models behind custom LLM providers: a fake OpenAI-compatible server that records each request it gets ("recorder"), and a real vision model (Ollama gemma3:4b).
Run Model main this PR
Dataset, {{images}} gemma3 1-item row answers; the 2-, 3- and 5-image rows show "Run failed: invalid image input" every row names each image and gives the right total
Dataset, {{images}} recorder not run 1, 2, 3, 5 images, in order
Test suite, {{images}} recorder 1 image with URL {{images}} on every item 1, 2, 3, 5 images, in order
Test suite, {{images}} gemma3 not run every item names each image and gives the right total
Test suite, {{image_1}} + {{image_2}} recorder URLs {{image_1}} and {{image_2}} the 2 images
Dataset, {{image_1}} + {{image_2}} recorder not run the 2 images (unchanged path)
  • PR env (pr-8981, build 2.2.103-8981-merge-3944), real models: gpt-4.1-mini (OpenAI) and gemini-3.8-flash (Google AI Studio). 12 datasets and test suites, seeded through the API and the CSV upload. For each row I checked how many media parts the trace shows, not only the answer.
Data Path GPT 4.1 mini Gemini 3.8 Flash
Customer shape: one listing per row, 0/1/2/3/5/8 base64 photos in images dataset (both), test suite (Gemini) right count and order, accept/refuse as expected same
Same rows from a CSV upload (lists stored as text), incl. a file with only listing_id + images dataset right right
Numbered tiles, 1/2/3/7/12 per row (checks order) dataset and test suite (both) exact order up to 12 exact order up to 12
URLs and base64 in one list; a plain string; a JSON-text list with newlines dataset (both), test suite (GPT) 6/6 rows 6/6 rows
Real photos, up to 3 × 1.3 MB (5.5 MB of base64 in one request) dataset OK OK
{{input.images}} inside an object column dataset OK OK
1 and 2 base64 videos in {{videos}} dataset (both), test suite (Gemini) OpenAI rejects video_url (expected) 1 and 2 videos, both described
{{image_1}} + {{image_2}} (old fixed slots) test suite 2 images; rows with fewer than 2 photos fail "File URL is invalid" not run

An empty list sends no image part on both paths. GPT then asks for images; Gemini makes some up. That's the model, not the request.

  • Unrelated, found while testing: custom-provider models that Opik doesn't know as vision-capable get an empty user message when it contains an image (MessageContentNormalizer flattens it and skips Opik's own content type, so the text is lost too). I named the local models to match the *qwen*vl* vision pattern to get around it. It's in the ticket and needs its own fix.

Screenshots

Local stack, Ollama gemma3:4b, prompt with one image slot {{images}}. Rows hold 1 image (JSON list), 2 images (JSON text, as from CSV), 5 and 3 images.

main, dataset run: only the 1-image row answers:
before-main-dataset-gemma3

This PR, dataset run: every row names each image and the total:
after-dataset-gemma3

This PR, test-suite run (the suite has no assertions, hence "Skipped"):
after-test-suite-gemma3

PR env, numbered tiles: both models list the tiles in the right order, up to 12:
env-numbered-tiles-order

PR env, a list stored as JSON text with newlines (row 1). Before the truncation fix, the cut row was sent as one broken URL:
env-mixed-sources-before-truncation-fix

After: the full row is loaded and both images reach the model:
env-mixed-sources-after-fix

PR env, two base64 videos in one {{videos}} slot. Gemini gets both; OpenAI's API doesn't take video:
env-video-lists-after-fix

Documentation

docs-v2/prompt_engineering/playground.mdx: new "Images, video, and audio" subsection under Template variables.

… single Playground variable

An image, video or audio slot always became exactly one part, so a list
variable could not carry a varying number of images. In the browser a list
rendered as "url1,url2" (or as CSV JSON text) and the provider rejected the
URL; on test-suite runs media URLs were never rendered at all, so the
provider got the literal "{{images}}" or "{{image_1}}".

A slot whose URL is exactly one variable holding a list (a JSON array, or
JSON-array text as CSV uploads store it) now expands into one part per item,
in order; an empty list sends none. Everything else renders as before. The
same rule runs in usePromptDatasetItemCombination (dataset runs) and in
ExperimentMessageRenderer (test-suite runs), which now also renders
variables in media URLs.
@github-actions github-actions Bot added documentation Improvements or additions to documentation java Pull requests that update Java code Frontend Backend tests Including test files, or tests related like configuration. typescript *.ts *.tsx 🔴 size/XL labels Oct 16, 2026
@github-actions

github-actions Bot commented Oct 16, 2026 •

Copy link
Copy Markdown
Contributor

⏱️ pre-commit per-hook timing

Hook Description Result Duration
🌐 typecheck — frontend Whole-project tsc type check ✅ 35.61s
☕ swagger resolve — java backend openapi Resolve the backend OpenAPI spec ✅ 30.06s
☕ spotless — java backend Format Java code ✅ 9.10s
⚓ helm-docs Regenerate Helm chart README ✅ 5.39s
🛡️ semgrep — java backend sql Enforce the repo's own backend Java rules ✅ 2.43s
🌐 eslint — frontend Lint + autofix JS/TS ✅ 2.30s
⚙️ actionlint — github workflows Lint GitHub Actions workflows ✅ 0.63s
🌈 zizmor — github workflows security Security-scan GitHub Actions workflows ✅ 0.05s
🐍 fix end of files — python sdk Ensure files end in a newline ✅ 0.03s
🐍 trim trailing whitespace — python sdk Strip trailing whitespace ✅ 0.02s
🐍 ruff-format — python sdk Format Python code (ruff) ✅ 0.01s
🐍 ruff — python sdk Lint + autofix Python (ruff) ✅ 0.01s
Total (12 ran) 85.64s
⏭️ 34 skipped (no matching files changed)
Hook Description Result
🐍 mypy — python sdk Static type check ⏭️
🤖 trim trailing whitespace — optimizer Strip trailing whitespace ⏭️
🤖 fix end of files — optimizer Ensure files end in a newline ⏭️
🤖 check yaml — optimizer Validate YAML syntax ⏭️
🤖 check json — optimizer Validate JSON syntax ⏭️
🤖 check toml — optimizer Validate TOML syntax ⏭️
🤖 check for added large files — optimizer Block large files (>1MB) ⏭️
🔐 detect private key — optimizer Block committed private keys ⏭️
🤖 check for merge conflicts — optimizer Block merge-conflict markers ⏭️
🤖 check for case conflicts — optimizer Block case-only name clashes ⏭️
🤖 pyupgrade — optimizer Modernize Python syntax ⏭️
🤖 ruff — optimizer Lint + autofix Python (ruff) ⏭️
🤖 ruff-format — optimizer Format Python code (ruff) ⏭️
🤖 mypy — optimizer Static type check ⏭️
📓 nbstripout — optimizer notebooks Strip notebook output ⏭️
📝 markdownlint — optimizer Lint Markdown ⏭️
🔤 codespell — optimizer Fix common misspellings ⏭️
📊 radon cc — optimizer Cyclomatic-complexity gate ⏭️
📊 radon raw — optimizer Raw size metrics gate ⏭️
📊 xenon — optimizer Fail on complexity thresholds ⏭️
📊 lizard — optimizer Cyclomatic-complexity gate ⏭️
🧹 vulture — optimizer Find dead code ⏭️
🛡️ trim trailing whitespace — guardrails Strip trailing whitespace ⏭️
🛡️ fix end of files — guardrails Ensure files end in a newline ⏭️
🛡️ ruff — guardrails Lint + autofix Python (ruff) ⏭️
🛡️ ruff-format — guardrails Format Python code (ruff) ⏭️
🛡️ mypy — guardrails Static type check ⏭️
block non-public FE plugins Block non-public FE plugins ⏭️
🧪 pre-commit wrapper smoke tests Self-test the wrapper scripts ⏭️
🧪 opik.sh startup wait tests Self-test opik.sh's container startup wait ⏭️
🧪 rebaseline script tests Self-test the changelog re-baseline script ⏭️
📘 eslint — typescript sdk Lint + autofix JS/TS ⏭️
📘 typecheck — typescript sdk Whole-project tsc type check ⏭️
🐳 hadolint — dockerfiles Lint Dockerfiles ⏭️

@github-actions

github-actions Bot commented Oct 16, 2026 •

Copy link
Copy Markdown
Contributor

🌿 Preview your docs: https://opik-preview-01a144df-7871-770c-bad1-f9339a17cb0a.docs.buildwithfern.com/docs/opik

No broken links found

Unverified links (timeout / rate-limited / server error — not failing the check)

• https://aistudio.google.com/apikey (401)
↳ on page: /docs/opik/administration/workspace-settings/ai_providers
• https://beeai.dev/ (timeout)
↳ on page: /docs/opik/integrations/beeai-typescript
• https://chat.deepseek.com/sign_up (403)
↳ on page: /docs/opik/integrations/deepseek
• https://console.cloud.google.com/iam-admin/iam (401)
↳ on page: /docs/opik/administration/workspace-settings/ai_providers
• https://console.cloud.google.com/iam-admin/roles (401)
↳ on page: /docs/opik/administration/workspace-settings/ai_providers
• https://console.cloud.google.com/iam-admin/serviceaccounts (401)
↳ on page: /docs/opik/administration/workspace-settings/ai_providers
• https://console.mistral.ai/api-keys/ (timeout)
↳ on page: /docs/opik/integrations/mistral
• https://console.typesafe.ai/ (403)
↳ on page: /docs/opik/integrations/typesafe
• https://console.x.ai/ (403)
↳ on page: /docs/opik/integrations/xai-grok
• https://docs.predibase.com/integrations/comet (403)
↳ on page: /docs/opik/integrations/predibase
• https://portal.azure.com/ (403)
↳ on page: /docs/opik/administration/workspace-settings/ai_providers
• https://x.ai/ (403)
↳ on page: /docs/opik/integrations/xai-grok


📌 Results for commit 89d6181

Comment on lines +73 to 74
renderedParts.addAll(renderMediaPart(part, context));
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Video and audio list entries sent as text

Video and audio parts are sent as their JSON text because toLangChain4jMessage only handles text and image URLs; add video_url and audio_url branches that call addVideoUrl and addAudioUrl, and cover the fix with a request-level test.

Severity

Want Baz to fix this for you? Activate Fixer

Other fix methods

Fix in Cursor

Prompt for AI Agents
Before applying, verify this suggestion against the current code. In
`apps/opik-backend/src/main/java/com/comet/opik/domain/ExperimentMessageRenderer.java`
around lines 73-74, update the downstream `toLangChain4jMessage` media conversion logic
around lines 170-182 to recognize `video_url` and `audio_url` parts. Route these parts
through `OpikUserMessage.Builder.addVideoUrl` and `addAudioUrl` instead of the default
`addText(part.toString())` branch, while preserving existing text and image handling.
Add a request-level test covering list-expanded video and audio URLs.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Commit 98e0aed addressed this comment by Added video_url and audio_url branches using addVideoUrl and addAudioUrl. A test also verifies the resulting request contains the correct media parts and URLs.

Comment on lines +121 to +125
JsonNode parsed;
try {
parsed = JsonUtils.getJsonNodeFromString(value);
} catch (UncheckedIOException e) {
return Optional.empty();

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Malformed media input failures disappear silently

Malformed JSON is silently treated as a URL, so invalid dataset input produces the wrong media behavior without any diagnostic. Log the parsing exception with safe variable/request context before falling back to non-list rendering, or propagate it if malformed lists are unsupported.

Severity

Want Baz to fix this for you? Activate Fixer

Other fix methods

Fix in Cursor

Prompt for AI Agents
Before applying, verify this suggestion against the current code. In
`apps/opik-backend/src/main/java/com/comet/opik/domain/ExperimentMessageRenderer.java`
around lines 121-125, update `getListFromSingleVariable` and its `renderMediaPart`
fallback handling so malformed JSON is not silently converted to `Optional.empty()`.
Catch the specific JSON parsing exception, log a safe diagnostic including the variable
name or other non-sensitive context, then apply the ordinary URL fallback only when
appropriate; otherwise propagate the parsing failure if malformed list input is
unsupported.

Comment on lines +103 to +104
processedContent = message.content.flatMap(
(part): Array<TextPart | ImagePart | VideoPart | AudioPart> => {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Uncapped media-list expansion inflates request size

A single dataset cell can expand into thousands of media parts, inflating the completion request and browser memory despite the 100 MB per-string and 512 MB per-request limits. Cap expanded entries or rendered bytes before flatMap, and enforce the same limit in the backend ExperimentMessageRenderer.

Severity

Want Baz to fix this for you? Activate Fixer

Other fix methods

Fix in Cursor

Prompt for AI Agents
Before applying, verify this suggestion against the current code. In
`apps/opik-frontend/src/v2/pages/PlaygroundPage/usePromptDatasetItemCombination.ts`
around lines 103-104, the `transformMessageIntoProviderMessage` media `flatMap` expands
every URL returned by `getMediaUrlsFromListVariable` without a cardinality or
payload-size limit. Add a shared, explicit cap on expanded media entries and/or total
rendered bytes before or during expansion, preserving existing rendering behavior while
preventing oversized requests. Apply the same limit and validation strategy in the
backend `ExperimentMessageRenderer` media-list expansion so frontend and backend enforce
consistent bounds.

@github-actions

github-actions Bot commented Oct 16, 2026 •

Copy link
Copy Markdown
Contributor

TS SDK E2E Tests - Node 18

324 tests  ±0   322 ✅ ±0   16m 23s ⏱️ +45s
 38 suites ±0     2 💤 ±0 
  1 files   ±0     0 ❌ ±0 

Results for commit 98e0aed. ± Comparison against base commit a433ee8.

♻️ This comment has been updated with latest results.

@aadereiko aadereiko added the test-environment Deploy Opik adhoc environment label Oct 16, 2026
@github-actions

Copy link
Copy Markdown
Contributor

🔄 Test environment deployment process has started

Phase 1: Deploying base version 2.2.103-7078 (from main branch) if environment doesn't exist
Phase 2: Building new images from PR branch sasha/playground-multiple-images-per-prompt
Phase 3: Will deploy newly built version after build completes

You can monitor the progress here.

@CometActions

Copy link
Copy Markdown
Collaborator

✅ Test environment is now available!

To configure additional Environment variables for your environment, run [Deploy Opik AdHoc Environment workflow] (https://github.com/comet-ml/comet-deployment/actions/workflows/deploy_opik_adhoc_env.yaml)

Access Information

The deployment has completed successfully and the version has been verified.

… JSON text was truncated

The Playground reads dataset items from the truncated list API and only
fetches the full item when it sees a truncation marker. A list stored as
JSON text (as CSV uploads store it) comes back cut at 10,001 chars with its
leading JSON quote, and its escaped base64 items never get the [image]
placeholder, so the row was not re-fetched and the cut text was sent as one
broken image URL. Found on the PR env with a JSON-text list of two images.
@aadereiko aadereiko added test-environment Deploy Opik adhoc environment and removed test-environment Deploy Opik adhoc environment labels Oct 16, 2026
@github-actions

Copy link
Copy Markdown
Contributor

🔄 Test environment deployment process has started

Phase 1: Deploying base version 2.2.103-7078 (from main branch) if environment doesn't exist
Phase 2: Building new images from PR branch sasha/playground-multiple-images-per-prompt
Phase 3: Will deploy newly built version after build completes

You can monitor the progress here.

@CometActions

Copy link
Copy Markdown
Collaborator

✅ Test environment is now available!

To configure additional Environment variables for your environment, run [Deploy Opik AdHoc Environment workflow] (https://github.com/comet-ml/comet-deployment/actions/workflows/deploy_opik_adhoc_env.yaml)

Access Information

The deployment has completed successfully and the version has been verified.

…os, audio or URLs was cut

The truncated list API only swaps base64 images for an [image] placeholder,
so a list of videos, audio or URLs longer than 10,001 chars came back as a
cut string with no marker, and the Playground sent it as one broken URL.
Found on the PR env with two base64 videos in one list. A string that starts
like a list of strings but no longer parses as JSON is now treated as cut,
which also covers lists stored as JSON text; complete lists still parse and
are not re-fetched.
@aadereiko aadereiko added test-environment Deploy Opik adhoc environment and removed test-environment Deploy Opik adhoc environment labels Oct 16, 2026
@github-actions

Copy link
Copy Markdown
Contributor

🔄 Test environment deployment process has started

Phase 1: Deploying base version 2.2.103-7078 (from main branch) if environment doesn't exist
Phase 2: Building new images from PR branch sasha/playground-multiple-images-per-prompt
Phase 3: Will deploy newly built version after build completes

You can monitor the progress here.

Comment on lines 193 to 194
const TRUNCATED_MEDIA_REGEX =
/\[image(?:_\d+)?]|^"?data:(image|video|audio)\//i;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Regex constant hides its matching pattern role

Rename TRUNCATED_MEDIA_REGEX to TRUNCATED_MEDIA_PATTERN to follow the naming convention, and update its use at line 210.

Severity

Want Baz to fix this for you? Activate Fixer

Other fix methods

Fix in Cursor

Prompt for AI Agents
Before applying, verify this suggestion against the current code. In
apps/opik-frontend/src/lib/media.ts around lines 193-194, rename the
`TRUNCATED_MEDIA_REGEX` constant used by `containsTruncatedMedia` to the established
`TRUNCATED_MEDIA_PATTERN` naming convention. Update the reference around line 210 so the
truncated-media detection behavior remains unchanged.

// A list is cut the same way, into a string that no longer parses: a real list of videos, audio or URLs
// (only base64 images get the [image] placeholder), or a list stored as JSON text, as CSV uploads store it.
const isCutList = (value: string): boolean => {
if (!/^"?\s*\[(?:\s|\\[nrt])*\\?"/.test(value)) return false;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Truncated non-string-first media lists skip hydration

Mixed lists with a non-string first item can render as one truncated JSON value instead of expanding because isCutList only recognizes lists whose first element is a quoted string; restore detection for both escaped and raw list prefixes so containsTruncatedMedia fetches the full dataset item.

Severity

Want Baz to fix this for you? Activate Fixer

Other fix methods

Fix in Cursor

Prompt for AI Agents
Before applying, verify this suggestion against the current code. In
`apps/opik-frontend/src/lib/media.ts` around lines 199-205, the `isCutList` detection
incorrectly requires a truncated JSON array’s first element to be a quoted string,
regressing support for inputs such as `"[{`, `"[1`, `"[null`, and raw `[{`. Refactor the
initial pattern to recognize an optional ClickHouse quote followed by any JSON array
opening, regardless of the first element, while keeping the `JSON.parse` check so valid
complete lists are not flagged. Add regression tests covering these non-string-first
truncated lists.

…te runs

buildChatCompletionRequest only mapped text and image_url parts; video_url
and audio_url fell through to addText(part.toString()), so the model got the
part's JSON as text and invented an answer. Found on the PR env: Gemini
described two room videos as "Minecraft" on the test-suite path while the
same videos were described correctly in a dataset run. Uses the same
OpikUserMessage builder calls as the chat-completions deserializer.
@aadereiko aadereiko added test-environment Deploy Opik adhoc environment and removed test-environment Deploy Opik adhoc environment labels Oct 16, 2026
@github-actions

Copy link
Copy Markdown
Contributor

🔄 Test environment deployment process has started

Phase 1: Deploying base version 2.2.103-7078 (from main branch) if environment doesn't exist
Phase 2: Building new images from PR branch sasha/playground-multiple-images-per-prompt
Phase 3: Will deploy newly built version after build completes

You can monitor the progress here.

@CometActions

Copy link
Copy Markdown
Collaborator

✅ Test environment is now available!

To configure additional Environment variables for your environment, run [Deploy Opik AdHoc Environment workflow] (https://github.com/comet-ml/comet-deployment/actions/workflows/deploy_opik_adhoc_env.yaml)

Access Information

The deployment has completed successfully and the version has been verified.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Backend documentation Improvements or additions to documentation Frontend java Pull requests that update Java code 🔴 size/XL test-environment Deploy Opik adhoc environment tests Including test files, or tests related like configuration. typescript *.ts *.tsx

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants