99 lines
4.6 KiB
Python
99 lines
4.6 KiB
Python
"""
|
|
Banner display for Hindsight API startup.
|
|
|
|
Shows the logo and tagline with gradient colors.
|
|
"""
|
|
|
|
# Gradient colors: #0074d9 -> #009296
|
|
GRADIENT_START = (0, 116, 217) # #0074d9
|
|
GRADIENT_END = (0, 146, 150) # #009296
|
|
|
|
# Pre-generated logo (generated by test-logo.py)
|
|
LOGO = """\
|
|
\033[38;2;9;127;184m\u2584\033[0m\033[48;2;8;130;178m\033[38;2;5;133;186m\u2584\033[0m \033[48;2;10;143;160m\033[38;2;10;143;165m\u2584\033[0m\033[38;2;7;140;156m\u2584\033[0m
|
|
\033[38;2;8;125;192m\u2584\033[0m \033[38;2;3;132;191m\u2580\033[0m\033[38;2;2;133;192m\u2584\033[0m \033[38;2;3;132;180m\u2584\033[0m\033[38;2;1;137;184m\u2584\033[0m\033[38;2;3;133;174m\u2584\033[0m \033[38;2;3;142;176m\u2584\033[0m\033[38;2;4;142;169m\u2580\033[0m \033[38;2;10;144;164m\u2584\033[0m
|
|
\033[38;2;6;121;195m\u2580\033[0m\033[38;2;5;128;203m\u2580\033[0m\033[48;2;5;124;195m\033[38;2;3;125;200m\u2584\033[0m\033[38;2;2;126;196m\u2584\033[0m\033[48;2;3;128;188m\033[38;2;1;131;196m\u2584\033[0m\033[48;2;0;152;219m\033[38;2;2;131;191m\u2584\033[0m\033[38;2;1;141;196m\u2580\033[0m\033[38;2;1;135;183m\u2580\033[0m\033[38;2;1;148;198m\u2580\033[0m\033[48;2;1;156;202m\033[38;2;2;135;180m\u2584\033[0m\033[48;2;4;134;169m\033[38;2;1;137;177m\u2584\033[0m\033[38;2;3;138;173m\u2584\033[0m\033[48;2;6;137;165m\033[38;2;2;140;170m\u2584\033[0m\033[38;2;7;144;169m\u2580\033[0m\033[38;2;7;139;158m\u2580\033[0m
|
|
\033[48;2;2;128;202m\033[38;2;2;124;201m\u2584\033[0m\033[48;2;1;130;201m\033[38;2;0;135;212m\u2584\033[0m\033[38;2;2;128;196m\u2584\033[0m \033[48;2;2;142;204m\033[38;2;7;138;199m\u2584\033[0m \033[38;2;1;135;186m\u2584\033[0m\033[48;2;1;142;186m\033[38;2;2;144;194m\u2584\033[0m\033[48;2;3;138;176m\033[38;2;2;134;176m\u2584\033[0m
|
|
\033[48;2;8;118;200m\033[38;2;8;121;209m\u2584\033[0m\033[38;2;3;121;203m\u2580\033[0m \033[38;2;3;122;192m\u2580\033[0m\033[38;2;1;138;216m\u2580\033[0m\033[48;2;0;138;210m\033[38;2;3;128;198m\u2584\033[0m\033[48;2;0;126;188m\033[38;2;2;131;198m\u2584\033[0m\033[48;2;0;142;205m\033[38;2;3;132;193m\u2584\033[0m\033[38;2;1;140;196m\u2580\033[0m \033[38;2;4;134;175m\u2580\033[0m\033[48;2;13;135;167m\033[38;2;8;136;174m\u2584\033[0m """
|
|
|
|
|
|
def _interpolate_color(start: tuple, end: tuple, t: float) -> tuple:
|
|
"""Interpolate between two RGB colors."""
|
|
return (
|
|
int(start[0] + (end[0] - start[0]) * t),
|
|
int(start[1] + (end[1] - start[1]) * t),
|
|
int(start[2] + (end[2] - start[2]) * t),
|
|
)
|
|
|
|
|
|
def gradient_text(text: str, start: tuple = GRADIENT_START, end: tuple = GRADIENT_END) -> str:
|
|
"""Render text with a gradient color effect."""
|
|
result = []
|
|
length = len(text)
|
|
for i, char in enumerate(text):
|
|
if char == " ":
|
|
result.append(" ")
|
|
else:
|
|
t = i / max(length - 1, 1)
|
|
r, g, b = _interpolate_color(start, end, t)
|
|
result.append(f"\033[38;2;{r};{g};{b}m{char}")
|
|
result.append("\033[0m")
|
|
return "".join(result)
|
|
|
|
|
|
def print_banner():
|
|
"""Print the Hindsight startup banner."""
|
|
print(LOGO)
|
|
tagline = gradient_text("Hindsight: Agent Memory That Works Like Human Memory")
|
|
print(f"\n {tagline}\n")
|
|
|
|
|
|
def color(text: str, t: float = 0.0) -> str:
|
|
"""Color text using gradient position (0.0 = start, 1.0 = end)."""
|
|
r, g, b = _interpolate_color(GRADIENT_START, GRADIENT_END, t)
|
|
return f"\033[38;2;{r};{g};{b}m{text}\033[0m"
|
|
|
|
|
|
def color_start(text: str) -> str:
|
|
"""Color text with gradient start color (#0074d9)."""
|
|
return color(text, 0.0)
|
|
|
|
|
|
def color_end(text: str) -> str:
|
|
"""Color text with gradient end color (#009296)."""
|
|
return color(text, 1.0)
|
|
|
|
|
|
def color_mid(text: str) -> str:
|
|
"""Color text with gradient middle color."""
|
|
return color(text, 0.5)
|
|
|
|
|
|
def dim(text: str) -> str:
|
|
"""Dim/gray text."""
|
|
return f"\033[38;2;128;128;128m{text}\033[0m"
|
|
|
|
|
|
def print_startup_info(
|
|
host: str,
|
|
port: int,
|
|
database_url: str,
|
|
llm_provider: str,
|
|
llm_model: str,
|
|
embeddings_provider: str,
|
|
reranker_provider: str,
|
|
mcp_enabled: bool = False,
|
|
version: str | None = None,
|
|
):
|
|
"""Print styled startup information."""
|
|
print(color_start("Starting Hindsight API..."))
|
|
if version:
|
|
print(f" {dim('Version:')} {color(f'v{version}', 0.1)}")
|
|
print(f" {dim('URL:')} {color(f'http://{host}:{port}', 0.2)}")
|
|
print(f" {dim('Database:')} {color(database_url, 0.4)}")
|
|
print(f" {dim('LLM:')} {color(f'{llm_provider} / {llm_model}', 0.6)}")
|
|
print(f" {dim('Embeddings:')} {color(embeddings_provider, 0.8)}")
|
|
print(f" {dim('Reranker:')} {color(reranker_provider, 1.0)}")
|
|
if mcp_enabled:
|
|
print(f" {dim('MCP:')} {color_end('enabled at /mcp')}")
|
|
print()
|