llm-gemini 0.4.1__tar.gz → 0.5a0__tar.gz

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.5a0
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,7 +11,7 @@ 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.19a0
15
15
  Requires-Dist: httpx
16
16
  Requires-Dist: ijson
17
17
  Provides-Extra: test
@@ -157,3 +157,16 @@ To run the tests:
157
157
  ```bash
158
158
  pytest
159
159
  ```
160
+
161
+ This project uses [pytest-recording](https://github.com/kiwicom/pytest-recording) to record Gemini API responses for the tests.
162
+
163
+ If you add a new test that calls the API you can capture the API response like this:
164
+ ```bash
165
+ PYTEST_GEMINI_API_KEY="$(llm keys get gemini)" pytest --record-mode once
166
+ ```
167
+ You will need to have stored a valid Gemini API key using this command first:
168
+ ```bash
169
+ llm keys set gemini
170
+ # Paste key here
171
+ ```
172
+
@@ -137,3 +137,16 @@ To run the tests:
137
137
  ```bash
138
138
  pytest
139
139
  ```
140
+
141
+ This project uses [pytest-recording](https://github.com/kiwicom/pytest-recording) to record Gemini API responses for the tests.
142
+
143
+ If you add a new test that calls the API you can capture the API response like this:
144
+ ```bash
145
+ PYTEST_GEMINI_API_KEY="$(llm keys get gemini)" pytest --record-mode once
146
+ ```
147
+ You will need to have stored a valid Gemini API key using this command first:
148
+ ```bash
149
+ llm keys set gemini
150
+ # Paste key here
151
+ ```
152
+
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: llm-gemini
3
- Version: 0.4.1
3
+ Version: 0.5a0
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,7 +11,7 @@ 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.19a0
15
15
  Requires-Dist: httpx
16
16
  Requires-Dist: ijson
17
17
  Provides-Extra: test
@@ -157,3 +157,16 @@ To run the tests:
157
157
  ```bash
158
158
  pytest
159
159
  ```
160
+
161
+ This project uses [pytest-recording](https://github.com/kiwicom/pytest-recording) to record Gemini API responses for the tests.
162
+
163
+ If you add a new test that calls the API you can capture the API response like this:
164
+ ```bash
165
+ PYTEST_GEMINI_API_KEY="$(llm keys get gemini)" pytest --record-mode once
166
+ ```
167
+ You will need to have stored a valid Gemini API key using this command first:
168
+ ```bash
169
+ llm keys set gemini
170
+ # Paste key here
171
+ ```
172
+
@@ -1,4 +1,4 @@
1
- llm>=0.18
1
+ llm>=0.19a0
2
2
  httpx
3
3
  ijson
4
4
 
@@ -210,6 +210,19 @@ class _SharedGemini:
210
210
  return f'```\n{part["codeExecutionResult"]["output"].strip()}\n```\n'
211
211
  return ""
212
212
 
213
+ def set_usage(self, response):
214
+ try:
215
+ usage = response.response_json[-1].pop("usageMetadata")
216
+ input_tokens = usage.pop("promptTokenCount", None)
217
+ output_tokens = usage.pop("candidatesTokenCount", None)
218
+ usage.pop("totalTokenCount", None)
219
+ if input_tokens is not None:
220
+ response.set_usage(
221
+ input=input_tokens, output=output_tokens, details=usage or None
222
+ )
223
+ except (IndexError, KeyError):
224
+ pass
225
+
213
226
 
214
227
  class GeminiPro(_SharedGemini, llm.Model):
215
228
  def execute(self, prompt, stream, response, conversation):
@@ -241,6 +254,7 @@ class GeminiPro(_SharedGemini, llm.Model):
241
254
  gathered.append(event)
242
255
  events.clear()
243
256
  response.response_json = gathered
257
+ self.set_usage(response)
244
258
 
245
259
 
246
260
  class AsyncGeminiPro(_SharedGemini, llm.AsyncModel):
@@ -274,6 +288,7 @@ class AsyncGeminiPro(_SharedGemini, llm.AsyncModel):
274
288
  gathered.append(event)
275
289
  events.clear()
276
290
  response.response_json = gathered
291
+ self.set_usage(response)
277
292
 
278
293
 
279
294
  @llm.hookimpl
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "llm-gemini"
3
- version = "0.4.1"
3
+ version = "0.5a0"
4
4
  description = "LLM plugin to access Google's Gemini family of models"
5
5
  readme = "README.md"
6
6
  authors = [{name = "Simon Willison"}]
@@ -9,7 +9,7 @@ classifiers = [
9
9
  "License :: OSI Approved :: Apache Software License"
10
10
  ]
11
11
  dependencies = [
12
- "llm>=0.18",
12
+ "llm>=0.19a0",
13
13
  "httpx",
14
14
  "ijson"
15
15
  ]
@@ -17,10 +17,15 @@ async def test_prompt():
17
17
  "candidates": [
18
18
  {"content": {"parts": [{"text": "Percy"}], "role": "model"}}
19
19
  ],
20
- "usageMetadata": {"promptTokenCount": 10, "totalTokenCount": 10},
21
20
  "modelVersion": "gemini-1.5-flash-002",
22
21
  }
23
22
  ]
23
+ assert response.token_details is None
24
+ assert response.input_tokens == 10
25
+ # Not sure why our pytest-recording setup doesn't report output tokens
26
+ # https://github.com/simonw/llm-gemini/issues/25#issuecomment-2487464339
27
+ assert response.output_tokens is None
28
+
24
29
  # And try it async too
25
30
  async_model = llm.get_async_model("gemini-1.5-flash-latest")
26
31
  async_model.key = async_model.key or GEMINI_API_KEY
File without changes
File without changes