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.
- {llama_deploy_appserver-0.3.0a21 → llama_deploy_appserver-0.3.0a22}/PKG-INFO +4 -3
- {llama_deploy_appserver-0.3.0a21 → llama_deploy_appserver-0.3.0a22}/pyproject.toml +4 -3
- {llama_deploy_appserver-0.3.0a21 → llama_deploy_appserver-0.3.0a22}/src/llama_deploy/appserver/app.py +19 -38
- {llama_deploy_appserver-0.3.0a21 → llama_deploy_appserver-0.3.0a22}/src/llama_deploy/appserver/routers/deployments.py +17 -11
- {llama_deploy_appserver-0.3.0a21 → llama_deploy_appserver-0.3.0a22}/src/llama_deploy/appserver/routers/status.py +1 -1
- {llama_deploy_appserver-0.3.0a21 → llama_deploy_appserver-0.3.0a22}/README.md +0 -0
- {llama_deploy_appserver-0.3.0a21 → llama_deploy_appserver-0.3.0a22}/src/llama_deploy/appserver/__init__.py +0 -0
- {llama_deploy_appserver-0.3.0a21 → llama_deploy_appserver-0.3.0a22}/src/llama_deploy/appserver/bootstrap.py +0 -0
- {llama_deploy_appserver-0.3.0a21 → llama_deploy_appserver-0.3.0a22}/src/llama_deploy/appserver/configure_logging.py +0 -0
- {llama_deploy_appserver-0.3.0a21 → llama_deploy_appserver-0.3.0a22}/src/llama_deploy/appserver/correlation_id.py +0 -0
- {llama_deploy_appserver-0.3.0a21 → llama_deploy_appserver-0.3.0a22}/src/llama_deploy/appserver/deployment.py +0 -0
- {llama_deploy_appserver-0.3.0a21 → llama_deploy_appserver-0.3.0a22}/src/llama_deploy/appserver/deployment_config_parser.py +0 -0
- {llama_deploy_appserver-0.3.0a21 → llama_deploy_appserver-0.3.0a22}/src/llama_deploy/appserver/interrupts.py +0 -0
- {llama_deploy_appserver-0.3.0a21 → llama_deploy_appserver-0.3.0a22}/src/llama_deploy/appserver/process_utils.py +0 -0
- {llama_deploy_appserver-0.3.0a21 → llama_deploy_appserver-0.3.0a22}/src/llama_deploy/appserver/py.typed +0 -0
- {llama_deploy_appserver-0.3.0a21 → llama_deploy_appserver-0.3.0a22}/src/llama_deploy/appserver/routers/__init__.py +0 -0
- {llama_deploy_appserver-0.3.0a21 → llama_deploy_appserver-0.3.0a22}/src/llama_deploy/appserver/routers/ui_proxy.py +0 -0
- {llama_deploy_appserver-0.3.0a21 → llama_deploy_appserver-0.3.0a22}/src/llama_deploy/appserver/settings.py +0 -0
- {llama_deploy_appserver-0.3.0a21 → llama_deploy_appserver-0.3.0a22}/src/llama_deploy/appserver/stats.py +0 -0
- {llama_deploy_appserver-0.3.0a21 → llama_deploy_appserver-0.3.0a22}/src/llama_deploy/appserver/types.py +0 -0
- {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.
|
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]>=
|
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.
|
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.
|
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]>=
|
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.
|
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
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
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
|
-
|
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(
|
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(
|
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(
|
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:
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|