Skip to content

feat(py/genkit): Integrating the define_prompt implementation #3390

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

Draft
wants to merge 1 commit into
base: main
Choose a base branch
from
Draft
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
13 changes: 11 additions & 2 deletions py/packages/genkit/src/genkit/blocks/prompt.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,8 @@
GenerateResponseWrapper,
ModelMiddleware,
)
from genkit.core.action import ActionRunContext
from genkit.core.action import ActionRunContext, Action
from genkit.core.action._action import define_action_with_input_schema
from genkit.core.registry import Registry
from genkit.core.schema import to_json_schema
from genkit.core.typing import (
Expand Down Expand Up @@ -271,7 +272,7 @@ def define_prompt(
Returns:
An ExecutablePrompt instance.
"""
return ExecutablePrompt(
prompt = ExecutablePrompt(
registry,
variant=variant,
model=model,
Expand All @@ -294,6 +295,14 @@ def define_prompt(
use=use,
)

define_action_with_input_schema(
registry,
prompt,
input_schema=input_schema,
metadata=metadata,
fn=to_generate_action_options,
)


def to_generate_action_options(
registry: Registry,
Expand Down
72 changes: 71 additions & 1 deletion py/packages/genkit/src/genkit/core/action/_action.py
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,7 @@
from ._tracing import record_input_metadata, record_output_metadata
from ._util import extract_action_args_and_types, noop_streaming_callback
from .types import ActionKind, ActionMetadataKey, ActionResponse
from ...blocks.prompt import to_generate_action_options

# TODO: add typing, generics
StreamingCallback = Callable[[Any], None]
Expand Down Expand Up @@ -456,7 +457,7 @@ def _initialize_io_schemas(
self._output_schema = TypeAdapter(Any).json_schema()
self._metadata[ActionMetadataKey.OUTPUT_KEY] = self._output_schema


# equivalent of ActionDesc
class ActionMetadata(BaseModel):
"""Metadata for actions."""

Expand Down Expand Up @@ -570,3 +571,72 @@ def sync_tracing_wrapper(input: Any | None, ctx: ActionRunContext) -> ActionResp
return ActionResponse(response=output, trace_id=trace_id)

return sync_tracing_wrapper, async_tracing_wrapper





def define_action_with_input_schema(
registry: Any,
name: str,
action_kind: ActionKind,
provider: str | None = None,
metadata: dict | None = None,
input_schema: dict | None = None,
fn: Callable[..., Any] = None
) -> Action:
"""
Crea y registra una nueva Action con un esquema de entrada definido dinámicamente.

Args:
registry: El registro donde se guardará la acción
provider: El proveedor de la acción
name: Nombre de la acción
action_type: Tipo de acción
metadata: Metadatos adicionales para la acción
input_schema: Esquema JSON que define la estructura de entrada
fn: Función que implementa la lógica de la acción

Returns:
ActionDef: Definición de la acción creada
"""
full_name = name

return define_action(
registry,
full_name,
action_kind,
provider,
metadata,
input_schema,
fn
)



def define_action(
registry: Any,
name: str,
action_kind: ActionKind,
provider: str | None = None,
metadata: dict | None = None,
input_schema: dict | None = None,
fn: Callable[..., Any] = None
):
full_name = name

if provider:
full_name = f"{provider}/{name}"

# Construir la clave para el registro
key = f"/{action_kind}/{full_name}"

return registry.register_action(
action_kind,
key,
fn=fn,
metadata=metadata,
metadata_fn=input_schema
)


Loading