Skip to content

Commit 1ac3eb3

Browse files
Merge pull request #22 from Serchinastico/remote-llms
Support for remote LLMs (OpenAI and Claude)
2 parents 7d2d88d + f415f67 commit 1ac3eb3

29 files changed

Lines changed: 4235 additions & 4217 deletions

npm-shrinkwrap.json

Lines changed: 3906 additions & 4073 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 50 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -8,63 +8,65 @@
88
},
99
"bugs": "https://github.com/madeja-studio/linguito/issues",
1010
"dependencies": {
11-
"@ai-sdk/openai": "^1",
12-
"@ai-sdk/openai-compatible": "^0.1.6",
11+
"@ai-sdk/anthropic": "^1.2.12",
12+
"@ai-sdk/openai": "^1.3.22",
13+
"@ai-sdk/openai-compatible": "^0.2.14",
1314
"@inkjs/ui": "^2",
14-
"@lingui/conf": "^5",
15-
"@madeja-studio/cepillo": "^0.4.0",
16-
"@oclif/core": "^4",
17-
"@oclif/plugin-help": "^6",
18-
"@oclif/plugin-plugins": "^5",
19-
"ai": "^4",
20-
"color-json": "^3",
15+
"@lingui/conf": "^5.3.2",
16+
"@madeja-studio/cepillo": "^0.7.1",
17+
"@oclif/core": "^4.3.0",
18+
"@oclif/plugin-help": "^6.2.28",
19+
"@oclif/plugin-plugins": "^5.4.38",
20+
"ai": "^4.3.16",
21+
"color-json": "^3.0.5",
2122
"configstore": "^7",
22-
"espree": "^10",
23+
"espree": "^10.3.0",
2324
"gettext-parser": "^8",
24-
"ink": "^5",
25-
"npm-check-updates": "^17",
26-
"ollama-ai-provider": "^1",
27-
"react": "^18",
28-
"ts-deepmerge": "^7",
29-
"zod": "^3"
25+
"ink": "^5.2.1",
26+
"npm-check-updates": "^18.0.1",
27+
"ollama-ai-provider": "^1.2.0",
28+
"react": "^18.3.1",
29+
"ts-deepmerge": "^7.0.3",
30+
"zod": "^3.25.32"
3031
},
3132
"devDependencies": {
32-
"@commitlint/config-conventional": "^19",
33-
"@eslint/eslintrc": "^3",
34-
"@eslint/js": "^9",
33+
"@commitlint/config-conventional": "^19.8.1",
34+
"@eslint/eslintrc": "^3.3.1",
35+
"@eslint/js": "^9.27.0",
3536
"@oclif/prettier-config": "^0.2.1",
36-
"@oclif/test": "^4",
37-
"@release-it/conventional-changelog": "^9",
38-
"@types/chai": "^5",
39-
"@types/configstore": "^6",
40-
"@types/espree": "^10",
41-
"@types/gettext-parser": "^4",
42-
"@types/node": "^22",
43-
"@types/react": "^19",
44-
"chai": "^5",
45-
"commitlint": "^19",
46-
"eslint": "^9",
47-
"eslint-config-oclif": "^5",
48-
"eslint-config-oclif-typescript": "^3",
49-
"eslint-config-prettier": "^9",
50-
"eslint-plugin-chai-friendly": "^1",
51-
"eslint-plugin-perfectionist": "^4",
52-
"eslint-plugin-prettier": "^5",
53-
"lefthook": "^1",
54-
"oclif": "^4",
55-
"prettier": "^3",
56-
"release-it": "^17",
57-
"shx": "^0.3.4",
58-
"ts-morph": "^25",
59-
"tsc-alias": "^1",
60-
"tsx": "^4",
61-
"typescript": "^5",
62-
"typescript-eslint": "^8",
63-
"vitest": "^3"
37+
"@oclif/test": "^4.1.13",
38+
"@release-it/conventional-changelog": "^10.0.1",
39+
"@types/chai": "^5.2.2",
40+
"@types/configstore": "^6.0.2",
41+
"@types/espree": "^10.1.0",
42+
"@types/gettext-parser": "^4.0.4",
43+
"@types/node": "^22.15.23",
44+
"@types/react": "^19.1.6",
45+
"chai": "^5.2.0",
46+
"commitlint": "^19.8.1",
47+
"eslint": "^9.27.0",
48+
"eslint-config-oclif": "^6.0.62",
49+
"eslint-config-prettier": "^10.1.5",
50+
"eslint-plugin-chai-friendly": "^1.0.1",
51+
"eslint-plugin-perfectionist": "^4.13.0",
52+
"eslint-plugin-prettier": "^5.4.0",
53+
"lefthook": "^1.11.13",
54+
"oclif": "^4.17.46",
55+
"prettier": "^3.5.3",
56+
"release-it": "^19.0.2",
57+
"shx": "^0.4.0",
58+
"ts-morph": "^26.0.0",
59+
"tsc-alias": "^1.8.16",
60+
"tsx": "^4.19.4",
61+
"typescript": "^5.8.3",
62+
"typescript-eslint": "^8.33.0",
63+
"vitest": "^3.1.4"
6464
},
6565
"engines": {
66-
"node": ">=18.0.0"
66+
"node": ">=18.0.0",
67+
"npm": ">=9.0.0"
6768
},
69+
"packageManager": "npm@11.4.1",
6870
"files": [
6971
"/bin",
7072
"/dist",

src/commands/check.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1+
import {Args} from '@oclif/core'
2+
13
import BaseCommand from '@/lib/command/base.js'
24
import {ConfigParser} from '@/lib/lingui/parser.js'
35
import {Translations} from '@/lib/lingui/translations.js'
4-
import {Args} from '@oclif/core'
56

67
const SEPARATOR = '\n\t• '
78

src/commands/config/get.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1+
import {Args, Flags} from '@oclif/core'
2+
import cj from 'color-json'
3+
14
import BaseCommand from '@/lib/command/base.js'
25
import {ConfigKeyPath} from '@/lib/common/types.js'
36
import {ConfigManager} from '@/lib/config/config-manager.js'
4-
import {Args, Flags} from '@oclif/core'
5-
import cj from 'color-json'
67

78
export default class Get extends BaseCommand {
89
static args = {

src/commands/config/index.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
1+
import Configstore from 'configstore'
2+
import fs from 'node:fs/promises'
3+
14
import BaseCommand from '@/lib/command/base.js'
25
import {Config as ConfigType, emptyConfig} from '@/lib/common/types.js'
36
import {EditConfig} from '@/lib/ui/config/EditConfig.js'
47
import {render} from '@/lib/ui/render.js'
5-
import Configstore from 'configstore'
6-
import fs from 'node:fs/promises'
78

89
export default class Config extends BaseCommand {
910
static description = `Opens an interactive session to view, update, and save the configuration settings for Linguito. This includes options such as provider and model preferences.`

src/commands/config/set.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1+
import {Args} from '@oclif/core'
2+
13
import BaseCommand from '@/lib/command/base.js'
24
import {ConfigKeyPath} from '@/lib/common/types.js'
35
import {ConfigManager} from '@/lib/config/config-manager.js'
4-
import {Args} from '@oclif/core'
56

67
export default class Set extends BaseCommand {
78
static args = {

src/commands/translate.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import {Args, Flags} from '@oclif/core'
2+
13
import BaseCommand from '@/lib/command/base.js'
24
import {invariant} from '@/lib/command/invariant.js'
35
import {ConfigManager} from '@/lib/config/config-manager.js'
@@ -6,7 +8,6 @@ import {Translations} from '@/lib/lingui/translations.js'
68
import {Llm} from '@/lib/llm/llm.js'
79
import {render} from '@/lib/ui/render.js'
810
import {AskForTranslations} from '@/lib/ui/translate/AskForTranslations.js'
9-
import {Args, Flags} from '@oclif/core'
1011

1112
export default class Translate extends BaseCommand {
1213
static args = {

src/lib/command/base.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1-
import {canReadFile, isFile} from '@/lib/fs/fs.js'
21
import {Command} from '@oclif/core'
32
import {CommandError} from '@oclif/core/interfaces'
43
import path from 'node:path'
54

5+
import {canReadFile, isFile} from '@/lib/fs/fs.js'
6+
67
import {invariant, INVARIANT_ERROR_PREFIX, InvariantErrorCode, invariantErrorMessage} from './invariant.js'
78

89
export default abstract class BaseCommand extends Command {

src/lib/command/invariant.ts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,21 @@ export const INVARIANT_ERROR_PREFIX: string = 'Invariant failed::'
33
export type InvariantErrorCode =
44
| 'internal_error'
55
| 'invalid_translate_options'
6+
| 'llm:config:no_api_key'
7+
| 'llm:config:no_provider'
68
| 'llm:no_models_found'
79
| 'missing_lingui_config_file'
810
| 'unknown_catalog_file_format'
911

1012
export const invariantErrorMessage: Record<InvariantErrorCode, string> = {
11-
internal_error: 'Internal error. Please report this in the GitHub repository including as much context as possible.',
13+
internal_error: 'Internal error. Please report this in the GitHub repository including as much context as possible',
1214
invalid_translate_options:
13-
"Invalid options passed to 'translate' function. Both interactive and llm options can't be false at the same time.",
14-
'llm:no_models_found': 'No models loaded in your LLM',
15+
"Invalid options passed to 'translate' function. Both interactive and llm options can't be false or missing at the same time",
16+
'llm:config:no_api_key':
17+
'No API key found in Linguito configuration. Please configure an API key using the "config" command',
18+
'llm:config:no_provider':
19+
'Provider missing from Linguito configuration. Please configure a provider using the "config" command',
20+
'llm:no_models_found': 'No models loaded in your LLM service',
1521
missing_lingui_config_file: 'lingui.config.js does not exist or is not readable',
1622
unknown_catalog_file_format: 'Translation files must be in a known format. Currently supported formats are: po',
1723
}

src/lib/common/string.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
/**
2+
* A function that checks if the provided string is non-empty and returns the trimmed string.
3+
* If the string is empty or undefined, it returns undefined.
4+
*/
5+
export const nonEmptyStringOrUndefined = (str?: string): string | undefined =>
6+
str && str.trim().length > 0 ? str : undefined

0 commit comments

Comments
 (0)