11from __future__ import annotations
22
3- from typing import Any , Dict , Tuple , Union , Optional
4- from typing_extensions import TypedDict
3+ import re
4+ from typing import Any , Dict , Tuple , Union , Optional , NamedTuple
55
66
77class Model :
@@ -35,12 +35,26 @@ class Version(BaseModel):
3535 """An OpenAPI description of the model inputs and outputs."""
3636
3737
38- class ModelVersionIdentifier (TypedDict , total = False ):
39- """A structure to identify a model version."""
38+ class ModelVersionIdentifier (NamedTuple ):
39+ """
40+ A reference to a model version in the format owner/name or owner/name:version.
41+ """
4042
4143 owner : str
4244 name : str
43- version : str
45+ version : Optional [str ] = None
46+
47+ @classmethod
48+ def parse (cls , ref : str ) -> "ModelVersionIdentifier" :
49+ """
50+ Split a reference in the format owner/name:version into its components.
51+ """
52+
53+ match = re .match (r"^(?P<owner>[^/]+)/(?P<name>[^/:]+)(:(?P<version>.+))?$" , ref )
54+ if not match :
55+ raise ValueError (f"Invalid reference to model version: { ref } . Expected format: owner/name:version" )
56+
57+ return cls (match .group ("owner" ), match .group ("name" ), match .group ("version" ))
4458
4559
4660def resolve_reference (
@@ -57,25 +71,13 @@ def resolve_reference(
5771 version_id = None
5872
5973 if isinstance (ref , Model ):
60- owner = ref .owner
61- name = ref .name
74+ owner , name = ref .owner , ref .name
6275 elif isinstance (ref , Version ):
76+ version = ref
6377 version_id = ref .id
64- elif isinstance (ref , dict ):
65- owner = ref .get ("owner" )
66- name = ref .get ("name" )
67- version_id = ref .get ("version" )
78+ elif isinstance (ref , ModelVersionIdentifier ):
79+ owner , name , version_id = ref
6880 else :
69- # Check if the string is a version ID (assumed to be a hash-like string)
70- if "/" not in ref and len (ref ) >= 32 :
71- version_id = ref
72- else :
73- # Handle owner/name or owner/name/version format
74- parts = ref .split ("/" )
75- if len (parts ) >= 2 :
76- owner = parts [0 ]
77- name = parts [1 ]
78- if len (parts ) >= 3 :
79- version_id = parts [2 ]
81+ owner , name , version_id = ModelVersionIdentifier .parse (ref )
8082
8183 return version , owner , name , version_id
0 commit comments