langfun 0.1.2.dev202510310805__tar.gz → 0.1.2.dev202511020804__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.

Potentially problematic release.


This version of langfun might be problematic. Click here for more details.

Files changed (206) hide show
  1. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/PKG-INFO +1 -1
  2. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/eval/v2/runners_test.py +3 -0
  3. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/env/__init__.py +5 -3
  4. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/env/base_environment.py +74 -24
  5. langfun-0.1.2.dev202511020804/langfun/env/base_environment_test.py +473 -0
  6. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/env/base_feature.py +77 -15
  7. langfun-0.1.2.dev202511020804/langfun/env/base_feature_test.py +228 -0
  8. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/env/base_sandbox.py +40 -124
  9. langfun-0.1.2.dev202510310805/langfun/env/base_test.py → langfun-0.1.2.dev202511020804/langfun/env/base_sandbox_test.py +274 -730
  10. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/env/event_handlers/__init__.py +1 -1
  11. langfun-0.1.2.dev202511020804/langfun/env/event_handlers/chain.py +233 -0
  12. langfun-0.1.2.dev202511020804/langfun/env/event_handlers/chain_test.py +253 -0
  13. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/env/event_handlers/event_logger.py +95 -98
  14. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/env/event_handlers/event_logger_test.py +19 -19
  15. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/env/event_handlers/metric_writer.py +193 -157
  16. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/env/event_handlers/metric_writer_test.py +1 -1
  17. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/env/interface.py +677 -47
  18. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/env/interface_test.py +30 -1
  19. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/env/test_utils.py +111 -82
  20. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun.egg-info/PKG-INFO +1 -1
  21. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun.egg-info/SOURCES.txt +5 -2
  22. langfun-0.1.2.dev202510310805/langfun/env/event_handlers/base.py +0 -350
  23. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/LICENSE +0 -0
  24. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/README.md +0 -0
  25. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/__init__.py +0 -0
  26. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/assistant/capabilities/gui/__init__.py +0 -0
  27. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/assistant/capabilities/gui/bounding_box_parser.py +0 -0
  28. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/assistant/capabilities/gui/bounding_box_parser_test.py +0 -0
  29. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/assistant/capabilities/gui/drawing.py +0 -0
  30. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/assistant/capabilities/gui/drawing_test.py +0 -0
  31. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/assistant/capabilities/gui/location.py +0 -0
  32. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/assistant/capabilities/gui/location_test.py +0 -0
  33. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/__init__.py +0 -0
  34. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/agentic/__init__.py +0 -0
  35. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/agentic/action.py +0 -0
  36. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/agentic/action_eval.py +0 -0
  37. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/agentic/action_eval_test.py +0 -0
  38. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/agentic/action_test.py +0 -0
  39. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/async_support.py +0 -0
  40. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/async_support_test.py +0 -0
  41. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/coding/__init__.py +0 -0
  42. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/coding/python/__init__.py +0 -0
  43. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/coding/python/correction.py +0 -0
  44. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/coding/python/correction_test.py +0 -0
  45. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/coding/python/execution.py +0 -0
  46. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/coding/python/execution_test.py +0 -0
  47. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/coding/python/generation.py +0 -0
  48. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/coding/python/generation_test.py +0 -0
  49. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/coding/python/parsing.py +0 -0
  50. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/coding/python/parsing_test.py +0 -0
  51. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/coding/python/sandboxing.py +0 -0
  52. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/coding/python/sandboxing_test.py +0 -0
  53. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/component.py +0 -0
  54. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/component_test.py +0 -0
  55. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/concurrent.py +0 -0
  56. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/concurrent_test.py +0 -0
  57. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/console.py +0 -0
  58. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/console_test.py +0 -0
  59. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/data/__init__.py +0 -0
  60. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/data/conversion/__init__.py +0 -0
  61. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/data/conversion/anthropic.py +0 -0
  62. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/data/conversion/anthropic_test.py +0 -0
  63. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/data/conversion/gemini.py +0 -0
  64. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/data/conversion/gemini_test.py +0 -0
  65. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/data/conversion/openai.py +0 -0
  66. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/data/conversion/openai_test.py +0 -0
  67. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/eval/__init__.py +0 -0
  68. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/eval/base.py +0 -0
  69. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/eval/base_test.py +0 -0
  70. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/eval/matching.py +0 -0
  71. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/eval/matching_test.py +0 -0
  72. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/eval/patching.py +0 -0
  73. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/eval/patching_test.py +0 -0
  74. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/eval/scoring.py +0 -0
  75. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/eval/scoring_test.py +0 -0
  76. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/eval/v2/__init__.py +0 -0
  77. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/eval/v2/checkpointing.py +0 -0
  78. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/eval/v2/checkpointing_test.py +0 -0
  79. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/eval/v2/eval_test_helper.py +0 -0
  80. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/eval/v2/evaluation.py +0 -0
  81. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/eval/v2/evaluation_test.py +0 -0
  82. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/eval/v2/example.py +0 -0
  83. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/eval/v2/example_test.py +0 -0
  84. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/eval/v2/experiment.py +0 -0
  85. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/eval/v2/experiment_test.py +0 -0
  86. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/eval/v2/metric_values.py +0 -0
  87. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/eval/v2/metric_values_test.py +0 -0
  88. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/eval/v2/metrics.py +0 -0
  89. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/eval/v2/metrics_test.py +0 -0
  90. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/eval/v2/progress.py +0 -0
  91. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/eval/v2/progress_test.py +0 -0
  92. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/eval/v2/progress_tracking.py +0 -0
  93. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/eval/v2/progress_tracking_test.py +0 -0
  94. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/eval/v2/reporting.py +0 -0
  95. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/eval/v2/reporting_test.py +0 -0
  96. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/eval/v2/runners.py +0 -0
  97. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/langfunc.py +0 -0
  98. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/langfunc_test.py +0 -0
  99. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/language_model.py +0 -0
  100. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/language_model_test.py +0 -0
  101. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/llms/__init__.py +0 -0
  102. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/llms/anthropic.py +0 -0
  103. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/llms/anthropic_test.py +0 -0
  104. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/llms/azure_openai.py +0 -0
  105. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/llms/azure_openai_test.py +0 -0
  106. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/llms/cache/__init__.py +0 -0
  107. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/llms/cache/base.py +0 -0
  108. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/llms/cache/in_memory.py +0 -0
  109. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/llms/cache/in_memory_test.py +0 -0
  110. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/llms/compositional.py +0 -0
  111. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/llms/compositional_test.py +0 -0
  112. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/llms/deepseek.py +0 -0
  113. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/llms/deepseek_test.py +0 -0
  114. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/llms/fake.py +0 -0
  115. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/llms/fake_test.py +0 -0
  116. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/llms/gemini.py +0 -0
  117. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/llms/gemini_test.py +0 -0
  118. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/llms/google_genai.py +0 -0
  119. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/llms/google_genai_test.py +0 -0
  120. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/llms/groq.py +0 -0
  121. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/llms/groq_test.py +0 -0
  122. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/llms/llama_cpp.py +0 -0
  123. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/llms/llama_cpp_test.py +0 -0
  124. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/llms/openai.py +0 -0
  125. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/llms/openai_compatible.py +0 -0
  126. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/llms/openai_compatible_test.py +0 -0
  127. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/llms/openai_test.py +0 -0
  128. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/llms/rest.py +0 -0
  129. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/llms/rest_test.py +0 -0
  130. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/llms/vertexai.py +0 -0
  131. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/llms/vertexai_test.py +0 -0
  132. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/logging.py +0 -0
  133. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/logging_test.py +0 -0
  134. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/mcp/__init__.py +0 -0
  135. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/mcp/client.py +0 -0
  136. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/mcp/client_test.py +0 -0
  137. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/mcp/session.py +0 -0
  138. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/mcp/session_test.py +0 -0
  139. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/mcp/testing/simple_mcp_client.py +0 -0
  140. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/mcp/testing/simple_mcp_server.py +0 -0
  141. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/mcp/tool.py +0 -0
  142. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/mcp/tool_test.py +0 -0
  143. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/memories/__init__.py +0 -0
  144. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/memories/conversation_history.py +0 -0
  145. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/memories/conversation_history_test.py +0 -0
  146. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/memory.py +0 -0
  147. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/message.py +0 -0
  148. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/message_test.py +0 -0
  149. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/modalities/__init__.py +0 -0
  150. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/modalities/audio.py +0 -0
  151. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/modalities/audio_test.py +0 -0
  152. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/modalities/image.py +0 -0
  153. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/modalities/image_test.py +0 -0
  154. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/modalities/mime.py +0 -0
  155. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/modalities/mime_test.py +0 -0
  156. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/modalities/pdf.py +0 -0
  157. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/modalities/pdf_test.py +0 -0
  158. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/modalities/video.py +0 -0
  159. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/modalities/video_test.py +0 -0
  160. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/modality.py +0 -0
  161. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/modality_test.py +0 -0
  162. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/natural_language.py +0 -0
  163. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/natural_language_test.py +0 -0
  164. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/sampling.py +0 -0
  165. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/sampling_test.py +0 -0
  166. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/structured/__init__.py +0 -0
  167. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/structured/completion.py +0 -0
  168. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/structured/completion_test.py +0 -0
  169. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/structured/description.py +0 -0
  170. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/structured/description_test.py +0 -0
  171. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/structured/function_generation.py +0 -0
  172. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/structured/function_generation_test.py +0 -0
  173. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/structured/mapping.py +0 -0
  174. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/structured/mapping_test.py +0 -0
  175. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/structured/parsing.py +0 -0
  176. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/structured/parsing_test.py +0 -0
  177. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/structured/querying.py +0 -0
  178. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/structured/querying_test.py +0 -0
  179. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/structured/schema.py +0 -0
  180. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/structured/schema_generation.py +0 -0
  181. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/structured/schema_generation_test.py +0 -0
  182. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/structured/schema_test.py +0 -0
  183. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/structured/scoring.py +0 -0
  184. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/structured/scoring_test.py +0 -0
  185. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/structured/tokenization.py +0 -0
  186. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/structured/tokenization_test.py +0 -0
  187. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/subscription.py +0 -0
  188. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/subscription_test.py +0 -0
  189. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/template.py +0 -0
  190. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/template_test.py +0 -0
  191. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/templates/__init__.py +0 -0
  192. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/templates/completion.py +0 -0
  193. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/templates/completion_test.py +0 -0
  194. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/templates/conversation.py +0 -0
  195. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/templates/conversation_test.py +0 -0
  196. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/templates/demonstration.py +0 -0
  197. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/templates/demonstration_test.py +0 -0
  198. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/templates/selfplay.py +0 -0
  199. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/core/templates/selfplay_test.py +0 -0
  200. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/env/load_balancers.py +0 -0
  201. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun/env/load_balancers_test.py +0 -0
  202. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun.egg-info/dependency_links.txt +0 -0
  203. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun.egg-info/requires.txt +0 -0
  204. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/langfun.egg-info/top_level.txt +0 -0
  205. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/setup.cfg +0 -0
  206. {langfun-0.1.2.dev202510310805 → langfun-0.1.2.dev202511020804}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: langfun
3
- Version: 0.1.2.dev202510310805
3
+ Version: 0.1.2.dev202511020804
4
4
  Summary: Langfun: Language as Functions.
5
5
  Home-page: https://github.com/google/langfun
6
6
  Author: Langfun Authors
@@ -100,6 +100,9 @@ class RunnerTest(unittest.TestCase):
100
100
  print(i, pg.diff(x, y))
101
101
  self.assertIs(x, y)
102
102
 
103
+
104
+ class SequentialRunnerTest(RunnerTest):
105
+
103
106
  def test_basic(self):
104
107
  plugin = TestPlugin()
105
108
  exp = eval_test_helper.test_experiment()
@@ -24,9 +24,11 @@ from langfun.env.interface import Environment
24
24
  from langfun.env.interface import Sandbox
25
25
  from langfun.env.interface import Feature
26
26
 
27
+ from langfun.env.interface import EventHandler
28
+
27
29
  # Decorators for sandbox/feature methods.
28
30
  from langfun.env.interface import treat_as_sandbox_state_error
29
- from langfun.env.interface import log_sandbox_activity
31
+ from langfun.env.interface import log_activity
30
32
 
31
33
  from langfun.env.base_environment import BaseEnvironment
32
34
  from langfun.env.base_sandbox import BaseSandbox
@@ -35,7 +37,7 @@ from langfun.env.base_feature import BaseFeature
35
37
  from langfun.env import load_balancers
36
38
  from langfun.env.load_balancers import LoadBalancer
37
39
 
38
- from langfun.env import event_handlers
39
- EventHandler = event_handlers.EventHandler
40
+ # Import all event handlers.
41
+ from langfun.env.event_handlers import *
40
42
 
41
43
  # Google-internal imports.
@@ -36,7 +36,6 @@ import langfun.core as lf
36
36
  from langfun.env import base_sandbox
37
37
  from langfun.env import interface
38
38
  from langfun.env import load_balancers
39
- from langfun.env.event_handlers import base as event_handler_base
40
39
  import pyglove as pg
41
40
 
42
41
 
@@ -113,12 +112,13 @@ class BaseEnvironment(interface.Environment):
113
112
  )
114
113
  ] = True
115
114
 
116
- event_handlers: Annotated[
117
- list[event_handler_base.EventHandler],
115
+ event_handler: Annotated[
116
+ interface.EventHandler,
118
117
  (
119
118
  'User handler for the environment events.'
119
+ 'By default, the no-op event handler is used.'
120
120
  )
121
- ] = []
121
+ ] = interface.EventHandler()
122
122
 
123
123
  outage_grace_period: Annotated[
124
124
  float,
@@ -169,6 +169,7 @@ class BaseEnvironment(interface.Environment):
169
169
 
170
170
  self._status = self.Status.CREATED
171
171
  self._start_time = None
172
+
172
173
  self._sandbox_pool: dict[str, list[base_sandbox.BaseSandbox]] = (
173
174
  collections.defaultdict(list)
174
175
  )
@@ -178,6 +179,7 @@ class BaseEnvironment(interface.Environment):
178
179
  )
179
180
  self._housekeep_thread = None
180
181
  self._offline_start_time = None
182
+ self._non_sandbox_based_features_with_setup_called = set()
181
183
 
182
184
  # Check image IDs and feature requirements.
183
185
  self._check_image_ids()
@@ -191,7 +193,9 @@ class BaseEnvironment(interface.Environment):
191
193
  if self.supports_dynamic_image_loading:
192
194
  return
193
195
  for name, feature in self.features.items():
194
- if any(feature.is_applicable(image_id) for image_id in self.image_ids):
196
+ if not feature.is_sandbox_based or any(
197
+ feature.is_applicable(image_id) for image_id in self.image_ids
198
+ ):
195
199
  continue
196
200
  raise ValueError(
197
201
  f'Feature {name!r} is not applicable to all available images: '
@@ -266,6 +270,13 @@ class BaseEnvironment(interface.Environment):
266
270
  def _start(self) -> None:
267
271
  """Implementation of starting the environment."""
268
272
  sandbox_startup_infos = []
273
+ self._non_sandbox_based_features_with_setup_called.clear()
274
+ # Setup all non-sandbox-based features.
275
+ for feature in self.non_sandbox_based_features():
276
+ self._non_sandbox_based_features_with_setup_called.add(feature.name)
277
+ feature.setup(sandbox=None)
278
+
279
+ # Setup sandbox pools.
269
280
  for image_id in self.image_ids:
270
281
  next_sandbox_id = 0
271
282
  if self.enable_pooling(image_id):
@@ -311,10 +322,15 @@ class BaseEnvironment(interface.Environment):
311
322
  self._housekeep_thread.join()
312
323
  self._housekeep_thread = None
313
324
 
314
- def _shutdown_sandbox(sandbox: base_sandbox.BaseSandbox) -> None:
315
- if sandbox is not None:
316
- sandbox.shutdown()
325
+ # Teardown all non-sandbox-based features.
326
+ for feature in self.non_sandbox_based_features():
327
+ if feature.name in self._non_sandbox_based_features_with_setup_called:
328
+ try:
329
+ feature.teardown()
330
+ except BaseException: # pylint: disable=broad-except
331
+ pass
317
332
 
333
+ # Shutdown sandbox pools.
318
334
  if self._sandbox_pool:
319
335
  sandboxes = []
320
336
  for sandbox in self._sandbox_pool.values():
@@ -322,6 +338,10 @@ class BaseEnvironment(interface.Environment):
322
338
  self._sandbox_pool = {}
323
339
 
324
340
  if sandboxes:
341
+ def _shutdown_sandbox(sandbox: base_sandbox.BaseSandbox) -> None:
342
+ if sandbox is not None:
343
+ sandbox.shutdown()
344
+
325
345
  _ = list(
326
346
  lf.concurrent_map(
327
347
  _shutdown_sandbox,
@@ -555,8 +575,6 @@ class BaseEnvironment(interface.Environment):
555
575
  proactive_session_setup=self.proactive_session_setup,
556
576
  keepalive_interval=self.sandbox_keepalive_interval,
557
577
  )
558
- for handler in self.event_handlers:
559
- sandbox.add_event_handler(handler)
560
578
  sandbox.start()
561
579
  if set_acquired:
562
580
  sandbox.set_acquired()
@@ -636,9 +654,45 @@ class BaseEnvironment(interface.Environment):
636
654
  indices_by_image_id[image_id].append(i)
637
655
  return indices_by_image_id
638
656
 
657
+ last_housekeep_time = {
658
+ f.name: time.time() for f in self.non_sandbox_based_features()
659
+ }
660
+
639
661
  while self._status not in (self.Status.SHUTTING_DOWN, self.Status.OFFLINE):
640
662
  housekeep_start_time = time.time()
663
+ feature_housekeep_successes = []
664
+ feature_housekeep_failures = []
665
+
666
+ # Housekeeping non-sandbox-based features.
667
+ for feature in self.non_sandbox_based_features():
668
+ if feature.housekeep_interval is None:
669
+ continue
670
+ if (last_housekeep_time[feature.name]
671
+ + feature.housekeep_interval < time.time()):
672
+ try:
673
+ feature.housekeep()
674
+ last_housekeep_time[feature.name] = time.time()
675
+ feature_housekeep_successes.append(feature.name)
676
+ except BaseException as e: # pylint: disable=broad-except
677
+ pg.logging.error(
678
+ '[%s/%s]: Feature housekeeping failed with error: %s.'
679
+ 'Shutting down environment...',
680
+ self.id,
681
+ feature.name,
682
+ e,
683
+ )
684
+ feature_housekeep_failures.append(feature.name)
685
+ self._housekeep_counter += 1
686
+ self.on_housekeep(
687
+ duration=time.time() - housekeep_start_time,
688
+ error=e,
689
+ feature_housekeep_successes=feature_housekeep_successes,
690
+ feature_housekeep_failures=feature_housekeep_failures,
691
+ )
692
+ self.shutdown()
693
+ return
641
694
 
695
+ # Replace dead sandboxes.
642
696
  is_online = True
643
697
  dead_sandbox_entries = []
644
698
  for image_id, sandboxes in self._sandbox_pool.items():
@@ -659,6 +713,8 @@ class BaseEnvironment(interface.Environment):
659
713
  duration = time.time() - housekeep_start_time
660
714
 
661
715
  kwargs = dict(
716
+ feature_housekeep_successes=feature_housekeep_successes,
717
+ feature_housekeep_failures=feature_housekeep_failures,
662
718
  dead_sandboxes=_indices_by_image_id(dead_sandbox_entries),
663
719
  replaced_sandboxes=replaced_indices_by_image_id,
664
720
  offline_duration=self.offline_duration,
@@ -667,7 +723,6 @@ class BaseEnvironment(interface.Environment):
667
723
  self.on_housekeep(duration, **kwargs)
668
724
  time.sleep(self.housekeep_interval)
669
725
  else:
670
- self.shutdown()
671
726
  self.on_housekeep(
672
727
  duration,
673
728
  interface.EnvironmentOutageError(
@@ -675,6 +730,7 @@ class BaseEnvironment(interface.Environment):
675
730
  ),
676
731
  **kwargs
677
732
  )
733
+ self.shutdown()
678
734
 
679
735
  def _replace_dead_sandboxes(
680
736
  self,
@@ -738,16 +794,14 @@ class BaseEnvironment(interface.Environment):
738
794
 
739
795
  def on_starting(self) -> None:
740
796
  """Called when the environment is getting started."""
741
- for handler in self.event_handlers:
742
- handler.on_environment_starting(self)
797
+ self.event_handler.on_environment_starting(self)
743
798
 
744
799
  def on_start(
745
800
  self,
746
801
  duration: float, error: BaseException | None = None
747
802
  ) -> None:
748
803
  """Called when the environment is started."""
749
- for handler in self.event_handlers:
750
- handler.on_environment_start(self, duration, error)
804
+ self.event_handler.on_environment_start(self, duration, error)
751
805
 
752
806
  def on_housekeep(
753
807
  self,
@@ -756,16 +810,13 @@ class BaseEnvironment(interface.Environment):
756
810
  **kwargs
757
811
  ) -> None:
758
812
  """Called when the environment finishes a round of housekeeping."""
759
- housekeep_counter = self.housekeep_counter
760
- for handler in self.event_handlers:
761
- handler.on_environment_housekeep(
762
- self, housekeep_counter, duration, error, **kwargs
763
- )
813
+ self.event_handler.on_environment_housekeep(
814
+ self, self.housekeep_counter, duration, error, **kwargs
815
+ )
764
816
 
765
817
  def on_shutting_down(self) -> None:
766
818
  """Called when the environment is shutting down."""
767
- for handler in self.event_handlers:
768
- handler.on_environment_shutting_down(self, self.offline_duration)
819
+ self.event_handler.on_environment_shutting_down(self, self.offline_duration)
769
820
 
770
821
  def on_shutdown(
771
822
  self,
@@ -773,5 +824,4 @@ class BaseEnvironment(interface.Environment):
773
824
  error: BaseException | None = None) -> None:
774
825
  """Called when the environment is shutdown."""
775
826
  lifetime = (time.time() - self.start_time) if self.start_time else 0.0
776
- for handler in self.event_handlers:
777
- handler.on_environment_shutdown(self, duration, lifetime, error)
827
+ self.event_handler.on_environment_shutdown(self, duration, lifetime, error)