gemini-webapi 1.9.1__py3-none-any.whl → 1.10.1__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.
- gemini_webapi/client.py +12 -11
- gemini_webapi/constants.py +9 -4
- gemini_webapi/utils/__init__.py +1 -1
- gemini_webapi/utils/upload_file.py +27 -6
- {gemini_webapi-1.9.1.dist-info → gemini_webapi-1.10.1.dist-info}/METADATA +31 -37
- {gemini_webapi-1.9.1.dist-info → gemini_webapi-1.10.1.dist-info}/RECORD +9 -9
- {gemini_webapi-1.9.1.dist-info → gemini_webapi-1.10.1.dist-info}/WHEEL +1 -1
- {gemini_webapi-1.9.1.dist-info → gemini_webapi-1.10.1.dist-info}/licenses/LICENSE +0 -0
- {gemini_webapi-1.9.1.dist-info → gemini_webapi-1.10.1.dist-info}/top_level.txt +0 -0
gemini_webapi/client.py
CHANGED
|
@@ -13,6 +13,7 @@ from .exceptions import AuthError, APIError, TimeoutError, GeminiError
|
|
|
13
13
|
from .types import WebImage, GeneratedImage, Candidate, ModelOutput
|
|
14
14
|
from .utils import (
|
|
15
15
|
upload_file,
|
|
16
|
+
parse_file_name,
|
|
16
17
|
rotate_1psidts,
|
|
17
18
|
get_access_token,
|
|
18
19
|
load_browser_cookies,
|
|
@@ -263,7 +264,7 @@ class GeminiClient:
|
|
|
263
264
|
async def generate_content(
|
|
264
265
|
self,
|
|
265
266
|
prompt: str,
|
|
266
|
-
|
|
267
|
+
files: list[str | Path] | None = None,
|
|
267
268
|
model: Model | str = Model.UNSPECIFIED,
|
|
268
269
|
chat: Optional["ChatSession"] = None,
|
|
269
270
|
**kwargs,
|
|
@@ -275,8 +276,8 @@ class GeminiClient:
|
|
|
275
276
|
----------
|
|
276
277
|
prompt: `str`
|
|
277
278
|
Prompt provided by user.
|
|
278
|
-
|
|
279
|
-
List of
|
|
279
|
+
files: `list[str | Path]`, optional
|
|
280
|
+
List of file paths to be attached.
|
|
280
281
|
model: `Model` | `str`, optional
|
|
281
282
|
Specify the model to use for generation.
|
|
282
283
|
Pass either a `gemini_webapi.constants.Model` enum or a model name string.
|
|
@@ -324,17 +325,17 @@ class GeminiClient:
|
|
|
324
325
|
None,
|
|
325
326
|
json.dumps(
|
|
326
327
|
[
|
|
327
|
-
|
|
328
|
+
files
|
|
328
329
|
and [
|
|
329
330
|
prompt,
|
|
330
331
|
0,
|
|
331
332
|
None,
|
|
332
333
|
[
|
|
333
334
|
[
|
|
334
|
-
[await upload_file(
|
|
335
|
-
|
|
335
|
+
[await upload_file(file, self.proxy)],
|
|
336
|
+
parse_file_name(file),
|
|
336
337
|
]
|
|
337
|
-
for
|
|
338
|
+
for file in files
|
|
338
339
|
],
|
|
339
340
|
]
|
|
340
341
|
or [prompt],
|
|
@@ -550,7 +551,7 @@ class ChatSession:
|
|
|
550
551
|
async def send_message(
|
|
551
552
|
self,
|
|
552
553
|
prompt: str,
|
|
553
|
-
|
|
554
|
+
files: list[str | Path] | None = None,
|
|
554
555
|
**kwargs,
|
|
555
556
|
) -> ModelOutput:
|
|
556
557
|
"""
|
|
@@ -561,8 +562,8 @@ class ChatSession:
|
|
|
561
562
|
----------
|
|
562
563
|
prompt: `str`
|
|
563
564
|
Prompt provided by user.
|
|
564
|
-
|
|
565
|
-
List of
|
|
565
|
+
files: `list[str | Path]`, optional
|
|
566
|
+
List of file paths to be attached.
|
|
566
567
|
kwargs: `dict`, optional
|
|
567
568
|
Additional arguments which will be passed to the post request.
|
|
568
569
|
Refer to `httpx.AsyncClient.request` for more information.
|
|
@@ -587,7 +588,7 @@ class ChatSession:
|
|
|
587
588
|
"""
|
|
588
589
|
|
|
589
590
|
return await self.geminiclient.generate_content(
|
|
590
|
-
prompt=prompt,
|
|
591
|
+
prompt=prompt, files=files, model=self.model, chat=self, **kwargs
|
|
591
592
|
)
|
|
592
593
|
|
|
593
594
|
def choose_candidate(self, index: int) -> ModelOutput:
|
gemini_webapi/constants.py
CHANGED
|
@@ -44,27 +44,32 @@ class Model(Enum):
|
|
|
44
44
|
"gemini-2.0-flash-thinking-with-apps",
|
|
45
45
|
{"x-goog-ext-525001261-jspb": '[null,null,null,null,"f8f8f5ea629f5d37"]'},
|
|
46
46
|
False,
|
|
47
|
-
)
|
|
47
|
+
) # Deprecated, should be removed in the future
|
|
48
48
|
G_2_0_EXP_ADVANCED = (
|
|
49
49
|
"gemini-2.0-exp-advanced",
|
|
50
50
|
{"x-goog-ext-525001261-jspb": '[null,null,null,null,"b1e46a6037e6aa9f"]'},
|
|
51
51
|
True,
|
|
52
52
|
)
|
|
53
|
+
G_2_5_EXP_ADVANCED = (
|
|
54
|
+
"gemini-2.5-exp-advanced",
|
|
55
|
+
{"x-goog-ext-525001261-jspb": '[null,null,null,null,"203e6bb81620bcfe"]'},
|
|
56
|
+
True,
|
|
57
|
+
)
|
|
53
58
|
G_1_5_FLASH = (
|
|
54
59
|
"gemini-1.5-flash",
|
|
55
60
|
{"x-goog-ext-525001261-jspb": '[null,null,null,null,"418ab5ea040b5c43"]'},
|
|
56
61
|
False,
|
|
57
|
-
)
|
|
62
|
+
) # Deprecated, should be removed in the future
|
|
58
63
|
G_1_5_PRO = (
|
|
59
64
|
"gemini-1.5-pro",
|
|
60
65
|
{"x-goog-ext-525001261-jspb": '[null,null,null,null,"9d60dfae93c9ff1f"]'},
|
|
61
66
|
True,
|
|
62
|
-
)
|
|
67
|
+
) # Deprecated, should be removed in the future
|
|
63
68
|
G_1_5_PRO_RESEARCH = (
|
|
64
69
|
"gemini-1.5-pro-research",
|
|
65
70
|
{"x-goog-ext-525001261-jspb": '[null,null,null,null,"e5a44cb1dae2b489"]'},
|
|
66
71
|
True,
|
|
67
|
-
)
|
|
72
|
+
) # Deprecated, should be removed in the future
|
|
68
73
|
|
|
69
74
|
def __init__(self, name, header, advanced_only):
|
|
70
75
|
self.model_name = name
|
gemini_webapi/utils/__init__.py
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
from asyncio import Task
|
|
2
2
|
|
|
3
|
-
from .upload_file import upload_file # noqa: F401
|
|
3
|
+
from .upload_file import upload_file, parse_file_name # noqa: F401
|
|
4
4
|
from .rotate_1psidts import rotate_1psidts # noqa: F401
|
|
5
5
|
from .get_access_token import get_access_token # noqa: F401
|
|
6
6
|
from .load_browser_cookies import load_browser_cookies # noqa: F401
|
|
@@ -7,14 +7,14 @@ from ..constants import Endpoint, Headers
|
|
|
7
7
|
|
|
8
8
|
|
|
9
9
|
@validate_call
|
|
10
|
-
async def upload_file(file:
|
|
10
|
+
async def upload_file(file: str | Path, proxy: str | None = None) -> str:
|
|
11
11
|
"""
|
|
12
12
|
Upload a file to Google's server and return its identifier.
|
|
13
13
|
|
|
14
14
|
Parameters
|
|
15
15
|
----------
|
|
16
|
-
file : `
|
|
17
|
-
|
|
16
|
+
file : `str` | `Path`
|
|
17
|
+
Path to the file to be uploaded.
|
|
18
18
|
proxy: `str`, optional
|
|
19
19
|
Proxy URL.
|
|
20
20
|
|
|
@@ -30,9 +30,8 @@ async def upload_file(file: bytes | str | Path, proxy: str | None = None) -> str
|
|
|
30
30
|
If the upload request failed.
|
|
31
31
|
"""
|
|
32
32
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
file = f.read()
|
|
33
|
+
with open(file, "rb") as f:
|
|
34
|
+
file = f.read()
|
|
36
35
|
|
|
37
36
|
async with AsyncClient(http2=True, proxy=proxy) as client:
|
|
38
37
|
response = await client.post(
|
|
@@ -43,3 +42,25 @@ async def upload_file(file: bytes | str | Path, proxy: str | None = None) -> str
|
|
|
43
42
|
)
|
|
44
43
|
response.raise_for_status()
|
|
45
44
|
return response.text
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def parse_file_name(file: str | Path) -> str:
|
|
48
|
+
"""
|
|
49
|
+
Parse the file name from the given path.
|
|
50
|
+
|
|
51
|
+
Parameters
|
|
52
|
+
----------
|
|
53
|
+
file : `str` | `Path`
|
|
54
|
+
Path to the file.
|
|
55
|
+
|
|
56
|
+
Returns
|
|
57
|
+
-------
|
|
58
|
+
`str`
|
|
59
|
+
File name with extension.
|
|
60
|
+
"""
|
|
61
|
+
|
|
62
|
+
file = Path(file)
|
|
63
|
+
if not file.is_file():
|
|
64
|
+
raise ValueError(f"{file} is not a valid file.")
|
|
65
|
+
|
|
66
|
+
return file.name
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: gemini-webapi
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.10.1
|
|
4
4
|
Summary: ✨ An elegant async Python wrapper for Google Gemini web app
|
|
5
5
|
Author: UZQueen
|
|
6
6
|
License: GNU AFFERO GENERAL PUBLIC LICENSE
|
|
@@ -712,7 +712,7 @@ A reverse-engineered asynchronous python wrapper for [Google Gemini](https://gem
|
|
|
712
712
|
## Features
|
|
713
713
|
|
|
714
714
|
- **Persistent Cookies** - Automatically refreshes cookies in background. Optimized for always-on services.
|
|
715
|
-
- **
|
|
715
|
+
- **Image Generation** - Natively supports generating and modifying images with natural language.
|
|
716
716
|
- **Extension Support** - Supports generating contents with [Gemini extensions](https://gemini.google.com/extensions) on, like YouTube and Gmail.
|
|
717
717
|
- **Classified Outputs** - Automatically categorizes texts, web images and AI generated images in the response.
|
|
718
718
|
- **Official Flavor** - Provides a simple and elegant interface inspired by [Google Generative AI](https://ai.google.dev/tutorials/python_quickstart)'s official API.
|
|
@@ -728,13 +728,12 @@ A reverse-engineered asynchronous python wrapper for [Google Gemini](https://gem
|
|
|
728
728
|
- [Initialization](#initialization)
|
|
729
729
|
- [Select language model](#select-language-model)
|
|
730
730
|
- [Generate contents from text](#generate-contents-from-text)
|
|
731
|
-
- [Generate contents
|
|
731
|
+
- [Generate contents with files](#generate-contents-with-files)
|
|
732
732
|
- [Conversations across multiple turns](#conversations-across-multiple-turns)
|
|
733
733
|
- [Continue previous conversations](#continue-previous-conversations)
|
|
734
734
|
- [Retrieve model's thought process](#retrieve-models-thought-process)
|
|
735
735
|
- [Retrieve images in response](#retrieve-images-in-response)
|
|
736
|
-
- [Generate images with
|
|
737
|
-
- [Save images to local files](#save-images-to-local-files)
|
|
736
|
+
- [Generate images with Imagen3](#generate-images-with-imagen3)
|
|
738
737
|
- [Generate contents with Gemini extensions](#generate-contents-with-gemini-extensions)
|
|
739
738
|
- [Check and switch to other reply candidates](#check-and-switch-to-other-reply-candidates)
|
|
740
739
|
- [Control log level](#control-log-level)
|
|
@@ -831,6 +830,7 @@ Currently available models (as of Feb 5, 2025):
|
|
|
831
830
|
|
|
832
831
|
Models pending update (may not work as expected):
|
|
833
832
|
|
|
833
|
+
- `gemini-2.5-exp-advanced` - Gemini 2.5 Experimental Advanced **(requires Gemini Advanced account)**
|
|
834
834
|
- `gemini-2.0-exp-advanced` - Gemini 2.0 Experimental Advanced **(requires Gemini Advanced account)**
|
|
835
835
|
- `gemini-1.5-pro` - Gemini 1.5 Pro **(requires Gemini Advanced account)**
|
|
836
836
|
- `gemini-1.5-pro-research` - Gemini 1.5 Pro with Deep Research **(requires Gemini Advanced account)**
|
|
@@ -868,15 +868,15 @@ asyncio.run(main())
|
|
|
868
868
|
>
|
|
869
869
|
> Simply use `print(response)` to get the same output if you just want to see the response text
|
|
870
870
|
|
|
871
|
-
### Generate contents
|
|
871
|
+
### Generate contents with files
|
|
872
872
|
|
|
873
|
-
Gemini supports
|
|
873
|
+
Gemini supports file input, including images and documents. Optionally, you can pass files as a list of paths in `str` or `pathlib.Path` to `GeminiClient.generate_content` together with text prompt.
|
|
874
874
|
|
|
875
875
|
```python
|
|
876
876
|
async def main():
|
|
877
877
|
response = await client.generate_content(
|
|
878
|
-
"
|
|
879
|
-
|
|
878
|
+
"Introduce the contents of these two files. Is there any connection between them?",
|
|
879
|
+
files=["assets/sample.pdf", Path("assets/banner.png")],
|
|
880
880
|
)
|
|
881
881
|
print(response.text)
|
|
882
882
|
|
|
@@ -890,9 +890,15 @@ If you want to keep conversation continuous, please use `GeminiClient.start_chat
|
|
|
890
890
|
```python
|
|
891
891
|
async def main():
|
|
892
892
|
chat = client.start_chat()
|
|
893
|
-
response1 = await chat.send_message(
|
|
894
|
-
|
|
895
|
-
|
|
893
|
+
response1 = await chat.send_message(
|
|
894
|
+
"Introduce the contents of these two files. Is there any connection between them?",
|
|
895
|
+
files=["assets/sample.pdf", Path("assets/banner.png")],
|
|
896
|
+
)
|
|
897
|
+
print(response1.text)
|
|
898
|
+
response2 = await chat.send_message(
|
|
899
|
+
"Use image generation tool to modify the banner with another font and design."
|
|
900
|
+
)
|
|
901
|
+
print(response2.text, response2.images, sep="\n\n----------------------------------\n\n")
|
|
896
902
|
|
|
897
903
|
asyncio.run(main())
|
|
898
904
|
```
|
|
@@ -950,24 +956,27 @@ async def main():
|
|
|
950
956
|
asyncio.run(main())
|
|
951
957
|
```
|
|
952
958
|
|
|
953
|
-
### Generate images with
|
|
959
|
+
### Generate images with Imagen3
|
|
954
960
|
|
|
955
|
-
|
|
961
|
+
You can ask Gemini to generate and modify images with Imagen3, Google's latest AI image generator, simply by natural language.
|
|
956
962
|
|
|
957
963
|
> [!IMPORTANT]
|
|
958
964
|
>
|
|
959
|
-
> Google has some limitations on the image generation feature in Gemini, so its availability could be different per region/account. Here's a summary copied from [official documentation](https://support.google.com/gemini/answer/14286560) (as of
|
|
965
|
+
> Google has some limitations on the image generation feature in Gemini, so its availability could be different per region/account. Here's a summary copied from [official documentation](https://support.google.com/gemini/answer/14286560) (as of March 19th, 2025):
|
|
960
966
|
>
|
|
961
|
-
> > Image generation in Gemini Apps is available in most countries, except in the European Economic Area (EEA), Switzerland, and the UK. It’s only available for **English prompts**.
|
|
962
|
-
> >
|
|
963
967
|
> > This feature’s availability in any specific Gemini app is also limited to the supported languages and countries of that app.
|
|
964
968
|
> >
|
|
965
969
|
> > For now, this feature isn’t available to users under 18.
|
|
970
|
+
> >
|
|
971
|
+
> > To use this feature, you must be signed in to Gemini Apps.
|
|
972
|
+
|
|
973
|
+
You can save images returned from Gemini to local by calling `Image.save()`. Optionally, you can specify the file path and file name by passing `path` and `filename` arguments to the function and skip images with invalid file names by passing `skip_invalid_filename=True`. Works for both `WebImage` and `GeneratedImage`.
|
|
966
974
|
|
|
967
975
|
```python
|
|
968
976
|
async def main():
|
|
969
977
|
response = await client.generate_content("Generate some pictures of cats")
|
|
970
|
-
for image in response.images:
|
|
978
|
+
for i, image in enumerate(response.images):
|
|
979
|
+
await image.save(path="temp/", filename=f"cat_{i}.png", verbose=True)
|
|
971
980
|
print(image, "\n\n----------------------------------\n")
|
|
972
981
|
|
|
973
982
|
asyncio.run(main())
|
|
@@ -977,32 +986,17 @@ asyncio.run(main())
|
|
|
977
986
|
>
|
|
978
987
|
> by default, when asked to send images (like the previous example), Gemini will send images fetched from web instead of generating images with AI model, unless you specifically require to "generate" images in your prompt. In this package, web images and generated images are treated differently as `WebImage` and `GeneratedImage`, and will be automatically categorized in the output.
|
|
979
988
|
|
|
980
|
-
### Save images to local files
|
|
981
|
-
|
|
982
|
-
You can save images returned from Gemini to local files under `/temp` by calling `Image.save()`. Optionally, you can specify the file path and file name by passing `path` and `filename` arguments to the function and skip images with invalid file names by passing `skip_invalid_filename=True`. Works for both `WebImage` and `GeneratedImage`.
|
|
983
|
-
|
|
984
|
-
```python
|
|
985
|
-
async def main():
|
|
986
|
-
response = await client.generate_content("Generate some pictures of cats")
|
|
987
|
-
for i, image in enumerate(response.images):
|
|
988
|
-
await image.save(path="temp/", filename=f"cat_{i}.png", verbose=True)
|
|
989
|
-
|
|
990
|
-
asyncio.run(main())
|
|
991
|
-
```
|
|
992
|
-
|
|
993
989
|
### Generate contents with Gemini extensions
|
|
994
990
|
|
|
995
991
|
> [!IMPORTANT]
|
|
996
992
|
>
|
|
997
|
-
> To access Gemini extensions in API, you must activate them on the [Gemini website](https://gemini.google.com/extensions) first. Same as image generation, Google also has limitations on the availability of Gemini extensions. Here's a summary copied from [official documentation](https://support.google.com/gemini/answer/13695044) (as of
|
|
993
|
+
> To access Gemini extensions in API, you must activate them on the [Gemini website](https://gemini.google.com/extensions) first. Same as image generation, Google also has limitations on the availability of Gemini extensions. Here's a summary copied from [official documentation](https://support.google.com/gemini/answer/13695044) (as of March 19th, 2025):
|
|
998
994
|
>
|
|
999
|
-
> > To
|
|
1000
|
-
> >
|
|
1001
|
-
> > Sign in with your personal Google Account that you manage on your own. Extensions, including the Google Workspace extension, are currently not available to Google Workspace accounts for school, business, or other organizations.
|
|
995
|
+
> > To connect apps to Gemini, you must have Gemini Apps Activity on.
|
|
1002
996
|
> >
|
|
1003
|
-
> >
|
|
997
|
+
> > To use this feature, you must be signed in to Gemini Apps.
|
|
1004
998
|
> >
|
|
1005
|
-
> > Important:
|
|
999
|
+
> > Important: If you’re under 18, Google Workspace and Maps apps currently only work with English prompts in Gemini.
|
|
1006
1000
|
|
|
1007
1001
|
After activating extensions for your account, you can access them in your prompts either by natural language or by starting your prompt with "@" followed by the extension keyword.
|
|
1008
1002
|
|
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
gemini_webapi/__init__.py,sha256=28uNIywK4vCXxENaSagNWUzhqr1RyNtLzDF6WRRM4KQ,194
|
|
2
|
-
gemini_webapi/client.py,sha256=
|
|
3
|
-
gemini_webapi/constants.py,sha256=
|
|
2
|
+
gemini_webapi/client.py,sha256=WsH07qepNSQzq4pdYIJW393Jr4gcdp8D64ti6GlDj9E,23065
|
|
3
|
+
gemini_webapi/constants.py,sha256=Uv-EsCDJUsDJh2KUBkia7u9jXnItKzFJOEHVfrpxQs0,3090
|
|
4
4
|
gemini_webapi/exceptions.py,sha256=6e-EXHGApi4iC0GDw7RKc3YqVK8UvEkHYaJyGQbReLw,548
|
|
5
5
|
gemini_webapi/types/__init__.py,sha256=d2kvXnE004s2E2KDmPPLi5N-BQ59FgDSlrGrO3Wphww,163
|
|
6
6
|
gemini_webapi/types/candidate.py,sha256=dMoGr53WR7FYDRrXpG9Yd_n9YTHGwGaFHZ8zPt8RMWw,1178
|
|
7
7
|
gemini_webapi/types/image.py,sha256=4BC8hxAWJrYFwzA60CivF1di4RZkzPKjcaSPPFKmRdY,5237
|
|
8
8
|
gemini_webapi/types/modeloutput.py,sha256=h07kQOkL5r-oPLvZ59uVtO1eP4FGy5ZpzuYQzAeQdr8,1196
|
|
9
|
-
gemini_webapi/utils/__init__.py,sha256=
|
|
9
|
+
gemini_webapi/utils/__init__.py,sha256=tO6Sx-3fcPeyITZcvUmcFKBFlR5XW87xUFbNrIh3_mE,374
|
|
10
10
|
gemini_webapi/utils/get_access_token.py,sha256=uyb6tuzPr3mHttCjiM86M29ykrnHqsUClYdf5sVkyEQ,5465
|
|
11
11
|
gemini_webapi/utils/load_browser_cookies.py,sha256=A5n_VsB7Rm8ck5lpy856UNJEhv30l3dvQ3j0g3ln1fE,1535
|
|
12
12
|
gemini_webapi/utils/logger.py,sha256=PF4ROQq7scRRrWzeYdeYiYs2S2Jqr0bgjyrPbXVOCqE,816
|
|
13
13
|
gemini_webapi/utils/rotate_1psidts.py,sha256=NyQ9OYPLBOcvpc8bodvEYDIVFrsYN0kdfc831lPEctM,1680
|
|
14
|
-
gemini_webapi/utils/upload_file.py,sha256=
|
|
15
|
-
gemini_webapi-1.
|
|
16
|
-
gemini_webapi-1.
|
|
17
|
-
gemini_webapi-1.
|
|
18
|
-
gemini_webapi-1.
|
|
19
|
-
gemini_webapi-1.
|
|
14
|
+
gemini_webapi/utils/upload_file.py,sha256=SJOMr6kryK_ClrKmqI96fqZBNFOMPsyAvFINAGAU3rk,1468
|
|
15
|
+
gemini_webapi-1.10.1.dist-info/licenses/LICENSE,sha256=hIahDEOTzuHCU5J2nd07LWwkLW7Hko4UFO__ffsvB-8,34523
|
|
16
|
+
gemini_webapi-1.10.1.dist-info/METADATA,sha256=XHAVhXXLT9s7jvuZjaoXxw0CWmIyzg2Grfpiv4wkCKY,57455
|
|
17
|
+
gemini_webapi-1.10.1.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
|
|
18
|
+
gemini_webapi-1.10.1.dist-info/top_level.txt,sha256=dtWtug_ZrmnUqCYuu8NmGzTgWglHeNzhHU_hXmqZGWE,14
|
|
19
|
+
gemini_webapi-1.10.1.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|