gemini-webapi 1.12.0__tar.gz → 1.12.2__tar.gz

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.
Files changed (38) hide show
  1. {gemini_webapi-1.12.0 → gemini_webapi-1.12.2}/PKG-INFO +1 -1
  2. {gemini_webapi-1.12.0 → gemini_webapi-1.12.2}/src/gemini_webapi/client.py +2 -2
  3. {gemini_webapi-1.12.0 → gemini_webapi-1.12.2}/src/gemini_webapi/constants.py +11 -11
  4. {gemini_webapi-1.12.0 → gemini_webapi-1.12.2}/src/gemini_webapi/types/candidate.py +13 -1
  5. {gemini_webapi-1.12.0 → gemini_webapi-1.12.2}/src/gemini_webapi.egg-info/PKG-INFO +1 -1
  6. {gemini_webapi-1.12.0 → gemini_webapi-1.12.2}/src/gemini_webapi.egg-info/SOURCES.txt +1 -0
  7. gemini_webapi-1.12.2/tests/test_html_entity_decode.py +48 -0
  8. {gemini_webapi-1.12.0 → gemini_webapi-1.12.2}/.github/dependabot.yml +0 -0
  9. {gemini_webapi-1.12.0 → gemini_webapi-1.12.2}/.github/workflows/github-release.yml +0 -0
  10. {gemini_webapi-1.12.0 → gemini_webapi-1.12.2}/.github/workflows/pypi-publish.yml +0 -0
  11. {gemini_webapi-1.12.0 → gemini_webapi-1.12.2}/.gitignore +0 -0
  12. {gemini_webapi-1.12.0 → gemini_webapi-1.12.2}/.vscode/launch.json +0 -0
  13. {gemini_webapi-1.12.0 → gemini_webapi-1.12.2}/.vscode/settings.json +0 -0
  14. {gemini_webapi-1.12.0 → gemini_webapi-1.12.2}/LICENSE +0 -0
  15. {gemini_webapi-1.12.0 → gemini_webapi-1.12.2}/README.md +0 -0
  16. {gemini_webapi-1.12.0 → gemini_webapi-1.12.2}/assets/banner.png +0 -0
  17. {gemini_webapi-1.12.0 → gemini_webapi-1.12.2}/assets/favicon.png +0 -0
  18. {gemini_webapi-1.12.0 → gemini_webapi-1.12.2}/assets/logo.svg +0 -0
  19. {gemini_webapi-1.12.0 → gemini_webapi-1.12.2}/assets/sample.pdf +0 -0
  20. {gemini_webapi-1.12.0 → gemini_webapi-1.12.2}/pyproject.toml +0 -0
  21. {gemini_webapi-1.12.0 → gemini_webapi-1.12.2}/setup.cfg +0 -0
  22. {gemini_webapi-1.12.0 → gemini_webapi-1.12.2}/src/gemini_webapi/__init__.py +0 -0
  23. {gemini_webapi-1.12.0 → gemini_webapi-1.12.2}/src/gemini_webapi/exceptions.py +0 -0
  24. {gemini_webapi-1.12.0 → gemini_webapi-1.12.2}/src/gemini_webapi/types/__init__.py +0 -0
  25. {gemini_webapi-1.12.0 → gemini_webapi-1.12.2}/src/gemini_webapi/types/image.py +0 -0
  26. {gemini_webapi-1.12.0 → gemini_webapi-1.12.2}/src/gemini_webapi/types/modeloutput.py +0 -0
  27. {gemini_webapi-1.12.0 → gemini_webapi-1.12.2}/src/gemini_webapi/utils/__init__.py +0 -0
  28. {gemini_webapi-1.12.0 → gemini_webapi-1.12.2}/src/gemini_webapi/utils/get_access_token.py +0 -0
  29. {gemini_webapi-1.12.0 → gemini_webapi-1.12.2}/src/gemini_webapi/utils/load_browser_cookies.py +0 -0
  30. {gemini_webapi-1.12.0 → gemini_webapi-1.12.2}/src/gemini_webapi/utils/logger.py +0 -0
  31. {gemini_webapi-1.12.0 → gemini_webapi-1.12.2}/src/gemini_webapi/utils/rotate_1psidts.py +0 -0
  32. {gemini_webapi-1.12.0 → gemini_webapi-1.12.2}/src/gemini_webapi/utils/upload_file.py +0 -0
  33. {gemini_webapi-1.12.0 → gemini_webapi-1.12.2}/src/gemini_webapi.egg-info/dependency_links.txt +0 -0
  34. {gemini_webapi-1.12.0 → gemini_webapi-1.12.2}/src/gemini_webapi.egg-info/requires.txt +0 -0
  35. {gemini_webapi-1.12.0 → gemini_webapi-1.12.2}/src/gemini_webapi.egg-info/top_level.txt +0 -0
  36. {gemini_webapi-1.12.0 → gemini_webapi-1.12.2}/tests/test_client_features.py +0 -0
  37. {gemini_webapi-1.12.0 → gemini_webapi-1.12.2}/tests/test_rotate_cookies.py +0 -0
  38. {gemini_webapi-1.12.0 → gemini_webapi-1.12.2}/tests/test_save_image.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gemini-webapi
3
- Version: 1.12.0
3
+ Version: 1.12.2
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
@@ -313,7 +313,7 @@ class GeminiClient:
313
313
  If prompt is empty.
314
314
  `gemini_webapi.TimeoutError`
315
315
  If request timed out.
316
- `gemini_webapi.GenimiError`
316
+ `gemini_webapi.GeminiError`
317
317
  If no reply candidate found in response.
318
318
  `gemini_webapi.APIError`
319
319
  - If request failed with status code other than 200.
@@ -630,7 +630,7 @@ class ChatSession:
630
630
  If prompt is empty.
631
631
  `gemini_webapi.TimeoutError`
632
632
  If request timed out.
633
- `gemini_webapi.GenimiError`
633
+ `gemini_webapi.GeminiError`
634
634
  If no reply candidate found in response.
635
635
  `gemini_webapi.APIError`
636
636
  - If request failed with status code other than 200.
@@ -25,19 +25,9 @@ class Headers(Enum):
25
25
 
26
26
  class Model(Enum):
27
27
  UNSPECIFIED = ("unspecified", {}, False)
28
- G_2_0_FLASH = (
29
- "gemini-2.0-flash",
30
- {"x-goog-ext-525001261-jspb": '[1,null,null,null,"f299729663a2343f"]'},
31
- False,
32
- )
33
- G_2_0_FLASH_THINKING = (
34
- "gemini-2.0-flash-thinking",
35
- {"x-goog-ext-525001261-jspb": '[null,null,null,null,"7ca48d02d802f20a"]'},
36
- False,
37
- ) # Deprecated
38
28
  G_2_5_FLASH = (
39
29
  "gemini-2.5-flash",
40
- {"x-goog-ext-525001261-jspb": '[1,null,null,null,"35609594dbe934d8"]'},
30
+ {"x-goog-ext-525001261-jspb": '[1,null,null,null,"9ec249fc9ad08861"]'},
41
31
  False,
42
32
  )
43
33
  G_2_5_PRO = (
@@ -45,6 +35,16 @@ class Model(Enum):
45
35
  {"x-goog-ext-525001261-jspb": '[1,null,null,null,"2525e3954d185b3c"]'},
46
36
  False,
47
37
  )
38
+ G_2_0_FLASH = (
39
+ "gemini-2.0-flash",
40
+ {"x-goog-ext-525001261-jspb": '[1,null,null,null,"f299729663a2343f"]'},
41
+ False,
42
+ ) # Deprecated
43
+ G_2_0_FLASH_THINKING = (
44
+ "gemini-2.0-flash-thinking",
45
+ {"x-goog-ext-525001261-jspb": '[null,null,null,null,"7ca48d02d802f20a"]'},
46
+ False,
47
+ ) # Deprecated
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"]'},
@@ -1,4 +1,5 @@
1
- from pydantic import BaseModel
1
+ import html
2
+ from pydantic import BaseModel, field_validator
2
3
 
3
4
  from .image import Image, WebImage, GeneratedImage
4
5
 
@@ -33,6 +34,17 @@ class Candidate(BaseModel):
33
34
  def __repr__(self):
34
35
  return f"Candidate(rcid='{self.rcid}', text='{len(self.text) <= 20 and self.text or self.text[:20] + '...'}', images={self.images})"
35
36
 
37
+ @field_validator("text", "thoughts")
38
+ @classmethod
39
+ def decode_html(cls, value: str) -> str:
40
+ """
41
+ Auto unescape HTML entities in text/thoughts if any.
42
+ """
43
+
44
+ if value:
45
+ value = html.unescape(value)
46
+ return value
47
+
36
48
  @property
37
49
  def images(self) -> list[Image]:
38
50
  return self.web_images + self.generated_images
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gemini-webapi
3
- Version: 1.12.0
3
+ Version: 1.12.2
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
@@ -31,5 +31,6 @@ src/gemini_webapi/utils/logger.py
31
31
  src/gemini_webapi/utils/rotate_1psidts.py
32
32
  src/gemini_webapi/utils/upload_file.py
33
33
  tests/test_client_features.py
34
+ tests/test_html_entity_decode.py
34
35
  tests/test_rotate_cookies.py
35
36
  tests/test_save_image.py
@@ -0,0 +1,48 @@
1
+ import unittest
2
+ from gemini_webapi.types.candidate import Candidate
3
+
4
+
5
+ class TestHtmlEntityDecode(unittest.TestCase):
6
+ def test_html_entity_decoding(self):
7
+ # Test HTML entity decoding functionality
8
+ html_encoded_text = (
9
+ "This is a code snippet: &lt;code&gt;print('Hello, World!')&lt;/code&gt;"
10
+ )
11
+ expected_decoded_text = (
12
+ "This is a code snippet: <code>print('Hello, World!')</code>"
13
+ )
14
+
15
+ # Create Candidate instance which should automatically decode HTML entities
16
+ candidate = Candidate(
17
+ rcid="test_rcid",
18
+ text=html_encoded_text,
19
+ thoughts="Testing &lt;b&gt;HTML&lt;/b&gt; entity decoding",
20
+ )
21
+
22
+ # Verify that text property is correctly decoded
23
+ self.assertEqual(candidate.text, expected_decoded_text)
24
+
25
+ # Verify that thoughts property is correctly decoded
26
+ self.assertEqual(candidate.thoughts, "Testing <b>HTML</b> entity decoding")
27
+
28
+ def test_non_html_text(self):
29
+ # Test plain text without any HTML entities
30
+ plain_text = "This is regular text with no HTML entities"
31
+
32
+ candidate = Candidate(rcid="test_rcid", text=plain_text)
33
+
34
+ # Verify the text remains unchanged
35
+ self.assertEqual(candidate.text, plain_text)
36
+
37
+ def test_complex_html_entities(self):
38
+ # Test more complex combinations of HTML entities
39
+ complex_html = "&lt;div&gt;This has &amp;amp; character\n and &quot;quotes&quot;&lt;/div&gt;"
40
+ expected_decoded = '<div>This has &amp; character\n and "quotes"</div>'
41
+
42
+ candidate = Candidate(rcid="test_rcid", text=complex_html)
43
+
44
+ self.assertEqual(candidate.text, expected_decoded)
45
+
46
+
47
+ if __name__ == "__main__":
48
+ unittest.main()
File without changes
File without changes
File without changes