generaltranslation 1.1.23 → 1.1.25
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 +43 -21
- 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 +26 -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
|
```
|
|
@@ -55,35 +54,27 @@ const codes = gt.getLanguageCodes(['French', 'Spanish'])
|
|
|
55
54
|
console.log(codes) // ['fr', 'es']
|
|
56
55
|
```
|
|
57
56
|
|
|
58
|
-
##
|
|
57
|
+
## Get a user's language
|
|
59
58
|
|
|
60
|
-
|
|
59
|
+
### getUserLanguage()
|
|
61
60
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
Get the latest list of models for which there is data. Returns an array of model names.
|
|
61
|
+
Returns a user's default browser language. Meant for use in a web browser.
|
|
65
62
|
|
|
66
63
|
```
|
|
67
|
-
const
|
|
68
|
-
console.log(
|
|
64
|
+
const userLanguage = getUserLanguage();
|
|
65
|
+
console.log(userLanguage) // 'en'
|
|
69
66
|
```
|
|
70
67
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
Get all languages known to be compatible with a given AI model. Returns an array of languages codes, or null if the model is unknown.
|
|
68
|
+
If invoked on an instance of the GT class, this function will return the default language of that instance, similar to accessing the `defaultLanguage` property.
|
|
74
69
|
|
|
75
70
|
```
|
|
76
|
-
|
|
77
|
-
console.log(languages) // ['en', 'fr', 'de', 'es', 'it']
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
### async isSupportedLanguage(model, code)
|
|
71
|
+
import GT from 'generaltranslation'
|
|
81
72
|
|
|
82
|
-
|
|
73
|
+
const gt = new GT({
|
|
74
|
+
defaultLanguage: 'en'
|
|
75
|
+
});
|
|
83
76
|
|
|
84
|
-
|
|
85
|
-
const supported = await gt.isSupportedLanguage('gpt-4', 'fr')
|
|
86
|
-
console.log(supported) // true
|
|
77
|
+
console.log(gt.getUserLanguage()) // same as gt.defaultLanguage
|
|
87
78
|
```
|
|
88
79
|
|
|
89
80
|
## Prompt Internationalization API
|
|
@@ -150,4 +141,35 @@ This also works:
|
|
|
150
141
|
|
|
151
142
|
```
|
|
152
143
|
const translatedPrompt = await gt.translatePrompt({ text: 'Tell me a story' }, 'es');
|
|
153
|
-
```
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
## Which languages do AI models understand?
|
|
147
|
+
|
|
148
|
+
We continually benchmark AI models and add new models as they are released. That means these functions have to be <code>async</code>. This information is provided as a public service. It's completely free and requires no API key.
|
|
149
|
+
|
|
150
|
+
### async getModelList()
|
|
151
|
+
|
|
152
|
+
Get the latest list of models for which there is data. Returns an array of model names.
|
|
153
|
+
|
|
154
|
+
```
|
|
155
|
+
const models = await gt.getModelList();
|
|
156
|
+
console.log(models) // ['gpt-4', ... ]
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
### async getModelLanguages(model)
|
|
160
|
+
|
|
161
|
+
Get all languages known to be compatible with a given AI model. Returns an array of languages codes, or null if the model is unknown.
|
|
162
|
+
|
|
163
|
+
```
|
|
164
|
+
const languages = await gt.getModelLanguages('mixtral-8x7b')
|
|
165
|
+
console.log(languages) // ['en', 'fr', 'de', 'es', 'it']
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
### async isSupportedLanguage(model, code)
|
|
169
|
+
|
|
170
|
+
Returns true if a model is known to be compatible with a given language, represented by an ISO-639 language code. Returns false otherwise.
|
|
171
|
+
|
|
172
|
+
```
|
|
173
|
+
const supported = await gt.isSupportedLanguage('gpt-4', 'fr')
|
|
174
|
+
console.log(supported) // true
|
|
175
|
+
```
|
|
@@ -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,20 +3,21 @@
|
|
|
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 = '',
|
|
16
17
|
defaultLanguage = 'en',
|
|
17
18
|
baseURL = 'https://translate.gtx.dev'
|
|
18
19
|
} = {}) {
|
|
19
|
-
this.apiKey = apiKey;
|
|
20
|
+
this.apiKey = apiKey || (typeof process !== 'undefined' ? process.env.GT_API_KEY : '');
|
|
20
21
|
this.defaultLanguage = defaultLanguage;
|
|
21
22
|
this.baseURL = baseURL;
|
|
22
23
|
}
|
|
@@ -28,12 +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({
|
|
40
|
+
defaultLanguage: this.defaultLanguage
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
|
|
37
44
|
// Prompt I18N
|
|
38
45
|
translatePrompt = async (prompt, language) => {
|
|
39
46
|
return await _translatePrompt({
|
|
@@ -43,15 +50,16 @@ class GT {
|
|
|
43
50
|
|
|
44
51
|
}
|
|
45
52
|
|
|
46
|
-
// ----- EXPORTS ----- //
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
53
|
+
// ----- SECONDARY EXPORTS ----- //
|
|
54
|
+
|
|
55
|
+
export {
|
|
56
|
+
_getLanguageCode as getLanguageCode,
|
|
57
|
+
_getLanguageName as getLanguageName,
|
|
58
|
+
_getModelList as getModelList,
|
|
59
|
+
_getModelInfo as getModelInfo,
|
|
60
|
+
_getModelLanguages as getModelLanguages,
|
|
61
|
+
_isLanguageSupported as isLanguageSupported,
|
|
62
|
+
_getModelsByDeveloper as getModelsByDeveloper,
|
|
63
|
+
_getModelsByLanguage as getModelsByLanguage,
|
|
64
|
+
_getUserLanguage as getUserLanguage
|
|
65
|
+
};
|
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;
|