Use content_hash as asset names for all run assets
- RecordRunRequest.output_name now optional (deprecated) - Input assets named by their content_hash - Output assets named by their content_hash - Simplified registered_inputs - just content_hash and ipfs_cid - All assets now referenced by content_hash, not friendly names Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
49
server.py
49
server.py
@@ -166,8 +166,8 @@ class RegisterRequest(BaseModel):
|
|||||||
class RecordRunRequest(BaseModel):
|
class RecordRunRequest(BaseModel):
|
||||||
"""Request to record an L1 run."""
|
"""Request to record an L1 run."""
|
||||||
run_id: str
|
run_id: str
|
||||||
output_name: str
|
|
||||||
l1_server: str # URL of the L1 server that has this run
|
l1_server: str # URL of the L1 server that has this run
|
||||||
|
output_name: Optional[str] = None # Deprecated - assets now named by content_hash
|
||||||
|
|
||||||
|
|
||||||
class PublishCacheRequest(BaseModel):
|
class PublishCacheRequest(BaseModel):
|
||||||
@@ -1995,22 +1995,13 @@ async def record_run(req: RecordRunRequest, user: User = Depends(get_required_us
|
|||||||
"effects_commit": run.get("effects_commit"),
|
"effects_commit": run.get("effects_commit"),
|
||||||
}
|
}
|
||||||
|
|
||||||
# Build registered_inputs list (deterministic - can compute before DB transaction)
|
# Build registered_inputs list - all referenced by content_hash
|
||||||
registered_inputs = []
|
registered_inputs = []
|
||||||
for inp in input_infos:
|
for inp in input_infos:
|
||||||
if inp["existing_asset"]:
|
registered_inputs.append({
|
||||||
registered_inputs.append({
|
"content_hash": inp["content_hash"],
|
||||||
"content_hash": inp["content_hash"],
|
"ipfs_cid": inp["ipfs_cid"]
|
||||||
"name": inp["existing_asset"]["name"],
|
})
|
||||||
"ipfs_cid": inp["ipfs_cid"]
|
|
||||||
})
|
|
||||||
else:
|
|
||||||
# New input - name is deterministic
|
|
||||||
registered_inputs.append({
|
|
||||||
"content_hash": inp["content_hash"],
|
|
||||||
"name": f"input-{inp['content_hash'][:16]}",
|
|
||||||
"ipfs_cid": inp["ipfs_cid"]
|
|
||||||
})
|
|
||||||
|
|
||||||
# ===== PHASE 2: IPFS OPERATIONS (non-blocking for event loop) =====
|
# ===== PHASE 2: IPFS OPERATIONS (non-blocking for event loop) =====
|
||||||
def do_ipfs_operations():
|
def do_ipfs_operations():
|
||||||
@@ -2074,19 +2065,15 @@ async def record_run(req: RecordRunRequest, user: User = Depends(get_required_us
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
async with db.transaction() as conn:
|
async with db.transaction() as conn:
|
||||||
# Register input assets (if not already on L2)
|
# Register input assets (if not already on L2) - named by content_hash
|
||||||
for inp in input_infos:
|
for inp in input_infos:
|
||||||
if not inp["existing_asset"]:
|
if not inp["existing_asset"]:
|
||||||
# Create new input asset with appropriate name based on type
|
|
||||||
media_type = inp["media_type"]
|
media_type = inp["media_type"]
|
||||||
|
tags = ["auto-registered", "input"]
|
||||||
if media_type == "recipe":
|
if media_type == "recipe":
|
||||||
input_name = f"recipe-{inp['content_hash'][:16]}"
|
tags.append("recipe")
|
||||||
tags = ["auto-registered", "input", "recipe"]
|
|
||||||
else:
|
|
||||||
input_name = f"input-{inp['content_hash'][:16]}"
|
|
||||||
tags = ["auto-registered", "input"]
|
|
||||||
input_asset = {
|
input_asset = {
|
||||||
"name": input_name,
|
"name": inp["content_hash"], # Use content_hash as name
|
||||||
"content_hash": inp["content_hash"],
|
"content_hash": inp["content_hash"],
|
||||||
"ipfs_cid": inp["ipfs_cid"],
|
"ipfs_cid": inp["ipfs_cid"],
|
||||||
"asset_type": media_type,
|
"asset_type": media_type,
|
||||||
@@ -2097,13 +2084,13 @@ async def record_run(req: RecordRunRequest, user: User = Depends(get_required_us
|
|||||||
}
|
}
|
||||||
await db.create_asset_tx(conn, input_asset)
|
await db.create_asset_tx(conn, input_asset)
|
||||||
|
|
||||||
# Check output name doesn't exist
|
# Check output doesn't already exist (by content_hash)
|
||||||
if await db.asset_exists_by_name_tx(conn, req.output_name):
|
if await db.asset_exists_by_name_tx(conn, output_hash):
|
||||||
raise HTTPException(400, f"Asset already exists: {req.output_name}")
|
raise HTTPException(400, f"Asset already exists: {output_hash[:16]}...")
|
||||||
|
|
||||||
# Create output asset with provenance (includes provenance_cid)
|
# Create output asset with provenance - named by content_hash
|
||||||
output_asset = {
|
output_asset = {
|
||||||
"name": req.output_name,
|
"name": output_hash, # Use content_hash as name
|
||||||
"content_hash": output_hash,
|
"content_hash": output_hash,
|
||||||
"ipfs_cid": output_ipfs_cid,
|
"ipfs_cid": output_ipfs_cid,
|
||||||
"asset_type": output_media_type,
|
"asset_type": output_media_type,
|
||||||
@@ -2115,10 +2102,10 @@ async def record_run(req: RecordRunRequest, user: User = Depends(get_required_us
|
|||||||
}
|
}
|
||||||
created_asset = await db.create_asset_tx(conn, output_asset)
|
created_asset = await db.create_asset_tx(conn, output_asset)
|
||||||
|
|
||||||
# Create activity
|
# Create activity - all referenced by content_hash
|
||||||
object_data = {
|
object_data = {
|
||||||
"type": output_media_type.capitalize(),
|
"type": output_media_type.capitalize(),
|
||||||
"name": req.output_name,
|
"name": output_hash, # Use content_hash as name
|
||||||
"id": f"https://{DOMAIN}/objects/{output_hash}",
|
"id": f"https://{DOMAIN}/objects/{output_hash}",
|
||||||
"contentHash": {
|
"contentHash": {
|
||||||
"algorithm": "sha3-256",
|
"algorithm": "sha3-256",
|
||||||
@@ -2146,7 +2133,7 @@ async def record_run(req: RecordRunRequest, user: User = Depends(get_required_us
|
|||||||
logger.error(f"record_run: Database transaction failed: {e}")
|
logger.error(f"record_run: Database transaction failed: {e}")
|
||||||
raise HTTPException(500, f"Failed to record run: {e}")
|
raise HTTPException(500, f"Failed to record run: {e}")
|
||||||
|
|
||||||
logger.info(f"record_run: Successfully published {req.output_name} with {len(registered_inputs)} inputs")
|
logger.info(f"record_run: Successfully published {output_hash[:16]}... with {len(registered_inputs)} inputs")
|
||||||
return {"asset": created_asset, "activity": created_activity}
|
return {"asset": created_asset, "activity": created_activity}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user