mattzh72--articraft
286 行
7.9 KiB
Python
286 行
7.9 KiB
Python
from __future__ import annotations
|
|
|
|
from dataclasses import asdict, dataclass, field
|
|
from pathlib import Path
|
|
from typing import Any, Literal
|
|
|
|
PromptKind = Literal["single_prompt", "prompt_series"]
|
|
RunMode = Literal["library_single"]
|
|
MaterializationStatus = Literal["missing", "available"]
|
|
CreatorMode = Literal["internal_agent", "external_agent"]
|
|
ExternalAgentName = Literal["codex", "claude-code", "cursor"]
|
|
|
|
|
|
@dataclass(slots=True, frozen=True)
|
|
class SourceRef:
|
|
run_id: str | None = None
|
|
prompt_index: int | None = None
|
|
|
|
def to_dict(self) -> dict[str, Any]:
|
|
return asdict(self)
|
|
|
|
|
|
@dataclass(slots=True, frozen=True)
|
|
class RecordArtifacts:
|
|
prompt_txt: str | None
|
|
prompt_series_json: str | None
|
|
model_py: str
|
|
provenance_json: str
|
|
cost_json: str | None
|
|
inputs_dir: str | None = "inputs"
|
|
traces_dir: str | None = "traces"
|
|
|
|
def to_dict(self) -> dict[str, Any]:
|
|
return asdict(self)
|
|
|
|
|
|
@dataclass(slots=True, frozen=True)
|
|
class RecordHashes:
|
|
prompt_sha256: str | None = None
|
|
model_py_sha256: str | None = None
|
|
|
|
def to_dict(self) -> dict[str, Any]:
|
|
return asdict(self)
|
|
|
|
|
|
@dataclass(slots=True, frozen=True)
|
|
class CreatorMetadata:
|
|
mode: CreatorMode
|
|
agent: ExternalAgentName | None = None
|
|
trace_available: bool | None = None
|
|
|
|
def to_dict(self) -> dict[str, Any]:
|
|
payload = asdict(self)
|
|
return {key: value for key, value in payload.items() if value is not None}
|
|
|
|
|
|
@dataclass(slots=True, frozen=True)
|
|
class DisplayMetadata:
|
|
title: str
|
|
prompt_preview: str
|
|
|
|
def to_dict(self) -> dict[str, Any]:
|
|
return asdict(self)
|
|
|
|
|
|
@dataclass(slots=True, frozen=True)
|
|
class Record:
|
|
schema_version: int
|
|
record_id: str
|
|
created_at: str
|
|
updated_at: str
|
|
rating: int | None
|
|
kind: str
|
|
prompt_kind: PromptKind
|
|
category_slug: str | None
|
|
source: SourceRef
|
|
sdk_package: str
|
|
provider: str | None
|
|
model_id: str | None
|
|
display: DisplayMetadata
|
|
artifacts: RecordArtifacts
|
|
hashes: RecordHashes = field(default_factory=RecordHashes)
|
|
active_revision_id: str | None = None
|
|
lineage: dict[str, Any] | None = None
|
|
creator: CreatorMetadata | None = None
|
|
author: str | None = None
|
|
label: str | None = None
|
|
tags: list[str] = field(default_factory=list)
|
|
category_title: str | None = None
|
|
rated_by: str | None = None
|
|
secondary_rating: int | None = None
|
|
secondary_rated_by: str | None = None
|
|
|
|
def to_dict(self) -> dict[str, Any]:
|
|
payload = {
|
|
"schema_version": self.schema_version,
|
|
"record_id": self.record_id,
|
|
"created_at": self.created_at,
|
|
"updated_at": self.updated_at,
|
|
"rating": self.rating,
|
|
"secondary_rating": self.secondary_rating,
|
|
"author": self.author,
|
|
"rated_by": self.rated_by,
|
|
"secondary_rated_by": self.secondary_rated_by,
|
|
"kind": self.kind,
|
|
"prompt_kind": self.prompt_kind,
|
|
"category_slug": self.category_slug,
|
|
"source": self.source.to_dict(),
|
|
"sdk_package": self.sdk_package,
|
|
"provider": self.provider,
|
|
"model_id": self.model_id,
|
|
"label": self.label,
|
|
"tags": list(self.tags),
|
|
"category_title": self.category_title,
|
|
"display": self.display.to_dict(),
|
|
"artifacts": self.artifacts.to_dict(),
|
|
"hashes": self.hashes.to_dict(),
|
|
}
|
|
if self.active_revision_id is not None:
|
|
payload["active_revision_id"] = self.active_revision_id
|
|
if self.lineage is not None:
|
|
payload["lineage"] = dict(self.lineage)
|
|
if self.creator is not None:
|
|
payload["creator"] = self.creator.to_dict()
|
|
return payload
|
|
|
|
|
|
@dataclass(slots=True, frozen=True)
|
|
class GenerationSettings:
|
|
provider: str | None
|
|
model_id: str | None
|
|
thinking_level: str | None
|
|
openai_transport: str | None = None
|
|
openai_reasoning_summary: str | None = None
|
|
max_turns: int | None = None
|
|
max_cost_usd: float | None = None
|
|
|
|
def to_dict(self) -> dict[str, Any]:
|
|
return asdict(self)
|
|
|
|
|
|
@dataclass(slots=True, frozen=True)
|
|
class PromptingSettings:
|
|
system_prompt_file: str
|
|
system_prompt_sha256: str | None
|
|
|
|
def to_dict(self) -> dict[str, Any]:
|
|
return asdict(self)
|
|
|
|
|
|
@dataclass(slots=True, frozen=True)
|
|
class SdkSettings:
|
|
sdk_package: str
|
|
sdk_version: str
|
|
sdk_fingerprint: str | None
|
|
|
|
def to_dict(self) -> dict[str, Any]:
|
|
return asdict(self)
|
|
|
|
|
|
@dataclass(slots=True, frozen=True)
|
|
class EnvironmentSettings:
|
|
python_version: str
|
|
platform: str
|
|
git_commit: str | None = None
|
|
uv_lock_sha256: str | None = None
|
|
|
|
def to_dict(self) -> dict[str, Any]:
|
|
return asdict(self)
|
|
|
|
|
|
@dataclass(slots=True, frozen=True)
|
|
class RunSummary:
|
|
turn_count: int | None = None
|
|
tool_call_count: int | None = None
|
|
compile_attempt_count: int | None = None
|
|
final_status: str = "success"
|
|
|
|
def to_dict(self) -> dict[str, Any]:
|
|
return asdict(self)
|
|
|
|
|
|
@dataclass(slots=True, frozen=True)
|
|
class Provenance:
|
|
schema_version: int
|
|
record_id: str
|
|
generation: GenerationSettings
|
|
prompting: PromptingSettings
|
|
sdk: SdkSettings
|
|
environment: EnvironmentSettings
|
|
run_summary: RunSummary
|
|
|
|
def to_dict(self) -> dict[str, Any]:
|
|
return {
|
|
"schema_version": self.schema_version,
|
|
"record_id": self.record_id,
|
|
"generation": self.generation.to_dict(),
|
|
"prompting": self.prompting.to_dict(),
|
|
"sdk": self.sdk.to_dict(),
|
|
"environment": self.environment.to_dict(),
|
|
"run_summary": self.run_summary.to_dict(),
|
|
}
|
|
|
|
|
|
@dataclass(slots=True, frozen=True)
|
|
class CompileWarning:
|
|
code: str
|
|
message: str
|
|
|
|
def to_dict(self) -> dict[str, Any]:
|
|
return asdict(self)
|
|
|
|
|
|
@dataclass(slots=True, frozen=True)
|
|
class CompileReport:
|
|
schema_version: int
|
|
record_id: str
|
|
status: str
|
|
urdf_path: str
|
|
warnings: list[CompileWarning] = field(default_factory=list)
|
|
checks_run: list[str] = field(default_factory=list)
|
|
overlap_allowances: list[dict[str, Any]] = field(default_factory=list)
|
|
metrics: dict[str, Any] = field(default_factory=dict)
|
|
signal_bundle: dict[str, Any] | None = None
|
|
|
|
def to_dict(self) -> dict[str, Any]:
|
|
payload = {
|
|
"schema_version": self.schema_version,
|
|
"record_id": self.record_id,
|
|
"status": self.status,
|
|
"urdf_path": self.urdf_path,
|
|
"warnings": [warning.to_dict() for warning in self.warnings],
|
|
"checks_run": list(self.checks_run),
|
|
"overlap_allowances": list(self.overlap_allowances),
|
|
"metrics": dict(self.metrics),
|
|
}
|
|
if self.signal_bundle is not None:
|
|
payload["signal_bundle"] = dict(self.signal_bundle)
|
|
return payload
|
|
|
|
|
|
@dataclass(slots=True, frozen=True)
|
|
class CategoryRecord:
|
|
schema_version: int
|
|
slug: str
|
|
title: str
|
|
description: str = ""
|
|
target_sdk_version: str | None = None
|
|
current_count: int | None = None
|
|
last_item_index: int | None = None
|
|
created_at: str | None = None
|
|
updated_at: str | None = None
|
|
run_count: int | None = None
|
|
|
|
def to_dict(self) -> dict[str, Any]:
|
|
return asdict(self)
|
|
|
|
|
|
@dataclass(slots=True, frozen=True)
|
|
class RunRecord:
|
|
schema_version: int
|
|
run_id: str
|
|
run_mode: RunMode
|
|
created_at: str
|
|
updated_at: str
|
|
provider: str
|
|
model_id: str
|
|
sdk_package: str
|
|
status: str = "pending"
|
|
category_slug: str | None = None
|
|
prompt_count: int = 0
|
|
results_file: str = "results.jsonl"
|
|
settings_summary: dict[str, Any] = field(default_factory=dict)
|
|
|
|
def to_dict(self) -> dict[str, Any]:
|
|
return asdict(self)
|
|
|
|
|
|
@dataclass(slots=True, frozen=True)
|
|
class AssetStatus:
|
|
record_id: str
|
|
assets_dir: Path
|
|
meshes_present: bool
|
|
glb_present: bool
|
|
viewer_present: bool
|