NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI
UiPath LLM Client
Last release 3 days ago
01 Oct 2026
Ships fairly regularly
a new release about every 2 weeks
Nearly every release is documented
notes for 59 of the last 60 stable releases
Nothing withdrawn
no release was ever pulled
8 months old
67 releases · first in 2026
One column per month.
Bumped the uipath-llm-client floor to >=1.20.1 , whose default transport verifies TLS with the configured SSL context (OS trust store, explicit verify
uipath-llm-client floor to >=1.20.1, whose default transport verifies TLS with the configured SSL context (OS trust store, explicit verify, UIPATH_DISABLE_SSL_VERIFY) instead of httpx's certifi default, so hosts signed by a private CA no longer fail with CERTIFICATE_VERIFY_FAILED.UiPathHttpxClient / UiPathHttpxAsyncClient now pass verify, cert, trust_env, http1, http2 and limits to the retryable transport they build by default. httpx ignores these client arguments when a transport is supplied, so the default transport verified TLS with httpx's own default (SSL_CERT_FILE / SSL_CERT_DIR if set, otherwise certifi) instead of the OS trust store, and ignored both an explicit verify and UIPATH_DISABLE_SSL_VERIFY. Hosts whose certificate chains to a private CA failed every LLM call with CERTIFICATE_VERIFY_FAILED, even with the CA in the OS store. A caller-supplied transport is still used as given.Bumped the uipath-llm-client floor to >=1.20.0 , which adds UIPATH_SERVICE_URL_LLMGATEWAY for pointing LLMGatewaySettings at a standalone (e.g. local)
uipath-llm-client floor to >=1.20.0, which adds UIPATH_SERVICE_URL_LLMGATEWAY for pointing LLMGatewaySettings at a standalone (e.g. local) gateway.LLMGatewaySettings honours UIPATH_SERVICE_URL_LLMGATEWAY, the per-service local override the Platform backend already uses. Request and discovery URLs go to that host as /api/..., without the {org}/{tenant}/llmgateway_ prefix the cloud front door adds; the S2S token is still minted at LLMGW_URL. Unset, URLs are unchanged.UiPathBaseChatModel now surfaces the LLM Gateway's per-request dollar cost as response_metadata["associated_dollar_cost"] when the caller opted in by
UiPathBaseChatModel now surfaces the LLM Gateway's per-request dollar cost as response_metadata["associated_dollar_cost"] when the caller opted in by sending X-UiPath-LlmGateway-IncludeAssociatedDollarCost: true (e.g. via default_headers) on a passthrough model. invoke() / ainvoke() set it on the result message. stream() / astream() (and invoke() routed through streaming) yield one extra empty chunk carrying it after the vendor's last chunk, since the gateway only reports the cost after the terminal event; merging the chunks folds it into response_metadata. Covers all passthrough chat models, including the Bedrock ones: the gateway's trailing costMetadata event is decoded by the core client and hidden from langchain-aws. Opted-in Gemini streams additionally log langchain-google-genai's "Gemini produced an empty response" warning for the gateway's trailing frame; the cost is still surfaced. The key is absent when the gateway did not price the call — absence means "not priced", never $0.uipath-llm-client>=1.19.0.UiPathHttpxClient / UiPathHttpxAsyncClient now capture the per-request dollar cost the LLM Gateway reports for opted-in calls instead of dropping it. When a request carries X-UiPath-LlmGateway-IncludeAssociatedDollarCost: true (Passthrough API only), the value is exposed via uipath.llm_client.utils.dollar_cost.get_captured_dollar_cost() for the duration of the calling context. Non-streaming JSON responses are read from the top-level associated_dollar_cost field. Streaming responses are wrapped so the trailing frame the gateway appends after the vendor's terminal event — an SSE data: {"associated_dollar_cost": ...} event, or a costMetadata message on AWS event streams (Bedrock) — is picked up once the consumer finishes reading (including when the vendor SDK stops at data: [DONE] and closes the response without reading further). None means "not priced" and must never be read as $0; when a cost was requested but could not be read (compressed stream, lost event-stream framing, non-numeric value) a warning is logged so the gap is visible. Known residual: the gateway's SSE frame also reaches google-genai as a candidate-less chunk, so opted-in Gemini streams log langchain-google-genai's "Gemini produced an empty response" warning; the cost is still captured.Bumped the uipath-llm-client floor to >=1.18.5 , which stops UiPathAPIError.__str__ from copying the response body into printed stacktraces. (PC-5002)
uipath-llm-client floor to >=1.18.5, which stops UiPathAPIError.__str__ from copying the response body into printed stacktraces. (PC-5002)UiPathAPIError.__str__ no longer includes the response body. The traceback module renders the final exception line with str(), so a relayed provider error body was copied verbatim into every printed stacktrace — including the one shipped as AgentRun.Failed.ErrorTraceback — regardless of what the consuming runtime chose to put in its own customer-facing error. The body is content of unknown sensitivity and may carry PII, so it now stays on the body attribute (unchanged, for callers that classify on it) and out of the serialized form. __repr__ is unchanged. (PC-5002)Picks up core uipath-llm-client 1.18.0: directly-constructed chat/embedding clients now default client_settings.agenthub_config to codedagentsplaygrou
uipath-llm-client 1.18.0: directly-constructed chat/embedding clients now default client_settings.agenthub_config to codedagentsplayground for design-time runs (local / Studio Web / debug) so coded-agent LLM calls draw the CodedAgents.Playground pool; deployed runs stay None (→ AgentHub.LLM). Explicit agenthub_config (e.g. from low-code via get_chat_model) and UIPATH_AGENTHUB_CONFIG still take precedence. Bumped the uipath-llm-client floor to >=1.18.0.PlatformBaseSettings.agenthub_config now defaults to codedagentsplayground for design-time runs (local, Studio Web, or a debug session) instead of None, so coded-agent LLM calls draw the CodedAgents.Playground licensing pool. A deployed run — a real Orchestrator job that is neither a Studio Web project nor rooted to a debug session — still resolves to None (→ AgentHub.LLM). Callers that pass an explicit agenthub_config (low-code agents, evaluators via get_chat_model(agenthub_config=...)) override this default via model_copy and are unaffected; an explicit empty string is left as an opt-out. Setting UIPATH_AGENTHUB_CONFIG still wins over the computed default.resolve_coded_agenthub_config helper from uipath.platform (bumped floor to uipath-platform>=0.2.19) so all coded frameworks (langchain / llamaindex / openai-agents) classify runs identically.UiPathChat.with_structured_output(method="auto") selects JSON mode for Anthropic models and function calling for other providers, avoiding provider-sp
UiPathChat.with_structured_output(method="auto") selects JSON mode for Anthropic models and function calling for other providers, avoiding provider-specific response-format behavior in callers.include_raw=True now accepts standard LangChain message-list inputs and returns raw, parsed, and parsing_error as documented.byo_connection_id, in both the get_model_info discovery lookup and the X-UiPath-LlmGateway-ByoIsConnectionId routing header.Picks up core uipath-llm-client 1.17.1, which adds ModelNotFoundError (raised by get_model_info on a discovery-miss) and the UiPathLLMErrorCode.MODEL_
uipath-llm-client 1.17.1, which adds ModelNotFoundError (raised by get_model_info on a discovery-miss) and the UiPathLLMErrorCode.MODEL_NOT_FOUND code. Bumped the uipath-llm-client floor to >=1.17.1.ModelNotFoundError — raised by UiPathBaseSettings.get_model_info when a model name is absent from the discovery API response. It subclasses both ValueError (so existing except ValueError handlers are unaffected) and UiPathError (so it is catchable across the UiPath LLM error taxonomy), and carries the new UiPathLLMErrorCode.MODEL_NOT_FOUND code. This lets callers distinguish a genuine discovery-miss from the other ValueErrors the factory/settings code can raise (unsupported vendor, missing agenthub_config, invalid kwargs) instead of matching on message text.UiPathLLMErrorCode.MODEL_NOT_FOUND semantic error code.Default max_retries on UiPathBaseLLMClient raised from 3 to 5 for parity with the legacy uipath-langchain-python chat-client retryers. Requires uipath
max_retries on UiPathBaseLLMClient raised from 3 to 5 for parity with the legacy uipath-langchain-python chat-client retryers. Requires uipath-llm-client>=1.17.0, which also restores the legacy backoff window (5s initial / 120s cap), honors Retry-After on any status, and retries 524 and connection-level failures.BedrockRetryer) that the shared transports replaced. Under throttling that outlasted the previous budget, runs that the legacy client absorbed silently were now failing.
UiPathAPIError, and its presence forces a retry even for otherwise non-retryable statuses (an explicit server retry request). retry_after moved from UiPathRateLimitError up to UiPathAPIError.UiPathOriginTimeoutError; 529 remains retryable.httpx.TimeoutException (connect/read/write/pool timeouts), httpx.ConnectError, and httpx.RemoteProtocolError — the union of what the legacy Bedrock (botocore timeout/connection errors) and Vertex (httpx timeouts, connect errors, remote-protocol errors) retryers handled.UiPathOriginTimeoutError (HTTP 524), exported from uipath.llm_client.Request headers that differ only by casing are now merged before authentication in the shared synchronous and asynchronous HTTPX clients. This prevent
User-Agent and user-agent, while preserving intentionally repeated values that use the winning spelling.UiPathLLMErrorCode — a public string enum of stable semantic error codes independent of provider exception types or provider-specific message text. It
UiPathLLMErrorCode — a public string enum of stable semantic error codes independent of provider exception types or provider-specific message text. It currently includes UNSUPPORTED_MIME_TYPE.UiPathError now carries optional semantic context: error_code (a stable machine-readable identifier, preferably from UiPathLLMErrorCode) and detail (best-effort diagnostic detail from the mapped lower-level error).as_uipath_error now resolves errors with HTTP status as authoritative: the cause chain is scanned for an httpx.Response first, so a real status always outranks a client-side classifier match elsewhere in the chain (which may be incidental __context__ rather than the failure). Only when no response exists anywhere is the error offered to the _CLIENT_SIDE_CLASSIFIERS registry (extension point for future non-HTTP semantic codes, e.g. the unsupported-MIME case). Previously client-side classifiers ran first and could mask an authenticated/rate-limited/server error carrying an unrelated marker.Per-service URL overrides for local development. build_base_url now consults resolve_service_url(endpoint_path) (from uipath.platform.common) before c
build_base_url now consults resolve_service_url(endpoint_path) (from uipath.platform.common) before constructing the final URL. When a UIPATH_SERVICE_URL_<SERVICE> env var is set (e.g. UIPATH_SERVICE_URL_AGENTHUB=http://localhost:8080), requests are redirected to that local server with the org/tenant and service prefix stripped. Without an override, behaviour is unchanged — the URL is still {base_url}/{endpoint_path}.Bumped uipath-platform to >=0.1.91 — 0.1.89/0.1.90 crashed with a circular-import ImportError when importing IdentityService (fixed upstream in UiPath
uipath-platform to >=0.1.91 — 0.1.89/0.1.90 crashed with a circular-import ImportError when importing IdentityService (fixed upstream in UiPath/uipath-python#1787).UiPathError — a common root exception for everything the client can raise, re-exported from uipath.llm_client. UiPathAPIError (and therefore every sta
UiPathError — a common root exception for everything the client can raise, re-exported from uipath.llm_client. UiPathAPIError (and therefore every status-specific subclass) now inherits from it, so except UiPathError is a single catch-all across all backends and providers. Fully backward compatible: UiPathAPIError still inherits httpx.HTTPStatusError and all existing handlers keep working.as_uipath_error(exc) and the wrap_provider_errors() context manager (in uipath.llm_client.utils.exceptions). They convert a provider/SDK exception into the matching UiPath exception so callers handle one taxonomy regardless of which provider produced the error. The cause chain (__cause__/__context__) is walked for an httpx.Response; when found, its status code is mapped onto the corresponding UiPathAPIError subclass (a 429 → UiPathRateLimitError, a 400 → UiPathBadRequestError, …) so semantic handling is identical across providers — including providers (e.g. Google) that wrap the response-bearing error one level down. When no response is available anywhere in the chain (client-side validation errors, connection failures) the UiPathError root is returned. The original provider exception is preserved as __cause__.UiPathRateLimitError.retry_after is now parsed lazily from self.response (via a property) instead of being cached in __init__. _parse_retry_after and the parsing behaviour are unchanged.patch_raise_for_status now routes the httpx HTTPStatusError through wrap_provider_errors, so direct raise_for_status() callers and provider SDK exceptions share a single conversion path. The raised UiPathAPIError now carries the original HTTPStatusError as __cause__ (previously None); status mapping is unchanged.openai.RateLimitError raised through a passthrough chat model becomes a UiPathRateLimitError and is not catchable as openai.RateLimitError (the vendor exception is kept as __cause__). Standardise handlers on UiPathError and its subclasses.ApiFlavor.ANTHROPIC_MESSAGES ("AnthropicMessages") for Bedrock-hosted Claude models that the discovery endpoint exposes with the native Anthropic Mess
ApiFlavor.ANTHROPIC_MESSAGES ("AnthropicMessages") for Bedrock-hosted Claude models that the discovery endpoint exposes with the native Anthropic Messages wire format. The value is the discovery string verbatim because it is forwarded as the X-UiPath-LlmGateway-ApiFlavor header. Also mapped in API_FLAVOR_TO_VENDOR_TYPE to VendorType.AWSBEDROCK so it resolves to the Bedrock passthrough route when discovery omits the vendor field.PlatformSettings now accepts non-JWT access tokens (e.g. opaque UiPath reference tokens) for UIPATH_ACCESS_TOKEN. Previously any token that was not a
PlatformSettings now accepts non-JWT access tokens (e.g. opaque UiPath reference tokens) for UIPATH_ACCESS_TOKEN. Previously any token that was not a parseable JWT failed validation with "Invalid access token: expected JWT with at least 2 dot-separated parts". Token introspection is now best-effort: is_token_expired returns False when the token is not a parseable JWT, and the settings validator only extracts client_id when the token is a parseable JWT. Added try_parse_access_token helper in uipath.llm_client.settings.platform.utils.UiPathRequestTimeoutError (HTTP 408) and UiPathBadGatewayError (HTTP 502) exception classes. Both are registered in _STATUS_CODE_TO_EXCEPTION, re-expo
UiPathRequestTimeoutError (HTTP 408) and UiPathBadGatewayError (HTTP 502) exception classes. Both are registered in _STATUS_CODE_TO_EXCEPTION, re-exported from uipath.llm_client, and inherit from UiPathAPIError for compatibility with existing handlers._DEFAULT_RETRY_ON_EXCEPTIONS in uipath.llm_client.utils.retry now covers UiPathRequestTimeoutError (408), UiPathRateLimitError (429), UiPathBadGatewayError (502), UiPathServiceUnavailableError (503), UiPathGatewayTimeoutError (504), and UiPathTooManyRequestsError (529) — up from {429, 529}. Applies to every provider client (UiPathOpenAI, UiPathAnthropic*, UiPathGoogle) since they all share the same UiPathHttpxClient-backed retry transport. Retry-After / x-retry-after headers and exponential backoff with jitter behave as before.UiPathHttpxClient / UiPathHttpxAsyncClient default max_retries raised from 0 to 3. Callers that pass max_retries=None (or omit it entirely) now get 3 retries by default. Pass max_retries=0 explicitly to opt out — max_retries=0 continues to disable retries, so the opt-out path is unchanged.Bumped the default Azure OpenAI API version from 2025-03-01-preview to 2025-04-01-preview in the OpenAI passthrough handler's base_api_config.
2025-03-01-preview to 2025-04-01-preview in the OpenAI passthrough handler's base_api_config.uipath.llm_client.utils.sampling.strip_disabled_fields: eagerly nulls instance attributes whose names appear in disabled_params and whose current valu
uipath.llm_client.utils.sampling.strip_disabled_fields: eagerly nulls instance attributes whose names appear in disabled_params and whose current values match is_disabled_value. Sibling of strip_disabled_kwargs for the case where vendor SDKs (langchain-anthropic, langchain-aws) read self.<field> rather than per-call **kwargs when building request bodies. Each strip logs a warning that includes the original value so callers can see exactly what was dropped.Increased the default X-UiPath-LLMGateway-TimeoutSeconds request header value in UIPATH_DEFAULT_REQUEST_HEADERS from 295 to 895 seconds.
X-UiPath-LLMGateway-TimeoutSeconds request header value in UIPATH_DEFAULT_REQUEST_HEADERS from 295 to 895 seconds.Behavior change: PlatformSettings.agenthub_config field default flipped from "agentsruntime" to None. When unset, the X-UiPath-AgentHub-Config header
PlatformSettings.agenthub_config field default flipped from "agentsruntime" to None. When unset, the X-UiPath-AgentHub-Config header is omitted from outgoing requests. The UIPATH_AGENTHUB_CONFIG environment variable still wins when set.uipath.llm_client.utils.sampling module exposing DISABLED_SAMPLING_PARAMS, disabled_params_from_model_details, is_disabled_value, and strip_disabled_k
uipath.llm_client.utils.sampling module exposing DISABLED_SAMPLING_PARAMS, disabled_params_from_model_details, is_disabled_value, and strip_disabled_kwargs. The helpers use the langchain-openai-style disabled_params format ({name: None | [values]}) so they compose with the existing langchain_openai._filter_disabled_params path. disabled_params_from_model_details derives the disabled-param map from a discovery-endpoint modelDetails dict (today: shouldSkipTemperature=True disables the full sampling set — temperature, top_p, top_k, frequency/presence penalty, seed, logit_bias, logprobs, top_logprobs).Bumped dependency floors to the latest installed versions: uipath-platform>=0.1.35.
uipath-platform>=0.1.35.Added upper-bound version constraints (<next_major) to all production and dev dependencies to prevent unexpected breaking changes from major-version u…
<next_major) to all production and dev dependencies to prevent unexpected breaking changes from major-version upgrades.litellm is now pinned to an exact version (==1.83.7) due to its frequent breaking changes between minor releases.Bumped uipath-platform>=0.1.34 to match the latest installed version.
uipath-platform>=0.1.34 to match the latest installed version.utils.headers.UIPATH_DEFAULT_REQUEST_HEADERS public constant — the single source of truth for built-in gateway request headers (X-UiPath-LLMGateway-Ti
utils.headers.UIPATH_DEFAULT_REQUEST_HEADERS public constant — the single source of truth for built-in gateway request headers (X-UiPath-LLMGateway-TimeoutSeconds=295, X-UiPath-LLMGateway-AllowFull4xxResponse=false). UiPathHttpxClient._default_headers now references this constant; the langchain base client reuses the same constant for its class_default_headers.Bumped dependency floors to the latest released versions: pydantic-settings>=2.14.0, uipath-platform>=0.1.32, google-genai>=1.73.1, anthropic>=0.96.0,
pydantic-settings>=2.14.0, uipath-platform>=0.1.32, google-genai>=1.73.1, anthropic>=0.96.0, litellm>=1.83.7.PlatformBaseSettings.build_auth_headers() now uses the header-name constants from uipath.platform.common.constants (lowercase canonical form). HTTP he
PlatformBaseSettings.build_auth_headers() now uses the header-name constants from uipath.platform.common.constants (lowercase canonical form). HTTP header names are case-insensitive so wire-level behavior is unchanged.UIPATH_PROCESS_KEY is now URL-encoded (urllib.parse.quote(..., safe="")) before being placed in X-UiPath-ProcessKey, matching the platform-wide convention.HEADER_LICENSING_CONTEXT header populated dynamically from UiPathConfig.licensing_context when set.utils.model_family.is_anthropic_model_name() helper and ANTHROPIC_MODEL_NAME_KEYWORDS tuple — name-based Claude detection for BYOM deployments where d
utils.model_family.is_anthropic_model_name() helper and ANTHROPIC_MODEL_NAME_KEYWORDS tuple — name-based Claude detection for BYOM deployments where discovery does not expose modelFamilyUiPathLiteLLM now detects Claude-family models by name when modelFamily is unavailable (BYOM), correctly routing Bedrock/Vertex provider selection and default flavorsModelFamily StrEnum constants (OPENAI, GOOGLE_GEMINI, ANTHROPIC_CLAUDE) for model family matching
ModelFamily StrEnum constants (OPENAI, GOOGLE_GEMINI, ANTHROPIC_CLAUDE) for model family matchingget_model_info() on UiPathBaseSettings — centralized model lookup with filtering by name, vendor, and BYO connection IDget_available_models() keyed by settings properties, with refresh parameter to bypassget_available_models() is now a concrete cached method on the base class; subclasses implement _fetch_available_models() insteadvalidate_byo_model() is now a default no-op on the base class (only LLMGateway overrides it) and is called automatically inside get_model_info()get_model_info() instead of duplicating model discovery logicBYOM API flavor constants for discovery endpoint: OpenAiChatCompletions, OpenAiResponses, OpenAiEmbeddings, GeminiGenerateContent, GeminiEmbeddings, A
OpenAiChatCompletions, OpenAiResponses, OpenAiEmbeddings, GeminiGenerateContent, GeminiEmbeddings, AwsBedrockInvoke, AwsBedrockConverseBYOM_TO_ROUTING_FLAVOR mapping to resolve BYOM discovery flavors to routing-level API flavorsAPI_FLAVOR_TO_VENDOR_TYPE with BYOM flavor entries for automatic vendor resolutionRemoved top-level import of UiPathLiteLLM from __init__.py to avoid ImportError when the optional litellm dependency is not installed
UiPathLiteLLM from __init__.py to avoid ImportError when the optional litellm dependency is not installedUiPathLiteLLM — provider-agnostic LLM client powered by LiteLLM
UiPathLiteLLM — provider-agnostic LLM client powered by LiteLLM
completion / acompletion for chat completions across all providersembedding / aembedding for embeddingsvendor_type and api_flavor overrides (same pattern as LangChain factory)litellm as an optional dependency (uv add uipath-llm-client[litellm])_strict_response_validation parameter to all Anthropic client classesuipath-platform>=0.1.21, anthropic>=0.91.0, litellm>=1.83.4UiPathNormalizedClient — provider-agnostic LLM client with no optional dependencies
UiPathNormalizedClient — provider-agnostic LLM client with no optional dependencies
client.completions.create/acreate/stream/astream for chat completionsclient.embeddings.create/acreate for embeddingsresponse_format (Pydantic, TypedDict, dict, json_object)ChatCompletion, ChatCompletionChunk, EmbeddingResponseSet api_flavor to None for ANTHROPIC and AZURE vendor types
api_flavor to None for ANTHROPIC and AZURE vendor typesoriginal_message parameterdefault_headers consistency and demo import pathbase_urlRemoved X-UiPath-LLMGateway-AllowFull4xxResponse from default request headers to avoid PII leakage in logs
X-UiPath-LLMGateway-AllowFull4xxResponse from default request headers to avoid PII leakage in logsUse availableOperationCodes field (instead of operationCodes) when validating BYOM operation codes
availableOperationCodes field (instead of operationCodes) when validating BYOM operation codesPass base_url to OpenAI and AsyncOpenAI constructors in UiPathOpenAI and UiPathAsyncOpenAI to ensure the correct endpoint is forwarded to the underlyi
base_url to OpenAI and AsyncOpenAI constructors in UiPathOpenAI and UiPathAsyncOpenAI to ensure the correct endpoint is forwarded to the underlying SDK clientsAdded mapping api_flavor to vendor_type
Added _DYNAMIC_REQUEST_HEADERS ContextVar and helper functions (get_dynamic_request_headers, set_dynamic_request_headers) to utils/headers.py
_DYNAMIC_REQUEST_HEADERS ContextVar and helper functions (get_dynamic_request_headers, set_dynamic_request_headers) to utils/headers.pysend() for both sync and async clientsFix headers for Platform Settings
### Fixed - Factory function fix
### Fixed - Factory function fix
Added error message for normalized embeddings on UiPath Platform (AgentHub/Orchestrator) as there is no supported endpoint
added also backend for orchestrator and renamed AgentHubSettings to PlatformSetting (contains both agenthub and orchestrator)
Added UiPathChatAnthropicBedrock
### Version Bump - Stable release - Fixes
Restructured project such that uipath_llm_client can be included in uipath as submodule.
### Feature - Capture LLMGW headers
Fixes to discovery endpoint on LLMGW
Timeout fixes, change typing from int to float
Fixed agenthub auth when token already exists
### Fixed - Small fixes on openai client
Added BYOM validation for settings
Fixed headers on llmgw settings
Added 295 as default llmgateway timeout to avoid problems on the backend side
Added retry handler on 429 to include the retry-after header
Import TypedDict from typing_extension
Nothing published for this version
Fixed a typing issue of Singleton
### Fixed - Added py.typed to the package
Your coding agent can read these notes before it upgrades. Set up the MCP server →