Skip to content

Commit d34480b

Browse files
fix(py): fix with gemini
1 parent e1c6856 commit d34480b

File tree

7 files changed

+23
-28
lines changed

7 files changed

+23
-28
lines changed

genkit-tools/common/src/types/action.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,10 @@ export const ActionSchema = z
5353
.record(z.string(), CustomAnySchema)
5454
.describe('Metadata about the action (e.g. supported model features).')
5555
.nullish(),
56+
sampleInput: z
57+
.unknown()
58+
.describe('Sample input for the action to use as default in Dev UI.')
59+
.nullish(),
5660
})
5761
.openapi('Action');
5862

py/packages/genkit/src/genkit/ai/_aio.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -619,7 +619,7 @@ async def embed(
619619
{version, ...config, ...options} (options take precedence).
620620
621621
Args:
622-
embedder: Embedder name (e.g., 'googleai/gemini-embedding-001') or
622+
embedder: Embedder name (e.g., 'googleai/text-embedding-004') or
623623
an EmbedderRef with configuration.
624624
content: A single string, Document, or DocumentData to embed.
625625
metadata: Optional metadata to apply to the document. Only used
@@ -634,25 +634,25 @@ async def embed(
634634
ValueError: If content is not specified.
635635
636636
Example - Basic string embedding:
637-
>>> embeddings = await ai.embed(embedder='googleai/gemini-embedding-001', content='Hello, world!')
637+
>>> embeddings = await ai.embed(embedder='googleai/text-embedding-004', content='Hello, world!')
638638
>>> print(len(embeddings[0].embedding)) # Vector dimensions
639639
640640
Example - With metadata:
641641
>>> embeddings = await ai.embed(
642-
... embedder='googleai/gemini-embedding-001',
642+
... embedder='googleai/text-embedding-004',
643643
... content='Product description',
644644
... metadata={'category': 'electronics'},
645645
... )
646646
647647
Example - With embedder options:
648648
>>> embeddings = await ai.embed(
649-
... embedder='googleai/gemini-embedding-001',
649+
... embedder='googleai/text-embedding-004',
650650
... content='Search query',
651651
... options={'task_type': 'RETRIEVAL_QUERY'},
652652
... )
653653
654654
Example - Using EmbedderRef:
655-
>>> ref = create_embedder_ref('googleai/gemini-embedding-001', config={'task_type': 'CLUSTERING'})
655+
>>> ref = create_embedder_ref('googleai/text-embedding-004', config={'task_type': 'CLUSTERING'})
656656
>>> embeddings = await ai.embed(embedder=ref, content='Text')
657657
"""
658658
embedder_name = self._resolve_embedder_name(embedder)
@@ -706,7 +706,7 @@ async def embed_many(
706706
and passes options directly. This matches the JS canonical behavior.
707707
708708
Args:
709-
embedder: Embedder name (e.g., 'googleai/gemini-embedding-001') or
709+
embedder: Embedder name (e.g., 'googleai/text-embedding-004') or
710710
an EmbedderRef.
711711
content: List of strings, Documents, or DocumentData to embed.
712712
metadata: Optional metadata to apply to all items. Only used when
@@ -722,22 +722,22 @@ async def embed_many(
722722
723723
Example - Basic batch embedding:
724724
>>> embeddings = await ai.embed_many(
725-
... embedder='googleai/gemini-embedding-001',
725+
... embedder='googleai/text-embedding-004',
726726
... content=['Doc 1', 'Doc 2', 'Doc 3'],
727727
... )
728728
>>> for i, emb in enumerate(embeddings):
729729
... print(f'Doc {i}: {len(emb.embedding)} dims')
730730
731731
Example - With shared metadata:
732732
>>> embeddings = await ai.embed_many(
733-
... embedder='googleai/gemini-embedding-001',
733+
... embedder='googleai/text-embedding-004',
734734
... content=['text1', 'text2'],
735735
... metadata={'batch_id': 'batch-001'},
736736
... )
737737
738738
Example - With options (EmbedderRef config is NOT extracted):
739739
>>> embeddings = await ai.embed_many(
740-
... embedder='googleai/gemini-embedding-001',
740+
... embedder='googleai/text-embedding-004',
741741
... content=documents,
742742
... options={'task_type': 'RETRIEVAL_DOCUMENT'},
743743
... )

py/packages/genkit/src/genkit/blocks/embedding.py

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
| | vectors. Contains 'embedding' field and metadata. |
3232
+-------------------+------------------------------------------------------+
3333
| Embedder | A model/service that converts text to embeddings. |
34-
| | Examples: 'googleai/gemini-embedding-001'. Registered |
34+
| | Examples: 'googleai/text-embedding-004'. Registered |
3535
| | as actions, invoked via embed() and embed_many(). |
3636
+-------------------+------------------------------------------------------+
3737
| EmbedderRef | Reference bundling embedder name with optional |
@@ -68,14 +68,14 @@
6868
- ai.embed_many(): Embed multiple pieces of content in batch
6969
7070
Example - Single embedding:
71-
>>> embeddings = await ai.embed(embedder='googleai/gemini-embedding-001', content='Hello, world!')
71+
>>> embeddings = await ai.embed(embedder='googleai/text-embedding-004', content='Hello, world!')
7272
>>> vector = embeddings[0].embedding
7373
7474
Example - Batch embedding:
75-
>>> embeddings = await ai.embed_many(embedder='googleai/gemini-embedding-001', content=['Doc 1', 'Doc 2', 'Doc 3'])
75+
>>> embeddings = await ai.embed_many(embedder='googleai/text-embedding-004', content=['Doc 1', 'Doc 2', 'Doc 3'])
7676
7777
Example - Using EmbedderRef with configuration:
78-
>>> ref = create_embedder_ref('googleai/gemini-embedding-001', config={'task_type': 'CLUSTERING'}, version='v1')
78+
>>> ref = create_embedder_ref('googleai/text-embedding-004', config={'task_type': 'CLUSTERING'}, version='v1')
7979
>>> embeddings = await ai.embed(embedder=ref, content='My text')
8080
8181
Note on embed() vs embed_many():
@@ -195,16 +195,12 @@ def embedder_action_metadata(
195195

196196
embedder_info['customOptions'] = options.config_schema if options.config_schema else None
197197

198-
# Default sample input for easier testing in Dev UI
199-
sample_input: dict[str, object] = {'input': [{'content': [{'text': 'Hello, world!'}]}]}
200-
201198
return ActionMetadata(
202199
kind=cast(ActionKind, ActionKind.EMBEDDER),
203200
name=name,
204201
input_json_schema=to_json_schema(EmbedRequest),
205202
output_json_schema=to_json_schema(EmbedResponse),
206203
metadata=embedder_metadata_dict,
207-
sample_input=sample_input,
208204
)
209205

210206

py/packages/genkit/src/genkit/blocks/prompt.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -851,11 +851,9 @@ class RecipeInput(BaseModel):
851851
middleware = effective_opts.get('use') or self._use
852852
context = effective_opts.get('context')
853853

854-
rendered_options = await self.render(input=input, opts=effective_opts)
855-
856854
result = await generate_action(
857855
self._registry,
858-
rendered_options,
856+
await self.render(input=input, opts=effective_opts),
859857
on_chunk=on_chunk,
860858
middleware=middleware,
861859
context=context if context else ActionRunContext._current_context(), # pyright: ignore[reportPrivateUsage]

py/packages/genkit/src/genkit/core/action/_action.py

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -92,8 +92,7 @@
9292
from functools import cached_property
9393
from typing import Any, Generic, Protocol, cast, get_type_hints
9494

95-
from pydantic import BaseModel, ConfigDict, TypeAdapter, ValidationError
96-
from pydantic.alias_generators import to_camel
95+
from pydantic import BaseModel, TypeAdapter, ValidationError
9796
from typing_extensions import Never, TypeVar
9897

9998
from genkit.aio import Channel, ensure_async
@@ -525,8 +524,6 @@ def _initialize_io_schemas(
525524
class ActionMetadata(BaseModel):
526525
"""Metadata for actions."""
527526

528-
model_config = ConfigDict(alias_generator=to_camel, populate_by_name=True)
529-
530527
kind: ActionKind
531528
name: str
532529
description: str | None = None
@@ -536,7 +533,6 @@ class ActionMetadata(BaseModel):
536533
output_json_schema: dict[str, object] | None = None
537534
stream_schema: object | None = None
538535
metadata: dict[str, object] | None = None
539-
sample_input: dict[str, object] | None = None
540536

541537

542538
_SyncTracingWrapper = Callable[[object | None, ActionRunContext], ActionResponse[Any]]

py/packages/genkit/src/genkit/core/reflection.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,6 @@ def _build_actions_payload(
122122
'inputSchema': getattr(meta, 'input_json_schema', None),
123123
'outputSchema': getattr(meta, 'output_json_schema', None),
124124
'metadata': getattr(meta, 'metadata', None),
125-
'sampleInput': getattr(meta, 'sample_input', None),
126125
}
127126

128127
if key not in actions:

py/samples/framework-evaluator-demo/evaluator_demo/pdf_rag.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -141,14 +141,16 @@ def chunk_text(text: str, chunk_size: int, overlap: int) -> list[str]:
141141
# Define a flow to index documents into the "vector store"
142142
# genkit flow:run indexPdf '"./docs/sfspca-cat-adoption-handbook-2023.pdf"'
143143
@ai.flow(name='index_pdf')
144-
async def index_pdf(file_path: str = 'samples/framework-evaluator-demo/docs/cat-wiki.pdf') -> None:
144+
async def index_pdf(
145+
file_path: str = 'samples/framework-evaluator-demo/docs/cat-wiki.pdf',
146+
) -> None:
145147
"""Index a PDF file.
146148
147149
Args:
148150
file_path: Path to the PDF.
149151
150152
Example:
151-
>>> await index_pdf('doc.pdf')
153+
>>> await index_pdf('samples/framework-evaluator-demo/docs/cat-wiki.pdf')
152154
"""
153155
if not file_path:
154156
file_path = 'samples/framework-evaluator-demo/docs/cat-wiki.pdf'

0 commit comments

Comments
 (0)