Files
letta-server/sandbox/node_server.py
Kian Jones b8e9a80d93 merge this (#4759)
* wait I forgot to comit locally

* cp the entire core directory and then rm the .git subdir
2025-09-17 15:47:40 -07:00

80 lines
2.6 KiB
Python

import modal
class NodeShimServer:
# This runs once startup
@modal.enter()
def start_server(self):
import subprocess
import time
server_root_dir = "/root/sandbox/resources/server"
# /app/server
# Comment this in to show the updated user-function.ts file
# subprocess.run(["sh", "-c", "cat /app/server/user-function.ts"], check=True)
subprocess.run(["sh", "-c", f"cd {server_root_dir} && npm run build"], check=True)
subprocess.Popen(
[
"sh",
"-c",
f"cd {server_root_dir} && npm run start",
],
)
time.sleep(1)
print("🔮 Node server started and listening on /tmp/my_unix_socket.sock")
@modal.method()
def remote_executor(self, json_args: str): # Dynamic TypeScript function execution
"""Execute a TypeScript function with JSON-encoded arguments.
Args:
json_args: JSON string containing the function arguments
Returns:
The result from the TypeScript function execution
"""
import http.client
import json
import socket
class UnixSocketHTTPConnection(http.client.HTTPConnection):
def __init__(self, path):
super().__init__("localhost")
self.unix_path = path
def connect(self):
self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
self.sock.connect(self.unix_path)
try:
# Connect to the Node.js server via Unix socket
conn = UnixSocketHTTPConnection("/tmp/my_unix_socket.sock")
# Send the JSON arguments directly to the server
# The server will parse them and call the TypeScript function
conn.request("POST", "/", body=json_args)
response = conn.getresponse()
output = response.read().decode()
# Parse the response from the server
try:
output_json = json.loads(output)
# Check if there was an error
if "error" in output_json:
return {"error": output_json["error"]}
# Return the successful result
return output_json.get("result")
except json.JSONDecodeError:
# If the response isn't valid JSON, it's likely an error message
return {"error": f"Invalid JSON response from TypeScript server: {output}"}
except Exception as e:
# Handle connection or other errors
return {"error": f"Error executing TypeScript function: {str(e)}"}