|
@@ -9,6 +9,7 @@ import io.legado.app.domain.gateway.AiStreamEvent
|
|
|
import io.legado.app.domain.model.AiGenerateRequest
|
|
import io.legado.app.domain.model.AiGenerateRequest
|
|
|
import io.legado.app.domain.model.AiMessage
|
|
import io.legado.app.domain.model.AiMessage
|
|
|
import io.legado.app.domain.model.AiMessageRole
|
|
import io.legado.app.domain.model.AiMessageRole
|
|
|
|
|
+import io.legado.app.domain.model.AiReasoningLevel
|
|
|
import io.legado.app.domain.model.AiTaskPresetConfig
|
|
import io.legado.app.domain.model.AiTaskPresetConfig
|
|
|
import io.legado.app.domain.model.AiTaskType
|
|
import io.legado.app.domain.model.AiTaskType
|
|
|
import io.legado.app.domain.model.AiToolContext
|
|
import io.legado.app.domain.model.AiToolContext
|
|
@@ -46,6 +47,7 @@ class GenerateChapterSummaryUseCase(
|
|
|
bookChapter: BookChapter,
|
|
bookChapter: BookChapter,
|
|
|
contentOverride: String? = null,
|
|
contentOverride: String? = null,
|
|
|
maxCharsPerChunk: Int = DEFAULT_MAX_CHARS_PER_CHUNK,
|
|
maxCharsPerChunk: Int = DEFAULT_MAX_CHARS_PER_CHUNK,
|
|
|
|
|
+ reasoningLevel: AiReasoningLevel = AiReasoningLevel.AUTO,
|
|
|
): String {
|
|
): String {
|
|
|
val content = contentOverride ?: BookHelp.getContent(book, bookChapter)
|
|
val content = contentOverride ?: BookHelp.getContent(book, bookChapter)
|
|
|
?: error("Failed to read chapter content")
|
|
?: error("Failed to read chapter content")
|
|
@@ -68,7 +70,13 @@ class GenerateChapterSummaryUseCase(
|
|
|
)
|
|
)
|
|
|
return aiTaskManager.submit(artifact) {
|
|
return aiTaskManager.submit(artifact) {
|
|
|
var summary = ""
|
|
var summary = ""
|
|
|
- executeStream(book, bookChapter, content, maxCharsPerChunk).collect { event ->
|
|
|
|
|
|
|
+ executeStream(
|
|
|
|
|
+ book,
|
|
|
|
|
+ bookChapter,
|
|
|
|
|
+ content,
|
|
|
|
|
+ maxCharsPerChunk,
|
|
|
|
|
+ reasoningLevel
|
|
|
|
|
+ ).collect { event ->
|
|
|
when (event) {
|
|
when (event) {
|
|
|
is StreamEvent.Content -> appendContent(event.text)
|
|
is StreamEvent.Content -> appendContent(event.text)
|
|
|
is StreamEvent.Reasoning -> appendReasoning(event.text)
|
|
is StreamEvent.Reasoning -> appendReasoning(event.text)
|
|
@@ -83,7 +91,8 @@ class GenerateChapterSummaryUseCase(
|
|
|
book: Book,
|
|
book: Book,
|
|
|
bookChapter: BookChapter,
|
|
bookChapter: BookChapter,
|
|
|
contentOverride: String? = null,
|
|
contentOverride: String? = null,
|
|
|
- maxCharsPerChunk: Int = DEFAULT_MAX_CHARS_PER_CHUNK
|
|
|
|
|
|
|
+ maxCharsPerChunk: Int = DEFAULT_MAX_CHARS_PER_CHUNK,
|
|
|
|
|
+ reasoningLevel: AiReasoningLevel = AiReasoningLevel.AUTO,
|
|
|
): Result<String> = withContext(Dispatchers.IO) {
|
|
): Result<String> = withContext(Dispatchers.IO) {
|
|
|
runCatching {
|
|
runCatching {
|
|
|
val content = contentOverride ?: BookHelp.getContent(book, bookChapter)
|
|
val content = contentOverride ?: BookHelp.getContent(book, bookChapter)
|
|
@@ -111,6 +120,7 @@ class GenerateChapterSummaryUseCase(
|
|
|
preset = preset,
|
|
preset = preset,
|
|
|
userContent = "Chapter title: ${bookChapter.title}\n\nText:\n${chunk.content}",
|
|
userContent = "Chapter title: ${bookChapter.title}\n\nText:\n${chunk.content}",
|
|
|
toolContext = toolContext,
|
|
toolContext = toolContext,
|
|
|
|
|
+ reasoningLevel = reasoningLevel,
|
|
|
)
|
|
)
|
|
|
}
|
|
}
|
|
|
val summary = if (partialSummaries.size == 1) {
|
|
val summary = if (partialSummaries.size == 1) {
|
|
@@ -120,6 +130,7 @@ class GenerateChapterSummaryUseCase(
|
|
|
preset = preset,
|
|
preset = preset,
|
|
|
userContent = "Merge these partial summaries into one chapter summary:\n\n${partialSummaries.joinToString("\n\n")}",
|
|
userContent = "Merge these partial summaries into one chapter summary:\n\n${partialSummaries.joinToString("\n\n")}",
|
|
|
toolContext = toolContext,
|
|
toolContext = toolContext,
|
|
|
|
|
+ reasoningLevel = reasoningLevel,
|
|
|
)
|
|
)
|
|
|
}
|
|
}
|
|
|
val now = System.currentTimeMillis()
|
|
val now = System.currentTimeMillis()
|
|
@@ -148,7 +159,8 @@ class GenerateChapterSummaryUseCase(
|
|
|
book: Book,
|
|
book: Book,
|
|
|
bookChapter: BookChapter,
|
|
bookChapter: BookChapter,
|
|
|
contentOverride: String? = null,
|
|
contentOverride: String? = null,
|
|
|
- maxCharsPerChunk: Int = DEFAULT_MAX_CHARS_PER_CHUNK
|
|
|
|
|
|
|
+ maxCharsPerChunk: Int = DEFAULT_MAX_CHARS_PER_CHUNK,
|
|
|
|
|
+ reasoningLevel: AiReasoningLevel = AiReasoningLevel.AUTO,
|
|
|
): Flow<StreamEvent> = flow {
|
|
): Flow<StreamEvent> = flow {
|
|
|
val content = contentOverride ?: BookHelp.getContent(book, bookChapter)
|
|
val content = contentOverride ?: BookHelp.getContent(book, bookChapter)
|
|
|
?: error("Failed to read chapter content")
|
|
?: error("Failed to read chapter content")
|
|
@@ -184,6 +196,7 @@ class GenerateChapterSummaryUseCase(
|
|
|
outputBuilder = summaryBuilder,
|
|
outputBuilder = summaryBuilder,
|
|
|
reasoningBuilder = reasoningBuilder,
|
|
reasoningBuilder = reasoningBuilder,
|
|
|
emitEvent = { emit(it) },
|
|
emitEvent = { emit(it) },
|
|
|
|
|
+ reasoningLevel = reasoningLevel,
|
|
|
)
|
|
)
|
|
|
} else {
|
|
} else {
|
|
|
val partialSummaries = chunks.map { chunk ->
|
|
val partialSummaries = chunks.map { chunk ->
|
|
@@ -191,6 +204,7 @@ class GenerateChapterSummaryUseCase(
|
|
|
preset = preset,
|
|
preset = preset,
|
|
|
userContent = "Chapter title: ${bookChapter.title}\n\nText:\n${chunk.content}",
|
|
userContent = "Chapter title: ${bookChapter.title}\n\nText:\n${chunk.content}",
|
|
|
toolContext = toolContext,
|
|
toolContext = toolContext,
|
|
|
|
|
+ reasoningLevel = reasoningLevel,
|
|
|
)
|
|
)
|
|
|
}
|
|
}
|
|
|
collectGenerateStream(
|
|
collectGenerateStream(
|
|
@@ -200,6 +214,7 @@ class GenerateChapterSummaryUseCase(
|
|
|
outputBuilder = summaryBuilder,
|
|
outputBuilder = summaryBuilder,
|
|
|
reasoningBuilder = reasoningBuilder,
|
|
reasoningBuilder = reasoningBuilder,
|
|
|
emitEvent = { emit(it) },
|
|
emitEvent = { emit(it) },
|
|
|
|
|
+ reasoningLevel = reasoningLevel,
|
|
|
)
|
|
)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -233,6 +248,7 @@ class GenerateChapterSummaryUseCase(
|
|
|
preset: AiTaskPresetConfig,
|
|
preset: AiTaskPresetConfig,
|
|
|
userContent: String,
|
|
userContent: String,
|
|
|
toolContext: AiToolContext,
|
|
toolContext: AiToolContext,
|
|
|
|
|
+ reasoningLevel: AiReasoningLevel = AiReasoningLevel.AUTO,
|
|
|
): String {
|
|
): String {
|
|
|
return aiToolAwareGenerationUseCase.generate(
|
|
return aiToolAwareGenerationUseCase.generate(
|
|
|
AiGenerateRequest(
|
|
AiGenerateRequest(
|
|
@@ -241,7 +257,10 @@ class GenerateChapterSummaryUseCase(
|
|
|
AiMessage(AiMessageRole.SYSTEM, preset.promptTemplate),
|
|
AiMessage(AiMessageRole.SYSTEM, preset.promptTemplate),
|
|
|
AiMessage(AiMessageRole.USER, userContent)
|
|
AiMessage(AiMessageRole.USER, userContent)
|
|
|
),
|
|
),
|
|
|
- params = preset.params,
|
|
|
|
|
|
|
+ params = preset.params.copy(
|
|
|
|
|
+ reasoningLevel = reasoningLevel.takeUnless { it == AiReasoningLevel.AUTO }
|
|
|
|
|
+ ?: preset.params.reasoningLevel,
|
|
|
|
|
+ ),
|
|
|
toolContext = toolContext,
|
|
toolContext = toolContext,
|
|
|
)
|
|
)
|
|
|
)
|
|
)
|
|
@@ -254,6 +273,7 @@ class GenerateChapterSummaryUseCase(
|
|
|
outputBuilder: StringBuilder,
|
|
outputBuilder: StringBuilder,
|
|
|
reasoningBuilder: StringBuilder,
|
|
reasoningBuilder: StringBuilder,
|
|
|
emitEvent: suspend (StreamEvent) -> Unit,
|
|
emitEvent: suspend (StreamEvent) -> Unit,
|
|
|
|
|
+ reasoningLevel: AiReasoningLevel,
|
|
|
) {
|
|
) {
|
|
|
aiToolAwareGenerationUseCase.generateStream(
|
|
aiToolAwareGenerationUseCase.generateStream(
|
|
|
AiGenerateRequest(
|
|
AiGenerateRequest(
|
|
@@ -262,7 +282,10 @@ class GenerateChapterSummaryUseCase(
|
|
|
AiMessage(AiMessageRole.SYSTEM, preset.promptTemplate),
|
|
AiMessage(AiMessageRole.SYSTEM, preset.promptTemplate),
|
|
|
AiMessage(AiMessageRole.USER, userContent)
|
|
AiMessage(AiMessageRole.USER, userContent)
|
|
|
),
|
|
),
|
|
|
- params = preset.params,
|
|
|
|
|
|
|
+ params = preset.params.copy(
|
|
|
|
|
+ reasoningLevel = reasoningLevel.takeUnless { it == AiReasoningLevel.AUTO }
|
|
|
|
|
+ ?: preset.params.reasoningLevel,
|
|
|
|
|
+ ),
|
|
|
toolContext = toolContext,
|
|
toolContext = toolContext,
|
|
|
)
|
|
)
|
|
|
).collect { event ->
|
|
).collect { event ->
|