Files
2026-07-13 12:43:34 +08:00

167 lines
8.5 KiB
Python

from fastapi_sqlalchemy import db
from fastapi import HTTPException, Depends, Query, status
from fastapi import APIRouter
from datetime import datetime
from superagi.config.config import get_config
from superagi.helper.auth import get_user_organisation
from superagi.models.knowledges import Knowledges
from superagi.models.marketplace_stats import MarketPlaceStats
from superagi.models.knowledge_configs import KnowledgeConfigs
from superagi.models.vector_db_indices import VectordbIndices
from superagi.models.vector_dbs import Vectordbs
from superagi.helper.s3_helper import S3Helper
from superagi.models.vector_db_configs import VectordbConfigs
from superagi.vector_store.vector_factory import VectorFactory
from superagi.vector_embeddings.vector_embedding_factory import VectorEmbeddingFactory
from superagi.helper.time_helper import get_time_difference
router = APIRouter()
@router.get("/get/list")
def get_knowledge_list(
page: int = Query(None, title="Page Number"),
organisation = Depends(get_user_organisation)
):
"""
Get Marketplace Knowledge list.
Args:
page (int, optional): The page number for pagination. Defaults to None.
Returns:
dict: The response containing the marketplace list.
"""
if page < 0:
page = 0
marketplace_knowledges = Knowledges.fetch_marketplace_list(page)
marketplace_knowledges_with_install = Knowledges.get_knowledge_install_details(db.session, marketplace_knowledges, organisation)
for knowledge in marketplace_knowledges_with_install:
knowledge["install_number"] = MarketPlaceStats.get_knowledge_installation_number(knowledge["id"])
return marketplace_knowledges_with_install
@router.get("/marketplace/list/{page}")
def get_marketplace_knowledge_list(page: int = 0):
organisation_id = int(get_config("MARKETPLACE_ORGANISATION_ID"))
page_size = 30
# Apply search filter if provided
query = db.session.query(Knowledges).filter(Knowledges.organisation_id == organisation_id)
if page < 0:
knowledges = query.all()
# Paginate the results
knowledges = query.offset(page * page_size).limit(page_size).all()
return knowledges
@router.get("/user/list")
def get_user_knowledge_list(organisation = Depends(get_user_organisation)):
marketplace_knowledges = Knowledges.fetch_marketplace_list(page=0)
user_knowledge_list = Knowledges.get_organisation_knowledges(db.session, organisation)
for user_knowledge in user_knowledge_list:
if user_knowledge["name"] in [knowledge['name'] for knowledge in marketplace_knowledges]:
user_knowledge["is_marketplace"] = True
else:
user_knowledge["is_marketplace"] = False
return user_knowledge_list
@router.get("/marketplace/get/details/{knowledge_name}")
def get_knowledge_details(knowledge_name: str):
knowledge_data = Knowledges.fetch_knowledge_details_marketplace(knowledge_name)
knowledge_config_data = KnowledgeConfigs.fetch_knowledge_config_details_marketplace(knowledge_data["id"])
knowledge_data_with_config = knowledge_data | knowledge_config_data
knowledge_data_with_config["install_number"] = MarketPlaceStats.get_knowledge_installation_number(knowledge_data_with_config["id"])
update_time = str(knowledge_data_with_config["updated_at"])
update_time = datetime.strptime(update_time, "%Y-%m-%dT%H:%M:%S.%f")
knowledge_data_with_config["updated_at"] = datetime.strftime(update_time, '%d %B %Y')
return knowledge_data_with_config
@router.get("/marketplace/details/{knowledge_name}")
def get_marketplace_knowledge_details(knowledge_name: str):
organisation_id = int(get_config("MARKETPLACE_ORGANISATION_ID"))
knowledge_details = db.session.query(Knowledges).filter(Knowledges.name == knowledge_name, Knowledges.organisation_id == organisation_id).first()
return knowledge_details
@router.get("/user/get/details/{knowledge_id}")
def get_user_knowledge_details(knowledge_id: int):
knowledge_data = Knowledges.get_knowledge_from_id(db.session, knowledge_id)
vector_database_index = VectordbIndices.get_vector_index_from_id(db.session, knowledge_data.vector_db_index_id)
vector_database = Vectordbs.get_vector_db_from_id(db.session, vector_database_index.vector_db_id)
knowledge = {
"name": knowledge_data.name,
"description": knowledge_data.description,
"vector_database_index": {
"id": vector_database_index.id,
"name": vector_database_index.name
},
"vector_database": vector_database.name,
"installation_type": vector_database_index.state
}
knowledge_config = KnowledgeConfigs.get_knowledge_config_from_knowledge_id(db.session, knowledge_id)
knowledge_data_with_config = knowledge | knowledge_config
return knowledge_data_with_config
@router.post("/add_or_update/data")
def add_update_user_knowledge(knowledge_data: dict, organisation = Depends(get_user_organisation)):
knowledge_data["organisation_id"] = organisation.id
knowledge_data["contributed_by"] = organisation.name
knowledge = Knowledges.add_update_knowledge(db.session, knowledge_data)
if not knowledge:
raise HTTPException(status_code=404, detail="Knowledge not found")
return {"id": knowledge.id}
@router.post("/delete/{knowledge_id}")
def delete_user_knowledge(knowledge_id: int):
try:
Knowledges.delete_knowledge(db.session, knowledge_id)
except:
raise HTTPException(status_code=404, detail="Knowledge not found")
@router.get("/install/{knowledge_name}/index/{vector_db_index_id}")
def install_selected_knowledge(knowledge_name: str, vector_db_index_id: int, organisation = Depends(get_user_organisation)):
vector_db_index = VectordbIndices.get_vector_index_from_id(db.session, vector_db_index_id)
selected_knowledge = Knowledges.fetch_knowledge_details_marketplace(knowledge_name)
selected_knowledge_config = KnowledgeConfigs.fetch_knowledge_config_details_marketplace(selected_knowledge['id'])
file_chunks = S3Helper().get_json_file(selected_knowledge_config["file_path"])
vector = Vectordbs.get_vector_db_from_id(db.session, vector_db_index.vector_db_id)
db_creds = VectordbConfigs.get_vector_db_config_from_db_id(db.session, vector.id)
upsert_data = VectorEmbeddingFactory.build_vector_storage(vector.db_type, file_chunks).get_vector_embeddings_from_chunks()
try:
vector_db_storage = VectorFactory.build_vector_storage(vector.db_type, vector_db_index.name, **db_creds)
vector_db_storage.add_embeddings_to_vector_db(upsert_data)
except Exception as err:
raise HTTPException(status_code=400, detail=err)
selected_knowledge_data = {
"id": -1,
"name": selected_knowledge["name"],
"description": selected_knowledge["description"],
"index_id": vector_db_index_id,
"organisation_id": organisation.id,
"contributed_by": selected_knowledge["contributed_by"],
}
new_knowledge = Knowledges.add_update_knowledge(db.session, selected_knowledge_data)
removable_key = 'file_path'
selected_knowledge_config.pop(removable_key)
configs = selected_knowledge_config
KnowledgeConfigs.add_update_knowledge_config(db.session, new_knowledge.id, configs)
VectordbIndices.update_vector_index_state(db.session, vector_db_index_id, "Marketplace")
install_number = MarketPlaceStats.get_knowledge_installation_number(selected_knowledge["id"])
MarketPlaceStats.update_knowledge_install_number(db.session, selected_knowledge["id"], int(install_number) + 1)
@router.post("/uninstall/{knowledge_name}")
def uninstall_selected_knowledge(knowledge_name: str, organisation = Depends(get_user_organisation)):
knowledge = db.session.query(Knowledges).filter(Knowledges.name == knowledge_name, Knowledges.organisation_id == organisation.id).first()
knowledge_config = KnowledgeConfigs.get_knowledge_config_from_knowledge_id(db.session, knowledge.id)
vector_ids = eval(knowledge_config["vector_ids"])
vector_db_index = VectordbIndices.get_vector_index_from_id(db.session, knowledge.vector_db_index_id)
vector = Vectordbs.get_vector_db_from_id(db.session, vector_db_index.vector_db_id)
db_creds = VectordbConfigs.get_vector_db_config_from_db_id(db.session, vector.id)
try:
vector_db_storage = VectorFactory.build_vector_storage(vector.db_type, vector_db_index.name, **db_creds)
vector_db_storage.delete_embeddings_from_vector_db(vector_ids)
except Exception as err:
raise HTTPException(status_code=400, detail=err)
KnowledgeConfigs.delete_knowledge_config(db.session, knowledge.id)
Knowledges.delete_knowledge(db.session, knowledge.id)