Enlaces a la API HTTP OpenAI para Lua. Compatible con cualquier biblioteca HTTP que admita la interfaz de solicitud http de LuaSocket. Compatible con OpenResty usando lapis.nginx.http
.
Aunque esta biblioteca fue escrita a mano, GPT-4 generó completamente gran parte de la documentación, el conjunto de pruebas y el flujo de trabajo de GitHub pegando el código fuente de toda la biblioteca como un mensaje y solicitando generar documentación y pruebas. El resultado final se editó para mayor claridad y sintaxis (en los casos en los que GPT4 tuvo dificultades para escribir MoonScript)
Instalar usando LuaRocks:
luarocks install lua-openai
local openai = require ( " openai " )
local client = openai . new ( os.getenv ( " OPENAI_API_KEY " ))
local status , response = client : chat ({
{ role = " system " , content = " You are a Lua programmer " },
{ role = " user " , content = " Write a 'Hello world' program in Lua " }
}, {
model = " gpt-3.5-turbo " , -- this is the default model
temperature = 0.5
})
if status == 200 then
-- the JSON response is automatically parsed into a Lua object
print ( response . choices [ 1 ]. message . content )
end
Se puede crear una instancia de sesión de chat para simplificar la gestión del estado de una conversación de ida y vuelta con la API ChatGPT. Tenga en cuenta que el estado del chat se almacena localmente en la memoria, cada mensaje nuevo se agrega a la lista de mensajes y la salida se agrega automáticamente a la lista para la siguiente solicitud.
local openai = require ( " openai " )
local client = openai . new ( os.getenv ( " OPENAI_API_KEY " ))
local chat = client : new_chat_session ({
-- provide an initial set of messages
messages = {
{ role = " system " , content = " You are an artist who likes colors " }
}
})
-- returns the string response
print ( chat : send ( " List your top 5 favorite colors " ))
-- the chat history is sent on subsequent requests to continue the conversation
print ( chat : send ( " Excluding the colors you just listed, tell me your favorite color " ))
-- the entire chat history is stored in the messages field
for idx , message in ipairs ( chat . messages ) do
print ( message . role , message . content )
end
-- You can stream the output by providing a callback as the second argument
-- the full response concatenated is also returned by the function
local response = chat : send ( " What's the most boring color? " , function ( chunk )
io.stdout : write ( chunk . content )
io.stdout : flush ()
end )
OpenAI permite enviar una lista de declaraciones de funciones que el LLM puede decidir llamar según el mensaje. La interfaz de llamada de funciones debe usarse con finalizaciones de chat y los modelos gpt-4-0613
o gpt-3.5-turbo-0613
o posteriores.
Consulte https://github.com/leafo/lua-openai/blob/main/examples/example5.lua para ver un ejemplo completo que implementa funciones matemáticas básicas para calcular la desviación estándar de una lista de números.
A continuación se muestra un ejemplo rápido de cómo utilizar funciones en un intercambio de chat. Primero deberá crear una sesión de chat con la opción functions
que contenga una variedad de funciones disponibles.
Las funciones se almacenan en el campo de
functions
del objeto de chat. Si es necesario ajustar las funciones para mensajes futuros, el campo se puede modificar.
local chat = openai : new_chat_session ({
model = " gpt-3.5-turbo-0613 " ,
functions = {
{
name = " add " ,
description = " Add two numbers together " ,
parameters = {
type = " object " ,
properties = {
a = { type = " number " },
b = { type = " number " }
}
}
}
}
})
Cualquier mensaje que envíe conocerá todas las funciones disponibles y podrá solicitar que se llame a cualquiera de ellas. Si la respuesta contiene una solicitud de llamada a función, se devolverá un objeto en lugar del valor de retorno de cadena estándar.
local res = chat : send ( " Using the provided function, calculate the sum of 2923 + 20839 " )
if type ( res ) == " table " and res . function_call then
-- The function_call object has the following fields:
-- function_call.name --> name of function to be called
-- function_call.arguments --> A string in JSON format that should match the parameter specification
-- Note that res may also include a content field if the LLM produced a textual output as well
local cjson = require " cjson "
local name = res . function_call . name
local arguments = cjson . decode ( res . function_call . arguments )
-- ... compute the result and send it back ...
end
Puede evaluar la función y los argumentos solicitados y enviar el resultado al cliente para que pueda reanudar la operación con un objeto de mensaje role=function
:
Dado que el LLM puede alucinar cada parte de la llamada a la función, querrá realizar una validación de tipo sólida para garantizar que el nombre de la función y los argumentos coincidan con lo que espera. Suponga que todas las etapas pueden fallar, incluida la recepción de JSON con formato incorrecto para los argumentos.
local name , arguments = ... -- the name and arguments extracted from above
if name == " add " then
local value = arguments . a + arguments . b
-- send the response back to the chat bot using a `role = function` message
local cjson = require " cjson "
local res = chat : send ({
role = " function " ,
name = name ,
content = cjson . encode ( value )
})
print ( res ) -- Print the final output
else
error ( " Unknown function: " .. name )
end
En circunstancias normales, la API esperará hasta que la respuesta completa esté disponible antes de devolverla. Dependiendo del mensaje, esto puede llevar algún tiempo. La API de transmisión se puede utilizar para leer la salida un fragmento a la vez, lo que le permite mostrar el contenido en tiempo real a medida que se genera.
local openai = require ( " openai " )
local client = openai . new ( os.getenv ( " OPENAI_API_KEY " ))
client : chat ({
{ role = " system " , content = " You work for Streak.Club, a website to track daily creative habits " },
{ role = " user " , content = " Who do you work for? " }
}, {
stream = true
}, function ( chunk )
io.stdout : write ( chunk . content )
io.stdout : flush ()
end )
print () -- print a newline
El módulo openai
devuelve una tabla con los siguientes campos:
OpenAI
: un cliente para enviar solicitudes a la API de OpenAI.new
: un alias de OpenAI
para crear una nueva instancia del cliente OpenAIChatSession
: una clase para gestionar sesiones de chat e historial con la API OpenAI.VERSION = "1.1.0"
: La versión actual de la biblioteca.Esta clase inicializa un nuevo cliente API OpenAI.
new(api_key, config)
Constructor para el cliente OpenAI.
api_key
: Su clave API de OpenAI.config
: una tabla opcional de opciones de configuración, con la siguiente forma:http_provider
: una cadena que especifica el nombre del módulo HTTP utilizado para las solicitudes, o nil
. Si no se proporciona, la biblioteca utilizará automáticamente "lapis.nginx.http" en un entorno ngx, o "ssl.https" en caso contrario. local openai = require ( " openai " )
local api_key = " your-api-key "
local client = openai . new ( api_key )
client:new_chat_session(...)
Crea una nueva instancia de ChatSession. Una sesión de chat es una abstracción de la API de finalización de chat que almacena el historial de chat. Puede agregar nuevos mensajes al historial y solicitar que se generen completaciones a partir de él. De forma predeterminada, la finalización se adjunta al historial.
client:chat(messages, opts, chunk_callback)
Envía una solicitud al punto final /chat/completions
.
messages
: una matriz de objetos de mensaje.opts
: Opciones adicionales para el chat, pasadas directamente a la API (por ejemplo, modelo, temperatura, etc.) https://platform.openai.com/docs/api-reference/chatchunk_callback
: función que se llamará para la salida de streaming analizada cuando stream = true
se pasa a opts
.Devuelve el estado HTTP, el objeto de respuesta y los encabezados de salida. El objeto de respuesta se decodificará desde JSON si es posible; de lo contrario, se devuelve la cadena sin formato.
client:completion(prompt, opts)
Envía una solicitud al punto final /completions
.
prompt
: El aviso para la finalización.opts
: opciones adicionales para la finalización, pasadas directamente a la API (por ejemplo, modelo, temperatura, etc.) https://platform.openai.com/docs/api-reference/completionsDevuelve el estado HTTP, el objeto de respuesta y los encabezados de salida. El objeto de respuesta se decodificará desde JSON si es posible; de lo contrario, se devuelve la cadena sin formato.
client:embedding(input, opts)
Envía una solicitud al punto final /embeddings
.
input
: una sola cadena o una matriz de cadenasopts
: opciones adicionales para la finalización, pasadas directamente a la API (por ejemplo, modelo) https://platform.openai.com/docs/api-reference/embeddingsDevuelve el estado HTTP, el objeto de respuesta y los encabezados de salida. El objeto de respuesta se decodificará desde JSON si es posible; de lo contrario, se devuelve la cadena sin formato.
Esta clase gestiona las sesiones de chat y el historial con la API OpenAI. Normalmente creado con new_chat_session
El campo messages
almacena una serie de mensajes de chat que representan el historial de chat. Cada objeto de mensaje debe ajustarse a la siguiente estructura:
role
: una cadena que representa el rol del remitente del mensaje. Debe ser uno de los siguientes valores: "sistema", "usuario" o "asistente".content
: una cadena que contiene el contenido del mensaje.name
: una cadena opcional que representa el nombre del remitente del mensaje. Si no se proporciona, debería ser nil
.Por ejemplo, un objeto de mensaje válido podría verse así:
{
role = " user " ,
content = " Tell me a joke " ,
name = " John Doe "
}
new(client, opts)
Constructor para la sesión de chat.
client
: una instancia del cliente OpenAI.opts
: una tabla opcional de opciones.messages
: una serie inicial de mensajes de chat.functions
: una lista de declaraciones de funcionestemperature
: ajuste de temperaturamodel
: qué modelo de finalización de chat usar, por ejemplo. gpt-4
, gpt-3.5-turbo
chat:append_message(m, ...)
Agrega un mensaje al historial de chat.
m
: un objeto de mensaje. chat:last_message()
Devuelve el último mensaje en el historial de chat.
chat:send(message, stream_callback=nil)
Agrega un mensaje al historial de chat y activa una finalización con generate_response
y devuelve la respuesta como una cadena. En caso de error, devuelve nil
, un mensaje de error y la respuesta de la solicitud sin formato.
Si la respuesta incluye una function_call
, entonces se devuelve el objeto de mensaje completo en lugar de una cadena del contenido. Puede devolver el resultado de la función pasando el objeto role = "function"
al método send
message
: un objeto de mensaje o una cadena.stream_callback
: (opcional) una función para habilitar la salida de streaming. Al proporcionar un stream_callback
, la solicitud se ejecutará en modo de transmisión. Esta función recibe fragmentos a medida que se analizan a partir de la respuesta.
Estos fragmentos tienen el siguiente formato:
content
: una cadena que contiene el texto de la respuesta generada por el asistente.Por ejemplo, un fragmento podría verse así:
{
content = " This is a part of the assistant's response. " ,
}
chat:generate_response(append_response, stream_callback=nil)
Llama a la API de OpenAI para generar la siguiente respuesta para el historial de chat almacenado. Devuelve la respuesta como una cadena. En caso de error, devuelve nil
, un mensaje de error y la respuesta de la solicitud sin formato.
append_response
: si la respuesta debe agregarse al historial de chat (predeterminado: verdadero).stream_callback
: (opcional) una función para habilitar la salida de streaming. Ver chat:send
para obtener detalles sobre stream_callback