open-webui/backend/open_webui/apps/webui/models/knowledge.py

159 lines
4.1 KiB
Python
Raw Normal View History

2024-10-02 00:35:35 +00:00
import json
import logging
import time
from typing import Optional
2024-10-02 04:32:59 +00:00
import uuid
2024-10-02 00:35:35 +00:00
from open_webui.apps.webui.internal.db import Base, get_db
from open_webui.env import SRC_LOG_LEVELS
from open_webui.apps.webui.models.files import FileMetadataResponse
2024-10-02 00:35:35 +00:00
from pydantic import BaseModel, ConfigDict
from sqlalchemy import BigInteger, Column, String, Text, JSON
log = logging.getLogger(__name__)
log.setLevel(SRC_LOG_LEVELS["MODELS"])
####################
2024-10-02 05:45:04 +00:00
# Knowledge DB Schema
2024-10-02 00:35:35 +00:00
####################
2024-10-02 05:45:04 +00:00
class Knowledge(Base):
__tablename__ = "knowledge"
2024-10-02 00:35:35 +00:00
id = Column(Text, unique=True, primary_key=True)
user_id = Column(Text)
name = Column(Text)
description = Column(Text)
data = Column(JSON, nullable=True)
meta = Column(JSON, nullable=True)
created_at = Column(BigInteger)
updated_at = Column(BigInteger)
2024-10-02 05:45:04 +00:00
class KnowledgeModel(BaseModel):
2024-10-02 00:35:35 +00:00
model_config = ConfigDict(from_attributes=True)
id: str
user_id: str
name: str
description: str
data: Optional[dict] = None
meta: Optional[dict] = None
created_at: int # timestamp in epoch
updated_at: int # timestamp in epoch
####################
# Forms
####################
2024-10-02 05:45:04 +00:00
class KnowledgeResponse(BaseModel):
2024-10-02 00:35:35 +00:00
id: str
name: str
description: str
data: Optional[dict] = None
meta: Optional[dict] = None
created_at: int # timestamp in epoch
updated_at: int # timestamp in epoch
files: Optional[list[FileMetadataResponse | dict]] = None
2024-10-02 00:35:35 +00:00
2024-10-02 05:45:04 +00:00
class KnowledgeForm(BaseModel):
2024-10-02 00:35:35 +00:00
name: str
description: str
data: Optional[dict] = None
2024-10-03 03:42:10 +00:00
class KnowledgeUpdateForm(BaseModel):
name: Optional[str] = None
description: Optional[str] = None
data: Optional[dict] = None
2024-10-02 05:45:04 +00:00
class KnowledgeTable:
def insert_new_knowledge(
self, user_id: str, form_data: KnowledgeForm
) -> Optional[KnowledgeModel]:
2024-10-02 00:35:35 +00:00
with get_db() as db:
2024-10-02 05:45:04 +00:00
knowledge = KnowledgeModel(
2024-10-02 00:35:35 +00:00
**{
**form_data.model_dump(),
2024-10-02 04:32:59 +00:00
"id": str(uuid.uuid4()),
2024-10-02 00:35:35 +00:00
"user_id": user_id,
"created_at": int(time.time()),
"updated_at": int(time.time()),
}
)
try:
2024-10-02 05:45:04 +00:00
result = Knowledge(**knowledge.model_dump())
2024-10-02 00:35:35 +00:00
db.add(result)
db.commit()
db.refresh(result)
if result:
2024-10-02 05:45:04 +00:00
return KnowledgeModel.model_validate(result)
2024-10-02 00:35:35 +00:00
else:
return None
except Exception:
return None
2024-10-02 05:45:04 +00:00
def get_knowledge_items(self) -> list[KnowledgeModel]:
2024-10-02 00:35:35 +00:00
with get_db() as db:
return [
2024-10-02 05:45:04 +00:00
KnowledgeModel.model_validate(knowledge)
for knowledge in db.query(Knowledge)
.order_by(Knowledge.updated_at.desc())
2024-10-02 04:35:18 +00:00
.all()
2024-10-02 00:35:35 +00:00
]
2024-10-02 05:45:04 +00:00
def get_knowledge_by_id(self, id: str) -> Optional[KnowledgeModel]:
2024-10-02 00:35:35 +00:00
try:
with get_db() as db:
2024-10-02 05:45:04 +00:00
knowledge = db.query(Knowledge).filter_by(id=id).first()
return KnowledgeModel.model_validate(knowledge) if knowledge else None
2024-10-02 00:35:35 +00:00
except Exception:
return None
2024-10-02 05:45:04 +00:00
def update_knowledge_by_id(
2024-10-03 03:42:10 +00:00
self, id: str, form_data: KnowledgeUpdateForm, overwrite: bool = False
2024-10-02 05:45:04 +00:00
) -> Optional[KnowledgeModel]:
2024-10-02 00:35:35 +00:00
try:
with get_db() as db:
2024-10-03 13:46:20 +00:00
knowledge = self.get_knowledge_by_id(id=id)
2024-10-02 05:45:04 +00:00
db.query(Knowledge).filter_by(id=id).update(
2024-10-02 00:35:35 +00:00
{
2024-10-03 13:46:20 +00:00
**form_data.model_dump(exclude_none=True),
2024-10-03 03:42:10 +00:00
"updated_at": int(time.time()),
2024-10-02 00:35:35 +00:00
}
)
db.commit()
2024-10-03 03:42:10 +00:00
return self.get_knowledge_by_id(id=id)
2024-10-02 00:35:35 +00:00
except Exception as e:
log.exception(e)
return None
2024-10-02 05:45:04 +00:00
def delete_knowledge_by_id(self, id: str) -> bool:
2024-10-02 00:35:35 +00:00
try:
with get_db() as db:
2024-10-02 05:45:04 +00:00
db.query(Knowledge).filter_by(id=id).delete()
2024-10-02 00:35:35 +00:00
db.commit()
return True
except Exception:
return False
2024-10-02 05:45:04 +00:00
Knowledges = KnowledgeTable()