glotto 2.9.0 → 3.1.0

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.
Files changed (151) hide show
  1. package/README.md +150 -54
  2. package/esm/cli.js +155 -43
  3. package/esm/deno.d.ts +5 -1
  4. package/esm/deno.js +18 -7
  5. package/esm/src/config.d.ts +4 -0
  6. package/esm/src/config.d.ts.map +1 -0
  7. package/esm/src/config.js +95 -0
  8. package/esm/src/contants.d.ts +6 -2
  9. package/esm/src/contants.d.ts.map +1 -1
  10. package/esm/src/contants.js +34 -15
  11. package/esm/src/diff.d.ts +4 -0
  12. package/esm/src/diff.d.ts.map +1 -0
  13. package/esm/src/diff.js +53 -0
  14. package/esm/src/file.d.ts +5 -9
  15. package/esm/src/file.d.ts.map +1 -1
  16. package/esm/src/file.js +14 -103
  17. package/esm/src/providers/anthropic.d.ts +6 -11
  18. package/esm/src/providers/anthropic.d.ts.map +1 -1
  19. package/esm/src/providers/anthropic.js +21 -107
  20. package/esm/src/providers/gemini.d.ts +6 -11
  21. package/esm/src/providers/gemini.d.ts.map +1 -1
  22. package/esm/src/providers/gemini.js +20 -113
  23. package/esm/src/providers/openai.d.ts +6 -11
  24. package/esm/src/providers/openai.d.ts.map +1 -1
  25. package/esm/src/providers/openai.js +17 -108
  26. package/esm/src/translator.d.ts +15 -0
  27. package/esm/src/translator.d.ts.map +1 -0
  28. package/esm/src/translator.js +284 -0
  29. package/esm/src/types.d.ts +58 -13
  30. package/esm/src/types.d.ts.map +1 -1
  31. package/esm/src/utilites.d.ts +3 -10
  32. package/esm/src/utilites.d.ts.map +1 -1
  33. package/esm/src/utilites.js +41 -131
  34. package/package.json +20 -6
  35. package/schema/glotto.schema.json +87 -0
  36. package/script/cli.js +153 -41
  37. package/script/deno.d.ts +5 -1
  38. package/script/deno.js +18 -7
  39. package/script/src/config.d.ts +4 -0
  40. package/script/src/config.d.ts.map +1 -0
  41. package/script/src/config.js +132 -0
  42. package/script/src/contants.d.ts +6 -2
  43. package/script/src/contants.d.ts.map +1 -1
  44. package/script/src/contants.js +35 -16
  45. package/script/src/diff.d.ts +4 -0
  46. package/script/src/diff.d.ts.map +1 -0
  47. package/script/src/diff.js +57 -0
  48. package/script/src/file.d.ts +5 -9
  49. package/script/src/file.d.ts.map +1 -1
  50. package/script/src/file.js +19 -113
  51. package/script/src/providers/anthropic.d.ts +6 -11
  52. package/script/src/providers/anthropic.d.ts.map +1 -1
  53. package/script/src/providers/anthropic.js +20 -106
  54. package/script/src/providers/gemini.d.ts +6 -11
  55. package/script/src/providers/gemini.d.ts.map +1 -1
  56. package/script/src/providers/gemini.js +19 -112
  57. package/script/src/providers/openai.d.ts +6 -11
  58. package/script/src/providers/openai.d.ts.map +1 -1
  59. package/script/src/providers/openai.js +16 -107
  60. package/script/src/translator.d.ts +15 -0
  61. package/script/src/translator.d.ts.map +1 -0
  62. package/script/src/translator.js +294 -0
  63. package/script/src/types.d.ts +58 -13
  64. package/script/src/types.d.ts.map +1 -1
  65. package/script/src/utilites.d.ts +3 -10
  66. package/script/src/utilites.d.ts.map +1 -1
  67. package/script/src/utilites.js +44 -138
  68. package/esm/deps/jsr.io/@std/encoding/1.0.10/_common16.d.ts +0 -23
  69. package/esm/deps/jsr.io/@std/encoding/1.0.10/_common16.d.ts.map +0 -1
  70. package/esm/deps/jsr.io/@std/encoding/1.0.10/_common16.js +0 -51
  71. package/esm/deps/jsr.io/@std/encoding/1.0.10/_common32.d.ts +0 -35
  72. package/esm/deps/jsr.io/@std/encoding/1.0.10/_common32.d.ts.map +0 -1
  73. package/esm/deps/jsr.io/@std/encoding/1.0.10/_common32.js +0 -192
  74. package/esm/deps/jsr.io/@std/encoding/1.0.10/_common64.d.ts +0 -35
  75. package/esm/deps/jsr.io/@std/encoding/1.0.10/_common64.d.ts.map +0 -1
  76. package/esm/deps/jsr.io/@std/encoding/1.0.10/_common64.js +0 -113
  77. package/esm/deps/jsr.io/@std/encoding/1.0.10/_common_detach.d.ts +0 -4
  78. package/esm/deps/jsr.io/@std/encoding/1.0.10/_common_detach.d.ts.map +0 -1
  79. package/esm/deps/jsr.io/@std/encoding/1.0.10/_common_detach.js +0 -13
  80. package/esm/deps/jsr.io/@std/encoding/1.0.10/_types.d.ts +0 -9
  81. package/esm/deps/jsr.io/@std/encoding/1.0.10/_types.d.ts.map +0 -1
  82. package/esm/deps/jsr.io/@std/encoding/1.0.10/_types.js +0 -2
  83. package/esm/deps/jsr.io/@std/encoding/1.0.10/_validate_binary_like.d.ts +0 -2
  84. package/esm/deps/jsr.io/@std/encoding/1.0.10/_validate_binary_like.d.ts.map +0 -1
  85. package/esm/deps/jsr.io/@std/encoding/1.0.10/_validate_binary_like.js +0 -26
  86. package/esm/deps/jsr.io/@std/encoding/1.0.10/ascii85.d.ts +0 -61
  87. package/esm/deps/jsr.io/@std/encoding/1.0.10/ascii85.d.ts.map +0 -1
  88. package/esm/deps/jsr.io/@std/encoding/1.0.10/ascii85.js +0 -152
  89. package/esm/deps/jsr.io/@std/encoding/1.0.10/base32.d.ts +0 -40
  90. package/esm/deps/jsr.io/@std/encoding/1.0.10/base32.d.ts.map +0 -1
  91. package/esm/deps/jsr.io/@std/encoding/1.0.10/base32.js +0 -87
  92. package/esm/deps/jsr.io/@std/encoding/1.0.10/base58.d.ts +0 -40
  93. package/esm/deps/jsr.io/@std/encoding/1.0.10/base58.d.ts.map +0 -1
  94. package/esm/deps/jsr.io/@std/encoding/1.0.10/base58.js +0 -131
  95. package/esm/deps/jsr.io/@std/encoding/1.0.10/base64.d.ts +0 -40
  96. package/esm/deps/jsr.io/@std/encoding/1.0.10/base64.d.ts.map +0 -1
  97. package/esm/deps/jsr.io/@std/encoding/1.0.10/base64.js +0 -82
  98. package/esm/deps/jsr.io/@std/encoding/1.0.10/base64url.d.ts +0 -40
  99. package/esm/deps/jsr.io/@std/encoding/1.0.10/base64url.d.ts.map +0 -1
  100. package/esm/deps/jsr.io/@std/encoding/1.0.10/base64url.js +0 -72
  101. package/esm/deps/jsr.io/@std/encoding/1.0.10/hex.d.ts +0 -39
  102. package/esm/deps/jsr.io/@std/encoding/1.0.10/hex.d.ts.map +0 -1
  103. package/esm/deps/jsr.io/@std/encoding/1.0.10/hex.js +0 -87
  104. package/esm/deps/jsr.io/@std/encoding/1.0.10/mod.d.ts +0 -98
  105. package/esm/deps/jsr.io/@std/encoding/1.0.10/mod.d.ts.map +0 -1
  106. package/esm/deps/jsr.io/@std/encoding/1.0.10/mod.js +0 -99
  107. package/esm/deps/jsr.io/@std/encoding/1.0.10/varint.d.ts +0 -120
  108. package/esm/deps/jsr.io/@std/encoding/1.0.10/varint.d.ts.map +0 -1
  109. package/esm/deps/jsr.io/@std/encoding/1.0.10/varint.js +0 -205
  110. package/script/deps/jsr.io/@std/encoding/1.0.10/_common16.d.ts +0 -23
  111. package/script/deps/jsr.io/@std/encoding/1.0.10/_common16.d.ts.map +0 -1
  112. package/script/deps/jsr.io/@std/encoding/1.0.10/_common16.js +0 -57
  113. package/script/deps/jsr.io/@std/encoding/1.0.10/_common32.d.ts +0 -35
  114. package/script/deps/jsr.io/@std/encoding/1.0.10/_common32.d.ts.map +0 -1
  115. package/script/deps/jsr.io/@std/encoding/1.0.10/_common32.js +0 -198
  116. package/script/deps/jsr.io/@std/encoding/1.0.10/_common64.d.ts +0 -35
  117. package/script/deps/jsr.io/@std/encoding/1.0.10/_common64.d.ts.map +0 -1
  118. package/script/deps/jsr.io/@std/encoding/1.0.10/_common64.js +0 -119
  119. package/script/deps/jsr.io/@std/encoding/1.0.10/_common_detach.d.ts +0 -4
  120. package/script/deps/jsr.io/@std/encoding/1.0.10/_common_detach.d.ts.map +0 -1
  121. package/script/deps/jsr.io/@std/encoding/1.0.10/_common_detach.js +0 -16
  122. package/script/deps/jsr.io/@std/encoding/1.0.10/_types.d.ts +0 -9
  123. package/script/deps/jsr.io/@std/encoding/1.0.10/_types.d.ts.map +0 -1
  124. package/script/deps/jsr.io/@std/encoding/1.0.10/_types.js +0 -3
  125. package/script/deps/jsr.io/@std/encoding/1.0.10/_validate_binary_like.d.ts +0 -2
  126. package/script/deps/jsr.io/@std/encoding/1.0.10/_validate_binary_like.d.ts.map +0 -1
  127. package/script/deps/jsr.io/@std/encoding/1.0.10/_validate_binary_like.js +0 -29
  128. package/script/deps/jsr.io/@std/encoding/1.0.10/ascii85.d.ts +0 -61
  129. package/script/deps/jsr.io/@std/encoding/1.0.10/ascii85.d.ts.map +0 -1
  130. package/script/deps/jsr.io/@std/encoding/1.0.10/ascii85.js +0 -156
  131. package/script/deps/jsr.io/@std/encoding/1.0.10/base32.d.ts +0 -40
  132. package/script/deps/jsr.io/@std/encoding/1.0.10/base32.d.ts.map +0 -1
  133. package/script/deps/jsr.io/@std/encoding/1.0.10/base32.js +0 -91
  134. package/script/deps/jsr.io/@std/encoding/1.0.10/base58.d.ts +0 -40
  135. package/script/deps/jsr.io/@std/encoding/1.0.10/base58.d.ts.map +0 -1
  136. package/script/deps/jsr.io/@std/encoding/1.0.10/base58.js +0 -135
  137. package/script/deps/jsr.io/@std/encoding/1.0.10/base64.d.ts +0 -40
  138. package/script/deps/jsr.io/@std/encoding/1.0.10/base64.d.ts.map +0 -1
  139. package/script/deps/jsr.io/@std/encoding/1.0.10/base64.js +0 -86
  140. package/script/deps/jsr.io/@std/encoding/1.0.10/base64url.d.ts +0 -40
  141. package/script/deps/jsr.io/@std/encoding/1.0.10/base64url.d.ts.map +0 -1
  142. package/script/deps/jsr.io/@std/encoding/1.0.10/base64url.js +0 -76
  143. package/script/deps/jsr.io/@std/encoding/1.0.10/hex.d.ts +0 -39
  144. package/script/deps/jsr.io/@std/encoding/1.0.10/hex.d.ts.map +0 -1
  145. package/script/deps/jsr.io/@std/encoding/1.0.10/hex.js +0 -91
  146. package/script/deps/jsr.io/@std/encoding/1.0.10/mod.d.ts +0 -98
  147. package/script/deps/jsr.io/@std/encoding/1.0.10/mod.d.ts.map +0 -1
  148. package/script/deps/jsr.io/@std/encoding/1.0.10/mod.js +0 -115
  149. package/script/deps/jsr.io/@std/encoding/1.0.10/varint.d.ts +0 -120
  150. package/script/deps/jsr.io/@std/encoding/1.0.10/varint.d.ts.map +0 -1
  151. package/script/deps/jsr.io/@std/encoding/1.0.10/varint.js +0 -211
@@ -33,133 +33,39 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.writeTemp = exports.mergeInputs = exports.splitJson = exports.ensureDirectoryExists = exports.existsFile = exports.writeOutput = exports.getImportJson = exports.resolvePath = void 0;
36
+ exports.resolvePath = resolvePath;
37
+ exports.getImportJson = getImportJson;
38
+ exports.writeOutput = writeOutput;
39
+ exports.readJsonIfExists = readJsonIfExists;
37
40
  const dntShim = __importStar(require("../_dnt.shims.js"));
38
41
  const mod_js_1 = require("../deps/jsr.io/@std/path/1.1.4/mod.js");
39
- const logger_js_1 = require("./logger.js");
40
- const resolvePath = (...paths) => {
42
+ function resolvePath(...paths) {
41
43
  return (0, mod_js_1.join)(dntShim.Deno.cwd(), ...paths);
42
- };
43
- exports.resolvePath = resolvePath;
44
- const getImportJson = async (input) => {
45
- const filePath = (0, exports.resolvePath)(input);
44
+ }
45
+ async function getImportJson(input) {
46
+ const filePath = resolvePath(input);
46
47
  const fileContent = await dntShim.Deno.readTextFile(filePath);
47
48
  if (typeof fileContent !== 'string' || fileContent.trim() === '') {
48
49
  throw new Error('No Content!');
49
50
  }
50
51
  return JSON.parse(fileContent);
51
- };
52
- exports.getImportJson = getImportJson;
53
- const writeOutput = async (outputPath, content) => {
52
+ }
53
+ async function writeOutput(outputPath, content) {
54
54
  await dntShim.Deno.writeTextFile(outputPath, content, { create: true });
55
- };
56
- exports.writeOutput = writeOutput;
57
- const existsFile = async (path) => {
55
+ }
56
+ async function readJsonIfExists(path) {
57
+ let raw;
58
58
  try {
59
- await dntShim.Deno.stat(path);
60
- return true;
59
+ raw = await dntShim.Deno.readTextFile(path);
61
60
  }
62
61
  catch (error) {
63
62
  if (error instanceof dntShim.Deno.errors.NotFound) {
64
- return false;
63
+ return null;
65
64
  }
66
65
  throw error;
67
66
  }
68
- };
69
- exports.existsFile = existsFile;
70
- const ensureDirectoryExists = async (directory) => {
71
- const directoryExists = await (0, exports.existsFile)(directory);
72
- if (!directoryExists) {
73
- await dntShim.Deno.mkdir(directory, { recursive: true });
74
- }
75
- };
76
- exports.ensureDirectoryExists = ensureDirectoryExists;
77
- const getByteSize = (str) => {
78
- return new TextEncoder().encode(str).byteLength;
79
- };
80
- const buildChunkWithSize = (data, keys) => {
81
- const chunk = Object.create(null);
82
- for (const key of keys) {
83
- chunk[key] = data[key];
84
- }
85
- const json = JSON.stringify(chunk);
86
- return { json, size: getByteSize(json) };
87
- };
88
- const splitJson = (data, maxChunkBytes = 30_000) => {
89
- const encoder = new TextEncoder();
90
- const dataKeys = Object.keys(data);
91
- const totalKeys = dataKeys.length;
92
- const fullJson = JSON.stringify(data);
93
- const totalBytes = getByteSize(fullJson);
94
- if (totalBytes <= maxChunkBytes) {
95
- return [
96
- {
97
- data: encoder.encode(fullJson),
98
- keyCount: totalKeys,
99
- byteSize: totalBytes,
100
- index: 0,
101
- },
102
- ];
103
- }
104
- const chunks = [];
105
- let currentKeys = [];
106
- let currentSize = 2;
107
- for (let i = 0; i < totalKeys; i++) {
108
- const key = dataKeys[i];
109
- const keyValueJson = JSON.stringify({ [key]: data[key] });
110
- const entrySize = getByteSize(keyValueJson) - 2;
111
- const separatorSize = currentKeys.length > 0 ? 1 : 0;
112
- const projectedSize = currentSize + entrySize + separatorSize;
113
- if (projectedSize > maxChunkBytes && currentKeys.length > 0) {
114
- const { json, size } = buildChunkWithSize(data, currentKeys);
115
- chunks.push({
116
- data: encoder.encode(json),
117
- keyCount: currentKeys.length,
118
- byteSize: size,
119
- index: chunks.length,
120
- });
121
- currentKeys = [key];
122
- currentSize = 2 + entrySize;
123
- }
124
- else {
125
- currentKeys.push(key);
126
- currentSize = projectedSize;
127
- }
128
- }
129
- if (currentKeys.length > 0) {
130
- const { json, size } = buildChunkWithSize(data, currentKeys);
131
- chunks.push({
132
- data: encoder.encode(json),
133
- keyCount: currentKeys.length,
134
- byteSize: size,
135
- index: chunks.length,
136
- });
137
- }
138
- return chunks;
139
- };
140
- exports.splitJson = splitJson;
141
- const mergeInputs = (inputs) => {
142
- return Object.assign({}, ...inputs);
143
- };
144
- exports.mergeInputs = mergeInputs;
145
- const getOsTempDir = () => {
146
- if (dntShim.Deno.build.os === 'windows') {
147
- return dntShim.Deno.env.get('TEMP') ?? dntShim.Deno.env.get('TMP') ?? 'C:\\Windows\\Temp';
67
+ if (raw.trim() === '') {
68
+ return null;
148
69
  }
149
- return dntShim.Deno.env.get('TMPDIR') ?? '/tmp';
150
- };
151
- const resolveTempDir = async (targetLanguage) => {
152
- const tempDir = getOsTempDir();
153
- const glottoTempDir = (0, mod_js_1.join)(tempDir, 'glotto');
154
- await (0, exports.ensureDirectoryExists)(glottoTempDir);
155
- const languageTempDir = (0, mod_js_1.join)(glottoTempDir, targetLanguage);
156
- await (0, exports.ensureDirectoryExists)(languageTempDir);
157
- return languageTempDir;
158
- };
159
- const writeTemp = async (targetLanguage, tempJsonFileName, content) => {
160
- const tempDir = await resolveTempDir(targetLanguage);
161
- const tempJsonFilePath = (0, mod_js_1.join)(tempDir, tempJsonFileName);
162
- await dntShim.Deno.writeTextFile(tempJsonFilePath, content, { create: true });
163
- logger_js_1.logger.info(`Temp saved: ${tempJsonFilePath}`);
164
- };
165
- exports.writeTemp = writeTemp;
70
+ return JSON.parse(raw);
71
+ }
@@ -1,14 +1,9 @@
1
- import Anthropic from '@anthropic-ai/sdk';
2
- import type { ChunkInfo, Translatable } from '../types.js';
3
- declare class AnthropicModel implements Translatable {
4
- chunks: ChunkInfo[];
5
- from: string;
6
- to: string;
7
- client: Anthropic;
8
- model: string;
9
- constructor(key: string, chunks: ChunkInfo[], from: string, to: string, baseUrl?: string, modelName?: string);
10
- private translateChunk;
11
- translate(): Promise<string>;
1
+ import type { TextTranslator, TranslateOptions, TranslateResult } from '../types.js';
2
+ declare class AnthropicModel implements TextTranslator {
3
+ private client;
4
+ private model;
5
+ constructor(key: string, baseUrl?: string, modelName?: string, options?: TranslateOptions);
6
+ translate(prompt: string): Promise<TranslateResult>;
12
7
  }
13
8
  export default AnthropicModel;
14
9
  //# sourceMappingURL=anthropic.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../../src/src/providers/anthropic.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAC1C,OAAO,KAAK,EAAE,SAAS,EAAc,YAAY,EAAE,MAAM,aAAa,CAAC;AAQvE,cAAM,cAAe,YAAW,YAAY;IAC1C,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,SAAS,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;gBAEF,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM;YAW9F,cAAc;IAkEtB,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC;CAqCnC;AAED,eAAe,cAAc,CAAC"}
1
+ {"version":3,"file":"anthropic.d.ts","sourceRoot":"","sources":["../../../src/src/providers/anthropic.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,eAAe,EAAkB,MAAM,aAAa,CAAC;AAGrG,cAAM,cAAe,YAAW,cAAc;IAC5C,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,KAAK,CAAS;gBAGpB,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,MAAM,EAChB,SAAS,CAAC,EAAE,MAAM,EAClB,OAAO,GAAE,gBAAuD;IAU5D,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;CAoB1D;AAED,eAAe,cAAc,CAAC"}
@@ -4,31 +4,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const sdk_1 = __importDefault(require("@anthropic-ai/sdk"));
7
- const utilites_js_1 = require("../utilites.js");
8
- const logger_js_1 = require("../logger.js");
9
- const file_js_1 = require("../file.js");
10
7
  const contants_js_1 = require("../contants.js");
11
- const decoder = new TextDecoder();
12
8
  class AnthropicModel {
13
- constructor(key, chunks, from, to, baseUrl, modelName) {
14
- Object.defineProperty(this, "chunks", {
15
- enumerable: true,
16
- configurable: true,
17
- writable: true,
18
- value: void 0
19
- });
20
- Object.defineProperty(this, "from", {
21
- enumerable: true,
22
- configurable: true,
23
- writable: true,
24
- value: void 0
25
- });
26
- Object.defineProperty(this, "to", {
27
- enumerable: true,
28
- configurable: true,
29
- writable: true,
30
- value: void 0
31
- });
9
+ constructor(key, baseUrl, modelName, options = { noLimit: false, noTimeout: false }) {
32
10
  Object.defineProperty(this, "client", {
33
11
  enumerable: true,
34
12
  configurable: true,
@@ -41,96 +19,32 @@ class AnthropicModel {
41
19
  writable: true,
42
20
  value: void 0
43
21
  });
44
- this.chunks = chunks;
45
- this.from = from;
46
- this.to = to;
47
22
  this.model = modelName ?? contants_js_1.DEFAULT_MODELS.anthropic;
48
23
  this.client = new sdk_1.default({
49
24
  apiKey: key,
50
25
  baseURL: baseUrl,
26
+ timeout: options.noTimeout ? 0 : undefined,
51
27
  });
52
28
  }
53
- async translateChunk(chunk, systemPrompt, userPrompt) {
54
- const chunkLabel = `[Chunk ${chunk.index + 1}/${this.chunks.length}]`;
55
- const sourceJson = decoder.decode(chunk.data);
56
- for (let attempt = 0; attempt <= contants_js_1.MAX_RETRIES; attempt++) {
57
- try {
58
- if (attempt > 0) {
59
- const backoffMs = contants_js_1.BASE_RETRY_DELAY_MS * Math.pow(2, attempt - 1);
60
- logger_js_1.logger.warn(`${chunkLabel} Retry ${attempt}/${contants_js_1.MAX_RETRIES} after ${backoffMs}ms backoff...`);
61
- await (0, utilites_js_1.delay)(backoffMs);
62
- }
63
- const message = await this.client.messages.create({
64
- model: this.model,
65
- max_tokens: 4096,
66
- messages: [
67
- {
68
- role: 'user',
69
- content: `${systemPrompt}\n\n${userPrompt}\n\nSOURCE_JSON:\n${sourceJson}`,
70
- },
71
- ],
72
- });
73
- const textParts = message.content
74
- .filter((part) => part.type === 'text')
75
- .map((part) => part.text);
76
- const text = textParts.join('').trim();
77
- if (!text) {
78
- logger_js_1.logger.error(`${chunkLabel} Empty response from Anthropic`);
79
- continue;
80
- }
81
- const cleanedText = (0, utilites_js_1.stripJsonMarkdown)(text);
82
- const tempJsonFileName = `chunk_${chunk.index + 1}.json`;
83
- await (0, file_js_1.writeTemp)(this.to, tempJsonFileName, cleanedText);
84
- if (!(0, utilites_js_1.isValidJson)(cleanedText)) {
85
- if (attempt === contants_js_1.MAX_RETRIES) {
86
- logger_js_1.logger.error(`${chunkLabel} Failed after ${contants_js_1.MAX_RETRIES + 1} attempts: Invalid JSON response`);
87
- return null;
88
- }
89
- logger_js_1.logger.error(`${chunkLabel} Invalid JSON response, saved to ${tempJsonFileName}`);
90
- continue;
91
- }
92
- logger_js_1.logger.info(`${chunkLabel} Translated successfully (${(0, utilites_js_1.formatBytes)(chunk.byteSize)}, ${chunk.keyCount} keys)`);
93
- return cleanedText;
94
- }
95
- catch (error) {
96
- const isLastAttempt = attempt === contants_js_1.MAX_RETRIES;
97
- const errorMessage = error instanceof Error ? error.message : String(error);
98
- if (isLastAttempt) {
99
- logger_js_1.logger.error(`${chunkLabel} Failed after ${contants_js_1.MAX_RETRIES + 1} attempts: ${errorMessage}`);
100
- return null;
101
- }
102
- logger_js_1.logger.warn(`${chunkLabel} Attempt ${attempt + 1} failed: ${errorMessage}`);
103
- }
104
- }
105
- return null;
106
- }
107
- async translate() {
108
- const { systemPrompt, userPrompt } = (0, utilites_js_1.generatePrompts)(this.from, this.to);
109
- const totalChunks = this.chunks.length;
110
- logger_js_1.logger.info(`Starting translation: ${totalChunks} chunk(s) to process`);
111
- const results = [];
112
- const failedChunks = [];
113
- for (let i = 0; i < totalChunks; i++) {
114
- const chunk = this.chunks[i];
115
- if (i > 0) {
116
- logger_js_1.logger.info(`Waiting ${contants_js_1.INTER_CHUNK_DELAY_MS}ms before next chunk (rate limit protection)...`);
117
- await (0, utilites_js_1.delay)(contants_js_1.INTER_CHUNK_DELAY_MS);
118
- }
119
- const result = await this.translateChunk(chunk, systemPrompt, userPrompt);
120
- if (result) {
121
- results.push(result);
122
- }
123
- else {
124
- failedChunks.push(chunk.index + 1);
125
- }
126
- }
127
- if (failedChunks.length > 0) {
128
- throw new Error(`Translation failed for chunk(s): ${failedChunks.join(', ')}. Check temp files for partial results.`);
29
+ async translate(prompt) {
30
+ const message = await this.client.messages.create({
31
+ model: this.model,
32
+ max_tokens: 8192,
33
+ temperature: 0.2,
34
+ messages: [{ role: 'user', content: prompt }],
35
+ });
36
+ const text = message.content
37
+ .filter((part) => part.type === 'text')
38
+ .map((part) => part.text)
39
+ .join('');
40
+ let usage;
41
+ if (message.usage) {
42
+ usage = {
43
+ inputTokens: message.usage.input_tokens ?? 0,
44
+ outputTokens: message.usage.output_tokens ?? 0,
45
+ };
129
46
  }
130
- logger_js_1.logger.info(`All ${totalChunks} chunk(s) translated successfully, merging results...`);
131
- const jsonInputs = results.map((r) => JSON.parse(r));
132
- const mergedContent = (0, file_js_1.mergeInputs)(jsonInputs);
133
- return JSON.stringify(mergedContent, null, 2);
47
+ return { text, usage };
134
48
  }
135
49
  }
136
50
  exports.default = AnthropicModel;
@@ -1,14 +1,9 @@
1
- import { GoogleGenAI } from '@google/genai';
2
- import type { ChunkInfo, Translatable } from '../types.js';
3
- declare class Gemini implements Translatable {
4
- chunks: ChunkInfo[];
5
- from: string;
6
- to: string;
7
- genAI: GoogleGenAI;
8
- model: string;
9
- constructor(key: string, chunks: ChunkInfo[], from: string, to: string, modelName?: string);
10
- private translateChunk;
11
- translate(): Promise<string>;
1
+ import type { TextTranslator, TranslateOptions, TranslateResult } from '../types.js';
2
+ declare class Gemini implements TextTranslator {
3
+ private genAI;
4
+ private model;
5
+ constructor(key: string, modelName?: string, options?: TranslateOptions);
6
+ translate(prompt: string): Promise<TranslateResult>;
12
7
  }
13
8
  export default Gemini;
14
9
  //# sourceMappingURL=gemini.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../../src/src/providers/gemini.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAa,MAAM,eAAe,CAAC;AAEvD,OAAO,KAAK,EAAE,SAAS,EAAc,YAAY,EAAE,MAAM,aAAa,CAAC;AAMvE,cAAM,MAAO,YAAW,YAAY;IAClC,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,WAAW,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;gBAEF,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM;YAU5E,cAAc;IAwEtB,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC;CAqCnC;AAED,eAAe,MAAM,CAAC"}
1
+ {"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../../../src/src/providers/gemini.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,eAAe,EAAkB,MAAM,aAAa,CAAC;AAGrG,cAAM,MAAO,YAAW,cAAc;IACpC,OAAO,CAAC,KAAK,CAAc;IAC3B,OAAO,CAAC,KAAK,CAAS;gBAGpB,GAAG,EAAE,MAAM,EACX,SAAS,CAAC,EAAE,MAAM,EAClB,OAAO,GAAE,gBAAuD;IAS5D,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;CAmB1D;AAED,eAAe,MAAM,CAAC"}
@@ -1,31 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const genai_1 = require("@google/genai");
4
- const mod_js_1 = require("../../deps/jsr.io/@std/encoding/1.0.10/mod.js");
5
- const utilites_js_1 = require("../utilites.js");
6
- const logger_js_1 = require("../logger.js");
7
- const file_js_1 = require("../file.js");
8
4
  const contants_js_1 = require("../contants.js");
9
5
  class Gemini {
10
- constructor(key, chunks, from, to, modelName) {
11
- Object.defineProperty(this, "chunks", {
12
- enumerable: true,
13
- configurable: true,
14
- writable: true,
15
- value: void 0
16
- });
17
- Object.defineProperty(this, "from", {
18
- enumerable: true,
19
- configurable: true,
20
- writable: true,
21
- value: void 0
22
- });
23
- Object.defineProperty(this, "to", {
24
- enumerable: true,
25
- configurable: true,
26
- writable: true,
27
- value: void 0
28
- });
6
+ constructor(key, modelName, options = { noLimit: false, noTimeout: false }) {
29
7
  Object.defineProperty(this, "genAI", {
30
8
  enumerable: true,
31
9
  configurable: true,
@@ -38,101 +16,30 @@ class Gemini {
38
16
  writable: true,
39
17
  value: void 0
40
18
  });
41
- this.chunks = chunks;
42
- this.from = from;
43
- this.to = to;
44
19
  this.model = modelName ?? contants_js_1.DEFAULT_MODELS.gemini;
45
20
  this.genAI = new genai_1.GoogleGenAI({
46
21
  apiKey: key,
22
+ httpOptions: options.noTimeout ? { timeout: 2_147_483_647 } : undefined,
47
23
  });
48
24
  }
49
- async translateChunk(chunk, systemPrompt, userPrompt) {
50
- const chunkLabel = `[Chunk ${chunk.index + 1}/${this.chunks.length}]`;
51
- for (let attempt = 0; attempt <= contants_js_1.MAX_RETRIES; attempt++) {
52
- try {
53
- if (attempt > 0) {
54
- const backoffMs = contants_js_1.BASE_RETRY_DELAY_MS * Math.pow(2, attempt - 1);
55
- logger_js_1.logger.warn(`${chunkLabel} Retry ${attempt}/${contants_js_1.MAX_RETRIES} after ${backoffMs}ms backoff...`);
56
- await (0, utilites_js_1.delay)(backoffMs);
57
- }
58
- const fileBase64 = (0, mod_js_1.encodeBase64)(chunk.data);
59
- const part = {
60
- inlineData: {
61
- data: fileBase64,
62
- mimeType: 'text/plain',
63
- },
64
- };
65
- const { text } = await this.genAI.models.generateContent({
66
- model: this.model,
67
- contents: [systemPrompt, userPrompt, part],
68
- config: {
69
- systemInstruction: systemPrompt,
70
- candidateCount: 1,
71
- responseMimeType: 'application/json',
72
- responseLogprobs: false,
73
- temperature: 0.3,
74
- topP: 0.7,
75
- topK: 20,
76
- maxOutputTokens: Number.POSITIVE_INFINITY,
77
- },
78
- });
79
- if (!text) {
80
- logger_js_1.logger.error(`${chunkLabel} Empty response from Gemini AI`);
81
- continue;
82
- }
83
- const cleanedText = (0, utilites_js_1.stripJsonMarkdown)(text);
84
- const tempJsonFileName = `chunk_${chunk.index + 1}.json`;
85
- await (0, file_js_1.writeTemp)(this.to, tempJsonFileName, cleanedText);
86
- if (!(0, utilites_js_1.isValidJson)(cleanedText)) {
87
- if (attempt === contants_js_1.MAX_RETRIES) {
88
- logger_js_1.logger.error(`${chunkLabel} Failed after ${contants_js_1.MAX_RETRIES + 1} attempts: Invalid JSON response`);
89
- return null;
90
- }
91
- logger_js_1.logger.error(`${chunkLabel} Invalid JSON response, saved to ${tempJsonFileName}`);
92
- continue;
93
- }
94
- logger_js_1.logger.info(`${chunkLabel} Translated successfully (${(0, utilites_js_1.formatBytes)(chunk.byteSize)}, ${chunk.keyCount} keys)`);
95
- return cleanedText;
96
- }
97
- catch (error) {
98
- const isLastAttempt = attempt === contants_js_1.MAX_RETRIES;
99
- const errorMessage = error instanceof Error ? error.message : String(error);
100
- if (isLastAttempt) {
101
- logger_js_1.logger.error(`${chunkLabel} Failed after ${contants_js_1.MAX_RETRIES + 1} attempts: ${errorMessage}`);
102
- return null;
103
- }
104
- logger_js_1.logger.warn(`${chunkLabel} Attempt ${attempt + 1} failed: ${errorMessage}`);
105
- }
106
- }
107
- return null;
108
- }
109
- async translate() {
110
- const { systemPrompt, userPrompt } = (0, utilites_js_1.generatePrompts)(this.from, this.to);
111
- const totalChunks = this.chunks.length;
112
- logger_js_1.logger.info(`Starting translation: ${totalChunks} chunk(s) to process`);
113
- const results = [];
114
- const failedChunks = [];
115
- for (let i = 0; i < totalChunks; i++) {
116
- const chunk = this.chunks[i];
117
- if (i > 0) {
118
- logger_js_1.logger.info(`Waiting ${contants_js_1.INTER_CHUNK_DELAY_MS}ms before next chunk (rate limit protection)...`);
119
- await (0, utilites_js_1.delay)(contants_js_1.INTER_CHUNK_DELAY_MS);
120
- }
121
- const result = await this.translateChunk(chunk, systemPrompt, userPrompt);
122
- if (result) {
123
- results.push(result);
124
- }
125
- else {
126
- failedChunks.push(chunk.index + 1);
127
- }
128
- }
129
- if (failedChunks.length > 0) {
130
- throw new Error(`Translation failed for chunk(s): ${failedChunks.join(', ')}. Check temp files for partial results.`);
25
+ async translate(prompt) {
26
+ const response = await this.genAI.models.generateContent({
27
+ model: this.model,
28
+ contents: prompt,
29
+ config: {
30
+ candidateCount: 1,
31
+ temperature: 0.2,
32
+ },
33
+ });
34
+ const text = response.text ?? '';
35
+ let usage;
36
+ if (response.usageMetadata) {
37
+ usage = {
38
+ inputTokens: response.usageMetadata.promptTokenCount ?? 0,
39
+ outputTokens: response.usageMetadata.candidatesTokenCount ?? 0,
40
+ };
131
41
  }
132
- logger_js_1.logger.info(`All ${totalChunks} chunk(s) translated successfully, merging results...`);
133
- const jsonInputs = results.map((r) => JSON.parse(r));
134
- const mergedContent = (0, file_js_1.mergeInputs)(jsonInputs);
135
- return JSON.stringify(mergedContent, null, 2);
42
+ return { text, usage };
136
43
  }
137
44
  }
138
45
  exports.default = Gemini;
@@ -1,14 +1,9 @@
1
- import OpenAI from 'openai';
2
- import type { ChunkInfo, Translatable } from '../types.js';
3
- declare class OpenAIModel implements Translatable {
4
- chunks: ChunkInfo[];
5
- from: string;
6
- to: string;
7
- client: OpenAI;
8
- model: string;
9
- constructor(key: string, chunks: ChunkInfo[], from: string, to: string, baseUrl?: string, modelName?: string);
10
- private translateChunk;
11
- translate(): Promise<string>;
1
+ import type { TextTranslator, TranslateOptions, TranslateResult } from '../types.js';
2
+ declare class OpenAIModel implements TextTranslator {
3
+ private client;
4
+ private model;
5
+ constructor(key: string, baseUrl?: string, modelName?: string, options?: TranslateOptions);
6
+ translate(prompt: string): Promise<TranslateResult>;
12
7
  }
13
8
  export default OpenAIModel;
14
9
  //# sourceMappingURL=openai.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../../src/src/providers/openai.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,KAAK,EAAE,SAAS,EAAc,YAAY,EAAE,MAAM,aAAa,CAAC;AAQvE,cAAM,WAAY,YAAW,YAAY;IACvC,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;gBAEF,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM;YAW9F,cAAc;IAkEtB,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC;CAqCnC;AAED,eAAe,WAAW,CAAC"}
1
+ {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../../src/src/providers/openai.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,eAAe,EAAkB,MAAM,aAAa,CAAC;AAGrG,cAAM,WAAY,YAAW,cAAc;IACzC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAAS;gBAGpB,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,MAAM,EAChB,SAAS,CAAC,EAAE,MAAM,EAClB,OAAO,GAAE,gBAAuD;IAU5D,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;CAgB1D;AAED,eAAe,WAAW,CAAC"}