mirror of
https://github.com/multipleof4/devsune.git
synced 2026-01-14 00:17:56 +00:00
Update index.html
This commit is contained in:
84
index.html
84
index.html
@@ -213,78 +213,34 @@ init()
|
||||
<script>
|
||||
const WS_URL="wss://orp.awww.workers.dev/ws";
|
||||
|
||||
class SingleRunWS {
|
||||
constructor({ payload, onDelta }) {
|
||||
this.payload = payload; // { apiKey, model, messages }
|
||||
this.onDelta = onDelta;
|
||||
this.ws = null;
|
||||
this.lastSeq = -1;
|
||||
this.done = false;
|
||||
this.manual = false;
|
||||
this.timer = null;
|
||||
this.backoff = 300;
|
||||
this.rid = Date.now().toString(36) + Math.random().toString(36).slice(2, 8);
|
||||
}
|
||||
start(){ this.connect("begin"); }
|
||||
abort(){
|
||||
this.manual = true; this.done = true;
|
||||
try { this.ws?.send(JSON.stringify({ type: "stop", rid: this.rid })); } catch {}
|
||||
try { this.ws?.close(); } catch {}
|
||||
clearTimeout(this.timer);
|
||||
}
|
||||
connect(mode){
|
||||
const buildBody=()=>{const msgs=[];if(store.system_prompt)msgs.push({role:"system",content:[{type:"text",text:store.system_prompt}]});msgs.push(...state.messages.filter(m=>m.role!=="system").map(m=>({role:m.role,content:m.content})));const b=payloadWithSampling({model:store.model,messages:msgs,stream:true});if(store.reasoning_effort&&store.reasoning_effort!=="default")b.reasoning={effort:store.reasoning_effort};return b};
|
||||
|
||||
class RunWS{
|
||||
constructor(onDelta){this.onDelta=onDelta;this.ws=null;this.seq=-1;this.done=false;this.manual=false;this.rid=Math.random().toString(36).slice(2);this.backoff=300}
|
||||
start(){this.open("begin")}
|
||||
abort(){this.manual=true;this.done=true;try{this.ws?.send(JSON.stringify({type:"stop",rid:this.rid}))}catch{}try{this.ws?.close()}catch{}}
|
||||
open(mode){
|
||||
if(this.done)return;
|
||||
this.ws=new WebSocket(WS_URL);
|
||||
this.ws.onopen = () => {
|
||||
if (mode === "begin") {
|
||||
this.ws.send(JSON.stringify({ type: "begin", rid: this.rid, ...this.payload, after: this.lastSeq }));
|
||||
} else {
|
||||
this.ws.send(JSON.stringify({ type: "resume", rid: this.rid, after: this.lastSeq }));
|
||||
}
|
||||
this.ws.onopen=()=>this.ws.send(JSON.stringify(mode==="begin"?{type:"begin",rid:this.rid,apiKey:store.apiKey,or_body:buildBody()}:{type:"resume",rid:this.rid,after:this.seq}));
|
||||
this.ws.onmessage=e=>{
|
||||
let m;try{m=JSON.parse(e.data)}catch{return}
|
||||
if(m.type==="delta"&&typeof m.seq==="number"&&m.seq>this.seq){this.seq=m.seq;this.onDelta(m.text,false)}
|
||||
else if(m.type==="done"){this.done=true;this.onDelta("",true);this.ws.close()}
|
||||
else if(m.type==="err"){this.done=true;this.onDelta("\n\n"+(m.message||"error"),true);this.ws.close()}
|
||||
};
|
||||
this.ws.onmessage = (e) => {
|
||||
let m; try { m = JSON.parse(e.data); } catch { return; }
|
||||
if (m.type === "delta" && typeof m.seq === "number" && m.seq > this.lastSeq) {
|
||||
this.lastSeq = m.seq;
|
||||
this.onDelta(m.text, false);
|
||||
} else if (m.type === "done") {
|
||||
this.done = true;
|
||||
this.onDelta("", true);
|
||||
this.cleanup();
|
||||
} else if (m.type === "err") {
|
||||
// stale_run/busy/etc. end this runner gracefully
|
||||
this.done = true;
|
||||
this.onDelta("\n\n" + (m.message || "error"), true);
|
||||
this.cleanup();
|
||||
this.ws.onclose=()=>{if(!this.done&&!this.manual)setTimeout(()=>this.open("resume"),this.backoff=Math.min(this.backoff*1.5,5e3))}
|
||||
}
|
||||
};
|
||||
this.ws.onclose = () => { if (!this.done && !this.manual) this.schedule(); };
|
||||
this.ws.onerror = () => {};
|
||||
}
|
||||
schedule(){
|
||||
clearTimeout(this.timer);
|
||||
if (this.manual || this.done) return;
|
||||
this.timer = setTimeout(() => {
|
||||
this.connect("resume");
|
||||
this.backoff = Math.min(this.backoff * 1.5, 5000);
|
||||
}, this.backoff);
|
||||
}
|
||||
cleanup(){ clearTimeout(this.timer); try { this.ws?.close(); } catch {} }
|
||||
}
|
||||
|
||||
async function askViaDOStreaming(onDelta) {
|
||||
const apiKey = store.apiKey;
|
||||
const model = store.model;
|
||||
const msgs = [];
|
||||
if (store.system_prompt) msgs.push({ role: "system", content: [{ type: "text", text: store.system_prompt }] });
|
||||
msgs.push(...state.messages.filter(m => m.role !== "system").map(m => ({ role: m.role, content: m.content })));
|
||||
|
||||
const runner = new SingleRunWS({ payload: { apiKey, model, messages: msgs }, onDelta });
|
||||
state.controller = { abort: () => runner.abort() };
|
||||
runner.start();
|
||||
async function askViaWS(onDelta){
|
||||
const r=new RunWS(onDelta);
|
||||
state.controller={abort:()=>r.abort()};
|
||||
r.start();
|
||||
return {ok:true};
|
||||
}
|
||||
askOpenRouterStreaming = askViaDOStreaming;
|
||||
|
||||
askOpenRouterStreaming=askViaWS;
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
Reference in New Issue
Block a user