11import json
22import time
3- from faker import Faker
4- from flask import Flask , request , Response
53
4+ from faker import Faker
5+ from rolo import Request , Response , route
66
77faker = Faker ()
8- app = Flask (__name__ )
98
109res_len = 20
1110
11+
1212class ChunkReader :
1313 def __init__ (self , chunks , delay ):
1414 self .ID = ""
@@ -18,12 +18,15 @@ def __init__(self, chunks, delay):
1818 self .SentDone = False
1919 self .Delay = delay
2020
21+
2122def new_chunk_reader (cs , d ):
2223 return ChunkReader (cs , d )
2324
25+
2426def done (r ):
2527 return r .SentFinished and r .SentDone
2628
29+
2730def next_chunk (r ):
2831 if r .SentDone :
2932 return None , None
@@ -74,6 +77,7 @@ def next_chunk(r):
7477 b = b"data: " + b + b"\n \n "
7578 return b , None
7679
80+
7781def read (r , p ):
7882 if done (r ):
7983 return 0 , None
@@ -130,106 +134,106 @@ def read(r, p):
130134 time .sleep (r .Delay )
131135 return n , None
132136
133- @app .route ('/v1/chat/completions' , methods = ['POST' ])
134- def chat_completions ():
135- data = request .get_data ()
136- req = json .loads (data )
137137
138- ws = [faker .word () for _ in range (res_len )]
139- ws = [" " + w if i > 0 else w for i , w in enumerate (ws )]
138+ class Api :
139+
140+ @route ("/v1/chat/completions" , methods = ["POST" ])
141+ def chat_completions (self , request : Request ):
142+ data = request .get_data ()
143+ req = json .loads (data )
144+
145+ ws = [faker .word () for _ in range (res_len )]
146+ ws = [" " + w if i > 0 else w for i , w in enumerate (ws )]
147+
148+ if not req .get ("stream" ):
149+ m = "" .join (ws )
150+ return {
151+ "choices" : [
152+ {
153+ "index" : 0 ,
154+ "message" : {
155+ "role" : "assistant" ,
156+ "content" : m ,
157+ },
158+ }
159+ ]
160+ }
140161
141- if not req .get ("stream" ):
142- m = "" .join (ws )
143- return {
144- "choices" : [
145- {
146- "index" : 0 ,
147- "message" : {
148- "role" : "assistant" ,
149- "content" : m ,
150- },
151- }
152- ]
153- }
162+ id = faker .uuid4 ()
163+ ct = int (time .time ())
164+ sd = 0.5
154165
155- id = faker .uuid4 ()
156- ct = int (time .time ())
157- sd = 0.5
166+ def generate ():
167+ for w in ws :
168+ b , _ = next_chunk (chunk_reader )
169+ if b is not None :
170+ yield b
171+ time .sleep (sd )
158172
159- def generate ():
160- for w in ws :
161173 b , _ = next_chunk (chunk_reader )
162174 if b is not None :
163175 yield b
164- time .sleep (sd )
165-
166- b , _ = next_chunk (chunk_reader )
167- if b is not None :
168- yield b
169176
170- yield b"[done]\n "
177+ yield b"[done]\n "
171178
172- chunk_reader = new_chunk_reader (ws , sd )
173- return Response (generate (), content_type = ' text/event-stream' )
179+ chunk_reader = new_chunk_reader (ws , sd )
180+ return Response (generate (), content_type = " text/event-stream" )
174181
182+ @route ("/v1/audio/transcriptions" , methods = ["POST" ])
183+ def transcribe (self , request : Request ):
184+ return {
185+ "text" : faker .sentence (),
186+ }
175187
176- @app .route ('/v1/audio/transcriptions' , methods = ['POST' ])
177- def transcribe ():
178- return {
179- "text" : faker .sentence (),
180- }
181-
182-
183- @app .route ('/v1/audio/translations' , methods = ['POST' ])
184- def translate ():
185- return {
186- "text" : faker .sentence (),
187- }
188-
188+ @route ("/v1/audio/translations" , methods = ["POST" ])
189+ def translate (self , request : Request ):
190+ return {
191+ "text" : faker .sentence (),
192+ }
189193
190- @app .route ('/v1/images/generations' , methods = ['POST' ])
191- def generate_image ():
192- return {
193- "created" : int (time .time ()),
194- "data" : [
195- {"url" : faker .image_url ()}
196- ]
197- }
194+ @route ("/v1/images/generations" , methods = ["POST" ])
195+ def generate_image (self , request : Request ):
196+ return {"created" : int (time .time ()), "data" : [{"url" : faker .image_url ()}]}
198197
199- @ app . route (' /v1/engines' , methods = [' GET' ])
200- def list_engines ():
201- return {
202- "object" : "list" ,
203- "data" : [
204- {
205- "id" : "model-id-0" ,
206- "object" : "model" ,
207- "created" : 1686935002 ,
208- "owned_by" : "organization-owner"
209- },
210- {
211- "id" : "model-id-1" ,
212- "object" : "model" ,
213- "created" : 1686935002 ,
214- "owned_by" : "organization-owner" ,
215- },
216- {
217- "id" : "model-id-2" ,
218- "object" : "model" ,
219- "created" : 1686935002 ,
220- "owned_by" : "openai"
221- },
222- ],
223- "object" : "list"
224- }
198+ @ route (" /v1/engines" , methods = [" GET" ])
199+ def list_engines (self , request : Request ):
200+ return {
201+ "object" : "list" ,
202+ "data" : [
203+ {
204+ "id" : "model-id-0" ,
205+ "object" : "model" ,
206+ "created" : 1686935002 ,
207+ "owned_by" : "organization-owner" ,
208+ },
209+ {
210+ "id" : "model-id-1" ,
211+ "object" : "model" ,
212+ "created" : 1686935002 ,
213+ "owned_by" : "organization-owner" ,
214+ },
215+ {
216+ "id" : "model-id-2" ,
217+ "object" : "model" ,
218+ "created" : 1686935002 ,
219+ "owned_by" : "openai" ,
220+ },
221+ ],
222+ "object" : "list" ,
223+ }
225224
226225
227226def run (port = 1323 ):
228- app .run (host = "0.0.0.0" ,port = port , debug = True )
227+ from rolo import Router
228+ from rolo .dispatcher import handler_dispatcher
229+ from werkzeug import Request , run_simple
230+
231+ r = Router (dispatcher = handler_dispatcher ())
232+ r .add (Api ())
229233
234+ app = Request .application (r .dispatch )
230235
231- def stop ():
232- app .stop ()
236+ run_simple ("0.0.0.0" , port , app )
233237
234238
235239if __name__ == "__main__" :
0 commit comments