11import {
2- AssistantModelMessage ,
2+ CoreAssistantMessage ,
3+ ModelMessage ,
4+ CoreSystemMessage ,
5+ Tool ,
6+ CoreUserMessage ,
7+ generateObject ,
38 generateText ,
49 ImagePart ,
5- ModelMessage ,
6- Output ,
7- SystemModelMessage ,
810 TextPart ,
9- UserModelMessage ,
10- type Tool ,
1111} from "ai" ;
12- import type { LanguageModelV2 , LanguageModelV3 } from "@ai-sdk/provider" ;
12+ import type { LanguageModelV2 } from "@ai-sdk/provider" ;
1313import { CreateChatCompletionOptions , LLMClient } from "../llm/LLMClient.js" ;
1414import { AvailableModel } from "../types/public/index.js" ;
1515import { ChatCompletion } from "openai/resources" ;
1616
17- function getReasoningTokens (
18- usage ?: {
19- outputTokenDetails ?: { reasoningTokens ?: number } ;
20- reasoningTokens ?: number ;
21- } | null ,
22- ) : number {
23- return (
24- usage ?. outputTokenDetails ?. reasoningTokens ?? usage ?. reasoningTokens ?? 0
25- ) ;
26- }
27-
28- function getCachedInputTokens (
29- usage ?: {
30- inputTokenDetails ?: { cacheReadTokens ?: number } ;
31- cachedInputTokens ?: number ;
32- } | null ,
33- ) : number {
34- return (
35- usage ?. inputTokenDetails ?. cacheReadTokens ?? usage ?. cachedInputTokens ?? 0
36- ) ;
37- }
38-
39- function toLLMUsage ( usage ?: {
40- inputTokens ?: number ;
41- outputTokens ?: number ;
42- totalTokens ?: number ;
43- outputTokenDetails ?: { reasoningTokens ?: number } ;
44- reasoningTokens ?: number ;
45- inputTokenDetails ?: { cacheReadTokens ?: number } ;
46- cachedInputTokens ?: number ;
47- } ) {
48- return {
49- prompt_tokens : usage ?. inputTokens ?? 0 ,
50- completion_tokens : usage ?. outputTokens ?? 0 ,
51- reasoning_tokens : getReasoningTokens ( usage ) ,
52- cached_input_tokens : getCachedInputTokens ( usage ) ,
53- total_tokens : usage ?. totalTokens ?? 0 ,
54- } ;
55- }
56-
5717export class AISdkClient extends LLMClient {
5818 public type = "aisdk" as const ;
59- private model : LanguageModelV2 | LanguageModelV3 ;
19+ private model : LanguageModelV2 ;
6020
61- constructor ( { model } : { model : LanguageModelV2 | LanguageModelV3 } ) {
21+ constructor ( { model } : { model : LanguageModelV2 } ) {
6222 super ( model . modelId as AvailableModel ) ;
6323 this . model = model ;
6424 }
@@ -70,7 +30,7 @@ export class AISdkClient extends LLMClient {
7030 ( message ) => {
7131 if ( Array . isArray ( message . content ) ) {
7232 if ( message . role === "system" ) {
73- const systemMessage : SystemModelMessage = {
33+ const systemMessage : CoreSystemMessage = {
7434 role : "system" ,
7535 content : message . content
7636 . map ( ( c ) => ( "text" in c ? c . text : "" ) )
@@ -86,32 +46,32 @@ export class AISdkClient extends LLMClient {
8646 image : content . image_url . url ,
8747 } ;
8848 return imageContent ;
49+ } else {
50+ const textContent : TextPart = {
51+ type : "text" ,
52+ text : content . text ,
53+ } ;
54+ return textContent ;
8955 }
90-
91- const textContent : TextPart = {
92- type : "text" ,
93- text : content . text ,
94- } ;
95- return textContent ;
9656 } ) ;
9757
9858 if ( message . role === "user" ) {
99- const userMessage : UserModelMessage = {
59+ const userMessage : CoreUserMessage = {
10060 role : "user" ,
10161 content : contentParts ,
10262 } ;
10363 return userMessage ;
64+ } else {
65+ const textOnlyParts = contentParts . map ( ( part ) => ( {
66+ type : "text" as const ,
67+ text : part . type === "image" ? "[Image]" : part . text ,
68+ } ) ) ;
69+ const assistantMessage : CoreAssistantMessage = {
70+ role : "assistant" ,
71+ content : textOnlyParts ,
72+ } ;
73+ return assistantMessage ;
10474 }
105-
106- const textOnlyParts = contentParts . map ( ( part ) => ( {
107- type : "text" as const ,
108- text : part . type === "image" ? "[Image]" : part . text ,
109- } ) ) ;
110- const assistantMessage : AssistantModelMessage = {
111- role : "assistant" ,
112- content : textOnlyParts ,
113- } ;
114- return assistantMessage ;
11575 }
11676
11777 return {
@@ -122,28 +82,27 @@ export class AISdkClient extends LLMClient {
12282 ) ;
12383
12484 if ( options . response_model ) {
125- const response = await generateText ( {
85+ const response = await generateObject ( {
12686 model : this . model ,
12787 messages : formattedMessages ,
128- output : Output . object ( {
129- schema : options . response_model . schema ,
130- name : options . response_model . name ,
131- } ) ,
132- maxOutputTokens : options . maxOutputTokens ,
133- temperature : options . temperature ,
134- topP : options . top_p ,
135- frequencyPenalty : options . frequency_penalty ,
136- presencePenalty : options . presence_penalty ,
88+ schema : options . response_model . schema ,
13789 } ) ;
13890
13991 return {
140- data : response . output ,
141- usage : toLLMUsage ( response . usage ) ,
92+ data : response . object ,
93+ usage : {
94+ prompt_tokens : response . usage . inputTokens ?? 0 ,
95+ completion_tokens : response . usage . outputTokens ?? 0 ,
96+ reasoning_tokens : response . usage . reasoningTokens ?? 0 ,
97+ cached_input_tokens : response . usage . cachedInputTokens ?? 0 ,
98+ total_tokens : response . usage . totalTokens ?? 0 ,
99+ } ,
142100 } as T ;
143101 }
144102
145103 const tools : Record < string , Tool > = { } ;
146- for ( const rawTool of options . tools ?? [ ] ) {
104+
105+ for ( const rawTool of options . tools ) {
147106 tools [ rawTool . name ] = {
148107 description : rawTool . description ,
149108 inputSchema : rawTool . parameters ,
@@ -153,25 +112,18 @@ export class AISdkClient extends LLMClient {
153112 const response = await generateText ( {
154113 model : this . model ,
155114 messages : formattedMessages ,
156- tools : Object . keys ( tools ) . length > 0 ? tools : undefined ,
157- toolChoice :
158- Object . keys ( tools ) . length > 0
159- ? options . tool_choice === "required"
160- ? "required"
161- : options . tool_choice === "none"
162- ? "none"
163- : "auto"
164- : undefined ,
165- maxOutputTokens : options . maxOutputTokens ,
166- temperature : options . temperature ,
167- topP : options . top_p ,
168- frequencyPenalty : options . frequency_penalty ,
169- presencePenalty : options . presence_penalty ,
115+ tools,
170116 } ) ;
171117
172118 return {
173119 data : response . text ,
174- usage : toLLMUsage ( response . usage ) ,
120+ usage : {
121+ prompt_tokens : response . usage . inputTokens ?? 0 ,
122+ completion_tokens : response . usage . outputTokens ?? 0 ,
123+ reasoning_tokens : response . usage . reasoningTokens ?? 0 ,
124+ cached_input_tokens : response . usage . cachedInputTokens ?? 0 ,
125+ total_tokens : response . usage . totalTokens ?? 0 ,
126+ } ,
175127 } as T ;
176128 }
177129}
0 commit comments