Skip to content

Commit 43d1134

Browse files
committed
Added ToYaml.com/GET API support ↞ [auto-sync from https://github.com/adamlui/ai-web-extensions/tree/main/duckduckgpt]
1 parent 68478fd commit 43d1134

File tree

1 file changed

+57
-33
lines changed

1 file changed

+57
-33
lines changed

chatgpt/duckduckgpt/duckduckgpt.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-DuckDuckGo (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.ddgpt.com/images/icons/duckduckgpt/icon48.png?v=06af076
154154
// @icon64 https://assets.ddgpt.com/images/icons/duckduckgpt/icon64.png?v=06af076
@@ -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=
@@ -611,6 +612,11 @@
611612
},
612613
expectedOrigin: { url: 'https://chatgpt.com', headers: { 'Priority': 'u=4' }},
613614
method: 'POST', streamable: true
615+
},
616+
'ToYaml.com': {
617+
endpoint: 'https://toyaml.com/streams',
618+
expectedOrigin: { url: 'https://toyaml.com/chat.html', headers: { 'x-requested-with': 'XMLHttpRequest' }},
619+
method: 'GET', streamable: true, watermark: '【本答案来自 toyaml.com】'
614620
}
615621
}
616622

@@ -3038,14 +3044,18 @@
30383044
const ip = ipv4.generate({ verbose: false })
30393045
const headers = {
30403046
'Accept': '*/*', 'Accept-Encoding': 'gzip, deflate, br, zstd',
3041-
'Connection': 'keep-alive', 'Content-Type': 'application/json', 'DNT': '1',
3042-
'Host': new URL(apis[api].endpoints?.completions || apis[api].endpoint).hostname,
3043-
'Origin': apis[api].expectedOrigin.url, 'Sec-Fetch-Site': 'same-origin',
3044-
'Sec-Fetch-Dest': 'empty', 'Sec-Fetch-Mode': 'cors', 'X-Forwarded-For': ip, 'X-Real-IP': ip
3047+
'Connection': 'keep-alive', 'DNT': '1',
3048+
'Origin': apis[api].expectedOrigin.url, 'X-Forwarded-For': ip, 'X-Real-IP': ip
30453049
}
30463050
headers.Referer = headers.Origin + '/'
3047-
if (api == 'OpenAI') headers.Authorization = 'Bearer ' + config.openAIkey
3048-
Object.assign(headers, apis[api].expectedOrigin.headers)
3051+
if (apis[api].method == 'POST') Object.assign(headers, {
3052+
'Content-Type': 'application/json',
3053+
'Host': new URL(apis[api].endpoints?.completions || apis[api].endpoint).hostname,
3054+
'Sec-Fetch-Site': 'same-origin', 'Sec-Fetch-Dest': 'empty', 'Sec-Fetch-Mode': 'cors'
3055+
})
3056+
else if (apis[api].method == 'GET') headers['x-requested-with'] = 'XMLHttpRequest'
3057+
Object.assign(headers, apis[api].expectedOrigin.headers) // API-specific ones
3058+
if (api == 'OpenAI') headers.Authorization = `Bearer ${config.openAIkey}`
30493059
return headers
30503060
},
30513061

@@ -3169,19 +3179,22 @@
31693179
}
31703180

31713181
// Get/show answer from AI
3172-
xhr({
3173-
method: apis[get.reply.api].method,
3174-
url: apis[get.reply.api].endpoints?.completions || apis[get.reply.api].endpoint,
3182+
const reqMethod = apis[get.reply.api].method
3183+
const xhrConfig = {
3184+
headers: api.createHeaders(get.reply.api), method: reqMethod,
31753185
responseType: config.streamingDisabled || !config.proxyAPIenabled ? 'text' : 'stream',
3176-
headers: api.createHeaders(get.reply.api), data: await api.createPayload(get.reply.api, msgChain),
3177-
onload: resp => dataProcess.text(get.reply, resp),
3178-
onloadstart: resp => dataProcess.stream(get.reply, resp),
31793186
onerror: err => { log.error(err)
31803187
if (!config.proxyAPIenabled)
31813188
appAlert(!config.openAIkey ? 'login' : ['openAInotWorking', 'suggestProxy'])
31823189
else api.tryNew(get.reply)
3183-
}
3184-
})
3190+
},
3191+
onload: resp => dataProcess.text(get.reply, resp),
3192+
onloadstart: resp => dataProcess.stream(get.reply, resp),
3193+
url: ( apis[get.reply.api].endpoints?.completions || apis[get.reply.api].endpoint )
3194+
+ ( reqMethod == 'GET' ? `?q=${encodeURIComponent(msgChain[msgChain.length -1].content)}` : '' )
3195+
}
3196+
if (reqMethod == 'POST') xhrConfig.data = await api.createPayload(get.reply.api, msgChain)
3197+
xhr(xhrConfig)
31853198

31863199
// Get/show related queries if enabled on 1st get.reply()
31873200
if (!config.rqDisabled && get.reply.attemptCnt == 1)
@@ -3238,14 +3251,18 @@
32383251

32393252
// Get queries
32403253
const payload = await api.createPayload(get.related.api, [{ role: 'user', content: rqPrompt }])
3241-
return new Promise(resolve => xhr({
3242-
method: apis[get.related.api].method,
3243-
url: apis[get.related.api].endpoints?.completions || apis[get.related.api].endpoint,
3244-
responseType: 'text', headers: api.createHeaders(get.related.api),
3245-
data: payload,
3246-
onload: resp => dataProcess.text(get.related, resp).then(resolve),
3247-
onerror: err => { log.error(err) ; api.tryNew(get.related) }
3248-
}))
3254+
return new Promise(resolve => {
3255+
const reqMethod = apis[get.related.api].method
3256+
const xhrConfig = {
3257+
headers: api.createHeaders(get.related.api), method: reqMethod, responseType: 'text',
3258+
onerror: err => { log.error(err) ; api.tryNew(get.related) },
3259+
onload: resp => dataProcess.text(get.related, resp).then(resolve),
3260+
url: ( apis[get.related.api].endpoints?.completions || apis[get.related.api].endpoint )
3261+
+ ( reqMethod == 'GET' ? `?q=${rqPrompt}` : '' )
3262+
}
3263+
if (reqMethod == 'POST') xhrConfig.data = payload
3264+
xhr(xhrConfig)
3265+
})
32493266
}
32503267
}
32513268

@@ -3267,15 +3284,9 @@
32673284
reader.read().then(processStreamText).catch(err => log.error('Error processing stream', err.message))
32683285

32693286
function processStreamText({ done, value }) {
3270-
if (done) { caller.sender = null
3271-
if (appDiv.querySelector('.loading')) // no text shown
3272-
api.tryNew(caller)
3273-
else { // text was shown
3274-
caller.status = 'done' ; caller.attemptCnt = null
3275-
show.replyCornerBtns() ; api.clearTimedOut(caller.triedAPIs)
3276-
} return
3277-
}
3287+
if (done) { handleProcessCompletion() ; return }
32783288
let chunk = new TextDecoder('utf8').decode(new Uint8Array(value))
3289+
if (chunk.includes(apis[caller.api].watermark)) { handleProcessCompletion() ; return }
32793290
if (caller.api == 'MixerBox AI') { // pre-process chunks
32803291
const extractedChunks = Array.from(chunk.matchAll(/data:(.*)/g), match => match[1]
32813292
.replace(/\[SPACE\]/g, ' ').replace(/\[NEWLINE\]/g, '\n'))
@@ -3310,6 +3321,16 @@
33103321
processStreamText({ done, value })
33113322
}).catch(err => log.error('Error reading stream', err.message))
33123323
}
3324+
3325+
function handleProcessCompletion() {
3326+
caller.sender = null
3327+
if (appDiv.querySelector('.loading')) // no text shown
3328+
api.tryNew(caller)
3329+
else { // text was shown
3330+
caller.status = 'done' ; caller.attemptCnt = null
3331+
show.replyCornerBtns() ; api.clearTimedOut(caller.triedAPIs)
3332+
} return
3333+
}
33133334
},
33143335

33153336
text(caller, resp) {
@@ -3341,7 +3362,7 @@
33413362
} catch (err) { handleProcessError(err) }
33423363
}
33433364
} else if (resp.responseText) {
3344-
if (/AIchatOS|FREEGPT/.test(caller.api)) {
3365+
if (/AIchatOS|ToYaml.com|FREEGPT/.test(caller.api)) {
33453366
try { // to show response or return related queries
33463367
const text = resp.responseText, chunkSize = 1024
33473368
let currentIdx = 0
@@ -3378,9 +3399,12 @@
33783399
api.tryNew(caller)
33793400
} else {
33803401
caller.status = 'done' ; api.clearTimedOut(caller.triedAPIs) ; caller.attemptCnt = null
3402+
respText = respText.replace(apis[caller.api].watermark, '').trim()
33813403
if (caller == get.reply) { show.reply(respText) ; show.replyCornerBtns() }
33823404
else resolve(arrayify(respText))
3383-
}}}
3405+
}
3406+
}
3407+
}
33843408

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

0 commit comments

Comments
 (0)