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 |  | 
