Files
hack/tools/scripts/llm-key-hunter/results/_cache/content/basbobibbins_meme-cultist.json
T

1 line
45 KiB
JSON

{"repo": "basbobibbins/meme-cultist", "files": {"utils/llm/adapters/deepseek.js": {"453ed332b48fa8c8cc3c41905f5ff48e4b201619": {"t": 1785746007.7255075, "n": 3950, "h": "1a68edcbe1784a3f", "c": "// DeepSeek chat completions via the OpenAI SDK v3 compatibility layer.\n// This module owns the single DeepSeek client used across the bot — no other\n// file should construct `new OpenAIApi(...)`. Adapter is retry- and timeout-\n// naive; the router wraps it.\n\nconst { OpenAIApi, Configuration } = require(\"openai\");\nconst { CHATBOT_LOCAL } = require(\"../../../config.js\");\nconst logger = require(\"../../logger\");\n\nlet _client = null;\nlet _clientKey = null;\n\nfunction getClient() {\n const key = process.env.OPENAI_API_KEY;\n if (!key) throw new Error(\"OPENAI_API_KEY is not set.\");\n if (_client && _clientKey === key) return _client;\n\n const configuration = new Configuration({\n apiKey: key,\n basePath: CHATBOT_LOCAL ? \"http://127.0.0.1:3000/v1/\" : \"https://api.deepseek.com\",\n });\n logger.debug(`Using Deepseek API at ${configuration.basePath}`);\n logger.debug(`OpenAI API key: ${key.substring(0, 7)}...`);\n _client = new OpenAIApi(configuration);\n _clientKey = key;\n return _client;\n}\n\nasync function chat(args) {\n const client = getClient();\n const payload = {\n model: args.model,\n messages: args.messages || [],\n };\n if (args.temperature !== undefined) payload.temperature = args.temperature;\n if (args.max_tokens !== undefined) payload.max_tokens = args.max_tokens;\n if (args.tools !== undefined) payload.tools = args.tools;\n if (args.tool_choice !== undefined) payload.tool_choice = args.tool_choice;\n if (args.response_format !== undefined) payload.response_format = args.response_format;\n\n const raw = await client.createChatCompletion(payload);\n const choice = raw?.data?.choices?.[0];\n const message = choice?.message || {};\n return {\n result: {\n content: message.content ?? \"\",\n tool_calls: message.tool_calls,\n finish_reason: choice?.finish_reason,\n },\n usage: raw?.data?.usage || {},\n raw,\n };\n}\n\nasync function* chatStream(args) {\n const client = getClient();\n const payload = {\n model: args.model,\n messages: args.messages,\n stream: true,\n };\n if (args.temperature !== undefined) payload.temperature = args.temperature;\n if (args.max_tokens !== undefined) payload.max_tokens = args.max_tokens;\n if (args.tools !== undefined) payload.tools = args.tools;\n if (args.tool_choice !== undefined) payload.tool_choice = args.tool_choice;\n if (args.response_format !== undefined) payload.response_format = args.response_format;\n\n const raw = await client.createChatCompletion(payload, { responseType: \"stream\" });\n const stream = raw.data;\n\n let buffer = \"\";\n for await (const chunk of stream) {\n buffer += chunk.toString();\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop(); // keep incomplete line in buffer\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed.startsWith(\"data: \")) continue;\n const data = trimmed.slice(6).trim();\n if (data === \"[DONE]\") return;\n try {\n const parsed = JSON.parse(data);\n const delta = parsed.choices?.[0]?.delta;\n const finish_reason = parsed.choices?.[0]?.finish_reason;\n yield {\n content: delta?.content || \"\",\n reasoning_content: delta?.reasoning_content || \"\",\n tool_calls: delta?.tool_calls,\n finish_reason,\n };\n } catch (_) {\n // ignore malformed SSE lines\n }\n }\n }\n\n // flush remaining buffer\n if (buffer.trim().startsWith(\"data: \")) {\n const data = buffer.trim().slice(6).trim();\n if (data !== \"[DONE]\") {\n try {\n const parsed = JSON.parse(data);\n const delta = parsed.choices?.[0]?.delta;\n const finish_reason = parsed.choices?.[0]?.finish_reason;\n yield {\n content: delta?.content || \"\",\n reasoning_content: delta?.reasoning_content || \"\",\n tool_calls: delta?.tool_calls,\n finish_reason,\n };\n } catch (_) {}\n }\n }\n}\n\nmodule.exports = { chat, chatStream, getClient };\n"}, "ab4e0778da3e84715b538e93e6b127928779c152": {"t": 1785758734.9962256, "n": 3950, "h": "1a68edcbe1784a3f", "c": "// DeepSeek chat completions via the OpenAI SDK v3 compatibility layer.\n// This module owns the single DeepSeek client used across the bot — no other\n// file should construct `new OpenAIApi(...)`. Adapter is retry- and timeout-\n// naive; the router wraps it.\n\nconst { OpenAIApi, Configuration } = require(\"openai\");\nconst { CHATBOT_LOCAL } = require(\"../../../config.js\");\nconst logger = require(\"../../logger\");\n\nlet _client = null;\nlet _clientKey = null;\n\nfunction getClient() {\n const key = process.env.OPENAI_API_KEY;\n if (!key) throw new Error(\"OPENAI_API_KEY is not set.\");\n if (_client && _clientKey === key) return _client;\n\n const configuration = new Configuration({\n apiKey: key,\n basePath: CHATBOT_LOCAL ? \"http://127.0.0.1:3000/v1/\" : \"https://api.deepseek.com\",\n });\n logger.debug(`Using Deepseek API at ${configuration.basePath}`);\n logger.debug(`OpenAI API key: ${key.substring(0, 7)}...`);\n _client = new OpenAIApi(configuration);\n _clientKey = key;\n return _client;\n}\n\nasync function chat(args) {\n const client = getClient();\n const payload = {\n model: args.model,\n messages: args.messages || [],\n };\n if (args.temperature !== undefined) payload.temperature = args.temperature;\n if (args.max_tokens !== undefined) payload.max_tokens = args.max_tokens;\n if (args.tools !== undefined) payload.tools = args.tools;\n if (args.tool_choice !== undefined) payload.tool_choice = args.tool_choice;\n if (args.response_format !== undefined) payload.response_format = args.response_format;\n\n const raw = await client.createChatCompletion(payload);\n const choice = raw?.data?.choices?.[0];\n const message = choice?.message || {};\n return {\n result: {\n content: message.content ?? \"\",\n tool_calls: message.tool_calls,\n finish_reason: choice?.finish_reason,\n },\n usage: raw?.data?.usage || {},\n raw,\n };\n}\n\nasync function* chatStream(args) {\n const client = getClient();\n const payload = {\n model: args.model,\n messages: args.messages,\n stream: true,\n };\n if (args.temperature !== undefined) payload.temperature = args.temperature;\n if (args.max_tokens !== undefined) payload.max_tokens = args.max_tokens;\n if (args.tools !== undefined) payload.tools = args.tools;\n if (args.tool_choice !== undefined) payload.tool_choice = args.tool_choice;\n if (args.response_format !== undefined) payload.response_format = args.response_format;\n\n const raw = await client.createChatCompletion(payload, { responseType: \"stream\" });\n const stream = raw.data;\n\n let buffer = \"\";\n for await (const chunk of stream) {\n buffer += chunk.toString();\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop(); // keep incomplete line in buffer\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed.startsWith(\"data: \")) continue;\n const data = trimmed.slice(6).trim();\n if (data === \"[DONE]\") return;\n try {\n const parsed = JSON.parse(data);\n const delta = parsed.choices?.[0]?.delta;\n const finish_reason = parsed.choices?.[0]?.finish_reason;\n yield {\n content: delta?.content || \"\",\n reasoning_content: delta?.reasoning_content || \"\",\n tool_calls: delta?.tool_calls,\n finish_reason,\n };\n } catch (_) {\n // ignore malformed SSE lines\n }\n }\n }\n\n // flush remaining buffer\n if (buffer.trim().startsWith(\"data: \")) {\n const data = buffer.trim().slice(6).trim();\n if (data !== \"[DONE]\") {\n try {\n const parsed = JSON.parse(data);\n const delta = parsed.choices?.[0]?.delta;\n const finish_reason = parsed.choices?.[0]?.finish_reason;\n yield {\n content: delta?.content || \"\",\n reasoning_content: delta?.reasoning_content || \"\",\n tool_calls: delta?.tool_calls,\n finish_reason,\n };\n } catch (_) {}\n }\n }\n}\n\nmodule.exports = { chat, chatStream, getClient };\n"}, "f705d199ef9bf3bfe5b2afbabbfaf333ae93d4d5": {"t": 1785758736.264028, "n": 4075, "h": "a1e12acee533577b", "c": "// DeepSeek chat completions via the OpenAI SDK v3 compatibility layer.\n// This module owns the single DeepSeek client used across the bot — no other\n// file should construct `new OpenAIApi(...)`. Adapter is retry- and timeout-\n// naive; the router wraps it.\n\nconst { OpenAIApi, Configuration } = require(\"openai\");\nconst { CHATBOT_LOCAL } = require(\"../../../config.js\");\nconst logger = require(\"../../logger\");\n\nlet _client = null;\nlet _clientKey = null;\n\nfunction getClient() {\n const key = process.env.OPENAI_API_KEY;\n if (!key) throw new Error(\"OPENAI_API_KEY is not set.\");\n if (_client && _clientKey === key) return _client;\n\n const configuration = new Configuration({\n apiKey: key,\n basePath: CHATBOT_LOCAL ? \"http://127.0.0.1:3000/v1/\" : \"https://api.deepseek.com\",\n });\n logger.debug(`Using Deepseek API at ${configuration.basePath}`);\n logger.debug(`OpenAI API key: ${key.substring(0, 7)}...`);\n _client = new OpenAIApi(configuration);\n _clientKey = key;\n return _client;\n}\n\nasync function chat(args) {\n const client = getClient();\n // Strip reasoning_content from assistant messages before sending.\n const messages = (args.messages || []).map(m => {\n if (m.role !== \"assistant\" || !(\"reasoning_content\" in m)) return m;\n const { reasoning_content: _rc, ...rest } = m;\n return rest;\n });\n const payload = {\n model: args.model,\n messages,\n };\n if (args.temperature !== undefined) payload.temperature = args.temperature;\n if (args.max_tokens !== undefined) payload.max_tokens = args.max_tokens;\n if (args.tools !== undefined) payload.tools = args.tools;\n if (args.tool_choice !== undefined) payload.tool_choice = args.tool_choice;\n if (args.response_format !== undefined) payload.response_format = args.response_format;\n\n const raw = await client.createChatCompletion(payload);\n const choice = raw?.data?.choices?.[0];\n const message = choice?.message || {};\n return {\n result: {\n content: message.content ?? \"\",\n tool_calls: message.tool_calls,\n finish_reason: choice?.finish_reason,\n },\n usage: raw?.data?.usage || {},\n raw,\n };\n}\n\nasync function* chatStream(args) {\n const client = getClient();\n const payload = {\n model: args.model,\n messages: args.messages,\n stream: true,\n };\n if (args.temperature !== undefined) payload.temperature = args.temperature;\n if (args.max_tokens !== undefined) payload.max_tokens = args.max_tokens;\n if (args.tools !== undefined) payload.tools = args.tools;\n if (args.tool_choice !== undefined) payload.tool_choice = args.tool_choice;\n if (args.response_format !== undefined) payload.response_format = args.response_format;\n\n const raw = await client.createChatCompletion(payload, { responseType: \"stream\" });\n const stream = raw.data;\n\n let buffer = \"\";\n for await (const chunk of stream) {\n buffer += chunk.toString();\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop(); // keep incomplete line in buffer\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed.startsWith(\"data: \")) continue;\n const data = trimmed.slice(6).trim();\n if (data === \"[DONE]\") return;\n try {\n const parsed = JSON.parse(data);\n const delta = parsed.choices?.[0]?.delta;\n const finish_reason = parsed.choices?.[0]?.finish_reason;\n yield {\n content: delta?.content || \"\",\n tool_calls: delta?.tool_calls,\n finish_reason,\n };\n } catch (_) {\n // ignore malformed SSE lines\n }\n }\n }\n\n // flush remaining buffer\n if (buffer.trim().startsWith(\"data: \")) {\n const data = buffer.trim().slice(6).trim();\n if (data !== \"[DONE]\") {\n try {\n const parsed = JSON.parse(data);\n const delta = parsed.choices?.[0]?.delta;\n const finish_reason = parsed.choices?.[0]?.finish_reason;\n yield {\n content: delta?.content || \"\",\n tool_calls: delta?.tool_calls,\n finish_reason,\n };\n } catch (_) {}\n }\n }\n}\n\nmodule.exports = { chat, chatStream, getClient };\n"}, "add156f938afc9cb8edd01f9f080eb530c85802d": {"t": 1785758737.4187508, "n": 3822, "h": "3a4e0b75a1133c95", "c": "// DeepSeek chat completions via the OpenAI SDK v3 compatibility layer.\n// This module owns the single DeepSeek client used across the bot — no other\n// file should construct `new OpenAIApi(...)`. Adapter is retry- and timeout-\n// naive; the router wraps it.\n\nconst { OpenAIApi, Configuration } = require(\"openai\");\nconst { CHATBOT_LOCAL } = require(\"../../../config.js\");\nconst logger = require(\"../../logger\");\n\nlet _client = null;\nlet _clientKey = null;\n\nfunction getClient() {\n const key = process.env.OPENAI_API_KEY;\n if (!key) throw new Error(\"OPENAI_API_KEY is not set.\");\n if (_client && _clientKey === key) return _client;\n\n const configuration = new Configuration({\n apiKey: key,\n basePath: CHATBOT_LOCAL ? \"http://127.0.0.1:3000/v1/\" : \"https://api.deepseek.com\",\n });\n logger.debug(`Using Deepseek API at ${configuration.basePath}`);\n logger.debug(`OpenAI API key: ${key.substring(0, 7)}...`);\n _client = new OpenAIApi(configuration);\n _clientKey = key;\n return _client;\n}\n\nasync function chat(args) {\n const client = getClient();\n const payload = {\n model: args.model,\n messages: args.messages,\n };\n if (args.temperature !== undefined) payload.temperature = args.temperature;\n if (args.max_tokens !== undefined) payload.max_tokens = args.max_tokens;\n if (args.tools !== undefined) payload.tools = args.tools;\n if (args.tool_choice !== undefined) payload.tool_choice = args.tool_choice;\n if (args.response_format !== undefined) payload.response_format = args.response_format;\n\n const raw = await client.createChatCompletion(payload);\n const choice = raw?.data?.choices?.[0];\n const message = choice?.message || {};\n return {\n result: {\n content: message.content ?? \"\",\n tool_calls: message.tool_calls,\n finish_reason: choice?.finish_reason,\n },\n usage: raw?.data?.usage || {},\n raw,\n };\n}\n\nasync function* chatStream(args) {\n const client = getClient();\n const payload = {\n model: args.model,\n messages: args.messages,\n stream: true,\n };\n if (args.temperature !== undefined) payload.temperature = args.temperature;\n if (args.max_tokens !== undefined) payload.max_tokens = args.max_tokens;\n if (args.tools !== undefined) payload.tools = args.tools;\n if (args.tool_choice !== undefined) payload.tool_choice = args.tool_choice;\n if (args.response_format !== undefined) payload.response_format = args.response_format;\n\n const raw = await client.createChatCompletion(payload, { responseType: \"stream\" });\n const stream = raw.data;\n\n let buffer = \"\";\n for await (const chunk of stream) {\n buffer += chunk.toString();\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop(); // keep incomplete line in buffer\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed.startsWith(\"data: \")) continue;\n const data = trimmed.slice(6).trim();\n if (data === \"[DONE]\") return;\n try {\n const parsed = JSON.parse(data);\n const delta = parsed.choices?.[0]?.delta;\n const finish_reason = parsed.choices?.[0]?.finish_reason;\n yield {\n content: delta?.content || \"\",\n tool_calls: delta?.tool_calls,\n finish_reason,\n };\n } catch (_) {\n // ignore malformed SSE lines\n }\n }\n }\n\n // flush remaining buffer\n if (buffer.trim().startsWith(\"data: \")) {\n const data = buffer.trim().slice(6).trim();\n if (data !== \"[DONE]\") {\n try {\n const parsed = JSON.parse(data);\n const delta = parsed.choices?.[0]?.delta;\n const finish_reason = parsed.choices?.[0]?.finish_reason;\n yield {\n content: delta?.content || \"\",\n tool_calls: delta?.tool_calls,\n finish_reason,\n };\n } catch (_) {}\n }\n }\n}\n\nmodule.exports = { chat, chatStream, getClient };\n"}, "2d76dcb875aee2f9a024b023b064d73413018526": {"t": 1785758738.8049634, "n": 4196, "h": "1ed84aff00e695ac", "c": "// DeepSeek chat completions via the OpenAI SDK v3 compatibility layer.\n// This module owns the single DeepSeek client used across the bot — no other\n// file should construct `new OpenAIApi(...)`. Adapter is retry- and timeout-\n// naive; the router wraps it.\n\nconst { OpenAIApi, Configuration } = require(\"openai\");\nconst { CHATBOT_LOCAL } = require(\"../../../config.js\");\nconst logger = require(\"../../logger\");\n\nlet _client = null;\nlet _clientKey = null;\n\nfunction getClient() {\n const key = process.env.OPENAI_API_KEY;\n if (!key) throw new Error(\"OPENAI_API_KEY is not set.\");\n if (_client && _clientKey === key) return _client;\n\n const configuration = new Configuration({\n apiKey: key,\n basePath: CHATBOT_LOCAL ? \"http://127.0.0.1:3000/v1/\" : \"https://api.deepseek.com\",\n });\n logger.debug(`Using Deepseek API at ${configuration.basePath}`);\n logger.debug(`OpenAI API key: ${key.substring(0, 7)}...`);\n _client = new OpenAIApi(configuration);\n _clientKey = key;\n return _client;\n}\n\nasync function chat(args) {\n const client = getClient();\n const payload = {\n model: args.model,\n messages: args.messages,\n };\n if (args.temperature !== undefined) payload.temperature = args.temperature;\n if (args.max_tokens !== undefined) payload.max_tokens = args.max_tokens;\n if (args.tools !== undefined) payload.tools = args.tools;\n if (args.tool_choice !== undefined) payload.tool_choice = args.tool_choice;\n if (args.response_format !== undefined) payload.response_format = args.response_format;\n\n const raw = await client.createChatCompletion(payload);\n const choice = raw?.data?.choices?.[0];\n const message = choice?.message || {};\n return {\n result: {\n content: message.content ?? \"\",\n tool_calls: message.tool_calls,\n finish_reason: choice?.finish_reason,\n },\n usage: raw?.data?.usage || {},\n raw,\n };\n}\n\nasync function* chatStream(args) {\n const client = getClient();\n const payload = {\n model: args.model,\n messages: args.messages,\n stream: true,\n };\n if (args.temperature !== undefined) payload.temperature = args.temperature;\n if (args.max_tokens !== undefined) payload.max_tokens = args.max_tokens;\n if (args.tools !== undefined) payload.tools = args.tools;\n if (args.tool_choice !== undefined) payload.tool_choice = args.tool_choice;\n if (args.response_format !== undefined) payload.response_format = args.response_format;\n\n const raw = await client.createChatCompletion(payload, { responseType: \"stream\" });\n const stream = raw.data;\n\n let buffer = \"\";\n for await (const chunk of stream) {\n buffer += chunk.toString();\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop(); // keep incomplete line in buffer\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed.startsWith(\"data: \")) continue;\n const data = trimmed.slice(6).trim();\n if (data === \"[DONE]\") return;\n try {\n const parsed = JSON.parse(data);\n const delta = parsed.choices?.[0]?.delta;\n const finish_reason = parsed.choices?.[0]?.finish_reason;\n yield {\n content: delta?.content || \"\",\n tool_calls: delta?.tool_calls,\n finish_reason,\n };\n } catch (_) {\n // ignore malformed SSE lines\n }\n }\n }\n\n // flush remaining buffer\n if (buffer.trim().startsWith(\"data: \")) {\n const data = buffer.trim().slice(6).trim();\n if (data !== \"[DONE]\") {\n try {\n const parsed = JSON.parse(data);\n const delta = parsed.choices?.[0]?.delta;\n const finish_reason = parsed.choices?.[0]?.finish_reason;\n yield {\n content: delta?.content || \"\",\n tool_calls: delta?.tool_calls,\n finish_reason,\n };\n } catch (_) {}\n }\n }\n}\n\nmodule.exports = { chat, chatStream, getClient };\n"}, "f5271b8cb5ba10a45ecc926967db49a35d3931e5": {"t": 1785758740.1713855, "n": 1998, "h": "e15e50165e06f4d6", "c": "// DeepSeek chat completions via the OpenAI SDK v3 compatibility layer.\n// This module owns the single DeepSeek client used across the bot — no other\n// file should construct `new OpenAIApi(...)`. Adapter is retry- and timeout-\n// naive; the router wraps it.\n\nconst { OpenAIApi, Configuration } = require(\"openai\");\nconst { CHATBOT_LOCAL } = require(\"../../../config.js\");\nconst logger = require(\"../../logger\");\n\nlet _client = null;\nlet _clientKey = null;\n\nfunction getClient() {\n const key = process.env.OPENAI_API_KEY;\n if (!key) throw new Error(\"OPENAI_API_KEY is not set.\");\n if (_client && _clientKey === key) return _client;\n\n const configuration = new Configuration({\n apiKey: key,\n basePath: CHATBOT_LOCAL ? \"http://127.0.0.1:3000/v1/\" : \"https://api.deepseek.com\",\n });\n logger.debug(`Using Deepseek API at ${configuration.basePath}`);\n logger.debug(`OpenAI API key: ${key.substring(0, 7)}...`);\n _client = new OpenAIApi(configuration);\n _clientKey = key;\n return _client;\n}\n\nasync function chat(args) {\n const client = getClient();\n const payload = {\n model: args.model,\n messages: args.messages,\n };\n if (args.temperature !== undefined) payload.temperature = args.temperature;\n if (args.max_tokens !== undefined) payload.max_tokens = args.max_tokens;\n if (args.tools !== undefined) payload.tools = args.tools;\n if (args.tool_choice !== undefined) payload.tool_choice = args.tool_choice;\n if (args.response_format !== undefined) payload.response_format = args.response_format;\n\n const raw = await client.createChatCompletion(payload);\n const choice = raw?.data?.choices?.[0];\n const message = choice?.message || {};\n return {\n result: {\n content: message.content ?? \"\",\n tool_calls: message.tool_calls,\n finish_reason: choice?.finish_reason,\n },\n usage: raw?.data?.usage || {},\n raw,\n };\n}\n\nmodule.exports = { chat, getClient };\n"}}, ".env.example": {"453ed332b48fa8c8cc3c41905f5ff48e4b201619": {"t": 1785747138.3843656, "n": 2361, "h": "98856954175a8577", "c": "# Discord Bot Configuration\nTOKEN=your_discord_bot_token_here\nCLIENT_ID=your_application_id_here\n\n# DeepSeek/OpenAI API\nOPENAI_API_KEY=your_api_key_here\nCONVO_MODEL=model_name_here\n\n# Google Gemini API (image understanding + image generation)\nGEMINI_API_KEY=your_gemini_api_key_here\n\n# Optional\nCOOKIE=your_youtube_cookie_here\nGENIUS_API_KEY=your_genius_key_here\nGITHUB_TOKEN=your_github_token_here\nBRAVE_API_KEY=your_brave_search_api_key\n\n# Polish milestone toggles\nLOW_BUDGET_MODE=false # true = cap tool depth to 2, skip critique, trim facts to 8\nCRITIQUE_MODEL=deepseek-reasoner # model used for self-critique pass (deepseek-reasoner costs ~10x more than deepseek-chat — set LOW_BUDGET_MODE=true to skip critique entirely)\nBOOKMARK_EMOJI=📌 # reaction emoji for pinning facts\nSTREAMING_ENABLED=false # true = stream chatbot responses into Discord with live edits\n\n# Rate limiting\nMENTION_COOLDOWN=60 # seconds between @-mentions of the bot per user\nCHAT_INFLIGHT_TIMEOUT_MS=120000 # max time a chatbot turn can be \"in flight\" before lock auto-clears\nCHAT_BURST_LIMIT=12 # max chatbot messages per user in the rolling window\nCHAT_BURST_WINDOW_MS=300000 # rolling window for chat burst cap (default 5 min)\n\n# Message archive retention (pruned daily at midnight)\nARCHIVE_RETENTION_DAYS=90 # drop archived chunks older than N days (0 = disabled)\nARCHIVE_MAX_ROWS_PER_CHANNEL=10000 # cap per-channel chunks at N rows (0 = disabled)\n\n# Reminders\nREMINDER_MAX_ACTIVE_PER_USER=10 # max pending reminders per user\nREMINDER_DM_FALLBACK=true # true = DM first, fall back to channel if DMs are closed\nREMINDER_MAX_GROUP_SIZE=25 # max members to DM for a role-targeted reminder\n\nADDITIONAL_NOUNS=your,additional,nouns,here,separated,by,commas\nADDITIONAL_ADJECTIVES=your,additional,adjectives,here,separated,\n\n# Discord IDs (required for full functionality)\nGUILD_ID=your_server_id_here\nBANNED_ROLE=your_banned_role_id_here\nOWNER_ID=your_owner_id_here\nCHATBOT_CHANNELS=your_chatbot_channel_id_here,another_chatbot_channel_id_here # separate multiple channels with commas\nTESTING_ROLE=your_testing_role_id_here\nRULES_CHANNEL_ID=your_rules_channel_id_here\nWELCOME_CHANNEL_ID=your_welcome_channel_id_here\nRIP_CHANNEL_ID=your_rip_channel_id_here\nPHANTOM_CHANNEL_CATEGORY=your_category_id_here"}, "17ec89e7ab9c5f4aca54da28768843aaff9062e5": {"t": 1785758735.2921538, "n": 2361, "h": "98856954175a8577", "c": "# Discord Bot Configuration\nTOKEN=your_discord_bot_token_here\nCLIENT_ID=your_application_id_here\n\n# DeepSeek/OpenAI API\nOPENAI_API_KEY=your_api_key_here\nCONVO_MODEL=model_name_here\n\n# Google Gemini API (image understanding + image generation)\nGEMINI_API_KEY=your_gemini_api_key_here\n\n# Optional\nCOOKIE=your_youtube_cookie_here\nGENIUS_API_KEY=your_genius_key_here\nGITHUB_TOKEN=your_github_token_here\nBRAVE_API_KEY=your_brave_search_api_key\n\n# Polish milestone toggles\nLOW_BUDGET_MODE=false # true = cap tool depth to 2, skip critique, trim facts to 8\nCRITIQUE_MODEL=deepseek-reasoner # model used for self-critique pass (deepseek-reasoner costs ~10x more than deepseek-chat — set LOW_BUDGET_MODE=true to skip critique entirely)\nBOOKMARK_EMOJI=📌 # reaction emoji for pinning facts\nSTREAMING_ENABLED=false # true = stream chatbot responses into Discord with live edits\n\n# Rate limiting\nMENTION_COOLDOWN=60 # seconds between @-mentions of the bot per user\nCHAT_INFLIGHT_TIMEOUT_MS=120000 # max time a chatbot turn can be \"in flight\" before lock auto-clears\nCHAT_BURST_LIMIT=12 # max chatbot messages per user in the rolling window\nCHAT_BURST_WINDOW_MS=300000 # rolling window for chat burst cap (default 5 min)\n\n# Message archive retention (pruned daily at midnight)\nARCHIVE_RETENTION_DAYS=90 # drop archived chunks older than N days (0 = disabled)\nARCHIVE_MAX_ROWS_PER_CHANNEL=10000 # cap per-channel chunks at N rows (0 = disabled)\n\n# Reminders\nREMINDER_MAX_ACTIVE_PER_USER=10 # max pending reminders per user\nREMINDER_DM_FALLBACK=true # true = DM first, fall back to channel if DMs are closed\nREMINDER_MAX_GROUP_SIZE=25 # max members to DM for a role-targeted reminder\n\nADDITIONAL_NOUNS=your,additional,nouns,here,separated,by,commas\nADDITIONAL_ADJECTIVES=your,additional,adjectives,here,separated,\n\n# Discord IDs (required for full functionality)\nGUILD_ID=your_server_id_here\nBANNED_ROLE=your_banned_role_id_here\nOWNER_ID=your_owner_id_here\nCHATBOT_CHANNELS=your_chatbot_channel_id_here,another_chatbot_channel_id_here # separate multiple channels with commas\nTESTING_ROLE=your_testing_role_id_here\nRULES_CHANNEL_ID=your_rules_channel_id_here\nWELCOME_CHANNEL_ID=your_welcome_channel_id_here\nRIP_CHANNEL_ID=your_rip_channel_id_here\nPHANTOM_CHANNEL_CATEGORY=your_category_id_here"}, "84d9401a7ae41bbeffa7e64e962f40afdfd477a1": {"t": 1785758736.4523103, "n": 2321, "h": "bb6c12eb824199c4", "c": "# Discord Bot Configuration\nTOKEN=your_discord_bot_token_here\nCLIENT_ID=your_application_id_here\n\n# DeepSeek/OpenAI API\nOPENAI_API_KEY=your_api_key_here\nCONVO_MODEL=model_name_here\n\n# Google Gemini API (image understanding + image generation)\nGEMINI_API_KEY=your_gemini_api_key_here\n\n# Optional\nCOOKIE=your_youtube_cookie_here\nGENIUS_API_KEY=your_genius_key_here\nGITHUB_TOKEN=your_github_token_here\n\n# Polish milestone toggles\nLOW_BUDGET_MODE=false # true = cap tool depth to 2, skip critique, trim facts to 8\nCRITIQUE_MODEL=deepseek-reasoner # model used for self-critique pass (deepseek-reasoner costs ~10x more than deepseek-chat — set LOW_BUDGET_MODE=true to skip critique entirely)\nBOOKMARK_EMOJI=📌 # reaction emoji for pinning facts\nSTREAMING_ENABLED=false # true = stream chatbot responses into Discord with live edits\n\n# Rate limiting\nMENTION_COOLDOWN=60 # seconds between @-mentions of the bot per user\nCHAT_INFLIGHT_TIMEOUT_MS=120000 # max time a chatbot turn can be \"in flight\" before lock auto-clears\nCHAT_BURST_LIMIT=12 # max chatbot messages per user in the rolling window\nCHAT_BURST_WINDOW_MS=300000 # rolling window for chat burst cap (default 5 min)\n\n# Message archive retention (pruned daily at midnight)\nARCHIVE_RETENTION_DAYS=90 # drop archived chunks older than N days (0 = disabled)\nARCHIVE_MAX_ROWS_PER_CHANNEL=10000 # cap per-channel chunks at N rows (0 = disabled)\n\n# Reminders\nREMINDER_MAX_ACTIVE_PER_USER=10 # max pending reminders per user\nREMINDER_DM_FALLBACK=true # true = DM first, fall back to channel if DMs are closed\nREMINDER_MAX_GROUP_SIZE=25 # max members to DM for a role-targeted reminder\n\nADDITIONAL_NOUNS=your,additional,nouns,here,separated,by,commas\nADDITIONAL_ADJECTIVES=your,additional,adjectives,here,separated,\n\n# Discord IDs (required for full functionality)\nGUILD_ID=your_server_id_here\nBANNED_ROLE=your_banned_role_id_here\nOWNER_ID=your_owner_id_here\nCHATBOT_CHANNELS=your_chatbot_channel_id_here,another_chatbot_channel_id_here # separate multiple channels with commas\nTESTING_ROLE=your_testing_role_id_here\nRULES_CHANNEL_ID=your_rules_channel_id_here\nWELCOME_CHANNEL_ID=your_welcome_channel_id_here\nRIP_CHANNEL_ID=your_rip_channel_id_here\nPHANTOM_CHANNEL_CATEGORY=your_category_id_here"}, "e370e4c072b9021b63afa45c7185390cc6ef023d": {"t": 1785758737.708689, "n": 2213, "h": "b7e16395408df082", "c": "# Discord Bot Configuration\nTOKEN=your_discord_bot_token_here\nCLIENT_ID=your_application_id_here\n\n# DeepSeek/OpenAI API\nOPENAI_API_KEY=your_api_key_here\nCONVO_MODEL=model_name_here\n\n# Google Gemini API (image understanding + image generation)\nGEMINI_API_KEY=your_gemini_api_key_here\n\n# Optional\nCOOKIE=your_youtube_cookie_here\nGENIUS_API_KEY=your_genius_key_here\nGITHUB_TOKEN=your_github_token_here\n\n# Polish milestone toggles\nLOW_BUDGET_MODE=false # true = cap tool depth to 2, skip critique, trim facts to 8\nCRITIQUE_MODEL=deepseek-reasoner # model used for self-critique pass\nBOOKMARK_EMOJI=📌 # reaction emoji for pinning facts\nSTREAMING_ENABLED=false # true = stream chatbot responses into Discord with live edits\n\n# Rate limiting\nMENTION_COOLDOWN=60 # seconds between @-mentions of the bot per user\nCHAT_INFLIGHT_TIMEOUT_MS=120000 # max time a chatbot turn can be \"in flight\" before lock auto-clears\nCHAT_BURST_LIMIT=12 # max chatbot messages per user in the rolling window\nCHAT_BURST_WINDOW_MS=300000 # rolling window for chat burst cap (default 5 min)\n\n# Message archive retention (pruned daily at midnight)\nARCHIVE_RETENTION_DAYS=90 # drop archived chunks older than N days (0 = disabled)\nARCHIVE_MAX_ROWS_PER_CHANNEL=10000 # cap per-channel chunks at N rows (0 = disabled)\n\n# Reminders\nREMINDER_MAX_ACTIVE_PER_USER=10 # max pending reminders per user\nREMINDER_DM_FALLBACK=true # true = DM first, fall back to channel if DMs are closed\nREMINDER_MAX_GROUP_SIZE=25 # max members to DM for a role-targeted reminder\n\nADDITIONAL_NOUNS=your,additional,nouns,here,separated,by,commas\nADDITIONAL_ADJECTIVES=your,additional,adjectives,here,separated,\n\n# Discord IDs (required for full functionality)\nGUILD_ID=your_server_id_here\nBANNED_ROLE=your_banned_role_id_here\nOWNER_ID=your_owner_id_here\nCHATBOT_CHANNELS=your_chatbot_channel_id_here,another_chatbot_channel_id_here # separate multiple channels with commas\nTESTING_ROLE=your_testing_role_id_here\nRULES_CHANNEL_ID=your_rules_channel_id_here\nWELCOME_CHANNEL_ID=your_welcome_channel_id_here\nRIP_CHANNEL_ID=your_rip_channel_id_here\nPHANTOM_CHANNEL_CATEGORY=your_category_id_here"}, "ba7cbffe83afadfc6a87ec3ac6c3e94f069cf6fd": {"t": 1785758739.031036, "n": 1939, "h": "2615e35a4d2d48dc", "c": "# Discord Bot Configuration\nTOKEN=your_discord_bot_token_here\nCLIENT_ID=your_application_id_here\n\n# DeepSeek/OpenAI API\nOPENAI_API_KEY=your_api_key_here\nCONVO_MODEL=model_name_here\n\n# Google Gemini API (image understanding + image generation)\nGEMINI_API_KEY=your_gemini_api_key_here\n\n# Optional\nCOOKIE=your_youtube_cookie_here\nGENIUS_API_KEY=your_genius_key_here\nGITHUB_TOKEN=your_github_token_here\n\n# Polish milestone toggles\nLOW_BUDGET_MODE=false # true = cap tool depth to 2, skip critique, trim facts to 8\nCRITIQUE_MODEL=deepseek-reasoner # model used for self-critique pass\nBOOKMARK_EMOJI=📌 # reaction emoji for pinning facts\nSTREAMING_ENABLED=false # true = stream chatbot responses into Discord with live edits\n\n# Rate limiting\nMENTION_COOLDOWN=60 # seconds between @-mentions of the bot per user\n\n# Message archive retention (pruned daily at midnight)\nARCHIVE_RETENTION_DAYS=90 # drop archived chunks older than N days (0 = disabled)\nARCHIVE_MAX_ROWS_PER_CHANNEL=10000 # cap per-channel chunks at N rows (0 = disabled)\n\n# Reminders\nREMINDER_MAX_ACTIVE_PER_USER=10 # max pending reminders per user\nREMINDER_DM_FALLBACK=true # true = DM first, fall back to channel if DMs are closed\nREMINDER_MAX_GROUP_SIZE=25 # max members to DM for a role-targeted reminder\n\nADDITIONAL_NOUNS=your,additional,nouns,here,separated,by,commas\nADDITIONAL_ADJECTIVES=your,additional,adjectives,here,separated,\n\n# Discord IDs (required for full functionality)\nGUILD_ID=your_server_id_here\nBANNED_ROLE=your_banned_role_id_here\nOWNER_ID=your_owner_id_here\nCHATBOT_CHANNELS=your_chatbot_channel_id_here,another_chatbot_channel_id_here # separate multiple channels with commas\nTESTING_ROLE=your_testing_role_id_here\nRULES_CHANNEL_ID=your_rules_channel_id_here\nWELCOME_CHANNEL_ID=your_welcome_channel_id_here\nRIP_CHANNEL_ID=your_rip_channel_id_here\nPHANTOM_CHANNEL_CATEGORY=your_category_id_here"}, "4d34a7970c10b35322695809d645e4e98a864591": {"t": 1785758740.2558103, "n": 1709, "h": "e04e4d1011e37a98", "c": "# Discord Bot Configuration\nTOKEN=your_discord_bot_token_here\nCLIENT_ID=your_application_id_here\n\n# DeepSeek/OpenAI API\nOPENAI_API_KEY=your_api_key_here\nCONVO_MODEL=model_name_here\n\n# Google Gemini API (image understanding + image generation)\nGEMINI_API_KEY=your_gemini_api_key_here\n\n# Optional\nCOOKIE=your_youtube_cookie_here\nGENIUS_API_KEY=your_genius_key_here\nGITHUB_TOKEN=your_github_token_here\n\n# Polish milestone toggles\nLOW_BUDGET_MODE=false # true = cap tool depth to 2, skip critique, trim facts to 8\nCRITIQUE_MODEL=deepseek-reasoner # model used for self-critique pass\nBOOKMARK_EMOJI=📌 # reaction emoji for pinning facts\nSTREAMING_ENABLED=false # true = stream chatbot responses into Discord with live edits\n\n# Rate limiting\nMENTION_COOLDOWN=60 # seconds between @-mentions of the bot per user\n\n# Reminders\nREMINDER_MAX_ACTIVE_PER_USER=10 # max pending reminders per user\nREMINDER_DM_FALLBACK=true # true = DM first, fall back to channel if DMs are closed\nREMINDER_MAX_GROUP_SIZE=25 # max members to DM for a role-targeted reminder\n\nADDITIONAL_NOUNS=your,additional,nouns,here,separated,by,commas\nADDITIONAL_ADJECTIVES=your,additional,adjectives,here,separated,\n\n# Discord IDs (required for full functionality)\nGUILD_ID=your_server_id_here\nBANNED_ROLE=your_banned_role_id_here\nOWNER_ID=your_owner_id_here\nCHATBOT_CHANNELS=your_chatbot_channel_id_here,another_chatbot_channel_id_here # separate multiple channels with commas\nTESTING_ROLE=your_testing_role_id_here\nRULES_CHANNEL_ID=your_rules_channel_id_here\nWELCOME_CHANNEL_ID=your_welcome_channel_id_here\nRIP_CHANNEL_ID=your_rip_channel_id_here\nPHANTOM_CHANNEL_CATEGORY=your_category_id_here"}, "41446e43fe7fc9465f82eb86e03ef636e59a5c64": {"t": 1785758741.6465213, "n": 1610, "h": "83f8037d617cf156", "c": "# Discord Bot Configuration\nTOKEN=your_discord_bot_token_here\nCLIENT_ID=your_application_id_here\n\n# DeepSeek/OpenAI API\nOPENAI_API_KEY=your_api_key_here\nCONVO_MODEL=model_name_here\n\n# Google Gemini API (image understanding + image generation)\nGEMINI_API_KEY=your_gemini_api_key_here\n\n# Optional\nCOOKIE=your_youtube_cookie_here\nGENIUS_API_KEY=your_genius_key_here\nGITHUB_TOKEN=your_github_token_here\n\n# Polish milestone toggles\nLOW_BUDGET_MODE=false # true = cap tool depth to 2, skip critique, trim facts to 8\nCRITIQUE_MODEL=deepseek-reasoner # model used for self-critique pass\nBOOKMARK_EMOJI=📌 # reaction emoji for pinning facts\nSTREAMING_ENABLED=false # true = stream chatbot responses into Discord with live edits\n\n# Reminders\nREMINDER_MAX_ACTIVE_PER_USER=10 # max pending reminders per user\nREMINDER_DM_FALLBACK=true # true = DM first, fall back to channel if DMs are closed\nREMINDER_MAX_GROUP_SIZE=25 # max members to DM for a role-targeted reminder\n\nADDITIONAL_NOUNS=your,additional,nouns,here,separated,by,commas\nADDITIONAL_ADJECTIVES=your,additional,adjectives,here,separated,\n\n# Discord IDs (required for full functionality)\nGUILD_ID=your_server_id_here\nBANNED_ROLE=your_banned_role_id_here\nOWNER_ID=your_owner_id_here\nCHATBOT_CHANNELS=your_chatbot_channel_id_here,another_chatbot_channel_id_here # separate multiple channels with commas\nTESTING_ROLE=your_testing_role_id_here\nRULES_CHANNEL_ID=your_rules_channel_id_here\nWELCOME_CHANNEL_ID=your_welcome_channel_id_here\nRIP_CHANNEL_ID=your_rip_channel_id_here\nPHANTOM_CHANNEL_CATEGORY=your_category_id_here"}, "f27939335141be0c400b4bfd4b600d8701a61396": {"t": 1785758742.9305694, "n": 1528, "h": "41dbbb4578534143", "c": "# Discord Bot Configuration\nTOKEN=your_discord_bot_token_here\nCLIENT_ID=your_application_id_here\n\n# DeepSeek/OpenAI API\nOPENAI_API_KEY=your_api_key_here\nCONVO_MODEL=model_name_here\n\n# Google Gemini API (image understanding + image generation)\nGEMINI_API_KEY=your_gemini_api_key_here\n\n# Optional\nCOOKIE=your_youtube_cookie_here\nGENIUS_API_KEY=your_genius_key_here\nGITHUB_TOKEN=your_github_token_here\n\n# Polish milestone toggles\nLOW_BUDGET_MODE=false # true = cap tool depth to 2, skip critique, trim facts to 8\nCRITIQUE_MODEL=deepseek-reasoner # model used for self-critique pass\nBOOKMARK_EMOJI=📌 # reaction emoji for pinning facts\nSTREAMING_ENABLED=false # true = stream chatbot responses into Discord with live edits\n\n# Reminders\nREMINDER_MAX_ACTIVE_PER_USER=10 # max pending reminders per user\nREMINDER_DM_FALLBACK=true # true = DM first, fall back to channel if DMs are closed\n\nADDITIONAL_NOUNS=your,additional,nouns,here,separated,by,commas\nADDITIONAL_ADJECTIVES=your,additional,adjectives,here,separated,\n\n# Discord IDs (required for full functionality)\nGUILD_ID=your_server_id_here\nBANNED_ROLE=your_banned_role_id_here\nOWNER_ID=your_owner_id_here\nCHATBOT_CHANNELS=your_chatbot_channel_id_here,another_chatbot_channel_id_here # separate multiple channels with commas\nTESTING_ROLE=your_testing_role_id_here\nRULES_CHANNEL_ID=your_rules_channel_id_here\nWELCOME_CHANNEL_ID=your_welcome_channel_id_here\nRIP_CHANNEL_ID=your_rip_channel_id_here\nPHANTOM_CHANNEL_CATEGORY=your_category_id_here"}, "17407e8d4cfc57e71922cc8862e7f4ce54b67527": {"t": 1785758744.3937962, "n": 1008, "h": "d93c4d1301940010", "c": "# Discord Bot Configuration\nTOKEN=your_discord_bot_token_here\nCLIENT_ID=your_application_id_here\n\n# DeepSeek/OpenAI API\nOPENAI_API_KEY=your_api_key_here\nCONVO_MODEL=model_name_here\n\n# Google Gemini API (image understanding + image generation)\nGEMINI_API_KEY=your_gemini_api_key_here\n\n# Optional\nCOOKIE=your_youtube_cookie_here\nGENIUS_API_KEY=your_genius_key_here\nGITHUB_TOKEN=your_github_token_here\n\nADDITIONAL_NOUNS=your,additional,nouns,here,separated,by,commas\nADDITIONAL_ADJECTIVES=your,additional,adjectives,here,separated,\n\n# Discord IDs (required for full functionality)\nGUILD_ID=your_server_id_here\nBANNED_ROLE=your_banned_role_id_here\nOWNER_ID=your_owner_id_here\nCHATBOT_CHANNELS=your_chatbot_channel_id_here,another_chatbot_channel_id_here # separate multiple channels with commas\nTESTING_ROLE=your_testing_role_id_here\nRULES_CHANNEL_ID=your_rules_channel_id_here\nWELCOME_CHANNEL_ID=your_welcome_channel_id_here\nRIP_CHANNEL_ID=your_rip_channel_id_here\nPHANTOM_CHANNEL_CATEGORY=your_category_id_here"}, "6b712fda05160b67357822b5020db4d0374dea40": {"t": 1785758745.8455093, "n": 980, "h": "ef9139600328df68", "c": "# Discord Bot Configuration\nTOKEN=your_discord_bot_token_here\nCLIENT_ID=your_application_id_here\n\n# DeepSeek/OpenAI API\nOPENAI_API_KEY=your_api_key_here\n\n# Google Gemini API (image understanding + image generation)\nGEMINI_API_KEY=your_gemini_api_key_here\n\n# Optional\nCOOKIE=your_youtube_cookie_here\nGENIUS_API_KEY=your_genius_key_here\nGITHUB_TOKEN=your_github_token_here\n\nADDITIONAL_NOUNS=your,additional,nouns,here,separated,by,commas\nADDITIONAL_ADJECTIVES=your,additional,adjectives,here,separated,\n\n# Discord IDs (required for full functionality)\nGUILD_ID=your_server_id_here\nBANNED_ROLE=your_banned_role_id_here\nOWNER_ID=your_owner_id_here\nCHATBOT_CHANNELS=your_chatbot_channel_id_here,another_chatbot_channel_id_here # separate multiple channels with commas\nTESTING_ROLE=your_testing_role_id_here\nRULES_CHANNEL_ID=your_rules_channel_id_here\nWELCOME_CHANNEL_ID=your_welcome_channel_id_here\nRIP_CHANNEL_ID=your_rip_channel_id_here\nPHANTOM_CHANNEL_CATEGORY=your_category_id_here"}, "cb243406df30d904cb1c1352c7efa8427890c1a3": {"t": 1785758747.317568, "n": 850, "h": "b35b06c0f47a3788", "c": "# Discord Bot Configuration\nTOKEN=your_discord_bot_token_here\nCLIENT_ID=your_application_id_here\n\n# DeepSeek/OpenAI API\nOPENAI_API_KEY=your_api_key_here\n\n# Google Gemini API (image understanding + image generation)\nGEMINI_API_KEY=your_gemini_api_key_here\n\n# Optional\nCOOKIE=your_youtube_cookie_here\nGENIUS_API_KEY=your_genius_key_here\nGITHUB_TOKEN=your_github_token_here\n\n# Discord IDs (required for full functionality)\nGUILD_ID=your_server_id_here\nBANNED_ROLE=your_banned_role_id_here\nOWNER_ID=your_owner_id_here\nCHATBOT_CHANNELS=your_chatbot_channel_id_here,another_chatbot_channel_id_here # separate multiple channels with commas\nTESTING_ROLE=your_testing_role_id_here\nRULES_CHANNEL_ID=your_rules_channel_id_here\nWELCOME_CHANNEL_ID=your_welcome_channel_id_here\nRIP_CHANNEL_ID=your_rip_channel_id_here\nPHANTOM_CHANNEL_CATEGORY=your_category_id_here"}, "6541899c22e822320d75e7c4809d650f7bc8081d": {"t": 1785758748.5178442, "n": 748, "h": "a9b514444b6f8d75", "c": "# Discord Bot Configuration\nTOKEN=your_discord_bot_token_here\nCLIENT_ID=your_application_id_here\n\n# DeepSeek/OpenAI API\nOPENAI_API_KEY=your_api_key_here\n\n# Optional\nCOOKIE=your_youtube_cookie_here\nGENIUS_API_KEY=your_genius_key_here\nGITHUB_TOKEN=your_github_token_here\n\n# Discord IDs (required for full functionality)\nGUILD_ID=your_server_id_here\nBANNED_ROLE=your_banned_role_id_here\nOWNER_ID=your_owner_id_here\nCHATBOT_CHANNELS=your_chatbot_channel_id_here,another_chatbot_channel_id_here # separate multiple channels with commas\nTESTING_ROLE=your_testing_role_id_here\nRULES_CHANNEL_ID=your_rules_channel_id_here\nWELCOME_CHANNEL_ID=your_welcome_channel_id_here\nRIP_CHANNEL_ID=your_rip_channel_id_here\nPHANTOM_CHANNEL_CATEGORY=your_category_id_here"}, "34fb478c83dfe461b7d6dbe4415682df5afbd0f7": {"t": 1785758749.7089791, "n": 674, "h": "2819c79a23a1a5c2", "c": "# Discord Bot Configuration\nTOKEN=your_discord_bot_token_here\nCLIENT_ID=your_application_id_here\n\n# DeepSeek/OpenAI API\nOPENAI_API_KEY=your_api_key_here\n\n# Optional\nCOOKIE=your_youtube_cookie_here\nGENIUS_API_KEY=your_genius_key_here\nGITHUB_TOKEN=your_github_token_here\n\n# Discord IDs (required for full functionality)\nGUILD_ID=your_server_id_here\nBANNED_ROLE=your_banned_role_id_here\nOWNER_ID=your_owner_id_here\nCHATBOT_CHANNEL=your_chatbot_channel_id_here\nTESTING_ROLE=your_testing_role_id_here\nRULES_CHANNEL_ID=your_rules_channel_id_here\nWELCOME_CHANNEL_ID=your_welcome_channel_id_here\nRIP_CHANNEL_ID=your_rip_channel_id_here\nPHANTOM_CHANNEL_CATEGORY=your_category_id_here"}}}}