2024-02-27 22:52:08 +09:00
|
|
|
import { existsSync, readFileSync, statSync } from 'fs';
|
2023-09-10 23:26:06 +09:00
|
|
|
import { ModelType, Site } from '../model/base';
|
2024-02-27 22:52:08 +09:00
|
|
|
import { TempEmailType } from './emailFactory';
|
2023-09-10 23:26:06 +09:00
|
|
|
|
|
|
|
export type SiteCfg = {
|
|
|
|
site: Site;
|
|
|
|
priority: number;
|
|
|
|
base_url?: string;
|
|
|
|
api_key?: string;
|
|
|
|
label?: string;
|
|
|
|
proxy?: boolean;
|
2024-02-27 22:52:08 +09:00
|
|
|
model_map?: { [key: string]: ModelType };
|
|
|
|
condition?: string; // eval function (req:{model,prompt_tokens}):bool
|
|
|
|
};
|
|
|
|
|
|
|
|
type SizeCfg = {
|
|
|
|
size: number;
|
|
|
|
serial: number;
|
|
|
|
};
|
|
|
|
|
|
|
|
type MailCfg = {
|
|
|
|
mail_type: TempEmailType;
|
|
|
|
};
|
|
|
|
|
|
|
|
type DiscordAccount = {
|
|
|
|
token: string;
|
|
|
|
server_id: string;
|
|
|
|
channel_id: string;
|
2023-09-10 23:26:06 +09:00
|
|
|
};
|
|
|
|
// 首先定义配置的数据类型
|
|
|
|
interface ConfigData {
|
2024-02-27 22:52:08 +09:00
|
|
|
exit: boolean;
|
|
|
|
global: {
|
|
|
|
trace?: boolean;
|
|
|
|
download: {
|
|
|
|
proxy?: string;
|
|
|
|
dir: string;
|
|
|
|
};
|
|
|
|
cdn: {
|
|
|
|
url: string;
|
|
|
|
};
|
|
|
|
redis: {
|
|
|
|
host: string;
|
|
|
|
port: number;
|
|
|
|
password: string;
|
|
|
|
db: number;
|
|
|
|
};
|
|
|
|
chrome_path: string;
|
|
|
|
download_map?: Record<string, string>;
|
|
|
|
};
|
|
|
|
proxy_pool: {
|
|
|
|
enable: boolean;
|
|
|
|
stable_proxy_list: string[];
|
|
|
|
proxy_list: string[];
|
|
|
|
};
|
|
|
|
freegpt4: SizeCfg & MailCfg;
|
|
|
|
bingcopilot: SizeCfg;
|
|
|
|
gmail_list: { email: string; password: string; recovery_email: string }[];
|
|
|
|
hypotenuse: MailCfg & SizeCfg;
|
|
|
|
airoom: SizeCfg;
|
|
|
|
gptgod: SizeCfg;
|
|
|
|
opensess: {
|
|
|
|
size: number;
|
|
|
|
serial: number;
|
|
|
|
mail_type: TempEmailType;
|
|
|
|
};
|
|
|
|
openai: {
|
|
|
|
token_limit: { [key: string]: number };
|
|
|
|
};
|
|
|
|
glm?: {
|
|
|
|
token_limit: { [key: string]: number };
|
|
|
|
};
|
|
|
|
midjourney: SizeCfg & {
|
|
|
|
accounts: (DiscordAccount & {
|
|
|
|
mode: 'relax' | 'fast' | 'turbo';
|
|
|
|
})[];
|
|
|
|
};
|
|
|
|
domo: SizeCfg & {
|
|
|
|
accounts: (DiscordAccount & {
|
|
|
|
mode: 'relax' | 'fast';
|
|
|
|
})[];
|
|
|
|
};
|
|
|
|
arkose: {
|
|
|
|
size: number;
|
|
|
|
max_pool_size: number;
|
|
|
|
gen_interval: number;
|
|
|
|
serial: number;
|
|
|
|
allow_3: boolean;
|
|
|
|
must_all_tools: boolean;
|
|
|
|
must_plus: boolean;
|
|
|
|
keep_arkose_refresh?: boolean;
|
|
|
|
accounts: { email: string; password: string }[];
|
|
|
|
};
|
|
|
|
www: SizeCfg;
|
|
|
|
ddg: SizeCfg;
|
2023-09-10 23:26:06 +09:00
|
|
|
perplexity: {
|
2024-02-27 22:52:08 +09:00
|
|
|
size: number;
|
|
|
|
tokens: string[];
|
|
|
|
serial: number;
|
|
|
|
concurrency: number;
|
|
|
|
system: string;
|
|
|
|
model: ModelType;
|
|
|
|
};
|
|
|
|
izea: {
|
|
|
|
size: number;
|
|
|
|
serial: number;
|
|
|
|
mail_type: TempEmailType;
|
|
|
|
};
|
|
|
|
phind: {
|
|
|
|
size: number;
|
|
|
|
serial: number;
|
|
|
|
mail_type: TempEmailType;
|
|
|
|
};
|
|
|
|
sincode: {
|
|
|
|
size: number;
|
|
|
|
serial: number;
|
|
|
|
concurrency: number;
|
|
|
|
accounts: { email: string; password: string }[];
|
2023-09-10 23:26:06 +09:00
|
|
|
};
|
|
|
|
site_map: Partial<Record<ModelType, SiteCfg[]>>;
|
|
|
|
one_api: {
|
|
|
|
base_url: string;
|
|
|
|
api_key: string;
|
|
|
|
proxy: boolean;
|
|
|
|
};
|
2024-02-27 22:52:08 +09:00
|
|
|
gemini: SizeCfg & {
|
|
|
|
apikeys: string[];
|
|
|
|
};
|
|
|
|
poeauto: {
|
|
|
|
size: number;
|
|
|
|
serial: number;
|
|
|
|
mail_type: TempEmailType;
|
|
|
|
};
|
|
|
|
poevip: {
|
|
|
|
size: number;
|
|
|
|
serial: number;
|
|
|
|
pb_list: { lat: string; pb: string }[];
|
|
|
|
};
|
2023-09-10 23:26:06 +09:00
|
|
|
cursor: {
|
|
|
|
primary_model: ModelType;
|
|
|
|
};
|
2024-02-27 22:52:08 +09:00
|
|
|
claudechat: {
|
|
|
|
size: number;
|
|
|
|
serial: number;
|
|
|
|
sessions_keys: string[];
|
|
|
|
};
|
|
|
|
openchat3: {
|
|
|
|
size: number;
|
|
|
|
serial: number;
|
|
|
|
accounts: { email: string; password: string }[];
|
|
|
|
};
|
|
|
|
openchat4: {
|
|
|
|
size: number;
|
|
|
|
serial: number;
|
|
|
|
allow_3: boolean;
|
|
|
|
must_all_tools: boolean;
|
|
|
|
must_plus: boolean;
|
|
|
|
keep_arkose_refresh?: boolean;
|
|
|
|
upload_url: string;
|
|
|
|
download_proxy: string;
|
|
|
|
download_map?: Record<string, string>;
|
|
|
|
prompt_map?: Record<string, string>;
|
|
|
|
system?: string;
|
|
|
|
sleep_interval?: number; // 429之后睡眠多久
|
|
|
|
accounts: { email: string; password: string }[];
|
|
|
|
};
|
|
|
|
stack: {
|
|
|
|
size: number;
|
|
|
|
serial: number;
|
|
|
|
mail_type: TempEmailType;
|
|
|
|
accounts: {
|
|
|
|
email: string;
|
|
|
|
password: string;
|
|
|
|
flow_id: string;
|
|
|
|
token: string;
|
|
|
|
}[];
|
|
|
|
};
|
|
|
|
mixer: { size: number; mailType: TempEmailType; serial: number };
|
|
|
|
merlin: { size: number; mailType: TempEmailType; serial: number };
|
|
|
|
takeoff: { size: number; mailType: TempEmailType; serial: number };
|
|
|
|
askx: { size: number; mailType: TempEmailType; serial: number };
|
|
|
|
td: {
|
|
|
|
size: number;
|
|
|
|
mail_type: TempEmailType;
|
|
|
|
serial: number;
|
|
|
|
domain: string;
|
|
|
|
};
|
|
|
|
navit: {
|
|
|
|
size: number;
|
|
|
|
mailType: TempEmailType;
|
|
|
|
serial: number;
|
|
|
|
reverse: string;
|
|
|
|
};
|
|
|
|
airops: {
|
|
|
|
size: number;
|
|
|
|
mail_type: TempEmailType;
|
|
|
|
};
|
|
|
|
langdock: {
|
|
|
|
size: number;
|
|
|
|
mail_type: TempEmailType;
|
|
|
|
serial: number;
|
|
|
|
};
|
|
|
|
vanus: {
|
|
|
|
size: number;
|
|
|
|
mail_type: TempEmailType;
|
|
|
|
};
|
2023-09-10 23:26:06 +09:00
|
|
|
// 当添加新字段时,需要在此处更新类型定义
|
|
|
|
}
|
|
|
|
|
|
|
|
class BaseConfig {
|
|
|
|
private filePath: string = './run/config.json';
|
|
|
|
private defaultConfig: ConfigData = {
|
2024-02-27 22:52:08 +09:00
|
|
|
exit: true,
|
|
|
|
global: {
|
|
|
|
download: {
|
|
|
|
dir: './run/file/',
|
|
|
|
},
|
|
|
|
cdn: {
|
|
|
|
url: '',
|
|
|
|
},
|
|
|
|
redis: {
|
|
|
|
host: '',
|
|
|
|
port: 0,
|
|
|
|
password: '',
|
|
|
|
db: 0,
|
|
|
|
},
|
|
|
|
chrome_path: 'google-chrome',
|
|
|
|
download_map: {},
|
|
|
|
},
|
|
|
|
airoom: {
|
|
|
|
size: 0,
|
|
|
|
serial: 1,
|
|
|
|
},
|
|
|
|
gptgod: {
|
|
|
|
size: 0,
|
|
|
|
serial: 1,
|
|
|
|
},
|
|
|
|
hypotenuse: {
|
|
|
|
size: 0,
|
|
|
|
serial: 0,
|
|
|
|
mail_type: TempEmailType.TempMailLOL,
|
|
|
|
},
|
|
|
|
opensess: {
|
|
|
|
size: 0,
|
|
|
|
serial: 1,
|
|
|
|
mail_type: TempEmailType.TempMailLOL,
|
|
|
|
},
|
|
|
|
askx: {
|
|
|
|
size: 0,
|
|
|
|
serial: 0,
|
|
|
|
mailType: TempEmailType.TempMailLOL,
|
|
|
|
},
|
|
|
|
proxy_pool: {
|
|
|
|
enable: false,
|
|
|
|
stable_proxy_list: [],
|
|
|
|
proxy_list: [],
|
2023-09-10 23:26:06 +09:00
|
|
|
},
|
|
|
|
site_map: {},
|
2024-02-27 22:52:08 +09:00
|
|
|
openai: {
|
|
|
|
token_limit: {},
|
|
|
|
},
|
2023-09-10 23:26:06 +09:00
|
|
|
one_api: {
|
|
|
|
base_url: '',
|
|
|
|
api_key: '',
|
|
|
|
proxy: false,
|
|
|
|
}, // Add new fields here, with their default values
|
|
|
|
cursor: {
|
|
|
|
primary_model: ModelType.GPT4,
|
|
|
|
},
|
2024-02-27 22:52:08 +09:00
|
|
|
td: {
|
|
|
|
size: 0,
|
|
|
|
serial: 0,
|
|
|
|
mail_type: TempEmailType.TempMailLOL,
|
|
|
|
domain: '',
|
|
|
|
},
|
|
|
|
mixer: {
|
|
|
|
size: 0,
|
|
|
|
serial: 0,
|
|
|
|
mailType: TempEmailType.TempMailLOL,
|
|
|
|
},
|
|
|
|
stack: {
|
|
|
|
size: 0,
|
|
|
|
serial: 0,
|
|
|
|
mail_type: TempEmailType.TempMailLOL,
|
|
|
|
accounts: [],
|
|
|
|
},
|
|
|
|
takeoff: {
|
|
|
|
size: 0,
|
|
|
|
serial: 0,
|
|
|
|
mailType: TempEmailType.TempMailLOL,
|
|
|
|
},
|
|
|
|
merlin: {
|
|
|
|
size: 0,
|
|
|
|
serial: 0,
|
|
|
|
mailType: TempEmailType.TempMailLOL,
|
|
|
|
},
|
|
|
|
navit: {
|
|
|
|
size: 0,
|
|
|
|
serial: 0,
|
|
|
|
mailType: TempEmailType.TempMailLOL,
|
|
|
|
reverse: '',
|
|
|
|
},
|
|
|
|
airops: {
|
|
|
|
size: 0,
|
|
|
|
mail_type: TempEmailType.TempMailLOL,
|
|
|
|
},
|
|
|
|
langdock: {
|
|
|
|
size: 0,
|
|
|
|
mail_type: TempEmailType.TempMailLOL,
|
|
|
|
serial: 0,
|
|
|
|
},
|
|
|
|
gemini: {
|
|
|
|
size: 0,
|
|
|
|
serial: 0,
|
|
|
|
apikeys: [],
|
|
|
|
},
|
|
|
|
sincode: {
|
|
|
|
size: 0,
|
|
|
|
serial: 0,
|
|
|
|
concurrency: 1,
|
|
|
|
accounts: [],
|
|
|
|
},
|
|
|
|
phind: {
|
|
|
|
size: 0,
|
|
|
|
serial: 0,
|
|
|
|
mail_type: TempEmailType.TempMailLOL,
|
|
|
|
},
|
|
|
|
izea: {
|
|
|
|
size: 0,
|
|
|
|
serial: 0,
|
|
|
|
mail_type: TempEmailType.TempMailLOL,
|
|
|
|
},
|
|
|
|
perplexity: {
|
|
|
|
size: 0,
|
|
|
|
serial: 0,
|
|
|
|
tokens: [],
|
|
|
|
concurrency: 1,
|
|
|
|
system: '',
|
|
|
|
model: ModelType.GPT3p5Turbo,
|
|
|
|
},
|
|
|
|
vanus: {
|
|
|
|
size: 0,
|
|
|
|
mail_type: TempEmailType.TempMailLOL,
|
|
|
|
},
|
|
|
|
gmail_list: [],
|
|
|
|
claudechat: {
|
|
|
|
size: 0,
|
|
|
|
serial: 0,
|
|
|
|
sessions_keys: [],
|
|
|
|
},
|
|
|
|
openchat3: {
|
|
|
|
size: 0,
|
|
|
|
serial: 0,
|
|
|
|
accounts: [],
|
|
|
|
},
|
|
|
|
openchat4: {
|
|
|
|
size: 0,
|
|
|
|
serial: 0,
|
|
|
|
allow_3: false,
|
|
|
|
must_plus: false,
|
|
|
|
must_all_tools: false,
|
|
|
|
accounts: [],
|
|
|
|
keep_arkose_refresh: false,
|
|
|
|
upload_url: '',
|
|
|
|
download_proxy: '',
|
|
|
|
download_map: {},
|
|
|
|
},
|
|
|
|
poeauto: {
|
|
|
|
size: 0,
|
|
|
|
serial: 0,
|
|
|
|
mail_type: TempEmailType.SmailPro,
|
|
|
|
},
|
|
|
|
www: {
|
|
|
|
size: 0,
|
|
|
|
serial: 1,
|
|
|
|
},
|
|
|
|
ddg: {
|
|
|
|
size: 0,
|
|
|
|
serial: 1,
|
|
|
|
},
|
|
|
|
poevip: {
|
|
|
|
size: 0,
|
|
|
|
serial: 0,
|
|
|
|
pb_list: [],
|
|
|
|
},
|
|
|
|
arkose: {
|
|
|
|
size: 0,
|
|
|
|
serial: 0,
|
|
|
|
max_pool_size: 0,
|
|
|
|
allow_3: false,
|
|
|
|
must_plus: false,
|
|
|
|
must_all_tools: false,
|
|
|
|
accounts: [],
|
|
|
|
keep_arkose_refresh: false,
|
|
|
|
gen_interval: 10,
|
|
|
|
},
|
|
|
|
midjourney: {
|
|
|
|
size: 0,
|
|
|
|
serial: 0,
|
|
|
|
accounts: [],
|
|
|
|
},
|
|
|
|
freegpt4: {
|
|
|
|
size: 0,
|
|
|
|
serial: 0,
|
|
|
|
mail_type: TempEmailType.TempMailLOL,
|
|
|
|
},
|
|
|
|
bingcopilot: {
|
|
|
|
size: 0,
|
|
|
|
serial: 0,
|
|
|
|
},
|
|
|
|
domo: {
|
|
|
|
size: 0,
|
|
|
|
serial: 0,
|
|
|
|
accounts: [],
|
|
|
|
},
|
2023-09-10 23:26:06 +09:00
|
|
|
};
|
|
|
|
public config: ConfigData;
|
|
|
|
|
|
|
|
constructor() {
|
|
|
|
// Initialize config as a deep copy of defaultConfig
|
|
|
|
this.config = JSON.parse(JSON.stringify(this.defaultConfig));
|
|
|
|
}
|
|
|
|
|
|
|
|
load() {
|
|
|
|
if (!existsSync(this.filePath)) {
|
|
|
|
// console.log(
|
|
|
|
// `Configuration file ${this.filePath} not found. Retrying in 5 seconds...`,
|
|
|
|
// );
|
|
|
|
setTimeout(() => this.load(), 5000);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
try {
|
|
|
|
const rawData = readFileSync(this.filePath, 'utf8');
|
|
|
|
const fileConfig: Partial<ConfigData> = JSON.parse(rawData);
|
|
|
|
|
|
|
|
// Merge defaultConfig and fileConfig
|
|
|
|
this.config = Object.assign(this.config, this.defaultConfig, fileConfig);
|
2024-02-27 22:52:08 +09:00
|
|
|
console.log('Loaded config from run/config.json successfully!');
|
2023-09-10 23:26:06 +09:00
|
|
|
} catch (error) {
|
|
|
|
// console.error(`Error reading or parsing the configuration file ${this.filePath}.`, error);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
watchFile() {
|
2024-02-27 22:52:08 +09:00
|
|
|
let lastModifiedTime: Date | null = null;
|
2023-09-10 23:26:06 +09:00
|
|
|
|
2024-02-27 22:52:08 +09:00
|
|
|
// 每隔5秒钟读取一次文件
|
|
|
|
const intervalId = setInterval(() => {
|
|
|
|
if (!existsSync(this.filePath)) {
|
|
|
|
// console.log(
|
|
|
|
// `Configuration file ${this.filePath} not found. Retrying in 5 seconds...`,
|
|
|
|
// );
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
try {
|
|
|
|
const stats = statSync(this.filePath);
|
|
|
|
const newModifiedTime = stats.mtime;
|
2023-09-10 23:26:06 +09:00
|
|
|
|
2024-02-27 22:52:08 +09:00
|
|
|
// 检查文件是否被修改
|
|
|
|
if (lastModifiedTime && newModifiedTime > lastModifiedTime) {
|
|
|
|
console.log(
|
|
|
|
`Configuration file ${this.filePath} has been changed! Reloading...`,
|
|
|
|
);
|
|
|
|
this.load();
|
2023-09-10 23:26:06 +09:00
|
|
|
}
|
2024-02-27 22:52:08 +09:00
|
|
|
|
|
|
|
lastModifiedTime = newModifiedTime;
|
|
|
|
} catch (e) {
|
|
|
|
console.error(e);
|
|
|
|
}
|
|
|
|
}, +(process.env.CONFIG_SYNC_INTERVAL || 5000));
|
2023-09-10 23:26:06 +09:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
export const Config = new BaseConfig();
|