llama-deploy-appserver 0.3.0a21__tar.gz → 0.3.0a22__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (21) hide show
  1. {llama_deploy_appserver-0.3.0a21 → llama_deploy_appserver-0.3.0a22}/PKG-INFO +4 -3
  2. {llama_deploy_appserver-0.3.0a21 → llama_deploy_appserver-0.3.0a22}/pyproject.toml +4 -3
  3. {llama_deploy_appserver-0.3.0a21 → llama_deploy_appserver-0.3.0a22}/src/llama_deploy/appserver/app.py +19 -38
  4. {llama_deploy_appserver-0.3.0a21 → llama_deploy_appserver-0.3.0a22}/src/llama_deploy/appserver/routers/deployments.py +17 -11
  5. {llama_deploy_appserver-0.3.0a21 → llama_deploy_appserver-0.3.0a22}/src/llama_deploy/appserver/routers/status.py +1 -1
  6. {llama_deploy_appserver-0.3.0a21 → llama_deploy_appserver-0.3.0a22}/README.md +0 -0
  7. {llama_deploy_appserver-0.3.0a21 → llama_deploy_appserver-0.3.0a22}/src/llama_deploy/appserver/__init__.py +0 -0
  8. {llama_deploy_appserver-0.3.0a21 → llama_deploy_appserver-0.3.0a22}/src/llama_deploy/appserver/bootstrap.py +0 -0
  9. {llama_deploy_appserver-0.3.0a21 → llama_deploy_appserver-0.3.0a22}/src/llama_deploy/appserver/configure_logging.py +0 -0
  10. {llama_deploy_appserver-0.3.0a21 → llama_deploy_appserver-0.3.0a22}/src/llama_deploy/appserver/correlation_id.py +0 -0
  11. {llama_deploy_appserver-0.3.0a21 → llama_deploy_appserver-0.3.0a22}/src/llama_deploy/appserver/deployment.py +0 -0
  12. {llama_deploy_appserver-0.3.0a21 → llama_deploy_appserver-0.3.0a22}/src/llama_deploy/appserver/deployment_config_parser.py +0 -0
  13. {llama_deploy_appserver-0.3.0a21 → llama_deploy_appserver-0.3.0a22}/src/llama_deploy/appserver/interrupts.py +0 -0
  14. {llama_deploy_appserver-0.3.0a21 → llama_deploy_appserver-0.3.0a22}/src/llama_deploy/appserver/process_utils.py +0 -0
  15. {llama_deploy_appserver-0.3.0a21 → llama_deploy_appserver-0.3.0a22}/src/llama_deploy/appserver/py.typed +0 -0
  16. {llama_deploy_appserver-0.3.0a21 → llama_deploy_appserver-0.3.0a22}/src/llama_deploy/appserver/routers/__init__.py +0 -0
  17. {llama_deploy_appserver-0.3.0a21 → llama_deploy_appserver-0.3.0a22}/src/llama_deploy/appserver/routers/ui_proxy.py +0 -0
  18. {llama_deploy_appserver-0.3.0a21 → llama_deploy_appserver-0.3.0a22}/src/llama_deploy/appserver/settings.py +0 -0
  19. {llama_deploy_appserver-0.3.0a21 → llama_deploy_appserver-0.3.0a22}/src/llama_deploy/appserver/stats.py +0 -0
  20. {llama_deploy_appserver-0.3.0a21 → llama_deploy_appserver-0.3.0a22}/src/llama_deploy/appserver/types.py +0 -0
  21. {llama_deploy_appserver-0.3.0a21 → llama_deploy_appserver-0.3.0a22}/src/llama_deploy/appserver/workflow_loader.py +0 -0
@@ -1,21 +1,22 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: llama-deploy-appserver
3
- Version: 0.3.0a21
3
+ Version: 0.3.0a22
4
4
  Summary: Application server components for LlamaDeploy
5
5
  Author: Massimiliano Pippi
6
6
  Author-email: Massimiliano Pippi <mpippi@gmail.com>
7
7
  License: MIT
8
- Requires-Dist: llama-index-workflows[server]>=1.3.0
8
+ Requires-Dist: llama-index-workflows[server]>=2.0.1
9
9
  Requires-Dist: pydantic-settings>=2.10.1
10
10
  Requires-Dist: uvicorn>=0.24.0
11
11
  Requires-Dist: fastapi>=0.100.0
12
12
  Requires-Dist: websockets>=12.0
13
- Requires-Dist: llama-deploy-core>=0.3.0a21,<0.4.0
13
+ Requires-Dist: llama-deploy-core>=0.3.0a22,<0.4.0
14
14
  Requires-Dist: httpx>=0.24.0,<1.0.0
15
15
  Requires-Dist: prometheus-fastapi-instrumentator>=7.1.0
16
16
  Requires-Dist: packaging>=25.0
17
17
  Requires-Dist: structlog>=25.4.0
18
18
  Requires-Dist: rich>=14.1.0
19
+ Requires-Dist: pyyaml>=6.0.2
19
20
  Requires-Python: >=3.11, <4
20
21
  Description-Content-Type: text/markdown
21
22
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "llama-deploy-appserver"
3
- version = "0.3.0a21"
3
+ version = "0.3.0a22"
4
4
  description = "Application server components for LlamaDeploy"
5
5
  readme = "README.md"
6
6
  license = { text = "MIT" }
@@ -9,17 +9,18 @@ authors = [
9
9
  ]
10
10
  requires-python = ">=3.11, <4"
11
11
  dependencies = [
12
- "llama-index-workflows[server]>=1.3.0",
12
+ "llama-index-workflows[server]>=2.0.1",
13
13
  "pydantic-settings>=2.10.1",
14
14
  "uvicorn>=0.24.0",
15
15
  "fastapi>=0.100.0",
16
16
  "websockets>=12.0",
17
- "llama-deploy-core>=0.3.0a21,<0.4.0",
17
+ "llama-deploy-core>=0.3.0a22,<0.4.0",
18
18
  "httpx>=0.24.0,<1.0.0",
19
19
  "prometheus-fastapi-instrumentator>=7.1.0",
20
20
  "packaging>=25.0",
21
21
  "structlog>=25.4.0",
22
22
  "rich>=14.1.0",
23
+ "pyyaml>=6.0.2",
23
24
  ]
24
25
 
25
26
  [build-system]
@@ -7,12 +7,11 @@ import webbrowser
7
7
  from contextlib import asynccontextmanager
8
8
  from importlib.metadata import version
9
9
  from pathlib import Path
10
- from typing import Any, AsyncGenerator
10
+ from typing import Any, AsyncGenerator, cast
11
11
 
12
12
  import uvicorn
13
13
  from fastapi import FastAPI
14
14
  from fastapi.middleware.cors import CORSMiddleware
15
- from fastapi.openapi.utils import get_openapi
16
15
  from fastapi.responses import RedirectResponse
17
16
  from llama_deploy.appserver.configure_logging import (
18
17
  add_log_middleware,
@@ -42,7 +41,6 @@ from llama_deploy.appserver.workflow_loader import (
42
41
  from llama_deploy.core.config import DEFAULT_DEPLOYMENT_FILE_PATH
43
42
  from prometheus_fastapi_instrumentator import Instrumentator
44
43
  from starlette.routing import Route
45
- from starlette.schemas import SchemaGenerator
46
44
  from workflows.server import WorkflowServer
47
45
 
48
46
  from .deployment import Deployment
@@ -95,15 +93,15 @@ async def lifespan(app: FastAPI) -> AsyncGenerator[None, Any]:
95
93
  # otherwise serve the pre-built if available
96
94
  mount_static_files(app, config, settings)
97
95
 
98
- @app.get(f"/deployments/{config.name}")
99
- @app.get(f"/deployments/{config.name}/")
100
- @app.get(f"/deployments/{config.name}/ui")
96
+ @app.get(f"/deployments/{config.name}", include_in_schema=False)
97
+ @app.get(f"/deployments/{config.name}/", include_in_schema=False)
98
+ @app.get(f"/deployments/{config.name}/ui", include_in_schema=False)
101
99
  def redirect_to_ui() -> RedirectResponse:
102
100
  return RedirectResponse(f"/deployments/{config.name}/ui/")
103
101
  else:
104
102
 
105
- @app.get(f"/deployments/{config.name}")
106
- @app.get(f"/deployments/{config.name}/")
103
+ @app.get(f"/deployments/{config.name}", include_in_schema=False)
104
+ @app.get(f"/deployments/{config.name}/", include_in_schema=False)
107
105
  def redirect_to_docs() -> RedirectResponse:
108
106
  return RedirectResponse(f"/deployments/{config.name}/docs")
109
107
 
@@ -121,38 +119,21 @@ def _setup_openapi(name: str, app: FastAPI, server: WorkflowServer) -> None:
121
119
  app_version = version("llama-deploy-appserver")
122
120
 
123
121
  prefix = f"/deployments/{name}"
124
- workflow_routes = [x for x in server.app.routes if isinstance(x, Route)]
125
- server_app_routes = []
126
- for route in workflow_routes:
127
- server_app_routes.append(
128
- Route(
129
- path=prefix + route.path,
130
- endpoint=route.endpoint,
131
- methods=route.methods,
132
- name=route.name,
133
- include_in_schema=route.include_in_schema,
134
- )
135
- )
136
122
 
137
- schemas = SchemaGenerator(
138
- {"openapi": "3.0.0", "info": {"title": schema_title, "version": app_version}}
139
- )
140
- starlette_schema = schemas.get_schema(server_app_routes)
123
+ schema = server.openapi_schema()
124
+ schema["info"]["title"] = schema_title
125
+ schema["info"]["version"] = app_version
126
+ paths = cast(dict, schema["paths"])
127
+ new_paths = {}
128
+ for path, methods in list(paths.items()):
129
+ if "head" in methods:
130
+ methods.pop("head")
131
+ new_paths[prefix + path] = methods
132
+
133
+ schema["paths"] = new_paths
141
134
 
142
135
  def custom_openapi():
143
- if app.openapi_schema:
144
- return app.openapi_schema
145
- openapi_schema = get_openapi(
146
- title=schema_title,
147
- version=app_version,
148
- routes=app.routes + server_app_routes,
149
- )
150
- openapi_schema["paths"] = {
151
- **openapi_schema["paths"],
152
- **starlette_schema["paths"],
153
- }
154
- app.openapi_schema = openapi_schema
155
- return app.openapi_schema
136
+ return schema
156
137
 
157
138
  app.openapi = custom_openapi # ty: ignore[invalid-assignment] - doesn't like us overwriting the method
158
139
 
@@ -165,7 +146,7 @@ app = FastAPI(
165
146
  redoc_url=_prefix + "/redoc",
166
147
  openapi_url=_prefix + "/openapi.json",
167
148
  )
168
- Instrumentator().instrument(app).expose(app)
149
+ Instrumentator().instrument(app).expose(app, include_in_schema=False)
169
150
 
170
151
 
171
152
  # Configure CORS middleware if the environment variable is set
@@ -26,7 +26,7 @@ def create_base_router(name: str) -> APIRouter:
26
26
  prefix="",
27
27
  )
28
28
 
29
- @base_router.get("/", response_model=None)
29
+ @base_router.get("/", response_model=None, include_in_schema=False)
30
30
  async def root() -> RedirectResponse:
31
31
  return RedirectResponse(f"/deployments/{name}/")
32
32
 
@@ -38,7 +38,7 @@ def create_deployments_router(name: str, deployment: Deployment) -> APIRouter:
38
38
  prefix="/deployments",
39
39
  )
40
40
 
41
- @deployments_router.post(f"/{name}/tasks/run")
41
+ @deployments_router.post(f"/{name}/tasks/run", include_in_schema=False)
42
42
  async def create_deployment_task(
43
43
  task_definition: TaskDefinition,
44
44
  session_id: str | None = None,
@@ -63,7 +63,7 @@ def create_deployments_router(name: str, deployment: Deployment) -> APIRouter:
63
63
  )
64
64
  return JSONResponse(result)
65
65
 
66
- @deployments_router.post(f"/{name}/tasks/create")
66
+ @deployments_router.post(f"/{name}/tasks/create", include_in_schema=False)
67
67
  async def create_deployment_task_nowait(
68
68
  task_definition: TaskDefinition,
69
69
  session_id: str | None = None,
@@ -90,7 +90,9 @@ def create_deployments_router(name: str, deployment: Deployment) -> APIRouter:
90
90
 
91
91
  return task_definition
92
92
 
93
- @deployments_router.post(f"/{name}/tasks/{{task_id}}/events")
93
+ @deployments_router.post(
94
+ f"/{name}/tasks/{{task_id}}/events", include_in_schema=False
95
+ )
94
96
  async def send_event(
95
97
  task_id: str,
96
98
  session_id: str,
@@ -104,7 +106,9 @@ def create_deployments_router(name: str, deployment: Deployment) -> APIRouter:
104
106
 
105
107
  return event_def
106
108
 
107
- @deployments_router.get(f"/{name}/tasks/{{task_id}}/events")
109
+ @deployments_router.get(
110
+ f"/{name}/tasks/{{task_id}}/events", include_in_schema=False
111
+ )
108
112
  async def get_events(
109
113
  session_id: str,
110
114
  task_id: str,
@@ -141,7 +145,9 @@ def create_deployments_router(name: str, deployment: Deployment) -> APIRouter:
141
145
  media_type="application/x-ndjson",
142
146
  )
143
147
 
144
- @deployments_router.get(f"/{name}/tasks/{{task_id}}/results")
148
+ @deployments_router.get(
149
+ f"/{name}/tasks/{{task_id}}/results", include_in_schema=False
150
+ )
145
151
  async def get_task_result(
146
152
  session_id: str,
147
153
  task_id: str,
@@ -151,7 +157,7 @@ def create_deployments_router(name: str, deployment: Deployment) -> APIRouter:
151
157
  handler = deployment._handlers[task_id]
152
158
  return TaskResult(task_id=task_id, history=[], result=await handler)
153
159
 
154
- @deployments_router.get(f"/{name}/tasks")
160
+ @deployments_router.get(f"/{name}/tasks", include_in_schema=False)
155
161
  async def get_tasks() -> list[TaskDefinition]:
156
162
  """Get all the tasks from all the sessions in a given deployment."""
157
163
 
@@ -168,13 +174,13 @@ def create_deployments_router(name: str, deployment: Deployment) -> APIRouter:
168
174
 
169
175
  return tasks
170
176
 
171
- @deployments_router.get(f"/{name}/sessions")
177
+ @deployments_router.get(f"/{name}/sessions", include_in_schema=False)
172
178
  async def get_sessions() -> list[SessionDefinition]:
173
179
  """Get the active sessions in a deployment and service."""
174
180
 
175
181
  return [SessionDefinition(session_id=k) for k in deployment._contexts.keys()]
176
182
 
177
- @deployments_router.get(f"/{name}/sessions/{{session_id}}")
183
+ @deployments_router.get(f"/{name}/sessions/{{session_id}}", include_in_schema=False)
178
184
  async def get_session(
179
185
  session_id: str,
180
186
  ) -> SessionDefinition:
@@ -182,7 +188,7 @@ def create_deployments_router(name: str, deployment: Deployment) -> APIRouter:
182
188
 
183
189
  return SessionDefinition(session_id=session_id)
184
190
 
185
- @deployments_router.post(f"/{name}/sessions/create")
191
+ @deployments_router.post(f"/{name}/sessions/create", include_in_schema=False)
186
192
  async def create_session() -> SessionDefinition:
187
193
  """Create a new session for a deployment."""
188
194
 
@@ -197,7 +203,7 @@ def create_deployments_router(name: str, deployment: Deployment) -> APIRouter:
197
203
 
198
204
  return SessionDefinition(session_id=session_id)
199
205
 
200
- @deployments_router.post(f"/{name}/sessions/delete")
206
+ @deployments_router.post(f"/{name}/sessions/delete", include_in_schema=False)
201
207
  async def delete_session(
202
208
  session_id: str,
203
209
  ) -> None:
@@ -6,7 +6,7 @@ health_router = APIRouter(
6
6
  )
7
7
 
8
8
 
9
- @health_router.get("")
9
+ @health_router.get("", include_in_schema=False)
10
10
  async def health() -> Status:
11
11
  return Status(
12
12
  status=StatusEnum.HEALTHY,