From 3e885a4ef7a702318f19d82e8edf4cbd036b4aec Mon Sep 17 00:00:00 2001 From: Matthew Zhou Date: Wed, 2 Jul 2025 13:32:20 -0700 Subject: [PATCH] feat: Add generate schema endpoint (#3138) --- letta/server/rest_api/routers/v1/tools.py | 25 ++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/letta/server/rest_api/routers/v1/tools.py b/letta/server/rest_api/routers/v1/tools.py index 05f7f8b1..be423a52 100644 --- a/letta/server/rest_api/routers/v1/tools.py +++ b/letta/server/rest_api/routers/v1/tools.py @@ -1,4 +1,4 @@ -from typing import List, Optional, Union +from typing import Any, Dict, List, Optional, Union from composio.client import ComposioClientError, HTTPError, NoItemsFound from composio.client.collections import ActionModel, AppModel @@ -10,8 +10,10 @@ from composio.exceptions import ( EnumStringNotFound, ) from fastapi import APIRouter, Body, Depends, Header, HTTPException, Query +from pydantic import BaseModel, Field from letta.errors import LettaToolCreateError +from letta.functions.functions import derive_openai_json_schema from letta.functions.mcp_client.exceptions import MCPTimeoutError from letta.functions.mcp_client.types import MCPServerType, MCPTool, SSEServerConfig, StdioServerConfig, StreamableHTTPServerConfig from letta.helpers.composio_helpers import get_composio_api_key @@ -656,3 +658,24 @@ async def test_mcp_server( "server_name": request.server_name, }, ) + + +class CodeInput(BaseModel): + code: str = Field(..., description="Python source code to parse for JSON schema") + + +@router.post("/generate-schema", response_model=Dict[str, Any], operation_id="generate_json_schema") +async def generate_json_schema( + request: CodeInput = Body(...), + server: SyncServer = Depends(get_letta_server), + actor_id: Optional[str] = Header(None, alias="user_id"), +): + """ + Generate a JSON schema from the given Python source code defining a function or class. + """ + try: + schema = derive_openai_json_schema(source_code=request.code) + return schema + + except Exception as e: + raise HTTPException(status_code=400, detail=f"Failed to generate schema: {str(e)}")