Skip to content

Commit 2378905

Browse files
committed
Overwrite main's files with http_validator
1 parent bd4a823 commit 2378905

File tree

214 files changed

+24152
-2587
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

214 files changed

+24152
-2587
lines changed

.gitignore

Lines changed: 4 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -11,39 +11,17 @@ wheels/
1111

1212
# Env files
1313
*.env
14-
*.db
15-
*.db.bak
1614

1715
# MacOS
1816
.DS_Store
1917

20-
# Logging
21-
logs.json
22-
logs_mineshaft/
2318

24-
# IDEs
25-
.idea/
26-
27-
# Validator generated files
28-
.cache/
29-
repos/
30-
repo_cache/
31-
agents/
32-
validator/datasets/swebench_verified/repos/
33-
results/
19+
# SWE-Bench
3420
logs/
3521

36-
# Miner installations and submodules
37-
SWE-agent/*
38-
.gitmodules
39-
40-
LOCAL_NOTES.md
41-
LOCAL_NOTES.md
42-
conversation.jsonc
43-
4422
# Platform cache
4523
subnet_hotkeys_cache.json
46-
.commits_cache.json
4724

48-
# IP name mappings (local config)
49-
whitelist.json
25+
26+
# Adam's stuff
27+
gui/

agent.py

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
import os
2+
import json
3+
import requests
4+
5+
6+
7+
RUN_ID = os.getenv("RUN_ID")
8+
if not RUN_ID:
9+
print("[AGENT] WARNING: RUN_ID is not set")
10+
11+
SANDBOX_PROXY_URL = os.getenv("SANDBOX_PROXY_URL")
12+
if not SANDBOX_PROXY_URL:
13+
print("[AGENT] WARNING: SANDBOX_PROXY_URL is not set")
14+
15+
16+
17+
def inference(model, temperature, messages):
18+
try:
19+
payload = {
20+
"run_id": RUN_ID,
21+
"model": model,
22+
"temperature": temperature,
23+
"messages": messages
24+
}
25+
26+
print(f"[AGENT] inference(): Sending inference request for model {model} (temperature {temperature}) with {len(messages)} messages")
27+
response = requests.post(
28+
f"{SANDBOX_PROXY_URL}/api/inference",
29+
headers={"Content-Type": "application/json"},
30+
data=json.dumps(payload)
31+
)
32+
33+
if response.status_code == 200:
34+
result = response.text.strip('"')
35+
print(f"[AGENT] inference(): Inference response: {len(result)} characters")
36+
return result
37+
else:
38+
print(f"[AGENT] inference(): Inference failed with status {response.status_code}: {response.text}")
39+
return None
40+
41+
except Exception as e:
42+
print(f"[AGENT] inference(): Inference request failed: {e}")
43+
return None
44+
45+
46+
47+
def embedding(input):
48+
try:
49+
payload = {
50+
"run_id": RUN_ID,
51+
"input": input
52+
}
53+
54+
print(f"[AGENT] embedding(): Sending embedding request...")
55+
response = requests.post(
56+
f"{SANDBOX_PROXY_URL}/api/embedding",
57+
headers={"Content-Type": "application/json"},
58+
data=json.dumps(payload)
59+
)
60+
61+
if response.status_code == 200:
62+
result = response.json()
63+
print(f"[AGENT] embedding(): Embedding response: {len(result)} dimensions")
64+
return result
65+
else:
66+
print(f"[AGENT] embedding(): Embedding failed with status {response.status_code}: {response.text}")
67+
return None
68+
69+
except Exception as e:
70+
print(f"[AGENT] embedding(): Embedding request failed: {e}")
71+
return None
72+
73+
74+
75+
def agent_main(input):
76+
print("[AGENT] Entered agent_main()")
77+
78+
79+
80+
# Test inference function
81+
message = "What is 2+2?"
82+
print(f"[AGENT] <-- '{message}'")
83+
messages = [
84+
{"role": "user", "content": message}
85+
]
86+
inference_result = inference("moonshotai/Kimi-K2-Instruct", 0.5, messages)
87+
if inference_result:
88+
print(f"[AGENT] --> '{inference_result}'")
89+
90+
91+
92+
print("[AGENT] Reading solution from /sandbox/solution.diff")
93+
with open("/sandbox/solution.diff", "r") as f:
94+
diff = f.read()
95+
96+
97+
98+
print("[AGENT] Exiting agent_main()")
99+
100+
return diff

api/.commits_cache.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
["57ff9fec4be08a941f08d1e41ea3de870e5729fa", "590cadc6b019e7f6d620e858228490109839926f", "768fc4c9608229a2b405fcead4959c7f4f33a79f", "385f9a18764bd7578866292561361bc0b48096f1", "85882bf82f7944523f9d22853e44c7315f2c8171", "fe49148b81a79796dea185bc82c76091a9380f92", "e434bee0aa9c5c7071f9f54de7567232d59ce5da", "6ba640919c6d51a2bcbff8b493f318849b437a60", "1bc3f6b22237200473b704dca9df2f7d18f24578", "4cbeae9da2bd11edd2d0f3de44e6184795089ad6", "96bb89a3b2b8ac3fcd5281af533d1c343c1ca307", "60421984b5856b09e0db916f3393baf7495333e7", "37dcf2fe9d1da708bbad4729c973c22d5dbdb5f8", "144e40de50576399545256e95017d8e44388a177", "7e230c433657f2b34de60616ffd8a99576eac27e", "856877d8857ec0bd22b44cc8f8c9d62fec30dbfd", "ba5669f23d66af5a57887db0ddee61e269343b8d", "89ae6b444f940947637f0e1ba3e8b31376b1a135", "08b8f99b2af4865b67a6f277626d443c0b57bb08", "fa226e5eddcdc125bd64f8faccbf6c29a38bc347", "098cedb9df5628b798e9a5ab5f97df3a520cf54d", "42439cef169bebd5c9761ac740afe1a720288c11", "c41411cc4c95e072da1a90cf4e052547553d5b81", "c957ffd55b2997fa2895895dbcd4c2135ecbd0d1", "db7128ab8dd0999f2c87b70c3eba09968a2416eb", "ef421703a2b8b97809328a3781572bd38e29b0e9", "e8f85f55957d3462f49421d550b2ccc4e7535013", "022bea3f22d75eb7ff282201a800d4caf0a24082", "d2c96674c8b5976a7c04fd209c59431623f58db0", "64023fd419ae410b81baa41fdc371648d0fb20a4"]

api/.env.example

Lines changed: 20 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,26 @@
1-
ENV=
1+
ENV=dev
22

3-
NETUID=372
4-
SUBTENSOR_NETWORK=testnet
5-
SUBTENSOR_ADDRESS=wss://test.finney.opentensor.ai:443
3+
AWS_ACCESS_KEY_ID=
4+
AWS_SECRET_ACCESS_KEY=
5+
AWS_REGION=
66

7-
BAN_PASSWORD=
7+
S3_BUCKET_NAME=
88

9-
AWS_MASTER_USERNAME=
10-
AWS_MASTER_PASSWORD=
9+
DATABASE_USERNAME=
10+
DATABASE_PASSWORD=
11+
DATABASE_HOST=
12+
DATABASE_PORT=5432
13+
DATABASE_NAME=
1114

12-
AWS_RDS_PLATFORM_ENDPOINT=
13-
AWS_RDS_PLATFORM_DB_NAME=
15+
SCREENER_PASSWORD=
16+
SCREENER_1_THRESHOLD=0.3 # Must get at least 30% on screener-1
17+
SCREENER_2_THRESHOLD=0.4 # Must get at least 40% on screener-2
18+
PRUNE_THRESHOLD=0.9 # Must get at least 90% of the top agent's score after finishing screener-2
1419

15-
AWS_S3_BUCKET_NAME=
20+
VALIDATOR_HEARTBEAT_TIMEOUT_SECONDS=60 # 1 minute
21+
VALIDATOR_HEARTBEAT_TIMEOUT_INTERVAL_SECONDS=60 # 1 minute
22+
VALIDATOR_RUNNING_AGENT_TIMEOUT_SECONDS=2400 # 40 minutes
23+
VALIDATOR_RUNNING_EVAL_TIMEOUT_SECONDS=600 # 10 minutes
24+
NUM_EVALS_PER_AGENT=3
1625

17-
TAOSTATS_API_KEY=
18-
19-
OPEN_USER_PASSWORD=
20-
21-
DB_USER_INT=
22-
DB_PASS_INT=
23-
DB_HOST_INT=
24-
DB_PORT_INT=
25-
DB_NAME_INT=
26-
27-
TREASURY_TRANSACTION_PASSWORD=
26+
MINER_AGENT_UPLOAD_RATE_LIMIT_SECONDS=86400 # 24 hours

api/config.py

Lines changed: 167 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,167 @@
1+
import os
2+
import utils.logger as logger
3+
4+
from dotenv import load_dotenv
5+
6+
7+
8+
# Load everything from .env
9+
load_dotenv()
10+
11+
12+
13+
# TODO ADAM: fix up the file where this is used
14+
NETUID = os.getenv("NETUID")
15+
if not NETUID:
16+
logger.fatal("NETUID is not set in .env")
17+
NETUID = int(NETUID)
18+
19+
SUBTENSOR_ADDRESS = os.getenv("SUBTENSOR_ADDRESS")
20+
if not SUBTENSOR_ADDRESS:
21+
logger.fatal("SUBTENSOR_ADDRESS is not set in .env")
22+
23+
SUBTENSOR_NETWORK = os.getenv("SUBTENSOR_NETWORK")
24+
if not SUBTENSOR_ADDRESS:
25+
logger.fatal("SUBTENSOR_ADDRESS is not set in .env")
26+
27+
28+
29+
30+
# Load the environment configuration
31+
ENV = os.getenv("ENV")
32+
if not ENV:
33+
logger.fatal("ENV is not set in .env")
34+
35+
if ENV != "prod" and ENV != "dev":
36+
logger.fatal("ENV must be either 'prod' or 'dev'")
37+
38+
39+
40+
# Load AWS configuration
41+
AWS_ACCESS_KEY_ID = os.getenv("AWS_ACCESS_KEY_ID")
42+
if not AWS_ACCESS_KEY_ID:
43+
logger.fatal("AWS_ACCESS_KEY_ID is not set in .env")
44+
45+
AWS_SECRET_ACCESS_KEY = os.getenv("AWS_SECRET_ACCESS_KEY")
46+
if not AWS_SECRET_ACCESS_KEY:
47+
logger.fatal("AWS_SECRET_ACCESS_KEY is not set in .env")
48+
49+
AWS_REGION = os.getenv("AWS_REGION")
50+
if not AWS_REGION:
51+
logger.fatal("AWS_REGION is not set in .env")
52+
53+
54+
55+
# Load S3 configuration
56+
S3_BUCKET_NAME = os.getenv("S3_BUCKET_NAME")
57+
if not S3_BUCKET_NAME:
58+
logger.fatal("S3_BUCKET_NAME is not set in .env")
59+
60+
61+
62+
# Load database configuration
63+
DATABASE_USERNAME = os.getenv("DATABASE_USERNAME")
64+
if not DATABASE_USERNAME:
65+
logger.fatal("DATABASE_USERNAME is not set in .env")
66+
67+
DATABASE_PASSWORD = os.getenv("DATABASE_PASSWORD")
68+
if not DATABASE_PASSWORD:
69+
logger.fatal("DATABASE_PASSWORD is not set in .env")
70+
71+
DATABASE_HOST = os.getenv("DATABASE_HOST")
72+
if not DATABASE_HOST:
73+
logger.fatal("DATABASE_HOST is not set in .env")
74+
75+
DATABASE_PORT = os.getenv("DATABASE_PORT")
76+
if not DATABASE_PORT:
77+
logger.fatal("DATABASE_PORT is not set in .env")
78+
DATABASE_PORT = int(DATABASE_PORT)
79+
80+
DATABASE_NAME = os.getenv("DATABASE_NAME")
81+
if not DATABASE_NAME:
82+
logger.fatal("DATABASE_NAME is not set in .env")
83+
84+
85+
86+
# Load screener configuration
87+
SCREENER_PASSWORD = os.getenv("SCREENER_PASSWORD")
88+
if not SCREENER_PASSWORD:
89+
logger.fatal("SCREENER_PASSWORD is not set in .env")
90+
91+
SCREENER_1_THRESHOLD = os.getenv("SCREENER_1_THRESHOLD")
92+
if not SCREENER_1_THRESHOLD:
93+
logger.fatal("SCREENER_1_THRESHOLD is not set in .env")
94+
SCREENER_1_THRESHOLD = float(SCREENER_1_THRESHOLD)
95+
96+
SCREENER_2_THRESHOLD = os.getenv("SCREENER_2_THRESHOLD")
97+
if not SCREENER_2_THRESHOLD:
98+
logger.fatal("SCREENER_2_THRESHOLD is not set in .env")
99+
SCREENER_2_THRESHOLD = float(SCREENER_2_THRESHOLD)
100+
101+
PRUNE_THRESHOLD = os.getenv("PRUNE_THRESHOLD")
102+
if not PRUNE_THRESHOLD:
103+
logger.fatal("PRUNE_THRESHOLD is not set in .env")
104+
PRUNE_THRESHOLD = float(PRUNE_THRESHOLD)
105+
106+
107+
108+
# Load validator configuration
109+
VALIDATOR_HEARTBEAT_TIMEOUT_SECONDS = os.getenv("VALIDATOR_HEARTBEAT_TIMEOUT_SECONDS")
110+
if not VALIDATOR_HEARTBEAT_TIMEOUT_SECONDS:
111+
logger.fatal("VALIDATOR_HEARTBEAT_TIMEOUT_SECONDS is not set in .env")
112+
VALIDATOR_HEARTBEAT_TIMEOUT_SECONDS = int(VALIDATOR_HEARTBEAT_TIMEOUT_SECONDS)
113+
114+
VALIDATOR_HEARTBEAT_TIMEOUT_INTERVAL_SECONDS = os.getenv("VALIDATOR_HEARTBEAT_TIMEOUT_INTERVAL_SECONDS")
115+
if not VALIDATOR_HEARTBEAT_TIMEOUT_INTERVAL_SECONDS:
116+
logger.fatal("VALIDATOR_HEARTBEAT_TIMEOUT_INTERVAL_SECONDS is not set in .env")
117+
VALIDATOR_HEARTBEAT_TIMEOUT_INTERVAL_SECONDS = int(VALIDATOR_HEARTBEAT_TIMEOUT_INTERVAL_SECONDS)
118+
119+
VALIDATOR_RUNNING_AGENT_TIMEOUT_SECONDS = os.getenv("VALIDATOR_RUNNING_AGENT_TIMEOUT_SECONDS")
120+
if not VALIDATOR_RUNNING_AGENT_TIMEOUT_SECONDS:
121+
logger.fatal("VALIDATOR_RUNNING_AGENT_TIMEOUT_SECONDS is not set in .env")
122+
VALIDATOR_RUNNING_AGENT_TIMEOUT_SECONDS = int(VALIDATOR_RUNNING_AGENT_TIMEOUT_SECONDS)
123+
124+
VALIDATOR_RUNNING_EVAL_TIMEOUT_SECONDS = os.getenv("VALIDATOR_RUNNING_EVAL_TIMEOUT_SECONDS")
125+
if not VALIDATOR_RUNNING_EVAL_TIMEOUT_SECONDS:
126+
logger.fatal("VALIDATOR_RUNNING_EVAL_TIMEOUT_SECONDS is not set in .env")
127+
VALIDATOR_RUNNING_EVAL_TIMEOUT_SECONDS = int(VALIDATOR_RUNNING_EVAL_TIMEOUT_SECONDS)
128+
129+
NUM_EVALS_PER_AGENT = os.getenv("NUM_EVALS_PER_AGENT")
130+
if not NUM_EVALS_PER_AGENT:
131+
logger.fatal("NUM_EVALS_PER_AGENT is not set in .env")
132+
NUM_EVALS_PER_AGENT = int(NUM_EVALS_PER_AGENT)
133+
134+
135+
136+
MINER_AGENT_UPLOAD_RATE_LIMIT_SECONDS = os.getenv("MINER_AGENT_UPLOAD_RATE_LIMIT_SECONDS")
137+
if not MINER_AGENT_UPLOAD_RATE_LIMIT_SECONDS:
138+
logger.fatal("MINER_AGENT_UPLOAD_RATE_LIMIT_SECONDS is not set in .env")
139+
MINER_AGENT_UPLOAD_RATE_LIMIT_SECONDS = int(MINER_AGENT_UPLOAD_RATE_LIMIT_SECONDS)
140+
141+
142+
143+
logger.info("=== API Configuration ===")
144+
logger.info(f"Environment: {'Production' if ENV == 'prod' else 'Development'}")
145+
logger.info("-------------------------")
146+
logger.info(f"AWS Region: {AWS_REGION}")
147+
logger.info("-------------------------")
148+
logger.info(f"S3 Bucket Name: {S3_BUCKET_NAME}")
149+
logger.info("-------------------------")
150+
logger.info(f"Database Username: {DATABASE_USERNAME}")
151+
logger.info(f"Database Host: {DATABASE_HOST}")
152+
logger.info(f"Database Port: {DATABASE_PORT}")
153+
logger.info(f"Database Name: {DATABASE_NAME}")
154+
logger.info("-------------------------")
155+
logger.info(f"Screener 1 Threshold: {SCREENER_1_THRESHOLD}")
156+
logger.info(f"Screener 2 Threshold: {SCREENER_2_THRESHOLD}")
157+
logger.info(f"Prune Threshold: {PRUNE_THRESHOLD}")
158+
logger.info("-------------------------")
159+
logger.info(f"Validator Heartbeat Timeout: {VALIDATOR_HEARTBEAT_TIMEOUT_SECONDS} second(s)")
160+
logger.info(f"Validator Heartbeat Timeout Interval: {VALIDATOR_HEARTBEAT_TIMEOUT_INTERVAL_SECONDS} second(s)")
161+
logger.info(f"Validator Running Agent Timeout: {VALIDATOR_RUNNING_AGENT_TIMEOUT_SECONDS} second(s)")
162+
logger.info(f"Validator Running Evaluation Timeout: {VALIDATOR_RUNNING_EVAL_TIMEOUT_SECONDS} second(s)")
163+
logger.info("-------------------------")
164+
logger.info(f"Number of Evaluations Per Agent: {NUM_EVALS_PER_AGENT}")
165+
logger.info("-------------------------")
166+
logger.info(f"Miner Agent Upload Rate Limit: {MINER_AGENT_UPLOAD_RATE_LIMIT_SECONDS} second(s)")
167+
logger.info("=========================")
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import asyncio
2+
import api.config as config
3+
import utils.logger as logger
4+
5+
from api.src.endpoints.validator import delete_validators_that_have_not_sent_a_heartbeat
6+
7+
8+
9+
async def validator_heartbeat_timeout_loop():
10+
logger.info("Starting validator heartbeat timeout loop...")
11+
12+
while True:
13+
await delete_validators_that_have_not_sent_a_heartbeat()
14+
15+
await asyncio.sleep(config.VALIDATOR_HEARTBEAT_TIMEOUT_INTERVAL_SECONDS)

0 commit comments

Comments
 (0)