diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 48b8b2db15..1e18738019 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "1.150.0" + ".": "1.149.0" } diff --git a/CHANGELOG.md b/CHANGELOG.md index 596ad4c0da..36b3bd55f9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,31 +1,5 @@ # Changelog -## [1.150.0](https://github.com/googleapis/python-aiplatform/compare/v1.149.0...v1.150.0) (2026-05-05) - - -### Features - -* Add Agent Engine Runtime Versioning support to SDK. ([b8eaefb](https://github.com/googleapis/python-aiplatform/commit/b8eaefb5236669953865a770ba5fddfaf2dbe2b3)) -* Add Agent Engine Sandbox Snapshots Module ([f48e54b](https://github.com/googleapis/python-aiplatform/commit/f48e54b56948108aa11e49f6c56fa9b69d7f18ef)) -* Add support for templates sub-module for Sandboxes in Vertex AI GenAI SDK. ([68f053e](https://github.com/googleapis/python-aiplatform/commit/68f053ea4160fa1fd1a96435fe83965030d0e2eb)) -* Add support for wait for operation complete for sandbox sub-modules ([737ad1c](https://github.com/googleapis/python-aiplatform/commit/737ad1c4489e9a9535b210b8a49bd864dabc80e4)) -* Disable streaming check that should have already been disabled ([762d20c](https://github.com/googleapis/python-aiplatform/commit/762d20ca21af55df75b003ad79a0e79596dbb4f8)) -* Faster sandbox creation with templates and snapshots and improve dataplane routing and security. ([9dccee2](https://github.com/googleapis/python-aiplatform/commit/9dccee26ddcad4e13e26b669906ba82945cbff58)) -* GenAI Client(evals) - Support eval_cases with multi-turn agent_data in run_inference() ([a1680d3](https://github.com/googleapis/python-aiplatform/commit/a1680d3a3f5fc4a55316c6071209a15e6753d4f6)) -* GenAI Client(evals) - Support N+1 Agent Engine inference via agent_data in run_inference() ([9ea4aa6](https://github.com/googleapis/python-aiplatform/commit/9ea4aa64ad64a4b55860f064a5284bba64034f6e)) -* GenAI SDK client(multimodal) - Accept an explicit bigquery_uri parameter in create_from_bigquery ([0bb2ecd](https://github.com/googleapis/python-aiplatform/commit/0bb2ecd2bca01554d91b1f5f3d69f88237adaa3d)) -* Migrate model garden to agentplatform ([d5e71ff](https://github.com/googleapis/python-aiplatform/commit/d5e71ff860e926cc1877a5f1bba1a00617a23e7a)) -* Migrate resources to agentplatform ([5788c50](https://github.com/googleapis/python-aiplatform/commit/5788c50bb6dad16081ba0966ceba61b6e70f95cd)) -* Update sdk to support python-a2a sdk 1.0 via a new GA A2a framework template ([762d20c](https://github.com/googleapis/python-aiplatform/commit/762d20ca21af55df75b003ad79a0e79596dbb4f8)) - - -### Bug Fixes - -* Allow setting max_wait_duration to 0 for indefinite waiting with DWS ([d9675fd](https://github.com/googleapis/python-aiplatform/commit/d9675fdf051233539f478187143f2833fd6e6af0)) -* Custom job url after rebrand ([aabe816](https://github.com/googleapis/python-aiplatform/commit/aabe81676432e96f2c2dff49b64fdcdaed5deb8a)) -* Flaky tests in feature store relates cases due to class instantiation ([9fd0fe0](https://github.com/googleapis/python-aiplatform/commit/9fd0fe06eeceb77fa3ba12cfb43532824cf61d26)) -* GenAI SDK client(multimodal) - Preserve existing metadata when creating from bigframes ([bc2260d](https://github.com/googleapis/python-aiplatform/commit/bc2260dada6cc9f3d6179dc544cc20414de59653)) - ## [1.149.0](https://github.com/googleapis/python-aiplatform/compare/v1.148.1...v1.149.0) (2026-04-27) diff --git a/google/cloud/aiplatform/gapic_version.py b/google/cloud/aiplatform/gapic_version.py index 050159c67f..92e0d51628 100644 --- a/google/cloud/aiplatform/gapic_version.py +++ b/google/cloud/aiplatform/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.150.0" # {x-release-please-version} +__version__ = "1.149.0" # {x-release-please-version} diff --git a/google/cloud/aiplatform/v1/schema/predict/instance/gapic_version.py b/google/cloud/aiplatform/v1/schema/predict/instance/gapic_version.py index 050159c67f..92e0d51628 100644 --- a/google/cloud/aiplatform/v1/schema/predict/instance/gapic_version.py +++ b/google/cloud/aiplatform/v1/schema/predict/instance/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.150.0" # {x-release-please-version} +__version__ = "1.149.0" # {x-release-please-version} diff --git a/google/cloud/aiplatform/v1/schema/predict/instance_v1/gapic_version.py b/google/cloud/aiplatform/v1/schema/predict/instance_v1/gapic_version.py index 050159c67f..92e0d51628 100644 --- a/google/cloud/aiplatform/v1/schema/predict/instance_v1/gapic_version.py +++ b/google/cloud/aiplatform/v1/schema/predict/instance_v1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.150.0" # {x-release-please-version} +__version__ = "1.149.0" # {x-release-please-version} diff --git a/google/cloud/aiplatform/v1/schema/predict/params/gapic_version.py b/google/cloud/aiplatform/v1/schema/predict/params/gapic_version.py index 050159c67f..92e0d51628 100644 --- a/google/cloud/aiplatform/v1/schema/predict/params/gapic_version.py +++ b/google/cloud/aiplatform/v1/schema/predict/params/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.150.0" # {x-release-please-version} +__version__ = "1.149.0" # {x-release-please-version} diff --git a/google/cloud/aiplatform/v1/schema/predict/params_v1/gapic_version.py b/google/cloud/aiplatform/v1/schema/predict/params_v1/gapic_version.py index 050159c67f..92e0d51628 100644 --- a/google/cloud/aiplatform/v1/schema/predict/params_v1/gapic_version.py +++ b/google/cloud/aiplatform/v1/schema/predict/params_v1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.150.0" # {x-release-please-version} +__version__ = "1.149.0" # {x-release-please-version} diff --git a/google/cloud/aiplatform/v1/schema/predict/prediction/gapic_version.py b/google/cloud/aiplatform/v1/schema/predict/prediction/gapic_version.py index 050159c67f..92e0d51628 100644 --- a/google/cloud/aiplatform/v1/schema/predict/prediction/gapic_version.py +++ b/google/cloud/aiplatform/v1/schema/predict/prediction/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.150.0" # {x-release-please-version} +__version__ = "1.149.0" # {x-release-please-version} diff --git a/google/cloud/aiplatform/v1/schema/predict/prediction_v1/gapic_version.py b/google/cloud/aiplatform/v1/schema/predict/prediction_v1/gapic_version.py index 050159c67f..92e0d51628 100644 --- a/google/cloud/aiplatform/v1/schema/predict/prediction_v1/gapic_version.py +++ b/google/cloud/aiplatform/v1/schema/predict/prediction_v1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.150.0" # {x-release-please-version} +__version__ = "1.149.0" # {x-release-please-version} diff --git a/google/cloud/aiplatform/v1/schema/trainingjob/definition/gapic_version.py b/google/cloud/aiplatform/v1/schema/trainingjob/definition/gapic_version.py index 050159c67f..92e0d51628 100644 --- a/google/cloud/aiplatform/v1/schema/trainingjob/definition/gapic_version.py +++ b/google/cloud/aiplatform/v1/schema/trainingjob/definition/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.150.0" # {x-release-please-version} +__version__ = "1.149.0" # {x-release-please-version} diff --git a/google/cloud/aiplatform/v1/schema/trainingjob/definition_v1/gapic_version.py b/google/cloud/aiplatform/v1/schema/trainingjob/definition_v1/gapic_version.py index 050159c67f..92e0d51628 100644 --- a/google/cloud/aiplatform/v1/schema/trainingjob/definition_v1/gapic_version.py +++ b/google/cloud/aiplatform/v1/schema/trainingjob/definition_v1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.150.0" # {x-release-please-version} +__version__ = "1.149.0" # {x-release-please-version} diff --git a/google/cloud/aiplatform/v1beta1/schema/predict/instance/gapic_version.py b/google/cloud/aiplatform/v1beta1/schema/predict/instance/gapic_version.py index 050159c67f..92e0d51628 100644 --- a/google/cloud/aiplatform/v1beta1/schema/predict/instance/gapic_version.py +++ b/google/cloud/aiplatform/v1beta1/schema/predict/instance/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.150.0" # {x-release-please-version} +__version__ = "1.149.0" # {x-release-please-version} diff --git a/google/cloud/aiplatform/v1beta1/schema/predict/instance_v1beta1/gapic_version.py b/google/cloud/aiplatform/v1beta1/schema/predict/instance_v1beta1/gapic_version.py index 050159c67f..92e0d51628 100644 --- a/google/cloud/aiplatform/v1beta1/schema/predict/instance_v1beta1/gapic_version.py +++ b/google/cloud/aiplatform/v1beta1/schema/predict/instance_v1beta1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.150.0" # {x-release-please-version} +__version__ = "1.149.0" # {x-release-please-version} diff --git a/google/cloud/aiplatform/v1beta1/schema/predict/params/gapic_version.py b/google/cloud/aiplatform/v1beta1/schema/predict/params/gapic_version.py index 050159c67f..92e0d51628 100644 --- a/google/cloud/aiplatform/v1beta1/schema/predict/params/gapic_version.py +++ b/google/cloud/aiplatform/v1beta1/schema/predict/params/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.150.0" # {x-release-please-version} +__version__ = "1.149.0" # {x-release-please-version} diff --git a/google/cloud/aiplatform/v1beta1/schema/predict/params_v1beta1/gapic_version.py b/google/cloud/aiplatform/v1beta1/schema/predict/params_v1beta1/gapic_version.py index 050159c67f..92e0d51628 100644 --- a/google/cloud/aiplatform/v1beta1/schema/predict/params_v1beta1/gapic_version.py +++ b/google/cloud/aiplatform/v1beta1/schema/predict/params_v1beta1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.150.0" # {x-release-please-version} +__version__ = "1.149.0" # {x-release-please-version} diff --git a/google/cloud/aiplatform/v1beta1/schema/predict/prediction/gapic_version.py b/google/cloud/aiplatform/v1beta1/schema/predict/prediction/gapic_version.py index 050159c67f..92e0d51628 100644 --- a/google/cloud/aiplatform/v1beta1/schema/predict/prediction/gapic_version.py +++ b/google/cloud/aiplatform/v1beta1/schema/predict/prediction/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.150.0" # {x-release-please-version} +__version__ = "1.149.0" # {x-release-please-version} diff --git a/google/cloud/aiplatform/v1beta1/schema/predict/prediction_v1beta1/gapic_version.py b/google/cloud/aiplatform/v1beta1/schema/predict/prediction_v1beta1/gapic_version.py index 050159c67f..92e0d51628 100644 --- a/google/cloud/aiplatform/v1beta1/schema/predict/prediction_v1beta1/gapic_version.py +++ b/google/cloud/aiplatform/v1beta1/schema/predict/prediction_v1beta1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.150.0" # {x-release-please-version} +__version__ = "1.149.0" # {x-release-please-version} diff --git a/google/cloud/aiplatform/v1beta1/schema/trainingjob/definition/gapic_version.py b/google/cloud/aiplatform/v1beta1/schema/trainingjob/definition/gapic_version.py index 050159c67f..92e0d51628 100644 --- a/google/cloud/aiplatform/v1beta1/schema/trainingjob/definition/gapic_version.py +++ b/google/cloud/aiplatform/v1beta1/schema/trainingjob/definition/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.150.0" # {x-release-please-version} +__version__ = "1.149.0" # {x-release-please-version} diff --git a/google/cloud/aiplatform/v1beta1/schema/trainingjob/definition_v1beta1/gapic_version.py b/google/cloud/aiplatform/v1beta1/schema/trainingjob/definition_v1beta1/gapic_version.py index 050159c67f..92e0d51628 100644 --- a/google/cloud/aiplatform/v1beta1/schema/trainingjob/definition_v1beta1/gapic_version.py +++ b/google/cloud/aiplatform/v1beta1/schema/trainingjob/definition_v1beta1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.150.0" # {x-release-please-version} +__version__ = "1.149.0" # {x-release-please-version} diff --git a/google/cloud/aiplatform/version.py b/google/cloud/aiplatform/version.py index 050a77837b..73e787be69 100644 --- a/google/cloud/aiplatform/version.py +++ b/google/cloud/aiplatform/version.py @@ -15,4 +15,4 @@ # limitations under the License. # -__version__ = "1.150.0" +__version__ = "1.149.0" diff --git a/google/cloud/aiplatform_v1/gapic_version.py b/google/cloud/aiplatform_v1/gapic_version.py index 050159c67f..92e0d51628 100644 --- a/google/cloud/aiplatform_v1/gapic_version.py +++ b/google/cloud/aiplatform_v1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.150.0" # {x-release-please-version} +__version__ = "1.149.0" # {x-release-please-version} diff --git a/google/cloud/aiplatform_v1beta1/gapic_version.py b/google/cloud/aiplatform_v1beta1/gapic_version.py index 050159c67f..92e0d51628 100644 --- a/google/cloud/aiplatform_v1beta1/gapic_version.py +++ b/google/cloud/aiplatform_v1beta1/gapic_version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "1.150.0" # {x-release-please-version} +__version__ = "1.149.0" # {x-release-please-version} diff --git a/pypi/_vertex_ai_placeholder/version.py b/pypi/_vertex_ai_placeholder/version.py index 60b33252a5..69e48b1ba6 100644 --- a/pypi/_vertex_ai_placeholder/version.py +++ b/pypi/_vertex_ai_placeholder/version.py @@ -15,4 +15,4 @@ # limitations under the License. # -__version__ = "1.150.0" +__version__ = "1.149.0" diff --git a/samples/generated_samples/snippet_metadata_google.cloud.aiplatform.v1.json b/samples/generated_samples/snippet_metadata_google.cloud.aiplatform.v1.json index aebed3c072..0f9b93fdac 100644 --- a/samples/generated_samples/snippet_metadata_google.cloud.aiplatform.v1.json +++ b/samples/generated_samples/snippet_metadata_google.cloud.aiplatform.v1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-aiplatform", - "version": "1.150.0" + "version": "1.149.0" }, "snippets": [ { diff --git a/samples/generated_samples/snippet_metadata_google.cloud.aiplatform.v1beta1.json b/samples/generated_samples/snippet_metadata_google.cloud.aiplatform.v1beta1.json index a647aad090..81c49fac12 100644 --- a/samples/generated_samples/snippet_metadata_google.cloud.aiplatform.v1beta1.json +++ b/samples/generated_samples/snippet_metadata_google.cloud.aiplatform.v1beta1.json @@ -8,7 +8,7 @@ ], "language": "PYTHON", "name": "google-cloud-aiplatform", - "version": "1.150.0" + "version": "1.149.0" }, "snippets": [ { diff --git a/vertexai/_genai/_evals_visualization.py b/vertexai/_genai/_evals_visualization.py index a3cf2ca93f..ed5e82a93a 100644 --- a/vertexai/_genai/_evals_visualization.py +++ b/vertexai/_genai/_evals_visualization.py @@ -166,10 +166,12 @@ def _extract_dataset_rows(dataset: types.EvaluationDataset) -> list[dict[str, An prompt_key = "request" if "request" in row else "prompt" prompt_info = _extract_text_and_raw_json(row.get(prompt_key)) response_info = _extract_text_and_raw_json(row.get("response")) + ref_info = _extract_text_and_raw_json(row.get("reference")) processed_row = { "prompt_display_text": prompt_info["display_text"], "prompt_raw_json": prompt_info["raw_json"], - "reference": row.get("reference", ""), + "reference": ref_info["display_text"], + "reference_raw_json": ref_info["raw_json"], "response_display_text": response_info["display_text"], "response_raw_json": response_info["raw_json"], "intermediate_events": row.get("intermediate_events", None), @@ -191,9 +193,11 @@ def _extract_dataset_rows(dataset: types.EvaluationDataset) -> list[dict[str, An response_info = _extract_text_and_raw_json(case.responses[0].response) reference_text = "" + reference_raw_json = "" if case.reference and case.reference.response: ref_info = _extract_text_and_raw_json(case.reference.response) reference_text = ref_info["display_text"] + reference_raw_json = ref_info["raw_json"] agent_data_json = None if case.agent_data: @@ -216,6 +220,7 @@ def _extract_dataset_rows(dataset: types.EvaluationDataset) -> list[dict[str, An "prompt_display_text": prompt_info["display_text"], "prompt_raw_json": prompt_info["raw_json"], "reference": reference_text, + "reference_raw_json": reference_raw_json, "response_display_text": response_info["display_text"], "response_raw_json": response_info["raw_json"], "intermediate_events": intermediate_events_json, @@ -250,7 +255,7 @@ def _get_evaluation_html(eval_result_json: str) -> str: details {{ border: 1px solid #dadce0; border-radius: 8px; padding: 16px; margin-bottom: 16px; background: #fff; }} summary {{ font-weight: 500; font-size: 1.1em; cursor: pointer; }} .prompt-container {{ background-color: #e8f0fe; padding: 16px; margin: 12px 0; border-radius: 8px; white-space: pre-wrap; word-wrap: break-word; overflow-wrap: break-word; }} - .reference-container {{ background-color: #e6f4ea; padding: 16px; margin: 12px 0; border-radius: 8px; white-space: pre-wrap; word-wrap: break-word; overflow-wrap: break-word; }} + .reference-container {{ background-color: #fff; border: 1px solid #dadce0; padding: 16px; margin: 12px 0; border-radius: 8px; white-space: pre-wrap; word-wrap: break-word; overflow-wrap: break-word; }} .agent-info-container {{ background-color: #f1f3f4; padding: 16px; margin: 12px 0; border-radius: 8px; word-wrap: break-word; overflow-wrap: break-word; font-size: 14px; }} .agent-info-grid {{ display: grid; grid-template-columns: 120px 1fr; gap: 8px; margin-bottom: 12px; }} .agent-info-grid dt {{ font-weight: 500; color: #3c4043; }} @@ -579,6 +584,7 @@ def _get_evaluation_html(eval_result_json: str) -> str: const promptText = isValEmpty(original_case.prompt_display_text) ? '' : original_case.prompt_display_text; const promptJson = original_case.prompt_raw_json; const reference = isValEmpty(original_case.reference) ? '' : original_case.reference; + const referenceJson = original_case.reference_raw_json; const responseText = isValEmpty(original_case.response_display_text) ? '' : original_case.response_display_text; const responseJson = original_case.response_raw_json; @@ -588,6 +594,18 @@ def _get_evaluation_html(eval_result_json: str) -> str: }} const isAgentEval = !!agentData; + let isRefAgentData = false; + let refAgentDataObj = null; + if (reference) {{ + try {{ + let parsed = typeof reference === 'string' ? JSON.parse(reference) : reference; + if (parsed && parsed.turns) {{ + isRefAgentData = true; + refAgentDataObj = parsed; + }} + }} catch(e) {{}} + }} + let card = `
Case #${{caseResult.eval_case_index != null ? caseResult.eval_case_index : i}}`; if (isAgentEval && agentData.agents && Object.keys(agentData.agents).length > 0) {{ @@ -597,46 +615,55 @@ def _get_evaluation_html(eval_result_json: str) -> str:
`; }} - card += `
`; + if (promptText) {{ + card += `
Prompt:
${{DOMPurify.sanitize(marked.parse(String(promptText)))}}
`; + }} + if (promptJson && promptJson !== '""' && promptJson !== 'null' && promptJson !== '{{}}') {{ + card += `
View Raw Prompt JSON
${{DOMPurify.sanitize(promptJson)}}
`; + }} - const hasMainContent = promptText || responseText || reference; + if (responseText) {{ + const responseTitle = isAgentEval ? 'Final Response' : 'Candidate Response'; + card += `

${{responseTitle}}

${{DOMPurify.sanitize(marked.parse(String(responseText)))}}
`; + }} + if (responseJson && responseJson !== '""' && responseJson !== 'null' && responseJson !== '{{}}') {{ + card += `
View Raw Response JSON
${{DOMPurify.sanitize(responseJson)}}
`; + }} - if (hasMainContent) {{ - card += `
`; - if (promptText) {{ - card += `
Prompt:
${{DOMPurify.sanitize(marked.parse(String(promptText)))}}
`; - }} - if (promptJson && promptJson !== '""' && promptJson !== 'null' && promptJson !== '{{}}') {{ - card += `
View Raw Prompt JSON
${{DOMPurify.sanitize(promptJson)}}
`; - }} + let hasTrace = isAgentEval && agentData.turns; + let hasRef = !!reference; - if (reference) {{ - card += `
Reference:
${{DOMPurify.sanitize(marked.parse(String(reference)))}}
`; - }} + if (hasTrace || hasRef) {{ + card += `
`; - if (responseText) {{ - const responseTitle = isAgentEval ? 'Final Response' : 'Candidate Response'; - card += `

${{responseTitle}}

${{DOMPurify.sanitize(marked.parse(String(responseText)))}}
`; + if (hasTrace) {{ + let traceContent = formatAgentData(agentData); + card += `
+
+ Conversation Trace +
Sequence of multi-agent events across turns
+
${{traceContent}}
+
+
`; }} - if (responseJson && responseJson !== '""' && responseJson !== 'null' && responseJson !== '{{}}') {{ - card += `
View Raw Response JSON
${{DOMPurify.sanitize(responseJson)}}
`; + + if (hasRef) {{ + card += `
`; + if (isRefAgentData) {{ + let refTraceContent = formatAgentData(refAgentDataObj); + card += `
+ Reference +
Sequence of multi-agent events across turns
+
${{refTraceContent}}
+
`; + }} else {{ + card += `
Reference
${{DOMPurify.sanitize(marked.parse(String(reference)))}}
`; + }} + card += `
`; }} card += `
`; }} - if (isAgentEval && agentData.turns) {{ - let traceContent = formatAgentData(agentData); - const sidebarStyle = hasMainContent ? '' : 'flex: 1 1 100%;'; - - card += ``; - }} - - card += `
`; - let metricTable = '

Evaluation Metrics

'; const candidateMetrics = (caseResult.response_candidate_results && caseResult.response_candidate_results[0] && caseResult.response_candidate_results[0].metric_results) || {{}}; Object.entries(candidateMetrics).forEach(([name, val]) => {{ @@ -785,6 +812,7 @@ def _get_comparison_html(eval_result_json: str) -> str: details {{ border: 1px solid #dadce0; border-radius: 8px; padding: 24px; margin-bottom: 24px; background: #fff; }} summary {{ font-weight: 500; font-size: 1.2em; cursor: pointer; }} .prompt-container {{ background-color: #e8f0fe; padding: 16px; margin-bottom: 16px; border-radius: 8px; white-space: pre-wrap; word-wrap: break-word; overflow-wrap: break-word; }} + .reference-container {{ background-color: #fff; border: 1px solid #dadce0; padding: 16px; margin-bottom: 16px; border-radius: 8px; white-space: pre-wrap; word-wrap: break-word; overflow-wrap: break-word; }} .responses-grid {{ display: grid; grid-template-columns: repeat(auto-fit, minmax(350px, 1fr)); gap: 20px; margin-top: 16px;}} .response-column {{ border: 1px solid #e0e0e0; padding: 16px; border-radius: 8px; background: #f9f9f9; }} .response-text-container {{ background-color: #fff; padding: 12px; margin-top: 8px; border-radius: 4px; border: 1px solid #eee; white-space: pre-wrap; word-wrap: break-word; max-height: 400px; overflow-y: auto; overflow-wrap: break-word; }} @@ -1102,10 +1130,34 @@ def _get_comparison_html(eval_result_json: str) -> str: const promptText = isValEmpty(original_case.prompt_display_text) ? '' : original_case.prompt_display_text; const promptJson = original_case.prompt_raw_json; - const agentData = original_case.agent_data; + const reference = isValEmpty(original_case.reference) ? '' : original_case.reference; + + let agentData = original_case.agent_data; + if (typeof agentData === 'string') {{ + try {{ agentData = JSON.parse(agentData); }} catch(e) {{}} + }} + + let isRefAgentData = false; + let refAgentDataObj = null; + if (reference) {{ + try {{ + let parsed = typeof reference === 'string' ? JSON.parse(reference) : reference; + if (parsed && parsed.turns) {{ + isRefAgentData = true; + refAgentDataObj = parsed; + }} + }} catch(e) {{}} + }} let card = `
Case #${{caseResult.eval_case_index}}`; + if (agentData && agentData.agents && Object.keys(agentData.agents).length > 0) {{ + card += `
+ System Topology + ${{formatSystemTopology(agentData.agents)}} +
`; + }} + if (promptText) {{ card += `
Prompt:
${{DOMPurify.sanitize(marked.parse(String(promptText)))}}
`; }} @@ -1114,25 +1166,39 @@ def _get_comparison_html(eval_result_json: str) -> str: card += `
View Raw Prompt JSON
${{DOMPurify.sanitize(promptJson)}}
`; }} - if (agentData) {{ - if (typeof agentData === 'string') {{ - try {{ agentData = JSON.parse(agentData); }} catch(e) {{}} - }} + let hasTrace = agentData && agentData.turns; + let hasRef = !!reference; + + if (hasTrace || hasRef) {{ + card += `
`; - if (agentData.agents && Object.keys(agentData.agents).length > 0) {{ - card += `
- System Topology - ${{formatSystemTopology(agentData.agents)}} -
`; + if (hasTrace) {{ + let traceContent = formatAgentData(agentData); + card += `
+
+ Conversation Trace +
Sequence of multi-agent events across turns
+
${{traceContent}}
+
+
`; }} - if (agentData.turns) {{ - card += `
- Conversation Trace -
Sequence of multi-agent events across turns
-
${{formatAgentData(agentData)}}
-
`; + if (hasRef) {{ + card += `
`; + if (isRefAgentData) {{ + let refTraceContent = formatAgentData(refAgentDataObj); + card += `
+ Reference +
Sequence of multi-agent events across turns
+
${{refTraceContent}}
+
`; + }} else {{ + card += `
Reference
${{DOMPurify.sanitize(marked.parse(String(reference)))}}
`; + }} + card += `
`; }} + + card += `
`; }} card += `
`;