Spaces:
Sleeping
Sleeping
import asyncio | |
import utils | |
import bittensor as bt | |
from aiohttp import web | |
from validators import S1ValidatorAPI, QueryValidatorParams, ValidatorAPI | |
from middlewares import api_key_middleware, json_parsing_middleware | |
""" | |
# Test chat endpoint with curl | |
``` | |
//Local: | |
curl --no-buffer -X POST http://0.0.0.0:10000/chat/ -H "api_key: hey-michal" -d '{"k": 5, "timeout": 15, "roles": ["user"], "messages": ["on what exact date did the 21st century begin??"]}' | |
//Global: | |
curl --no-buffer -X POST http://129.146.127.82:10000/chat/ -H "api_key: hey-michal" -d '{"k": 5, "timeout": 15, "roles": ["user"], "messages": ["on what exact date did the 21st century begin??"]}' | |
curl --no-buffer -X POST http://129.146.127.82:10000/chat/ -H "api_key: hey-michal" -d '{"k": 5, "timeout": 15, "roles": ["user"], "messages": ["What is the meaning of life??"]}' | |
# echo stream test endpoint | |
//Local | |
curl --no-buffer -X POST http://0.0.0.0:10000/echo/ -H "api_key: hey-michal" -d '{"k": 3, "timeout": 0.2, "roles": ["user"], "messages": ["i need to tell you something important but first"]}' | |
//Global | |
curl --no-buffer -X POST http://129.146.127.82:10000/echo/ -H "api_key: hey-michal" -d '{"k": 3, "timeout": 0.2, "roles": ["user"], "messages": ["i need to tell you something important but first"]}' | |
``` | |
TROUBLESHOOT | |
check if port is open | |
``` | |
sudo ufw allow 10000/tcp | |
sudo ufw allow 10000/tcp | |
``` | |
--- | |
# Run Chattensor | |
## With vanilla python: | |
python server.py --neuron.model_id mock --wallet.name sn1 --wallet.hotkey v1 --netuid 1 --neuron.tasks math --neuron.task_p 1 --neuron.device cpu --subtensor.network local | |
## With PM2: | |
``` | |
EXPECTED_ACCESS_KEY="hey-michal" pm2 start app.py --interpreter python3 --name app -- --neuron.model_id mock --wallet.name sn1 --wallet.hotkey v1 --netuid 1 --neuron.tasks math --neuron.task_p 1 --neuron.device cpu | |
``` | |
basic testing | |
``` | |
EXPECTED_ACCESS_KEY="hey-michal" python app.py --neuron.model_id mock --wallet.name sn1 --wallet.hotkey v1 --netuid 1 --neuron.tasks math --neuron.task_p 1 --neuron.device cpu | |
``` | |
add --mock to test the echo stream | |
""" | |
async def chat(request: web.Request) -> web.StreamResponse: | |
""" | |
Chat endpoint for the validator. | |
""" | |
params = QueryValidatorParams.from_request(request) | |
# Access the validator from the application context | |
validator: ValidatorAPI = request.app["validator"] | |
response = await validator.query_validator(params) | |
return response | |
async def echo_stream(request: web.Request) -> web.StreamResponse: | |
return await utils.echo_stream(request) | |
class ValidatorApplication(web.Application): | |
def __init__(self, validator_instance=None, *args, **kwargs): | |
super().__init__(*args, **kwargs) | |
self["validator"] = ( | |
validator_instance if validator_instance else S1ValidatorAPI() | |
) | |
# Add middlewares to application | |
self.add_routes([web.post("/chat/", chat), web.post("/echo/", echo_stream)]) | |
self.setup_middlewares() | |
# TODO: Enable rewarding and other features | |
def setup_middlewares(self): | |
self.middlewares.append(json_parsing_middleware) | |
self.middlewares.append(api_key_middleware) | |
def main(run_aio_app=True, test=False) -> None: | |
loop = asyncio.get_event_loop() | |
port = 10000 | |
if run_aio_app: | |
# Instantiate the application with the actual validator | |
bt.logging.info("Starting validator application.") | |
validator_app = ValidatorApplication() | |
bt.logging.success(f"Validator app initialized successfully", validator_app) | |
try: | |
web.run_app(validator_app, port=port, loop=loop) | |
except KeyboardInterrupt: | |
print("Keyboard interrupt detected. Exiting validator.") | |
finally: | |
pass | |
if __name__ == "__main__": | |
main() | |