File size: 9,219 Bytes
f60a6c1 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 |
from os import getenv
from functools import lru_cache
from pathlib import Path
from dotenv import load_dotenv
from pydantic import BaseModel, SecretStr
__version__ = "0.2.0"
class Settings(BaseModel):
# Bittensor
BITTENSOR_WALLET_COLD: str
BITTENSOR_WALLET_HOT: str
BITTENSOR_WALLET_PATH: Path
BITTENSOR_SUBTENSOR_ENDPOINT: str
BITTENSOR_SUBTENSOR_FALLBACK: str
# Chutes
CHUTES_USERNAME: str
CHUTES_VLM: str
CHUTES_VLM_ENDPOINT: str
CHUTES_MINERS_ENDPOINT: str
CHUTES_MINER_PREDICT_ENDPOINT: str
CHUTES_MINER_BASE_URL_TEMPLATE: str
CHUTES_API_KEY: SecretStr
PATH_CHUTE_TEMPLATES: Path
PATH_CHUTE_SCRIPT: Path
FILENAME_CHUTE_MAIN: str
FILENAME_CHUTE_SCHEMAS: str
FILENAME_CHUTE_SETUP_UTILS: str
FILENAME_CHUTE_LOAD_UTILS: str
FILENAME_CHUTE_PREDICT_UTILS: str
# OpenRouter
OPENROUTER_API_KEY: SecretStr
OPENROUTER_VLM_ENDPOINT: str
OPENROUTER_VLM: str
# HuggingFace
HUGGINGFACE_USERNAME: str
HUGGINGFACE_API_KEY: SecretStr
HUGGINGFACE_CONCURRENCY: int
# Cloudflare R2
R2_BUCKET: str
R2_ACCOUNT_ID: SecretStr
R2_WRITE_ACCESS_KEY_ID: SecretStr
R2_WRITE_SECRET_ACCESS_KEY: SecretStr
R2_CONCURRENCY: int
R2_BUCKET_PUBLIC_URL: str
# Signer
SIGNER_URL: str
SIGNER_SEED: SecretStr
SIGNER_HOST: str
SIGNER_PORT: int
# ScoreVision
SCOREVISION_NETUID: int
SCOREVISION_MECHID: int
SCOREVISION_VERSION: str
SCOREVISION_API: str
SCOREVISION_SCORE_BASE: float
SCOREVISION_SCORE_ALPHA: float
SCOREVISION_SCORE_MS_PENALTY: float
SCOREVISION_SCORE_SERVICE_LEVEL_OBJECTIVE_MS: float
SCOREVISION_VIDEO_FRAMES_PER_SECOND: int
SCOREVISION_VIDEO_MIN_FRAME_NUMBER: int
SCOREVISION_VIDEO_MAX_FRAME_NUMBER: int
SCOREVISION_IMAGE_JPEG_QUALITY: int
SCOREVISION_IMAGE_HEIGHT: int
SCOREVISION_IMAGE_WIDTH: int
SCOREVISION_VLM_SELECT_N_FRAMES: int
SCOREVISION_VLM_TEMPERATURE: float
SCOREVISION_API_TIMEOUT_S: int
SCOREVISION_API_RETRY_DELAY_S: int
SCOREVISION_API_N_RETRIES: int
SCOREVISION_RESULTS_PREFIX: str
SCOREVISION_LOCAL_ROOT: Path
SCOREVISION_WARMUP_CALLS: int
SCOREVISION_MAX_CONCURRENT_API_CALLS: int
SCOREVISION_BACKOFF_RATE: float
SCOREVISION_TAIL: int
SCOREVISION_ALPHA: float
SCOREVISION_M_MIN: int
SCOREVISION_TEMPO: int
SCOREVISION_CACHE_DIR: Path
SCOREVISION_WINDOW_TIEBREAK_ENABLE: bool
SCOREVISION_WINDOW_K_PER_VALIDATOR: int
SCOREVISION_WINDOW_DELTA_ABS: float
SCOREVISION_WINDOW_DELTA_REL: float
@lru_cache
def get_settings() -> Settings:
load_dotenv()
return Settings(
# No defaults - MUST be set by User
SCOREVISION_API=getenv("SCOREVISION_API", "https://api.scorevision.io"),
CHUTES_API_KEY=getenv("CHUTES_API_KEY", ""),
BITTENSOR_WALLET_PATH=Path(
getenv(
"BITTENSOR_WALLET_PATH",
str(Path.home() / ".bittensor" / "wallets"),
)
).expanduser(),
OPENROUTER_API_KEY=getenv("OPENROUTER_API_KEY", ""),
R2_BUCKET=getenv("R2_BUCKET", ""),
R2_ACCOUNT_ID=getenv("R2_ACCOUNT_ID", ""),
R2_WRITE_ACCESS_KEY_ID=getenv("R2_WRITE_ACCESS_KEY_ID", ""),
R2_WRITE_SECRET_ACCESS_KEY=getenv("R2_WRITE_SECRET_ACCESS_KEY", ""),
R2_BUCKET_PUBLIC_URL=getenv("R2_BUCKET_PUBLIC_URL", ""),
HUGGINGFACE_USERNAME=getenv("HUGGINGFACE_USERNAME", ""),
HUGGINGFACE_API_KEY=getenv("HUGGINGFACE_API_KEY", ""),
CHUTES_USERNAME=getenv("CHUTES_USERNAME", ""),
SIGNER_SEED=getenv("SIGNER_SEED", ""),
# Defaults - CAN be changed by User
BITTENSOR_WALLET_COLD=getenv("BITTENSOR_WALLET_COLD", "default"),
BITTENSOR_WALLET_HOT=getenv("BITTENSOR_WALLET_HOT", "default"),
SCOREVISION_NETUID=int(getenv("SCOREVISION_NETUID", 44)),
SCOREVISION_MECHID=1,
SCOREVISION_MAX_CONCURRENT_API_CALLS=int(
getenv("SCOREVISION_MAX_CONCURRENT_API_CALLS", 8)
),
SCOREVISION_BACKOFF_RATE=float(getenv("SCOREVISION_BACKOFF_RATE", 0.5)),
SCOREVISION_VIDEO_FRAMES_PER_SECOND=int(
getenv("SCOREVISION_VIDEO_FRAMES_PER_SECOND", 30)
),
SCOREVISION_IMAGE_JPEG_QUALITY=int(
getenv("SCOREVISION_IMAGE_JPEG_QUALITY", 80)
),
SCOREVISION_VLM_SELECT_N_FRAMES=int(
getenv("SCOREVISION_VLM_SELECT_N_FRAMES", 3)
),
CHUTES_VLM_ENDPOINT=getenv(
"CHUTES_VLM_ENDPOINT", "https://llm.chutes.ai/v1/chat/completions"
),
OPENROUTER_VLM_ENDPOINT=getenv(
"OPENROUTER_VLM_ENDPOINT", "https://openrouter.ai/api/v1/chat/completions"
),
CHUTES_VLM=getenv("CHUTES_VLM", "Qwen/Qwen2.5-VL-72B-Instruct"),
OPENROUTER_VLM=getenv("OPENROUTER_VLM", "qwen/qwen2.5-vl-72b-instruct:free"),
SCOREVISION_VLM_TEMPERATURE=float(getenv("SCOREVISION_VLM_TEMPERATURE", 0.1)),
SCOREVISION_API_TIMEOUT_S=int(getenv("SCOREVISION_API_TIMEOUT_S", 300)),
SCOREVISION_VIDEO_MIN_FRAME_NUMBER=int(
getenv("SCOREVISION_VIDEO_MIN_FRAME_NUMBER", 1)
),
SCOREVISION_VIDEO_MAX_FRAME_NUMBER=int(
getenv("SCOREVISION_VIDEO_MAX_FRAME_NUMBER", 750)
),
SCOREVISION_API_RETRY_DELAY_S=int(getenv("SCOREVISION_API_RETRY_DELAY_S", 3)),
SCOREVISION_API_N_RETRIES=int(getenv("SCOREVISION_API_N_RETRIES", 3)),
SCOREVISION_SCORE_BASE=float(
getenv("SCOREVISION_SCORE_BASE", 2.718281828459045)
),
SCOREVISION_SCORE_ALPHA=float(getenv("SCOREVISION_SCORE_ALPHA", 0.9)),
SCOREVISION_SCORE_MS_PENALTY=float(
getenv("SCOREVISION_SCORE_MS_PENALTY", 0.001)
),
SCOREVISION_SCORE_SERVICE_LEVEL_OBJECTIVE_MS=float(
getenv("SCOREVISION_SCORE_SERVICE_LEVEL_OBJECTIVE_MS", 1500.0)
),
SCOREVISION_VERSION=getenv("SCOREVISION_VERSION", __version__),
SCOREVISION_RESULTS_PREFIX=getenv(
"SCOREVISION_RESULTS_PREFIX", "results_soccer"
),
SCOREVISION_LOCAL_ROOT=Path(
getenv(
"SCOREVISION_LOCAL_ROOT",
Path.home() / ".cache" / "scorevision" / "local",
)
),
R2_CONCURRENCY=int(getenv("R2_CONCURRENCY", 8)),
HUGGINGFACE_CONCURRENCY=int(getenv("HUGGINGFACE_CONCURRENCY", 2)),
PATH_CHUTE_SCRIPT=Path(
getenv(
"PATH_CHUTE_SCRIPT",
"scorevision/chute_template/turbovision_chute.py.j2",
)
),
PATH_CHUTE_TEMPLATES=Path(
getenv("PATH_CHUTE_TEMPLATES", "scorevision/chute_template")
),
FILENAME_CHUTE_MAIN=getenv("FILENAME_CHUTE_MAIN", "chute.py.j2"),
FILENAME_CHUTE_SCHEMAS=getenv("FILENAME_CHUTE_SCHEMAS", "schemas.py"),
FILENAME_CHUTE_SETUP_UTILS=getenv("FILENAME_CHUTE_SETUP_UTILS", "setup.py"),
FILENAME_CHUTE_LOAD_UTILS=getenv("FILENAME_CHUTE_LOAD_UTILS", "load.py"),
FILENAME_CHUTE_PREDICT_UTILS=getenv(
"FILENAME_CHUTE_PREDICT_UTILS", "predict.py"
),
CHUTES_MINERS_ENDPOINT=getenv(
"CHUTES_MINERS_ENDPOINT", "https://api.chutes.ai"
),
CHUTES_MINER_BASE_URL_TEMPLATE=getenv(
"CHUTES_MINER_BASE_URL_TEMPLATE",
"https://{slug}.chutes.ai",
),
CHUTES_MINER_PREDICT_ENDPOINT=getenv(
"CHUTES_MINER_PREDICT_ENDPOINT", "predict"
),
BITTENSOR_SUBTENSOR_ENDPOINT=getenv("BITTENSOR_SUBTENSOR_ENDPOINT", "finney"),
BITTENSOR_SUBTENSOR_FALLBACK=getenv(
"BITTENSOR_SUBTENSOR_FALLBACK", "wss://entrypoint-finney.opentensor.ai:443"
),
SCOREVISION_WARMUP_CALLS=int(getenv("SCOREVISION_WARMUP_CALLS", "3")),
SIGNER_HOST=getenv("SIGNER_HOST", "127.0.0.1"),
SIGNER_PORT=int(getenv("SIGNER_PORT", 8080)),
SIGNER_URL=getenv("SIGNER_URL", "http://signer:8080"),
SCOREVISION_TAIL=int(getenv("SCOREVISION_TAIL", 28800)),
SCOREVISION_ALPHA=float(getenv("SCOREVISION_ALPHA", 0.2)),
SCOREVISION_M_MIN=int(getenv("SCOREVISION_M_MIN", 25)),
SCOREVISION_TEMPO=int(getenv("SCOREVISION_TEMPO", 100)),
SCOREVISION_IMAGE_HEIGHT=int(getenv("SCOREVISION_IMAGE_HEIGHT", 540)),
SCOREVISION_IMAGE_WIDTH=int(getenv("SCOREVISION_IMAGE_WIDTH", 960)),
SCOREVISION_CACHE_DIR=Path(
getenv("SCOREVISION_CACHE_DIR", "~/.cache/scorevision/blocks")
).expanduser(),
SCOREVISION_WINDOW_TIEBREAK_ENABLE=_env_bool(
"SCOREVISION_WINDOW_TIEBREAK_ENABLE", True
),
SCOREVISION_WINDOW_K_PER_VALIDATOR=int(
getenv("SCOREVISION_WINDOW_K_PER_VALIDATOR", 25)
),
SCOREVISION_WINDOW_DELTA_ABS=float(
getenv("SCOREVISION_WINDOW_DELTA_ABS", 0.003)
),
SCOREVISION_WINDOW_DELTA_REL=float(
getenv("SCOREVISION_WINDOW_DELTA_REL", 0.01)
),
)
def _env_bool(name: str, default: bool) -> bool:
v = getenv(name, str(default))
return str(v).strip().lower() not in ("0", "false", "no", "off", "")
|