@yxw007/translate 0.1.2 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/index.cjs +88 -84
- package/dist/browser/index.cjs.map +1 -1
- package/dist/browser/index.esm.js +88 -84
- package/dist/browser/index.esm.js.map +1 -1
- package/dist/browser/index.esm.min.js +1 -1
- package/dist/browser/index.esm.min.js.map +1 -1
- package/dist/browser/index.min.cjs +1 -1
- package/dist/browser/index.min.cjs.map +1 -1
- package/dist/browser/index.umd.js +88 -84
- package/dist/browser/index.umd.js.map +1 -1
- package/dist/browser/index.umd.min.js +1 -1
- package/dist/browser/index.umd.min.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/node/index.cjs +88 -84
- package/dist/node/index.cjs.map +1 -1
- package/dist/node/index.js +88 -84
- package/dist/node/index.js.map +1 -1
- package/dist/package.json +1 -1
- package/package.json +1 -1
package/dist/browser/index.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// translate v0.1.
|
|
1
|
+
// translate v0.1.4 Copyright (c) 2024 Potter<aa4790139@gmail.com> and contributors
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
4
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
@@ -1375,89 +1375,6 @@ function deepl$2(options) {
|
|
|
1375
1375
|
};
|
|
1376
1376
|
}
|
|
1377
1377
|
|
|
1378
|
-
function openai$1(options) {
|
|
1379
|
-
const { apiKey, model, maxTokens = 2000 } = options;
|
|
1380
|
-
const name = "openai";
|
|
1381
|
-
const checkOptions = () => {
|
|
1382
|
-
if (!apiKey) {
|
|
1383
|
-
throw new TranslationError(name, `${name} apiKey is required`);
|
|
1384
|
-
}
|
|
1385
|
-
if (!OPEN_AI_MODELS.includes(model)) {
|
|
1386
|
-
throw new TranslationError(name, `${name} model=${model} is invalid`);
|
|
1387
|
-
}
|
|
1388
|
-
};
|
|
1389
|
-
checkOptions();
|
|
1390
|
-
const base = "https://api.openai.com/v1/chat/completions";
|
|
1391
|
-
return {
|
|
1392
|
-
name,
|
|
1393
|
-
async translate(text, opts) {
|
|
1394
|
-
checkOptions();
|
|
1395
|
-
const { from, to } = opts;
|
|
1396
|
-
const url = `${base}`;
|
|
1397
|
-
if (!Array.isArray(text)) {
|
|
1398
|
-
text = [text];
|
|
1399
|
-
}
|
|
1400
|
-
const prompt = {
|
|
1401
|
-
role: "user",
|
|
1402
|
-
content: `
|
|
1403
|
-
翻译要求:
|
|
1404
|
-
1.将每段文本从${from}翻译为${to}
|
|
1405
|
-
2.文本内容以换行符\n进行段落分割,并以段落分割顺序进行翻译
|
|
1406
|
-
3.仅翻译分割出的段落,其他任何不相关的内容都移除,比如:段落前后的空格、所有标点符号
|
|
1407
|
-
4.仅返回要翻译的文本内容,不要返回任何其他内容
|
|
1408
|
-
|
|
1409
|
-
|
|
1410
|
-
如何提取翻译文本:
|
|
1411
|
-
1.翻译从-$s$-字符标记开始至-$e$-字符标记结束,提取-$s$-至-$e$-之间的内容
|
|
1412
|
-
2.-$s$-和-$e$-这2个标记不要返回,只是用来标记翻译的起始和结束位置
|
|
1413
|
-
|
|
1414
|
-
-$s$-
|
|
1415
|
-
${text.join("\n")}
|
|
1416
|
-
-$e$-
|
|
1417
|
-
`,
|
|
1418
|
-
};
|
|
1419
|
-
const res = await fetch(url, {
|
|
1420
|
-
method: "POST",
|
|
1421
|
-
headers: {
|
|
1422
|
-
"Content-Type": "application/json",
|
|
1423
|
-
Authorization: `Bearer ${apiKey}`,
|
|
1424
|
-
},
|
|
1425
|
-
body: JSON.stringify({
|
|
1426
|
-
model,
|
|
1427
|
-
messages: [{ role: "system", content: "You are a professional translator" }, prompt],
|
|
1428
|
-
max_tokens: maxTokens,
|
|
1429
|
-
temperature: 0,
|
|
1430
|
-
}),
|
|
1431
|
-
});
|
|
1432
|
-
const bodyRes = await res.json();
|
|
1433
|
-
if (bodyRes.error) {
|
|
1434
|
-
throw new TranslationError(this.name, `Translate fail! message: ${bodyRes.error.message}`);
|
|
1435
|
-
}
|
|
1436
|
-
if (!bodyRes || !bodyRes.choices || bodyRes.choices.length === 0 || !bodyRes.choices[0]?.message?.content) {
|
|
1437
|
-
throw new TranslationError(this.name, "Translate fail ! translate's result is null or empty");
|
|
1438
|
-
}
|
|
1439
|
-
const content = bodyRes.choices[0].message.content;
|
|
1440
|
-
const marks = ["-$s$-", "-$e$-"];
|
|
1441
|
-
const translations = content
|
|
1442
|
-
.trim()
|
|
1443
|
-
.split("\n")
|
|
1444
|
-
.map((item) => item.trim())
|
|
1445
|
-
.filter(Boolean)
|
|
1446
|
-
.filter((it) => !marks.includes(it));
|
|
1447
|
-
return translations;
|
|
1448
|
-
},
|
|
1449
|
-
};
|
|
1450
|
-
}
|
|
1451
|
-
|
|
1452
|
-
const engines = {
|
|
1453
|
-
google,
|
|
1454
|
-
azure: azure$1,
|
|
1455
|
-
amazon: amazon$1,
|
|
1456
|
-
baidu: baidu$1,
|
|
1457
|
-
deepl: deepl$2,
|
|
1458
|
-
openai: openai$1,
|
|
1459
|
-
};
|
|
1460
|
-
|
|
1461
1378
|
class Cache {
|
|
1462
1379
|
cache;
|
|
1463
1380
|
constructor() {
|
|
@@ -1545,6 +1462,93 @@ function getErrorMessages(e, prefix = "Translate fail ! ") {
|
|
|
1545
1462
|
return prefix + e.message;
|
|
1546
1463
|
}
|
|
1547
1464
|
|
|
1465
|
+
const logger$1 = useLogger("openai");
|
|
1466
|
+
function openai$1(options) {
|
|
1467
|
+
const { apiKey, model, maxTokens = 2000, outputLog = false } = options;
|
|
1468
|
+
const name = "openai";
|
|
1469
|
+
const checkOptions = () => {
|
|
1470
|
+
if (!apiKey) {
|
|
1471
|
+
throw new TranslationError(name, `${name} apiKey is required`);
|
|
1472
|
+
}
|
|
1473
|
+
if (!OPEN_AI_MODELS.includes(model)) {
|
|
1474
|
+
throw new TranslationError(name, `${name} model=${model} is invalid`);
|
|
1475
|
+
}
|
|
1476
|
+
};
|
|
1477
|
+
checkOptions();
|
|
1478
|
+
const base = "https://api.openai.com/v1/chat/completions";
|
|
1479
|
+
return {
|
|
1480
|
+
name,
|
|
1481
|
+
async translate(text, opts) {
|
|
1482
|
+
checkOptions();
|
|
1483
|
+
const { from, to } = opts;
|
|
1484
|
+
const url = `${base}`;
|
|
1485
|
+
if (!Array.isArray(text)) {
|
|
1486
|
+
text = [text];
|
|
1487
|
+
}
|
|
1488
|
+
const prompt = {
|
|
1489
|
+
role: "user",
|
|
1490
|
+
content: `
|
|
1491
|
+
满足以下4点翻译要求:
|
|
1492
|
+
1.将每段文本从${from}翻译为${to}
|
|
1493
|
+
2.文本内容以换行符\n进行段落分割,并以段落分割顺序进行翻译
|
|
1494
|
+
3.仅翻译分割出的段落,其他任何不相关的内容都移除,比如:段落前后的空格、所有标点符号\n
|
|
1495
|
+
4.仅返回要翻译的文本内容,不要返回任何其他内容
|
|
1496
|
+
|
|
1497
|
+
如何提取翻译文本,满足以下2点要求:
|
|
1498
|
+
1.翻译从-$s$-字符标记开始至-$e$-字符标记结束,提取-$s$-至-$e$-之间的内容
|
|
1499
|
+
2.-$s$-和-$e$-这2个标记不要返回,只是用来标记翻译的起始和结束位置
|
|
1500
|
+
|
|
1501
|
+
-$s$-
|
|
1502
|
+
${text.join("\n")}
|
|
1503
|
+
-$e$-
|
|
1504
|
+
`,
|
|
1505
|
+
};
|
|
1506
|
+
const res = await fetch(url, {
|
|
1507
|
+
method: "POST",
|
|
1508
|
+
headers: {
|
|
1509
|
+
"Content-Type": "application/json",
|
|
1510
|
+
Authorization: `Bearer ${apiKey}`,
|
|
1511
|
+
},
|
|
1512
|
+
body: JSON.stringify({
|
|
1513
|
+
model,
|
|
1514
|
+
messages: [{ role: "system", content: "You are a professional translator" }, prompt],
|
|
1515
|
+
max_tokens: maxTokens,
|
|
1516
|
+
temperature: 0,
|
|
1517
|
+
}),
|
|
1518
|
+
});
|
|
1519
|
+
const bodyRes = await res.json();
|
|
1520
|
+
if (bodyRes.error) {
|
|
1521
|
+
throw new TranslationError(this.name, `Translate fail! message: ${bodyRes.error.message}`);
|
|
1522
|
+
}
|
|
1523
|
+
if (!bodyRes || !bodyRes.choices || bodyRes.choices.length === 0 || !bodyRes.choices[0]?.message?.content) {
|
|
1524
|
+
throw new TranslationError(this.name, "Translate fail ! translate's result is null or empty");
|
|
1525
|
+
}
|
|
1526
|
+
const content = bodyRes.choices[0].message.content;
|
|
1527
|
+
const marks = ["-$s$-", "-$e$-"];
|
|
1528
|
+
const translations = content
|
|
1529
|
+
.trim()
|
|
1530
|
+
.split("\n")
|
|
1531
|
+
.map((item) => item.trim())
|
|
1532
|
+
.filter(Boolean)
|
|
1533
|
+
.filter((it) => !marks.includes(it));
|
|
1534
|
+
if (outputLog) {
|
|
1535
|
+
logger$1.info("prompt:", JSON.stringify(prompt, null, 2));
|
|
1536
|
+
logger$1.info("translations:", JSON.stringify(translations, null, 2));
|
|
1537
|
+
}
|
|
1538
|
+
return translations;
|
|
1539
|
+
},
|
|
1540
|
+
};
|
|
1541
|
+
}
|
|
1542
|
+
|
|
1543
|
+
const engines = {
|
|
1544
|
+
google,
|
|
1545
|
+
azure: azure$1,
|
|
1546
|
+
amazon: amazon$1,
|
|
1547
|
+
baidu: baidu$1,
|
|
1548
|
+
deepl: deepl$2,
|
|
1549
|
+
openai: openai$1,
|
|
1550
|
+
};
|
|
1551
|
+
|
|
1548
1552
|
var azure = {
|
|
1549
1553
|
Afrikaans: "af",
|
|
1550
1554
|
Albanian: "sq",
|