# milla
Milla is an IRC bot that sends things over to an LLM when you ask it questions and prints the answer with optional syntax-hilighting.
Currently Supported:
- Ollama
- Openai
- Gemini
![milla](./milla.png)
milla accepts one cli arg which tells it where to look for the config file:
```$ milla -help
Usage of ./milla:
-config string
path to the config file (default "./config.toml")
```
## Config
An exhaustive example is in `config-example.toml`.
#### ircServer
The address for the IRC server to connect to.
#### ircNick
The nick the bot should use.
#### enableSasl
Whether to use SASL for authentication.
#### ircSaslUser
The SASL username.
#### ircSaslPass
The SASL password for SASL plain authentication.
#### ollamaEndpoint
The address for the Ollama chat endpoint.
#### model
The name of the model to use.
#### chromaStyle
The style to use for syntax highlighting done by [chroma](https://github.com/alecthomas/chroma). This is basically what's called a "theme".
#### chromaFormatter
The formatter to use. This tells chroma how to generate the color in the output. The supported options are:
- `noop` for no syntax highlighting
- `terminal` for 8-color terminals
- `terminal8` for 8-color terminals
- `terminal16` for 16-color terminals
- `terminal256` for 256-color terminals
- `terminal16m` for treucolor terminals
- `html` for HTML output
**_NOTE_**: please note that the terminal formatters will increase the size of the IRC event. Depending on the IRC server, this may or may not be a problem.
#### provider
Which LLM provider to use. The supported options are:
- [ollama](https://github.com/ollama/ollama)
- chatgpt
- gemini
#### apikey
The apikey to use for the LLM provider.
#### ollamaSystem
The system message to use for ollama.
#### clientCertPath
The path to the client certificate to use for client cert authentication.
#### serverPass
The password to use for the IRC server the bot is trying to connect to if the server has a password.
#### bind
Which address to bind to for the IRC server.
#### temp
The temperature to config the model with.
#### requestTimeout
The timeout for requests made to the LLM provider.
#### millaReconnectDelay
How much to wait before reconnecting to the IRC server.
#### ircPort
Which port to connect to for the IRC server.
#### keepAlive
#### memoryLimit
How many conversations to keep in memory for a model.
#### pingDelay
Ping delay for the IRC server.
#### pingTimeout
Ping timeout for the IRC server.
#### topP
#### topK
#### skipTLSVerify
Skip verifying the IRC server's TLS certificate. This only makes sense if you are trying to connect to an IRC server with a self-signed certificate.
#### useTLS
Whether to use TLS to connect to the IRC server. This option is provided to support usage on overlay networks such as Tor, i2p and [yggdrassil](https://github.com/yggdrasil-network/yggdrasil-go).
#### disableSTSFallback
Disables the "fallback" to a non-TLS connection if the strict transport policy expires and the first attempt to reconnect back to the TLS version fails.
#### allowFlood
Disable [girc](https://github.com/lrstanley/girc)'s built-in flood protection.
#### debug
Whether to enable debug logging. The logs are written to stdout.
#### out
Whether to write raw messages to stdout.
#### admins
List of adimns for the bot. Only admins can use commands.
```
admins = ["admin1", "admin2"]
```
#### ircChannels
List of channels for the bot to join when it connects to the server.
```
ircChannels = ["#channel1", "#channel2"]
```
## Commands
#### help
Prints the help message.
#### get
Get the value of a config option. Use the same name as the config file but capitalized.
#### getall
Get the value of all config options.
#### set
Set a config option on the fly. Use the same name as the config file but capitalized.
## Proxy Support
milla will read and use the `ALL_PROXY` environment variable.
It is rather a non-standard way of using the env var but you define your socks5 proxies like so:
```
ALL_PROXY=127.0.0.1:9050
```
**_NOTE_**: the proxy is used for making calls to the LLMs, not for connecting to the IRC server.
## Deploy
An example docker compose file is provided in the repo under `docker-compose.yaml`.
milla can be used with [gvisor](https://gvisor.dev/)'s docker runtime, `runsc`.
```yaml
services:
milla:
image: milla
build:
context: .
deploy:
resources:
limits:
memory: 64M
logging:
driver: "json-file"
options:
max-size: "100m"
networks:
- millanet
user: ${UID}:${GID}
restart: unless-stopped
command: ["--config", "/opt/milla/config.toml"]
volumes:
- ./config-gpt.toml:/opt/milla/config.toml
- /etc/localtime:/etc/localtime:ro
- /etc/resolv.conf:/etc/resolv.conf:ro
cap_drop:
- ALL
runtime: runsc
networks:
millanet:
driver: bridge
```
The env vars `UID`and `GID`need to be defined or they can replaces by your host user's uid and gid.
As a convinience, there is a a [distroless](https://github.com/GoogleContainerTools/distroless) dockerfile, `Dockerfile_distroless` also provided.
A vendored build of milla is available by first running `go mod vendor` and then using the provided Dockerfile, `Dockerfile_distroless_vendored`.
## Thanks
- [girc](https://github.com/lrstanley/girc)
- [chroma](https://github.com/alecthomas/chroma)
- [ollama](https://github.com/ollama/ollama)
## Similar Projects
- [soulshack](https://github.com/pkdindustries/soulshack)