kagent-adk 0.6.19__tar.gz → 0.6.20__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of kagent-adk might be problematic. Click here for more details.
- {kagent_adk-0.6.19 → kagent_adk-0.6.20}/PKG-INFO +4 -2
- {kagent_adk-0.6.19 → kagent_adk-0.6.20}/pyproject.toml +4 -2
- {kagent_adk-0.6.19 → kagent_adk-0.6.20}/src/kagent/adk/_a2a.py +25 -3
- {kagent_adk-0.6.19 → kagent_adk-0.6.20}/src/kagent/adk/_agent_executor.py +33 -6
- {kagent_adk-0.6.19 → kagent_adk-0.6.20}/src/kagent/adk/_session_service.py +3 -0
- {kagent_adk-0.6.19 → kagent_adk-0.6.20}/src/kagent/adk/types.py +1 -1
- {kagent_adk-0.6.19 → kagent_adk-0.6.20}/.gitignore +0 -0
- {kagent_adk-0.6.19 → kagent_adk-0.6.20}/.python-version +0 -0
- {kagent_adk-0.6.19 → kagent_adk-0.6.20}/README.md +0 -0
- {kagent_adk-0.6.19 → kagent_adk-0.6.20}/src/kagent/adk/__init__.py +0 -0
- {kagent_adk-0.6.19 → kagent_adk-0.6.20}/src/kagent/adk/_token.py +0 -0
- {kagent_adk-0.6.19 → kagent_adk-0.6.20}/src/kagent/adk/cli.py +0 -0
- {kagent_adk-0.6.19 → kagent_adk-0.6.20}/src/kagent/adk/converters/__init__.py +0 -0
- {kagent_adk-0.6.19 → kagent_adk-0.6.20}/src/kagent/adk/converters/error_mappings.py +0 -0
- {kagent_adk-0.6.19 → kagent_adk-0.6.20}/src/kagent/adk/converters/event_converter.py +0 -0
- {kagent_adk-0.6.19 → kagent_adk-0.6.20}/src/kagent/adk/converters/part_converter.py +0 -0
- {kagent_adk-0.6.19 → kagent_adk-0.6.20}/src/kagent/adk/converters/request_converter.py +0 -0
- {kagent_adk-0.6.19 → kagent_adk-0.6.20}/src/kagent/adk/models/__init__.py +0 -0
- {kagent_adk-0.6.19 → kagent_adk-0.6.20}/src/kagent/adk/models/_openai.py +0 -0
- {kagent_adk-0.6.19 → kagent_adk-0.6.20}/tests/__init__.py +0 -0
- {kagent_adk-0.6.19 → kagent_adk-0.6.20}/tests/unittests/__init__.py +0 -0
- {kagent_adk-0.6.19 → kagent_adk-0.6.20}/tests/unittests/converters/__init__.py +0 -0
- {kagent_adk-0.6.19 → kagent_adk-0.6.20}/tests/unittests/converters/test_event_converter.py +0 -0
- {kagent_adk-0.6.19 → kagent_adk-0.6.20}/tests/unittests/models/__init__.py +0 -0
- {kagent_adk-0.6.19 → kagent_adk-0.6.20}/tests/unittests/models/test_openai.py +0 -0
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: kagent-adk
|
|
3
|
-
Version: 0.6.
|
|
3
|
+
Version: 0.6.20
|
|
4
4
|
Summary: kagent-adk is an sdk for integrating adk agents with kagent
|
|
5
|
-
Requires-Python: >=3.
|
|
5
|
+
Requires-Python: >=3.11.0
|
|
6
6
|
Requires-Dist: a2a-sdk>=0.3.1
|
|
7
|
+
Requires-Dist: agentsts-adk>=0.0.5
|
|
8
|
+
Requires-Dist: agentsts-core>=0.0.5
|
|
7
9
|
Requires-Dist: aiofiles>=24.1.0
|
|
8
10
|
Requires-Dist: anthropic[vertex]>=0.49.0
|
|
9
11
|
Requires-Dist: anyio>=4.9.0
|
|
@@ -4,11 +4,13 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "kagent-adk"
|
|
7
|
-
version = "0.6.
|
|
7
|
+
version = "0.6.20"
|
|
8
8
|
description = "kagent-adk is an sdk for integrating adk agents with kagent"
|
|
9
9
|
readme = "README.md"
|
|
10
|
-
requires-python = ">=3.
|
|
10
|
+
requires-python = ">=3.11.0"
|
|
11
11
|
dependencies = [
|
|
12
|
+
"agentsts-adk >= 0.0.5",
|
|
13
|
+
"agentsts-core >= 0.0.5",
|
|
12
14
|
"kagent-core",
|
|
13
15
|
"aiofiles>=24.1.0",
|
|
14
16
|
"anyio>=4.9.0",
|
|
@@ -8,9 +8,11 @@ import httpx
|
|
|
8
8
|
from a2a.server.apps import A2AFastAPIApplication
|
|
9
9
|
from a2a.server.request_handlers import DefaultRequestHandler
|
|
10
10
|
from a2a.types import AgentCard
|
|
11
|
+
from agentsts.adk import ADKRunner, ADKSessionService, ADKSTSIntegration, ADKTokenPropagationPlugin
|
|
11
12
|
from fastapi import FastAPI, Request
|
|
12
13
|
from fastapi.responses import PlainTextResponse
|
|
13
14
|
from google.adk.agents import BaseAgent
|
|
15
|
+
from google.adk.apps import App
|
|
14
16
|
from google.adk.runners import Runner
|
|
15
17
|
from google.adk.sessions import InMemorySessionService
|
|
16
18
|
from google.genai import types
|
|
@@ -21,7 +23,19 @@ from ._agent_executor import A2aAgentExecutor
|
|
|
21
23
|
from ._session_service import KAgentSessionService
|
|
22
24
|
from ._token import KAgentTokenService
|
|
23
25
|
|
|
26
|
+
|
|
24
27
|
# --- Configure Logging ---
|
|
28
|
+
def configure_logging() -> None:
|
|
29
|
+
"""Configure logging based on LOG_LEVEL environment variable."""
|
|
30
|
+
log_level = os.getenv("LOG_LEVEL", "INFO").upper()
|
|
31
|
+
numeric_level = getattr(logging, log_level, logging.INFO)
|
|
32
|
+
logging.basicConfig(
|
|
33
|
+
level=numeric_level,
|
|
34
|
+
)
|
|
35
|
+
logging.info(f"Logging configured with level: {log_level}")
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
configure_logging()
|
|
25
39
|
logger = logging.getLogger(__name__)
|
|
26
40
|
|
|
27
41
|
|
|
@@ -39,6 +53,7 @@ def thread_dump(request: Request) -> PlainTextResponse:
|
|
|
39
53
|
|
|
40
54
|
|
|
41
55
|
kagent_url_override = os.getenv("KAGENT_URL")
|
|
56
|
+
sts_well_known_uri = os.getenv("STS_WELL_KNOWN_URI")
|
|
42
57
|
|
|
43
58
|
|
|
44
59
|
class KAgentApp:
|
|
@@ -61,10 +76,17 @@ class KAgentApp:
|
|
|
61
76
|
)
|
|
62
77
|
session_service = KAgentSessionService(http_client)
|
|
63
78
|
|
|
79
|
+
plugins = []
|
|
80
|
+
if sts_well_known_uri:
|
|
81
|
+
sts_integration = ADKSTSIntegration(sts_well_known_uri)
|
|
82
|
+
session_service = ADKSessionService(sts_integration, session_service)
|
|
83
|
+
plugins.append(ADKTokenPropagationPlugin(sts_integration))
|
|
84
|
+
|
|
85
|
+
adk_app = App(name=self.app_name, root_agent=self.root_agent, plugins=plugins)
|
|
86
|
+
|
|
64
87
|
def create_runner() -> Runner:
|
|
65
|
-
return
|
|
66
|
-
|
|
67
|
-
app_name=self.app_name,
|
|
88
|
+
return ADKRunner(
|
|
89
|
+
app=adk_app,
|
|
68
90
|
session_service=session_service,
|
|
69
91
|
)
|
|
70
92
|
|
|
@@ -156,6 +156,10 @@ class A2aAgentExecutor(AgentExecutor):
|
|
|
156
156
|
# Convert the a2a request to ADK run args
|
|
157
157
|
run_args = convert_a2a_request_to_adk_run_args(context)
|
|
158
158
|
|
|
159
|
+
# set request headers to session state
|
|
160
|
+
headers = context.call_context.state.get("headers", {})
|
|
161
|
+
run_args["headers"] = headers
|
|
162
|
+
|
|
159
163
|
# ensure the session exists
|
|
160
164
|
session = await self._prepare_session(context, run_args, runner)
|
|
161
165
|
|
|
@@ -256,12 +260,35 @@ class A2aAgentExecutor(AgentExecutor):
|
|
|
256
260
|
session_id=session_id,
|
|
257
261
|
)
|
|
258
262
|
if session is None:
|
|
259
|
-
session
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
263
|
+
# Extract session name from the first TextPart (like the UI does)
|
|
264
|
+
session_name = None
|
|
265
|
+
if context.message and context.message.parts:
|
|
266
|
+
for part in context.message.parts:
|
|
267
|
+
# A2A parts have a .root property that contains the actual part (TextPart, FilePart, etc.)
|
|
268
|
+
if isinstance(part, Part):
|
|
269
|
+
root_part = part.root
|
|
270
|
+
if isinstance(root_part, TextPart) and root_part.text:
|
|
271
|
+
# Take first 20 chars + "..." if longer (matching UI behavior)
|
|
272
|
+
text = root_part.text.strip()
|
|
273
|
+
session_name = text[:20] + ("..." if len(text) > 20 else "")
|
|
274
|
+
break
|
|
275
|
+
|
|
276
|
+
# Prepare kwargs for create_session
|
|
277
|
+
create_session_kwargs = {
|
|
278
|
+
"app_name": runner.app_name,
|
|
279
|
+
"user_id": user_id,
|
|
280
|
+
"state": {},
|
|
281
|
+
"session_id": session_id,
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
if session_name is not None:
|
|
285
|
+
create_session_kwargs["session_name"] = session_name
|
|
286
|
+
|
|
287
|
+
# We pass the kwargs using ** to avoid issues with optional
|
|
288
|
+
# parameters like `session_name` that exist within
|
|
289
|
+
# `KAgentSessionService` but not in ADK `BaseSessionService`
|
|
290
|
+
session = await runner.session_service.create_session(**create_session_kwargs)
|
|
291
|
+
|
|
265
292
|
# Update run_args with the new session_id
|
|
266
293
|
run_args["session_id"] = session.id
|
|
267
294
|
|
|
@@ -32,6 +32,7 @@ class KAgentSessionService(BaseSessionService):
|
|
|
32
32
|
user_id: str,
|
|
33
33
|
state: Optional[dict[str, Any]] = None,
|
|
34
34
|
session_id: Optional[str] = None,
|
|
35
|
+
session_name: Optional[str] = None,
|
|
35
36
|
) -> Session:
|
|
36
37
|
# Prepare request data
|
|
37
38
|
request_data = {
|
|
@@ -40,6 +41,8 @@ class KAgentSessionService(BaseSessionService):
|
|
|
40
41
|
}
|
|
41
42
|
if session_id:
|
|
42
43
|
request_data["id"] = session_id
|
|
44
|
+
if session_name:
|
|
45
|
+
request_data["name"] = session_name
|
|
43
46
|
|
|
44
47
|
# Make API call to create session
|
|
45
48
|
response = await self.client.post(
|
|
@@ -101,7 +101,7 @@ class AgentConfig(BaseModel):
|
|
|
101
101
|
for http_tool in self.http_tools: # add http tools
|
|
102
102
|
tools.append(MCPToolset(connection_params=http_tool.params, tool_filter=http_tool.tools))
|
|
103
103
|
if self.sse_tools:
|
|
104
|
-
for sse_tool in self.sse_tools: # add
|
|
104
|
+
for sse_tool in self.sse_tools: # add sse tools
|
|
105
105
|
tools.append(MCPToolset(connection_params=sse_tool.params, tool_filter=sse_tool.tools))
|
|
106
106
|
if self.remote_agents:
|
|
107
107
|
for remote_agent in self.remote_agents: # Add remote agents as tools
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|