Editor Agents Reference
GCP
encord_agents.gcp.dependencies
Dependencies for injection in GCP Cloud run functions.
This module contains dependencies that you can inject within your cloud functions. Dependencies that depend on others don't need to be used together. They'll work just fine alone.
Note that you can also use the following typed parameters. If the type annotations are not present, the injection mechanism cannot resolve the them:
from encord.project import Project
from encord.objects.ontology_labels_impl import LabelRowV2
from encord_agents import FrameData
...
@app.post("/my-agent-route")
def my_agent(
frame_data: FrameData,
project: Project,
label_row: LabelRowV2,
):
...
FrameData
is automatically injected via the api request body.Project
is automatically loaded based on the frame data.label_row_v2
is automatically loaded based on the frame data.
dep_client
Dependency to provide an authenticated user client.
Example:
from encord.user_client import EncordUserClient
from encord_agents.gcp import editor_agent
from encord_agents.gcp.dependencies import dep_client
...
@editor_agent()
def (
client: Annotated[EncordUserClient, Depends(dep_client)]
):
# Client will authenticated and ready to use.
client.get_dataset("")
Source code in encord_agents/gcp/dependencies.py
dep_data_lookup
Get a lookup to easily retrieve data rows and storage items associated with the given task.
Info
If you're just looking to get the associated storage item to a task, consider using dep_storage_item
instead.
The lookup can, e.g., be useful for
- Updating client metadata
- Downloading data from signed urls
- Matching data to other projects
Example:
from typing_extensions import Annotated
from encord.storage import StorageItem
from encord_agents import FrameData
from encord_agents.gcp import editor_agent, Depends
from encord_agents.gcp.dependencies import DataLookup, dep_data_lookup
@editor_agent()
def my_agent(
frame_data: FrameData,
lookup: Annotated[DataLookup, Depends(dep_data_lookup)]
):
print("data hash", lookup.get_data_row(frame_data.data_hash))
print("storage item", lookup.get_storage_item(frame_data.data_hash))
...
Parameters:
-
lookup
(Annotated[DataLookup, Depends(sharable)]
) –The object that you can use to lookup data rows and storage items. Automatically injected.
Returns:
-
DataLookup
–The (shared) lookup object.
Source code in encord_agents/gcp/dependencies.py
dep_object_crops
dep_object_crops(filter_ontology_objects: list[Object | str] | None = None) -> Callable[[FrameData, LabelRowV2, NDArray[np.uint8]], list[InstanceCrop]]
Get a list of object instances and frame crops associated with each object.
Useful, e.g., to be able to run each crop against a model.
Example:
@editor_agent
def my_agent(crops: Annotated[list[InstanceCrop], Depends[dep_object_crops(filter_ontology_objects=["eBw/75bg"])]]):
for crop in crops:
crop.content # <- this is raw numpy rgb values
crop.frame # <- this is the frame number in video
crop.instance # <- this is the obejct instance from the label row
...
Parameters:
-
filter_ontology_objects
(list[Object | str] | None
, default:None
) –Specify a list of ontology objects to include.
Returns: The dependency to be injected into the cloud function.
Source code in encord_agents/gcp/dependencies.py
dep_single_frame
Dependency to inject the first frame of the underlying asset.
The downloaded asset will be named lr.data_hash.{suffix}
.
When the function has finished, the downloaded file will be removed from the file system.
Example:
from encord_agents import FrameData
from encord_agents.gcp import editor_agent
from encord_agents.gcp.dependencies import dep_single_frame
...
@editor_agent()
def my_agent(
frame: Annotated[NDArray[np.uint8], Depends(dep_single_frame)]
):
assert frame.ndim == 3, "Will work"
Parameters:
-
lr
(LabelRowV2
) –The label row. Automatically injected (see example above).
Returns:
-
NDArray[uint8]
–Numpy array of shape [h, w, 3] RGB colors.
Source code in encord_agents/gcp/dependencies.py
dep_storage_item
dep_storage_item(lookup: Annotated[DataLookup, Depends(dep_data_lookup)], frame_data: FrameData) -> StorageItem
Get the storage item associated with the underlying agent task.
The StorageItem
is useful for multiple things like
- Updating client metadata
- Reading file properties like storage location, fps, duration, DICOM tags, etc.
Example
from typing_extensions import Annotated
from encord.storage import StorageItem
from encord_agents.gcp import editor_agent, Depends
from encord_agents.gcp.dependencies import dep_storage_item
@editor_agent()
def my_agent(storage_item: Annotated[StorageItem, Depends(dep_storage_item)]):
print("uuid", storage_item.uuid)
print("client_metadata", storage_item.client_metadata)
...
Source code in encord_agents/gcp/dependencies.py
dep_video_iterator
Dependency to inject a video frame iterator for doing things over many frames.
Intended use
from encord_agents import FrameData
from encord_agents.gcp import editor_agent
from encord_agents.gcp.dependencies import dep_video_iterator
...
@editor_agent()
def my_agent(
video_frames: Annotated[Iterator[Frame], Depends(dep_video_iterator)]
):
for frame in video_frames:
print(frame.frame, frame.content.shape)
Parameters:
-
lr
(LabelRowV2
) –Automatically injected label row dependency.
Raises:
-
NotImplementedError
–Will fail for other data types than video.
Yields:
-
Iterator[Frame]
–An iterator.
Source code in encord_agents/gcp/dependencies.py
encord_agents.gcp.wrappers
editor_agent
Wrapper to make resources available for gcp editor agents.
The editor agents are intended to be used via dependency injections. You can learn more via out documentation.
Source code in encord_agents/gcp/wrappers.py
generate_response
Generate a Response object with status 200 in order to tell the FE that the function has finished successfully. :return: Response object with the right CORS settings.
Source code in encord_agents/gcp/wrappers.py
FastAPI
Dependencies for injection in FastAPI servers.
This module contains dependencies that you can inject within your api routes. Dependencies that depend on others don't need to be used together. They'll work just fine alone.
Note that you can also use the function parameter:
from typing_extensions import Annotated
from fastapi import Form
from encord_agents import FrameData
...
@app.post("/my-agent-route")
def my_agent(
frame_data: Annotated[FrameData, Form()],
):
...
FrameData
is automatically injected via the api request body.
encord_agents.fastapi.dependencies.dep_client
Dependency to provide an authenticated user client.
Example:
from encord.user_client import EncordUserClient
from encord_agents.fastapi.depencencies import dep_client
...
@app.post("/my-route")
def my_route(
client: Annotated[EncordUserClient, Depends(dep_client)]
):
# Client will authenticated and ready to use.
Source code in encord_agents/fastapi/dependencies.py
encord_agents.fastapi.dependencies.dep_data_lookup
Get a lookup to easily retrieve data rows and storage items associated with the given task.
Info
If you're just looking to get the associated storage item to a task, consider using dep_storage_item
instead.
The lookup can, e.g., be useful for
- Updating client metadata
- Downloading data from signed urls
- Matching data to other projects
Example:
from fastapi import Form
from typing_extensions import Annotated
from encord_agents import FrameData
from encord_agents.fastapi.dependencies import dep_data_lookup, DataLookup
...
@app.post("/my-agent")
def my_agent(
frame_data: Annotated[FrameData, Form()],
lookup: Annotated[DataLookup, Depends(dep_data_lookup)]
):
# Client will authenticated and ready to use.
print(lookup.get_data_row(frame_data.data_hash).title)
print(lookup.get_storage_item(frame_data.data_hash).client_metadata)
Parameters:
-
lookup
(Annotated[DataLookup, Depends(_lookup_adapter)]
) –The object that you can use to lookup data rows and storage items. Automatically injected.
Returns:
-
DataLookup
–The (shared) lookup object.
Source code in encord_agents/fastapi/dependencies.py
encord_agents.fastapi.dependencies.dep_label_row
Dependency to provide an initialized label row.
Example:
from encord_agents.fastapi.depencencies import dep_label_row
...
@app.post("/my-route")
def my_route(
lr: Annotated[LabelRowV2, Depends(dep_label_row)]
):
assert lr.is_labelling_initialised # will work
Parameters:
-
frame_data
(Annotated[FrameData, Form()]
) –the frame data from the route. This parameter is automatically injected if it's a part of your route (see example above)
Returns:
-
LabelRowV2
–The initialized label row.
Source code in encord_agents/fastapi/dependencies.py
encord_agents.fastapi.dependencies.dep_project
dep_project(frame_data: Annotated[FrameData, Form()], client: Annotated[EncordUserClient, Depends(dep_client)])
Dependency to provide an instantiated Project.
Example:
from encord.project import Project
from encord_agents.fastapi.depencencies import dep_project
...
@app.post("/my-route")
def my_route(
project: Annotated[Project, Depends(dep_project)]
):
# Project will authenticated and ready to use.
print(project.title)
Parameters:
-
frame_data
(Annotated[FrameData, Form()]
) – -
client
(Annotated[EncordUserClient, Depends(dep_client)]
) –
Returns:
Source code in encord_agents/fastapi/dependencies.py
encord_agents.fastapi.dependencies.dep_single_frame
dep_single_frame(lr: Annotated[LabelRowV2, Depends(dep_label_row)], frame_data: Annotated[FrameData, Form()])
Dependency to inject the underlying asset of the frame data.
The downloaded asset will be named lr.data_hash.{suffix}
.
When the function has finished, the downloaded file will be removed from the file system.
Example:
from encord_agents.fastapi.depencencies import dep_single_frame
...
@app.post("/my-route")
def my_route(
frame: Annotated[NDArray[np.uint8], Depends(dep_single_frame)]
):
assert arr.ndim == 3, "Will work"
Parameters:
-
lr
(Annotated[LabelRowV2, Depends(dep_label_row)]
) –The label row. Automatically injected (see example above).
-
frame_data
(Annotated[FrameData, Form()]
) –the frame data from the route. This parameter is automatically injected if it's a part of your route (see example above).
Returns: Numpy array of shape [h, w, 3] RGB colors.
Source code in encord_agents/fastapi/dependencies.py
encord_agents.fastapi.dependencies.dep_storage_item
dep_storage_item(lookup: Annotated[DataLookup, Depends(dep_data_lookup)], frame_data: FrameData) -> StorageItem
Get the storage item associated with the underlying agent task.
The StorageItem
is useful for multiple things like
- Updating client metadata
- Reading file properties like storage location, fps, duration, DICOM tags, etc.
Example
from encord.storage import StorageItem
from encord_agents.fastapi.dependencies import dep_storage_item
@app.post("/my-agent")
def my_agent(
storage_item: Annotated[StorageItem, Depends(dep_storage_item)]
):
# Client will authenticated and ready to use.
print(storage_item.dicom_study_uid)
print(storage_item.client_metadata)
Source code in encord_agents/fastapi/dependencies.py
encord_agents.fastapi.dependencies.dep_video_iterator
dep_video_iterator(lr: Annotated[LabelRowV2, Depends(dep_label_row)]) -> Generator[Iterator[Frame], None, None]
Dependency to inject a video frame iterator for doing things over many frames.
Example:
from encord_agents.fastapi.depencencies import dep_video_iterator, Frame
...
@app.post("/my-route")
def my_route(
video_frames: Annotated[Iterator[Frame], Depends(dep_video_iterator)]
):
for frame in video_frames:
print(frame.frame, frame.content.shape)
Parameters:
-
lr
(Annotated[LabelRowV2, Depends(dep_label_row)]
) –Automatically injected label row dependency.
Raises:
-
NotImplementedError
–Will fail for other data types than video.
Yields:
-
Iterator[Frame]
–An iterator.