Skip to content

Commit 80df41c

Browse files
committed
add automatic server creation
1 parent c8ea572 commit 80df41c

File tree

4 files changed

+71
-28
lines changed

4 files changed

+71
-28
lines changed

lf_toolkit/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22

33
from .rpc import IPCServer
44
from .rpc import StdioServer
5+
from .rpc import create_server
56
from .rpc import run
7+
from .rpc import serve
68

79

810
__version__ = importlib_metadata.version("lf_toolkit")

lf_toolkit/rpc/__init__.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1-
from .base_server import run
21
from .ipc_server import IPCServer
2+
from .serve import create_server
3+
from .serve import run
4+
from .serve import serve
35
from .stdio_server import StdioServer

lf_toolkit/rpc/base_server.py

Lines changed: 0 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,8 @@
1-
import signal
2-
31
from abc import ABC
42
from abc import abstractmethod
53
from functools import wraps
64
from typing import Optional
75

8-
import anyio
9-
10-
from anyio.abc import CancelScope
11-
126
from .rpc_handler import HandlerFunction
137
from .rpc_handler import JsonRpcHandler
148
from .rpc_handler import RpcHandler
@@ -40,24 +34,3 @@ def decorator():
4034
return fn
4135

4236
return decorator()
43-
44-
45-
async def signal_handler(scope: CancelScope):
46-
with anyio.open_signal_receiver(signal.SIGINT, signal.SIGTERM) as signals:
47-
async for signum in signals:
48-
if signum == signal.SIGINT:
49-
print("Received SIGINT, exiting...")
50-
else:
51-
print("Received SIGTERM, exiting...")
52-
53-
scope.cancel()
54-
return
55-
56-
57-
def run(server: BaseServer):
58-
async def main():
59-
async with anyio.create_task_group() as tg:
60-
tg.start_soon(signal_handler, tg.cancel_scope)
61-
tg.start_soon(server.run)
62-
63-
anyio.run(main)

lf_toolkit/rpc/serve.py

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
import os
2+
import signal
3+
4+
import anyio
5+
6+
from anyio.abc import CancelScope
7+
8+
from .base_server import BaseServer
9+
10+
11+
async def signal_handler(scope: CancelScope):
12+
with anyio.open_signal_receiver(signal.SIGINT, signal.SIGTERM) as signals:
13+
async for signum in signals:
14+
if signum == signal.SIGINT:
15+
print("Received SIGINT, exiting...")
16+
else:
17+
print("Received SIGTERM, exiting...")
18+
19+
scope.cancel()
20+
return
21+
22+
23+
def run(server: BaseServer):
24+
async def main():
25+
async with anyio.create_task_group() as tg:
26+
tg.start_soon(signal_handler, tg.cancel_scope)
27+
tg.start_soon(server.run)
28+
29+
anyio.run(main)
30+
31+
32+
def serve():
33+
try:
34+
run(create_server())
35+
except Exception as e:
36+
print(f"Error: {e}")
37+
exit(1)
38+
39+
40+
def create_server():
41+
io = os.environ.get("EVAL_IO", "rpc")
42+
43+
if io != "rpc":
44+
# TODO: add support for file-based communication
45+
raise ValueError("EVAL_IO must be set to 'rpc'.")
46+
47+
# fallback to stdio if transport is not set
48+
transport = os.environ.get("EVAL_RPC_TRANSPORT", "stdio")
49+
50+
if transport == "stdio":
51+
return create_stdio_server()
52+
elif transport == "ipc":
53+
return create_ipc_server()
54+
55+
56+
def create_stdio_server():
57+
from .stdio_server import StdioServer
58+
59+
return StdioServer()
60+
61+
62+
def create_ipc_server():
63+
from .ipc_server import IPCServer
64+
65+
endpoint = os.environ.get("EVAL_RPC_IPC_ENDPOINT", None)
66+
return IPCServer(endpoint)

0 commit comments

Comments
 (0)