Commit 1696a557 authored by nanahira's avatar nanahira

chatgpt

parent e20a49e9
......@@ -51,6 +51,15 @@ windbotBotlist: ./windbot/bots.json
windbotSpawn: 0
windbotEndpoint: http://127.0.0.1:2399
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
reconnectTimeout: 180000
hidePlayerName: 0
......
......@@ -119,6 +119,22 @@ export const defaultConfig = {
WINDBOT_ENDPOINT: 'http://127.0.0.1:2399',
// Public IP/host that windbot uses to connect back to this server.
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.
// Boolean parse rule (default true): only '0'/'false'/'null' => false, otherwise 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';
import { ClientKeyProvider } from './client-key-provider';
import { HidePlayerNameProvider } from './hide-player-name-provider';
import { CommandsService, KoishiContextService } from '../koishi';
import { ChatgptService } from './chatgpt-service';
export const FeatsModule = createAppContext<ContextState>()
.provide(ClientKeyProvider)
.provide(HidePlayerNameProvider)
.provide(KoishiContextService)
.provide(CommandsService)
.provide(CommandsService) // some chat commands
.provide(MenuManager)
.provide(ClientVersionCheck)
.provide(Welcome)
.provide(PlayerStatusNotify)
.provide(ChatgptService) // AI-room chat replies
.provide(RefreshFieldService)
.provide(Reconnect)
.provide(WaitForPlayerProvider) // chat refresh
......
export * from './client-version-check';
export * from './client-key-provider';
export * from './chatgpt-service';
export * from './hide-player-name-provider';
export * from './menu-manager';
export * from './welcome';
......
......@@ -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) {
......
......@@ -36,8 +36,7 @@ export class RefreshFieldService {
await client.send(await this.requestField(room));
await this.sendRefreshMessages(client, room);
const needResendRequest =
this.isReconnectingPlayerOperating(client, room);
const needResendRequest = this.isReconnectingPlayerOperating(client, room);
if (needResendRequest) {
const lastHint = this.findLastHintForClient(client, room);
......
......@@ -34,7 +34,10 @@ export class CommandsService {
if (!commandContext) {
return;
}
await this.ctx.dispatch(new YGOProCtosSurrender(), commandContext.client);
await this.ctx.dispatch(
new YGOProCtosSurrender(),
commandContext.client,
);
});
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