From dfc51b32471148d54f5dfdcb2c2f9263721368a5 Mon Sep 17 00:00:00 2001 From: yetone Date: Sun, 17 Nov 2024 00:39:03 +0800 Subject: [PATCH] feat: add url_join (#856) --- .github/workflows/ci.yaml | 9 +++++---- .pre-commit-config.yaml | 2 +- lua/avante/providers/azure.lua | 9 ++++----- lua/avante/providers/claude.lua | 2 +- lua/avante/providers/cohere.lua | 2 +- lua/avante/providers/gemini.lua | 9 ++++----- lua/avante/providers/openai.lua | 2 +- lua/avante/utils/init.lua | 26 ++++++++++++++++++++++++++ 8 files changed, 43 insertions(+), 18 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 9a9147c..be3d4de 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -14,11 +14,12 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # ratchet:actions/checkout@v4 - - uses: JohnnyMorganz/stylua-action@b6661824b86c9c33121bed87a778b660ba90cf77 # ratchet:JohnnyMorganz/stylua-action@v4 + - name: Install stylua + uses: baptiste0928/cargo-install@v3 with: - token: ${{ secrets.GITHUB_TOKEN }} - version: latest - args: --check ./lua/ ./plugin/ + crate: stylua + features: lua54 + - run: stylua --check ./lua/ ./plugin/ luacheck: name: Lint Lua runs-on: ubuntu-latest diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index ff21a96..2a15022 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -8,7 +8,7 @@ repos: - repo: https://github.com/JohnnyMorganz/StyLua rev: v0.20.0 hooks: - - id: stylua-github # or stylua-system / stylua-github + - id: stylua-system # or stylua-system / stylua-github files: \.lua$ - repo: https://github.com/doublify/pre-commit-rust rev: master diff --git a/lua/avante/providers/azure.lua b/lua/avante/providers/azure.lua index 9839e09..85e4b44 100644 --- a/lua/avante/providers/azure.lua +++ b/lua/avante/providers/azure.lua @@ -25,11 +25,10 @@ M.parse_curl_args = function(provider, code_opts) if not P.env.is_local("azure") then headers["api-key"] = provider.parse_api_key() end return { - url = Utils.trim(base.endpoint, { suffix = "/" }) - .. "/openai/deployments/" - .. base.deployment - .. "/chat/completions?api-version=" - .. base.api_version, + url = Utils.url_join( + base.endpoint, + "/openai/deployments/" .. base.deployment .. "/chat/completions?api-version=" .. base.api_version + ), proxy = base.proxy, insecure = base.allow_insecure, headers = headers, diff --git a/lua/avante/providers/claude.lua b/lua/avante/providers/claude.lua index 4b0f818..f2a00ea 100644 --- a/lua/avante/providers/claude.lua +++ b/lua/avante/providers/claude.lua @@ -106,7 +106,7 @@ M.parse_curl_args = function(provider, prompt_opts) local messages = M.parse_messages(prompt_opts) return { - url = Utils.trim(base.endpoint, { suffix = "/" }) .. "/v1/messages", + url = Utils.url_join(base.endpoint, "/v1/messages"), proxy = base.proxy, insecure = base.allow_insecure, headers = headers, diff --git a/lua/avante/providers/cohere.lua b/lua/avante/providers/cohere.lua index c2843f7..c076350 100644 --- a/lua/avante/providers/cohere.lua +++ b/lua/avante/providers/cohere.lua @@ -85,7 +85,7 @@ M.parse_curl_args = function(provider, code_opts) if not P.env.is_local("cohere") then headers["Authorization"] = "Bearer " .. provider.parse_api_key() end return { - url = Utils.trim(base.endpoint, { suffix = "/" }) .. "/chat", + url = Utils.url_join(base.endpoint, "/chat"), proxy = base.proxy, insecure = base.allow_insecure, headers = headers, diff --git a/lua/avante/providers/gemini.lua b/lua/avante/providers/gemini.lua index 4ad9694..8e477e6 100644 --- a/lua/avante/providers/gemini.lua +++ b/lua/avante/providers/gemini.lua @@ -86,11 +86,10 @@ M.parse_curl_args = function(provider, code_opts) body_opts.max_tokens = nil return { - url = Utils.trim(base.endpoint, { suffix = "/" }) - .. "/" - .. base.model - .. ":streamGenerateContent?alt=sse&key=" - .. provider.parse_api_key(), + url = Utils.url_join( + base.endpoint, + base.model .. ":streamGenerateContent?alt=sse&key=" .. provider.parse_api_key() + ), proxy = base.proxy, insecure = base.allow_insecure, headers = { ["Content-Type"] = "application/json" }, diff --git a/lua/avante/providers/openai.lua b/lua/avante/providers/openai.lua index 90ec5c6..0ccefbf 100644 --- a/lua/avante/providers/openai.lua +++ b/lua/avante/providers/openai.lua @@ -136,7 +136,7 @@ M.parse_curl_args = function(provider, code_opts) end return { - url = Utils.trim(base.endpoint, { suffix = "/" }) .. "/chat/completions", + url = Utils.url_join(base.endpoint, "/chat/completions"), proxy = base.proxy, insecure = base.allow_insecure, headers = headers, diff --git a/lua/avante/utils/init.lua b/lua/avante/utils/init.lua index ff4741f..ecf8ccc 100644 --- a/lua/avante/utils/init.lua +++ b/lua/avante/utils/init.lua @@ -438,6 +438,32 @@ function M.trim_spaces(s) return s:match("^%s*(.-)%s*$") end function M.fallback(v, default_value) return type(v) == "nil" and default_value or v end +---Join URL parts together, handling slashes correctly +---@param ... string URL parts to join +---@return string Joined URL +function M.url_join(...) + local parts = { ... } + local result = parts[1] or "" + + for i = 2, #parts do + local part = parts[i] + if not part or part == "" then goto continue end + + -- Remove trailing slash from result if present + if result:sub(-1) == "/" then result = result:sub(1, -2) end + + -- Remove leading slash from part if present + if part:sub(1, 1) == "/" then part = part:sub(2) end + + -- Join with slash + result = result .. "/" .. part + + ::continue:: + end + + return result +end + -- luacheck: push no max comment line length ---@param type_name "'nil'" | "'number'" | "'string'" | "'boolean'" | "'table'" | "'function'" | "'thread'" | "'userdata'" | "'list'" | '"map"' ---@return boolean