Spaces:
Sleeping
Sleeping
Commit
·
ab063cf
1
Parent(s):
32e1e2e
reorganizes validator app
Browse files- server.py +25 -21
- validators/__init__.py +2 -2
- validators/base.py +2 -2
- validators/sn1_validator_wrapper.py +2 -2
server.py
CHANGED
@@ -3,7 +3,7 @@ import utils
|
|
3 |
import bittensor as bt
|
4 |
from aiohttp import web
|
5 |
from aiohttp.web_response import Response
|
6 |
-
from validators import
|
7 |
from middlewares import api_key_middleware, json_parsing_middleware
|
8 |
|
9 |
"""
|
@@ -34,9 +34,6 @@ EXPECTED_ACCESS_KEY="hey-michal" python app.py --neuron.model_id mock --wallet.n
|
|
34 |
```
|
35 |
add --mock to test the echo stream
|
36 |
"""
|
37 |
-
|
38 |
-
validator = None
|
39 |
-
|
40 |
@api_key_middleware
|
41 |
@json_parsing_middleware
|
42 |
async def chat(request: web.Request) -> Response:
|
@@ -47,6 +44,10 @@ async def chat(request: web.Request) -> Response:
|
|
47 |
params = QueryValidatorParams.from_dict(request_data)
|
48 |
# TODO: SET STREAM AS DEFAULT
|
49 |
stream = request_data.get('stream', False)
|
|
|
|
|
|
|
|
|
50 |
response = await validator.query_validator(params, stream=stream)
|
51 |
return response
|
52 |
|
@@ -57,36 +58,39 @@ async def echo_stream(request, request_data):
|
|
57 |
request_data = request['data']
|
58 |
return await utils.echo_stream(request_data)
|
59 |
|
|
|
60 |
class ValidatorApplication(web.Application):
|
61 |
-
def __init__(self, *
|
62 |
-
super().__init__(*
|
|
|
|
|
|
|
|
|
63 |
self.middlewares.append(api_key_middleware)
|
64 |
self.middlewares.append(json_parsing_middleware)
|
65 |
-
|
|
|
|
|
|
|
|
|
66 |
# TODO: Enable rewarding and other features
|
67 |
-
|
68 |
-
|
69 |
-
validator_app = ValidatorApplication()
|
70 |
-
validator_app.add_routes([
|
71 |
-
web.post('/chat/', chat),
|
72 |
-
web.post('/echo/', echo_stream)
|
73 |
-
])
|
74 |
-
|
75 |
-
bt.logging.info("Starting validator application.")
|
76 |
-
bt.logging.info(validator_app)
|
77 |
-
|
78 |
-
|
79 |
def main(run_aio_app=True, test=False) -> None:
|
80 |
loop = asyncio.get_event_loop()
|
81 |
port = 10000
|
82 |
if run_aio_app:
|
|
|
|
|
|
|
|
|
|
|
83 |
try:
|
84 |
web.run_app(validator_app, port=port, loop=loop)
|
85 |
except KeyboardInterrupt:
|
86 |
-
|
87 |
finally:
|
88 |
pass
|
89 |
|
90 |
if __name__ == "__main__":
|
91 |
-
validator = S1ValidatorWrapper()
|
92 |
main()
|
|
|
3 |
import bittensor as bt
|
4 |
from aiohttp import web
|
5 |
from aiohttp.web_response import Response
|
6 |
+
from validators import S1ValidatorAPI, QueryValidatorParams, ValidatorAPI
|
7 |
from middlewares import api_key_middleware, json_parsing_middleware
|
8 |
|
9 |
"""
|
|
|
34 |
```
|
35 |
add --mock to test the echo stream
|
36 |
"""
|
|
|
|
|
|
|
37 |
@api_key_middleware
|
38 |
@json_parsing_middleware
|
39 |
async def chat(request: web.Request) -> Response:
|
|
|
44 |
params = QueryValidatorParams.from_dict(request_data)
|
45 |
# TODO: SET STREAM AS DEFAULT
|
46 |
stream = request_data.get('stream', False)
|
47 |
+
|
48 |
+
# Access the validator from the application context
|
49 |
+
validator: ValidatorAPI = request.app['validator']
|
50 |
+
|
51 |
response = await validator.query_validator(params, stream=stream)
|
52 |
return response
|
53 |
|
|
|
58 |
request_data = request['data']
|
59 |
return await utils.echo_stream(request_data)
|
60 |
|
61 |
+
|
62 |
class ValidatorApplication(web.Application):
|
63 |
+
def __init__(self, validator_instance=None, *args, **kwargs):
|
64 |
+
super().__init__(*args, **kwargs)
|
65 |
+
|
66 |
+
self['validator'] = validator_instance if validator_instance else S1ValidatorAPI()
|
67 |
+
|
68 |
+
# Add middlewares to application
|
69 |
self.middlewares.append(api_key_middleware)
|
70 |
self.middlewares.append(json_parsing_middleware)
|
71 |
+
|
72 |
+
self.add_routes([
|
73 |
+
web.post('/chat/', chat),
|
74 |
+
web.post('/echo/', echo_stream)
|
75 |
+
])
|
76 |
# TODO: Enable rewarding and other features
|
77 |
+
|
78 |
+
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
79 |
def main(run_aio_app=True, test=False) -> None:
|
80 |
loop = asyncio.get_event_loop()
|
81 |
port = 10000
|
82 |
if run_aio_app:
|
83 |
+
# Instantiate the application with the actual validator
|
84 |
+
bt.logging.info("Starting validator application.")
|
85 |
+
validator_app = ValidatorApplication()
|
86 |
+
bt.logging.success(f'Validator app initialized successfully', validator_app)
|
87 |
+
|
88 |
try:
|
89 |
web.run_app(validator_app, port=port, loop=loop)
|
90 |
except KeyboardInterrupt:
|
91 |
+
print("Keyboard interrupt detected. Exiting validator.")
|
92 |
finally:
|
93 |
pass
|
94 |
|
95 |
if __name__ == "__main__":
|
|
|
96 |
main()
|
validators/__init__.py
CHANGED
@@ -1,2 +1,2 @@
|
|
1 |
-
from base import QueryValidatorParams,
|
2 |
-
from sn1_validator_wrapper import
|
|
|
1 |
+
from base import QueryValidatorParams, ValidatorAPI, MockValidator
|
2 |
+
from sn1_validator_wrapper import S1ValidatorAPI
|
validators/base.py
CHANGED
@@ -23,13 +23,13 @@ class QueryValidatorParams:
|
|
23 |
prefer=data.get('prefer', 'longest')
|
24 |
)
|
25 |
|
26 |
-
class
|
27 |
@abstractmethod
|
28 |
async def query_validator(self, params:QueryValidatorParams) -> Response:
|
29 |
pass
|
30 |
|
31 |
|
32 |
-
class MockValidator(
|
33 |
async def query_validator(self, params:QueryValidatorParams) -> Response:
|
34 |
...
|
35 |
|
|
|
23 |
prefer=data.get('prefer', 'longest')
|
24 |
)
|
25 |
|
26 |
+
class ValidatorAPI(ABC):
|
27 |
@abstractmethod
|
28 |
async def query_validator(self, params:QueryValidatorParams) -> Response:
|
29 |
pass
|
30 |
|
31 |
|
32 |
+
class MockValidator(ValidatorAPI):
|
33 |
async def query_validator(self, params:QueryValidatorParams) -> Response:
|
34 |
...
|
35 |
|
validators/sn1_validator_wrapper.py
CHANGED
@@ -8,11 +8,11 @@ from prompting.validator import Validator
|
|
8 |
from prompting.utils.uids import get_random_uids
|
9 |
from prompting.protocol import PromptingSynapse, StreamPromptingSynapse
|
10 |
from prompting.dendrite import DendriteResponseEvent
|
11 |
-
from base import QueryValidatorParams,
|
12 |
from aiohttp.web_response import Response, StreamResponse
|
13 |
from deprecated import deprecated
|
14 |
|
15 |
-
class
|
16 |
def __init__(self):
|
17 |
self.validator = Validator()
|
18 |
|
|
|
8 |
from prompting.utils.uids import get_random_uids
|
9 |
from prompting.protocol import PromptingSynapse, StreamPromptingSynapse
|
10 |
from prompting.dendrite import DendriteResponseEvent
|
11 |
+
from base import QueryValidatorParams, ValidatorAPI
|
12 |
from aiohttp.web_response import Response, StreamResponse
|
13 |
from deprecated import deprecated
|
14 |
|
15 |
+
class S1ValidatorAPI(ValidatorAPI):
|
16 |
def __init__(self):
|
17 |
self.validator = Validator()
|
18 |
|