Commit 1696a557 authored by nanahira's avatar nanahira

chatgpt

parent e20a49e9
...@@ -51,6 +51,15 @@ windbotBotlist: ./windbot/bots.json ...@@ -51,6 +51,15 @@ windbotBotlist: ./windbot/bots.json
windbotSpawn: 0 windbotSpawn: 0
windbotEndpoint: http://127.0.0.1:2399 windbotEndpoint: http://127.0.0.1:2399
windbotMyIp: 127.0.0.1 windbotMyIp: 127.0.0.1
enableChatgpt: 0
chatgptEndpoint: https://api.openai.com
chatgptToken: sk-xxxx
chatgptModel: gpt-4o-mini
chatgptSystemPrompt: 你是{{windbot}},一名与{{player}}实时互动的游戏对手。玩家当前 locale 是
{{locale}},你必须始终使用 {{language}}
回复(不要混用其他语言)。你的回复应简短、有趣、贴合当前情境,增强玩家沉浸感。避免冗长解释或重复内容,并且每次回复不能超过100个字。
chatgptTokenLimit: 12000
chatgptExtraOpts: {}
enableReconnect: 1 enableReconnect: 1
reconnectTimeout: 180000 reconnectTimeout: 180000
hidePlayerName: 0 hidePlayerName: 0
......
...@@ -119,6 +119,22 @@ export const defaultConfig = { ...@@ -119,6 +119,22 @@ export const defaultConfig = {
WINDBOT_ENDPOINT: 'http://127.0.0.1:2399', WINDBOT_ENDPOINT: 'http://127.0.0.1:2399',
// Public IP/host that windbot uses to connect back to this server. // Public IP/host that windbot uses to connect back to this server.
WINDBOT_MY_IP: '127.0.0.1', WINDBOT_MY_IP: '127.0.0.1',
// Enable chatgpt feature for AI-room chat replies.
// Boolean parse rule (default false): ''/'0'/'false'/'null' => false, otherwise true.
ENABLE_CHATGPT: '0',
// Chat completions API endpoint. Format: URL string.
CHATGPT_ENDPOINT: 'https://api.openai.com',
// Chat completions API token.
CHATGPT_TOKEN: 'sk-xxxx',
// Chat model.
CHATGPT_MODEL: 'gpt-4o-mini',
// Optional system prompt template. Supports {{player}} and {{windbot}} placeholders.
CHATGPT_SYSTEM_PROMPT:
'你是{{windbot}},一名与{{player}}实时互动的游戏对手。玩家当前 locale 是 {{locale}},你必须始终使用 {{language}} 回复(不要混用其他语言)。你的回复应简短、有趣、贴合当前情境,增强玩家沉浸感。避免冗长解释或重复内容,并且每次回复不能超过100个字。',
// Token limit used to trim stored conversation context.
CHATGPT_TOKEN_LIMIT: '12000',
// Extra request options for chat completions. Format: JSON object string.
CHATGPT_EXTRA_OPTS: '{}',
// Enable reconnect feature. // Enable reconnect feature.
// Boolean parse rule (default true): only '0'/'false'/'null' => false, otherwise true. // Boolean parse rule (default true): only '0'/'false'/'null' => false, otherwise true.
// Note: with default-true parsing, empty string is treated as true. // Note: with default-true parsing, empty string is treated as true.
......
This diff is collapsed.
...@@ -13,16 +13,18 @@ import { MenuManager } from './menu-manager'; ...@@ -13,16 +13,18 @@ import { MenuManager } from './menu-manager';
import { ClientKeyProvider } from './client-key-provider'; import { ClientKeyProvider } from './client-key-provider';
import { HidePlayerNameProvider } from './hide-player-name-provider'; import { HidePlayerNameProvider } from './hide-player-name-provider';
import { CommandsService, KoishiContextService } from '../koishi'; import { CommandsService, KoishiContextService } from '../koishi';
import { ChatgptService } from './chatgpt-service';
export const FeatsModule = createAppContext<ContextState>() export const FeatsModule = createAppContext<ContextState>()
.provide(ClientKeyProvider) .provide(ClientKeyProvider)
.provide(HidePlayerNameProvider) .provide(HidePlayerNameProvider)
.provide(KoishiContextService) .provide(KoishiContextService)
.provide(CommandsService) .provide(CommandsService) // some chat commands
.provide(MenuManager) .provide(MenuManager)
.provide(ClientVersionCheck) .provide(ClientVersionCheck)
.provide(Welcome) .provide(Welcome)
.provide(PlayerStatusNotify) .provide(PlayerStatusNotify)
.provide(ChatgptService) // AI-room chat replies
.provide(RefreshFieldService) .provide(RefreshFieldService)
.provide(Reconnect) .provide(Reconnect)
.provide(WaitForPlayerProvider) // chat refresh .provide(WaitForPlayerProvider) // chat refresh
......
export * from './client-version-check'; export * from './client-version-check';
export * from './client-key-provider'; export * from './client-key-provider';
export * from './chatgpt-service';
export * from './hide-player-name-provider'; export * from './hide-player-name-provider';
export * from './menu-manager'; export * from './menu-manager';
export * from './welcome'; export * from './welcome';
......
...@@ -509,7 +509,10 @@ export class Reconnect { ...@@ -509,7 +509,10 @@ export class Reconnect {
}), }),
); );
await this.refreshFieldService.sendReconnectDuelingMessages(newClient, room); await this.refreshFieldService.sendReconnectDuelingMessages(
newClient,
room,
);
} }
private importClientData(newClient: Client, oldClient: Client, room: Room) { private importClientData(newClient: Client, oldClient: Client, room: Room) {
......
...@@ -36,8 +36,7 @@ export class RefreshFieldService { ...@@ -36,8 +36,7 @@ export class RefreshFieldService {
await client.send(await this.requestField(room)); await client.send(await this.requestField(room));
await this.sendRefreshMessages(client, room); await this.sendRefreshMessages(client, room);
const needResendRequest = const needResendRequest = this.isReconnectingPlayerOperating(client, room);
this.isReconnectingPlayerOperating(client, room);
if (needResendRequest) { if (needResendRequest) {
const lastHint = this.findLastHintForClient(client, room); const lastHint = this.findLastHintForClient(client, room);
......
...@@ -34,7 +34,10 @@ export class CommandsService { ...@@ -34,7 +34,10 @@ export class CommandsService {
if (!commandContext) { if (!commandContext) {
return; return;
} }
await this.ctx.dispatch(new YGOProCtosSurrender(), commandContext.client); await this.ctx.dispatch(
new YGOProCtosSurrender(),
commandContext.client,
);
}); });
koishi.command('roomname', '').action(({ session }) => { koishi.command('roomname', '').action(({ session }) => {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment