codex-lb 0.3.0__py3-none-any.whl → 0.4.0__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.
@@ -0,0 +1,172 @@
1
+ Metadata-Version: 2.4
2
+ Name: codex-lb
3
+ Version: 0.4.0
4
+ Summary: Codex load balancer and proxy for ChatGPT accounts with usage dashboard
5
+ Author-email: Soju06 <qlskssk@gmail.com>
6
+ Maintainer-email: Soju06 <qlskssk@gmail.com>
7
+ License: MIT License
8
+
9
+ Copyright (c) 2025 Soju06
10
+
11
+ Permission is hereby granted, free of charge, to any person obtaining a copy
12
+ of this software and associated documentation files (the "Software"), to deal
13
+ in the Software without restriction, including without limitation the rights
14
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
15
+ copies of the Software, and to permit persons to whom the Software is
16
+ furnished to do so, subject to the following conditions:
17
+
18
+ The above copyright notice and this permission notice shall be included in all
19
+ copies or substantial portions of the Software.
20
+
21
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
22
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
24
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
25
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
26
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
27
+ SOFTWARE.
28
+ License-File: LICENSE
29
+ Keywords: chatgpt,codex,dashboard,fastapi,load-balancer,proxy,rate-limit,usage
30
+ Classifier: Development Status :: 3 - Alpha
31
+ Classifier: Environment :: Console
32
+ Classifier: Framework :: FastAPI
33
+ Classifier: License :: OSI Approved :: MIT License
34
+ Classifier: Programming Language :: Python :: 3
35
+ Classifier: Programming Language :: Python :: 3 :: Only
36
+ Classifier: Programming Language :: Python :: 3.13
37
+ Classifier: Topic :: Internet :: Proxy Servers
38
+ Classifier: Topic :: Software Development :: Libraries
39
+ Classifier: Topic :: System :: Networking
40
+ Requires-Python: >=3.13
41
+ Requires-Dist: aiohttp-retry>=2.9.1
42
+ Requires-Dist: aiohttp>=3.13.3
43
+ Requires-Dist: aiosqlite>=0.22.1
44
+ Requires-Dist: cryptography>=46.0.3
45
+ Requires-Dist: fastapi[standard]>=0.128.0
46
+ Requires-Dist: greenlet>=3.3.0
47
+ Requires-Dist: pydantic-settings>=2.12.0
48
+ Requires-Dist: pydantic>=2.12.5
49
+ Requires-Dist: python-dotenv>=1.2.1
50
+ Requires-Dist: python-multipart>=0.0.21
51
+ Requires-Dist: sqlalchemy>=2.0.45
52
+ Description-Content-Type: text/markdown
53
+
54
+ <!--
55
+ About
56
+ Codex/ChatGPT account load balancer & proxy with usage tracking, dashboard, and OpenCode-compatible endpoints
57
+
58
+ Topics
59
+ python oauth sqlalchemy dashboard load-balancer openai rate-limit api-proxy codex fastapi usage-tracking chatgpt opencode
60
+
61
+ Resources
62
+ -->
63
+
64
+ # codex-lb
65
+
66
+ Load balancer for ChatGPT accounts. Pool multiple accounts, track usage, view everything in a dashboard.
67
+
68
+ ## Screenshots
69
+
70
+ ### Main Dashboard View
71
+
72
+ ![main dashboard view](docs/screenshots/dashboard.jpg)
73
+
74
+ ### Accounts View
75
+
76
+ ![Accounts list and details](docs/screenshots/accounts.jpg)
77
+
78
+ ## Quick Start
79
+
80
+ ### Docker
81
+
82
+ ```bash
83
+ docker run -d --name codex-lb \
84
+ -p 2455:2455 -p 1455:1455 \
85
+ -v ~/.codex-lb:/var/lib/codex-lb \
86
+ ghcr.io/soju06/codex-lb:latest
87
+ ```
88
+
89
+ ### uvx
90
+
91
+ ```bash
92
+ uvx codex-lb
93
+ ```
94
+
95
+ Open [localhost:2455](http://localhost:2455) → Add account → Done.
96
+
97
+ ## Codex CLI & Extension Setup
98
+
99
+ Add to `~/.codex/config.toml`:
100
+
101
+ ```toml
102
+ model = "gpt-5.2-codex"
103
+ model_reasoning_effort = "xhigh"
104
+ model_provider = "codex-lb"
105
+
106
+ [model_providers.codex-lb]
107
+ name = "OpenAI" # MUST be "OpenAI" - enables /compact endpoint
108
+ base_url = "http://127.0.0.1:2455/backend-api/codex"
109
+ wire_api = "responses"
110
+ chatgpt_base_url = "http://127.0.0.1:2455"
111
+ requires_openai_auth = true # Required: enables model selection in Codex IDE extension
112
+ ```
113
+
114
+ ## OpenCode Setup
115
+
116
+ Run:
117
+
118
+ ```bash
119
+ opencode auth login
120
+ ```
121
+
122
+ Then select `OpenAI` -> `Manually enter API Key` and enter any value.
123
+
124
+ Add the following to `~/.config/opencode/opencode.json`:
125
+
126
+ ```jsonc
127
+ {
128
+ ...
129
+ "provider": {
130
+ "openai": {
131
+ "options": {
132
+ "baseURL": "http://127.0.0.1:2455/v1"
133
+ }
134
+ },
135
+ ...
136
+ }
137
+ }
138
+ ```
139
+
140
+ ## Data
141
+
142
+ All data stored in `~/.codex-lb/`:
143
+
144
+ - `store.db` – accounts, usage logs
145
+ - `encryption.key` – encrypts tokens (auto-generated)
146
+
147
+ Backup this directory to preserve your accounts.
148
+
149
+ ## Contributors ✨
150
+
151
+ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):
152
+ <!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
153
+ <!-- prettier-ignore-start -->
154
+ <!-- markdownlint-disable -->
155
+ <table>
156
+ <tbody>
157
+ <tr>
158
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/Soju06"><img src="https://avatars.githubusercontent.com/u/34199905?v=4?s=100" width="100px;" alt="Soju06"/><br /><sub><b>Soju06</b></sub></a><br /><a href="https://github.com/Soju06/codex-lb/commits?author=Soju06" title="Code">💻</a> <a href="https://github.com/Soju06/codex-lb/commits?author=Soju06" title="Tests">⚠️</a> <a href="#maintenance-Soju06" title="Maintenance">🚧</a> <a href="#infra-Soju06" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
159
+ <td align="center" valign="top" width="14.28%"><a href="http://jonas.kamsker.at/"><img src="https://avatars.githubusercontent.com/u/11245306?v=4?s=100" width="100px;" alt="Jonas Kamsker"/><br /><sub><b>Jonas Kamsker</b></sub></a><br /><a href="https://github.com/Soju06/codex-lb/commits?author=JKamsker" title="Code">💻</a> <a href="https://github.com/Soju06/codex-lb/issues?q=author%3AJKamsker" title="Bug reports">🐛</a> <a href="#maintenance-JKamsker" title="Maintenance">🚧</a></td>
160
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/Quack6765"><img src="https://avatars.githubusercontent.com/u/5446230?v=4?s=100" width="100px;" alt="Quack"/><br /><sub><b>Quack</b></sub></a><br /><a href="https://github.com/Soju06/codex-lb/commits?author=Quack6765" title="Code">💻</a> <a href="https://github.com/Soju06/codex-lb/issues?q=author%3AQuack6765" title="Bug reports">🐛</a> <a href="#maintenance-Quack6765" title="Maintenance">🚧</a> <a href="#design-Quack6765" title="Design">🎨</a></td>
161
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/hhsw2015"><img src="https://avatars.githubusercontent.com/u/103614420?v=4?s=100" width="100px;" alt="Jill Kok, San Mou"/><br /><sub><b>Jill Kok, San Mou</b></sub></a><br /><a href="https://github.com/Soju06/codex-lb/commits?author=hhsw2015" title="Code">💻</a> <a href="https://github.com/Soju06/codex-lb/commits?author=hhsw2015" title="Tests">⚠️</a></td>
162
+ <td align="center" valign="top" width="14.28%"><a href="https://github.com/pcy06"><img src="https://avatars.githubusercontent.com/u/44970486?v=4?s=100" width="100px;" alt="PARK CHANYOUNG"/><br /><sub><b>PARK CHANYOUNG</b></sub></a><br /><a href="https://github.com/Soju06/codex-lb/commits?author=pcy06" title="Documentation">📖</a></td>
163
+ </tr>
164
+ </tbody>
165
+ </table>
166
+
167
+ <!-- markdownlint-restore -->
168
+ <!-- prettier-ignore-end -->
169
+
170
+ <!-- ALL-CONTRIBUTORS-LIST:END -->
171
+
172
+ This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!
@@ -1,7 +1,7 @@
1
1
  app/__init__.py,sha256=uqZSnn_VEL8TIUxsYqdf4zA2ByJYfjA06fArVAzrHFo,89
2
2
  app/cli.py,sha256=gkIAkYOT9SbQjUDnVmwhVKZeKjL3YJCMrOjFINwBx54,544
3
3
  app/dependencies.py,sha256=kfB_TxeZve_cnBxhOHZezKwkOwTNFwoHzNCJDUkGJD8,4377
4
- app/main.py,sha256=wCELolhaBfJCEfFfSELNTQ5hZ1Xo-G5Wa3vMkIOY6gk,4665
4
+ app/main.py,sha256=7J8mkp_nDqYTo68gu1OwbwsZrVmVG1XVYsmHGXXQm-0,4709
5
5
  app/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
6
  app/core/crypto.py,sha256=zUz2GVqXigzXB5zX2Diq2cR41Kl37bBqxJiZmWGiIcY,1145
7
7
  app/core/errors.py,sha256=go4Q5vv6_Rt8ZS230Mp436yCViEKu_xICylGF0gvGJg,1805
@@ -16,14 +16,15 @@ app/core/balancer/types.py,sha256=gDgjlTy-NH3YhHYl2-YYpIabnckN9Q8-4cRy6S1u0K4,19
16
16
  app/core/clients/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
17
17
  app/core/clients/http.py,sha256=yfFwsaIZNbSmNtyV02WnMKn00JdoNNSlSIx5xB3QY4o,987
18
18
  app/core/clients/oauth.py,sha256=XgAzQVAMudBUCQ9nGKUC9N7zagSiawBdhIVmxf9HHwQ,11832
19
- app/core/clients/proxy.py,sha256=ZWs0TBYcOgDz_jZ3tucDsRiqQ_9TGxU1oPGiI1mu-bE,9378
19
+ app/core/clients/proxy.py,sha256=lplog7s1pg1OJb8ZEM1wGbgM_omTUWLkBRZ4McLGevY,10367
20
20
  app/core/clients/usage.py,sha256=kG7TXqmy8IX9m4wJx5fOGDB2hqunivOU6o2xfoXCGy4,4800
21
21
  app/core/config/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
22
- app/core/config/settings.py,sha256=h6JoHfsaqZpUmv8RPKw38zv45eHyjv53PbHCw3pK7h8,2648
22
+ app/core/config/settings.py,sha256=hI4WwQnEajV36e5UIOJZWiF-ghXxVzfPC8BjMMDOVU0,2692
23
23
  app/core/openai/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
24
24
  app/core/openai/models.py,sha256=SzVPqmp9IDbJTW6gLGHeLxrpAmFehJPSC4fVsqzEmQA,3344
25
25
  app/core/openai/parsing.py,sha256=VuE1OyPAv1umrSbkzqa6dcjPYfk00isOVB3O0xUPLBw,1537
26
- app/core/openai/requests.py,sha256=Nnd4ZtxUtXP-jJ7LGKpPf_JDBIFo-X9k0qMw9SyANTc,1675
26
+ app/core/openai/requests.py,sha256=p-by1zrNAUVNJMjTf3KHT9g9dZs1MmVrqxVpIT9-X80,2252
27
+ app/core/openai/v1_requests.py,sha256=4WIGXwmkXSgoSFtseJIIYiuAx7WT3gqQWYlZhKnOFlc,5612
27
28
  app/core/usage/__init__.py,sha256=8SBpiClJR2wl653Cj1DTvmVUvi2jzU6kKXJtq91ofmE,5726
28
29
  app/core/usage/logs.py,sha256=8TrE9nccEjIJslMfAk8AJLmX_Zzeksu8qMTvrGwePx0,2129
29
30
  app/core/usage/models.py,sha256=FtBQx4Rb7jpwcqxmGXxg7RTVV17LK1QOSWaJIkaaNoQ,878
@@ -36,7 +37,7 @@ app/core/utils/retry.py,sha256=UmBap1Wh-CBT7r4fHzVb_PI9-LR9-HjUtDzRnhRjP2U,822
36
37
  app/core/utils/sse.py,sha256=DJMOU4vW5Ir_4WeL5t5t7i33aRMnqVPU0eQvGn4sBv8,537
37
38
  app/core/utils/time.py,sha256=B6FfSe43Eq_puE6eourly1X3gajyihK2VOAwJ8M3wyI,497
38
39
  app/db/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
39
- app/db/models.py,sha256=Wp7OUMYtqkT-8BD-aoYUsdZgTCMMXg-e0VU1vSKMRg8,5244
40
+ app/db/models.py,sha256=vjQ2C3l8J1zlsRz9gVzM4fbcX43NGrj51cfCsM4EjNk,5304
40
41
  app/db/session.py,sha256=T_UdGcqzn5YXo-fuRW8s5xJQvOuJsV4eTSZE0_V2C44,3910
41
42
  app/db/migrations/__init__.py,sha256=hRZVLgAQfP-okuhIiKkQtwfnPtBvYXcLJTqg0Yex1Vc,2633
42
43
  app/db/migrations/versions/__init__.py,sha256=U4S_2y3zgLZVfMenHRaJFBW8yqh2mUBuI291LGQVOJ8,35
@@ -49,7 +50,7 @@ app/modules/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
49
50
  app/modules/accounts/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
50
51
  app/modules/accounts/api.py,sha256=rSkYrg3_p_JE1kHZ4xXa5lBFTdT40v1oNAmlTDGOguY,2807
51
52
  app/modules/accounts/auth_manager.py,sha256=YUKdeHbszRLYZ4uRQzvk6ICk2cB73LjlJMEiWphBWWw,4682
52
- app/modules/accounts/repository.py,sha256=xOj47_BeYzVPj_WBejrlGtlTDd0tNR4o6sZIrM8QriE,3382
53
+ app/modules/accounts/repository.py,sha256=hu7yQsGfPmHOBy7BM3aKlrZuNr4_qPjDDXcAneX1K2c,3730
53
54
  app/modules/accounts/schemas.py,sha256=gtlbPg5uxM3t_V5JxCL6eP-UaU6TSE0UoX2yIpxM_a0,1659
54
55
  app/modules/accounts/service.py,sha256=M3_SRD21yp0YN820IHdqNIlZsynNsSUN6TO6RcESDeI,8973
55
56
  app/modules/health/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -61,18 +62,18 @@ app/modules/oauth/schemas.py,sha256=sdDKP7u9bO87lcZXjK7uSokurHPS22nN2p_jkw9iEBc,
61
62
  app/modules/oauth/service.py,sha256=fEzUtoq1g-20NgWZlB_maA2XB-scMa0HJV24SxZPnqQ,12908
62
63
  app/modules/oauth/templates/oauth_success.html,sha256=YNSGUIozcZEJQjpFtM2sgF4n8jqfbmx8LRwdXTraym4,3799
63
64
  app/modules/proxy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
64
- app/modules/proxy/api.py,sha256=BR_qNlNZg2Ft5GYQ-7AzlLlJFf6RVJmlzJzFr_KHUIc,2921
65
+ app/modules/proxy/api.py,sha256=HhJPBa-I6EL0N4jqkDtP1ZrTHNq5yt2Kzn0D0LJK7QQ,4032
65
66
  app/modules/proxy/helpers.py,sha256=-XVTNTpkDvJ3KfsuGHztfUVBGBFm2H-AaNTNH2dNe6o,8739
66
67
  app/modules/proxy/load_balancer.py,sha256=Forib096qbWud11aKw9TRbBN1bIQjOmE3ZYY62vhVYk,9831
67
68
  app/modules/proxy/schemas.py,sha256=55pXtUCl2R_93kAPOJJ7Ji4Jn3qVu10vq2KSCCkNdp4,2748
68
- app/modules/proxy/service.py,sha256=wXXXu4Nd88RDzY1EQvA7OZPH5EW1F9hCINB1vGjT1q8,23647
69
+ app/modules/proxy/service.py,sha256=4lnOoqvCNiRhCVOcshnKslbiH4O35iYn1S3CykJkhMA,24578
69
70
  app/modules/proxy/sticky_repository.py,sha256=peFaAnaCVr064W-Sh0Kjvz-MuPbBfrh86RLQOGJ6qqs,2177
70
71
  app/modules/proxy/types.py,sha256=iqEyoO8vGr8N5oEzUSvVWCai7UZbJAU62IvO7JNS9qs,927
71
72
  app/modules/request_logs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
72
- app/modules/request_logs/api.py,sha256=6nV2Uv_hnK7WI3gNpKrgTx4MyUQIXk1QxKp40nij0Xo,1037
73
- app/modules/request_logs/repository.py,sha256=iIaXGIG1qjol4UiTsVASIJN0g5zIdMg6tRNolkXZ0pI,3460
74
- app/modules/request_logs/schemas.py,sha256=Xlpk2hEVCQxA2TI7dh4EA6G0kSfzYcT_LlvyTVLIW2w,675
75
- app/modules/request_logs/service.py,sha256=8IvC4GIhPh6FVQGkuww1Ej1onFanObnX7mY3tDEy99A,2643
73
+ app/modules/request_logs/api.py,sha256=NkLHo8Yuy4S6m00yUIOmzcag9scEaSG2QL7CDRYfyUE,3158
74
+ app/modules/request_logs/repository.py,sha256=e0-z6-ZfJpMMEShqpK-k23C5y1LnTxawpfMaaiRco40,8560
75
+ app/modules/request_logs/schemas.py,sha256=MFS_MW0mW3cGyIulxJN81dJ3SS2bt0tFE67-DzYX1Pg,944
76
+ app/modules/request_logs/service.py,sha256=ruZz5QAKYSrJbYpImZzU2va1sLFfamWL8dOhqU-GG0A,5485
76
77
  app/modules/settings/__init__.py,sha256=U4S_2y3zgLZVfMenHRaJFBW8yqh2mUBuI291LGQVOJ8,35
77
78
  app/modules/settings/api.py,sha256=dbnvKUF4lgX5ipxOik4SJBeJ6hctJKe3lcT2Uf0F5BQ,1461
78
79
  app/modules/settings/repository.py,sha256=r-GjuURPcftCx5HnFOZKFpv34g9bvy0m53owVCc3tpI,1204
@@ -85,13 +86,12 @@ app/modules/usage/api.py,sha256=jpPc2VSjmiP6DjRZvotHCh_trLINOngSyTdS7MY9fgg,1108
85
86
  app/modules/usage/repository.py,sha256=DtJI4kgajW7YUJ0JKJjdNCPBXT_fdBwqDoepi9aznyA,4791
86
87
  app/modules/usage/schemas.py,sha256=eCgunQOvQeYEqv9IecjunONPVLpg2MPn_YGzsnBTcpQ,1633
87
88
  app/modules/usage/service.py,sha256=8-XX8m4TgQteum-a53l0DS-EL2NnC4r9artehfFltvM,10315
88
- app/modules/usage/updater.py,sha256=VAeRFvgfpZLCTGxfikefw35ecs8Ja7EoWldIldXDjmE,6783
89
- app/static/7.css,sha256=NjFS937GS7Wg-LTSon5eoiZaHo9fAIbHZ3ikkEDg4Qw,82378
90
- app/static/index.css,sha256=amajcY4psagBwwg5FqgINHNebEHdL1IPRmBGG4fcm24,9271
91
- app/static/index.html,sha256=JPEj3IsVKsK2ub6-_hxKj_Yr9OnRuobHsX8plH9SzDE,26860
92
- app/static/index.js,sha256=p_BZxgROGRLXxy9JGAB03SUARDwHesbmUy0LAVq-Z7w,59013
93
- codex_lb-0.3.0.dist-info/METADATA,sha256=RuWBdjeptPK-OigdjI-mbDVVcj2QvTRUU7s1RbwajKU,3828
94
- codex_lb-0.3.0.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
95
- codex_lb-0.3.0.dist-info/entry_points.txt,sha256=SEa5T6Uz2Fhy574No6Y0XyGmYi3PXLrhu2xStJTqyI8,42
96
- codex_lb-0.3.0.dist-info/licenses/LICENSE,sha256=cHPibxiL0TXwrUX_kNY6ym544EX1UCzKhxdaca5cFuk,1062
97
- codex_lb-0.3.0.dist-info/RECORD,,
89
+ app/modules/usage/updater.py,sha256=TUFLIjIe8c0m06bnO6iumzAyFuMED3B1ry3Ty5o8JRo,7821
90
+ app/static/index.css,sha256=4EcLWTHAkhbqldi9fE1Y_bQCtmJuXUgEs0JHV-KmV9w,31757
91
+ app/static/index.html,sha256=g1U2AlbvGChev5KIyPoVI5TJ3dnvEOqoAot1tENvQOs,39799
92
+ app/static/index.js,sha256=q-IXWQURYksd-i68yXwyqBazs-AYiz3Tvk5t_B6NbSY,69750
93
+ codex_lb-0.4.0.dist-info/METADATA,sha256=VQXBteRPg3SxSUeq9oAQW3x3VRsTsk2KWHxNv-IfKZE,7244
94
+ codex_lb-0.4.0.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
95
+ codex_lb-0.4.0.dist-info/entry_points.txt,sha256=SEa5T6Uz2Fhy574No6Y0XyGmYi3PXLrhu2xStJTqyI8,42
96
+ codex_lb-0.4.0.dist-info/licenses/LICENSE,sha256=cHPibxiL0TXwrUX_kNY6ym544EX1UCzKhxdaca5cFuk,1062
97
+ codex_lb-0.4.0.dist-info/RECORD,,