Mike0021's picture
Deploy browser Pi agent with MiniCPM5 WebGPU and just-bash workspace
8dd0d51 verified
Raw History Blame Contribute Delete
1.95 kB
"""Serve the demo locally, supporting byte ranges used by model metadata probes."""
from http.server import SimpleHTTPRequestHandler, ThreadingHTTPServer
from pathlib import Path
import os
import re
os.chdir(Path(__file__).resolve().parent.parent)
class Handler(SimpleHTTPRequestHandler):
def send_head(self):
self.byte_range=None
path=Path(self.translate_path(self.path))
match=re.fullmatch(r'bytes=(\d+)-(\d*)',self.headers.get('Range',''))
if match and path.is_file():
size=path.stat().st_size
start=int(match[1]);end=min(int(match[2]) if match[2] else size-1,size-1)
if start>=size or end<start:
self.send_response(416);self.send_header('Content-Range',f'bytes */{size}');self.end_headers();return None
f=path.open('rb');f.seek(start);self.byte_range=end-start+1
self.send_response(206)
self.send_header('Content-Type',self.guess_type(str(path)))
self.send_header('Content-Range',f'bytes {start}-{end}/{size}')
self.send_header('Content-Length',str(end-start+1));self.end_headers();return f
return super().send_head()
def end_headers(self):
self.send_header('Accept-Ranges','bytes')
super().end_headers()
def copyfile(self,source,outputfile):
try:
remaining=self.byte_range
if remaining is None:return super().copyfile(source,outputfile)
while remaining:
data=source.read(min(1024*1024,remaining))
if not data:break
outputfile.write(data);remaining-=len(data)
except (BrokenPipeError,ConnectionResetError):pass
def log_message(self,format,*args):
if args and str(args[1]) not in ('200','206'):super().log_message(format,*args)
print('Open http://127.0.0.1:8765/web/',flush=True)
ThreadingHTTPServer(('127.0.0.1',8765),Handler).serve_forever()