Mengikat ke OpenAI HTTP API untuk Lua. Kompatibel dengan perpustakaan HTTP apa pun yang mendukung antarmuka permintaan http LuaSocket. Kompatibel dengan OpenResty menggunakan lapis.nginx.http
.
Meskipun pustaka ini ditulis dengan tangan, sebagian besar dokumentasi, rangkaian pengujian, dan alur kerja GitHub sepenuhnya dihasilkan oleh GPT-4 dengan menempelkan kode sumber seluruh pustaka sebagai perintah dan meminta untuk membuat dokumentasi dan pengujian. Hasil akhir telah diedit untuk kejelasan dan sintaksis (jika GPT4 kesulitan menulis MoonScript)
Instal menggunakan 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
Contoh sesi obrolan dapat dibuat untuk menyederhanakan pengelolaan status percakapan bolak-balik dengan API ChatGPT. Perhatikan bahwa status obrolan disimpan secara lokal di memori, setiap pesan baru ditambahkan ke daftar pesan, dan hasilnya secara otomatis ditambahkan ke daftar untuk permintaan berikutnya.
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 memungkinkan pengiriman daftar deklarasi fungsi yang dapat diputuskan oleh LLM untuk dipanggil berdasarkan perintah. Antarmuka pemanggilan fungsi harus digunakan dengan penyelesaian obrolan dan model gpt-4-0613
atau gpt-3.5-turbo-0613
atau lebih baru.
Lihat https://github.com/leafo/lua-openai/blob/main/examples/example5.lua untuk contoh lengkap yang mengimplementasikan fungsi matematika dasar untuk menghitung deviasi standar dari daftar angka
Berikut ini contoh singkat cara menggunakan fungsi dalam pertukaran obrolan. Pertama, Anda perlu membuat sesi obrolan dengan opsi functions
yang berisi serangkaian fungsi yang tersedia.
Fungsi disimpan pada bidang
functions
pada objek obrolan. Jika fungsinya perlu disesuaikan untuk pesan berikutnya, kolom tersebut dapat dimodifikasi.
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 " }
}
}
}
}
})
Setiap prompt yang Anda kirim akan mengetahui semua fungsi yang tersedia, dan mungkin meminta salah satu fungsi tersebut untuk dipanggil. Jika respons berisi permintaan pemanggilan fungsi, maka objek akan dikembalikan, bukan nilai pengembalian string standar.
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
Anda dapat mengevaluasi fungsi & argumen yang diminta dan mengirimkan hasilnya kembali ke klien sehingga dapat melanjutkan operasi dengan objek pesan role=function
:
Karena LLM dapat berhalusinasi setiap bagian dari pemanggilan fungsi, Anda sebaiknya melakukan validasi tipe yang kuat untuk memastikan bahwa nama fungsi dan argumen sesuai dengan yang Anda harapkan. Asumsikan setiap tahap bisa gagal, termasuk menerima JSON yang salah format untuk argumennya.
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
Dalam keadaan normal, API akan menunggu hingga seluruh respons tersedia sebelum mengembalikan respons tersebut. Tergantung pada permintaannya, ini mungkin memerlukan waktu. API streaming dapat digunakan untuk membaca output satu per satu, memungkinkan Anda menampilkan konten secara real-time saat konten dibuat.
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
Modul openai
mengembalikan tabel dengan bidang berikut:
OpenAI
: Klien untuk mengirimkan permintaan ke OpenAI API.new
: Alias ke OpenAI
untuk membuat instance baru klien OpenAIChatSession
: Kelas untuk mengelola sesi obrolan dan riwayat dengan OpenAI API.VERSION = "1.1.0"
: Versi perpustakaan saat iniKelas ini menginisialisasi klien OpenAI API baru.
new(api_key, config)
Konstruktor untuk klien OpenAI.
api_key
: Kunci API OpenAI Anda.config
: Tabel opsional opsi konfigurasi, dengan bentuk berikut:http_provider
: Sebuah string yang menentukan nama modul HTTP yang digunakan untuk permintaan, atau nil
. Jika tidak disediakan, perpustakaan akan secara otomatis menggunakan "lapis.nginx.http" di lingkungan ngx, atau "ssl.https" sebaliknya. local openai = require ( " openai " )
local api_key = " your-api-key "
local client = openai . new ( api_key )
client:new_chat_session(...)
Membuat instance ChatSession baru. Sesi obrolan adalah abstraksi dari API penyelesaian obrolan yang menyimpan riwayat obrolan. Anda dapat menambahkan pesan baru ke riwayat dan meminta penyelesaian dibuat darinya. Secara default, penyelesaian ditambahkan ke riwayat.
client:chat(messages, opts, chunk_callback)
Mengirimkan permintaan ke titik akhir /chat/completions
.
messages
: Array objek pesan.opts
: Opsi tambahan untuk obrolan, diteruskan langsung ke API (mis. model, suhu, dll.) https://platform.openai.com/docs/api-reference/chatchunk_callback
: Fungsi yang dipanggil untuk keluaran streaming yang diurai ketika stream = true
diteruskan ke opts
.Mengembalikan status HTTP, objek respons, dan header keluaran. Objek respons akan didekodekan dari JSON jika memungkinkan, jika tidak, string mentah akan dikembalikan.
client:completion(prompt, opts)
Mengirim permintaan ke titik akhir /completions
.
prompt
: Perintah untuk penyelesaian.opts
: Opsi tambahan untuk penyelesaian, diteruskan langsung ke API (mis. model, suhu, dll.) https://platform.openai.com/docs/api-reference/completionsMengembalikan status HTTP, objek respons, dan header keluaran. Objek respons akan didekodekan dari JSON jika memungkinkan, jika tidak, string mentah akan dikembalikan.
client:embedding(input, opts)
Mengirimkan permintaan ke titik akhir /embeddings
.
input
: String tunggal atau array stringopts
: Opsi tambahan untuk penyelesaian, diteruskan langsung ke API (mis. model) https://platform.openai.com/docs/api-reference/embeddingsMengembalikan status HTTP, objek respons, dan header keluaran. Objek respons akan didekodekan dari JSON jika memungkinkan, jika tidak, string mentah akan dikembalikan.
Kelas ini mengelola sesi obrolan dan riwayat dengan OpenAI API. Biasanya dibuat dengan new_chat_session
Bidang messages
menyimpan serangkaian pesan obrolan yang mewakili riwayat obrolan. Setiap objek pesan harus sesuai dengan struktur berikut:
role
: Sebuah string yang mewakili peran pengirim pesan. Itu harus berupa salah satu dari nilai berikut: "sistem", "pengguna", atau "asisten".content
: Sebuah string yang berisi isi pesan.name
: String opsional yang mewakili nama pengirim pesan. Jika tidak disediakan, seharusnya nil
.Misalnya, objek pesan yang valid mungkin terlihat seperti ini:
{
role = " user " ,
content = " Tell me a joke " ,
name = " John Doe "
}
new(client, opts)
Konstruktor untuk ChatSession.
client
: Sebuah contoh dari klien OpenAI.opts
: Tabel opsi opsional.messages
: Rangkaian awal pesan obrolanfunctions
: Daftar deklarasi fungsitemperature
: pengaturan suhumodel
: Model penyelesaian obrolan mana yang akan digunakan, mis. gpt-4
, gpt-3.5-turbo
chat:append_message(m, ...)
Menambahkan pesan ke riwayat obrolan.
m
: Objek pesan. chat:last_message()
Mengembalikan pesan terakhir dalam riwayat obrolan.
chat:send(message, stream_callback=nil)
Menambahkan pesan ke riwayat obrolan dan memicu penyelesaian dengan generate_response
dan mengembalikan respons sebagai string. Jika gagal, kembalikan nil
, pesan kesalahan, dan respons permintaan mentah.
Jika responsnya menyertakan function_call
, maka seluruh objek pesan akan dikembalikan, bukan string konten. Anda dapat mengembalikan hasil fungsi dengan meneruskan objek role = "function"
ke metode send
message
: Objek pesan atau string.stream_callback
: (opsional) Fungsi untuk mengaktifkan keluaran streaming. Dengan memberikan stream_callback
, permintaan akan berjalan dalam mode streaming. Fungsi ini menerima potongan saat diurai dari respons.
Potongan ini memiliki format berikut:
content
: String yang berisi teks respons yang dihasilkan asisten.Misalnya, sebuah potongan mungkin terlihat seperti ini:
{
content = " This is a part of the assistant's response. " ,
}
chat:generate_response(append_response, stream_callback=nil)
Memanggil OpenAI API untuk menghasilkan respons berikutnya untuk riwayat obrolan yang disimpan. Mengembalikan respons sebagai string. Jika gagal, kembalikan nil
, pesan kesalahan, dan respons permintaan mentah.
append_response
: Apakah respons harus ditambahkan ke riwayat obrolan (default: true).stream_callback
: (opsional) Fungsi untuk mengaktifkan keluaran streaming. Lihat chat:send
untuk detail tentang stream_callback