|
|
@@ -27,7 +27,7 @@ import { StructuredOutputParser } from 'langchain/output_parsers'
|
|
|
import { z } from 'zod'
|
|
|
import { UpdateGameDto } from './dto/update-game.dto'
|
|
|
import { encoding_for_model } from 'tiktoken'
|
|
|
-import { startOfDay, getHours, format, addDays, differenceInSeconds, addMinutes } from 'date-fns'
|
|
|
+import { startOfDay, getHours, format, addDays, differenceInSeconds, addMinutes, differenceInDays } from 'date-fns'
|
|
|
import { zhCN } from 'date-fns/locale'
|
|
|
import { GameStatus } from './enums/game-status.enum'
|
|
|
import dedent from 'dedent'
|
|
|
@@ -452,7 +452,12 @@ export class GameService implements OnModuleInit {
|
|
|
: ''
|
|
|
})
|
|
|
|
|
|
- const response = await this.callLLM([new HumanMessage(input)])
|
|
|
+ const vars = {
|
|
|
+ days: Math.floor(differenceInDays(date, history[0].date)),
|
|
|
+ charactors: charactors
|
|
|
+ }
|
|
|
+
|
|
|
+ const response = await this.callLLM([new HumanMessage(this.evalPrompt(vars, input))])
|
|
|
plot = response.content
|
|
|
|
|
|
this.send(`${id}`, {
|
|
|
@@ -488,7 +493,7 @@ export class GameService implements OnModuleInit {
|
|
|
|
|
|
options = (
|
|
|
await Promise.all([
|
|
|
- this.createOptions(game.type, charactors, `${summary}\n\n${formatedDatatime}\n${plot}`),
|
|
|
+ this.createOptions(game.type, charactors, `${summary}\n\n${formatedDatatime}\n${plot}`, vars),
|
|
|
delay
|
|
|
])
|
|
|
)[0]
|
|
|
@@ -535,7 +540,11 @@ export class GameService implements OnModuleInit {
|
|
|
const run = game.status === GameStatus.Running
|
|
|
return await this.end(id).then((res) => {
|
|
|
if (game.autoReset) {
|
|
|
- this.resetGame(id, run)
|
|
|
+ this.sysConfig.getNumber('reset_delay', 0).then((resetDelay) => {
|
|
|
+ setTimeout(resetDelay * 1000).then(() => {
|
|
|
+ this.resetGame(id, run)
|
|
|
+ })
|
|
|
+ })
|
|
|
}
|
|
|
return res
|
|
|
})
|
|
|
@@ -634,15 +643,13 @@ export class GameService implements OnModuleInit {
|
|
|
lastState: undefined
|
|
|
})
|
|
|
)
|
|
|
- const resetDelay = await this.sysConfig.getNumber('reset_delay', 0)
|
|
|
- setTimeout(resetDelay * 1000).then(() => {
|
|
|
- this.send(`${game.id}`, {
|
|
|
- type: 'reset',
|
|
|
- data: {
|
|
|
- newGameId: newGame.id,
|
|
|
- firstState: newState
|
|
|
- }
|
|
|
- })
|
|
|
+
|
|
|
+ this.send(`${game.id}`, {
|
|
|
+ type: 'reset',
|
|
|
+ data: {
|
|
|
+ newGameId: newGame.id,
|
|
|
+ firstState: newState
|
|
|
+ }
|
|
|
})
|
|
|
|
|
|
await this.gameRepository.update(newGame.id, { currentState: newState.id })
|
|
|
@@ -769,7 +776,7 @@ export class GameService implements OnModuleInit {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- async createOptions(type: string, charactors: Charactor[], summary: string) {
|
|
|
+ async createOptions(type: string, charactors: Charactor[], summary: string, vars) {
|
|
|
for (let i = 0; i < 5; i++) {
|
|
|
try {
|
|
|
if (i > 0) await setTimeout(1000)
|
|
|
@@ -801,7 +808,7 @@ export class GameService implements OnModuleInit {
|
|
|
.join('\n'),
|
|
|
summary
|
|
|
})
|
|
|
- const response = await this.callLLM([new HumanMessage(input)])
|
|
|
+ const response = await this.callLLM([new HumanMessage(this.evalPrompt(vars, input))])
|
|
|
const output = await parser.parse(response.content.replace('+', '').replace("'", '"'))
|
|
|
return output.map((i) => {
|
|
|
i.modifyHp = i.modifyHp.filter(
|
|
|
@@ -1036,4 +1043,31 @@ export class GameService implements OnModuleInit {
|
|
|
}
|
|
|
return rank
|
|
|
}
|
|
|
+
|
|
|
+ evalPrompt(vars, template) {
|
|
|
+ vars.total = vars.charactors.length
|
|
|
+ vars.alive = vars.charactors.filter((i) => !i.dead).length
|
|
|
+ vars.dead = vars.charactors.filter((i) => i.dead).length
|
|
|
+ const hps = vars.charactors.filter((i) => i.hp > 0).map((i) => i.hp)
|
|
|
+ vars.minHp = hps.length > 0 ? Math.min(...hps) : 0
|
|
|
+ vars.maxHp = hps.length > 0 ? Math.max(...hps) : 0
|
|
|
+ vars.avgHp = hps.length > 0 ? hps.reduce((a, b) => a + b) / hps.length : 0
|
|
|
+ const reg = /<%([^%]*(?:%(?!>)[^%]*)*)%>/
|
|
|
+ while (reg.test(template)) {
|
|
|
+ template = template.replace(reg, function (match, $1) {
|
|
|
+ var func = new Function('days', 'charactors', 'total', 'alive', 'dead', 'minHp', 'maxHp', 'avgHp', $1)
|
|
|
+ return func(
|
|
|
+ vars.days,
|
|
|
+ vars.charactors,
|
|
|
+ vars.total,
|
|
|
+ vars.alive,
|
|
|
+ vars.dead,
|
|
|
+ vars.minHp,
|
|
|
+ vars.maxHp,
|
|
|
+ vars.avgHp
|
|
|
+ )
|
|
|
+ })
|
|
|
+ }
|
|
|
+ return template
|
|
|
+ }
|
|
|
}
|