langfun 0.1.2.dev202412200804__py3-none-any.whl → 0.1.2.dev202412220804__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.
@@ -66,6 +66,10 @@ class PerExampleCheckpointer(Checkpointer):
66
66
 
67
67
  # For refresh runs, we don't want to load the previous state.
68
68
  if not runner.current_run.refresh:
69
+ if runner.current_run.input_root != runner.current_run.output_root:
70
+ experiment.info(
71
+ f'Warm starting from directory: {runner.current_run.input_root}.'
72
+ )
69
73
  def _load_state(ckpt_file):
70
74
  experiment.load_state(ckpt_file)
71
75
 
@@ -85,8 +89,8 @@ class PerExampleCheckpointer(Checkpointer):
85
89
  ):
86
90
  if error is not None:
87
91
  experiment.warning(
88
- 'Failed to load checkpoint file %s: %s. Skipping the file.',
89
- ckpt_file, error
92
+ f'Failed to load checkpoint file {ckpt_file}: {error}. '
93
+ 'Skipping the file.'
90
94
  )
91
95
  super().on_experiment_start(experiment)
92
96
 
@@ -181,6 +185,10 @@ class BulkCheckpointer(Checkpointer):
181
185
  return
182
186
  # For refresh runs, we don't want to load the previous state.
183
187
  if not runner.current_run.refresh:
188
+ if runner.current_run.input_root != runner.current_run.output_root:
189
+ experiment.info(
190
+ f'Warm starting from directory: {runner.current_run.input_root}.'
191
+ )
184
192
  experiment.load_state(
185
193
  runner.current_run.input_path_for(
186
194
  experiment, self.checkpoint_filename
@@ -16,9 +16,9 @@ import tempfile
16
16
  import unittest
17
17
 
18
18
  from langfun.core.eval.v2 import checkpointing
19
+ from langfun.core.eval.v2 import eval_test_helper
19
20
  from langfun.core.eval.v2 import example as example_lib
20
21
  from langfun.core.eval.v2 import runners as runners_lib # pylint: disable=unused-import
21
- from langfun.core.eval.v2 import test_helper
22
22
  import pyglove as pg
23
23
 
24
24
  Example = example_lib.Example
@@ -56,7 +56,7 @@ class PerExampleCheckpointerTest(unittest.TestCase):
56
56
 
57
57
  def test_checkpointing(self):
58
58
  root_dir = os.path.join(tempfile.gettempdir(), 'per_example_checkpointer')
59
- experiment = test_helper.test_experiment()
59
+ experiment = eval_test_helper.test_experiment()
60
60
  checkpoint_filename = 'checkpoint.jsonl'
61
61
  checkpointer = checkpointing.PerExampleCheckpointer(checkpoint_filename)
62
62
  run = experiment.run(
@@ -89,7 +89,7 @@ class BulkCheckpointerTest(unittest.TestCase):
89
89
 
90
90
  def test_checkpointing(self):
91
91
  root_dir = os.path.join(tempfile.gettempdir(), 'test_bulk_checkpointer')
92
- experiment = test_helper.test_experiment()
92
+ experiment = eval_test_helper.test_experiment()
93
93
  checkpoint_filename = 'checkpoint.jsonl'
94
94
  checkpointer = checkpointing.BulkCheckpointer(checkpoint_filename)
95
95
  run = experiment.run(
@@ -15,12 +15,11 @@ import os
15
15
  import tempfile
16
16
  import unittest
17
17
 
18
+ from langfun.core.eval.v2 import eval_test_helper
18
19
  from langfun.core.eval.v2 import evaluation as evaluation_lib
19
20
  from langfun.core.eval.v2 import example as example_lib
20
21
  from langfun.core.eval.v2 import experiment as experiment_lib
21
22
 
22
- from langfun.core.eval.v2 import test_helper
23
-
24
23
  import pyglove as pg
25
24
 
26
25
  Example = example_lib.Example
@@ -32,17 +31,23 @@ Run = experiment_lib.Run
32
31
  class EvaluationTest(unittest.TestCase):
33
32
 
34
33
  def test_hyper_evaluation(self):
35
- exp = test_helper.TestEvaluation(
36
- lm=test_helper.TestLLM(offset=pg.oneof(range(3)))
34
+ exp = eval_test_helper.TestEvaluation(
35
+ lm=eval_test_helper.TestLLM(offset=pg.oneof(range(3)))
37
36
  )
38
37
  self.assertFalse(exp.is_leaf)
39
38
  self.assertTrue(
40
39
  pg.eq(
41
40
  exp.children,
42
41
  [
43
- test_helper.TestEvaluation(lm=test_helper.TestLLM(offset=0)),
44
- test_helper.TestEvaluation(lm=test_helper.TestLLM(offset=1)),
45
- test_helper.TestEvaluation(lm=test_helper.TestLLM(offset=2)),
42
+ eval_test_helper.TestEvaluation(
43
+ lm=eval_test_helper.TestLLM(offset=0)
44
+ ),
45
+ eval_test_helper.TestEvaluation(
46
+ lm=eval_test_helper.TestLLM(offset=1)
47
+ ),
48
+ eval_test_helper.TestEvaluation(
49
+ lm=eval_test_helper.TestLLM(offset=2)
50
+ ),
46
51
  ]
47
52
  )
48
53
  )
@@ -57,19 +62,21 @@ class EvaluationTest(unittest.TestCase):
57
62
  )
58
63
 
59
64
  def test_input(self):
60
- exp = test_helper.TestEvaluation()
65
+ exp = eval_test_helper.TestEvaluation()
61
66
  self.assertEqual(exp.num_examples, 10)
62
- exp = test_helper.TestEvaluation(inputs=test_helper.test_inputs(None))
67
+ exp = eval_test_helper.TestEvaluation(
68
+ inputs=eval_test_helper.test_inputs(None)
69
+ )
63
70
  self.assertEqual(exp.num_examples, 20)
64
71
  @pg.functor
65
72
  def my_inputs():
66
73
  yield pg.Dict(x=1, y=2)
67
74
  yield pg.Dict(x=3, y=4)
68
- exp = test_helper.TestEvaluation(inputs=my_inputs())
75
+ exp = eval_test_helper.TestEvaluation(inputs=my_inputs())
69
76
  self.assertEqual(exp.num_examples, 2)
70
77
 
71
78
  def test_evaluate(self):
72
- exp = test_helper.TestEvaluation()
79
+ exp = eval_test_helper.TestEvaluation()
73
80
  example = exp.evaluate(Example(id=3))
74
81
  self.assertIs(exp.state.get(3), example)
75
82
  self.assertTrue(example.newly_processed)
@@ -85,7 +92,7 @@ class EvaluationTest(unittest.TestCase):
85
92
  self.assertIsNotNone(example.start_time)
86
93
  self.assertIsNotNone(example.end_time)
87
94
 
88
- exp = test_helper.TestEvaluation(lm=test_helper.TestLLM(offset=1))
95
+ exp = eval_test_helper.TestEvaluation(lm=eval_test_helper.TestLLM(offset=1))
89
96
  example = exp.evaluate(3)
90
97
  self.assertTrue(example.newly_processed)
91
98
  self.assertEqual(example.input, pg.Dict(x=2, y=4, groundtruth=6))
@@ -109,7 +116,7 @@ class EvaluationTest(unittest.TestCase):
109
116
  pg.io.mkdirs(eval_dir, exist_ok=True)
110
117
  state_file = os.path.join(eval_dir, 'state.jsonl')
111
118
  with pg.io.open_sequence(state_file, 'w') as f:
112
- exp = test_helper.TestEvaluation()
119
+ exp = eval_test_helper.TestEvaluation()
113
120
  example = exp.evaluate(3)
114
121
  self.assertTrue(example.newly_processed)
115
122
  self.assertEqual(example.input, pg.Dict(x=2, y=4, groundtruth=6))
@@ -132,7 +139,7 @@ class EvaluationTest(unittest.TestCase):
132
139
  self.assertEqual(example.usage_summary.uncached.total.num_requests, 0)
133
140
 
134
141
  def test_html_view(self):
135
- exp = test_helper.TestEvaluation()
142
+ exp = eval_test_helper.TestEvaluation()
136
143
  exp.debug('debug message')
137
144
  exp.info('info message')
138
145
  exp.warning('warning message', x=1)
@@ -18,9 +18,9 @@ import tempfile
18
18
  import unittest
19
19
 
20
20
  from langfun.core import console as lf_console
21
+ from langfun.core.eval.v2 import eval_test_helper
21
22
  from langfun.core.eval.v2 import progress_tracking # pylint: disable=unused-import
22
23
  from langfun.core.eval.v2 import runners as runners_lib # pylint: disable=unused-import
23
- from langfun.core.eval.v2 import test_helper
24
24
  import pyglove as pg
25
25
 
26
26
 
@@ -35,7 +35,7 @@ class HtmlProgressTrackerTest(unittest.TestCase):
35
35
  display=display
36
36
  )
37
37
  root_dir = os.path.join(tempfile.gettempdir(), 'test_html_progress_tracker')
38
- experiment = test_helper.test_experiment()
38
+ experiment = eval_test_helper.test_experiment()
39
39
  _ = experiment.run(root_dir, 'new', plugins=[])
40
40
  self.assertIsInstance(result['view'], pg.Html)
41
41
  lf_console._notebook = None
@@ -45,7 +45,7 @@ class TqdmProgressTrackerTest(unittest.TestCase):
45
45
 
46
46
  def test_basic(self):
47
47
  root_dir = os.path.join(tempfile.gettempdir(), 'test_tqdm_progress_tracker')
48
- experiment = test_helper.test_experiment()
48
+ experiment = eval_test_helper.test_experiment()
49
49
  string_io = io.StringIO()
50
50
  with contextlib.redirect_stderr(string_io):
51
51
  _ = experiment.run(root_dir, 'new', plugins=[])
@@ -55,7 +55,7 @@ class TqdmProgressTrackerTest(unittest.TestCase):
55
55
  root_dir = os.path.join(
56
56
  tempfile.gettempdir(), 'test_tqdm_progress_tracker_with_example_ids'
57
57
  )
58
- experiment = test_helper.test_experiment()
58
+ experiment = eval_test_helper.test_experiment()
59
59
  string_io = io.StringIO()
60
60
  with contextlib.redirect_stderr(string_io):
61
61
  _ = experiment.run(root_dir, 'new', example_ids=[1], plugins=[])
@@ -15,9 +15,9 @@ import os
15
15
  import tempfile
16
16
  import unittest
17
17
 
18
+ from langfun.core.eval.v2 import eval_test_helper
18
19
  from langfun.core.eval.v2 import reporting
19
20
  from langfun.core.eval.v2 import runners as runners_lib # pylint: disable=unused-import
20
- from langfun.core.eval.v2 import test_helper
21
21
  import pyglove as pg
22
22
 
23
23
 
@@ -25,7 +25,7 @@ class ReportingTest(unittest.TestCase):
25
25
 
26
26
  def test_reporting(self):
27
27
  root_dir = os.path.join(tempfile.gettempdir(), 'test_reporting')
28
- experiment = test_helper.test_experiment()
28
+ experiment = eval_test_helper.test_experiment()
29
29
  reporter = reporting.HtmlReporter()
30
30
  run = experiment.run(root_dir, 'new', plugins=[reporter])
31
31
  pg.io.path_exists(run.output_path_for(experiment, 'summary.html'))
@@ -65,6 +65,7 @@ class RunnerBase(Runner):
65
65
  with pg.notify_on_change(False):
66
66
  self.plugins.append(progress_tracking.progress_tracker(self.tqdm))
67
67
 
68
+ self._io_pool_lock = threading.Lock()
68
69
  self._io_pool = concurrent.futures.ThreadPoolExecutor(max_workers=16)
69
70
  # TODO(daiyip): render background errors.
70
71
  self._background_last_error = None
@@ -76,7 +77,10 @@ class RunnerBase(Runner):
76
77
  func(*args, **kwargs)
77
78
  except Exception as e: # pylint: disable=broad-except
78
79
  self._background_last_error = e
79
- self._io_pool.submit(_background_run, *args, **kwargs)
80
+
81
+ with self._io_pool_lock:
82
+ if self._io_pool is not None:
83
+ self._io_pool.submit(_background_run, *args, **kwargs)
80
84
 
81
85
  def _all_plugins(self, experiment: Experiment) -> Iterator[Plugin]:
82
86
  """Returns all plugins for the experiment."""
@@ -296,7 +300,9 @@ class RunnerBase(Runner):
296
300
  self.background_run(cache.save)
297
301
 
298
302
  # Wait for the background tasks to finish.
299
- self._io_pool.shutdown(wait=True)
303
+ with self._io_pool_lock:
304
+ self._io_pool, io_pool = None, self._io_pool
305
+ io_pool.shutdown(wait=True)
300
306
 
301
307
  @abc.abstractmethod
302
308
  def _run(self, evaluations: list[Evaluation]) -> None:
@@ -18,10 +18,11 @@ import time
18
18
  from typing import Any
19
19
  import unittest
20
20
 
21
+ from langfun.core.eval.v2 import eval_test_helper
21
22
  from langfun.core.eval.v2 import example as example_lib
22
23
  from langfun.core.eval.v2 import experiment as experiment_lib
23
24
  from langfun.core.eval.v2 import runners as runners_lib # pylint: disable=unused-import
24
- from langfun.core.eval.v2 import test_helper
25
+
25
26
  import pyglove as pg
26
27
 
27
28
 
@@ -101,7 +102,7 @@ class RunnerTest(unittest.TestCase):
101
102
 
102
103
  def test_basic(self):
103
104
  plugin = TestPlugin()
104
- exp = test_helper.test_experiment()
105
+ exp = eval_test_helper.test_experiment()
105
106
  root_dir = os.path.join(tempfile.gettempdir(), 'test_sequential_runner')
106
107
  run = exp.run(root_dir, runner='sequential', plugins=[plugin])
107
108
 
@@ -143,7 +144,7 @@ class RunnerTest(unittest.TestCase):
143
144
 
144
145
  def test_raise_if_has_error(self):
145
146
  root_dir = os.path.join(tempfile.gettempdir(), 'test_raise_if_has_error')
146
- exp = test_helper.TestEvaluation()
147
+ exp = eval_test_helper.TestEvaluation()
147
148
  with self.assertRaisesRegex(ValueError, 'x should not be 5'):
148
149
  exp.run(
149
150
  root_dir, runner='sequential', plugins=[], raise_if_has_error=True
@@ -154,7 +155,7 @@ class RunnerTest(unittest.TestCase):
154
155
 
155
156
  def test_example_ids(self):
156
157
  root_dir = os.path.join(tempfile.gettempdir(), 'test_example_ids')
157
- exp = test_helper.test_experiment()
158
+ exp = eval_test_helper.test_experiment()
158
159
  plugin = TestPlugin()
159
160
  _ = exp.run(
160
161
  root_dir, runner='sequential', plugins=[plugin], example_ids=[5, 7, 9]
@@ -164,7 +165,7 @@ class RunnerTest(unittest.TestCase):
164
165
 
165
166
  def test_filter(self):
166
167
  plugin = TestPlugin()
167
- exp = test_helper.test_experiment()
168
+ exp = eval_test_helper.test_experiment()
168
169
  root_dir = os.path.join(tempfile.gettempdir(), 'test_filter')
169
170
 
170
171
  _ = exp.run(
@@ -193,7 +194,7 @@ class RunnerTest(unittest.TestCase):
193
194
  ) for i in range(num_examples)
194
195
  ]
195
196
 
196
- exp = test_helper.TestEvaluation(
197
+ exp = eval_test_helper.TestEvaluation(
197
198
  inputs=test_inputs(num_examples=pg.oneof([2, 4]))
198
199
  )
199
200
  # Global cache.
@@ -234,7 +235,7 @@ class ParallelRunnerTest(RunnerTest):
234
235
 
235
236
  def test_parallel_runner(self):
236
237
  plugin = TestPlugin()
237
- exp = test_helper.test_experiment()
238
+ exp = eval_test_helper.test_experiment()
238
239
  root_dir = os.path.join(tempfile.gettempdir(), 'test_parallel_runner')
239
240
  run = exp.run(root_dir, runner='parallel', plugins=[plugin])
240
241
 
@@ -274,7 +275,7 @@ class ParallelRunnerTest(RunnerTest):
274
275
 
275
276
  def test_concurrent_startup_delay(self):
276
277
  plugin = TestPlugin()
277
- exp = test_helper.test_experiment()
278
+ exp = eval_test_helper.test_experiment()
278
279
  root_dir = os.path.join(
279
280
  tempfile.gettempdir(), 'test_concurrent_startup_delay'
280
281
  )
@@ -290,7 +291,7 @@ class DebugRunnerTest(RunnerTest):
290
291
 
291
292
  def test_debug_runner(self):
292
293
  plugin = TestPlugin()
293
- exp = test_helper.test_experiment()
294
+ exp = eval_test_helper.test_experiment()
294
295
  root_dir = os.path.join(tempfile.gettempdir(), 'test_debug_runner')
295
296
  run = exp.run(root_dir, runner='debug', plugins=[plugin])
296
297
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: langfun
3
- Version: 0.1.2.dev202412200804
3
+ Version: 0.1.2.dev202412220804
4
4
  Summary: Langfun: Language as Functions.
5
5
  Home-page: https://github.com/google/langfun
6
6
  Author: Langfun Authors
@@ -58,10 +58,11 @@ langfun/core/eval/patching_test.py,sha256=8kCd54Egjju22FMgtJuxEsrXkW8ifs-UUBHtrC
58
58
  langfun/core/eval/scoring.py,sha256=B69IsIxiPs1xZcOBFIhZF70YmDue2Siik-CPL2bh33s,6254
59
59
  langfun/core/eval/scoring_test.py,sha256=O8olHbrUEg60gMxwOkWzKBJZpZoUlmVnBANX5Se2SXM,4546
60
60
  langfun/core/eval/v2/__init__.py,sha256=qoa6zKdFXOFyCX6vay6OdgPf1eUhYGoHYAxe35qECGk,1628
61
- langfun/core/eval/v2/checkpointing.py,sha256=ZYKHN91pALZjnoMdikc-JdJ-HiBRIqitOUWbFablFI8,8367
62
- langfun/core/eval/v2/checkpointing_test.py,sha256=dAERKQTW_PM1B0oUauB0YVQkMEI-cgJq0q-wAVlGYpU,4383
61
+ langfun/core/eval/v2/checkpointing.py,sha256=zr2hxOjm6Hdq71sYTsbQtL_CwQOWr-Ir9T5TPUnhqMI,8741
62
+ langfun/core/eval/v2/checkpointing_test.py,sha256=Imy96lwDkvmtj-1YFpP2DZukMOoYqpPov2J_MsQKxxI,4398
63
+ langfun/core/eval/v2/eval_test_helper.py,sha256=pDpZTBnWRR5xjJv3Uy3NWEzArqlL8FTMOgeR4C53F5M,2348
63
64
  langfun/core/eval/v2/evaluation.py,sha256=NFBGAWw2BtW7H0zcoZhfWtz59Psra84eshJm73uAFwg,21807
64
- langfun/core/eval/v2/evaluation_test.py,sha256=ld8oBOjsfN-LNLL2eViSTu17wAq90GcsfURXX6oVlFo,6014
65
+ langfun/core/eval/v2/evaluation_test.py,sha256=GmV1TiqX1V15st2qpcGWooM5hudomQVjW5kajovGDvE,6231
65
66
  langfun/core/eval/v2/example.py,sha256=fURrvdNmMsVMqoEErcsmLmC6Xq3ny16dYsnLH8HVlcY,9626
66
67
  langfun/core/eval/v2/example_test.py,sha256=WcJmU7IQQXvjFia63mokySC4CqxzVL9Wso1sC5F0YK8,3032
67
68
  langfun/core/eval/v2/experiment.py,sha256=xfk4aNZ3dH46y0lWSS_fC7JpfJCG77Z5qsakV4gHcOs,29762
@@ -73,12 +74,11 @@ langfun/core/eval/v2/metrics_test.py,sha256=p4FzLJsE8XAzAQuyP9hfEf9YeKWZ__PO_ue8
73
74
  langfun/core/eval/v2/progress.py,sha256=azZgssQgNdv3IgjKEaQBuGI5ucFDNbdi02P4z_nQ8GE,10292
74
75
  langfun/core/eval/v2/progress_test.py,sha256=YU7VHzmy5knPZwj9vpBN3rQQH2tukj9eKHkuBCI62h8,2540
75
76
  langfun/core/eval/v2/progress_tracking.py,sha256=l9fEkz4oP5McpZzf72Ua7PYm3lAWtRru7gRWNf8H0ms,6083
76
- langfun/core/eval/v2/progress_tracking_test.py,sha256=iO-DslCJWncU7-27XaMKxDeKrsGbwdk_tKfoRk3KboE,2271
77
+ langfun/core/eval/v2/progress_tracking_test.py,sha256=fouMVJkFJqHjbhQJngGLGCmA9x3n0dU4USI2dY163mg,2291
77
78
  langfun/core/eval/v2/reporting.py,sha256=vsh45GLVnA7GMU-8cvNYOt4Nb7mEwvcguhO-BSXSzTE,5358
78
- langfun/core/eval/v2/reporting_test.py,sha256=JxffbUPWInUyLjo-AQVFrllga884Mdfm05R86FtxSss,1482
79
- langfun/core/eval/v2/runners.py,sha256=iTARDpPHPJKZL5Hu3k-O2LhK1ICOo1Ywbm5e7O2rNBA,15680
80
- langfun/core/eval/v2/runners_test.py,sha256=UeiUNygux_U6iGVG18rhp68ZE4hoWeoT6XsXvSjxNQg,11620
81
- langfun/core/eval/v2/test_helper.py,sha256=pDpZTBnWRR5xjJv3Uy3NWEzArqlL8FTMOgeR4C53F5M,2348
79
+ langfun/core/eval/v2/reporting_test.py,sha256=4nobW6pcaatiZh8u4xciexciaiZNDlDoJci157Wp_RI,1492
80
+ langfun/core/eval/v2/runners.py,sha256=t6_yHAJ4HWufK4wvh_OntKcok2KquA5ARIHIk1vvEwc,15870
81
+ langfun/core/eval/v2/runners_test.py,sha256=A37fKK2MvAVTiShsg_laluJzJ9AuAQn52k7HPbfD0Ks,11666
82
82
  langfun/core/llms/__init__.py,sha256=lWXKjGHv66ShG7AE_Bc4QM7SDTxJdfoQMn3PF0lr0sU,6461
83
83
  langfun/core/llms/anthropic.py,sha256=afKZmdiLcosS_UEBlB8WKyf1K-zeXgwtPAx6ofg2Gww,13989
84
84
  langfun/core/llms/anthropic_test.py,sha256=-2U4kc_pgBM7wqxu8RuxzyHPGww1EAWqKUvN4PW8Btw,8058
@@ -148,8 +148,8 @@ langfun/core/templates/demonstration.py,sha256=vCrgYubdZM5Umqcgp8NUVGXgr4P_c-fik
148
148
  langfun/core/templates/demonstration_test.py,sha256=SafcDQ0WgI7pw05EmPI2S4v1t3ABKzup8jReCljHeK4,2162
149
149
  langfun/core/templates/selfplay.py,sha256=yhgrJbiYwq47TgzThmHrDQTF4nDrTI09CWGhuQPNv-s,2273
150
150
  langfun/core/templates/selfplay_test.py,sha256=Ot__1P1M8oJfoTp-M9-PQ6HUXqZKyMwvZ5f7yQ3yfyM,2326
151
- langfun-0.1.2.dev202412200804.dist-info/LICENSE,sha256=WNHhf_5RCaeuKWyq_K39vmp9F28LxKsB4SpomwSZ2L0,11357
152
- langfun-0.1.2.dev202412200804.dist-info/METADATA,sha256=7IgyNjTrvkrYSyuwvSrBzrY8tzacbgL1qLaoonRRgxc,8281
153
- langfun-0.1.2.dev202412200804.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
154
- langfun-0.1.2.dev202412200804.dist-info/top_level.txt,sha256=RhlEkHxs1qtzmmtWSwYoLVJAc1YrbPtxQ52uh8Z9VvY,8
155
- langfun-0.1.2.dev202412200804.dist-info/RECORD,,
151
+ langfun-0.1.2.dev202412220804.dist-info/LICENSE,sha256=WNHhf_5RCaeuKWyq_K39vmp9F28LxKsB4SpomwSZ2L0,11357
152
+ langfun-0.1.2.dev202412220804.dist-info/METADATA,sha256=SKSVb1h469QIDbiOKMxz5HwTjTIOWoomol55YNkkFqU,8281
153
+ langfun-0.1.2.dev202412220804.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
154
+ langfun-0.1.2.dev202412220804.dist-info/top_level.txt,sha256=RhlEkHxs1qtzmmtWSwYoLVJAc1YrbPtxQ52uh8Z9VvY,8
155
+ langfun-0.1.2.dev202412220804.dist-info/RECORD,,