@@ -83,6 +83,71 @@ export const update_llm_usage_by_uuid = async (
8383 return query . update_llm_usage_by_pk ;
8484} ;
8585
86+ export const upsert_llm_usage_by_uuids = async (
87+ uuids : string [ ] ,
88+ token_limit : number = 0 ,
89+ ) => {
90+ const uniqueUuids = Array . from ( new Set ( uuids ) ) . filter ( Boolean ) ;
91+ if ( uniqueUuids . length === 0 ) {
92+ return 0 ;
93+ }
94+
95+ const query : any = await client . request (
96+ gql `
97+ mutation UpsertLlmUsage($objects: [llm_usage_insert_input!]!) {
98+ insert_llm_usage(
99+ objects: $objects
100+ on_conflict: { constraint: llm_usage_pkey, update_columns: [] }
101+ ) {
102+ affected_rows
103+ }
104+ }
105+ ` ,
106+ {
107+ objects : uniqueUuids . map ( ( uuid ) => ( {
108+ uuid,
109+ token_limit,
110+ total_tokens_used : 0 ,
111+ } ) ) ,
112+ } ,
113+ ) ;
114+
115+ return query . insert_llm_usage ?. affected_rows ?? 0 ;
116+ } ;
117+
118+ export const upsert_llm_usage_by_uuid = async (
119+ uuid : string ,
120+ token_limit : number = 0 ,
121+ ) => {
122+ return upsert_llm_usage_by_uuids ( [ uuid ] , token_limit ) ;
123+ } ;
124+
125+ export const sync_rl_registered_users_to_llm_usage = async (
126+ token_limit : number = 0 ,
127+ ) => {
128+ const query : any = await client . request (
129+ gql `
130+ query GetRLRegisteredUserUuids {
131+ contest_team_member(
132+ where: { contest_team: { contest: { name: { _ilike: "RL%" } } } }
133+ ) {
134+ user_uuid
135+ }
136+ }
137+ ` ,
138+ ) ;
139+
140+ const uuids = ( query . contest_team_member || [ ] ) . map (
141+ ( member : any ) => member . user_uuid ,
142+ ) ;
143+ const affectedRows = await upsert_llm_usage_by_uuids ( uuids , token_limit ) ;
144+
145+ return {
146+ totalRegisteredUsers : Array . from ( new Set ( uuids ) ) . length ,
147+ insertedUsers : affectedRows ,
148+ } ;
149+ } ;
150+
86151export const get_user_llm_usage = async ( student_no : string ) => {
87152 const query : any = await client . request (
88153 gql `
0 commit comments