langfun 0.1.2.dev202504170804__tar.gz → 0.1.2.dev202504190803__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 (168) hide show
  1. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/PKG-INFO +1 -1
  2. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/agentic/action.py +11 -1
  3. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/agentic/action_test.py +2 -0
  4. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/eval/base_test.py +6 -6
  5. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/eval/matching_test.py +3 -2
  6. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/eval/scoring_test.py +4 -6
  7. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/langfunc_test.py +4 -3
  8. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/language_model.py +10 -0
  9. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/llms/__init__.py +2 -0
  10. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/llms/openai.py +62 -0
  11. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/llms/openai_compatible.py +5 -1
  12. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/message_test.py +3 -3
  13. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun.egg-info/PKG-INFO +1 -1
  14. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/LICENSE +0 -0
  15. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/README.md +0 -0
  16. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/__init__.py +0 -0
  17. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/__init__.py +0 -0
  18. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/agentic/__init__.py +0 -0
  19. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/agentic/action_eval.py +0 -0
  20. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/agentic/action_eval_test.py +0 -0
  21. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/coding/__init__.py +0 -0
  22. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/coding/python/__init__.py +0 -0
  23. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/coding/python/correction.py +0 -0
  24. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/coding/python/correction_test.py +0 -0
  25. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/coding/python/execution.py +0 -0
  26. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/coding/python/execution_test.py +0 -0
  27. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/coding/python/generation.py +0 -0
  28. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/coding/python/generation_test.py +0 -0
  29. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/coding/python/parsing.py +0 -0
  30. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/coding/python/parsing_test.py +0 -0
  31. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/coding/python/sandboxing.py +0 -0
  32. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/coding/python/sandboxing_test.py +0 -0
  33. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/component.py +0 -0
  34. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/component_test.py +0 -0
  35. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/concurrent.py +0 -0
  36. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/concurrent_test.py +0 -0
  37. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/console.py +0 -0
  38. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/console_test.py +0 -0
  39. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/data/__init__.py +0 -0
  40. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/data/conversion/__init__.py +0 -0
  41. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/data/conversion/anthropic.py +0 -0
  42. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/data/conversion/anthropic_test.py +0 -0
  43. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/data/conversion/gemini.py +0 -0
  44. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/data/conversion/gemini_test.py +0 -0
  45. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/data/conversion/openai.py +0 -0
  46. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/data/conversion/openai_test.py +0 -0
  47. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/eval/__init__.py +0 -0
  48. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/eval/base.py +0 -0
  49. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/eval/matching.py +0 -0
  50. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/eval/patching.py +0 -0
  51. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/eval/patching_test.py +0 -0
  52. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/eval/scoring.py +0 -0
  53. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/eval/v2/__init__.py +0 -0
  54. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/eval/v2/checkpointing.py +0 -0
  55. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/eval/v2/checkpointing_test.py +0 -0
  56. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/eval/v2/eval_test_helper.py +0 -0
  57. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/eval/v2/evaluation.py +0 -0
  58. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/eval/v2/evaluation_test.py +0 -0
  59. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/eval/v2/example.py +0 -0
  60. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/eval/v2/example_test.py +0 -0
  61. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/eval/v2/experiment.py +0 -0
  62. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/eval/v2/experiment_test.py +0 -0
  63. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/eval/v2/metric_values.py +0 -0
  64. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/eval/v2/metric_values_test.py +0 -0
  65. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/eval/v2/metrics.py +0 -0
  66. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/eval/v2/metrics_test.py +0 -0
  67. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/eval/v2/progress.py +0 -0
  68. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/eval/v2/progress_test.py +0 -0
  69. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/eval/v2/progress_tracking.py +0 -0
  70. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/eval/v2/progress_tracking_test.py +0 -0
  71. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/eval/v2/reporting.py +0 -0
  72. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/eval/v2/reporting_test.py +0 -0
  73. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/eval/v2/runners.py +0 -0
  74. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/eval/v2/runners_test.py +0 -0
  75. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/langfunc.py +0 -0
  76. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/language_model_test.py +0 -0
  77. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/llms/anthropic.py +0 -0
  78. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/llms/anthropic_test.py +0 -0
  79. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/llms/azure_openai.py +0 -0
  80. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/llms/azure_openai_test.py +0 -0
  81. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/llms/cache/__init__.py +0 -0
  82. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/llms/cache/base.py +0 -0
  83. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/llms/cache/in_memory.py +0 -0
  84. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/llms/cache/in_memory_test.py +0 -0
  85. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/llms/compositional.py +0 -0
  86. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/llms/compositional_test.py +0 -0
  87. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/llms/deepseek.py +0 -0
  88. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/llms/deepseek_test.py +0 -0
  89. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/llms/fake.py +0 -0
  90. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/llms/fake_test.py +0 -0
  91. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/llms/gemini.py +0 -0
  92. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/llms/gemini_test.py +0 -0
  93. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/llms/google_genai.py +0 -0
  94. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/llms/google_genai_test.py +0 -0
  95. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/llms/groq.py +0 -0
  96. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/llms/groq_test.py +0 -0
  97. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/llms/llama_cpp.py +0 -0
  98. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/llms/llama_cpp_test.py +0 -0
  99. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/llms/openai_compatible_test.py +0 -0
  100. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/llms/openai_test.py +0 -0
  101. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/llms/rest.py +0 -0
  102. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/llms/rest_test.py +0 -0
  103. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/llms/vertexai.py +0 -0
  104. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/llms/vertexai_test.py +0 -0
  105. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/logging.py +0 -0
  106. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/logging_test.py +0 -0
  107. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/memories/__init__.py +0 -0
  108. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/memories/conversation_history.py +0 -0
  109. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/memories/conversation_history_test.py +0 -0
  110. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/memory.py +0 -0
  111. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/message.py +0 -0
  112. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/modalities/__init__.py +0 -0
  113. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/modalities/audio.py +0 -0
  114. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/modalities/audio_test.py +0 -0
  115. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/modalities/image.py +0 -0
  116. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/modalities/image_test.py +0 -0
  117. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/modalities/mime.py +0 -0
  118. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/modalities/mime_test.py +0 -0
  119. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/modalities/pdf.py +0 -0
  120. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/modalities/pdf_test.py +0 -0
  121. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/modalities/video.py +0 -0
  122. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/modalities/video_test.py +0 -0
  123. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/modality.py +0 -0
  124. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/modality_test.py +0 -0
  125. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/natural_language.py +0 -0
  126. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/natural_language_test.py +0 -0
  127. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/sampling.py +0 -0
  128. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/sampling_test.py +0 -0
  129. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/structured/__init__.py +0 -0
  130. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/structured/completion.py +0 -0
  131. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/structured/completion_test.py +0 -0
  132. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/structured/description.py +0 -0
  133. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/structured/description_test.py +0 -0
  134. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/structured/function_generation.py +0 -0
  135. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/structured/function_generation_test.py +0 -0
  136. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/structured/mapping.py +0 -0
  137. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/structured/mapping_test.py +0 -0
  138. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/structured/parsing.py +0 -0
  139. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/structured/parsing_test.py +0 -0
  140. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/structured/querying.py +0 -0
  141. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/structured/querying_test.py +0 -0
  142. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/structured/schema.py +0 -0
  143. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/structured/schema_generation.py +0 -0
  144. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/structured/schema_generation_test.py +0 -0
  145. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/structured/schema_test.py +0 -0
  146. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/structured/scoring.py +0 -0
  147. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/structured/scoring_test.py +0 -0
  148. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/structured/tokenization.py +0 -0
  149. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/structured/tokenization_test.py +0 -0
  150. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/subscription.py +0 -0
  151. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/subscription_test.py +0 -0
  152. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/template.py +0 -0
  153. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/template_test.py +0 -0
  154. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/templates/__init__.py +0 -0
  155. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/templates/completion.py +0 -0
  156. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/templates/completion_test.py +0 -0
  157. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/templates/conversation.py +0 -0
  158. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/templates/conversation_test.py +0 -0
  159. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/templates/demonstration.py +0 -0
  160. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/templates/demonstration_test.py +0 -0
  161. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/templates/selfplay.py +0 -0
  162. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun/core/templates/selfplay_test.py +0 -0
  163. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun.egg-info/SOURCES.txt +0 -0
  164. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun.egg-info/dependency_links.txt +0 -0
  165. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun.egg-info/requires.txt +0 -0
  166. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/langfun.egg-info/top_level.txt +0 -0
  167. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/setup.cfg +0 -0
  168. {langfun-0.1.2.dev202504170804 → langfun-0.1.2.dev202504190803}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: langfun
3
- Version: 0.1.2.dev202504170804
3
+ Version: 0.1.2.dev202504190803
4
4
  Summary: Langfun: Language as Functions.
5
5
  Home-page: https://github.com/google/langfun
6
6
  Author: Langfun Authors
@@ -199,6 +199,11 @@ class ExecutionTrace(pg.Object, pg.views.html.HtmlTreeView.Extension):
199
199
  """Returns all queries from current trace and its child execution items."""
200
200
  return self._all_child_items(lf_structured.QueryInvocation)
201
201
 
202
+ @property
203
+ def all_actions(self) -> list['ActionInvocation']:
204
+ """Returns all actions from current trace and its child execution items."""
205
+ return self._all_child_items(ActionInvocation)
206
+
202
207
  @property
203
208
  def all_logs(self) -> list[lf.logging.LogEntry]:
204
209
  """Returns all logs from current trace and its child execution items."""
@@ -221,7 +226,7 @@ class ExecutionTrace(pg.Object, pg.views.html.HtmlTreeView.Extension):
221
226
  for item in self.items:
222
227
  if isinstance(item, item_cls):
223
228
  child_items.append(item)
224
- elif isinstance(item, ActionInvocation):
229
+ if isinstance(item, ActionInvocation):
225
230
  child_items.extend(item.execution._all_child_items(item_cls)) # pylint: disable=protected-access
226
231
  elif isinstance(item, ExecutionTrace):
227
232
  child_items.extend(item._all_child_items(item_cls)) # pylint: disable=protected-access
@@ -582,6 +587,11 @@ class ActionInvocation(pg.Object, pg.views.html.HtmlTreeView.Extension):
582
587
  """Returns all queries made by the action and its child execution items."""
583
588
  return self.execution.all_queries
584
589
 
590
+ @property
591
+ def all_actions(self) -> list['ActionInvocation']:
592
+ """Returns all actions made by the action and its child execution items."""
593
+ return self.execution.all_actions
594
+
585
595
  @property
586
596
  def all_logs(self) -> list[lf.logging.LogEntry]:
587
597
  """Returns all logs made by the action and its child execution items."""
@@ -95,6 +95,8 @@ class SessionTest(unittest.TestCase):
95
95
  self.assertEqual(len(list(root.logs)), 0)
96
96
  # 1 query from Bar, 2 from Foo and 3 from parallel executions.
97
97
  self.assertEqual(len(list(root.all_queries)), 6)
98
+ # 2 actions: Foo and Bar.
99
+ self.assertEqual(len(list(root.all_actions)), 2)
98
100
  # 1 log from Bar and 1 from Foo.
99
101
  self.assertEqual(len(list(root.all_logs)), 2)
100
102
  self.assertEqual(root.usage_summary.total.num_requests, 6)
@@ -101,7 +101,7 @@ class EvaluationTest(unittest.TestCase):
101
101
  self.assertEqual(s.dir, os.path.join(s.root_dir, s.id))
102
102
  self.assertEqual(s.hash, s.clone().hash)
103
103
  # Test persistent hash.
104
- self.assertEqual(s.hash, '31a1c20a')
104
+ self.assertEqual(s.hash, 'e43392e4')
105
105
  self.assertEqual(
106
106
  s.hash, s.clone(override={'max_workers': 2, 'lm.timeout': 20}).hash
107
107
  )
@@ -211,7 +211,7 @@ class EvaluationTest(unittest.TestCase):
211
211
  s.result,
212
212
  dict(
213
213
  experiment_setup=dict(
214
- id='Evaluation@e06b5967',
214
+ id='Evaluation@2fbf1b05',
215
215
  dir=s.dir,
216
216
  model='StaticSequence',
217
217
  prompt_template='{{example.question}}',
@@ -376,7 +376,7 @@ class EvaluationTest(unittest.TestCase):
376
376
  s.children[0].dir, os.path.join(s.root_dir, s.children[0].id)
377
377
  )
378
378
  # Test persistent hash.
379
- self.assertEqual(s.hash, '9f4bc85b')
379
+ self.assertEqual(s.hash, 'de23bf31')
380
380
 
381
381
  summary = s.run(verbose=True)
382
382
  self.assertEqual(len(summary.evaluations), 2)
@@ -526,10 +526,10 @@ class SuiteTest(unittest.TestCase):
526
526
  lm=lm
527
527
  )
528
528
  # Test for persistent hash.
529
- self.assertEqual(s.hash, '2910c323')
529
+ self.assertEqual(s.hash, '1c42f93e')
530
530
  s.run()
531
531
  expected = {
532
- 'Evaluation@e06b5967': dict(
532
+ s.children[0].id: dict(
533
533
  experiment_setup=dict(
534
534
  id=s.children[0].id,
535
535
  dir=s.children[0].dir,
@@ -555,7 +555,7 @@ class SuiteTest(unittest.TestCase):
555
555
  ),
556
556
  usage=s.children[0].result.usage,
557
557
  ),
558
- 'Evaluation@31a1c20a': dict(
558
+ s.children[1].children[0].id: dict(
559
559
  experiment_setup=dict(
560
560
  id=s.children[1].children[0].id,
561
561
  dir=s.children[1].children[0].dir,
@@ -99,11 +99,12 @@ class MatchingTest(unittest.TestCase):
99
99
 
100
100
  s = eval_set('match_run_test', 'query', schema_fn=answer_schema(), lm=lm)
101
101
  s.run()
102
+ result_without_id = s.result.copy()
103
+ result_without_id['experiment_setup'].pop('id')
102
104
  self.assertEqual(
103
- s.result,
105
+ result_without_id,
104
106
  dict(
105
107
  experiment_setup=dict(
106
- id='MyTask@a98a284d',
107
108
  dir=s.dir,
108
109
  model='StaticSequence',
109
110
  prompt_template='{{example.question}}',
@@ -77,11 +77,12 @@ class ScoringTest(unittest.TestCase):
77
77
  s = eval_set(lm=lm)
78
78
  self.assertEqual(s.avg_score, 0.0)
79
79
  s.run()
80
+ result_copy = s.result.copy()
81
+ del result_copy['experiment_setup']['id']
80
82
  self.assertEqual(
81
- s.result,
83
+ result_copy,
82
84
  dict(
83
85
  experiment_setup=dict(
84
- id='ConstraintFollowing@90671d5e',
85
86
  dir=s.dir,
86
87
  model='StaticSequence',
87
88
  prompt_template='{{example}}',
@@ -89,10 +90,7 @@ class ScoringTest(unittest.TestCase):
89
90
  schema_fn='float_list()',
90
91
  ),
91
92
  cache_stats=dict(
92
- use_cache=True,
93
- num_queries=2,
94
- num_hits=0,
95
- num_updates=2,
93
+ use_cache=True, num_queries=2, num_hits=0, num_updates=2
96
94
  ),
97
95
  metrics=dict(
98
96
  total=2,
@@ -107,9 +107,10 @@ class LangFuncCallTest(unittest.TestCase):
107
107
  ' lm=ExcitedEchoer(sampling_options=LMSamplingOptions(temperature=None,'
108
108
  ' max_tokens=None, n=1, top_k=40, top_p=None, stop=None,'
109
109
  ' random_seed=None, logprobs=False, top_logprobs=None,'
110
- ' max_thinking_tokens=None), cache=None, max_concurrency=None,'
111
- ' timeout=120.0, max_attempts=5, retry_interval=(5, 60),'
112
- ' exponential_backoff=True, max_retry_interval=300, debug=False))',
110
+ ' max_thinking_tokens=None, reasoning_effort=None), cache=None,'
111
+ ' max_concurrency=None, timeout=120.0, max_attempts=5,'
112
+ ' retry_interval=(5, 60), exponential_backoff=True,'
113
+ ' max_retry_interval=300, debug=False))',
113
114
  )
114
115
 
115
116
  l = LangFunc('Hello')
@@ -408,6 +408,7 @@ class LMSamplingUsage(pg.Object):
408
408
  ),
409
409
  ] = None
410
410
  retry_stats: RetryStats = RetryStats()
411
+ completion_tokens_details: dict[str, Any] | None = None
411
412
 
412
413
  def __bool__(self) -> bool:
413
414
  return self.num_requests > 0
@@ -572,6 +573,15 @@ class LMSamplingOptions(component.Component):
572
573
  int | None, 'Number of max thinking tokens.'
573
574
  ] = None
574
575
 
576
+ reasoning_effort: Annotated[
577
+ Literal['low', 'medium', 'high'] | None,
578
+ (
579
+ 'This parameter is used by OpenAI reasoning models (e.g. O3, O4 mini)'
580
+ ' to guides how many reasoning tokens to generate before creating a'
581
+ ' response to the prompt.'
582
+ ),
583
+ ] = None
584
+
575
585
  def cache_key(self) -> tuple[Any, ...]:
576
586
  """Returns a tuple of current values as cache key."""
577
587
  return (
@@ -85,6 +85,8 @@ VertexAIGeminiFlash1_5 = VertexAIGemini15Flash
85
85
  # OpenAI models.
86
86
  from langfun.core.llms.openai import OpenAI
87
87
 
88
+ from langfun.core.llms.openai import GptO3
89
+ from langfun.core.llms.openai import GptO4Mini
88
90
  from langfun.core.llms.openai import Gpt45Preview_20250227
89
91
  from langfun.core.llms.openai import GptO3Mini
90
92
  from langfun.core.llms.openai import GptO1
@@ -49,6 +49,54 @@ class OpenAIModelInfo(lf.ModelInfo):
49
49
  #
50
50
 
51
51
  SUPPORTED_MODELS = [
52
+ # o3 models.
53
+ OpenAIModelInfo(
54
+ model_id='o3',
55
+ alias_for='o3-2025-04-16',
56
+ in_service=True,
57
+ model_type='thinking',
58
+ description='GPT O3 model.',
59
+ url='https://platform.openai.com/docs/models/o3',
60
+ input_modalities=OpenAIModelInfo.INPUT_IMAGE_TYPES,
61
+ context_length=lf.ModelInfo.ContextLength(
62
+ max_input_tokens=200_000,
63
+ max_output_tokens=100_000,
64
+ ),
65
+ pricing=lf.ModelInfo.Pricing(
66
+ cost_per_1m_cached_input_tokens=2.5,
67
+ cost_per_1m_input_tokens=10.0,
68
+ cost_per_1m_output_tokens=40.0,
69
+ ),
70
+ # Set to 1/3 of Tier 5 rate limits.
71
+ rate_limits=lf.ModelInfo.RateLimits(
72
+ max_requests_per_minute=3_000,
73
+ max_tokens_per_minute=10_000_000,
74
+ ),
75
+ ),
76
+ # o4-mini models.
77
+ OpenAIModelInfo(
78
+ model_id='o4-mini',
79
+ alias_for='o4-mini-2025-04-16',
80
+ in_service=True,
81
+ model_type='thinking',
82
+ description='GPT O4-mini model.',
83
+ url='https://platform.openai.com/docs/models/o4-mini',
84
+ input_modalities=OpenAIModelInfo.INPUT_IMAGE_TYPES,
85
+ context_length=lf.ModelInfo.ContextLength(
86
+ max_input_tokens=200_000,
87
+ max_output_tokens=100_000,
88
+ ),
89
+ pricing=lf.ModelInfo.Pricing(
90
+ cost_per_1m_cached_input_tokens=0.275,
91
+ cost_per_1m_input_tokens=1.1,
92
+ cost_per_1m_output_tokens=4.4,
93
+ ),
94
+ # Set to 1/3 of Tier 5 rate limits.
95
+ rate_limits=lf.ModelInfo.RateLimits(
96
+ max_requests_per_minute=10_000,
97
+ max_tokens_per_minute=50_000_000,
98
+ ),
99
+ ),
52
100
  # GPT-4.5 models
53
101
  OpenAIModelInfo(
54
102
  model_id='gpt-4.5-preview-2025-02-27',
@@ -997,6 +1045,20 @@ class OpenAI(openai_compatible.OpenAICompatible):
997
1045
  return super()._request_args(options)
998
1046
 
999
1047
 
1048
+ class GptO4Mini(OpenAI):
1049
+ """GPT O4 mini."""
1050
+
1051
+ model = 'o4-mini'
1052
+ timeout = None
1053
+
1054
+
1055
+ class GptO3(OpenAI):
1056
+ """GPT O3."""
1057
+
1058
+ model = 'o3'
1059
+ timeout = None
1060
+
1061
+
1000
1062
  class Gpt45Preview_20250227(OpenAI): # pylint: disable=invalid-name
1001
1063
  """Gpt-4.5 Preview 2025-02-27."""
1002
1064
 
@@ -60,6 +60,8 @@ class OpenAICompatible(rest.REST):
60
60
  args['stop'] = options.stop
61
61
  if options.random_seed is not None:
62
62
  args['seed'] = options.random_seed
63
+ if options.reasoning_effort is not None:
64
+ args['reasoning_effort'] = options.reasoning_effort
63
65
  return args
64
66
 
65
67
  def request(
@@ -156,7 +158,9 @@ class OpenAICompatible(rest.REST):
156
158
  prompt_tokens=usage['prompt_tokens'],
157
159
  completion_tokens=usage['completion_tokens'],
158
160
  total_tokens=usage['total_tokens'],
159
-
161
+ completion_tokens_details=usage.get(
162
+ 'completion_tokens_details', None
163
+ ),
160
164
  ),
161
165
  )
162
166
 
@@ -438,7 +438,7 @@ class MessageTest(unittest.TestCase):
438
438
  self.assert_html_content(
439
439
  ai_message.to_html(enable_summary_tooltip=False),
440
440
  """
441
- <details open class="pyglove ai-message lf-message"><summary><div class="summary-title lf-message">AIMessage(...)</div></summary><div class="complex_value"><div class="message-tags"><span>lm-response</span><span>lm-output</span></div><div class="message-text">My name is Gemini</div><div class="message-result"><details open class="pyglove dict"><summary><div class="summary-name">result<span class="tooltip">metadata.result</span></div><div class="summary-title">Dict(...)</div></summary><div class="complex-value dict"><details open class="pyglove int"><summary><div class="summary-name">x<span class="tooltip">metadata.result.x</span></div><div class="summary-title">int</div></summary><span class="simple-value int">1</span></details><details open class="pyglove int"><summary><div class="summary-name">y<span class="tooltip">metadata.result.y</span></div><div class="summary-title">int</div></summary><span class="simple-value int">2</span></details><details class="pyglove dict"><summary><div class="summary-name">z<span class="tooltip">metadata.result.z</span></div><div class="summary-title">Dict(...)</div></summary><div class="complex-value dict"><details class="pyglove list"><summary><div class="summary-name">a<span class="tooltip">metadata.result.z.a</span></div><div class="summary-title">List(...)</div></summary><div class="complex-value list"><table><tr><td><span class="object-key int">0</span><span class="tooltip">metadata.result.z.a[0]</span></td><td><span class="simple-value int">12</span></td></tr><tr><td><span class="object-key int">1</span><span class="tooltip">metadata.result.z.a[1]</span></td><td><span class="simple-value int">323</span></td></tr></table></div></details></div></details></div></details></div><div class="message-usage"><details open class="pyglove lm-sampling-usage"><summary><div class="summary-name">llm usage<span class="tooltip">metadata.usage</span></div><div class="summary-title">LMSamplingUsage(...)</div></summary><div class="complex-value lm-sampling-usage"><table><tr><td><span class="object-key str">prompt_tokens</span><span class="tooltip">metadata.usage.prompt_tokens</span></td><td><span class="simple-value int">10</span></td></tr><tr><td><span class="object-key str">completion_tokens</span><span class="tooltip">metadata.usage.completion_tokens</span></td><td><span class="simple-value int">2</span></td></tr><tr><td><span class="object-key str">total_tokens</span><span class="tooltip">metadata.usage.total_tokens</span></td><td><span class="simple-value int">12</span></td></tr><tr><td><span class="object-key str">num_requests</span><span class="tooltip">metadata.usage.num_requests</span></td><td><span class="simple-value int">1</span></td></tr><tr><td><span class="object-key str">estimated_cost</span><span class="tooltip">metadata.usage.estimated_cost</span></td><td><span class="simple-value none-type">None</span></td></tr><tr><td><span class="object-key str">retry_stats</span><span class="tooltip">metadata.usage.retry_stats</span></td><td><details class="pyglove retry-stats"><summary><div class="summary-title">RetryStats(...)</div></summary><div class="complex-value retry-stats"><table><tr><td><span class="object-key str">num_occurences</span><span class="tooltip">metadata.usage.retry_stats.num_occurences</span></td><td><span class="simple-value int">0</span></td></tr><tr><td><span class="object-key str">total_wait_interval</span><span class="tooltip">metadata.usage.retry_stats.total_wait_interval</span></td><td><span class="simple-value float">0.0</span></td></tr><tr><td><span class="object-key str">total_call_interval</span><span class="tooltip">metadata.usage.retry_stats.total_call_interval</span></td><td><span class="simple-value float">0.0</span></td></tr><tr><td><span class="object-key str">errors</span><span class="tooltip">metadata.usage.retry_stats.errors</span></td><td><details class="pyglove dict"><summary><div class="summary-title">Dict(...)</div></summary><div class="complex-value dict"><span class="empty-container"></span></div></details></td></tr></table></div></details></td></tr></table></div></details></div><div class="message-metadata"><details open class="pyglove dict message-metadata"><summary><div class="summary-name message-metadata">metadata<span class="tooltip message-metadata">metadata</span></div><div class="summary-title message-metadata">Dict(...)</div></summary><div class="complex-value dict"><span class="empty-container"></span></div></details></div><details open class="pyglove user-message lf-message"><summary><div class="summary-name lf-message">source<span class="tooltip lf-message">source</span></div><div class="summary-title lf-message">UserMessage(...)</div></summary><div class="complex_value"><div class="message-tags"><span>lm-input</span></div><div class="message-text">What is in this image?<div class="modality-in-text"><details class="pyglove custom-modality"><summary><div class="summary-name">image<span class="tooltip">source.metadata.image</span></div><div class="summary-title">CustomModality(...)</div></summary><div class="complex-value custom-modality"><details open class="pyglove str"><summary><div class="summary-name">content<span class="tooltip">source.metadata.image.content</span></div><div class="summary-title">str</div></summary><span class="simple-value str">&#x27;foo&#x27;</span></details></div></details></div>this is a test</div><div class="message-metadata"><details open class="pyglove dict message-metadata"><summary><div class="summary-name message-metadata">metadata<span class="tooltip message-metadata">source.metadata</span></div><div class="summary-title message-metadata">Dict(...)</div></summary><div class="complex-value dict"><details class="pyglove custom-modality"><summary><div class="summary-name">image<span class="tooltip">source.metadata.image</span></div><div class="summary-title">CustomModality(...)</div></summary><div class="complex-value custom-modality"><details open class="pyglove str"><summary><div class="summary-name">content<span class="tooltip">source.metadata.image.content</span></div><div class="summary-title">str</div></summary><span class="simple-value str">&#x27;foo&#x27;</span></details></div></details></div></details></div></div></details></div></details>
441
+ <details open class="pyglove ai-message lf-message"><summary><div class="summary-title lf-message">AIMessage(...)</div></summary><div class="complex_value"><div class="message-tags"><span>lm-response</span><span>lm-output</span></div><div class="message-text">My name is Gemini</div><div class="message-result"><details open class="pyglove dict"><summary><div class="summary-name">result<span class="tooltip">metadata.result</span></div><div class="summary-title">Dict(...)</div></summary><div class="complex-value dict"><details open class="pyglove int"><summary><div class="summary-name">x<span class="tooltip">metadata.result.x</span></div><div class="summary-title">int</div></summary><span class="simple-value int">1</span></details><details open class="pyglove int"><summary><div class="summary-name">y<span class="tooltip">metadata.result.y</span></div><div class="summary-title">int</div></summary><span class="simple-value int">2</span></details><details class="pyglove dict"><summary><div class="summary-name">z<span class="tooltip">metadata.result.z</span></div><div class="summary-title">Dict(...)</div></summary><div class="complex-value dict"><details class="pyglove list"><summary><div class="summary-name">a<span class="tooltip">metadata.result.z.a</span></div><div class="summary-title">List(...)</div></summary><div class="complex-value list"><table><tr><td><span class="object-key int">0</span><span class="tooltip">metadata.result.z.a[0]</span></td><td><span class="simple-value int">12</span></td></tr><tr><td><span class="object-key int">1</span><span class="tooltip">metadata.result.z.a[1]</span></td><td><span class="simple-value int">323</span></td></tr></table></div></details></div></details></div></details></div><div class="message-usage"><details open class="pyglove lm-sampling-usage"><summary><div class="summary-name">llm usage<span class="tooltip">metadata.usage</span></div><div class="summary-title">LMSamplingUsage(...)</div></summary><div class="complex-value lm-sampling-usage"><table><tr><td><span class="object-key str">prompt_tokens</span><span class="tooltip">metadata.usage.prompt_tokens</span></td><td><span class="simple-value int">10</span></td></tr><tr><td><span class="object-key str">completion_tokens</span><span class="tooltip">metadata.usage.completion_tokens</span></td><td><span class="simple-value int">2</span></td></tr><tr><td><span class="object-key str">total_tokens</span><span class="tooltip">metadata.usage.total_tokens</span></td><td><span class="simple-value int">12</span></td></tr><tr><td><span class="object-key str">num_requests</span><span class="tooltip">metadata.usage.num_requests</span></td><td><span class="simple-value int">1</span></td></tr><tr><td><span class="object-key str">estimated_cost</span><span class="tooltip">metadata.usage.estimated_cost</span></td><td><span class="simple-value none-type">None</span></td></tr><tr><td><span class="object-key str">retry_stats</span><span class="tooltip">metadata.usage.retry_stats</span></td><td><details class="pyglove retry-stats"><summary><div class="summary-title">RetryStats(...)</div></summary><div class="complex-value retry-stats"><table><tr><td><span class="object-key str">num_occurences</span><span class="tooltip">metadata.usage.retry_stats.num_occurences</span></td><td><span class="simple-value int">0</span></td></tr><tr><td><span class="object-key str">total_wait_interval</span><span class="tooltip">metadata.usage.retry_stats.total_wait_interval</span></td><td><span class="simple-value float">0.0</span></td></tr><tr><td><span class="object-key str">total_call_interval</span><span class="tooltip">metadata.usage.retry_stats.total_call_interval</span></td><td><span class="simple-value float">0.0</span></td></tr><tr><td><span class="object-key str">errors</span><span class="tooltip">metadata.usage.retry_stats.errors</span></td><td><details class="pyglove dict"><summary><div class="summary-title">Dict(...)</div></summary><div class="complex-value dict"><span class="empty-container"></span></div></details></td></tr></table></div></details></td></tr><tr><td><span class="object-key str">completion_tokens_details</span><span class="tooltip">metadata.usage.completion_tokens_details</span></td><td><span class="simple-value none-type">None</span></td></tr></table></div></details></div><div class="message-metadata"><details open class="pyglove dict message-metadata"><summary><div class="summary-name message-metadata">metadata<span class="tooltip message-metadata">metadata</span></div><div class="summary-title message-metadata">Dict(...)</div></summary><div class="complex-value dict"><span class="empty-container"></span></div></details></div><details open class="pyglove user-message lf-message"><summary><div class="summary-name lf-message">source<span class="tooltip lf-message">source</span></div><div class="summary-title lf-message">UserMessage(...)</div></summary><div class="complex_value"><div class="message-tags"><span>lm-input</span></div><div class="message-text">What is in this image?<div class="modality-in-text"><details class="pyglove custom-modality"><summary><div class="summary-name">image<span class="tooltip">source.metadata.image</span></div><div class="summary-title">CustomModality(...)</div></summary><div class="complex-value custom-modality"><details open class="pyglove str"><summary><div class="summary-name">content<span class="tooltip">source.metadata.image.content</span></div><div class="summary-title">str</div></summary><span class="simple-value str">&#x27;foo&#x27;</span></details></div></details></div>this is a test</div><div class="message-metadata"><details open class="pyglove dict message-metadata"><summary><div class="summary-name message-metadata">metadata<span class="tooltip message-metadata">source.metadata</span></div><div class="summary-title message-metadata">Dict(...)</div></summary><div class="complex-value dict"><details class="pyglove custom-modality"><summary><div class="summary-name">image<span class="tooltip">source.metadata.image</span></div><div class="summary-title">CustomModality(...)</div></summary><div class="complex-value custom-modality"><details open class="pyglove str"><summary><div class="summary-name">content<span class="tooltip">source.metadata.image.content</span></div><div class="summary-title">str</div></summary><span class="simple-value str">&#x27;foo&#x27;</span></details></div></details></div></details></div></div></details></div></details>
442
442
  """
443
443
  )
444
444
  self.assert_html_content(
@@ -455,7 +455,7 @@ class MessageTest(unittest.TestCase):
455
455
  ),
456
456
  ),
457
457
  """
458
- <details open class="pyglove ai-message lf-message"><summary><div class="summary-title lf-message">AIMessage(...)</div></summary><div class="complex_value"><div class="message-tags"><span>lm-response</span><span>lm-output</span></div><div class="message-text">My name is Gemini</div><div class="message-result"><details class="pyglove dict"><summary><div class="summary-name">result<span class="tooltip">metadata.result</span></div><div class="summary-title">Dict(...)</div></summary><div class="complex-value dict"><table><tr><td><span class="object-key str">x</span><span class="tooltip">metadata.result.x</span></td><td><span class="simple-value int">1</span></td></tr><tr><td><span class="object-key str">y</span><span class="tooltip">metadata.result.y</span></td><td><span class="simple-value int">2</span></td></tr><tr><td><span class="object-key str">z</span><span class="tooltip">metadata.result.z</span></td><td><details class="pyglove dict"><summary><div class="summary-title">Dict(...)</div></summary><div class="complex-value dict"><table><tr><td><span class="object-key str">a</span><span class="tooltip">metadata.result.z.a</span></td><td><details class="pyglove list"><summary><div class="summary-title">List(...)</div></summary><div class="complex-value list"><table><tr><td><span class="object-key int">0</span><span class="tooltip">metadata.result.z.a[0]</span></td><td><span class="simple-value int">12</span></td></tr><tr><td><span class="object-key int">1</span><span class="tooltip">metadata.result.z.a[1]</span></td><td><span class="simple-value int">323</span></td></tr></table></div></details></td></tr></table></div></details></td></tr></table></div></details></div><div class="message-usage"><details class="pyglove lm-sampling-usage"><summary><div class="summary-name">llm usage<span class="tooltip">metadata.usage</span></div><div class="summary-title">LMSamplingUsage(...)</div></summary><div class="complex-value lm-sampling-usage"><table><tr><td><span class="object-key str">prompt_tokens</span><span class="tooltip">metadata.usage.prompt_tokens</span></td><td><span class="simple-value int">10</span></td></tr><tr><td><span class="object-key str">completion_tokens</span><span class="tooltip">metadata.usage.completion_tokens</span></td><td><span class="simple-value int">2</span></td></tr><tr><td><span class="object-key str">total_tokens</span><span class="tooltip">metadata.usage.total_tokens</span></td><td><span class="simple-value int">12</span></td></tr><tr><td><span class="object-key str">num_requests</span><span class="tooltip">metadata.usage.num_requests</span></td><td><span class="simple-value int">1</span></td></tr><tr><td><span class="object-key str">estimated_cost</span><span class="tooltip">metadata.usage.estimated_cost</span></td><td><span class="simple-value none-type">None</span></td></tr><tr><td><span class="object-key str">retry_stats</span><span class="tooltip">metadata.usage.retry_stats</span></td><td><details class="pyglove retry-stats"><summary><div class="summary-title">RetryStats(...)</div></summary><div class="complex-value retry-stats"><table><tr><td><span class="object-key str">num_occurences</span><span class="tooltip">metadata.usage.retry_stats.num_occurences</span></td><td><span class="simple-value int">0</span></td></tr><tr><td><span class="object-key str">total_wait_interval</span><span class="tooltip">metadata.usage.retry_stats.total_wait_interval</span></td><td><span class="simple-value float">0.0</span></td></tr><tr><td><span class="object-key str">total_call_interval</span><span class="tooltip">metadata.usage.retry_stats.total_call_interval</span></td><td><span class="simple-value float">0.0</span></td></tr><tr><td><span class="object-key str">errors</span><span class="tooltip">metadata.usage.retry_stats.errors</span></td><td><details class="pyglove dict"><summary><div class="summary-title">Dict(...)</div></summary><div class="complex-value dict"><span class="empty-container"></span></div></details></td></tr></table></div></details></td></tr></table></div></details></div><div class="message-metadata"><details class="pyglove dict message-metadata"><summary><div class="summary-name message-metadata">metadata<span class="tooltip message-metadata">metadata</span></div><div class="summary-title message-metadata">Dict(...)</div></summary><div class="complex-value dict"><span class="empty-container"></span></div></details></div><details class="pyglove user-message lf-message"><summary><div class="summary-name lf-message">source<span class="tooltip lf-message">source</span></div><div class="summary-title lf-message">UserMessage(...)</div></summary><div class="complex_value"><div class="message-tags"><span>lm-input</span></div><div class="message-text">What is in this image?<div class="modality-in-text"><details open class="pyglove custom-modality"><summary><div class="summary-name">image<span class="tooltip">source.metadata.image</span></div><div class="summary-title">CustomModality(...)</div></summary><div class="complex-value custom-modality"><table><tr><td><span class="object-key str">content</span><span class="tooltip">source.metadata.image.content</span></td><td><span class="simple-value str">&#x27;foo&#x27;</span></td></tr></table></div></details></div>this is a test</div><div class="message-metadata"><details class="pyglove dict message-metadata"><summary><div class="summary-name message-metadata">metadata<span class="tooltip message-metadata">source.metadata</span></div><div class="summary-title message-metadata">Dict(...)</div></summary><div class="complex-value dict"><table><tr><td><span class="object-key str">image</span><span class="tooltip">source.metadata.image</span></td><td><details class="pyglove custom-modality"><summary><div class="summary-title">CustomModality(...)</div></summary><div class="complex-value custom-modality"><table><tr><td><span class="object-key str">content</span><span class="tooltip">source.metadata.image.content</span></td><td><span class="simple-value str">&#x27;foo&#x27;</span></td></tr></table></div></details></td></tr></table></div></details></div><details class="pyglove user-message lf-message"><summary><div class="summary-name lf-message">source<span class="tooltip lf-message">source.source</span></div><div class="summary-title lf-message">UserMessage(...)</div></summary><div class="complex_value"><div class="message-tags"></div><div class="message-text">User input</div><div class="message-metadata"><details class="pyglove dict message-metadata"><summary><div class="summary-name message-metadata">metadata<span class="tooltip message-metadata">source.source.metadata</span></div><div class="summary-title message-metadata">Dict(...)</div></summary><div class="complex-value dict"><span class="empty-container"></span></div></details></div></div></details></div></details></div></details>
458
+ <details open class="pyglove ai-message lf-message"><summary><div class="summary-title lf-message">AIMessage(...)</div></summary><div class="complex_value"><div class="message-tags"><span>lm-response</span><span>lm-output</span></div><div class="message-text">My name is Gemini</div><div class="message-result"><details class="pyglove dict"><summary><div class="summary-name">result<span class="tooltip">metadata.result</span></div><div class="summary-title">Dict(...)</div></summary><div class="complex-value dict"><table><tr><td><span class="object-key str">x</span><span class="tooltip">metadata.result.x</span></td><td><span class="simple-value int">1</span></td></tr><tr><td><span class="object-key str">y</span><span class="tooltip">metadata.result.y</span></td><td><span class="simple-value int">2</span></td></tr><tr><td><span class="object-key str">z</span><span class="tooltip">metadata.result.z</span></td><td><details class="pyglove dict"><summary><div class="summary-title">Dict(...)</div></summary><div class="complex-value dict"><table><tr><td><span class="object-key str">a</span><span class="tooltip">metadata.result.z.a</span></td><td><details class="pyglove list"><summary><div class="summary-title">List(...)</div></summary><div class="complex-value list"><table><tr><td><span class="object-key int">0</span><span class="tooltip">metadata.result.z.a[0]</span></td><td><span class="simple-value int">12</span></td></tr><tr><td><span class="object-key int">1</span><span class="tooltip">metadata.result.z.a[1]</span></td><td><span class="simple-value int">323</span></td></tr></table></div></details></td></tr></table></div></details></td></tr></table></div></details></div><div class="message-usage"><details class="pyglove lm-sampling-usage"><summary><div class="summary-name">llm usage<span class="tooltip">metadata.usage</span></div><div class="summary-title">LMSamplingUsage(...)</div></summary><div class="complex-value lm-sampling-usage"><table><tr><td><span class="object-key str">prompt_tokens</span><span class="tooltip">metadata.usage.prompt_tokens</span></td><td><span class="simple-value int">10</span></td></tr><tr><td><span class="object-key str">completion_tokens</span><span class="tooltip">metadata.usage.completion_tokens</span></td><td><span class="simple-value int">2</span></td></tr><tr><td><span class="object-key str">total_tokens</span><span class="tooltip">metadata.usage.total_tokens</span></td><td><span class="simple-value int">12</span></td></tr><tr><td><span class="object-key str">num_requests</span><span class="tooltip">metadata.usage.num_requests</span></td><td><span class="simple-value int">1</span></td></tr><tr><td><span class="object-key str">estimated_cost</span><span class="tooltip">metadata.usage.estimated_cost</span></td><td><span class="simple-value none-type">None</span></td></tr><tr><td><span class="object-key str">retry_stats</span><span class="tooltip">metadata.usage.retry_stats</span></td><td><details class="pyglove retry-stats"><summary><div class="summary-title">RetryStats(...)</div></summary><div class="complex-value retry-stats"><table><tr><td><span class="object-key str">num_occurences</span><span class="tooltip">metadata.usage.retry_stats.num_occurences</span></td><td><span class="simple-value int">0</span></td></tr><tr><td><span class="object-key str">total_wait_interval</span><span class="tooltip">metadata.usage.retry_stats.total_wait_interval</span></td><td><span class="simple-value float">0.0</span></td></tr><tr><td><span class="object-key str">total_call_interval</span><span class="tooltip">metadata.usage.retry_stats.total_call_interval</span></td><td><span class="simple-value float">0.0</span></td></tr><tr><td><span class="object-key str">errors</span><span class="tooltip">metadata.usage.retry_stats.errors</span></td><td><details class="pyglove dict"><summary><div class="summary-title">Dict(...)</div></summary><div class="complex-value dict"><span class="empty-container"></span></div></details></td></tr></table></div></details></td></tr><tr><td><span class="object-key str">completion_tokens_details</span><span class="tooltip">metadata.usage.completion_tokens_details</span></td><td><span class="simple-value none-type">None</span></td></tr></table></div></details></div><div class="message-metadata"><details class="pyglove dict message-metadata"><summary><div class="summary-name message-metadata">metadata<span class="tooltip message-metadata">metadata</span></div><div class="summary-title message-metadata">Dict(...)</div></summary><div class="complex-value dict"><span class="empty-container"></span></div></details></div><details class="pyglove user-message lf-message"><summary><div class="summary-name lf-message">source<span class="tooltip lf-message">source</span></div><div class="summary-title lf-message">UserMessage(...)</div></summary><div class="complex_value"><div class="message-tags"><span>lm-input</span></div><div class="message-text">What is in this image?<div class="modality-in-text"><details open class="pyglove custom-modality"><summary><div class="summary-name">image<span class="tooltip">source.metadata.image</span></div><div class="summary-title">CustomModality(...)</div></summary><div class="complex-value custom-modality"><table><tr><td><span class="object-key str">content</span><span class="tooltip">source.metadata.image.content</span></td><td><span class="simple-value str">&#x27;foo&#x27;</span></td></tr></table></div></details></div>this is a test</div><div class="message-metadata"><details class="pyglove dict message-metadata"><summary><div class="summary-name message-metadata">metadata<span class="tooltip message-metadata">source.metadata</span></div><div class="summary-title message-metadata">Dict(...)</div></summary><div class="complex-value dict"><table><tr><td><span class="object-key str">image</span><span class="tooltip">source.metadata.image</span></td><td><details class="pyglove custom-modality"><summary><div class="summary-title">CustomModality(...)</div></summary><div class="complex-value custom-modality"><table><tr><td><span class="object-key str">content</span><span class="tooltip">source.metadata.image.content</span></td><td><span class="simple-value str">&#x27;foo&#x27;</span></td></tr></table></div></details></td></tr></table></div></details></div><details class="pyglove user-message lf-message"><summary><div class="summary-name lf-message">source<span class="tooltip lf-message">source.source</span></div><div class="summary-title lf-message">UserMessage(...)</div></summary><div class="complex_value"><div class="message-tags"></div><div class="message-text">User input</div><div class="message-metadata"><details class="pyglove dict message-metadata"><summary><div class="summary-name message-metadata">metadata<span class="tooltip message-metadata">source.source.metadata</span></div><div class="summary-title message-metadata">Dict(...)</div></summary><div class="complex-value dict"><span class="empty-container"></span></div></details></div></div></details></div></details></div></details>
459
459
  """
460
460
  )
461
461
  self.assert_html_content(
@@ -472,7 +472,7 @@ class MessageTest(unittest.TestCase):
472
472
  ),
473
473
  ),
474
474
  """
475
- <details open class="pyglove ai-message lf-message"><summary><div class="summary-title lf-message">AIMessage(...)</div></summary><div class="complex_value"><div class="message-tags"><span>lm-response</span><span>lm-output</span></div><div class="message-text">My name is Gemini</div><div class="message-result"><details open class="pyglove dict"><summary><div class="summary-name">result<span class="tooltip">metadata.result</span></div><div class="summary-title">Dict(...)</div></summary><div class="complex-value dict"><table><tr><td><span class="object-key str">x</span><span class="tooltip">metadata.result.x</span></td><td><span class="simple-value int">1</span></td></tr><tr><td><span class="object-key str">y</span><span class="tooltip">metadata.result.y</span></td><td><span class="simple-value int">2</span></td></tr><tr><td><span class="object-key str">z</span><span class="tooltip">metadata.result.z</span></td><td><details class="pyglove dict"><summary><div class="summary-title">Dict(...)</div></summary><div class="complex-value dict"><table><tr><td><span class="object-key str">a</span><span class="tooltip">metadata.result.z.a</span></td><td><details class="pyglove list"><summary><div class="summary-title">List(...)</div></summary><div class="complex-value list"><table><tr><td><span class="object-key int">0</span><span class="tooltip">metadata.result.z.a[0]</span></td><td><span class="simple-value int">12</span></td></tr><tr><td><span class="object-key int">1</span><span class="tooltip">metadata.result.z.a[1]</span></td><td><span class="simple-value int">323</span></td></tr></table></div></details></td></tr></table></div></details></td></tr></table></div></details></div><div class="message-usage"><details open class="pyglove lm-sampling-usage"><summary><div class="summary-name">llm usage<span class="tooltip">metadata.usage</span></div><div class="summary-title">LMSamplingUsage(...)</div></summary><div class="complex-value lm-sampling-usage"><table><tr><td><span class="object-key str">prompt_tokens</span><span class="tooltip">metadata.usage.prompt_tokens</span></td><td><span class="simple-value int">10</span></td></tr><tr><td><span class="object-key str">completion_tokens</span><span class="tooltip">metadata.usage.completion_tokens</span></td><td><span class="simple-value int">2</span></td></tr><tr><td><span class="object-key str">total_tokens</span><span class="tooltip">metadata.usage.total_tokens</span></td><td><span class="simple-value int">12</span></td></tr><tr><td><span class="object-key str">num_requests</span><span class="tooltip">metadata.usage.num_requests</span></td><td><span class="simple-value int">1</span></td></tr><tr><td><span class="object-key str">estimated_cost</span><span class="tooltip">metadata.usage.estimated_cost</span></td><td><span class="simple-value none-type">None</span></td></tr><tr><td><span class="object-key str">retry_stats</span><span class="tooltip">metadata.usage.retry_stats</span></td><td><details class="pyglove retry-stats"><summary><div class="summary-title">RetryStats(...)</div></summary><div class="complex-value retry-stats"><table><tr><td><span class="object-key str">num_occurences</span><span class="tooltip">metadata.usage.retry_stats.num_occurences</span></td><td><span class="simple-value int">0</span></td></tr><tr><td><span class="object-key str">total_wait_interval</span><span class="tooltip">metadata.usage.retry_stats.total_wait_interval</span></td><td><span class="simple-value float">0.0</span></td></tr><tr><td><span class="object-key str">total_call_interval</span><span class="tooltip">metadata.usage.retry_stats.total_call_interval</span></td><td><span class="simple-value float">0.0</span></td></tr><tr><td><span class="object-key str">errors</span><span class="tooltip">metadata.usage.retry_stats.errors</span></td><td><details class="pyglove dict"><summary><div class="summary-title">Dict(...)</div></summary><div class="complex-value dict"><span class="empty-container"></span></div></details></td></tr></table></div></details></td></tr></table></div></details></div><div class="message-metadata"><details open class="pyglove dict message-metadata"><summary><div class="summary-name message-metadata">metadata<span class="tooltip message-metadata">metadata</span></div><div class="summary-title message-metadata">Dict(...)</div></summary><div class="complex-value dict"><span class="empty-container"></span></div></details></div><details open class="pyglove user-message lf-message"><summary><div class="summary-name lf-message">source<span class="tooltip lf-message">source</span></div><div class="summary-title lf-message">UserMessage(...)</div></summary><div class="complex_value"><div class="message-tags"><span>lm-input</span></div><div class="message-text">What is in this image?<div class="modality-in-text"><details class="pyglove custom-modality"><summary><div class="summary-name">image<span class="tooltip">source.metadata.image</span></div><div class="summary-title">CustomModality(...)</div></summary><div class="complex-value custom-modality"><table><tr><td><span class="object-key str">content</span><span class="tooltip">source.metadata.image.content</span></td><td><span class="simple-value str">&#x27;foo&#x27;</span></td></tr></table></div></details></div>this is a test</div><div class="message-metadata"><details open class="pyglove dict message-metadata"><summary><div class="summary-name message-metadata">metadata<span class="tooltip message-metadata">source.metadata</span></div><div class="summary-title message-metadata">Dict(...)</div></summary><div class="complex-value dict"><table><tr><td><span class="object-key str">image</span><span class="tooltip">source.metadata.image</span></td><td><details class="pyglove custom-modality"><summary><div class="summary-title">CustomModality(...)</div></summary><div class="complex-value custom-modality"><table><tr><td><span class="object-key str">content</span><span class="tooltip">source.metadata.image.content</span></td><td><span class="simple-value str">&#x27;foo&#x27;</span></td></tr></table></div></details></td></tr></table></div></details></div><details open class="pyglove user-message lf-message"><summary><div class="summary-name lf-message">source<span class="tooltip lf-message">source.source</span></div><div class="summary-title lf-message">UserMessage(...)</div></summary><div class="complex_value"><div class="message-tags"></div><div class="message-text">User input</div><div class="message-metadata"><details open class="pyglove dict message-metadata"><summary><div class="summary-name message-metadata">metadata<span class="tooltip message-metadata">source.source.metadata</span></div><div class="summary-title message-metadata">Dict(...)</div></summary><div class="complex-value dict"><span class="empty-container"></span></div></details></div></div></details></div></details></div></details>
475
+ <details open class="pyglove ai-message lf-message"><summary><div class="summary-title lf-message">AIMessage(...)</div></summary><div class="complex_value"><div class="message-tags"><span>lm-response</span><span>lm-output</span></div><div class="message-text">My name is Gemini</div><div class="message-result"><details open class="pyglove dict"><summary><div class="summary-name">result<span class="tooltip">metadata.result</span></div><div class="summary-title">Dict(...)</div></summary><div class="complex-value dict"><table><tr><td><span class="object-key str">x</span><span class="tooltip">metadata.result.x</span></td><td><span class="simple-value int">1</span></td></tr><tr><td><span class="object-key str">y</span><span class="tooltip">metadata.result.y</span></td><td><span class="simple-value int">2</span></td></tr><tr><td><span class="object-key str">z</span><span class="tooltip">metadata.result.z</span></td><td><details class="pyglove dict"><summary><div class="summary-title">Dict(...)</div></summary><div class="complex-value dict"><table><tr><td><span class="object-key str">a</span><span class="tooltip">metadata.result.z.a</span></td><td><details class="pyglove list"><summary><div class="summary-title">List(...)</div></summary><div class="complex-value list"><table><tr><td><span class="object-key int">0</span><span class="tooltip">metadata.result.z.a[0]</span></td><td><span class="simple-value int">12</span></td></tr><tr><td><span class="object-key int">1</span><span class="tooltip">metadata.result.z.a[1]</span></td><td><span class="simple-value int">323</span></td></tr></table></div></details></td></tr></table></div></details></td></tr></table></div></details></div><div class="message-usage"><details open class="pyglove lm-sampling-usage"><summary><div class="summary-name">llm usage<span class="tooltip">metadata.usage</span></div><div class="summary-title">LMSamplingUsage(...)</div></summary><div class="complex-value lm-sampling-usage"><table><tr><td><span class="object-key str">prompt_tokens</span><span class="tooltip">metadata.usage.prompt_tokens</span></td><td><span class="simple-value int">10</span></td></tr><tr><td><span class="object-key str">completion_tokens</span><span class="tooltip">metadata.usage.completion_tokens</span></td><td><span class="simple-value int">2</span></td></tr><tr><td><span class="object-key str">total_tokens</span><span class="tooltip">metadata.usage.total_tokens</span></td><td><span class="simple-value int">12</span></td></tr><tr><td><span class="object-key str">num_requests</span><span class="tooltip">metadata.usage.num_requests</span></td><td><span class="simple-value int">1</span></td></tr><tr><td><span class="object-key str">estimated_cost</span><span class="tooltip">metadata.usage.estimated_cost</span></td><td><span class="simple-value none-type">None</span></td></tr><tr><td><span class="object-key str">retry_stats</span><span class="tooltip">metadata.usage.retry_stats</span></td><td><details class="pyglove retry-stats"><summary><div class="summary-title">RetryStats(...)</div></summary><div class="complex-value retry-stats"><table><tr><td><span class="object-key str">num_occurences</span><span class="tooltip">metadata.usage.retry_stats.num_occurences</span></td><td><span class="simple-value int">0</span></td></tr><tr><td><span class="object-key str">total_wait_interval</span><span class="tooltip">metadata.usage.retry_stats.total_wait_interval</span></td><td><span class="simple-value float">0.0</span></td></tr><tr><td><span class="object-key str">total_call_interval</span><span class="tooltip">metadata.usage.retry_stats.total_call_interval</span></td><td><span class="simple-value float">0.0</span></td></tr><tr><td><span class="object-key str">errors</span><span class="tooltip">metadata.usage.retry_stats.errors</span></td><td><details class="pyglove dict"><summary><div class="summary-title">Dict(...)</div></summary><div class="complex-value dict"><span class="empty-container"></span></div></details></td></tr></table></div></details></td></tr><tr><td><span class="object-key str">completion_tokens_details</span><span class="tooltip">metadata.usage.completion_tokens_details</span></td><td><span class="simple-value none-type">None</span></td></tr></table></div></details></div><div class="message-metadata"><details open class="pyglove dict message-metadata"><summary><div class="summary-name message-metadata">metadata<span class="tooltip message-metadata">metadata</span></div><div class="summary-title message-metadata">Dict(...)</div></summary><div class="complex-value dict"><span class="empty-container"></span></div></details></div><details open class="pyglove user-message lf-message"><summary><div class="summary-name lf-message">source<span class="tooltip lf-message">source</span></div><div class="summary-title lf-message">UserMessage(...)</div></summary><div class="complex_value"><div class="message-tags"><span>lm-input</span></div><div class="message-text">What is in this image?<div class="modality-in-text"><details class="pyglove custom-modality"><summary><div class="summary-name">image<span class="tooltip">source.metadata.image</span></div><div class="summary-title">CustomModality(...)</div></summary><div class="complex-value custom-modality"><table><tr><td><span class="object-key str">content</span><span class="tooltip">source.metadata.image.content</span></td><td><span class="simple-value str">&#x27;foo&#x27;</span></td></tr></table></div></details></div>this is a test</div><div class="message-metadata"><details open class="pyglove dict message-metadata"><summary><div class="summary-name message-metadata">metadata<span class="tooltip message-metadata">source.metadata</span></div><div class="summary-title message-metadata">Dict(...)</div></summary><div class="complex-value dict"><table><tr><td><span class="object-key str">image</span><span class="tooltip">source.metadata.image</span></td><td><details class="pyglove custom-modality"><summary><div class="summary-title">CustomModality(...)</div></summary><div class="complex-value custom-modality"><table><tr><td><span class="object-key str">content</span><span class="tooltip">source.metadata.image.content</span></td><td><span class="simple-value str">&#x27;foo&#x27;</span></td></tr></table></div></details></td></tr></table></div></details></div><details open class="pyglove user-message lf-message"><summary><div class="summary-name lf-message">source<span class="tooltip lf-message">source.source</span></div><div class="summary-title lf-message">UserMessage(...)</div></summary><div class="complex_value"><div class="message-tags"></div><div class="message-text">User input</div><div class="message-metadata"><details open class="pyglove dict message-metadata"><summary><div class="summary-name message-metadata">metadata<span class="tooltip message-metadata">source.source.metadata</span></div><div class="summary-title message-metadata">Dict(...)</div></summary><div class="complex-value dict"><span class="empty-container"></span></div></details></div></div></details></div></details></div></details>
476
476
  """
477
477
  )
478
478
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: langfun
3
- Version: 0.1.2.dev202504170804
3
+ Version: 0.1.2.dev202504190803
4
4
  Summary: Langfun: Language as Functions.
5
5
  Home-page: https://github.com/google/langfun
6
6
  Author: Langfun Authors