Colección de interfaces libres de inversión de macromodelos de diálogo a API

Inicio de sesión gratuito GPT3.5 a API

https://github.com/missuo/FreeGPT35

https://github.com/aurora-develop/aurora

https://github.com/Dalufishe/freegptjs

https://github.com/PawanOsman/ChatGPT

https://github.com/nashsu/FreeAskInternet

https://github.com/aurorax-neo/free-gpt3.5-2api

https://github.com/aurora-develop/free-gpt3.5-2api

https://github.com/LanQian528/chat2api

https://github.com/k0baya/FreeGPT35-Glitch

https://github.com/cliouo/FreeGPT35-Vercel

https://github.com/hominsu/freegpt35

https://github.com/xsigoking/chatgpt-free-api

https://github.com/skzhengkai/free-chatgpt-api

https://github.com/aurora-develop/aurora-glitch (utilizando recursos de glitch)

https://github.com/fatwang2/coze2openai (COZE a API, GPT4)

 

Modelo nacional Inverso

búsqueda en profundidad(DeepSeek) Interfaz con la API deepseek-free-api

Interfaz de Moonshot AI (Kimi.ai) con API kimi-free-api

estrellas saltarinas (Leapfrog Ask StepChat) Interfaz con API step-free-api

Ali Tongyi (Qwen) Interfaz con la API qwen-free-api

ZhipuAI (discurso intelectualmente estimulante) Interfaz con la API glm-free-api

Meta AI (metaso) Interfaz con la API metaso-free-api

Byte Jump (Beanbag) Interfaz con la API doubao-free-api

Byte Jump (es decir, Dream AI) Interfaz con la API jimeng-free-api

Interfaz Spark a API spark-free-api

Interfaz de MiniMax (Conch AI) con API hailuo-free-api

Interfaz Emohaa para API emohaa-free-api

Programa sin conexión con interfaz de chat

https://github.com/Mylinde/FreeGPT

 

El código de trabajo para cloudflare, atar su propio nombre de dominio para jugar:

addEventListener("fetch", event => {
event.respondWith(handleRequest(event.request))
})

async function handleRequest(request) {
// Asegúrese de que la solicitud es una solicitud POST y que la ruta es correcta
if (request.method === "POST" && new URL(request.url).pathname === "/v1/chat/completions") {
const url = 'https://multillm.ai-pro.org/api/openai-completion'; // dirección API de destino
const headers = new Headers(request.headers);

// Añada o modifique las cabeceras según sea necesario
headers.set('Content-Type', 'application/json');

// Obtener el cuerpo de la petición y parsear el JSON
const requestBody = await request.json();
const stream = requestBody.stream; // obtener el argumento stream

// Construir una nueva solicitud
const newRequest = new Request(url, {
método: 'POST',
cabeceras: cabeceras,
body: JSON.stringify(requestBody) // utilizar el cuerpo modificado
});

intentar {
// Enviar una solicitud a la API de destino
const response = await fetch(newRequest);

// Determinar el tipo de respuesta en función del parámetro stream
si (flujo) {
// Gestión de las respuestas de streaming
const { readable, writable } = new TransformStream();
response.body.pipeTo(escribible);
return new Response(legible, {
cabeceras: respuesta.cabeceras
});
} else {
// Respuesta de retorno normal
return new Response(response.body, {
estado: respuesta.estado,
cabeceras: respuesta.cabeceras
});
}
} catch (e) {
// Si la petición falla, devuelve un mensaje de error
return new Response(JSON.stringify({ error: 'Unable to reach the backend API' }), { status: 502 });
}
} else {
// Devuelve un error si el método de petición no es POST o la ruta es incorrecta.
return new Response('No encontrado', { status: 404 });
}
}

Ejemplo POST:

curl --location 'https://ai-pro-free.aivvm.com/v1/chat/completions' \
--header 'Content-Type: application/json' \
--data '{
"modelo": "gpt-4-turbo".
"mensajes": [
{
"role": "usuario", "content": "Por qué Lu Xun venció a Zhou Shuren"
}],
"stream": true
}'

 

Añadir un código pseudo-streaming (la salida será más lenta):

addEventListener("fetch", event => {
event.respondWith(handleRequest(event.request))
})

async function handleRequest(request) {
if (request.method === "OPTIONS") {
return new Response(null, {
cabeceras: {
'Access-Control-Allow-Origin': '*',
"Access-Control-Allow-Headers": '*'
}, estado: 204
})
}
// Asegúrese de que la solicitud es una solicitud POST y que la ruta es correcta
if (request.method === "POST" && new URL(request.url).pathname === "/v1/chat/completions") {
const url = 'https://multillm.ai-pro.org/api/openai-completion'; // dirección API de destino
const headers = new Headers(request.headers);

// Añada o modifique las cabeceras según sea necesario
headers.set('Content-Type', 'application/json');

// Obtener el cuerpo de la petición y parsear el JSON
const requestBody = await request.json();
const stream = requestBody.stream; // obtener el argumento stream

// Construir una nueva solicitud
const newRequest = new Request(url, {
método: 'POST',
cabeceras: cabeceras,
body: JSON.stringify(requestBody) // utilizar el cuerpo modificado
});

intentar {
// Enviar una solicitud a la API de destino
const response = await fetch(newRequest);

// Determinar el tipo de respuesta en función del parámetro stream
si (flujo) {
const originalJson = await response.json(); // leer los datos completos de una vez
// Crear un flujo legible
const readableStream = new ReadableStream({
start(controlador) {
// Enviar datos de inicio
const startData = createDataChunk(originalJson, "start");
controller.enqueue(new TextEncoder().encode('data: ' + JSON.stringify(startData) + '\n\n'));

// Asumiendo que múltiples trozos de datos son procesados y enviados según originalJson.
// Por ejemplo, para simular el envío de datos por lotes
const content = originalJson.choices[0].message.content; // asumir que este es el contenido a enviar
const newData = createDataChunk(originalJson, "data", content);
controller.enqueue(new TextEncoder().encode('data: ' + JSON.stringify(newData) + '\n\n'));

// Enviar datos finales
const endData = createDataChunk(originalJson, "end");
controller.enqueue(new TextEncoder().encode('data: ' + JSON.stringify(endData) + '\n\n'));

controller.enqueue(new TextEncoder().encode('data: [DONE]'));
// Marca el final del flujo
controller.close();
}
});
return new Response(readableStream, {
cabeceras: {
'Access-Control-Allow-Origin': '*',
"Access-Control-Allow-Headers": '*',
Content-Type": "text/event-stream",
'Cache-Control': 'no-cache',
'Connection': 'keep-alive'
}
});
} else {
// Respuesta de retorno normal
return new Response(response.body, {
estado: respuesta.estado,
cabeceras: respuesta.cabeceras
});
}
} catch (e) {
// Si la petición falla, devuelve un mensaje de error
return new Response(JSON.stringify({ error: 'Unable to reach the backend API' }), { status: 502 });
}
} else {
// Devuelve un error si el método de petición no es POST o la ruta es incorrecta.
return new Response('No encontrado', { status: 404 });
}
}

// Crear diferentes bloques de datos en función del tipo
function createDataChunk(json, type, content = {}) {
switch (tipo) {
caso "inicio".
devolver {
id: json.id,
objeto: "chat.completion.chunk",
creado: json.creado,
modelo: json.model,
choices: [{ delta: {}, index: 0, finish_reason: null }]}; }
caso "datos".
devolver {
id: json.id,
objeto: "chat.completion.chunk",
creado: json.creado,
modelo: json.model,
choices: [{ delta: { content }, index: 0, finish_reason: null }]}; }
caso "fin".
devolver {
id: json.id,
objeto: "chat.completion.chunk",
creado: json.creado,
modelo: json.model,
choices: [{ delta: {}, index: 0, finish_reason: 'stop' }]}; }
por defecto.
devolver {};
}
}

© declaración de copyright

Artículos relacionados

Sin comentarios

Debe iniciar sesión para participar en los comentarios.
Acceder ahora
ninguno
Sin comentarios...