UN-2563 [FEAT] Unstract autogen client
What
- Added Unstract AutoGen Client - a Python package that provides a ChatCompletionClient implementation for Microsoft AutoGen framework
- Implements bridge between AutoGen's ChatCompletionClient interface and Unstract's LLM adapter capabilities
- Created comprehensive client with async support, streaming, usage tracking, and retry logic
- Includes helper utilities for simplified AutoGen agent creation and message processing
Why
- Enable integration between Unstract platform and Microsoft AutoGen framework
- Provide a pure Unstract-based solution without external LLM library dependencies
- Allow users to leverage AutoGen's multi-agent capabilities while using Unstract's LLM adapters
- Simplify AutoGen usage for services that don't want AutoGen as a direct dependency
How
- Implemented
UnstractAutoGenClientclass that extends AutoGen'sChatCompletionClientinterface - Created
SimpleAutoGenAgentfor simplified agent interactions without requiring AutoGen dependencies - Added utility functions for message normalization, token estimation, and response extraction
- Implemented comprehensive error handling with specific exception types (Configuration, Completion, Connection, Timeout, Validation)
- Created retry mechanism with exponential backoff for resilience
- Added full async/await support with streaming capabilities
- Implemented usage tracking for token consumption monitoring
- Included comprehensive test suite covering client, utilities, and edge cases
- Added helper functions:
create_simple_autogen_agent,process_with_autogen,process_with_autogen_async
Package Structure
unstract/autogen-client/
├── README.md # Package documentation
├── pyproject.toml # Package configuration and dependencies
├── src/unstract/autogen_client/
│ ├── __init__.py # Public API exports
│ ├── client.py # UnstractAutoGenClient implementation
│ ├── exceptions.py # Custom exception classes
│ ├── helper.py # SimpleAutoGenAgent and helper functions
│ └── utils.py # Utility functions
└── tests/
├── test_client.py # Client tests
└── test_utils.py # Utility function tests
Key Features
- ChatCompletionClient Interface: Full implementation of AutoGen's chat completion interface
- Async/Streaming Support: Native async/await with streaming response support
- Usage Tracking: Track token usage per request and total usage
- Error Handling: Comprehensive error handling with specific exception types
- Retry Logic: Configurable retry mechanism with exponential backoff
- Simplified Helpers: Easy-to-use helper functions for common use cases
- No AutoGen Dependency: Services can use SimpleAutoGenAgent without installing AutoGen
Can this PR break any existing features. If yes, please list possible items. If no, please explain why. (PS: Admins do not merge the PR without this section filled)
No - This is a new standalone package that doesn't modify any existing functionality. It only adds a new client implementation that bridges AutoGen and Unstract adapters. The package is completely isolated in the unstract/autogen-client/ directory.
Database Migrations
None
Env Config
None
Relevant Docs
- Package README at
unstract/autogen-client/README.md
Related Issues or PRs
- Related to UN-2563
- Works with SDK1 (unstract.sdk1) for LLM adapter integration
Dependencies
autogen-core>=0.4.0.dev12- Microsoft AutoGen frameworkunstract-sdk1- Unstract SDK for LLM adapters (uses sdk1.llm module)
Notes on Testing
- Comprehensive unit tests in
unstract/autogen-client/tests/test_client.py: Tests for UnstractAutoGenClienttest_utils.py: Tests for utility functions
- Tests cover: initialization, completion, streaming, error handling, usage tracking, message normalization
- Run tests:
cd unstract/autogen-client && pytest tests/
Screenshots
N/A
Checklist
I have read and understood the Contribution Guidelines.
Summary by CodeRabbit
-
New Features
- Introduced Unstract AutoGen Client with compatibility for AutoGen-style chat, async and streaming responses, token/usage tracking, retries/backoff, and robust error handling.
- Added a lightweight agent and convenience helpers for quick prompt processing and simple conversational flows.
- Provided capability reporting and basic token estimation.
-
Documentation
- New README with installation, quick start, advanced configuration, integration examples, streaming usage, error handling, requirements, and license.
-
Tests
- Comprehensive unit tests covering client behavior, utilities, streaming, usage accounting, and validation.
-
Chores
- Added packaging and tooling configuration.
Walkthrough
Introduces a new Python package “unstract-autogen-client” with project config, documentation, core client implementation, exceptions, helpers, utilities, and tests. The UnstractAutoGenClient wraps an Unstract LLM adapter to offer ChatCompletionClient-compatible sync/async calls, streaming, usage tracking, token counting, and structured error handling. Adds a simple agent wrapper and convenience processing functions.
Changes
| Cohort / File(s) | Summary |
|---|---|
Documentationunstract/autogen-client/README.md |
New README describing package purpose, features, installation, usage examples, advanced config, integration, and error handling. |
Packaging & Toolingunstract/autogen-client/pyproject.toml |
Added project metadata, build system, dependencies/optionals, dynamic versioning, and tooling configs (Black, Ruff, MyPy, pytest). |
Public API Surface.../src/unstract/autogen_client/__init__.py |
New module exposing version, client class, exceptions, and helper APIs via re-exports and all. |
Core Client.../src/unstract/autogen_client/client.py |
New UnstractAutoGenClient implementing ChatCompletionClient-compatible interface with create/create_stream, retries, timeouts, usage tracking, token counts, and model info. |
Exceptions.../src/unstract/autogen_client/exceptions.py |
Added base error and specific exception types for configuration, completion, connection, timeout, and validation. |
Helpers (Agent & Convenience).../src/unstract/autogen_client/helper.py |
Added SimpleAutoGenAgent, factory, and sync/async convenience functions to process prompts and manage lightweight conversations. |
Utilities.../src/unstract/autogen_client/utils.py |
Added message normalization, finish-reason normalization, token estimation, content/usage extraction, and adapter validation helpers. |
Tests — Clientunstract/autogen-client/tests/test_client.py |
New tests covering initialization, capabilities, create/create_stream, errors, token/usage accounting, and mixed message types. |
Tests — Utilsunstract/autogen-client/tests/test_utils.py |
New tests for normalization, extraction, token estimation, and adapter validation edge cases. |
Sequence Diagram(s)
sequenceDiagram
autonumber
actor App
participant Client as UnstractAutoGenClient
participant Adapter as Unstract LLM Adapter
App->>Client: create(messages, options)
activate Client
Client->>Client: normalize_messages / build params
Client->>Adapter: complete(params)
Adapter-->>Client: response
Client->>Client: extract_content / usage / finish_reason
Client-->>App: CreateResult (content, usage, finish_reason)
deactivate Client
sequenceDiagram
autonumber
actor App
participant Agent as SimpleAutoGenAgent
participant Client as UnstractAutoGenClient
participant Adapter as Unstract LLM Adapter
App->>Agent: process_message(message, context?)
Agent->>Agent: compose history + system + user
Agent->>Client: create(messages)
Client->>Adapter: complete(params)
Adapter-->>Client: response
Client-->>Agent: content + usage + finish_reason
Agent->>Agent: update/truncate history
Agent-->>App: result
sequenceDiagram
autonumber
actor App
participant Client as UnstractAutoGenClient
participant Adapter as Unstract LLM Adapter
App->>Client: create_stream(messages)
activate Client
Client->>Adapter: complete_stream(params)
loop stream chunks
Adapter-->>Client: token/partial content
Client-->>App: chunk
end
Client-->>App: final aggregated CreateResult
deactivate Client
Estimated code review effort
🎯 4 (Complex) | ⏱️ ~60 minutes
Pre-merge checks and finishing touches
✅ Passed checks (3 passed)
| Check name | Status | Explanation |
|---|---|---|
| Title Check | ✅ Passed | The title clearly references the ticket and denotes the feature being added (Unstract AutoGen Client), concisely summarizing the primary purpose of the pull request without extraneous detail. It accurately reflects the main change and is immediately understandable to team members reviewing the history. |
| Description Check | ✅ Passed | The description follows the repository’s template by clearly filling out the What, Why, How, breakage potential, database migrations, environment configuration, relevant docs, related issues, dependencies, testing notes, screenshots, and checklist sections and provides detailed package structure and key features for additional context. All required sections are present and populated, ensuring reviewers have the necessary information to understand and validate the changes. |
| Docstring Coverage | ✅ Passed | Docstring coverage is 89.19% which is sufficient. The required threshold is 80.00%. |
✨ Finishing touches
- [ ] 📝 Generate Docstrings
🧪 Generate unit tests
- [ ] Create PR with unit tests
- [ ] Post copyable unit tests in a comment
- [ ] Commit unit tests in branch
UN-2563-autogen-unstract-autogen-client
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.
🧪 Early access (Sonnet 4.5): enabled
We are currently testing the Sonnet 4.5 model, which is expected to improve code review quality. However, this model may lead to increased noise levels in the review comments. Please disable the early access features if the noise level causes any inconvenience.
Note:
- Public repositories are always opted into early access features.
- You can enable or disable early access features from the CodeRabbit UI or by updating the CodeRabbit configuration file.
Comment @coderabbitai help to get the list of available commands and usage tips.
Quality Gate passed
Issues
0 New issues
0 Accepted issues
Measures
0 Security Hotspots
0.0% Coverage on New Code
0.0% Duplication on New Code
Quality Gate failed
Failed conditions
C Reliability Rating on New Code (required ≥ A)
See analysis details on SonarQube Cloud
Catch issues before they fail your Quality Gate with our IDE extension
SonarQube for IDE
| 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}}$$ |
| 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}}$$ |
Quality Gate failed
Failed conditions
3.6% Duplication on New Code (required ≤ 3%)
C Reliability Rating on New Code (required ≥ A)
See analysis details on SonarQube Cloud
Catch issues before they fail your Quality Gate with our IDE extension
SonarQube for IDE