openai-agents 0.2.8__py3-none-any.whl → 0.6.8__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.
Files changed (96) hide show
  1. agents/__init__.py +105 -4
  2. agents/_debug.py +15 -4
  3. agents/_run_impl.py +1203 -96
  4. agents/agent.py +164 -19
  5. agents/apply_diff.py +329 -0
  6. agents/editor.py +47 -0
  7. agents/exceptions.py +35 -0
  8. agents/extensions/experimental/__init__.py +6 -0
  9. agents/extensions/experimental/codex/__init__.py +92 -0
  10. agents/extensions/experimental/codex/codex.py +89 -0
  11. agents/extensions/experimental/codex/codex_options.py +35 -0
  12. agents/extensions/experimental/codex/codex_tool.py +1142 -0
  13. agents/extensions/experimental/codex/events.py +162 -0
  14. agents/extensions/experimental/codex/exec.py +263 -0
  15. agents/extensions/experimental/codex/items.py +245 -0
  16. agents/extensions/experimental/codex/output_schema_file.py +50 -0
  17. agents/extensions/experimental/codex/payloads.py +31 -0
  18. agents/extensions/experimental/codex/thread.py +214 -0
  19. agents/extensions/experimental/codex/thread_options.py +54 -0
  20. agents/extensions/experimental/codex/turn_options.py +36 -0
  21. agents/extensions/handoff_filters.py +13 -1
  22. agents/extensions/memory/__init__.py +120 -0
  23. agents/extensions/memory/advanced_sqlite_session.py +1285 -0
  24. agents/extensions/memory/async_sqlite_session.py +239 -0
  25. agents/extensions/memory/dapr_session.py +423 -0
  26. agents/extensions/memory/encrypt_session.py +185 -0
  27. agents/extensions/memory/redis_session.py +261 -0
  28. agents/extensions/memory/sqlalchemy_session.py +334 -0
  29. agents/extensions/models/litellm_model.py +449 -36
  30. agents/extensions/models/litellm_provider.py +3 -1
  31. agents/function_schema.py +47 -5
  32. agents/guardrail.py +16 -2
  33. agents/{handoffs.py → handoffs/__init__.py} +89 -47
  34. agents/handoffs/history.py +268 -0
  35. agents/items.py +237 -11
  36. agents/lifecycle.py +75 -14
  37. agents/mcp/server.py +280 -37
  38. agents/mcp/util.py +24 -3
  39. agents/memory/__init__.py +22 -2
  40. agents/memory/openai_conversations_session.py +91 -0
  41. agents/memory/openai_responses_compaction_session.py +249 -0
  42. agents/memory/session.py +19 -261
  43. agents/memory/sqlite_session.py +275 -0
  44. agents/memory/util.py +20 -0
  45. agents/model_settings.py +14 -3
  46. agents/models/__init__.py +13 -0
  47. agents/models/chatcmpl_converter.py +303 -50
  48. agents/models/chatcmpl_helpers.py +63 -0
  49. agents/models/chatcmpl_stream_handler.py +290 -68
  50. agents/models/default_models.py +58 -0
  51. agents/models/interface.py +4 -0
  52. agents/models/openai_chatcompletions.py +103 -49
  53. agents/models/openai_provider.py +10 -4
  54. agents/models/openai_responses.py +162 -46
  55. agents/realtime/__init__.py +4 -0
  56. agents/realtime/_util.py +14 -3
  57. agents/realtime/agent.py +7 -0
  58. agents/realtime/audio_formats.py +53 -0
  59. agents/realtime/config.py +78 -10
  60. agents/realtime/events.py +18 -0
  61. agents/realtime/handoffs.py +2 -2
  62. agents/realtime/items.py +17 -1
  63. agents/realtime/model.py +13 -0
  64. agents/realtime/model_events.py +12 -0
  65. agents/realtime/model_inputs.py +18 -1
  66. agents/realtime/openai_realtime.py +696 -150
  67. agents/realtime/session.py +243 -23
  68. agents/repl.py +7 -3
  69. agents/result.py +197 -38
  70. agents/run.py +949 -168
  71. agents/run_context.py +13 -2
  72. agents/stream_events.py +1 -0
  73. agents/strict_schema.py +14 -0
  74. agents/tool.py +413 -15
  75. agents/tool_context.py +22 -1
  76. agents/tool_guardrails.py +279 -0
  77. agents/tracing/__init__.py +2 -0
  78. agents/tracing/config.py +9 -0
  79. agents/tracing/create.py +4 -0
  80. agents/tracing/processor_interface.py +84 -11
  81. agents/tracing/processors.py +65 -54
  82. agents/tracing/provider.py +64 -7
  83. agents/tracing/spans.py +105 -0
  84. agents/tracing/traces.py +116 -16
  85. agents/usage.py +134 -12
  86. agents/util/_json.py +19 -1
  87. agents/util/_transforms.py +12 -2
  88. agents/voice/input.py +5 -4
  89. agents/voice/models/openai_stt.py +17 -9
  90. agents/voice/pipeline.py +2 -0
  91. agents/voice/pipeline_config.py +4 -0
  92. {openai_agents-0.2.8.dist-info → openai_agents-0.6.8.dist-info}/METADATA +44 -19
  93. openai_agents-0.6.8.dist-info/RECORD +134 -0
  94. {openai_agents-0.2.8.dist-info → openai_agents-0.6.8.dist-info}/WHEEL +1 -1
  95. openai_agents-0.2.8.dist-info/RECORD +0 -103
  96. {openai_agents-0.2.8.dist-info → openai_agents-0.6.8.dist-info}/licenses/LICENSE +0 -0
agents/usage.py CHANGED
@@ -1,9 +1,56 @@
1
+ from __future__ import annotations
2
+
1
3
  from dataclasses import field
4
+ from typing import Annotated
2
5
 
6
+ from openai.types.completion_usage import CompletionTokensDetails, PromptTokensDetails
3
7
  from openai.types.responses.response_usage import InputTokensDetails, OutputTokensDetails
8
+ from pydantic import BeforeValidator
4
9
  from pydantic.dataclasses import dataclass
5
10
 
6
11
 
12
+ def _normalize_input_tokens_details(
13
+ v: InputTokensDetails | PromptTokensDetails | None,
14
+ ) -> InputTokensDetails:
15
+ """Converts None or PromptTokensDetails to InputTokensDetails."""
16
+ if v is None:
17
+ return InputTokensDetails(cached_tokens=0)
18
+ if isinstance(v, PromptTokensDetails):
19
+ return InputTokensDetails(cached_tokens=v.cached_tokens or 0)
20
+ return v
21
+
22
+
23
+ def _normalize_output_tokens_details(
24
+ v: OutputTokensDetails | CompletionTokensDetails | None,
25
+ ) -> OutputTokensDetails:
26
+ """Converts None or CompletionTokensDetails to OutputTokensDetails."""
27
+ if v is None:
28
+ return OutputTokensDetails(reasoning_tokens=0)
29
+ if isinstance(v, CompletionTokensDetails):
30
+ return OutputTokensDetails(reasoning_tokens=v.reasoning_tokens or 0)
31
+ return v
32
+
33
+
34
+ @dataclass
35
+ class RequestUsage:
36
+ """Usage details for a single API request."""
37
+
38
+ input_tokens: int
39
+ """Input tokens for this individual request."""
40
+
41
+ output_tokens: int
42
+ """Output tokens for this individual request."""
43
+
44
+ total_tokens: int
45
+ """Total tokens (input + output) for this individual request."""
46
+
47
+ input_tokens_details: InputTokensDetails
48
+ """Details about the input tokens for this individual request."""
49
+
50
+ output_tokens_details: OutputTokensDetails
51
+ """Details about the output tokens for this individual request."""
52
+
53
+
7
54
  @dataclass
8
55
  class Usage:
9
56
  requests: int = 0
@@ -12,32 +59,107 @@ class Usage:
12
59
  input_tokens: int = 0
13
60
  """Total input tokens sent, across all requests."""
14
61
 
15
- input_tokens_details: InputTokensDetails = field(
16
- default_factory=lambda: InputTokensDetails(cached_tokens=0)
17
- )
62
+ input_tokens_details: Annotated[
63
+ InputTokensDetails, BeforeValidator(_normalize_input_tokens_details)
64
+ ] = field(default_factory=lambda: InputTokensDetails(cached_tokens=0))
18
65
  """Details about the input tokens, matching responses API usage details."""
19
66
  output_tokens: int = 0
20
67
  """Total output tokens received, across all requests."""
21
68
 
22
- output_tokens_details: OutputTokensDetails = field(
23
- default_factory=lambda: OutputTokensDetails(reasoning_tokens=0)
24
- )
69
+ output_tokens_details: Annotated[
70
+ OutputTokensDetails, BeforeValidator(_normalize_output_tokens_details)
71
+ ] = field(default_factory=lambda: OutputTokensDetails(reasoning_tokens=0))
25
72
  """Details about the output tokens, matching responses API usage details."""
26
73
 
27
74
  total_tokens: int = 0
28
75
  """Total tokens sent and received, across all requests."""
29
76
 
30
- def add(self, other: "Usage") -> None:
77
+ request_usage_entries: list[RequestUsage] = field(default_factory=list)
78
+ """List of RequestUsage entries for accurate per-request cost calculation.
79
+
80
+ Each call to `add()` automatically creates an entry in this list if the added usage
81
+ represents a new request (i.e., has non-zero tokens).
82
+
83
+ Example:
84
+ For a run that makes 3 API calls with 100K, 150K, and 80K input tokens each,
85
+ the aggregated `input_tokens` would be 330K, but `request_usage_entries` would
86
+ preserve the [100K, 150K, 80K] breakdown, which could be helpful for detailed
87
+ cost calculation or context window management.
88
+ """
89
+
90
+ def __post_init__(self) -> None:
91
+ # Some providers don't populate optional token detail fields
92
+ # (cached_tokens, reasoning_tokens), and the OpenAI SDK's generated
93
+ # code can bypass Pydantic validation (e.g., via model_construct),
94
+ # allowing None values. We normalize these to 0 to prevent TypeErrors.
95
+ input_details_none = self.input_tokens_details is None
96
+ input_cached_none = (
97
+ not input_details_none and self.input_tokens_details.cached_tokens is None
98
+ )
99
+ if input_details_none or input_cached_none:
100
+ self.input_tokens_details = InputTokensDetails(cached_tokens=0)
101
+
102
+ output_details_none = self.output_tokens_details is None
103
+ output_reasoning_none = (
104
+ not output_details_none and self.output_tokens_details.reasoning_tokens is None
105
+ )
106
+ if output_details_none or output_reasoning_none:
107
+ self.output_tokens_details = OutputTokensDetails(reasoning_tokens=0)
108
+
109
+ def add(self, other: Usage) -> None:
110
+ """Add another Usage object to this one, aggregating all fields.
111
+
112
+ This method automatically preserves request_usage_entries.
113
+
114
+ Args:
115
+ other: The Usage object to add to this one.
116
+ """
31
117
  self.requests += other.requests if other.requests else 0
32
118
  self.input_tokens += other.input_tokens if other.input_tokens else 0
33
119
  self.output_tokens += other.output_tokens if other.output_tokens else 0
34
120
  self.total_tokens += other.total_tokens if other.total_tokens else 0
35
- self.input_tokens_details = InputTokensDetails(
36
- cached_tokens=self.input_tokens_details.cached_tokens
37
- + other.input_tokens_details.cached_tokens
121
+
122
+ # Null guards for nested token details (other may bypass validation via model_construct)
123
+ other_cached = (
124
+ other.input_tokens_details.cached_tokens
125
+ if other.input_tokens_details and other.input_tokens_details.cached_tokens
126
+ else 0
127
+ )
128
+ other_reasoning = (
129
+ other.output_tokens_details.reasoning_tokens
130
+ if other.output_tokens_details and other.output_tokens_details.reasoning_tokens
131
+ else 0
132
+ )
133
+ self_cached = (
134
+ self.input_tokens_details.cached_tokens
135
+ if self.input_tokens_details and self.input_tokens_details.cached_tokens
136
+ else 0
38
137
  )
138
+ self_reasoning = (
139
+ self.output_tokens_details.reasoning_tokens
140
+ if self.output_tokens_details and self.output_tokens_details.reasoning_tokens
141
+ else 0
142
+ )
143
+
144
+ self.input_tokens_details = InputTokensDetails(cached_tokens=self_cached + other_cached)
39
145
 
40
146
  self.output_tokens_details = OutputTokensDetails(
41
- reasoning_tokens=self.output_tokens_details.reasoning_tokens
42
- + other.output_tokens_details.reasoning_tokens
147
+ reasoning_tokens=self_reasoning + other_reasoning
43
148
  )
149
+
150
+ # Automatically preserve request_usage_entries.
151
+ # If the other Usage represents a single request with tokens, record it.
152
+ if other.requests == 1 and other.total_tokens > 0:
153
+ input_details = other.input_tokens_details or InputTokensDetails(cached_tokens=0)
154
+ output_details = other.output_tokens_details or OutputTokensDetails(reasoning_tokens=0)
155
+ request_usage = RequestUsage(
156
+ input_tokens=other.input_tokens,
157
+ output_tokens=other.output_tokens,
158
+ total_tokens=other.total_tokens,
159
+ input_tokens_details=input_details,
160
+ output_tokens_details=output_details,
161
+ )
162
+ self.request_usage_entries.append(request_usage)
163
+ elif other.request_usage_entries:
164
+ # If the other Usage already has individual request breakdowns, merge them.
165
+ self.request_usage_entries.extend(other.request_usage_entries)
agents/util/_json.py CHANGED
@@ -1,6 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
- from typing import Literal
3
+ from collections.abc import Iterable
4
+ from typing import Any, Literal
4
5
 
5
6
  from pydantic import TypeAdapter, ValidationError
6
7
  from typing_extensions import TypeVar
@@ -29,3 +30,20 @@ def validate_json(json_str: str, type_adapter: TypeAdapter[T], partial: bool) ->
29
30
  raise ModelBehaviorError(
30
31
  f"Invalid JSON when parsing {json_str} for {type_adapter}; {e}"
31
32
  ) from e
33
+
34
+
35
+ def _to_dump_compatible(obj: Any) -> Any:
36
+ return _to_dump_compatible_internal(obj)
37
+
38
+
39
+ def _to_dump_compatible_internal(obj: Any) -> Any:
40
+ if isinstance(obj, dict):
41
+ return {k: _to_dump_compatible_internal(v) for k, v in obj.items()}
42
+
43
+ if isinstance(obj, (list, tuple)):
44
+ return [_to_dump_compatible_internal(x) for x in obj]
45
+
46
+ if isinstance(obj, Iterable) and not isinstance(obj, (str, bytes, bytearray)):
47
+ return [_to_dump_compatible_internal(x) for x in obj]
48
+
49
+ return obj
@@ -1,11 +1,21 @@
1
1
  import re
2
2
 
3
+ from ..logger import logger
4
+
3
5
 
4
6
  def transform_string_function_style(name: str) -> str:
5
7
  # Replace spaces with underscores
6
8
  name = name.replace(" ", "_")
7
9
 
8
10
  # Replace non-alphanumeric characters with underscores
9
- name = re.sub(r"[^a-zA-Z0-9]", "_", name)
11
+ transformed_name = re.sub(r"[^a-zA-Z0-9_]", "_", name)
12
+
13
+ if transformed_name != name:
14
+ final_name = transformed_name.lower()
15
+ logger.warning(
16
+ f"Tool name {name!r} contains invalid characters for function calling and has been "
17
+ f"transformed to {final_name!r}. Please use only letters, digits, and underscores "
18
+ "to avoid potential naming conflicts."
19
+ )
10
20
 
11
- return name.lower()
21
+ return transformed_name.lower()
agents/voice/input.py CHANGED
@@ -13,7 +13,7 @@ DEFAULT_SAMPLE_RATE = 24000
13
13
 
14
14
 
15
15
  def _buffer_to_audio_file(
16
- buffer: npt.NDArray[np.int16 | np.float32],
16
+ buffer: npt.NDArray[np.int16 | np.float32 | np.float64],
17
17
  frame_rate: int = DEFAULT_SAMPLE_RATE,
18
18
  sample_width: int = 2,
19
19
  channels: int = 1,
@@ -77,12 +77,13 @@ class StreamedAudioInput:
77
77
  """
78
78
 
79
79
  def __init__(self):
80
- self.queue: asyncio.Queue[npt.NDArray[np.int16 | np.float32]] = asyncio.Queue()
80
+ self.queue: asyncio.Queue[npt.NDArray[np.int16 | np.float32] | None] = asyncio.Queue()
81
81
 
82
- async def add_audio(self, audio: npt.NDArray[np.int16 | np.float32]):
82
+ async def add_audio(self, audio: npt.NDArray[np.int16 | np.float32] | None):
83
83
  """Adds more audio data to the stream.
84
84
 
85
85
  Args:
86
- audio: The audio data to add. Must be a numpy array of int16 or float32.
86
+ audio: The audio data to add. Must be a numpy array of int16 or float32 or None.
87
+ If None passed, it indicates the end of the stream.
87
88
  """
88
89
  await self.queue.put(audio)
@@ -88,7 +88,7 @@ class OpenAISTTTranscriptionSession(StreamedTranscriptionSession):
88
88
  self._trace_include_sensitive_data = trace_include_sensitive_data
89
89
  self._trace_include_sensitive_audio_data = trace_include_sensitive_audio_data
90
90
 
91
- self._input_queue: asyncio.Queue[npt.NDArray[np.int16 | np.float32]] = input.queue
91
+ self._input_queue: asyncio.Queue[npt.NDArray[np.int16 | np.float32] | None] = input.queue
92
92
  self._output_queue: asyncio.Queue[str | ErrorSentinel | SessionCompleteSentinel] = (
93
93
  asyncio.Queue()
94
94
  )
@@ -122,7 +122,8 @@ class OpenAISTTTranscriptionSession(StreamedTranscriptionSession):
122
122
  return
123
123
 
124
124
  if self._tracing_span:
125
- if self._trace_include_sensitive_audio_data:
125
+ # Only encode audio if tracing is enabled AND buffer is not empty
126
+ if self._trace_include_sensitive_audio_data and self._turn_audio_buffer:
126
127
  self._tracing_span.span_data.input = _audio_to_base64(self._turn_audio_buffer)
127
128
 
128
129
  self._tracing_span.span_data.input_format = "pcm"
@@ -163,11 +164,16 @@ class OpenAISTTTranscriptionSession(StreamedTranscriptionSession):
163
164
  await self._websocket.send(
164
165
  json.dumps(
165
166
  {
166
- "type": "transcription_session.update",
167
+ "type": "session.update",
167
168
  "session": {
168
- "input_audio_format": "pcm16",
169
- "input_audio_transcription": {"model": self._model},
170
- "turn_detection": self._turn_detection,
169
+ "type": "transcription",
170
+ "audio": {
171
+ "input": {
172
+ "format": {"type": "audio/pcm", "rate": 24000},
173
+ "transcription": {"model": self._model},
174
+ "turn_detection": self._turn_detection,
175
+ }
176
+ },
171
177
  },
172
178
  }
173
179
  )
@@ -226,7 +232,10 @@ class OpenAISTTTranscriptionSession(StreamedTranscriptionSession):
226
232
  break
227
233
 
228
234
  event_type = event.get("type", "unknown")
229
- if event_type == "input_audio_transcription_completed":
235
+ if event_type in [
236
+ "input_audio_transcription_completed", # legacy
237
+ "conversation.item.input_audio_transcription.completed",
238
+ ]:
230
239
  transcript = cast(str, event.get("transcript", ""))
231
240
  if len(transcript) > 0:
232
241
  self._end_turn(transcript)
@@ -242,7 +251,7 @@ class OpenAISTTTranscriptionSession(StreamedTranscriptionSession):
242
251
  await self._output_queue.put(SessionCompleteSentinel())
243
252
 
244
253
  async def _stream_audio(
245
- self, audio_queue: asyncio.Queue[npt.NDArray[np.int16 | np.float32]]
254
+ self, audio_queue: asyncio.Queue[npt.NDArray[np.int16 | np.float32] | None]
246
255
  ) -> None:
247
256
  assert self._websocket is not None, "Websocket not initialized"
248
257
  self._start_turn()
@@ -275,7 +284,6 @@ class OpenAISTTTranscriptionSession(StreamedTranscriptionSession):
275
284
  "wss://api.openai.com/v1/realtime?intent=transcription",
276
285
  additional_headers={
277
286
  "Authorization": f"Bearer {self._client.api_key}",
278
- "OpenAI-Beta": "realtime=v1",
279
287
  "OpenAI-Log-Session": "1",
280
288
  },
281
289
  ) as ws:
agents/voice/pipeline.py CHANGED
@@ -91,6 +91,7 @@ class VoicePipeline:
91
91
  trace_id=None, # Automatically generated
92
92
  group_id=self.config.group_id,
93
93
  metadata=self.config.trace_metadata,
94
+ tracing=self.config.tracing,
94
95
  disabled=self.config.tracing_disabled,
95
96
  ):
96
97
  input_text = await self._process_audio_input(audio_input)
@@ -119,6 +120,7 @@ class VoicePipeline:
119
120
  trace_id=None,
120
121
  group_id=self.config.group_id,
121
122
  metadata=self.config.trace_metadata,
123
+ tracing=self.config.tracing,
122
124
  disabled=self.config.tracing_disabled,
123
125
  ):
124
126
  output = StreamedAudioResult(
@@ -3,6 +3,7 @@ from __future__ import annotations
3
3
  from dataclasses import dataclass, field
4
4
  from typing import Any
5
5
 
6
+ from ..tracing import TracingConfig
6
7
  from ..tracing.util import gen_group_id
7
8
  from .model import STTModelSettings, TTSModelSettings, VoiceModelProvider
8
9
  from .models.openai_model_provider import OpenAIVoiceModelProvider
@@ -18,6 +19,9 @@ class VoicePipelineConfig:
18
19
  tracing_disabled: bool = False
19
20
  """Whether to disable tracing of the pipeline. Defaults to `False`."""
20
21
 
22
+ tracing: TracingConfig | None = None
23
+ """Tracing configuration for this pipeline."""
24
+
21
25
  trace_include_sensitive_data: bool = True
22
26
  """Whether to include sensitive data in traces. Defaults to `True`. This is specifically for the
23
27
  voice pipeline, and not for anything that goes on inside your Workflow."""
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openai-agents
3
- Version: 0.2.8
3
+ Version: 0.6.8
4
4
  Summary: OpenAI Agents SDK
5
5
  Project-URL: Homepage, https://openai.github.io/openai-agents-python/
6
6
  Project-URL: Repository, https://github.com/openai/openai-agents-python
@@ -16,20 +16,31 @@ Classifier: Programming Language :: Python :: 3.10
16
16
  Classifier: Programming Language :: Python :: 3.11
17
17
  Classifier: Programming Language :: Python :: 3.12
18
18
  Classifier: Programming Language :: Python :: 3.13
19
+ Classifier: Programming Language :: Python :: 3.14
19
20
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
20
21
  Classifier: Typing :: Typed
21
22
  Requires-Python: >=3.9
22
23
  Requires-Dist: griffe<2,>=1.5.6
23
24
  Requires-Dist: mcp<2,>=1.11.0; python_version >= '3.10'
24
- Requires-Dist: openai<2,>=1.99.6
25
- Requires-Dist: pydantic<3,>=2.10
25
+ Requires-Dist: openai<3,>=2.9.0
26
+ Requires-Dist: pydantic<3,>=2.12.3
26
27
  Requires-Dist: requests<3,>=2.0
27
28
  Requires-Dist: types-requests<3,>=2.0
28
29
  Requires-Dist: typing-extensions<5,>=4.12.2
30
+ Provides-Extra: dapr
31
+ Requires-Dist: dapr>=1.16.0; extra == 'dapr'
32
+ Requires-Dist: grpcio>=1.60.0; extra == 'dapr'
33
+ Provides-Extra: encrypt
34
+ Requires-Dist: cryptography<46,>=45.0; extra == 'encrypt'
29
35
  Provides-Extra: litellm
30
- Requires-Dist: litellm<2,>=1.67.4.post1; extra == 'litellm'
36
+ Requires-Dist: litellm<2,>=1.81.0; extra == 'litellm'
31
37
  Provides-Extra: realtime
32
38
  Requires-Dist: websockets<16,>=15.0; extra == 'realtime'
39
+ Provides-Extra: redis
40
+ Requires-Dist: redis>=7; extra == 'redis'
41
+ Provides-Extra: sqlalchemy
42
+ Requires-Dist: asyncpg>=0.29.0; extra == 'sqlalchemy'
43
+ Requires-Dist: sqlalchemy>=2.0; extra == 'sqlalchemy'
33
44
  Provides-Extra: viz
34
45
  Requires-Dist: graphviz>=0.17; extra == 'viz'
35
46
  Provides-Extra: voice
@@ -37,7 +48,7 @@ Requires-Dist: numpy<3,>=2.2.0; (python_version >= '3.10') and extra == 'voice'
37
48
  Requires-Dist: websockets<16,>=15.0; extra == 'voice'
38
49
  Description-Content-Type: text/markdown
39
50
 
40
- # OpenAI Agents SDK
51
+ # OpenAI Agents SDK [![PyPI](https://img.shields.io/pypi/v/openai-agents?label=pypi%20package)](https://pypi.org/project/openai-agents/)
41
52
 
42
53
  The OpenAI Agents SDK is a lightweight yet powerful framework for building multi-agent workflows. It is provider-agnostic, supporting the OpenAI Responses and Chat Completions APIs, as well as 100+ other LLMs.
43
54
 
@@ -58,29 +69,32 @@ Explore the [examples](examples) directory to see the SDK in action, and read ou
58
69
 
59
70
  ## Get started
60
71
 
61
- 1. Set up your Python environment
72
+ To get started, set up your Python environment (Python 3.9 or newer required), and then install OpenAI Agents SDK package.
62
73
 
63
- - Option A: Using venv (traditional method)
74
+ ### venv
64
75
 
65
76
  ```bash
66
- python -m venv env
67
- source env/bin/activate # On Windows: env\Scripts\activate
77
+ python -m venv .venv
78
+ source .venv/bin/activate # On Windows: .venv\Scripts\activate
79
+ pip install openai-agents
68
80
  ```
69
81
 
70
- - Option B: Using uv (recommended)
82
+ For voice support, install with the optional `voice` group: `pip install 'openai-agents[voice]'`.
71
83
 
72
- ```bash
73
- uv venv
74
- source .venv/bin/activate # On Windows: .venv\Scripts\activate
75
- ```
84
+ For Redis session support, install with the optional `redis` group: `pip install 'openai-agents[redis]'`.
76
85
 
77
- 2. Install Agents SDK
86
+ ### uv
87
+
88
+ If you're familiar with [uv](https://docs.astral.sh/uv/), installing the package would be even easier:
78
89
 
79
90
  ```bash
80
- pip install openai-agents
91
+ uv init
92
+ uv add openai-agents
81
93
  ```
82
94
 
83
- For voice support, install with the optional `voice` group: `pip install 'openai-agents[voice]'`.
95
+ For voice support, install with the optional `voice` group: `uv add 'openai-agents[voice]'`.
96
+
97
+ For Redis session support, install with the optional `redis` group: `uv add 'openai-agents[redis]'`.
84
98
 
85
99
  ## Hello world example
86
100
 
@@ -194,7 +208,7 @@ The Agents SDK is designed to be highly flexible, allowing you to model a wide r
194
208
 
195
209
  ## Tracing
196
210
 
197
- The Agents SDK automatically traces your agent runs, making it easy to track and debug the behavior of your agents. Tracing is extensible by design, supporting custom spans and a wide variety of external destinations, including [Logfire](https://logfire.pydantic.dev/docs/integrations/llms/openai/#openai-agents), [AgentOps](https://docs.agentops.ai/v1/integrations/agentssdk), [Braintrust](https://braintrust.dev/docs/guides/traces/integrations#openai-agents-sdk), [Scorecard](https://docs.scorecard.io/docs/documentation/features/tracing#openai-agents-sdk-integration), and [Keywords AI](https://docs.keywordsai.co/integration/development-frameworks/openai-agent). For more details about how to customize or disable tracing, see [Tracing](http://openai.github.io/openai-agents-python/tracing), which also includes a larger list of [external tracing processors](http://openai.github.io/openai-agents-python/tracing/#external-tracing-processors-list).
211
+ The Agents SDK automatically traces your agent runs, making it easy to track and debug the behavior of your agents. Tracing is extensible by design, supporting custom spans and a wide variety of external destinations, including [Logfire](https://logfire.pydantic.dev/docs/integrations/llms/openai/#openai-agents), [AgentOps](https://docs.agentops.ai/v1/integrations/agentssdk), [Braintrust](https://braintrust.dev/docs/guides/traces/integrations#openai-agents-sdk), [Scorecard](https://docs.scorecard.io/docs/documentation/features/tracing#openai-agents-sdk-integration), [Keywords AI](https://docs.keywordsai.co/integration/development-frameworks/openai-agent), and many more. For more details about how to customize or disable tracing, see [Tracing](http://openai.github.io/openai-agents-python/tracing), which also includes a larger list of [external tracing processors](http://openai.github.io/openai-agents-python/tracing/#external-tracing-processors-list).
198
212
 
199
213
  ## Long running agents & human-in-the-loop
200
214
 
@@ -251,8 +265,13 @@ print(result.final_output) # "Approximately 39 million"
251
265
  ```python
252
266
  from agents import Agent, Runner, SQLiteSession
253
267
 
254
- # Custom SQLite database file
268
+ # SQLite - file-based or in-memory database
255
269
  session = SQLiteSession("user_123", "conversations.db")
270
+
271
+ # Redis - for scalable, distributed deployments
272
+ # from agents.extensions.memory import RedisSession
273
+ # session = RedisSession.from_url("user_123", url="redis://localhost:6379/0")
274
+
256
275
  agent = Agent(name="Assistant")
257
276
 
258
277
  # Different session IDs maintain separate conversation histories
@@ -337,6 +356,12 @@ make lint # run linter
337
356
  make format-check # run style checker
338
357
  ```
339
358
 
359
+ Format code if `make format-check` fails above by running:
360
+
361
+ ```
362
+ make format
363
+ ```
364
+
340
365
  ## Acknowledgements
341
366
 
342
367
  We'd like to acknowledge the excellent work of the open-source community, especially:
@@ -0,0 +1,134 @@
1
+ agents/__init__.py,sha256=MSjfVC-bRubVL_MiC26HyGGWDfGamKnVjFH5lgQ0JIA,10678
2
+ agents/_config.py,sha256=ANrM7GP2VSQehDkMc9qocxkUlPwqU-i5sieMJyEwxpM,796
3
+ agents/_debug.py,sha256=dRe2dUlA9bCLp6f8bAdiX7JfGyJuHyS_DRdW0kZshl0,856
4
+ agents/_run_impl.py,sha256=GRoDFPUBMIFH2GIlML-2y4vfPQitAR5rvsS70GIOqsQ,87957
5
+ agents/agent.py,sha256=3NxzJ2JJehTec2ApdB6Ol8MZ5sMoY2w4cJ_xzRLRIFk,24100
6
+ agents/agent_output.py,sha256=teTFK8unUN3esXhmEBO0bQGYQm1Axd5rYleDt9TFDgw,7153
7
+ agents/apply_diff.py,sha256=nqgXzrQl4Yeq52PENGd0H4hEAQPf5GS8_ufJlmNNPlQ,9952
8
+ agents/computer.py,sha256=XD44UgiUWSfniv-xKwwDP6wFKVwBiZkpaL1hO-0-7ZA,2516
9
+ agents/editor.py,sha256=SsWbJQughgigJovnH288kINdbCJRmUY_af-Zic7yQpU,1346
10
+ agents/exceptions.py,sha256=roJsYttB5i7FQlzRQNg8QSVdALZFz5u7kUeVvJdaitE,4156
11
+ agents/function_schema.py,sha256=njtbLt44DOkIU0a0U8TeDNEx-iQZU8oohwy3k7-k4A8,14855
12
+ agents/guardrail.py,sha256=XsAmkXHIOR_mi-ZkiBkxEmKrSlD-QId2OPpPnsCxmlY,10188
13
+ agents/items.py,sha256=_MMRNxuh_PAjh3eLMHxPS1aP-MBeMaMsfdT6GIe03QY,19448
14
+ agents/lifecycle.py,sha256=Z13gLTbj1uYgCgEEj7snWt898v0352FLn-IJAyxpWAU,4965
15
+ agents/logger.py,sha256=p_ef7vWKpBev5FFybPJjhrCCQizK08Yy1A2EDO1SNNg,60
16
+ agents/model_settings.py,sha256=NOV5evwpdylX5sXsroz1DWQn1gFZTRwEKo6C-dTK7rY,7181
17
+ agents/prompts.py,sha256=Ss5y_7s2HFcRAOAKu4WTxQszs5ybI8TfbxgEYdnj9sg,2231
18
+ agents/py.typed,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
19
+ agents/repl.py,sha256=NX0BE5YDnmGQ2rdQsmLm3CKkQZ5m4GC95xXmUsAXJVs,2539
20
+ agents/result.py,sha256=xuJrWfDvu3qDV8pk4u4PXTB-KxF-fHeZ1HIHyzjLSCI,17698
21
+ agents/run.py,sha256=mIjOGwBO63Wj4jJAhatW6dCXUrsGOcguG4oF4JhhXvQ,92373
22
+ agents/run_context.py,sha256=-jQBCayTjgDYE60ySKcqsq_tzW_sHXkpYmJNoynl5ec,1195
23
+ agents/stream_events.py,sha256=vW7O5T6iwFuRFvds1Bq3zMB60fRCz7lWryMkHSL-bAo,1733
24
+ agents/strict_schema.py,sha256=HFm4j753-UKDfJ0zSiQYf5V1qGuHY6TRm2zzwI0f0E0,6382
25
+ agents/tool.py,sha256=uodTVeL_LAipwOEnlluHATt3D15XySqhQ6lbGR3lizk,29644
26
+ agents/tool_context.py,sha256=TuaP5R5ShOOs27ZRiP-mBY9HQT3APz9FAGbXCzRKp-c,2094
27
+ agents/tool_guardrails.py,sha256=2uXEr_R5AWy9NHtBjd7G7upc3uZSuoP86Hfsc-qTadM,8344
28
+ agents/usage.py,sha256=rv_LkfoQeYHKvA5QNy3bl-bBpN19fSl4w5xlxYOggOg,6900
29
+ agents/version.py,sha256=_1knUwzSK-HUeZTpRUkk6Z-CIcurqXuEplbV5TLJ08E,230
30
+ agents/extensions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
31
+ agents/extensions/handoff_filters.py,sha256=greDlSFbYddps2uu6qLZQt8ts7UGO-BcAfp5OVCKKG0,2271
32
+ agents/extensions/handoff_prompt.py,sha256=oGWN0uNh3Z1L7E-Ev2up8W084fFrDNOsLDy7P6bcmic,1006
33
+ agents/extensions/visualization.py,sha256=sf9D_C-HMwkbWdZccTZvvMPRy_NSiwbm48tRJlESQBI,5144
34
+ agents/extensions/experimental/__init__.py,sha256=U4t2a9PPW6Sjb5LXSi1HiU3vfZR8lIU_dTdEy-TBR2A,177
35
+ agents/extensions/experimental/codex/__init__.py,sha256=wqCs_e7RHQbB0GBD66JIuzE2VoYL6yRo5iqsgvDCbiM,1914
36
+ agents/extensions/experimental/codex/codex.py,sha256=u5bqzKyVhH5nx8ZdwoOMJ482iXleg6eU5IL1InLIP5g,2932
37
+ agents/extensions/experimental/codex/codex_options.py,sha256=4mPW_GaTbPgRCnUIFC9MkUpUnXgteBsQZ01GjsWZiBg,1172
38
+ agents/extensions/experimental/codex/codex_tool.py,sha256=06Zjb48tKvPWrSip6Uq9N87STsTBx8_FFBYE-hmJMok,39164
39
+ agents/extensions/experimental/codex/events.py,sha256=eUiOcmfqWV3XvoOkVYIBecKb0Rum2h17XLvzNBLxv0I,4964
40
+ agents/extensions/experimental/codex/exec.py,sha256=YdaYRuwNLxffu5TFEnQ2Ism0onadOSXCyCF6GPHNLoQ,9223
41
+ agents/extensions/experimental/codex/items.py,sha256=or17cDgUZCfh4OkOqja2k_X7kr-25FNrZKf0aHs_vOs,7234
42
+ agents/extensions/experimental/codex/output_schema_file.py,sha256=Ych10pv8zvrzPV96_zVjHfr2fcnuEuDLtYpHV7vwF_E,1509
43
+ agents/extensions/experimental/codex/payloads.py,sha256=yS58UbMpGTbWeyFo7N_JWyvkFkcMt6bnDatlkWtjn7Q,892
44
+ agents/extensions/experimental/codex/thread.py,sha256=3HjWTf4eCKokWMdYSq9_aDUvwZaPWw39KUnVRX0CtRA,7129
45
+ agents/extensions/experimental/codex/thread_options.py,sha256=gNEFZhSOaIzXWxEQuzWI7Dh50jYsuNrYrEC_mVYgjJo,2095
46
+ agents/extensions/experimental/codex/turn_options.py,sha256=ANaichHiGPTdsRlbzsM7V1Lz8z3TUW7w-bHScPJ2oa8,1124
47
+ agents/extensions/memory/__init__.py,sha256=8HA24CtU_nG7gIUgw-5MNzMoLgHRqb5NjHxcHkdFw9E,4266
48
+ agents/extensions/memory/advanced_sqlite_session.py,sha256=rCrXM878foAuBN-rN2fibP2GHs-1hTtRx-TQcDKIfGI,52883
49
+ agents/extensions/memory/async_sqlite_session.py,sha256=HIdGi67bkmbX3Bv0_EqOiIKC-IMsa3i47apLe4y7N6A,8002
50
+ agents/extensions/memory/dapr_session.py,sha256=AZ2fOsHLqDIcS8Ash9jRYRsqB7lpcV1zJLeIMNVe41I,16663
51
+ agents/extensions/memory/encrypt_session.py,sha256=PVnZIEj50bjUq16OLnMKrbZiinLkrVpamPPEw8RnUCA,6485
52
+ agents/extensions/memory/redis_session.py,sha256=BuVV1JJ0Yd8fIjUmB5J-VyFNOn5TBI8tMGwLPcTDVNk,9724
53
+ agents/extensions/memory/sqlalchemy_session.py,sha256=fnlZkNF_XZekP44uhiR4rjlCkwG7JJEiFm35TJfiCtc,12325
54
+ agents/extensions/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
55
+ agents/extensions/models/litellm_model.py,sha256=hWKFTHKN5YgYW3k9d1TeQnqAp9hMckSEnB3pV-iuBqc,34727
56
+ agents/extensions/models/litellm_provider.py,sha256=ZHgh1nMoEvA7NpawkzLh3JDuDFtwXUV94Rs7UrwWqAk,1083
57
+ agents/handoffs/__init__.py,sha256=LAqmLzxHJey3zgKim8OF9mlrtqbKCeb2fRIpYrxQ8F4,13120
58
+ agents/handoffs/history.py,sha256=29RF-lIw8aq7wXFAXZiqnrW9bODqLHpwkIfkKi_3CBQ,9358
59
+ agents/mcp/__init__.py,sha256=yHmmYlrmEHzUas1inRLKL2iPqbb_-107G3gKe_tyg4I,750
60
+ agents/mcp/server.py,sha256=0cGwRZPHnESfKZrI5KRj0cHQsoJIpH75PW5bfCME6ys,36590
61
+ agents/mcp/util.py,sha256=HypJbTFTIZgWClqSknhtRjjzQcdqHhEfTt5Ff5W-qeI,8897
62
+ agents/memory/__init__.py,sha256=V4WXYGw4kxMCghhHTE0zYAVkLi7DKwkvLPoutLW_gx8,719
63
+ agents/memory/openai_conversations_session.py,sha256=FbV2YPbyTanBxY7pVcYQrlXTebsTKpRn7eIR6ESM1hU,3352
64
+ agents/memory/openai_responses_compaction_session.py,sha256=pj2lfgyquBH5eUjRWHQ2bc0sZ7xlvot-YPFCC9BEtn8,9434
65
+ agents/memory/session.py,sha256=smC7CzP3pf4I3u7xPNk4-ZkBE3IyHwKqOiHq-gn2yMk,3975
66
+ agents/memory/sqlite_session.py,sha256=Oh6g-7M51HR9EECHZZz_0-4yx2NaEYyeW2-AwdYxwfA,10098
67
+ agents/memory/util.py,sha256=ZAHOrNVA36xICFzuNgHgEA1_s_oEMO6Wsu6-EecY8JU,586
68
+ agents/models/__init__.py,sha256=E0XVqWayVAsFqxucDLBW30siaqfNQsVrAnfidG_C3ok,287
69
+ agents/models/_openai_shared.py,sha256=4Ngwo2Fv2RXY61Pqck1cYPkSln2tDnb8Ai-ao4QG-iE,836
70
+ agents/models/chatcmpl_converter.py,sha256=kP3A50j4ccwXAf9JA8a7PaPDPq1YKiwQBMLfApq3EPo,34121
71
+ agents/models/chatcmpl_helpers.py,sha256=UWwQpvh10EQUix3lFH8idXVuBiWZp1zw_Oiod7OGks4,3537
72
+ agents/models/chatcmpl_stream_handler.py,sha256=Usl00buiz4pr1mD8zF0tqVnSj8I9vMG7kzVAgenNG_s,37065
73
+ agents/models/default_models.py,sha256=mlvBePn8H4UkHo7lN-wh7A3k2ciLgBUFKpROQxzdTfs,2098
74
+ agents/models/fake_id.py,sha256=lbXjUUSMeAQ8eFx4V5QLUnBClHE6adJlYYav55RlG5w,268
75
+ agents/models/interface.py,sha256=-AFUHC8iRuGZmtQwguDw4s-M4OPL2y2mct4TAmWvVrU,4057
76
+ agents/models/multi_provider.py,sha256=aiDbls5G4YomPfN6qH1pGlj41WS5jlDp2T82zm6qcnM,5578
77
+ agents/models/openai_chatcompletions.py,sha256=dZygeKpRyUEx5jwZ6iAZ9KiRNB2zSVZotaaaX5C63Mc,15051
78
+ agents/models/openai_provider.py,sha256=5HQe92pYS4_eph-PNvLsOq7xJH8U9UoL0apZnyBMn6k,3809
79
+ agents/models/openai_responses.py,sha256=vebvi6OKGcO4v-ytLWdvUb7AwY-D0QhDDOcAj66Z4Yk,22377
80
+ agents/realtime/README.md,sha256=5YCYXH5ULmlWoWo1PE9TlbHjeYgjnp-xY8ZssSFY2Vk,126
81
+ agents/realtime/__init__.py,sha256=voXtgoWGR5ZFEipFDsXuz08rQDBAE6aMN4buBcpSlEI,5071
82
+ agents/realtime/_default_tracker.py,sha256=4OMxBvD1MnZmMn6JZYKL42uWhVzvK6NdDLDfPP54d78,1765
83
+ agents/realtime/_util.py,sha256=jYjvZcmwOiqKwrueCh_OpvlVUEXV4s-XPF-fgstVcp4,623
84
+ agents/realtime/agent.py,sha256=bkegBJ_lc3z3NtnlIyEkVZFxZWBJwVjsQVzpQZAu7PM,4283
85
+ agents/realtime/audio_formats.py,sha256=2_WYOpCkU1jsaTkscyDumqSz-anql5T43v3aeQvJGck,2117
86
+ agents/realtime/config.py,sha256=X0W18G9z3NrUDQOC-RYT5GLU2cJe4UXYcM21iLAuMRc,8199
87
+ agents/realtime/events.py,sha256=BkktfS4cCpz53Fn6Di-8kgRXlxzE9NvzqJFevDVE3uc,6084
88
+ agents/realtime/handoffs.py,sha256=pxLk0WQjRxyhqbRqGdL_iqd8vXK5F0vI1aIPFGnB2mI,6654
89
+ agents/realtime/items.py,sha256=5EG768FkKpbk-dhe4b_7BfFpdUEFWtxoiVUtNI9KXsc,5517
90
+ agents/realtime/model.py,sha256=jVZBhPRc2yDQfAFn2pqnnVNtkgsguKS8qO-KbQCtuEs,6774
91
+ agents/realtime/model_events.py,sha256=2NKofzLszKHwtlcsogsNnH6hdeFfO7S96yWDB4AlxB8,4340
92
+ agents/realtime/model_inputs.py,sha256=-pl8Oj0WVrA5Gt-dqP5Va3ZHqXyIXpsjMsf9UL-suEY,2789
93
+ agents/realtime/openai_realtime.py,sha256=9fjULSv7s2CpEochWdSiznJp_jqjZWQNfQycf__YtrQ,52984
94
+ agents/realtime/runner.py,sha256=KfU7utmc9QFH2htIKN2IN9H-5EnB0qN9ezmvlRTnOm4,2511
95
+ agents/realtime/session.py,sha256=7IykpeEeH_FhVHFTU58ie8TijBdfyzmYpFvFMlTdEc8,37200
96
+ agents/tracing/__init__.py,sha256=I3h0fuAcHCUhv6Wd3WPD9eTas1njM84YhQ0HYaYbcP0,3046
97
+ agents/tracing/config.py,sha256=D0NmDarZMQDc4uUplAAbbNVRjUpdKwjh-ooSqp9SAUw,185
98
+ agents/tracing/create.py,sha256=lu9RLqbE5dzq2JbTtQ9EhdN044FjjJOEIccd56T5PaY,18178
99
+ agents/tracing/logger.py,sha256=J4KUDRSGa7x5UVfUwWe-gbKwoaq8AeETRqkPt3QvtGg,68
100
+ agents/tracing/processor_interface.py,sha256=_kby-MyaJ9NSInZIoJi9tJlYkWsIlGm2WCeB8DhcPmY,4385
101
+ agents/tracing/processors.py,sha256=xy5MgB6f8tfHY9CKu2rHM5mcM70Ibwl68Fra3DogZ74,12014
102
+ agents/tracing/provider.py,sha256=PHMDTucLWgBAAKInDPvRxykneeTq5kh4Jt2viDY1Kns,12426
103
+ agents/tracing/scope.py,sha256=u17_m8RPpGvbHrTkaO_kDi5ROBWhfOAIgBe7suiaRD4,1445
104
+ agents/tracing/setup.py,sha256=2h9TH1GAKcXKM1U99dOKKR3XlHp8JKzh2JG3DQPKyhY,612
105
+ agents/tracing/span_data.py,sha256=nI2Fbu1ORE8ybE6m6RuddTJF5E5xFmEj8Mq5bSFv4bE,9017
106
+ agents/tracing/spans.py,sha256=KYtMIb_8M2Knikg_xqYJj-JFcDtocNpPU8-atpA3ZVA,9862
107
+ agents/tracing/traces.py,sha256=f4e2BF_ig3vXdTGiHX6NDhyMnU43GqaY89nuMUiLNYU,8398
108
+ agents/tracing/util.py,sha256=J7IZgVDmeW0aZDw8LBSjBKrlQbcOmaqZE7XQjolPwi8,490
109
+ agents/util/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
110
+ agents/util/_coro.py,sha256=S38XUYFC7bqTELSgMUBsAX1GoRlIrV7coupcUAWH__4,45
111
+ agents/util/_error_tracing.py,sha256=hdkYNx180b18lP0PSB1toE5atNHsMg_Bm9Osw812vLo,421
112
+ agents/util/_json.py,sha256=wC2NwwQspxo-PaZ3SmmlKS9KrBO5Gw4qkncpwtf86vA,1526
113
+ agents/util/_pretty_print.py,sha256=pnrM81KRG4G21jZnYrYBCkPgtUeP8qcnJm-9tpAV1WA,2738
114
+ agents/util/_transforms.py,sha256=9jbF1QGsUTxjxIDAUNg8HJdz7Z7kdo7KQvXNnzuZuiw,682
115
+ agents/util/_types.py,sha256=8KxYfCw0gYSMWcQmacJoc3Q7Lc46LmT-AWvhF10KJ-E,160
116
+ agents/voice/__init__.py,sha256=4VWBUjyoXC6dGFuk-oZQGg8T32bFxVwy371c-zDK-EU,1537
117
+ agents/voice/events.py,sha256=4aPAZC0__ocgmg_mcX4c1zv9Go-YdKIVItQ2kYgtye0,1216
118
+ agents/voice/exceptions.py,sha256=QcyfvaUTBe4gxbFP82oDSa_puzZ4Z4O4k01B8pAHnK0,233
119
+ agents/voice/imports.py,sha256=VaE5I8aJTP9Zl_0-y9dx1UcAP7KPRDMaikFK2jFnn8s,348
120
+ agents/voice/input.py,sha256=L4uriQOvMt5Sxn88pNrdeOyyA8KWVz2y4fOyvvVjd9s,3011
121
+ agents/voice/model.py,sha256=LWnIWEwU0-aFkff3kbTKkxejnYqzS2XHG5Qm2YcrzFI,5956
122
+ agents/voice/pipeline.py,sha256=Vgt6oNYQ68QTF2xocBLEAorh0eFKAL-va4LO24mcls4,6573
123
+ agents/voice/pipeline_config.py,sha256=n2pgGkEZheB4lAH7XmWEkNWg99p7yTbGUSz8TxH4fH0,1888
124
+ agents/voice/result.py,sha256=Yx9JCMGCE9OfXacaBFfFLQJRwkNo5-h4Nqm9OPnemU4,11107
125
+ agents/voice/utils.py,sha256=MrRomVqBLXeMAOue-Itwh0Fc5HjB0QCMKXclqFPhrbI,1309
126
+ agents/voice/workflow.py,sha256=m_-_4qU1gEE5gcGahiE2IrIimmRW2X1rR20zZEGivSc,3795
127
+ agents/voice/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
128
+ agents/voice/models/openai_model_provider.py,sha256=Khn0uT-VhsEbe7_OhBMGFQzXNwL80gcWZyTHl3CaBII,3587
129
+ agents/voice/models/openai_stt.py,sha256=Lb_F9160VNKDHXZ9zylSzeig7sB8lBjiYhQLDZsp6NQ,17257
130
+ agents/voice/models/openai_tts.py,sha256=4KoLQuFDHKu5a1VTJlu9Nj3MHwMlrn9wfT_liJDJ2dw,1477
131
+ openai_agents-0.6.8.dist-info/METADATA,sha256=BkDIcHAYOEC0bAi1KHWGBBuWcHUPsYz8r3uvdxlw-Fg,13303
132
+ openai_agents-0.6.8.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
133
+ openai_agents-0.6.8.dist-info/licenses/LICENSE,sha256=E994EspT7Krhy0qGiES7WYNzBHrh1YDk3r--8d1baRU,1063
134
+ openai_agents-0.6.8.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: hatchling 1.27.0
2
+ Generator: hatchling 1.28.0
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any