@@ -7,15 +7,26 @@ import { I18nConfig } from "@lingo.dev/_spec";
77import chalk from "chalk" ;
88import dedent from "dedent" ;
99import { ILocalizer , LocalizerData } from "./_types" ;
10- import { LanguageModel , Message , generateText } from "ai" ;
10+ import {
11+ GenerateObjectResult ,
12+ GenerateTextResult ,
13+ LanguageModel ,
14+ Message ,
15+ generateObject ,
16+ generateText ,
17+ } from "ai" ;
1118import { colors } from "../constants" ;
1219import { jsonrepair } from "jsonrepair" ;
1320import { createOllama } from "ollama-ai-provider" ;
21+ import {
22+ NormalizedModelSettings ,
23+ normalizeProviderSettings ,
24+ } from "../utils/normalize-provider-settings" ;
1425
1526export default function createExplicitLocalizer (
1627 provider : NonNullable < I18nConfig [ "provider" ] > ,
1728) : ILocalizer {
18- const settings = provider . settings || { } ;
29+ const settings = normalizeProviderSettings ( provider . id , provider . settings ) ;
1930
2031 switch ( provider . id ) {
2132 default :
@@ -38,6 +49,7 @@ export default function createExplicitLocalizer(
3849 return createAiSdkLocalizer ( {
3950 factory : ( params ) => createOpenAI ( params ) . languageModel ( provider . model ) ,
4051 id : provider . id ,
52+ model : provider . model ,
4153 prompt : provider . prompt ,
4254 apiKeyName : "OPENAI_API_KEY" ,
4355 baseUrl : provider . baseUrl ,
@@ -48,6 +60,7 @@ export default function createExplicitLocalizer(
4860 factory : ( params ) =>
4961 createAnthropic ( params ) . languageModel ( provider . model ) ,
5062 id : provider . id ,
63+ model : provider . model ,
5164 prompt : provider . prompt ,
5265 apiKeyName : "ANTHROPIC_API_KEY" ,
5366 baseUrl : provider . baseUrl ,
@@ -58,6 +71,7 @@ export default function createExplicitLocalizer(
5871 factory : ( params ) =>
5972 createGoogleGenerativeAI ( params ) . languageModel ( provider . model ) ,
6073 id : provider . id ,
74+ model : provider . model ,
6175 prompt : provider . prompt ,
6276 apiKeyName : "GOOGLE_API_KEY" ,
6377 baseUrl : provider . baseUrl ,
@@ -68,6 +82,7 @@ export default function createExplicitLocalizer(
6882 factory : ( params ) =>
6983 createOpenRouter ( params ) . languageModel ( provider . model ) ,
7084 id : provider . id ,
85+ model : provider . model ,
7186 prompt : provider . prompt ,
7287 apiKeyName : "OPENROUTER_API_KEY" ,
7388 baseUrl : provider . baseUrl ,
@@ -77,6 +92,7 @@ export default function createExplicitLocalizer(
7792 return createAiSdkLocalizer ( {
7893 factory : ( _params ) => createOllama ( ) . languageModel ( provider . model ) ,
7994 id : provider . id ,
95+ model : provider . model ,
8096 prompt : provider . prompt ,
8197 skipAuth : true ,
8298 settings,
@@ -86,6 +102,7 @@ export default function createExplicitLocalizer(
86102 factory : ( params ) =>
87103 createMistral ( params ) . languageModel ( provider . model ) ,
88104 id : provider . id ,
105+ model : provider . model ,
89106 prompt : provider . prompt ,
90107 apiKeyName : "MISTRAL_API_KEY" ,
91108 baseUrl : provider . baseUrl ,
@@ -97,11 +114,12 @@ export default function createExplicitLocalizer(
97114function createAiSdkLocalizer ( params : {
98115 factory : ( params : { apiKey ?: string ; baseUrl ?: string } ) => LanguageModel ;
99116 id : NonNullable < I18nConfig [ "provider" ] > [ "id" ] ;
117+ model : string ;
100118 prompt : string ;
101119 apiKeyName ?: string ;
102120 baseUrl ?: string ;
103121 skipAuth ?: boolean ;
104- settings ?: { temperature ?: number } ;
122+ settings ?: NormalizedModelSettings ;
105123} ) : ILocalizer {
106124 const skipAuth = params . skipAuth === true ;
107125
@@ -196,22 +214,49 @@ function createAiSdkLocalizer(params: {
196214 data : input . processableData ,
197215 } ;
198216
199- const response = await generateText ( {
200- model,
201- ...params . settings ,
202- messages : [
203- { role : "system" , content : systemPrompt } ,
204- { role : "user" , content : "OK" } ,
205- ...shots . flatMap (
206- ( [ userShot , assistantShot ] ) =>
207- [
208- { role : "user" , content : JSON . stringify ( userShot ) } ,
209- { role : "assistant" , content : JSON . stringify ( assistantShot ) } ,
210- ] as Message [ ] ,
211- ) ,
212- { role : "user" , content : JSON . stringify ( payload ) } ,
213- ] ,
214- } ) ;
217+ let response : GenerateTextResult < any , any > | GenerateObjectResult < any > ;
218+ if ( params . id === "google" && params . settings ?. responseMimeType ) {
219+ response = await generateObject ( {
220+ model,
221+ output : "no-schema" ,
222+ temperature : params . settings ?. temperature ,
223+ messages : [
224+ { role : "system" , content : systemPrompt } ,
225+ { role : "user" , content : "OK" } ,
226+ ...shots . flatMap (
227+ ( [ userShot , assistantShot ] ) =>
228+ [
229+ { role : "user" , content : JSON . stringify ( userShot ) } ,
230+ { role : "assistant" , content : JSON . stringify ( assistantShot ) } ,
231+ ] as Message [ ] ,
232+ ) ,
233+ { role : "user" , content : JSON . stringify ( payload ) } ,
234+ ] ,
235+ } ) ;
236+ } else {
237+ response = await generateText ( {
238+ model,
239+ temperature : params . settings ?. temperature ,
240+ messages : [
241+ { role : "system" , content : systemPrompt } ,
242+ { role : "user" , content : "OK" } ,
243+ ...shots . flatMap (
244+ ( [ userShot , assistantShot ] ) =>
245+ [
246+ { role : "user" , content : JSON . stringify ( userShot ) } ,
247+ { role : "assistant" , content : JSON . stringify ( assistantShot ) } ,
248+ ] as Message [ ] ,
249+ ) ,
250+ { role : "user" , content : JSON . stringify ( payload ) } ,
251+ ] ,
252+ } ) ;
253+ }
254+
255+ // Handle GenerateObjectResult - response is already a json object
256+ if ( "object" in response ) {
257+ const result = response . object as any ;
258+ return result . data ;
259+ }
215260
216261 const result = JSON . parse ( response . text ) ;
217262
0 commit comments