DashXx / plugins /deepseek.js
HerzaJ's picture
Update plugins/deepseek.js
8211e2e verified
const axios = require('axios');
const deepseek = {
api: {
base: 'https://api.deepseek.com',
endpoint: {
chat: '/chat/completions'
},
key: 'sk-25a055f31b5e4e0d9f0eb5d9fcac64fc'
},
headers: {
'user-agent': 'NB Android/1.0.0',
'content-type': 'application/json'
},
isModels: ["deepseek-chat", "deepseek-coder", "deepseek-reasoner"],
sessions: new Map(),
now: () => Date.now(),
get: (id) => deepseek.sessions.get(id) || { messages: [], lastActive: deepseek.now() },
set: (id, msgs) => deepseek.sessions.set(id, { messages: msgs, lastActive: deepseek.now() }),
purge: (interval = 60 * 60 * 1000) => {
for (const [id, session] of deepseek.sessions) {
if (deepseek.now() - session.lastActive > interval) {
deepseek.sessions.delete(id);
}
}
},
msg: {
sys: (prev, cp) => ({
role: 'system',
content: cp || `
You are an AI road dogs with a sassy, sarcastic, and playful personality.
Your instructions are written in English, but your OUTPUT must always be in Indonesian
...
Previous chat:
${prev.map(m => `${m.role}: ${m.content}`).join('\n')}
`
}),
usr: (c) => ({ role: 'user', content: c }),
ai: (c) => ({ role: 'assistant', content: c, timestamp: deepseek.now() })
},
chat: async (input, sessionId = null, model = 'deepseek-chat', stream = false, opts = {}) => {
if (!input || input.trim() === "") {
return { success: false, code: 400, author: 'Daffa ~', team: "NB Team", result: { error: "Inputnya kagak boleh kosong bree..." } };
}
if (!deepseek.isModels.includes(model)) {
return { success: false, code: 400, author: 'Daffa ~', team: "NB Team", result: { error: `Model '${model}' kagak ada bree... Pilih salah satu: ${deepseek.isModels.join(", ")}` } };
}
const { messages: prev } = deepseek.get(sessionId || '');
const msgs = [deepseek.msg.sys(prev, opts.prompt), ...prev, deepseek.msg.usr(input)];
const url = `${deepseek.api.base}${deepseek.api.endpoint.chat}`;
const body = {
model,
messages: msgs,
temperature: opts.temperature ?? 0.9,
max_tokens: opts.max_tokens ?? 1024,
top_p: opts.top_p ?? 0.95,
stream
};
const cfg = {
headers: { ...deepseek.headers, Authorization: `Bearer ${deepseek.api.key}` },
responseType: stream ? 'stream' : 'json',
timeout: opts.timeout ?? 30000
};
try {
const res = await axios.post(url, body, cfg);
if (stream === false) {
const apiId = res?.data?.id;
const sid = sessionId || apiId;
const c = res?.data?.choices?.[0]?.message?.content ?? '';
const ai = deepseek.msg.ai(c);
const updated = [...prev, { role: 'user', content: input, timestamp: deepseek.now() }, ai]
.slice(-(opts.maxHistory ?? 10));
deepseek.set(sid, updated);
deepseek.purge(opts.purgeInterval);
return { success: true, code: 200, author: 'Daffa ~', team: "NB Team", result: { mode: 'parsed', sessionId: sid, user: input, assistant: ai.content, history: updated } };
} else {
return await new Promise((resolve) => {
let raw = '', apiId = null;
res.data.on('data', (chunk) => {
const str = chunk.toString();
raw += str;
if (str.startsWith('data:')) {
try {
const json = JSON.parse(str.replace(/^data:\s*/, ''));
if (!apiId && json.id) apiId = json.id;
const delta = json.choices?.[0]?.delta?.content;
if (delta && opts.onToken) {
opts.onToken(delta);
}
} catch {}
}
});
res.data.on('end', () => {
const sid = sessionId || apiId;
const ai = deepseek.msg.ai(raw);
const updated = [...prev, { role: 'user', content: input, timestamp: deepseek.now() }, ai]
.slice(-(opts.maxHistory ?? 10));
deepseek.set(sid, updated);
deepseek.purge(opts.purgeInterval);
res.data.destroy();
resolve({ success: true, code: 200, author: 'Daffa ~', team: "NB Team", result: { mode: 'stream', sessionId: sid, user: input, assistant: raw, history: updated } });
});
res.data.on('error', (err) => {
res.data.destroy();
if (opts.onError) opts.onError(err);
resolve({ success: false, code: 500, author: 'Daffa ~', team: "NB Team", result: { error: 'Error: ' + err.message } });
});
});
}
} catch (err) {
const a = err?.response?.data || err.message;
return { success: false, code: err?.response?.status || 500, author: 'Daffa ~', team: "NB Team", result: { error: `Error: ${a}` } };
}
}
};
const handler = async (req, res) => {
try {
const { text, sessionId, model, stream, temperature, max_tokens, prompt } = req.query;
if (!text) {
return res.status(400).json({
author: 'Daffa ~',
team: 'NB Team',
success: false,
msg: 'Missing required parameter: text'
});
}
const opts = {};
if (temperature) opts.temperature = parseFloat(temperature);
if (max_tokens) opts.max_tokens = parseInt(max_tokens);
if (prompt) opts.prompt = prompt;
const result = await deepseek.chat(
text,
sessionId || null,
model || 'deepseek-chat',
stream === 'true',
opts
);
if (!result.success) {
return res.status(result.code).json({
author: result.author,
team: result.team,
success: false,
msg: result.result.error
});
}
res.json({
author: result.author,
team: result.team,
success: true,
data: result.result
});
} catch (error) {
console.error('Error:', error);
res.status(500).json({
author: 'Daffa ~',
team: 'NB Team',
success: false,
msg: 'Terjadi kesalahan saat menghubungi DeepSeek AI.'
});
}
};
module.exports = {
name: 'DeepSeek AI',
description: 'Generate responses using DeepSeek AI with session support',
type: 'GET',
routes: ['api/AI/deepseek'],
tags: ['ai', 'deepseek', 'chat'],
parameters: ['text', 'sessionId', 'model', 'stream', 'temperature', 'max_tokens', 'prompt'],
enabled: true,
main: ['AI'],
limit: 8,
handler
};