generaltranslation 1.1.22 → 1.1.24
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/README.md +7 -8
- package/client/getUserLanguage.js +14 -0
- package/codes/639-1/{CodeToLanguage.json → CodeToLanguage.js} +3 -2
- package/codes/639-1/{LanguageToCode.json → LanguageToCode.js} +3 -2
- package/codes/639-3/{CodeToLanguageTriletter.json → CodeToLanguageTriletter.js} +2 -1
- package/codes/639-3/{LanguageToCodeTriletter.json → LanguageToCodeTriletter.js} +3 -2
- package/codes/codes.js +17 -11
- package/index.js +24 -18
- package/models/models.js +9 -17
- package/package.json +2 -1
- package/prompts/translate.js +7 -9
package/README.md
CHANGED
|
@@ -18,7 +18,6 @@ npm i generaltranslation
|
|
|
18
18
|
|
|
19
19
|
```
|
|
20
20
|
import GT from 'generaltranslation'
|
|
21
|
-
// or const GT = require('generaltranslation')
|
|
22
21
|
|
|
23
22
|
const gt = new GT()
|
|
24
23
|
```
|
|
@@ -102,23 +101,23 @@ const gt = new GT({
|
|
|
102
101
|
});
|
|
103
102
|
```
|
|
104
103
|
|
|
105
|
-
### async
|
|
104
|
+
### async translatePrompt(prompt, language)
|
|
106
105
|
|
|
107
106
|
Translates prompt into the language represented by an ISO-639 language code. Designed for translating prompts into other languages, to internationalize responses from AI models.
|
|
108
107
|
|
|
109
|
-
Just wrap `
|
|
108
|
+
Just wrap `translatePrompt` around your prompt and go.
|
|
110
109
|
|
|
111
110
|
All of the following are valid:
|
|
112
111
|
|
|
113
112
|
```
|
|
114
|
-
const translatedPrompt = await gt.
|
|
113
|
+
const translatedPrompt = await gt.translatePrompt('Tell me a story', 'es');
|
|
115
114
|
```
|
|
116
115
|
|
|
117
116
|
```
|
|
118
117
|
const first = 'Tell me a story ';
|
|
119
118
|
const second = 'about a cat'
|
|
120
119
|
|
|
121
|
-
const translatedPrompt = await gt.
|
|
120
|
+
const translatedPrompt = await gt.translatePrompt([
|
|
122
121
|
first, second
|
|
123
122
|
], 'es');
|
|
124
123
|
```
|
|
@@ -129,7 +128,7 @@ To mark text that shouldn't be translated, wrap it in `{ text: "", translate: fa
|
|
|
129
128
|
const prompt = 'Tell me a story about ';
|
|
130
129
|
const input = 'gatos con espadas'
|
|
131
130
|
|
|
132
|
-
const translatedPrompt = await gt.
|
|
131
|
+
const translatedPrompt = await gt.translatePrompt([
|
|
133
132
|
prompt, { text: input, translate: false }
|
|
134
133
|
], 'es');
|
|
135
134
|
```
|
|
@@ -140,7 +139,7 @@ For type consistency, you can also make everything in the prompt parameter an ob
|
|
|
140
139
|
const prompt = 'Tell me a story about ';
|
|
141
140
|
const input = 'gatos con espadas'
|
|
142
141
|
|
|
143
|
-
const translatedPrompt = await gt.
|
|
142
|
+
const translatedPrompt = await gt.translatePrompt([
|
|
144
143
|
{ text: prompt },
|
|
145
144
|
{ text: input, translate: false }
|
|
146
145
|
], 'es');
|
|
@@ -149,5 +148,5 @@ const translatedPrompt = await gt.getPrompt([
|
|
|
149
148
|
This also works:
|
|
150
149
|
|
|
151
150
|
```
|
|
152
|
-
const translatedPrompt = await gt.
|
|
151
|
+
const translatedPrompt = await gt.translatePrompt({ text: 'Tell me a story' }, 'es');
|
|
153
152
|
```
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// Returns a user's default browser language
|
|
2
|
+
// e.g. 'en-US', not necessarily 'en'
|
|
3
|
+
// generaltranslation handles this well, but other libraries may not
|
|
4
|
+
// (it's a skill issue I'm afraid)
|
|
5
|
+
export default function _getUserLanguage(defaultLanguage = '') {
|
|
6
|
+
if (typeof window !== 'undefined' && window?.navigator) {
|
|
7
|
+
return navigator?.language || navigator?.userLanguage || defaultLanguage || '';
|
|
8
|
+
} else if (defaultLanguage) {
|
|
9
|
+
return defaultLanguage;
|
|
10
|
+
} else {
|
|
11
|
+
console.error("getUserLanguage error. It's likely you've called getUserLanguage() on the server. This is inadvisable and without a default language will return an empty string.")
|
|
12
|
+
return ''
|
|
13
|
+
}
|
|
14
|
+
}
|
package/codes/codes.js
CHANGED
|
@@ -1,17 +1,27 @@
|
|
|
1
1
|
// ----- IMPORTS ----- //
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
import CodeToLanguage from './639-1/CodeToLanguage.js'
|
|
4
|
+
import LanguageToCode from './639-1/LanguageToCode.js'
|
|
5
5
|
|
|
6
6
|
// only for languages which have no two-letter code
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
import CodeToLanguageTriletter from './639-3/CodeToLanguageTriletter.js'
|
|
8
|
+
import LanguageToCodeTriletter from './639-3/LanguageToCodeTriletter.js'
|
|
9
9
|
|
|
10
10
|
// ----- LANGUAGE CODES ----- //
|
|
11
11
|
|
|
12
12
|
// Returns the name of a language from an ISO 639 code or an array of codes
|
|
13
|
-
const _mapCodeToLanguage = code =>
|
|
14
|
-
|
|
13
|
+
const _mapCodeToLanguage = code => {
|
|
14
|
+
if (code.length === 2) {
|
|
15
|
+
return CodeToLanguage[code]
|
|
16
|
+
}
|
|
17
|
+
if (code.length === 3) {
|
|
18
|
+
CodeToLanguageTriletter[code]
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
return CodeToLanguage[code.slice(0, 2)] || '';
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
export const _getLanguageName = codes => {
|
|
15
25
|
return Array.isArray(codes) ? codes.map(_mapCodeToLanguage) : _mapCodeToLanguage(codes);
|
|
16
26
|
}
|
|
17
27
|
|
|
@@ -21,10 +31,6 @@ const _mapLanguageToCode = language => {
|
|
|
21
31
|
const lowerCaseLanguage = language.toLowerCase();
|
|
22
32
|
return LanguageToCode[lowerCaseLanguage] || LanguageToCodeTriletter[lowerCaseLanguage] || '';
|
|
23
33
|
}
|
|
24
|
-
const _getLanguageCode = languages => {
|
|
34
|
+
export const _getLanguageCode = languages => {
|
|
25
35
|
return Array.isArray(languages) ? languages.map(_mapLanguageToCode) : _mapLanguageToCode(languages);
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
module.exports = {
|
|
29
|
-
_getLanguageName, _getLanguageCode
|
|
30
36
|
}
|
package/index.js
CHANGED
|
@@ -3,13 +3,14 @@
|
|
|
3
3
|
|
|
4
4
|
// ----- IMPORTS ----- //
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
import _getUserLanguage from "./client/getUserLanguage.js";
|
|
7
|
+
import { _getLanguageCode, _getLanguageName } from "./codes/codes.js"
|
|
8
|
+
import { _getModelInfo, _getModelList, _getModelLanguages, _isLanguageSupported, _getModelsByDeveloper, _getModelsByLanguage } from "./models/models.js"
|
|
9
|
+
import _translatePrompt from "./prompts/translate.js"
|
|
9
10
|
|
|
10
11
|
// ----- CORE CLASS ----- //
|
|
11
12
|
|
|
12
|
-
class GT {
|
|
13
|
+
export default class GT {
|
|
13
14
|
|
|
14
15
|
constructor({
|
|
15
16
|
apiKey = '',
|
|
@@ -28,14 +29,18 @@ class GT {
|
|
|
28
29
|
// Model information functions
|
|
29
30
|
getModelList = _getModelList; // returns array of supported model names
|
|
30
31
|
getModelInfo = _getModelInfo; // returns model object
|
|
31
|
-
getAllModelInfo = _getAllModelInfo; // returns all info on all models
|
|
32
32
|
getModelLanguages = _getModelLanguages; // e.g. 'mistral-7b' => ['en']
|
|
33
33
|
isLanguageSupported = _isLanguageSupported; // e.g. ('mistral-7b', 'en') => true
|
|
34
34
|
getModelsByLanguage = _getModelsByLanguage; // returns array of model names
|
|
35
35
|
getModelsByDeveloper = _getModelsByDeveloper; // returns array of model names
|
|
36
36
|
|
|
37
|
+
// Get a user's browser language
|
|
38
|
+
getUserLanguage = () => {
|
|
39
|
+
return _getUserLanguage(this.defaultLanguage);
|
|
40
|
+
}
|
|
41
|
+
|
|
37
42
|
// Prompt I18N
|
|
38
|
-
|
|
43
|
+
translatePrompt = async (prompt, language) => {
|
|
39
44
|
return await _translatePrompt({
|
|
40
45
|
content: prompt, language: language, context: this
|
|
41
46
|
});
|
|
@@ -43,15 +48,16 @@ class GT {
|
|
|
43
48
|
|
|
44
49
|
}
|
|
45
50
|
|
|
46
|
-
// ----- EXPORTS ----- //
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
51
|
+
// ----- SECONDARY EXPORTS ----- //
|
|
52
|
+
|
|
53
|
+
export {
|
|
54
|
+
_getLanguageCode as getLanguageCode,
|
|
55
|
+
_getLanguageName as getLanguageName,
|
|
56
|
+
_getModelList as getModelList,
|
|
57
|
+
_getModelInfo as getModelInfo,
|
|
58
|
+
_getModelLanguages as getModelLanguages,
|
|
59
|
+
_isLanguageSupported as isLanguageSupported,
|
|
60
|
+
_getModelsByDeveloper as getModelsByDeveloper,
|
|
61
|
+
_getModelsByLanguage as getModelsByLanguage,
|
|
62
|
+
_getUserLanguage as getUserLanguage
|
|
63
|
+
};
|
package/models/models.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// ----- MODEL INFORMATION ----- //
|
|
2
2
|
|
|
3
3
|
// Get all info on all models
|
|
4
|
-
const _getAllModelInfo = async () => {
|
|
4
|
+
export const _getAllModelInfo = async () => {
|
|
5
5
|
try {
|
|
6
6
|
const result = await fetch(`https://models.gtx.dev/all`);
|
|
7
7
|
return await result.json();
|
|
@@ -13,7 +13,7 @@ const _getAllModelInfo = async () => {
|
|
|
13
13
|
|
|
14
14
|
// Get all models by a given developer
|
|
15
15
|
// Returns an empty array if none
|
|
16
|
-
const _getModelsByDeveloper = async developer => {
|
|
16
|
+
export const _getModelsByDeveloper = async developer => {
|
|
17
17
|
if (!developer) return null;
|
|
18
18
|
developer = developer?.toLowerCase();
|
|
19
19
|
try {
|
|
@@ -28,7 +28,7 @@ const _getModelsByDeveloper = async developer => {
|
|
|
28
28
|
|
|
29
29
|
// Get all models certified for a given language
|
|
30
30
|
// Returns an empty array if none
|
|
31
|
-
const _getModelsByLanguage = async language => {
|
|
31
|
+
export const _getModelsByLanguage = async language => {
|
|
32
32
|
if (!language) return null;
|
|
33
33
|
language = language?.toLowerCase();
|
|
34
34
|
try {
|
|
@@ -43,7 +43,7 @@ const _getModelsByLanguage = async language => {
|
|
|
43
43
|
|
|
44
44
|
// Get all models
|
|
45
45
|
// Returns an array of model names
|
|
46
|
-
const _getModelList = async () => {
|
|
46
|
+
export const _getModelList = async () => {
|
|
47
47
|
try {
|
|
48
48
|
const result = await fetch(`https://models.gtx.dev/models`);
|
|
49
49
|
const models = await result.json();
|
|
@@ -56,7 +56,7 @@ const _getModelList = async () => {
|
|
|
56
56
|
|
|
57
57
|
// Get all info about a given model
|
|
58
58
|
// Returns an object or null if invalid
|
|
59
|
-
const _getModelInfo = async model => {
|
|
59
|
+
export const _getModelInfo = async model => {
|
|
60
60
|
if (!model) return null;
|
|
61
61
|
model = model?.toLowerCase();
|
|
62
62
|
try {
|
|
@@ -69,27 +69,19 @@ const _getModelInfo = async model => {
|
|
|
69
69
|
}
|
|
70
70
|
}
|
|
71
71
|
|
|
72
|
+
// ----- FUNCTIONS FROM MODEL INFO ----- //
|
|
73
|
+
|
|
72
74
|
// Get all languages known to be compatible with a given LLM
|
|
73
75
|
// Returns an array of languages codes, or null if unknown
|
|
74
|
-
const _getModelLanguages = async model => {
|
|
76
|
+
export const _getModelLanguages = async model => {
|
|
75
77
|
const modelInfo = await _getModelInfo(model);
|
|
76
78
|
return modelInfo?.languages;
|
|
77
79
|
}
|
|
78
80
|
|
|
79
81
|
// Returns true if a model is known to be compatible with a language
|
|
80
82
|
// Returns false otherwise
|
|
81
|
-
const _isLanguageSupported = async (model, code) => {
|
|
83
|
+
export const _isLanguageSupported = async (model, code) => {
|
|
82
84
|
if (!code) return false;
|
|
83
85
|
const modelLanguages = await _getModelLanguages(model);
|
|
84
86
|
return modelLanguages?.includes(code) ? true : false;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
module.exports = {
|
|
88
|
-
_getModelList,
|
|
89
|
-
_getModelInfo,
|
|
90
|
-
_getModelLanguages,
|
|
91
|
-
_isLanguageSupported,
|
|
92
|
-
_getModelsByDeveloper,
|
|
93
|
-
_getModelsByLanguage,
|
|
94
|
-
_getAllModelInfo
|
|
95
87
|
}
|
package/package.json
CHANGED
package/prompts/translate.js
CHANGED
|
@@ -5,7 +5,7 @@ const _shouldTranslate = item => typeof item?.translate === 'boolean' ? item.tra
|
|
|
5
5
|
|
|
6
6
|
// Pre-processes content to send to the API
|
|
7
7
|
// Separates out text that shouldn't be translated.
|
|
8
|
-
const
|
|
8
|
+
const _processPrompt = ({ content }) => {
|
|
9
9
|
const processed = [];
|
|
10
10
|
const untranslated = [];
|
|
11
11
|
if (Array.isArray(content)) {
|
|
@@ -40,7 +40,7 @@ const _processContent = ({ content }) => {
|
|
|
40
40
|
}
|
|
41
41
|
|
|
42
42
|
// Build content string from array or single item
|
|
43
|
-
const
|
|
43
|
+
const _constructPrompt = ({ content, untranslated = null}) => {
|
|
44
44
|
if (Array.isArray(content)) {
|
|
45
45
|
let final = '';
|
|
46
46
|
for (const item of content) {
|
|
@@ -75,10 +75,10 @@ const _translatePrompt = async ({
|
|
|
75
75
|
|
|
76
76
|
const defaultLanguage = context?.defaultLanguage;
|
|
77
77
|
if (language === defaultLanguage) {
|
|
78
|
-
return
|
|
78
|
+
return _constructPrompt({ content: content });
|
|
79
79
|
};
|
|
80
80
|
|
|
81
|
-
const { processed, untranslated } =
|
|
81
|
+
const { processed, untranslated } = _processPrompt({ content });
|
|
82
82
|
|
|
83
83
|
try {
|
|
84
84
|
const response = await fetch(`${context?.baseURL}/prompt`, {
|
|
@@ -98,15 +98,13 @@ const _translatePrompt = async ({
|
|
|
98
98
|
throw new Error(`${result || response.status}`);
|
|
99
99
|
} else {
|
|
100
100
|
const result = await response.json();
|
|
101
|
-
return
|
|
101
|
+
return _constructPrompt({content: result, untranslated: untranslated });
|
|
102
102
|
}
|
|
103
103
|
} catch (error) {
|
|
104
104
|
console.error(error)
|
|
105
|
-
return
|
|
105
|
+
return _constructPrompt({ content: content })
|
|
106
106
|
}
|
|
107
107
|
|
|
108
108
|
}
|
|
109
109
|
|
|
110
|
-
|
|
111
|
-
_translatePrompt
|
|
112
|
-
}
|
|
110
|
+
export default _translatePrompt;
|