Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
303c4aa
✨feat(resume-ingestor): add initial LangGraph flow with extract_text …
oxspan Feb 22, 2026
192d14a
📝doc(AGENTS.md): add init version of AGENTS.md
oxspan Feb 22, 2026
09747f5
✅ test: align resume_ingestor tests with phase 1 input/output contract
oxspan Feb 22, 2026
a8a3299
✨ feat(resume_ingestor): add ParseSectionNode
oxspan Feb 22, 2026
8d7fdaf
✅test: add test about ParseSectionsNode
oxspan Feb 22, 2026
173780a
✨feat(resume_ingestor): add ExtractSignalsNode
oxspan Feb 22, 2026
0ce3cde
✅test: add test about ExtractSignals Node
oxspan Feb 22, 2026
23db0b4
Merge pull request #1 from swj9707/feature/parse_sections_node
oxspan Feb 22, 2026
b43999c
Merge pull request #2 from swj9707/feature/extract_signals_node
oxspan Feb 22, 2026
da86ba3
✨feat(resume_ingestor): add GenerateQuestionsNode
oxspan Feb 22, 2026
92e6d09
✅test: add test abount GenerateQuestionsNode
oxspan Feb 22, 2026
35305c5
Merge pull request #3 from swj9707/feature/generate_questions
oxspan Feb 22, 2026
bd44fdb
✨feat(resume_ingestor): add RateDifficultyNode
oxspan Feb 22, 2026
f423f53
✅test: add test about RateDifficultyNode
oxspan Feb 22, 2026
cf37347
feat(resume_ingestor): add FormatOutputNode
oxspan Feb 22, 2026
eb5c2db
✅test: add test about FormatOutputNode
oxspan Feb 22, 2026
612b41f
Merge pull request #4 from swj9707/feature/reate_difficulty_node
oxspan Feb 22, 2026
6072926
✨feat(api): add FastAPI endpoints for InterviewGraph pipeline with PD…
oxspan Feb 22, 2026
49ff318
Merge pull request #5 from swj9707/feature/fast_api
oxspan Feb 22, 2026
fbb5ef5
📝doc(README.md): add Init version of README.md
oxspan Feb 22, 2026
c8ffa34
💚ci: add init version of Dockerfile
oxspan Feb 22, 2026
ee34829
💚ci: add init version of publish workflow
oxspan Feb 22, 2026
0656311
Merge pull request #6 from swj9707/feature/init_readme.md
oxspan Feb 22, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions .dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
.git
.github
.venv
__pycache__
.pytest_cache
.ruff_cache
.mypy_cache
.langgraph_api
tests
docs
*.pyc
*.pyo
*.pyd
*.log
.env
.env.*
README.md
TEMPLATE_README.md
drawkit.xml
55 changes: 55 additions & 0 deletions .github/workflows/publish-ghcr.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
name: Build and Publish Container

on:
push:
branches: [main]
tags: ["v*"]
workflow_dispatch:

permissions:
contents: read
packages: write

jobs:
publish:
runs-on: ubuntu-latest

steps:
- name: Checkout
uses: actions/checkout@v5

- name: Set image name
id: image
run: echo "name=ghcr.io/${GITHUB_REPOSITORY,,}" >> "$GITHUB_OUTPUT"

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3

- name: Log in to GHCR
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Extract image metadata
id: meta
uses: docker/metadata-action@v5
with:
images: ${{ steps.image.outputs.name }}
tags: |
type=ref,event=branch
type=ref,event=tag
type=sha
type=raw,value=latest,enable={{is_default_branch}}

- name: Build and push
uses: docker/build-push-action@v6
with:
context: .
file: ./Dockerfile
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
cache-from: type=gha
cache-to: type=gha,mode=max
138 changes: 138 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,138 @@
You are working inside a LangGraph-based Python project.

Create project planning documentation for a new AI service named "InterviewGraph".

Your task:
Generate two markdown documents:

1) README.md (high-level overview)
2) docs/PLAN.md (detailed product & technical planning document)

The project name is:
InterviewGraph

The core idea:
InterviewGraph takes a resume PDF as input and generates structured, difficulty-rated interview questions based on the resume content.

====================================
README.md REQUIREMENTS
====================================

README.md must include:

1. Project Title
2. Short Description (3~5 lines)
3. Core Features (bullet points)
4. Architecture Overview (high-level explanation of LangGraph pipeline)
5. Example Flow (PDF → Questions)
6. Tech Stack (Python, LangGraph, FastAPI, LLM provider)
7. MVP Scope
8. Future Roadmap (short bullet list)
9. How to Run (placeholder instructions acceptable)

Tone:

- Professional
- Clear
- Developer-focused
- No marketing exaggeration

====================================
docs/PLAN.md REQUIREMENTS
====================================

PLAN.md must include structured sections:

# 1. Project Vision

- Why this project exists
- Target users

# 2. User Scenarios

- Primary scenario: resume upload → question generation
- Failure scenario: text extraction failure

# 3. Functional Requirements

Include:

- PDF input handling
- Resume section parsing
- Signal extraction (skills, projects, keywords)
- Interview question generation (15 questions)
- Difficulty rating (1~5)
- Structured JSON output
- Markdown output

# 4. Non-Functional Requirements

Include:

- Privacy considerations (no raw resume logging)
- LLM output schema validation
- Error handling & retry
- Stateless default design

# 5. LangGraph Architecture Design

List required nodes:

- extract_text
- parse_sections
- extract_signals
- generate_questions
- rate_difficulty
- format_output

Describe:

- State design (raw_text, sections, signals, questions, markdown, errors)
- Linear pipeline for MVP
- Possible conditional branch for error handling

# 6. Data Model Design

Define structured interview question format:

- id
- category (tech | project | system | deep-dive)
- difficulty (1~5)
- question
- expected_points
- followups

# 7. MVP Definition of Done

Clearly define what counts as completed MVP.

# 8. Out of Scope (for MVP)

Explicitly list:

- OCR
- Vector DB / RAG
- Multi-agent system
- Mock interview answer evaluation

# 9. Development Phases

Phase 1: Schema & PDF extraction
Phase 2: Section parsing & signal extraction
Phase 3: Question generation & rating
Phase 4: API integration

====================================

Formatting Rules:

- Use clean markdown formatting
- Use clear headers
- No emojis
- No casual tone
- No unnecessary verbosity

Do not generate code.
Only generate the two markdown documents.

If docs/ directory does not exist, create it logically in output structure.
19 changes: 19 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
FROM python:3.12-slim

ENV PYTHONDONTWRITEBYTECODE=1 \
PYTHONUNBUFFERED=1 \
UV_LINK_MODE=copy

WORKDIR /app

RUN pip install --no-cache-dir uv

COPY pyproject.toml uv.lock ./
COPY casts ./casts
COPY app ./app

RUN uv sync --frozen --no-dev --all-packages

EXPOSE 8000

CMD ["uv", "run", "uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]
114 changes: 99 additions & 15 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,23 +1,107 @@
# Act: Interview Graph
# 🙋‍♂️ InterviewGraph

A LangGraph-based Act project scaffolded with Act Operator.
InterviewGraph is a LangGraph-based service that generates structured interview questions from resume content.

## Quick Start
It accepts either resume text or a PDF file, extracts relevant signals, and returns 15 questions with difficulty ratings.

The response includes both structured JSON and Markdown for interviewer-friendly review.

> This project was developed through Act-Operator.
>
> [😺 Act-Operator Github](https://github.com/Proact0/act-operator)

## What It Does

- Accepts resume text or PDF input
- Parses resume sections (summary, skills, experience, projects, education)
- Extracts signals (skills, projects, keywords)
- Generates 15 interview questions
- Rates question difficulty (1-5)
- Formats output as JSON and Markdown

## Architecture (MVP)

Pipeline:

`extract_text -> parse_sections -> extract_signals -> generate_questions -> rate_difficulty -> format_output`

## Quick Start (Local)

1. Install dependencies:
```bash
uv sync --all-packages
```

2. Run the development server:
```bash
uv run langgraph dev
```
```bash
uv sync --all-packages
```

1. Run API server:

```bash
uv run uvicorn app.main:app --reload
```

1. Open API docs:

- `http://127.0.0.1:8000/docs`

## API Usage

- `POST /api/v1/interview-questions` for text input
- `POST /api/v1/interview-questions/upload` for PDF upload (multipart/form-data)

Example JSON payload:

```json
{
"resume_text": "Summary ... Skills ... Projects ..."
}
```

## Container Usage

Build image:

```bash
docker build -t interviewgraph:local .
```

Run container:

```bash
docker run --rm -p 8000:8000 interviewgraph:local
```

Open docs:

- `http://127.0.0.1:8000/docs`

## GHCR Publishing

This repository includes `.github/workflows/publish-ghcr.yml`.

- On push to `main`, the workflow builds and publishes to `ghcr.io/<owner>/<repo>`.
- On push tag `v*`, it also publishes versioned tags.
- You can manually trigger publishing with `workflow_dispatch`.

Pull from GHCR:

```bash
docker pull ghcr.io/<owner>/<repo>:latest
docker run --rm -p 8000:8000 ghcr.io/<owner>/<repo>:latest
```

## Current Scope (MVP)

- Text-extractable PDF support
- Resume-grounded question generation pipeline
- Structured error payloads

## Out of Scope (MVP)

3. Access Studio UI:
- Studio UI: https://smith.langchain.com/studio/?baseUrl=http://127.0.0.1:2024
- API: http://127.0.0.1:2024
- API Docs: http://127.0.0.1:2024/docs
- OCR for scanned PDFs
- Vector DB / RAG
- Multi-agent orchestration
- Mock interview answer scoring

For detailed documentation, see [TEMPLATE_README.md](TEMPLATE_README.md).
## License

Apache License 2.0 - see [LICENSE](https://www.apache.org/licenses/LICENSE-2.0) for details.
Loading
Loading