Skip to content

UN-2954: Display average confidence of highlighted lines in Prompt Studio#1646

Merged
vishnuszipstack merged 6 commits intomainfrom
UN-2954-display-average-confidence-of-highlighted-line-in-prompt-studio
Nov 5, 2025
Merged

UN-2954: Display average confidence of highlighted lines in Prompt Studio#1646
vishnuszipstack merged 6 commits intomainfrom
UN-2954-display-average-confidence-of-highlighted-line-in-prompt-studio

Conversation

@Deepak-Kesavan
Copy link
Contributor

What

Frontend implementation to display average confidence scores of highlighted lines in Prompt Studio.

Why

To provide users with visibility into the confidence scores of extracted text, helping them assess the reliability of LLMWhisperer's OCR output.

How

PromptCard.jsx:

  • Added extractConfidenceFromHighlightData() function to recursively extract confidence values from the 5th element of coordinate arrays
  • Calculates average confidence across all lines in a highlight
  • Updated addCoordsToFlattened() to strip the 5th element (confidence) before rendering
  • Modified handleSelectHighlight() to prioritize extracted confidence over API-provided confidence data

PdfViewer.jsx:

  • Updated removeZerosAndDeleteIfAllZero() to strip the 5th element before PDF rendering
  • Ensures highlights render correctly with only 4 coordinate elements

DocumentManager.jsx:

  • Updated confidence score display to handle both new format (number/average) and old format (nested arrays)
  • Displays confidence with 2 decimal places

sdk1/pyproject.toml:

  • Bumped llmwhisperer-client to 2.5.0 to support confidence extraction

Can this PR break any existing features. If yes, please list possible items. If no, please explain why.

No, this PR is backward compatible:

  • Falls back to old confidenceData from API if 5th element doesn't exist
  • Handles both old format (nested arrays) and new format (number) in UI
  • Stripping 5th element only affects data with 5+ elements; 4-element arrays work as before

Database Migrations

  • None

Env Config

  • None

Relevant Docs

  • Related to LLMWhisperer V2 confidence extraction feature
  • Coordinate format: [page, x, y, width, confidence]

Related Issues or PRs

Dependencies Versions

  • llmwhisperer-client==2.5.0 (bumped in sdk1/pyproject.toml)

Notes on Testing

  1. Enable highlighting in Prompt Studio
  2. Run extraction on a document
  3. Click on extracted values to view highlights
  4. Verify confidence score displays as a decimal number (e.g., "0.98")
  5. For multi-line highlights, confidence should be the average across all lines

Screenshots

N/A

Checklist

I have read and understood the Contribution Guidelines.

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Nov 4, 2025

Summary by CodeRabbit

  • Bug Fixes

    • Improved robustness of confidence score display to gracefully handle multiple data format variations.
    • Enhanced highlight selection with improved coordinate processing and more accurate confidence value calculations.
  • Chores

    • Updated unstract SDK dependencies across platform services to version 0.79.0.

Walkthrough

Confidence and coordinate handling were adjusted across three frontend components: DocumentManager now formats varied confidence shapes explicitly; PdfViewer strips and ignores confidence when filtering zero-coordinate highlights; PromptCard extracts confidences from nested coordinate arrays, averages them, and uses that averaged value when selecting highlights.

Changes

Cohort / File(s) Summary
Confidence Score Fallback
frontend/src/components/custom-tools/document-manager/DocumentManager.jsx
Replaced static fallback chain with an inline function that: formats numeric confidences to two decimals; handles legacy nested formats; maps empty nested arrays to "1"; defaults to "NA".
Coordinate Filtering Logic
frontend/src/components/custom-tools/pdf-viewer/PdfViewer.jsx
Updated removeZerosAndDeleteIfAllZero to consider only the first four coordinate elements when checking for all-zero entries, drop the optional 5th (confidence) element from outputs, and only keep inner entries that are arrays.
Confidence Extraction & Averaging
frontend/src/components/custom-tools/prompt-card/PromptCard.jsx
When flattening coordinates, slice to first four elements; add routine to collect 5th-element confidences from nested coordinate arrays, compute their average, and use that averaged value as the final selectedHighlight.confidence with fallback to the API-provided confidence.
Dependency bumps
backend/pyproject.toml, platform-service/pyproject.toml, prompt-service/pyproject.toml, pyproject.toml, tools/classifier/requirements.txt, tools/structure/requirements.txt, tools/text_extractor/requirements.txt, unstract/filesystem/pyproject.toml, unstract/tool-registry/pyproject.toml, workers/pyproject.toml
Bumped unstract-sdk from ~0.78.0 to ~0.79.0 (various extras like aws,gcs,azure where present). No code logic changes in these files.

Sequence Diagram(s)

sequenceDiagram
    participant User
    participant PromptCard
    participant PdfViewer
    participant DocumentManager

    Note over User,PromptCard: User selects a highlight
    User ->> PromptCard: selectHighlight(highlightData)
    activate PromptCard
    PromptCard ->> PromptCard: flatten coords (slice first 4)
    PromptCard ->> PromptCard: extract any 5th-element confidences
    PromptCard ->> PromptCard: compute average confidence or fallback
    PromptCard ->> PdfViewer: send cleaned coords (no confidence)
    deactivate PromptCard

    activate PdfViewer
    PdfViewer ->> PdfViewer: removeZerosAndDeleteIfAllZero (checks first 4 coords)
    PdfViewer ->> DocumentManager: updated highlight payload (coords only)
    deactivate PdfViewer

    activate DocumentManager
    DocumentManager ->> DocumentManager: format confidence display (inline function)
    DocumentManager -->> User: render highlight + confidence
    deactivate DocumentManager
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~22 minutes

  • Pay attention to DocumentManager's new fallback branches and edge cases.
  • Verify PdfViewer's removal of the 5th element doesn't break downstream consumers or UI expectations.
  • Validate PromptCard's traversal and averaging logic for nested/irregular coordinate shapes.

Pre-merge checks and finishing touches

✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and specifically describes the main change: displaying average confidence of highlighted lines in Prompt Studio, directly matching the PR's primary objective.
Description check ✅ Passed The description comprehensively covers all required template sections including What, Why, How, backward compatibility assessment, dependencies, testing notes, and related issues.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch UN-2954-display-average-confidence-of-highlighted-line-in-prompt-studio

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

…udio

- Extract confidence from 5th element of highlight coordinate arrays
- Calculate and display average confidence across multiple lines
- Strip 5th element before rendering PDF highlights
- Support both new format (number) and old format (nested arrays) for confidence display
@Deepak-Kesavan Deepak-Kesavan force-pushed the UN-2954-display-average-confidence-of-highlighted-line-in-prompt-studio branch from 964b647 to 3a62040 Compare November 4, 2025 22:14
- Fix quote style consistency (single to double quotes)
- Fix code formatting and line breaks
- Address ESLint/Prettier warnings
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

🧹 Nitpick comments (3)
frontend/src/components/custom-tools/pdf-viewer/PdfViewer.jsx (1)

40-42: Consider eliminating redundant processing.

The removeZerosAndDeleteIfAllZero function is called twice with the same input (highlightData): once at line 40 to create processHighlightData, and again at line 80 within the effect. This redundant processing can be avoided by reusing the already-computed processHighlightData in the effect.

Consider this optimization:

+  const processHighlightData = useMemo(
+    () => (highlightData ? removeZerosAndDeleteIfAllZero(highlightData) : []),
+    [highlightData]
+  );
-  const processHighlightData = highlightData
-    ? removeZerosAndDeleteIfAllZero(highlightData)
-    : [];

   // ... rest of code ...

   useEffect(() => {
-    const cleanedHighlightData = removeZerosAndDeleteIfAllZero(highlightData);
+    const cleanedHighlightData = processHighlightData;
     if (cleanedHighlightData && cleanedHighlightData.length > 0) {
       // ... rest of effect logic ...
     }
-  }, [highlightData, jumpToPage, currentHighlightIndex]);
+  }, [processHighlightData, jumpToPage, currentHighlightIndex]);

Note: The comment at line 96 suggests the dependency was intentionally changed from processedHighlightData to highlightData. If there was a specific reason for this change (e.g., preventing infinite loops), please disregard this suggestion.

Also applies to: 79-96

frontend/src/components/custom-tools/prompt-card/PromptCard.jsx (1)

216-251: Consider validating confidence value range.

The extraction logic correctly handles nested structures and computes averages. However, confidence scores are typically in the range [0, 1], and the function doesn't validate this assumption.

Apply this diff to add range validation:

             if (Array.isArray(item)) {
               // Check if this is a coordinate array with 5 elements
-              if (item.length >= 5 && typeof item[4] === "number") {
-                confidenceValues.push(item[4]);
+              if (
+                item.length >= 5 &&
+                typeof item[4] === "number" &&
+                item[4] >= 0 &&
+                item[4] <= 1
+              ) {
+                confidenceValues.push(item[4]);
               } else {
frontend/src/components/custom-tools/document-manager/DocumentManager.jsx (1)

377-395: Normalize legacy confidence formatting to two decimals.

New numeric confidences get toFixed(2), but the legacy array branches return the raw value or "1", so older highlights can render with arbitrary precision (or no trailing zeros). Convert those branches through Number(...).toFixed(2)—and return "1.00" for the empty-array sentinel—to keep the display consistent with the stated two-decimal requirement.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

Cache: Disabled due to Reviews > Disable Cache setting

Knowledge base: Disabled due to Reviews -> Disable Knowledge Base setting

📥 Commits

Reviewing files that changed from the base of the PR and between 7ee1364 and 249b794.

📒 Files selected for processing (3)
  • frontend/src/components/custom-tools/document-manager/DocumentManager.jsx (1 hunks)
  • frontend/src/components/custom-tools/pdf-viewer/PdfViewer.jsx (1 hunks)
  • frontend/src/components/custom-tools/prompt-card/PromptCard.jsx (3 hunks)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: build
🔇 Additional comments (3)
frontend/src/components/custom-tools/pdf-viewer/PdfViewer.jsx (1)

24-38: LGTM! Confidence stripping logic is correct.

The implementation correctly strips the 5th element (confidence) from coordinate arrays while maintaining backward compatibility with 4-element arrays. The two-step approach (filter based on first 4 coordinates, then map to return only first 4 elements) ensures highlights render correctly with PDF viewer expectations.

frontend/src/components/custom-tools/prompt-card/PromptCard.jsx (2)

267-277: LGTM: Confidence prioritization logic is well-implemented.

The fallback chain correctly prioritizes extracted confidence from coordinate arrays over API-provided confidence data, and the nullish coalescing operator (??) ensures proper backward compatibility.


172-178: Verify coordinate array structure expectations and add defensive validation if needed.

The coordinate stripping logic is correct—it safely handles arrays with fewer than 5 elements by passing them through unchanged. However, there is no validation ensuring coordinates have at least 4 elements [page, x, y, width] before reaching rendering.

The code at line 175 (coords.length >= 5 ? coords.slice(0, 4) : coords) will pass through arrays with 1-3 elements, which could cause rendering issues downstream. While PdfViewer has a fallback [[0, 0, 0, 0]] for empty data, it doesn't guard against undersized coordinate arrays.

Verification needed:

  • Confirm that coordinate arrays from highlight data always have 4+ elements before addCoordsToFlattened is called
  • If source data can be incomplete, add a length check: coordsOnly.length >= 4 ? coordsOnly : null or similar validation

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

🧹 Nitpick comments (2)
platform-service/pyproject.toml (1)

18-18: Optional: Consider standardizing extras order across multi-cloud dependencies.

The extras are specified as [gcs, azure, aws] here, while workers/pyproject.toml uses [aws, gcs, azure]. While functionally equivalent, standardizing the order across files would improve consistency and reduce noise in future diffs.

prompt-service/pyproject.toml (1)

18-18: Inconsistent version pinning between unstract-sdk and unstract-sdk1.

unstract-sdk is pinned to ~=0.79.0 (line 18), but unstract-sdk1 (line 22) lacks a version constraint. This asymmetry may lead to unpredictable builds if unstract-sdk1 receives incompatible updates. Consider pinning both consistently.

Also applies to: 22-22

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

Cache: Disabled due to Reviews > Disable Cache setting

Knowledge base: Disabled due to Reviews -> Disable Knowledge Base setting

📥 Commits

Reviewing files that changed from the base of the PR and between 249b794 and 61dca62.

⛔ Files ignored due to path filters (5)
  • backend/uv.lock is excluded by !**/*.lock
  • platform-service/uv.lock is excluded by !**/*.lock
  • prompt-service/uv.lock is excluded by !**/*.lock
  • unstract/filesystem/uv.lock is excluded by !**/*.lock
  • uv.lock is excluded by !**/*.lock
📒 Files selected for processing (11)
  • backend/pyproject.toml (1 hunks)
  • frontend/src/components/custom-tools/prompt-card/PromptCard.jsx (3 hunks)
  • platform-service/pyproject.toml (1 hunks)
  • prompt-service/pyproject.toml (1 hunks)
  • pyproject.toml (1 hunks)
  • tools/classifier/requirements.txt (1 hunks)
  • tools/structure/requirements.txt (1 hunks)
  • tools/text_extractor/requirements.txt (1 hunks)
  • unstract/filesystem/pyproject.toml (1 hunks)
  • unstract/tool-registry/pyproject.toml (1 hunks)
  • workers/pyproject.toml (1 hunks)
✅ Files skipped from review due to trivial changes (1)
  • backend/pyproject.toml
🚧 Files skipped from review as they are similar to previous changes (1)
  • frontend/src/components/custom-tools/prompt-card/PromptCard.jsx
🔇 Additional comments (11)
tools/structure/requirements.txt (2)

6-6: Frontend changes absent from review scope.

The PR objectives detail changes to PromptCard.jsx, PdfViewer.jsx, and DocumentManager.jsx, but the files under review contain only backend Python dependency updates. Please confirm whether the frontend JSX files are included in this PR or scheduled for a separate review.


6-6: Dependency bump is consistent and reasonable.

The version bump from ~=0.78.0 to ~=0.79.0 uses an appropriate compatible-release specifier. This specifier allows patch updates (0.79.x) while preventing unexpected minor version changes, which aligns with good dependency management practices.

tools/classifier/requirements.txt (1)

7-7: Consistent dependency update across tool packages.

The bump to unstract-sdk[aws]~=0.79.0 mirrors the same change in tools/structure/requirements.txt, indicating a coordinated dependency update across multiple tool components.

pyproject.toml (1)

44-44: Development dependency bump is appropriate.

The unstract-sdk update in the hook-check-django-migrations group (a dev/CI tooling dependency group) uses a conservative compatible-release specifier, which is suitable for development dependencies.

tools/text_extractor/requirements.txt (1)

7-7: Consistent tool package dependency update.

The update to unstract-sdk[aws]~=0.79.0 aligns with the same version bump applied across tools/structure/requirements.txt and tools/classifier/requirements.txt.

unstract/tool-registry/pyproject.toml (1)

14-14: Runtime dependency bump is consistent.

The update to unstract-sdk~=0.79.0 in the tool-registry package's runtime dependencies follows the same coordinated version bump pattern.

workers/pyproject.toml (1)

27-27: Core workers dependency update with multi-cloud extras.

The bump to unstract-sdk[aws,gcs,azure]~=0.79.0 appropriately includes multi-cloud provider extras, consistent with the workers package's broader cloud support needs compared to individual tool packages.

platform-service/pyproject.toml (1)

18-18: Platform service dependency update with multi-cloud support.

The update to unstract-sdk[gcs, azure, aws]~=0.79.0 appropriately reflects the platform-service's need for multi-cloud provider support, consistent with the workers package scope.

unstract/filesystem/pyproject.toml (2)

9-9: Filesystem package dependency update.

The update to unstract-sdk~=0.79.0 is appropriate for the filesystem package, which requires the SDK without cloud-specific extras.


6-6: Verified: unstract-sdk 0.79.0 is available on PyPI and ready for adoption.

unstract-sdk 0.79.0 exists on PyPI with appropriate cloud provider extras (aws, azure, gcs). All 8 files consistently use the safe version specifier ~=0.79.0, which permits patch-level updates while blocking breaking changes. Confirm the frontend JSX files referenced in PR objectives were reviewed separately if out of scope for these dependency updates.

prompt-service/pyproject.toml (1)

18-18: Verify that unstract-sdk 0.79.0 provides the necessary confidence extraction capabilities.

The PR objectives describe confidence extraction features but primarily reference llmwhisperer-client 2.5.0 (for sdk1), not unstract-sdk 0.79.0. Confirm that this version bump delivers the confidence handling needed for the feature, or clarify if the llmwhisperer-client bump should be reflected here instead.

@sonarqubecloud
Copy link

sonarqubecloud bot commented Nov 5, 2025

@github-actions
Copy link
Contributor

github-actions bot commented Nov 5, 2025

Test Results

Summary
  • Runner Tests: 11 passed, 0 failed (11 total)
  • SDK1 Tests: 66 passed, 0 failed (66 total)

Runner Tests - Full Report
filepath function $$\textcolor{#23d18b}{\tt{passed}}$$ SUBTOTAL
$$\textcolor{#23d18b}{\tt{runner/src/unstract/runner/clients/test\_docker.py}}$$ $$\textcolor{#23d18b}{\tt{test\_logs}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{runner/src/unstract/runner/clients/test\_docker.py}}$$ $$\textcolor{#23d18b}{\tt{test\_cleanup}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{runner/src/unstract/runner/clients/test\_docker.py}}$$ $$\textcolor{#23d18b}{\tt{test\_cleanup\_skip}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{runner/src/unstract/runner/clients/test\_docker.py}}$$ $$\textcolor{#23d18b}{\tt{test\_client\_init}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{runner/src/unstract/runner/clients/test\_docker.py}}$$ $$\textcolor{#23d18b}{\tt{test\_get\_image\_exists}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{runner/src/unstract/runner/clients/test\_docker.py}}$$ $$\textcolor{#23d18b}{\tt{test\_get\_image}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{runner/src/unstract/runner/clients/test\_docker.py}}$$ $$\textcolor{#23d18b}{\tt{test\_get\_container\_run\_config}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{runner/src/unstract/runner/clients/test\_docker.py}}$$ $$\textcolor{#23d18b}{\tt{test\_get\_container\_run\_config\_without\_mount}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{runner/src/unstract/runner/clients/test\_docker.py}}$$ $$\textcolor{#23d18b}{\tt{test\_run\_container}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{runner/src/unstract/runner/clients/test\_docker.py}}$$ $$\textcolor{#23d18b}{\tt{test\_get\_image\_for\_sidecar}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{runner/src/unstract/runner/clients/test\_docker.py}}$$ $$\textcolor{#23d18b}{\tt{test\_sidecar\_container}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{TOTAL}}$$ $$\textcolor{#23d18b}{\tt{11}}$$ $$\textcolor{#23d18b}{\tt{11}}$$
SDK1 Tests - Full Report
filepath function $$\textcolor{#23d18b}{\tt{passed}}$$ SUBTOTAL
$$\textcolor{#23d18b}{\tt{tests/test\_platform.py}}$$ $$\textcolor{#23d18b}{\tt{TestPlatformHelperRetry.test\_success\_on\_first\_attempt}}$$ $$\textcolor{#23d18b}{\tt{2}}$$ $$\textcolor{#23d18b}{\tt{2}}$$
$$\textcolor{#23d18b}{\tt{tests/test\_platform.py}}$$ $$\textcolor{#23d18b}{\tt{TestPlatformHelperRetry.test\_retry\_on\_connection\_error}}$$ $$\textcolor{#23d18b}{\tt{2}}$$ $$\textcolor{#23d18b}{\tt{2}}$$
$$\textcolor{#23d18b}{\tt{tests/test\_platform.py}}$$ $$\textcolor{#23d18b}{\tt{TestPlatformHelperRetry.test\_non\_retryable\_http\_error}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/test\_platform.py}}$$ $$\textcolor{#23d18b}{\tt{TestPlatformHelperRetry.test\_retryable\_http\_errors}}$$ $$\textcolor{#23d18b}{\tt{3}}$$ $$\textcolor{#23d18b}{\tt{3}}$$
$$\textcolor{#23d18b}{\tt{tests/test\_platform.py}}$$ $$\textcolor{#23d18b}{\tt{TestPlatformHelperRetry.test\_post\_method\_retry}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/test\_platform.py}}$$ $$\textcolor{#23d18b}{\tt{TestPlatformHelperRetry.test\_retry\_logging}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/test\_prompt.py}}$$ $$\textcolor{#23d18b}{\tt{TestPromptToolRetry.test\_success\_on\_first\_attempt}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/test\_prompt.py}}$$ $$\textcolor{#23d18b}{\tt{TestPromptToolRetry.test\_retry\_on\_errors}}$$ $$\textcolor{#23d18b}{\tt{2}}$$ $$\textcolor{#23d18b}{\tt{2}}$$
$$\textcolor{#23d18b}{\tt{tests/test\_prompt.py}}$$ $$\textcolor{#23d18b}{\tt{TestPromptToolRetry.test\_wrapper\_methods\_retry}}$$ $$\textcolor{#23d18b}{\tt{4}}$$ $$\textcolor{#23d18b}{\tt{4}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestIsRetryableError.test\_connection\_error\_is\_retryable}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestIsRetryableError.test\_timeout\_is\_retryable}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestIsRetryableError.test\_http\_error\_retryable\_status\_codes}}$$ $$\textcolor{#23d18b}{\tt{3}}$$ $$\textcolor{#23d18b}{\tt{3}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestIsRetryableError.test\_http\_error\_non\_retryable\_status\_codes}}$$ $$\textcolor{#23d18b}{\tt{5}}$$ $$\textcolor{#23d18b}{\tt{5}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestIsRetryableError.test\_http\_error\_without\_response}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestIsRetryableError.test\_os\_error\_retryable\_errno}}$$ $$\textcolor{#23d18b}{\tt{5}}$$ $$\textcolor{#23d18b}{\tt{5}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestIsRetryableError.test\_os\_error\_non\_retryable\_errno}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestIsRetryableError.test\_other\_exception\_not\_retryable}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestCalculateDelay.test\_exponential\_backoff\_without\_jitter}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestCalculateDelay.test\_exponential\_backoff\_with\_jitter}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestCalculateDelay.test\_max\_delay\_cap}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestCalculateDelay.test\_max\_delay\_cap\_with\_jitter}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestRetryWithExponentialBackoff.test\_successful\_call\_first\_attempt}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestRetryWithExponentialBackoff.test\_retry\_after\_transient\_failure}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestRetryWithExponentialBackoff.test\_max\_retries\_exceeded}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestRetryWithExponentialBackoff.test\_max\_time\_exceeded}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestRetryWithExponentialBackoff.test\_retry\_with\_custom\_predicate}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestRetryWithExponentialBackoff.test\_no\_retry\_with\_predicate\_false}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestRetryWithExponentialBackoff.test\_exception\_not\_in\_tuple\_not\_retried}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestRetryWithExponentialBackoff.test\_delay\_would\_exceed\_max\_time}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestCreateRetryDecorator.test\_default\_configuration}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestCreateRetryDecorator.test\_environment\_variable\_configuration}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestCreateRetryDecorator.test\_invalid\_max\_retries}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestCreateRetryDecorator.test\_invalid\_max\_time}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestCreateRetryDecorator.test\_invalid\_base\_delay}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestCreateRetryDecorator.test\_invalid\_multiplier}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestCreateRetryDecorator.test\_jitter\_values}}$$ $$\textcolor{#23d18b}{\tt{2}}$$ $$\textcolor{#23d18b}{\tt{2}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestCreateRetryDecorator.test\_custom\_exceptions\_only}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestCreateRetryDecorator.test\_custom\_predicate\_only}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestCreateRetryDecorator.test\_both\_exceptions\_and\_predicate}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestCreateRetryDecorator.test\_exceptions\_match\_but\_predicate\_false}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestPreconfiguredDecorators.test\_retry\_platform\_service\_call\_exists}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestPreconfiguredDecorators.test\_retry\_prompt\_service\_call\_exists}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestPreconfiguredDecorators.test\_platform\_service\_decorator\_retries\_on\_connection\_error}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestPreconfiguredDecorators.test\_prompt\_service\_decorator\_retries\_on\_timeout}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestRetryLogging.test\_warning\_logged\_on\_retry}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestRetryLogging.test\_info\_logged\_on\_success\_after\_retry}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{tests/utils/test\_retry\_utils.py}}$$ $$\textcolor{#23d18b}{\tt{TestRetryLogging.test\_exception\_logged\_on\_giving\_up}}$$ $$\textcolor{#23d18b}{\tt{1}}$$ $$\textcolor{#23d18b}{\tt{1}}$$
$$\textcolor{#23d18b}{\tt{TOTAL}}$$ $$\textcolor{#23d18b}{\tt{66}}$$ $$\textcolor{#23d18b}{\tt{66}}$$

@vishnuszipstack vishnuszipstack merged commit 28501c1 into main Nov 5, 2025
7 of 8 checks passed
@vishnuszipstack vishnuszipstack deleted the UN-2954-display-average-confidence-of-highlighted-line-in-prompt-studio branch November 5, 2025 10:02
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants