Files
mirosociety/backend/app/models/world.py
T
toorandClaude 36b0f2b660 chore: initial commit
- Track MiroSociety source: backend (FastAPI), frontend (Vue3/Vite), docs, configs.
- Add start.sh / deploy.sh for local dev (uv venv + npm + dev servers on 31400/31401).
- Fix pyproject.toml: missing httpx dependency.
- Tighten .gitignore: .env, .venv, node_modules, data/, *.log, uv.lock, frontend/dist, etcd.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-09-17 13:48:30 +08:00

74 lines
2.3 KiB
Python

from __future__ import annotations
from typing import Literal
from pydantic import BaseModel, Field
class Location(BaseModel):
id: str
name: str
type: Literal["public", "commerce", "governance", "residential", "social"]
description: str
class TimeConfig(BaseModel):
total_days: int = 365
rounds_per_day: int = 3
active_agents_per_round_min: int = 3
active_agents_per_round_max: int = 10
class WorldBlueprint(BaseModel):
name: str
description: str
rules: list[str]
locations: list[Location]
resources: list[str]
initial_tensions: list[str]
time_config: TimeConfig
class WorldMetrics(BaseModel):
stability: float = Field(default=0.5, ge=0.0, le=1.0)
prosperity: float = Field(default=0.5, ge=0.0, le=1.0)
trust: float = Field(default=0.5, ge=0.0, le=1.0)
freedom: float = Field(default=0.5, ge=0.0, le=1.0)
conflict: float = Field(default=0.2, ge=0.0, le=1.0)
brand_sentiment: float = Field(default=0.5, ge=0.0, le=1.0)
purchase_intent: float = Field(default=0.5, ge=0.0, le=1.0)
word_of_mouth: float = Field(default=0.0, ge=0.0, le=1.0)
churn_risk: float = Field(default=0.2, ge=0.0, le=1.0)
adoption_rate: float = Field(default=0.0, ge=0.0, le=1.0)
information_spread: float = Field(default=0.0, ge=0.0, le=1.0)
echo_chamber_index: float = Field(default=0.0, ge=0.0, le=1.0)
rumor_distortion: float = Field(default=0.0, ge=0.0, le=1.0)
class Institution(BaseModel):
name: str
purpose: str
founder_id: int
member_ids: list[int] = Field(default_factory=list)
rules: list[str] = Field(default_factory=list)
created_day: int = 0
class Proposal(BaseModel):
id: str
proposer_id: int
content: str
votes_for: list[int] = Field(default_factory=list)
votes_against: list[int] = Field(default_factory=list)
status: Literal["open", "passed", "rejected"] = "open"
created_round: int = 0
class WorldState(BaseModel):
blueprint: WorldBlueprint
metrics: WorldMetrics = Field(default_factory=WorldMetrics)
institutions: list[Institution] = Field(default_factory=list)
proposals: list[Proposal] = Field(default_factory=list)
day: int = 1
round_in_day: int = 0
active_disputes: list[str] = Field(default_factory=list)
community_rules: list[str] = Field(default_factory=list)