From d150743ba5a7ed5bc47f0aeb9939511ec8d6dcb3 Mon Sep 17 00:00:00 2001 From: Yesudeep Mangalapilly Date: Sat, 29 Mar 2025 05:23:43 -0700 Subject: [PATCH] refactor(py/genkit-ai): genkit.core.typing -> genkit.typing to avoid manual re-exporting RATIONALE: `typing` modules are standard practice, so promoting ours to top-level. CHANGELOG: - [ ] Move `genkit.core.typing` -> `genkit.typing` so we don't have to keep re-exporting each type by hand. --- py/bin/generate_schema_typing | 8 +-- py/bin/publish_pypi.sh | 25 ++++----- py/bin/sanitize_schema_typing.py | 15 ++--- .../genkit-ai/src/genkit/ai/__init__.py | 56 +------------------ .../genkit-ai/src/genkit/ai/registry.py | 2 +- py/packages/genkit-ai/src/genkit/ai/veneer.py | 2 +- .../genkit-ai/src/genkit/blocks/document.py | 2 +- .../genkit-ai/src/genkit/blocks/embedding.py | 2 +- .../src/genkit/blocks/formats/types.py | 2 +- .../genkit-ai/src/genkit/blocks/generate.py | 26 +++++---- .../genkit-ai/src/genkit/blocks/messages.py | 2 +- .../genkit-ai/src/genkit/blocks/middleware.py | 2 +- .../genkit-ai/src/genkit/blocks/model.py | 2 +- .../genkit-ai/src/genkit/blocks/prompt.py | 2 +- .../genkit-ai/src/genkit/blocks/retriever.py | 2 +- .../genkit-ai/src/genkit/blocks/tools.py | 2 +- py/packages/genkit-ai/src/genkit/testing.py | 2 +- .../genkit-ai/src/genkit/{core => }/typing.py | 8 +-- .../tests/genkit/blocks/document_test.py | 2 +- .../tests/genkit/blocks/formats/json_test.py | 2 +- .../tests/genkit/blocks/generate_test.py | 10 ++-- .../tests/genkit/blocks/message_utils_test.py | 2 +- .../tests/genkit/blocks/middleware_test.py | 2 +- .../tests/genkit/blocks/model_test.py | 2 +- .../tests/genkit/blocks/prompt_test.py | 10 ++-- .../genkit/core/endpoints/reflection_test.py | 4 +- .../tests/genkit/veneer/veneer_test.py | 14 ++--- .../plugins/compat_oai/models/handler.py | 8 +-- .../genkit/plugins/compat_oai/models/model.py | 2 +- .../plugins/compat_oai/models/model_info.py | 2 +- py/plugins/compat-oai/tests/conftest.py | 6 +- py/plugins/compat-oai/tests/test_handler.py | 2 +- py/plugins/compat-oai/tests/test_model.py | 6 +- .../compat-oai/tests/test_tool_calling.py | 2 +- .../dev_local_vector_store/__init__.py | 2 - .../dev_local_vector_store/constant.py | 2 +- .../plugins/dev_local_vector_store/indexer.py | 2 +- .../dev_local_vector_store/plugin_api.py | 2 +- .../dev_local_vector_store/retriever.py | 2 +- .../genkit/plugins/google_ai/models/gemini.py | 2 +- .../src/genkit/plugins/google_genai/google.py | 7 +++ .../plugins/google_genai/models/__init__.py | 1 - .../plugins/google_genai/models/embedder.py | 4 +- .../plugins/google_genai/models/gemini.py | 16 +++--- .../plugins/google_genai/models/utils.py | 2 +- py/plugins/google-genai/src/genkit/py.typed | 0 .../test/models/test_googlegenai_embedder.py | 9 ++- .../test/models/test_googlegenai_gemini.py | 17 +++--- .../src/genkit/plugins/ollama/models.py | 10 ++-- py/plugins/ollama/tests/test_plugin_api.py | 2 +- .../src/genkit/plugins/vertex_ai/embedding.py | 2 +- .../src/genkit/plugins/vertex_ai/gemini.py | 2 +- .../src/genkit/plugins/vertex_ai/imagen.py | 2 +- py/plugins/vertex-ai/tests/test_embeddings.py | 2 +- py/plugins/vertex-ai/tests/test_gemini.py | 4 +- py/plugins/vertex-ai/tests/test_imagen.py | 4 +- py/pyproject.toml | 2 +- py/samples/basic-gemini/src/main.py | 14 ++--- py/samples/google-ai/src/hello.py | 2 +- py/samples/hello-google-genai/src/hello.py | 12 ++-- py/samples/menu/src/__init__.py | 1 - py/samples/ollama-hello/src/hello.py | 2 +- .../src/pokemon_glossary.py | 2 +- py/samples/openai/src/main.py | 2 +- .../vertex-ai-imagen/src/vertex-ai-imagen.py | 2 +- py/uv.lock | 11 ++-- 66 files changed, 176 insertions(+), 208 deletions(-) rename py/packages/genkit-ai/src/genkit/{core => }/typing.py (99%) create mode 100644 py/plugins/google-genai/src/genkit/py.typed diff --git a/py/bin/generate_schema_typing b/py/bin/generate_schema_typing index 39286a9c0d..3d76c654d8 100755 --- a/py/bin/generate_schema_typing +++ b/py/bin/generate_schema_typing @@ -38,11 +38,11 @@ while [[ $# -gt 0 ]]; do done TOP_DIR=$(git rev-parse --show-toplevel) -TYPING_FILE="${TOP_DIR}/py/packages/genkit-ai/src/genkit/core/typing.py" +TYPING_FILE="${TOP_DIR}/py/packages/genkit-ai/src/genkit/typing.py" # If in CI mode and the file exists, make a backup copy to compare later. BACKUP_FILE="" -if [[ "$CI_ENABLED" == "true" ]] && [[ -f "$TYPING_FILE" ]]; then +if [[ $CI_ENABLED == "true" ]] && [[ -f $TYPING_FILE ]]; then BACKUP_FILE="${TYPING_FILE}.backup" cp "$TYPING_FILE" "$BACKUP_FILE" fi @@ -63,7 +63,7 @@ uv run --directory "${TOP_DIR}/py" \ # We want to detect and raise an error when this file changes in our hooks or in # CI. -if [[ "$CI_ENABLED" == "true" ]] && [[ -f "$BACKUP_FILE" ]]; then +if [[ $CI_ENABLED == "true" ]] && [[ -f $BACKUP_FILE ]]; then if ! diff -q "$BACKUP_FILE" "$TYPING_FILE" >/dev/null; then echo "Error: Generated schema typing file differs from the existing one." echo "Please run './py/bin/generate_schema_typing' locally and commit the changes." @@ -73,6 +73,6 @@ if [[ "$CI_ENABLED" == "true" ]] && [[ -f "$BACKUP_FILE" ]]; then fi # Remove the backup file if it exists. -if [[ -f "$BACKUP_FILE" ]]; then +if [[ -f $BACKUP_FILE ]]; then rm "$BACKUP_FILE" fi diff --git a/py/bin/publish_pypi.sh b/py/bin/publish_pypi.sh index 991cca545d..e27eed76a1 100755 --- a/py/bin/publish_pypi.sh +++ b/py/bin/publish_pypi.sh @@ -19,8 +19,8 @@ set -euo pipefail if ((EUID == 0)); then - echo "Please do not run as root" - exit 1 + echo "Please do not run as root" + exit 1 fi # Navigate to the correct project directory @@ -37,14 +37,14 @@ response=$(curl -s "https://test.pypi.org/pypi/$PACKAGE_NAME/json" || echo "{}") LATEST_VERSION=$(echo $response | jq --raw-output "select(.releases != null) | .releases | keys_unsorted | last") if [ -z "$LATEST_VERSION" ]; then - echo "Package not found on PyPI." - LATEST_VERSION="0.0.0" + echo "Package not found on PyPI." + LATEST_VERSION="0.0.0" else - echo "Latest version on PyPI: $LATEST_VERSION" - if [ "$(printf '%s\n' "$LATEST_VERSION" "$NEW_VERSION" | sort -rV | head -n 1)" != "$NEW_VERSION" ] || [ "$NEW_VERSION" == "$LATEST_VERSION" ]; then - echo "The new version $NEW_VERSION is not greater than the latest version $LATEST_VERSION on PyPI." - exit 1 - fi + echo "Latest version on PyPI: $LATEST_VERSION" + if [ "$(printf '%s\n' "$LATEST_VERSION" "$NEW_VERSION" | sort -rV | head -n 1)" != "$NEW_VERSION" ] || [ "$NEW_VERSION" == "$LATEST_VERSION" ]; then + echo "The new version $NEW_VERSION is not greater than the latest version $LATEST_VERSION on PyPI." + exit 1 + fi fi # Build distributions for the specific project @@ -56,9 +56,8 @@ TWINE_CHECK=$(twine check "${TOP_DIR}/py/dist/*") echo "$TWINE_CHECK" if echo "$TWINE_CHECK" | grep -q "FAIL"; then - echo "Twine check failed" - exit 1 + echo "Twine check failed" + exit 1 else - echo "Twine passed" + echo "Twine passed" fi - diff --git a/py/bin/sanitize_schema_typing.py b/py/bin/sanitize_schema_typing.py index 7e254d4999..f23f9960fe 100644 --- a/py/bin/sanitize_schema_typing.py +++ b/py/bin/sanitize_schema_typing.py @@ -19,11 +19,11 @@ """Standalone convenience script used to massage the typing.py. -The `py/packages/genkit-ai/src/genkit/core/typing.py` file is generated by -datamodel-codegen. However, since the tool doesn't currently provide options to -generate exactly the kind of code we need, we use this convenience script to -parse the Python source code, walk the AST, modify it to include the bits we -need and regenerate the code for eventual use within our codebase. +The `genkit/typing.py` file is generated by datamodel-codegen. However, since +the tool doesn't currently provide options to generate exactly the kind of code +we need, we use this convenience script to parse the Python source code, walk +the AST, modify it to include the bits we need and regenerate the code for +eventual use within our codebase. Transformations applied: - We remove the model_config attribute from classes that ineherit from @@ -69,7 +69,8 @@ def create_model_config( ) -> ast.Assign: """Create or update a model_config assignment. - Ensures populate_by_name=True and extra='forbid', keeping other existing settings. + Ensures populate_by_name=True and extra='forbid', keeping other existing + settings. """ keywords = [] found_populate = False @@ -116,7 +117,7 @@ def create_model_config( ) def has_model_config(self, node: ast.ClassDef) -> ast.Assign | None: - """Check if a class already has a model_config assignment and return it.""" + """Check if class already has model_config assignment and return it.""" for item in node.body: if isinstance(item, ast.Assign): targets = item.targets diff --git a/py/packages/genkit-ai/src/genkit/ai/__init__.py b/py/packages/genkit-ai/src/genkit/ai/__init__.py index 0172f0b5cc..0bd22481b0 100644 --- a/py/packages/genkit-ai/src/genkit/ai/__init__.py +++ b/py/packages/genkit-ai/src/genkit/ai/__init__.py @@ -26,68 +26,14 @@ from genkit.blocks.document import Document from genkit.blocks.tools import ToolRunContext, tool_response from genkit.core.action import ActionKind, ActionRunContext -from genkit.core.typing import ( - CustomPart, - DataPart, - Embedding, - EmbedRequest, - EmbedResponse, - GenerateRequest, - GenerateResponse, - GenerateResponseChunk, - GenerationCommonConfig, - GenerationUsage, - Media, - MediaPart, - Message, - ModelInfo, - Part, - RetrieverRequest, - RetrieverResponse, - Role, - Stage, - Supports, - TextPart, - ToolDefinition, - ToolRequest, - ToolRequestPart, - ToolResponse, - ToolResponsePart, -) __all__ = [ + ActionKind.__name__, ActionRunContext.__name__, Document.__name__, - Embedding.__name__, - EmbedRequest.__name__, - EmbedResponse.__name__, - GenerateRequest.__name__, - GenerateResponse.__name__, - GenerateResponseChunk.__name__, Genkit.__name__, GenkitRegistry.__name__, - Media.__name__, - Message.__name__, Plugin.__name__, - RetrieverRequest.__name__, - RetrieverResponse.__name__, - Role.__name__, ToolRunContext.__name__, - ToolResponse.__name__, - ToolRequest.__name__, - Part.__name__, - ModelInfo.__name__, - Supports.__name__, - ActionKind.__name__, - TextPart.__name__, - MediaPart.__name__, - DataPart.__name__, - CustomPart.__name__, - ToolRequestPart.__name__, - ToolResponsePart.__name__, - GenerationCommonConfig.__name__, - GenerationUsage.__name__, - ToolDefinition.__name__, tool_response.__name__, - Stage.__name__, ] diff --git a/py/packages/genkit-ai/src/genkit/ai/registry.py b/py/packages/genkit-ai/src/genkit/ai/registry.py index c8417dd4ba..404b60e077 100644 --- a/py/packages/genkit-ai/src/genkit/ai/registry.py +++ b/py/packages/genkit-ai/src/genkit/ai/registry.py @@ -54,7 +54,7 @@ from genkit.core.action import Action, ActionKind from genkit.core.registry import Registry from genkit.core.schema import to_json_schema -from genkit.core.typing import ( +from genkit.typing import ( GenerationCommonConfig, Message, ModelInfo, diff --git a/py/packages/genkit-ai/src/genkit/ai/veneer.py b/py/packages/genkit-ai/src/genkit/ai/veneer.py index 7099523cc4..095a6f75a7 100644 --- a/py/packages/genkit-ai/src/genkit/ai/veneer.py +++ b/py/packages/genkit-ai/src/genkit/ai/veneer.py @@ -118,7 +118,7 @@ async def foo(...): from genkit.core.action import ActionKind, ActionRunContext from genkit.core.environment import is_dev_environment from genkit.core.reflection import make_reflection_server -from genkit.core.typing import ( +from genkit.typing import ( DocumentData, GenerationCommonConfig, Message, diff --git a/py/packages/genkit-ai/src/genkit/blocks/document.py b/py/packages/genkit-ai/src/genkit/blocks/document.py index e9f63fe1b0..9a19ac0625 100644 --- a/py/packages/genkit-ai/src/genkit/blocks/document.py +++ b/py/packages/genkit-ai/src/genkit/blocks/document.py @@ -25,7 +25,7 @@ from copy import deepcopy from typing import Any -from genkit.core.typing import ( +from genkit.typing import ( DocumentData, DocumentPart, Embedding, diff --git a/py/packages/genkit-ai/src/genkit/blocks/embedding.py b/py/packages/genkit-ai/src/genkit/blocks/embedding.py index 9557b20627..9fd912c948 100644 --- a/py/packages/genkit-ai/src/genkit/blocks/embedding.py +++ b/py/packages/genkit-ai/src/genkit/blocks/embedding.py @@ -16,6 +16,6 @@ from collections.abc import Callable -from genkit.core.typing import EmbedRequest, EmbedResponse +from genkit.typing import EmbedRequest, EmbedResponse type EmbedderFn = Callable[[EmbedRequest], EmbedResponse] diff --git a/py/packages/genkit-ai/src/genkit/blocks/formats/types.py b/py/packages/genkit-ai/src/genkit/blocks/formats/types.py index f6517c5781..f03453ba9e 100644 --- a/py/packages/genkit-ai/src/genkit/blocks/formats/types.py +++ b/py/packages/genkit-ai/src/genkit/blocks/formats/types.py @@ -24,7 +24,7 @@ GenerateResponseChunkWrapper, MessageWrapper, ) -from genkit.core.typing import ( +from genkit.typing import ( OutputConfig, ) diff --git a/py/packages/genkit-ai/src/genkit/blocks/generate.py b/py/packages/genkit-ai/src/genkit/blocks/generate.py index b16cb15188..9982dabb6b 100644 --- a/py/packages/genkit-ai/src/genkit/blocks/generate.py +++ b/py/packages/genkit-ai/src/genkit/blocks/generate.py @@ -35,7 +35,7 @@ from genkit.core.action import ActionRunContext from genkit.core.error import GenkitError, StatusName from genkit.core.registry import Action, ActionKind, Registry -from genkit.core.typing import ( +from genkit.typing import ( GenerateActionOptions, GenerateRequest, GenerateResponse, @@ -617,9 +617,11 @@ async def _resolve_tool_request( if tool_request_part.metadata else {} ), - 'interrupt': interrupt_error.metadata - if interrupt_error.metadata - else True, + 'interrupt': ( + interrupt_error.metadata + if interrupt_error.metadata + else True + ), }, ), ) @@ -686,9 +688,11 @@ async def _resolve_resume_options( role=Role.TOOL, content=tool_responses, metadata={ - 'resumed': raw_request.resume.metadata - if raw_request.resume.metadata - else True + 'resumed': ( + raw_request.resume.metadata + if raw_request.resume.metadata + else True + ) }, ) @@ -724,9 +728,11 @@ def _resolve_resumed_tool_request( # if there's a corresponding reply, append it to toolResponses provided_response = _find_corresponding_tool_response( - raw_request.resume.respond - if raw_request.resume and raw_request.resume.respond - else [], + ( + raw_request.resume.respond + if raw_request.resume and raw_request.resume.respond + else [] + ), tool_request_part.root, ) if provided_response: diff --git a/py/packages/genkit-ai/src/genkit/blocks/messages.py b/py/packages/genkit-ai/src/genkit/blocks/messages.py index 21ab0b4a32..e5c3ccb1c3 100644 --- a/py/packages/genkit-ai/src/genkit/blocks/messages.py +++ b/py/packages/genkit-ai/src/genkit/blocks/messages.py @@ -16,7 +16,7 @@ """Utilities for working with messages.""" -from genkit.core.typing import ( +from genkit.typing import ( Message, Metadata, Part, diff --git a/py/packages/genkit-ai/src/genkit/blocks/middleware.py b/py/packages/genkit-ai/src/genkit/blocks/middleware.py index a77316f3a6..f87f9510ab 100644 --- a/py/packages/genkit-ai/src/genkit/blocks/middleware.py +++ b/py/packages/genkit-ai/src/genkit/blocks/middleware.py @@ -26,7 +26,7 @@ text_from_content, ) from genkit.core.action import ActionRunContext -from genkit.core.typing import ( +from genkit.typing import ( DocumentData, GenerateRequest, GenerateResponse, diff --git a/py/packages/genkit-ai/src/genkit/blocks/model.py b/py/packages/genkit-ai/src/genkit/blocks/model.py index fa322088f5..d8a8eb2e90 100644 --- a/py/packages/genkit-ai/src/genkit/blocks/model.py +++ b/py/packages/genkit-ai/src/genkit/blocks/model.py @@ -36,7 +36,7 @@ def my_model(request: GenerateRequest) -> GenerateResponse: from genkit.core.action import ActionRunContext from genkit.core.extract import extract_json -from genkit.core.typing import ( +from genkit.typing import ( Candidate, DocumentPart, GenerateRequest, diff --git a/py/packages/genkit-ai/src/genkit/blocks/prompt.py b/py/packages/genkit-ai/src/genkit/blocks/prompt.py index 84c95dac68..14b5aed168 100644 --- a/py/packages/genkit-ai/src/genkit/blocks/prompt.py +++ b/py/packages/genkit-ai/src/genkit/blocks/prompt.py @@ -39,7 +39,7 @@ from genkit.core.action import ActionRunContext from genkit.core.registry import Registry from genkit.core.schema import to_json_schema -from genkit.core.typing import ( +from genkit.typing import ( DocumentData, GenerateActionOptions, GenerateActionOutputConfig, diff --git a/py/packages/genkit-ai/src/genkit/blocks/retriever.py b/py/packages/genkit-ai/src/genkit/blocks/retriever.py index 67c97c3b67..11fd793173 100644 --- a/py/packages/genkit-ai/src/genkit/blocks/retriever.py +++ b/py/packages/genkit-ai/src/genkit/blocks/retriever.py @@ -25,7 +25,7 @@ from collections.abc import Callable from genkit.blocks.document import Document -from genkit.core.typing import RetrieverResponse +from genkit.typing import RetrieverResponse # User-provided retriever function that queries the datastore type RetrieverFn[T] = Callable[[Document, T], RetrieverResponse] diff --git a/py/packages/genkit-ai/src/genkit/blocks/tools.py b/py/packages/genkit-ai/src/genkit/blocks/tools.py index 1d3a2dfd52..85e4b75020 100644 --- a/py/packages/genkit-ai/src/genkit/blocks/tools.py +++ b/py/packages/genkit-ai/src/genkit/blocks/tools.py @@ -17,7 +17,7 @@ from typing import Any from genkit.core.action import ActionRunContext -from genkit.core.typing import Part, ToolRequestPart, ToolResponse +from genkit.typing import Part, ToolRequestPart, ToolResponse class ToolRunContext(ActionRunContext): diff --git a/py/packages/genkit-ai/src/genkit/testing.py b/py/packages/genkit-ai/src/genkit/testing.py index 0c304b48b8..2e5fd6ae88 100644 --- a/py/packages/genkit-ai/src/genkit/testing.py +++ b/py/packages/genkit-ai/src/genkit/testing.py @@ -8,7 +8,7 @@ from genkit.ai import Genkit from genkit.codec import dump_json from genkit.core.action import ActionRunContext -from genkit.core.typing import ( +from genkit.typing import ( GenerateRequest, GenerateResponse, GenerateResponseChunk, diff --git a/py/packages/genkit-ai/src/genkit/core/typing.py b/py/packages/genkit-ai/src/genkit/typing.py similarity index 99% rename from py/packages/genkit-ai/src/genkit/core/typing.py rename to py/packages/genkit-ai/src/genkit/typing.py index 2d4d91f71e..525a3378fc 100644 --- a/py/packages/genkit-ai/src/genkit/core/typing.py +++ b/py/packages/genkit-ai/src/genkit/typing.py @@ -568,7 +568,7 @@ class DataPart(BaseModel): """Model for datapart data.""" model_config = ConfigDict(extra='forbid', populate_by_name=True) - text: Text | None = None + text: str | None = None media: MediaModel | None = None tool_request: ToolRequestModel | None = Field(None, alias='toolRequest') tool_response: ToolResponseModel | None = Field(None, alias='toolResponse') @@ -581,7 +581,7 @@ class MediaPart(BaseModel): """Model for mediapart data.""" model_config = ConfigDict(extra='forbid', populate_by_name=True) - text: Text | None = None + text: str | None = None media: Media tool_request: ToolRequestModel | None = Field(None, alias='toolRequest') tool_response: ToolResponseModel | None = Field(None, alias='toolResponse') @@ -607,7 +607,7 @@ class ToolRequestPart(BaseModel): """Model for toolrequestpart data.""" model_config = ConfigDict(extra='forbid', populate_by_name=True) - text: Text | None = None + text: str | None = None media: MediaModel | None = None tool_request: ToolRequest = Field(..., alias='toolRequest') tool_response: ToolResponseModel | None = Field(None, alias='toolResponse') @@ -620,7 +620,7 @@ class ToolResponsePart(BaseModel): """Model for toolresponsepart data.""" model_config = ConfigDict(extra='forbid', populate_by_name=True) - text: Text | None = None + text: str | None = None media: MediaModel | None = None tool_request: ToolRequestModel | None = Field(None, alias='toolRequest') tool_response: ToolResponse = Field(..., alias='toolResponse') diff --git a/py/packages/genkit-ai/tests/genkit/blocks/document_test.py b/py/packages/genkit-ai/tests/genkit/blocks/document_test.py index c1b4634526..1ab8d1e9da 100644 --- a/py/packages/genkit-ai/tests/genkit/blocks/document_test.py +++ b/py/packages/genkit-ai/tests/genkit/blocks/document_test.py @@ -17,7 +17,7 @@ """Tests for Genkit document.""" from genkit.blocks.document import Document -from genkit.core.typing import ( +from genkit.typing import ( DocumentData, DocumentPart, Embedding, diff --git a/py/packages/genkit-ai/tests/genkit/blocks/formats/json_test.py b/py/packages/genkit-ai/tests/genkit/blocks/formats/json_test.py index 400dd5cff4..f2369e7b8e 100644 --- a/py/packages/genkit-ai/tests/genkit/blocks/formats/json_test.py +++ b/py/packages/genkit-ai/tests/genkit/blocks/formats/json_test.py @@ -7,7 +7,7 @@ from genkit.blocks.formats import JsonFormat from genkit.blocks.model import GenerateResponseChunkWrapper, MessageWrapper -from genkit.core.typing import GenerateResponseChunk, Message, TextPart +from genkit.typing import GenerateResponseChunk, Message, TextPart def test_json_format() -> None: diff --git a/py/packages/genkit-ai/tests/genkit/blocks/generate_test.py b/py/packages/genkit-ai/tests/genkit/blocks/generate_test.py index effc7be907..b1e488dfaf 100644 --- a/py/packages/genkit-ai/tests/genkit/blocks/generate_test.py +++ b/py/packages/genkit-ai/tests/genkit/blocks/generate_test.py @@ -16,7 +16,11 @@ from genkit.blocks.model import text_from_content, text_from_message from genkit.codec import dump_dict, dump_json from genkit.core.action import ActionRunContext -from genkit.core.typing import ( +from genkit.testing import ( + define_echo_model, + define_programmable_model, +) +from genkit.typing import ( DocumentData, DocumentPart, FinishReason, @@ -28,10 +32,6 @@ Part, Role, ) -from genkit.testing import ( - define_echo_model, - define_programmable_model, -) @pytest.fixture diff --git a/py/packages/genkit-ai/tests/genkit/blocks/message_utils_test.py b/py/packages/genkit-ai/tests/genkit/blocks/message_utils_test.py index c8ae0665c2..b4fb17c371 100644 --- a/py/packages/genkit-ai/tests/genkit/blocks/message_utils_test.py +++ b/py/packages/genkit-ai/tests/genkit/blocks/message_utils_test.py @@ -6,7 +6,7 @@ """Tests for the message utils.""" from genkit.blocks.messages import inject_instructions -from genkit.core.typing import ( +from genkit.typing import ( Message, Metadata, Part, diff --git a/py/packages/genkit-ai/tests/genkit/blocks/middleware_test.py b/py/packages/genkit-ai/tests/genkit/blocks/middleware_test.py index 5b97b24827..e347686000 100644 --- a/py/packages/genkit-ai/tests/genkit/blocks/middleware_test.py +++ b/py/packages/genkit-ai/tests/genkit/blocks/middleware_test.py @@ -23,7 +23,7 @@ from genkit.blocks.middleware import augment_with_context from genkit.core.action import ActionRunContext -from genkit.core.typing import ( +from genkit.typing import ( DocumentData, GenerateRequest, GenerateResponse, diff --git a/py/packages/genkit-ai/tests/genkit/blocks/model_test.py b/py/packages/genkit-ai/tests/genkit/blocks/model_test.py index 04db6dda12..0f4c79f690 100644 --- a/py/packages/genkit-ai/tests/genkit/blocks/model_test.py +++ b/py/packages/genkit-ai/tests/genkit/blocks/model_test.py @@ -15,7 +15,7 @@ get_basic_usage_stats, get_part_counts, ) -from genkit.core.typing import ( +from genkit.typing import ( Candidate, GenerateRequest, GenerateResponse, diff --git a/py/packages/genkit-ai/tests/genkit/blocks/prompt_test.py b/py/packages/genkit-ai/tests/genkit/blocks/prompt_test.py index d49e0cf3ed..1152105f31 100644 --- a/py/packages/genkit-ai/tests/genkit/blocks/prompt_test.py +++ b/py/packages/genkit-ai/tests/genkit/blocks/prompt_test.py @@ -21,16 +21,16 @@ from pydantic import BaseModel, Field from genkit.ai import Genkit -from genkit.core.typing import ( +from genkit.testing import ( + define_echo_model, + define_programmable_model, +) +from genkit.typing import ( Message, Role, TextPart, ToolChoice, ) -from genkit.testing import ( - define_echo_model, - define_programmable_model, -) def setup_test(): diff --git a/py/packages/genkit-ai/tests/genkit/core/endpoints/reflection_test.py b/py/packages/genkit-ai/tests/genkit/core/endpoints/reflection_test.py index 84c2a03968..d805f32673 100644 --- a/py/packages/genkit-ai/tests/genkit/core/endpoints/reflection_test.py +++ b/py/packages/genkit-ai/tests/genkit/core/endpoints/reflection_test.py @@ -42,9 +42,7 @@ import pytest_asyncio # type: ignore from httpx import ASGITransport, AsyncClient # type: ignore -from genkit.core.reflection import ( - create_reflection_asgi_app, # type: ignore -) +from genkit.core.reflection import create_reflection_asgi_app # type: ignore from genkit.core.registry import Registry # type: ignore diff --git a/py/packages/genkit-ai/tests/genkit/veneer/veneer_test.py b/py/packages/genkit-ai/tests/genkit/veneer/veneer_test.py index 44130fc240..91cc4803d0 100644 --- a/py/packages/genkit-ai/tests/genkit/veneer/veneer_test.py +++ b/py/packages/genkit-ai/tests/genkit/veneer/veneer_test.py @@ -15,7 +15,13 @@ from genkit.blocks.formats.types import FormatDef, Formatter, FormatterConfig from genkit.blocks.model import MessageWrapper, text_from_message from genkit.core.action import ActionRunContext -from genkit.core.typing import ( +from genkit.testing import ( + EchoModel, + ProgrammableModel, + define_echo_model, + define_programmable_model, +) +from genkit.typing import ( DocumentData, DocumentPart, FinishReason, @@ -37,12 +43,6 @@ ToolRequest, ToolResponse, ) -from genkit.testing import ( - EchoModel, - ProgrammableModel, - define_echo_model, - define_programmable_model, -) type SetupFixture = tuple[Genkit, EchoModel, ProgrammableModel] diff --git a/py/plugins/compat-oai/src/genkit/plugins/compat_oai/models/handler.py b/py/plugins/compat-oai/src/genkit/plugins/compat_oai/models/handler.py index 9dfa7793b4..75f9b108f7 100644 --- a/py/plugins/compat-oai/src/genkit/plugins/compat_oai/models/handler.py +++ b/py/plugins/compat-oai/src/genkit/plugins/compat_oai/models/handler.py @@ -26,15 +26,15 @@ from genkit.ai.registry import GenkitRegistry from genkit.core.action import ActionRunContext -from genkit.core.typing import ( - GenerateRequest, - GenerateResponse, -) from genkit.plugins.compat_oai.models.model import OpenAIModel from genkit.plugins.compat_oai.models.model_info import ( SUPPORTED_OPENAI_MODELS, ) from genkit.plugins.compat_oai.typing import OpenAIConfig +from genkit.typing import ( + GenerateRequest, + GenerateResponse, +) class OpenAIModelHandler: diff --git a/py/plugins/compat-oai/src/genkit/plugins/compat_oai/models/model.py b/py/plugins/compat-oai/src/genkit/plugins/compat_oai/models/model.py index 13f3cefc4c..76ecb3d237 100644 --- a/py/plugins/compat-oai/src/genkit/plugins/compat_oai/models/model.py +++ b/py/plugins/compat-oai/src/genkit/plugins/compat_oai/models/model.py @@ -30,7 +30,7 @@ from genkit.ai.registry import GenkitRegistry from genkit.core.action import ActionKind -from genkit.core.typing import ( +from genkit.typing import ( GenerateRequest, GenerateResponse, GenerateResponseChunk, diff --git a/py/plugins/compat-oai/src/genkit/plugins/compat_oai/models/model_info.py b/py/plugins/compat-oai/src/genkit/plugins/compat_oai/models/model_info.py index 7221214ae0..768b641cdc 100644 --- a/py/plugins/compat-oai/src/genkit/plugins/compat_oai/models/model_info.py +++ b/py/plugins/compat-oai/src/genkit/plugins/compat_oai/models/model_info.py @@ -19,7 +19,7 @@ OpenAI Compatible Models for Genkit. """ -from genkit.core.typing import ( +from genkit.typing import ( ModelInfo, Supports, ) diff --git a/py/plugins/compat-oai/tests/conftest.py b/py/plugins/compat-oai/tests/conftest.py index f0b8e4470a..feff2d99dc 100644 --- a/py/plugins/compat-oai/tests/conftest.py +++ b/py/plugins/compat-oai/tests/conftest.py @@ -16,14 +16,14 @@ import pytest -from genkit.core.typing import ( +from genkit.plugins.compat_oai.models.model_info import GPT_4 +from genkit.plugins.compat_oai.typing import OpenAIConfig +from genkit.typing import ( GenerateRequest, Message, Role, TextPart, ) -from genkit.plugins.compat_oai.models.model_info import GPT_4 -from genkit.plugins.compat_oai.typing import OpenAIConfig @pytest.fixture diff --git a/py/plugins/compat-oai/tests/test_handler.py b/py/plugins/compat-oai/tests/test_handler.py index 81352bab5c..616b9a0a30 100644 --- a/py/plugins/compat-oai/tests/test_handler.py +++ b/py/plugins/compat-oai/tests/test_handler.py @@ -19,7 +19,6 @@ import pytest from genkit.core.action import ActionRunContext -from genkit.core.typing import GenerateResponse, Message, Role, TextPart from genkit.plugins.compat_oai.models import OpenAIModelHandler from genkit.plugins.compat_oai.models.model import OpenAIModel from genkit.plugins.compat_oai.models.model_info import ( @@ -27,6 +26,7 @@ GPT_4, SUPPORTED_OPENAI_MODELS, ) +from genkit.typing import GenerateResponse, Message, Role, TextPart def test_get_model_handler(): diff --git a/py/plugins/compat-oai/tests/test_model.py b/py/plugins/compat-oai/tests/test_model.py index e428dbf0b7..c10b334ba6 100644 --- a/py/plugins/compat-oai/tests/test_model.py +++ b/py/plugins/compat-oai/tests/test_model.py @@ -18,13 +18,13 @@ import pytest -from genkit.core.typing import ( +from genkit.plugins.compat_oai.models import OpenAIModel +from genkit.plugins.compat_oai.models.model_info import GPT_4 +from genkit.typing import ( GenerateResponse, GenerateResponseChunk, Role, ) -from genkit.plugins.compat_oai.models import OpenAIModel -from genkit.plugins.compat_oai.models.model_info import GPT_4 def test_get_messages(sample_request): diff --git a/py/plugins/compat-oai/tests/test_tool_calling.py b/py/plugins/compat-oai/tests/test_tool_calling.py index 10e8286d2e..52d69f9d14 100644 --- a/py/plugins/compat-oai/tests/test_tool_calling.py +++ b/py/plugins/compat-oai/tests/test_tool_calling.py @@ -17,9 +17,9 @@ from unittest.mock import MagicMock from genkit.core.action import ActionKind -from genkit.core.typing import GenerateResponseChunk from genkit.plugins.compat_oai.models import OpenAIModel from genkit.plugins.compat_oai.models.model_info import GPT_4 +from genkit.typing import GenerateResponseChunk def test_get_evaluated_tool_message_param_returns_expected_message(): diff --git a/py/plugins/dev-local-vector-store/src/genkit/plugins/dev_local_vector_store/__init__.py b/py/plugins/dev-local-vector-store/src/genkit/plugins/dev_local_vector_store/__init__.py index d85f95fa11..1bd71c3070 100644 --- a/py/plugins/dev-local-vector-store/src/genkit/plugins/dev_local_vector_store/__init__.py +++ b/py/plugins/dev-local-vector-store/src/genkit/plugins/dev_local_vector_store/__init__.py @@ -13,5 +13,3 @@ # limitations under the License. # # SPDX-License-Identifier: Apache-2.0 - - diff --git a/py/plugins/dev-local-vector-store/src/genkit/plugins/dev_local_vector_store/constant.py b/py/plugins/dev-local-vector-store/src/genkit/plugins/dev_local_vector_store/constant.py index 861ae90afa..209c2e051a 100644 --- a/py/plugins/dev-local-vector-store/src/genkit/plugins/dev_local_vector_store/constant.py +++ b/py/plugins/dev-local-vector-store/src/genkit/plugins/dev_local_vector_store/constant.py @@ -19,7 +19,7 @@ from pydantic import BaseModel -from genkit.core.typing import DocumentData, Embedding +from genkit.typing import DocumentData, Embedding class Params(BaseModel): diff --git a/py/plugins/dev-local-vector-store/src/genkit/plugins/dev_local_vector_store/indexer.py b/py/plugins/dev-local-vector-store/src/genkit/plugins/dev_local_vector_store/indexer.py index 5186e6fda7..f47b13d248 100644 --- a/py/plugins/dev-local-vector-store/src/genkit/plugins/dev_local_vector_store/indexer.py +++ b/py/plugins/dev-local-vector-store/src/genkit/plugins/dev_local_vector_store/indexer.py @@ -20,11 +20,11 @@ from hashlib import md5 from genkit.blocks.document import Document -from genkit.core.typing import Docs, Embedding from genkit.plugins.dev_local_vector_store.constant import DbValue from genkit.plugins.dev_local_vector_store.local_vector_store_api import ( LocalVectorStoreAPI, ) +from genkit.typing import Docs, Embedding class DevLocalVectorStoreIndexer(LocalVectorStoreAPI): diff --git a/py/plugins/dev-local-vector-store/src/genkit/plugins/dev_local_vector_store/plugin_api.py b/py/plugins/dev-local-vector-store/src/genkit/plugins/dev_local_vector_store/plugin_api.py index 6fe8bcf6ca..0f6c151783 100644 --- a/py/plugins/dev-local-vector-store/src/genkit/plugins/dev_local_vector_store/plugin_api.py +++ b/py/plugins/dev-local-vector-store/src/genkit/plugins/dev_local_vector_store/plugin_api.py @@ -21,7 +21,6 @@ from genkit.ai.plugin import Plugin from genkit.ai.registry import GenkitRegistry from genkit.core.action import Action -from genkit.core.typing import Docs from genkit.plugins.dev_local_vector_store.constant import Params from genkit.plugins.dev_local_vector_store.indexer import ( DevLocalVectorStoreIndexer, @@ -30,6 +29,7 @@ DevLocalVectorStoreRetriever, RetrieverOptionsSchema, ) +from genkit.typing import Docs LOG = logging.getLogger(__name__) diff --git a/py/plugins/dev-local-vector-store/src/genkit/plugins/dev_local_vector_store/retriever.py b/py/plugins/dev-local-vector-store/src/genkit/plugins/dev_local_vector_store/retriever.py index bd6dffe69a..ee15a523e6 100644 --- a/py/plugins/dev-local-vector-store/src/genkit/plugins/dev_local_vector_store/retriever.py +++ b/py/plugins/dev-local-vector-store/src/genkit/plugins/dev_local_vector_store/retriever.py @@ -19,10 +19,10 @@ from genkit.blocks.document import Document from genkit.core.action import ActionRunContext -from genkit.core.typing import Embedding, RetrieverRequest from genkit.plugins.dev_local_vector_store.local_vector_store_api import ( LocalVectorStoreAPI, ) +from genkit.typing import Embedding, RetrieverRequest class ScoredDocument(BaseModel): diff --git a/py/plugins/google-ai/src/genkit/plugins/google_ai/models/gemini.py b/py/plugins/google-ai/src/genkit/plugins/google_ai/models/gemini.py index 1acd2832ee..58acb1eb98 100644 --- a/py/plugins/google-ai/src/genkit/plugins/google_ai/models/gemini.py +++ b/py/plugins/google-ai/src/genkit/plugins/google_ai/models/gemini.py @@ -20,7 +20,7 @@ from google import genai from genkit.core.action import ActionRunContext -from genkit.core.typing import ( +from genkit.typing import ( CustomPart, GenerateRequest, GenerateResponse, diff --git a/py/plugins/google-genai/src/genkit/plugins/google_genai/google.py b/py/plugins/google-genai/src/genkit/plugins/google_genai/google.py index 546b52f783..93a596fd3f 100644 --- a/py/plugins/google-genai/src/genkit/plugins/google_genai/google.py +++ b/py/plugins/google-genai/src/genkit/plugins/google_genai/google.py @@ -65,6 +65,13 @@ def __init__( debug_config: DebugConfig | None = None, http_options: HttpOptions | HttpOptionsDict | None = None, ): + """Initialize the GoogleGenai plugin. + + Args: + vertexai: Whether to use Vertex AI. + api_key: The API key to use. + credentials: The credentials to use. + """ api_key = api_key if api_key else os.getenv('GEMINI_API_KEY') if not vertexai and not api_key: raise ValueError( diff --git a/py/plugins/google-genai/src/genkit/plugins/google_genai/models/__init__.py b/py/plugins/google-genai/src/genkit/plugins/google_genai/models/__init__.py index 19add86cb8..1bd71c3070 100644 --- a/py/plugins/google-genai/src/genkit/plugins/google_genai/models/__init__.py +++ b/py/plugins/google-genai/src/genkit/plugins/google_genai/models/__init__.py @@ -13,4 +13,3 @@ # limitations under the License. # # SPDX-License-Identifier: Apache-2.0 - diff --git a/py/plugins/google-genai/src/genkit/plugins/google_genai/models/embedder.py b/py/plugins/google-genai/src/genkit/plugins/google_genai/models/embedder.py index 87fe7ca371..63d25fb0f1 100644 --- a/py/plugins/google-genai/src/genkit/plugins/google_genai/models/embedder.py +++ b/py/plugins/google-genai/src/genkit/plugins/google_genai/models/embedder.py @@ -14,12 +14,14 @@ # # SPDX-License-Identifier: Apache-2.0 +"""Google-Genai embedder model.""" + import enum from google import genai -from genkit.ai import Embedding, EmbedRequest, EmbedResponse from genkit.plugins.google_genai.models.utils import PartConverter +from genkit.typing import Embedding, EmbedRequest, EmbedResponse class VertexEmbeddingModels(enum.StrEnum): diff --git a/py/plugins/google-genai/src/genkit/plugins/google_genai/models/gemini.py b/py/plugins/google-genai/src/genkit/plugins/google_genai/models/gemini.py index d2ef6c81fe..838a17be86 100644 --- a/py/plugins/google-genai/src/genkit/plugins/google_genai/models/gemini.py +++ b/py/plugins/google-genai/src/genkit/plugins/google_genai/models/gemini.py @@ -127,11 +127,19 @@ from genkit.ai import ( ActionKind, ActionRunContext, + GenkitRegistry, +) +from genkit.lang.deprecations import ( + DeprecationInfo, + DeprecationStatus, + deprecated_enum_metafactory, +) +from genkit.plugins.google_genai.models.utils import PartConverter +from genkit.typing import ( GenerateRequest, GenerateResponse, GenerateResponseChunk, GenerationCommonConfig, - GenkitRegistry, Message, ModelInfo, Role, @@ -139,12 +147,6 @@ Supports, ToolDefinition, ) -from genkit.lang.deprecations import ( - DeprecationInfo, - DeprecationStatus, - deprecated_enum_metafactory, -) -from genkit.plugins.google_genai.models.utils import PartConverter class GeminiConfigSchema(genai_types.GenerateContentConfig): diff --git a/py/plugins/google-genai/src/genkit/plugins/google_genai/models/utils.py b/py/plugins/google-genai/src/genkit/plugins/google_genai/models/utils.py index 7fce53018e..2091042f7c 100644 --- a/py/plugins/google-genai/src/genkit/plugins/google_genai/models/utils.py +++ b/py/plugins/google-genai/src/genkit/plugins/google_genai/models/utils.py @@ -17,7 +17,7 @@ from google import genai -from genkit.core.typing import ( +from genkit.typing import ( CustomPart, Media, MediaPart, diff --git a/py/plugins/google-genai/src/genkit/py.typed b/py/plugins/google-genai/src/genkit/py.typed new file mode 100644 index 0000000000..e69de29bb2 diff --git a/py/plugins/google-genai/test/models/test_googlegenai_embedder.py b/py/plugins/google-genai/test/models/test_googlegenai_embedder.py index d324363ce4..b59113577f 100644 --- a/py/plugins/google-genai/test/models/test_googlegenai_embedder.py +++ b/py/plugins/google-genai/test/models/test_googlegenai_embedder.py @@ -14,19 +14,26 @@ # # SPDX-License-Identifier: Apache-2.0 +"""Test the Google-Genai embedder model.""" + import pytest from google import genai -from genkit.ai import Document, EmbedRequest, EmbedResponse +from genkit.ai import Document from genkit.plugins.google_genai.models.embedder import ( Embedder, GeminiEmbeddingModels, ) +from genkit.typing import ( + EmbedRequest, + EmbedResponse, +) @pytest.mark.asyncio @pytest.mark.parametrize('version', [x for x in GeminiEmbeddingModels]) async def test_embedding(mocker, version): + """Test the embedding method.""" request_text = 'request text' embedding_values = [0.0017063986, -0.044727605, 0.043327782, 0.00044852644] diff --git a/py/plugins/google-genai/test/models/test_googlegenai_gemini.py b/py/plugins/google-genai/test/models/test_googlegenai_gemini.py index 2593a2d876..3d74a5be4f 100644 --- a/py/plugins/google-genai/test/models/test_googlegenai_gemini.py +++ b/py/plugins/google-genai/test/models/test_googlegenai_gemini.py @@ -19,8 +19,13 @@ import pytest from google import genai -from genkit.ai import ( - ActionRunContext, +from genkit.ai import ActionRunContext +from genkit.plugins.google_genai.models.gemini import ( + GeminiApiOnlyVersion, + GeminiModel, + GeminiVersion, +) +from genkit.typing import ( GenerateRequest, GenerateResponse, MediaPart, @@ -29,16 +34,12 @@ Role, TextPart, ) -from genkit.plugins.google_genai.models.gemini import ( - GeminiApiOnlyVersion, - GeminiModel, - GeminiVersion, -) @pytest.mark.asyncio @pytest.mark.parametrize('version', [x for x in GeminiVersion]) async def test_generate_text_response(mocker, version): + """Test the generate method for text responses.""" response_text = 'request answer' request_text = 'response question' @@ -85,6 +86,7 @@ async def test_generate_text_response(mocker, version): @pytest.mark.asyncio @pytest.mark.parametrize('version', [x for x in GeminiVersion]) async def test_generate_stream_text_response(mocker, version): + """Test the generate method for text responses.""" response_text = 'request answer' request_text = 'response question' @@ -134,6 +136,7 @@ async def test_generate_stream_text_response(mocker, version): @pytest.mark.asyncio @pytest.mark.parametrize('version', [x for x in GeminiApiOnlyVersion]) async def test_generate_media_response(mocker, version): + """Test generate method for media responses.""" request_text = 'response question' response_byte_string = b'\x89PNG\r\n\x1a\n' response_mimetype = 'image/png' diff --git a/py/plugins/ollama/src/genkit/plugins/ollama/models.py b/py/plugins/ollama/src/genkit/plugins/ollama/models.py index 36a67743eb..8e75bc7bb5 100644 --- a/py/plugins/ollama/src/genkit/plugins/ollama/models.py +++ b/py/plugins/ollama/src/genkit/plugins/ollama/models.py @@ -22,7 +22,11 @@ import ollama as ollama_api from genkit.blocks.model import get_basic_usage_stats from genkit.core.action import ActionRunContext -from genkit.core.typing import ( +from genkit.plugins.ollama.constants import ( + DEFAULT_OLLAMA_SERVER_URL, + OllamaAPITypes, +) +from genkit.typing import ( GenerateRequest, GenerateResponse, GenerateResponseChunk, @@ -38,10 +42,6 @@ ToolRequestPart, ToolResponsePart, ) -from genkit.plugins.ollama.constants import ( - DEFAULT_OLLAMA_SERVER_URL, - OllamaAPITypes, -) LOG = logging.getLogger(__name__) diff --git a/py/plugins/ollama/tests/test_plugin_api.py b/py/plugins/ollama/tests/test_plugin_api.py index 2bbd2a3bfa..fc641d0d99 100644 --- a/py/plugins/ollama/tests/test_plugin_api.py +++ b/py/plugins/ollama/tests/test_plugin_api.py @@ -21,7 +21,7 @@ from genkit.ai import Genkit from genkit.core.action import ActionKind -from genkit.core.typing import GenerateResponse, Message, Role, TextPart +from genkit.typing import GenerateResponse, Message, Role, TextPart def test_adding_ollama_chat_model_to_genkit_veneer( diff --git a/py/plugins/vertex-ai/src/genkit/plugins/vertex_ai/embedding.py b/py/plugins/vertex-ai/src/genkit/plugins/vertex_ai/embedding.py index ad38104d34..049770bc3c 100644 --- a/py/plugins/vertex-ai/src/genkit/plugins/vertex_ai/embedding.py +++ b/py/plugins/vertex-ai/src/genkit/plugins/vertex_ai/embedding.py @@ -22,7 +22,7 @@ from vertexai.language_models import TextEmbeddingInput, TextEmbeddingModel from genkit.blocks.document import Document -from genkit.core.typing import Embedding, EmbedRequest, EmbedResponse +from genkit.typing import Embedding, EmbedRequest, EmbedResponse class EmbeddingModels(StrEnum): diff --git a/py/plugins/vertex-ai/src/genkit/plugins/vertex_ai/gemini.py b/py/plugins/vertex-ai/src/genkit/plugins/vertex_ai/gemini.py index 6e5d601c77..559d0b4ced 100644 --- a/py/plugins/vertex-ai/src/genkit/plugins/vertex_ai/gemini.py +++ b/py/plugins/vertex-ai/src/genkit/plugins/vertex_ai/gemini.py @@ -29,7 +29,7 @@ from genkit.ai.registry import GenkitRegistry from genkit.core.action import ActionKind, ActionRunContext -from genkit.core.typing import ( +from genkit.typing import ( CustomPart, GenerateRequest, GenerateResponse, diff --git a/py/plugins/vertex-ai/src/genkit/plugins/vertex_ai/imagen.py b/py/plugins/vertex-ai/src/genkit/plugins/vertex_ai/imagen.py index 6a06358bef..6a802970c4 100644 --- a/py/plugins/vertex-ai/src/genkit/plugins/vertex_ai/imagen.py +++ b/py/plugins/vertex-ai/src/genkit/plugins/vertex_ai/imagen.py @@ -22,7 +22,7 @@ from vertexai.preview.vision_models import ImageGenerationModel from genkit.core.action import ActionRunContext -from genkit.core.typing import ( +from genkit.typing import ( GenerateRequest, GenerateResponse, Media, diff --git a/py/plugins/vertex-ai/tests/test_embeddings.py b/py/plugins/vertex-ai/tests/test_embeddings.py index ed2b2c4f8e..667fd992fc 100644 --- a/py/plugins/vertex-ai/tests/test_embeddings.py +++ b/py/plugins/vertex-ai/tests/test_embeddings.py @@ -17,12 +17,12 @@ import pytest from genkit.blocks.document import Document -from genkit.core.typing import EmbedRequest, EmbedResponse from genkit.plugins.vertex_ai.embedding import ( Embedder, EmbeddingModels, EmbeddingsTaskType, ) +from genkit.typing import EmbedRequest, EmbedResponse @pytest.mark.parametrize( diff --git a/py/plugins/vertex-ai/tests/test_gemini.py b/py/plugins/vertex-ai/tests/test_gemini.py index 143aba85ed..e2729f9872 100644 --- a/py/plugins/vertex-ai/tests/test_gemini.py +++ b/py/plugins/vertex-ai/tests/test_gemini.py @@ -19,14 +19,14 @@ import pytest from genkit.core.action import ActionRunContext -from genkit.core.typing import ( +from genkit.plugins.vertex_ai.gemini import Gemini, GeminiVersion +from genkit.typing import ( GenerateRequest, GenerateResponse, Message, Role, TextPart, ) -from genkit.plugins.vertex_ai.gemini import Gemini, GeminiVersion MULTILINE_CONTENT = [ 'Hi, Gemini!', diff --git a/py/plugins/vertex-ai/tests/test_imagen.py b/py/plugins/vertex-ai/tests/test_imagen.py index a228d96f1b..8373af8a1f 100644 --- a/py/plugins/vertex-ai/tests/test_imagen.py +++ b/py/plugins/vertex-ai/tests/test_imagen.py @@ -6,7 +6,8 @@ import pytest from genkit.core.action import ActionRunContext -from genkit.core.typing import ( +from genkit.plugins.vertex_ai.imagen import Imagen, ImagenVersion +from genkit.typing import ( GenerateRequest, GenerateResponse, Media, @@ -14,7 +15,6 @@ Role, TextPart, ) -from genkit.plugins.vertex_ai.imagen import Imagen, ImagenVersion @pytest.mark.parametrize('version', [x for x in ImagenVersion]) diff --git a/py/pyproject.toml b/py/pyproject.toml index d6c51314d7..1692347424 100644 --- a/py/pyproject.toml +++ b/py/pyproject.toml @@ -220,7 +220,7 @@ enable-version-header = true field-constraints = true input = "../genkit-tools/genkit-schema.json" input-file-type = "jsonschema" -output = "packages/genkit-ai/src/genkit/core/typing.py" +output = "packages/genkit-ai/src/genkit/typing.py" output-model-type = "pydantic_v2.BaseModel" snake-case-field = true strict-nullable = true diff --git a/py/samples/basic-gemini/src/main.py b/py/samples/basic-gemini/src/main.py index 30b939955e..68fd561388 100644 --- a/py/samples/basic-gemini/src/main.py +++ b/py/samples/basic-gemini/src/main.py @@ -25,7 +25,13 @@ from genkit.ai import Genkit from genkit.blocks.generate import generate_action from genkit.core.action import ActionRunContext -from genkit.core.typing import ( +from genkit.plugins.vertex_ai import ( + GeminiVersion, + ImagenVersion, + VertexAI, + vertexai_name, +) +from genkit.typing import ( GenerateActionOptions, GenerateResponseChunk, GenerationCommonConfig, @@ -33,12 +39,6 @@ Role, TextPart, ) -from genkit.plugins.vertex_ai import ( - GeminiVersion, - ImagenVersion, - VertexAI, - vertexai_name, -) logger = structlog.get_logger(__name__) diff --git a/py/samples/google-ai/src/hello.py b/py/samples/google-ai/src/hello.py index 0232aa4951..380972e6b8 100644 --- a/py/samples/google-ai/src/hello.py +++ b/py/samples/google-ai/src/hello.py @@ -17,13 +17,13 @@ import asyncio from genkit.ai import Genkit -from genkit.core.typing import GenerationCommonConfig, Message, Role, TextPart from genkit.plugins.google_ai import ( GoogleAi, GoogleAiPluginOptions, googleai_name, ) from genkit.plugins.google_ai.models import gemini +from genkit.typing import GenerationCommonConfig, Message, Role, TextPart ai = Genkit( plugins=[GoogleAi(plugin_params=GoogleAiPluginOptions())], diff --git a/py/samples/hello-google-genai/src/hello.py b/py/samples/hello-google-genai/src/hello.py index 2e1e22856d..c53630ac4a 100644 --- a/py/samples/hello-google-genai/src/hello.py +++ b/py/samples/hello-google-genai/src/hello.py @@ -19,12 +19,6 @@ from pydantic import BaseModel, Field from genkit.ai import Document, Genkit, ToolRunContext, tool_response -from genkit.core.typing import ( - GenerationCommonConfig, - Message, - Role, - TextPart, -) from genkit.plugins.google_ai.models import gemini from genkit.plugins.google_genai import ( EmbeddingTaskType, @@ -33,6 +27,12 @@ GoogleGenai, google_genai_name, ) +from genkit.typing import ( + GenerationCommonConfig, + Message, + Role, + TextPart, +) ai = Genkit( plugins=[GoogleGenai()], diff --git a/py/samples/menu/src/__init__.py b/py/samples/menu/src/__init__.py index 19add86cb8..1bd71c3070 100644 --- a/py/samples/menu/src/__init__.py +++ b/py/samples/menu/src/__init__.py @@ -13,4 +13,3 @@ # limitations under the License. # # SPDX-License-Identifier: Apache-2.0 - diff --git a/py/samples/ollama-hello/src/hello.py b/py/samples/ollama-hello/src/hello.py index 296a6161bb..ce614877ca 100644 --- a/py/samples/ollama-hello/src/hello.py +++ b/py/samples/ollama-hello/src/hello.py @@ -17,13 +17,13 @@ from pydantic import BaseModel from genkit.ai import Genkit -from genkit.core.typing import Message, Role, TextPart from genkit.plugins.ollama import Ollama, ollama_name from genkit.plugins.ollama.models import ( ModelDefinition, OllamaAPITypes, OllamaPluginParams, ) +from genkit.typing import Message, Role, TextPart # model can be pulled with `ollama pull *LLM_VERSION*` GEMMA_MODEL = 'gemma2:latest' diff --git a/py/samples/ollama-simple-embed/src/pokemon_glossary.py b/py/samples/ollama-simple-embed/src/pokemon_glossary.py index 304c166017..bb0f600bc5 100644 --- a/py/samples/ollama-simple-embed/src/pokemon_glossary.py +++ b/py/samples/ollama-simple-embed/src/pokemon_glossary.py @@ -17,7 +17,6 @@ from pydantic import BaseModel from genkit.ai import Genkit -from genkit.core.typing import GenerateResponse from genkit.plugins.ollama import Ollama, ollama_name from genkit.plugins.ollama.constants import OllamaAPITypes from genkit.plugins.ollama.models import ( @@ -25,6 +24,7 @@ ModelDefinition, OllamaPluginParams, ) +from genkit.typing import GenerateResponse EMBEDDER_MODEL = 'nomic-embed-text' EMBEDDER_DIMENSIONS = 768 diff --git a/py/samples/openai/src/main.py b/py/samples/openai/src/main.py index 0f561e124c..4efe08f4a1 100644 --- a/py/samples/openai/src/main.py +++ b/py/samples/openai/src/main.py @@ -21,8 +21,8 @@ from pydantic import BaseModel, Field from genkit.ai import Genkit -from genkit.core.typing import Message, TextPart from genkit.plugins.compat_oai import OpenAI, openai_model +from genkit.typing import Message, TextPart ai = Genkit(plugins=[OpenAI()], model=openai_model('gpt-4')) diff --git a/py/samples/vertex-ai-imagen/src/vertex-ai-imagen.py b/py/samples/vertex-ai-imagen/src/vertex-ai-imagen.py index cf21d0a304..530e4bb317 100644 --- a/py/samples/vertex-ai-imagen/src/vertex-ai-imagen.py +++ b/py/samples/vertex-ai-imagen/src/vertex-ai-imagen.py @@ -20,13 +20,13 @@ import base64 from genkit.ai import Genkit -from genkit.core.typing import Message, Role, TextPart from genkit.plugins.vertex_ai import ( ImagenOptions, ImagenVersion, VertexAI, vertexai_name, ) +from genkit.typing import Message, Role, TextPart ai = Genkit( plugins=[VertexAI()], model=vertexai_name(ImagenVersion.IMAGEN3_FAST) diff --git a/py/uv.lock b/py/uv.lock index a505e5fe1f..d4bce837a6 100644 --- a/py/uv.lock +++ b/py/uv.lock @@ -1,4 +1,5 @@ version = 1 +revision = 1 requires-python = ">=3.12" resolution-markers = [ "python_full_version >= '3.13'", @@ -685,7 +686,7 @@ wheels = [ [[package]] name = "dotpromptz" version = "0.1.0" -source = { git = "https://github.com/google/dotprompt.git?subdirectory=python%2Fdotpromptz&rev=main#ac92fbf3af7ac3207102c94c20d294d8c54b9dd4" } +source = { git = "https://github.com/google/dotprompt.git?subdirectory=python%2Fdotpromptz&rev=main#e5e8fba19c9a2d5f2b9b73c758f759883baf79e4" } dependencies = [ { name = "aiofiles" }, { name = "handlebarrz" }, @@ -1318,7 +1319,7 @@ wheels = [ [[package]] name = "handlebarrz" version = "0.1.0" -source = { git = "https://github.com/google/dotprompt.git?subdirectory=python%2Fhandlebarrz&rev=main#ac92fbf3af7ac3207102c94c20d294d8c54b9dd4" } +source = { git = "https://github.com/google/dotprompt.git?subdirectory=python%2Fhandlebarrz&rev=main#e5e8fba19c9a2d5f2b9b73c758f759883baf79e4" } dependencies = [ { name = "maturin" }, { name = "structlog" }, @@ -2907,7 +2908,7 @@ wheels = [ [[package]] name = "pydantic" -version = "2.11.0" +version = "2.11.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "annotated-types" }, @@ -2915,9 +2916,9 @@ dependencies = [ { name = "typing-extensions" }, { name = "typing-inspection" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/82/2a/4ba34614269b1e12a28b9fe54710983f5c3679f945797e86250c6269263f/pydantic-2.11.0.tar.gz", hash = "sha256:d6a287cd6037dee72f0597229256dfa246c4d61567a250e99f86b7b4626e2f41", size = 782184 } +sdist = { url = "https://files.pythonhosted.org/packages/93/a3/698b87a4d4d303d7c5f62ea5fbf7a79cab236ccfbd0a17847b7f77f8163e/pydantic-2.11.1.tar.gz", hash = "sha256:442557d2910e75c991c39f4b4ab18963d57b9b55122c8b2a9cd176d8c29ce968", size = 782817 } wheels = [ - { url = "https://files.pythonhosted.org/packages/09/2c/3a0a1b022bb028e4cd455c69a17ceaad809bf6763c110d093efc0d8f67aa/pydantic-2.11.0-py3-none-any.whl", hash = "sha256:d52535bb7aba33c2af820eaefd866f3322daf39319d03374921cd17fbbdf28f9", size = 442591 }, + { url = "https://files.pythonhosted.org/packages/cc/12/f9221a949f2419e2e23847303c002476c26fbcfd62dc7f3d25d0bec5ca99/pydantic-2.11.1-py3-none-any.whl", hash = "sha256:5b6c415eee9f8123a14d859be0c84363fec6b1feb6b688d6435801230b56e0b8", size = 442648 }, ] [package.optional-dependencies]