Files
evanescere/config.example.toml
T
2026-05-31 23:30:35 -07:00

154 lines
4.6 KiB
TOML

# Evanescere configuration file.
#
# Copy this file to config.toml for local Compose runs:
#
# cp config.example.toml config.toml
#
# In containers, mount your config to:
#
# /etc/evanescere/config.toml
#
# Secrets such as DeepSeek and WebDAV credentials belong in your private config.toml.
[app]
# Free-form environment label included in logs.
env = "dev"
# Python logging level: DEBUG, INFO, WARNING, ERROR.
log_level = "DEBUG"
# Enable SQLAlchemy SQL logging. Very noisy; keep false unless debugging DB behavior.
log_sql = false
# Frontend origins allowed to call FastAPI. Include the Vite dev server while developing.
cors_origins = ["http://localhost:3000", "http://localhost:5173"]
[database]
# PostgreSQL connection string used by SQLAlchemy.
# For Compose local-db profile: postgresql+psycopg://evanescere:evanescere@postgres:5432/evanescere
# For an existing DB: postgresql+psycopg://USER:PASSWORD@HOST:5432/DBNAME
url = "postgresql+psycopg://evanescere:evanescere@postgres:5432/evanescere"
[redis]
# Redis URL used by Dramatiq workers.
url = "redis://redis:6379/0"
[storage]
# Container path for working media. Mount a Framework SSD directory here in Compose.
local_root = "/data/evanescere"
[webdav]
# IIS WebDAV directory containing recording files. Point at the collection, not one file.
base_url = "https://windows-server.example.local/webdav/recordings"
# Leave username/password empty if your WebDAV endpoint does not require basic auth.
username = ""
password = ""
# Set false only for trusted internal/self-signed testing.
verify_tls = true
# Scheduler interval. A file becomes stable after two equal positive size samples.
poll_interval_seconds = 60
[funasr]
# FunASR-compatible API base URL. Evanescere calls /audio/transcriptions.
base_url = "http://funasr:10096/v1"
# Optional bearer token for the FunASR service.
api_key = ""
# Model name sent to FunASR. Adjust this to match your deployed service.
model = "paraformer-zh"
[deepseek]
# OpenAI-compatible DeepSeek API base URL.
base_url = "https://api.deepseek.com"
# Required when clip suggestion is enabled.
api_key = ""
# Initial MVP model.
model = "deepseek-v4-pro"
# Lower values improve consistency.
temperature = 0.2
[llm_prompt]
# Customize these prompts freely. The backend appends the required JSON response schema.
system = """
You are an expert editor for Mandarin VTuber livestream clips.
Identify moments that work as entertaining standalone clips for Bilibili viewers.
Prioritize strong reactions, jokes, surprising turns, memorable conversations, and moments with a clear payoff.
Avoid repetitive stretches, dead air, and segments that require too much missing context.
Return only the requested JSON object.
"""
# Available placeholders:
# {max_candidates}, {min_clip_seconds}, {max_clip_seconds},
# {chunk_start_sec}, {chunk_end_sec}, {transcript}
user = """
Review the timestamped livestream transcript below.
Choose up to {max_candidates} compelling clip candidates.
Each clip must be between {min_clip_seconds} and {max_clip_seconds} seconds long.
Use absolute stream timestamps and give each candidate a concise Chinese title and summary.
Transcript range: {chunk_start_sec}-{chunk_end_sec}
Transcript:
{transcript}
"""
[defaults]
# Initial automatic pipeline settings. These can later be changed through the API/UI.
suggest_enabled = true
render_enabled = true
# For testing, consider false until uploads are wired and verified.
upload_enabled = true
preserve_final_artifacts = true
bake_subtitles = true
[clip]
# LLM clip duration bounds accepted by the backend.
min_seconds = 30
max_seconds = 360
# Transcript seconds per DeepSeek request. Larger chunks use more tokens.
transcript_chunk_seconds = 14400
# Maximum number of suggestions kept across the entire transcript.
max_candidates_total = 20
[thumbnail]
# Generate thumbnails during clip render.
enabled = true
# frame_overlay: use extracted video frame as background.
# command: run command below to call a local image generation workflow.
provider = "frame_overlay"
width = 1920
height = 1080
# Directory of transparent VTuber character PNGs. One is selected randomly per thumbnail.
character_overlay_dir = "/data/evanescere/assets/"
# Character height as a fraction of thumbnail height.
character_scale = 0.42
# Supported: bottom-right, bottom-left, center-right, center-left.
character_position = "bottom-right"
# Draw the clip title onto the final thumbnail.
title_enabled = true
# Used only when provider = "command". Receives JSON on stdin and must write output_path.
command = ""
[upload]
# noop: do not upload, only record what would have happened.
# command: run command below with JSON metadata on stdin.
adapter = "noop"
command = ""