196 lines
4.9 KiB
JavaScript
196 lines
4.9 KiB
JavaScript
#!/usr/bin/env node
|
|
/**
|
|
* DeepSeek API Client
|
|
* 让 DeepSeek 帮你写代码!
|
|
*/
|
|
|
|
const fs = require('fs');
|
|
const path = require('path');
|
|
const https = require('https');
|
|
|
|
// 配置
|
|
const CONFIG_PATH = process.env.DEEPSEEK_CONFIG_PATH ||
|
|
path.join(process.env.HOME || process.env.USERPROFILE, '.config', 'deepseek', 'api_key');
|
|
|
|
const API_KEY = fs.readFileSync(CONFIG_PATH, 'utf8').trim();
|
|
const API_URL = 'https://api.deepseek.com/chat/completions';
|
|
const MODEL = 'deepseek-coder';
|
|
|
|
class DeepSeek {
|
|
constructor() {
|
|
this.apiKey = API_KEY;
|
|
this.model = MODEL;
|
|
}
|
|
|
|
async chat(messages, options = {}) {
|
|
const maxTokens = options.maxTokens || 4096;
|
|
const temperature = options.temperature || 0.7;
|
|
|
|
const data = JSON.stringify({
|
|
model: this.model,
|
|
messages: messages,
|
|
max_tokens: maxTokens,
|
|
temperature: temperature
|
|
});
|
|
|
|
return new Promise((resolve, reject) => {
|
|
const url = new URL(API_URL);
|
|
|
|
const options = {
|
|
hostname: url.hostname,
|
|
port: url.port || 443,
|
|
path: url.pathname,
|
|
method: 'POST',
|
|
headers: {
|
|
'Authorization': `Bearer ${this.apiKey}`,
|
|
'Content-Type': 'application/json',
|
|
'Content-Length': Buffer.byteLength(data)
|
|
},
|
|
timeout: 60000
|
|
};
|
|
|
|
const req = https.request(options, (res) => {
|
|
let body = '';
|
|
res.on('data', chunk => body += chunk);
|
|
res.on('end', () => {
|
|
try {
|
|
const json = JSON.parse(body);
|
|
if (json.choices && json.choices[0]) {
|
|
resolve(json.choices[0].message.content);
|
|
} else {
|
|
reject(new Error(`API 错误: ${body}`));
|
|
}
|
|
} catch (e) {
|
|
reject(e);
|
|
}
|
|
});
|
|
});
|
|
|
|
req.on('error', reject);
|
|
req.write(data);
|
|
req.end();
|
|
});
|
|
}
|
|
|
|
async complete(prompt, language = 'javascript') {
|
|
const messages = [
|
|
{
|
|
role: 'system',
|
|
content: `你是专业程序员,擅长写高质量代码。只输出代码,不要解释。`
|
|
},
|
|
{
|
|
role: 'user',
|
|
content: `用 ${language} 写代码:\n\n${prompt}`
|
|
}
|
|
];
|
|
|
|
return await this.chat(messages);
|
|
}
|
|
|
|
async fixBug(code, error) {
|
|
const messages = [
|
|
{
|
|
role: 'system',
|
|
content: `你是资深程序员,擅长调试和修复 bug。`
|
|
},
|
|
{
|
|
role: 'user',
|
|
content: `修复以下代码的 bug:\n\n错误: ${error}\n\n代码:\n${code}\n\n只输出修复后的完整代码。`
|
|
}
|
|
];
|
|
|
|
return await this.chat(messages);
|
|
}
|
|
|
|
async explain(code) {
|
|
const messages = [
|
|
{
|
|
role: 'system',
|
|
content: `你是专业程序员,善于解释代码。`
|
|
},
|
|
{
|
|
role: 'user',
|
|
content: `解释以下代码:\n\n${code}`
|
|
}
|
|
];
|
|
|
|
return await this.chat(messages);
|
|
}
|
|
}
|
|
|
|
async function main() {
|
|
const args = process.argv.slice(2);
|
|
const command = args[0] || 'help';
|
|
|
|
const ds = new DeepSeek();
|
|
|
|
try {
|
|
switch (command) {
|
|
case 'chat':
|
|
const msg = args.slice(1).join(' ');
|
|
console.log('\n🤖 DeepSeek:\n');
|
|
const response = await ds.chat([{ role: 'user', content: msg }]);
|
|
console.log(response);
|
|
break;
|
|
|
|
case 'code':
|
|
const prompt = args.slice(1).join(' ');
|
|
console.log('\n💻 生成代码:\n');
|
|
const code = await ds.complete(prompt);
|
|
console.log(code);
|
|
break;
|
|
|
|
case 'fix':
|
|
const error = args[1] || '未知错误';
|
|
const buggyCode = args.slice(2).join(' ');
|
|
console.log('\n🔧 修复 bug:\n');
|
|
const fixed = await ds.fixBug(buggyCode, error);
|
|
console.log(fixed);
|
|
break;
|
|
|
|
case 'explain':
|
|
const codeToExplain = args.slice(1).join(' ');
|
|
console.log('\n📖 解释代码:\n');
|
|
const explained = await ds.explain(codeToExplain);
|
|
console.log(explained);
|
|
break;
|
|
|
|
case 'version':
|
|
console.log(`\n🤖 DeepSeek API Client`);
|
|
console.log(`Model: ${ds.model}\n`);
|
|
break;
|
|
|
|
case 'help':
|
|
default:
|
|
console.log(`
|
|
🤖 DeepSeek AI 编程助手
|
|
|
|
用法:
|
|
deepseek chat "你是一个python专家" # 对话
|
|
deepseek code "写一个快速排序" # 生成代码
|
|
deepseek fix "错误信息" " buggy code" # 修复 bug
|
|
deepseek explain "code" # 解释代码
|
|
deepseek version # 版本
|
|
deepseek help # 帮助
|
|
|
|
示例:
|
|
deepseek code "用 Node.js 写一个 HTTP 服务器"
|
|
deepseek fix "Cannot read property" "const a = b.c"
|
|
|
|
配置:
|
|
API Key: ~/.config/deepseek/api_key
|
|
模型: deepseek-coder
|
|
`);
|
|
break;
|
|
}
|
|
} catch (error) {
|
|
console.error('\n❌ 错误:', error.message);
|
|
}
|
|
}
|
|
|
|
module.exports = { DeepSeek };
|
|
|
|
if (require.main === module) {
|
|
main();
|
|
}
|