knowledge.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. import json
  2. from typing import Optional, Union
  3. from pydantic import BaseModel
  4. from fastapi import APIRouter, Depends, HTTPException, status
  5. from open_webui.apps.webui.models.knowledge import (
  6. Knowledges,
  7. KnowledgeUpdateForm,
  8. KnowledgeForm,
  9. KnowledgeResponse,
  10. )
  11. from open_webui.apps.webui.models.files import Files, FileModel
  12. from open_webui.constants import ERROR_MESSAGES
  13. from open_webui.utils.utils import get_admin_user, get_verified_user
  14. router = APIRouter()
  15. ############################
  16. # GetKnowledgeItems
  17. ############################
  18. @router.get(
  19. "/", response_model=Optional[Union[list[KnowledgeResponse], KnowledgeResponse]]
  20. )
  21. async def get_knowledge_items(
  22. id: Optional[str] = None, user=Depends(get_verified_user)
  23. ):
  24. if id:
  25. knowledge = Knowledges.get_knowledge_by_id(id=id)
  26. if knowledge:
  27. return knowledge
  28. else:
  29. raise HTTPException(
  30. status_code=status.HTTP_401_UNAUTHORIZED,
  31. detail=ERROR_MESSAGES.NOT_FOUND,
  32. )
  33. else:
  34. return [
  35. KnowledgeResponse(**knowledge.model_dump())
  36. for knowledge in Knowledges.get_knowledge_items()
  37. ]
  38. ############################
  39. # CreateNewKnowledge
  40. ############################
  41. @router.post("/create", response_model=Optional[KnowledgeResponse])
  42. async def create_new_knowledge(form_data: KnowledgeForm, user=Depends(get_admin_user)):
  43. knowledge = Knowledges.insert_new_knowledge(user.id, form_data)
  44. if knowledge:
  45. return knowledge
  46. else:
  47. raise HTTPException(
  48. status_code=status.HTTP_400_BAD_REQUEST,
  49. detail=ERROR_MESSAGES.FILE_EXISTS,
  50. )
  51. ############################
  52. # GetKnowledgeById
  53. ############################
  54. class KnowledgeFilesResponse(KnowledgeResponse):
  55. files: list[FileModel]
  56. @router.get("/{id}", response_model=Optional[KnowledgeFilesResponse])
  57. async def get_knowledge_by_id(id: str, user=Depends(get_verified_user)):
  58. knowledge = Knowledges.get_knowledge_by_id(id=id)
  59. if knowledge:
  60. file_ids = knowledge.data.get("file_ids", []) if knowledge.data else []
  61. files = Files.get_files_by_ids(file_ids)
  62. return KnowledgeFilesResponse(
  63. **knowledge.model_dump(),
  64. files=files,
  65. )
  66. else:
  67. raise HTTPException(
  68. status_code=status.HTTP_401_UNAUTHORIZED,
  69. detail=ERROR_MESSAGES.NOT_FOUND,
  70. )
  71. ############################
  72. # UpdateKnowledgeById
  73. ############################
  74. @router.post("/{id}/update", response_model=Optional[KnowledgeResponse])
  75. async def update_knowledge_by_id(
  76. id: str,
  77. form_data: KnowledgeUpdateForm,
  78. user=Depends(get_admin_user),
  79. ):
  80. knowledge = Knowledges.update_knowledge_by_id(id=id, form_data=form_data)
  81. if knowledge:
  82. return knowledge
  83. else:
  84. raise HTTPException(
  85. status_code=status.HTTP_400_BAD_REQUEST,
  86. detail=ERROR_MESSAGES.ID_TAKEN,
  87. )
  88. ############################
  89. # DeleteKnowledgeById
  90. ############################
  91. @router.delete("/{id}/delete", response_model=bool)
  92. async def delete_knowledge_by_id(id: str, user=Depends(get_admin_user)):
  93. result = Knowledges.delete_knowledge_by_id(id=id)
  94. return result