Skip to content

Commit eb176c1

Browse files
authored
Create appscript
AppScript
1 parent 4bab9a0 commit eb176c1

File tree

1 file changed

+258
-0
lines changed

1 file changed

+258
-0
lines changed

appscript

Lines changed: 258 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,258 @@
1+
/*
2+
Script to evaluate the performance of OpenAI's models, i.e. gpt3.5-turbo or any chat model
3+
*/
4+
5+
var payload={};
6+
var options={};
7+
const urlChatModels='https://api.openai.com/v1/chat/completions';
8+
var conteggio=0; //counting tokens consumed
9+
10+
/* create the menu and submenu in Tester sheet*/
11+
function onOpen(){
12+
var ui = SpreadsheetApp.getUi();
13+
ui.createMenu('Evaluator')
14+
.addItem('Generate test', 'createCompletions')
15+
.addItem('Calculate Similarity', 'calculateSentenceSimilarity')
16+
/*.addItem('Clear Prompt and Output', 'cancellaPromptOutput')*/
17+
.addToUi();
18+
}
19+
20+
/*
21+
22+
--------Clear all contents in any sheets---------
23+
-------------------------------------------------
24+
25+
function cancellaPromptOutput(){
26+
27+
28+
var sheet = SpreadsheetApp.getActiveSheet();
29+
30+
var range = sheet.getRange("B2:C1000");
31+
range.clearContent();
32+
33+
34+
}*/
35+
/*
36+
Format date and tite for column title, gg-mm-yyyy hh:mm -> 14/02/2024 15:23
37+
*/
38+
function getFormattedDateTime(){
39+
let currentDate= new Date();
40+
var day = ("0" + currentDate.getDate()).slice(-2);
41+
var month = ("0" + (currentDate.getMonth() + 1)).slice(-2);
42+
var year = currentDate.getFullYear();
43+
var hours = ("0" + currentDate.getHours()).slice(-2);
44+
var minutes = ("0" + currentDate.getMinutes()).slice(-2);
45+
46+
let formattedDateTime = day + "/" + month + "/" + year + " " + hours + ":" + minutes;
47+
return formattedDateTime;
48+
}
49+
50+
51+
/*
52+
Tester Sheet
53+
Send HTTP post request to chat model endpoint for each rows in range B2:bX.
54+
55+
56+
Input: promt from column B
57+
Output: response in the first available column, inserting date and time + model's name as header colum, and then model's output for each call.
58+
*/
59+
60+
61+
function createCompletions() {
62+
63+
var sheet = SpreadsheetApp.getActiveSheet();
64+
var name=sheet.getName();
65+
if (name != "Tester"){
66+
sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Tester');
67+
SpreadsheetApp.setActiveSheet(sheet);
68+
}
69+
70+
71+
72+
/* retrieve API KEY value from cell A2 */
73+
var apiKey = sheet.getRange(2,1).getValue();
74+
75+
76+
payload ={
77+
"model": "gpt-3.5-turbo", // gpt-3.5-turbo you can change model here
78+
"messages": [{ role: "user", content: '' }],
79+
"temperature": 0.0,
80+
"max_tokens": 1024, // beware of token limits TPM
81+
"top_p": 1,
82+
"frequency_penalty": 0,
83+
"presence_penalty": 0
84+
};
85+
86+
87+
options = {
88+
'method' : 'post',
89+
'contentType': 'application/json',
90+
'payload' : JSON.stringify(payload),
91+
'muteHttpExceptions': true,
92+
'headers': {
93+
Authorization: 'Bearer ' + apiKey,
94+
},
95+
96+
};
97+
98+
99+
/** which column is next? */
100+
var lastColumn = sheet.getLastColumn();
101+
Logger.log(lastColumn);
102+
103+
104+
sheet.getRange(1, lastColumn +1, 1, 1).setValue(getFormattedDateTime() +' '+ payload.model.toString());
105+
/**
106+
*
107+
* cycling on column B -> PROMPT
108+
*/
109+
110+
var range = sheet.getRange("B2:B" + sheet.getLastRow());
111+
var data = range.getValues();
112+
113+
114+
for (var i = 0; i <data.length; i++) {
115+
var cellValue = data[i];
116+
if (cellValue === "") {
117+
Browser.msgBox('Please insert your prompt!');
118+
Logger.log('empty value');
119+
break;
120+
}
121+
Logger.log('Prompt= '+cellValue);
122+
payload.messages[0].content=cellValue.toString();
123+
options.payload=JSON.stringify(payload);
124+
Logger.log( options.payload);
125+
126+
// INVOKE endpoint
127+
try {
128+
response = UrlFetchApp.fetch(urlChatModels, options);
129+
130+
//get result
131+
var result = JSON.parse(response.getContentText())['choices'][0]['message']['content'];
132+
Logger.log(result);
133+
134+
if (result) {
135+
var uso = JSON.parse(response.getContentText())['usage']['total_tokens'];
136+
137+
conteggio += uso;
138+
Logger.log('TOKENS= ' + conteggio);
139+
140+
sheet.getRange(i + 2, lastColumn + 1, 1, 1).setValue(result);
141+
} else {
142+
143+
sheet.getRange(i + 2, lastColumn + 1, 1, 1).setValue('Ops, something went wrong!');
144+
}
145+
} catch (err) {
146+
Logger.log(err.message);
147+
}
148+
149+
}
150+
151+
152+
}
153+
/* */
154+
function calculateSentenceSimilarity(){
155+
156+
157+
var sheet = SpreadsheetApp.getActiveSheet();
158+
159+
var name=sheet.getName();
160+
if (name != "Analisys"){
161+
sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Analisys');
162+
SpreadsheetApp.setActiveSheet(sheet);
163+
}
164+
165+
/* retrieve API KEY value from cell A2 */
166+
var apiKey = SpreadsheetApp.getActiveSpreadsheet().getSheetByName('Tester').getRange(2,1).getValue();
167+
Logger.log(apiKey);
168+
169+
payload ={
170+
"model": "gpt-4-0125-preview", // use a different model as evaluator
171+
"messages": [{ role: "user", content: '' }],
172+
"temperature": 0.0,
173+
"max_tokens": 1, // returns a number between 1-100
174+
"top_p": 1,
175+
"frequency_penalty": 0,
176+
"presence_penalty": 0
177+
};
178+
179+
180+
options = {
181+
'method' : 'post',
182+
'contentType': 'application/json',
183+
'payload' : JSON.stringify(payload),
184+
'muteHttpExceptions': true,
185+
'headers': {
186+
Authorization: 'Bearer ' + apiKey,
187+
},
188+
189+
};
190+
//Logger.log(options);
191+
192+
193+
194+
var lastColumn = sheet.getLastColumn();
195+
196+
/* set column header */
197+
sheet.getRange(1, lastColumn +1, 1, 1).setValue('Similarity score between column B & D');
198+
199+
var prompt="Calculate the sentence similary between the following sentences using the cosine similarity algorithm. YOU MUST RETURN as Output ONLY A NUMERIC VALUE, between 1 and 100 according to the sentence similary.\n" +
200+
"Sentence 1: {sentence1}\n "+
201+
"Sentence 2: {sentence2}\n "+
202+
"Output:";
203+
/**
204+
*
205+
* cycling on column B and D
206+
*/
207+
208+
var range = sheet.getRange("B2:B" + sheet.getLastRow());
209+
var range2 = sheet.getRange("D2:D" + sheet.getLastRow());
210+
var data = range.getValues();
211+
var data2=range2.getValues();
212+
213+
for (var i = 0; i <data.length; i++) {
214+
var cellValue = data[i].toString();
215+
var cellValue2= data2[i].toString();
216+
if ((cellValue === "") || (cellValue2 === "")) {
217+
Browser.msgBox('Empty cell',Browser.Buttons.OK_CANCEL);
218+
Logger.log('Empty cell');
219+
break;
220+
}
221+
Logger.log('Sentence 1= '+cellValue +', Sentence 2='+cellValue2);
222+
223+
//replace sentence1 and sentence2 with cellValue and cellValue2 values
224+
var prompt_finale=prompt.replace(" {sentence1}",cellValue.toString() );
225+
Logger.log(prompt_finale);
226+
prompt_finale=prompt_finale.replace(" {sentence2}",cellValue2.toString() );
227+
Logger.log(prompt_finale);
228+
payload.messages[0].content=prompt_finale;
229+
options.payload=JSON.stringify(payload);
230+
Logger.log( options.payload);
231+
232+
// INVOKE endpoint
233+
try {
234+
response = UrlFetchApp.fetch(urlChatModels, options);
235+
236+
//get result
237+
var result = JSON.parse(response.getContentText())['choices'][0]['message']['content'];
238+
Logger.log(result);
239+
240+
if (result) {
241+
var uso = JSON.parse(response.getContentText())['usage']['total_tokens'];
242+
243+
conteggio += uso;
244+
Logger.log('TOKENS COUNT = ' + conteggio);
245+
246+
sheet.getRange(i + 2, lastColumn + 1, 1, 1).setValue(result);
247+
} else {
248+
249+
sheet.getRange(i + 2, lastColumn + 1, 1, 1).setValue('something went wrong');
250+
}
251+
} catch (err) {
252+
Logger.log(err.message);
253+
Browser.msgBox('Oops...An error happened! Try again later!',Browser.Buttons.OK);
254+
}
255+
256+
}
257+
258+
}

0 commit comments

Comments
 (0)