create_project + update/deploy_project (#3075)

This commit is contained in:
Shuchang Zheng
2025-07-31 21:25:17 -07:00
committed by GitHub
parent 119ef71057
commit 88018418af
12 changed files with 785 additions and 16 deletions

View File

@@ -238,6 +238,43 @@ class ArtifactManager:
path=path,
)
async def create_project_file_artifact(
self,
*,
organization_id: str,
project_id: str,
project_version: int,
file_path: str,
data: bytes,
) -> str:
"""Create an artifact for a project file.
Args:
organization_id: The organization ID
project_id: The project ID
project_version: The project version
file_path: The file path relative to project root
data: The file content as bytes
Returns:
The artifact ID
"""
artifact_id = generate_artifact_id()
uri = app.STORAGE.build_project_file_uri(
organization_id=organization_id,
project_id=project_id,
project_version=project_version,
file_path=file_path,
)
return await self._create_artifact(
aio_task_primary_key=f"{project_id}_{project_version}",
artifact_id=artifact_id,
artifact_type=ArtifactType.PROJECT_FILE,
uri=uri,
organization_id=organization_id,
data=data,
)
async def create_llm_artifact(
self,
data: bytes,

View File

@@ -49,6 +49,9 @@ class ArtifactType(StrEnum):
TRACE = "trace"
HAR = "har"
# Project files
PROJECT_FILE = "project_file"
class Artifact(BaseModel):
created_at: datetime = Field(

View File

@@ -81,6 +81,12 @@ class BaseStorage(ABC):
) -> str:
pass
@abstractmethod
def build_project_file_uri(
self, *, organization_id: str, project_id: str, project_version: int, file_path: str
) -> str:
pass
@abstractmethod
async def store_artifact(self, artifact: Artifact, data: bytes) -> None:
pass

View File

@@ -78,6 +78,11 @@ class LocalStorage(BaseStorage):
file_ext = FILE_EXTENTSION_MAP[artifact_type]
return f"file://{self.artifact_path}/{settings.ENV}/{organization_id}/ai_suggestions/{ai_suggestion.ai_suggestion_id}/{datetime.utcnow().isoformat()}_{artifact_id}_{artifact_type}.{file_ext}"
def build_project_file_uri(
self, *, organization_id: str, project_id: str, project_version: int, file_path: str
) -> str:
return f"file://{self.artifact_path}/{settings.ENV}/{organization_id}/projects/{project_id}/{project_version}/{file_path}"
async def store_artifact(self, artifact: Artifact, data: bytes) -> None:
file_path = None
try:

View File

@@ -84,6 +84,22 @@ class S3Storage(BaseStorage):
file_ext = FILE_EXTENTSION_MAP[artifact_type]
return f"{self._build_base_uri(organization_id)}/ai_suggestions/{ai_suggestion.ai_suggestion_id}/{datetime.utcnow().isoformat()}_{artifact_id}_{artifact_type}.{file_ext}"
def build_project_file_uri(
self, *, organization_id: str, project_id: str, project_version: int, file_path: str
) -> str:
"""Build the S3 URI for a project file.
Args:
organization_id: The organization ID
project_id: The project ID
project_version: The project version
file_path: The file path relative to project root
Returns:
The S3 URI for the project file
"""
return f"{self._build_base_uri(organization_id)}/projects/{project_id}/{project_version}/{file_path}"
async def store_artifact(self, artifact: Artifact, data: bytes) -> None:
sc = await self._get_storage_class_for_org(artifact.organization_id)
tags = await self._get_tags_for_org(artifact.organization_id)