# Personal settings go in user/config.yaml, which is merged over this file # (nested keys override, lists replace). See data/examples/config.yaml. contact: email: null # sent to arXiv and Crossref (polite pool); set in user/config.yaml llm: model: art-researcher # built from the Modelfile by art/llm.py modelfile: modelfiles/researcher.Modelfile num_ctx: 8192 # set on every call; Ollama's default silently truncates longer prompts think: false # gemma4 supports thinking; recorded on every call enforce_schema: true # structured calls pass the JSON schema as Ollama's `format` retries: 1 # extra attempts for a structured call that fails validation timeout_s: 300 # Per-task options, sent explicitly on every call. Low temperature makes a # small model's summaries formulaic; labels stay low so they group. tasks: summarize: {temperature: 0.7} label: {temperature: 0.2} explain: {temperature: 0.3} llm_score: {temperature: 0.0} profile_draft: {temperature: 0.3} # bingham init; drafts for a person to edit max_results_per_feed: 30 # arXiv API backfill only feed_cache_ttl_hours: 6 # skip network fetch if raw feed data is fresher than this digest: # Field-pulse labels whose bge embeddings average at least this cosine # similarity are grouped. Set 2026-09-28 from the first week: unrelated # labels median 0.52; same-topic pairs 0.8 and above. label_cluster_threshold: 0.8 # "Just below threshold": per profile, up to near_misses papers scoring # between near_miss_floor x threshold and the threshold. near_misses: 3 near_miss_floor: 0.5 eval: target_recall: 0.9 # bingham eval suggests the highest threshold that keeps this recall paths: # relative to the repository root db: data/art.sqlite digests: digests models: models # HuggingFace cache (HF_HUB_CACHE) arxiv: # Daily run reads rss.arxiv.org/rss/. Every paper is screened # against every profile in data/profiles.yaml, whatever its category. # Override the list in user/config.yaml to follow other categories. categories: - cond-mat.soft - physics.flu-dyn include_cross_lists: true # papers whose primary category is elsewhere include_replacements: false # new versions of already-announced papers request_delay_s: 3 # between requests to any arXiv endpoint max_catchup_days: 14 # longer gaps in daily runs are filled as backfill jor: issn: [0148-6055, 1520-8516] # print, online; Crossref filter backfill_from: 2025-01-01 # first-run reach for the J. Rheol. stream crossref_overlap_days: 7 # re-query this far before the last fetch screen: embed_model: BAAI/bge-large-en-v1.5 rerank_model: BAAI/bge-reranker-v2-m3 max_embed_tokens: 512 # bge-large limit; longer abstracts are truncated and logged rerank_max_length: 1024 # tokens for a (profile description, paper) pair # Candidates per profile from each retriever (cosine, BM25): the larger of # top_k and top_frac of the batch. The union goes to the re-ranker. top_k: 30 top_frac: 0.2 # Re-ranker score (0-1) above which a paper is highlighted. Broad profile # descriptions score relevant papers lower, so set per-profile values in # user/config.yaml (keyed by profile id) once you have looked at the first # screen. The digest applies the current values; no re-screen is needed. thresholds: default: 0.2 calibrated: null # date of the last calibration