From a7dd9580a5df7199f132ce7058fd2e05ddfef9e2 Mon Sep 17 00:00:00 2001 From: mappu Date: Sat, 8 Apr 2023 15:30:37 +1200 Subject: [PATCH] doc/README: initial commit --- README.md | 32 ++++++++++++++++++++++++++++++++ doc/screenshot.png | Bin 0 -> 17909 bytes 2 files changed, 32 insertions(+) create mode 100644 README.md create mode 100644 doc/screenshot.png diff --git a/README.md b/README.md new file mode 100644 index 0000000..cd0b502 --- /dev/null +++ b/README.md @@ -0,0 +1,32 @@ +# llamacpphtmld + +A web interface and API for the LLaMA large language AI model, based on the [llama.cpp](https://github.com/ggerganov/llama.cpp) runtime. + +## Features + +- Live streaming responses +- Continuation-based UI, supporting interrupt, modify, and resume +- Configure the maximum number of simultaneous users +- Works with any LLaMA model including [Vicuna](https://huggingface.co/eachadea/ggml-vicuna-13b-4bit) +- Bundled copy of llama.cpp, no separate compilation required + +## Usage + +All configuration should be supplied as environment variables: + +``` +LCH_MODEL_PATH=/srv/llama/ggml-vicuna-13b-4bit-rev1.bin \ + LCH_NET_BIND=:8090 \ + LCH_SIMULTANEOUS_REQUESTS=1 \ + ./llamacpphtmld +``` + +## API usage + +``` +curl -v -d '{"ConversationID": "", "APIKey": "", "Content": "The quick brown fox"}' -X 'http://localhost:8090/api/v1/generate' +``` + +## License + +MIT diff --git a/doc/screenshot.png b/doc/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..eb54732ec60950e955c197c5a72ae673943f98ee GIT binary patch literal 17909 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 literal 0 HcmV?d00001