llm-gemini 0.4.1__py3-none-any.whl → 0.5__py3-none-any.whl

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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: llm-gemini
3
- Version: 0.4.1
3
+ Version: 0.5
4
4
  Summary: LLM plugin to access Google's Gemini family of models
5
5
  Author: Simon Willison
6
6
  License: Apache-2.0
@@ -11,12 +11,12 @@ Project-URL: CI, https://github.com/simonw/llm-gemini/actions
11
11
  Classifier: License :: OSI Approved :: Apache Software License
12
12
  Description-Content-Type: text/markdown
13
13
  License-File: LICENSE
14
- Requires-Dist: llm >=0.18
14
+ Requires-Dist: llm>=0.19
15
15
  Requires-Dist: httpx
16
16
  Requires-Dist: ijson
17
17
  Provides-Extra: test
18
- Requires-Dist: pytest ; extra == 'test'
19
- Requires-Dist: pytest-recording ; extra == 'test'
18
+ Requires-Dist: pytest; extra == "test"
19
+ Requires-Dist: pytest-recording; extra == "test"
20
20
 
21
21
  # llm-gemini
22
22
 
@@ -60,7 +60,8 @@ Other models are:
60
60
 
61
61
  - `gemini-1.5-flash-latest`
62
62
  - `gemini-1.5-flash-8b-latest` - the least expensive
63
- - `gemini-exp-1114` - recent experimental
63
+ - `gemini-exp-1114` - recent experimental #1
64
+ - `gemini-exp-1121` - recent experimental #2
64
65
 
65
66
  ### Images, audio and video
66
67
 
@@ -157,3 +158,16 @@ To run the tests:
157
158
  ```bash
158
159
  pytest
159
160
  ```
161
+
162
+ This project uses [pytest-recording](https://github.com/kiwicom/pytest-recording) to record Gemini API responses for the tests.
163
+
164
+ If you add a new test that calls the API you can capture the API response like this:
165
+ ```bash
166
+ PYTEST_GEMINI_API_KEY="$(llm keys get gemini)" pytest --record-mode once
167
+ ```
168
+ You will need to have stored a valid Gemini API key using this command first:
169
+ ```bash
170
+ llm keys set gemini
171
+ # Paste key here
172
+ ```
173
+
@@ -0,0 +1,7 @@
1
+ llm_gemini.py,sha256=GFAYIFWCRyM1FhMbvZhm9DvRPmW-GUNlzgkBY-Gcq7g,11295
2
+ llm_gemini-0.5.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
3
+ llm_gemini-0.5.dist-info/METADATA,sha256=Ipci7xoIduAqjP-73H2jstoqj5Qp0KmnMUNifHp8JXg,5335
4
+ llm_gemini-0.5.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
5
+ llm_gemini-0.5.dist-info/entry_points.txt,sha256=n544bpgUPIBc5l_cnwsTxPc3gMGJHPtAyqBNp-CkMWk,26
6
+ llm_gemini-0.5.dist-info/top_level.txt,sha256=WUQmG6_2QKbT_8W4HH93qyKl_0SUteL4Ra6_PhyNGKU,11
7
+ llm_gemini-0.5.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.5.0)
2
+ Generator: setuptools (75.6.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
llm_gemini.py CHANGED
@@ -38,6 +38,7 @@ def register_models(register):
38
38
  "gemini-1.5-flash-8b-latest",
39
39
  "gemini-1.5-flash-8b-001",
40
40
  "gemini-exp-1114",
41
+ "gemini-exp-1121",
41
42
  ]:
42
43
  register(GeminiPro(model_id), AsyncGeminiPro(model_id))
43
44
 
@@ -210,6 +211,19 @@ class _SharedGemini:
210
211
  return f'```\n{part["codeExecutionResult"]["output"].strip()}\n```\n'
211
212
  return ""
212
213
 
214
+ def set_usage(self, response):
215
+ try:
216
+ usage = response.response_json[-1].pop("usageMetadata")
217
+ input_tokens = usage.pop("promptTokenCount", None)
218
+ output_tokens = usage.pop("candidatesTokenCount", None)
219
+ usage.pop("totalTokenCount", None)
220
+ if input_tokens is not None:
221
+ response.set_usage(
222
+ input=input_tokens, output=output_tokens, details=usage or None
223
+ )
224
+ except (IndexError, KeyError):
225
+ pass
226
+
213
227
 
214
228
  class GeminiPro(_SharedGemini, llm.Model):
215
229
  def execute(self, prompt, stream, response, conversation):
@@ -241,6 +255,7 @@ class GeminiPro(_SharedGemini, llm.Model):
241
255
  gathered.append(event)
242
256
  events.clear()
243
257
  response.response_json = gathered
258
+ self.set_usage(response)
244
259
 
245
260
 
246
261
  class AsyncGeminiPro(_SharedGemini, llm.AsyncModel):
@@ -274,6 +289,7 @@ class AsyncGeminiPro(_SharedGemini, llm.AsyncModel):
274
289
  gathered.append(event)
275
290
  events.clear()
276
291
  response.response_json = gathered
292
+ self.set_usage(response)
277
293
 
278
294
 
279
295
  @llm.hookimpl
@@ -1,7 +0,0 @@
1
- llm_gemini.py,sha256=_7yQ14ffRpyK3ChAOc6M2ufylg2kUKTQK4C3VKOiUgM,10672
2
- llm_gemini-0.4.1.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
3
- llm_gemini-0.4.1.dist-info/METADATA,sha256=OhySg0uA_de-JRZrYIJFZu_uSYVKXEGs4W_x3LkQUvE,4864
4
- llm_gemini-0.4.1.dist-info/WHEEL,sha256=R06PA3UVYHThwHvxuRWMqaGcr-PuniXahwjmQRFMEkY,91
5
- llm_gemini-0.4.1.dist-info/entry_points.txt,sha256=n544bpgUPIBc5l_cnwsTxPc3gMGJHPtAyqBNp-CkMWk,26
6
- llm_gemini-0.4.1.dist-info/top_level.txt,sha256=WUQmG6_2QKbT_8W4HH93qyKl_0SUteL4Ra6_PhyNGKU,11
7
- llm_gemini-0.4.1.dist-info/RECORD,,