Update.
This commit is contained in:
		
							parent
							
								
									1bf43af796
								
							
						
					
					
						commit
						87c7375c53
					
				@ -1 +1,2 @@
 | 
				
			|||||||
aiohttp
 | 
					aiohttp
 | 
				
			||||||
 | 
					ollama
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										29
									
								
								server.py
									
									
									
									
									
								
							
							
						
						
									
										29
									
								
								server.py
									
									
									
									
									
								
							@ -38,6 +38,9 @@ class OllamaServer:
 | 
				
			|||||||
            elif msg.type == web.WSMsgType.ERROR:
 | 
					            elif msg.type == web.WSMsgType.ERROR:
 | 
				
			||||||
                break
 | 
					                break
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class NoServerFoundException(BaseException):
 | 
				
			||||||
 | 
					    pass 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class ServerManager:
 | 
					class ServerManager:
 | 
				
			||||||
    def __init__(self):
 | 
					    def __init__(self):
 | 
				
			||||||
        self.servers = []
 | 
					        self.servers = []
 | 
				
			||||||
@ -48,15 +51,34 @@ class ServerManager:
 | 
				
			|||||||
    def remove_server(self, server):
 | 
					    def remove_server(self, server):
 | 
				
			||||||
        self.servers.remove(server)
 | 
					        self.servers.remove(server)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def get_server_by_model_name(self, model_name):
 | 
				
			||||||
 | 
					        for server in self.servers:
 | 
				
			||||||
 | 
					            if model_name in server.model_names:
 | 
				
			||||||
 | 
					                return server
 | 
				
			||||||
 | 
					        return None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    async def forward_to_websocket(self, request_id, message, path):
 | 
					    async def forward_to_websocket(self, request_id, message, path):
 | 
				
			||||||
        try:
 | 
					        try:
 | 
				
			||||||
            server = self.servers.pop(0)
 | 
					            server = self.servers.pop(0)
 | 
				
			||||||
            self.servers.append(server)
 | 
					            self.servers.append(server)
 | 
				
			||||||
 | 
					            server = self.get_server_by_model_name(message['model'])
 | 
				
			||||||
 | 
					            if not server:
 | 
				
			||||||
 | 
					                raise NoServerFoundException
 | 
				
			||||||
            async for msg in server.forward_to_websocket(request_id, message, path):
 | 
					            async for msg in server.forward_to_websocket(request_id, message, path):
 | 
				
			||||||
                yield msg
 | 
					                yield msg
 | 
				
			||||||
        except:
 | 
					        except:
 | 
				
			||||||
            raise
 | 
					            raise
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def get_models(self):
 | 
				
			||||||
 | 
					        models = {}
 | 
				
			||||||
 | 
					        for server in self.servers:
 | 
				
			||||||
 | 
					            for model_name in server.model_names:
 | 
				
			||||||
 | 
					                if not model_name in models:
 | 
				
			||||||
 | 
					                    models[model_name] = 0
 | 
				
			||||||
 | 
					                models[model_name] += 1
 | 
				
			||||||
 | 
					        return models
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
server_manager = ServerManager()
 | 
					server_manager = ServerManager()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
async def websocket_handler(request):
 | 
					async def websocket_handler(request):
 | 
				
			||||||
@ -89,8 +111,11 @@ async def http_handler(request):
 | 
				
			|||||||
    resp = web.StreamResponse(headers={'Content-Type': 'application/x-ndjson', 'Transfer-Encoding': 'chunked'})
 | 
					    resp = web.StreamResponse(headers={'Content-Type': 'application/x-ndjson', 'Transfer-Encoding': 'chunked'})
 | 
				
			||||||
    await resp.prepare(request)
 | 
					    await resp.prepare(request)
 | 
				
			||||||
    import json
 | 
					    import json
 | 
				
			||||||
 | 
					    try:
 | 
				
			||||||
        async for result in server_manager.forward_to_websocket(request_id, data, path=request.path):
 | 
					        async for result in server_manager.forward_to_websocket(request_id, data, path=request.path):
 | 
				
			||||||
            await resp.write(json.dumps(result).encode() + b'\n')
 | 
					            await resp.write(json.dumps(result).encode() + b'\n')
 | 
				
			||||||
 | 
					    except NoServerFoundException:
 | 
				
			||||||
 | 
					        await resp.write(json.dumps(dict(error="No server with that model found.",available=server_manager.get_models())).encode() + b'\n')
 | 
				
			||||||
    await resp.write_eof()
 | 
					    await resp.write_eof()
 | 
				
			||||||
    return resp
 | 
					    return resp
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -100,11 +125,15 @@ async def index_handler(request):
 | 
				
			|||||||
    index_template = index_template.replace("#client.py", client_py)
 | 
					    index_template = index_template.replace("#client.py", client_py)
 | 
				
			||||||
    return web.Response(text=index_template, content_type="text/html")
 | 
					    return web.Response(text=index_template, content_type="text/html")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					async def models_handler(self):
 | 
				
			||||||
 | 
					    return web.json_response(server_manager.get_models())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
app = web.Application()
 | 
					app = web.Application()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
app.router.add_get("/", index_handler)
 | 
					app.router.add_get("/", index_handler)
 | 
				
			||||||
app.router.add_route('GET', '/publish', websocket_handler)
 | 
					app.router.add_route('GET', '/publish', websocket_handler)
 | 
				
			||||||
app.router.add_route('POST', '/api/chat', http_handler)
 | 
					app.router.add_route('POST', '/api/chat', http_handler)
 | 
				
			||||||
 | 
					app.router.add_route('GET', '/models', models_handler)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if __name__ == '__main__':
 | 
					if __name__ == '__main__':
 | 
				
			||||||
    web.run_app(app, port=1984)
 | 
					    web.run_app(app, port=1984)
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user