Gemini APIを使う

[2024-12-15追記] Gemini 2.0 (experimental) のページの下に書いてあるように、新しい Google Gen AI SDK (experimental) が出ました。これは pip install google-genai で入れるもので、従来の pip install google-generativeai で入れるものとは別物です。

[2024-11-09追記] Gemini is now accessible from the OpenAI Library というわけでOpenAIのAPIを使うの方法がそのまま使えるようになりました。ドキュメントにも OpenAI compatibility が加わりました。

Gemini API: Quickstart with Pythonに従って、Pythonパッケージを

pip install google-generativeai

でインストールすれば、

import google.generativeai as genai

で使えるようになる。

Google AI StudioのAPI keysで「Create API key in new project」を選んでAPIキーを発行してもらう。キーは

export GOOGLE_API_KEY="..."

のようにして環境変数としておくと勝手に使ってもらえるが、うまくいかなければ

genai.configure(api_key="...")

で指定する。

list(genai.list_models())

と打ち込めば、使えるモデルが一覧できる。例:

[Model(name='models/chat-bison-001',
       base_model_id='',
       version='001',
       display_name='PaLM 2 Chat (Legacy)',
       description='A legacy text-only model optimized for chat conversations',
       input_token_limit=4096,
       output_token_limit=1024,
       supported_generation_methods=['generateMessage', 'countMessageTokens'],
       temperature=0.25,
       max_temperature=None,
       top_p=0.95,
       top_k=40),
 Model(name='models/text-bison-001',
       base_model_id='',
       version='001',
       display_name='PaLM 2 (Legacy)',
       description='A legacy model that understands text and generates text as an output',
       input_token_limit=8196,
       output_token_limit=1024,
       supported_generation_methods=['generateText', 'countTextTokens', 'createTunedTextModel'],
       temperature=0.7,
       max_temperature=None,
       top_p=0.95,
       top_k=40),
 Model(name='models/embedding-gecko-001',
       base_model_id='',
       version='001',
       display_name='Embedding Gecko',
       description='Obtain a distributed representation of a text.',
       input_token_limit=1024,
       output_token_limit=1,
       supported_generation_methods=['embedText', 'countTextTokens'],
       temperature=None,
       max_temperature=None,
       top_p=None,
       top_k=None),
 Model(name='models/gemini-1.0-pro-latest',
       base_model_id='',
       version='001',
       display_name='Gemini 1.0 Pro Latest',
       description=('The original Gemini 1.0 Pro model. This model will be discontinued on '
                    'February 15th, 2025. Move to a newer Gemini version.'),
       input_token_limit=30720,
       output_token_limit=2048,
       supported_generation_methods=['generateContent', 'countTokens'],
       temperature=0.9,
       max_temperature=None,
       top_p=1.0,
       top_k=None),
 Model(name='models/gemini-1.0-pro',
       base_model_id='',
       version='001',
       display_name='Gemini 1.0 Pro',
       description='The best model for scaling across a wide range of tasks',
       input_token_limit=30720,
       output_token_limit=2048,
       supported_generation_methods=['generateContent', 'countTokens'],
       temperature=0.9,
       max_temperature=None,
       top_p=1.0,
       top_k=None),
 Model(name='models/gemini-pro',
       base_model_id='',
       version='001',
       display_name='Gemini 1.0 Pro',
       description='The best model for scaling across a wide range of tasks',
       input_token_limit=30720,
       output_token_limit=2048,
       supported_generation_methods=['generateContent', 'countTokens'],
       temperature=0.9,
       max_temperature=None,
       top_p=1.0,
       top_k=None),
 Model(name='models/gemini-1.0-pro-001',
       base_model_id='',
       version='001',
       display_name='Gemini 1.0 Pro 001 (Tuning)',
       description=('The original Gemini 1.0 Pro model version that supports tuning. Gemini 1.0 '
                    'Pro will be discontinued on February 15th, 2025. Move to a newer Gemini '
                    'version.'),
       input_token_limit=30720,
       output_token_limit=2048,
       supported_generation_methods=['generateContent', 'countTokens', 'createTunedModel'],
       temperature=0.9,
       max_temperature=None,
       top_p=1.0,
       top_k=None),
 Model(name='models/gemini-1.0-pro-vision-latest',
       base_model_id='',
       version='001',
       display_name='Gemini 1.0 Pro Vision',
       description=('The original Gemini 1.0 Pro Vision model version which was optimized for '
                    'image understanding. Gemini 1.0 Pro Vision was deprecated on July 12, 2024. '
                    'Move to a newer Gemini version.'),
       input_token_limit=12288,
       output_token_limit=4096,
       supported_generation_methods=['generateContent', 'countTokens'],
       temperature=0.4,
       max_temperature=None,
       top_p=1.0,
       top_k=32),
 Model(name='models/gemini-pro-vision',
       base_model_id='',
       version='001',
       display_name='Gemini 1.0 Pro Vision',
       description=('The original Gemini 1.0 Pro Vision model version which was optimized for '
                    'image understanding. Gemini 1.0 Pro Vision was deprecated on July 12, 2024. '
                    'Move to a newer Gemini version.'),
       input_token_limit=12288,
       output_token_limit=4096,
       supported_generation_methods=['generateContent', 'countTokens'],
       temperature=0.4,
       max_temperature=None,
       top_p=1.0,
       top_k=32),
 Model(name='models/gemini-1.5-pro-latest',
       base_model_id='',
       version='001',
       display_name='Gemini 1.5 Pro Latest',
       description=('Alias that points to the most recent production (non-experimental) release '
                    'of Gemini 1.5 Pro, our mid-size multimodal model that supports up to 2 '
                    'million tokens.'),
       input_token_limit=2000000,
       output_token_limit=8192,
       supported_generation_methods=['generateContent', 'countTokens'],
       temperature=1.0,
       max_temperature=2.0,
       top_p=0.95,
       top_k=40),
 Model(name='models/gemini-1.5-pro-001',
       base_model_id='',
       version='001',
       display_name='Gemini 1.5 Pro 001',
       description=('Stable version of Gemini 1.5 Pro, our mid-size multimodal model that '
                    'supports up to 2 million tokens, released in May of 2024.'),
       input_token_limit=2000000,
       output_token_limit=8192,
       supported_generation_methods=['generateContent', 'countTokens', 'createCachedContent'],
       temperature=1.0,
       max_temperature=2.0,
       top_p=0.95,
       top_k=64),
 Model(name='models/gemini-1.5-pro-002',
       base_model_id='',
       version='002',
       display_name='Gemini 1.5 Pro 002',
       description=('Stable version of Gemini 1.5 Pro, our mid-size multimodal model that '
                    'supports up to 2 million tokens, released in September of 2024.'),
       input_token_limit=2000000,
       output_token_limit=8192,
       supported_generation_methods=['generateContent', 'countTokens', 'createCachedContent'],
       temperature=1.0,
       max_temperature=2.0,
       top_p=0.95,
       top_k=40),
 Model(name='models/gemini-1.5-pro',
       base_model_id='',
       version='001',
       display_name='Gemini 1.5 Pro',
       description=('Stable version of Gemini 1.5 Pro, our mid-size multimodal model that '
                    'supports up to 2 million tokens, released in May of 2024.'),
       input_token_limit=2000000,
       output_token_limit=8192,
       supported_generation_methods=['generateContent', 'countTokens'],
       temperature=1.0,
       max_temperature=2.0,
       top_p=0.95,
       top_k=40),
 Model(name='models/gemini-1.5-pro-exp-0801',
       base_model_id='',
       version='exp-0801',
       display_name='Gemini 1.5 Pro Experimental 0801',
       description=('Experimental release (August 1st, 2024) of Gemini 1.5 Pro, our mid-size '
                    'multimodal model that supports up to 2 million tokens, with across the board '
                    'improvements. Replaced by Gemini-1.5-pro-002 (stable).'),
       input_token_limit=2000000,
       output_token_limit=8192,
       supported_generation_methods=['generateContent', 'countTokens'],
       temperature=1.0,
       max_temperature=2.0,
       top_p=0.95,
       top_k=64),
 Model(name='models/gemini-1.5-pro-exp-0827',
       base_model_id='',
       version='exp-1206',
       display_name='Gemini Experimental 1206',
       description='Experimental release (December 6th, 2024) of Gemini.',
       input_token_limit=2097152,
       output_token_limit=8192,
       supported_generation_methods=['generateContent', 'countTokens'],
       temperature=1.0,
       max_temperature=2.0,
       top_p=0.95,
       top_k=64),
 Model(name='models/gemini-1.5-flash-latest',
       base_model_id='',
       version='001',
       display_name='Gemini 1.5 Flash Latest',
       description=('Alias that points to the most recent production (non-experimental) release '
                    'of Gemini 1.5 Flash, our fast and versatile multimodal model for scaling '
                    'across diverse tasks.'),
       input_token_limit=1000000,
       output_token_limit=8192,
       supported_generation_methods=['generateContent', 'countTokens'],
       temperature=1.0,
       max_temperature=2.0,
       top_p=0.95,
       top_k=40),
 Model(name='models/gemini-1.5-flash-001',
       base_model_id='',
       version='001',
       display_name='Gemini 1.5 Flash 001',
       description=('Stable version of Gemini 1.5 Flash, our fast and versatile multimodal model '
                    'for scaling across diverse tasks, released in May of 2024.'),
       input_token_limit=1000000,
       output_token_limit=8192,
       supported_generation_methods=['generateContent', 'countTokens', 'createCachedContent'],
       temperature=1.0,
       max_temperature=2.0,
       top_p=0.95,
       top_k=64),
 Model(name='models/gemini-1.5-flash-001-tuning',
       base_model_id='',
       version='001',
       display_name='Gemini 1.5 Flash 001 Tuning',
       description=('Version of Gemini 1.5 Flash that supports tuning, our fast and versatile '
                    'multimodal model for scaling across diverse tasks, released in May of 2024.'),
       input_token_limit=16384,
       output_token_limit=8192,
       supported_generation_methods=['generateContent', 'countTokens', 'createTunedModel'],
       temperature=1.0,
       max_temperature=2.0,
       top_p=0.95,
       top_k=64),
 Model(name='models/gemini-1.5-flash',
       base_model_id='',
       version='001',
       display_name='Gemini 1.5 Flash',
       description=('Alias that points to the most recent stable version of Gemini 1.5 Flash, our '
                    'fast and versatile multimodal model for scaling across diverse tasks.'),
       input_token_limit=1000000,
       output_token_limit=8192,
       supported_generation_methods=['generateContent', 'countTokens'],
       temperature=1.0,
       max_temperature=2.0,
       top_p=0.95,
       top_k=40),
 Model(name='models/gemini-1.5-flash-exp-0827',
       base_model_id='',
       version='exp-1206',
       display_name='Gemini Experimental 1206',
       description='Experimental release (December 6th, 2024) of Gemini.',
       input_token_limit=2097152,
       output_token_limit=8192,
       supported_generation_methods=['generateContent', 'countTokens'],
       temperature=1.0,
       max_temperature=2.0,
       top_p=0.95,
       top_k=64),
 Model(name='models/gemini-1.5-flash-002',
       base_model_id='',
       version='002',
       display_name='Gemini 1.5 Flash 002',
       description=('Stable version of Gemini 1.5 Flash, our fast and versatile multimodal model '
                    'for scaling across diverse tasks, released in September of 2024.'),
       input_token_limit=1000000,
       output_token_limit=8192,
       supported_generation_methods=['generateContent', 'countTokens', 'createCachedContent'],
       temperature=1.0,
       max_temperature=2.0,
       top_p=0.95,
       top_k=40),
 Model(name='models/gemini-1.5-flash-8b',
       base_model_id='',
       version='001',
       display_name='Gemini 1.5 Flash-8B',
       description=('Stable version of Gemini 1.5 Flash-8B, our smallest and most cost effective '
                    'Flash model, released in October of 2024.'),
       input_token_limit=1000000,
       output_token_limit=8192,
       supported_generation_methods=['createCachedContent', 'generateContent', 'countTokens'],
       temperature=1.0,
       max_temperature=2.0,
       top_p=0.95,
       top_k=40),
 Model(name='models/gemini-1.5-flash-8b-001',
       base_model_id='',
       version='001',
       display_name='Gemini 1.5 Flash-8B 001',
       description=('Stable version of Gemini 1.5 Flash-8B, our smallest and most cost effective '
                    'Flash model, released in October of 2024.'),
       input_token_limit=1000000,
       output_token_limit=8192,
       supported_generation_methods=['createCachedContent', 'generateContent', 'countTokens'],
       temperature=1.0,
       max_temperature=2.0,
       top_p=0.95,
       top_k=40),
 Model(name='models/gemini-1.5-flash-8b-latest',
       base_model_id='',
       version='001',
       display_name='Gemini 1.5 Flash-8B Latest',
       description=('Alias that points to the most recent production (non-experimental) release '
                    'of Gemini 1.5 Flash-8B, our smallest and most cost effective Flash model, '
                    'released in October of 2024.'),
       input_token_limit=1000000,
       output_token_limit=8192,
       supported_generation_methods=['createCachedContent', 'generateContent', 'countTokens'],
       temperature=1.0,
       max_temperature=2.0,
       top_p=0.95,
       top_k=40),
 Model(name='models/gemini-1.5-flash-8b-exp-0827',
       base_model_id='',
       version='001',
       display_name='Gemini 1.5 Flash 8B Experimental 0827',
       description=('Experimental release (August 27th, 2024) of Gemini 1.5 Flash-8B, our '
                    'smallest and most cost effective Flash model. Replaced by '
                    'Gemini-1.5-flash-8b-001 (stable).'),
       input_token_limit=1000000,
       output_token_limit=8192,
       supported_generation_methods=['generateContent', 'countTokens'],
       temperature=1.0,
       max_temperature=2.0,
       top_p=0.95,
       top_k=40),
 Model(name='models/gemini-1.5-flash-8b-exp-0924',
       base_model_id='',
       version='001',
       display_name='Gemini 1.5 Flash 8B Experimental 0924',
       description=('Experimental release (September 24th, 2024) of Gemini 1.5 Flash-8B, our '
                    'smallest and most cost effective Flash model. Replaced by '
                    'Gemini-1.5-flash-8b-001 (stable).'),
       input_token_limit=1000000,
       output_token_limit=8192,
       supported_generation_methods=['generateContent', 'countTokens'],
       temperature=1.0,
       max_temperature=2.0,
       top_p=0.95,
       top_k=40),
 Model(name='models/gemini-2.0-flash-exp',
       base_model_id='',
       version='2.0',
       display_name='Gemini 2.0 Flash Experimental',
       description='Gemini 2.0 Flash Experimental',
       input_token_limit=1048576,
       output_token_limit=8192,
       supported_generation_methods=['generateContent', 'countTokens', 'bidiGenerateContent'],
       temperature=1.0,
       max_temperature=2.0,
       top_p=0.95,
       top_k=40),
 Model(name='models/gemini-exp-1206',
       base_model_id='',
       version='exp_1206',
       display_name='Gemini Experimental 1206',
       description='Experimental release (December 6th, 2024) of Gemini.',
       input_token_limit=2097152,
       output_token_limit=8192,
       supported_generation_methods=['generateContent', 'countTokens'],
       temperature=1.0,
       max_temperature=2.0,
       top_p=0.95,
       top_k=64),
 Model(name='models/gemini-exp-1121',
       base_model_id='',
       version='exp-1121',
       display_name='Gemini Experimental 1121',
       description='Experimental release (November 21st, 2024) of Gemini.',
       input_token_limit=32768,
       output_token_limit=8192,
       supported_generation_methods=['generateContent', 'countTokens'],
       temperature=1.0,
       max_temperature=2.0,
       top_p=0.95,
       top_k=64),
 Model(name='models/gemini-exp-1114',
       base_model_id='',
       version='exp-1121',
       display_name='Gemini Experimental 1121',
       description='Experimental release (November 21st, 2024) of Gemini.',
       input_token_limit=32768,
       output_token_limit=8192,
       supported_generation_methods=['generateContent', 'countTokens'],
       temperature=1.0,
       max_temperature=2.0,
       top_p=0.95,
       top_k=64),
 Model(name='models/learnlm-1.5-pro-experimental',
       base_model_id='',
       version='001',
       display_name='LearnLM 1.5 Pro Experimental',
       description=('Alias that points to the most recent stable version of Gemini 1.5 Pro, our '
                    'mid-size multimodal model that supports up to 2 million tokens.'),
       input_token_limit=32767,
       output_token_limit=8192,
       supported_generation_methods=['generateContent', 'countTokens'],
       temperature=1.0,
       max_temperature=2.0,
       top_p=0.95,
       top_k=64),
 Model(name='models/embedding-001',
       base_model_id='',
       version='001',
       display_name='Embedding 001',
       description='Obtain a distributed representation of a text.',
       input_token_limit=2048,
       output_token_limit=1,
       supported_generation_methods=['embedContent'],
       temperature=None,
       max_temperature=None,
       top_p=None,
       top_k=None),
 Model(name='models/text-embedding-004',
       base_model_id='',
       version='004',
       display_name='Text Embedding 004',
       description='Obtain a distributed representation of a text.',
       input_token_limit=2048,
       output_token_limit=1,
       supported_generation_methods=['embedContent'],
       temperature=None,
       max_temperature=None,
       top_p=None,
       top_k=None),
 Model(name='models/aqa',
       base_model_id='',
       version='001',
       display_name='Model that performs Attributed Question Answering.',
       description=('Model trained to return answers to questions that are grounded in provided '
                    'sources, along with estimating answerable probability.'),
       input_token_limit=7168,
       output_token_limit=1024,
       supported_generation_methods=['generateAnswer'],
       temperature=0.2,
       max_temperature=None,
       top_p=1.0,
       top_k=40)]

models/ は省略できるようだ。

'gemini-1.5-pro-latest' を使って何か聞いてみよう:

model = genai.GenerativeModel('gemini-1.5-pro-latest')

response = model.generate_content("What is the meaning of life?")
print(response.text)

もし検閲に引っかかるようなら response.prompt_feedback を表示してみれば詳細がわかる。

上の方法では一つしか質問できない。会話は、次のようにする。

model = genai.GenerativeModel('gemini-1.5-pro-latest')

chat = model.start_chat(history=[])
response = chat.send_message("What is your knowledge cutoff?")
print(response.text)
response = chat.send_message("What are reputable news sources?")
print(response.text)
...

会話全体は chat.history で参照できる。

for h in chat.history:
    print(f"[{h.role}]\n{h.parts[0].text}")

温度(ランダムさの度合い)などを指定することもできる:

config = genai.GenerationConfig(temperature=0)
model = genai.GenerativeModel('gemini-1.5-pro-latest',
                              generation_config=config)