Files
ai-novel-studio/server/utils/context.ts
T
jocay 3c9b65d982 AI 小说工坊:主编 + 作家多模型协作写作应用
- Nuxt 4 + Nuxt UI 4 + AI SDK 7 + Drizzle/SQLite
- 主编规划大纲与章节简报、选派作家;作家流式写入章节文件并实时推送前端
- 逐章确认模式(默认)与自动模式;摘要与故事记忆
- 酒馆角色卡(PNG/JSON,V1-V3)与世界书导入
- 自定义最高优先级系统提示词、审稿/修改/多版本、任务日志与提示词检视
- 模拟 LLM 服务与端到端测试脚本

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 02:04:40 +08:00

59 lines
2.8 KiB
TypeScript

import { and, asc, eq } from 'drizzle-orm'
export type ProjectRow = typeof tables.projects.$inferSelect
export type CharacterRow = typeof tables.characters.$inferSelect
export type LoreRow = typeof tables.loreEntries.$inferSelect
export type AgentRow = typeof tables.agents.$inferSelect
export type ChapterRow = typeof tables.chapters.$inferSelect
export type VersionRow = typeof tables.chapterVersions.$inferSelect
export type ModelRow = typeof tables.models.$inferSelect
export function getProject(projectId: string): ProjectRow {
const p = useDb().select().from(tables.projects).where(eq(tables.projects.id, projectId)).get()
if (!p) throw createError({ statusCode: 404, message: '项目不存在' })
return p
}
export function getChapter(chapterId: string): ChapterRow {
const c = useDb().select().from(tables.chapters).where(eq(tables.chapters.id, chapterId)).get()
if (!c) throw createError({ statusCode: 404, message: '章节不存在' })
return c
}
export function getAgent(agentId: string | null | undefined): AgentRow | undefined {
if (!agentId) return undefined
return useDb().select().from(tables.agents).where(eq(tables.agents.id, agentId)).get()
}
export function getRoleAgent(projectId: string, role: 'editor' | 'summarizer'): AgentRow | undefined {
return useDb().select().from(tables.agents)
.where(and(eq(tables.agents.projectId, projectId), eq(tables.agents.role, role)))
.get()
}
export function listChapters(projectId: string) {
return useDb().select().from(tables.chapters).where(eq(tables.chapters.projectId, projectId)).orderBy(asc(tables.chapters.index)).all()
}
export function getVersion(versionId: string | null | undefined): VersionRow | undefined {
if (!versionId) return undefined
return useDb().select().from(tables.chapterVersions).where(eq(tables.chapterVersions.id, versionId)).get()
}
/** 一次性加载生成提示词所需的全部项目数据 */
export function loadProjectContext(projectId: string) {
const db = useDb()
const project = getProject(projectId)
return {
project,
characters: db.select().from(tables.characters).where(eq(tables.characters.projectId, projectId)).orderBy(asc(tables.characters.sortOrder), asc(tables.characters.createdAt)).all(),
lore: db.select().from(tables.loreEntries).where(eq(tables.loreEntries.projectId, projectId)).orderBy(asc(tables.loreEntries.sortOrder)).all(),
agents: db.select().from(tables.agents).where(eq(tables.agents.projectId, projectId)).orderBy(asc(tables.agents.createdAt)).all(),
chapters: listChapters(projectId),
models: db.select({ id: tables.models.id, label: tables.models.label, modelId: tables.models.modelId, providerName: tables.providers.name })
.from(tables.models).innerJoin(tables.providers, eq(tables.models.providerId, tables.providers.id)).all()
}
}
export type ProjectContext = ReturnType<typeof loadProjectContext>