Help Setting Up An SSH Command Line Chat Interface To Google Gemini?

Not_OlesNot_Oles Hosting ProviderContent Writer

A few days ago I mentioned setting up a command line interface (CLI) to Google Geminii. What I am looking for initially is a chat interface to and from Gemini running on a Debian sid Intel i9-13900 remote server that I can access and use by ssh. Initially, I am not looking for a self-hosted Gemini web interface running on the remote server. The ssh capable interface on the remote server should send queries to Gemini and receive and print Gemini's responses.

I am looking for a chat interface, not just something for single questions. See the discussion of the difference between single queries and chat queries at raymondcamden.com

Before long I might hope for a CLI chat interface to more AIs than just Google Gemini. Ideally there might even be a fully open source interface to fully open source AI implementations.

Eventually I might even want a graphical interface. But for right now, I'm focussing on a four part process: (1) ssh from my Chromebook to command line on the remote server, (2) then from the remote server to Google Gemini, (3) response sent from Gemini back to the remote server, and finally (4) back to me via ssh -- unless I find something which provides more options while still including the ssh CLI to Gemini and back starting option.

The initial step might be to figure out what project I might try to use. Looking around, I found projects written in different languages, including Javascript, Python, and . . . Lua + Ruby and more! I've been looking at the GitHub Topics page for Google Gemini, which lists 149 repositories.

Lua + Ruby

Today I found out about Nano Bots, which the linked repository says consists of Lua 66.1% and Ruby 33.9%. Nano Bots seems to provide a command line interface for Google Gemini as well as other AIs. But, happily, the video on the Nano Bots Github page seems to show exactly what I think I might want (assuming it's a command line interface that I use via ssh and not a web interface providing a command line interface):

LuaJIT

I haven't found a LuaJIT CLI interface to Gemini. I haven't found a LuaJIT interface to any AI.

I had no idea, when I first saw Lua a few days ago while upgrading Apache, that I was going to find out about the existence of the Luajit scripting language that is might be 285.63 times faster than Python3 in at least in one application.

Python

@suh kindly suggested binou (also Python) but I'm unsure whether biniou provides the ssh CLI that I want. biniou's About listing describes itself as "a self-hosted webui for 30+ generative ai"

Go

Looks like the eliben interface does more than than the reugn interface.

Javascript

PHP/Laravel

Rust

This rust project's About actually describes itself as "simple:" "A simple command line wrapper for Google Gemini"

Google Tutorial

I found Tutorial: Get started with the Gemini API | Google for Developers

API Key

I already have a Gemini API key, so that part is taken care of.

Questions

Does anybody know of or use additional projects which provide an ssh CLI interface to Google Gemini?

Am I misunderstanding that the Nano Bots interface is ssh? Is it really a web interface?

Is LuaJIT, without more, incapable of interfacing with Gemini?

I'm tempted to try one interface in Python, one in Go, one in Javascript, one in PHP or Laravel, that one in Rust, and one in Lua/LuaJIT. Might be fun, but that seems like too many. So, which one to try first?

Which would be the most beginner friendly implementation?

Thanked by (1)wankel

I hope everyone gets the servers they want!

«1

Comments

  • Not_OlesNot_Oles Hosting ProviderContent Writer

    Just for fun, I shared the above OP with Google Gemini. Here is a link to what Gemini had to say:

    Please click the "v" Expand Text link to see the entire prompt sent to Gemini.

    I hope everyone gets the servers they want!

  • Not_OlesNot_Oles Hosting ProviderContent Writer
    edited July 8

    A kind person suggested that I try this search on DuckDuckGo:

    https://duckduckgo.com/?q=llm+chat+interface+command+line+for+google+gemini&ia=web

    Although I already knew about the first two DDG results (which are listed in the OP),

    https://github.com/eliben/gemini-cli

    and

    https://github.com/reugn/gemini-cli

    I did not know about the third and fourth results. The third result is a blog post explaining the eliben/gemini-cli project that was the first result. eliben/gemini-cli is programmed in Go. Here is a quote from the blog post that's relevant to my wish for a simple, ssh interface:

    I really enjoyed building gemini-cli; it's true to the spirit of simple, textual Unix CLIs that can be easily combined together through pipes.

    The fourth result is new to me. Its about section says, "Straightforward command line chat for the Google gemini-pro LLM including 2 templates for injecting info from wikipedia and howdoi into the prompts." It's programmed in Python.

    Thanks to the kind person who provided the above link to the DuckDuckGo search! <3

    Thanked by (1)vyas

    I hope everyone gets the servers they want!

  • vyasvyas OGSenpai
    edited July 8

    ssh access to llm via command line chat tool (without local install) = bliss

    Thanked by (1)Not_Oles
  • Not_OlesNot_Oles Hosting ProviderContent Writer

    Installing eliben/gemini-cli

    After reading gemini-cli: Access Gemini models from the command-line on Eli Bendersky's website I decided to try Eli's eliben/gemini-cli. I cloned the sources off Github so I could take a look. Then I needed to install Go and also to perform the eliben/gemini-cli installation.

    Installing Go is a little different with Debian apt than untarring the Go files as recommended on the Go website's Download page. One difference is that Debian apt puts the Go files in /usr/lib/ whereas the Go website recommends /usr/local.

    One advantage of the Go website's untar install is that the installed version might be newer than whatever is available in a Linux distribution's repositories. However, Debian unstable/sid offers two Go packages, golang-go and golang-1.22-go. golang-go seems to be 1.22.3 and golang-1.22-go seems to be 1.22.5, which actually corresponds to the current release version offered on the Go website. Since apt's golang-1.22-go package seems to provide the same current release version as offered on the Go website, I decided to use the apt golang-1.22-go package for my install.

    root@lol ~ # apt show golang-1.22-go
    Package: golang-1.22-go
    Version: 1.22.5-1
    Priority: optional
    Section: golang
    Source: golang-1.22
    Maintainer: Debian Go Compiler Team <[email protected]>
    Installed-Size: 103 MB
    Depends: golang-1.22-src (>= 1.22.5-1)
    Recommends: g++, gcc, libc6-dev, pkg-config
    Suggests: bzr | brz, ca-certificates, git, mercurial, subversion
    Breaks: dh-golang (<< 1.43~)
    Homepage: https://go.dev/
    Download-Size: 24.7 MB
    APT-Sources: http://deb.debian.org/debian unstable/main amd64 Packages
    Description: Go programming language compiler, linker, compiled stdlib
     The Go programming language is an open source project to make programmers more
     productive. Go is expressive, concise, clean, and efficient. Its concurrency
     mechanisms make it easy to write programs that get the most out of multicore
     and networked machines, while its novel type system enables flexible and
     modular program construction. Go compiles quickly to machine code yet has the
     convenience of garbage collection and the power of run-time reflection. It's a
     fast, statically typed, compiled language that feels like a dynamically typed,
     interpreted language.
     .
     This package provides an assembler, compiler, linker, and compiled libraries
     for the Go programming language.
     .
     To use this version, instead of the default one provided by golang-go package,
     add /usr/lib/go-1.22/bin/ to PATH, or invoke /usr/lib/go-1.22/bin/go directly.
    
    root@lol ~ # date; apt-get update && apt-get install golang-1.22-go
    Wed Jul 10 01:30:37 AM UTC 2024
    Hit:1 http://deb.debian.org/debian unstable InRelease
    Reading package lists... Done
    Reading package lists... Done
    Building dependency tree... Done
    Reading state information... Done
    The following additional packages will be installed:
      golang-1.22-src
    Suggested packages:
      bzr | brz mercurial subversion
    The following NEW packages will be installed:
      golang-1.22-go golang-1.22-src
    0 upgraded, 2 newly installed, 0 to remove and 2 not upgraded.
    Need to get 43.6 MB of archives.
    After this operation, 228 MB of additional disk space will be used.
    Do you want to continue? [Y/n] 
    Get:1 http://deb.debian.org/debian unstable/main amd64 golang-1.22-src all 1.22.5-1 [18.8
     MB]
    Get:2 http://deb.debian.org/debian unstable/main amd64 golang-1.22-go amd64 1.22.5-1 [24.
    7 MB]
    Fetched 43.6 MB in 0s (107 MB/s) 
    Selecting previously unselected package golang-1.22-src.
    (Reading database ... 98732 files and directories currently installed.)
    Preparing to unpack .../golang-1.22-src_1.22.5-1_all.deb ...
    Unpacking golang-1.22-src (1.22.5-1) ...
    Selecting previously unselected package golang-1.22-go.
    Preparing to unpack .../golang-1.22-go_1.22.5-1_amd64.deb ...
    Unpacking golang-1.22-go (1.22.5-1) ...
    Setting up golang-1.22-src (1.22.5-1) ...
    Setting up golang-1.22-go (1.22.5-1) ...
    root@lol ~ # go version
    -bash: go: command not found
    root@lol ~ # /usr/lib/go-1.22/bin/go version
    go version go1.22.5 linux/amd64
    root@lol ~ # echo 'PATH=$PATH:/usr/lib/go-1.22/bin export PATH' >> /root/.bashrc
      [ log out and log in again ]
    root@lol ~ # go version
    go version go1.22.5 linux/amd64
    root@lol ~ # 
    

    The next step is to install eliben/gemini-cli following the one line install instruction which appears both in the blog post and in the Github repository's README.md.

    tom@lol:~$ which go
    /usr/lib/go-1.22/bin/go
    tom@lol:~$ go install github.com/eliben/gemini-cli@latest
    go: downloading github.com/eliben/gemini-cli v0.5.0
    go: downloading github.com/mattn/go-sqlite3 v1.14.22
    go: downloading github.com/chewxy/math32 v1.10.1
    go: downloading github.com/spf13/cobra v1.8.0
    go: downloading google.golang.org/api v0.176.1
    go: downloading github.com/google/generative-ai-go v0.11.2
    go: downloading github.com/spf13/pflag v1.0.5
    go: downloading cloud.google.com/go/ai v0.4.0
    go: downloading github.com/googleapis/gax-go/v2 v2.12.4
    go: downloading github.com/google/uuid v1.6.0
    go: downloading google.golang.org/protobuf v1.33.0
    go: downloading google.golang.org/grpc v1.63.2
    go: downloading google.golang.org/genproto/googleapis/rpc v0.0.0-20240415180920-8c6c420018be
    go: downloading cloud.google.com/go v0.112.2
    go: downloading golang.org/x/net v0.24.0
    go: downloading golang.org/x/sys v0.19.0
    go: downloading cloud.google.com/go/longrunning v0.5.6
    go: downloading google.golang.org/genproto/googleapis/api v0.0.0-20240415180920-8c6c420018be
    go: downloading golang.org/x/text v0.14.0
    go: downloading github.com/golang/protobuf v1.5.4
    go: downloading golang.org/x/oauth2 v0.19.0
    go: downloading cloud.google.com/go/auth v0.3.0
    go: downloading github.com/google/s2a-go v0.1.7
    go: downloading go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0
    go: downloading cloud.google.com/go/auth/oauth2adapt v0.2.2
    go: downloading cloud.google.com/go/compute/metadata v0.3.0
    go: downloading go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0
    go: downloading go.opencensus.io v0.24.0
    go: downloading golang.org/x/time v0.5.0
    go: downloading github.com/googleapis/enterprise-certificate-proxy v0.3.2
    go: downloading golang.org/x/sync v0.7.0
    go: downloading golang.org/x/crypto v0.22.0
    go: downloading go.opentelemetry.io/otel/trace v1.24.0
    go: downloading go.opentelemetry.io/otel v1.24.0
    go: downloading go.opentelemetry.io/otel/metric v1.24.0
    go: downloading github.com/felixge/httpsnoop v1.0.4
    go: downloading github.com/go-logr/logr v1.4.1
    go: downloading github.com/go-logr/stdr v1.2.2
    go: downloading github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da
    tom@lol:~$ 
    

    Set the $PATH environment variable, and log out.

    tom@lol:~$ echo 'PATH=$PATH:/home/tom/go/bin export PATH' >> /home/tom/.bashrc
    tom@lol:~$ logout
    

    Log in again to check that the new PATH and gemini-cli are working.

    tom@lol:~$ gemini-cli help
    This tool lets you interact with Google's Gemini LLMs from the
    command-line.
    
    Usage:
      gemini-cli <command> [flags]
      gemini-cli [command]
    
    Available Commands:
      chat        Interactive chat with a model
      counttok    Count tokens in content
      embed       Access Gemini embedding models
      help        Help about any command
      models      List supported Gemini models
      prompt      Send a prompt to a Gemini model
    
    Flags:
      -h, --help           help for gemini-cli
          --key string     API key for Google AI
          --model string   Name of model to use; see https://ai.google.dev/models/gemini (default "gemini-1.0-pro")
          --proxy string   URL of proxy server to use for the connection
      -v, --version        print version info and exit
    
    Use "gemini-cli [command] --help" for more information about a command.
    tom@lol:~$ 
    

    Next is to add the API key according to the following instructions quoted from the eliben/gemini-cli Github README.md.

    "All gemini-cli invocations require an API key for https://ai.google.dev/ to be provided, either via the --key flag or an environment variable called GEMINI_API_KEY. You can visit that page to obtain a key - there's a generous free tier!"

    I tried accessing Gemini to get a list of available models. Here's what I saw.

    tom@lol:~$ export GEMINI_API_KEY=<KEY>
    tom@lol:~$ gemini-cli models
    Name                                    Version Max In  Max Out Description
    
    models/chat-bison-001                   001     4096    1024    A legacy text-only model optimized for chat conversations
    models/text-bison-001                   001     8196    1024    A legacy model that understands text and generates text as an output
    models/embedding-gecko-001              001     1024    1       Obtain a distributed representation of a text.
    models/gemini-1.0-pro                   001     30720   2048    The best model for scaling across a wide range of tasks
    models/gemini-1.0-pro-001               001     30720   2048    The best model for scaling across a wide range of tasks. This is a stable model that supports tuning.
    models/gemini-1.0-pro-latest            001     30720   2048    The best model for scaling across a wide range of tasks. This is the latest model.
    models/gemini-1.0-pro-vision-latest     001     12288   4096    The best image understanding model to handle a broad range of applications
    models/gemini-1.5-flash                 001     1048576 8192    Fast and versatile multimodal model for scaling across diverse tasks
    models/gemini-1.5-flash-001             001     1048576 8192    Fast and versatile multimodal model for scaling across diverse tasks
    models/gemini-1.5-flash-latest          001     1048576 8192    Fast and versatile multimodal model for scaling across diverse tasks
    models/gemini-1.5-pro                   001     2097152 8192    Mid-size multimodal model that supports up to 2 million tokens
    models/gemini-1.5-pro-001               001     2097152 8192    Mid-size multimodal model that supports up to 2 million tokens
    models/gemini-1.5-pro-latest            001     2097152 8192    Mid-size multimodal model that supports up to 2 million tokens
    models/gemini-pro                       001     30720   2048    The best model for scaling across a wide range of tasks
    models/gemini-pro-vision                001     12288   4096    The best image understanding model to handle a broad range of applications
    models/embedding-001                    001     2048    1       Obtain a distributed representation of a text.
    models/text-embedding-004               004     2048    1       Obtain a distributed representation of a text.
    models/aqa                              001     7168    1024    Model trained to return answers to questions that are grounded in provided sources, along with estimating answerable probability.
    tom@lol:~$ 
    

    eliben/gemini-cli looks like it might work for me! It's getting late here, so more soon! This was fun!

    If anyone catches a mistake that I made here or has additional suggestions or comments, I'd be grateful! <3

    I hope everyone gets the servers they want!

  • vyasvyas OGSenpai

    that's quite a progress, Sir,
    From "How do I" to "How To" in a matter of days!

    Thanked by (1)Not_Oles
  • Not_OlesNot_Oles Hosting ProviderContent Writer

    @vyas said:
    that's quite a progress, Sir,
    From "How do I" to "How To" in a matter of days!

    @vyas Thanks for your kind words!

    When I originally posted this thread, I really didn't know what to do. I've learned a little, but I'm still vastly ignorant clueless!™

    For example, I had no idea that the Google Gemini API Free Tier wasn't available in Finland where one of my servers is located!

    Happily, the Google Gemini Pay-as-you-go pricing doesn't seem bad, at least at my usage for a few handwritten chats. Am I guessing right -- approximately $1.50 per million tokens?

    From my Chromebook, presently visiting in Mexico:

    chronos@penguin:~$ curl \
      -H 'Content-Type: application/json' \
      -d '{"contents":[{"parts":[{"text":"Explain how AI works"}]}]}' \
      -X POST 'https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash-latest:generateContent?key=REDACTED'
    {
      "candidates": [
        {
          "content": {
            "parts": [
              {
                "text": "## AI in a Nutshell: How It Works\n\nAI, or Artificial Intelligence, is not a single technology but a broad field encompassing many different techniques and approaches. At its core, AI aims to create systems that can **mimic human intelligence** in various ways, such as:\n\n**1. Learning:** AI systems can learn from data and experience, just like humans. This learning process can be **supervised**, where the system is explicitly told what to learn, or **unsupervised**, where the system discovers patterns on its own.\n\n**2. Reasoning:**  AI systems can use logic and rules to solve problems, draw conclusions, and make decisions.\n\n**3. Perception:** AI systems can \"see\" and \"hear\" by processing images, sounds, and other sensory data, just like humans do.\n\n**4. Natural Language Processing (NLP):**  AI systems can understand and generate human language, allowing them to interact with us in a more natural way.\n\n**Here are some key approaches used in AI:**\n\n* **Machine Learning (ML):** This is the most common approach, where algorithms are trained on data to learn patterns and make predictions. Examples include:\n    * **Deep Learning (DL):** A type of ML that uses artificial neural networks inspired by the human brain.\n    * **Reinforcement Learning:** Systems learn by trial and error, receiving rewards for good decisions and penalties for bad ones.\n* **Expert Systems:** These systems are designed to mimic the knowledge and reasoning of human experts in specific domains.\n* **Symbolic AI:** This approach uses logic and symbols to represent knowledge and solve problems.\n\n**To understand how AI works, consider these examples:**\n\n* **Image Recognition:** An AI system might analyze thousands of images of cats to learn the features that define them, allowing it to identify a cat in a new image.\n* **Self-Driving Cars:** These cars use sensors and AI algorithms to understand their surroundings, make decisions about driving, and avoid obstacles.\n* **Virtual Assistants:** These systems use NLP to understand your voice commands and respond appropriately.\n\n**It's important to remember:**\n\n* AI is constantly evolving, with new techniques and applications emerging all the time.\n* AI is not a magical solution to every problem. It has limitations and can be biased if the data it's trained on is biased.\n* AI raises ethical considerations, such as job displacement and the potential for misuse.\n\nBy understanding how AI works, we can harness its potential for good while navigating its challenges responsibly.\n"
              }
            ],
            "role": "model"
          },
          "finishReason": "STOP",
          "index": 0,
          [ . . . ]
            }
          ]
        }
      ],
      "usageMetadata": {
        "promptTokenCount": 4,
        "candidatesTokenCount": 522,
        "totalTokenCount": 526
      }
    }
    chronos@penguin:~$ 
    

    From my server in Finland:

    tom@lol:~$ curl \
      -H 'Content-Type: application/json' \
      -d '{"contents":[{"parts":[{"text":"Explain how AI works"}]}]}' \
      -X POST 'https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash-latest:generateContent?key=REDACTED'
    {
      "error": {
        "code": 400,
        "message": "Gemini API free tier is not available in your country. Please enable billing on your project in Google AI Studio.",
        "status": "FAILED_PRECONDITION"
      }
    }
    tom@lol:~$ 
    

    I hope everyone gets the servers they want!

  • vyasvyas OGSenpai

    groq seems to have caught the fancy of the volken … speedy, multiple LLM option, decent daily limits too !

    Was trying a similar setup as yours with them, so far a bit of struggle.

    Gemini is cool

    Thanked by (1)Not_Oles
  • Not_OlesNot_Oles Hosting ProviderContent Writer
    edited July 13

    @vyas said:
    groq seems to have caught the fancy of the volken … speedy, multiple LLM option, decent daily limits too !

    Was trying a similar setup as yours with them, so far a bit of struggle.

    Gemini is cool

    Thank you @vyas!

    My first time hearing about groq!

    Are you using https://github.com/sanity-io/groq-cli?

    Thanks again!

    Thanked by (1)vyas

    I hope everyone gets the servers they want!

  • Not_OlesNot_Oles Hosting ProviderContent Writer
    edited July 14

    Above I posted the little curl command which Google Gemini presents on its Get API key page. The idea is that you can run the curl command as a fast, easy way to confirm whether your API key is working or not.

    Of course, if you love command line and curl and also love getting your results in JSON, you can use Google Gemini's little curl command to talk with Gemini.

    Here below is using sed to substitute "What is a cat?" for the curl command's built-in "Explain how AI works" and then piping the result to bash. Gemini returns its answer as a single long line which extends way out to the right here at LES but which wraps in my terminal interface. I guess one could use jq or similar and not bother with an interface to Gemini.

    chronos@penguin:~$ cat gemini-curl
    curl \
      -H 'Content-Type: application/json' \
      -d '{"contents":[{"parts":[{"text":"Explain how AI works"}]}]}' \
      -X POST 'https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash-latest:generateContent?key=REDACTED'
    chronos@penguin:~$ sed 's/Explain how AI works/What is a cat?/' gemini-curl
    curl \
      -H 'Content-Type: application/json' \
      -d '{"contents":[{"parts":[{"text":"What is a cat?"}]}]}' \
      -X POST 'https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-flash-latest:generateContent?key=REDACTED'
    chronos@penguin:~$ sed 's/Explain how AI works/What is a cat?/' gemini-curl | bash
    {
      "candidates": [
        {
          "content": {
            "parts": [
              {
                "text": "A cat is a small, domesticated carnivorous mammal that is a popular pet worldwide. Here's a breakdown:\n\n**Scientific Classification:**\n\n* **Kingdom:** Animalia\n* **Phylum:** Chordata\n* **Class:** Mammalia\n* **Order:** Carnivora\n* **Family:** Felidae\n* **Genus:** Felis\n* **Species:** F. catus\n\n**Physical Characteristics:**\n\n* **Size:** Typically weighs 4-5 kg (9-11 lbs), with significant variation depending on breed.\n* **Body:** Sleek and muscular, with a flexible spine.\n* **Head:** Rounded with prominent whiskers.\n* **Ears:** Triangular and pointed.\n* **Tail:** Long and bushy.\n* **Coat:** Can be short or long, and come in a wide variety of colors and patterns.\n\n**Behavior:**\n\n* **Solitary:** Cats are generally independent and prefer their own company.\n* **Curious:** They are naturally inquisitive and enjoy exploring their surroundings.\n* **Playful:** Cats often engage in playful activities like chasing toys and pouncing.\n* **Nocturnal:** Cats are crepuscular, meaning they are most active at dawn and dusk.\n* **Clean:** Cats are meticulous groomers and maintain excellent hygiene.\n\n**Domestication:**\n\n* **History:** Cats have been domesticated for thousands of years, with evidence suggesting they were kept as pets in ancient Egypt.\n* **Role:** Cats are primarily kept as companions, but they also play a role in controlling rodent populations.\n* **Breeds:** There are over 70 recognized cat breeds, each with its own unique characteristics.\n\n**Interesting Facts:**\n\n* Cats can see in the dark better than humans.\n* Their purring frequency has healing properties.\n* Cats have a third eyelid called a nictitating membrane.\n* They have excellent balance and agility.\n\nOverall, cats are fascinating creatures that have captured the hearts of humans for centuries. Their playful nature, independent spirit, and graceful movements make them beloved companions. \n"
              }
            ],
            "role": "model"
          },
          "finishReason": "STOP",
          "index": 0,
          "safetyRatings": [
            {
              "category": "HARM_CATEGORY_SEXUALLY_EXPLICIT",
              "probability": "NEGLIGIBLE"
            },
            {
              "category": "HARM_CATEGORY_HATE_SPEECH",
              "probability": "NEGLIGIBLE"
            },
            {
              "category": "HARM_CATEGORY_HARASSMENT",
              "probability": "NEGLIGIBLE"
            },
            {
              "category": "HARM_CATEGORY_DANGEROUS_CONTENT",
              "probability": "NEGLIGIBLE"
            }
          ],
          "citationMetadata": {
            "citationSources": [
              {
                "startIndex": 106,
                "endIndex": 276,
                "uri": "https://africawild-forum.com/viewtopic.php?t=5024",
                "license": ""
              }
            ]
          }
        }
      ],
      "usageMetadata": {
        "promptTokenCount": 5,
        "candidatesTokenCount": 428,
        "totalTokenCount": 433
      }
    }
    chronos@penguin:~$ 
    

    I hope everyone gets the servers they want!

  • havochavoc OGContent Writer

    LLMs via SSH can be done but isn't really a thing due to limited practicality.

    It's all either API (openAI format has become industry standard), or via a web UI, or straight into code via a python module etc.

    For a webUI I'd suggest:

    https://github.com/open-webui/open-webui

    Before long I might hope for a CLI chat interface to more AIs than just Google Gemini.

    You can put a tool like LiteLLM in between...sorta like a API proxy of sorts that can help standardize the various providers implementations

    Or you can look at something like openrouter.ai...also proxy like thing but its hosted and they have loads of models so you load say $5 credits and then can play with any

    If you're on a GPU server something like text-generation-webui is probably best (or just straight llama.cpp)

    Which would be the most beginner friendly implementation?

    Skipping the SSH part would ease the journey significantly.

    If you really want a SSH bot, you could build one yourself fairly easily. e.g. the langgraph quickstart tutorial is a basic chatbot

    https://langchain-ai.github.io/langgraph/tutorials/introduction/#part-1-build-a-basic-chatbot

    Thanked by (2)Not_Oles BruhGamer12
  • Not_OlesNot_Oles Hosting ProviderContent Writer

    In addition to the reason @vyas mentioned, even more reasons for installing gemini-cli are very well explained in Eli Bendersky's excellent blog post.

    Thanked by (1)vyas

    I hope everyone gets the servers they want!

  • Not_OlesNot_Oles Hosting ProviderContent Writer
    edited July 15

    As mentioned above, access to the Google Gemini API seems to be free from the location in Mexico where I currently am visiting but not from my server's location in Finland.

    Therefore, yesterday, I tried installing Go with apt-get and then installing eliben/gemini-cli inside the Crostini Debian 12 Linux container running in my Duet 5 Chromebook. This approach did not work, possibly because eliben/gemini-cli seems to want a newer version of Go than Debian 12's apt-get wants to install.

    chronos@penguin:~$ sudo apt-get update 
      [ . . . ]
    chronos@penguin:~$ sudo apt-get upgrade
      [ . . . ]
    chronos@penguin:~$ sudo apt-get install golang
      [ . . . ]
    The following NEW packages will be installed:
      golang golang-1.19 golang-1.19-doc golang-1.19-go golang-1.19-src golang-doc
      golang-go golang-src libpkgconf3 pkg-config pkgconf pkgconf-bin
      [ . . . ]
    chronos@penguin:~$ cat /etc/debian_version 
    12.6
    chronos@penguin:~$ go version
    go version go1.19.8 linux/arm64
    chronos@penguin:~$ go install github.com/eliben/gemini-cli@latest
    go: github.com/eliben/gemini-cli@latest (in github.com/eliben/[email protected]): go.
    mod:3: invalid go version '1.22.2': must match format 1.23
    chronos@penguin:~$ 
    

    The problem seen yesterday on my Chromebook might be similar to Go Issue 61888: cmd/go, x/mod: "invalid go version" message mentions old version format.

    On my server, I had used apt-get to install Go, because the server's Debian unstable/sid's apt-get can install Go's current version, which seems to work fine with eliben/gemini-cli.

    Go's Download and install page suggests downloading and untarring a binary of the current 1.22.5 version of Go. Installing the official Go binary on my Chromebook seems easy enough, but I haven't tried it yet. Probably it might be a good idea to remove the apt-get installed Go before trying the Go official binary install.

    Another possible fix might be try to get a Debian unstable/sid Crostini container working on my Chromebook. However, I don't want to mess with my default Crostini container, which is my escape portal to my servers. And, by default, Chromebooks apparently do not yet enable creating multiple Crostini containers. There is chrome://flags#crostini-multi-container but it's not clear to me how it all might work out to try a second Crostini container running Debian unstable/sid.

    Given the situation it looks like I am going to try removing my Chromebook Crostini container's presently apt-get installed Go and replacing it with the official Go binary install from https://go.dev/doc/install.

    Presumably Debian has a good reason for not making the current Go version available in Debian 12's apt-get. Of course, a major concept behind Debian stable is that packages have been out for awhile and are expected to be less likely to cause problems. However, I've not yet seen a discussion -- explicitly with respect to Go -- of this version compatibility issue either from the perspective of the Debian maintainer or from the perspective of the Go Team. Does anybody have a link for me? Thanks!

    I hope everyone gets the servers they want!

  • havochavoc OGContent Writer
    edited July 15

    Can't you just do a simple proxy to bypass the geolock?

    As a sidenote, Gemma-2-27B will be substantially cheaper (~0.3) than Gemini and ends up about same on leaderboards:

    https://chat.lmsys.org/?leaderboard

    Thanked by (2)Not_Oles adly
  • @Not_Oles said:
    As mentioned above, access to the Google Gemini API seems to be free from the location in Mexico where I currently am visiting but not from my server's location in Finland.

    Therefore, yesterday, I tried installing Go with apt-get and then installing eliben/gemini-cli inside the Crostini Debian 12 Linux container running in my Duet 5 Chromebook. This approach did not work, possibly because eliben/gemini-cli seems to want a newer version of Go than Debian 12's apt-get wants to install.

    chronos@penguin:~$ sudo apt-get update 
      [ . . . ]
    chronos@penguin:~$ sudo apt-get upgrade
      [ . . . ]
    chronos@penguin:~$ sudo apt-get install golang
      [ . . . ]
    The following NEW packages will be installed:
      golang golang-1.19 golang-1.19-doc golang-1.19-go golang-1.19-src golang-doc
      golang-go golang-src libpkgconf3 pkg-config pkgconf pkgconf-bin
      [ . . . ]
    chronos@penguin:~$ cat /etc/debian_version 
    12.6
    chronos@penguin:~$ go version
    go version go1.19.8 linux/arm64
    chronos@penguin:~$ go install github.com/eliben/gemini-cli@latest
    go: github.com/eliben/gemini-cli@latest (in github.com/eliben/[email protected]): go.
    mod:3: invalid go version '1.22.2': must match format 1.23
    chronos@penguin:~$ 
    

    The problem seen yesterday on my Chromebook might be similar to Go Issue 61888: cmd/go, x/mod: "invalid go version" message mentions old version format.

    On my server, I had used apt-get to install Go, because the server's Debian unstable/sid's apt-get can install Go's current version, which seems to work fine with eliben/gemini-cli.

    Go's Download and install page suggests downloading and untarring a binary of the current 1.22.5 version of Go. Installing the official Go binary on my Chromebook seems easy enough, but I haven't tried it yet. Probably it might be a good idea to remove the apt-get installed Go before trying the Go official binary install.

    Another possible fix might be try to get a Debian unstable/sid Crostini container working on my Chromebook. However, I don't want to mess with my default Crostini container, which is my escape portal to my servers. And, by default, Chromebooks apparently do not yet enable creating multiple Crostini containers. There is chrome://flags#crostini-multi-container but it's not clear to me how it all might work out to try a second Crostini container running Debian unstable/sid.

    Given the situation it looks like I am going to try removing my Chromebook Crostini container's presently apt-get installed Go and replacing it with the official Go binary install from https://go.dev/doc/install.

    Presumably Debian has a good reason for not making the current Go version available in Debian 12's apt-get. Of course, a major concept behind Debian stable is that packages have been out for awhile and are expected to be less likely to cause problems. However, I've not yet seen a discussion -- explicitly with respect to Go -- of this version compatibility issue either from the perspective of the Debian maintainer or from the perspective of the Go Team. Does anybody have a link for me? Thanks!

    its not free in Europe because by not paying in NA they are explicitly using the data you give them to train. If you pay in NA they do not train or store the data but if free they store forever and train on as much as you send.

    Thanked by (1)Not_Oles
  • Not_OlesNot_Oles Hosting ProviderContent Writer
    edited July 16

    @havoc said:
    Can't you just do a simple proxy to bypass the geolock?

    Sure, but only if our friends at Google knew about the proxy and approved in advance.

    As a sidenote, Gemma-2-27B will be substantially cheaper (~0.3) than Gemini and ends up about same on leaderboards:

    https://chat.lmsys.org/?leaderboard

    Thanks for telling me about Gemma-2-27B, which I haven't yet tried. However, for the moment, in allowed locations, gemini-1.5-pro-latest is available for free via the Gemini API. I don't know about Gemma-2-27B since I haven't tried it. However, after some weeks of using the Gemini model which is available on my Chromebook via Google One, the gemini-1.5-pro-latest seems to be a substantial step up.

    Thanks also for telling me about https://chat.lmsys.org/?leaderboard, which I haven't seen before. The page says, "We've collected over 1,000,000 human pairwise comparisons to rank LLMs with the Bradley-Terry model and display the model ratings in Elo-scale. You can find more details in our paper."

    I appreciate your helpful suggestions! Thanks again!

    I hope everyone gets the servers they want!

  • havochavoc OGContent Writer

    @Not_Oles said: gemini-1.5-pro-latest is available for free

    oh - didn't know pro is currently free on API too (well outside of europe)! Had just assumed its the lower one. Makes sense to use it then

    Thanks also for telling me about https://chat.lmsys.org/?leaderboard

    Yeah its probably the most trusted leaderboard since it's blind side by side comparisons rather than synthetic benchmarks. You literally can't game it & no risk of dataset contamination like the synthetics.

    Thanked by (1)Not_Oles
  • Not_OlesNot_Oles Hosting ProviderContent Writer
    edited July 16

    Installing Go And eliben/gemini-cli On A Chromebook

    eliben/gemini-cli now seems to be working inside the Linux Debian 12 Crostini container on my Lenovo Duet 5 Chromebook.

    To get eliben/gemini-cli working I first had to remove the older, incompatible version of Go which had been installed with apt-get. As explained above eliben/gemini-cli didn't work with the older version of Go,

    After removing the old Go, I reinstalled the latest Go release approximately following the official instructions at https://go.dev/doc/install. During the reinstall I made an SHA256SUM file. I like to keep the SHA256 sums handy because I am often backing up or reinstalling elsewhere, so it's good to keep permanently available a convenient way of verifying the file integrity.

    Adjusting the Chromebook container's PATH environment variable also was required so that the shell could find the newly installed Go and gemini-cli binaries.

    After reinstalling Go, I of course had to install eliben/gemini-cli. I did the eliben/gemini-cli install in my home directory.

    Additionally, I set an environment variable so that gemini-cli could get my Google AI Studio API key. You can get your key for free from the same linked API key page.

    I did a quick test of everything by asking Google Gemini the example Simple single prompt question, "Why is the sky blue?" shown in the eliben/gemini-cli README.md. It seems like everything might be working okay. Thanks to eliben/gemini-cli, my Chromebook now can talk directly with Google Gemini from the command line.

    Below are a few notes I made of the command line output seen during various steps of the install.

    • Remove Existing Go Install
    chronos@penguin:~$ date
    Mon Jul 15 07:06:46 PM MST 2024
    chronos@penguin:~$ sudo apt-get purge golang
    Reading package lists... Done
    Building dependency tree... Done
    Reading state information... Done
    The following packages were automatically installed and are no longer required:
      golang-1.19 golang-1.19-doc golang-1.19-go golang-1.19-src golang-doc golang-go
      golang-src libpkgconf3 pkg-config pkgconf pkgconf-bin
    Use 'sudo apt autoremove' to remove them.
    The following packages will be REMOVED:
      golang*
    0 upgraded, 0 newly installed, 1 to remove and 0 not upgraded.
    After this operation, 12.3 kB disk space will be freed.
    Do you want to continue? [Y/n] 
    (Reading database ... 69029 files and directories currently installed.)
    Removing golang:arm64 (2:1.19~1) ...
    chronos@penguin:~$ sudo apt autoremove
    Reading package lists... Done
    Building dependency tree... Done
    Reading state information... Done
    The following packages will be REMOVED:
      golang-1.19 golang-1.19-doc golang-1.19-go golang-1.19-src golang-doc golang-go
      golang-src libpkgconf3 pkg-config pkgconf pkgconf-bin
    0 upgraded, 0 newly installed, 11 to remove and 0 not upgraded.
    After this operation, 462 MB disk space will be freed.
    Do you want to continue? [Y/n] 
    (Reading database ... 69026 files and directories currently installed.)
    Removing golang-1.19 (1.19.8-2) ...
    Removing golang-doc (2:1.19~1) ...
    Removing golang-1.19-doc (1.19.8-2) ...
    Removing golang-go:arm64 (2:1.19~1) ...
    Removing golang-1.19-go (1.19.8-2) ...
    Removing golang-src (2:1.19~1) ...
    Removing golang-1.19-src (1.19.8-2) ...
    Removing pkg-config:arm64 (1.8.1-1) ...
    Removing pkgconf:arm64 (1.8.1-1) ...
    Removing pkgconf-bin (1.8.1-1) ...
    Removing libpkgconf3:arm64 (1.8.1-1) ...
    Processing triggers for man-db (2.11.2-2) ...
    Processing triggers for libc-bin (2.36-9+deb12u7) ...
    chronos@penguin:~$ which go
    chronos@penguin:~$ date
    Mon Jul 15 07:08:27 PM MST 2024
    chronos@penguin:~$ 
    --------
    
     * Renstall Go From go.dev
    
    --------
    chronos@penguin:~$ ls -a /usr/local
    .  ..  bin  etc  games  include  lib  libexec  man  sbin  share  src
    chronos@penguin:~$ uname -a
    Linux penguin 6.6.30-02725-g3e8c91b46252 #1 SMP PREEMPT Fri, 21 Jun 2024 04:09:40 +0000 aarch64 GNU/Linux
    chronos@penguin:~$ cd /usr/local
    chronos@penguin:/usr/local$ sudo wget https://go.dev/dl/go1.22.5.linux-arm64.tar.gz
    --2024-07-15 19:16:20--  https://go.dev/dl/go1.22.5.linux-arm64.tar.gz
    Resolving go.dev (go.dev)... 216.239.32.21, 216.239.36.21, 216.239.38.21, ...
    Connecting to go.dev (go.dev)|216.239.32.21|:443... connected.
    HTTP request sent, awaiting response... 302 Found
    Location: https://dl.google.com/go/go1.22.5.linux-arm64.tar.gz [following]
    --2024-07-15 19:16:21--  https://dl.google.com/go/go1.22.5.linux-arm64.tar.gz
    Resolving dl.google.com (dl.google.com)... 74.125.137.136, 74.125.137.190, 74.125.137.93, ...
    Connecting to dl.google.com (dl.google.com)|74.125.137.136|:443... connected.
    HTTP request sent, awaiting response... 200 OK
    Length: 65911806 (63M) [application/x-gzip]
    Saving to: ‘go1.22.5.linux-arm64.tar.gz’
    
    go1.22.5.linux-arm64. 100%[======================>]  62.86M  4.79MB/s    in 13s     
    
    2024-07-15 19:16:34 (4.76 MB/s) - ‘go1.22.5.linux-arm64.tar.gz’ saved [65911806/65911806]
    
    • Make an SHA256SUM File

    The ed and ex editors are great for showing others exactly what happened in the editor.

    chronos@penguin:/usr/local$ sudo ed go1.22.5.linux-arm64.tar.gz.SHA256SUM
    go1.22.5.linux-arm64.tar.gz.SHA256SUM: No such file or directory
    a
    8d21325bfcf431be3660527c1a39d3d9ad71535fabdf5041c826e44e31642b5a
    . 
    s/$/  go1.22.5.linux-arm64.tar.gz
    8d21325bfcf431be3660527c1a39d3d9ad71535fabdf5041c826e44e31642b5a  go1.22.5.linux-arm64.tar.gz
    w
    94
    q
    chronos@penguin:/usr/local$ sha256sum -c go1.22.5.linux-arm64.tar.gz.SHA256SUM 
    go1.22.5.linux-arm64.tar.gz: OK
    
    • Check The Tar File and Extract

    Tar is really old, and so doesn't need the modern "-" in front of the tvzf and xvf flags.

    chronos@penguin:/usr/local$ tar tvzf go1.22.5.linux-arm64.tar.gz | wc
      14305   85830 1255155
    chronos@penguin:/usr/local$ tar tvzf go1.22.5.linux-arm64.tar.gz | less
      [ . . . ]
    -rwxr-xr-x 0/0        12119474 2024-06-27 13:11 go/bin/go
      [ . . . ]
    chronos@penguin:/usr/local$ sudo tar xvf go1.22.5.linux-arm64.tar.gz 
      [ . . . ]
    chronos@penguin:/usr/local$ cd go
    chronos@penguin:/usr/local/go$ ls
    api  codereview.cfg   doc     lib      misc     pkg        SECURITY.md  test
    bin  CONTRIBUTING.md  go.env  LICENSE  PATENTS  README.md  src          VERSION
    chronos@penguin:/usr/local/go$ ls -l bin/go
    -rwxr-xr-x 1 root root 12119474 Jun 27 13:11 bin/go
    
    • Adjust PATH Environment Variable
    chronos@penguin:/usr/local/go$ cd
    chronos@penguin:~$ export PATH=$PATH:/usr/local/go/bin:/home/chronos/go/bin
    chronos@penguin:~$ echo $PATH
    /home/chronos/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/usr/local/go/bin:/home/chronos/go/bin
    chronos@penguin:~$ go version
    go version go1.22.5 linux/arm64
    chronos@penguin:~$ ls go
    pkg
    
    • Install eliben/gemini-cli
    chronos@penguin:~$ date
    Mon Jul 15 07:51:46 PM MST 2024
    chronos@penguin:~$ go install github.com/eliben/gemini-cli@latest
    go: downloading github.com/chewxy/math32 v1.10.1
    go: downloading github.com/google/generative-ai-go v0.11.2
    go: downloading github.com/mattn/go-sqlite3 v1.14.22
    go: downloading github.com/spf13/cobra v1.8.0
    go: downloading google.golang.org/api v0.176.1
    go: downloading github.com/spf13/pflag v1.0.5
    go: downloading cloud.google.com/go/ai v0.4.0
    go: downloading google.golang.org/protobuf v1.33.0
    go: downloading cloud.google.com/go v0.112.2
    go: downloading github.com/google/uuid v1.6.0
    go: downloading github.com/googleapis/gax-go/v2 v2.12.4
    go: downloading cloud.google.com/go/longrunning v0.5.6
    go: downloading google.golang.org/grpc v1.63.2
    go: downloading google.golang.org/genproto/googleapis/api v0.0.0-20240415180920-8c6c420018be
    go: downloading google.golang.org/genproto/googleapis/rpc v0.0.0-20240415180920-8c6c420018be
    go: downloading github.com/golang/protobuf v1.5.4
    go: downloading golang.org/x/net v0.24.0
    go: downloading golang.org/x/sys v0.19.0
    go: downloading golang.org/x/text v0.14.0
    go: downloading cloud.google.com/go/auth v0.3.0
    go: downloading go.opencensus.io v0.24.0
    go: downloading cloud.google.com/go/auth/oauth2adapt v0.2.2
    go: downloading golang.org/x/oauth2 v0.19.0
    go: downloading go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0
    go: downloading cloud.google.com/go/compute/metadata v0.3.0
    go: downloading github.com/google/s2a-go v0.1.7
    go: downloading go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0
    go: downloading golang.org/x/time v0.5.0
    go: downloading go.opentelemetry.io/otel v1.24.0
    go: downloading github.com/felixge/httpsnoop v1.0.4
    go: downloading go.opentelemetry.io/otel/metric v1.24.0
    go: downloading go.opentelemetry.io/otel/trace v1.24.0
    go: downloading github.com/googleapis/enterprise-certificate-proxy v0.3.2
    go: downloading github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da
    go: downloading github.com/go-logr/logr v1.4.1
    go: downloading golang.org/x/sync v0.7.0
    go: downloading github.com/go-logr/stdr v1.2.2
    go: downloading golang.org/x/crypto v0.22.0
    
    • Set GEMINI_API_KEY Environment Variable
    chronos@penguin:~$ export GEMINI_API_KEY=REDACTED
    chronos@penguin:~$ which gemini-cli
    /home/chronos/go/bin/gemini-cli
    
    • Test That The gemini-cli Go Binary Works
    chronos@penguin:~$ gemini-cli help
    This tool lets you interact with Google's Gemini LLMs from the
    command-line.
    
    Usage:
      gemini-cli <command> [flags]
      gemini-cli [command]
    
    Available Commands:
      chat        Interactive chat with a model
      counttok    Count tokens in content
      embed       Access Gemini embedding models
      help        Help about any command
      models      List supported Gemini models
      prompt      Send a prompt to a Gemini model
    
    Flags:
      -h, --help           help for gemini-cli
          --key string     API key for Google AI
          --model string   Name of model to use; see https://ai.google.dev/models/gemini (default "gemini-1.0-pro")
          --proxy string   URL of proxy server to use for the connection
      -v, --version        print version info and exit
    
    Use "gemini-cli [command] --help" for more information about a command.
    
    • Try A Test Prompt -- Talk Directly With Google Gemini Via The Command Line!

    The lines in Gemini's responses are folded nicely in my terminal, but not here on LES.

    chronos@penguin:~$ gemini-cli prompt "why is the sky blue?"
    The sky is blue because of a phenomenon called Rayleigh scattering.
    
    Sunlight is composed of a range of wavelengths, from shortwave (blue) to longwave (red). When sunlight enters the atmosphere, it interacts with molecules of nitrogen and oxygen. These molecules are much smaller than the wavelength of light, so they scatter the light in all directions.
    
    The shorter wavelength (blue) light is scattered more efficiently than the longer wavelength (red) light. This is because blue light has a shorter wavelength, which means it has more energy and is more easily scattered by molecules. As a result, the sky appears blue during the day.
    
    At sunrise and sunset, the sunlight has to travel through more of the atmosphere to reach our eyes. This means that more of the blue light is scattered away, and the sky appears red or orange.
    chronos@penguin:~$ 
    

    I hope everyone gets the servers they want!

  • Not_OlesNot_Oles Hosting ProviderContent Writer

    Is gemini-1.5-pro-latest Significantly Better?

    Just for a fun comparison, here's a reply to "Why is the sky blue?" from gemini-1.5-pro-latest. Please compare this response with the above response given during the eliben/gemini-cli Chromebook install.

    Initially I'm pasting the command line output copied from my terminal, but without added Github fences. Therefore, initially, long lines will fold here.

    The raw Gemini terminal output is in markdown, so, when pasted here, certain items do display here according to the markdown.

    Further below, for comparison, I'm repasting the identical gemini-1.5-pro-latest terminal output, but with Github fences added. Except for the lines not folding, the output looks the same as in my terminal.


    • No Added Github Fences

    chronos@penguin:~$ gemini-cli prompt "why is the sky blue?" --model "gemini-1.5-pro-latest"
    The sky appears blue due to a phenomenon called Rayleigh scattering. Here's a breakdown:

    1. Sunlight Enters the Atmosphere:
    - Sunlight is made up of all the colors of the rainbow.
    - When sunlight enters the Earth's atmosphere, it collides with tiny particles of air, like nitrogen and oxygen molecules.

    2. Scattering of Light:
    - These air molecules are much smaller than the wavelengths of visible light.
    - This size difference causes the sunlight to scatter in all directions.
    - Rayleigh scattering states that shorter wavelengths of light (blue and violet) are scattered more effectively than longer wavelengths (red and orange).

    3. Why We See Blue:
    - Since blue and violet light get scattered the most, it reaches our eyes from many directions in the sky.
    - Our eyes are more sensitive to blue light than violet.
    - The combination of these factors makes the sky appear blue.

    Why Not Violet?

    You might wonder why the sky isn't violet if it scatters the most. This is because:

    • The sun emits slightly less violet light compared to blue.
    • Our eyes are less sensitive to violet light.

    Sunsets and Sunrises:

    During sunrise and sunset, sunlight travels through more of the atmosphere. The longer path means that more blue light is scattered away, allowing longer wavelengths like red and orange to dominate, resulting in colorful sunrises and sunsets.

    chronos@penguin:~$


    • With Added Github Fences

    Here's the same output again, but with Github fences added so as to render here as command line. But, unlike in my terminal, long lines are not folded here.

    chronos@penguin:~$ gemini-cli prompt "why is the sky blue?" --model "gemini-1.5-pro-latest"
    The sky appears blue due to a phenomenon called **Rayleigh scattering**. Here's a breakdown:
    
    **1. Sunlight Enters the Atmosphere:**
       - Sunlight is made up of all the colors of the rainbow.
       - When sunlight enters the Earth's atmosphere, it collides with tiny particles of air, like nitrogen and oxygen molecules.
    
    **2. Scattering of Light:**
       - These air molecules are much smaller than the wavelengths of visible light.
       - This size difference causes the sunlight to scatter in all directions.
       - **Rayleigh scattering** states that shorter wavelengths of light (blue and violet) are scattered more effectively than longer wavelengths (red and orange).
    
    **3. Why We See Blue:**
       - Since blue and violet light get scattered the most, it reaches our eyes from many directions in the sky. 
       - Our eyes are more sensitive to blue light than violet. 
       - The combination of these factors makes the sky appear blue.
    
    **Why Not Violet?**
    
    You might wonder why the sky isn't violet if it scatters the most. This is because:
    
    * The sun emits slightly less violet light compared to blue.
    * Our eyes are less sensitive to violet light.
    
    **Sunsets and Sunrises:**
    
    During sunrise and sunset, sunlight travels through more of the atmosphere. The longer path means that more blue light is scattered away, allowing longer wavelengths like red and orange to dominate, resulting in colorful sunrises and sunsets. 
    
    chronos@penguin:~$ 
    

    • Is gemini-1.5-pro-latest Significantly Better?

    Is gemini-1.5-pro-latest significantly better on organizing and on analytical depth? The default in the previous post, above, as shown in the help output, is gemini-1.0-pro. I have been using Gemini for a few weeks. According to the benefits page shown to me at one.google.com, the Gemini version is gemini-1.5-pro.

    gemini-1.5-pro-latest is my favorite so far! And it's free with eliben/gemini-cli and the Gemini API, at least for now, and at least from some countries.

    I hope everyone gets the servers they want!

  • Not_OlesNot_Oles Hosting ProviderContent Writer

    Compare Google Gemini 1.5 Pro And 1.5 Pro Latest Answers To Questions About sed Syntax

    I enjoyed investing some time this afternoon trying Google AI Studio. Really nice! The AI Studio Quickstart describes Google AI Studio as "a browser-based IDE for prototyping with generative models. Google AI Studio lets you quickly try out models and experiment with different prompts. When you've built something you're happy with, you can export it to code in your preferred programming language and use the Gemini API with it."

    If you want to compare the latest version of Gemini 1.5 Pro with the "regular" version, head over to Google AI Studio, select Gemini 1.5 Pro in the upper right hand corner under Model, and paste one of the questions below into the prompt box.

    Isn't it cool that Google Gemini can do this?

    chronos@penguin:~$ date
    Tue Jul 16 10:22:32 PM MST 2024
    chronos@penguin:~$ gemini-cli prompt "Please give me the syntax for using sed to make a multiline Linux file just one line." --model gemini-1.5-pro-latest
    ```bash
    sed ':a;N;$!ba;s/\n//g' input_file > output_file
    ```
    
    **Explanation:**
    
    * **`:a`**: This defines a label named "a".
    * **`N`**: This appends the next line of input to the pattern space, along with a newline character.
    * **`$!ba`**: This checks if we are at the last line (`$`). If not (`!`), it branches (`b`) back to the label "a". This loop continues until the last line is reached.
    * **`s/\n//g`**: This command is executed only after the loop is finished (i.e., all lines are in the pattern space). It replaces all newline characters (`\n`) with nothing (effectively joining all lines).
    * **`input_file`**: This is the file you want to modify.
    * **`>`**: This redirects the output to a file.
    * **`output_file`**: This is the name of the file where the modified content will be saved.
    
    **Example:**
    
    Let's say you have a file named `multiline.txt` with the following content:
    
    ```
    This is line 1.
    This is line 2.
    This is line 3.
    ```
    
    Running the following command:
    
    ```bash
    sed ':a;N;$!ba;s/\n//g' multiline.txt > singleline.txt
    ```
    
    will create a new file named `singleline.txt` with the following content:
    
    ```
    This is line 1.This is line 2.This is line 3.
    ```
    
    **Note:**
    
    This command modifies the whitespace within the lines. If you want to preserve the whitespace, you can use a different character as a temporary separator and then replace it with a space.
    
    chronos@penguin:~$ gemini-cli prompt "Please give me the syntax for using sed to make a multiline Linux file just one line, with newlines replaced by one space." --model 
    gemini-1.5-pro-latest
    ```bash
    sed ':a;N;$!ba;s/\n/ /g' input_file > output_file
    ```
    
    Here's how it works:
    
    * **`:a`**: This defines a label named "a".
    * **`N`**: This appends the next line of input to the pattern space, which is where `sed` performs its operations.
    * **`$!ba`**: This is a conditional branch. `$` represents the last line of the file. `$!` means "not the last line". So, if the current line is not the last line, `ba` branches back to the label "a", effectively creating a loop that reads the entire file into the pattern space.
    * **`s/\n/ /g`**: This is the substitution command. It replaces all newline characters (`\n`) with a single space (` `). The `g` flag ensures that all occurrences of newlines are replaced, not just the first one on each line. 
    * **`input_file`**: This is the name of the input file you want to process.
    * **`>`**: This redirects the output of the command to a file.
    * **`output_file`**: This is the name of the file where you want to save the single-line output.
    
    **Example:**
    
    Let's say you have a file named `multiline.txt` with the following content:
    
    ```
    This is 
    a multiline
    file.
    ```
    
    Running the `sed` command:
    
    ```bash
    sed ':a;N;$!ba;s/\n/ /g' multiline.txt > singleline.txt
    ```
    
    will create a file named `singleline.txt` with the content:
    
    ```
    This is a multiline file. 
    ```
    
    chronos@penguin:~$ 
    

    Here is me trying Gemini's suggestions.

    chronos@penguin:~/gemini-cli$ ed multiline.txt
    multiline.txt: No such file or directory
    a
    This is line 1.
    This is line 2.
    This is line 3.
    .
    w
    48
    q
    chronos@penguin:~/gemini-cli$ sed 's/\n//g' multiline.txt # Doesn't work.
    This is line 1.
    This is line 2.
    This is line 3.
    chronos@penguin:~/gemini-cli$ sed ':a;N;$!ba;s/\n//g' $_ # No space between last two slashes. "$_" means "previous command's last argument"
    This is line 1.This is line 2.This is line 3.
    chronos@penguin:~/gemini-cli$ sed ':a;N;$!ba;s/\n/ /g' multiline.txt # Space between last two slashes.
    This is line 1. This is line 2. This is line 3.
    chronos@penguin:~/gemini-cli$ 
    

    I hope everyone gets the servers they want!

  • vyasvyas OGSenpai

    https://x.com/GoogleCloudTech/status/1813589479644393932

    Gemini and Gemma

    ( though some still prefer Emma)

    Thanked by (1)Not_Oles
  • Not_OlesNot_Oles Hosting ProviderContent Writer
    chronos@penguin:~/gemini-cli$ date -u
    Thu Jul 18 03:19:17 AM UTC 2024
    chronos@penguin:~/gemini-cli$ gemini-cli models
    Name                                    Version Max In  Max Out Description
    
    models/chat-bison-001                   001     4096    1024    A legacy text-only model optimized for chat conversations
    models/text-bison-001                   001     8196    1024    A legacy model that understands text and generates text as an output
    models/embedding-gecko-001              001     1024    1       Obtain a distributed representation of a text.
    models/gemini-1.0-pro                   001     30720   2048    The best model for scaling across a wide range of tasks
    models/gemini-1.0-pro-001               001     30720   2048    The best model for scaling across a wide range of tasks. This is a stable model that supports tuning.
    models/gemini-1.0-pro-latest            001     30720   2048    The best model for scaling across a wide range of tasks. This is the latest model.
    models/gemini-1.0-pro-vision-latest     001     12288   4096    The best image understanding model to handle a broad range of applications
    models/gemini-1.5-flash                 001     1048576 8192    Fast and versatile multimodal model for scaling across diverse tasks
    models/gemini-1.5-flash-001             001     1048576 8192    Fast and versatile multimodal model for scaling across diverse tasks
    models/gemini-1.5-flash-latest          001     1048576 8192    Fast and versatile multimodal model for scaling across diverse tasks
    models/gemini-1.5-pro                   001     2097152 8192    Mid-size multimodal model that supports up to 2 million tokens
    models/gemini-1.5-pro-001               001     2097152 8192    Mid-size multimodal model that supports up to 2 million tokens
    models/gemini-1.5-pro-latest            001     2097152 8192    Mid-size multimodal model that supports up to 2 million tokens
    models/gemini-pro                       001     30720   2048    The best model for scaling across a wide range of tasks
    models/gemini-pro-vision                001     12288   4096    The best image understanding model to handle a broad range of applications
    models/embedding-001                    001     2048    1       Obtain a distributed representation of a text.
    models/text-embedding-004               004     2048    1       Obtain a distributed representation of a text.
    models/aqa                              001     7168    1024    Model trained to return answers to questions that are grounded in provided sources, along with estimating answerable probability.
    chronos@penguin:~/gemini-cli$ 
    

    I hope everyone gets the servers they want!

  • Not_OlesNot_Oles Hosting ProviderContent Writer

    Multiline Prompts With eliben/gemini-cli ?

    What happens if I want to use eliben/gemini-cli to send Google Gemini a multiline "prompt" or "chat" message -- for example a question about code together with the relevant multiline program code or code snippet?

    eliben/gemini-cli has separate commands which include "prompt" for one-off, single prompts and "chat" for continuing chats. The basic "prompt" syntax is

    gemini-cli prompt "text of prompt goes here" <--flags>

    and the basic "chat" syntax is

    gemini-cli chat <--flags>.

    Also, at least for "prompt," eliben/gemini-cli syntax uses a dash "-" to represent standard input. As shown below, the dash and standard input seem to work for one-off initial, aggregated, multiline prompts.

    However, the dash seems possibly ineffective to send a multiline initial prompt at the beginning of a hopefully continuing back and forth chat with Gemini. Moreover, I do not yet understand how to send a multiline prompt from within the continuing chat interface at a time subsequent to the initial prompt of the continuing chat.

    • Here is an example of an apparently successful multiline initial prompt for a one-off interaction with Google Gemini. For extra fun, "prompt" is both the name of a file and the name of a gemini-cli command.
    chronos@penguin:~$ cat prompt 
    This is merely a test of multiline prompts. This is line 1.
    Here is line 2 of the multiline prompt test.
    Here is line 3. Can you see all three lines? Did you receive all three lines together as one prompt or did you receive them as three separate prompts?
    chronos@penguin:~$ cat prompt | gemini-cli prompt - --model "gemini-1.5-pro-latest"
    As an AI, I receive the entirety of your prompt at once, regardless of line breaks.  So, yes, I can see all three lines and received them together as a single prompt. 
    chronos@penguin:~$
    
    • The standard input dash doesn't seem to work with the "chat" command. Although it looks like Gemini might see the entire multiple line prompt, a googleapi Error 429 occurs, and the chat terminates. Error 429 is "Too many requests."
    chronos@penguin:~$ cat prompt 
    This is merely a test of multiline prompts. This is line 1.
    Here is line 2 of the multiline prompt test.
    Here is line 3. Can you see all three lines? Did you receive all three lines together as one prompt or did you receive them as three separate prompts?
    chronos@penguin:~$ cat prompt | gemini-cli chat - --model "gemini-1.5-pro-latest"
    Chatting with gemini-1.5-pro-latest
    Type 'exit' or 'quit' to exit
    > Please
     feel free to continue your multi-line prompt! I understand this is a test
    , and I am ready to receive and process all the lines you provide. 😊
    
    
    > Excellent
    ! I have received "Here is line 2 of the multiline prompt test
    ." I am eagerly awaiting any further lines you wish to add. 😉 
    
    > Yes
    , I can see all three lines of your prompt! 😄 
    
    To answer
     your question, I received all three lines together as **one single prompt**. Even
     though you sent them separately, the system compiles them into a single prompt before I get to see it. This allows me to understand the full context of your request
    . 
    
    Feel free to continue the test or ask me anything else! 
    
    > I
    'm ready and waiting for your next instruction or question! 😊  Don'
    t hesitate to ask anything, even if it's just about how multi-
    line prompts work. 
    
    > 2024/07/16 14:42:39 googleapi: Error 429:
    chronos@penguin:~$ 
    
    • What I tried next was to use sed to reduce the multiline hello.c to a single line. Then I copied and pasted that single line into my Chromebook's hterm to send a single line prompt to Gemini and perhaps reduce the number of requests. However, Error 500, Internal Server Error, happened repeatedly.
    chronos@penguin:~/gemini-cli$ cat hello.c
    #include <stdio.h>
    int main() {
       // printf() displays the string inside quotation
       printf("Hello, World!\n");
       return 0;
    }
    chronos@penguin:~/gemini-cli$ sed ':a;N;$!ba;s/\n/ /g' hello.c
    #include <stdio.h> int main() {    // printf() displays the string inside quotation    printf("Hello, World!\n");    return 0; }
    chronos@penguin:~/gemini-cli$ gemini-cli chat --model gemini-1.5-pro-latest
    Chatting with gemini-1.5-pro-latest
    Type 'exit' or 'quit' to exit
    > Is the following C code okay? #include <stdio.h> int main() {    // printf() displays the string inside quotation    printf("Hello, World!\n");    return 0; }
    2024/07/18 19:36:38 googleapi: Error 500:
    chronos@penguin:~/gemini-cli$ gemini-cli chat --model gemini-1.5-pro-latest
    Chatting with gemini-1.5-pro-latest
    Type 'exit' or 'quit' to exit
    > Is the following C code okay? '#include <stdio.h> int main() {    // printf() displays the string inside quotation    printf("Hello, World!\n");    return 0; }'
    2024/07/18 19:37:36 googleapi: Error 500:
    chronos@penguin:~/gemini-cli$ gemini-cli chat --model gemini-1.5-pro-latest
    Chatting with gemini-1.5-pro-latest
    Type 'exit' or 'quit' to exit
    > What is googleapi: Error 500?
    A
     `googleapi: Error 500` generally signals an **internal server
     error** coming from Google's side.  This means something went wrong with
     Google's servers or the specific API service you're trying to access, and it's not due to an issue with your code or request.
    
    
    Here's a breakdown:
    
    **What it means:**
    
    * **"googleapi"**:  Indicates the error originates from a Google API (Application Programming
     Interface).
    * **"Error 500"**:  The standard HTTP status code for an internal server error.
    
    **Possible causes on Google's end:**
    
    * **Temporary server outage or maintenance:** Google's servers
     might be experiencing a brief downtime.
    * **API service disruption:** The specific Google service you're using could have a temporary glitch.
    * **Unexpected errors in Google's code:**  Just like any software, Google's
     code can encounter unforeseen errors.
    
    **What you can do:**
    
    1. **Check the Google Workspace Status Dashboard:**  See if there are any reported outages or issues with the specific service you're using: [https://www.google.com/appsstatus](https://www.google.com/apps
    status)
    2. **Retry your request later:** Internal server errors are often temporary. Wait a few minutes and try again.
    3. **Examine your request:** While less likely, double-check that your API request is correctly formatted. Refer to the API documentation for guidance.
    4. **Contact Google Cloud
     Support (if applicable):** If you're using a paid Google Cloud API and the issue persists, reach out to their support for assistance.
    
    **Important Note:**  You generally don't need to change your code to fix a 500 error, as it indicates a problem on Google's end
    .  Focus on verifying the service status and retrying your request after some time. 
    
    > Are you aware of any internal server issues with this service here as we are using it now?
    2024/07/18 19:43:54 googleapi: Error 500:
    chronos@penguin:~/gemini-cli$ 
    
    • A few minutes later Gemini seemed working again, both in "prompt" and in "chat" mode. What I tried next was without starting a new chat, telling Gemini in the context of an existing chat, in advance, to expect some code in my next prompt. Gemini said okay, and that it was ready and waiting. Then I pasted the single line output from sed. This time, it worked. Gemini answered, discussed the code, and a new ">" appeared so the chat probably could continue.
    chronos@penguin:~/gemini-cli$ date
    Thu Jul 18 07:47:28 PM MST 2024
    chronos@penguin:~/gemini-cli$ gemini-cli prompt "Why is the sky blue?" --model gemini
    -1.5-pro-latest
    The sky appears blue due to a phenomenon called **Rayleigh scattering**. Here's how it works:
    
    1. **Sunlight enters the atmosphere:** Sunlight, appearing white, is actually a mixture of all colors of the rainbow.
    2. **Scattering of light:** As sunlight passes through the Earth's atmosphere, it collides with tiny air molecules (mostly nitrogen and oxygen). This causes the light to scatter in different directions.
    3. **Shorter wavelengths scatter more:**  Blue and violet light have shorter wavelengths compared to other colors in the visible spectrum. This means they are scattered more strongly by the air molecules.
    4. **Our eyes' perception:** While violet light is scattered even more than blue, our eyes are less sensitive to violet.  Therefore, we perceive the sky as predominantly blue.
    
    **In simpler terms:** Imagine a tiny ball hitting a larger ball. The smaller ball will bounce off in a more random direction. Similarly, blue and violet light, being "smaller" wavelengths, get scattered more by air molecules, making the sky appear blue to us.
    
    **Why not violet then?** Although violet light scatters more, our eyes are more sensitive to blue light. Additionally, sunlight contains more blue light than violet light. This combination makes the sky appear blue rather than violet. 
    
    **Interesting fact:**  During sunrise and sunset, the sunlight travels through more of the atmosphere. This increased scattering effect causes the longer wavelengths like orange and red to become more visible, resulting in those beautiful colors in the sky. 
    
    chronos@penguin:~/gemini-cli$ gemini-cli chat --model gemini-1.5-pro-latest
    Chatting with gemini-1.5-pro-latest
    Type 'exit' or 'quit' to exit
    > Why is the sky blue?
    The
     sky appears blue due to a phenomenon called **Rayleigh scattering**. Here's
     how it works:
    
    1. **Sunlight Enters the Atmosphere:** Sunlight,
     which appears white to us, is actually made up of all the colors of the rainbow.
    
    2. **Scattering by Air Molecules:** As sunlight passes through
     the Earth's atmosphere, it collides with tiny air molecules (mostly nitrogen and oxygen). This causes the light to scatter in different directions.
    
    3.
     **Shorter Wavelengths Scatter More:**  Blue and violet light have shorter wavelengths than other colors in the visible spectrum. This means they are scattered more strongly by the air molecules than longer wavelengths like red and orange.
    
    4. **Our
     Eyes' Perception:**  While violet light is scattered even more than blue, our eyes are less sensitive to violet.  As a result, the scattered blue light reaches our eyes from all directions, making the sky appear blue.
    
    **Why
     isn't the sky violet then?**
    
    Although violet light scatters more, our eyes are more sensitive to blue light.  Additionally, sunlight contains a broader range of blue wavelengths compared to violet.
    
    **What about sunsets and sunrises?**
    
    During sunrise and sunset, the sunlight has to travel through a
     larger portion of the atmosphere to reach our eyes. This means the shorter wavelengths (blue and violet) are scattered away so much that we mostly see the longer wavelengths, like red and orange, giving the sky those beautiful hues. 
    
    > Great! Thanks! When it is my turn to talk again I want to send you a small hello world program in the C programming language. I want you to look at the program, please, and tell me if it should compile and run. Thanks again
    I
    'm ready! Send me your C code whenever you're ready. I
    'll do my best to analyze it and tell you if I think it should
     compile and run correctly.  I'm looking forward to seeing your "hello world" program! 😄 
    
    > C #include <stdio.h> int main() {    // printf() displays the string inside quotation    printf("Hello, World!");    return 0; }
    You
     got it! That C code should compile and run perfectly fine.  Here'
    s why:
    
    * **`#include <stdio.h>`:** This
     line correctly includes the standard input/output library, which is necessary for using the `printf` function.
    * **`int main() { ... }`
    :**  This defines the `main` function, which is the entry point of any C program. The `int` before `main` indicates that the function
     will return an integer value.
    * **`printf("Hello, World!");`:** This line uses the `printf` function to print the text "Hello, World!" to the console.
    * **`return 0;`
    :** This line ends the `main` function and signals to the operating system that the program executed successfully (by convention, returning 0 indicates success).
    
    **To run your program:**
    
    1. **Save it:** Save the code as
     a `.c` file (e.g., `hello.c`).
    2. **Compile it:** Use a C compiler (like GCC) to compile the code:
       ```bash
       gcc hello.c -o hello
       ```
    3. **Run it:** Run the compiled executable:
    
       ```bash
       ./hello 
       ```
    
    This should print "Hello, World!" to your console. 
    
    > quit
    chronos@penguin:~/gemini-cli$ 
    

    I don't understand exactly what the 500 errors were. Even though the 500 error isn't supposed to be caised by my input, maybe it somehow was. And I don't understand why telling Gemini in advance that I was going to send code might be or whether it actually was helpful.

    I see some unusual line breaks in Gemini's responses. What I posted here was copied and pasted directly from my Chromebook hterm interface. Maybe there is some issue between eliben/gemini-cli and my Chromebook's hterm? Maybe I should try a different terminal interface on my end?

    Using eliben/gemini-cli, standard input seems to work fine in "prompt" mode. In "chat" mode, I also seem to be able to send Gemini multiline prompts by using sed to reduce the multiline prompts to a single line and then using copy and paste after telling Gemini what to expect.

    But, how can eliben/gemini-cli get a multiline, initial "chat" mode prompt or a multiline subsequent "chat" mode prompt to Gemini via some method which looks like traditional shell-fu: standard input plus a pipe, ":r" to read a file, "!" to escape temporarily to shell magic, or something else other than copy and paste? Thanks! <3

    I hope everyone gets the servers they want!

  • Not_OlesNot_Oles Hosting ProviderContent Writer

    @vyas said:
    https://github.com/karthink/gptel

    Happy Monday morning !

    Wow! I took a quick look and it looks great! Right in the spirit of emacs with everything included!

    Every few years I do try emacs again. I wish I could enjoy the Ctrl-this, Ctrl-that sequences more. I guess I've never been a Ctrl freak. :-) Or a Meta freak. :-)

    Recently I have been looking at a bit of Lisp stuff. It's so scary! But quite a few of the people involved with Lisp actually talk about having fun. Really! :-?

    I know that there are vi-like key bindings for emacs. I wonder if someone has written ed key bindings for emacs. That would be fun! I could use ed-ified emacs and feel right at home. :-) I bet somebody has done it!

    Happy Monday morning to you too! <3

    Thanked by (1)vyas

    I hope everyone gets the servers they want!

  • vyasvyas OGSenpai
    edited July 22

    Greetings,
    I thought you might like the post, the project certainly seems to be well thought out. I like that they offer How Tos for specific LLMs... PerplexityAi and groq for e.g. Many other (non OSS) projects seem to limit themselves to "here's how to configure openAI key".. almost an equivalent of "Here's how you install this software on Windows".

    I recall watching these two videos on "How to use ed" a while back.. They were.... informative.

    Links to Youtube videos below
      

    and

      

    And of course I had to ask Perplexity/ Sonar (they use llama at back end) the very question you posed..

    here is the result..

     I couldn't find any specific projects or packages that provide ED keybindings for Emacs. ED is a line editor and the predecessor of more modern text editors like Emacs and Vim, so it might not be a common request to have ED keybindings in Emacs.
    
    However, Emacs is highly customizable, and it is possible to create custom keybindings to emulate ED's behavior. You can define your own keybindings in your Emacs configuration file (~/.emacs or ~/.emacs.d/init.el) to map Emacs commands to ED-style key sequences.
    
    Here's an example of how you might define some basic ED-style keybindings in Emacs:
    
    
    Click to expand (global-set-key (kbd "C-P") 'previous-line) (global-set-key (kbd "C-N") 'next-line) (global-set-key (kbd "C-A") 'beginning-of-line) (global-set-key (kbd "C-E") 'end-of-line) (global-set-key (kbd "C-D") 'delete-char) (global-set-key (kbd "C-K") 'kill-line) (global-set-key (kbd "C-C") 'save-buffer) In this example, the keybindings C-P, C-N, C-A, C-E, C-D, C-K, and C-C are mapped to the Emacs commands for moving to the previous line, next line, beginning of line, end of line, deleting a character, killing the rest of the line, and saving the buffer, respectively. You can add or modify these keybindings to match the ED editor's behavior as closely as you like. Keep in mind that this is just a basic example, and you may need to define additional keybindings or customize Emacs's behavior further to more closely emulate ED.
    Thanked by (1)Not_Oles
  • Not_OlesNot_Oles Hosting ProviderContent Writer

    I love Perplexity's example ed key bindings for emacs!

    Thanks for posting!

    Thanked by (1)vyas

    I hope everyone gets the servers they want!

  • @Not_Oles said: I wonder if someone has written ed key bindings for emacs.

    There is https://github.com/ryanprior/ed-mode

  • Not_OlesNot_Oles Hosting ProviderContent Writer

    @cmeerw said:

    @Not_Oles said: I wonder if someone has written ed key bindings for emacs.

    There is https://github.com/ryanprior/ed-mode

    Super fantabulous! Thank you SO MUCH! <3

    I hope everyone gets the servers they want!

  • Not_OlesNot_Oles Hosting ProviderContent Writer
    edited July 22

    I like to read About pages. So, when I look at projects on Github, as I did just now, thanks again to @cmeerw, besides sometimes looking at the code, I often look at the websites of the developers and read those sites' About pages.

    This morning's About harvest was great! Starting from https://github.com/ryanprior/ed-mode, there are two developers, Ryan and Brian, so two developer websites with About pages.

    Then I found Michael Rose's About page because of the link to the MadeMistakes Jekyll theme on Brian's About page.

    Here's the summary for my notes:

    https://github.com/ryanprior/ed-mode

    Here's an appreciative quote from Brian's About page:

    "I also enjoy using text editors such as acme, sam, emacs, vim, and, yes, even ed(1)! (Especially ed(1)!)."

    I hope everyone gets the servers they want!

Sign In or Register to comment.