Files
AI/참고/guardrails-main/guardrails/cli/server/module_manifest.py
2026-05-12 19:40:31 +09:00

72 lines
2.1 KiB
Python

from dataclasses import dataclass, field
from typing import Any, Dict, List, Optional
from pydash.strings import snake_case
from guardrails.classes.generic.serializeable import (
Serializeable,
SerializeableJSONEncoder,
)
@dataclass
class Contributor(Serializeable):
name: str
email: str
@dataclass
class Repository(Serializeable):
url: str
branch: Optional[str] = None
@dataclass
class ModuleTags(Serializeable):
content_type: Optional[List[str]] = field(default_factory=list)
validation_category: Optional[List[str]] = field(default_factory=list)
process_requirements: Optional[List[str]] = field(default_factory=list)
has_guardrails_endpoint: Optional[bool] = field(default_factory=bool)
@dataclass
class ModelAuth(Serializeable):
type: str
name: str
displayName: Optional[str] = None
@dataclass
class ModuleManifest(Serializeable):
id: str
name: str
author: Contributor
maintainers: List[Contributor]
repository: Repository
namespace: str
package_name: str
module_name: str
exports: List[str]
tags: Optional[ModuleTags] = None
requires_auth: Optional[bool] = True
post_install: Optional[str] = None
index: Optional[str] = None
required_model_auth: Optional[List[ModelAuth]] = field(default_factory=list)
# @override
@classmethod
def from_dict(cls, data: Dict[str, Any]):
init_kwargs = {snake_case(k): data.get(k) for k in data}
init_kwargs["encoder"] = init_kwargs.get("encoder", SerializeableJSONEncoder)
author = init_kwargs.pop("author", {})
maintainers = init_kwargs.pop("maintainers", [])
repository = init_kwargs.pop("repository", {})
tags = init_kwargs.pop("tags", {})
return cls(
**init_kwargs,
author=Contributor.from_dict(author), # type: ignore
maintainers=[Contributor.from_dict(m) for m in maintainers], # type: ignore
repository=Repository.from_dict(repository), # type: ignore
tags=ModuleTags.from_dict(tags), # type: ignore
)