ruoxie

ruoxie

V2EX 第 322280 号会员,加入于 2018-06-12 21:54:27 +08:00
今日活跃度排名 16304
根据 ruoxie 的设置,主题列表被隐藏
二手交易 相关的信息,包括已关闭的交易,不会被隐藏
ruoxie 最近回复了
6 天前
回复了 suxixi 创建的主题 程序员 分享一个 chatgpt 国内镜像速度非常快很爽
好歹换个皮啊
6 天前
回复了 whyrookie 创建的主题 程序员 关于前端布局嵌套一些疑惑。
开发体验 > 开发速度 > 性能,也许你写的页面上线一个星期后就没人用了
6 天前
回复了 x77 创建的主题 程序员 邀请懂 TypeScript 的程序员帮忙改代码
这个项目没有用流模式,体验太差了
6 天前
回复了 x77 创建的主题 程序员 邀请懂 TypeScript 的程序员帮忙改代码
代码直接给你了
import * as https from 'https';
import { TextDecoder } from 'util';

export const createChatCompletion = (options: {
host: string;
apiKey: string;
model: string;
text: string;
context?: string;
maxTokens: number;
handleChunk?: (data: { text?: string; hasMore: boolean }) => void;
}) =>
new Promise<string>((resolve, reject) => {
let combinedResult = '';
const request = https.request(
{
hostname: options.host,
port: 443,
path: '/v1/chat/completions',
method: 'POST',
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${options.apiKey}`,
},
},
(res) => {
res.on('data', async (chunk) => {
const text = new TextDecoder('utf-8').decode(chunk);
const data = text.split('\n\n').filter((s) => s);
for (let i = 0; i < data.length; i++) {
try {
let element = data[i];
if (element.includes('data: ')) {
if (element.trim() === 'data:') {
// 处理只返回了 data: 的情况
return;
}
} else if (element.includes('delta')) {
// 处理没有 data 开头
element = `data: ${element}`;
}
if (element.includes('data: ')) {
if (element.includes('[DONE]')) {
options.handleChunk &&
options.handleChunk({ hasMore: false, text: '' });
return;
}
// remove 'data: '
const data = JSON.parse(element.replace('data: ', ''));
if (data.finish_reason === 'stop') {
options.handleChunk &&
options.handleChunk({ hasMore: false, text: '' });
return;
}
const openaiRes = data.choices[0].delta.content;
if (openaiRes) {
options.handleChunk &&
options.handleChunk({
text: openaiRes.replaceAll('\\n', '\n'),
hasMore: true,
});
combinedResult += openaiRes;
}
} else {
options.handleChunk &&
options.handleChunk({ hasMore: false, text: element });
return;
}
} catch (e) {
console.error({
e,
element: data[i],
});
}
}
});
res.on('error', (e) => {
options.handleChunk &&
options.handleChunk({ hasMore: false, text: e.toString() });
reject(e);
});
res.on('end', () => {
resolve(combinedResult);
});
},
);
const body = {
model: options.model,
messages: [
{
role: 'system',
content: options.context || '',
},
{
role: 'user',
content: options.text,
},
],
stream: true,
max_tokens: options.maxTokens,
};
request.write(JSON.stringify(body));
request.end();
});
10 天前
回复了 cheneydog 创建的主题 问与答 响应式 UI 真的没前途了么?
我宁愿写两套
13 天前
回复了 mgrxwl 创建的主题 生活 农村老家被要求在门口装摄像头。
我爸自己装的,养了 7 、8 头牛
15 天前
回复了 liangxin1998 创建的主题 问与答 前端除了 crud,写写样式,还能干嘛?
给你 10 个外包,让你指挥他们干活,你怎么保证你的项目不会变成屎山
15 天前
回复了 duojiao 创建的主题 程序员 这种炫酷的前端是怎么实现的呢
three.js > webgl > 着色器编程
能写出这样效果的人可能并不是一个网页前端,也许是游戏前端
17 天前
回复了 skoofancy 创建的主题 程序员 HHKB 是不是程序员必备键盘?人手一把?
15 年开始都是用客制化的,刚好今晚要冲一把新的 https://www.zfrontier.com/app/flow/vAjaY7mdGwVN
推荐 aims ,别的都是 kpi 产物
关于   ·   帮助文档   ·   博客   ·   nftychat   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2558 人在线   最高记录 5634   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 16ms · UTC 12:47 · PVG 20:47 · LAX 05:47 · JFK 08:47
Developed with CodeLauncher
♥ Do have faith in what you're doing.