feat: add violence and eroticism level parameters to synopsis and script generation requests

This commit is contained in:
2026-03-13 13:36:55 +08:00
parent 0d63d0e6d1
commit 0a12f204ba
6 changed files with 129 additions and 11 deletions

View File

@@ -8,6 +8,8 @@ export interface SynopsisGenerationRequest {
conflict_scale?: string
num_characters?: number
num_chapters?: number
violence_level?: number
eroticism_level?: number
}
export interface ScriptGenerationRequest {
@@ -18,6 +20,8 @@ export interface ScriptGenerationRequest {
style?: string
num_characters?: number
num_chapters?: number
violence_level?: number
eroticism_level?: number
}
export interface AudiobookProject {
@@ -86,6 +90,8 @@ export interface NsfwSynopsisGenerationRequest {
conflict_scale?: string
num_characters?: number
num_chapters?: number
violence_level?: number
eroticism_level?: number
}
export interface NsfwScriptGenerationRequest {
@@ -96,6 +102,8 @@ export interface NsfwScriptGenerationRequest {
style?: string
num_characters?: number
num_chapters?: number
violence_level?: number
eroticism_level?: number
}
export const audiobookApi = {

View File

@@ -526,6 +526,8 @@ function AIScriptDialog({ open, onClose, onCreated }: { open: boolean; onClose:
const [conflictScale, setConflictScale] = useState('')
const [numCharacters, setNumCharacters] = useState(5)
const [numChapters, setNumChapters] = useState(8)
const [violenceLevel, setViolenceLevel] = useState(0)
const [eroticismLevel, setEroticismLevel] = useState(0)
const [synopsis, setSynopsis] = useState('')
const [generatingSynopsis, setGeneratingSynopsis] = useState(false)
const [loading, setLoading] = useState(false)
@@ -536,7 +538,7 @@ function AIScriptDialog({ open, onClose, onCreated }: { open: boolean; onClose:
const reset = () => {
setTitle(''); setGenre(''); setSubgenre(''); setProtagonistType(''); setTone('')
setConflictScale(''); setNumCharacters(5); setNumChapters(8); setSynopsis('')
setConflictScale(''); setNumCharacters(5); setNumChapters(8); setViolenceLevel(0); setEroticismLevel(0); setSynopsis('')
}
const handleGenreSelect = (g: string) => {
@@ -558,6 +560,8 @@ function AIScriptDialog({ open, onClose, onCreated }: { open: boolean; onClose:
conflict_scale: conflictScale,
num_characters: numCharacters,
num_chapters: numChapters,
violence_level: violenceLevel,
eroticism_level: eroticismLevel,
})
setSynopsis(result)
} catch (e: any) {
@@ -580,6 +584,8 @@ function AIScriptDialog({ open, onClose, onCreated }: { open: boolean; onClose:
style: tone,
num_characters: numCharacters,
num_chapters: numChapters,
violence_level: violenceLevel,
eroticism_level: eroticismLevel,
} as ScriptGenerationRequest)
toast.success('AI剧本生成任务已创建')
reset()
@@ -664,6 +670,17 @@ function AIScriptDialog({ open, onClose, onCreated }: { open: boolean; onClose:
</label>
</div>
<div className="flex gap-3">
<label className="flex-1 flex flex-col gap-1 text-sm">
<span className="text-muted-foreground text-xs">{violenceLevel}/10</span>
<input type="range" min={0} max={10} step={1} value={violenceLevel} onChange={e => setViolenceLevel(Number(e.target.value))} className="w-full accent-red-500" />
</label>
<label className="flex-1 flex flex-col gap-1 text-sm">
<span className="text-muted-foreground text-xs">{eroticismLevel}/10</span>
<input type="range" min={0} max={10} step={1} value={eroticismLevel} onChange={e => setEroticismLevel(Number(e.target.value))} className="w-full accent-pink-500" />
</label>
</div>
<div className="flex justify-end">
<Button size="sm" variant="outline" onClick={handleGenerateSynopsis} disabled={!genre || generatingSynopsis}>
{generatingSynopsis ? <Loader2 className="h-3 w-3 animate-spin mr-1" /> : null}
@@ -757,6 +774,8 @@ function NSFWScriptDialog({ open, onClose, onCreated }: { open: boolean; onClose
const [conflictScale, setConflictScale] = useState('')
const [numCharacters, setNumCharacters] = useState(5)
const [numChapters, setNumChapters] = useState(8)
const [violenceLevel, setViolenceLevel] = useState(0)
const [eroticismLevel, setEroticismLevel] = useState(5)
const [synopsis, setSynopsis] = useState('')
const [generatingSynopsis, setGeneratingSynopsis] = useState(false)
const [loading, setLoading] = useState(false)
@@ -767,7 +786,7 @@ function NSFWScriptDialog({ open, onClose, onCreated }: { open: boolean; onClose
const reset = () => {
setTitle(''); setGenre(''); setSubgenre(''); setProtagonistType(''); setTone('')
setConflictScale(''); setNumCharacters(5); setNumChapters(8); setSynopsis('')
setConflictScale(''); setNumCharacters(5); setNumChapters(8); setViolenceLevel(0); setEroticismLevel(5); setSynopsis('')
}
const handleGenreSelect = (g: string) => {
@@ -789,6 +808,8 @@ function NSFWScriptDialog({ open, onClose, onCreated }: { open: boolean; onClose
conflict_scale: conflictScale,
num_characters: numCharacters,
num_chapters: numChapters,
violence_level: violenceLevel,
eroticism_level: eroticismLevel,
})
setSynopsis(result)
} catch (e: any) {
@@ -811,6 +832,8 @@ function NSFWScriptDialog({ open, onClose, onCreated }: { open: boolean; onClose
style: tone,
num_characters: numCharacters,
num_chapters: numChapters,
violence_level: violenceLevel,
eroticism_level: eroticismLevel,
} as NsfwScriptGenerationRequest)
toast.success('NSFW剧本生成任务已创建')
reset()
@@ -898,6 +921,17 @@ function NSFWScriptDialog({ open, onClose, onCreated }: { open: boolean; onClose
</label>
</div>
<div className="flex gap-3">
<label className="flex-1 flex flex-col gap-1 text-sm">
<span className="text-muted-foreground text-xs">{violenceLevel}/10</span>
<input type="range" min={0} max={10} step={1} value={violenceLevel} onChange={e => setViolenceLevel(Number(e.target.value))} className="w-full accent-red-500" />
</label>
<label className="flex-1 flex flex-col gap-1 text-sm">
<span className="text-muted-foreground text-xs">{eroticismLevel}/10</span>
<input type="range" min={0} max={10} step={1} value={eroticismLevel} onChange={e => setEroticismLevel(Number(e.target.value))} className="w-full accent-pink-500" />
</label>
</div>
<div className="flex justify-end">
<Button size="sm" variant="outline" onClick={handleGenerateSynopsis} disabled={!genre || generatingSynopsis}>
{generatingSynopsis ? <Loader2 className="h-3 w-3 animate-spin mr-1" /> : null}