mirror of
https://github.com/Skyvern-AI/skyvern.git
synced 2025-09-02 18:50:24 +00:00
Implement get_share_links (#302)
This commit is contained in:
parent
6a83f367ba
commit
20a86590dd
7 changed files with 41 additions and 38 deletions
|
@ -888,16 +888,10 @@ class ForgeAgent:
|
||||||
artifact_types=[ArtifactType.SCREENSHOT_ACTION],
|
artifact_types=[ArtifactType.SCREENSHOT_ACTION],
|
||||||
n=SettingsManager.get_settings().TASK_RESPONSE_ACTION_SCREENSHOT_COUNT,
|
n=SettingsManager.get_settings().TASK_RESPONSE_ACTION_SCREENSHOT_COUNT,
|
||||||
)
|
)
|
||||||
latest_action_screenshot_urls = []
|
|
||||||
if latest_action_screenshot_artifacts:
|
if latest_action_screenshot_artifacts:
|
||||||
for artifact in latest_action_screenshot_artifacts:
|
latest_action_screenshot_urls = await app.ARTIFACT_MANAGER.get_share_links(
|
||||||
screenshot_url = await app.ARTIFACT_MANAGER.get_share_link(artifact)
|
latest_action_screenshot_artifacts
|
||||||
if screenshot_url:
|
|
||||||
latest_action_screenshot_urls.append(screenshot_url)
|
|
||||||
else:
|
|
||||||
LOG.error(
|
|
||||||
"Failed to get share link for action screenshot",
|
|
||||||
artifact_id=artifact.artifact_id,
|
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
LOG.error("Failed to get latest action screenshots")
|
LOG.error("Failed to get latest action screenshots")
|
||||||
|
|
|
@ -75,17 +75,21 @@ class AsyncAWSClient:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
@execute_with_async_client(client_type=AWSClientType.S3)
|
@execute_with_async_client(client_type=AWSClientType.S3)
|
||||||
async def create_presigned_url(self, uri: str, client: AioBaseClient = None) -> str | None:
|
async def create_presigned_urls(self, uris: list[str], client: AioBaseClient = None) -> list[str] | None:
|
||||||
|
presigned_urls = []
|
||||||
try:
|
try:
|
||||||
|
for uri in uris:
|
||||||
parsed_uri = S3Uri(uri)
|
parsed_uri = S3Uri(uri)
|
||||||
url = await client.generate_presigned_url(
|
url = await client.generate_presigned_url(
|
||||||
"get_object",
|
"get_object",
|
||||||
Params={"Bucket": parsed_uri.bucket, "Key": parsed_uri.key},
|
Params={"Bucket": parsed_uri.bucket, "Key": parsed_uri.key},
|
||||||
ExpiresIn=SettingsManager.get_settings().PRESIGNED_URL_EXPIRATION,
|
ExpiresIn=SettingsManager.get_settings().PRESIGNED_URL_EXPIRATION,
|
||||||
)
|
)
|
||||||
return url
|
presigned_urls.append(url)
|
||||||
|
|
||||||
|
return presigned_urls
|
||||||
except Exception:
|
except Exception:
|
||||||
LOG.exception("Failed to create presigned url.", uri=uri)
|
LOG.exception("Failed to create presigned url for S3 objects.", uris=uris)
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -71,6 +71,9 @@ class ArtifactManager:
|
||||||
async def get_share_link(self, artifact: Artifact) -> str | None:
|
async def get_share_link(self, artifact: Artifact) -> str | None:
|
||||||
return await app.STORAGE.get_share_link(artifact)
|
return await app.STORAGE.get_share_link(artifact)
|
||||||
|
|
||||||
|
async def get_share_links(self, artifacts: list[Artifact]) -> list[str] | None:
|
||||||
|
return await app.STORAGE.get_share_links(artifacts)
|
||||||
|
|
||||||
async def wait_for_upload_aiotasks_for_task(self, task_id: str) -> None:
|
async def wait_for_upload_aiotasks_for_task(self, task_id: str) -> None:
|
||||||
try:
|
try:
|
||||||
st = time.time()
|
st = time.time()
|
||||||
|
|
|
@ -40,6 +40,10 @@ class BaseStorage(ABC):
|
||||||
async def get_share_link(self, artifact: Artifact) -> str | None:
|
async def get_share_link(self, artifact: Artifact) -> str | None:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
async def get_share_links(self, artifacts: list[Artifact]) -> list[str] | None:
|
||||||
|
pass
|
||||||
|
|
||||||
@abstractmethod
|
@abstractmethod
|
||||||
async def store_artifact_from_path(self, artifact: Artifact, path: str) -> None:
|
async def store_artifact_from_path(self, artifact: Artifact, path: str) -> None:
|
||||||
pass
|
pass
|
||||||
|
|
|
@ -52,6 +52,9 @@ class LocalStorage(BaseStorage):
|
||||||
async def get_share_link(self, artifact: Artifact) -> str:
|
async def get_share_link(self, artifact: Artifact) -> str:
|
||||||
return artifact.uri
|
return artifact.uri
|
||||||
|
|
||||||
|
async def get_share_links(self, artifacts: list[Artifact]) -> list[str]:
|
||||||
|
return [artifact.uri for artifact in artifacts]
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _parse_uri_to_path(uri: str) -> str:
|
def _parse_uri_to_path(uri: str) -> str:
|
||||||
parsed_uri = urlparse(uri)
|
parsed_uri = urlparse(uri)
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
import asyncio
|
|
||||||
from typing import Annotated, Any
|
from typing import Annotated, Any
|
||||||
|
|
||||||
import structlog
|
import structlog
|
||||||
|
@ -238,17 +237,9 @@ async def get_task(
|
||||||
artifact_types=[ArtifactType.SCREENSHOT_ACTION],
|
artifact_types=[ArtifactType.SCREENSHOT_ACTION],
|
||||||
n=SettingsManager.get_settings().TASK_RESPONSE_ACTION_SCREENSHOT_COUNT,
|
n=SettingsManager.get_settings().TASK_RESPONSE_ACTION_SCREENSHOT_COUNT,
|
||||||
)
|
)
|
||||||
latest_action_screenshot_urls = []
|
latest_action_screenshot_urls: list[str] | None = None
|
||||||
if latest_action_screenshot_artifacts:
|
if latest_action_screenshot_artifacts:
|
||||||
for artifact in latest_action_screenshot_artifacts:
|
latest_action_screenshot_urls = await app.ARTIFACT_MANAGER.get_share_links(latest_action_screenshot_artifacts)
|
||||||
screenshot_url = await app.ARTIFACT_MANAGER.get_share_link(artifact)
|
|
||||||
if screenshot_url:
|
|
||||||
latest_action_screenshot_urls.append(screenshot_url)
|
|
||||||
else:
|
|
||||||
LOG.error(
|
|
||||||
"Failed to get share link for action screenshot",
|
|
||||||
artifact_id=artifact.artifact_id,
|
|
||||||
)
|
|
||||||
elif task_obj.status in [TaskStatus.terminated, TaskStatus.completed]:
|
elif task_obj.status in [TaskStatus.terminated, TaskStatus.completed]:
|
||||||
LOG.error(
|
LOG.error(
|
||||||
"Failed to get latest action screenshots in task response",
|
"Failed to get latest action screenshots in task response",
|
||||||
|
@ -416,9 +407,12 @@ async def get_agent_task_step_artifacts(
|
||||||
organization_id=current_org.organization_id,
|
organization_id=current_org.organization_id,
|
||||||
)
|
)
|
||||||
if SettingsManager.get_settings().ENV != "local":
|
if SettingsManager.get_settings().ENV != "local":
|
||||||
signed_urls = await asyncio.gather(*[app.ARTIFACT_MANAGER.get_share_link(artifact) for artifact in artifacts])
|
signed_urls = await app.ARTIFACT_MANAGER.get_share_links(artifacts)
|
||||||
|
if signed_urls:
|
||||||
for i, artifact in enumerate(artifacts):
|
for i, artifact in enumerate(artifacts):
|
||||||
artifact.signed_url = signed_urls[i]
|
artifact.signed_url = signed_urls[i]
|
||||||
|
else:
|
||||||
|
LOG.error("Failed to get signed urls for artifacts", task_id=task_id, step_id=step_id)
|
||||||
return ORJSONResponse([artifact.model_dump() for artifact in artifacts])
|
return ORJSONResponse([artifact.model_dump() for artifact in artifacts])
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -451,7 +451,8 @@ class WorkflowService:
|
||||||
|
|
||||||
workflow_run = await self.get_workflow_run(workflow_run_id=workflow_run_id)
|
workflow_run = await self.get_workflow_run(workflow_run_id=workflow_run_id)
|
||||||
workflow_run_tasks = await app.DATABASE.get_tasks_by_workflow_run_id(workflow_run_id=workflow_run_id)
|
workflow_run_tasks = await app.DATABASE.get_tasks_by_workflow_run_id(workflow_run_id=workflow_run_id)
|
||||||
screenshot_urls = []
|
screenshot_artifacts = []
|
||||||
|
screenshot_urls: list[str] | None = None
|
||||||
# get the last screenshot for the last 3 tasks of the workflow run
|
# get the last screenshot for the last 3 tasks of the workflow run
|
||||||
for task in workflow_run_tasks[::-1]:
|
for task in workflow_run_tasks[::-1]:
|
||||||
screenshot_artifact = await app.DATABASE.get_latest_artifact(
|
screenshot_artifact = await app.DATABASE.get_latest_artifact(
|
||||||
|
@ -460,11 +461,11 @@ class WorkflowService:
|
||||||
organization_id=organization_id,
|
organization_id=organization_id,
|
||||||
)
|
)
|
||||||
if screenshot_artifact:
|
if screenshot_artifact:
|
||||||
screenshot_url = await app.ARTIFACT_MANAGER.get_share_link(screenshot_artifact)
|
screenshot_artifacts.append(screenshot_artifact)
|
||||||
if screenshot_url:
|
if len(screenshot_artifacts) >= 3:
|
||||||
screenshot_urls.append(screenshot_url)
|
|
||||||
if len(screenshot_urls) >= 3:
|
|
||||||
break
|
break
|
||||||
|
if screenshot_artifacts:
|
||||||
|
screenshot_urls = await app.ARTIFACT_MANAGER.get_share_links(screenshot_artifacts)
|
||||||
|
|
||||||
recording_url = None
|
recording_url = None
|
||||||
recording_artifact = await app.DATABASE.get_artifact_for_workflow_run(
|
recording_artifact = await app.DATABASE.get_artifact_for_workflow_run(
|
||||||
|
|
Loading…
Add table
Reference in a new issue