langfun 0.1.2.dev202510240805__py3-none-any.whl → 0.1.2.dev202510250803__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.

Potentially problematic release.


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

Files changed (41) hide show
  1. langfun/core/concurrent_test.py +1 -0
  2. langfun/core/data/conversion/anthropic_test.py +8 -6
  3. langfun/core/data/conversion/gemini_test.py +12 -9
  4. langfun/core/data/conversion/openai.py +134 -30
  5. langfun/core/data/conversion/openai_test.py +161 -17
  6. langfun/core/eval/v2/progress_tracking_test.py +3 -0
  7. langfun/core/langfunc_test.py +4 -2
  8. langfun/core/language_model.py +6 -6
  9. langfun/core/language_model_test.py +9 -3
  10. langfun/core/llms/__init__.py +2 -1
  11. langfun/core/llms/cache/base.py +3 -1
  12. langfun/core/llms/cache/in_memory_test.py +14 -4
  13. langfun/core/llms/deepseek.py +1 -1
  14. langfun/core/llms/groq.py +1 -1
  15. langfun/core/llms/llama_cpp.py +1 -1
  16. langfun/core/llms/openai.py +7 -2
  17. langfun/core/llms/openai_compatible.py +134 -27
  18. langfun/core/llms/openai_compatible_test.py +207 -20
  19. langfun/core/llms/openai_test.py +0 -2
  20. langfun/core/llms/vertexai.py +2 -2
  21. langfun/core/message.py +78 -44
  22. langfun/core/message_test.py +56 -81
  23. langfun/core/modalities/__init__.py +8 -0
  24. langfun/core/modalities/mime.py +9 -0
  25. langfun/core/modality.py +104 -27
  26. langfun/core/modality_test.py +42 -12
  27. langfun/core/sampling_test.py +20 -4
  28. langfun/core/structured/completion.py +2 -7
  29. langfun/core/structured/completion_test.py +23 -43
  30. langfun/core/structured/mapping.py +4 -13
  31. langfun/core/structured/querying.py +13 -11
  32. langfun/core/structured/querying_test.py +65 -29
  33. langfun/core/template.py +39 -13
  34. langfun/core/template_test.py +83 -17
  35. langfun/env/event_handlers/metric_writer_test.py +3 -3
  36. langfun/env/load_balancers_test.py +2 -2
  37. {langfun-0.1.2.dev202510240805.dist-info → langfun-0.1.2.dev202510250803.dist-info}/METADATA +1 -1
  38. {langfun-0.1.2.dev202510240805.dist-info → langfun-0.1.2.dev202510250803.dist-info}/RECORD +41 -41
  39. {langfun-0.1.2.dev202510240805.dist-info → langfun-0.1.2.dev202510250803.dist-info}/WHEEL +0 -0
  40. {langfun-0.1.2.dev202510240805.dist-info → langfun-0.1.2.dev202510250803.dist-info}/licenses/LICENSE +0 -0
  41. {langfun-0.1.2.dev202510240805.dist-info → langfun-0.1.2.dev202510250803.dist-info}/top_level.txt +0 -0
@@ -249,35 +249,60 @@ class QueryTest(unittest.TestCase):
249
249
 
250
250
  def test_root_modality_to_structure_render(self):
251
251
  lm = fake.StaticResponse('1')
252
+ image = modalities.Image.from_bytes(b'mock_image')
252
253
  self.assert_render(
253
- modalities.Image.from_bytes(b'mock_image'),
254
+ image,
254
255
  int,
255
256
  lm=lm,
256
- expected_snippet='\n\nREQUEST:\n <<[[input]]>>\n\n',
257
+ expected_snippet=f'\n\nREQUEST:\n <<[[{image.id}]]>>\n\n',
257
258
  expected_modalities=1,
258
259
  )
259
260
 
260
261
  def test_root_modality_to_str_render(self):
261
262
  lm = fake.StaticResponse('1')
263
+ modality = modalities.Image.from_bytes(b'mock_image')
262
264
  self.assert_render(
263
- modalities.Image.from_bytes(b'mock_image'),
265
+ modality,
264
266
  None,
265
267
  lm=lm,
266
- expected_snippet='<<[[input]]>>',
268
+ expected_snippet=f'<<[[{modality.id}]]>>',
267
269
  exact_match=True,
268
270
  expected_modalities=1,
269
271
  )
270
272
 
271
273
  def test_str_with_modality_to_str_render(self):
272
274
  lm = fake.StaticResponse('A cat and a mouse.')
275
+ cat_image = modalities.Image.from_bytes(b'cat_image')
276
+ mouse_image = modalities.Image.from_bytes(b'mouse_image')
273
277
  self.assert_render(
274
278
  'What are these? {{this_image}} and {{that_image}}',
275
279
  None,
276
- this_image=modalities.Image.from_bytes(b'cat_image'),
277
- that_image=modalities.Image.from_bytes(b'mouse_image'),
280
+ this_image=cat_image,
281
+ that_image=mouse_image,
278
282
  lm=lm,
279
283
  expected_snippet=(
280
- 'What are these? <<[[this_image]]>> and <<[[that_image]]>>'
284
+ f'What are these? <<[[{cat_image.id}]]>> and '
285
+ f'<<[[{mouse_image.id}]]>>'
286
+ ),
287
+ exact_match=True,
288
+ expected_modalities=2,
289
+ )
290
+
291
+ def test_message_with_modality_to_str_render(self):
292
+ lm = fake.StaticResponse('A cat and a mouse.')
293
+ cat_image = modalities.Image.from_bytes(b'cat_image')
294
+ mouse_image = modalities.Image.from_bytes(b'mouse_image')
295
+ self.assert_render(
296
+ lf.Template(
297
+ 'What are these? {{this_image}} and {{that_image}}',
298
+ this_image=cat_image,
299
+ that_image=mouse_image,
300
+ ).render(),
301
+ None,
302
+ lm=lm,
303
+ expected_snippet=(
304
+ f'What are these? <<[[{cat_image.id}]]>> and '
305
+ f'<<[[{mouse_image.id}]]>>'
281
306
  ),
282
307
  exact_match=True,
283
308
  expected_modalities=2,
@@ -285,33 +310,33 @@ class QueryTest(unittest.TestCase):
285
310
 
286
311
  def test_structure_with_modality_to_str_render(self):
287
312
  lm = fake.StaticResponse('A cat and a mouse.')
313
+ cat_image = modalities.Image.from_bytes(b'cat_image')
314
+ mouse_image = modalities.Image.from_bytes(b'mouse_image')
288
315
  self.assert_render(
289
- [
290
- modalities.Image.from_bytes(b'cat_image'),
291
- modalities.Image.from_bytes(b'mouse_image'),
292
- ],
316
+ [cat_image, mouse_image],
293
317
  None,
294
318
  lm=lm,
295
- expected_snippet='`[<<[[input[0]]]>>, <<[[input[1]]]>>]`',
319
+ expected_snippet=(
320
+ f'`[<<[[{cat_image.id}]]>>, <<[[{mouse_image.id}]]>>]`'
321
+ ),
296
322
  exact_match=True,
297
323
  expected_modalities=2,
298
324
  )
299
325
 
300
326
  def test_structure_with_modality_to_structure_render(self):
301
327
  lm = fake.StaticResponse('["cat", "mouse"]')
328
+ cat_image = modalities.Image.from_bytes(b'cat_image')
329
+ mouse_image = modalities.Image.from_bytes(b'mouse_image')
302
330
  self.assert_render(
303
- [
304
- modalities.Image.from_bytes(b'cat_image'),
305
- modalities.Image.from_bytes(b'mouse_image'),
306
- ],
331
+ [cat_image, mouse_image],
307
332
  list[str],
308
333
  lm=lm,
309
- expected_snippet=inspect.cleandoc("""
334
+ expected_snippet=inspect.cleandoc(f"""
310
335
  REQUEST:
311
336
  ```python
312
337
  [
313
- <<[[input[0]]]>>,
314
- <<[[input[1]]]>>
338
+ <<[[{cat_image.id}]]>>,
339
+ <<[[{mouse_image.id}]]>>
315
340
  ]
316
341
  ```
317
342
  """),
@@ -320,25 +345,25 @@ class QueryTest(unittest.TestCase):
320
345
 
321
346
  def test_structure_with_modality_and_examples_to_structure_render(self):
322
347
  lm = fake.StaticResponse('["cat", "mouse"]')
348
+ cat_image = modalities.Image.from_bytes(b'cat_image')
349
+ mouse_image = modalities.Image.from_bytes(b'mouse_image')
350
+ dog_image = modalities.Image.from_bytes(b'dog_image')
323
351
  self.assert_render(
324
- [
325
- modalities.Image.from_bytes(b'cat_image'),
326
- modalities.Image.from_bytes(b'mouse_image'),
327
- ],
352
+ [cat_image, mouse_image],
328
353
  list[str],
329
354
  examples=[
330
355
  mapping.MappingExample(
331
- input=[modalities.Image.from_bytes(b'dog_image')],
356
+ input=[dog_image],
332
357
  schema=list[str],
333
358
  output=['dog'],
334
359
  ),
335
360
  ],
336
361
  lm=lm,
337
- expected_snippet=inspect.cleandoc("""
362
+ expected_snippet=inspect.cleandoc(f"""
338
363
  REQUEST:
339
364
  ```python
340
365
  [
341
- <<[[examples[0].input[0]]]>>
366
+ <<[[{dog_image.id}]]>>
342
367
  ]
343
368
  ```
344
369
 
@@ -356,8 +381,8 @@ class QueryTest(unittest.TestCase):
356
381
  REQUEST:
357
382
  ```python
358
383
  [
359
- <<[[input[0]]]>>,
360
- <<[[input[1]]]>>
384
+ <<[[{cat_image.id}]]>>,
385
+ <<[[{mouse_image.id}]]>>
361
386
  ]
362
387
  ```
363
388
 
@@ -369,6 +394,17 @@ class QueryTest(unittest.TestCase):
369
394
  expected_modalities=3,
370
395
  )
371
396
 
397
+ def test_query_with_modality_output(self):
398
+ cat_image = modalities.Image.from_bytes(b'cat_image')
399
+ lm = fake.StaticResponse(
400
+ lf.Template('Here you go: {{image}}', image=cat_image).render(
401
+ message_cls=lf.AIMessage
402
+ )
403
+ )
404
+ response = querying.query('Generate a cat image', lm=lm)
405
+ self.assertIsInstance(response, lf.AIMessage)
406
+ self.assertEqual(response.modalities(), [cat_image])
407
+
372
408
  def test_multiple_queries(self):
373
409
  self.assertEqual(
374
410
  querying.query(
@@ -545,7 +581,7 @@ class QueryTest(unittest.TestCase):
545
581
  )
546
582
  ).input,
547
583
  )
548
- self.assertIsNotNone(output.get_modality('image'))
584
+ self.assertEqual(len(output.referred_modalities), 1)
549
585
 
550
586
  def test_query_and_reduce(self):
551
587
  self.assertEqual(
langfun/core/template.py CHANGED
@@ -171,6 +171,7 @@ class Template(
171
171
 
172
172
  # Last render output.
173
173
  self._cached_render_output = None
174
+ self._referred_modalities = None
174
175
 
175
176
  @property
176
177
  def render_output(self) -> message_lib.Message | None:
@@ -322,24 +323,46 @@ class Template(
322
323
  compact=True,
323
324
  python_format=True,
324
325
  ):
325
- # Natural language formattable objects will be returned in natural
326
- # language when they are directly returned as rendering elements
326
+
327
+ # Capture the modality objects whose references are being
328
+ # rendered
327
329
  # in the template.
328
- with modality.format_modality_as_ref():
329
- rendered_text = self._template.render(**inputs)
330
+ with modality.capture_rendered_modalities() as modality_refs:
331
+
332
+ # Natural language formattable objects will be returned in
333
+ # natural language when they are directly returned as rendering
334
+ # elements in the template.
335
+ with modality.format_modality_as_ref():
336
+ rendered_text = self._template.render(**inputs)
330
337
 
331
- # Carry additional metadata.
332
- metadata = self.additional_metadata()
338
+ # Carry the modality references passed from the constructor.
339
+ # This is to support modality objects that is already rendered
340
+ # in the template string.
341
+ if self._referred_modalities:
342
+ modality_refs.update(self._referred_modalities)
333
343
 
334
344
  if self.clean:
335
345
  rendered_text = rendered_text.strip()
336
346
 
337
- metadata.update(
338
- {k: pg.Ref(v) for k, v in inputs.items() if not inspect.ismethod(v)}
339
- )
347
+ # Fill message metadata.
348
+ metadata = {
349
+ '__template_input__': {
350
+ k: pg.Ref(v) for k, v in inputs.items()
351
+ if not inspect.ismethod(v)
352
+ },
353
+ }
354
+
355
+ # Carry additional metadata.
356
+ # TODO(daiyip): Consider to put additional metadata into a separate
357
+ # key under `metadata`.
358
+ metadata.update(self.additional_metadata())
340
359
 
341
360
  # Fill the variables for rendering the template as metadata.
342
- message = message_cls(text=rendered_text, metadata=metadata)
361
+ message = message_cls(
362
+ text=rendered_text,
363
+ referred_modalities=modality_refs,
364
+ metadata=metadata
365
+ )
343
366
 
344
367
  # Tag input as rendered message.
345
368
  message.tag(message_lib.Message.TAG_RENDERED)
@@ -518,10 +541,13 @@ class Template(
518
541
  if isinstance(value, str):
519
542
  return cls(template_str=value, **kwargs)
520
543
  if isinstance(value, message_lib.Message):
521
- kwargs.update(value.metadata)
522
- return cls(template_str=value.text, **kwargs)
544
+ for k, v in value.metadata.sym_items(): # pylint: disable=attribute-error
545
+ kwargs[_ADDITIONAL_METADATA_PREFIX + k] = v
546
+ t = cls(template_str=value.text, **kwargs)
547
+ t._referred_modalities = value.referred_modalities
548
+ return t
523
549
  if isinstance(value, Template):
524
- lfun = cls(template_str=value.template_str, **kwargs)
550
+ lfun = cls(template_str=value.template_str, **kwargs) # pylint: disable=attribute-error
525
551
  # So lfun could acccess all attributes from value.
526
552
  lfun.sym_setparent(value)
527
553
  return lfun
@@ -176,6 +176,51 @@ class DefinitionTest(unittest.TestCase):
176
176
  Template('{{x=1')
177
177
 
178
178
 
179
+ class FromValueTest(unittest.TestCase):
180
+
181
+ def test_from_str(self):
182
+ t = Template.from_value('Hello {{x}}', x=1)
183
+ self.assertTrue(pg.eq(t, Template('Hello {{x}}', x=1)))
184
+ self.assertEqual(t.render(), 'Hello 1')
185
+
186
+ def test_from_message(self):
187
+ class CustomModality(modality.Modality):
188
+ content: str
189
+
190
+ def to_bytes(self):
191
+ return self.content.encode()
192
+
193
+ message = Template('{{image}}', image=CustomModality('foo')).render()
194
+ t = Template.from_value(message)
195
+ m = t.render()
196
+ self.assertTrue(
197
+ pg.eq(m.modalities(), [CustomModality('foo')])
198
+ )
199
+ self.assertEqual(message.metadata, m.metadata)
200
+
201
+ def test_from_same_template(self):
202
+ t = Template('Hello {{x}}', x=1)
203
+ t2 = Template.from_value(t)
204
+ self.assertTrue(pg.eq(t, t2))
205
+ self.assertEqual(t2.x, 1)
206
+
207
+ def test_from_different_template(self):
208
+ t = Template('Hello {{x}}', x=1)
209
+
210
+ class MyTemplate(Template):
211
+ pass
212
+
213
+ t2 = MyTemplate.from_value(t, x=2)
214
+ self.assertIsInstance(t2, MyTemplate)
215
+ self.assertEqual(t2.template_str, t.template_str)
216
+ self.assertEqual(t2.x, 2)
217
+
218
+ def test_from_python_object(self):
219
+ t = Template.from_value(pg.Dict(x=1, y=2))
220
+ self.assertEqual(t.template_str, '{{input}}')
221
+ self.assertEqual(t.input, pg.Dict(x=1, y=2))
222
+
223
+
179
224
  class VarsTest(unittest.TestCase):
180
225
 
181
226
  def assert_missing_vars(self, t: Template, missing_vars: set[str]):
@@ -251,6 +296,10 @@ class VarsTest(unittest.TestCase):
251
296
 
252
297
  class RenderTest(unittest.TestCase):
253
298
 
299
+ def setUp(self):
300
+ super().setUp()
301
+ self.maxDiff = None
302
+
254
303
  def test_clean(self):
255
304
  l = Template('\n Hello\n ')
256
305
  self.assertEqual(l.render(), 'Hello')
@@ -279,19 +328,20 @@ class RenderTest(unittest.TestCase):
279
328
  )
280
329
  v = l.render()
281
330
  self.assertEqual(v, 'How are you 1')
282
- self.assertIs(v.x, l.x)
283
- self.assertEqual(v.x.render_output, 'are you 1')
284
- self.assertIs(v.x.y, l.x.y)
285
- self.assertEqual(v.x.y.render_output, 'you 1')
286
- self.assertEqual(v.x.y.n, 1)
331
+ self.assertIs(v.__template_input__.x, l.x)
332
+ self.assertEqual(v.__template_input__.x.render_output, 'are you 1')
333
+ self.assertIs(v.__template_input__.x.y, l.x.y)
334
+ self.assertIs(v.__template_input__.x.y.n, l.x.y.n)
335
+ self.assertEqual(v.__template_input__.x.y.render_output, 'you 1')
336
+ self.assertEqual(v.__template_input__.x.y.n, 1)
287
337
 
288
338
  def test_render_with_call_args(self):
289
339
  l = Template('Hello {{x}} and {{y}}', x=1, y=Template('{{z}}'), z=3)
290
340
  v = l.render(x=2)
291
341
  self.assertEqual(v, 'Hello 2 and 3')
292
- self.assertEqual(v.x, 2)
293
- self.assertEqual(v.y, '3')
294
- self.assertEqual(v.y.z, 3)
342
+ self.assertEqual(v.__template_input__.x, 2)
343
+ self.assertEqual(v.__template_input__.y, '3')
344
+ self.assertEqual(v.__template_input__.y.z, 3)
295
345
 
296
346
  def test_render_cache(self):
297
347
  class DynamicContent(Template):
@@ -321,11 +371,17 @@ class RenderTest(unittest.TestCase):
321
371
  def to_bytes(self):
322
372
  return self.content.encode()
323
373
 
374
+ foo = CustomModality('foo')
375
+ message = Template('This is {{ x }} and {{ a }}', x=1, a=foo).render()
324
376
  self.assertEqual(
325
- Template(
326
- 'This is {{ x }} and {{ a }}', x=1, a=CustomModality('foo')
327
- ).render(),
328
- 'This is 1 and <<[[a]]>>',
377
+ message,
378
+ 'This is 1 and <<[[custom_modality:acbd18db]]>>',
379
+ )
380
+ self.assertIn(
381
+ 'custom_modality:acbd18db', message.referred_modalities
382
+ )
383
+ self.assertIs(
384
+ message.referred_modalities['custom_modality:acbd18db'], foo
329
385
  )
330
386
 
331
387
  def test_render_with_default(self):
@@ -511,12 +567,22 @@ class RenderTest(unittest.TestCase):
511
567
  self.assert_partial(Template('Hello {{len(x)}}'), 'Hello {{len(x)}}')
512
568
 
513
569
  def test_additional_metadata(self):
514
- t = Template('hi', metadata_weights=1.0, y=2)
515
- self.assertEqual(t.render(), message_lib.UserMessage('hi', weights=1.0))
570
+ t = Template('hi {{y}}', metadata_weights=1.0, y=2, z=1)
571
+ self.assertEqual(
572
+ t.render(),
573
+ message_lib.UserMessage(
574
+ 'hi 2', weights=1.0, __template_input__={'y': 2}
575
+ )
576
+ )
516
577
 
517
- t = Template('hi')
518
- with component.context(metadata_weights=1.0, y=2):
519
- self.assertEqual(t.render(), message_lib.UserMessage('hi', weights=1.0))
578
+ t = Template('hi {{y}}')
579
+ with component.context(metadata_weights=1.0, y=3):
580
+ self.assertEqual(
581
+ t.render(z=2),
582
+ message_lib.UserMessage(
583
+ 'hi 3', weights=1.0, __template_input__={'y': 3}
584
+ )
585
+ )
520
586
 
521
587
 
522
588
  class TemplateRenderEventTest(unittest.TestCase):
@@ -31,7 +31,7 @@ class MetricWriterTest(unittest.TestCase):
31
31
  pool_size=2,
32
32
  outage_grace_period=0,
33
33
  outage_retry_interval=0,
34
- housekeep_interval=0.0,
34
+ housekeep_interval=10.0,
35
35
  sandbox_keepalive_interval=1.0,
36
36
  event_handlers=[writer],
37
37
  )
@@ -43,13 +43,13 @@ class MetricWriterTest(unittest.TestCase):
43
43
  with env.sandbox('session2') as sb:
44
44
  sb.shell('echo "bar"', raise_error=RuntimeError)
45
45
 
46
- self.assertEqual(
46
+ self.assertIn(
47
47
  writer._sandbox_start.value(
48
48
  app='test_app',
49
49
  environment_id='testing-env',
50
50
  error='Success'
51
51
  ),
52
- 2
52
+ (2, 3)
53
53
  )
54
54
  self.assertGreater(
55
55
  writer._sandbox_housekeep.value(
@@ -53,10 +53,10 @@ class TestingSandbox(interface.Sandbox):
53
53
  self.set_status(self.Status.ACQUIRED)
54
54
 
55
55
  def start(self) -> None:
56
- self.set_alive()
56
+ pass
57
57
 
58
58
  def shutdown(self) -> None:
59
- self.set_alive(False)
59
+ pass
60
60
 
61
61
  def start_session(self, session_id: str) -> None:
62
62
  self._session_id = session_id
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: langfun
3
- Version: 0.1.2.dev202510240805
3
+ Version: 0.1.2.dev202510250803
4
4
  Summary: Langfun: Language as Functions.
5
5
  Home-page: https://github.com/google/langfun
6
6
  Author: Langfun Authors
@@ -12,28 +12,28 @@ langfun/core/async_support_test.py,sha256=fMz1ulGrfUCuHp7RtYktuBwpbRN3kCBKnB4LFv
12
12
  langfun/core/component.py,sha256=g1kQM0bryYYYWVDrSMnHfc74wIBbpfe5_B3s-UIP5GE,3028
13
13
  langfun/core/component_test.py,sha256=0CxTgjAud3aj8wBauFhG2FHDqrxCTl4OI4gzQTad-40,9254
14
14
  langfun/core/concurrent.py,sha256=zY-pXqlGqss_GI20tM1gXvyW8QepVPUuFNmutcIdhbI,32760
15
- langfun/core/concurrent_test.py,sha256=KzXOlfR3i_-s_GKBLYrO5-ETCvHoFbFY2o9FEeOeXq4,17818
15
+ langfun/core/concurrent_test.py,sha256=Da4oqfu_YWH-B8H2Bv6e8tWIkR0ubkW40bccQ3N1mMg,17855
16
16
  langfun/core/console.py,sha256=cLQEf84aDxItA9fStJV22xJch0TqFLNf9hLqwJ0RHmU,2652
17
17
  langfun/core/console_test.py,sha256=pBOcuNMJdVELywvroptfcRtJMsegMm3wSlHAL2TdxVk,1679
18
18
  langfun/core/langfunc.py,sha256=G50YgoVZ0y1GFw2ev41MlOqr6qa8YakbvNC0h_E0PiA,11140
19
- langfun/core/langfunc_test.py,sha256=S6iM9YKLd23gw_t2Mn3UtM1Qz7wsXym1PndZSqPDom8,8893
20
- langfun/core/language_model.py,sha256=vZ2KLxJRxloEAY3Ig1B9yY5hVkEUgYPm3xy4kKOo0jY,52371
21
- langfun/core/language_model_test.py,sha256=aJWn3UJm_S6U7VhU7EVXdJHPe1xza5glngPkRGtx280,38426
19
+ langfun/core/langfunc_test.py,sha256=eY7hNgkwtVKcro2G6Fh2k6upVEg8ggXBKjVmqT8oLn4,8961
20
+ langfun/core/language_model.py,sha256=_YhWB6PsyghkN-ykvVtjr3qUZT9SoAp_pcxX1SQZoe0,52339
21
+ langfun/core/language_model_test.py,sha256=UIQpovmVfJnJ2EDOi9OZG_1UNClWs9lkTaE22_ClSlQ,38550
22
22
  langfun/core/logging.py,sha256=7IGAhp7mGokZxxqtL-XZvFLKaZ5k3F5_Xp2NUtR4GwE,9136
23
23
  langfun/core/logging_test.py,sha256=vbVGOQxwMmVSiFfbt2897gUt-8nqDpV64jCAeUG_q5U,6924
24
24
  langfun/core/memory.py,sha256=vyXVvfvSdLLJAzdIupnbn3k26OgclCx-OJ7gddS5e1Y,2070
25
- langfun/core/message.py,sha256=Nx9SqEIkPMS5I1RyMQFlWUjZCsdlGamv_wTze2-3R4M,32784
26
- langfun/core/message_test.py,sha256=dAA_ZzI5MGyFfXyejxPrB90SbR066mkIgmRtdZ5ZbL4,40803
27
- langfun/core/modality.py,sha256=K8pUGuMpfWcOtVcXC_OqVjro1-RhHF6ddQni61DuYzM,4166
28
- langfun/core/modality_test.py,sha256=0WL_yd3B4K-FviWdSpDnOwj0f9TQI0v9t6X0vWvvJbo,2415
25
+ langfun/core/message.py,sha256=m36GDLtuDVUURkYORTEj61Uho6eILwSkCjrksK0HLWs,33964
26
+ langfun/core/message_test.py,sha256=hjnzxJbjLNau30Ex7h5B0qC8qUU4uscoUcEVayRiXFQ,38355
27
+ langfun/core/modality.py,sha256=h56hfCyxX_rK_BU3pFxXpGD79TvFeRXVo71QvpzmZiw,6596
28
+ langfun/core/modality_test.py,sha256=0MQz6e39XOd2UjAIc5Vq9Eems1IUgOxD7Skf0gTMGTg,3665
29
29
  langfun/core/natural_language.py,sha256=3ynSnaYQnjE60LIPK5fyMgdIjubnPYZwzGq4rWPeloE,1177
30
30
  langfun/core/natural_language_test.py,sha256=LHGU_1ytbkGuSZQFIFP7vP3dBlcY4-A12fT6dbjUA0E,1424
31
31
  langfun/core/sampling.py,sha256=SCnS5PFJWNVxSKvSkSCNRUmruvScun8UcNN4gafuXcw,5866
32
- langfun/core/sampling_test.py,sha256=U7PANpMsl9E_pa4_Y4FzesSjcwg-u-LKHGCWSgv-8FY,3663
32
+ langfun/core/sampling_test.py,sha256=kzoWYRiAOFFMYDraqnEi7lOWKfhW6EqGBgFRTHxPsaw,3958
33
33
  langfun/core/subscription.py,sha256=euawEuSZP-BHydaT-AQpfYFL0m5pWPGcW0upFhrojqc,10930
34
34
  langfun/core/subscription_test.py,sha256=Y4ZdbZEwm83YNZBxHff0QR4QUa4rdaNXA3_jfIcArBo,8717
35
- langfun/core/template.py,sha256=9uswFC3Vbj9l1Zi9-Kbw6BZuCiP9H598ysbN3IBcBoI,24966
36
- langfun/core/template_test.py,sha256=AQv_m9qE93WxhEhSlm1xaBgB4hu0UVtA53dljngkUW0,17090
35
+ langfun/core/template.py,sha256=CQOEA1Lq0gU_uk43K1FJjpBSwL8o5fglFr2tGCbOxpI,26008
36
+ langfun/core/template_test.py,sha256=vQZvFVS4VHk-6GUdOEQ-UA_4tlVBbpRPqB1Bw7DFJJg,19052
37
37
  langfun/core/agentic/__init__.py,sha256=vsnuvjaz9-nysBjdihGf43JC8AyLPhPJwIOevyONyAQ,1517
38
38
  langfun/core/agentic/action.py,sha256=ojwaPIV_a_khKPR6x1Fk5i2dsUTSe3VjKaxnZ92b0nE,58243
39
39
  langfun/core/agentic/action_eval.py,sha256=YTilyUEkJl_8FVMgdfO17PurWWaEJ6oA15CuefJJRLk,4887
@@ -54,11 +54,11 @@ langfun/core/coding/python/sandboxing_test.py,sha256=H_0_pd-_uS-ci5yYhmDTR6-hyzo
54
54
  langfun/core/data/__init__.py,sha256=qllw9ST1vveZv-1E0VM5hezn1YH-OcqGI-yFqQYnWgI,732
55
55
  langfun/core/data/conversion/__init__.py,sha256=ZcGntBruvvZSfESO-Tha1nzHfgWEK7I1u78Jw8gsoVU,883
56
56
  langfun/core/data/conversion/anthropic.py,sha256=0xf1sWt6WhmG8EsaeLY4Ee7S3FcDWKPOtn6caCBhtrQ,4431
57
- langfun/core/data/conversion/anthropic_test.py,sha256=R43PyveNUCHNCvfu6RFsTk0EIKK8M1Gzng0Kay8TlE8,8534
57
+ langfun/core/data/conversion/anthropic_test.py,sha256=BMIyLgFOtFuJYJAkSLR1nwG7UOwtoT61R5xAXtJfSMY,8624
58
58
  langfun/core/data/conversion/gemini.py,sha256=mLft9j30W8aIi5a7tOdjfO2v8O8a61FSDKf2k-co93M,5825
59
- langfun/core/data/conversion/gemini_test.py,sha256=G-av2BUngBkxOkJz94CMpZRGq6DGDBvgLltoezuohm0,7239
60
- langfun/core/data/conversion/openai.py,sha256=sSpkDSxMJWJ3I1dNICBCzvLsJv4iiLg8FPYLtubBJUM,4181
61
- langfun/core/data/conversion/openai_test.py,sha256=38WV_3ofFZiUF10bTKnZp4VyuDP5-81aR3h3Q0HlBm0,5283
59
+ langfun/core/data/conversion/gemini_test.py,sha256=LeSToAqEhBHekSCjHFkC_cLN7Xv_cn-nnCURS95511M,7366
60
+ langfun/core/data/conversion/openai.py,sha256=S1isgEgZHr1ZncydA1JSkPTQQxYCamnck8aqVH3s4wE,7203
61
+ langfun/core/data/conversion/openai_test.py,sha256=7OrB_i4HF2zUxkdeFp35p4pyzwnpY6uN-ACIqrPgUVI,9835
62
62
  langfun/core/eval/__init__.py,sha256=OEXr1ZRuvLuhJJfuQ1ZWQ-SvYzjyrtiAAEogYaB7E6o,1933
63
63
  langfun/core/eval/base.py,sha256=g2qnOg9zyU20coNTCwX6Fbi0pPFEUoOxHY5uw98LcNg,75810
64
64
  langfun/core/eval/base_test.py,sha256=jbl5NMKk9QUsp8R-OeTJ4dEefQdK8JL1lIouuihglbc,27191
@@ -85,19 +85,19 @@ langfun/core/eval/v2/metrics_test.py,sha256=LibZXvWEJDVRY-Mza_bQT-SbmbXCHUnFhL7Z
85
85
  langfun/core/eval/v2/progress.py,sha256=azZgssQgNdv3IgjKEaQBuGI5ucFDNbdi02P4z_nQ8GE,10292
86
86
  langfun/core/eval/v2/progress_test.py,sha256=YU7VHzmy5knPZwj9vpBN3rQQH2tukj9eKHkuBCI62h8,2540
87
87
  langfun/core/eval/v2/progress_tracking.py,sha256=zNhNPGlnJnHELEfFpbTMCSXFn8d1IJ57OOYkfFaBFfM,6097
88
- langfun/core/eval/v2/progress_tracking_test.py,sha256=MC7hD-KfxqSIwKK_BN7oGx7HA8O3_fY-Y3cYYAhZzxE,2343
88
+ langfun/core/eval/v2/progress_tracking_test.py,sha256=omOvSTvF-KgzwmXiOUj8sr5DhaYShaGOwTVPmM8AGxQ,2476
89
89
  langfun/core/eval/v2/reporting.py,sha256=yUIPCAMnp7InIzpv1DDWrcLO-75iiOUTpscj7smkfrA,8335
90
90
  langfun/core/eval/v2/reporting_test.py,sha256=CMK-vwho8cNRJwlbkCqm_v5fykE7Y3V6SaIOCY0CDyA,5671
91
91
  langfun/core/eval/v2/runners.py,sha256=bEniZDNu44AQgvqpwLsvBU4V_7WltAe-NPhYgIsLj1E,16848
92
92
  langfun/core/eval/v2/runners_test.py,sha256=spjkmqlls_vyERdZMdjv6dhIN9ZfxsDDvIQAWTj2kMk,11954
93
- langfun/core/llms/__init__.py,sha256=g2OQWlgmgblE2wps8mLUcBhr0IP2bylwMhOjGOI2ze0,10110
93
+ langfun/core/llms/__init__.py,sha256=UJ1UE41JPgkS56uNzJQ5ag9VWJN3OJuNna7aFR4CyOM,10184
94
94
  langfun/core/llms/anthropic.py,sha256=O_OuBiFhHou1Y15W2GwYFY1gV3FUsSUBOsAJp9UORqI,30710
95
95
  langfun/core/llms/anthropic_test.py,sha256=qA9vByp_cwwXNlXzcwHpPWFnO9lfFo8NKfDi5nBNqgI,9052
96
96
  langfun/core/llms/azure_openai.py,sha256=-KkSLaR54MlsIqz_XIwv0TnsBnvNTAxnjA2Q2O2u5KM,2733
97
97
  langfun/core/llms/azure_openai_test.py,sha256=lkMZkQdJBV97fTM4C4z8qNfvr6spgiN5G4hvVUIVr0M,1735
98
98
  langfun/core/llms/compositional.py,sha256=W_Fe2BdbkjwTzWW-paCWcEeG9oOR3-IcBG8oc73taSM,2878
99
99
  langfun/core/llms/compositional_test.py,sha256=4eTnOer-DncRKGaIJW2ZQQMLnt5r2R0UIx_DYOvGAQo,2027
100
- langfun/core/llms/deepseek.py,sha256=jvTxdXPr-vH6HNakn_Ootx1heDg8Fen2FUkUW36bpCs,5247
100
+ langfun/core/llms/deepseek.py,sha256=Pyv2Pmviu91HfNGR994Mh7AKNvWHAAlue7Xfb9MZaPo,5254
101
101
  langfun/core/llms/deepseek_test.py,sha256=DvROWPlDuow5E1lfoSkhyGt_ELA19JoQoDsTnRgDtTg,1847
102
102
  langfun/core/llms/fake.py,sha256=bDk_4u7V2LmYUotyOaicwzi0-lnWOIIBbR3-Bil1P3o,3481
103
103
  langfun/core/llms/fake_test.py,sha256=lC-C2TpEsnf2kmZpa3OiH2H944I4hMWTAaHEXzRj1DU,7855
@@ -105,22 +105,22 @@ langfun/core/llms/gemini.py,sha256=-DL5PebzaTjz7rTFw_1RC5O1aE4EYSv3oNsM65YKCoo,3
105
105
  langfun/core/llms/gemini_test.py,sha256=y1s0W65SrdepbZxzgIeoTB2MI7sXnfBDf1NsGn57LbM,7617
106
106
  langfun/core/llms/google_genai.py,sha256=ogyoOUK4s1OcSFKun0YK5xBRDVyxmvz9WsYNKAwuB0g,5918
107
107
  langfun/core/llms/google_genai_test.py,sha256=NKNtpebArQ9ZR7Qsnhd2prFIpMjleojy6o6VMXkJ1zY,1502
108
- langfun/core/llms/groq.py,sha256=S9V10kFo3cgX89qPgt_umq-SpRnxEDLTt_hJmpERfbo,12066
108
+ langfun/core/llms/groq.py,sha256=nDhnQEmyNn32DMvNbOv6GZhfZKmFLfIk2lGdqgKrhhg,12073
109
109
  langfun/core/llms/groq_test.py,sha256=P4EgexCqsh4K2x11w0UL_vz-YYNaPdQU0WsDAdnTRQ8,2045
110
- langfun/core/llms/llama_cpp.py,sha256=Z7P3gc4xeIjc2bX0Ey1y5EUYJVMnMa2Q67PZ9iye9sE,1409
110
+ langfun/core/llms/llama_cpp.py,sha256=gESwY8sSSF40dj5RId5oXolmSMDUSKaSS2wDdtTKef8,1416
111
111
  langfun/core/llms/llama_cpp_test.py,sha256=wfTO7nmUwL65U2kK9P9fcMt92JjNDuVia4G1E7znf_4,1086
112
- langfun/core/llms/openai.py,sha256=UZM0j3BHRz5NVLs8q7YYRkneM1CwuGQSt7sFaM4IAPU,44164
113
- langfun/core/llms/openai_compatible.py,sha256=PIQw8jnToqfPwEDVHBdJO5eWZ77ZHhc0kvhCHuGAfQk,5834
114
- langfun/core/llms/openai_compatible_test.py,sha256=KwOMA7tsmOxFBjezltkBDSU77AvOQkI23dO2nHLAlB4,17689
115
- langfun/core/llms/openai_test.py,sha256=gwuO6aoa296iM2welWV9ua4KF8gEVGsEPakgbtkWkFQ,2687
112
+ langfun/core/llms/openai.py,sha256=ytappj4uh_DOncIexg8MaoRB534j5qU-R8ka57SFuV0,44277
113
+ langfun/core/llms/openai_compatible.py,sha256=l8nucff-ovmiv9PvrAMSp9v5GE7t8nu4_knGQrKN52o,9319
114
+ langfun/core/llms/openai_compatible_test.py,sha256=8yr_jGmHCDyMwp-VcJwThFgh7B_56h69Fmw97XZxAZw,23133
115
+ langfun/core/llms/openai_test.py,sha256=1o5rxiHZj-UEgugWN8JmfJtznhUmDywy6dU3Euax-Ts,2639
116
116
  langfun/core/llms/rest.py,sha256=YXzSjr7YgtZ5zKDgjA-3D-sabo5wTjpLQDHUIcEPPgg,4773
117
117
  langfun/core/llms/rest_test.py,sha256=_zM7nV8DEVyoXNiQOnuwJ917mWjki0614H88rNmDboE,5020
118
- langfun/core/llms/vertexai.py,sha256=SeUDcH9mis5e7XsdBOCLIH6AxqT1-TpnTKRWNPuRXOY,20554
118
+ langfun/core/llms/vertexai.py,sha256=Pob7eCw5GpfeATL2zXUYJahxPEhcvLIfO54iy7wGGdQ,20568
119
119
  langfun/core/llms/vertexai_test.py,sha256=_e-acnNBAf9C3WO6i1b2J_mhRzdDdYQTorD9hIVZKOg,5034
120
120
  langfun/core/llms/cache/__init__.py,sha256=QAo3InUMDM_YpteNnVCSejI4zOsnjSMWKJKzkb3VY64,993
121
- langfun/core/llms/cache/base.py,sha256=rt3zwmyw0y9jsSGW-ZbV1vAfLxQ7_3AVk0l2EySlse4,3918
121
+ langfun/core/llms/cache/base.py,sha256=xVUOfHWa8uzuVcvhBPqGcmBKlQlOGpqemBXfYyqq5y0,4024
122
122
  langfun/core/llms/cache/in_memory.py,sha256=i58oiQL28RDsq37dwqgVpC2mBETJjIEFS20yHiV5MKU,5185
123
- langfun/core/llms/cache/in_memory_test.py,sha256=V2UPeu5co5vUwSkjekCH1B1iLm9qQKPaacvP6VW3GTg,10388
123
+ langfun/core/llms/cache/in_memory_test.py,sha256=AG9OGdxfyW9LdteFRF-aOIhxiH5Kna5U-pQk91ljHCQ,10538
124
124
  langfun/core/mcp/__init__.py,sha256=cyVP_YTjOmbjhYg8BE7-RnE4Txt8wDukYC0anhHKpuo,286
125
125
  langfun/core/mcp/client.py,sha256=NBo4W2fdvYyywlUHynAbyh7LNohILccTkCiisj-UEEg,3642
126
126
  langfun/core/mcp/client_test.py,sha256=Vjbh7bXM8xXMMe_QOnFJ4rE0wITovAZbwk7Nu-cqf8g,2766
@@ -131,30 +131,30 @@ langfun/core/mcp/testing/simple_mcp_server.py,sha256=dw4t6ERWMdmi6kDE38RU5oYu5MQ
131
131
  langfun/core/memories/__init__.py,sha256=HpghfZ-w1NQqzJXBx8Lz0daRhB2rcy2r9Xm491SBhC4,773
132
132
  langfun/core/memories/conversation_history.py,sha256=KR78PurXTSeqsRK9QG9xM7-f245rs20EvWO7Mm2n2Vw,1827
133
133
  langfun/core/memories/conversation_history_test.py,sha256=2kzAq2pUrbR01Z9jhxviIao52JK4JVjr5iGP8pwGxlU,2156
134
- langfun/core/modalities/__init__.py,sha256=rh74vS_oL3XzD83ZJrDzwmW-8jnJHJ3s2_Prmp3ndYQ,1116
134
+ langfun/core/modalities/__init__.py,sha256=2_T5Hsc4iEqmJZuYaqwRNgNM5XpmuTVcnZUMe5cAQDk,1521
135
135
  langfun/core/modalities/audio.py,sha256=qCrVCX690SG0ps-ZfOtNWvHn_CmdJsmxF7GySScWUqY,964
136
136
  langfun/core/modalities/audio_test.py,sha256=tW1vEy-Cumhf-HgDgCxlSNZqgJb2HTgqOixGWLiwOmw,2065
137
137
  langfun/core/modalities/image.py,sha256=9TMO63UHtkimouDb6e1naXWxbK7kRgSGPLzBY26BNk8,1835
138
138
  langfun/core/modalities/image_test.py,sha256=XMgtJXY75R5eo0CZ222D1QUy57_hESnttmCGWwDLt7k,3824
139
- langfun/core/modalities/mime.py,sha256=BSRGMHNM2X6xgYJIbGsqZyZX9JOlebeYa8-QkFEHsCw,8937
139
+ langfun/core/modalities/mime.py,sha256=K_nnm0p6413IqTGyXAezLdRdEDNi6ByuX4xMOELfOIM,9204
140
140
  langfun/core/modalities/mime_test.py,sha256=n084tOkeKHKMOVblCmi5s8nw4o7VYn3ynqvcrz8ww7c,5977
141
141
  langfun/core/modalities/pdf.py,sha256=mfaeCbUA4JslFVTARiJh8hW7imvL4tLVw9gUhO5bAZA,727
142
142
  langfun/core/modalities/pdf_test.py,sha256=ulZ0FbnlsU0wkrdckJ4ONZPTYRyMPO9Aob1UO6FXygk,1950
143
143
  langfun/core/modalities/video.py,sha256=vI9apcHIHGyp90i34Srg7S3G6IBDtDCk8qiXhwRQmkw,967
144
144
  langfun/core/modalities/video_test.py,sha256=7OXZoohKMYjt7vrJUdPb553HLyl1oBOKRgzBePFv68Q,2042
145
145
  langfun/core/structured/__init__.py,sha256=uc9f2DaXcbPRU35CgTpObub6hsnxDCHx-4s149qnzJ0,3655
146
- langfun/core/structured/completion.py,sha256=B0PHqBucu-keexJUa5g0F9fu57DlLtWDhZzJ-OD4VrE,8823
147
- langfun/core/structured/completion_test.py,sha256=-SGcMgtLuS6RQB8gFh18dUkSMQMDWKZGmBkPsAYHApQ,20348
146
+ langfun/core/structured/completion.py,sha256=0qfbmHBDftI4f-CkPBxYC934x41yKTOVbgOEXBwDZ1w,8672
147
+ langfun/core/structured/completion_test.py,sha256=OoyxtbiaAdy_QfJeTNKfvijPiC0H91gIjuIiWvGUd4o,19776
148
148
  langfun/core/structured/description.py,sha256=6BztYOiucPkF4CrTQtPLPJo1gN2dwnKmaJW83GBf4H0,5213
149
149
  langfun/core/structured/description_test.py,sha256=UxaXnKKP7TnyPDPUyf3U-zPE0TvLlIP6DGr8thjcePw,7365
150
150
  langfun/core/structured/function_generation.py,sha256=g7AOR_e8HxFU6n6Df750aGkgMgV1KExLZMAz0yd5Agg,8555
151
151
  langfun/core/structured/function_generation_test.py,sha256=LaXYDXf9GlqUrR6v_gtmK_H4kxzonmU7SYbn7XXMgjU,12128
152
- langfun/core/structured/mapping.py,sha256=1YBW8PKpJKXS7DKukfzKNioL84PrKUcB4KOUudrQ20w,14374
152
+ langfun/core/structured/mapping.py,sha256=Q1zhkTdOYQBOVqekNEOTtTP_1mGhu_5ChYza3Ms2_u0,14035
153
153
  langfun/core/structured/mapping_test.py,sha256=OntYvfDitAf0tAnzQty3YS90vyEn6FY1Mi93r_ViEk8,9594
154
154
  langfun/core/structured/parsing.py,sha256=bLi7o1AdyDWc6TwxmYg70t_oTgmLkJWBafakdF8n2RI,14195
155
155
  langfun/core/structured/parsing_test.py,sha256=vRfCSzA9q7C1cElkAnDvbRepULEa_vclqDIv-heypDw,22745
156
- langfun/core/structured/querying.py,sha256=P8miXfg6Q6HEvChnrLYUq5frIYREtduoTPTyQuysMGc,39649
157
- langfun/core/structured/querying_test.py,sha256=ulRgKniUd-pMEWFKo_B5NY0pv_mVCSJ_-34QIGspZRo,50353
156
+ langfun/core/structured/querying.py,sha256=5PYVZUkf2YIJmwN6CDBgwubiU7mK2jGMAEZH6wp-afM,39552
157
+ langfun/core/structured/querying_test.py,sha256=zjUEtBPcD0xAPKVmnIwZLzoGpRCMk5pIDtMDG2K5Ps4,51728
158
158
  langfun/core/structured/schema.py,sha256=xtgrr3t5tcYQ2gi_fkTKz2IgDMf84gpiykmBdfnV6Io,29486
159
159
  langfun/core/structured/schema_generation.py,sha256=pEWeTd8tQWYnEHukas6GVl4uGerLsQ2aNybtnm4Qgxc,5352
160
160
  langfun/core/structured/schema_generation_test.py,sha256=RM9s71kMNg2jTePwInkiW9fK1ACN37eyPeF8OII-0zw,2950
@@ -180,16 +180,16 @@ langfun/env/base_test.py,sha256=DrBtyweO4v8Fz3Oz-gnpJ4W_9hRhuVXA1CTLvXJDa9s,6109
180
180
  langfun/env/interface.py,sha256=2Amf-_op7dGRF8c4-wYxcFxs1UCBYz1AB20Lk7__V4E,25724
181
181
  langfun/env/interface_test.py,sha256=hfQn4RRTEo1YfVHXTPzH1puzD14BTo8R_5v1IpXVZ90,1398
182
182
  langfun/env/load_balancers.py,sha256=qRhCthqzjZIQBwta8qC1C0s0J-VQAVomJQqI7Nqv-r4,1948
183
- langfun/env/load_balancers_test.py,sha256=KIDIwZeQHcW0fCL5ScZD0lm0QV4_X2y-rMqdd6R1gLc,3737
183
+ langfun/env/load_balancers_test.py,sha256=73QQG-Lufy5DBhQuzWNUaaH24YiZFdZEHe67TkJn7a0,3708
184
184
  langfun/env/test_utils.py,sha256=rnIQZ2ZpiFuB7yfl5ckGtacBoySAwguzBzXzqhyo8jw,14042
185
185
  langfun/env/event_handlers/__init__.py,sha256=H34n-TbKSgtxqBhE-yAti8fY6weF2_v3yw59M9_zmGM,443
186
186
  langfun/env/event_handlers/base.py,sha256=eGdJ6N5em9kX-c9wzm1TdnRP5_5IAltX5JTHILdjzLM,10124
187
187
  langfun/env/event_handlers/event_logger.py,sha256=3dbPjBe53dBgntYHlyLlj_77hVecPSXkmKeiGXMxlO0,12699
188
188
  langfun/env/event_handlers/event_logger_test.py,sha256=PGof3rPllNnyzs3Yp8kaOHLeTkVrzUgCJwlODTrVRKI,9111
189
189
  langfun/env/event_handlers/metric_writer.py,sha256=NgJKsd6xWOtEd0IjYi7coGEaqGYkkPcDjXN9CQ3vxPU,18043
190
- langfun/env/event_handlers/metric_writer_test.py,sha256=flRqK10wonhJk4idGD_8jjEjrfjgH0R-qcu-7Bj1G5s,5335
191
- langfun-0.1.2.dev202510240805.dist-info/licenses/LICENSE,sha256=WNHhf_5RCaeuKWyq_K39vmp9F28LxKsB4SpomwSZ2L0,11357
192
- langfun-0.1.2.dev202510240805.dist-info/METADATA,sha256=74oMU7_OzCL7m-XDTqb9L2LeRY24jjoZmoXozLX5akE,7522
193
- langfun-0.1.2.dev202510240805.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
194
- langfun-0.1.2.dev202510240805.dist-info/top_level.txt,sha256=RhlEkHxs1qtzmmtWSwYoLVJAc1YrbPtxQ52uh8Z9VvY,8
195
- langfun-0.1.2.dev202510240805.dist-info/RECORD,,
190
+ langfun/env/event_handlers/metric_writer_test.py,sha256=deqCIdo-Q89rRCF2lerU3GpWmFG_SvDx162UQIZxPgE,5338
191
+ langfun-0.1.2.dev202510250803.dist-info/licenses/LICENSE,sha256=WNHhf_5RCaeuKWyq_K39vmp9F28LxKsB4SpomwSZ2L0,11357
192
+ langfun-0.1.2.dev202510250803.dist-info/METADATA,sha256=XnXFFEd0l7fdGDPdiJZ4VmFT56ssu8MUyOdpDTsUaF4,7522
193
+ langfun-0.1.2.dev202510250803.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
194
+ langfun-0.1.2.dev202510250803.dist-info/top_level.txt,sha256=RhlEkHxs1qtzmmtWSwYoLVJAc1YrbPtxQ52uh8Z9VvY,8
195
+ langfun-0.1.2.dev202510250803.dist-info/RECORD,,