2024-07-31 12:35:02 +00:00
|
|
|
from fastapi import FastAPI
|
2024-06-24 18:17:18 +00:00
|
|
|
from fastapi.responses import StreamingResponse
|
2023-11-19 00:47:12 +00:00
|
|
|
from fastapi.middleware.cors import CORSMiddleware
|
2024-05-26 08:15:48 +00:00
|
|
|
from apps.webui.routers import (
|
2024-01-08 07:43:32 +00:00
|
|
|
auths,
|
|
|
|
users,
|
|
|
|
chats,
|
|
|
|
documents,
|
2024-06-11 03:39:55 +00:00
|
|
|
tools,
|
2024-05-24 07:26:00 +00:00
|
|
|
models,
|
2024-01-08 07:43:32 +00:00
|
|
|
prompts,
|
|
|
|
configs,
|
2024-05-19 15:00:07 +00:00
|
|
|
memories,
|
2024-01-08 07:43:32 +00:00
|
|
|
utils,
|
2024-06-18 18:36:55 +00:00
|
|
|
files,
|
2024-06-20 07:49:11 +00:00
|
|
|
functions,
|
2024-01-08 07:43:32 +00:00
|
|
|
)
|
2024-06-20 11:38:59 +00:00
|
|
|
from apps.webui.models.functions import Functions
|
2024-07-04 20:41:18 +00:00
|
|
|
from apps.webui.models.models import Models
|
2024-06-20 11:38:59 +00:00
|
|
|
from apps.webui.utils import load_function_module_by_id
|
2024-07-04 20:41:18 +00:00
|
|
|
|
2024-07-31 16:16:07 +00:00
|
|
|
from utils.misc import (
|
|
|
|
stream_message_template,
|
|
|
|
whole_message_template,
|
|
|
|
add_or_update_system_message,
|
|
|
|
)
|
2024-07-04 20:41:18 +00:00
|
|
|
from utils.task import prompt_template
|
|
|
|
|
2024-06-20 11:38:59 +00:00
|
|
|
|
2024-02-14 09:17:43 +00:00
|
|
|
from config import (
|
2024-06-04 04:17:43 +00:00
|
|
|
SHOW_ADMIN_DETAILS,
|
|
|
|
ADMIN_EMAIL,
|
2024-02-14 09:17:43 +00:00
|
|
|
WEBUI_AUTH,
|
|
|
|
DEFAULT_MODELS,
|
|
|
|
DEFAULT_PROMPT_SUGGESTIONS,
|
|
|
|
DEFAULT_USER_ROLE,
|
|
|
|
ENABLE_SIGNUP,
|
2024-07-25 01:44:40 +00:00
|
|
|
ENABLE_LOGIN_FORM,
|
2024-02-14 09:17:43 +00:00
|
|
|
USER_PERMISSIONS,
|
2024-03-21 01:35:02 +00:00
|
|
|
WEBHOOK_URL,
|
2024-03-26 21:30:53 +00:00
|
|
|
WEBUI_AUTH_TRUSTED_EMAIL_HEADER,
|
2024-06-15 20:04:11 +00:00
|
|
|
WEBUI_AUTH_TRUSTED_NAME_HEADER,
|
2024-05-10 05:36:10 +00:00
|
|
|
JWT_EXPIRES_IN,
|
2024-05-26 19:18:43 +00:00
|
|
|
WEBUI_BANNERS,
|
2024-05-26 16:10:25 +00:00
|
|
|
ENABLE_COMMUNITY_SHARING,
|
2024-06-11 03:39:55 +00:00
|
|
|
AppConfig,
|
2024-06-28 13:31:40 +00:00
|
|
|
OAUTH_USERNAME_CLAIM,
|
2024-07-01 07:36:21 +00:00
|
|
|
OAUTH_PICTURE_CLAIM,
|
2024-02-14 09:17:43 +00:00
|
|
|
)
|
2023-11-19 00:47:12 +00:00
|
|
|
|
2024-07-11 22:20:56 +00:00
|
|
|
from apps.socket.main import get_event_call, get_event_emitter
|
|
|
|
|
2024-06-24 18:17:18 +00:00
|
|
|
import inspect
|
|
|
|
import json
|
|
|
|
|
2024-07-31 12:35:02 +00:00
|
|
|
from typing import Iterator, Generator, AsyncGenerator
|
2024-06-24 18:17:18 +00:00
|
|
|
from pydantic import BaseModel
|
|
|
|
|
2023-11-19 00:47:12 +00:00
|
|
|
app = FastAPI()
|
|
|
|
|
|
|
|
origins = ["*"]
|
|
|
|
|
2024-05-10 07:03:24 +00:00
|
|
|
app.state.config = AppConfig()
|
2024-02-20 04:44:00 +00:00
|
|
|
|
2024-05-10 07:03:24 +00:00
|
|
|
app.state.config.ENABLE_SIGNUP = ENABLE_SIGNUP
|
2024-07-25 01:44:40 +00:00
|
|
|
app.state.config.ENABLE_LOGIN_FORM = ENABLE_LOGIN_FORM
|
2024-05-10 07:03:24 +00:00
|
|
|
app.state.config.JWT_EXPIRES_IN = JWT_EXPIRES_IN
|
2024-06-11 05:38:48 +00:00
|
|
|
app.state.AUTH_TRUSTED_EMAIL_HEADER = WEBUI_AUTH_TRUSTED_EMAIL_HEADER
|
2024-06-15 20:04:11 +00:00
|
|
|
app.state.AUTH_TRUSTED_NAME_HEADER = WEBUI_AUTH_TRUSTED_NAME_HEADER
|
2024-05-10 07:03:24 +00:00
|
|
|
|
2024-06-04 04:17:43 +00:00
|
|
|
|
|
|
|
app.state.config.SHOW_ADMIN_DETAILS = SHOW_ADMIN_DETAILS
|
|
|
|
app.state.config.ADMIN_EMAIL = ADMIN_EMAIL
|
|
|
|
|
|
|
|
|
2024-05-10 07:03:24 +00:00
|
|
|
app.state.config.DEFAULT_MODELS = DEFAULT_MODELS
|
|
|
|
app.state.config.DEFAULT_PROMPT_SUGGESTIONS = DEFAULT_PROMPT_SUGGESTIONS
|
|
|
|
app.state.config.DEFAULT_USER_ROLE = DEFAULT_USER_ROLE
|
|
|
|
app.state.config.USER_PERMISSIONS = USER_PERMISSIONS
|
|
|
|
app.state.config.WEBHOOK_URL = WEBHOOK_URL
|
2024-05-26 19:18:43 +00:00
|
|
|
app.state.config.BANNERS = WEBUI_BANNERS
|
2024-05-25 01:26:36 +00:00
|
|
|
|
2024-05-26 16:10:25 +00:00
|
|
|
app.state.config.ENABLE_COMMUNITY_SHARING = ENABLE_COMMUNITY_SHARING
|
2024-05-25 01:26:36 +00:00
|
|
|
|
2024-06-28 13:31:40 +00:00
|
|
|
app.state.config.OAUTH_USERNAME_CLAIM = OAUTH_USERNAME_CLAIM
|
|
|
|
app.state.config.OAUTH_PICTURE_CLAIM = OAUTH_PICTURE_CLAIM
|
|
|
|
|
2024-05-25 01:26:36 +00:00
|
|
|
app.state.MODELS = {}
|
2024-06-11 05:38:48 +00:00
|
|
|
app.state.TOOLS = {}
|
2024-06-20 07:37:02 +00:00
|
|
|
app.state.FUNCTIONS = {}
|
2024-05-19 15:00:07 +00:00
|
|
|
|
2023-11-19 00:47:12 +00:00
|
|
|
app.add_middleware(
|
|
|
|
CORSMiddleware,
|
|
|
|
allow_origins=origins,
|
|
|
|
allow_credentials=True,
|
|
|
|
allow_methods=["*"],
|
|
|
|
allow_headers=["*"],
|
|
|
|
)
|
|
|
|
|
2024-06-20 07:49:11 +00:00
|
|
|
|
|
|
|
app.include_router(configs.router, prefix="/configs", tags=["configs"])
|
2023-11-19 00:47:12 +00:00
|
|
|
app.include_router(auths.router, prefix="/auths", tags=["auths"])
|
2024-01-01 08:55:50 +00:00
|
|
|
app.include_router(users.router, prefix="/users", tags=["users"])
|
|
|
|
app.include_router(chats.router, prefix="/chats", tags=["chats"])
|
2024-05-19 15:00:07 +00:00
|
|
|
|
2024-01-08 07:43:32 +00:00
|
|
|
app.include_router(documents.router, prefix="/documents", tags=["documents"])
|
2024-05-24 07:26:00 +00:00
|
|
|
app.include_router(models.router, prefix="/models", tags=["models"])
|
2024-01-03 05:00:50 +00:00
|
|
|
app.include_router(prompts.router, prefix="/prompts", tags=["prompts"])
|
2024-06-20 07:49:11 +00:00
|
|
|
|
2024-05-19 15:00:07 +00:00
|
|
|
app.include_router(memories.router, prefix="/memories", tags=["memories"])
|
2024-06-20 07:49:11 +00:00
|
|
|
app.include_router(files.router, prefix="/files", tags=["files"])
|
|
|
|
app.include_router(tools.router, prefix="/tools", tags=["tools"])
|
|
|
|
app.include_router(functions.router, prefix="/functions", tags=["functions"])
|
2024-05-19 15:00:07 +00:00
|
|
|
|
2023-12-27 06:10:22 +00:00
|
|
|
app.include_router(utils.router, prefix="/utils", tags=["utils"])
|
2023-11-19 00:47:12 +00:00
|
|
|
|
|
|
|
|
|
|
|
@app.get("/")
|
|
|
|
async def get_status():
|
2024-01-03 00:48:10 +00:00
|
|
|
return {
|
|
|
|
"status": True,
|
|
|
|
"auth": WEBUI_AUTH,
|
2024-05-10 07:03:24 +00:00
|
|
|
"default_models": app.state.config.DEFAULT_MODELS,
|
|
|
|
"default_prompt_suggestions": app.state.config.DEFAULT_PROMPT_SUGGESTIONS,
|
2024-01-03 00:48:10 +00:00
|
|
|
}
|
2024-06-20 11:38:59 +00:00
|
|
|
|
|
|
|
|
2024-07-31 12:35:02 +00:00
|
|
|
def get_function_module(pipe_id: str):
|
|
|
|
# Check if function is already loaded
|
|
|
|
if pipe_id not in app.state.FUNCTIONS:
|
|
|
|
function_module, _, _ = load_function_module_by_id(pipe_id)
|
|
|
|
app.state.FUNCTIONS[pipe_id] = function_module
|
|
|
|
else:
|
|
|
|
function_module = app.state.FUNCTIONS[pipe_id]
|
|
|
|
|
|
|
|
if hasattr(function_module, "valves") and hasattr(function_module, "Valves"):
|
|
|
|
valves = Functions.get_function_valves_by_id(pipe_id)
|
|
|
|
function_module.valves = function_module.Valves(**(valves if valves else {}))
|
|
|
|
return function_module
|
|
|
|
|
|
|
|
|
2024-06-21 12:58:57 +00:00
|
|
|
async def get_pipe_models():
|
|
|
|
pipes = Functions.get_functions_by_type("pipe", active_only=True)
|
2024-06-20 11:38:59 +00:00
|
|
|
pipe_models = []
|
|
|
|
|
|
|
|
for pipe in pipes:
|
2024-07-31 12:35:02 +00:00
|
|
|
function_module = get_function_module(pipe.id)
|
2024-06-24 17:37:57 +00:00
|
|
|
|
2024-06-20 11:38:59 +00:00
|
|
|
# Check if function is a manifold
|
|
|
|
if hasattr(function_module, "type"):
|
2024-07-31 12:35:02 +00:00
|
|
|
if not function_module.type == "manifold":
|
|
|
|
continue
|
|
|
|
manifold_pipes = []
|
|
|
|
|
|
|
|
# Check if pipes is a function or a list
|
|
|
|
if callable(function_module.pipes):
|
|
|
|
manifold_pipes = function_module.pipes()
|
|
|
|
else:
|
|
|
|
manifold_pipes = function_module.pipes
|
|
|
|
|
|
|
|
for p in manifold_pipes:
|
|
|
|
manifold_pipe_id = f'{pipe.id}.{p["id"]}'
|
|
|
|
manifold_pipe_name = p["name"]
|
|
|
|
|
|
|
|
if hasattr(function_module, "name"):
|
|
|
|
manifold_pipe_name = f"{function_module.name}{manifold_pipe_name}"
|
|
|
|
|
|
|
|
pipe_flag = {"type": pipe.type}
|
|
|
|
if hasattr(function_module, "ChatValves"):
|
|
|
|
pipe_flag["valves_spec"] = function_module.ChatValves.schema()
|
|
|
|
|
|
|
|
pipe_models.append(
|
|
|
|
{
|
|
|
|
"id": manifold_pipe_id,
|
|
|
|
"name": manifold_pipe_name,
|
|
|
|
"object": "model",
|
|
|
|
"created": pipe.created_at,
|
|
|
|
"owned_by": "openai",
|
|
|
|
"pipe": pipe_flag,
|
|
|
|
}
|
|
|
|
)
|
2024-06-20 11:38:59 +00:00
|
|
|
else:
|
2024-07-11 23:24:59 +00:00
|
|
|
pipe_flag = {"type": "pipe"}
|
|
|
|
if hasattr(function_module, "ChatValves"):
|
|
|
|
pipe_flag["valves_spec"] = function_module.ChatValves.schema()
|
|
|
|
|
2024-06-20 11:38:59 +00:00
|
|
|
pipe_models.append(
|
|
|
|
{
|
|
|
|
"id": pipe.id,
|
|
|
|
"name": pipe.name,
|
|
|
|
"object": "model",
|
|
|
|
"created": pipe.created_at,
|
|
|
|
"owned_by": "openai",
|
2024-07-11 23:24:59 +00:00
|
|
|
"pipe": pipe_flag,
|
2024-06-20 11:38:59 +00:00
|
|
|
}
|
|
|
|
)
|
|
|
|
|
|
|
|
return pipe_models
|
2024-06-24 18:17:18 +00:00
|
|
|
|
|
|
|
|
2024-07-31 12:35:02 +00:00
|
|
|
async def execute_pipe(pipe, params):
|
|
|
|
if inspect.iscoroutinefunction(pipe):
|
|
|
|
return await pipe(**params)
|
|
|
|
else:
|
|
|
|
return pipe(**params)
|
2024-07-11 22:20:56 +00:00
|
|
|
|
2024-07-11 20:43:44 +00:00
|
|
|
|
2024-07-31 14:26:26 +00:00
|
|
|
async def get_message_content(res: str | Generator | AsyncGenerator) -> str:
|
2024-07-31 12:35:02 +00:00
|
|
|
if isinstance(res, str):
|
|
|
|
return res
|
|
|
|
if isinstance(res, Generator):
|
|
|
|
return "".join(map(str, res))
|
|
|
|
if isinstance(res, AsyncGenerator):
|
|
|
|
return "".join([str(stream) async for stream in res])
|
2024-07-04 20:41:18 +00:00
|
|
|
|
|
|
|
|
2024-07-31 12:35:02 +00:00
|
|
|
def process_line(form_data: dict, line):
|
|
|
|
if isinstance(line, BaseModel):
|
|
|
|
line = line.model_dump_json()
|
|
|
|
line = f"data: {line}"
|
|
|
|
if isinstance(line, dict):
|
|
|
|
line = f"data: {json.dumps(line)}"
|
2024-07-04 20:41:18 +00:00
|
|
|
|
2024-07-31 12:35:02 +00:00
|
|
|
try:
|
|
|
|
line = line.decode("utf-8")
|
|
|
|
except Exception:
|
|
|
|
pass
|
2024-07-04 20:41:18 +00:00
|
|
|
|
2024-07-31 12:35:02 +00:00
|
|
|
if line.startswith("data:"):
|
|
|
|
return f"{line}\n\n"
|
2024-07-04 20:41:18 +00:00
|
|
|
else:
|
2024-07-31 12:35:02 +00:00
|
|
|
line = stream_message_template(form_data["model"], line)
|
|
|
|
return f"data: {json.dumps(line)}\n\n"
|
|
|
|
|
|
|
|
|
|
|
|
def get_pipe_id(form_data: dict) -> str:
|
|
|
|
pipe_id = form_data["model"]
|
|
|
|
if "." in pipe_id:
|
|
|
|
pipe_id, _ = pipe_id.split(".", 1)
|
|
|
|
print(pipe_id)
|
|
|
|
return pipe_id
|
|
|
|
|
|
|
|
|
|
|
|
def get_params_dict(pipe, form_data, user, extra_params, function_module):
|
|
|
|
pipe_id = get_pipe_id(form_data)
|
|
|
|
# Get the signature of the function
|
|
|
|
sig = inspect.signature(pipe)
|
|
|
|
params = {"body": form_data}
|
|
|
|
|
|
|
|
for key, value in extra_params.items():
|
|
|
|
if key in sig.parameters:
|
|
|
|
params[key] = value
|
|
|
|
|
|
|
|
if "__user__" in sig.parameters:
|
|
|
|
__user__ = {
|
|
|
|
"id": user.id,
|
|
|
|
"email": user.email,
|
|
|
|
"name": user.name,
|
|
|
|
"role": user.role,
|
|
|
|
}
|
|
|
|
|
|
|
|
try:
|
|
|
|
if hasattr(function_module, "UserValves"):
|
|
|
|
__user__["valves"] = function_module.UserValves(
|
|
|
|
**Functions.get_user_valves_by_id_and_user_id(pipe_id, user.id)
|
|
|
|
)
|
|
|
|
except Exception as e:
|
|
|
|
print(e)
|
2024-07-04 20:41:18 +00:00
|
|
|
|
2024-07-31 12:35:02 +00:00
|
|
|
params["__user__"] = __user__
|
|
|
|
return params
|
2024-06-24 18:17:18 +00:00
|
|
|
|
|
|
|
|
2024-07-31 12:51:25 +00:00
|
|
|
def get_extra_params(metadata: dict):
|
2024-07-31 14:26:26 +00:00
|
|
|
__event_emitter__ = None
|
|
|
|
__event_call__ = None
|
|
|
|
__task__ = None
|
2024-06-24 18:17:18 +00:00
|
|
|
|
2024-07-31 12:35:02 +00:00
|
|
|
if metadata:
|
|
|
|
if all(k in metadata for k in ("session_id", "chat_id", "message_id")):
|
|
|
|
__event_emitter__ = get_event_emitter(metadata)
|
|
|
|
__event_call__ = get_event_call(metadata)
|
|
|
|
__task__ = metadata.get("task", None)
|
|
|
|
|
2024-07-31 12:51:25 +00:00
|
|
|
return {
|
|
|
|
"__event_emitter__": __event_emitter__,
|
|
|
|
"__event_call__": __event_call__,
|
|
|
|
"__task__": __task__,
|
|
|
|
}
|
2024-07-31 12:35:02 +00:00
|
|
|
|
|
|
|
|
2024-07-31 16:16:07 +00:00
|
|
|
# inplace function: form_data is modified
|
2024-07-31 15:45:47 +00:00
|
|
|
def add_model_params(params: dict, form_data: dict) -> dict:
|
|
|
|
if not params:
|
|
|
|
return form_data
|
|
|
|
|
|
|
|
mappings = {
|
|
|
|
"temperature": float,
|
|
|
|
"top_p": int,
|
|
|
|
"max_tokens": int,
|
|
|
|
"frequency_penalty": int,
|
|
|
|
"seed": lambda x: x,
|
|
|
|
"stop": lambda x: [bytes(s, "utf-8").decode("unicode_escape") for s in x],
|
|
|
|
}
|
|
|
|
|
|
|
|
for key, cast_func in mappings.items():
|
|
|
|
if (value := params.get(key)) is not None:
|
|
|
|
form_data[key] = cast_func(value)
|
|
|
|
|
|
|
|
return form_data
|
|
|
|
|
|
|
|
|
2024-07-31 16:16:07 +00:00
|
|
|
# inplace function: form_data is modified
|
|
|
|
def populate_system_message(params: dict, form_data: dict, user) -> dict:
|
|
|
|
system = params.get("system", None)
|
|
|
|
if not system:
|
|
|
|
return form_data
|
|
|
|
|
|
|
|
if user:
|
|
|
|
template_params = {
|
|
|
|
"user_name": user.name,
|
|
|
|
"user_location": user.info.get("location") if user.info else None,
|
|
|
|
}
|
|
|
|
else:
|
|
|
|
template_params = {}
|
|
|
|
system = prompt_template(system, **template_params)
|
|
|
|
form_data["messages"] = add_or_update_system_message(
|
|
|
|
system, form_data.get("messages", [])
|
|
|
|
)
|
|
|
|
return form_data
|
|
|
|
|
|
|
|
|
2024-07-31 12:51:25 +00:00
|
|
|
async def generate_function_chat_completion(form_data, user):
|
|
|
|
model_id = form_data.get("model")
|
|
|
|
model_info = Models.get_model_by_id(model_id)
|
|
|
|
metadata = form_data.pop("metadata", None)
|
|
|
|
|
2024-07-31 16:16:07 +00:00
|
|
|
# Add extra params such as __event_emitter__
|
|
|
|
extra_params = get_extra_params(metadata)
|
2024-07-31 12:51:25 +00:00
|
|
|
if model_info:
|
|
|
|
if model_info.base_model_id:
|
|
|
|
form_data["model"] = model_info.base_model_id
|
|
|
|
|
|
|
|
params = model_info.params.model_dump()
|
2024-07-31 15:45:47 +00:00
|
|
|
form_data = add_model_params(params, form_data)
|
2024-07-31 16:16:07 +00:00
|
|
|
form_data = populate_system_message(params, form_data, user)
|
2024-07-11 22:20:56 +00:00
|
|
|
|
2024-07-31 12:35:02 +00:00
|
|
|
async def job():
|
|
|
|
pipe_id = get_pipe_id(form_data)
|
|
|
|
function_module = get_function_module(pipe_id)
|
2024-07-11 22:20:56 +00:00
|
|
|
|
2024-07-31 12:35:02 +00:00
|
|
|
pipe = function_module.pipe
|
|
|
|
params = get_params_dict(pipe, form_data, user, extra_params, function_module)
|
2024-07-11 22:20:56 +00:00
|
|
|
|
2024-06-24 18:17:18 +00:00
|
|
|
if form_data["stream"]:
|
|
|
|
|
|
|
|
async def stream_content():
|
|
|
|
try:
|
2024-07-31 12:35:02 +00:00
|
|
|
res = await execute_pipe(pipe, params)
|
2024-06-24 19:56:41 +00:00
|
|
|
|
|
|
|
# Directly return if the response is a StreamingResponse
|
|
|
|
if isinstance(res, StreamingResponse):
|
|
|
|
async for data in res.body_iterator:
|
|
|
|
yield data
|
|
|
|
return
|
|
|
|
if isinstance(res, dict):
|
|
|
|
yield f"data: {json.dumps(res)}\n\n"
|
|
|
|
return
|
|
|
|
|
2024-06-24 18:17:18 +00:00
|
|
|
except Exception as e:
|
|
|
|
print(f"Error: {e}")
|
|
|
|
yield f"data: {json.dumps({'error': {'detail':str(e)}})}\n\n"
|
|
|
|
return
|
|
|
|
|
|
|
|
if isinstance(res, str):
|
|
|
|
message = stream_message_template(form_data["model"], res)
|
|
|
|
yield f"data: {json.dumps(message)}\n\n"
|
|
|
|
|
|
|
|
if isinstance(res, Iterator):
|
|
|
|
for line in res:
|
2024-07-31 12:35:02 +00:00
|
|
|
yield process_line(form_data, line)
|
2024-06-24 18:17:18 +00:00
|
|
|
|
2024-07-24 10:29:57 +00:00
|
|
|
if isinstance(res, AsyncGenerator):
|
|
|
|
async for line in res:
|
2024-07-31 12:35:02 +00:00
|
|
|
yield process_line(form_data, line)
|
|
|
|
|
|
|
|
if isinstance(res, str) or isinstance(res, Generator):
|
2024-07-31 15:45:47 +00:00
|
|
|
finish_message = stream_message_template(form_data["model"], "")
|
2024-07-31 14:26:26 +00:00
|
|
|
finish_message["choices"][0]["finish_reason"] = "stop"
|
2024-07-31 12:35:02 +00:00
|
|
|
yield f"data: {json.dumps(finish_message)}\n\n"
|
|
|
|
yield "data: [DONE]"
|
2024-07-24 10:29:57 +00:00
|
|
|
|
2024-06-24 18:17:18 +00:00
|
|
|
return StreamingResponse(stream_content(), media_type="text/event-stream")
|
|
|
|
else:
|
|
|
|
try:
|
2024-07-31 12:35:02 +00:00
|
|
|
res = await execute_pipe(pipe, params)
|
2024-06-24 19:56:41 +00:00
|
|
|
|
2024-06-24 18:17:18 +00:00
|
|
|
except Exception as e:
|
|
|
|
print(f"Error: {e}")
|
|
|
|
return {"error": {"detail": str(e)}}
|
|
|
|
|
2024-07-31 12:35:02 +00:00
|
|
|
if isinstance(res, StreamingResponse) or isinstance(res, dict):
|
2024-06-24 18:17:18 +00:00
|
|
|
return res
|
2024-07-31 12:35:02 +00:00
|
|
|
if isinstance(res, BaseModel):
|
2024-06-24 18:17:18 +00:00
|
|
|
return res.model_dump()
|
2024-07-31 12:35:02 +00:00
|
|
|
|
2024-07-31 14:26:26 +00:00
|
|
|
message = await get_message_content(res)
|
|
|
|
return whole_message_template(form_data["model"], message)
|
2024-06-24 18:17:18 +00:00
|
|
|
|
|
|
|
return await job()
|