@@ -46,6 +46,7 @@ const MINIMUM_CREDITS = 10;
46
46
class Assistant {
47
47
private openai : OpenAI ;
48
48
private client : MatrixClient ;
49
+ private toolCallCapableModels : Set < string > ;
49
50
pgAdapter : PgAdapter ;
50
51
id : string ;
51
52
@@ -57,6 +58,21 @@ class Assistant {
57
58
this . id = id ;
58
59
this . client = client ;
59
60
this . pgAdapter = new PgAdapter ( ) ;
61
+ this . toolCallCapableModels = new Set ( ) ;
62
+ }
63
+
64
+ async loadToolCallCapableModels ( ) {
65
+ // api request is https://openrouter.ai/api/v1/models?supported_parameters=tools
66
+ let response = await fetch (
67
+ 'https://openrouter.ai/api/v1/models?supported_parameters=tools' ,
68
+ ) ;
69
+ let responseJson = ( await response . json ( ) ) as {
70
+ data : { id : string } [ ] ;
71
+ } ;
72
+ let modelList = responseJson . data ;
73
+ this . toolCallCapableModels = new Set (
74
+ modelList . map ( ( model : any ) => model . id ) ,
75
+ ) ;
60
76
}
61
77
62
78
async trackAiUsageCost ( matrixUserId : string , generationId : string ) {
@@ -72,7 +88,12 @@ class Assistant {
72
88
}
73
89
74
90
getResponse ( prompt : PromptParts ) {
75
- if ( prompt . tools . length === 0 ) {
91
+ // Sending tools to models that don't support them results in an error
92
+ // from openrouter.
93
+ if (
94
+ prompt . tools . length === 0 ||
95
+ ! this . toolCallCapableModels . has ( prompt . model )
96
+ ) {
76
97
return this . openai . beta . chat . completions . stream ( {
77
98
model : prompt . model ,
78
99
messages : prompt . messages as ChatCompletionMessageParam [ ] ,
@@ -144,6 +165,7 @@ Common issues are:
144
165
} ) ;
145
166
let { user_id : aiBotUserId } = auth ;
146
167
let assistant = new Assistant ( client , aiBotUserId ) ;
168
+ await assistant . loadToolCallCapableModels ( ) ;
147
169
148
170
client . on ( RoomMemberEvent . Membership , function ( _event , member ) {
149
171
if ( member . membership === 'invite' && member . userId === aiBotUserId ) {
0 commit comments