*非公式Python ラッパー python-gemini-api は、認証の問題が頻繁に発生するユーザー、または Google 認証を使用できないユーザーのために利用できます。このラッパーは、Cookie 値を使用して、リバース エンジニアリングを通じて Google Gemini と対話します。このプロジェクトにはアントニオ・チョンとのコラボレーションが含まれていました。
公式側では、Google は部分的に無料でクリーンな公式 Gemini API と SDK を提供しており、これらは Python パッケージ google-generativeai 経由で簡単にアクセスして利用できます。
ヒント
| 2024-03-26 | [コード例を参照]
Open Router を使用して、一時的に無料のオープンソース LLM API を確認してください。 (無料制限:10リクエスト/分)
| 2024-05-20 |地域/国 (IP) およびアカウントに応じてロジックにいくつかの変更があります。ユーザーは、自分にとって適切なロジックを見つけるために、以下を確認する必要があります。このパッケージは、最も一般的な使用例に引き続き適しています。
BOT_SERVER
パラメータself._sid
self._rcid
|紙 |公式ウェブサイト |公式API | API ドキュメント |
Gemini は、Google DeepMind によって開発された生成 AI モデルのファミリーであり、マルチモーダルなユースケース向けに設計されています。 Gemini API を使用すると、Gemini Pro および Gemini Pro Vision モデルにアクセスできます。 2024 年 2 月に、Google のBardサービスはGeminiに変更されました。
モデル | タイプ | アクセス | 詳細 |
---|---|---|---|
ジェミニ | 独自の | API [13] | Gemini Pro や Gemini Pro Vision などの先進モデルを含む、Google DeepMind による独自のマルチモーダル AI。アクセスは API の使用に制限されます。さらなる洞察は、論文やウェブサイトを通じて得られるかもしれません。 [1][2] |
ジェマ | オープンソース | ダウンロード可能 無料API | QA や要約などのタスクに適したオープンソースのテキスト間言語モデル。重量はオンプレミスで使用するためにダウンロードでき、詳細なドキュメントは紙と Web サイトで提供されます。 [3][4] |
コードジェマ | オープンソース | ダウンロード可能 | プログラミング タスク専用に設計されたこのオープンソース モデルは、コード生成や同様のアクティビティで開発者を支援するダウンロード可能な重みを提供します。詳細については、関連する論文、ブログ投稿、および Hugging Face コレクションを参照してください。 [5][6][7] |
これは Bard API プロジェクトから派生した Python ラッパーで、Gemini Web から REST 形式で応答を取得するように設計されています。レート制限とブロックに関する懸念があるため、Gemini では非同期クライアントよりも同期クライアントが優先されます。
pip install python-gemini-api
pip install git+https://github.com/dsdanielpark/Gemini-API.git
更新されたバージョンの場合は、次のように使用します。
pip install -q -U python-gemini-api
https://gemini.google.com/ にアクセスしてください
ブラウザを開いた状態で、まず Cookie の自動収集を試してください。
from gemini import Gemini
client = Gemini ( auto_cookies = True )
# Testing needed as cookies vary by region.
# client = Gemini(auto_cookies=True, target_cookies=["__Secure-1PSID", "__Secure-1PSIDTS"])
# client = Gemini(auto_cookies=True, target_cookies="all") # You can pass whole cookies
response = client . generate_content ( "Hello, Gemini. What's the weather like in Seoul today?" )
print ( response . payload )
(手動)ブラウザ コンソールのF12
→ Session: Application
→ Cookies
→ いくつかの動作している Cookie セットの値をコピーします。うまくいかない場合は、ステップ 3 に進みます。
まず、 __Secure-1PSIDCC
単独で試してください。機能しない場合は、 __Secure-1PSID
および__Secure-1PSIDTS
を使用してください。まだ成功しませんか?次の 4 つの Cookie を試してください: __Secure-1PSIDCC
、 __Secure-1PSID
、 __Secure-1PSIDTS
、 NID
。どれも機能しない場合は、ステップ 3 に進み、Cookie ファイル全体を送信することを検討してください。
(推奨)ブラウザ拡張機能を介して Gemini サイトの Cookie をエクスポートします。たとえば、Chrome 拡張機能 ExportThisCookies を使用して、txt ファイルの内容を開いてコピーします。
重要
さまざまな Google アカウントとブラウザ設定を試して、機能する Cookie を見つけてください。成功は IP とアカウントのステータスによって異なる場合があります。一度接続すると、Cookie は通常 1 か月間有効のままになります。成功するまでテストを続けます。
コンテンツの生成:解析された応答を返します。
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 response = client . generate_content ( "Hello, Gemini. What's the weather like in Seoul today?" ) response . payload
画像からコンテンツを生成:画像を入力として使用できます。
from gemini import Gemini cookies = { "" : "" } 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' ) response . payload
注記
generate_content メソッドが空のペイロードを返した場合は、Gemini オブジェクトを再初期化せずにメソッドを再実行してください。
環境変数を使用して言語と Gemini バージョンを設定します。
Gemini 応答言語の設定 (オプション): サポートされている言語をここで確認します。デフォルトは英語です。
import os
os . environ [ "GEMINI_LANGUAGE" ] = "KR" # Setting Gemini response language (Optional)
os . environ [ "GEMINI_ULTRA" ] = "1" # Switch to Gemini-advanced response (Experimental, Optional)
# In some accounts, access to Gemini Ultra may not be available. If that's the case, please revert it back to "0".
cookies
dict 形式で明示的に宣言してください。 cookie_fp
を使用して、Cookie を含むファイルへのパスを入力することもできます (*.json、*.txt をサポート)。アセットフォルダー内のサンプル Cookie ファイルを確認します。
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.
}
client = Gemini ( cookies = cookies )
# client = Gemini(cookie_fp="folder/cookie_file.json") # (*.json, *.txt) are supported.
# client = Gemini(auto_cookies=True) # Or use auto_cookies paprameter
auto_cookie
True
に設定し、 target_cookies
調整します。 Gemini WebUI がブラウザーでアクティブになっている必要があります。更新がまだ完了していない可能性がありますが、browser_cookie3 は Cookie の自動収集を有効にします。
Gemini の応答を返しますが、最初の応答は空である可能性があります。
from gemini import Gemini
cookies = {}
client = Gemini ( cookies = cookies )
prompt = "Tell me about Large Language Model."
response = client . generate_content ( prompt )
print ( response . payload )
重要
同じプロンプトを繰り返し送信しないでください。セッションが正常に接続され、 generate_content
正常に実行される場合は、Gemini Web サイトを閉じます。 Gemini Web がブラウザーで開いたままの場合、Cookie の有効期限が早く切れる可能性があります。
generate_content 関数の出力は、次の構造を持つGeminiModelOutput
です。
Gemini-API/gemini/src/model/output.py
fdf064c の 16 行目
リクエストの送信: リクエストのペイロードと status_code を返し、デバッグを容易にします。
from gemini import Gemini
cookies = {}
client = Gemini ( cookies = cookies )
response_text , response_status = client . send_request ( "Hello, Gemini. Tell me about Large Language Models." )
print ( response_text )
Gemini
クラス内のrequest_count
プロパティにアクセスすることで、行われたリクエストの合計数を追跡できます。
Gemini によって生成されたテキストを返します。
from gemini import Gemini
cookies = {}
client = Gemini ( cookies = cookies )
prompt = "Hello, Gemini. Tell me about Large Language Models."
response = client . generate_content ( prompt )
print ( response . text )
Gemini によって生成された画像を返します。
非同期ダウンローダー
from gemini import Gemini , GeminiImage
cookies = {}
client = Gemini ( cookies = cookies )
response = client . generate_content ( "Hello, Gemini. Tell me about Large Language Models." )
generated_images = response . generated_images # Check generated images [Dict]
await GeminiImage . save ( generated_images , "output" , cookies )
# image_data_dict = await GeminiImage.fetch_images_dict(generated_images, cookies)
# await GeminiImage.save_images(image_data_dict, "output")
IPython で画像を表示する画像を表示したり、バイト形式で別のアプリケーションに送信したりできます。
import io
from gemini import Gemini , GeminiImage
from IPython . display import display , Image
cookies = {}
client = Gemini ( cookies = cookies )
bytes_images_dict = GeminiImage . fetch_images_dict_sync ( generated_images , cookies ) # Get bytes images dict
for image_name , image_bytes in bytes_images_dict . items ():
print ( image_name )
image = Image ( data = image_bytes )
display ( image )
同期ダウンローダー
from gemini import Gemini , GeminiImage
cookies = {}
client = Gemini ( 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 = "output" , 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) # Get bytes images dict
# GeminiImage.save_images_sync(bytes_images_dict, path="output") # Save to dir
非同期ダウンローダー ラッパー
import asyncio
from gemini import GeminiImage
async def save_generated_images ( generated_images , save_path = "output" , cookies = cookies ):
await GeminiImage . save ( generated_images , save_path = save_path , cookies = cookies )
# Run the async function
if __name__ == "__main__" :
cookies = {}
client = Gemini ( cookies = cookies )
response = client . generate_content ( "Create illustrations of Seoul, South Korea." )
generated_images = response . generated_images
asyncio . run ( save_generated_images ( generated_images , save_path = "output" , cookies = cookies ))
GeminiImage.save
メソッドのロジック
import asyncio
from gemini import Gemini , GeminiImage
async def save_generated_images ( generated_images , save_path = "output" , cookies = cookies ):
image_data_dict = await GeminiImage . fetch_images_dict ( generated_images , 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 = {}
client = Gemini ( cookies = cookies )
response = client . generate_content ( "Create illustrations of Seoul, South Korea." )
generated_images = response . generated_images
asyncio . run ( save_generated_images ( generated_images , save_path = "output" , cookies = cookies ))
注記
画像処理には GeminiImage を使用します。 web_images
Cookie なしで動作しますが、Gemini のgenerated_image
のような画像の場合は、Cookie を渡します。 Google のストレージから画像をダウンロードするには Cookie が必要です。応答を確認するか、既存の Cookie 変数を使用します。
Gemini に応答して画像を返します。
非同期ダウンローダー
from gemini import Gemini , GeminiImage
cookies = {}
client = Gemini ( cookies = cookies )
response = client . generate_content ( "Give me a picture of Stanford." )
response_images = response . web_images # Check generated images
await GeminiImage . save ( response_images , "output" )
# image_data_dict = await GeminiImage.fetch_images_dict(response_images)
# await GeminiImage.save_images(image_data_dict, "output")
同期ダウンローダー
from gemini import Gemini , GeminiImage
cookies = {}
client = Gemini ( cookies = cookies )
response = client . generate_content ( "Give me a picture of Stanford." )
response_images = response . web_images # Check response images
GeminiImage . save_sync ( response_images , save_path = "output" )
# You can use byte type image dict as follow:
# bytes_images_dict = GeminiImage.fetch_bytes_sync(response_images) # Get bytes images dict
# GeminiImage.save_images_sync(bytes_images_dict, save_path="output") # Save to path
非同期ダウンローダー ラッパー
import asyncio
from gemini import Gemini , GeminiImage
async def save_response_web_imagse ( response_images , save_path = "output" ):
await GeminiImage . save ( response_images , save_path = save_path )
if __name__ == "__main__" :
cookies = {}
client = Gemini ( cookies = cookies )
response = client . generate_content ( "Give me a picture of Stanford." )
response_images = response . web_images
asyncio . run ( save_response_web_imagse ( response_images , save_path = "output" ))
GeminiImage.save
メソッドのロジック
import asyncio
from gemini import Gemini , GeminiImage
async def save_response_web_imagse ( response_images , save_path = "output" ):
image_data_dict = await GeminiImage . fetch_images_dict ( response_images ) # Get bytes images dict asynchronously
await GeminiImage . save_images ( image_data_dict , save_path = save_path )
# Run the async function
if __name__ == "__main__" :
cookies = {}
client = Gemini ( cookies = cookies )
response = client . generate_content ( "Give me a picture of Stanford." )
response_images = response . web_images
asyncio . run ( save_response_web_imagse ( response_images , save_path = "output" ))
画像を入力として受け取り、応答を返します。
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 )
print ( response )
まず、Gemini ウェブ拡張機能を介して Google Workspace をリンクし、この拡張機能を有効にする必要があります。詳細については、公式通知を参照し、プライバシー ポリシーを確認してください。
拡張フラグ
@Gmail, @Google Drive, @Google Docs, @Google Maps, @Google Flights, @Google Hotels, @YouTube
response = client . generate_content ( "@YouTube Search clips related with Google Gemini" )
response . response_dict
Google ワークスペース
Googleマップ
Google フライト
グーグルのホテル
YouTube
応答候補 ID (RCID) を設定することで、特定の応答を指定できます。
# Generate content for the prompt "Give me some information about the USA."
response1 = client . generate_content ( "Give me some information about the USA." )
# After reviewing the responses, choose the one you prefer and copy its RCID.
client . rcid = "rc_xxxx"
# Now, generate content for the next prompt "How long does it take from LA to New York?"
response2 = client . generate_content ( "How long does it take from LA to New York?" )
# However, RCID may not persist. If parsing fails, reset `client.rcid` to None.
# client.rcid = None
Gemini では、generate_content が最初の応答を返します。これは長さやソートによって異なる場合があります。したがって、次のように、選択した応答のインデックスを 0 からnまで指定できます。ただし、応答が 1 つしかない場合は、0 に戻します。
from gemini import GeminiModelOutput
GeminiModelOutput . chosen = 1 # default is 0
response_choice_1 = client . generate_content ( "Give me some information about the USA." )
# If not all Gemini returns are necessarily plural, revert back to 0 in case of errors.
# GeminiModelOutput.chosen = 0
応答テキストを解析して必要な値を抽出します。
Gemini.generate_custom_content
を使用して、特定の値を抽出するためのカスタム解析を指定します。デフォルトで ParseMethod1 と ParseMethod2 を使用し、必要に応じてカスタム解析メソッドを引数として渡すことができます。 Custom_parser.py を参照してください。
# You can create a parser method that takes response_text as the input for custom_parser.
response_text , response_status = client . send_request ( "Give me some information about the USA." )
# Use custom_parser function or class inheriting from BaseParser
response = client . generate_custom_content ( "Give me some information about the USA." , * custom_parser )
Gemini-API/gemini/client.py
31b8424 の 323 行目
リクエストのブロックや禁止を回避したい場合は、Crawlbase のスマート プロキシを使用してください。接続リクエストは、ターゲット Web サイトに到達する前に、プロキシのプール内でランダムに循環する IP アドレスに転送されます。 AI と ML を組み合わせることで、CAPTCHA とブロックをより効果的に回避できます。 Secure Sockets Layer (SSL) レベルの引数をヘッダーに追加する必要がある場合があります。 verify=False
と組み合わせて使用します。
# 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 , verify = False )
client . session . header [ "crawlbaseAPI-Parameters" ] = "country=US"
client . generate_content ( "Hello, Gemini. Give me a beautiful photo of Seoul's scenery." )
標準的なケースでは、Gemini クラスを使用します。例外の場合は、セッション オブジェクトを使用します。新しいボット Gemini サーバーを作成する場合は、Headers.MAIN を調整します。
import requests
from gemini import Gemini , Headers
cookies = {}
session = requests . Session ()
session . headers = Headers . MAIN
for key , value in cookies . items ():
session . cookies . update ({ key : value })
client = Gemini ( session = session ) # You can use various args
response = client . generate_content ( "Hello, Gemini. Tell me about Large Language Model." )
このドキュメントで追加機能を確認してください。
独自の単純なコードを開発する場合は、この単純なコード例から始めることができます。
必要なものを準備し、Google AI StudioでAPIキーを取得します。 Python 3.9以降にインストールし、発行されたAPIキーを入力します。詳細についてはチュートリアルを参照してください。
pip install -q -U google-generativeai
import google . generativeai as genai
GOOGLE_API_KEY = ""
genai . configure ( api_key = GOOGLE_API_KEY )
model = genai . GenerativeModel ( 'gemini-pro' )
response = model . generate_content ( "Write me a poem about Machine Learning." )
print ( response . text )
十分な GPU リソースがある場合は、Gemini API を使用してコンテンツを生成する代わりに、重みを直接ダウンロードできます。 Gemma と、オンプレミスで使用できるオープンソース モデルであるCode Gemma を検討してください。
Gemma モデルは、Gemini の研究から派生した、Google の軽量で高度なテキストツーテキストのデコーダ専用言語モデルです。英語で利用可能で、オープンウェイトとバリアントが提供されており、質問への回答や要約などのタスクに最適です。詳細については、Gemma-7b モデル カードをご覧ください。
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 ]))
Google からのコード LLM 向けの公式リリースである CodeGemma は、2024 年 4 月 9 日にリリースされました。これは、コードの生成と操作のために特別に設計された 3 つのモデルを提供します。 Code Gemma モデルを探索し、モデル カードで詳細を確認できます。
from transformers import GemmaTokenizer , AutoModelForCausalLM
tokenizer = GemmaTokenizer . from_pretrained ( "google/codegemma-7b-it" )
model = AutoModelForCausalLM . from_pretrained ( "google/codegemma-7b-it" )
input_text = "Write me a Python function to calculate the nth fibonacci number."
input_ids = tokenizer ( input_text , return_tensors = "pt" )
outputs = model . generate ( ** input_ids )
print ( tokenizer . decode ( outputs [ 0 ]))
OpenRouter は、選択したモデルに対して一時的に無料の推論を提供します。 Open Router API から API キーを取得し、Open Router モデルで無料モデルを確認してください。主にトークンコストが 0 ドルのモデルを使用します。他のモデルでは料金が発生する場合があります。詳細については、無料のオープンソース LLM API ガイドをご覧ください。
レート制限とブロックの問題により、Gemini では同期クライアントが非同期よりも好まれますが、OpenRouter は非同期実装用に信頼性の高いオープンソース LLM を提供します。 (無料制限:10リクエスト/分)
from gemini import OpenRouter
OPENROUTER_API_KEY = ""
gemma_client = OpenRouter ( api_key = OPENROUTER_API_KEY , model = "google/gemma-7b-it:free" )
prompt = "Do you know UCA academy in Korea? https://blog.naver.com/ulsancoding"
response = gemma_client . create_chat_completion ( prompt )
print ( response )
# payload = gemma_client.generate_content(prompt)
# print(payload.json())
無料モデルのリストには次のものが含まれます。
google/gemma-7b-it:free
- Google の google/gemma-7b ***mistralai/mistral-7b-instruct:free
- Mistralai/Mistral-7B-Instruct-v0.1 (Mistral AI からの命令用) ****huggingfaceh4/zephyr-7b-beta:free
- ハギングフェイスH4/ゼファー-7b-ベータ ***openchat/openchat-7b:free
- チャット用 openchat/openchat **openrouter/cinematika-7b:free
- jondurbin/cinematika-7b-v0.1undi95/toppy-m-7b:free
- Undi95/Toppy-M-7Bgryphe/mythomist-7b:free
- グリフ/ミソミスト-7bnousresearch/nous-capybara-7b:free
- Nous Research の NousResearch/Nous-Capybara-7B-V1 Crawlbase API を使用して効率的なデータ スクレイピングを行い、AI モデルをトレーニングし、98% の成功率と 99.9% の稼働時間を誇ります。すぐに起動でき、GDPR/CCPA に準拠し、大量のデータ抽出をサポートしており、7 万人以上の開発者から信頼されています。
このパッケージを使用する前に、まず HanaokaYuzu/Gemini-API と公式 Google Gemini API を確認してください。ほとんどのヘルプは FAQ および問題ページで見つけることができます。
新機能やバグに関するご報告に心より感謝いたします。コードに関する貴重なフィードバックをいただければ幸いです。 Google のサービス API インターフェースの変更により、頻繁にエラーが発生する可能性があります。改善に貢献する問題レポートとプル リクエストの両方をいつでも歓迎します。私たちは、活発で礼儀正しいオープンなコミュニティを維持するよう努めています。
喉が渇く前に井戸を掘ってください。
ご寄稿者の皆様に心より感謝申し上げます。
このパッケージは、Gemini の公式 API がすでに利用可能であるにもかかわらず、愛されるオープンソース コミュニティの貢献のためにアーカイブされている Bard API の機能を再実装することを目的としています。
Bard API および Gemini API の貢献者。
私のロジックを使用して非同期クライアントを変更する必要があるほか、browser_cookie3 による自動 Cookie 収集や、他の Bard API 機能 (コード抽出、Replit へのエクスポート、グラフ描画など) の実装が必要です。
自動 Cookie 収集を確認すると、Cookie は収集リクエストを送信するとすぐに期限切れになるように見えることに注意してください。よりユーザーフレンドリーにするための努力は失敗に終わりました。また、_sid 値は None として返された場合でも正常に動作するようです。
最後に、CustomParser および ResponseParser アルゴリズムが適切に機能しない場合は、関連セクションの条件ステートメントを通じて新しい解析メソッドを更新できます。
このリポジトリを積極的に管理するつもりはありません。まず HanaokaYuzu/Gemini-API を確認してください。
ありがとう、そして素晴らしい一日をお過ごしください。
MIT ライセンス、2024。当社は、当社の作品に関連する明示的または黙示的な法的責任をここに強く否認します。ユーザーは、責任を持って自己の責任でこのパッケージを使用する必要があります。このプロジェクトは個人的な取り組みであり、Google と提携または承認されていません。 Google公式APIの利用を推奨します。
警告ユーザーは、GeminiAPI に対する全法的責任を負います。 Google によって承認されていません。過度に使用すると、アカウント制限が発生する可能性があります。ポリシーまたはアカウントのステータスの変更は、機能に影響を与える可能性があります。問題ページとディスカッションページを活用します。
Python 3.7 以降。