Skip to content

Streamlit web app over the pipeline (issue #5) - #4

Open
Divergent-Code wants to merge 1 commit into
fix/markdown-chunkingfrom
feat/streamlit-webapp
Open

Streamlit web app over the pipeline (issue #5)#4
Divergent-Code wants to merge 1 commit into
fix/markdown-chunkingfrom
feat/streamlit-webapp

Conversation

@Divergent-Code

Copy link
Copy Markdown
Owner

Implements camunity issue #5 — moves the tool from a linear Colab notebook to a real web app UI. Also unblocks camunity#8 (PDF): resolve_resume() + the app.py/pipeline.py split match the shape camunity#8 expects.

Stacked PR: base is fix/markdown-chunking (top of the fork stack), so this diff is just the new app. Full stack: main#1 multi-provider ← #2 injection ← #3 chunking ← this.

What's new

  • pipeline.py — the notebook pipeline extracted into a provider-agnostic, Colab-free module: LLMClient (Gemini/Anthropic/DeepSeek/Groq), JD scraping, markdown-aware chunking, threshold retrieval, generation, coverage eval, two-layer injection screen, fabrication check, diff. Importable anywhere; embeddings stay local.
  • app.py — Streamlit UI over that pipeline:
    • Sidebar: provider + model + key (Streamlit secrets → env var → session-only field).
    • Inputs: JD paste/URL, résumé upload (.md/.txt) or paste, optional GitHub username.
    • Up-front injection gate — screens the JD (substring + LLM classifier) before anything reaches a prompt; requires explicit confirm if flagged.
    • Real progress via st.status step-by-step (the guidance's rule: show real progress for processing, not a bare spinner).
    • Results in tabs: tailored résumé with [SOURCE] badges + Markdown download · what-changed · coverage detail · fabrication check · diff · run log.
    • Empty state teaches the flow.
  • requirements.txt, README.md (run + deploy to Streamlit Cloud / HF Spaces), .gitignore (ignores .streamlit/secrets.toml).

Design

Follows the attached impeccable "product register" guidance: one well-tuned sans, hairline borders + flat surfaces (no shadow/glass), restrained accent — gold for the primary action only, patina for improved/covered, vermilion for gaps/warnings. Avoids the AI-slop tells (side-tab, icon-tile-stack, cream-palette, ai-color-palette, nested-cards). Palette is the Neo-Kinpaku system with OKLCH tokens converted to hex; theme in .streamlit/config.toml.

Verification

  • Both modules compile; pure-logic unit checks pass (chunking 1→12 on a one-line résumé, injection screen, coverage eval, diff, output split).
  • App boots headless — HTTP 200, no errors — rendering the full form + empty state (confirmed via the page's accessibility tree). A full end-to-end run needs a provider key + the embedding-model download, so that wasn't exercised here.

🤖 Generated with Claude Code

Wraps the notebook pipeline in a form-driven web UI, per issue #5.

- pipeline.py: the pipeline extracted into a provider-agnostic, Colab-free
  module — LLMClient (Gemini/Anthropic/DeepSeek/Groq), scraping, markdown-aware
  chunking, threshold retrieval, generation, coverage eval, two-layer injection
  screen, and fabrication check. Importable anywhere; embeddings stay local.
- app.py: the Streamlit UI — provider/key sidebar (secrets → env → session
  field), JD paste/URL, résumé upload (.md/.txt) or paste, GitHub username,
  real step-by-step progress (st.status, not a bare spinner), an up-front
  injection gate, and results in tabs: tailored résumé with source-tag badges +
  markdown download, what-changed, coverage detail, fabrication check, diff,
  run log. Empty state teaches the flow.
- Design follows the impeccable "product register": one sans, hairline borders,
  flat surfaces, restrained gold accent (primary action only), patina =
  improved/covered, vermilion = gaps/warnings. Theme in .streamlit/config.toml.
- requirements.txt, README (run + deploy), .gitignore (incl. secrets.toml).

resolve_resume() and the app.py/pipeline.py split match issue camunity#8's expected
shape, so PDF upload is a clean one-branch follow-up.

Verified: both modules compile, pure-logic unit checks pass (chunking 1->12 on a
one-line résumé, injection screen, coverage eval, diff, output split), and the
app boots headless (HTTP 200, no errors) rendering the full form + empty state.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant