langfun 0.1.2.dev202509120804__py3-none-any.whl → 0.1.2.dev202512150805__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (162) hide show
  1. langfun/__init__.py +1 -1
  2. langfun/core/__init__.py +7 -1
  3. langfun/core/agentic/__init__.py +8 -1
  4. langfun/core/agentic/action.py +740 -112
  5. langfun/core/agentic/action_eval.py +9 -2
  6. langfun/core/agentic/action_test.py +189 -24
  7. langfun/core/async_support.py +104 -5
  8. langfun/core/async_support_test.py +23 -0
  9. langfun/core/coding/python/correction.py +19 -9
  10. langfun/core/coding/python/execution.py +14 -12
  11. langfun/core/coding/python/generation.py +21 -16
  12. langfun/core/coding/python/sandboxing.py +23 -3
  13. langfun/core/component.py +42 -3
  14. langfun/core/concurrent.py +70 -6
  15. langfun/core/concurrent_test.py +9 -2
  16. langfun/core/console.py +1 -1
  17. langfun/core/data/conversion/anthropic.py +12 -3
  18. langfun/core/data/conversion/anthropic_test.py +8 -6
  19. langfun/core/data/conversion/gemini.py +11 -2
  20. langfun/core/data/conversion/gemini_test.py +48 -9
  21. langfun/core/data/conversion/openai.py +145 -31
  22. langfun/core/data/conversion/openai_test.py +161 -17
  23. langfun/core/eval/base.py +48 -44
  24. langfun/core/eval/base_test.py +5 -5
  25. langfun/core/eval/matching.py +5 -2
  26. langfun/core/eval/patching.py +3 -3
  27. langfun/core/eval/scoring.py +4 -3
  28. langfun/core/eval/v2/__init__.py +3 -0
  29. langfun/core/eval/v2/checkpointing.py +148 -46
  30. langfun/core/eval/v2/checkpointing_test.py +9 -2
  31. langfun/core/eval/v2/config_saver.py +37 -0
  32. langfun/core/eval/v2/config_saver_test.py +36 -0
  33. langfun/core/eval/v2/eval_test_helper.py +104 -3
  34. langfun/core/eval/v2/evaluation.py +102 -19
  35. langfun/core/eval/v2/evaluation_test.py +9 -3
  36. langfun/core/eval/v2/example.py +50 -40
  37. langfun/core/eval/v2/example_test.py +16 -8
  38. langfun/core/eval/v2/experiment.py +95 -20
  39. langfun/core/eval/v2/experiment_test.py +19 -0
  40. langfun/core/eval/v2/metric_values.py +31 -3
  41. langfun/core/eval/v2/metric_values_test.py +32 -0
  42. langfun/core/eval/v2/metrics.py +157 -44
  43. langfun/core/eval/v2/metrics_test.py +39 -18
  44. langfun/core/eval/v2/progress.py +31 -1
  45. langfun/core/eval/v2/progress_test.py +27 -0
  46. langfun/core/eval/v2/progress_tracking.py +13 -5
  47. langfun/core/eval/v2/progress_tracking_test.py +9 -1
  48. langfun/core/eval/v2/reporting.py +88 -71
  49. langfun/core/eval/v2/reporting_test.py +24 -6
  50. langfun/core/eval/v2/runners/__init__.py +30 -0
  51. langfun/core/eval/v2/{runners.py → runners/base.py} +73 -180
  52. langfun/core/eval/v2/runners/beam.py +354 -0
  53. langfun/core/eval/v2/runners/beam_test.py +153 -0
  54. langfun/core/eval/v2/runners/ckpt_monitor.py +350 -0
  55. langfun/core/eval/v2/runners/ckpt_monitor_test.py +213 -0
  56. langfun/core/eval/v2/runners/debug.py +40 -0
  57. langfun/core/eval/v2/runners/debug_test.py +76 -0
  58. langfun/core/eval/v2/runners/parallel.py +243 -0
  59. langfun/core/eval/v2/runners/parallel_test.py +182 -0
  60. langfun/core/eval/v2/runners/sequential.py +47 -0
  61. langfun/core/eval/v2/runners/sequential_test.py +169 -0
  62. langfun/core/langfunc.py +45 -130
  63. langfun/core/langfunc_test.py +7 -5
  64. langfun/core/language_model.py +189 -36
  65. langfun/core/language_model_test.py +54 -3
  66. langfun/core/llms/__init__.py +14 -1
  67. langfun/core/llms/anthropic.py +157 -2
  68. langfun/core/llms/azure_openai.py +29 -17
  69. langfun/core/llms/cache/base.py +25 -3
  70. langfun/core/llms/cache/in_memory.py +48 -7
  71. langfun/core/llms/cache/in_memory_test.py +14 -4
  72. langfun/core/llms/compositional.py +25 -1
  73. langfun/core/llms/deepseek.py +30 -2
  74. langfun/core/llms/fake.py +32 -1
  75. langfun/core/llms/gemini.py +90 -12
  76. langfun/core/llms/gemini_test.py +110 -0
  77. langfun/core/llms/google_genai.py +52 -1
  78. langfun/core/llms/groq.py +28 -3
  79. langfun/core/llms/llama_cpp.py +23 -4
  80. langfun/core/llms/openai.py +120 -3
  81. langfun/core/llms/openai_compatible.py +148 -27
  82. langfun/core/llms/openai_compatible_test.py +207 -20
  83. langfun/core/llms/openai_test.py +0 -2
  84. langfun/core/llms/rest.py +16 -1
  85. langfun/core/llms/vertexai.py +78 -8
  86. langfun/core/logging.py +1 -1
  87. langfun/core/mcp/__init__.py +10 -0
  88. langfun/core/mcp/client.py +177 -0
  89. langfun/core/mcp/client_test.py +71 -0
  90. langfun/core/mcp/session.py +241 -0
  91. langfun/core/mcp/session_test.py +54 -0
  92. langfun/core/mcp/testing/simple_mcp_client.py +33 -0
  93. langfun/core/mcp/testing/simple_mcp_server.py +33 -0
  94. langfun/core/mcp/tool.py +254 -0
  95. langfun/core/mcp/tool_test.py +197 -0
  96. langfun/core/memory.py +1 -0
  97. langfun/core/message.py +160 -55
  98. langfun/core/message_test.py +65 -81
  99. langfun/core/modalities/__init__.py +8 -0
  100. langfun/core/modalities/audio.py +21 -1
  101. langfun/core/modalities/image.py +73 -3
  102. langfun/core/modalities/image_test.py +116 -0
  103. langfun/core/modalities/mime.py +78 -4
  104. langfun/core/modalities/mime_test.py +59 -0
  105. langfun/core/modalities/pdf.py +19 -1
  106. langfun/core/modalities/video.py +21 -1
  107. langfun/core/modality.py +167 -29
  108. langfun/core/modality_test.py +42 -12
  109. langfun/core/natural_language.py +1 -1
  110. langfun/core/sampling.py +4 -4
  111. langfun/core/sampling_test.py +20 -4
  112. langfun/core/structured/__init__.py +2 -24
  113. langfun/core/structured/completion.py +34 -44
  114. langfun/core/structured/completion_test.py +23 -43
  115. langfun/core/structured/description.py +54 -50
  116. langfun/core/structured/function_generation.py +29 -12
  117. langfun/core/structured/mapping.py +81 -37
  118. langfun/core/structured/parsing.py +95 -79
  119. langfun/core/structured/parsing_test.py +0 -3
  120. langfun/core/structured/querying.py +230 -154
  121. langfun/core/structured/querying_test.py +69 -33
  122. langfun/core/structured/schema/__init__.py +49 -0
  123. langfun/core/structured/schema/base.py +664 -0
  124. langfun/core/structured/schema/base_test.py +531 -0
  125. langfun/core/structured/schema/json.py +174 -0
  126. langfun/core/structured/schema/json_test.py +121 -0
  127. langfun/core/structured/schema/python.py +316 -0
  128. langfun/core/structured/schema/python_test.py +410 -0
  129. langfun/core/structured/schema_generation.py +33 -14
  130. langfun/core/structured/scoring.py +47 -36
  131. langfun/core/structured/tokenization.py +26 -11
  132. langfun/core/subscription.py +2 -2
  133. langfun/core/template.py +175 -50
  134. langfun/core/template_test.py +123 -17
  135. langfun/env/__init__.py +43 -0
  136. langfun/env/base_environment.py +827 -0
  137. langfun/env/base_environment_test.py +473 -0
  138. langfun/env/base_feature.py +304 -0
  139. langfun/env/base_feature_test.py +228 -0
  140. langfun/env/base_sandbox.py +842 -0
  141. langfun/env/base_sandbox_test.py +1235 -0
  142. langfun/env/event_handlers/__init__.py +14 -0
  143. langfun/env/event_handlers/chain.py +233 -0
  144. langfun/env/event_handlers/chain_test.py +253 -0
  145. langfun/env/event_handlers/event_logger.py +472 -0
  146. langfun/env/event_handlers/event_logger_test.py +304 -0
  147. langfun/env/event_handlers/metric_writer.py +726 -0
  148. langfun/env/event_handlers/metric_writer_test.py +214 -0
  149. langfun/env/interface.py +1640 -0
  150. langfun/env/interface_test.py +153 -0
  151. langfun/env/load_balancers.py +59 -0
  152. langfun/env/load_balancers_test.py +141 -0
  153. langfun/env/test_utils.py +507 -0
  154. {langfun-0.1.2.dev202509120804.dist-info → langfun-0.1.2.dev202512150805.dist-info}/METADATA +7 -3
  155. langfun-0.1.2.dev202512150805.dist-info/RECORD +217 -0
  156. langfun/core/eval/v2/runners_test.py +0 -343
  157. langfun/core/structured/schema.py +0 -987
  158. langfun/core/structured/schema_test.py +0 -982
  159. langfun-0.1.2.dev202509120804.dist-info/RECORD +0 -172
  160. {langfun-0.1.2.dev202509120804.dist-info → langfun-0.1.2.dev202512150805.dist-info}/WHEEL +0 -0
  161. {langfun-0.1.2.dev202509120804.dist-info → langfun-0.1.2.dev202512150805.dist-info}/licenses/LICENSE +0 -0
  162. {langfun-0.1.2.dev202509120804.dist-info → langfun-0.1.2.dev202512150805.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,214 @@
1
+ # Copyright 2025 The Langfun Authors
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ import unittest
16
+
17
+ from langfun.env import interface
18
+ from langfun.env import test_utils
19
+ from langfun.env.event_handlers import metric_writer as metric_writer_lib
20
+
21
+
22
+ class MetricWriterTest(unittest.TestCase):
23
+
24
+ def test_write_metric(self):
25
+ writer = metric_writer_lib.MetricWriter(app='test_app')
26
+ env = test_utils.TestingEnvironment(
27
+ features={
28
+ 'test_feature1': test_utils.TestingFeature(housekeep_interval=0),
29
+ 'test_feature2': test_utils.TestingFeature(housekeep_interval=None),
30
+ },
31
+ pool_size=2,
32
+ outage_grace_period=0,
33
+ outage_retry_interval=0,
34
+ housekeep_interval=10.0,
35
+ sandbox_keepalive_interval=1.0,
36
+ event_handler=writer,
37
+ )
38
+ with env:
39
+ with env.sandbox(session_id='session1') as sb:
40
+ self.assertEqual(sb.test_feature1.num_shell_calls(), 4)
41
+
42
+ with self.assertRaises(interface.SandboxStateError):
43
+ with env.sandbox(session_id='session2') as sb:
44
+ sb.shell('echo "bar"', raise_error=RuntimeError)
45
+
46
+ self.assertIn(
47
+ writer._sandbox_start.value(
48
+ app='test_app',
49
+ environment_id='testing-env',
50
+ image_id='test_image',
51
+ error='Success'
52
+ ),
53
+ (2, 3)
54
+ )
55
+ self.assertGreater(
56
+ writer._sandbox_housekeep.value(
57
+ app='test_app',
58
+ environment_id='testing-env',
59
+ image_id='test_image',
60
+ error='Success'
61
+ ),
62
+ 0,
63
+ )
64
+ self.assertEqual(
65
+ writer._sandbox_shutdown.value(
66
+ app='test_app',
67
+ environment_id='testing-env',
68
+ image_id='test_image',
69
+ error='Success'
70
+ ),
71
+ 2
72
+ )
73
+ self.assertEqual(
74
+ writer._sandbox_count.value(
75
+ app='test_app',
76
+ environment_id='testing-env',
77
+ image_id='test_image',
78
+ status='ready',
79
+ ),
80
+ 0
81
+ )
82
+ self.assertEqual(
83
+ writer._sandbox_count.value(
84
+ app='test_app',
85
+ environment_id='testing-env',
86
+ image_id='test_image',
87
+ status='offline',
88
+ ),
89
+ 0
90
+ )
91
+ self.assertEqual(
92
+ writer._feature_setup.value(
93
+ app='test_app',
94
+ environment_id='testing-env',
95
+ image_id='test_image',
96
+ feature_name='test_feature1',
97
+ error='Success'
98
+ ),
99
+ 2,
100
+ )
101
+ self.assertEqual(
102
+ writer._feature_setup.value(
103
+ app='test_app',
104
+ environment_id='testing-env',
105
+ image_id='test_image',
106
+ feature_name='test_feature2',
107
+ error='Success'
108
+ ),
109
+ 2,
110
+ )
111
+ self.assertEqual(
112
+ writer._feature_setup_session.value(
113
+ app='test_app',
114
+ environment_id='testing-env',
115
+ image_id='test_image',
116
+ feature_name='test_feature1',
117
+ error='Success'
118
+ ),
119
+ 3,
120
+ )
121
+ self.assertEqual(
122
+ writer._feature_setup_session.value(
123
+ app='test_app',
124
+ environment_id='testing-env',
125
+ image_id='test_image',
126
+ feature_name='test_feature2',
127
+ error='Success'
128
+ ),
129
+ 3,
130
+ )
131
+ self.assertEqual(
132
+ writer._feature_teardown_session.value(
133
+ app='test_app',
134
+ environment_id='testing-env',
135
+ image_id='test_image',
136
+ feature_name='test_feature1',
137
+ error='Success'
138
+ ),
139
+ 2,
140
+ )
141
+ self.assertEqual(
142
+ writer._feature_teardown_session.value(
143
+ app='test_app',
144
+ environment_id='testing-env',
145
+ image_id='test_image',
146
+ feature_name='test_feature2',
147
+ error='Success'
148
+ ),
149
+ 2,
150
+ )
151
+ self.assertEqual(
152
+ writer._feature_teardown.value(
153
+ app='test_app',
154
+ environment_id='testing-env',
155
+ image_id='test_image',
156
+ feature_name='test_feature1',
157
+ error='Success'
158
+ ),
159
+ 2,
160
+ )
161
+ self.assertEqual(
162
+ writer._feature_teardown.value(
163
+ app='test_app',
164
+ environment_id='testing-env',
165
+ image_id='test_image',
166
+ feature_name='test_feature2',
167
+ error='Success'
168
+ ),
169
+ 2,
170
+ )
171
+ self.assertGreater(
172
+ writer._feature_housekeep.value(
173
+ app='test_app',
174
+ environment_id='testing-env',
175
+ image_id='test_image',
176
+ feature_name='test_feature1',
177
+ error='Success'
178
+ ),
179
+ 0,
180
+ )
181
+ self.assertEqual(
182
+ writer._feature_housekeep.value(
183
+ app='test_app',
184
+ environment_id='testing-env',
185
+ image_id='test_image',
186
+ feature_name='test_feature2',
187
+ error='Success'
188
+ ),
189
+ 0,
190
+ )
191
+ self.assertEqual(
192
+ writer._sandbox_activity.value(
193
+ app='test_app',
194
+ environment_id='testing-env',
195
+ image_id='test_image',
196
+ activity='shell',
197
+ error='Success'
198
+ ),
199
+ 18
200
+ )
201
+ self.assertEqual(
202
+ writer._sandbox_activity.value(
203
+ app='test_app',
204
+ environment_id='testing-env',
205
+ image_id='test_image',
206
+ activity='shell',
207
+ error='RuntimeError'
208
+ ),
209
+ 1
210
+ )
211
+
212
+
213
+ if __name__ == '__main__':
214
+ unittest.main()