Skip to main content

Open Research hosted artifacts

Alpha SMR artifact_builder workers publish HTML hosted artifacts during a run. Operators promote a public slug for the Open Research index at /openresearch/artifacts/{slug}.

CRUD matrix (alpha)

OperationSupportedHow
CreateYes (in-run)Worker MCP publish_hosted_artifact during an artifact_builder task
ReadYeslist, get, get_for_run, get_content, public index/slug
UpdateYesupdate (PATCH metadata), publish_public, assign_reviewer
DeleteYesdelete removes artifact row, public shell, and stored HTML

Python SDK

research = client.research

for artifact in research.hosted_artifacts.list(project_id=project_id):
    print(artifact["hosted_url"], artifact.get("public_url"))

artifact = research.hosted_artifacts.get(hosted_artifact_id)
research.hosted_artifacts.update(
    hosted_artifact_id,
    title="Revised title",
    summary="Updated public card",
)
research.hosted_artifacts.delete(hosted_artifact_id)
Reference: ResearchHostedArtifactsAPI.

Worker subtypes (launch contract)

Set actor_subtype on a worker task in the kickoff contract:
SubtypeRole
artifact_builderBuild HTML and call publish_hosted_artifact
artifact_reviewerReview hosted artifact before public promote (orchestrator dispatch)
Python enums (SDK):
from synth_ai.managed_research.models.smr_actor_models import (
    SmrWorkerSubtype,
    SmrReviewerSubtype,
)

SmrWorkerSubtype.ARTIFACT_BUILDER  # "artifact_builder"
SmrReviewerSubtype.ARTIFACT_REVIEWER  # "artifact_reviewer"
Example kickoff task snippet:
{
    "task_key": "build_hosted_artifact",
    "kind": "worker_task",
    "actor_subtype": "artifact_builder",
    "instructions": "Build index.html and call publish_hosted_artifact.",
}

Operator HTTP surface (backend)

MethodPathPurpose
GET/smr/hosted-artifactsList org artifacts (?project_id= optional)
GET/smr/projects/{project_id}/hosted-artifactsList artifacts for one project
GET/smr/hosted-artifacts/{id}Receipt with hosted/public URLs
PATCH/smr/hosted-artifacts/{id}Patch title, metadata, public fields, visibility
DELETE/smr/hosted-artifacts/{id}Delete artifact + public shell + HTML
GET/smr/runs/{run_id}/hosted-artifactRun-scoped receipt
GET/smr/hosted-artifacts/{id}/contentServe HTML
POST/smr/hosted-artifacts/{id}/publish-publicPromote public slug
POST/smr/hosted-artifacts/{id}/assign-reviewerDispatch artifact_reviewer
GET/api/open-research/v1/artifactsPublic index JSON
GET/api/open-research/v1/artifacts/{slug}Public slug bundle

Local smoke

cd ~/Documents/GitHub/backend
./.venv/bin/python scripts/run_artifact_builder_smoke.py \
  --base-url http://127.0.0.1:8001 \
  --pool-id slot2
Requires slot2 backend-api + smr-runtime with artifact_builder_minimal profile.

Stack operator

  • stack_get_run_artifact_status -> same fields as GET /smr/runs/{run_id}/hosted-artifact
  • stack_open_hosted_artifact -> open hosted or public shell URL in the system browser