used aiohttp for getting the http requests

#1
Files changed (1) hide show
  1. app.py +39 -71
app.py CHANGED
@@ -1,51 +1,41 @@
1
  import gradio as gr
2
  import requests
3
  import asyncio
4
- from typing import Any
5
  from gradio.themes.base import Base
6
  from gradio.themes.utils import colors, fonts, sizes
7
  from gradio.themes.utils.colors import Color
8
- from typing import Iterable
9
  from communex.client import CommuneClient
 
10
 
11
  FONT = """<link href="https://fonts.googleapis.com/css2?family=Roboto+Mono&display=swap" rel="stylesheet">"""
12
-
13
  IMAGE = """<p align="center" style="font-size: 72px;">๐Œ”๐Œ™๐Œ๐Œ•๐‹…๐Œ‰๐Œ€</p>"""
14
-
15
  HEADER = """
16
  <h2 align="center" class="typewriter">Welcome to the Synthia Commune Leaderboard!</h2>
17
  <p align="center">This leaderboard showcases the top-performing miners in the Synthia Commune Subnet. The models are ranked based on their daily rewards.</p>
18
  <p align="center">The Synthia subnet leverages Commune's incentives to create a permissionless mining market around distilling knowledge out of SOTA closed-source model APIs into a public dataset to accelerate the OpenSource AI space. Targeted models and strategy will adapt based on the current SOTA.</p>
19
  """
20
-
21
  EVALUATION_HEADER = """<h3 align="center">Evaluation Details</h3>"""
22
-
23
  EVALUATION_DETAILS = """<p align="center"><b>Name</b> represents the model name. <b>Rewards / Day</b> indicates the expected daily rewards for each model in <b>$COMAI</b>. <b>UID</b> is the unique identifier of the miner. <b>$USD Value</b> is the estimated dollar value of the daily rewards.</p>"""
24
  netuid = 3
25
  node_url = "wss://commune-api-node-2.communeai.net"
26
 
27
-
28
- def get_com_price() -> Any:
29
  retries = 5
30
- for i in range(0, retries):
31
  try:
32
- price = float(
33
- requests.get(
34
- "https://api.mexc.com/api/v3/avgPrice?symbol=COMAIUSDT"
35
- ).json()["price"]
36
- )
37
- print(f"Fetched COM price: {price}")
38
- return price
39
  except Exception as e:
40
  print(f"Error fetching COM price: {e}")
41
- if i == retries - 1:
42
- raise
43
- _ = asyncio.sleep(retries)
44
  raise RuntimeError("Failed to fetch COM price")
45
 
46
-
47
- def make_query(client: CommuneClient) -> tuple[dict[int, int], dict[int, str]]:
48
- request_dict: dict[Any, Any] = {
49
  "SubspaceModule": [
50
  ("Name", [netuid]),
51
  ("Emission", []),
@@ -53,8 +43,8 @@ def make_query(client: CommuneClient) -> tuple[dict[int, int], dict[int, str]]:
53
  ("Dividends", []),
54
  ],
55
  }
56
- emission_dict: dict[int, int] = {}
57
- name_dict: dict[int, str] = {}
58
  result = client.query_batch_map(request_dict)
59
 
60
  emission = result["Emission"]
@@ -67,63 +57,47 @@ def make_query(client: CommuneClient) -> tuple[dict[int, int], dict[int, str]]:
67
  names = result["Name"]
68
  highest_uid = max(names.keys())
69
  for uid in range(highest_uid + 1):
70
-
71
  emission = netuid_emission[uid]
72
-
73
  if emission != 0:
74
  incentive = netuid_incentive[uid]
75
  dividends = netuid_dividends[uid]
76
-
77
  if incentive > 0:
78
  emission_dict[uid] = netuid_emission[uid]
79
  name_dict[uid] = names[uid]
80
-
81
  return emission_dict, name_dict
82
 
83
-
84
  async def get_leaderboard_data():
85
- try:
86
- com_price = get_com_price()
87
- blocks_in_day = 10_800
88
- client = CommuneClient(node_url)
89
- emission_dict, name_dict = make_query(client)
90
- print("got tha emission")
91
- scores = {}
92
- for uid, emi in emission_dict.items():
93
- # we are doing ** 11 because emission are for modules have 2 extra units,
94
- # (otherwise it would be more intuive to do ** 9, hence from_nano)
95
- scores[uid] = (emi / 10**11) * blocks_in_day
96
- sorted_scores = sorted(
97
- scores.items(), key=lambda x: x[1], reverse=True)
98
- leaderboard_data = []
99
- for rank, (uid, score) in enumerate(sorted_scores, start=1):
100
- name = name_dict[uid]
101
- units = score
102
- usd_value = score * com_price
103
- leaderboard_data.append(
104
- (rank, uid, name, units, f"${usd_value:.2f}"))
105
- return leaderboard_data
106
- except Exception as e:
107
- print(f"Error fetching leaderboard data: {e}")
108
- return []
109
-
110
 
111
  async def update_leaderboard_table():
112
  leaderboard_data = await get_leaderboard_data()
113
- # Convert tuples to lists
114
  leaderboard_data = [list(row) for row in leaderboard_data]
115
- # Add emojis to the leaderboard data
116
  for row in leaderboard_data:
117
  row[0] = f"{row[0]} ๐Ÿ†"
118
-
119
- # Calculate the total USD value
120
  total_usd_value = sum(float(row[4][1:]) for row in leaderboard_data)
121
-
122
- # Calculate rewards per week and per month
123
  rewards_per_week = total_usd_value * 7
124
  rewards_per_month = total_usd_value * 30
125
-
126
- return leaderboard_data, f'''
127
  <div style="display: flex; justify-content: space-between; align-items: center; font-size: 16px; font-weight: bold;">
128
  <div>๐™๐™ค๐™ฉ๐™–๐™ก $ ๐™ˆ๐™ž๐™ฃ๐™ž๐™ฃ๐™œ ๐™๐™š๐™ฌ๐™–๐™ง๐™™๐™จ ๐™‹๐™š๐™ง ๐™’๐™š๐™š๐™ : ${rewards_per_week:,.0f}</div>
129
  <div>๐™๐™ค๐™ฉ๐™–๐™ก $ ๐™ˆ๐™ž๐™ฃ๐™ž๐™ฃ๐™œ ๐™๐™š๐™ฌ๐™–๐™ง๐™™๐™จ ๐™‹๐™š๐™ง ๐˜ฟ๐™–๐™ฎ: ${total_usd_value:,.0f}</div>
@@ -131,7 +105,6 @@ async def update_leaderboard_table():
131
  </div>
132
  '''
133
 
134
-
135
  stone_gray = Color(
136
  name="stone_gray",
137
  c50="#f5f5f5",
@@ -147,11 +120,9 @@ stone_gray = Color(
147
  c950="#1a1a1a",
148
  )
149
 
150
-
151
  class Seafoam(Base):
152
  def __init__(
153
  self,
154
- *,
155
  primary_hue: colors.Color | str = stone_gray,
156
  secondary_hue: colors.Color | str = stone_gray,
157
  neutral_hue: colors.Color | str = stone_gray,
@@ -186,12 +157,10 @@ class Seafoam(Base):
186
  button_shadow="*shadow_drop_lg",
187
  button_large_padding="32px",
188
  button_primary_background_fill_hover="*button_primary_background_fill",
189
- # Add the following lines to set the button colors
190
- button_primary_background_fill="#333333", # Dark background color
191
- button_primary_text_color="#ffffff", # White text color
192
  )
193
 
194
-
195
  seafoam = Seafoam()
196
 
197
  with gr.Blocks(theme=seafoam, analytics_enabled=True) as demo:
@@ -222,9 +191,8 @@ with gr.Blocks(theme=seafoam, analytics_enabled=True) as demo:
222
  refresh_button.click(fn=update_leaderboard_table, outputs=[
223
  leaderboard_table, total_usd_value_html])
224
 
225
- # Initial load of leaderboard data
226
  demo.load(update_leaderboard_table, inputs=None, outputs=[
227
  leaderboard_table, total_usd_value_html])
228
 
229
  if __name__ == "__main__":
230
- demo.launch()
 
1
  import gradio as gr
2
  import requests
3
  import asyncio
4
+ from typing import Any, Iterable
5
  from gradio.themes.base import Base
6
  from gradio.themes.utils import colors, fonts, sizes
7
  from gradio.themes.utils.colors import Color
 
8
  from communex.client import CommuneClient
9
+ import aiohttp
10
 
11
  FONT = """<link href="https://fonts.googleapis.com/css2?family=Roboto+Mono&display=swap" rel="stylesheet">"""
 
12
  IMAGE = """<p align="center" style="font-size: 72px;">๐Œ”๐Œ™๐Œ๐Œ•๐‹…๐Œ‰๐Œ€</p>"""
 
13
  HEADER = """
14
  <h2 align="center" class="typewriter">Welcome to the Synthia Commune Leaderboard!</h2>
15
  <p align="center">This leaderboard showcases the top-performing miners in the Synthia Commune Subnet. The models are ranked based on their daily rewards.</p>
16
  <p align="center">The Synthia subnet leverages Commune's incentives to create a permissionless mining market around distilling knowledge out of SOTA closed-source model APIs into a public dataset to accelerate the OpenSource AI space. Targeted models and strategy will adapt based on the current SOTA.</p>
17
  """
 
18
  EVALUATION_HEADER = """<h3 align="center">Evaluation Details</h3>"""
 
19
  EVALUATION_DETAILS = """<p align="center"><b>Name</b> represents the model name. <b>Rewards / Day</b> indicates the expected daily rewards for each model in <b>$COMAI</b>. <b>UID</b> is the unique identifier of the miner. <b>$USD Value</b> is the estimated dollar value of the daily rewards.</p>"""
20
  netuid = 3
21
  node_url = "wss://commune-api-node-2.communeai.net"
22
 
23
+ async def get_com_price(session: aiohttp.ClientSession) -> Any:
 
24
  retries = 5
25
+ for i in range(retries):
26
  try:
27
+ async with session.get("https://api.mexc.com/api/v3/avgPrice?symbol=COMAIUSDT") as response:
28
+ response.raise_for_status()
29
+ price = float((await response.json())["price"])
30
+ print(f"Fetched COM price: {price}")
31
+ return price
 
 
32
  except Exception as e:
33
  print(f"Error fetching COM price: {e}")
34
+ await asyncio.sleep(retries)
 
 
35
  raise RuntimeError("Failed to fetch COM price")
36
 
37
+ async def make_query(client: CommuneClient) -> tuple[dict[int, int], dict[int, str]]:
38
+ request_dict = {
 
39
  "SubspaceModule": [
40
  ("Name", [netuid]),
41
  ("Emission", []),
 
43
  ("Dividends", []),
44
  ],
45
  }
46
+ emission_dict = {}
47
+ name_dict = {}
48
  result = client.query_batch_map(request_dict)
49
 
50
  emission = result["Emission"]
 
57
  names = result["Name"]
58
  highest_uid = max(names.keys())
59
  for uid in range(highest_uid + 1):
 
60
  emission = netuid_emission[uid]
 
61
  if emission != 0:
62
  incentive = netuid_incentive[uid]
63
  dividends = netuid_dividends[uid]
 
64
  if incentive > 0:
65
  emission_dict[uid] = netuid_emission[uid]
66
  name_dict[uid] = names[uid]
 
67
  return emission_dict, name_dict
68
 
 
69
  async def get_leaderboard_data():
70
+ async with aiohttp.ClientSession() as session:
71
+ try:
72
+ com_price = await get_com_price(session)
73
+ blocks_in_day = 10_800
74
+ client = CommuneClient(node_url)
75
+ emission_dict, name_dict = await make_query(client)
76
+ print("got the emission")
77
+ scores = {}
78
+ for uid, emi in emission_dict.items():
79
+ scores[uid] = (emi / 10**11) * blocks_in_day
80
+ sorted_scores = sorted(scores.items(), key=lambda x: x[1], reverse=True)
81
+ leaderboard_data = []
82
+ for rank, (uid, score) in enumerate(sorted_scores, start=1):
83
+ name = name_dict[uid]
84
+ units = score
85
+ usd_value = score * com_price
86
+ leaderboard_data.append((rank, uid, name, units, f"${usd_value:.2f}"))
87
+ return leaderboard_data
88
+ except Exception as e:
89
+ print(f"Error fetching leaderboard data: {e}")
90
+ return []
 
 
 
 
91
 
92
  async def update_leaderboard_table():
93
  leaderboard_data = await get_leaderboard_data()
 
94
  leaderboard_data = [list(row) for row in leaderboard_data]
 
95
  for row in leaderboard_data:
96
  row[0] = f"{row[0]} ๐Ÿ†"
 
 
97
  total_usd_value = sum(float(row[4][1:]) for row in leaderboard_data)
 
 
98
  rewards_per_week = total_usd_value * 7
99
  rewards_per_month = total_usd_value * 30
100
+ return leaderboard_data, f'''
 
101
  <div style="display: flex; justify-content: space-between; align-items: center; font-size: 16px; font-weight: bold;">
102
  <div>๐™๐™ค๐™ฉ๐™–๐™ก $ ๐™ˆ๐™ž๐™ฃ๐™ž๐™ฃ๐™œ ๐™๐™š๐™ฌ๐™–๐™ง๐™™๐™จ ๐™‹๐™š๐™ง ๐™’๐™š๐™š๐™ : ${rewards_per_week:,.0f}</div>
103
  <div>๐™๐™ค๐™ฉ๐™–๐™ก $ ๐™ˆ๐™ž๐™ฃ๐™ž๐™ฃ๐™œ ๐™๐™š๐™ฌ๐™–๐™ง๐™™๐™จ ๐™‹๐™š๐™ง ๐˜ฟ๐™–๐™ฎ: ${total_usd_value:,.0f}</div>
 
105
  </div>
106
  '''
107
 
 
108
  stone_gray = Color(
109
  name="stone_gray",
110
  c50="#f5f5f5",
 
120
  c950="#1a1a1a",
121
  )
122
 
 
123
  class Seafoam(Base):
124
  def __init__(
125
  self,
 
126
  primary_hue: colors.Color | str = stone_gray,
127
  secondary_hue: colors.Color | str = stone_gray,
128
  neutral_hue: colors.Color | str = stone_gray,
 
157
  button_shadow="*shadow_drop_lg",
158
  button_large_padding="32px",
159
  button_primary_background_fill_hover="*button_primary_background_fill",
160
+ button_primary_background_fill="#333333",
161
+ button_primary_text_color="#ffffff",
 
162
  )
163
 
 
164
  seafoam = Seafoam()
165
 
166
  with gr.Blocks(theme=seafoam, analytics_enabled=True) as demo:
 
191
  refresh_button.click(fn=update_leaderboard_table, outputs=[
192
  leaderboard_table, total_usd_value_html])
193
 
 
194
  demo.load(update_leaderboard_table, inputs=None, outputs=[
195
  leaderboard_table, total_usd_value_html])
196
 
197
  if __name__ == "__main__":
198
+ demo.launch()