local http_request = require("http.request")
local libgen = require("posix.libgen")
local base_path = libgen.dirname(arg[0])
package.path = package.path .. ";" .. base_path .. "/?.lua"
local json = require("json")
local cq = require("cqueues")
local ollama = {}
local loop = cq.new()
function ollama.ollama_req(clipboard_content)
local url = "http://172.17.0.1:11434/api/chat"
local req = http_request.new_from_uri(url)
local body = {
model = "llama3.1",
stream = false,
format = "json",
messages = {
{content = clipboard_content, role = "user"}, {
content = [[
Learn the following rules. the rules are provided in no particular order:
---
a public key of an assymetric key-pair is a secret.
a private key of an assymetric key-pair is a secret.
an api key is a secret.
a password is a secret.
a token used for authentication or authorization is a secret.
a key-value pair is a secret if the key contains the word 'password'or 'secret' or 'token' or 'key'.
a string containing the word 'password' or 'secret' or 'token' or 'key' is a secret.
a string that contains a word longer than 20 characters is a secret.
a word that is not part of any of the languages you know which is longer than 20 characters is a secret.
a long string of random characters is a secret.
one matching positive matching criteria is enough to consider a string a secret.
---
]],
role = "assistant"
}, {
content = [[
Only answer in json.
The answer must a field named 'isSecret'.
The answer must have a field named 'reasoning'.
The value of 'isSecret' must be a boolean.
The value of reasoning must be a string.
You must give a reason.
The reason must be the criteria that was used to determine if the string is a secret.
The answer must be valid json.
]],
role = "assistant"
}, {
content = [[
Now I will give you your task.
Look at the user-provided string content.
Is it a secret? answer in json.
]],
role = "assistant"
}
},
options = {
temperature = 0.5,
max_tokens = 10000,
top_p = 1.0,
frequency_penalty = 0.0,
presence_penalty = 0.0
}
}
local body_json = json.encode(body)
req:set_body(body_json)
req.headers:upsert(":method", "POST")
local headers, stream = req:go(10000)
if headers:get(":status") ~= "200" then return nil end
local result_body = stream:get_body_as_string()
return result_body
end
function ollama.ask_ollama(clipboard_content, count)
local true_count = 0
local false_count = 0
loop:wrap(function()
for _ = 1, count do
loop:wrap(function()
local result = ollama.ollama_req(clipboard_content)
local result_decoded = json.decode(result)
local final_result = json.decode(
result_decoded["message"]["content"])
for k, v in pairs(final_result) do print(k, v) end
if final_result["isSecret"] == true then
true_count = true_count + 1
else
false_count = false_count + 1
end
print("True count: " .. true_count)
print("False count: " .. false_count)
end)
end
end)
loop:loop()
print("True count: " .. true_count)
print("False count: " .. false_count)
if false_count > true_count then
return false
else
return true
end
end
return ollama