1
+ const costsPerM = {
2
+ "openai/gpt-4o-mini" : {
3
+ input_price : 0.15 ,
4
+ output_price : 0.6 ,
5
+ } ,
6
+ "google/gemini-flash-1.5-8b" : {
7
+ input_price : 0.0375 ,
8
+ output_price : 0.15 ,
9
+ } ,
10
+ "google/gemini-flash-1.5" : {
11
+ input_price : 0.075 ,
12
+ output_price : 0.3 ,
13
+ } ,
14
+ } ;
15
+
1
16
const defaultTableRowStr = `
2
17
<td
3
18
class="task-id whitespace-nowrap py-4 pl-4 pr-3 text-sm font-medium text-gray-900 sm:pl-0"
@@ -83,6 +98,9 @@ const displayTask = (task) => {
83
98
task . pages_processed
84
99
) ;
85
100
101
+ let completionTokens = 0 ;
102
+ let promptTokens = 0 ;
103
+
86
104
sortedPages . forEach ( ( page ) => {
87
105
const pageContainer = document . createElement ( "div" ) ;
88
106
pageContainer . classList . add ( "page-container" ) ;
@@ -91,6 +109,9 @@ const displayTask = (task) => {
91
109
const spacerDiv = document . createElement ( "div" ) ;
92
110
spacerDiv . classList . add ( ...[ "my-4" , "h-1" , "bg-gray-700" ] ) ;
93
111
markdownContainer . appendChild ( spacerDiv ) ;
112
+
113
+ promptTokens += page ?. usage ?. prompt_tokens || 0 ;
114
+ completionTokens += page ?. usage ?. completion_tokens || 0 ;
94
115
} ) ;
95
116
if ( ! sortedPages . length ) {
96
117
const pageContainer = document . createElement ( "div" ) ;
@@ -99,9 +120,33 @@ const displayTask = (task) => {
99
120
"Your file is being converted. We are pinging the server every 5 seconds to check for status updates. See the table below for more detailed status information. Please be patient!" ;
100
121
markdownContainer . appendChild ( pageContainer ) ;
101
122
}
123
+
124
+ const modelSelect = document . getElementById ( "model" ) ;
125
+ const model = modelSelect . options [ modelSelect . selectedIndex ] . value ;
126
+ const costPerM = costsPerM [ model ] ;
127
+ const completionCost = ( completionTokens * costPerM . output_price ) / 1000000 ;
128
+ const promptCost = ( promptTokens * costPerM . input_price ) / 1000000 ;
129
+ document . getElementById ( "document-price" ) . innerText =
130
+ `Cost: ${ new Intl . NumberFormat ( "en-US" , {
131
+ style : "currency" ,
132
+ currency : "USD" ,
133
+ minimumFractionDigits : 5 ,
134
+ } ) . format ( promptCost ) } (Prompt) + ${ new Intl . NumberFormat ( "en-US" , {
135
+ style : "currency" ,
136
+ currency : "USD" ,
137
+ minimumFractionDigits : 5 ,
138
+ } ) . format ( completionCost ) } (Completion) = ${ new Intl . NumberFormat ( "en-US" , {
139
+ style : "currency" ,
140
+ currency : "USD" ,
141
+ minimumFractionDigits : 5 ,
142
+ } ) . format ( completionCost + promptCost ) } `;
102
143
} ;
103
144
104
145
const getTaskPages = async ( taskId , taskIdToDisplay ) => {
146
+ if ( ! taskId ) {
147
+ return ;
148
+ }
149
+
105
150
try {
106
151
let paginationToken = "" ;
107
152
let task = null ;
@@ -119,7 +164,7 @@ const getTaskPages = async (taskId, taskIdToDisplay) => {
119
164
) ;
120
165
const taskWithPages = await resp . json ( ) ;
121
166
task = taskWithPages ;
122
- pages . push ( ...taskWithPages . pages ) ;
167
+ pages . push ( ...( taskWithPages . pages || [ ] ) ) ;
123
168
paginationToken = taskWithPages . pagination_token ;
124
169
if ( ! paginationToken ) {
125
170
break ;
@@ -243,13 +288,13 @@ const updateTaskStatusTable = () => {
243
288
row . querySelector ( ".task-id" ) . innerText = task . id ;
244
289
row . querySelector ( ".task-file-name" ) . innerText = task . file_name ;
245
290
row . querySelector ( ".task-status" ) . innerText =
246
- task . status . toLowerCase ( ) === "completed"
291
+ task . status ? .toLowerCase ( ) === "completed"
247
292
? task . status
248
293
: `${ task . status } | Please wait. Checking for updates every 5 seconds.` ;
249
294
row
250
295
. querySelector ( ".task-status" )
251
296
. classList . add (
252
- `status-${ task . status . split ( " " ) . join ( "-" ) . toLowerCase ( ) } `
297
+ `status-${ task . status ? .split ( " " ) . join ( "-" ) . toLowerCase ( ) } `
253
298
) ;
254
299
row . querySelector ( ".task-prompt-tokens" ) . innerText = promptTokens ;
255
300
row . querySelector ( ".task-completion-tokens" ) . innerText = completionTokens ;
@@ -282,7 +327,7 @@ const refreshTasks = () => {
282
327
const taskIdToDisplay = url . searchParams . get ( "taskId" ) ;
283
328
tasks . forEach ( ( task ) => {
284
329
if (
285
- task . status . toLowerCase ( ) === "completed" &&
330
+ task . status ? .toLowerCase ( ) === "completed" &&
286
331
task . pages &&
287
332
task . pages . length
288
333
) {
0 commit comments