From 727e4977f8d102309660afed62d139c080d0b1a3 Mon Sep 17 00:00:00 2001 From: gwbeip Date: Sun, 14 Jun 2026 11:10:16 +0800 Subject: [PATCH] feat(deepseek api): add balance query and API key management Add pj deepseek command to query account balance and pj deepseek setkey to store API key in local cache. Also extract Python launcher into its own module (pj_python.nu) and add common aliases (g, c, tree, myip, ports, df, reload, edit). --- nushell/modules/pj_aliases.nu | 35 +++++++++++++++------- nushell/modules/pj_deepseek.nu | 54 ++++++++++++++++++++++++++++++++++ nushell/modules/pj_python.nu | 10 +++++++ nushell/nu_polyjuice.nu | 2 ++ 4 files changed, 90 insertions(+), 11 deletions(-) create mode 100644 nushell/modules/pj_deepseek.nu create mode 100644 nushell/modules/pj_python.nu diff --git a/nushell/modules/pj_aliases.nu b/nushell/modules/pj_aliases.nu index c391716..28da11b 100644 --- a/nushell/modules/pj_aliases.nu +++ b/nushell/modules/pj_aliases.nu @@ -14,18 +14,31 @@ export alias ....... = cd ../../../../../.. export alias ........ = cd ../../../../../../.. export alias .......... = cd ../../../../../../../.. - -export def py [...rest: string] { - if (which ^py | is-not-empty) { - ^py ...$rest - } else if (which ^python3 | is-not-empty) { - ^python3 ...$rest - } else { - print "Error: Python is not installed or could not be found." - } -} - export alias weather = curl wttr.in export alias moon = curl wttr.in/Moon export alias quote = curl https://api.quotable.io/random | from json | get content export alias dadjoke = curl -H "Accept: application/json" https://icanhazdadjoke.com/ | from json | get joke + +# --- Git --- +export alias g = git + +# --- Navigation & Shell --- +export alias c = clear +export def reload [] { exec nu } +export def edit [] { ^$env.EDITOR ($env.NU_POLYJUICE_PATH | path join 'nu_polyjuice.nu') } + +# --- File system --- +export alias tree = ls **/* + +# --- Network --- +export alias myip = curl -s ifconfig.me +export def ports [] { ^netstat -ano | lines | where {|row| $row | str contains 'LISTENING'} | str trim } + +# --- System --- +export def df [] { + if (which ^df | is-not-empty) { + ^df -h + } else { + ^wmic logicaldisk get size,freespace,caption + } +} diff --git a/nushell/modules/pj_deepseek.nu b/nushell/modules/pj_deepseek.nu new file mode 100644 index 0000000..e17bf89 --- /dev/null +++ b/nushell/modules/pj_deepseek.nu @@ -0,0 +1,54 @@ +const pj_module_dir = (path self | path dirname) +const pj_cache_dir = ($pj_module_dir | path join '..' 'cache') +const key_file = ($pj_cache_dir | path join 'deepseek_apikey.toml') + +# Save your DeepSeek API key to local cache. +export def "pj deepseek setkey" [api_key: string] { + mkdir $pj_cache_dir + let content = $"[apikey] +key = \"($api_key)\" +" + $content | save -f $key_file + print $"(char --unicode '2714') DeepSeek API key saved to ($key_file)" +} + +# Query DeepSeek account balance information. +export def "pj deepseek" [] { + if not ($key_file | path exists) { + print $"(char --unicode '274c') No DeepSeek API key found. Use `pj deepseek setkey ` to set it." + return + } + + let config = (open $key_file) + let api_key = ($config.apikey?.key? | default "") + + if ($api_key | is-empty) { + print $"(char --unicode '274c') Invalid API key in config file. Use `pj deepseek setkey ` to set a new one." + return + } + + let response = (curl -L -X GET 'https://api.deepseek.com/user/balance' -H 'Accept: application/json' -H $"Authorization: Bearer ($api_key)" | complete) + + if ($response.exit_code != 0) { + print $"(char --unicode '274c') Failed to query balance: ($response.stderr)" + return + } + + let balance = ($response.stdout | from json) + let available_text = if $balance.is_available { $'(char --unicode '2705') Yes' } else { $'(char --unicode '274c') No' } + let separator = ('' | fill --character (char --unicode '2501') --width 25 --alignment l) + + print "" + print " DeepSeek Account Balance" + print $" ($separator)" + print $" Available : ($available_text)" + print "" + + for info in $balance.balance_infos { + print $" Currency : ($info.currency)" + print $" Total : ($info.total_balance)" + print $" Granted : ($info.granted_balance)" + print $" Topped-up : ($info.topped_up_balance)" + print "" + } +} diff --git a/nushell/modules/pj_python.nu b/nushell/modules/pj_python.nu new file mode 100644 index 0000000..870b984 --- /dev/null +++ b/nushell/modules/pj_python.nu @@ -0,0 +1,10 @@ +# Python launcher: prefer `py` (Windows launcher), fallback to `python3` +export def py [...rest: string] { + if (which ^py | is-not-empty) { + ^py ...$rest + } else if (which ^python3 | is-not-empty) { + ^python3 ...$rest + } else { + print "Error: Python is not installed or could not be found." + } +} diff --git a/nushell/nu_polyjuice.nu b/nushell/nu_polyjuice.nu index 8718eda..b5cced7 100644 --- a/nushell/nu_polyjuice.nu +++ b/nushell/nu_polyjuice.nu @@ -6,6 +6,7 @@ $env.NU_POLYJUICE_PATH = $env.FILE_PWD # modules use modules/pj_aliases.nu * +use modules/pj_python.nu * use modules/pj_brew.nu * use modules/pj_uv.nu * use modules/pj_completions.nu * @@ -13,4 +14,5 @@ use modules/pj_helix.nu * use modules/pj_fzf.nu * use modules/pj_zoxide.nu * use modules/pj_historyhintcomplete.nu * +use modules/pj_deepseek.nu * use modules/pj_prompt.nu *