Communitygithub.com

Athena010/oncointel-hot

肿瘤医药行业实时情报聚合看板 · 打包成可移植 Agent Skill。openFDA + ClinicalTrials.gov + Europe PMC 实时数据 + RSS 大会/媒体新闻。

oncointel-hot란 무엇인가요?

oncointel-hot is a Claude Code agent skill that 肿瘤医药行业实时情报聚合看板 · 打包成可移植 Agent Skill。openFDA + ClinicalTrials.gov + Europe PMC 实时数据 + RSS 大会/媒体新闻。.

지원 대상~Claude Code~Codex CLI~Cursor
npx skills add Athena010/oncointel-hot

즐겨 사용하는 AI에게 물어보기

이 에이전트 스킬이 미리 로드된 새 채팅을 엽니다.

문서

OncoIntel HOT — real-data oncology intelligence dashboard

A drop-in intelligence site for the oncology drug industry. It pulls live data from official public APIs (no API keys) plus a small backend RSS fetcher, and renders an AI-HOT-style feed: sidebar navigation + a timeline of cards (source, type badge, importance score, bookmark, "why it matters" reason). Everything is vanilla HTML/CSS/JS and Python-stdlib + feedparser, so it works the same regardless of which model or agent is driving.

The one rule that matters most: never fabricate data

This tool exists because hand-written "sample" intelligence is worse than useless — it looks real and misleads. Every card must trace to a real API response or a real RSS item. When a signal is inferred rather than measured (e.g. "high attention" derived from trial phase/size), label it as inferred in the UI. If a source can't be reached, show an honest error — don't invent placeholder entries. Keep this principle when extending the site.

What's in this skill

app/
  index.html      # UI shell: sidebar + timeline feed + detail modal
  styles.css      # light/dark theme, timeline, cards
  app.js          # front-end: fetches 3 live APIs, normalizes, filters, renders
  fetch_news.py   # backend: fetches media/conference RSS -> data/news.json
  data/news.json  # sample output of fetch_news.py (regenerate for fresh data)
references/
  extending.md    # how to add sources, tune the taxonomy, cron the backend

Quick start (deploy + run)

  1. Copy app/ to where the user wants the site (call that folder SITE/).
  2. Serve it over HTTP from the parent directory (relative paths need this):
    cd <parent-of-SITE>
    python3 -m http.server 8769
    
    Open http://127.0.0.1:8769/SITE/. The three live APIs (openFDA, ClinicalTrials.gov, Europe PMC) load immediately in the browser — no build step, no keys.
  3. For the industry-news / conference section, generate data/news.json:
    pip install feedparser
    cd SITE && python3 fetch_news.py
    
    Re-run it (or cron it) to refresh. Without this file the other three sections still work; the site shows an honest "行业动态未生成" note.

If the browser shows stale UI after edits, it's HTTP caching — hard-refresh (Cmd/Ctrl+Shift+R). The index.html/app.js/styles.css can carry a ?v=N query to bust it.

How it's built (so you can reason about changes)

Front-end data flow (app.js): four fetchers run in parallel (fetchFDA, fetchTrials, fetchPapers, fetchNews), each normalizes its source into one common item shape (type, date, title, source, detailUrl, company, cancer, modality, score, why, tags, ...). Raw English data is mapped into a Chinese taxonomy via keyword regex tables (CANCER_MAP, MODALITY_MAP, COMPANY_MAP). The sidebar picks a view; filteredItems() filters + sorts; renderItems() draws the timeline.

Views: 全部动态 / 每日简报 / 临床试验(layered) / 高分论文 / 药物获批 / 行业动态 / 药企动态 / 收藏. Bookmarks and theme persist in localStorage.

Clinical trials are layered, not dumped: normalizeTrial tags each study into tiers — 结果/状态更新 (results just posted or status→completed/terminated), 新立项 (newly registered), 进行中 (recruiting/active), 高关注度 (inferred from phase/enrollment/sponsor). The view shows sub-tabs with live counts and a colored "what changed" badge per card.

News is de-duplicated by event (fetch_news.pycluster_duplicates): when several outlets report the same story, they fold into one card marked "🔁 N 家媒体报道", and more outlets = higher score (real media-response signal). Conference mentions (ASCO/ESMO/AACR/…) are detected and badged.

Data sources and the CORS reality

Browsers can call these directly (public CORS, no key) — this is why the front-end is self-contained:

SectionSourceEndpoint
Drug approvals / labelsopenFDAapi.fda.gov/drug/label.json
Clinical trialsClinicalTrials.gov v2clinicaltrials.gov/api/v2/studies
High-impact papersEurope PMCebi.ac.uk/europepmc/webservices/rest/search

These are ordinary web pages with no cross-origin API, so a static page can't fetch them — they need the backend (fetch_news.py, extendable) or a proxy: EMA, NMPA/CDE, individual company press pages, conference abstract sites. Media RSS (FiercePharma, STAT, BioPharma Dive, ASCO Post, FDA press) works from the backend and already covers most company/conference news.

Extending it

Read references/extending.md when the user wants to: add a data source (front-end API adapter or backend RSS feed), change the cancer/company/drug-class taxonomy, adjust trial tiering or news clustering, or automate refresh. Keep the two copies of the taxonomy maps (in app.js and fetch_news.py) in sync when you edit them.

Adapting to another domain

The architecture (parallel fetchers → common item shape → keyword taxonomy → timeline UI with tiers/dedup) is domain-agnostic. To retarget it (e.g. cardiology, or a non-medical industry), swap the fetchers and the keyword maps but keep the item shape, the UI, and — above all — the never-fabricate-data rule.

관련 스킬