langfun 0.1.2.dev202411090804__py3-none-any.whl → 0.1.2.dev202411140804__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 (36) hide show
  1. langfun/core/console.py +10 -2
  2. langfun/core/console_test.py +17 -0
  3. langfun/core/eval/__init__.py +2 -0
  4. langfun/core/eval/v2/__init__.py +38 -0
  5. langfun/core/eval/v2/checkpointing.py +135 -0
  6. langfun/core/eval/v2/checkpointing_test.py +89 -0
  7. langfun/core/eval/v2/evaluation.py +627 -0
  8. langfun/core/eval/v2/evaluation_test.py +156 -0
  9. langfun/core/eval/v2/example.py +295 -0
  10. langfun/core/eval/v2/example_test.py +114 -0
  11. langfun/core/eval/v2/experiment.py +949 -0
  12. langfun/core/eval/v2/experiment_test.py +304 -0
  13. langfun/core/eval/v2/metric_values.py +156 -0
  14. langfun/core/eval/v2/metric_values_test.py +80 -0
  15. langfun/core/eval/v2/metrics.py +357 -0
  16. langfun/core/eval/v2/metrics_test.py +203 -0
  17. langfun/core/eval/v2/progress.py +348 -0
  18. langfun/core/eval/v2/progress_test.py +82 -0
  19. langfun/core/eval/v2/progress_tracking.py +209 -0
  20. langfun/core/eval/v2/progress_tracking_test.py +56 -0
  21. langfun/core/eval/v2/reporting.py +144 -0
  22. langfun/core/eval/v2/reporting_test.py +41 -0
  23. langfun/core/eval/v2/runners.py +417 -0
  24. langfun/core/eval/v2/runners_test.py +311 -0
  25. langfun/core/eval/v2/test_helper.py +80 -0
  26. langfun/core/language_model.py +122 -11
  27. langfun/core/language_model_test.py +97 -4
  28. langfun/core/llms/__init__.py +3 -0
  29. langfun/core/llms/compositional.py +101 -0
  30. langfun/core/llms/compositional_test.py +73 -0
  31. langfun/core/llms/vertexai.py +4 -4
  32. {langfun-0.1.2.dev202411090804.dist-info → langfun-0.1.2.dev202411140804.dist-info}/METADATA +1 -1
  33. {langfun-0.1.2.dev202411090804.dist-info → langfun-0.1.2.dev202411140804.dist-info}/RECORD +36 -12
  34. {langfun-0.1.2.dev202411090804.dist-info → langfun-0.1.2.dev202411140804.dist-info}/WHEEL +1 -1
  35. {langfun-0.1.2.dev202411090804.dist-info → langfun-0.1.2.dev202411140804.dist-info}/LICENSE +0 -0
  36. {langfun-0.1.2.dev202411090804.dist-info → langfun-0.1.2.dev202411140804.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,101 @@
1
+ # Copyright 2024 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
+ """Compositions of different LLM models."""
15
+ import random
16
+ from typing import Annotated
17
+
18
+ import langfun.core as lf
19
+ import pyglove as pg
20
+
21
+
22
+ @pg.use_init_args(['candidates', 'seed'])
23
+ class RandomChoice(lf.LanguageModel):
24
+ """Random choice of a list of LLM models."""
25
+
26
+ candidates: Annotated[
27
+ list[lf.LanguageModel],
28
+ (
29
+ 'A list of LLMs as candidates to choose from.'
30
+ )
31
+ ]
32
+
33
+ seed: Annotated[
34
+ int,
35
+ (
36
+ 'The random seed to use for the random choice.'
37
+ )
38
+ ] = 0
39
+
40
+ def _on_bound(self):
41
+ super()._on_bound()
42
+ self._rand = random.Random(self.seed)
43
+ # Applying sampling options to all candidates.
44
+ parent_non_default = self.sampling_options.sym_nondefault()
45
+ if parent_non_default:
46
+ for c in self.candidates:
47
+ c.sampling_options.rebind(
48
+ parent_non_default, notify_parents=False, raise_on_no_change=False
49
+ )
50
+
51
+ @property
52
+ def model_id(self) -> str:
53
+ model_ids = ', '.join(
54
+ sorted(c.model_id for c in self.candidates)
55
+ )
56
+ return f'RandomChoice({model_ids})'
57
+
58
+ @property
59
+ def resource_id(self) -> str:
60
+ resource_ids = ', '.join(
61
+ sorted(c.resource_id for c in self.candidates)
62
+ )
63
+ return f'RandomChoice({resource_ids})'
64
+
65
+ def _select_lm(self) -> lf.LanguageModel:
66
+ """Selects a random LLM from the candidates."""
67
+ return self._rand.choice(self.candidates)
68
+
69
+ def sample(
70
+ self,
71
+ prompts: list[str | lf.Message],
72
+ *,
73
+ cache_seed: int = 0,
74
+ **kwargs,
75
+ ) -> list[lf.LMSamplingResult]:
76
+ return self._select_lm().sample(
77
+ prompts, cache_seed=cache_seed, **kwargs
78
+ )
79
+
80
+ def __call__(
81
+ self, prompt: lf.Message, *, cache_seed: int = 0, **kwargs
82
+ ) -> lf.Message:
83
+ return self._select_lm()(prompt, cache_seed=cache_seed, **kwargs)
84
+
85
+ def score(
86
+ self,
87
+ prompt: str | lf.Message | list[lf.Message],
88
+ completions: list[str | lf.Message],
89
+ **kwargs,
90
+ ) -> list[lf.LMScoringResult]:
91
+ return self._select_lm().score(prompt, completions, **kwargs)
92
+
93
+ def tokenize(
94
+ self,
95
+ prompt: str | lf.Message,
96
+ **kwargs,
97
+ ) -> list[tuple[str | bytes, int]]:
98
+ return self._select_lm().tokenize(prompt, **kwargs)
99
+
100
+ def _sample(self, *arg, **kwargs):
101
+ assert False, 'Should never trigger.'
@@ -0,0 +1,73 @@
1
+ # Copyright 2024 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
+ """Tests for compositional models."""
15
+ import unittest
16
+
17
+ import langfun.core as lf
18
+ from langfun.core.llms import compositional
19
+ from langfun.core.llms import fake
20
+
21
+
22
+ class RandomChoiceTest(unittest.TestCase):
23
+
24
+ def test_basic(self):
25
+ lm = compositional.RandomChoice([
26
+ fake.StaticResponse('hi'),
27
+ fake.StaticSequence(['hello', 'world'])
28
+ ])
29
+ self.assertEqual(
30
+ lm.model_id,
31
+ 'RandomChoice(StaticResponse, StaticSequence)'
32
+ )
33
+ self.assertEqual(
34
+ lm.resource_id,
35
+ 'RandomChoice(StaticResponse, StaticSequence)'
36
+ )
37
+ self.assertEqual(
38
+ [lm('a'), lm('b'), lm('c')],
39
+ ['hello', 'world', 'hi']
40
+ )
41
+ lm = lm.clone()
42
+ self.assertEqual(
43
+ [
44
+ x.samples[0].response for x in [
45
+ lm.sample(['a'])[0],
46
+ lm.sample(['b'])[0],
47
+ lm.sample(['c'])[0],
48
+ ]
49
+ ],
50
+ ['hello', 'world', 'hi']
51
+ )
52
+ self.assertEqual(
53
+ lm.score('hello', ['world']),
54
+ [lf.LMScoringResult(0.0)]
55
+ )
56
+ self.assertEqual(
57
+ lm.tokenize('hello'),
58
+ [('hello', 0)]
59
+ )
60
+
61
+ def test_sampling_options(self):
62
+ lm = compositional.RandomChoice([
63
+ fake.StaticResponse('hi'),
64
+ fake.StaticSequence(['hello', 'world'])
65
+ ], temperature=0.5)
66
+ self.assertEqual(
67
+ lm.candidates[0].sampling_options.temperature,
68
+ 0.5
69
+ )
70
+
71
+
72
+ if __name__ == '__main__':
73
+ unittest.main()
@@ -51,13 +51,13 @@ AVGERAGE_CHARS_PER_TOEKN = 4
51
51
  SUPPORTED_MODELS_AND_SETTINGS = {
52
52
  'gemini-1.5-pro-001': pg.Dict(
53
53
  api='gemini',
54
- rpm=500,
54
+ rpm=100,
55
55
  cost_per_1k_input_chars=0.0003125,
56
56
  cost_per_1k_output_chars=0.00125,
57
57
  ),
58
58
  'gemini-1.5-pro-002': pg.Dict(
59
59
  api='gemini',
60
- rpm=500,
60
+ rpm=100,
61
61
  cost_per_1k_input_chars=0.0003125,
62
62
  cost_per_1k_output_chars=0.00125,
63
63
  ),
@@ -75,7 +75,7 @@ SUPPORTED_MODELS_AND_SETTINGS = {
75
75
  ),
76
76
  'gemini-1.5-pro': pg.Dict(
77
77
  api='gemini',
78
- rpm=500,
78
+ rpm=100,
79
79
  cost_per_1k_input_chars=0.0003125,
80
80
  cost_per_1k_output_chars=0.00125,
81
81
  ),
@@ -87,7 +87,7 @@ SUPPORTED_MODELS_AND_SETTINGS = {
87
87
  ),
88
88
  'gemini-1.5-pro-latest': pg.Dict(
89
89
  api='gemini',
90
- rpm=500,
90
+ rpm=100,
91
91
  cost_per_1k_input_chars=0.0003125,
92
92
  cost_per_1k_output_chars=0.00125,
93
93
  ),
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: langfun
3
- Version: 0.1.2.dev202411090804
3
+ Version: 0.1.2.dev202411140804
4
4
  Summary: Langfun: Language as Functions.
5
5
  Home-page: https://github.com/google/langfun
6
6
  Author: Langfun Authors
@@ -4,12 +4,12 @@ langfun/core/component.py,sha256=HVrEoTL1Y01iqOHC3FYdbAOnffqfHHtGJXoK1vkdEwo,115
4
4
  langfun/core/component_test.py,sha256=sG-T2wpvBfHqWGZE7sc4NayJj2aj5QFBzSwFiwrGEIc,10376
5
5
  langfun/core/concurrent.py,sha256=QMNYhB_PyjvVJtabMokpzotZRYvyE9iYu2QsgwDk7M4,29552
6
6
  langfun/core/concurrent_test.py,sha256=ILlAjfhV84yJfY1QLe3N9aYry1sCjY-ywfIlXGafenI,17336
7
- langfun/core/console.py,sha256=bk5rNPNm9rMGW5YT2HixxU04p2umnoabn5SDz6Dqe88,2317
8
- langfun/core/console_test.py,sha256=5SYJdxpJGLgdSSQqqMPoA1X6jpsLD8rgcyk-EgI65oE,1077
7
+ langfun/core/console.py,sha256=Fra2_MSWZbFh6rY8HZoYgpGLsrNvhaGuL03znOwQbhM,2529
8
+ langfun/core/console_test.py,sha256=pBOcuNMJdVELywvroptfcRtJMsegMm3wSlHAL2TdxVk,1679
9
9
  langfun/core/langfunc.py,sha256=G50YgoVZ0y1GFw2ev41MlOqr6qa8YakbvNC0h_E0PiA,11140
10
10
  langfun/core/langfunc_test.py,sha256=fKIAqcSNI_7M6nwoZW77HEam8Oa6vcWhsCNgVJanzb4,8822
11
- langfun/core/language_model.py,sha256=jOvWyiKvcv2yJGBNPWmxV8wyzuWnCcrc1FhldYBtPkE,30219
12
- langfun/core/language_model_test.py,sha256=cgoSdKwicnvHYo-tQeTdONXAVM-bvWLzgTlqxvace-A,28424
11
+ langfun/core/language_model.py,sha256=UtLvclKx55_SAKZ-ajaquudLxKorTARAeZFme5IaPi8,33499
12
+ langfun/core/language_model_test.py,sha256=td81wm4zFPeMb16nmIuIZ6eHtpYhH0k6IeiYLfGgR0o,31525
13
13
  langfun/core/logging.py,sha256=uslllP0RTGN223oro1m4nZZ0bFppcL07OwbFKm2iG6k,7519
14
14
  langfun/core/logging_test.py,sha256=b5bPTSUoYeICATaO6I8dOVumodwRbxSp1Oz96Sf3KcE,6104
15
15
  langfun/core/memory.py,sha256=f-asN1F7Vehgdn_fK84v73GrEUOxRtaW934keutTKjk,2416
@@ -43,7 +43,7 @@ langfun/core/coding/python/parsing.py,sha256=LMg8REP4VDY0YQjtPAGNAW4rKlMNdSXF8m1
43
43
  langfun/core/coding/python/parsing_test.py,sha256=9vAWF484kWIm6JZq8NFiMgKUDhXV-deRl1QMmNERfAA,7386
44
44
  langfun/core/coding/python/permissions.py,sha256=1QWGHvzL8MM0Ok_auQ9tURqZHtdOfJaDpBzZ29GUE-c,2544
45
45
  langfun/core/coding/python/permissions_test.py,sha256=w5EDb8QxpxgJyZkojyzVWQvDfg366zn99-g__6TbPQ0,2699
46
- langfun/core/eval/__init__.py,sha256=Ogdr9OtTywhhLPHi3AZzOD2mXX2oyaHWflrSTMm96uA,1899
46
+ langfun/core/eval/__init__.py,sha256=OEXr1ZRuvLuhJJfuQ1ZWQ-SvYzjyrtiAAEogYaB7E6o,1933
47
47
  langfun/core/eval/base.py,sha256=ajHUS_BdzBIDKEwAmMzne0lJi8HcDhPmyw_plO0p7G0,75814
48
48
  langfun/core/eval/base_test.py,sha256=-LsIV9DXlDal0EnOlaWpibJvfef0NbxtZAm0OH_abAE,27189
49
49
  langfun/core/eval/matching.py,sha256=UnjdM_ebPqXKJamY4lvL3AYxrMIz3LqkjRTnHJ5xsYc,9349
@@ -52,9 +52,33 @@ langfun/core/eval/patching.py,sha256=R0s2eAd1m97exQt06dmUL0V_MBG0W2Hxg7fhNB7cXW0
52
52
  langfun/core/eval/patching_test.py,sha256=8kCd54Egjju22FMgtJuxEsrXkW8ifs-UUBHtrCG1L6w,4775
53
53
  langfun/core/eval/scoring.py,sha256=B69IsIxiPs1xZcOBFIhZF70YmDue2Siik-CPL2bh33s,6254
54
54
  langfun/core/eval/scoring_test.py,sha256=O8olHbrUEg60gMxwOkWzKBJZpZoUlmVnBANX5Se2SXM,4546
55
- langfun/core/llms/__init__.py,sha256=ATayGMO5rQzkPBAf7zl3vfgRQ8fth33TFVXv_tvraCQ,6190
55
+ langfun/core/eval/v2/__init__.py,sha256=XMpkKjd_vL_qzCQYPAwR1NNO0T_Zo5j4kP3eYL-EJLc,1428
56
+ langfun/core/eval/v2/checkpointing.py,sha256=AhChb5U0fTd0NmDHaIaVE9qJ8zFEe7Lhq7KjIt1D2pQ,3766
57
+ langfun/core/eval/v2/checkpointing_test.py,sha256=xU5asikwUn-rCmNd93ssvT6gDiKvvWogYKQa0r_TqOM,3046
58
+ langfun/core/eval/v2/evaluation.py,sha256=hausa1NnUGi56KNrucd61qv9km1eDvcj2GBqiJzb0FA,19371
59
+ langfun/core/eval/v2/evaluation_test.py,sha256=hh6L2HhQPQ6NBv1pXKcNkYraNcV9MLuJ--69t9jbmaI,5846
60
+ langfun/core/eval/v2/example.py,sha256=fURrvdNmMsVMqoEErcsmLmC6Xq3ny16dYsnLH8HVlcY,9626
61
+ langfun/core/eval/v2/example_test.py,sha256=WcJmU7IQQXvjFia63mokySC4CqxzVL9Wso1sC5F0YK8,3032
62
+ langfun/core/eval/v2/experiment.py,sha256=xkROLFYj2Nf6G9wunfVx6nEhdMX_560hRSsB8qT3S_Q,28787
63
+ langfun/core/eval/v2/experiment_test.py,sha256=R0ujPSluvDu5gwxGpiSWJ3eTiVpfleJDwwT1pXN8Nvg,8933
64
+ langfun/core/eval/v2/metric_values.py,sha256=_B905bC-jxrYPLSEcP2M8MaHZOVMz_bVrUw8YC4arCE,4660
65
+ langfun/core/eval/v2/metric_values_test.py,sha256=ab2oF_HsIwrSy459108ggyjgefHSPn8UVILR4dRwx14,2634
66
+ langfun/core/eval/v2/metrics.py,sha256=bl8i6u-ZHRBz4hAc3LzsZ2Dc7ZRQcuTYeUhhH-GxfF0,10628
67
+ langfun/core/eval/v2/metrics_test.py,sha256=p4FzLJsE8XAzAQuyP9hfEf9YeKWZ__PO_ue8a9P0-cc,6082
68
+ langfun/core/eval/v2/progress.py,sha256=azZgssQgNdv3IgjKEaQBuGI5ucFDNbdi02P4z_nQ8GE,10292
69
+ langfun/core/eval/v2/progress_test.py,sha256=YU7VHzmy5knPZwj9vpBN3rQQH2tukj9eKHkuBCI62h8,2540
70
+ langfun/core/eval/v2/progress_tracking.py,sha256=1imwSbllxHWG3zYrzo2NvytBZsVtjqum6bmXGGsvT1E,5987
71
+ langfun/core/eval/v2/progress_tracking_test.py,sha256=eY2HvZeEXDA5Zyfi2m5NDWO_9kSfQsaAOEcIhkSbWCY,1874
72
+ langfun/core/eval/v2/reporting.py,sha256=TGkli1IDwqfqsCJ_WslOMGk_24JDg7oRRTGXlAJlWpc,4361
73
+ langfun/core/eval/v2/reporting_test.py,sha256=JxffbUPWInUyLjo-AQVFrllga884Mdfm05R86FtxSss,1482
74
+ langfun/core/eval/v2/runners.py,sha256=2OHAVTbqq9hZ3qZpUEvQ--9X-Cr_z8Ghc3MRXCfclpk,13442
75
+ langfun/core/eval/v2/runners_test.py,sha256=s3GgWA-H9x0JyPhPZq2s9-5GXGHo5dSbDD-4faX0h_E,11164
76
+ langfun/core/eval/v2/test_helper.py,sha256=pDpZTBnWRR5xjJv3Uy3NWEzArqlL8FTMOgeR4C53F5M,2348
77
+ langfun/core/llms/__init__.py,sha256=i0m-fVpwuIN_Jno1M-5O9ikzbVbvXWJKFQZO22MFPq8,6272
56
78
  langfun/core/llms/anthropic.py,sha256=XPQxjfe9O4b-CygCgqvQU0MPSfe1rU7uErNbo8zth7Q,13606
57
79
  langfun/core/llms/anthropic_test.py,sha256=-2U4kc_pgBM7wqxu8RuxzyHPGww1EAWqKUvN4PW8Btw,8058
80
+ langfun/core/llms/compositional.py,sha256=csW_FLlgL-tpeyCOTVvfUQkMa_zCN5Y2I-YbSNuK27U,2872
81
+ langfun/core/llms/compositional_test.py,sha256=4eTnOer-DncRKGaIJW2ZQQMLnt5r2R0UIx_DYOvGAQo,2027
58
82
  langfun/core/llms/fake.py,sha256=gCHBYBLvBCsC78HI1hpoqXCS-p1FMTgY1P1qh_sGBPk,3070
59
83
  langfun/core/llms/fake_test.py,sha256=2h13qkwEz_JR0mtUDPxdAhQo7MueXaFSwsD2DIRDW9g,7653
60
84
  langfun/core/llms/google_genai.py,sha256=btUIfWteBoj8Jl0j8d3e8hyI6p3Biq4rldlQYctVQfg,10936
@@ -67,7 +91,7 @@ langfun/core/llms/openai.py,sha256=qrAiJxE0tS7ZqjaVzRgVJKtMtoo1Z5TYpvi5ikTwPpw,2
67
91
  langfun/core/llms/openai_test.py,sha256=_8cd3VRNEUfE0-Ko1RiM6MlC5hjalRj7nYTJNhG1p3E,18907
68
92
  langfun/core/llms/rest.py,sha256=sWbYUV8S3SuOg9giq7xwD-xDRfaF7NP_ig7bI52-Rj4,3442
69
93
  langfun/core/llms/rest_test.py,sha256=NZ3Nf0XQVpT9kLP5cBVo_yBHLI7vWTYhWQxYEJVMGs4,3472
70
- langfun/core/llms/vertexai.py,sha256=eUFU0JjgpTVCAvQVEWiGqZrlE3Dye-EkzZCF1P8nwc4,18866
94
+ langfun/core/llms/vertexai.py,sha256=-KB880Ovab6CQqI-Y5Y6V7RlEA0tAIazmnnG74Ebp4A,18866
71
95
  langfun/core/llms/vertexai_test.py,sha256=7uBVOF5VF86xQ9HFAbSTh4J-0NjYLnuotBS1YRm-vgw,10529
72
96
  langfun/core/llms/cache/__init__.py,sha256=QAo3InUMDM_YpteNnVCSejI4zOsnjSMWKJKzkb3VY64,993
73
97
  langfun/core/llms/cache/base.py,sha256=rt3zwmyw0y9jsSGW-ZbV1vAfLxQ7_3AVk0l2EySlse4,3918
@@ -119,8 +143,8 @@ langfun/core/templates/demonstration.py,sha256=vCrgYubdZM5Umqcgp8NUVGXgr4P_c-fik
119
143
  langfun/core/templates/demonstration_test.py,sha256=SafcDQ0WgI7pw05EmPI2S4v1t3ABKzup8jReCljHeK4,2162
120
144
  langfun/core/templates/selfplay.py,sha256=yhgrJbiYwq47TgzThmHrDQTF4nDrTI09CWGhuQPNv-s,2273
121
145
  langfun/core/templates/selfplay_test.py,sha256=Ot__1P1M8oJfoTp-M9-PQ6HUXqZKyMwvZ5f7yQ3yfyM,2326
122
- langfun-0.1.2.dev202411090804.dist-info/LICENSE,sha256=WNHhf_5RCaeuKWyq_K39vmp9F28LxKsB4SpomwSZ2L0,11357
123
- langfun-0.1.2.dev202411090804.dist-info/METADATA,sha256=Ez5vUJUc5-XDAdDMyR6Wcgj4fiDL1RwJpu1NI3i3lwE,8890
124
- langfun-0.1.2.dev202411090804.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91
125
- langfun-0.1.2.dev202411090804.dist-info/top_level.txt,sha256=RhlEkHxs1qtzmmtWSwYoLVJAc1YrbPtxQ52uh8Z9VvY,8
126
- langfun-0.1.2.dev202411090804.dist-info/RECORD,,
146
+ langfun-0.1.2.dev202411140804.dist-info/LICENSE,sha256=WNHhf_5RCaeuKWyq_K39vmp9F28LxKsB4SpomwSZ2L0,11357
147
+ langfun-0.1.2.dev202411140804.dist-info/METADATA,sha256=LNyNk_qsiVz-CAbbtkN4jzdSwDWGhlR5RkefV6lclFA,8890
148
+ langfun-0.1.2.dev202411140804.dist-info/WHEEL,sha256=R06PA3UVYHThwHvxuRWMqaGcr-PuniXahwjmQRFMEkY,91
149
+ langfun-0.1.2.dev202411140804.dist-info/top_level.txt,sha256=RhlEkHxs1qtzmmtWSwYoLVJAc1YrbPtxQ52uh8Z9VvY,8
150
+ langfun-0.1.2.dev202411140804.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.3.0)
2
+ Generator: setuptools (75.5.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5