Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 5 additions & 14 deletions lua/model_cmp/config.lua
Original file line number Diff line number Diff line change
@@ -1,25 +1,16 @@
local apiconfig = require("model_cmp.modelapi.apiconfig")

local M = {}

---@class ModelCmp.Config
---@field delay integer delay between each request in ms
---@field api table<string, table<string, any>> API request or server request config
---@field api ModelCmp.Modelapi.Config
---@field virtualtext table<string, string> virtual text config
---@field prompt Prompt prompts for api

---@class Prompt
---@field basic_template string
---@field rules string
---@field language string
---@field precontext string

---@return ModelCmp.Config
function M.default()
return {
api = {
url = "", -- url to the server, defaults are already set, you just need to setup this up only if the url is different for your server
key = "", -- None if using local
type = "" -- EX: OPENAI, Claude, Gemini, llama.cpp(local or none are also valid)
},
api = apiconfig.default(),

virtualtext = {
enable = false,
type = "inline",
Expand Down
30 changes: 30 additions & 0 deletions lua/model_cmp/modelapi/apiconfig.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
local M = {}

---@class ModelCmp.Modelapi.Config
---@field apikeys APIKeyHolder
---@field custom_url table<string, string>

---@class APIKeyHolder
---@field OPENAI_API_KEY string
---@field CLAUDE_API_KEY string

---@return APIKeyHolder
local function get_apikeys()
return {
OPENAI_API_KEY = "",
CLAUDE_API_KEY = ""
}
end

---@return ModelCmp.Modelapi.Config
function M.default()
return {
apikeys = get_apikeys(),
custom_url = {
url = "http://127.0.0.1",
port = "8080"
}
}
end

return M
111 changes: 111 additions & 0 deletions lua/model_cmp/modelapi/common.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
local req = require("model_cmp.modelapi.request")
local virtualtext = require("model_cmp.virtualtext")
local utils = require("model_cmp.utils")
local apiconfig = require("model_cmp.modelapi.apiconfig")

-- server channels
local llama = require("model_cmp.modelapi.llama")

local M = {}

vim.g.server = "url" -- llama is default available options are openai, claude

-- 0 means not avaiable and 1 means avaiable
local available_keys = {
OPENAI_API_KEY = 0,
CLAUDE_API_KEY = 0,
}

local function servername_to_key()
local server = vim.g.server
if server == "openai" then
return "OPENAI_API_KEY"
elseif server == "claude" then
return "CLAUDE_API_KEY"
else
return
end
end


--Check for availability for both apikeys and server urls
local function check_available()
for keyname, key in ipairs(M.apikeys) do
if key ~= "" then
available_keys[keyname] = 1
end
end
if M.custom_url ~= nil then
if M.custom_url.url == "" or M.custom_url.port == "" then
M.custom_url = { url = "http://127.0.0.1", port = "8080" }
end
else
M.custom_url = apiconfig.default().custom_url
end
end

M.requests = {} -- only store buffer id

local function add_request(bufid)
local index = #M.requests + 1
table.insert(M.requests, bufid)
return index
end

local function remove_request(index)
table.remove(M.requests, index)
end

-- we will check if there is a request already made for the given buffer
local function check_already_requested(bufnr)
for buffer in pairs(M.requests) do
if bufnr == buffer then
return true
end
end
return false
end

function M.send_request()
local request, bufnr

local server = vim.g.server
if server == "url" then
bufnr, request = llama.generate_request()
elseif server == "openai" then
if available_keys[servername_to_key()] then
-- Working on openai services
end
elseif server == "claude" then
if available_keys[servername_to_key()] then
-- Working on claude services
end
end

if request ~= nil then
return
end
if not check_already_requested(bufnr) then
return
end

add_request(bufnr)
req.send(request,
function(response)
vim.schedule(function()
local text = utils.decode_response(response)
virtualtext.VirtualText:update_preview(text)
remove_request(bufnr)
end)
end
)
end

function M.setup(config)
local api = config.api
M.apikeys = api.apikeys
M.custom_url = api.custom_url
check_available()
end

return M
40 changes: 9 additions & 31 deletions lua/model_cmp/modelapi/llama.lua
Original file line number Diff line number Diff line change
@@ -1,27 +1,25 @@
local curl = require("model_cmp.modelapi.curl")
local context = require("model_cmp.context")
local systemprompt = require("model_cmp.modelapi.prompt")
local virtualtext = require("model_cmp.virtualtext")
local utils = require("model_cmp.utils")
local apiconfig = require("model_cmp.modelapi.apiconfig")

local M = {}

vim.b.request_sent = false

local get_server_url = function() -- get server url from the user or from the config
return "http://127.0.0.1:8080/v1/chat/completions"
local generate_url = function(custom_url)
local url = custom_url.url .. ":" .. custom_url.port .. "/v1/chat/completions"
return url
end

function M.check_server_running()
end

function M.send_request()
function M.generate_request()
local bufnr = context.ContextEngine.bufnr
local prompt = context.generate_context_text()
local lang = context.ContextEngine:get_currlang()
local complete_prompt = "# language: " .. lang .. prompt

local few_shots = systemprompt.complete_few_shots

local custom = apiconfig.default()
local messages = {}
table.insert(messages, systemprompt.default)
for _, msg in ipairs(few_shots) do
Expand All @@ -32,7 +30,7 @@ function M.send_request()
local request = {
"-s",
"-X", "POST",
get_server_url(),
generate_url(),
"-H", "Content-Type: application/json",
"-d",
vim.fn.json_encode({
Expand All @@ -44,27 +42,7 @@ function M.send_request()
max_token = 50
}),
}
vim.b.request_sent = true
curl.send(request,
function(response)
vim.schedule(function()
local text = utils.decode_response(response)
virtualtext.VirtualText:update_preview(text)
vim.b.request_sent = false
end)
end
)
end

--- TEMPORARY ACTIONS


function M.text_changed()
if vim.b.request_sent then
return
end
virtualtext.action.clear_preview()
M.send_request()
return bufnr, request
end

return M
49 changes: 0 additions & 49 deletions lua/model_cmp/modelapi/managekey.lua

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,8 @@ local Job = require("plenary.job")

local M = {}

M.requests = {} -- This can store pending jobs or request data

function M.send(request_args, callback)
function M.send(bufnr, request_args, callback)
local result = {}
local job = Job:new({
command = "curl",
Expand All @@ -20,7 +19,6 @@ function M.send(request_args, callback)
end,
})
job:start()
table.insert(M.requests, job) -- Optional: keep track of active jobs
end

return M