Source code for mira.terarium_client

"""Client functionality to Terarium."""

from typing import Dict, List, Union

import requests
from pydantic import BaseModel

from mira.metamodel import TemplateModel
from mira.modeling import Model
from mira.modeling.amr.petrinet import AMRPetriNetModel
from mira.sources.amr import sanity_check_amr
from mira.sources.amr.petrinet import model_from_url

__all__ = [
    "associate",
    "post_template_model",
    "post_amr",
    "post_amr_remote",
    "get_template_model",
]


[docs]def associate(*, project_id: str, model_id: str) -> str: """Associate a model (UUID) to a project (UUID) and return the association UUID Parameters ---------- project_id : UUID of the project model_id : UUID of the model Returns ------- : UUID of the association """ x = f"http://data-service.staging.terarium.ai/projects/{project_id}/assets/models/{model_id}" res = requests.post(x) return res.json()["id"]
class TerariumResponse(BaseModel): model_id: str associations: Dict[str, str]
[docs]def post_template_model( template_model: TemplateModel, project_id: Union[str, List[str], None] = None, ) -> TerariumResponse: """Post a template model to Terarium as a Petri Net AMR. Optionally add to a project(s) if given. Parameters ---------- template_model : TemplateModel to post project_id : UUID of the project to add model to (optional) Returns ------- : TerariumResponse """ model = AMRPetriNetModel(Model(template_model)) amr_json = model.to_json() sanity_check_amr(amr_json) return post_amr(amr_json, project_id=project_id)
[docs]def post_amr( amr, project_id: Union[str, List[str], None] = None ) -> TerariumResponse: """Post an AMR to Terarium. Optionally add to a project(s) if given. Parameters ---------- amr : AMR to post project_id : UUID of the project to add model to (optional) Returns ------- : TerariumResponse """ res = requests.post( "http://data-service.staging.terarium.ai/models", json=amr ) res_json = res.json() model_id = res_json["id"] associations: Dict[str, str] = {} if isinstance(project_id, str): associations[project_id] = associate( project_id=project_id, model_id=model_id ) elif isinstance(project_id, list): for i in project_id: associations[i] = associate(project_id=i, model_id=model_id) return TerariumResponse(model_id=model_id, associations=associations)
[docs]def post_amr_remote( model_url: str, *, project_id: Union[str, List[str], None] = None ) -> TerariumResponse: """Download an AMR from a URL then post to Terarium. Optionally add to a project(s) if given. To add the July 2023 evaluation scenario 3 base model to the evaluation project, run the following: >>> post_amr_remote( >>> "https://raw.githubusercontent.com/indralab/mira/hackathon/" >>> "notebooks/evaluation_2023.07/eval_scenario3_base.json", >>> project_id="37", >>> ) Parameters ---------- model_url : URL to download AMR from project_id : UUID of the project to add model to (optional) Returns ------- : TerariumResponse """ model_amr_json = requests.get(model_url).json() return post_amr(model_amr_json, project_id=project_id)
[docs]def get_template_model(model_id: str) -> TemplateModel: """Get a template model from Terarium by its model UUID Parameters ---------- model_id : UUID of the model Returns ------- : TemplateModel of the model """ return model_from_url(f"http://data-service.staging.terarium.ai/models/{model_id}")