Skip to content

Commit f89c0ae

Browse files
committed
fix: ruff format for google adk
1 parent 5399040 commit f89c0ae

6 files changed

Lines changed: 85 additions & 114 deletions

File tree

README.md

Lines changed: 5 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -6,38 +6,11 @@ All packages are extensions to the [UiPath Python SDK](https://github.com/UiPath
66

77
## Integrations
88

9-
### LlamaIndex
10-
11-
[![PyPI - Version](https://img.shields.io/pypi/v/uipath-llamaindex)](https://pypi.org/project/uipath-llamaindex/)
12-
[![PyPI downloads](https://img.shields.io/pypi/dm/uipath-llamaindex.svg)](https://pypi.org/project/uipath-llamaindex/)
13-
14-
Build agents using the [LlamaIndex SDK](https://www.llamaindex.ai/):
15-
16-
- [README](packages/uipath-llamaindex/README.md)
17-
- [Docs](https://uipath.github.io/uipath-python/llamaindex/quick_start/)
18-
- [Samples](packages/uipath-llamaindex/samples/)
19-
20-
### OpenAI Agents
21-
22-
[![PyPI - Version](https://img.shields.io/pypi/v/uipath-openai-agents)](https://pypi.org/project/uipath-openai-agents/)
23-
[![PyPI downloads](https://img.shields.io/pypi/dm/uipath-openai-agents.svg)](https://pypi.org/project/uipath-openai-agents/)
24-
25-
Build agents using the [OpenAI Agents SDK](https://github.com/openai/openai-agents-python):
26-
27-
- [README](packages/uipath-openai-agents/README.md)
28-
- [Docs](https://uipath.github.io/uipath-python/openai-agents/quick_start/)
29-
- [Samples](packages/uipath-openai-agents/samples/)
30-
31-
### Google ADK
32-
33-
[![PyPI - Version](https://img.shields.io/pypi/v/uipath-google-adk)](https://pypi.org/project/uipath-google-adk/)
34-
[![PyPI downloads](https://img.shields.io/pypi/dm/uipath-google-adk.svg)](https://pypi.org/project/uipath-google-adk/)
35-
36-
Build agents using the [Google Agent Development Kit (ADK)](https://github.com/google/adk-python):
37-
38-
- [README](packages/uipath-google-adk/README.md)
39-
- [Docs](https://uipath.github.io/uipath-python/google-adk/quick_start/)
40-
- [Samples](packages/uipath-google-adk/samples/)
9+
| Integration | Version | Downloads | Links |
10+
|---|---|---|---|
11+
| [LlamaIndex](https://www.llamaindex.ai/) | [![PyPI](https://img.shields.io/pypi/v/uipath-llamaindex)](https://pypi.org/project/uipath-llamaindex/) | [![Downloads](https://img.shields.io/pypi/dm/uipath-llamaindex.svg)](https://pypi.org/project/uipath-llamaindex/) | [README](packages/uipath-llamaindex/README.md) · [Docs](https://uipath.github.io/uipath-python/llamaindex/quick_start/) · [Samples](packages/uipath-llamaindex/samples/) |
12+
| [OpenAI Agents](https://github.com/openai/openai-agents-python) | [![PyPI](https://img.shields.io/pypi/v/uipath-openai-agents)](https://pypi.org/project/uipath-openai-agents/) | [![Downloads](https://img.shields.io/pypi/dm/uipath-openai-agents.svg)](https://pypi.org/project/uipath-openai-agents/) | [README](packages/uipath-openai-agents/README.md) · [Docs](https://uipath.github.io/uipath-python/openai-agents/quick_start/) · [Samples](packages/uipath-openai-agents/samples/) |
13+
| [Google ADK](https://github.com/google/adk-python) | [![PyPI](https://img.shields.io/pypi/v/uipath-google-adk)](https://pypi.org/project/uipath-google-adk/) | [![Downloads](https://img.shields.io/pypi/dm/uipath-google-adk.svg)](https://pypi.org/project/uipath-google-adk/) | [README](packages/uipath-google-adk/README.md) · [Docs](https://uipath.github.io/uipath-python/google-adk/quick_start/) · [Samples](packages/uipath-google-adk/samples/) |
4114

4215

4316
## Structure

packages/uipath-google-adk/samples/quickstart-agent/main.py

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -32,25 +32,26 @@ def get_weather(location: str) -> str:
3232
return f"Geocoding failed for '{location}': {e}"
3333

3434
# Fetch current weather
35-
weather_url = (
36-
"https://api.open-meteo.com/v1/forecast?"
37-
+ urllib.parse.urlencode({
35+
weather_url = "https://api.open-meteo.com/v1/forecast?" + urllib.parse.urlencode(
36+
{
3837
"latitude": lat,
3938
"longitude": lon,
4039
"current": "temperature_2m,wind_speed_10m,weather_code",
4140
"temperature_unit": "celsius",
42-
})
41+
}
4342
)
4443
try:
4544
with urllib.request.urlopen(weather_url, timeout=10) as resp:
4645
data = json.loads(resp.read().decode())
4746
current = data.get("current", {})
48-
return json.dumps({
49-
"location": f"{name}, {country}",
50-
"temperature_celsius": current.get("temperature_2m"),
51-
"wind_speed_kmh": current.get("wind_speed_10m"),
52-
"weather_code": current.get("weather_code"),
53-
})
47+
return json.dumps(
48+
{
49+
"location": f"{name}, {country}",
50+
"temperature_celsius": current.get("temperature_2m"),
51+
"wind_speed_kmh": current.get("wind_speed_10m"),
52+
"weather_code": current.get("weather_code"),
53+
}
54+
)
5455
except Exception as e:
5556
return f"Weather fetch failed: {e}"
5657

packages/uipath-google-adk/src/uipath_google_adk/runtime/runtime.py

Lines changed: 50 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,8 @@ async def stream(
162162
# (skip transfer_to_agent — it's agent delegation, not a tool)
163163
tools_node = f"{author}_tools"
164164
real_calls = [
165-
fc for fc in event.get_function_calls()
165+
fc
166+
for fc in event.get_function_calls()
166167
if fc.name != _TRANSFER_FN
167168
]
168169
if real_calls and active_tools != tools_node:
@@ -182,7 +183,8 @@ async def stream(
182183
# Tools node: COMPLETED on real function responses,
183184
# then re-STARTED for the agent to shift highlight back
184185
real_responses = [
185-
fr for fr in event.get_function_responses()
186+
fr
187+
for fr in event.get_function_responses()
186188
if fr.name != _TRANSFER_FN
187189
]
188190
if real_responses and active_tools:
@@ -271,17 +273,15 @@ def _extract_output(self, final_text: str | None) -> Any:
271273
output_schema = resolve_output_schema(self.agent)
272274
if output_schema and final_text:
273275
try:
274-
return output_schema.model_validate_json(
275-
final_text
276-
).model_dump(exclude_none=True)
276+
return output_schema.model_validate_json(final_text).model_dump(
277+
exclude_none=True
278+
)
277279
except Exception:
278280
pass
279281

280282
return final_text or ""
281283

282-
def _prepare_user_message(
283-
self, input: dict[str, Any] | None
284-
) -> types.Content:
284+
def _prepare_user_message(self, input: dict[str, Any] | None) -> types.Content:
285285
"""Prepare user message from UiPath input dictionary.
286286
287287
If input contains 'messages', uses that as text (conversational).
@@ -340,18 +340,22 @@ def _convert_event(self, event: Event) -> list[UiPathRuntimeStateEvent]:
340340
}
341341
event_type = "agent_transfer" if is_transfer else "function_call"
342342
# Agent node always gets the event
343-
events.append(UiPathRuntimeStateEvent(
344-
payload=payload,
345-
node_name=author,
346-
metadata={"event_type": event_type},
347-
))
343+
events.append(
344+
UiPathRuntimeStateEvent(
345+
payload=payload,
346+
node_name=author,
347+
metadata={"event_type": event_type},
348+
)
349+
)
348350
# Tools node only for real tool calls (not transfers)
349351
if not is_transfer:
350-
events.append(UiPathRuntimeStateEvent(
351-
payload=payload,
352-
node_name=tools_node,
353-
metadata={"event_type": "function_call"},
354-
))
352+
events.append(
353+
UiPathRuntimeStateEvent(
354+
payload=payload,
355+
node_name=tools_node,
356+
metadata={"event_type": "function_call"},
357+
)
358+
)
355359
return events
356360

357361
# Function responses → agent node only (the agent receives the result;
@@ -365,38 +369,46 @@ def _convert_event(self, event: Event) -> list[UiPathRuntimeStateEvent]:
365369
"function_name": fr.name or "unknown",
366370
"function_response": serialize_defaults(fr.response or {}),
367371
}
368-
events.append(UiPathRuntimeStateEvent(
369-
payload=payload,
370-
node_name=author,
371-
metadata={"event_type": "function_response"},
372-
))
372+
events.append(
373+
UiPathRuntimeStateEvent(
374+
payload=payload,
375+
node_name=author,
376+
metadata={"event_type": "function_response"},
377+
)
378+
)
373379
return events
374380

375381
# Agent transfer (from actions, not function calls)
376382
if event.actions.transfer_to_agent:
377-
events.append(UiPathRuntimeStateEvent(
378-
payload={"transfer_to_agent": event.actions.transfer_to_agent},
379-
node_name=author,
380-
metadata={"event_type": "agent_transfer"},
381-
))
383+
events.append(
384+
UiPathRuntimeStateEvent(
385+
payload={"transfer_to_agent": event.actions.transfer_to_agent},
386+
node_name=author,
387+
metadata={"event_type": "agent_transfer"},
388+
)
389+
)
382390
return events
383391

384392
# State delta
385393
if event.actions.state_delta:
386-
events.append(UiPathRuntimeStateEvent(
387-
payload=serialize_defaults(event.actions.state_delta),
388-
node_name=author,
389-
metadata={"event_type": "state_delta"},
390-
))
394+
events.append(
395+
UiPathRuntimeStateEvent(
396+
payload=serialize_defaults(event.actions.state_delta),
397+
node_name=author,
398+
metadata={"event_type": "state_delta"},
399+
)
400+
)
391401
return events
392402

393403
# Partial streaming content
394404
if event.partial and event.content:
395-
events.append(UiPathRuntimeStateEvent(
396-
payload=serialize_defaults(event.content),
397-
node_name=author,
398-
metadata={"event_type": "partial"},
399-
))
405+
events.append(
406+
UiPathRuntimeStateEvent(
407+
payload=serialize_defaults(event.content),
408+
node_name=author,
409+
metadata={"event_type": "partial"},
410+
)
411+
)
400412
return events
401413

402414
return events

packages/uipath-google-adk/src/uipath_google_adk/runtime/schema.py

Lines changed: 7 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -138,9 +138,7 @@ def get_entrypoints_schema(agent: BaseAgent) -> dict[str, Any]:
138138

139139
schema["input"] = {
140140
"type": "object",
141-
"properties": transform_nullable_types(
142-
unpacked.get("properties", {})
143-
),
141+
"properties": transform_nullable_types(unpacked.get("properties", {})),
144142
"required": unpacked.get("required", []),
145143
}
146144
if "title" in unpacked:
@@ -283,14 +281,10 @@ def _add_agent_and_tools(current_agent: BaseAgent) -> None:
283281
_add_agent_and_tools(sub_agent)
284282

285283
edges.append(
286-
UiPathRuntimeEdge(
287-
source=agent_name, target=sub_name, label=None
288-
)
284+
UiPathRuntimeEdge(source=agent_name, target=sub_name, label=None)
289285
)
290286
edges.append(
291-
UiPathRuntimeEdge(
292-
source=sub_name, target=agent_name, label=None
293-
)
287+
UiPathRuntimeEdge(source=sub_name, target=agent_name, label=None)
294288
)
295289

296290
# Add __start__ node
@@ -322,9 +316,7 @@ def _add_agent_and_tools(current_agent: BaseAgent) -> None:
322316
edges.append(
323317
UiPathRuntimeEdge(source="__start__", target=agent_name, label="input")
324318
)
325-
edges.append(
326-
UiPathRuntimeEdge(source=agent_name, target="__end__", label="output")
327-
)
319+
edges.append(UiPathRuntimeEdge(source=agent_name, target="__end__", label="output"))
328320

329321
return UiPathRuntimeGraph(nodes=nodes, edges=edges)
330322

@@ -369,9 +361,7 @@ def _process_tools(
369361
)
370362
)
371363
edges.append(
372-
UiPathRuntimeEdge(
373-
source=tool_agent_name, target=agent_name, label=None
374-
)
364+
UiPathRuntimeEdge(source=tool_agent_name, target=agent_name, label=None)
375365
)
376366

377367
# Regular tools — aggregate into single tools node
@@ -394,14 +384,10 @@ def _process_tools(
394384
)
395385
)
396386
edges.append(
397-
UiPathRuntimeEdge(
398-
source=agent_name, target=tools_node_id, label=None
399-
)
387+
UiPathRuntimeEdge(source=agent_name, target=tools_node_id, label=None)
400388
)
401389
edges.append(
402-
UiPathRuntimeEdge(
403-
source=tools_node_id, target=agent_name, label=None
404-
)
390+
UiPathRuntimeEdge(source=tools_node_id, target=agent_name, label=None)
405391
)
406392

407393

packages/uipath-google-adk/tests/test_loader.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
"""Tests for GoogleADKAgentLoader."""
22

3-
43
import pytest
54

65
from uipath_google_adk.runtime.errors import UiPathGoogleADKRuntimeError
@@ -19,7 +18,9 @@ def test_valid_path_string(self):
1918

2019
def test_path_with_multiple_colons(self):
2120
"""Test path with multiple colons uses first split."""
22-
loader = GoogleADKAgentLoader.from_path_string("test", "path/to/file.py:var:extra")
21+
loader = GoogleADKAgentLoader.from_path_string(
22+
"test", "path/to/file.py:var:extra"
23+
)
2324
assert loader.file_path == "path/to/file.py"
2425
assert loader.variable_name == "var:extra"
2526

packages/uipath-google-adk/tests/test_schema.py

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -128,9 +128,7 @@ def test_output_key_creates_simple_schema(self):
128128

129129
def test_output_schema_takes_precedence_over_output_key(self):
130130
"""output_schema takes precedence over output_key."""
131-
agent = _make_llm_agent(
132-
output_schema=OutputModel, output_key="response"
133-
)
131+
agent = _make_llm_agent(output_schema=OutputModel, output_key="response")
134132
schema = get_entrypoints_schema(agent)
135133

136134
assert "answer" in schema["output"]["properties"]
@@ -151,7 +149,9 @@ def test_output_schema_with_tools_raises(self):
151149
tool.name = "search"
152150
agent = _make_llm_agent(output_schema=OutputModel, tools=[tool])
153151

154-
with pytest.raises(ValueError, match="has output_schema set but also has tools"):
152+
with pytest.raises(
153+
ValueError, match="has output_schema set but also has tools"
154+
):
155155
resolve_output_schema(agent)
156156

157157
def test_output_schema_with_sub_agents_raises(self):
@@ -184,22 +184,20 @@ def test_composite_agent_recurses_to_last_sub_agent(self):
184184
"""Composite agent resolves output_schema from the last sub_agent."""
185185
formatter = _make_llm_agent(name="formatter", output_schema=OutputModel)
186186
worker = _make_llm_agent(name="worker")
187-
pipeline = _make_base_agent(
188-
name="pipeline", sub_agents=[worker, formatter]
189-
)
187+
pipeline = _make_base_agent(name="pipeline", sub_agents=[worker, formatter])
190188

191189
assert resolve_output_schema(pipeline) is OutputModel
192190

193191
def test_composite_agent_raises_if_last_sub_agent_invalid(self):
194192
"""Composite agent raises if last sub_agent has output_schema + tools."""
195193
tool = MagicMock()
196194
tool.name = "search"
197-
bad_agent = _make_llm_agent(
198-
name="bad", output_schema=OutputModel, tools=[tool]
199-
)
195+
bad_agent = _make_llm_agent(name="bad", output_schema=OutputModel, tools=[tool])
200196
pipeline = _make_base_agent(name="pipeline", sub_agents=[bad_agent])
201197

202-
with pytest.raises(ValueError, match="has output_schema set but also has tools"):
198+
with pytest.raises(
199+
ValueError, match="has output_schema set but also has tools"
200+
):
203201
resolve_output_schema(pipeline)
204202

205203

0 commit comments

Comments
 (0)