bsy-clippy is a lightweight Python client for the OpenAI Chat Completions API (and compatible deployments).
It supports both batch (stdin) mode for one-shot prompts and interactive mode for chatting directly in the terminal.
You can also load system prompts from a file to guide the LLM’s behavior.
- Speaks to the OpenAI Chat Completions API (or any compatible base URL).
- Loads credentials from
.env(OPENAI_API_KEY) usingpython-dotenv. - Reads defaults (profile, base URL, IP/port overrides, model) from
bsy-clippy.yaml. - Toggle endpoints by editing
api.profileinbsy-clippy.yamlor passing--profileon the CLI. - Defaults to:
- Base URL:
http://172.20.0.100:11434/v1(profileollama) - Model:
qwen3:1.7b - Mode:
stream(see--modeto switch) - Bundled system prompt file that can be overridden with
--system-file
- Base URL:
- Configurable parameters:
-b/--base-url→ explicit API endpoint-i/--ipand-p/--port→ override host/port when targeting compatible servers-M/--model→ model name-m/--mode→ output mode (streamorbatch)-t/--temperature→ sampling temperature (default:0.7)-s/--system-file→ path to a text file with system instructions-u/--user-prompt→ extra user instructions prepended before the data payload-r/--memory-lines→ number of conversation lines to remember in interactive mode-c/--chat-after-stdin→ process stdin once, then drop into interactive chat
- Two modes of operation:
- Batch mode → waits until the answer is complete, then prints only the final result.
- Stream mode (default) → shows response in real-time, tokens appear as they are generated.
- Colored terminal output:
- Yellow = streaming tokens (the model’s “thinking” in progress).
- Default terminal color = final assembled answer.
pipx install .After updating the source, reinstall with pipx reinstall bsy-clippy.
pip install .Create a .env file next to where you run bsy-clippy and add your key:
OPENAI_API_KEY=sk-...
The CLI loads this automatically via python-dotenv; environment variables from your shell work too.
bsy-clippy.yaml selects which profile to use and what settings belong to it. The packaged example ships with an Ollama profile enabled and an OpenAI profile commented out for reference:
api:
profile: ollama
profiles:
ollama:
base_url: http://172.20.0.100:11434/v1
model: qwen3:1.7b
# openai:
# base_url: https://api.openai.com/v1
# model: gpt-4o-mini
Change profile (or pass --profile openai) to switch endpoints, or add more entries under profiles for additional deployments.
By default, bsy-clippy loads a bundled prompt (Be very brief. Be very short.).
You can change this with --system-file or disable it via --no-default-system.
Example bsy-clippy.txt:
You are a helpful assistant specialized in cybersecurity.
Always explain your reasoning clearly, and avoid unnecessary markdown formatting.
These lines will be sent to the LLM before every user prompt.
Use --user-prompt "Classify the following log:" when piping data so the model receives:
system prompt (if any)
user prompt text
data from stdin or interactive input
Set --memory-lines 6 (or -r 6) to keep the last six conversation lines (user + assistant) while chatting.
Only the final assistant reply (not the thinking traces) is stored and sent back on the next turn.
Use -c / --chat-after-stdin to process piped data first and then remain in interactive mode with the response (and any configured memory) available:
cat sample.txt | bsy-clippy -u "Summarize this report" -r 6 -cAfter the initial answer prints, you can continue the conversation while the tool remembers the piped data and the model’s reply.
Run without piping input:
bsy-clippyStreaming session looks like:
You: Hello!
LLM (thinking): <think>
Reasoning step by step...
</think>
Hello! How can I assist you today? 😊
Prefer a single print at the end? Switch to batch mode:
bsy-clippy --mode batchBatch output:
You: Hello!
Hello! How can I assist you today? 😊
Pipe input directly:
echo "Tell me a joke" | bsy-clippyOutput:
Why don’t scientists trust atoms? Because they make up everything!
bsy-clippy --mode batch
bsy-clippy --mode streambsy-clippy --temperature 0.2
bsy-clippy --temperature 1.2bsy-clippy --base-url http://127.0.0.1:11434/v1 --model llama2See requirements.txt.