feat: 免费的16k模型
このコミットが含まれているのは:
コミット
3db033418f
|
@ -15,6 +15,7 @@ export type Message = {
|
|||
|
||||
export enum ModelType {
|
||||
GPT3p5Turbo = 'gpt3.5-turbo',
|
||||
GPT3p5_16k = 'gpt-3.5-turbo-16k',
|
||||
GPT4 = 'gpt4',
|
||||
NetGpt3p5 = 'net-gpt3.5-turbo',
|
||||
}
|
||||
|
|
|
@ -0,0 +1,109 @@
|
|||
import {Chat, ChatOptions, ChatRequest, ChatResponse, ModelType} from "../base";
|
||||
import {AxiosInstance, AxiosRequestConfig, CreateAxiosDefaults} from "axios";
|
||||
import {CreateAxiosProxy} from "../../utils/proxyAgent";
|
||||
import es from "event-stream";
|
||||
import {ErrorData, Event, EventStream, MessageData, parseJSON} from "../../utils";
|
||||
|
||||
interface Message {
|
||||
role: string;
|
||||
content: string;
|
||||
}
|
||||
|
||||
interface RealReq {
|
||||
messages: Message[];
|
||||
temperature: number;
|
||||
stream: boolean;
|
||||
model: string;
|
||||
}
|
||||
|
||||
export class FakeOpen extends Chat {
|
||||
private client: AxiosInstance;
|
||||
|
||||
constructor(options?: ChatOptions) {
|
||||
super(options);
|
||||
this.client = CreateAxiosProxy({
|
||||
baseURL: 'https://ai.fakeopen.com/v1/',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
"accept": "text/event-stream",
|
||||
"Cache-Control": "no-cache",
|
||||
"Proxy-Connection": "keep-alive",
|
||||
"Authorization": `Bearer ${process.env.FAKE_OPEN_KEY || 'pk-this-is-a-real-free-api-key-pk-for-everyone'}`,
|
||||
}
|
||||
} as CreateAxiosDefaults);
|
||||
}
|
||||
|
||||
support(model: ModelType): number {
|
||||
switch (model) {
|
||||
case ModelType.GPT3p5_16k:
|
||||
return 15000;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
public async ask(req: ChatRequest): Promise<ChatResponse> {
|
||||
const stream = new EventStream();
|
||||
const res = await this.askStream(req, stream);
|
||||
const result: ChatResponse = {
|
||||
content: '',
|
||||
}
|
||||
return new Promise(resolve => {
|
||||
stream.read((event, data) => {
|
||||
switch (event) {
|
||||
case Event.done:
|
||||
break;
|
||||
case Event.message:
|
||||
result.content += (data as MessageData).content || '';
|
||||
break;
|
||||
case Event.error:
|
||||
result.error = (data as ErrorData).error;
|
||||
break;
|
||||
}
|
||||
}, () => {
|
||||
resolve(result);
|
||||
})
|
||||
})
|
||||
|
||||
}
|
||||
|
||||
public async askStream(req: ChatRequest, stream: EventStream) {
|
||||
const data: RealReq = {
|
||||
messages: [{role: 'user', content: req.prompt}],
|
||||
temperature: 1.0,
|
||||
model: req.model,
|
||||
stream: true
|
||||
};
|
||||
try {
|
||||
const res = await this.client.post('/chat/completions', data, {
|
||||
responseType: 'stream',
|
||||
} as AxiosRequestConfig);
|
||||
res.data.pipe(es.split(/\r?\n\r?\n/)).pipe(es.map(async (chunk: any, cb: any) => {
|
||||
const dataStr = chunk.replace('data: ', '');
|
||||
if (!dataStr) {
|
||||
return;
|
||||
}
|
||||
if (dataStr === '[DONE]') {
|
||||
stream.write(Event.done, {content: ''})
|
||||
stream.end();
|
||||
return;
|
||||
}
|
||||
const data = parseJSON(dataStr, {} as any);
|
||||
if (!data?.choices) {
|
||||
stream.write(Event.error, {error: 'not found data.choices'})
|
||||
stream.end();
|
||||
return;
|
||||
}
|
||||
const [{delta: {content = ""}, finish_reason}] = data.choices;
|
||||
if (finish_reason === 'stop') {
|
||||
return;
|
||||
}
|
||||
stream.write(Event.message, {content});
|
||||
}))
|
||||
} catch (e: any) {
|
||||
console.error(e);
|
||||
stream.write(Event.error, {error: e.message})
|
||||
stream.end();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -4,6 +4,7 @@ import {Mcbbs} from "./mcbbs";
|
|||
import {ChatDemo} from "./chatdemo";
|
||||
import {Phind} from "./phind";
|
||||
import {Vita} from "./vita";
|
||||
import {FakeOpen} from "./fakeopen";
|
||||
|
||||
export enum Site {
|
||||
// define new model here
|
||||
|
@ -12,6 +13,7 @@ export enum Site {
|
|||
Mcbbs = 'mcbbs',
|
||||
ChatDemo = 'chatdemo',
|
||||
Vita = 'vita',
|
||||
FakeOpen = 'fakeopen',
|
||||
}
|
||||
|
||||
export class ChatModelFactory {
|
||||
|
@ -31,6 +33,7 @@ export class ChatModelFactory {
|
|||
this.modelMap.set(Site.Mcbbs, new Mcbbs(this.options))
|
||||
this.modelMap.set(Site.ChatDemo, new ChatDemo(this.options))
|
||||
this.modelMap.set(Site.Vita, new Vita(this.options))
|
||||
this.modelMap.set(Site.FakeOpen, new FakeOpen(this.options))
|
||||
}
|
||||
|
||||
get(model: Site): Chat | undefined {
|
||||
|
|
読み込み中…
新しいイシューから参照