-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathlanggraph_editor.py
136 lines (102 loc) · 4.47 KB
/
langgraph_editor.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
# -*- coding: utf-8 -*-#
'''
LangGraph Editor
Copyright 2024 by Hu, Ying-Hao (hyinghao@hotmail.com)
All rights reserved.
'''
import json
import os
import sys
import tornado
import tornado.httpserver, tornado.ioloop, tornado.options, tornado.web, os.path, random, string
from tornado.options import define, options
from tornado.web import StaticFileHandler
class SaveWorkflowHandler(tornado.web.RequestHandler):
def set_default_headers(self):
self.set_header("Access-Control-Allow-Origin", "*")
self.set_header('Access-Control-Allow-Methods', 'POST, GET, PUT, DELETE, OPTIONS')
def options(self):
# no body
self.set_header("Access-Control-Allow-Headers","*")
self.set_status(204)
self.finish()
def post(self):
data = json.loads(self.get_argument("json"))
requiredFields = ["workflowName", "workflow"]
for requiredField in requiredFields:
if requiredField not in data:
self.set_status(400)
return self.finish(json.dumps({"error":"Missing data. Required JSON fields: %s" % ", ".join(requiredFields)}))
workflowName = data["workflowName"]
workflow = data["workflow"]
with open(os.path.join("/content", f"{workflowName}.json"), "w") as f:
f.write(json.dumps(workflow, indent=2, ensure_ascii=False))
self.write({"message":"ok"})
class LoadWorkflowHandler(tornado.web.RequestHandler):
def set_default_headers(self):
self.set_header("Access-Control-Allow-Origin", "*")
self.set_header('Access-Control-Allow-Methods', 'POST, GET, PUT, DELETE, OPTIONS')
def options(self):
# no body
self.set_header("Access-Control-Allow-Headers","*")
self.set_status(204)
self.finish()
def post(self):
data = json.loads(self.get_argument("json"))
print(data)
requiredFields = ["workflowName"]
for requiredField in requiredFields:
if requiredField not in data:
self.set_status(400)
return self.finish(json.dumps({"error":"Missing data. Required JSON fields: %s" % ", ".join(requiredFields)}))
workflowName = data["workflowName"]
with open(os.path.join("/content", f"{workflowName}.json"), "r") as f:
workflow = json.loads(f.read())
self.write({"message":"ok", "workflow": workflow})
class CodeHandler(tornado.web.RequestHandler):
def set_default_headers(self):
self.set_header("Access-Control-Allow-Origin", "*")
self.set_header('Access-Control-Allow-Methods', 'POST, GET, PUT, DELETE, OPTIONS')
def options(self):
# no body
self.set_header("Access-Control-Allow-Headers","*")
self.set_status(204)
self.finish()
def error_out(self, message):
self.set_status(400)
return self.finish(json.dumps({"error": message}))
def post(self):
data = json.loads(self.get_argument("json"))
requiredFields = ["code"]
for requiredField in requiredFields:
if requiredField not in data:
self.set_status(400)
return self.finish(json.dumps({"error":"Missing data. Required JSON fields: %s" % ", ".join(requiredFields)}))
print(data["code"])
with open("/content/output.py", "w") as f:
f.write(data["code"])
self.write({"message":"ok"})
class NoCacheStaticFileHandler(StaticFileHandler):
def set_extra_headers(self, path):
self.set_header('Cache-Control', 'no-store, no-cache, must-revalidate, max-age=0')
class Application(tornado.web.Application):
def __init__(self):
handlers = [
(r"^/api/saveCode", CodeHandler),
(r"^/api/saveWorkflow", SaveWorkflowHandler),
(r"^/api/loadWorkflow", LoadWorkflowHandler),
(r'/(favicon.ico)', tornado.web.StaticFileHandler, {"path": os.path.join(".", "static")}),
(r'^/static/(.*?)$',
NoCacheStaticFileHandler,
{"path":os.path.join(".", "static"), "default_filename":"index.html"}),
]
tornado.web.Application.__init__(self, handlers)
def main(argv):
portNum = 8082
define("port", default=portNum, help="run on the given port", type=int)
http_server = tornado.httpserver.HTTPServer(Application())
http_server.listen(portNum)
print("HTTP service is started on port %s" % str(portNum))
tornado.ioloop.IOLoop.instance().start()
if __name__ == "__main__":
main(sys.argv)