[HN Gopher] Show HN: Chatblade - A CLI Swiss Army Knife for ChatGPT
       ___________________________________________________________________
        
       Show HN: Chatblade - A CLI Swiss Army Knife for ChatGPT
        
       integrate chatGPT into your scripts or terminal work. Supports
       piping text, saving prompts, estimating costs, and some basic
       json/yaml extraction.  I've added some elaborate examples on the
       readme of how to use it with pictures, that may provide a better
       overview.
        
       Author : ramblerman
       Score  : 282 points
       Date   : 2023-03-19 21:18 UTC (1 days ago)
        
 (HTM) web link (github.com)
 (TXT) w3m dump (github.com)
        
       | [deleted]
        
       | nico wrote:
       | Has anyone created a REPL style command line interface for
       | ChatGPT? So that it runs in the terminal instead of the browser?
       | 
       | Edit: just saw on another post aichat -
       | https://github.com/sigoden/aichat/
        
         | joshka wrote:
         | Doing so yourself isn't too difficult...
         | https://langchain.readthedocs.io/en/latest/modules/memory/ex...
        
       | LeoPanthera wrote:
       | Ha, I was about to release something similar to this as my first
       | ever open-source project. Beaten by a day. And, frankly, this is
       | better than mine.
       | 
       | Congrats to npiv.
        
         | olalonde wrote:
         | Same thing happened to me two weeks ago... Released
         | clevercli[0] only to find out aichat[1] had more features and
         | written in Rust.
         | 
         | [0] https://github.com/clevercli/clevercli
         | 
         | [1] https://github.com/sigoden/aichat/
        
           | _nalply wrote:
           | Does aichat also connect to GPT-4?
        
           | nico wrote:
           | Amazing! Thank you. The AI Chat is super interesting.
           | 
           | Having that on even just a super old computer would be
           | revolutionary for the old computer. Completely new life.
           | 
           | Something old that was obsolete, if it can have a terminal
           | connected to an LLM, and hopefully internet access too, then
           | it becomes a super powerful interface that doesn't even
           | require images.
        
             | jonchurch_ wrote:
             | If I was going to have a pet AI who's brain was largely in
             | the cloud, Id put the ghost in an old machine =]
        
           | rfoo wrote:
           | > written in Rust
           | 
           | Thank you, I'm glad to have a more casually hackable
           | implementation in TypeScript. It definitely helps that you
           | project is not written in Rust!
        
         | actually_a_dog wrote:
         | Do it anyway.
        
         | alerter wrote:
         | Haha yeah, I made something similar for my own use. I bet
         | thousands of people saw the ChatGPT interface and instinctively
         | wanted to pipe stuff / save it easily without fussing with
         | manual copy and paste. It's still a fun project and quite
         | rewarding to see the text stream appear in real time in your
         | shell.
        
         | a_t48 wrote:
         | Release it anyhow!
        
           | bckr wrote:
           | Yup, release it anyhow. There's plenty of storage space on
           | the internet.
        
         | corobo wrote:
         | Even if your tool is just written in a different language
         | you'll probably have an audience. Some people will want to hack
         | on your code, maybe they don't know python. Maybe they just
         | don't like python for whatever reason.
         | 
         | Get it shipped lol. Highest rated comment and you're
         | practically the only person not linking your own!
        
         | jjallen wrote:
         | Yeah still release it for sure. I don't line python and that's
         | enough for me to check out a different language.
        
         | j45 wrote:
         | It's not always about being the first, but being the best and
         | having enough steam to stick around. Lots of abandonware too.
         | 
         | Launch your take anyways
        
         | ramraj07 wrote:
         | At this point a good fraction of every half decent engineer is
         | trying to do something around LLMs. Not sure if that's the best
         | use of the effort when the entire field is in a state of such
         | unstable equilibrium.
        
           | ben_w wrote:
           | Learning by doing is second only to learning by teaching, so
           | my best guess is that it's probably extremely valuable.
        
         | RileyJames wrote:
         | Where's the harm in releasing it anyway? You've done the work,
         | put it out there!
        
         | eshack94 wrote:
         | I think it's still worth releasing even if it's not as good as
         | someone else's. Worst-case scenario, you're growing and
         | learning and putting something out there that demonstrates
         | you're developing interesting software. And who knows, maybe
         | you'll find some other contributors, or maybe this will spark
         | some novel ideas in someone else. You never know the power of
         | your contributions.
         | 
         | Don't gatekeep yourself!
        
         | thejosh wrote:
         | Multiple implementations are always appreciated, different
         | languages etc. :)
        
       | simon_rider wrote:
       | Nice, will try this out. The ascii formatting looks good on this
       | one
       | 
       | I made something quite similar, this can also run commands and
       | has syntax highlighting
       | 
       | https://github.com/lennardv2/hey-chatgpt-cli
        
       | wanderingmind wrote:
       | Is there a similar tool that works for a chatgpt plus account?
        
         | humanistbot wrote:
         | The $20/mo plus only gets you features that you can access in
         | the web interface. It is independent from the API usage that
         | bills by the query. Anything you can get from the API, you can
         | get without paying for plus.
        
           | wanderingmind wrote:
           | There have been addons that were able to use the web
           | interface to get authorization (ex: ChatGPT4Google). I was
           | hoping some similar session authentication and cache and make
           | them available in terminal
        
           | throwaway4aday wrote:
           | Can't access the GPT-4 model through the API yet
        
             | greyman wrote:
             | Maybe you already did that, just reminder for those who
             | don't know - you need to apply for API access for gpt-4. I
             | did that and was granted it after about 2 days.
        
       | lynx23 wrote:
       | $ cat ~/.config/openai/completions.json ~/.local/bin/completions
       | { "model": "text-davinci-003", "max_tokens": 1024 } #!/bin/sh jq
       | --rawfile prompt /dev/stdin '.prompt = $prompt' \
       | ${XDG_CONFIG_HOME:-$HOME/.config}/openai/completions.json | curl
       | --silent https://api.openai.com/v1/completions \ --header
       | "Authorization: Bearer $OPENAI_API_KEY" \ --header "Content-Type:
       | application/json" --data-binary @- | jq -r '.choices[].text'
        
         | ramblerman wrote:
         | Well why use jq? you could decompose that into standard unix
         | commands as well :)
         | 
         | The main itch I wanted to scratch for my own exploration with
         | chatgpt was that I found myself doing a lot of curl requests,
         | and then after a few iterations I would come up with one that
         | worked well. The next step was to reproduce that last result
         | (without ideally hitting the openai servers again) and I wanted
         | to pipe it to the next part of my chain.
         | 
         | This project kind of grew out of that. Every time I had more
         | than 2 pipes I created a new "ease of life" parameter.
         | 
         | Although it is possible (and likely) that your working memory
         | is far greater than mine to come up with a command like that.
        
           | lynx23 wrote:
           | Sorry, I was not trying to belittle your effort, not at all.
           | In fact, its sort of the other way around. You inspired me
           | enough today (basically because I had to deep-dive and try to
           | debug a problem which turned out to be an openai python bug)
           | to realize how simple it actually is to use the completions
           | API. Also, recently upgraded to Debian Bookworm, I was
           | greeted by the new future that pip install refuses to do what
           | it used to do, forcing you to create a venv. So I learnt
           | about pipx, and realized this is getting a bit out of hand,
           | esp. because the bug I was tracing ended up being somewhere
           | deep in the dependencies of the tool you wrote. Remembering
           | KISS, I went back to shell.
           | 
           | I am sure I could encode stuff with plain other tools as
           | well, but jq is actually handy for escaping json strings. And
           | since it can read variable content from stdin, I was a happy
           | man. Even with decently working emacs integration now.
           | 
           | But again, thanks for writing this. I have both now, and will
           | happily steal ideas from chatblade!
        
             | ramblerman wrote:
             | No offense taken at all :) these are some interesting times
             | we live in with the power chatgpt gives us.
             | 
             | The dream is ultimately to leverage chatgpt as a fuzzy text
             | assistant to 10x productivity and I think combining the
             | unix CLI which is optimized for text is the best way to do
             | so.
             | 
             | It is also one of the great powers of the unix CLI that
             | there are many roads that lead to rome.
        
         | lynx23 wrote:
         | In Emacs: C-u M-| completions RET
        
       | icholy wrote:
       | Hacking on something similar, but specifically for operating on
       | source files https://github.com/icholy/codegpt (it's in a very
       | rough state)
        
       | Liutprand wrote:
       | I'm also developing something similar, but with a REPL style
       | approach: https://github.com/marcolardera/chatgpt-cli
        
       | lynx23 wrote:
       | This looks great. However, after generting an API key and
       | providing it to chatblade, I get the following error:
       | 
       | openai.error.AuthenticationError: Incorrect API key provided:
       | user@dom***.tld. You can find your API key at
       | https://platform.openai.com/account/api-keys.
       | 
       | That is kind of weird, because the email given in that message
       | looks valid, but does not match my OpenAI account name. Is that
       | email encoded in the key? If so, apparently decoding worked, so
       | why should the key be invalid?
       | 
       | Am I doing something wrong here, or is something round the API
       | key stuff broken right now?
        
         | ramblerman wrote:
         | It looks like user@dom**.tld is actually what you set as your
         | key.
         | 
         | I can generate the same error by setting
         | 
         | OPENAI_API_KEY="this is wrong"; chatblade test
         | 
         | openai.error.AuthenticationError: Incorrect API key provided:
         | this is *rong. You can find your API key at
         | https://platform.openai.com/account/api-keys.
         | 
         | if you run
         | 
         | echo $OPENAI_API_KEY
         | 
         | you should see your key which starts with sk-......... If not
         | thats where your issue is
        
           | lynx23 wrote:
           | That is what is strange about it, OPENAI_API_KEY is set
           | correctly, and start with sk-
           | 
           | So I wonder where it is getting this email from.
        
             | ramblerman wrote:
             | can you try:
             | 
             | curl https://api.openai.com/v1/completions -H "Content-
             | Type: application/json" -H "Authorization: Bearer
             | $OPENAI_API_KEY" -d '{ "model": "text-davinci-003",
             | "prompt": "Say this is a test", "max_tokens": 7,
             | "temperature": 0 }'
        
               | lynx23 wrote:
               | Yes, this works.
               | 
               | So my api key is valid. But something in chatblade or the
               | python packages it depends on trashes the input I
               | provide, and replaces it with an email address of mine.
               | Sounds weird, but is apparently true.
        
               | ramblerman wrote:
               | Its not doing anything special that could "trash" the
               | input. In fact no other env variables are read at all. So
               | the fact that you are seeing your email, is a pretty
               | strong indication that it is being set by you somewhere.
               | Where else could it even get it from?
               | 
               | An other option is that you passed your email as a
               | parameter mistakingly (which takes precedence over the
               | env variable)
               | 
               | But the code is really pretty simple. https://github.com/
               | npiv/chatblade/blob/4ce28739ca7ada1611029...
        
               | lynx23 wrote:
               | Found it! I need to set NETRC=/dev/null. It appears the
               | request library is trying to grab auth info from .netrc,
               | and in my case, picks the default entry. Why it is doing
               | that despite an api key being provided is unclear.
        
               | matzf wrote:
               | The openapi library seems to use requests incorrectly.
               | 
               | > If no authentication method is given with the auth
               | argument, Requests will attempt to get the authentication
               | credentials for the URL's hostname from the user's netrc
               | file. The netrc file overrides raw HTTP authentication
               | headers set with headers.
               | 
               | Source: https://docs.python-
               | requests.org/en/latest/user/authenticati...
        
               | lynx23 wrote:
               | I know, I took a look at the code.
               | 
               | I even replaced get_openai_key(params) with a hardcoded
               | return "sk-redacted"
               | 
               | and still no luck. I guess the bug must be in the openai
               | python package, but I cant find it either. However, rest
               | assured I am not providing this email anywhere
               | manually...
        
       | [deleted]
        
       | behnamoh wrote:
       | Shell Genie is my favorite. It actually runs the commands if you
       | want.
       | 
       | https://github.com/dylanjcastillo/shell-genie
        
       | karmasimida wrote:
       | Piping prompt is an great use case, that makes a lot of sense
       | actually. Love it.
        
       | 1xdevloper wrote:
       | I'm building something similar[1] but for the web. Imagine
       | creating your own command palette/context menu for any web page.
       | ChatGPT really opened up a lot of mind blowing possibilities and
       | the speed of innovation in this space makes me both excited and
       | anxious.
       | 
       | Now if the Chrome store stops taking 3-4 days to approve an
       | update, that'd be great!
       | 
       | [1] https://sublimegpt.com
        
         | nico wrote:
         | How about the inverse? Having ChatGPT be able to open a browser
         | and perform actions (like visit a website, summarizing it,
         | giving you the best answer, triggering actions, setting up an
         | ads campaign, replying to comments on a social media platform,
         | etc). Then you don't even need to open a browser window, the
         | agent can do it for you headless. You only need to tell it to
         | do it via chat. Kind of like on-demand, chat-triggered selenium
         | tests.
        
           | ehecatl42 wrote:
           | > How about the inverse?
           | 
           | Having GPT fill in (or 'out', if you prefer) the myriad of
           | web-forms I'm currently wrestling with as a job-seeker would
           | be amazing. There's only so many times each day I can copy
           | and paste from my CV (resume) without turning to drink.
        
           | 1xdevloper wrote:
           | I think that's what Langchain is trying to do. You can use
           | Zapier's natural language actions with Langchain to connect
           | with thousands of services.
        
           | Swizec wrote:
           | I think https://uilicious.com is trying to do something like
           | that. Haven't tried it yet but they market themselves as "GPT
           | writes selenium tests for you"
        
             | nico wrote:
             | Cool. I wonder if there's going to be a marketplace for
             | ChatGPT/LLM tools.
             | 
             | Then you download/subscribe/connect your LLM interface, to
             | your tools. I guess that's kind of like Slack.
        
           | dTal wrote:
           | Sure, wire a language model to the internet and allow it to
           | run arbitrary code. What could possibly go wrong!
        
         | zzzzzzzza wrote:
         | https://github.com/Nemoden/gogpt
         | 
         | https://github.com/NotBrianZach/bza (my concept, wip, read
         | along repl as opposed to io focused cli tool)
        
           | nico wrote:
           | Fascinating stuff, thank you for sharing.
           | 
           | You could create a graph of the intersections/references of
           | meaning across different books. Those could represent an
           | external memory for the agent/LLM, that it can
           | retrieve/navigate via prompts.
        
             | zzzzzzzza wrote:
             | my brother thought something like that might be useful for
             | playing dnd with it.
             | 
             | he says it tends to lose character cohesion as conversation
             | goes on
             | 
             | and of course obviously could be useful if a character
             | shows up in a scene it just looks up their wiki entry
             | essentially
             | 
             | sounds complicated lol
             | 
             | i just wanna read math book with it
             | 
             | i could imagine it would be fun to create a wiki with
             | friends and then like randomly roll characters into your
             | session from your shared universe or something
             | 
             | a lot of possibilities
        
         | xur17 wrote:
         | Is the webpage content passed to ChatGPT, or is this more
         | intended to be a way to easily use chatgpt?
         | 
         | On the first part: I've been trying to build a tool that parses
         | webpages using ChatGPT, but I'm struggling to figure out the
         | best way to pass the website content over. Some options I have
         | tried:
         | 
         | * Raw HTML - expensive, and in a lot of cases doesn't fit in
         | prompt input
         | 
         | * OCR - works better than I would have expected, but can
         | struggle with certain fonts, and a lot of the webpage structure
         | is lost
        
           | huijzer wrote:
           | Let me know if you got it working. I'm looking for such a
           | thing too!
           | 
           | Maybe stripping the styling and Javascript from webpages
           | would work? Did you do the OCR as part of the complete model
           | or did you make it a separate step? Machine learning is
           | usually much better in one step.
        
             | xur17 wrote:
             | I did OCR as a separate step (essentially 1. load webpage,
             | 2. screenshot, 3. ocr, 4. ocr output + question into
             | chatgpt). What does it mean to do it all as one step / how
             | would I got about doing that with ChatGPT?
             | 
             | For more context: I have this setup as an api that I feed
             | url + typescript definitions to, and have chatgpt output
             | information from the website in the specified typescript
             | definition.
             | 
             | For example, I can use {product_price: float, product_name:
             | str} + a url as the input, and fairly accurately get
             | product price info across ALL product websites. It's kind
             | of amazing that it's able to do this much just based upon
             | the typescript variable names + raw OCR output.
        
               | huijzer wrote:
               | > What does it mean to do it all as one step / how would
               | I got about doing that with ChatGPT?
               | 
               | Wait till they make the image input available via the
               | API, I guess
        
               | xur17 wrote:
               | That makes sense, and was my plan, but the costs for
               | chat-gpt-4 are a bit higher than is economically viable
               | for most of my use cases.
        
       ___________________________________________________________________
       (page generated 2023-03-20 23:02 UTC)