Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[project]
name = "uipath-langchain"
version = "0.11.18"
version = "0.11.19"
description = "Python SDK that enables developers to build and deploy LangGraph agents to the UiPath Cloud Platform"
readme = { file = "README.md", content-type = "text/markdown" }
requires-python = ">=3.11"
Expand Down
12 changes: 11 additions & 1 deletion src/uipath_langchain/chat/_legacy/bedrock.py
Original file line number Diff line number Diff line change
Expand Up @@ -72,12 +72,14 @@ def __init__(
agenthub_config: Optional[str] = None,
byo_connection_id: Optional[str] = None,
header_capture: HeaderCapture | None = None,
trace_context_extra_baggage: Optional[list[str]] = None,
):
self.model = model
self.token = token
self.api_flavor = api_flavor
self.agenthub_config = agenthub_config
self.byo_connection_id = byo_connection_id
self._trace_context_extra_baggage = trace_context_extra_baggage
self._vendor = "awsbedrock"
self._url: Optional[str] = None
self._is_override: bool = False
Expand Down Expand Up @@ -182,7 +184,11 @@ def _modify_request(self, request, **kwargs):
)
headers["X-UiPath-LlmGateway-ApiFlavor"] = self.api_flavor
headers["X-UiPath-Streaming-Enabled"] = streaming
headers.update(build_trace_context_headers(extra_baggage=["source=agents"]))
headers.update(
build_trace_context_headers(
extra_baggage=self._trace_context_extra_baggage
)
)

request.headers.update(headers)

Expand All @@ -204,6 +210,7 @@ def __init__(
byo_connection_id: Optional[str] = None,
retryer: Optional[Retrying] = None,
aretryer: Optional[AsyncRetrying] = None,
trace_context_extra_baggage: Optional[list[str]] = None,
**kwargs,
):
org_id = org_id or os.getenv("UIPATH_ORGANIZATION_ID")
Expand All @@ -229,6 +236,7 @@ def __init__(
api_flavor="converse",
agenthub_config=agenthub_config,
byo_connection_id=byo_connection_id,
trace_context_extra_baggage=trace_context_extra_baggage,
)

kwargs["client"] = passthrough_client.get_client()
Expand Down Expand Up @@ -266,6 +274,7 @@ def __init__(
byo_connection_id: Optional[str] = None,
retryer: Optional[Retrying] = None,
aretryer: Optional[AsyncRetrying] = None,
trace_context_extra_baggage: Optional[list[str]] = None,
**kwargs,
):
org_id = org_id or os.getenv("UIPATH_ORGANIZATION_ID")
Expand Down Expand Up @@ -294,6 +303,7 @@ def __init__(
agenthub_config=agenthub_config,
byo_connection_id=byo_connection_id,
header_capture=header_capture,
trace_context_extra_baggage=trace_context_extra_baggage,
)

kwargs["client"] = passthrough_client.get_client()
Expand Down
18 changes: 15 additions & 3 deletions src/uipath_langchain/chat/_legacy/chat_model_factory.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ def _create_openai_llm(
max_tokens: int | None,
agenthub_config: str,
byo_connection_id: str | None = None,
trace_context_extra_baggage: list[str] | None = None,
**kwargs: Any,
) -> BaseChatModel:
"""Create UiPathChatOpenAI for OpenAI models via LLMGateway."""
Expand All @@ -63,6 +64,7 @@ def _create_openai_llm(
api_version=azure_open_ai_latest_api_version,
agenthub_config=agenthub_config,
byo_connection_id=byo_connection_id,
trace_context_extra_baggage=trace_context_extra_baggage,
output_version="v1",
**sampling_kwargs,
**kwargs,
Expand All @@ -75,6 +77,7 @@ def _create_openai_llm(
api_version=azure_open_ai_latest_api_version,
agenthub_config=agenthub_config,
byo_connection_id=byo_connection_id,
trace_context_extra_baggage=trace_context_extra_baggage,
output_version="v1",
**sampling_kwargs,
**kwargs,
Expand All @@ -90,6 +93,7 @@ def _create_bedrock_llm(
max_tokens: int | None,
agenthub_config: str,
byo_connection_id: str | None = None,
trace_context_extra_baggage: list[str] | None = None,
**kwargs: Any,
) -> BaseChatModel:
"""Create UiPathChatBedrockConverse for Claude models via LLMGateway."""
Expand All @@ -109,6 +113,7 @@ def _create_bedrock_llm(
max_tokens=max_tokens,
agenthub_config=agenthub_config,
byo_connection_id=byo_connection_id,
trace_context_extra_baggage=trace_context_extra_baggage,
output_version="v1",
**sampling_kwargs,
**kwargs,
Expand All @@ -119,6 +124,7 @@ def _create_bedrock_llm(
max_tokens=max_tokens,
agenthub_config=agenthub_config,
byo_connection_id=byo_connection_id,
trace_context_extra_baggage=trace_context_extra_baggage,
output_version="v1",
**sampling_kwargs,
**kwargs,
Expand All @@ -134,6 +140,7 @@ def _create_vertex_llm(
max_tokens: int | None,
agenthub_config: str,
byo_connection_id: str | None = None,
trace_context_extra_baggage: list[str] | None = None,
**kwargs: Any,
) -> BaseChatModel:
"""Create UiPathChatVertex for Gemini models via LLMGateway."""
Expand All @@ -150,6 +157,7 @@ def _create_vertex_llm(
max_tokens=max_tokens,
agenthub_config=agenthub_config,
byo_connection_id=byo_connection_id,
trace_context_extra_baggage=trace_context_extra_baggage,
output_version="v1",
**sampling_kwargs,
**kwargs,
Expand Down Expand Up @@ -248,6 +256,7 @@ def get_chat_model(
max_tokens: int | None,
agenthub_config: str,
byo_connection_id: str | None = None,
trace_context_extra_baggage: list[str] | None = None,
**kwargs: Any,
) -> BaseChatModel:
"""Create and configure LLM instance using LLMGateway API.
Expand All @@ -272,7 +281,8 @@ def get_chat_model(
effective_temperature,
max_tokens,
agenthub_config,
byo_connection_id,
byo_connection_id=byo_connection_id,
trace_context_extra_baggage=trace_context_extra_baggage,
**kwargs,
)
case LLMProvider.BEDROCK:
Expand All @@ -282,7 +292,8 @@ def get_chat_model(
effective_temperature,
max_tokens,
agenthub_config,
byo_connection_id,
byo_connection_id=byo_connection_id,
trace_context_extra_baggage=trace_context_extra_baggage,
**kwargs,
)
case LLMProvider.VERTEX:
Expand All @@ -292,6 +303,7 @@ def get_chat_model(
effective_temperature,
max_tokens,
agenthub_config,
byo_connection_id,
byo_connection_id=byo_connection_id,
trace_context_extra_baggage=trace_context_extra_baggage,
**kwargs,
)
38 changes: 30 additions & 8 deletions src/uipath_langchain/chat/_legacy/openai.py
Original file line number Diff line number Diff line change
Expand Up @@ -54,38 +54,53 @@ def _inject_license_ref_id(request: httpx.Request) -> None:
request.headers["X-UiPath-License-RefId"] = license_ref_id


def _inject_trace_context_headers(request: httpx.Request) -> None:
def _inject_trace_context_headers(
request: httpx.Request,
trace_context_extra_baggage: list[str] | None = None,
) -> None:
"""Inject trace context headers per-request from the active OTEL span."""
for key, value in build_trace_context_headers(
extra_baggage=["source=agents"]
extra_baggage=trace_context_extra_baggage
).items():
request.headers[key] = value


class UiPathURLRewriteTransport(httpx.AsyncHTTPTransport):
def __init__(self, verify: bool = True, **kwargs):
def __init__(
self,
verify: bool = True,
trace_context_extra_baggage: list[str] | None = None,
**kwargs,
):
super().__init__(verify=verify, **kwargs)
self._trace_context_extra_baggage = trace_context_extra_baggage

async def handle_async_request(self, request: httpx.Request) -> httpx.Response:
new_url = _rewrite_openai_url(str(request.url), request.url.params)
if new_url:
request.url = new_url
_inject_license_ref_id(request)
_inject_trace_context_headers(request)
_inject_trace_context_headers(request, self._trace_context_extra_baggage)

return await super().handle_async_request(request)


class UiPathSyncURLRewriteTransport(httpx.HTTPTransport):
def __init__(self, verify: bool = True, **kwargs):
def __init__(
self,
verify: bool = True,
trace_context_extra_baggage: list[str] | None = None,
**kwargs,
):
super().__init__(verify=verify, **kwargs)
self._trace_context_extra_baggage = trace_context_extra_baggage

def handle_request(self, request: httpx.Request) -> httpx.Response:
new_url = _rewrite_openai_url(str(request.url), request.url.params)
if new_url:
request.url = new_url
_inject_license_ref_id(request)
_inject_trace_context_headers(request)
_inject_trace_context_headers(request, self._trace_context_extra_baggage)

return super().handle_request(request)

Expand All @@ -112,6 +127,7 @@ def __init__(
agenthub_config: Optional[str] = None,
extra_headers: Optional[dict[str, str]] = None,
byo_connection_id: Optional[str] = None,
trace_context_extra_baggage: Optional[list[str]] = None,
**kwargs,
):
org_id = org_id or os.getenv("UIPATH_ORGANIZATION_ID")
Expand Down Expand Up @@ -155,11 +171,17 @@ def __init__(
model_name=model_name,
default_headers=self._build_headers(token, inject_routing=is_override),
http_async_client=httpx.AsyncClient(
transport=UiPathURLRewriteTransport(verify=verify),
transport=UiPathURLRewriteTransport(
verify=verify,
trace_context_extra_baggage=trace_context_extra_baggage,
),
**client_kwargs,
),
http_client=httpx.Client(
transport=UiPathSyncURLRewriteTransport(verify=verify),
transport=UiPathSyncURLRewriteTransport(
verify=verify,
trace_context_extra_baggage=trace_context_extra_baggage,
),
**client_kwargs,
),
api_key=token,
Expand Down
19 changes: 15 additions & 4 deletions src/uipath_langchain/chat/_legacy/vertex.py
Original file line number Diff line number Diff line change
Expand Up @@ -79,10 +79,12 @@ def __init__(
gateway_url: str,
verify: bool = True,
header_capture: HeaderCapture | None = None,
trace_context_extra_baggage: list[str] | None = None,
):
super().__init__(verify=verify)
self.gateway_url = gateway_url
self.header_capture = header_capture
self._trace_context_extra_baggage = trace_context_extra_baggage

def handle_request(self, request: httpx.Request) -> httpx.Response:
original_url = str(request.url)
Expand All @@ -98,7 +100,7 @@ def handle_request(self, request: httpx.Request) -> httpx.Response:
request.url = new_url

for key, value in build_trace_context_headers(
extra_baggage=["source=agents"]
extra_baggage=self._trace_context_extra_baggage
).items():
request.headers[key] = value

Expand All @@ -117,10 +119,12 @@ def __init__(
gateway_url: str,
verify: bool = True,
header_capture: HeaderCapture | None = None,
trace_context_extra_baggage: list[str] | None = None,
):
super().__init__(verify=verify)
self.gateway_url = gateway_url
self.header_capture = header_capture
self._trace_context_extra_baggage = trace_context_extra_baggage

async def handle_async_request(self, request: httpx.Request) -> httpx.Response:
original_url = str(request.url)
Expand All @@ -136,7 +140,7 @@ async def handle_async_request(self, request: httpx.Request) -> httpx.Response:
request.url = new_url

for key, value in build_trace_context_headers(
extra_baggage=["source=agents"]
extra_baggage=self._trace_context_extra_baggage
).items():
request.headers[key] = value

Expand Down Expand Up @@ -176,6 +180,7 @@ def __init__(
byo_connection_id: Optional[str] = None,
retryer: Optional[Retrying] = None,
aretryer: Optional[AsyncRetrying] = None,
trace_context_extra_baggage: Optional[list[str]] = None,
**kwargs: Any,
):
org_id = org_id or os.getenv("UIPATH_ORGANIZATION_ID")
Expand Down Expand Up @@ -212,14 +217,20 @@ def __init__(
http_options = genai_types.HttpOptions(
httpx_client=httpx.Client(
transport=_UrlRewriteTransport(
uipath_url, verify=verify, header_capture=header_capture
uipath_url,
verify=verify,
header_capture=header_capture,
trace_context_extra_baggage=trace_context_extra_baggage,
),
headers=merged_headers,
**client_kwargs,
),
httpx_async_client=httpx.AsyncClient(
transport=_AsyncUrlRewriteTransport(
uipath_url, verify=verify, header_capture=header_capture
uipath_url,
verify=verify,
header_capture=header_capture,
trace_context_extra_baggage=trace_context_extra_baggage,
),
headers=merged_headers,
**client_kwargs,
Expand Down
Loading