Skip to content

refactor(py/genkit-ai): genkit.core.typing -> genkit.typing to avoid manual re-exporting #2542

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Mar 29, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions py/bin/generate_schema_typing
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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."
Expand All @@ -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
25 changes: 12 additions & 13 deletions py/bin/publish_pypi.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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

15 changes: 8 additions & 7 deletions py/bin/sanitize_schema_typing.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
56 changes: 1 addition & 55 deletions py/packages/genkit-ai/src/genkit/ai/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -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__,
]
2 changes: 1 addition & 1 deletion py/packages/genkit-ai/src/genkit/ai/registry.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
2 changes: 1 addition & 1 deletion py/packages/genkit-ai/src/genkit/ai/veneer.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
2 changes: 1 addition & 1 deletion py/packages/genkit-ai/src/genkit/blocks/document.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
from copy import deepcopy
from typing import Any

from genkit.core.typing import (
from genkit.typing import (
DocumentData,
DocumentPart,
Embedding,
Expand Down
2 changes: 1 addition & 1 deletion py/packages/genkit-ai/src/genkit/blocks/embedding.py
Original file line number Diff line number Diff line change
Expand Up @@ -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]
2 changes: 1 addition & 1 deletion py/packages/genkit-ai/src/genkit/blocks/formats/types.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
GenerateResponseChunkWrapper,
MessageWrapper,
)
from genkit.core.typing import (
from genkit.typing import (
OutputConfig,
)

Expand Down
26 changes: 16 additions & 10 deletions py/packages/genkit-ai/src/genkit/blocks/generate.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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
),
},
),
)
Expand Down Expand Up @@ -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
)
},
)

Expand Down Expand Up @@ -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:
Expand Down
2 changes: 1 addition & 1 deletion py/packages/genkit-ai/src/genkit/blocks/messages.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@

"""Utilities for working with messages."""

from genkit.core.typing import (
from genkit.typing import (
Message,
Metadata,
Part,
Expand Down
2 changes: 1 addition & 1 deletion py/packages/genkit-ai/src/genkit/blocks/middleware.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
2 changes: 1 addition & 1 deletion py/packages/genkit-ai/src/genkit/blocks/model.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
2 changes: 1 addition & 1 deletion py/packages/genkit-ai/src/genkit/blocks/prompt.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
2 changes: 1 addition & 1 deletion py/packages/genkit-ai/src/genkit/blocks/retriever.py
Original file line number Diff line number Diff line change
Expand Up @@ -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]
2 changes: 1 addition & 1 deletion py/packages/genkit-ai/src/genkit/blocks/tools.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down
2 changes: 1 addition & 1 deletion py/packages/genkit-ai/src/genkit/testing.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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')
Expand All @@ -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')
Expand All @@ -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')
Expand All @@ -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')
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
Loading
Loading