agentex-sdk 0.4.21__py3-none-any.whl → 0.4.23__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.
agentex/_version.py CHANGED
@@ -1,4 +1,4 @@
1
1
  # File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
2
 
3
3
  __title__ = "agentex"
4
- __version__ = "0.4.21" # x-release-please-version
4
+ __version__ = "0.4.23" # x-release-please-version
@@ -389,6 +389,10 @@ def create_agent_environment(manifest: AgentManifest) -> dict[str, str]:
389
389
  env_vars["WORKFLOW_NAME"] = temporal_config.name
390
390
  env_vars["WORKFLOW_TASK_QUEUE"] = temporal_config.queue_name
391
391
 
392
+ # Set health check port from temporal config
393
+ if manifest.agent.temporal and manifest.agent.temporal.health_check_port is not None:
394
+ env_vars["HEALTH_CHECK_PORT"] = str(manifest.agent.temporal.health_check_port)
395
+
392
396
  if agent_config.env:
393
397
  for key, value in agent_config.env.items():
394
398
  env_vars[key] = value
@@ -89,6 +89,10 @@ agent:
89
89
  # Convention: <agent_name>_task_queue
90
90
  queue_name: {{ queue_name }}
91
91
 
92
+ # Optional: Health check port for temporal worker
93
+ # Defaults to 80 if not specified
94
+ # health_check_port: 80
95
+
92
96
  # Optional: Credentials mapping
93
97
  # Maps Kubernetes secrets to environment variables
94
98
  # Common credentials include:
@@ -12,12 +12,12 @@ from agents.exceptions import InputGuardrailTripwireTriggered, OutputGuardrailTr
12
12
  from openai.types.responses import (
13
13
  ResponseCompletedEvent,
14
14
  ResponseTextDeltaEvent,
15
+ ResponseFunctionToolCall,
15
16
  ResponseFunctionWebSearch,
16
17
  ResponseOutputItemDoneEvent,
17
- ResponseReasoningTextDoneEvent,
18
18
  ResponseCodeInterpreterToolCall,
19
- ResponseReasoningTextDeltaEvent,
20
- ResponseReasoningSummaryTextDoneEvent,
19
+ ResponseReasoningSummaryPartDoneEvent,
20
+ ResponseReasoningSummaryPartAddedEvent,
21
21
  ResponseReasoningSummaryTextDeltaEvent,
22
22
  )
23
23
 
@@ -29,7 +29,6 @@ from agentex.lib.utils.temporal import heartbeat_if_in_workflow
29
29
  from agentex.lib.core.tracing.tracer import AsyncTracer
30
30
  from agentex.types.task_message_delta import (
31
31
  TextDelta,
32
- ReasoningContentDelta,
33
32
  ReasoningSummaryDelta,
34
33
  )
35
34
  from agentex.types.task_message_update import (
@@ -691,7 +690,7 @@ class OpenAIService:
691
690
  if self.agentex_client is None:
692
691
  raise ValueError("Agentex client must be provided for auto_send methods")
693
692
 
694
- tool_call_map: dict[str, Any] = {}
693
+ tool_call_map: dict[str, ResponseFunctionToolCall] = {}
695
694
 
696
695
  if self.tracer is None:
697
696
  raise RuntimeError("Tracer not initialized - ensure tracer is provided to OpenAIService")
@@ -756,6 +755,8 @@ class OpenAIService:
756
755
 
757
756
  item_id_to_streaming_context: dict[str, StreamingTaskMessageContext] = {}
758
757
  unclosed_item_ids: set[str] = set()
758
+ # Simple string to accumulate reasoning summary
759
+ current_reasoning_summary: str = ""
759
760
 
760
761
  try:
761
762
  # Process streaming events with TaskMessage creation
@@ -848,37 +849,42 @@ class OpenAIService:
848
849
  type="delta",
849
850
  ),
850
851
  )
851
-
852
- elif isinstance(event.data, ResponseReasoningSummaryTextDeltaEvent):
853
- # Handle reasoning summary text delta
852
+ # Reasoning step one: new summary part added
853
+ elif isinstance(event.data, ResponseReasoningSummaryPartAddedEvent):
854
+ # We need to create a new streaming context for this reasoning item
854
855
  item_id = event.data.item_id
855
- summary_index = event.data.summary_index
856
+
857
+ # Reset the reasoning summary string
858
+ current_reasoning_summary = ""
859
+
860
+ streaming_context = self.streaming_service.streaming_task_message_context(
861
+ task_id=task_id,
862
+ initial_content=ReasoningContent(
863
+ author="agent",
864
+ summary=[],
865
+ content=[],
866
+ type="reasoning",
867
+ style="active",
868
+ ),
869
+ )
856
870
 
857
- # Check if we already have a streaming context for this reasoning item
858
- if item_id not in item_id_to_streaming_context:
859
- # Create a new streaming context for this reasoning item
860
- streaming_context = self.streaming_service.streaming_task_message_context(
861
- task_id=task_id,
862
- initial_content=ReasoningContent(
863
- author="agent",
864
- summary=[],
865
- content=[],
866
- type="reasoning",
867
- style="active",
868
- ),
869
- )
870
- # Open the streaming context
871
- item_id_to_streaming_context[item_id] = await streaming_context.open()
872
- unclosed_item_ids.add(item_id)
873
- else:
874
- streaming_context = item_id_to_streaming_context[item_id]
871
+ # Replace the existing streaming context (if it exists)
872
+ # Why do we replace? Cause all the reasoning parts use the same item_id!
873
+ item_id_to_streaming_context[item_id] = await streaming_context.open()
874
+ unclosed_item_ids.add(item_id)
875
+
876
+ # Reasoning step two: handling summary text delta
877
+ elif isinstance(event.data, ResponseReasoningSummaryTextDeltaEvent):
878
+ # Accumulate the delta into the string
879
+ current_reasoning_summary += event.data.delta
880
+ streaming_context = item_id_to_streaming_context[item_id]
875
881
 
876
882
  # Stream the summary delta through the streaming service
877
883
  await streaming_context.stream_update(
878
884
  update=StreamTaskMessageDelta(
879
885
  parent_task_message=streaming_context.task_message,
880
886
  delta=ReasoningSummaryDelta(
881
- summary_index=summary_index,
887
+ summary_index=event.data.summary_index,
882
888
  summary_delta=event.data.delta,
883
889
  type="reasoning_summary",
884
890
  ),
@@ -886,65 +892,32 @@ class OpenAIService:
886
892
  ),
887
893
  )
888
894
 
889
- elif isinstance(event.data, ResponseReasoningTextDeltaEvent):
890
- # Handle reasoning content text delta
891
- item_id = event.data.item_id
892
- content_index = event.data.content_index
893
-
894
- # Check if we already have a streaming context for this reasoning item
895
- if item_id not in item_id_to_streaming_context:
896
- # Create a new streaming context for this reasoning item
897
- streaming_context = self.streaming_service.streaming_task_message_context(
898
- task_id=task_id,
899
- initial_content=ReasoningContent(
900
- author="agent",
901
- summary=[],
902
- content=[],
903
- type="reasoning",
904
- style="active",
905
- ),
906
- )
907
- # Open the streaming context
908
- item_id_to_streaming_context[item_id] = await streaming_context.open()
909
- unclosed_item_ids.add(item_id)
910
- else:
911
- streaming_context = item_id_to_streaming_context[item_id]
912
-
913
- # Stream the content delta through the streaming service
895
+ # Reasoning step three: handling summary text done, closing the streaming context
896
+ elif isinstance(event.data, ResponseReasoningSummaryPartDoneEvent):
897
+ # Handle reasoning summary text completion
898
+ streaming_context = item_id_to_streaming_context[item_id]
899
+
900
+ # Create the complete reasoning content with the accumulated summary
901
+ complete_reasoning_content = ReasoningContent(
902
+ author="agent",
903
+ summary=[current_reasoning_summary],
904
+ content=[],
905
+ type="reasoning",
906
+ style="static",
907
+ )
908
+
909
+ # Send a full message update with the complete reasoning content
914
910
  await streaming_context.stream_update(
915
- update=StreamTaskMessageDelta(
911
+ update=StreamTaskMessageFull(
916
912
  parent_task_message=streaming_context.task_message,
917
- delta=ReasoningContentDelta(
918
- content_index=content_index,
919
- content_delta=event.data.delta,
920
- type="reasoning_content",
921
- ),
922
- type="delta",
913
+ content=complete_reasoning_content,
914
+ type="full",
923
915
  ),
924
916
  )
925
-
926
- elif isinstance(event.data, ResponseReasoningSummaryTextDoneEvent):
927
- # Handle reasoning summary text completion
928
- item_id = event.data.item_id
929
- summary_index = event.data.summary_index
930
-
931
- # We do NOT close the streaming context here as there can be multiple
932
- # reasoning summaries. The context will be closed when the entire
933
- # output item is done (ResponseOutputItemDoneEvent)
934
-
935
- # You would think they would use the event ResponseReasoningSummaryPartDoneEvent
936
- # to close the streaming context, but they do!!!
937
- # They output both a ResponseReasoningSummaryTextDoneEvent and a ResponseReasoningSummaryPartDoneEvent
938
- # I have no idea why they do this.
939
-
940
- elif isinstance(event.data, ResponseReasoningTextDoneEvent):
941
- # Handle reasoning content text completion
942
- item_id = event.data.item_id
943
- content_index = event.data.content_index
944
-
945
- # We do NOT close the streaming context here as there can be multiple
946
- # reasoning content texts. The context will be closed when the entire
947
- # output item is done (ResponseOutputItemDoneEvent)
917
+
918
+ await streaming_context.close()
919
+ unclosed_item_ids.discard(item_id)
920
+
948
921
 
949
922
  elif isinstance(event.data, ResponseOutputItemDoneEvent):
950
923
  # Handle item completion
@@ -23,6 +23,7 @@ from temporalio.converter import (
23
23
  JSONPlainPayloadConverter,
24
24
  _JSONTypeConverterUnhandled,
25
25
  )
26
+ from temporalio.contrib.openai_agents import OpenAIAgentsPlugin
26
27
 
27
28
  from agentex.lib.utils.logging import make_logger
28
29
  from agentex.lib.utils.registration import register_agent
@@ -81,18 +82,27 @@ async def get_temporal_client(temporal_address: str, metrics_url: str | None = N
81
82
  if plugins != []: # We don't need to validate the plugins if they are empty
82
83
  _validate_plugins(plugins)
83
84
 
85
+ # Check if OpenAI plugin is present - it needs to configure its own data converter
86
+ has_openai_plugin = any(
87
+ isinstance(p, OpenAIAgentsPlugin) for p in (plugins or [])
88
+ )
89
+
90
+ # Build connection kwargs
91
+ connect_kwargs = {
92
+ "target_host": temporal_address,
93
+ "plugins": plugins,
94
+ }
95
+
96
+ # Only set data_converter if OpenAI plugin is not present
97
+ if not has_openai_plugin:
98
+ connect_kwargs["data_converter"] = custom_data_converter
99
+
84
100
  if not metrics_url:
85
- client = await Client.connect(
86
- target_host=temporal_address, data_converter=custom_data_converter, plugins=plugins
87
- )
101
+ client = await Client.connect(**connect_kwargs)
88
102
  else:
89
103
  runtime = Runtime(telemetry=TelemetryConfig(metrics=OpenTelemetryConfig(url=metrics_url)))
90
- client = await Client.connect(
91
- target_host=temporal_address,
92
- data_converter=custom_data_converter,
93
- runtime=runtime,
94
- plugins=plugins,
95
- )
104
+ connect_kwargs["runtime"] = runtime
105
+ client = await Client.connect(**connect_kwargs)
96
106
  return client
97
107
 
98
108
 
@@ -102,7 +112,7 @@ class AgentexWorker:
102
112
  task_queue,
103
113
  max_workers: int = 10,
104
114
  max_concurrent_activities: int = 10,
105
- health_check_port: int = 80,
115
+ health_check_port: int = int(os.environ.get("HEALTH_CHECK_PORT")),
106
116
  plugins: list = [],
107
117
  ):
108
118
  self.task_queue = task_queue
@@ -8,6 +8,7 @@ from scale_gp_beta.lib.tracing.span import Span as SGPSpan
8
8
  from agentex.types.span import Span
9
9
  from agentex.lib.types.tracing import SGPTracingProcessorConfig
10
10
  from agentex.lib.utils.logging import make_logger
11
+ from agentex.lib.environment_variables import EnvironmentVariables
11
12
  from agentex.lib.core.tracing.processors.tracing_processor_interface import (
12
13
  SyncTracingProcessor,
13
14
  AsyncTracingProcessor,
@@ -24,9 +25,24 @@ class SGPSyncTracingProcessor(SyncTracingProcessor):
24
25
  disabled=disabled,
25
26
  )
26
27
  self._spans: dict[str, SGPSpan] = {}
28
+ self.env_vars = EnvironmentVariables.refresh()
29
+
30
+ def _add_source_to_span(self, span: Span) -> None:
31
+ if span.data is None:
32
+ span.data = {}
33
+ if isinstance(span.data, dict):
34
+ span.data["__source__"] = "agentex"
35
+ if self.env_vars.ACP_TYPE is not None:
36
+ span.data["__acp_type__"] = self.env_vars.ACP_TYPE
37
+ if self.env_vars.AGENT_NAME is not None:
38
+ span.data["__agent_name__"] = self.env_vars.AGENT_NAME
39
+ if self.env_vars.AGENT_ID is not None:
40
+ span.data["__agent_id__"] = self.env_vars.AGENT_ID
27
41
 
28
42
  @override
29
43
  def on_span_start(self, span: Span) -> None:
44
+ self._add_source_to_span(span)
45
+
30
46
  sgp_span = create_span(
31
47
  name=span.name,
32
48
  span_id=span.id,
@@ -50,6 +66,7 @@ class SGPSyncTracingProcessor(SyncTracingProcessor):
50
66
  )
51
67
  return
52
68
 
69
+ self._add_source_to_span(span)
53
70
  sgp_span.output = span.output # type: ignore[assignment]
54
71
  sgp_span.metadata = span.data # type: ignore[assignment]
55
72
  sgp_span.end_time = span.end_time.isoformat() # type: ignore[union-attr]
@@ -70,9 +87,23 @@ class SGPAsyncTracingProcessor(AsyncTracingProcessor):
70
87
  if not self.disabled
71
88
  else None
72
89
  )
90
+ self.env_vars = EnvironmentVariables.refresh()
91
+
92
+ def _add_source_to_span(self, span: Span) -> None:
93
+ if span.data is None:
94
+ span.data = {}
95
+ if isinstance(span.data, dict):
96
+ span.data["__source__"] = "agentex"
97
+ if self.env_vars.ACP_TYPE is not None:
98
+ span.data["__acp_type__"] = self.env_vars.ACP_TYPE
99
+ if self.env_vars.AGENT_NAME is not None:
100
+ span.data["__agent_name__"] = self.env_vars.AGENT_NAME
101
+ if self.env_vars.AGENT_ID is not None:
102
+ span.data["__agent_id__"] = self.env_vars.AGENT_ID
73
103
 
74
104
  @override
75
105
  async def on_span_start(self, span: Span) -> None:
106
+ self._add_source_to_span(span)
76
107
  sgp_span = create_span(
77
108
  name=span.name,
78
109
  span_id=span.id,
@@ -85,6 +116,7 @@ class SGPAsyncTracingProcessor(AsyncTracingProcessor):
85
116
  sgp_span.start_time = span.start_time.isoformat() # type: ignore[union-attr]
86
117
 
87
118
  if self.disabled:
119
+ logger.warning("SGP is disabled, skipping span upsert")
88
120
  return
89
121
  await self.sgp_async_client.spans.upsert_batch( # type: ignore[union-attr]
90
122
  items=[sgp_span.to_request_params()]
@@ -101,6 +133,7 @@ class SGPAsyncTracingProcessor(AsyncTracingProcessor):
101
133
  )
102
134
  return
103
135
 
136
+ self._add_source_to_span(span)
104
137
  sgp_span.output = span.output # type: ignore[assignment]
105
138
  sgp_span.metadata = span.data # type: ignore[assignment]
106
139
  sgp_span.end_time = span.end_time.isoformat() # type: ignore[union-attr]
@@ -32,6 +32,8 @@ class EnvVarKeys(str, Enum):
32
32
  # Workflow Configuration
33
33
  WORKFLOW_NAME = "WORKFLOW_NAME"
34
34
  WORKFLOW_TASK_QUEUE = "WORKFLOW_TASK_QUEUE"
35
+ # Temporal Worker Configuration
36
+ HEALTH_CHECK_PORT = "HEALTH_CHECK_PORT"
35
37
  # Auth Configuration
36
38
  AUTH_PRINCIPAL_B64 = "AUTH_PRINCIPAL_B64"
37
39
  # Build Information
@@ -65,6 +67,9 @@ class EnvironmentVariables(BaseModel):
65
67
  # Workflow Configuration
66
68
  WORKFLOW_TASK_QUEUE: str | None = None
67
69
  WORKFLOW_NAME: str | None = None
70
+ # Temporal Worker Configuration
71
+ HEALTH_CHECK_PORT: int = 80
72
+ # Auth Configuration
68
73
  AUTH_PRINCIPAL_B64: str | None = None
69
74
  # Build Information
70
75
  BUILD_INFO_PATH: str | None = None
@@ -45,6 +45,7 @@ class TemporalConfig(BaseModel):
45
45
  enabled: Whether this agent uses Temporal workflows
46
46
  workflow: The temporal workflow configuration
47
47
  workflows: The list of temporal workflow configurations
48
+ health_check_port: Port for temporal worker health check endpoint
48
49
  """
49
50
 
50
51
  enabled: bool = Field(
@@ -58,6 +59,10 @@ class TemporalConfig(BaseModel):
58
59
  default=None,
59
60
  description="List of temporal workflow configurations. Used when enabled=true.",
60
61
  )
62
+ health_check_port: int | None = Field(
63
+ default=None,
64
+ description="Port for temporal worker health check endpoint. Defaults to 80 if not specified.",
65
+ )
61
66
 
62
67
  @validator("workflows")
63
68
  def validate_workflows_not_empty(cls, v):
@@ -49,8 +49,8 @@ def print_task_message(
49
49
 
50
50
  # Skip empty reasoning messages
51
51
  if isinstance(message.content, ReasoningContent):
52
- has_summary = message.content.summary and any(s for s in message.content.summary if s)
53
- has_content = message.content.content and any(c for c in message.content.content if c)
52
+ has_summary = bool(message.content.summary) and any(s for s in message.content.summary if s)
53
+ has_content = bool(message.content.content) and any(c for c in message.content.content if c) if message.content.content is not None else False
54
54
  if not has_summary and not has_content:
55
55
  return
56
56
 
@@ -135,18 +135,19 @@ def print_task_message(
135
135
 
136
136
  if rich_print and console:
137
137
  author_color = "bright_cyan" if message.content.author == "user" else "green"
138
- title = f"[bold {author_color}]{message.content.author.upper()}[/bold {author_color}] [{timestamp}]"
139
138
 
140
- # Use different border styles for tool messages
139
+ # Use different border styles and colors for different content types
141
140
  if content_type == "tool_request":
142
141
  border_style = "yellow"
143
142
  elif content_type == "tool_response":
144
143
  border_style = "bright_green"
145
144
  elif content_type == "reasoning":
146
145
  border_style = "bright_magenta"
146
+ author_color = "bright_magenta" # Also make the author text magenta
147
147
  else:
148
148
  border_style = author_color
149
-
149
+
150
+ title = f"[bold {author_color}]{message.content.author.upper()}[/bold {author_color}] [{timestamp}]"
150
151
  panel = Panel(Markdown(content), title=title, border_style=border_style, width=80)
151
152
  console.print(panel)
152
153
  else:
@@ -329,7 +330,7 @@ def subscribe_to_async_task_messages(
329
330
 
330
331
  # Deserialize the discriminated union TaskMessageUpdate based on the "type" field
331
332
  message_type = task_message_update_data.get("type", "unknown")
332
-
333
+
333
334
  # Handle different message types for streaming progress
334
335
  if message_type == "start":
335
336
  task_message_update = StreamTaskMessageStart.model_validate(task_message_update_data)
@@ -359,6 +360,9 @@ def subscribe_to_async_task_messages(
359
360
  if index in active_spinners:
360
361
  active_spinners[index].stop()
361
362
  del active_spinners[index]
363
+ # Ensure clean line after spinner
364
+ if print_messages:
365
+ print()
362
366
 
363
367
  if task_message_update.parent_task_message and task_message_update.parent_task_message.id:
364
368
  finished_message = client.messages.retrieve(task_message_update.parent_task_message.id)
@@ -373,6 +377,9 @@ def subscribe_to_async_task_messages(
373
377
  if index in active_spinners:
374
378
  active_spinners[index].stop()
375
379
  del active_spinners[index]
380
+ # Ensure clean line after spinner
381
+ if print_messages:
382
+ print()
376
383
 
377
384
  if task_message_update.parent_task_message and task_message_update.parent_task_message.id:
378
385
  finished_message = client.messages.retrieve(task_message_update.parent_task_message.id)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: agentex-sdk
3
- Version: 0.4.21
3
+ Version: 0.4.23
4
4
  Summary: The official Python library for the agentex API
5
5
  Project-URL: Homepage, https://github.com/scaleapi/agentex-python
6
6
  Project-URL: Repository, https://github.com/scaleapi/agentex-python
@@ -11,7 +11,7 @@ agentex/_resource.py,sha256=S1t7wmR5WUvoDIhZjo_x-E7uoTJBynJ3d8tPJMQYdjw,1106
11
11
  agentex/_response.py,sha256=Tb9zazsnemO2rTxWtBjAD5WBqlhli5ZaXGbiKgdu5DE,28794
12
12
  agentex/_streaming.py,sha256=FNGJExRCF-vTRUZHFKUfoAWFhDGOB3XbioVCF37Jr7E,10104
13
13
  agentex/_types.py,sha256=lO491FSd7vM_uBp7-TvItbauEAH8SsEPYcyNO_5lKGM,7297
14
- agentex/_version.py,sha256=QlKIj-0yz0xu7DzzyrkGCF4wpdbuPsVO94aYwFpAFTM,159
14
+ agentex/_version.py,sha256=4njgHZ4Kzii3zftW-zFjNSDQOCBq1h6iuX7jYqkNa6s,159
15
15
  agentex/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
16
16
  agentex/_utils/__init__.py,sha256=7fch0GT9zpNnErbciSpUNa-SjTxxjY6kxHxKMOM4AGs,2305
17
17
  agentex/_utils/_compat.py,sha256=D8gtAvjJQrDWt9upS0XaG9Rr5l1QhiAx_I_1utT_tt0,1195
@@ -27,7 +27,7 @@ agentex/_utils/_typing.py,sha256=fb420NYkXitEaod2CiEH-hCtzG1z9WKUQiFtuukHtr4,496
27
27
  agentex/_utils/_utils.py,sha256=D2QE7mVPNEJzaB50u8rvDQAUDS5jx7JoeFD7zdj-TeI,12231
28
28
  agentex/lib/.keep,sha256=wuNrz-5SXo3jJaJOJgz4vFHM41YH_g20F5cRQo0vLes,224
29
29
  agentex/lib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
30
- agentex/lib/environment_variables.py,sha256=Ic36rWwEUoOmqbwBRLY1NpEHxqyT8y7arEwx5uNqI1Y,3401
30
+ agentex/lib/environment_variables.py,sha256=IYUlG6a7r8f99FhNMuXnzQSg5WRFqsZtrtYMpIUqG4c,3574
31
31
  agentex/lib/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
32
32
  agentex/lib/adk/__init__.py,sha256=6qv_lmJK5n-MPDQyYpeNvEMJxfdIxVAUcb_2LohJHmM,1210
33
33
  agentex/lib/adk/_modules/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -64,7 +64,7 @@ agentex/lib/cli/handlers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZ
64
64
  agentex/lib/cli/handlers/agent_handlers.py,sha256=xy2kXo7poV270yFLyqXNbZ79d_sq_vl5JAs93okYMHY,5604
65
65
  agentex/lib/cli/handlers/cleanup_handlers.py,sha256=T6ekNCBr2FV19r4jZiKSeoheQWihy2H1Q6fvWUVeUiw,7073
66
66
  agentex/lib/cli/handlers/deploy_handlers.py,sha256=ca1WaLiY_1IzUN2JNay8noW7MaVk66Zow73vwEzFs20,16215
67
- agentex/lib/cli/handlers/run_handlers.py,sha256=nSG9YuA6XOKP3uUIWK0_eC_yNmbaLuLB7uBlFqiSZ7g,15576
67
+ agentex/lib/cli/handlers/run_handlers.py,sha256=jhkUdiSz-ZL5NLOtgdUzUboxZeobJdUmjnF2lArSiig,15815
68
68
  agentex/lib/cli/handlers/secret_handlers.py,sha256=hozcJJwWfECFtv_SdQnThcrhnKsiBm3y1jG1MqxVcoc,24851
69
69
  agentex/lib/cli/templates/default/.dockerignore.j2,sha256=hweGFxw5eDZYsb5EnRHpv27o9M1HF2PEWOxqsfBBcAE,320
70
70
  agentex/lib/cli/templates/default/Dockerfile-uv.j2,sha256=9-xbz3mh5yGuSxtQ6FRltzY45OyUzvi1ZmlfwOioK-M,1085
@@ -92,7 +92,7 @@ agentex/lib/cli/templates/temporal/Dockerfile.j2,sha256=N1Z73jb8pnxsjP9zbs-tSyNH
92
92
  agentex/lib/cli/templates/temporal/README.md.j2,sha256=xIR3j97RA2F2x1PjfJTJ83YhoU108vS9WO1bZmM1vj8,10855
93
93
  agentex/lib/cli/templates/temporal/dev.ipynb.j2,sha256=8xY82gVfQ0mhzlEZzI4kLqIXCF19YgimLnpEirDMX8I,3395
94
94
  agentex/lib/cli/templates/temporal/environments.yaml.j2,sha256=zu7-nGRt_LF3qmWFxR_izTUOYQXuDZeypEVa03kVW10,2096
95
- agentex/lib/cli/templates/temporal/manifest.yaml.j2,sha256=Ic2CjQ-4tNCQhJ3phhAUj7a3xzijXegZ976glgj0-sg,4569
95
+ agentex/lib/cli/templates/temporal/manifest.yaml.j2,sha256=rDN3UXlk2hc28J3cTxxAzK8he-m9rKl3R_WTW8OazA4,4690
96
96
  agentex/lib/cli/templates/temporal/pyproject.toml.j2,sha256=MoR1g6KnGOQrXWOXhFKMw561kgpxy0tdom0KLtQe8A8,548
97
97
  agentex/lib/cli/templates/temporal/requirements.txt.j2,sha256=iTmO-z8qFkUa1jTctFCs0WYuq7Sqi6VNQAwATakh2fQ,94
98
98
  agentex/lib/cli/templates/temporal/project/acp.py.j2,sha256=dz51AJqqXAbqa0TSwRS6PXU0HwqllvYeCGYEreU9zSM,2472
@@ -134,7 +134,7 @@ agentex/lib/core/services/adk/acp/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeR
134
134
  agentex/lib/core/services/adk/acp/acp.py,sha256=baMH0lL5OGvCJE2Sk97i03jtfoRNB3g7S6aOD42jEMI,10971
135
135
  agentex/lib/core/services/adk/providers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
136
136
  agentex/lib/core/services/adk/providers/litellm.py,sha256=Ha7t71sxEdhi32uSDN-WN_Gy8F075W_sCUpRvhODbLI,10044
137
- agentex/lib/core/services/adk/providers/openai.py,sha256=fetbzsOKIALj0l7aIIij4mb7AUegdopom_AeIq0WRSk,53772
137
+ agentex/lib/core/services/adk/providers/openai.py,sha256=OVBBAYoN3Ned4hjprcflk7fBiz9Kh9JoyI4Ox4sDIPI,51978
138
138
  agentex/lib/core/services/adk/providers/sgp.py,sha256=biwoRD-ojUi1dpb9nHl1kJozO0PxqUpAwGysx-ZEnjw,3704
139
139
  agentex/lib/core/services/adk/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
140
140
  agentex/lib/core/services/adk/utils/templating.py,sha256=6Zv8XDhNfmE-xW307wzeQCLYqpVajR3IX8DSD2Hyc7c,2027
@@ -163,14 +163,14 @@ agentex/lib/core/temporal/services/temporal_task_service.py,sha256=W0L2GkSWwO2WZ
163
163
  agentex/lib/core/temporal/types/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
164
164
  agentex/lib/core/temporal/types/workflow.py,sha256=o8lBUloI44NTYFfbA1BLgzUneyN7aLbt042Eq_9OKo8,89
165
165
  agentex/lib/core/temporal/workers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
166
- agentex/lib/core/temporal/workers/worker.py,sha256=_ffvNWFXHDMWW4KN40OI_7plD9SdDHFvNbyCoHPAQAo,7813
166
+ agentex/lib/core/temporal/workers/worker.py,sha256=AtMBVMJMbGyLHg4NhpRic93y36SKGOYYxnrvGMdhWHM,8204
167
167
  agentex/lib/core/temporal/workflows/workflow.py,sha256=ZoWsrNPup69RnMHnuks1DRy9YsmK_nYdjsOosYVfFxw,723
168
168
  agentex/lib/core/tracing/__init__.py,sha256=07j9IRgZWFtZhdkk01l1nvaC5aCpygLWy94yXpYUZbM,229
169
169
  agentex/lib/core/tracing/trace.py,sha256=b-TnBMEdUsZzKq2jfXU-GvFNxrfm6l_-YJtcw1nhohU,8952
170
170
  agentex/lib/core/tracing/tracer.py,sha256=P2YGyAwQ82PtRjxiA0bnqbEePg_CVqpEngc9y8B2TAI,1846
171
171
  agentex/lib/core/tracing/tracing_processor_manager.py,sha256=jIQJeq0G0vew5bVKTOycOb9YWqGr6xm52vhuKVNMYPc,3779
172
172
  agentex/lib/core/tracing/processors/agentex_tracing_processor.py,sha256=DPC4gfrPWjMNjR2wbhHbMGOYHz-Ouadi-YyuTqFqFf0,3661
173
- agentex/lib/core/tracing/processors/sgp_tracing_processor.py,sha256=WMbnkSAgAdvLm0iT3Ppa4KmANrAmtIFBppxF-qum2nQ,4096
173
+ agentex/lib/core/tracing/processors/sgp_tracing_processor.py,sha256=U8S2TDX9jxqGJb7ALTQOb8wlbgD_Fio1zPlNgHopF1w,5628
174
174
  agentex/lib/core/tracing/processors/tracing_processor_interface.py,sha256=IY-9YrPm4BESP3e7_vMi0_lh_jomP6CxVyrSFDX0UBk,861
175
175
  agentex/lib/sdk/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
176
176
  agentex/lib/sdk/config/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -205,7 +205,7 @@ agentex/lib/sdk/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3h
205
205
  agentex/lib/sdk/utils/messages.py,sha256=xrBg3ujn-8egw4hNDNMHDj2lE18tPjVAqI0gO_oBJLo,8354
206
206
  agentex/lib/types/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
207
207
  agentex/lib/types/acp.py,sha256=BfRF4Fr1xUcKxZQhAysm2qagideSRjtqActO_kRkQMU,3974
208
- agentex/lib/types/agent_configs.py,sha256=9oyLuMNFF66Lio0fsIDWfBP1YWwYGiLAih5sm7BkZBs,2798
208
+ agentex/lib/types/agent_configs.py,sha256=AV5oEGwxghNf58_H9Xy72fISqWaU8D0UaYZycZ75y9Q,3047
209
209
  agentex/lib/types/agent_results.py,sha256=ev6WnPLfZRbhy2HnBmdIrZq1ExVeaweXoLRxYGspyWM,653
210
210
  agentex/lib/types/converters.py,sha256=IKywnGlsGwQ0fhr9t60c5rKpi63N1Oj8JzD4NeCB6SI,2285
211
211
  agentex/lib/types/credentials.py,sha256=k6gtiIqSsKuS8vgucgQAHzb8oUlFdTj4CLtU69sk6Wg,1442
@@ -229,7 +229,7 @@ agentex/lib/utils/regex.py,sha256=Y3VcehCznAqa59D4WTwK_ki722oudHBlFqBk0I930zo,21
229
229
  agentex/lib/utils/registration.py,sha256=2W3tKPJh23lLM26jVI0LBzkcmgXljVtDzL2yEnqf58U,4127
230
230
  agentex/lib/utils/temporal.py,sha256=sXo8OPMMXiyrF7OSBCJBuN_ufyQOD2bLOXgDbVZoyds,292
231
231
  agentex/lib/utils/dev_tools/__init__.py,sha256=oaHxw6ymfhNql-kzXHv3NWVHuqD4fHumasNXJG7kHTU,261
232
- agentex/lib/utils/dev_tools/async_messages.py,sha256=XAH_C5apccyymdTBM7Oe3O5PNweXzKh9rSPcl37YCvQ,19607
232
+ agentex/lib/utils/dev_tools/async_messages.py,sha256=NWzjhzQLBddA8KnGF3OdOAqHJM3Cin-9EJsLht4dgi4,20085
233
233
  agentex/resources/__init__.py,sha256=74rMqWBzQ2dSrKQqsrd7-jskPws0O_ogkFltvZO3HoU,3265
234
234
  agentex/resources/agents.py,sha256=gpITPi5moZ0QtUWByGqz1Ciqp9n42dpkjQ4DAafiQWM,47173
235
235
  agentex/resources/events.py,sha256=Zc9JhUm3bq2VFnBAolC0M7KZernzj1AjZ_vj0ibP4GY,10412
@@ -304,8 +304,8 @@ agentex/types/messages/batch_update_params.py,sha256=Ug5CThbD49a8j4qucg04OdmVrp_
304
304
  agentex/types/messages/batch_update_response.py,sha256=TbSBe6SuPzjXXWSj-nRjT1JHGBooTshHQQDa1AixQA8,278
305
305
  agentex/types/shared/__init__.py,sha256=IKs-Qn5Yja0kFh1G1kDqYZo43qrOu1hSoxlPdN-85dI,149
306
306
  agentex/types/shared/delete_response.py,sha256=8qH3zvQXaOHYQSHyXi7UQxdR4miTzR7V9K4zXVsiUyk,215
307
- agentex_sdk-0.4.21.dist-info/METADATA,sha256=jUNki_WEL6w1Z2eoW1ucdt82gQ6NqYl-uZGAsJtqiqQ,15198
308
- agentex_sdk-0.4.21.dist-info/WHEEL,sha256=C2FUgwZgiLbznR-k0b_5k3Ai_1aASOXDss3lzCUsUug,87
309
- agentex_sdk-0.4.21.dist-info/entry_points.txt,sha256=V7vJuMZdF0UlvgX6KiBN7XUvq_cxF5kplcYvc1QlFaQ,62
310
- agentex_sdk-0.4.21.dist-info/licenses/LICENSE,sha256=Q1AOx2FtRcMlyMgQJ9eVN2WKPq2mQ33lnB4tvWxabLA,11337
311
- agentex_sdk-0.4.21.dist-info/RECORD,,
307
+ agentex_sdk-0.4.23.dist-info/METADATA,sha256=oBtmlCZloXwosUBQxg3WLdSp10XwrslU80xcqTr4noI,15198
308
+ agentex_sdk-0.4.23.dist-info/WHEEL,sha256=C2FUgwZgiLbznR-k0b_5k3Ai_1aASOXDss3lzCUsUug,87
309
+ agentex_sdk-0.4.23.dist-info/entry_points.txt,sha256=V7vJuMZdF0UlvgX6KiBN7XUvq_cxF5kplcYvc1QlFaQ,62
310
+ agentex_sdk-0.4.23.dist-info/licenses/LICENSE,sha256=Q1AOx2FtRcMlyMgQJ9eVN2WKPq2mQ33lnB4tvWxabLA,11337
311
+ agentex_sdk-0.4.23.dist-info/RECORD,,