feat:增加知识库数据接口

This commit is contained in:
2026-07-28 19:54:50 +08:00
parent 2e6e571973
commit 0e9bde9a14
19 changed files with 703 additions and 31 deletions

21
service/agent_service.py Normal file
View File

@@ -0,0 +1,21 @@
from langchain_core.messages import AIMessageChunk, HumanMessage
from agent.study import study_agent
from schemas.agent import QueryRequest
def query_agent(query: QueryRequest):
try:
user_msg = f"学习内容:\n{query.message}"
# 流式调用Agent
for chunk, metadata in study_agent.stream(
{"messages": [HumanMessage(content=user_msg)]},
stream_mode="messages"
):
if isinstance(chunk, AIMessageChunk):
if isinstance(chunk, AIMessageChunk) and chunk.content:
yield chunk.content
except Exception as e:
print(f"\n[错误]: {str(e)}")
yield "信息检索失败,请重新输入问题提问"

View File

@@ -0,0 +1,85 @@
from sqlalchemy import select
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.orm import selectinload
from models.library import LibraryFile, LibraryFileQuestion
from schemas.library import LibraryFileRequest, LibraryFileResponse, QuestionResponse
async def add_file(db: AsyncSession, data: LibraryFileRequest) -> bool:
"""
创建题库文件及其题目
"""
file = LibraryFile(
subject=data.subject,
module=data.module,
name=data.name,
size=data.size,
type=data.type
)
db.add(file)
await db.flush()
for q in data.questions:
question = LibraryFileQuestion(
library_file_id=file.id,
type=q.type,
question=q.question,
options=q.options,
answer=q.answer
)
db.add(question)
await db.commit()
return True
async def get_file(db: AsyncSession, file_id: int) -> LibraryFileResponse:
stmt = (
select(LibraryFile)
.options(selectinload(LibraryFile.questions))
.where(LibraryFile.id == file_id)
)
result = await db.execute(stmt)
file = result.scalar_one_or_none()
return LibraryFileResponse(
id=file.id,
subject=file.subject,
module=file.module,
name=file.name,
type=file.type,
size=file.size,
uploadTime=file.create_time.strftime("%Y-%m-%d %H:%M:%S"),
questions=[
QuestionResponse(
id=q.id,
type=q.type,
question=q.question,
options=q.options,
answer=q.answer,
)
for q in file.questions
],
)
async def list_files(db: AsyncSession) -> list[LibraryFileResponse]:
stmt = select(LibraryFile).order_by(LibraryFile.create_time.desc())
files = (await db.execute(stmt)).scalars().all()
return [
LibraryFileResponse(
id=f.id,
subject=f.subject,
module=f.module,
name=f.name,
type=f.type,
size=f.size,
uploadTime=f.create_time.strftime("%Y-%m-%d %H:%M:%S"),
questions=[],
)
for f in files
]