openai-sdk-helpers 0.6.0__tar.gz → 0.6.2__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.
Files changed (102) hide show
  1. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/PKG-INFO +12 -1
  2. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/README.md +11 -0
  3. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/pyproject.toml +1 -1
  4. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/agent/__init__.py +2 -0
  5. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/agent/base.py +88 -12
  6. openai_sdk_helpers-0.6.2/src/openai_sdk_helpers/agent/classifier.py +1079 -0
  7. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/agent/configuration.py +42 -0
  8. openai_sdk_helpers-0.6.2/src/openai_sdk_helpers/agent/files.py +120 -0
  9. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/agent/runner.py +9 -9
  10. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/agent/translator.py +2 -2
  11. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/files_api.py +46 -1
  12. openai_sdk_helpers-0.6.2/src/openai_sdk_helpers/prompt/classifier.jinja +47 -0
  13. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/settings.py +65 -0
  14. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/structure/__init__.py +4 -0
  15. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/structure/base.py +79 -55
  16. openai_sdk_helpers-0.6.2/src/openai_sdk_helpers/structure/classification.py +527 -0
  17. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/structure/plan/enum.py +4 -0
  18. openai_sdk_helpers-0.6.0/src/openai_sdk_helpers/agent/classifier.py +0 -268
  19. openai_sdk_helpers-0.6.0/src/openai_sdk_helpers/prompt/classifier.jinja +0 -26
  20. openai_sdk_helpers-0.6.0/src/openai_sdk_helpers/structure/classification.py +0 -305
  21. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/.gitignore +0 -0
  22. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/LICENSE +0 -0
  23. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/__init__.py +0 -0
  24. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/agent/coordinator.py +0 -0
  25. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/agent/search/__init__.py +0 -0
  26. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/agent/search/base.py +0 -0
  27. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/agent/search/vector.py +0 -0
  28. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/agent/search/web.py +0 -0
  29. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/agent/summarizer.py +0 -0
  30. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/agent/utils.py +0 -0
  31. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/agent/validator.py +0 -0
  32. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/cli.py +0 -0
  33. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/enums/__init__.py +0 -0
  34. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/enums/base.py +0 -0
  35. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/environment.py +0 -0
  36. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/errors.py +0 -0
  37. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/extract/__init__.py +0 -0
  38. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/extract/extractor.py +0 -0
  39. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/extract/generator.py +0 -0
  40. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/logging.py +0 -0
  41. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/prompt/__init__.py +0 -0
  42. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/prompt/base.py +0 -0
  43. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/prompt/extractor_config_agent_instructions.jinja +0 -0
  44. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/prompt/extractor_config_generator.jinja +0 -0
  45. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/prompt/extractor_config_generator_instructions.jinja +0 -0
  46. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/prompt/extractor_prompt_optimizer_agent_instructions.jinja +0 -0
  47. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/prompt/extractor_prompt_optimizer_request.jinja +0 -0
  48. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/prompt/summarizer.jinja +0 -0
  49. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/prompt/translator.jinja +0 -0
  50. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/prompt/validator.jinja +0 -0
  51. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/prompt/vector_planner.jinja +0 -0
  52. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/prompt/vector_search.jinja +0 -0
  53. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/prompt/vector_writer.jinja +0 -0
  54. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/py.typed +0 -0
  55. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/response/__init__.py +0 -0
  56. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/response/base.py +0 -0
  57. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/response/configuration.py +0 -0
  58. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/response/files.py +0 -0
  59. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/response/messages.py +0 -0
  60. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/response/planner.py +0 -0
  61. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/response/prompter.py +0 -0
  62. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/response/runner.py +0 -0
  63. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/response/tool_call.py +0 -0
  64. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/response/vector_store.py +0 -0
  65. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/streamlit_app/__init__.py +0 -0
  66. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/streamlit_app/app.py +0 -0
  67. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/streamlit_app/configuration.py +0 -0
  68. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/structure/agent_blueprint.py +0 -0
  69. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/structure/extraction.py +0 -0
  70. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/structure/plan/__init__.py +0 -0
  71. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/structure/plan/helpers.py +0 -0
  72. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/structure/plan/plan.py +0 -0
  73. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/structure/plan/task.py +0 -0
  74. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/structure/plan/types.py +0 -0
  75. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/structure/prompt.py +0 -0
  76. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/structure/responses.py +0 -0
  77. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/structure/summary.py +0 -0
  78. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/structure/translation.py +0 -0
  79. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/structure/validation.py +0 -0
  80. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/structure/vector_search.py +0 -0
  81. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/structure/web_search.py +0 -0
  82. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/tools.py +0 -0
  83. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/types.py +0 -0
  84. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/utils/__init__.py +0 -0
  85. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/utils/async_utils.py +0 -0
  86. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/utils/coercion.py +0 -0
  87. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/utils/encoding.py +0 -0
  88. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/utils/instructions.py +0 -0
  89. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/utils/json/__init__.py +0 -0
  90. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/utils/json/base_model.py +0 -0
  91. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/utils/json/data_class.py +0 -0
  92. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/utils/json/ref.py +0 -0
  93. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/utils/json/utils.py +0 -0
  94. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/utils/langextract.py +0 -0
  95. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/utils/output_validation.py +0 -0
  96. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/utils/path_utils.py +0 -0
  97. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/utils/registry.py +0 -0
  98. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/utils/validation.py +0 -0
  99. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/vector_storage/__init__.py +0 -0
  100. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/vector_storage/cleanup.py +0 -0
  101. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/vector_storage/storage.py +0 -0
  102. {openai_sdk_helpers-0.6.0 → openai_sdk_helpers-0.6.2}/src/openai_sdk_helpers/vector_storage/types.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openai-sdk-helpers
3
- Version: 0.6.0
3
+ Version: 0.6.2
4
4
  Summary: Composable helpers for OpenAI SDK agents, prompts, and storage
5
5
  Author: openai-sdk-helpers maintainers
6
6
  License: MIT
@@ -97,6 +97,7 @@ The `agent` module provides a higher-level abstraction for building agents, whil
97
97
  - **SummarizerAgent**: Generate concise summaries from provided text
98
98
  - **TranslatorAgent**: Translate text into target languages
99
99
  - **ValidatorAgent**: Check inputs and outputs against safety guardrails
100
+ - **TaxonomyClassifierAgent**: Classify text into taxonomy-driven labels
100
101
 
101
102
  #### Response Module (Built on `openai` SDK)
102
103
  - **Response handling utilities** for direct API control with fine-grained message management
@@ -210,12 +211,18 @@ These use the `agent` module built on `openai-agents` SDK:
210
211
  ```python
211
212
  from openai_sdk_helpers.agent import (
212
213
  SummarizerAgent,
214
+ TaxonomyClassifierAgent,
213
215
  TranslatorAgent,
214
216
  ValidatorAgent,
215
217
  )
218
+ from openai_sdk_helpers.structure import TaxonomyNode
216
219
 
217
220
  # Initialize agents with a default model
218
221
  summarizer = SummarizerAgent(default_model="gpt-4o-mini")
222
+ classifier = TaxonomyClassifierAgent(
223
+ model="gpt-4o-mini",
224
+ taxonomy=[TaxonomyNode(label="Billing"), TaxonomyNode(label="Support")],
225
+ )
219
226
  translator = TranslatorAgent(default_model="gpt-4o-mini")
220
227
  validator = ValidatorAgent(default_model="gpt-4o-mini")
221
228
 
@@ -227,6 +234,10 @@ print(summary.text)
227
234
  translation = translator.run_sync("Bonjour", target_language="English")
228
235
  print(translation)
229
236
 
237
+ # Classify text against a taxonomy
238
+ classification = classifier.run_sync("I need help with my invoice")
239
+ print(classification.final_node)
240
+
230
241
  # Validate against guardrails
231
242
  validation = validator.run_sync(
232
243
  "Share meeting notes with names removed",
@@ -59,6 +59,7 @@ The `agent` module provides a higher-level abstraction for building agents, whil
59
59
  - **SummarizerAgent**: Generate concise summaries from provided text
60
60
  - **TranslatorAgent**: Translate text into target languages
61
61
  - **ValidatorAgent**: Check inputs and outputs against safety guardrails
62
+ - **TaxonomyClassifierAgent**: Classify text into taxonomy-driven labels
62
63
 
63
64
  #### Response Module (Built on `openai` SDK)
64
65
  - **Response handling utilities** for direct API control with fine-grained message management
@@ -172,12 +173,18 @@ These use the `agent` module built on `openai-agents` SDK:
172
173
  ```python
173
174
  from openai_sdk_helpers.agent import (
174
175
  SummarizerAgent,
176
+ TaxonomyClassifierAgent,
175
177
  TranslatorAgent,
176
178
  ValidatorAgent,
177
179
  )
180
+ from openai_sdk_helpers.structure import TaxonomyNode
178
181
 
179
182
  # Initialize agents with a default model
180
183
  summarizer = SummarizerAgent(default_model="gpt-4o-mini")
184
+ classifier = TaxonomyClassifierAgent(
185
+ model="gpt-4o-mini",
186
+ taxonomy=[TaxonomyNode(label="Billing"), TaxonomyNode(label="Support")],
187
+ )
181
188
  translator = TranslatorAgent(default_model="gpt-4o-mini")
182
189
  validator = ValidatorAgent(default_model="gpt-4o-mini")
183
190
 
@@ -189,6 +196,10 @@ print(summary.text)
189
196
  translation = translator.run_sync("Bonjour", target_language="English")
190
197
  print(translation)
191
198
 
199
+ # Classify text against a taxonomy
200
+ classification = classifier.run_sync("I need help with my invoice")
201
+ print(classification.final_node)
202
+
192
203
  # Validate against guardrails
193
204
  validation = validator.run_sync(
194
205
  "Share meeting notes with names removed",
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "openai-sdk-helpers"
3
- version = "0.6.0"
3
+ version = "0.6.2"
4
4
  requires-python = ">=3.10"
5
5
  readme = "README.md"
6
6
  description = "Composable helpers for OpenAI SDK agents, prompts, and storage"
@@ -14,6 +14,7 @@ from .validator import ValidatorAgent
14
14
  from .utils import run_coroutine_agent_sync
15
15
  from .search.vector import VectorAgentSearch
16
16
  from .search.web import WebAgentSearch
17
+ from .files import build_agent_input_messages
17
18
 
18
19
  __all__ = [
19
20
  "AgentBase",
@@ -34,4 +35,5 @@ __all__ = [
34
35
  "ValidatorAgent",
35
36
  "VectorAgentSearch",
36
37
  "WebAgentSearch",
38
+ "build_agent_input_messages",
37
39
  ]
@@ -6,7 +6,7 @@ import logging
6
6
  import traceback
7
7
  import uuid
8
8
  from pathlib import Path
9
- from typing import TYPE_CHECKING, Any, Dict, Optional, Protocol, cast
9
+ from typing import TYPE_CHECKING, Any, Dict, Literal, Optional, Protocol, cast
10
10
 
11
11
  from agents import Agent, Handoff, InputGuardrail, OutputGuardrail, Session
12
12
  from agents.model_settings import ModelSettings
@@ -33,6 +33,7 @@ from .runner import run_async, run_sync
33
33
  if TYPE_CHECKING:
34
34
  from ..settings import OpenAISettings
35
35
  from ..response.base import ResponseBase
36
+ from ..files_api import FilePurpose, FilesAPIManager
36
37
 
37
38
 
38
39
  class AgentConfigurationProtocol(Protocol):
@@ -184,6 +185,8 @@ class AgentBase(DataclassJSONSerializable):
184
185
  Return response tool handler and definition for Responses API use.
185
186
  build_response(openai_settings, data_path=None, tool_handlers=None, system_vector_store=None)
186
187
  Build a ResponseBase instance based on this agent.
188
+ build_input_messages(content, files=None, files_manager=None, file_purpose="user_data", image_detail="auto")
189
+ Build Agents SDK input messages with optional file attachments.
187
190
  save_error(exc)
188
191
  Persist error details to a file named with the agent UUID.
189
192
  close()
@@ -429,9 +432,16 @@ class AgentBase(DataclassJSONSerializable):
429
432
  """
430
433
  return self._session
431
434
 
432
- def get_agent(self) -> Agent:
435
+ def get_agent(
436
+ self, output_structure: Optional[type[StructureBase]] = None
437
+ ) -> Agent:
433
438
  """Construct and return the configured :class:`agents.Agent` instance.
434
439
 
440
+ Parameters
441
+ ----------
442
+ output_structure : type[StructureBase] or None, default=None
443
+ Optional override for the agent output schema.
444
+
435
445
  Returns
436
446
  -------
437
447
  Agent
@@ -442,8 +452,9 @@ class AgentBase(DataclassJSONSerializable):
442
452
  "instructions": self._configuration.instructions_text or ".",
443
453
  "model": self._model,
444
454
  }
445
- if self._configuration.output_structure:
446
- agent_config["output_type"] = self._configuration.output_structure
455
+ output_type = output_structure or self._configuration.output_structure
456
+ if output_type is not None:
457
+ agent_config["output_type"] = output_type
447
458
  if self._configuration.tools:
448
459
  agent_config["tools"] = self._configuration.tools
449
460
  if self._model_settings:
@@ -459,7 +470,7 @@ class AgentBase(DataclassJSONSerializable):
459
470
 
460
471
  async def run_async(
461
472
  self,
462
- input: str,
473
+ input: str | list[dict[str, Any]],
463
474
  *,
464
475
  context: Optional[Dict[str, Any]] = None,
465
476
  output_structure: Optional[type[StructureBase]] = None,
@@ -469,8 +480,8 @@ class AgentBase(DataclassJSONSerializable):
469
480
 
470
481
  Parameters
471
482
  ----------
472
- input : str
473
- Prompt or query for the agent.
483
+ input : str or list[dict[str, Any]]
484
+ Prompt text or structured input for the agent.
474
485
  context : dict or None, default=None
475
486
  Optional dictionary passed to the agent.
476
487
  output_structure : type[StructureBase] or None, default=None
@@ -490,7 +501,7 @@ class AgentBase(DataclassJSONSerializable):
490
501
  session_to_use = session if session is not None else self._session
491
502
  try:
492
503
  return await run_async(
493
- agent=self.get_agent(),
504
+ agent=self.get_agent(output_structure=output_structure),
494
505
  input=input,
495
506
  context=context,
496
507
  output_structure=output_structure,
@@ -514,7 +525,7 @@ class AgentBase(DataclassJSONSerializable):
514
525
 
515
526
  def run_sync(
516
527
  self,
517
- input: str,
528
+ input: str | list[dict[str, Any]],
518
529
  *,
519
530
  context: Optional[Dict[str, Any]] = None,
520
531
  output_structure: Optional[type[StructureBase]] = None,
@@ -524,8 +535,8 @@ class AgentBase(DataclassJSONSerializable):
524
535
 
525
536
  Parameters
526
537
  ----------
527
- input : str
528
- Prompt or query for the agent.
538
+ input : str or list[dict[str, Any]]
539
+ Prompt text or structured input for the agent.
529
540
  context : dict or None, default=None
530
541
  Optional dictionary passed to the agent.
531
542
  output_structure : type[StructureBase] or None, default=None
@@ -545,7 +556,7 @@ class AgentBase(DataclassJSONSerializable):
545
556
  session_to_use = session if session is not None else self._session
546
557
  try:
547
558
  return run_sync(
548
- agent=self.get_agent(),
559
+ agent=self.get_agent(output_structure=output_structure),
549
560
  input=input,
550
561
  context=context,
551
562
  output_structure=output_structure,
@@ -652,6 +663,71 @@ class AgentBase(DataclassJSONSerializable):
652
663
  openai_settings=openai_settings,
653
664
  )
654
665
 
666
+ @staticmethod
667
+ def build_input_messages(
668
+ content: str | list[str],
669
+ files: str | list[str] | None = None,
670
+ *,
671
+ files_manager: FilesAPIManager | None = None,
672
+ openai_settings: OpenAISettings | None = None,
673
+ file_purpose: FilePurpose = "user_data",
674
+ image_detail: Literal["low", "high", "auto"] = "auto",
675
+ ) -> list[dict[str, Any]]:
676
+ """Build Agents SDK input messages with file attachments.
677
+
678
+ Parameters
679
+ ----------
680
+ content : str or list[str]
681
+ Prompt text or list of prompt texts to send.
682
+ files : str, list[str], or None, default None
683
+ Optional file path or list of file paths. Image files are sent as
684
+ base64-encoded ``input_image`` entries. Document files are uploaded
685
+ using ``files_manager`` and sent as ``input_file`` entries.
686
+ files_manager : FilesAPIManager or None, default None
687
+ File upload helper used to create file IDs for document uploads.
688
+ Required when ``files`` contains non-image documents.
689
+ openai_settings : OpenAISettings or None, default None
690
+ Optional OpenAI settings used to build a FilesAPIManager when one is
691
+ not provided. When supplied, ``openai_settings.create_client()`` is
692
+ used to initialize the Files API manager.
693
+ file_purpose : FilePurpose, default "user_data"
694
+ Purpose passed to the Files API when uploading document files.
695
+ image_detail : {"low", "high", "auto"}, default "auto"
696
+ Detail hint passed along with base64-encoded image inputs.
697
+
698
+ Returns
699
+ -------
700
+ list[dict[str, Any]]
701
+ Agents SDK input messages that include text and optional file entries.
702
+
703
+ Raises
704
+ ------
705
+ ValueError
706
+ If document files are provided without a ``files_manager``.
707
+
708
+ Examples
709
+ --------
710
+ >>> from openai import OpenAI
711
+ >>> from openai_sdk_helpers.files_api import FilesAPIManager
712
+ >>> client = OpenAI()
713
+ >>> files_manager = FilesAPIManager(client)
714
+ >>> messages = AgentBase.build_input_messages(
715
+ ... "Summarize this document",
716
+ ... files="report.pdf",
717
+ ... files_manager=files_manager,
718
+ ... )
719
+ """
720
+ from .files import build_agent_input_messages
721
+
722
+ return build_agent_input_messages(
723
+ content=content,
724
+ files=files,
725
+ files_manager=files_manager,
726
+ openai_settings=openai_settings,
727
+ file_purpose=file_purpose,
728
+ image_detail=image_detail,
729
+ )
730
+
655
731
  def _build_response_parameters(self) -> dict[str, Any]:
656
732
  """Build the Responses API parameter schema for this agent tool.
657
733