Victor Dibia 30b84d4254
Autogenstudio - Add GroupChat Support to UI (#1352)
* support groupchat, other QOL fixes

* remove gallery success toast

* Update website/blog/2023-12-01-AutoGenStudio/index.mdx

Co-authored-by: Chi Wang <wang.chi@microsoft.com>

---------

Co-authored-by: Chi Wang <wang.chi@microsoft.com>
2024-01-23 19:59:58 +00:00

474 lines
13 KiB
Python

import json
import os
import traceback
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from fastapi.staticfiles import StaticFiles
from fastapi import HTTPException
from ..version import VERSION
from ..datamodel import (
ChatWebRequestModel,
DBWebRequestModel,
DeleteMessageWebRequestModel,
Message,
Session,
)
from ..utils import md5_hash, init_webserver_folders, DBManager, dbutils
from ..chatmanager import AutoGenChatManager
app = FastAPI()
# allow cross origin requests for testing on localhost:800* ports only
app.add_middleware(
CORSMiddleware,
allow_origins=[
"http://localhost:8000",
"http://127.0.0.1:8000",
"http://localhost:8001",
"http://localhost:8081",
],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
root_file_path = os.environ.get("AUTOGENSTUDIO_APPDIR") or os.path.dirname(os.path.abspath(__file__))
# init folders skills, workdir, static, files etc
folders = init_webserver_folders(root_file_path)
ui_folder_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "ui")
api = FastAPI(root_path="/api")
# mount an api route such that the main route serves the ui and the /api
app.mount("/api", api)
app.mount("/", StaticFiles(directory=ui_folder_path, html=True), name="ui")
api.mount("/files", StaticFiles(directory=folders["files_static_root"], html=True), name="files")
db_path = os.path.join(root_file_path, "database.sqlite")
dbmanager = DBManager(path=db_path) # manage database operations
chatmanager = AutoGenChatManager() # manage calls to autogen
@api.post("/messages")
async def add_message(req: ChatWebRequestModel):
message = Message(**req.message.dict())
user_history = dbutils.get_messages(user_id=message.user_id, session_id=req.message.session_id, dbmanager=dbmanager)
# save incoming message to db
dbutils.create_message(message=message, dbmanager=dbmanager)
user_dir = os.path.join(folders["files_static_root"], "user", md5_hash(message.user_id))
os.makedirs(user_dir, exist_ok=True)
try:
response_message: Message = chatmanager.chat(
message=message,
history=user_history,
work_dir=user_dir,
flow_config=req.flow_config,
)
# save assistant response to db
dbutils.create_message(message=response_message, dbmanager=dbmanager)
response = {
"status": True,
"message": response_message.content,
"metadata": json.loads(response_message.metadata),
}
return response
except Exception as ex_error:
print(traceback.format_exc())
return {
"status": False,
"message": "Error occurred while processing message: " + str(ex_error),
}
@api.get("/messages")
async def get_messages(user_id: str = None, session_id: str = None):
if user_id is None:
raise HTTPException(status_code=400, detail="user_id is required")
try:
user_history = dbutils.get_messages(user_id=user_id, session_id=session_id, dbmanager=dbmanager)
return {
"status": True,
"data": user_history,
"message": "Messages retrieved successfully",
}
except Exception as ex_error:
print(ex_error)
return {
"status": False,
"message": "Error occurred while retrieving messages: " + str(ex_error),
}
@api.get("/gallery")
async def get_gallery_items(gallery_id: str = None):
try:
gallery = dbutils.get_gallery(gallery_id=gallery_id, dbmanager=dbmanager)
return {
"status": True,
"data": gallery,
"message": "Gallery items retrieved successfully",
}
except Exception as ex_error:
print(ex_error)
return {
"status": False,
"message": "Error occurred while retrieving messages: " + str(ex_error),
}
@api.get("/sessions")
async def get_user_sessions(user_id: str = None):
"""Return a list of all sessions for a user"""
if user_id is None:
raise HTTPException(status_code=400, detail="user_id is required")
try:
user_sessions = dbutils.get_sessions(user_id=user_id, dbmanager=dbmanager)
return {
"status": True,
"data": user_sessions,
"message": "Sessions retrieved successfully",
}
except Exception as ex_error:
print(ex_error)
return {
"status": False,
"message": "Error occurred while retrieving sessions: " + str(ex_error),
}
@api.post("/sessions")
async def create_user_session(req: DBWebRequestModel):
"""Create a new session for a user"""
# print(req.session, "**********" )
try:
session = Session(user_id=req.session.user_id, flow_config=req.session.flow_config)
user_sessions = dbutils.create_session(user_id=req.user_id, session=session, dbmanager=dbmanager)
return {
"status": True,
"message": "Session created successfully",
"data": user_sessions,
}
except Exception as ex_error:
print(traceback.format_exc())
return {
"status": False,
"message": "Error occurred while creating session: " + str(ex_error),
}
@api.post("/sessions/publish")
async def publish_user_session_to_gallery(req: DBWebRequestModel):
"""Create a new session for a user"""
try:
gallery_item = dbutils.create_gallery(req.session, tags=req.tags, dbmanager=dbmanager)
return {
"status": True,
"message": "Session successfully published",
"data": gallery_item,
}
except Exception as ex_error:
print(traceback.format_exc())
return {
"status": False,
"message": "Error occurred while publishing session: " + str(ex_error),
}
@api.delete("/sessions/delete")
async def delete_user_session(req: DBWebRequestModel):
"""Delete a session for a user"""
try:
sessions = dbutils.delete_session(session=req.session, dbmanager=dbmanager)
return {
"status": True,
"message": "Session deleted successfully",
"data": sessions,
}
except Exception as ex_error:
print(traceback.format_exc())
return {
"status": False,
"message": "Error occurred while deleting session: " + str(ex_error),
}
@api.post("/messages/delete")
async def remove_message(req: DeleteMessageWebRequestModel):
"""Delete a message from the database"""
try:
messages = dbutils.delete_message(
user_id=req.user_id, msg_id=req.msg_id, session_id=req.session_id, dbmanager=dbmanager
)
return {
"status": True,
"message": "Message deleted successfully",
"data": messages,
}
except Exception as ex_error:
print(ex_error)
return {
"status": False,
"message": "Error occurred while deleting message: " + str(ex_error),
}
@api.get("/skills")
async def get_user_skills(user_id: str):
try:
skills = dbutils.get_skills(user_id, dbmanager=dbmanager)
return {
"status": True,
"message": "Skills retrieved successfully",
"data": skills,
}
except Exception as ex_error:
print(ex_error)
return {
"status": False,
"message": "Error occurred while retrieving skills: " + str(ex_error),
}
@api.post("/skills")
async def create_user_skills(req: DBWebRequestModel):
try:
skills = dbutils.upsert_skill(skill=req.skill, dbmanager=dbmanager)
return {
"status": True,
"message": "Skills retrieved successfully",
"data": skills,
}
except Exception as ex_error:
print(ex_error)
return {
"status": False,
"message": "Error occurred while creating skills: " + str(ex_error),
}
@api.delete("/skills/delete")
async def delete_user_skills(req: DBWebRequestModel):
"""Delete a skill for a user"""
try:
skills = dbutils.delete_skill(req.skill, dbmanager=dbmanager)
return {
"status": True,
"message": "Skill deleted successfully",
"data": skills,
}
except Exception as ex_error:
print(ex_error)
return {
"status": False,
"message": "Error occurred while deleting skill: " + str(ex_error),
}
@api.get("/agents")
async def get_user_agents(user_id: str):
try:
agents = dbutils.get_agents(user_id, dbmanager=dbmanager)
return {
"status": True,
"message": "Agents retrieved successfully",
"data": agents,
}
except Exception as ex_error:
print(ex_error)
return {
"status": False,
"message": "Error occurred while retrieving agents: " + str(ex_error),
}
@api.post("/agents")
async def create_user_agents(req: DBWebRequestModel):
"""Create a new agent for a user"""
try:
agents = dbutils.upsert_agent(agent_flow_spec=req.agent, dbmanager=dbmanager)
return {
"status": True,
"message": "Agent created successfully",
"data": agents,
}
except Exception as ex_error:
print(traceback.format_exc())
return {
"status": False,
"message": "Error occurred while creating agent: " + str(ex_error),
}
@api.delete("/agents/delete")
async def delete_user_agent(req: DBWebRequestModel):
"""Delete an agent for a user"""
try:
agents = dbutils.delete_agent(agent=req.agent, dbmanager=dbmanager)
return {
"status": True,
"message": "Agent deleted successfully",
"data": agents,
}
except Exception as ex_error:
print(traceback.format_exc())
return {
"status": False,
"message": "Error occurred while deleting agent: " + str(ex_error),
}
@api.get("/models")
async def get_user_models(user_id: str):
try:
models = dbutils.get_models(user_id, dbmanager=dbmanager)
return {
"status": True,
"message": "Models retrieved successfully",
"data": models,
}
except Exception as ex_error:
print(ex_error)
return {
"status": False,
"message": "Error occurred while retrieving models: " + str(ex_error),
}
@api.post("/models")
async def create_user_models(req: DBWebRequestModel):
"""Create a new model for a user"""
try:
models = dbutils.upsert_model(model=req.model, dbmanager=dbmanager)
return {
"status": True,
"message": "Model created successfully",
"data": models,
}
except Exception as ex_error:
print(traceback.format_exc())
return {
"status": False,
"message": "Error occurred while creating model: " + str(ex_error),
}
@api.delete("/models/delete")
async def delete_user_model(req: DBWebRequestModel):
"""Delete a model for a user"""
try:
models = dbutils.delete_model(model=req.model, dbmanager=dbmanager)
return {
"status": True,
"message": "Model deleted successfully",
"data": models,
}
except Exception as ex_error:
print(traceback.format_exc())
return {
"status": False,
"message": "Error occurred while deleting model: " + str(ex_error),
}
@api.get("/workflows")
async def get_user_workflows(user_id: str):
try:
workflows = dbutils.get_workflows(user_id, dbmanager=dbmanager)
return {
"status": True,
"message": "Workflows retrieved successfully",
"data": workflows,
}
except Exception as ex_error:
print(ex_error)
return {
"status": False,
"message": "Error occurred while retrieving workflows: " + str(ex_error),
}
@api.post("/workflows")
async def create_user_workflow(req: DBWebRequestModel):
"""Create a new workflow for a user"""
try:
workflow = dbutils.upsert_workflow(workflow=req.workflow, dbmanager=dbmanager)
return {
"status": True,
"message": "Workflow created successfully",
"data": workflow,
}
except Exception as ex_error:
print(ex_error)
return {
"status": False,
"message": "Error occurred while creating workflow: " + str(ex_error),
}
@api.delete("/workflows/delete")
async def delete_user_workflow(req: DBWebRequestModel):
"""Delete a workflow for a user"""
try:
workflow = dbutils.delete_workflow(workflow=req.workflow, dbmanager=dbmanager)
return {
"status": True,
"message": "Workflow deleted successfully",
"data": workflow,
}
except Exception as ex_error:
print(ex_error)
return {
"status": False,
"message": "Error occurred while deleting workflow: " + str(ex_error),
}
@api.get("/version")
async def get_version():
return {
"status": True,
"message": "Version retrieved successfully",
"data": {"version": VERSION},
}