kagent-adk 0.6.7__py3-none-any.whl → 0.6.9__py3-none-any.whl

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.

@@ -4,8 +4,7 @@ from typing import Literal, Self, Union
4
4
  from google.adk.agents import Agent
5
5
  from google.adk.agents.base_agent import BaseAgent
6
6
  from google.adk.agents.llm_agent import ToolUnion
7
- from google.adk.agents.remote_a2a_agent import RemoteA2aAgent
8
- from google.adk.agents.run_config import RunConfig, StreamingMode
7
+ from google.adk.agents.remote_a2a_agent import AGENT_CARD_WELL_KNOWN_PATH, RemoteA2aAgent
9
8
  from google.adk.models.anthropic_llm import Claude as ClaudeLLM
10
9
  from google.adk.models.google_llm import Gemini as GeminiLLM
11
10
  from google.adk.models.lite_llm import LiteLlm
@@ -13,6 +12,9 @@ from google.adk.tools.agent_tool import AgentTool
13
12
  from google.adk.tools.mcp_tool import MCPToolset, SseConnectionParams, StreamableHTTPConnectionParams
14
13
  from pydantic import BaseModel, Field
15
14
 
15
+ from .models import AzureOpenAI as OpenAIAzure
16
+ from .models import OpenAI as OpenAINative
17
+
16
18
  logger = logging.getLogger(__name__)
17
19
 
18
20
 
@@ -88,18 +90,17 @@ class AgentConfig(BaseModel):
88
90
  if self.sse_tools:
89
91
  for sse_tool in self.sse_tools: # add stdio tools
90
92
  mcp_toolsets.append(MCPToolset(connection_params=sse_tool.params, tool_filter=sse_tool.tools))
91
- remote_agents: list[BaseAgent] = []
92
93
  if self.remote_agents:
93
94
  for remote_agent in self.remote_agents: # Add remote agents as tools
94
- remote_agents.append(
95
- RemoteA2aAgent(
96
- name=remote_agent.name,
97
- agent_card=remote_agent.url,
98
- description=remote_agent.description,
99
- )
95
+ remote_agent = RemoteA2aAgent(
96
+ name=remote_agent.name,
97
+ agent_card=f"{remote_agent.url}/{AGENT_CARD_WELL_KNOWN_PATH}",
98
+ description=remote_agent.description,
100
99
  )
100
+ mcp_toolsets.append(AgentTool(agent=remote_agent, skip_summarization=True))
101
+
101
102
  if self.model.type == "openai":
102
- model = LiteLlm(model=f"openai/{self.model.model}", base_url=self.model.base_url)
103
+ model = OpenAINative(model=self.model.model, base_url=self.model.base_url, type="openai")
103
104
  elif self.model.type == "anthropic":
104
105
  model = LiteLlm(model=f"anthropic/{self.model.model}", base_url=self.model.base_url)
105
106
  elif self.model.type == "gemini_vertex_ai":
@@ -109,7 +110,7 @@ class AgentConfig(BaseModel):
109
110
  elif self.model.type == "ollama":
110
111
  model = LiteLlm(model=f"ollama_chat/{self.model.model}")
111
112
  elif self.model.type == "azure_openai":
112
- model = LiteLlm(model=f"azure/{self.model.model}")
113
+ model = OpenAIAzure(model=self.model.model, type="azure_openai")
113
114
  elif self.model.type == "gemini":
114
115
  model = self.model.model
115
116
  else:
@@ -120,5 +121,4 @@ class AgentConfig(BaseModel):
120
121
  description=self.description,
121
122
  instruction=self.instruction,
122
123
  tools=mcp_toolsets,
123
- sub_agents=remote_agents,
124
124
  )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kagent-adk
3
- Version: 0.6.7
3
+ Version: 0.6.9
4
4
  Summary: kagent-adk is an sdk for integrating adk agents with kagent
5
5
  Requires-Python: >=3.12.11
6
6
  Requires-Dist: a2a-sdk>=0.3.1
@@ -13,15 +13,10 @@ Requires-Dist: google-auth>=2.40.2
13
13
  Requires-Dist: google-genai>=1.21.1
14
14
  Requires-Dist: httpx>=0.25.0
15
15
  Requires-Dist: jsonref>=1.1.0
16
+ Requires-Dist: kagent-core
16
17
  Requires-Dist: litellm>=1.74.3
17
18
  Requires-Dist: mcp>=1.12.0
18
19
  Requires-Dist: openai>=1.72.0
19
- Requires-Dist: opentelemetry-api>=1.36.0
20
- Requires-Dist: opentelemetry-exporter-otlp-proto-grpc>=1.36.0
21
- Requires-Dist: opentelemetry-instrumentation-anthropic>=0.44.0
22
- Requires-Dist: opentelemetry-instrumentation-httpx>=0.52.0
23
- Requires-Dist: opentelemetry-instrumentation-openai>=0.44.3
24
- Requires-Dist: opentelemetry-sdk>=1.36.0
25
20
  Requires-Dist: protobuf>=6
26
21
  Requires-Dist: pydantic>=2.5.0
27
22
  Requires-Dist: typer>=0.15.0
@@ -0,0 +1,17 @@
1
+ kagent/adk/__init__.py,sha256=Cam9hwhl6Z1tZ3WJIB1KATX24MwRMpiyBLYF64DTqQI,182
2
+ kagent/adk/_a2a.py,sha256=HvduKJlfuUIKzYuPs_U_9A-xuhcMdQutZTzdLNaGORc,4406
3
+ kagent/adk/_agent_executor.py,sha256=rxNVdrcS4L5Kwe8oF7mLUnD1KOYhe6vXK-si0O-KQ9o,10730
4
+ kagent/adk/_session_service.py,sha256=A47gsfDVp8jITzeW987AHTJLEhcU_mU3ik_SFptFGIc,5815
5
+ kagent/adk/_token.py,sha256=OL46m7U5vUTby1WWjVB7Jqzig4TWddzoAmLVLlfSdAg,2515
6
+ kagent/adk/cli.py,sha256=Sdw9FXnUmeHfgJhdRDq1zpoNMf6GM7x35ZDz_OkQgJg,2963
7
+ kagent/adk/types.py,sha256=v7VbO0tAPvpjdEgWJroEq64jSCz6D3Q0yPdRM0a7MjM,4260
8
+ kagent/adk/converters/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
+ kagent/adk/converters/event_converter.py,sha256=gPDxJhPtoIp2CAm0VjSPTH-siuz3IR23CV25AiN_1B8,10392
10
+ kagent/adk/converters/part_converter.py,sha256=Q9Kbteit8XdL_9Tb8bAtxRxOZQei8Wabszwsl4YMe2c,7507
11
+ kagent/adk/converters/request_converter.py,sha256=iTmTmhlnyRfuYyFi4WmpTSXPz22xjjotbe750j-CvYA,1072
12
+ kagent/adk/models/__init__.py,sha256=mqD0JhS9kT1rMpFNLq5-qnjstpp6lzT9xADaOfjrUKY,78
13
+ kagent/adk/models/_openai.py,sha256=Xdu0AteM4nFbZaCMAcSC_nj1iJRgpWBVXFzD0aPELGA,15685
14
+ kagent_adk-0.6.9.dist-info/METADATA,sha256=JtlHtn8MXVr9XeCg8QX3C0zob7ibyNhf1N6ygfQTLlE,943
15
+ kagent_adk-0.6.9.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
16
+ kagent_adk-0.6.9.dist-info/entry_points.txt,sha256=a1Q2Inc9L0dvXWEkwnCdf9cfXdpX5Dl2Q6DhNWNjhxw,50
17
+ kagent_adk-0.6.9.dist-info/RECORD,,
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ kagent-adk = kagent.adk.cli:app
kagent_adk/_task_store.py DELETED
@@ -1,30 +0,0 @@
1
- from typing import override
2
-
3
- import httpx
4
- from a2a.server.tasks import TaskStore
5
- from a2a.types import Task
6
-
7
-
8
- class KAgentTaskStore(TaskStore):
9
- client: httpx.AsyncClient
10
-
11
- def __init__(self, client: httpx.AsyncClient):
12
- self.client = client
13
-
14
- @override
15
- async def save(self, task: Task) -> None:
16
- response = await self.client.post("/api/tasks", json=task.model_dump())
17
- response.raise_for_status()
18
-
19
- @override
20
- async def get(self, task_id: str) -> Task | None:
21
- response = await self.client.get(f"/api/tasks/{task_id}")
22
- if response.status_code == 404:
23
- return None
24
- response.raise_for_status()
25
- return Task.model_validate(response.json())
26
-
27
- @override
28
- async def delete(self, task_id: str) -> None:
29
- response = await self.client.delete(f"/api/tasks/{task_id}")
30
- response.raise_for_status()
kagent_adk/cli.py DELETED
@@ -1,202 +0,0 @@
1
- import asyncio
2
- import json
3
- import logging
4
- import os
5
- from typing import Annotated
6
-
7
- import typer
8
- import uvicorn
9
- from a2a.types import AgentCard
10
- from google.adk.cli.utils.agent_loader import AgentLoader
11
- from opentelemetry import _logs, trace
12
- from opentelemetry.exporter.otlp.proto.grpc._log_exporter import OTLPLogExporter
13
- from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter
14
- from opentelemetry.instrumentation.anthropic import AnthropicInstrumentor
15
- from opentelemetry.instrumentation.openai import OpenAIInstrumentor
16
- from opentelemetry.sdk._events import EventLoggerProvider
17
- from opentelemetry.sdk._logs import LoggerProvider
18
- from opentelemetry.sdk._logs.export import BatchLogRecordProcessor
19
- from opentelemetry.sdk.resources import Resource
20
- from opentelemetry.sdk.trace import TracerProvider
21
- from opentelemetry.sdk.trace.export import BatchSpanProcessor
22
-
23
- from . import AgentConfig, KAgentApp
24
-
25
- logger = logging.getLogger(__name__)
26
-
27
- app = typer.Typer()
28
-
29
- kagent_url = os.getenv("KAGENT_URL")
30
- kagent_name = os.getenv("KAGENT_NAME")
31
- kagent_namespace = os.getenv("KAGENT_NAMESPACE")
32
-
33
-
34
- class Config:
35
- _url: str
36
- _name: str
37
- _namespace: str
38
-
39
- def __init__(self):
40
- if not kagent_url:
41
- raise ValueError("KAGENT_URL is not set")
42
- if not kagent_name:
43
- raise ValueError("KAGENT_NAME is not set")
44
- if not kagent_namespace:
45
- raise ValueError("KAGENT_NAMESPACE is not set")
46
- self._url = kagent_url
47
- self._name = kagent_name
48
- self._namespace = kagent_namespace
49
-
50
- @property
51
- def name(self):
52
- return self._name.replace("-", "_")
53
-
54
- @property
55
- def namespace(self):
56
- return self._namespace.replace("-", "_")
57
-
58
- @property
59
- def app_name(self):
60
- return self.namespace + "__NS__" + self.name
61
-
62
- @property
63
- def url(self):
64
- return self._url
65
-
66
-
67
- def configure_tracing():
68
- tracing_enabled = os.getenv("OTEL_TRACING_ENABLED", "false").lower() == "true"
69
- logging_enabled = os.getenv("OTEL_LOGGING_ENABLED", "false").lower() == "true"
70
-
71
- resource = Resource({"service.name": "kagent"})
72
-
73
- # Configure tracing if enabled
74
- if tracing_enabled:
75
- logging.info("Enabling tracing")
76
- tracer_provider = TracerProvider(resource=resource)
77
- # Check new env var first, fall back to old one for backward compatibility
78
- trace_endpoint = os.getenv("OTEL_TRACING_EXPORTER_OTLP_ENDPOINT") or os.getenv("OTEL_EXPORTER_OTLP_ENDPOINT")
79
- if trace_endpoint:
80
- processor = BatchSpanProcessor(OTLPSpanExporter(endpoint=trace_endpoint))
81
- else:
82
- processor = BatchSpanProcessor(OTLPSpanExporter())
83
- tracer_provider.add_span_processor(processor)
84
- trace.set_tracer_provider(tracer_provider)
85
-
86
- # Configure logging if enabled
87
- if logging_enabled:
88
- logging.info("Enabling logging for GenAI events")
89
- logger_provider = LoggerProvider(resource=resource)
90
- log_endpoint = os.getenv("OTEL_LOGGING_EXPORTER_OTLP_ENDPOINT")
91
- logging.info(f"Log endpoint configured: {log_endpoint}")
92
-
93
- # Add OTLP exporter
94
- if log_endpoint:
95
- log_processor = BatchLogRecordProcessor(OTLPLogExporter(endpoint=log_endpoint))
96
- else:
97
- log_processor = BatchLogRecordProcessor(OTLPLogExporter())
98
- logger_provider.add_log_record_processor(log_processor)
99
-
100
- _logs.set_logger_provider(logger_provider)
101
- logging.info("Log provider configured with OTLP")
102
- # When logging is enabled, use new event-based approach (input/output as log events in Body)
103
- logging.info("OpenAI instrumentation configured with event logging capability")
104
- # Create event logger provider using the configured logger provider
105
- event_logger_provider = EventLoggerProvider(logger_provider)
106
- OpenAIInstrumentor(use_legacy_attributes=False).instrument(event_logger_provider=event_logger_provider)
107
- AnthropicInstrumentor(use_legacy_attributes=False).instrument(event_logger_provider=event_logger_provider)
108
- else:
109
- # Use legacy attributes (input/output as GenAI span attributes)
110
- logging.info("OpenAI instrumentation configured with legacy GenAI span attributes")
111
- OpenAIInstrumentor().instrument()
112
- AnthropicInstrumentor().instrument()
113
-
114
-
115
- @app.command()
116
- def static(
117
- host: str = "127.0.0.1",
118
- port: int = 8080,
119
- workers: int = 1,
120
- filepath: str = "/config",
121
- reload: Annotated[bool, typer.Option("--reload")] = False,
122
- ):
123
- configure_tracing()
124
-
125
- app_cfg = Config()
126
-
127
- with open(os.path.join(filepath, "config.json"), "r") as f:
128
- config = json.load(f)
129
- agent_config = AgentConfig.model_validate(config)
130
- with open(os.path.join(filepath, "agent-card.json"), "r") as f:
131
- agent_card = json.load(f)
132
- agent_card = AgentCard.model_validate(agent_card)
133
- root_agent = agent_config.to_agent(app_cfg.name)
134
-
135
- kagent_app = KAgentApp(root_agent, agent_card, app_cfg.url, app_cfg.app_name)
136
-
137
- uvicorn.run(
138
- kagent_app.build,
139
- host=host,
140
- port=port,
141
- workers=workers,
142
- reload=reload,
143
- )
144
-
145
-
146
- @app.command()
147
- def run(
148
- name: Annotated[str, typer.Argument(help="The name of the agent to run")],
149
- working_dir: str = ".",
150
- host: str = "127.0.0.1",
151
- port: int = 8080,
152
- workers: int = 1,
153
- ):
154
- configure_tracing()
155
- app_cfg = Config()
156
-
157
- agent_loader = AgentLoader(agents_dir=working_dir)
158
- root_agent = agent_loader.load_agent(name)
159
-
160
- with open(os.path.join(working_dir, name, "agent-card.json"), "r") as f:
161
- agent_card = json.load(f)
162
- agent_card = AgentCard.model_validate(agent_card)
163
- kagent_app = KAgentApp(root_agent, agent_card, app_cfg.url, app_cfg.app_name)
164
- uvicorn.run(
165
- kagent_app.build,
166
- host=host,
167
- port=port,
168
- workers=workers,
169
- )
170
-
171
-
172
- async def test_agent(agent_config: AgentConfig, agent_card: AgentCard, task: str):
173
- app_cfg = Config()
174
- agent = agent_config.to_agent(app_cfg.name)
175
- app = KAgentApp(agent, agent_card, app_cfg.url, app_cfg.app_name)
176
- await app.test(task)
177
-
178
-
179
- @app.command()
180
- def test(
181
- task: Annotated[str, typer.Option("--task", help="The task to test the agent with")],
182
- filepath: Annotated[str, typer.Option("--filepath", help="The path to the agent config file")],
183
- ):
184
- with open(filepath, "r") as f:
185
- content = f.read()
186
- config = json.loads(content)
187
-
188
- with open(os.path.join(filepath, "agent-card.json"), "r") as f:
189
- agent_card = json.load(f)
190
- agent_card = AgentCard.model_validate(agent_card)
191
- agent_config = AgentConfig.model_validate(config)
192
- asyncio.run(test_agent(agent_config, agent_card, task))
193
-
194
-
195
- def run_cli():
196
- logging.basicConfig(level=logging.INFO)
197
- logging.info("Starting KAgent")
198
- app()
199
-
200
-
201
- if __name__ == "__main__":
202
- run_cli()
@@ -1,12 +0,0 @@
1
- kagent_adk/__init__.py,sha256=3oB8gbSzsvVmqV8w-BGKkRlH3JPfK6o27AfOD6wAd8o,182
2
- kagent_adk/_agent_executor.py,sha256=8NDMNUveFtewamYtBQ4MkCwFIRn5xDWeuDaMsW-QGF8,10806
3
- kagent_adk/_session_service.py,sha256=A47gsfDVp8jITzeW987AHTJLEhcU_mU3ik_SFptFGIc,5815
4
- kagent_adk/_task_store.py,sha256=3ApKbFfcDZmcEnwef6bCDhBhoGY9ZYwwyP671B1DHFo,889
5
- kagent_adk/_token.py,sha256=M9TOxxC4RAWPup_MIYuLIYoklnfllJS0yV3dQOfr5ng,2486
6
- kagent_adk/a2a.py,sha256=r8GgDkeKoZJx_qZmLfoaA0zSrP7t0Hn_VqEc-m0xIc8,5845
7
- kagent_adk/cli.py,sha256=fqGRM6egX0Kb2AvZWWDCv4Ad7oJ8rh0UDOsV9BZKujQ,6858
8
- kagent_adk/models.py,sha256=BCG7FdXnizGc28HyHne-GRkUUKoc-QII4b8xcIl_4Yc,4201
9
- kagent_adk-0.6.7.dist-info/METADATA,sha256=LWyROW1gHg-SbR7va1aFGOBhSRUg1QD8wAWNWaUFCY8,1242
10
- kagent_adk-0.6.7.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
11
- kagent_adk-0.6.7.dist-info/entry_points.txt,sha256=bmqHEc9zPYkbRoK57wF3wi5ohHTMB6yHTslKfvuVpc4,50
12
- kagent_adk-0.6.7.dist-info/RECORD,,
@@ -1,2 +0,0 @@
1
- [console_scripts]
2
- kagent-adk = kagent_adk.cli:app
File without changes