jaf-py 2.5.5__tar.gz → 2.5.8__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 (133) hide show
  1. {jaf_py-2.5.5/jaf_py.egg-info → jaf_py-2.5.8}/PKG-INFO +2 -2
  2. {jaf_py-2.5.5 → jaf_py-2.5.8}/README.md +1 -1
  3. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/__init__.py +1 -1
  4. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/core/agent_tool.py +2 -1
  5. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/core/engine.py +5 -2
  6. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/core/guardrails.py +2 -1
  7. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/core/streaming.py +2 -1
  8. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/core/tracing.py +1 -1
  9. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/core/types.py +1 -0
  10. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/providers/model.py +1 -0
  11. {jaf_py-2.5.5 → jaf_py-2.5.8/jaf_py.egg-info}/PKG-INFO +2 -2
  12. {jaf_py-2.5.5 → jaf_py-2.5.8}/pyproject.toml +1 -1
  13. {jaf_py-2.5.5 → jaf_py-2.5.8}/LICENSE +0 -0
  14. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/a2a/__init__.py +0 -0
  15. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/a2a/agent.py +0 -0
  16. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/a2a/agent_card.py +0 -0
  17. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/a2a/client.py +0 -0
  18. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/a2a/examples/__init__.py +0 -0
  19. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/a2a/examples/client_example.py +0 -0
  20. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/a2a/examples/integration_example.py +0 -0
  21. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/a2a/examples/rag_demo/__init__.py +0 -0
  22. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/a2a/examples/server_demo/__init__.py +0 -0
  23. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/a2a/examples/server_example.py +0 -0
  24. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/a2a/memory/__init__.py +0 -0
  25. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/a2a/memory/cleanup.py +0 -0
  26. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/a2a/memory/factory.py +0 -0
  27. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/a2a/memory/providers/__init__.py +0 -0
  28. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/a2a/memory/providers/composite.py +0 -0
  29. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/a2a/memory/providers/in_memory.py +0 -0
  30. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/a2a/memory/providers/postgres.py +0 -0
  31. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/a2a/memory/providers/redis.py +0 -0
  32. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/a2a/memory/serialization.py +0 -0
  33. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/a2a/memory/tests/__init__.py +0 -0
  34. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/a2a/memory/tests/run_comprehensive_tests.py +0 -0
  35. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/a2a/memory/tests/test_cleanup.py +0 -0
  36. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/a2a/memory/tests/test_serialization.py +0 -0
  37. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/a2a/memory/tests/test_stress_concurrency.py +0 -0
  38. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/a2a/memory/tests/test_task_lifecycle.py +0 -0
  39. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/a2a/memory/types.py +0 -0
  40. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/a2a/protocol.py +0 -0
  41. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/a2a/server.py +0 -0
  42. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/a2a/standalone_client.py +0 -0
  43. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/a2a/tests/__init__.py +0 -0
  44. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/a2a/tests/run_tests.py +0 -0
  45. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/a2a/tests/test_agent.py +0 -0
  46. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/a2a/tests/test_client.py +0 -0
  47. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/a2a/tests/test_integration.py +0 -0
  48. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/a2a/tests/test_protocol.py +0 -0
  49. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/a2a/tests/test_types.py +0 -0
  50. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/a2a/types.py +0 -0
  51. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/cli.py +0 -0
  52. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/core/__init__.py +0 -0
  53. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/core/analytics.py +0 -0
  54. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/core/composition.py +0 -0
  55. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/core/errors.py +0 -0
  56. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/core/handoff.py +0 -0
  57. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/core/parallel_agents.py +0 -0
  58. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/core/performance.py +0 -0
  59. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/core/proxy.py +0 -0
  60. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/core/proxy_helpers.py +0 -0
  61. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/core/regeneration.py +0 -0
  62. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/core/state.py +0 -0
  63. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/core/tool_results.py +0 -0
  64. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/core/tools.py +0 -0
  65. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/core/workflows.py +0 -0
  66. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/exceptions.py +0 -0
  67. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/memory/__init__.py +0 -0
  68. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/memory/approval_storage.py +0 -0
  69. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/memory/factory.py +0 -0
  70. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/memory/providers/__init__.py +0 -0
  71. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/memory/providers/in_memory.py +0 -0
  72. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/memory/providers/postgres.py +0 -0
  73. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/memory/providers/redis.py +0 -0
  74. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/memory/types.py +0 -0
  75. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/memory/utils.py +0 -0
  76. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/plugins/__init__.py +0 -0
  77. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/plugins/base.py +0 -0
  78. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/policies/__init__.py +0 -0
  79. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/policies/handoff.py +0 -0
  80. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/policies/validation.py +0 -0
  81. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/providers/__init__.py +0 -0
  82. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/providers/mcp.py +0 -0
  83. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/server/__init__.py +0 -0
  84. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/server/main.py +0 -0
  85. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/server/server.py +0 -0
  86. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/server/types.py +0 -0
  87. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/utils/__init__.py +0 -0
  88. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/utils/attachments.py +0 -0
  89. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/utils/document_processor.py +0 -0
  90. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/visualization/__init__.py +0 -0
  91. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/visualization/example.py +0 -0
  92. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/visualization/functional_core.py +0 -0
  93. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/visualization/graphviz.py +0 -0
  94. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/visualization/imperative_shell.py +0 -0
  95. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf/visualization/types.py +0 -0
  96. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf_py.egg-info/SOURCES.txt +0 -0
  97. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf_py.egg-info/dependency_links.txt +0 -0
  98. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf_py.egg-info/entry_points.txt +0 -0
  99. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf_py.egg-info/requires.txt +0 -0
  100. {jaf_py-2.5.5 → jaf_py-2.5.8}/jaf_py.egg-info/top_level.txt +0 -0
  101. {jaf_py-2.5.5 → jaf_py-2.5.8}/setup.cfg +0 -0
  102. {jaf_py-2.5.5 → jaf_py-2.5.8}/setup.py +0 -0
  103. {jaf_py-2.5.5 → jaf_py-2.5.8}/tests/test_a2a_deep.py +0 -0
  104. {jaf_py-2.5.5 → jaf_py-2.5.8}/tests/test_a2a_examples.py +0 -0
  105. {jaf_py-2.5.5 → jaf_py-2.5.8}/tests/test_api_reference_examples.py +0 -0
  106. {jaf_py-2.5.5 → jaf_py-2.5.8}/tests/test_attachments.py +0 -0
  107. {jaf_py-2.5.5 → jaf_py-2.5.8}/tests/test_callback_system_examples.py +0 -0
  108. {jaf_py-2.5.5 → jaf_py-2.5.8}/tests/test_coffee_tool.py +0 -0
  109. {jaf_py-2.5.5 → jaf_py-2.5.8}/tests/test_conversation_id_fix.py +0 -0
  110. {jaf_py-2.5.5 → jaf_py-2.5.8}/tests/test_deployment_examples.py +0 -0
  111. {jaf_py-2.5.5 → jaf_py-2.5.8}/tests/test_docs_code_examples.py +0 -0
  112. {jaf_py-2.5.5 → jaf_py-2.5.8}/tests/test_engine.py +0 -0
  113. {jaf_py-2.5.5 → jaf_py-2.5.8}/tests/test_engine_manual.py +0 -0
  114. {jaf_py-2.5.5 → jaf_py-2.5.8}/tests/test_error_handling_examples.py +0 -0
  115. {jaf_py-2.5.5 → jaf_py-2.5.8}/tests/test_getting_started_examples.py +0 -0
  116. {jaf_py-2.5.5 → jaf_py-2.5.8}/tests/test_manual.py +0 -0
  117. {jaf_py-2.5.5 → jaf_py-2.5.8}/tests/test_math_tool.py +0 -0
  118. {jaf_py-2.5.5 → jaf_py-2.5.8}/tests/test_mcp_comprehensive.py +0 -0
  119. {jaf_py-2.5.5 → jaf_py-2.5.8}/tests/test_mcp_docs.py +0 -0
  120. {jaf_py-2.5.5 → jaf_py-2.5.8}/tests/test_mcp_real_functionality.py +0 -0
  121. {jaf_py-2.5.5 → jaf_py-2.5.8}/tests/test_mcp_transports.py +0 -0
  122. {jaf_py-2.5.5 → jaf_py-2.5.8}/tests/test_memory_system_examples.py +0 -0
  123. {jaf_py-2.5.5 → jaf_py-2.5.8}/tests/test_model_providers_examples.py +0 -0
  124. {jaf_py-2.5.5 → jaf_py-2.5.8}/tests/test_property_based.py +0 -0
  125. {jaf_py-2.5.5 → jaf_py-2.5.8}/tests/test_proxy_simple.py +0 -0
  126. {jaf_py-2.5.5 → jaf_py-2.5.8}/tests/test_redis_fixes.py +0 -0
  127. {jaf_py-2.5.5 → jaf_py-2.5.8}/tests/test_redis_memory.py +0 -0
  128. {jaf_py-2.5.5 → jaf_py-2.5.8}/tests/test_server_api_examples.py +0 -0
  129. {jaf_py-2.5.5 → jaf_py-2.5.8}/tests/test_session_continuity.py +0 -0
  130. {jaf_py-2.5.5 → jaf_py-2.5.8}/tests/test_streamable_http_mcp_example.py +0 -0
  131. {jaf_py-2.5.5 → jaf_py-2.5.8}/tests/test_timeout_functionality.py +0 -0
  132. {jaf_py-2.5.5 → jaf_py-2.5.8}/tests/test_tool_integration.py +0 -0
  133. {jaf_py-2.5.5 → jaf_py-2.5.8}/tests/test_validation.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: jaf-py
3
- Version: 2.5.5
3
+ Version: 2.5.8
4
4
  Summary: A purely functional agent framework with immutable state and composable tools - Python implementation
5
5
  Author: JAF Contributors
6
6
  Maintainer: JAF Contributors
@@ -82,7 +82,7 @@ Dynamic: license-file
82
82
 
83
83
  <!-- ![JAF Banner](docs/cover.png) -->
84
84
 
85
- [![Version](https://img.shields.io/badge/version-2.5.5-blue.svg)](https://github.com/xynehq/jaf-py)
85
+ [![Version](https://img.shields.io/badge/version-2.5.8-blue.svg)](https://github.com/xynehq/jaf-py)
86
86
  [![Python](https://img.shields.io/badge/python-3.10%2B-blue.svg)](https://www.python.org/)
87
87
  [![Docs](https://img.shields.io/badge/Docs-Live-brightgreen)](https://xynehq.github.io/jaf-py/)
88
88
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  <!-- ![JAF Banner](docs/cover.png) -->
4
4
 
5
- [![Version](https://img.shields.io/badge/version-2.5.5-blue.svg)](https://github.com/xynehq/jaf-py)
5
+ [![Version](https://img.shields.io/badge/version-2.5.8-blue.svg)](https://github.com/xynehq/jaf-py)
6
6
  [![Python](https://img.shields.io/badge/python-3.10%2B-blue.svg)](https://www.python.org/)
7
7
  [![Docs](https://img.shields.io/badge/Docs-Live-brightgreen)](https://xynehq.github.io/jaf-py/)
8
8
 
@@ -191,7 +191,7 @@ def generate_run_id() -> RunId:
191
191
  """Generate a new run ID."""
192
192
  return create_run_id(str(uuid.uuid4()))
193
193
 
194
- __version__ = "2.5.5"
194
+ __version__ = "2.5.8"
195
195
  __all__ = [
196
196
  # Core types and functions
197
197
  "TraceId", "RunId", "ValidationResult", "Message", "ModelConfig",
@@ -178,7 +178,8 @@ def create_agent_tool(
178
178
  on_event=parent_config.on_event,
179
179
  memory=parent_config.memory if preserve_session else None,
180
180
  conversation_id=parent_config.conversation_id if preserve_session else None,
181
- default_tool_timeout=parent_config.default_tool_timeout
181
+ default_tool_timeout=parent_config.default_tool_timeout,
182
+ prefer_streaming=parent_config.prefer_streaming
182
183
  )
183
184
 
184
185
  token = _current_run_config.set(sub_config)
@@ -554,9 +554,12 @@ async def _run_internal(
554
554
  assistant_event_streamed = False
555
555
 
556
556
  for retry_attempt in range(config.max_empty_response_retries + 1):
557
- # Get completion from model provider, prefer streaming if available
557
+ # Get completion from model provider
558
+ # Check if streaming should be used based on configuration and availability
558
559
  get_stream = getattr(config.model_provider, "get_completion_stream", None)
559
- if callable(get_stream):
560
+ use_streaming = (config.prefer_streaming != False and callable(get_stream))
561
+
562
+ if use_streaming:
560
563
  try:
561
564
  aggregated_text = ""
562
565
  # Working array of partial tool calls
@@ -288,7 +288,8 @@ Return a JSON object with keys: {{"allowed": boolean, "reason": string}}. Do not
288
288
  model_override=model_to_use,
289
289
  initial_input_guardrails=None,
290
290
  final_output_guardrails=None,
291
- on_event=None
291
+ on_event=None,
292
+ prefer_streaming=config.prefer_streaming
292
293
  )
293
294
 
294
295
  # Execute with timeout
@@ -295,7 +295,8 @@ async def run_streaming(
295
295
  final_output_guardrails=config.final_output_guardrails,
296
296
  on_event=event_handler,
297
297
  memory=config.memory,
298
- conversation_id=config.conversation_id
298
+ conversation_id=config.conversation_id,
299
+ prefer_streaming=config.prefer_streaming
299
300
  )
300
301
 
301
302
  from .engine import run
@@ -443,7 +443,7 @@ class LangfuseTraceCollector:
443
443
  public_key=public_key,
444
444
  secret_key=secret_key,
445
445
  host=host,
446
- release="jaf-py-v2.5.5",
446
+ release="jaf-py-v2.5.8",
447
447
  httpx_client=client
448
448
  )
449
449
  self._httpx_client = client
@@ -897,6 +897,7 @@ class RunConfig(Generic[Ctx]):
897
897
  max_empty_response_retries: int = 3 # Maximum retries when LLM returns empty response
898
898
  empty_response_retry_delay: float = 1.0 # Initial delay in seconds before retrying empty response (uses exponential backoff)
899
899
  log_empty_responses: bool = True # Whether to log diagnostic info for empty responses
900
+ prefer_streaming: Optional[bool] = None # Whether to prefer streaming responses. None (default) = use streaming if available, True = prefer streaming, False = disable streaming
900
901
 
901
902
 
902
903
  # Regeneration types for conversation management
@@ -219,6 +219,7 @@ def make_litellm_provider(
219
219
  request_params = {
220
220
  "model": model,
221
221
  "messages": messages,
222
+ "stream": False
222
223
  }
223
224
 
224
225
  # Add optional parameters
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: jaf-py
3
- Version: 2.5.5
3
+ Version: 2.5.8
4
4
  Summary: A purely functional agent framework with immutable state and composable tools - Python implementation
5
5
  Author: JAF Contributors
6
6
  Maintainer: JAF Contributors
@@ -82,7 +82,7 @@ Dynamic: license-file
82
82
 
83
83
  <!-- ![JAF Banner](docs/cover.png) -->
84
84
 
85
- [![Version](https://img.shields.io/badge/version-2.5.5-blue.svg)](https://github.com/xynehq/jaf-py)
85
+ [![Version](https://img.shields.io/badge/version-2.5.8-blue.svg)](https://github.com/xynehq/jaf-py)
86
86
  [![Python](https://img.shields.io/badge/python-3.10%2B-blue.svg)](https://www.python.org/)
87
87
  [![Docs](https://img.shields.io/badge/Docs-Live-brightgreen)](https://xynehq.github.io/jaf-py/)
88
88
 
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "jaf-py"
7
- version = "2.5.5"
7
+ version = "2.5.8"
8
8
  description = "A purely functional agent framework with immutable state and composable tools - Python implementation"
9
9
  readme = "README.md"
10
10
  license = "MIT"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes