From fb298616266bb8f20aa5c1cbdf1cba9bec445bdf Mon Sep 17 00:00:00 2001 From: Mark Daoust Date: Wed, 26 Jun 2024 09:43:37 -0700 Subject: [PATCH 1/5] Add samples for Files API (#395) * Add samples for Files API Change-Id: Ied2df1633e132bda8c144e59107ae11e02b36b2f * Move sample media to third_party/ directory. Change-Id: Iee3a0e3d30b7754907c48c11822eac6cadd1082b * Format. Change-Id: Ie62a1314ca44074fa1f8904a1d5e3ada2c52fcba --- google/generativeai/types/file_types.py | 25 ++++++- samples/files.py | 93 ++++++++++++++++++++++++ third_party/Big_Buck_Bunny.mp4 | Bin 0 -> 106677 bytes third_party/LICENSE.txt | 6 ++ third_party/poem.txt | 4 + 5 files changed, 127 insertions(+), 1 deletion(-) create mode 100644 samples/files.py create mode 100644 third_party/Big_Buck_Bunny.mp4 create mode 100644 third_party/LICENSE.txt create mode 100644 third_party/poem.txt diff --git a/google/generativeai/types/file_types.py b/google/generativeai/types/file_types.py index ef251e296..f77d373e3 100644 --- a/google/generativeai/types/file_types.py +++ b/google/generativeai/types/file_types.py @@ -15,7 +15,7 @@ from __future__ import annotations import datetime -from typing import Union +from typing import Any, Union from typing_extensions import TypedDict from google.rpc.status_pb2 import Status @@ -23,6 +23,8 @@ from google.generativeai import protos +import pprint + class File: def __init__(self, proto: protos.File | File | dict): @@ -33,6 +35,27 @@ def __init__(self, proto: protos.File | File | dict): def to_proto(self) -> protos.File: return self._proto + def to_dict(self) -> dict[str, Any]: + return type(self._proto).to_dict(self._proto, use_integers_for_enums=False) + + def __str__(self): + def sort_key(pair): + name, value = pair + if name == "name": + return "" + elif "time" in name: + return "zz_" + name + else: + return name + + dict_format = dict(sorted(self.to_dict().items(), key=sort_key)) + dict_format = pprint.pformat(dict_format, sort_dicts=False) + dict_format = "{\n " + dict_format[1:] + dict_format = "\n ".join(dict_format.splitlines()) + return dict_format.join(["genai.File(", ")"]) + + __repr__ = __str__ + @property def name(self) -> str: return self._proto.name diff --git a/samples/files.py b/samples/files.py new file mode 100644 index 000000000..8a9fde614 --- /dev/null +++ b/samples/files.py @@ -0,0 +1,93 @@ +# -*- coding: utf-8 -*- +# Copyright 2023 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +from absl.testing import absltest + +import google +import google.generativeai as genai +import pathlib + +media = pathlib.Path(__file__).parents[1] / "third_party" + + +class UnitTests(absltest.TestCase): + def test_files_create(self): + # [START files_create] + myfile = genai.upload_file(media / "poem.txt") + print(f"{myfile=}") + print() + + model = genai.GenerativeModel("gemini-1.5-flash") + result = model.generate_content( + [myfile, "\n\n", "Can you add a few more lines to this poem?"] + ) + print(f"{result.text=}") + print() + # [END files_create] + + def test_files_create_video(self): + # [START files_create_video] + import time + + # Video clip from https://peach.blender.org/download/ + myfile = genai.upload_file(media / "Big_Buck_Bunny.mp4") + print(f"{myfile=}") + print() + + while myfile.state.name == "PROCESSING": + print("processing video...") + time.sleep(5) + myfile = genai.get_file(myfile.name) + + model = genai.GenerativeModel("gemini-1.5-flash") + result = model.generate_content([myfile, "Describe this video clip"]) + print() + print(f"{result.text=}") + print() + # [END files_create_video] + + def test_files_list(self): + # [START files_list] + print("My files:") + for f in genai.list_files(): + print(" ", f.name) + # [END files_list] + + def test_files_delete(self): + # [START files_delete] + myfile = genai.upload_file(media / "poem.txt") + + myfile.delete() + + try: + # Error. + model = genai.GenerativeModel("gemini-1.5-flash") + result = model.generate_content([myfile, "Describe this file."]) + except google.api_core.exceptions.PermissionDenied: + pass + # [END files_delete] + + def test_files_get(self): + # [START files_get] + myfile = genai.upload_file(media / "poem.txt") + file_name = myfile.name + print(file_name) # "files/*" + + myfile = genai.get_file(file_name) + print(myfile) + # [END files_get] + + +if __name__ == "__main__": + absltest.main() diff --git a/third_party/Big_Buck_Bunny.mp4 b/third_party/Big_Buck_Bunny.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..07096db47a0eb2e9eb975807d9f4739dbe858aec GIT binary patch literal 106677 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 Date: Wed, 26 Jun 2024 11:20:45 -0700 Subject: [PATCH 2/5] Add embedding sample (#397) * Add embedding sample * Add batch embedding sample --- samples/embed.py | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 samples/embed.py diff --git a/samples/embed.py b/samples/embed.py new file mode 100644 index 000000000..b9e285647 --- /dev/null +++ b/samples/embed.py @@ -0,0 +1,43 @@ +# -*- coding: utf-8 -*- +# Copyright 2023 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +from absl.testing import absltest + +import google +import google.generativeai as genai +import pathlib + +class UnitTests(absltest.TestCase): + def test_embed_content(self): + # [START embed_content] + text = "Hello World!" + result = genai.embed_content(model="models/text-embedding-004", + content=text) + print(result['embedding']) + print() + # [END embed_content] + + def batch_embed_content(self): + # [START batch_embed_content] + texts = ["What is the meaning of life?", + "How much wood would a woodchuck chuck?", + "How does the brain work?"] + result = genai.embed_content(model="models/text-embedding-004", + content=texts) + print(result) + print() + # [END batch_embed_content] + +if __name__ == "__main__": + absltest.main() \ No newline at end of file From 3e281e73ef206d20c35ee8db6e8931d62d663b1d Mon Sep 17 00:00:00 2001 From: Shilpa Kancharla Date: Wed, 26 Jun 2024 13:50:12 -0700 Subject: [PATCH 3/5] Add sample for JSON controlled generation (#398) * Add sample for JSON controlled generation * Update embeddings and JSON samples * Move import statement inside function * Remove import statement from inside function --- samples/embed.py | 28 +++++++++++++++++----------- samples/json_mode.py | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 11 deletions(-) create mode 100644 samples/json_mode.py diff --git a/samples/embed.py b/samples/embed.py index b9e285647..460393dec 100644 --- a/samples/embed.py +++ b/samples/embed.py @@ -14,30 +14,36 @@ # limitations under the License. from absl.testing import absltest -import google + import google.generativeai as genai -import pathlib + class UnitTests(absltest.TestCase): def test_embed_content(self): # [START embed_content] + text = "Hello World!" - result = genai.embed_content(model="models/text-embedding-004", - content=text) - print(result['embedding']) + result = genai.embed_content( + model="models/text-embedding-004", content=text, output_dimensionality=10 + ) + print(result["embedding"]) print() # [END embed_content] def batch_embed_content(self): # [START batch_embed_content] - texts = ["What is the meaning of life?", - "How much wood would a woodchuck chuck?", - "How does the brain work?"] - result = genai.embed_content(model="models/text-embedding-004", - content=texts) + texts = [ + "What is the meaning of life?", + "How much wood would a woodchuck chuck?", + "How does the brain work?", + ] + result = genai.embed_content( + model="models/text-embedding-004", content=texts, output_dimensionality=10 + ) print(result) print() # [END batch_embed_content] + if __name__ == "__main__": - absltest.main() \ No newline at end of file + absltest.main() diff --git a/samples/json_mode.py b/samples/json_mode.py new file mode 100644 index 000000000..c29aa30e2 --- /dev/null +++ b/samples/json_mode.py @@ -0,0 +1,38 @@ +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +from absl.testing import absltest + +import google.generativeai as genai +import typing_extensions as typing + + +class UnitTests(absltest.TestCase): + def test_controlled_generation(self): + # [START controlled_generation] + class Recipe(typing.TypedDict): + recipe_name: str + + model = genai.GenerativeModel("gemini-1.5-pro-latest") + result = model.generate_content( + "List a few popular cookie recipes.", + generation_config=genai.GenerationConfig( + response_mime_type="application/json", response_schema=list([Recipe]) + ), + ) + print(result) + print() + # [END controlled_generation] + + +if __name__ == "__main__": + absltest.main() From 63a140b82d25627acca2c5e512b5cfb87cced0c5 Mon Sep 17 00:00:00 2001 From: Shilpa Kancharla Date: Wed, 26 Jun 2024 16:32:12 -0700 Subject: [PATCH 4/5] Code execution (#396) * Modify _make_tool to accept code_execution proto object * Make adding code execution compatible with current tests * Update test_content.py to test code_execution * Test cases running and passing for code execution updates * Updated _join_contents to handle executable_code and code_execution_results * Updated .text field to include executable code and code execution results * Update versions. Change-Id: I4e2c9081a9de9105bfc1d9d83769d98faee4d18e * format Change-Id: I38de8c9fe434785608ad5e04a2234bd584e2de03 --------- Co-authored-by: Mark Daoust --- google/generativeai/types/content_types.py | 56 ++++++++++--- google/generativeai/types/generation_types.py | 78 +++++++++++++++---- google/generativeai/version.py | 2 +- setup.py | 2 +- tests/test_content.py | 22 +++++- tests/test_generation.py | 55 +++++++++++++ 6 files changed, 183 insertions(+), 32 deletions(-) diff --git a/google/generativeai/types/content_types.py b/google/generativeai/types/content_types.py index 7e343a5c0..74f03029c 100644 --- a/google/generativeai/types/content_types.py +++ b/google/generativeai/types/content_types.py @@ -623,24 +623,40 @@ def _encode_fd(fd: FunctionDeclaration | protos.FunctionDeclaration) -> protos.F class Tool: """A wrapper for `protos.Tool`, Contains a collection of related `FunctionDeclaration` objects.""" - def __init__(self, function_declarations: Iterable[FunctionDeclarationType]): + def __init__( + self, + function_declarations: Iterable[FunctionDeclarationType] | None = None, + code_execution: protos.CodeExecution | None = None, + ): # The main path doesn't use this but is seems useful. - self._function_declarations = [_make_function_declaration(f) for f in function_declarations] - self._index = {} - for fd in self._function_declarations: - name = fd.name - if name in self._index: - raise ValueError("") - self._index[fd.name] = fd + if function_declarations: + self._function_declarations = [ + _make_function_declaration(f) for f in function_declarations + ] + self._index = {} + for fd in self._function_declarations: + name = fd.name + if name in self._index: + raise ValueError("") + self._index[fd.name] = fd + else: + # Consistent fields + self._function_declarations = [] + self._index = {} self._proto = protos.Tool( - function_declarations=[_encode_fd(fd) for fd in self._function_declarations] + function_declarations=[_encode_fd(fd) for fd in self._function_declarations], + code_execution=code_execution, ) @property def function_declarations(self) -> list[FunctionDeclaration | protos.FunctionDeclaration]: return self._function_declarations + @property + def code_execution(self) -> protos.CodeExecution: + return self._proto.code_execution + def __getitem__( self, name: str | protos.FunctionCall ) -> FunctionDeclaration | protos.FunctionDeclaration: @@ -673,13 +689,24 @@ def _make_tool(tool: ToolType) -> Tool: if isinstance(tool, Tool): return tool elif isinstance(tool, protos.Tool): - return Tool(function_declarations=tool.function_declarations) + if "code_execution" in tool: + code_execution = tool.code_execution + else: + code_execution = None + return Tool(function_declarations=tool.function_declarations, code_execution=code_execution) elif isinstance(tool, dict): - if "function_declarations" in tool: + if "function_declarations" in tool or "code_execution" in tool: return Tool(**tool) else: fd = tool return Tool(function_declarations=[protos.FunctionDeclaration(**fd)]) + elif isinstance(tool, str): + if tool.lower() == "code_execution": + return Tool(code_execution=protos.CodeExecution()) + else: + raise ValueError("The only string that can be passed as a tool is 'code_execution'.") + elif isinstance(tool, protos.CodeExecution): + return Tool(code_execution=tool) elif isinstance(tool, Iterable): return Tool(function_declarations=tool) else: @@ -734,7 +761,12 @@ def to_proto(self): def _make_tools(tools: ToolsType) -> list[Tool]: - if isinstance(tools, Iterable) and not isinstance(tools, Mapping): + if isinstance(tools, str): + if tools.lower() == "code_execution": + return [_make_tool(tools)] + else: + raise ValueError("The only string that can be passed as a tool is 'code_execution'.") + elif isinstance(tools, Iterable) and not isinstance(tools, Mapping): tools = [_make_tool(t) for t in tools] if len(tools) > 1 and all(len(t.function_declarations) == 1 for t in tools): # flatten into a single tool. diff --git a/google/generativeai/types/generation_types.py b/google/generativeai/types/generation_types.py index 20686a156..e7b912678 100644 --- a/google/generativeai/types/generation_types.py +++ b/google/generativeai/types/generation_types.py @@ -261,19 +261,33 @@ def _join_contents(contents: Iterable[protos.Content]): for content in contents: parts.extend(content.parts) - merged_parts = [parts.pop(0)] - for part in parts: - if not merged_parts[-1].text: - merged_parts.append(part) + merged_parts = [] + last = parts[0] + for part in parts[1:]: + if "text" in last and "text" in part: + last = protos.Part(text=last.text + part.text) continue - if not part.text: - merged_parts.append(part) + # Can we merge the new thing into last? + # If not, put last in list of parts, and new thing becomes last + if "executable_code" in last and "executable_code" in part: + last = protos.Part( + executable_code=_join_executable_code(last.executable_code, part.executable_code) + ) continue - merged_part = protos.Part(merged_parts[-1]) - merged_part.text += part.text - merged_parts[-1] = merged_part + if "code_execution_result" in last and "code_execution_result" in part: + last = protos.Part( + code_execution_result=_join_code_execution_result( + last.code_execution_result, part.code_execution_result + ) + ) + continue + + merged_parts.append(last) + last = part + + merged_parts.append(last) return protos.Content( role=role, @@ -281,6 +295,16 @@ def _join_contents(contents: Iterable[protos.Content]): ) +def _join_executable_code(code_1, code_2): + return protos.ExecutableCode(language=code_1.language, code=code_1.code + code_2.code) + + +def _join_code_execution_result(result_1, result_2): + return protos.CodeExecutionResult( + outcome=result_2.outcome, output=result_1.output + result_2.output + ) + + def _join_candidates(candidates: Iterable[protos.Candidate]): candidates = tuple(candidates) @@ -413,13 +437,35 @@ def text(self): "Invalid operation: The `response.text` quick accessor requires the response to contain a valid `Part`, " "but none were returned. Please check the `candidate.safety_ratings` to determine if the response was blocked." ) - if len(parts) != 1 or "text" not in parts[0]: - raise ValueError( - "Invalid operation: The `response.text` quick accessor requires a simple (single-`Part`) text response. " - "This response is not simple text. Please use the `result.parts` accessor or the full " - "`result.candidates[index].content.parts` lookup instead." - ) - return parts[0].text + + texts = [] + for part in parts: + if "text" in part: + texts.append(part.text) + continue + if "executable_code" in part: + language = part.executable_code.language.name.lower() + if language == "language_unspecified": + language = "" + else: + language = f" {language}" + texts.extend([f"```{language}", part.executable_code.code, "```"]) + continue + if "code_execution_result" in part: + outcome_result = part.code_execution_result.outcome.name.lower().replace( + "outcome_", "" + ) + if outcome_result == "ok" or outcome_result == "unspecified": + outcome_result = "" + else: + outcome_result = f" {outcome_result}" + texts.extend([f"```{outcome_result}", part.code_execution_result.output, "```"]) + continue + + part_type = protos.Part.pb(part).whichOneof("data") + raise ValueError(f"Could not convert `part.{part_type}` to text.") + + return "\n".join(texts) @property def prompt_feedback(self): diff --git a/google/generativeai/version.py b/google/generativeai/version.py index 69a8b817e..20f814c4b 100644 --- a/google/generativeai/version.py +++ b/google/generativeai/version.py @@ -14,4 +14,4 @@ # limitations under the License. from __future__ import annotations -__version__ = "0.7.0" +__version__ = "0.7.1" diff --git a/setup.py b/setup.py index 89af61515..b4b05e619 100644 --- a/setup.py +++ b/setup.py @@ -42,7 +42,7 @@ def get_version(): release_status = "Development Status :: 5 - Production/Stable" dependencies = [ - "google-ai-generativelanguage==0.6.5", + "google-ai-generativelanguage==0.6.6", "google-api-core", "google-api-python-client", "google-auth>=2.15.0", # 2.15 adds API key auth support diff --git a/tests/test_content.py b/tests/test_content.py index 6df5faad4..5b7aa9781 100644 --- a/tests/test_content.py +++ b/tests/test_content.py @@ -15,7 +15,7 @@ import dataclasses import pathlib import typing_extensions -from typing import Any, Union +from typing import Any, Union, Iterable from absl.testing import absltest from absl.testing import parameterized @@ -367,7 +367,7 @@ def test_to_tools(self, tools): raise ValueError("This shouldn't happen") tools = function_library.to_proto() - tools = type(tools[0]).to_dict(tools[0]) + tools = type(tools[0]).to_dict(tools[0], including_default_value_fields=False) tools["function_declarations"][0].pop("parameters", None) expected = dict( @@ -378,6 +378,24 @@ def test_to_tools(self, tools): self.assertEqual(tools, expected) + @parameterized.named_parameters( + ["string", "code_execution"], + ["proto_object", protos.CodeExecution()], + ["proto_passed_in", protos.Tool(code_execution=protos.CodeExecution())], + ["empty_dictionary", {"code_execution": {}}], + ["string_list", ["code_execution"]], + ["proto_object_list", [protos.CodeExecution()]], + ["proto_passed_in_list", [protos.Tool(code_execution=protos.CodeExecution())]], + ["empty_dictionary_list", [{"code_execution": {}}]], + ) + def test_code_execution(self, tools): + if isinstance(tools, Iterable): + t = content_types._make_tools(tools) + self.assertIsInstance(t[0].code_execution, protos.CodeExecution) + else: + t = content_types._make_tool(tools) # Pass code execution into tools + self.assertIsInstance(t.code_execution, protos.CodeExecution) + def test_two_fun_is_one_tool(self): def a(): pass diff --git a/tests/test_generation.py b/tests/test_generation.py index 828577d21..3a5363d72 100644 --- a/tests/test_generation.py +++ b/tests/test_generation.py @@ -124,6 +124,61 @@ def test_join_contents(self): self.assertEqual(expected, type(result).to_dict(result)) + def test_join_parts(self): + contents = [ + protos.Content(role="assistant", parts=[protos.Part(text="A")]), + protos.Content(role="assistant", parts=[protos.Part(text="B")]), + protos.Content(role="assistant", parts=[protos.Part(executable_code={"code": "C"})]), + protos.Content(role="assistant", parts=[protos.Part(executable_code={"code": "D"})]), + protos.Content( + role="assistant", parts=[protos.Part(code_execution_result={"output": "E"})] + ), + protos.Content( + role="assistant", parts=[protos.Part(code_execution_result={"output": "F"})] + ), + protos.Content(role="assistant", parts=[protos.Part(text="G")]), + protos.Content(role="assistant", parts=[protos.Part(text="H")]), + ] + g = generation_types._join_contents(contents=contents) + expected = protos.Content( + role="assistant", + parts=[ + protos.Part(text="AB"), + protos.Part(executable_code={"code": "CD"}), + protos.Part(code_execution_result={"output": "EF"}), + protos.Part(text="GH"), + ], + ) + self.assertEqual(expected, g) + + def test_code_execution_text(self): + content = protos.Content( + role="assistant", + parts=[ + protos.Part(text="AB"), + protos.Part(executable_code={"language": "PYTHON", "code": "CD"}), + protos.Part(code_execution_result={"outcome": "OUTCOME_OK", "output": "EF"}), + protos.Part(text="GH"), + ], + ) + response = generation_types.GenerateContentResponse( + done=True, + iterator=None, + result=protos.GenerateContentResponse({"candidates": [{"content": content}]}), + ) + expected = textwrap.dedent( + """\ + AB + ``` python + CD + ``` + ``` + EF + ``` + GH""" + ) + self.assertEqual(expected, response.text) + def test_many_join_contents(self): import string From 4960f7885b4e71ba9160979f9ac68745bbadb925 Mon Sep 17 00:00:00 2001 From: Mark Daoust Date: Wed, 26 Jun 2024 17:44:05 -0700 Subject: [PATCH 5/5] Remove extra new line. (#400) * Remove extra new line. * blacken --------- Co-authored-by: Mark McDonald --- google/generativeai/types/generation_types.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/google/generativeai/types/generation_types.py b/google/generativeai/types/generation_types.py index e7b912678..d4bed8b86 100644 --- a/google/generativeai/types/generation_types.py +++ b/google/generativeai/types/generation_types.py @@ -449,7 +449,7 @@ def text(self): language = "" else: language = f" {language}" - texts.extend([f"```{language}", part.executable_code.code, "```"]) + texts.extend([f"```{language}", part.executable_code.code.lstrip("\n"), "```"]) continue if "code_execution_result" in part: outcome_result = part.code_execution_result.outcome.name.lower().replace(