Skip to content

Commit 0120f22

Browse files
committed
Added server test
1 parent 2831f43 commit 0120f22

File tree

1 file changed

+123
-1
lines changed

1 file changed

+123
-1
lines changed

interpreter/core/async_core.py

Lines changed: 123 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import janus
1515
import uvicorn
1616
from fastapi import APIRouter, FastAPI, WebSocket
17+
from fastapi.responses import PlainTextResponse
1718
except:
1819
# Server dependencies are not required by the main package.
1920
pass
@@ -27,7 +28,7 @@ def __init__(self, *args, **kwargs):
2728
self.stop_event = threading.Event()
2829
self.output_queue = None
2930
self.id = os.getenv("INTERPRETER_ID", datetime.now().timestamp())
30-
self.print = True # Will print output
31+
self.print = False # Will print output
3132

3233
self.server = Server(self)
3334

@@ -129,6 +130,9 @@ def accumulate(self, chunk):
129130
"""
130131
Accumulates LMC chunks onto interpreter.messages.
131132
"""
133+
if type(chunk) == str:
134+
chunk = json.loads(chunk)
135+
132136
if type(chunk) == dict:
133137
if chunk.get("format") == "active_line":
134138
# We don't do anything with these.
@@ -158,6 +162,121 @@ def create_router(async_interpreter):
158162
async def heartbeat():
159163
return {"status": "alive"}
160164

165+
@router.get("/")
166+
async def home():
167+
return PlainTextResponse(
168+
"""
169+
<!DOCTYPE html>
170+
<html>
171+
<head>
172+
<title>Chat</title>
173+
</head>
174+
<body>
175+
<form action="" onsubmit="sendMessage(event)">
176+
<textarea id="messageInput" rows="10" cols="50" autocomplete="off"></textarea>
177+
<button>Send</button>
178+
</form>
179+
<div id="messages"></div>
180+
<script>
181+
var ws = new WebSocket("ws://"""
182+
+ async_interpreter.server.host
183+
+ ":"
184+
+ str(async_interpreter.server.port)
185+
+ """/");
186+
var lastMessageElement = null;
187+
ws.onmessage = function(event) {
188+
if (lastMessageElement == null) {
189+
lastMessageElement = document.createElement('p');
190+
document.getElementById('messages').appendChild(lastMessageElement);
191+
lastMessageElement.innerHTML = "<br>"
192+
}
193+
var eventData = JSON.parse(event.data);
194+
if (eventData.role == "assistant") {
195+
if (eventData.type == "message") {
196+
if (eventData.start) {
197+
lastMessageElement = document.createElement('p');
198+
document.getElementById('messages').appendChild(lastMessageElement);
199+
lastMessageElement.innerHTML = "<br>";
200+
}
201+
if (eventData.content) {
202+
lastMessageElement.innerHTML += eventData.content;
203+
}
204+
if (eventData.end) {
205+
lastMessageElement.innerHTML += "<br>";
206+
}
207+
} else if (eventData.type == "code") {
208+
if (eventData.start) {
209+
lastMessageElement = document.createElement('p');
210+
document.getElementById('messages').appendChild(lastMessageElement);
211+
lastMessageElement.innerHTML = "<br><br>```" + eventData.format + "<br>";
212+
}
213+
if (eventData.content) {
214+
lastMessageElement.innerHTML += eventData.content;
215+
}
216+
if (eventData.end) {
217+
lastMessageElement.innerHTML += "<br>```<br><br>";
218+
}
219+
}
220+
else if (eventData.role == "computer" && eventData.type == "console") {
221+
if (eventData.start) {
222+
lastMessageElement = document.createElement('p');
223+
document.getElementById('messages').appendChild(lastMessageElement);
224+
lastMessageElement.innerHTML = "<br><br>------<br><br>";
225+
}
226+
if (eventData.content && eventData.format == "output") {
227+
lastMessageElement.innerHTML += eventData.content;
228+
}
229+
if (eventData.end) {
230+
lastMessageElement.innerHTML += "<br><br>------<br><br>";
231+
}
232+
}
233+
} else {
234+
lastMessageElement.innerHTML += "<br>" + JSON.stringify(eventData) + "<br>";
235+
}
236+
};
237+
function sendMessage(event) {
238+
event.preventDefault();
239+
var input = document.getElementById("messageInput");
240+
var message = input.value;
241+
if (message.startsWith('{') && message.endsWith('}')) {
242+
message = JSON.stringify(JSON.parse(message));
243+
ws.send(message);
244+
} else {
245+
var startMessageBlock = {
246+
"role": "user",
247+
"type": "message",
248+
"start": true
249+
};
250+
ws.send(JSON.stringify(startMessageBlock));
251+
252+
var messageBlock = {
253+
"role": "user",
254+
"type": "message",
255+
"content": message
256+
};
257+
ws.send(JSON.stringify(messageBlock));
258+
259+
var endMessageBlock = {
260+
"role": "user",
261+
"type": "message",
262+
"end": true
263+
};
264+
ws.send(JSON.stringify(endMessageBlock));
265+
}
266+
var userMessageElement = document.createElement('p');
267+
userMessageElement.innerHTML = '<b>' + input.value + '</b><br>';
268+
document.getElementById('messages').appendChild(userMessageElement);
269+
lastMessageElement = document.createElement('p');
270+
document.getElementById('messages').appendChild(lastMessageElement);
271+
input.value = '';
272+
}
273+
</script>
274+
</body>
275+
</html>
276+
""",
277+
media_type="text/html",
278+
)
279+
161280
@router.websocket("/")
162281
async def websocket_endpoint(websocket: WebSocket):
163282
await websocket.accept()
@@ -168,6 +287,8 @@ async def receive_input():
168287
try:
169288
data = await websocket.receive()
170289

290+
print("RECIEVED:", data)
291+
171292
if data.get("type") == "websocket.receive" and "text" in data:
172293
data = json.loads(data["text"])
173294
await async_interpreter.input(data)
@@ -200,6 +321,7 @@ async def send_output():
200321
if isinstance(output, bytes):
201322
await websocket.send_bytes(output)
202323
else:
324+
# output["time"] = time.time()
203325
await websocket.send_text(json.dumps(output))
204326
except Exception as e:
205327
error = traceback.format_exc() + "\n" + str(e)

0 commit comments

Comments
 (0)