| | from fastapi import FastAPI, WebSocket, WebSocketDisconnect |
| | from fastapi.responses import HTMLResponse |
| | from transformers import AutoTokenizer, AutoModelForCausalLM, pipeline |
| |
|
| | |
| | model_name = "bigcode/starcoder2-7b" |
| | tokenizer = AutoTokenizer.from_pretrained(model_name) |
| | model = AutoModelForCausalLM.from_pretrained(model_name, device_map="auto") |
| | pipe = pipeline("text-generation", model=model, tokenizer=tokenizer, device_map="auto") |
| |
|
| | app = FastAPI() |
| |
|
| | |
| | html = """ |
| | <!DOCTYPE html> |
| | <html lang="en"> |
| | <head> |
| | <meta charset="UTF-8"> |
| | <title>StarCoder2 Docker Terminal</title> |
| | <style> |
| | body { background-color: #1e1e1e; color: #00ff99; font-family: monospace; margin: 0; height: 100vh; display:flex; justify-content:center; align-items:center; } |
| | #terminal { width: 80%; height: 90%; } |
| | </style> |
| | <script src="https://cdn.jsdelivr.net/npm/xterm@5.3.0/lib/xterm.js"></script> |
| | <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/xterm@5.3.0/css/xterm.css" /> |
| | </head> |
| | <body> |
| | <div id="terminal"></div> |
| | <script> |
| | const term = new Terminal(); |
| | term.open(document.getElementById('terminal')); |
| | term.write("🐳 StarCoder2 Terminal\\nroot@docker:~$ "); |
| | |
| | const ws = new WebSocket(`ws://${window.location.host}/ws`); |
| | |
| | term.onKey(e => { |
| | if (e.domEvent.key === "Enter") { |
| | const command = term.buffer.active.getLine(term.buffer.active.cursorY).translateToString().replace("root@docker:~$ ","").trim(); |
| | ws.send(command); |
| | term.write("\\r\\n"); |
| | } else { |
| | term.write(e.key); |
| | } |
| | }); |
| | |
| | ws.onmessage = (event) => { |
| | term.write(event.data + "\\r\\nroot@docker:~$ "); |
| | }; |
| | </script> |
| | </body> |
| | </html> |
| | """ |
| |
|
| | @app.get("/") |
| | async def get_root(): |
| | return HTMLResponse(html) |
| |
|
| | @app.websocket("/ws") |
| | async def websocket_endpoint(ws: WebSocket): |
| | await ws.accept() |
| | history = [] |
| | try: |
| | while True: |
| | user_input = await ws.receive_text() |
| | prompt = "".join([f"User: {h[0]}\\nAssistant: {h[1]}\\n" for h in history]) |
| | prompt += f"User: {user_input}\\nAssistant:" |
| |
|
| | output = pipe(prompt, max_new_tokens=256, temperature=0.7, pad_token_id=tokenizer.eos_token_id) |
| | reply = output[0]["generated_text"][len(prompt):].strip() |
| | history.append((user_input, reply)) |
| |
|
| | await ws.send_text(reply) |
| | except WebSocketDisconnect: |
| | print("Client disconnected") |
| |
|