import os
import configparser
import requests
from flask import Flask, render_template_string, jsonify
app = Flask(__name__)
OLLAMA_HOST = os.environ.get("OLLAMA_HOST", "http://harbor.freshbrewed.science:11444")
OLLAMA_MODEL = os.environ.get("OLLAMA_MODEL", "gemma4:e4b")
PROMPT = os.environ.get("PROMPT", "tell me a dad joke about programming")
PORT = int(os.environ.get("PORT", "80"))
def get_app_version():
config = configparser.ConfigParser()
version_file = os.path.join(os.path.dirname(os.path.abspath(__file__)), "version.ini")
if os.path.exists(version_file):
try:
config.read(version_file)
return config.get("metadata", "version", fallback="unknown")
except Exception:
return "unknown"
return "unknown"
HTML_TEMPLATE = """
Programming Dad Jokes
Ollama • Gemma 4
•
v{{ version }}
Programming Dad Joke
Freshly compiled humor from our AI model
Host: {{ host }}
Model: {{ model }}
Prompt: "{{ prompt }}"
App Version: v{{ version }}
"""
def request_joke():
url = f"{OLLAMA_HOST.rstrip('/')}/api/generate"
payload = {
"model": OLLAMA_MODEL,
"prompt": PROMPT,
"stream": False
}
try:
resp = requests.post(url, json=payload, timeout=60)
resp.raise_for_status()
data = resp.json()
return data.get("response", "No response received from Ollama.")
except Exception as e:
return f"Error contacting Ollama ({OLLAMA_HOST}): {e}"
@app.route("/")
def index():
joke = request_joke()
version = get_app_version()
return render_template_string(
HTML_TEMPLATE,
joke=joke,
host=OLLAMA_HOST,
model=OLLAMA_MODEL,
prompt=PROMPT,
version=version
)
@app.route("/api/joke")
def api_joke():
joke = request_joke()
version = get_app_version()
return jsonify({
"joke": joke,
"version": version
})
if __name__ == "__main__":
version = get_app_version()
print(f"Starting server v{version} on port {PORT} with model '{OLLAMA_MODEL}' at {OLLAMA_HOST}...")
app.run(host="0.0.0.0", port=PORT)