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", "")