Skip to main content

The python package that returns Response of Google Gemini through API.

Project description

Gemini Icon Gemini API PyPI

https://github.com/dsdanielpark/Gemini-API/assets/81407603/e0c11d4f-3fe1-4cbb-ba79-d9f89b637324

A unofficial Python wrapper, python-gemini-api, operates through reverse-engineering, utilizing cookie values to interact with Google Gemini for users struggling with frequent authentication problems or unable to authenticate via Google Authentication. This repository is not expected to be updated frequently.

Collaborated competently with Antonio Cheong.

Please, first review HanaokaYuzu/Gemini-API and the Official Google Gemini API before using this package.


What is Gemini?

| Paper | Official Website | Official API | API Documents |

Gemini is a family of generative AI models developed by Google DeepMind that is designed for multimodal use cases. The Gemini API gives you access to the Gemini Pro and Gemini Pro Vision models. In February 2024, Google's Bard service was changed to Gemini.


Installation 📦

pip install python-gemini-api
pip install git+https://github.com/dsdanielpark/Gemini-API.git

For the updated version, use as follows:

pip install -q -U python-gemini-api

Authentication

[!NOTE] Cookies can change quickly. Don't reopen the same session or repeat prompts too often; they'll expire faster. If the cookie value doesn't export correctly, refresh the Gemini page and export again.

  1. Visit https://gemini.google.com/

  2. F12 for browser console → Session: ApplicationCookies → Copy the value of some working cookie sets. If it doesn't work, go to step 3.

    Some working cookie sets Cookies may vary by account or region.

    First try __Secure-1PSIDCC alone. If it doesn't work, use __Secure-1PSID and __Secure-1PSIDTS. Still no success? Try these four cookies: __Secure-1PSIDCC, __Secure-1PSID, __Secure-1PSIDTS, NID. If none work, proceed to step 3 and consider sending the entire cookie file.

  3. (Recommended) Export Gemini site cookies via a browser extension (e.g., Chrome extension). Use ExportThisCookies, open, and copy the txt file contents.

Further: For manual collection or Required for a few users upon error
  1. For manual cookie collection, refer to this image. Press F12 → Network → Send any prompt to Gemini webui → Click the post address starting with "https://gemini.google.com/_/BardChatUi/data/assistant.lamda.BardFrontendService/StreamGenerate" → Headers → Request Headers → Cookie → Copy and Reformat as JSON manually.
  2. (Required for a few users upon error) If errors persist after manually collecting cookies, refresh the Gemini website and collect cookies again. If errors continue, some users may need to manually set the nonce value. To do this: Press F12 → Network → Send any prompt to Gemini webui → Click the post address starting with "https://gemini.google.com/_/BardChatUi/data/assistant.lamda.BardFrontendService/StreamGenerate" → Payload → Form Data → Copy the "at" key value. See this image for reference.

[!IMPORTANT] Try different Google accounts until you find a working cookie. Use a fresh browser to ensure no remaining cookie values. Use secret browsing mode with independent cookies. Results may vary depending on factors like IP and account status. Providing the entire set of cookies seems to fix one cookie per account. Additionally, once successfully connected with that cookie, it seems to work flawlessly for over three weeks without any errors. Try various methods until you succeed. Experiment in different environments.


Usage

Simple usage

Generate content

from gemini import Gemini

cookies = {} # Cookies may vary by account or region. Consider sending the entire cookie file.
GeminiClient = Gemini(cookies=cookies) # You can use various args

response = GeminiClient.generate_content("Hello, Gemini. What's the weather like in Seoul today?")
response.response_dict

Generate content from image

from gemini import Gemini

cookies = {} # Cookies may vary by account or region. Consider sending the entire cookie file.

GeminiClient = Gemini(cookies=cookies) # You can use various args
response = GeminiClient.generate_content("What does the text in this image say?", image='folder/image.jpg')
response.response_dict

# 01. Initialization

Please explicitly declare cookies in dict format. You can also enter the path to the file containing the cookie with cookie_fp. Check this sample cookie file.

from gemini import Gemini

cookies = {
    "__Secure-1PSIDCC" : "value",
    "__Secure-1PSID" : "value",
    "__Secure-1PSIDTS" : "value",
    "NID" : "value",
    # Cookies may vary by account or region. Consider sending the entire cookie file.
  }

GeminiClient = Gemini(cookies=cookies)
# GeminiClient = Gemini(cookie_fp="folder/cookie_file.json") # Or use cookie file path
# GeminiClient = Gemini(auto_cookies=True) # Or use auto_cookies paprameter

[!IMPORTANT] If the session connects successfully and generate_content runs well, CLOSE Gemini website. If Gemini web stays open in the browser, cookies may expire faster.


# 02. Generate content

To check regardless of the data type of the model output, return the response_dict argument. And use it appropriately. https://github.com/dsdanielpark/Gemini-API/blob/fdf064c57bc1fb47fbbb4b93067618a200e77f62/gemini/core.py#L252

prompt = "Hello, Gemini. What's the weather like in Seoul today?"
response = GeminiClient.generate_content(prompt)
print(response.response_dict)

[!IMPORTANT] Once connected and generating valid content, Be sure to CLOSE the Gemini website or CLOSE your browser for cookie stability.


The output of the generate_content function is GeminiModelOutput, with the following structure:

Properties of GeminiModelOutput:

  • rcid: returns the response candidate id of the chosen candidate.
  • text: returns the text of the chosen candidate.
  • code: returns the codes of the chosen candidate.
  • web_images: returns a list of web images from the chosen candidate.
  • generated_images: returns a list of generated images from the chosen candidate.
  • response_dict: returns the response dictionary, if available.

https://github.com/dsdanielpark/Gemini-API/blob/fdf064c57bc1fb47fbbb4b93067618a200e77f62/gemini/src/model/output.py#L16

[!NOTE] If the session fails to connect, works improperly, or terminates, returning an error, it is recommended to manually renew the cookies. The error is likely due to incorrect cookie values. Refresh or log out of Gemini web to renew cookies and try again.


# 03. Text generation

Returns text generated by Gemini.

prompt = "Hello, Gemini. What's the weather like in Seoul today?"
response = GeminiClient.generate_content(prompt)
print(response.text)

# 04. Image generation

Returns images generated by Gemini. https://github.com/dsdanielpark/Gemini-API/blob/fdf064c57bc1fb47fbbb4b93067618a200e77f62/gemini/src/model/image.py#L12

Sync downloader

from gemini import Gemini, GeminiImage

response = GeminiClient.generate_content("Create illustrations of Seoul, South Korea.")
generated_images = response.generated_images # Check generated images [Dict]

GeminiImage.save_sync(generated_images, save_path="save_dir", cookies=cookies)

# You can use byte type image dict for printing images as follow:
# bytes_images_dict = GeminiImage.fetch_images_dict_sync(generated_images, cookies=cookies) # Get bytes images dict
# GeminiImage.save_images_sync(bytes_images_dict, path="save_dir", cookies=cookies) # Save to path
Display images in IPython

You can display the image or transmit it to another application in byte format.

bytes_images_dict = GeminiImage.fetch_images_dict_sync(generated_images, cookies) # Get bytes images dict
from IPython.display import display, Image
import io

for image_name, image_bytes in bytes_images_dict.items():
    print(image_name)
    image = Image(data=image_bytes)
    display(image)

Async downloader

response = GeminiClient.generate_content("Create illustrations of Seoul, South Korea.")

generated_images = response.generated_images # Check generated images [Dict]

await GeminiImage.save(generated_images, "save_dir", cookies=cookies)
# image_data_dict = await GeminiImage.fetch_images_dict(generated_images, cookies=cookies)
# await GeminiImage.save_images(image_data_dict, "save_dir")
Async downloader wrapper
import asyncio
from gemini import Gemini, GeminiImage

async def save_generated_imagse(generated_imagse, save_path="save_dir", cookies=cookies):
    await GeminiImage.save(generated_imagse, save_path=save_path, cookies=cookies)

# Run the async function
if __name__ == "__main__":
    cookies = {"key" : "value"}
    generated_imagse = response.generated_imagse  
    asyncio.run(save_generated_imagse(generated_imagse, save_path="save_dir", cookies=cookies))

GeminiImage.save method logic

import asyncio
from gemini import Gemini, GeminiImage

async def save_generated_imagse(generated_imagse, save_path="save_dir", cookies=cookies):
    image_data_dict = await GeminiImage.fetch_images_dict(generated_imagse, cookies=cookies)  # Get bytes images dict asynchronously
    await GeminiImage.save_images(image_data_dict, save_path=save_path)  

# Run the async function
if __name__ == "__main__":
    cookies = {"key" : "value"}
    generated_imagse = response.generated_imagse  # Check response images [Dict]
    asyncio.run(save_generated_imagse(generated_imagse, save_path="save_dir", cookies=cookies))

[!NOTE] Use GeminiImage for image processing. web_images works without cookies, but for images like generated_image from Gemini, pass cookies. Cookies are needed to download images from Google's storage. Check the response or use existing cookies variable.


# 05. Retrieving Images from Gemini Responses

Returns images in response of Gemini.

Sync downloader

from gemini import Gemini, GeminiImage

response = GeminiClient.generate_content("Please recommend a travel itinerary for Seoul.")
response_images = response.web_images # Check response images [Dict]

GeminiImage.save_sync(response_images, save_path="save_dir")

# You can use byte type image dict as follow:
# bytes_images_dict = GeminiImage.fetch_bytes_sync(response_images, cookies) # Get bytes images dict
# GeminiImage.save_images_sync(bytes_images_dict, path="save_dir") # Save to path

Async downloader

response = GeminiClient.generate_content("Create illustrations of Seoul, South Korea.")

response_images = response.web_images # Check generated images [Dict]

await GeminiImage.save(response_images, "save_dir")
# image_data_dict = await GeminiImage.fetch_images_dict(response_images)
# await GeminiImage.save_images(image_data_dict, "save_dir")
Async downloader wrapper
import asyncio
from gemini import Gemini, GeminiImage

async def save_response_web_imagse(response_images, save_path="save_dir", cookies=cookies):
    await GeminiImage.save(response_images, save_path=save_path, cookies=cookies)

# Run the async function
if __name__ == "__main__":
    cookies = {"key" : "value"}
    response_images = response.web_images  
    asyncio.run(save_response_web_imagse(response_images, save_path="save_dir", cookies=cookies))

GeminiImage.save method logic

import asyncio
from gemini import Gemini, GeminiImage

async def save_response_web_imagse(response_images, save_path="save_dir", cookies=cookies):
    image_data_dict = await GeminiImage.fetch_images_dict(response_images, cookies=cookies)  # Get bytes images dict asynchronously
    await GeminiImage.save_images(image_data_dict, save_path=save_path)  

# Run the async function
if __name__ == "__main__":
    response_images = response.web_images  # Check response images [Dict]
    asyncio.run(save_response_web_imagse(response_images, save_path="save_dir", cookies=cookies))

# 06. Generate content from images

Takes an image as input and returns a response.

image = 'folder/image.jpg'
# image = open('folder/image.jpg', 'rb').read() # (jpg, jpeg, png, webp) are supported.

response = GeminiClient.generate_content("What does the text in this image say?", image=image)
response.response_dict

# 07. Generate content using Google Services

To begin, you must link Google Workspace to activate this extension via the Gemini web extension. Please refer to the official notice and review the privacy policies for more details.

extention flags

@Gmail, @Google Drive, @Google Docs, @Google Maps, @Google Flights, @Google Hotels, @YouTube
response = GeminiClient.generate_content("@YouTube Search clips related with Google Gemini")
response.response_dict
Extension description
  • Google Workspace

    • Services: @Gmail, @Google Drive, @Google Docs
    • Description: Summarize, search, and find desired information quickly in your content for efficient personal task management.
    • Features: Information retrieval, document summarization, information categorization
  • Google Maps

    • Service: @Google Maps
    • Description: Execute plans using location-based information. Note: Google Maps features may be limited in some regions.
    • Features: Route guidance, nearby search, navigation
  • Google Flights

    • Service: @Google Flights
    • Description: Search real-time flight information to plan tailored travel itineraries.
    • Features: Holiday preparation, price comparison, trip planning
  • Google Hotels

    • Service: @Google Hotels
    • Description: Search for hotels considering what matters most to you, like having a conversation with a friend.
    • Features: Packing for travel, sightseeing, special relaxation
  • YouTube

    • Service: @YouTube
    • Description: Explore YouTube videos and ask questions about what interests you.
    • Features: Problem-solving, generating ideas, search, exploring topics

# 08. Fix context setting rcid

You can specify a particular response by setting its response candidate id(rcid).

# Generate content for the prompt "Give me some information about the USA."
response1 = GeminiClient.generate_content("Give me some information about the USA.")
# After reviewing the responses, choose the one you prefer and copy its RCID.
GeminiClient.rcid = "rc_xxxx"

# Now, generate content for the next prompt "How long does it take from LA to New York?"
response2 = GeminiClient.generate_content("How long does it take from LA to New York?")

# 09. Changing the Selected Response from 0 to n

In Gemini, generate_content returns the first response. This may vary depending on length or sorting. Therefore, you can specify the index of the chosen response from 0 to n as follows. However, if there is only one response, revert it back to 0.

from gemini import GeminiModelOutput
GeminiModelOutput.chosen = 1 # default is 0
response1 = GeminiClient.generate_content("Give me some information about the USA.")

# 10. Generate custom content

Parse the response text to extract desired values.

https://github.com/dsdanielpark/Gemini-API/blob/fdf064c57bc1fb47fbbb4b93067618a200e77f62/gemini/core.py#L317

Using Gemini.generate_custom_content, specify custom parsing to extract specific values. Utilize ParseMethod1 and ParseMethod2 by default, and you can pass custom parsing methods as arguments if desired. Refer to custom_parser.py.

# You can create a parser method that takes response_text as the input for custom_parser.
response_text, response_status = GeminiClient.send_request("Give me some information about the USA.")

# Use custom_parser function or class inheriting from BaseParser
response = GeminiClient.generate_custom_content("Give me some information about the USA.", *custom_parser)

Further

Use rotating proxies

If you want to avoid blocked requests and bans, then use Smart Proxy by Crawlbase. It forwards your connection requests to a randomly rotating IP address in a pool of proxies before reaching the target website. The combination of AI and ML make it more effective to avoid CAPTCHAs and blocks.

# Get your proxy url at crawlbase https://crawlbase.com/docs/smart-proxy/get/
proxy_url = "http://xxxxx:@smartproxy.crawlbase.com:8012" 
proxies = {"http": proxy_url, "https": proxy_url}

GeminiClient = Gemini(cookies=cookies, proxies=proxies, timeout=30)
GeminiClient.generate_content("Hello, Gemini. Give me a beautiful photo of Seoul's scenery.")

Reusable session object

Gemini class suffices for most cases, but use session objects for special cases.

from gemini import Gemini, HEADERS
import requests

cookies = {} 

session = requests.Session()
session.headers = HEADERS
for key, value in cookies.items():
    session.cookies.update({key: value})

GeminiClient = Gemini(session=session) # You can use various args
response = GeminiClient.generate_content("Hello, Gemini. What's the weather like in Seoul today?")

More features

Explore additional features in this document.

If you want to develop your own simple code, you can start from this simple code example.


Open-source LLM, Gemma

If you have sufficient GPU resources, you can download weights directly instead of using the Gemini API to generate content. Consider Gemma, an open-source model available for on-premises use.

Gemma models are Google's lightweight, advanced text-to-text, decoder-only language models, derived from Gemini research. Available in English, they offer open weights and variants, ideal for tasks like question answering and summarization. Their small size enables deployment in resource-limited settings, broadening access to cutting-edge AI. For more infomation, visit Gemma-7b model card.

How to use Gemma

from transformers import AutoTokenizer, AutoModelForCausalLM

tokenizer = AutoTokenizer.from_pretrained("google/gemma-7b")
model = AutoModelForCausalLM.from_pretrained("google/gemma-7b")

input_text = "Write me a poem about Machine Learning."
input_ids = tokenizer(input_text, return_tensors="pt")

outputs = model.generate(**input_ids)
print(tokenizer.decode(outputs[0]))

FAQ

You can find most help on the FAQ and Issue pages. Alternatively, utilize the official Gemini API at Google AI Studio.

Issues

Sincerely grateful for any reports on new features or bugs. Your valuable feedback on the code is highly appreciated. Frequent errors may occur due to changes in Google's service API interface. Both Issue reports and Pull requests contributing to improvements are always welcome. We strive to maintain an active and courteous open community.

Sponsor

Use Crawlbase API for efficient data scraping to train AI models, boasting a 98% success rate and 99.9% uptime. It's quick to start, GDPR/CCPA compliant, supports massive data extraction, and is trusted by 70k+ developers.

Contributors

We would like to express our sincere gratitude to all the contributors.

This package aims to re-implement the functionality of the Bard API, which has been archived for the contributions of the beloved open-source community, despite Gemini's official API already being available.

Contributors to the Bard API and Gemini API.


Further development potential

Modifications to the async client using my logic are needed, along with automatic cookie collection via browser_cookie3, and implementation of other Bard API features (such as code extraction, export to Replit, graph drawing, etc.).

Please note that while reviewing automatic cookie collection, it appears that cookies expire immediately upon sending a request for collection. Efforts to make it more user-friendly were unsuccessful. Also, the _sid value seems to work normally even when returned as None.

Lastly, if the CustomParser and ResponseParser algorithms do not function properly, new parsing methods can be updated through conditional statements in the relevant sections.

I do not plan to actively curate this repository. Please review HanaokaYuzu/Gemini-API first.

Thank you, and have a great day.

Contacts

Core maintainers:

License ©️

MIT license, 2024. We hereby strongly disclaim any explicit or implicit legal liability related to our works. Users are required to use this package responsibly and at their own risk. This project is a personal initiative and is not affiliated with or endorsed by Google. It is recommended to use Google's official API.

References

[1] Github: acheong08/Bard
[2] GitHub: HanaokaYuzu/Gemini-API
[3] Github: dsdanielpark/Bard-API
[4] Github: GoogleCloudPlatform/generative-ai
[5] WebSite: Google AI Studio

Warning Users assume full legal responsibility for GeminiAPI. Not endorsed by Google. Excessive use may lead to account restrictions. Changes in policies or account status may affect functionality. Utilize issue and discussion pages.


Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

python-gemini-api-2.2.1.tar.gz (38.4 kB view details)

Uploaded Source

Built Distribution

python_gemini_api-2.2.1-py3-none-any.whl (35.6 kB view details)

Uploaded Python 3

File details

Details for the file python-gemini-api-2.2.1.tar.gz.

File metadata

  • Download URL: python-gemini-api-2.2.1.tar.gz
  • Upload date:
  • Size: 38.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.9.12

File hashes

Hashes for python-gemini-api-2.2.1.tar.gz
Algorithm Hash digest
SHA256 295303378dfe7b04e32a2a81bd2cadbe9ad0ef1354960ecb74e061f559d9ccc7
MD5 a789421b549a3ce0963ef2c4c762e700
BLAKE2b-256 73f4b04743639a826c371ca8bae068bfdda4dabc8e85cd32dfe63cc7f32b6820

See more details on using hashes here.

File details

Details for the file python_gemini_api-2.2.1-py3-none-any.whl.

File metadata

File hashes

Hashes for python_gemini_api-2.2.1-py3-none-any.whl
Algorithm Hash digest
SHA256 38b3c6f75db5670fdc780d1c77f1eab1509577ea99a52d170f343cc9d68c1d03
MD5 9b1c20bb46104d4ce683864f79019c3d
BLAKE2b-256 c4603e136982877bc58e3e041596f1cdd0557fcea188c213c337d2e2fa01f01d

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page