Skip to content
This repository has been archived by the owner on Jun 12, 2024. It is now read-only.

Commit

Permalink
doc: update readme code
Browse files Browse the repository at this point in the history
  • Loading branch information
dsdanielpark authored Apr 28, 2024
1 parent ffafb47 commit f6bdb3a
Showing 1 changed file with 85 additions and 29 deletions.
114 changes: 85 additions & 29 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,7 @@ pip install -q -U python-gemini-api
```python
from gemini import Gemini

cookies = {"key" : "value"} # Cookies may vary by account or region. Consider sending the entire cookie file.
cookies = {"<key>" : "<value>"} # Cookies may vary by account or region. Consider sending the entire cookie file.
client = Gemini(cookies=cookies) # You can use various args

response = client.generate_content("Hello, Gemini. What's the weather like in Seoul today?")
Expand All @@ -161,7 +161,7 @@ response.payload
```python
from gemini import Gemini

cookies = {"key" : "value"} # Cookies may vary by account or region. Consider sending the entire cookie file.
cookies = {"<key>" : "<value>"}
client = Gemini(cookies=cookies) # You can use various args

response = client.generate_content("What does the text in this image say?", image='folder/image.jpg')
Expand Down Expand Up @@ -225,6 +225,11 @@ Returns Gemini's response, but the first one might be empty.


```python
from gemini import Gemini

cookies = {}
client = Gemini(cookies=cookies)

prompt = "Hello, Gemini. What's the weather like in Seoul today?"
response = client.generate_content(prompt)
print(response.payload)
Expand Down Expand Up @@ -256,8 +261,8 @@ Send request: returns the request's payload and status_code, making debugging ea
```python
from gemini import Gemini

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

response_text, response_status = client.send_request("Hello, Gemini. What's the weather like in Seoul today?")
print(response_text)
Expand All @@ -269,6 +274,11 @@ You can track the total number of requests made by accessing the `request_count`
### # 04. Text generation
Returns text generated by Gemini.
```python
from gemini import Gemini

cookies = {}
client = Gemini(cookies=cookies)

prompt = "Hello, Gemini. What's the weather like in Seoul today?"
response = client.generate_content(prompt)
print(response.text)
Expand All @@ -283,13 +293,19 @@ Returns images generated by Gemini.
*Async downloader*

```python
from gemini import Gemini, GeminiImage

cookies = {}
client = Gemini(cookies=cookies)
image_client = GeminiImage(cookies=cookies)

response = client.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")
await image_client.save(generated_images, "save_dir", cookies=cookies)
# image_data_dict = await image_client.fetch_images_dict(generated_images, cookies=cookies)
# await image_client.save_images(image_data_dict, "save_dir")
```


Expand All @@ -299,9 +315,15 @@ await GeminiImage.save(generated_images, "save_dir", cookies=cookies)
You can display the image or transmit it to another application in byte format.

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

cookies = {}
client = Gemini(cookies=cookies)
image_client = GeminiImage(cookies=cookies)

bytes_images_dict = image_client.fetch_images_dict_sync(generated_images, cookies) # Get bytes images dict

for image_name, image_bytes in bytes_images_dict.items():
print(image_name)
Expand All @@ -314,14 +336,18 @@ await GeminiImage.save(generated_images, "save_dir", cookies=cookies)
```python
from gemini import Gemini, GeminiImage

cookies = {}
client = Gemini(cookies=cookies)
image_client = GeminiImage(cookies=cookies)

response = client.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)
image_client.save_sync(generated_images, save_path="save_dir", cookies=cookies) # Save default folder is `cached`

# 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
# bytes_images_dict = image_client.fetch_images_dict_sync(generated_images, cookies=cookies) # Get bytes images dict
# image_client.save_images_sync(bytes_images_dict, path="save_dir", cookies=cookies) # Save to path
```

*Async downloader wrapper*
Expand All @@ -330,8 +356,12 @@ GeminiImage.save_sync(generated_images, save_path="save_dir", cookies=cookies)
import asyncio
from gemini import Gemini, GeminiImage

cookies = {}
client = Gemini(cookies=cookies)
image_client = GeminiImage(cookies=cookies)

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

# Run the async function
if __name__ == "__main__":
Expand All @@ -342,13 +372,17 @@ if __name__ == "__main__":

`GeminiImage.save` method logic

```
```python
import asyncio
from gemini import Gemini, GeminiImage

cookies = {}
client = Gemini(cookies=cookies)
image_client = GeminiImage(cookies=cookies)

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)
image_data_dict = await image_client.fetch_images_dict(generated_imagse, cookies=cookies) # Get bytes images dict asynchronously
await image_client.save_images(image_data_dict, save_path=save_path)

# Run the async function
if __name__ == "__main__":
Expand All @@ -370,13 +404,19 @@ Returns images in response of Gemini.

*Async downloader*
```python
from gemini import Gemini, GeminiImage

cookies = {}
client = Gemini(cookies=cookies)
image_client = GeminiImage(cookies=cookies)

response = client.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")
await image_client.save(response_images, "save_dir")
# image_data_dict = await image_client.fetch_images_dict(response_images)
# await image_client.save_images(image_data_dict, "save_dir")
```

<details><summary>Further</summary>
Expand All @@ -386,40 +426,52 @@ await GeminiImage.save(response_images, "save_dir")
```python
from gemini import Gemini, GeminiImage

cookies = {}
client = Gemini(cookies=cookies)
image_client = GeminiImage(cookies=cookies)

response = client.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
# bytes_images_dict = image_client.fetch_bytes_sync(response_images, cookies) # Get bytes images dict
# image_client.save_images_sync(bytes_images_dict, path="save_dir") # Save to path
```

*Async downloader wrapper*
```python
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)
cookies = {}
client = Gemini(cookies=cookies)
image_client = GeminiImage(cookies=cookies)

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

# 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))
asyncio.run(save_response_web_imagse(response_images, save_path="save_dir"))
```

`GeminiImage.save` method logic

```
```python
import asyncio
from gemini import Gemini, GeminiImage

cookies = {}
client = Gemini(cookies=cookies)
image_client = GeminiImage(cookies=cookies)

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)
image_data_dict = await image_client.fetch_images_dict(response_images, cookies=cookies) # Get bytes images dict asynchronously
await image_client.save_images(image_data_dict, save_path=save_path)

# Run the async function
if __name__ == "__main__":
Expand All @@ -438,6 +490,7 @@ 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.

# Image file path or Byte-formatted image array
response = client.generate_content("What does the text in this image say?", image=image)
response.response_dict
```
Expand Down Expand Up @@ -541,17 +594,20 @@ https://github.com/dsdanielpark/Gemini-API/blob/31b842488bbc5429ad9c74b1d8b00e20

### Use rotating proxies via [Smart Proxy by Crawlbase](https://crawlbase.com/docs/smart-proxy/?utm_source=github_ad&utm_medium=social&utm_campaign=bard_api)

If you want to **avoid blocked requests** and bans, then use [Smart Proxy by Crawlbase](https://crawlbase.com/docs/smart-proxy/?utm_source=github_ad&utm_medium=social&utm_campaign=bard_api). 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.
If you want to **avoid blocked requests** and bans, then use [Smart Proxy by Crawlbase](https://crawlbase.com/docs/smart-proxy/?utm_source=github_ad&utm_medium=social&utm_campaign=bard_api). 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. The argument at the [Secure Sockets Layer (SSL)](https://en.wikipedia.org/wiki/Transport_Layer_Security) level may need to be added to the header. Use it in conjunction with `verify=False`.

```python
# 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}

client = Gemini(cookies=cookies, proxies=proxies, timeout=30)
client = Gemini(cookies=cookies, proxies=proxies, timeout=30, verify=False)
client.session.header["crawlbaseAPI-Parameters"] = "country=US"
client.generate_content("Hello, Gemini. Give me a beautiful photo of Seoul's scenery.")
```



### Reusable session object
For standard cases, use Gemini class; for exceptions, use session objects. When creating a new bot Gemini server, adjust Headers.MAIN.
```python
Expand Down

0 comments on commit f6bdb3a

Please sign in to comment.