agent-framework-lib 0.8.8.post8__tar.gz → 0.8.9__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 (355) hide show
  1. {agent_framework_lib-0.8.8.post8/agent_framework_lib.egg-info → agent_framework_lib-0.8.9}/PKG-INFO +5 -3
  2. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/core/model_clients.py +570 -1
  3. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/monitoring/__init__.py +2 -0
  4. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/monitoring/metrics_aggregator.py +101 -49
  5. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/security/sandbox_provider.py +61 -1
  6. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/skills/builtin/skills/image_gen/SKILL.md +20 -19
  7. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/skills/builtin/skills/image_gen/create_image.py +55 -58
  8. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/tools/shell_tool.py +2 -6
  9. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/web/server.py +28 -13
  10. agent_framework_lib-0.8.9/agent_framework/workflow/__init__.py +130 -0
  11. agent_framework_lib-0.8.9/agent_framework/workflow/core/__init__.py +27 -0
  12. agent_framework_lib-0.8.9/agent_framework/workflow/core/builder.py +379 -0
  13. agent_framework_lib-0.8.9/agent_framework/workflow/core/chat_completion.py +507 -0
  14. agent_framework_lib-0.8.9/agent_framework/workflow/core/context.py +109 -0
  15. agent_framework_lib-0.8.9/agent_framework/workflow/core/decorators.py +155 -0
  16. agent_framework_lib-0.8.9/agent_framework/workflow/core/engine.py +216 -0
  17. agent_framework_lib-0.8.9/agent_framework/workflow/core/errors.py +117 -0
  18. agent_framework_lib-0.8.9/agent_framework/workflow/core/monitoring.py +453 -0
  19. agent_framework_lib-0.8.9/agent_framework/workflow/core/runner.py +292 -0
  20. agent_framework_lib-0.8.9/agent_framework/workflow/core/state.py +24 -0
  21. agent_framework_lib-0.8.9/agent_framework/workflow/core/types.py +155 -0
  22. agent_framework_lib-0.8.9/agent_framework/workflow/implementations/__init__.py +19 -0
  23. agent_framework_lib-0.8.9/agent_framework/workflow/implementations/langgraph_engine.py +195 -0
  24. agent_framework_lib-0.8.9/agent_framework/workflow/server/__init__.py +11 -0
  25. agent_framework_lib-0.8.9/agent_framework/workflow/server/router.py +380 -0
  26. agent_framework_lib-0.8.9/agent_framework/workflow/server/schemas.py +58 -0
  27. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9/agent_framework_lib.egg-info}/PKG-INFO +5 -3
  28. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework_lib.egg-info/SOURCES.txt +18 -1
  29. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework_lib.egg-info/requires.txt +5 -2
  30. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/docs/DIAGNOSTIC_SANDBOX_SKILLS.md +14 -0
  31. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/docs/OPENSHELL_GATEWAY_HOST_SETUP.md +111 -33
  32. agent_framework_lib-0.8.9/examples/workflow_engine_example.py +244 -0
  33. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/pyproject.toml +14 -3
  34. agent_framework_lib-0.8.8.post8/agent_framework/skills/builtin/skills/image_gen/generate_image.py +0 -199
  35. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/ARCHITECTURE.md +0 -0
  36. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/LICENSE +0 -0
  37. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/MANIFEST.in +0 -0
  38. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/README.md +0 -0
  39. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/__init__.py +0 -0
  40. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/a2a/__init__.py +0 -0
  41. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/a2a/base.py +0 -0
  42. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/a2a/endpoints/__init__.py +0 -0
  43. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/a2a/endpoints/a2a_router.py +0 -0
  44. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/a2a/endpoints/agent_card_builder.py +0 -0
  45. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/a2a/endpoints/agent_card_skill_builder.py +0 -0
  46. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/a2a/endpoints/jsonrpc_dispatcher.py +0 -0
  47. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/a2a/endpoints/models_jsonrpc.py +0 -0
  48. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/a2a/endpoints/sse_wrapper.py +0 -0
  49. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/a2a/endpoints/translation_layer.py +0 -0
  50. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/a2a/models.py +0 -0
  51. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/a2a/providers/__init__.py +0 -0
  52. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/a2a/providers/elasticsearch_provider.py +0 -0
  53. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/a2a/providers/postgres_provider.py +0 -0
  54. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/capabilities/__init__.py +0 -0
  55. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/capabilities/resolver.py +0 -0
  56. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/code_delivery/__init__.py +0 -0
  57. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/code_delivery/audit.py +0 -0
  58. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/code_delivery/config.py +0 -0
  59. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/code_delivery/crypto.py +0 -0
  60. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/code_delivery/git_provider.py +0 -0
  61. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/code_delivery/herdr_client.py +0 -0
  62. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/code_delivery/models.py +0 -0
  63. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/code_delivery/orchestrator.py +0 -0
  64. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/code_delivery/store.py +0 -0
  65. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/code_delivery/tools.py +0 -0
  66. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/core/__init__.py +0 -0
  67. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/core/activity_formatter.py +0 -0
  68. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/core/agent_interface.py +0 -0
  69. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/core/agent_provider.py +0 -0
  70. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/core/base_agent.py +0 -0
  71. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/core/context_budget.py +0 -0
  72. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/core/context_summarizer.py +0 -0
  73. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/core/elasticsearch_config_provider.py +0 -0
  74. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/core/execution_controller.py +0 -0
  75. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/core/implementation_validator.py +0 -0
  76. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/core/interruption_message.py +0 -0
  77. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/core/knowledge_state.py +0 -0
  78. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/core/loop_detector.py +0 -0
  79. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/core/model_config.py +0 -0
  80. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/core/model_router.py +0 -0
  81. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/core/models.py +0 -0
  82. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/core/prompt_builder.py +0 -0
  83. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/core/provider_calibration.py +0 -0
  84. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/core/scratchpad_compressor.py +0 -0
  85. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/core/scratchpad_serializer.py +0 -0
  86. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/core/state_manager.py +0 -0
  87. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/core/step_display_config.py +0 -0
  88. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/core/streaming_parts_accumulator.py +0 -0
  89. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/implementations/__init__.py +0 -0
  90. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/implementations/budget_aware_agent.py +0 -0
  91. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/implementations/llamaindex_agent.py +0 -0
  92. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/implementations/llamaindex_memory_adapter.py +0 -0
  93. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/implementations/microsoft_agent.py +0 -0
  94. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/memory/__init__.py +0 -0
  95. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/memory/agent_mixin.py +0 -0
  96. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/memory/base.py +0 -0
  97. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/memory/config.py +0 -0
  98. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/memory/hypothesis_engine.py +0 -0
  99. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/memory/implicit_feedback.py +0 -0
  100. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/memory/manager.py +0 -0
  101. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/memory/personalization.py +0 -0
  102. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/memory/providers/__init__.py +0 -0
  103. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/memory/providers/graphiti_provider.py +0 -0
  104. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/memory/providers/memori_provider.py +0 -0
  105. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/memory/response_lessons.py +0 -0
  106. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/memory/tools.py +0 -0
  107. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/memory/work_patterns.py +0 -0
  108. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/monitoring/api_timing_tracker.py +0 -0
  109. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/monitoring/elasticsearch_circuit_breaker.py +0 -0
  110. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/monitoring/elasticsearch_logging.py +0 -0
  111. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/monitoring/error_handling.py +0 -0
  112. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/monitoring/error_logging.py +0 -0
  113. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/monitoring/llm_auto_instrumentor.py +0 -0
  114. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/monitoring/llm_metrics.py +0 -0
  115. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/monitoring/llm_metrics_collector.py +0 -0
  116. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/monitoring/llm_metrics_extractor.py +0 -0
  117. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/monitoring/metrics_config.py +0 -0
  118. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/monitoring/observability_manager.py +0 -0
  119. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/monitoring/otel_instrumentor.py +0 -0
  120. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/monitoring/otel_logging_handler.py +0 -0
  121. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/monitoring/otel_metrics_recorder.py +0 -0
  122. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/monitoring/otel_setup.py +0 -0
  123. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/monitoring/performance_monitor.py +0 -0
  124. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/monitoring/progress_tracker.py +0 -0
  125. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/monitoring/resource_manager.py +0 -0
  126. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/monitoring/resource_metrics_collector.py +0 -0
  127. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/monitoring/streaming_latency_tracer.py +0 -0
  128. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/monitoring/timing_tracker.py +0 -0
  129. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/monitoring/token_counter.py +0 -0
  130. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/monitoring/tracing_context.py +0 -0
  131. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/notifications/__init__.py +0 -0
  132. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/notifications/hub.py +0 -0
  133. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/notifications/webhook_notifier.py +0 -0
  134. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/processing/__init__.py +0 -0
  135. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/processing/ai_content_management.py +0 -0
  136. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/processing/markdown_converter.py +0 -0
  137. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/processing/multimodal_integration.py +0 -0
  138. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/processing/rich_content_validation.py +0 -0
  139. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/py.typed +0 -0
  140. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/security/__init__.py +0 -0
  141. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/security/authz.py +0 -0
  142. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/security/file_view_token.py +0 -0
  143. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/security/input_guard.py +0 -0
  144. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/security/openshell_policy.yaml +0 -0
  145. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/security/pii_redactor.py +0 -0
  146. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/security/sandbox.py +0 -0
  147. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/security/secret_redactor.py +0 -0
  148. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/security/shell_env.py +0 -0
  149. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/security/upload_token.py +0 -0
  150. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/session/__init__.py +0 -0
  151. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/session/elasticsearch_session_storage.py +0 -0
  152. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/session/session_storage.py +0 -0
  153. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/skills/__init__.py +0 -0
  154. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/skills/agent_mixin.py +0 -0
  155. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/skills/base.py +0 -0
  156. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/skills/builtin/__init__.py +0 -0
  157. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/skills/builtin/scripts/__init__.py +0 -0
  158. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/skills/builtin/scripts/create_and_register.py +0 -0
  159. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/skills/builtin/scripts/register_to_storage.py +0 -0
  160. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/skills/builtin/skills/chart/SKILL.md +0 -0
  161. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/skills/builtin/skills/chart/chart_to_image.py +0 -0
  162. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/skills/builtin/skills/chart/vendor_chart.umd.min.js +0 -0
  163. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/skills/builtin/skills/code_delivery/SKILL.md +0 -0
  164. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/skills/builtin/skills/code_format/SKILL.md +0 -0
  165. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/skills/builtin/skills/code_format/format_python.py +0 -0
  166. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/skills/builtin/skills/csv/SKILL.md +0 -0
  167. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/skills/builtin/skills/csv/create_csv.py +0 -0
  168. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/skills/builtin/skills/csv/read_csv.py +0 -0
  169. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/skills/builtin/skills/csv/transform_csv.py +0 -0
  170. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/skills/builtin/skills/data_format/SKILL.md +0 -0
  171. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/skills/builtin/skills/data_format/json_to_yaml.py +0 -0
  172. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/skills/builtin/skills/data_format/yaml_to_json.py +0 -0
  173. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/skills/builtin/skills/drawio/SKILL.md +0 -0
  174. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/skills/builtin/skills/drawio/create_drawio.py +0 -0
  175. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/skills/builtin/skills/email_template/SKILL.md +0 -0
  176. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/skills/builtin/skills/excel/SKILL.md +0 -0
  177. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/skills/builtin/skills/excel/create_excel.py +0 -0
  178. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/skills/builtin/skills/file/SKILL.md +0 -0
  179. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/skills/builtin/skills/file/create_file.py +0 -0
  180. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/skills/builtin/skills/file/list_files.py +0 -0
  181. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/skills/builtin/skills/file/read_file.py +0 -0
  182. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/skills/builtin/skills/file_access/SKILL.md +0 -0
  183. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/skills/builtin/skills/file_access/download_to_local.py +0 -0
  184. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/skills/builtin/skills/file_access/get_file_path.py +0 -0
  185. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/skills/builtin/skills/form/SKILL.md +0 -0
  186. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/skills/builtin/skills/image_display/SKILL.md +0 -0
  187. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/skills/builtin/skills/mermaid/SKILL.md +0 -0
  188. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/skills/builtin/skills/mermaid/mermaid_to_image.py +0 -0
  189. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/skills/builtin/skills/mermaid/vendor_mermaid.umd.min.js +0 -0
  190. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/skills/builtin/skills/multimodal/SKILL.md +0 -0
  191. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/skills/builtin/skills/optionsblock/SKILL.md +0 -0
  192. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/skills/builtin/skills/powerpoint/SKILL.md +0 -0
  193. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/skills/builtin/skills/powerpoint/create_powerpoint.py +0 -0
  194. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/skills/builtin/skills/powerpoint/templates/Big Data Infographics.pptx +0 -0
  195. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/skills/builtin/skills/powerpoint/templates/Executive Design Pitch Deck.pptx +0 -0
  196. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/skills/builtin/skills/powerpoint/templates/Management Consulting Toolkit.pptx +0 -0
  197. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/skills/builtin/skills/powerpoint/templates/__init__.py +0 -0
  198. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/skills/builtin/skills/powerpoint/templates/generate_templates.py +0 -0
  199. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/skills/builtin/skills/skill_creator/SKILL.md +0 -0
  200. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/skills/builtin/skills/skill_creator/skill_api.py +0 -0
  201. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/skills/builtin/skills/table/SKILL.md +0 -0
  202. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/skills/builtin/skills/table/table_to_image.py +0 -0
  203. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/skills/builtin/skills/unified_pdf/SKILL.md +0 -0
  204. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/skills/builtin/skills/unified_pdf/create_pdf.py +0 -0
  205. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/skills/builtin/skills/web_news_search/SKILL.md +0 -0
  206. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/skills/builtin/skills/web_news_search/web_news_search.py +0 -0
  207. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/skills/builtin/skills/word/SKILL.md +0 -0
  208. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/skills/builtin/skills/word/create_word.py +0 -0
  209. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/skills/custom_skill_manager.py +0 -0
  210. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/skills/discovery_prompt.py +0 -0
  211. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/skills/markdown_loader.py +0 -0
  212. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/skills/tools.py +0 -0
  213. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/storage/__init__.py +0 -0
  214. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/storage/file_storages.py +0 -0
  215. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/storage/file_system_management.py +0 -0
  216. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/storage/storage_optimizer.py +0 -0
  217. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/subagents/__init__.py +0 -0
  218. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/subagents/executor.py +0 -0
  219. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/subagents/message_injector.py +0 -0
  220. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/subagents/message_queue.py +0 -0
  221. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/subagents/retrigger.py +0 -0
  222. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/subagents/spawn_tool.py +0 -0
  223. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/tools/__init__.py +0 -0
  224. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/tools/activity_callback.py +0 -0
  225. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/tools/adaptive_pdf_css.py +0 -0
  226. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/tools/base.py +0 -0
  227. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/tools/html_content_analyzer.py +0 -0
  228. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/tools/multimodal_tools.py +0 -0
  229. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/tools/pdf_image_scaler.py +0 -0
  230. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/tools/sizing_config.py +0 -0
  231. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/tools/web_fetch_tool.py +0 -0
  232. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/tools/web_search_tool.py +0 -0
  233. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/utils/__init__.py +0 -0
  234. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/utils/path_utils.py +0 -0
  235. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/utils/post_install.py +0 -0
  236. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/utils/session_title_generator.py +0 -0
  237. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/utils/source_detector.py +0 -0
  238. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/utils/special_blocks.py +0 -0
  239. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/web/__init__.py +0 -0
  240. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/web/admin_auth.py +0 -0
  241. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/web/admin_models.py +0 -0
  242. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/web/admin_router.py +0 -0
  243. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/web/admin_services.py +0 -0
  244. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/web/api_timing_middleware.py +0 -0
  245. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/web/docs/A2A_GUIDE.md +0 -0
  246. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/web/docs/BUILTIN_SKILLS_REFERENCE.md +0 -0
  247. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/web/docs/CREATING_AGENTS.md +0 -0
  248. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/web/docs/CUSTOM_SKILLS_GUIDE.md +0 -0
  249. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/web/docs/DOCKER_SETUP.md +0 -0
  250. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/web/docs/Dockerfile +0 -0
  251. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/web/docs/GETTING_STARTED.md +0 -0
  252. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/web/docs/GITNEXUS_USER_GUIDE.md +0 -0
  253. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/web/docs/MEMORY_INSTALLATION.md +0 -0
  254. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/web/docs/README.md +0 -0
  255. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/web/docs/TOOLS_AND_MCP_GUIDE.md +0 -0
  256. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/web/docs/WORKSPACE_INTEGRATION.md +0 -0
  257. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/web/docs/api-reference.md +0 -0
  258. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/web/docs/configuration.md +0 -0
  259. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/web/docs/docker-compose.yml +0 -0
  260. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/web/docs/examples/agent_example_multi_skills.py +0 -0
  261. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/web/docs/examples/agent_with_file_storage.py +0 -0
  262. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/web/docs/examples/agent_with_mcp.py +0 -0
  263. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/web/docs/examples/agent_with_memory.py +0 -0
  264. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/web/docs/examples/agent_with_memory_graphiti.py +0 -0
  265. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/web/docs/examples/agent_with_memory_hybrid.py +0 -0
  266. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/web/docs/examples/agent_with_memory_simple.py +0 -0
  267. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/web/docs/examples/custom_framework_agent.py +0 -0
  268. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/web/docs/examples/simple_agent.py +0 -0
  269. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/web/docs/examples/skills_demo_agent.py +0 -0
  270. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/web/docs/installation-guide.md +0 -0
  271. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/web/documentation_generator.py +0 -0
  272. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/web/gitnexus_client.py +0 -0
  273. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/web/helper_agent.py +0 -0
  274. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/web/helper_ui.html +0 -0
  275. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/web/modern_ui.html +0 -0
  276. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/web/observability/kibana-llm-dashboard-setup.json +0 -0
  277. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/web/observability/kibana-resource-metrics-dashboard.json +0 -0
  278. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/web/otel_tracing_middleware.py +0 -0
  279. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/web/skills_router.py +0 -0
  280. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/web/test_app.html +0 -0
  281. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/workspace/__init__.py +0 -0
  282. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/workspace/artefacts.py +0 -0
  283. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/workspace/client.py +0 -0
  284. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/workspace/config.py +0 -0
  285. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/workspace/context.py +0 -0
  286. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/workspace/cursor.py +0 -0
  287. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/workspace/memory.py +0 -0
  288. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/workspace/models.py +0 -0
  289. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/workspace/poller.py +0 -0
  290. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/workspace/preferences.py +0 -0
  291. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/workspace/router.py +0 -0
  292. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/workspace/session.py +0 -0
  293. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework/workspace/subscription.py +0 -0
  294. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework_lib.egg-info/dependency_links.txt +0 -0
  295. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework_lib.egg-info/entry_points.txt +0 -0
  296. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/agent_framework_lib.egg-info/top_level.txt +0 -0
  297. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/docs/A2A_GUIDE.md +0 -0
  298. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/docs/ACTIVITY_OUTPUT_PART.md +0 -0
  299. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/docs/ARCHITECTURE_DIAGRAM.md +0 -0
  300. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/docs/BUILTIN_SKILLS_REFERENCE.md +0 -0
  301. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/docs/CANCEL_AND_INTERRUPT_FRONTEND.md +0 -0
  302. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/docs/CONCURRENCE_VS_PARALLELISME_GUIDE.md +0 -0
  303. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/docs/CREATING_AGENTS.md +0 -0
  304. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/docs/CUSTOM_SKILLS_GUIDE.md +0 -0
  305. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/docs/DEEPEVAL_TEST_REPORT.md +0 -0
  306. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/docs/DOCKER_SETUP.md +0 -0
  307. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/docs/ELASTICSEARCH_DATA_STRUCTURES.md +0 -0
  308. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/docs/FILE_DOWNLOAD_LINKS.md +0 -0
  309. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/docs/FILE_STORAGE_GUIDE.md +0 -0
  310. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/docs/GETTING_STARTED.md +0 -0
  311. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/docs/GITNEXUS_USER_GUIDE.md +0 -0
  312. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/docs/HISTORY_MESSAGE_FORMAT.md +0 -0
  313. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/docs/IMPLEMENTATION_GUIDE_NEW_AGENT.md +0 -0
  314. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/docs/MEMORY_INSTALLATION.md +0 -0
  315. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/docs/MODIFICATIONS_CONCURRENCE.md +0 -0
  316. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/docs/MULTIMODAL_TOOLS_GUIDE.md +0 -0
  317. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/docs/OBSERVABILITY_GUIDE.md +0 -0
  318. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/docs/PYPI_PUBLISHING.md +0 -0
  319. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/docs/QA_STREAMING_LATENCY.md +0 -0
  320. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/docs/SCREENSHOTS_GUIDE.md +0 -0
  321. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/docs/SECRETS_MANAGEMENT.md +0 -0
  322. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/docs/SECURITY_HARDENING.md +0 -0
  323. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/docs/SPEC_CROSS_MODEL_HISTORY_CONVERSION.md +0 -0
  324. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/docs/SSE_NOTIFICATIONS_GUIDE.md +0 -0
  325. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/docs/STREAMING_EVENTS_FRONTEND.md +0 -0
  326. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/docs/TOOLS_AND_MCP_GUIDE.md +0 -0
  327. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/docs/WORKSPACE_INTEGRATION.md +0 -0
  328. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/docs/api-reference.md +0 -0
  329. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/docs/configuration.md +0 -0
  330. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/docs/framework_audit_remarques.md +0 -0
  331. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/docs/helper_agent.md +0 -0
  332. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/docs/index.md +0 -0
  333. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/docs/installation-guide.md +0 -0
  334. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/examples/README.md +0 -0
  335. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/examples/agent_context_budget_test.py +0 -0
  336. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/examples/agent_example_multi_skills.py +0 -0
  337. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/examples/agent_exemple_test.py +0 -0
  338. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/examples/agent_training_with_apo.py +0 -0
  339. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/examples/agent_with_custom_tools_file_storage.py +0 -0
  340. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/examples/agent_with_file_storage.py +0 -0
  341. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/examples/agent_with_mcp.py +0 -0
  342. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/examples/agent_with_memory_graphiti.py +0 -0
  343. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/examples/agent_with_memory_hybrid.py +0 -0
  344. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/examples/agent_with_memory_simple.py +0 -0
  345. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/examples/agent_with_personalization.py +0 -0
  346. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/examples/biagenttest.py +0 -0
  347. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/examples/custom_framework_agent.py +0 -0
  348. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/examples/dependencies/docker-compose.yaml +0 -0
  349. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/examples/pyproject.toml +0 -0
  350. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/examples/simple_agent.py +0 -0
  351. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/examples/skills_demo_agent.py +0 -0
  352. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/examples/test_work_patterns_live.py +0 -0
  353. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/examples/workspace_test_agent.py +0 -0
  354. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/setup.cfg +0 -0
  355. {agent_framework_lib-0.8.8.post8 → agent_framework_lib-0.8.9}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agent-framework-lib
3
- Version: 0.8.8.post8
3
+ Version: 0.8.9
4
4
  Summary: A comprehensive Python framework for building and serving conversational AI agents with FastAPI
5
5
  Author-email: Sebastian Pavel <sebastian@cinco.ai>, Elliott Girard <elliott.girard@icloud.com>
6
6
  Maintainer-email: Sebastian Pavel <sebastian@cinco.ai>
@@ -63,7 +63,7 @@ Requires-Dist: llama-index-llms-openai>=0.7.9
63
63
  Requires-Dist: llama-index-llms-anthropic>=0.11.5
64
64
  Requires-Dist: llama-index-llms-google-genai>=0.1.0
65
65
  Requires-Dist: graphiti-core>=0.24.3
66
- Requires-Dist: tiktoken>=0.7.0
66
+ Requires-Dist: tiktoken>=0.8.0
67
67
  Requires-Dist: falkordb>=1.0.0
68
68
  Requires-Dist: grpcio-status>=1.71.2
69
69
  Requires-Dist: nodeenv>=1.8.0
@@ -84,6 +84,8 @@ Requires-Dist: llama-index-workflows>=2.16.0; extra == "llamaindex"
84
84
  Requires-Dist: llama-index-llms-openai>=0.7.9; extra == "llamaindex"
85
85
  Requires-Dist: llama-index-llms-google-genai>=0.1.0; extra == "llamaindex"
86
86
  Requires-Dist: llama-index-llms-anthropic>=0.11.5; extra == "llamaindex"
87
+ Provides-Extra: langgraph
88
+ Requires-Dist: langgraph>=0.2.0; extra == "langgraph"
87
89
  Provides-Extra: mcp
88
90
  Requires-Dist: llama-index-tools-mcp>=0.4.0; extra == "mcp"
89
91
  Provides-Extra: websearch
@@ -151,7 +153,7 @@ Requires-Dist: traceloop-sdk>=0.30.0; extra == "observability"
151
153
  Provides-Extra: monitoring
152
154
  Requires-Dist: psutil>=5.9.0; extra == "monitoring"
153
155
  Provides-Extra: all
154
- Requires-Dist: agent-framework-lib[dev,drawio,elasticsearch,excel,gcp,graphiti-all,llamaindex,mcp,memory,microsoft,minio,mongodb,monitoring,multimodal,observability,postgresql,s3,websearch]; extra == "all"
156
+ Requires-Dist: agent-framework-lib[dev,drawio,elasticsearch,excel,gcp,graphiti-all,langgraph,llamaindex,mcp,memory,microsoft,minio,mongodb,monitoring,multimodal,observability,postgresql,s3,websearch]; extra == "all"
155
157
  Dynamic: license-file
156
158
 
157
159
  # Agent Framework Library
@@ -8,7 +8,7 @@ This module is framework-agnostic and uses native client libraries.
8
8
  import json
9
9
  import logging
10
10
  import re
11
- from typing import Any
11
+ from typing import Any, cast
12
12
 
13
13
  from .agent_interface import AgentConfig
14
14
  from .model_config import ModelConfigManager, ModelProvider, model_config
@@ -1095,3 +1095,572 @@ class ModelClientFactory:
1095
1095
 
1096
1096
  # Global factory instance
1097
1097
  client_factory = ModelClientFactory()
1098
+
1099
+
1100
+ # ===========================================================================
1101
+ # Provider-execution layer (additive)
1102
+ # ---------------------------------------------------------------------------
1103
+ # This is the reusable "execute a chat completion" capability that does NOT
1104
+ # exist elsewhere in the codebase today: ``ModelRouter`` only *selects* a model
1105
+ # and ``ModelClientFactory`` only *creates* a raw provider SDK client. These
1106
+ # additive module-level functions own ALL provider branching (dispatching on the
1107
+ # concrete client type to the correct SDK method) and normalize every provider's
1108
+ # native response shape onto a single vendor-neutral structure, so callers such
1109
+ # as ``workflow/core`` stay provider-neutral.
1110
+ #
1111
+ # Token usage is taken from the provider's reported counts whenever available
1112
+ # (OpenAI ``usage.prompt_tokens``/``completion_tokens``; Anthropic
1113
+ # ``usage.input_tokens``/``output_tokens``; Gemini ``usage_metadata``), plus
1114
+ # ``thinking_tokens`` where the provider reports them. ``LLMMetricsCollector``
1115
+ # estimation is used ONLY as a fallback when the provider reports no usage
1116
+ # (notably mid-stream or a stream that ends without a usage chunk) (Req 2.7, 2.12).
1117
+ # ===========================================================================
1118
+
1119
+ from collections.abc import AsyncIterator # noqa: E402
1120
+ from dataclasses import dataclass # noqa: E402
1121
+
1122
+
1123
+ # Default max_tokens for providers (Anthropic) that REQUIRE the parameter when
1124
+ # the caller and model_params supply none.
1125
+ _DEFAULT_MAX_TOKENS = 4096
1126
+
1127
+
1128
+ @dataclass
1129
+ class ChatExecutionResult:
1130
+ """Normalized, provider-agnostic result of a non-streaming chat completion.
1131
+
1132
+ The orchestration layer (``workflow/core/chat_completion.py``) maps this onto
1133
+ the public ``ChatCompletionResult`` and builds ``LLMMetrics`` from it. Token
1134
+ counts are the EXACT provider-reported values for a completed non-streaming
1135
+ call; ``usage_estimated`` is ``True`` only when the provider reported no usage
1136
+ and the counts were estimated via ``LLMMetricsCollector`` (Req 2.12).
1137
+ """
1138
+
1139
+ content: str
1140
+ model: str
1141
+ input_tokens: int
1142
+ output_tokens: int
1143
+ thinking_tokens: int
1144
+ finish_reason: str | None = None
1145
+ usage_estimated: bool = False
1146
+
1147
+
1148
+ @dataclass
1149
+ class ChatExecutionChunk:
1150
+ """A single normalized incremental chunk yielded by a streaming completion.
1151
+
1152
+ ``delta`` is the text fragment since the previous chunk. The final chunk sets
1153
+ ``done=True`` and carries the best-effort token counts: provider-reported when
1154
+ the stream emitted a usage chunk, otherwise estimated via
1155
+ ``LLMMetricsCollector`` (token counts mid-stream are best-effort, Req 2.7).
1156
+ """
1157
+
1158
+ delta: str
1159
+ model: str
1160
+ done: bool = False
1161
+ finish_reason: str | None = None
1162
+ input_tokens: int | None = None
1163
+ output_tokens: int | None = None
1164
+ thinking_tokens: int | None = None
1165
+ usage_estimated: bool = False
1166
+
1167
+
1168
+ def _split_system_messages(
1169
+ messages: list[dict[str, Any]],
1170
+ ) -> tuple[str | None, list[dict[str, Any]]]:
1171
+ """Separate system-role messages from the rest.
1172
+
1173
+ Returns ``(system_text, non_system_messages)``. Multiple system messages are
1174
+ joined with newlines. Used by ``_execute_anthropic`` because Anthropic takes
1175
+ no system role inside ``messages`` and instead requires the top-level
1176
+ ``system`` parameter (Req 2.11).
1177
+ """
1178
+ system_parts: list[str] = []
1179
+ remaining: list[dict[str, Any]] = []
1180
+ for msg in messages:
1181
+ if msg.get("role") == "system":
1182
+ content = msg.get("content")
1183
+ if content:
1184
+ system_parts.append(content if isinstance(content, str) else str(content))
1185
+ else:
1186
+ remaining.append(msg)
1187
+ system_text = "\n".join(system_parts) if system_parts else None
1188
+ return system_text, remaining
1189
+
1190
+
1191
+ def _join_message_text(messages: list[dict[str, Any]]) -> str:
1192
+ """Concatenate message contents into a single string for token estimation."""
1193
+ parts: list[str] = []
1194
+ for msg in messages:
1195
+ content = msg.get("content")
1196
+ if isinstance(content, str):
1197
+ parts.append(content)
1198
+ elif content is not None:
1199
+ parts.append(str(content))
1200
+ return "\n".join(parts)
1201
+
1202
+
1203
+ def _estimate_token_counts(model: str | None, input_text: str, output_text: str) -> tuple[int, int]:
1204
+ """Estimate (input_tokens, output_tokens) via ``LLMMetricsCollector``.
1205
+
1206
+ This is the fallback used ONLY when a provider reports no usage. Imported
1207
+ lazily to avoid a hard import-time dependency on the monitoring package.
1208
+ """
1209
+ try:
1210
+ from agent_framework.monitoring.llm_metrics_collector import LLMMetricsCollector
1211
+
1212
+ collector = LLMMetricsCollector(model_name=model, enabled=True)
1213
+ input_tokens = collector.count_input(input_text)
1214
+ output_tokens = collector.count_output(output_text)
1215
+ return input_tokens, output_tokens
1216
+ except Exception as e: # pragma: no cover - defensive: estimation must not crash a call
1217
+ logger.warning(f"[execute_chat_completion] Token estimation fallback failed: {e}")
1218
+ return 0, 0
1219
+
1220
+
1221
+ def _resolve_call_params(
1222
+ model_params: dict[str, Any],
1223
+ max_tokens: int | None,
1224
+ temperature: float | None,
1225
+ ) -> tuple[str, float, int | None]:
1226
+ """Resolve effective (model, temperature, max_tokens).
1227
+
1228
+ Explicit call arguments take precedence over the client's ``model_params``.
1229
+ """
1230
+ model = model_params.get("model")
1231
+ effective_temperature = (
1232
+ temperature if temperature is not None else model_params.get("temperature", 0.7)
1233
+ )
1234
+ effective_max_tokens = max_tokens if max_tokens is not None else model_params.get("max_tokens")
1235
+ return cast(str, model), effective_temperature, effective_max_tokens
1236
+
1237
+
1238
+ async def execute_chat_completion(
1239
+ client: Any,
1240
+ model_params: dict[str, Any],
1241
+ messages: list[dict[str, Any]],
1242
+ *,
1243
+ stream: bool = False,
1244
+ max_tokens: int | None = None,
1245
+ temperature: float | None = None,
1246
+ ) -> "ChatExecutionResult | AsyncIterator[ChatExecutionChunk]":
1247
+ """Execute a chat completion against a raw provider client and normalize it.
1248
+
1249
+ Dispatches on the concrete client type (``AsyncOpenAI`` →
1250
+ ``client.chat.completions.create``; ``AsyncAnthropic`` →
1251
+ ``client.messages.create``; Gemini ``GenerativeModel`` →
1252
+ ``generate_content_async``) and returns a provider-agnostic result. All
1253
+ provider branching lives in this layer so ``workflow/core`` stays neutral.
1254
+
1255
+ Args:
1256
+ client: A raw provider SDK client created by ``ModelClientFactory``.
1257
+ model_params: The ``client._model_params`` dict (model name, temperature,
1258
+ and any provider-specific extras attached by the factory).
1259
+ messages: OpenAI-style ``[{"role", "content"}]`` list. The system-role
1260
+ message is ALWAYS preserved and placed in each provider's expected
1261
+ slot by its helper (Req 2.11).
1262
+ stream: When ``True``, returns an async iterator of ``ChatExecutionChunk``.
1263
+ max_tokens: Optional max output tokens (overrides ``model_params``).
1264
+ temperature: Optional sampling temperature (overrides ``model_params``).
1265
+
1266
+ Returns:
1267
+ A ``ChatExecutionResult`` for non-streaming calls, or an
1268
+ ``AsyncIterator[ChatExecutionChunk]`` when ``stream=True``.
1269
+
1270
+ Raises:
1271
+ TypeError: If the client type is not a recognized provider client.
1272
+ """
1273
+ # Dispatch on the concrete client type. Availability flags guard the isinstance
1274
+ # checks so a missing optional SDK never raises at dispatch time.
1275
+ if OPENAI_AVAILABLE and isinstance(client, AsyncOpenAI):
1276
+ return await _execute_openai(
1277
+ client,
1278
+ model_params,
1279
+ messages,
1280
+ stream=stream,
1281
+ max_tokens=max_tokens,
1282
+ temperature=temperature,
1283
+ )
1284
+ if ANTHROPIC_AVAILABLE and isinstance(client, AsyncAnthropic):
1285
+ return await _execute_anthropic(
1286
+ client,
1287
+ model_params,
1288
+ messages,
1289
+ stream=stream,
1290
+ max_tokens=max_tokens,
1291
+ temperature=temperature,
1292
+ )
1293
+ if GEMINI_AVAILABLE and isinstance(client, genai.GenerativeModel):
1294
+ return await _execute_gemini(
1295
+ client,
1296
+ model_params,
1297
+ messages,
1298
+ stream=stream,
1299
+ max_tokens=max_tokens,
1300
+ temperature=temperature,
1301
+ )
1302
+ # Fallback: dispatch by duck-typing on the SDK surface when isinstance fails
1303
+ # (e.g., a subclass or a test double). This keeps dispatch robust without
1304
+ # leaking provider types out of this layer.
1305
+ if hasattr(client, "chat") and hasattr(client.chat, "completions"):
1306
+ return await _execute_openai(
1307
+ client,
1308
+ model_params,
1309
+ messages,
1310
+ stream=stream,
1311
+ max_tokens=max_tokens,
1312
+ temperature=temperature,
1313
+ )
1314
+ if hasattr(client, "messages") and hasattr(client.messages, "create"):
1315
+ return await _execute_anthropic(
1316
+ client,
1317
+ model_params,
1318
+ messages,
1319
+ stream=stream,
1320
+ max_tokens=max_tokens,
1321
+ temperature=temperature,
1322
+ )
1323
+ if hasattr(client, "generate_content_async"):
1324
+ return await _execute_gemini(
1325
+ client,
1326
+ model_params,
1327
+ messages,
1328
+ stream=stream,
1329
+ max_tokens=max_tokens,
1330
+ temperature=temperature,
1331
+ )
1332
+ raise TypeError(
1333
+ f"execute_chat_completion: unrecognized client type {type(client).__name__!r}; "
1334
+ "expected an AsyncOpenAI, AsyncAnthropic, or Gemini GenerativeModel client"
1335
+ )
1336
+
1337
+
1338
+ async def _execute_openai(
1339
+ client: Any,
1340
+ model_params: dict[str, Any],
1341
+ messages: list[dict[str, Any]],
1342
+ *,
1343
+ stream: bool = False,
1344
+ max_tokens: int | None = None,
1345
+ temperature: float | None = None,
1346
+ ) -> "ChatExecutionResult | AsyncIterator[ChatExecutionChunk]":
1347
+ """Execute via ``client.chat.completions.create``.
1348
+
1349
+ OpenAI accepts the system role INSIDE the messages list, so the messages are
1350
+ passed through unchanged (Req 2.11). Token usage is read from
1351
+ ``usage.prompt_tokens``/``usage.completion_tokens`` with reasoning tokens (if
1352
+ reported) mapped to ``thinking_tokens``.
1353
+ """
1354
+ model, effective_temperature, effective_max_tokens = _resolve_call_params(
1355
+ model_params, max_tokens, temperature
1356
+ )
1357
+
1358
+ create_kwargs: dict[str, Any] = {
1359
+ "model": model,
1360
+ "messages": messages,
1361
+ "temperature": effective_temperature,
1362
+ }
1363
+ if effective_max_tokens is not None:
1364
+ create_kwargs["max_tokens"] = effective_max_tokens
1365
+
1366
+ if stream:
1367
+ # Ask OpenAI to include the usage chunk at the end of the stream so token
1368
+ # counts are provider-reported rather than estimated when possible.
1369
+ create_kwargs["stream"] = True
1370
+ create_kwargs["stream_options"] = {"include_usage": True}
1371
+
1372
+ async def _openai_stream() -> AsyncIterator[ChatExecutionChunk]:
1373
+ response = await client.chat.completions.create(**create_kwargs)
1374
+ collected: list[str] = []
1375
+ finish_reason: str | None = None
1376
+ usage = None
1377
+ async for chunk in response:
1378
+ if getattr(chunk, "usage", None):
1379
+ usage = chunk.usage
1380
+ choices = getattr(chunk, "choices", None)
1381
+ if choices:
1382
+ choice = choices[0]
1383
+ delta_obj = getattr(choice, "delta", None)
1384
+ delta_text = getattr(delta_obj, "content", None) if delta_obj else None
1385
+ if getattr(choice, "finish_reason", None):
1386
+ finish_reason = choice.finish_reason
1387
+ if delta_text:
1388
+ collected.append(delta_text)
1389
+ yield ChatExecutionChunk(delta=delta_text, model=model)
1390
+ full_text = "".join(collected)
1391
+ input_tokens, output_tokens, thinking_tokens, estimated = _normalize_openai_usage(
1392
+ usage, model, messages, full_text
1393
+ )
1394
+ yield ChatExecutionChunk(
1395
+ delta="",
1396
+ model=model,
1397
+ done=True,
1398
+ finish_reason=finish_reason,
1399
+ input_tokens=input_tokens,
1400
+ output_tokens=output_tokens,
1401
+ thinking_tokens=thinking_tokens,
1402
+ usage_estimated=estimated,
1403
+ )
1404
+
1405
+ return _openai_stream()
1406
+
1407
+ response = await client.chat.completions.create(**create_kwargs)
1408
+ choice = response.choices[0]
1409
+ content = getattr(choice.message, "content", None) or ""
1410
+ finish_reason = getattr(choice, "finish_reason", None)
1411
+ input_tokens, output_tokens, thinking_tokens, estimated = _normalize_openai_usage(
1412
+ getattr(response, "usage", None), model, messages, content
1413
+ )
1414
+ return ChatExecutionResult(
1415
+ content=content,
1416
+ model=model,
1417
+ input_tokens=input_tokens,
1418
+ output_tokens=output_tokens,
1419
+ thinking_tokens=thinking_tokens,
1420
+ finish_reason=finish_reason,
1421
+ usage_estimated=estimated,
1422
+ )
1423
+
1424
+
1425
+ def _normalize_openai_usage(
1426
+ usage: Any, model: str | None, messages: list[dict[str, Any]], output_text: str
1427
+ ) -> tuple[int, int, int, bool]:
1428
+ """Normalize OpenAI usage to (input, output, thinking, estimated)."""
1429
+ if usage is not None:
1430
+ input_tokens = getattr(usage, "prompt_tokens", 0) or 0
1431
+ output_tokens = getattr(usage, "completion_tokens", 0) or 0
1432
+ thinking_tokens = 0
1433
+ details = getattr(usage, "completion_tokens_details", None)
1434
+ if details is not None:
1435
+ thinking_tokens = getattr(details, "reasoning_tokens", 0) or 0
1436
+ return input_tokens, output_tokens, thinking_tokens, False
1437
+ # Fallback: provider reported no usage -> estimate (Req 2.12).
1438
+ input_tokens, output_tokens = _estimate_token_counts(
1439
+ model, _join_message_text(messages), output_text
1440
+ )
1441
+ return input_tokens, output_tokens, 0, True
1442
+
1443
+
1444
+ async def _execute_anthropic(
1445
+ client: Any,
1446
+ model_params: dict[str, Any],
1447
+ messages: list[dict[str, Any]],
1448
+ *,
1449
+ stream: bool = False,
1450
+ max_tokens: int | None = None,
1451
+ temperature: float | None = None,
1452
+ ) -> "ChatExecutionResult | AsyncIterator[ChatExecutionChunk]":
1453
+ """Execute via ``client.messages.create``.
1454
+
1455
+ Anthropic takes NO system role inside ``messages`` and instead requires the
1456
+ top-level ``system`` parameter, so the system-role message is lifted out of
1457
+ the messages list into ``system`` (Req 2.11). Token usage is read from
1458
+ ``usage.input_tokens``/``usage.output_tokens``.
1459
+ """
1460
+ model, effective_temperature, effective_max_tokens = _resolve_call_params(
1461
+ model_params, max_tokens, temperature
1462
+ )
1463
+ # Anthropic REQUIRES max_tokens; fall back to a default when none was provided.
1464
+ if effective_max_tokens is None:
1465
+ effective_max_tokens = model_params.get("max_tokens", _DEFAULT_MAX_TOKENS)
1466
+
1467
+ system_text, non_system_messages = _split_system_messages(messages)
1468
+
1469
+ create_kwargs: dict[str, Any] = {
1470
+ "model": model,
1471
+ "messages": non_system_messages,
1472
+ "max_tokens": effective_max_tokens,
1473
+ "temperature": effective_temperature,
1474
+ }
1475
+ if system_text is not None:
1476
+ create_kwargs["system"] = system_text
1477
+
1478
+ if stream:
1479
+
1480
+ async def _anthropic_stream() -> AsyncIterator[ChatExecutionChunk]:
1481
+ collected: list[str] = []
1482
+ usage = None
1483
+ finish_reason: str | None = None
1484
+ # The streaming helper yields text deltas and exposes the final message.
1485
+ async with client.messages.stream(**create_kwargs) as stream_mgr:
1486
+ async for text in stream_mgr.text_stream:
1487
+ if text:
1488
+ collected.append(text)
1489
+ yield ChatExecutionChunk(delta=text, model=model)
1490
+ final_message = await stream_mgr.get_final_message()
1491
+ usage = getattr(final_message, "usage", None)
1492
+ finish_reason = getattr(final_message, "stop_reason", None)
1493
+ full_text = "".join(collected)
1494
+ input_tokens, output_tokens, thinking_tokens, estimated = _normalize_anthropic_usage(
1495
+ usage, model, messages, full_text
1496
+ )
1497
+ yield ChatExecutionChunk(
1498
+ delta="",
1499
+ model=model,
1500
+ done=True,
1501
+ finish_reason=finish_reason,
1502
+ input_tokens=input_tokens,
1503
+ output_tokens=output_tokens,
1504
+ thinking_tokens=thinking_tokens,
1505
+ usage_estimated=estimated,
1506
+ )
1507
+
1508
+ return _anthropic_stream()
1509
+
1510
+ response = await client.messages.create(**create_kwargs)
1511
+ content = _extract_anthropic_text(response)
1512
+ finish_reason = getattr(response, "stop_reason", None)
1513
+ input_tokens, output_tokens, thinking_tokens, estimated = _normalize_anthropic_usage(
1514
+ getattr(response, "usage", None), model, messages, content
1515
+ )
1516
+ return ChatExecutionResult(
1517
+ content=content,
1518
+ model=model,
1519
+ input_tokens=input_tokens,
1520
+ output_tokens=output_tokens,
1521
+ thinking_tokens=thinking_tokens,
1522
+ finish_reason=finish_reason,
1523
+ usage_estimated=estimated,
1524
+ )
1525
+
1526
+
1527
+ def _extract_anthropic_text(response: Any) -> str:
1528
+ """Concatenate text from Anthropic content blocks."""
1529
+ blocks = getattr(response, "content", None)
1530
+ if not blocks:
1531
+ return ""
1532
+ parts: list[str] = []
1533
+ for block in blocks:
1534
+ text = getattr(block, "text", None)
1535
+ if text:
1536
+ parts.append(text)
1537
+ return "".join(parts)
1538
+
1539
+
1540
+ def _normalize_anthropic_usage(
1541
+ usage: Any, model: str | None, messages: list[dict[str, Any]], output_text: str
1542
+ ) -> tuple[int, int, int, bool]:
1543
+ """Normalize Anthropic usage to (input, output, thinking, estimated)."""
1544
+ if usage is not None:
1545
+ input_tokens = getattr(usage, "input_tokens", 0) or 0
1546
+ output_tokens = getattr(usage, "output_tokens", 0) or 0
1547
+ # Anthropic does not separately report thinking tokens in usage today.
1548
+ thinking_tokens = 0
1549
+ return input_tokens, output_tokens, thinking_tokens, False
1550
+ input_tokens, output_tokens = _estimate_token_counts(
1551
+ model, _join_message_text(messages), output_text
1552
+ )
1553
+ return input_tokens, output_tokens, 0, True
1554
+
1555
+
1556
+ def _messages_to_gemini_contents(messages: list[dict[str, Any]]) -> str:
1557
+ """Flatten messages into a single prompt for the Gemini SDK.
1558
+
1559
+ Gemini sets a system instruction at model construction time; the model passed
1560
+ here is already constructed, so the system-role message is kept INSIDE the
1561
+ prompt content (it is NOT dropped) (Req 2.11). Roles are prefixed so the model
1562
+ retains the system/user distinction.
1563
+ """
1564
+ parts: list[str] = []
1565
+ for msg in messages:
1566
+ role = msg.get("role", "user")
1567
+ content = msg.get("content")
1568
+ if content is None:
1569
+ continue
1570
+ text = content if isinstance(content, str) else str(content)
1571
+ if role == "system":
1572
+ parts.append(f"System: {text}")
1573
+ elif role == "assistant":
1574
+ parts.append(f"Assistant: {text}")
1575
+ else:
1576
+ parts.append(text)
1577
+ return "\n\n".join(parts)
1578
+
1579
+
1580
+ async def _execute_gemini(
1581
+ client: Any,
1582
+ model_params: dict[str, Any],
1583
+ messages: list[dict[str, Any]],
1584
+ *,
1585
+ stream: bool = False,
1586
+ max_tokens: int | None = None,
1587
+ temperature: float | None = None,
1588
+ ) -> "ChatExecutionResult | AsyncIterator[ChatExecutionChunk]":
1589
+ """Execute via Gemini ``GenerativeModel.generate_content_async``.
1590
+
1591
+ Gemini keeps the system role inside the prompt / system instruction (Req 2.11).
1592
+ Token usage is read from ``usage_metadata`` (``prompt_token_count`` /
1593
+ ``candidates_token_count`` / ``thoughts_token_count``).
1594
+ """
1595
+ model, effective_temperature, effective_max_tokens = _resolve_call_params(
1596
+ model_params, max_tokens, temperature
1597
+ )
1598
+ contents = _messages_to_gemini_contents(messages)
1599
+
1600
+ generation_config: dict[str, Any] = {"temperature": effective_temperature}
1601
+ if effective_max_tokens is not None:
1602
+ generation_config["max_output_tokens"] = effective_max_tokens
1603
+
1604
+ if stream:
1605
+
1606
+ async def _gemini_stream() -> AsyncIterator[ChatExecutionChunk]:
1607
+ collected: list[str] = []
1608
+ usage_metadata = None
1609
+ finish_reason: str | None = None
1610
+ response = await client.generate_content_async(
1611
+ contents, generation_config=generation_config, stream=True
1612
+ )
1613
+ async for chunk in response:
1614
+ text = getattr(chunk, "text", None)
1615
+ if getattr(chunk, "usage_metadata", None):
1616
+ usage_metadata = chunk.usage_metadata
1617
+ if text:
1618
+ collected.append(text)
1619
+ yield ChatExecutionChunk(delta=text, model=model)
1620
+ full_text = "".join(collected)
1621
+ input_tokens, output_tokens, thinking_tokens, estimated = _normalize_gemini_usage(
1622
+ usage_metadata, model, messages, full_text
1623
+ )
1624
+ yield ChatExecutionChunk(
1625
+ delta="",
1626
+ model=model,
1627
+ done=True,
1628
+ finish_reason=finish_reason,
1629
+ input_tokens=input_tokens,
1630
+ output_tokens=output_tokens,
1631
+ thinking_tokens=thinking_tokens,
1632
+ usage_estimated=estimated,
1633
+ )
1634
+
1635
+ return _gemini_stream()
1636
+
1637
+ response = await client.generate_content_async(contents, generation_config=generation_config)
1638
+ content = getattr(response, "text", None) or ""
1639
+ finish_reason = None
1640
+ input_tokens, output_tokens, thinking_tokens, estimated = _normalize_gemini_usage(
1641
+ getattr(response, "usage_metadata", None), model, messages, content
1642
+ )
1643
+ return ChatExecutionResult(
1644
+ content=content,
1645
+ model=model,
1646
+ input_tokens=input_tokens,
1647
+ output_tokens=output_tokens,
1648
+ thinking_tokens=thinking_tokens,
1649
+ finish_reason=finish_reason,
1650
+ usage_estimated=estimated,
1651
+ )
1652
+
1653
+
1654
+ def _normalize_gemini_usage(
1655
+ usage_metadata: Any, model: str | None, messages: list[dict[str, Any]], output_text: str
1656
+ ) -> tuple[int, int, int, bool]:
1657
+ """Normalize Gemini ``usage_metadata`` to (input, output, thinking, estimated)."""
1658
+ if usage_metadata is not None:
1659
+ input_tokens = getattr(usage_metadata, "prompt_token_count", 0) or 0
1660
+ output_tokens = getattr(usage_metadata, "candidates_token_count", 0) or 0
1661
+ thinking_tokens = getattr(usage_metadata, "thoughts_token_count", 0) or 0
1662
+ return input_tokens, output_tokens, thinking_tokens, False
1663
+ input_tokens, output_tokens = _estimate_token_counts(
1664
+ model, _join_message_text(messages), output_text
1665
+ )
1666
+ return input_tokens, output_tokens, 0, True
@@ -42,6 +42,7 @@ from agent_framework.monitoring.metrics_aggregator import (
42
42
  MetricsAggregator,
43
43
  UnifiedMetricsDocument,
44
44
  ensure_unified_index_template,
45
+ write_unified_metrics_document,
45
46
  )
46
47
  from agent_framework.monitoring.metrics_config import (
47
48
  MetricsConfig,
@@ -161,6 +162,7 @@ __all__ = [
161
162
  "MetricsAggregator",
162
163
  "UnifiedMetricsDocument",
163
164
  "ensure_unified_index_template",
165
+ "write_unified_metrics_document",
164
166
  # LLM Metrics Extraction
165
167
  "LLMMetricsExtractor",
166
168
  "TraceMetricsAccumulator",