feat: add violence and eroticism level parameters to synopsis and script generation requests
This commit is contained in:
@@ -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 = {
|
||||
|
||||
@@ -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}
|
||||
|
||||
Reference in New Issue
Block a user