Skip to content

Commit 6999617

Browse files
committed
Added ToYaml.com/GET API support ↞ [auto-sync from https://github.com/adamlui/ai-web-extensionss/tree/main/bravegpt]
1 parent efe7e6f commit 6999617

File tree

1 file changed

+57
-33
lines changed

1 file changed

+57
-33
lines changed

chatgpt/bravegpt/bravegpt.user.js

Lines changed: 57 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@
148148
// @description:zu Yengeza izimpendulo ze-AI ku-Brave Search (inikwa amandla yi-GPT-4o!)
149149
// @author KudoAI
150150
// @namespace https://kudoai.com
151-
// @version 2025.1.14.4
151+
// @version 2025.1.14.5
152152
// @license MIT
153153
// @icon https://assets.bravegpt.com/images/icons/bravegpt/icon48.png?v=df624b0
154154
// @icon64 https://assets.bravegpt.com/images/icons/bravegpt/icon64.png?v=df624b0
@@ -179,6 +179,7 @@
179179
// @connect chatgpt.com
180180
// @connect update.greasyfork.org
181181
// @connect fanyi.sogou.com
182+
// @connect toyaml.com
182183
// @require https://cdn.jsdelivr.net/npm/@kudoai/chatgpt.js@3.5.0/dist/chatgpt.min.js#sha256-+C0x4BOFQc38aZB3pvUC2THu+ZSvuCxRphGdtRLjCDg=
183184
// @require https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.2.0/crypto-js.min.js#sha256-dppVXeVTurw1ozOPNE3XqhYmDJPOosfbKQcHyQSE58w=
184185
// @require https://cdn.jsdelivr.net/npm/generate-ip@2.4.4/dist/generate-ip.min.js#sha256-aQQKAQcMgCu8IpJp9HKs387x0uYxngO+Fb4pc5nSF4I=
@@ -603,6 +604,11 @@
603604
},
604605
expectedOrigin: { url: 'https://chatgpt.com', headers: { 'Priority': 'u=4' }},
605606
method: 'POST', streamable: true
607+
},
608+
'ToYaml.com': {
609+
endpoint: 'https://toyaml.com/streams',
610+
expectedOrigin: { url: 'https://toyaml.com/chat.html', headers: { 'x-requested-with': 'XMLHttpRequest' }},
611+
method: 'GET', streamable: true, watermark: '【本答案来自 toyaml.com】'
606612
}
607613
}
608614

@@ -3153,14 +3159,18 @@
31533159
const ip = ipv4.generate({ verbose: false })
31543160
const headers = {
31553161
'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate, br, zstd',
3156-
'Connection': 'keep-alive', 'Content-Type': 'application/json', 'DNT': '1',
3157-
'Host': new URL(apis[api].endpoints?.completions || apis[api].endpoint).hostname,
3158-
'Origin': apis[api].expectedOrigin.url, 'Sec-Fetch-Site': 'same-origin',
3159-
'Sec-Fetch-Dest': 'empty', 'Sec-Fetch-Mode': 'cors', 'X-Forwarded-For': ip, 'X-Real-IP': ip
3162+
'Connection': 'keep-alive', 'DNT': '1',
3163+
'Origin': apis[api].expectedOrigin.url, 'X-Forwarded-For': ip, 'X-Real-IP': ip
31603164
}
31613165
headers.Referer = headers.Origin + '/'
3162-
if (api == 'OpenAI') headers.Authorization = 'Bearer ' + config.openAIkey
3163-
Object.assign(headers, apis[api].expectedOrigin.headers)
3166+
if (apis[api].method == 'POST') Object.assign(headers, {
3167+
'Content-Type': 'application/json',
3168+
'Host': new URL(apis[api].endpoints?.completions || apis[api].endpoint).hostname,
3169+
'Sec-Fetch-Site': 'same-origin', 'Sec-Fetch-Dest': 'empty', 'Sec-Fetch-Mode': 'cors'
3170+
})
3171+
else if (apis[api].method == 'GET') headers['x-requested-with'] = 'XMLHttpRequest'
3172+
Object.assign(headers, apis[api].expectedOrigin.headers) // API-specific ones
3173+
if (api == 'OpenAI') headers.Authorization = `Bearer ${config.openAIkey}`
31643174
return headers
31653175
},
31663176

@@ -3284,19 +3294,22 @@
32843294
}
32853295

32863296
// Get/show answer from AI
3287-
xhr({
3288-
method: apis[get.reply.api].method,
3289-
url: apis[get.reply.api].endpoints?.completions || apis[get.reply.api].endpoint,
3297+
const reqMethod = apis[get.reply.api].method
3298+
const xhrConfig = {
3299+
headers: api.createHeaders(get.reply.api), method: reqMethod,
32903300
responseType: config.streamingDisabled || !config.proxyAPIenabled ? 'text' : 'stream',
3291-
headers: api.createHeaders(get.reply.api), data: await api.createPayload(get.reply.api, msgChain),
3292-
onload: resp => dataProcess.text(get.reply, resp),
3293-
onloadstart: resp => dataProcess.stream(get.reply, resp),
32943301
onerror: err => { log.error(err)
32953302
if (!config.proxyAPIenabled)
32963303
appAlert(!config.openAIkey ? 'login' : ['openAInotWorking', 'suggestProxy'])
32973304
else api.tryNew(get.reply)
3298-
}
3299-
})
3305+
},
3306+
onload: resp => dataProcess.text(get.reply, resp),
3307+
onloadstart: resp => dataProcess.stream(get.reply, resp),
3308+
url: ( apis[get.reply.api].endpoints?.completions || apis[get.reply.api].endpoint )
3309+
+ ( reqMethod == 'GET' ? `?q=${encodeURIComponent(msgChain[msgChain.length -1].content)}` : '' )
3310+
}
3311+
if (reqMethod == 'POST') xhrConfig.data = await api.createPayload(get.reply.api, msgChain)
3312+
xhr(xhrConfig)
33003313

33013314
// Get/show related queries if enabled on 1st get.reply()
33023315
if (!config.rqDisabled && get.reply.attemptCnt == 1)
@@ -3355,14 +3368,18 @@
33553368

33563369
// Get queries
33573370
const payload = await api.createPayload(get.related.api, [{ role: 'user', content: rqPrompt }])
3358-
return new Promise(resolve => xhr({
3359-
method: apis[get.related.api].method,
3360-
url: apis[get.related.api].endpoints?.completions || apis[get.related.api].endpoint,
3361-
responseType: 'text', headers: api.createHeaders(get.related.api),
3362-
data: payload,
3363-
onload: resp => dataProcess.text(get.related, resp).then(resolve),
3364-
onerror: err => { log.error(err) ; api.tryNew(get.related) }
3365-
}))
3371+
return new Promise(resolve => {
3372+
const reqMethod = apis[get.related.api].method
3373+
const xhrConfig = {
3374+
headers: api.createHeaders(get.related.api), method: reqMethod, responseType: 'text',
3375+
onerror: err => { log.error(err) ; api.tryNew(get.related) },
3376+
onload: resp => dataProcess.text(get.related, resp).then(resolve),
3377+
url: ( apis[get.related.api].endpoints?.completions || apis[get.related.api].endpoint )
3378+
+ ( reqMethod == 'GET' ? `?q=${rqPrompt}` : '' )
3379+
}
3380+
if (reqMethod == 'POST') xhrConfig.data = payload
3381+
xhr(xhrConfig)
3382+
})
33663383
}
33673384
}
33683385

@@ -3384,15 +3401,9 @@
33843401
reader.read().then(processStreamText).catch(err => log.error('Error processing stream', err.message))
33853402

33863403
function processStreamText({ done, value }) {
3387-
if (done) { caller.sender = null
3388-
if (appDiv.querySelector('.loading')) // no text shown
3389-
api.tryNew(caller)
3390-
else { // text was shown
3391-
caller.status = 'done' ; caller.attemptCnt = null
3392-
show.replyCornerBtns() ; api.clearTimedOut(caller.triedAPIs)
3393-
} return
3394-
}
3404+
if (done) { handleProcessCompletion() ; return }
33953405
let chunk = new TextDecoder('utf8').decode(new Uint8Array(value))
3406+
if (chunk.includes(apis[caller.api].watermark)) { handleProcessCompletion() ; return }
33963407
if (caller.api == 'MixerBox AI') { // pre-process chunks
33973408
const extractedChunks = Array.from(chunk.matchAll(/data:(.*)/g), match => match[1]
33983409
.replace(/\[SPACE\]/g, ' ').replace(/\[NEWLINE\]/g, '\n'))
@@ -3427,6 +3438,16 @@
34273438
processStreamText({ done, value })
34283439
}).catch(err => log.error('Error reading stream', err.message))
34293440
}
3441+
3442+
function handleProcessCompletion() {
3443+
caller.sender = null
3444+
if (appDiv.querySelector('.loading')) // no text shown
3445+
api.tryNew(caller)
3446+
else { // text was shown
3447+
caller.status = 'done' ; caller.attemptCnt = null
3448+
show.replyCornerBtns() ; api.clearTimedOut(caller.triedAPIs)
3449+
} return
3450+
}
34303451
},
34313452

34323453
text(caller, resp) {
@@ -3458,7 +3479,7 @@
34583479
} catch (err) { handleProcessError(err) }
34593480
}
34603481
} else if (resp.responseText) {
3461-
if (/AIchatOS|FREEGPT/.test(caller.api)) {
3482+
if (/AIchatOS|ToYaml.com|FREEGPT/.test(caller.api)) {
34623483
try { // to show response or return related queries
34633484
const text = resp.responseText, chunkSize = 1024
34643485
let currentIdx = 0
@@ -3495,9 +3516,12 @@
34953516
api.tryNew(caller)
34963517
} else {
34973518
caller.status = 'done' ; api.clearTimedOut(caller.triedAPIs) ; caller.attemptCnt = null
3519+
respText = respText.replace(apis[caller.api].watermark, '').trim()
34983520
if (caller == get.reply) { show.reply(respText, footerContent) ; show.replyCornerBtns() }
34993521
else resolve(arrayify(respText))
3500-
}}}
3522+
}
3523+
}
3524+
}
35013525

35023526
function handleProcessError(err) { // suggest proxy or try diff API
35033527
log.debug('Response text', resp.response)

0 commit comments

Comments
 (0)