Skip to content

feat: AI Interview Preparation Agent - Lamatic AgentKit Challenge#167

Open
harshuldashora wants to merge 10 commits into
Lamatic:mainfrom
harshuldashora:main
Open

feat: AI Interview Preparation Agent - Lamatic AgentKit Challenge#167
harshuldashora wants to merge 10 commits into
Lamatic:mainfrom
harshuldashora:main

Conversation

@harshuldashora
Copy link
Copy Markdown

@harshuldashora harshuldashora commented May 29, 2026

Contribution Type

  • New AgentKit Submission
  • Bug Fix
  • Documentation Update

General Requirements

  • Problem statement included
  • Solution description included
  • Demo video included
  • Screenshots included
  • README completed
  • No secrets committed

File Structure Validation

  • submissions/harshul-dashora/README.md
  • submissions/harshul-dashora/agent.md
  • submissions/harshul-dashora/lamatic.config.ts
  • submissions/harshul-dashora/flows/resume-parser.ts
  • submissions/harshul-dashora/prompts/
  • submissions/harshul-dashora/model-configs/
  • submissions/harshul-dashora/constitutions/

Validation

Lamatic Validation

  • Flow tested successfully
  • LLM node tested successfully
  • Response node tested successfully
  • Deployment successful

Output Validation

  • Strength analysis generated
  • Skill gap analysis generated
  • Interview questions generated
  • JSON output verified

NPM / Local Validation

  • Configuration exported successfully
  • Export files generated correctly
  • No build/configuration errors

Problem

Candidates often prepare for interviews using generic questions that do not match their resume or job requirements, resulting in inefficient preparation.

Solution

The AI Interview Preparation Agent analyzes a resume and job description to generate:

  • Candidate strengths
  • Skill gaps
  • Personalized interview questions
  • Ideal answer guidance

Demo

Video Walkthrough:
https://drive.google.com/file/d/1Da8nCZi_T6x1yJvCoDAsLesAXbICV1mh/view?usp=sharing

Screenshots

Included in the submission repository.

Security

  • No API keys committed
  • No credentials exposed
  • No secrets committed

Files Added

The submission adds 9 new files for the AI Interview Preparation Agent:

Configuration & Documentation

  • lamatic.config.ts — Kit configuration defining resume-parser as the main step, with metadata and deployment links
  • README.md — Comprehensive documentation covering problem statement, solution, features, tech stack, expected I/O JSON structure, demo video link, and use cases
  • agent.md — Agent purpose and workflow definition (6-step process for analyzing resumes vs. job descriptions)
  • .gitignore — Ignore rules for .lamatic/, node_modules/, .env, and .env.local

Flow & Model Configuration

  • flows/resume-parser.ts — Main flow definition (see flow details below)
  • model-configs/resume-parser_llmnode-139_generative-model-name.ts — LLM model configuration referencing the generative model provider and credentials

Prompts & Guardrails

  • constitutions/default.md — Behavioral guardrails emphasizing safety (no harmful/illegal/discriminatory content), data handling (no PII logging), and professional tone
  • prompts/resume-parser_llmnode-139_system_0.md — System prompt instructing the LLM to analyze resume vs. job description and return a strict JSON schema with strengths, gaps, and questions (3–5 strengths, 3–5 gaps, exactly 5 interview questions)
  • prompts/resume-parser_llmnode-139_user_1.md — User prompt template injecting resumeText and jobDescription from the trigger input

Flow Architecture & Node Types

The resume-parser flow is a three-node, single-pathway pipeline:

  1. Trigger Node (triggerNode_1) — GraphQL API entry point

    • Input schema: resumeText (string) and jobDescription (string)
    • Response type: realtime
  2. LLM Node (LLMNode_139) — Dynamic generative node (text generation)

    • Processes inputs through system and user prompts
    • Applies model configuration and constitution guardrails
    • Outputs structured JSON with generatedResponse containing strengths, gaps, and questions
  3. Response Node (responseNode_triggerNode_1) — GraphQL API response handler

    • Sets Content-Type: application/json header
    • Maps LLM output fields into JSON response: strengths, gaps, questions

Data Flow: triggerNode → LLMNode → responseNode (+ direct response edge from trigger for real-time response handling)

Overall Purpose: Accepts a candidate's resume and job description, analyzes them through an LLM with expert interviewer instructions, and returns personalized interview preparation data (strengths, skill gaps, tailored questions with ideal answers).

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 29, 2026

Review Change Stack

Warning

Review limit reached

@harshuldashora, we couldn't start this review because you've reached your PR review rate limit.

More reviews will be available in 2 seconds. Learn how PR review limits work.

Your organization has run out of usage credits. Purchase more in the billing tab.

⌛ How to resolve this issue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans include higher PR review limits than trial, open-source, and free plans. In all cases, reviews become available again over time. During sustained high-volume PR review activity, CodeRabbit may temporarily slow when the next review becomes available.

Please see our Fair Usage Limits Policy for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI (base), Organization UI (inherited)

Review profile: ASSERTIVE

Plan: Pro

Run ID: e325f0f1-270b-4c00-8661-1b2806218d5a

📥 Commits

Reviewing files that changed from the base of the PR and between a42e532 and b09f54e.

📒 Files selected for processing (2)
  • submissions/harshul-dashora/flows/resume-parser.ts
  • submissions/harshul-dashora/prompts/resume-parser_llmnode-139_user_1.md

Walkthrough

This submission adds a Lamatic kit for interview preparation: project docs and constitution, a resume-parser flow (trigger → LLM → response), model and prompt configurations enforcing a strict JSON output schema, and supporting templates and configs.

Changes

AI Interview Preparation Agent Kit

Layer / File(s) Summary
Project setup and documentation
submissions/harshul-dashora/.gitignore, submissions/harshul-dashora/README.md, submissions/harshul-dashora/agent.md
Repository ignore rules, full project documentation including problem/solution narrative and features, and agent specification with workflow steps and guardrails.
Agent constitution and kit configuration
submissions/harshul-dashora/constitutions/default.md, submissions/harshul-dashora/lamatic.config.ts
Behavioral constitution defining identity, safety rules, data handling, and tone constraints. Kit-level metadata and step configuration for the resume-parser flow.
Resume parser flow definition and wiring
submissions/harshul-dashora/flows/resume-parser.ts
Complete flow definition with exported meta/inputs/references, trigger, dynamic LLM, and response nodes, plus edges and default export wiring trigger → LLM → response.
LLM model configuration and prompts
submissions/harshul-dashora/model-configs/resume-parser_llmnode-139_generative-model-name.ts, submissions/harshul-dashora/prompts/resume-parser_llmnode-139_system_0.md, submissions/harshul-dashora/prompts/resume-parser_llmnode-139_user_1.md
Model provider/credential configuration and prompts: system prompt enforces strict JSON schema and cardinality (3–5 strengths, 3–5 gaps, exactly 5 questions); user prompt injects jobDescription and resumeText.

Suggested reviewers

  • amanintech
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and specifically describes the main contribution: an AI Interview Preparation Agent submission for the Lamatic AgentKit Challenge.
Description check ✅ Passed The description covers contribution type, general requirements, file structure validation, and comprehensive testing/validation results, closely matching the template's checklist structure.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@akshatvirmani
Copy link
Copy Markdown
Contributor

/validate

@github-actions
Copy link
Copy Markdown

github-actions Bot commented Jun 2, 2026

📡 Running Studio validation — results will appear here shortly.

@akshatvirmani
Copy link
Copy Markdown
Contributor

Hello @harshuldashora

Can you work on your PR? There are many files missing.
Please check https://github.com/Lamatic/AgentKit/blob/main/CONTRIBUTING.md#repository-layout for your reference

@harshuldashora
Copy link
Copy Markdown
Author

Thank you for the feedback. I'm currently rebuilding the project in Lamatic Studio and updating the repository structure to align with AgentKit requirements. I'll update the PR with the required files shortly.

@harshuldashora
Copy link
Copy Markdown
Author

Thanks for the feedback.

The submission has been updated with:

  • Complete AgentKit export files
  • Updated documentation
  • Demo video walkthrough
  • Screenshots demonstrating the workflow and results

I believe all requested changes have been addressed. I'd appreciate another review when convenient.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@submissions/harshul-dashora/flows/resume-parser.ts`:
- Around line 111-112: The outputMapping currently stores
LLMNode_139.output.generatedResponse as a string under interviewPlan, which
violates the expected JSON schema (fields strengths, gaps, questions) declared
in the README/system prompt; update the mapping so the LLMNode_139 output is
interpreted/parsed as JSON and its top-level fields are emitted directly (or
mapped into interviewPlan as an object with strengths, gaps, questions) instead
of a quoted string—locate the outputMapping entry that references
"LLMNode_139.output.generatedResponse" and change it to produce a JSON object
(or parse the generatedResponse) that matches the schema.

In
`@submissions/harshul-dashora/model-configs/resume-parser_llmnode-139_generative-model-name.ts`:
- Around line 10-12: Remove the hardcoded credential metadata values
(credentialId and credential_name) from the committed config and replace usage
with environment-driven values (e.g., read process.env variables such as
GEMINI_CREDENTIAL_ID and GEMINI_CREDENTIAL_NAME where the config is loaded);
ensure provider_name remains generic or is also driven by an env var (e.g.,
GEMINI_PROVIDER_NAME) if environment-specific. Add a .env.example file with
placeholder keys (GEMINI_CREDENTIAL_ID, GEMINI_CREDENTIAL_NAME,
GEMINI_PROVIDER_NAME) and update any initialization/loading code that references
credentialId, credential_name, or provider_name to pull from those env vars
instead of literals. Commit the config with no real identifiers and include
.env.example for guidance.

In `@submissions/harshul-dashora/prompts/resume-parser_llmnode-139_user_1.md`:
- Around line 1-2: The markdown is missing a top-level heading and may have
incorrect EOF newlines; add a single H1 as the first line (for example a short
title above the template) and ensure exactly one trailing newline at EOF; keep
the existing template lines containing {{triggerNode_1.output.jobDescription}}
and {{triggerNode_1.output.resumeText}} unchanged and remove any extra blank
lines so MD041/MD047 are satisfied.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI (base), Organization UI (inherited)

Review profile: ASSERTIVE

Plan: Pro

Run ID: 95d51abe-986f-4d6c-add4-5c09fcf98609

📥 Commits

Reviewing files that changed from the base of the PR and between c429f64 and 09b2832.

⛔ Files ignored due to path filters (4)
  • screenshots/home.png is excluded by !**/*.png
  • screenshots/result.png is excluded by !**/*.png
  • screenshots/skill_gap.png is excluded by !**/*.png
  • submissions/harshul-dashora/ss/deployed.png is excluded by !**/*.png
📒 Files selected for processing (9)
  • submissions/harshul-dashora/.gitignore
  • submissions/harshul-dashora/README.md
  • submissions/harshul-dashora/agent.md
  • submissions/harshul-dashora/constitutions/default.md
  • submissions/harshul-dashora/flows/resume-parser.ts
  • submissions/harshul-dashora/lamatic.config.ts
  • submissions/harshul-dashora/model-configs/resume-parser_llmnode-139_generative-model-name.ts
  • submissions/harshul-dashora/prompts/resume-parser_llmnode-139_system_0.md
  • submissions/harshul-dashora/prompts/resume-parser_llmnode-139_user_1.md

Comment thread submissions/harshul-dashora/flows/resume-parser.ts
Comment on lines +10 to +12
"credentialId": "64ea54b7-4f9f-4ec2-af20-4a2c1f0f6dc5",
"provider_name": "gemini",
"credential_name": "aiinterview"
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Mission directive: remove hardcoded credential identifiers from committed config.

Line 10 and Line 12 embed credential metadata directly. Even when not raw secrets, these identifiers leak internal tenancy details and make the kit non-portable across environments.

Suggested fix
-      "credentialId": "64ea54b7-4f9f-4ec2-af20-4a2c1f0f6dc5",
       "provider_name": "gemini",
-      "credential_name": "aiinterview"
+      "credential_name": ""
Based on learnings: “Every kit must include a `.env.example` file with placeholder values (never real secrets)”.
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
"credentialId": "64ea54b7-4f9f-4ec2-af20-4a2c1f0f6dc5",
"provider_name": "gemini",
"credential_name": "aiinterview"
"provider_name": "gemini",
"credential_name": ""
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@submissions/harshul-dashora/model-configs/resume-parser_llmnode-139_generative-model-name.ts`
around lines 10 - 12, Remove the hardcoded credential metadata values
(credentialId and credential_name) from the committed config and replace usage
with environment-driven values (e.g., read process.env variables such as
GEMINI_CREDENTIAL_ID and GEMINI_CREDENTIAL_NAME where the config is loaded);
ensure provider_name remains generic or is also driven by an env var (e.g.,
GEMINI_PROVIDER_NAME) if environment-specific. Add a .env.example file with
placeholder keys (GEMINI_CREDENTIAL_ID, GEMINI_CREDENTIAL_NAME,
GEMINI_PROVIDER_NAME) and update any initialization/loading code that references
credentialId, credential_name, or provider_name to pull from those env vars
instead of literals. Commit the config with no real identifiers and include
.env.example for guidance.

Comment thread submissions/harshul-dashora/prompts/resume-parser_llmnode-139_user_1.md Outdated
@akshatvirmani akshatvirmani changed the title AI Interview Preparation Agent - Lamatic AgentKit Challenge feat: AI Interview Preparation Agent - Lamatic AgentKit Challenge Jun 3, 2026
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

♻️ Duplicate comments (1)
submissions/harshul-dashora/flows/resume-parser.ts (1)

111-111: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Mission critical: keep response fields typed as JSON, not strings.

Your mission, should you choose to accept it: remove quote-wrapping around structured placeholders so strengths, gaps, and questions stay arrays/objects per the system-schema contract.

Suggested patch
-        "outputMapping": "{\n  \"strengths\": \"{{LLMNode_139.output.generatedResponse.strengths}}\",\n  \"gaps\": \"{{LLMNode_139.output.generatedResponse.gaps}}\",\n  \"questions\": \"{{LLMNode_139.output.generatedResponse.questions}}\"\n}"
+        "outputMapping": "{\n  \"strengths\": {{LLMNode_139.output.generatedResponse.strengths}},\n  \"gaps\": {{LLMNode_139.output.generatedResponse.gaps}},\n  \"questions\": {{LLMNode_139.output.generatedResponse.questions}}\n}"
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@submissions/harshul-dashora/flows/resume-parser.ts` at line 111, The
outputMapping currently wraps structured placeholders in quotes so strengths,
gaps, and questions become strings; update outputMapping to remove the
surrounding quotes so the placeholders reference
LLMNode_139.output.generatedResponse.* as raw JSON (e.g., strengths:
{{LLMNode_139.output.generatedResponse.strengths}}) ensuring the fields remain
arrays/objects per the system-schema contract; locate the outputMapping entry
containing "LLMNode_139" and adjust strengths, gaps, and questions accordingly.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@submissions/harshul-dashora/prompts/resume-parser_llmnode-139_user_1.md`:
- Around line 1-3: The Markdown file's H1 "# Resume Parser Input" lacks a blank
line after it (MD022); insert a single empty line immediately after the H1 so
the file begins with "# Resume Parser Input" followed by a blank line before
"Job Description: {{triggerNode_1.output.jobDescription}}"; update the top of
the document containing the heading string "# Resume Parser Input" to satisfy
markdownlint spacing rules.

---

Duplicate comments:
In `@submissions/harshul-dashora/flows/resume-parser.ts`:
- Line 111: The outputMapping currently wraps structured placeholders in quotes
so strengths, gaps, and questions become strings; update outputMapping to remove
the surrounding quotes so the placeholders reference
LLMNode_139.output.generatedResponse.* as raw JSON (e.g., strengths:
{{LLMNode_139.output.generatedResponse.strengths}}) ensuring the fields remain
arrays/objects per the system-schema contract; locate the outputMapping entry
containing "LLMNode_139" and adjust strengths, gaps, and questions accordingly.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI (base), Organization UI (inherited)

Review profile: ASSERTIVE

Plan: Pro

Run ID: cbc77632-9fc6-444d-acea-783a110005dd

📥 Commits

Reviewing files that changed from the base of the PR and between 09b2832 and 870beba.

📒 Files selected for processing (3)
  • submissions/.env.example
  • submissions/harshul-dashora/flows/resume-parser.ts
  • submissions/harshul-dashora/prompts/resume-parser_llmnode-139_user_1.md

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

♻️ Duplicate comments (1)
submissions/harshul-dashora/prompts/resume-parser_llmnode-139_user_1.md (1)

4-4: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Mission: close out MD047 by restoring one trailing newline at EOF.

Line 4 currently ends the file without the required final newline; markdownlint will keep failing.

Patch
 Candidate Resume: {{triggerNode_1.output.resumeText}}
+
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@submissions/harshul-dashora/prompts/resume-parser_llmnode-139_user_1.md` at
line 4, The file ends without the required final newline; add a single trailing
newline at EOF so the last line "Candidate Resume:
{{triggerNode_1.output.resumeText}}" (reference the template variable
triggerNode_1.output.resumeText) is terminated by one newline character. Ensure
only one newline is added (not multiple) and save the file so markdownlint will
pass.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@submissions/harshul-dashora/flows/resume-parser.ts`:
- Line 111: The outputMapping is treating LLMNode_139.output.generatedResponse
as a parsed object (accessing .strengths/.gaps/.questions) but LLMNode_139 is a
dynamic text generator so generatedResponse is plain text; update the mapping to
map the whole generatedResponse into one string field (e.g., map to
generatedResponse.output) and parse/validate that JSON downstream, or replace
LLMNode_139 with a schema-enforcing node (e.g., an InstructorLLMNode configured
with a generatedResponse object schema) so strengths/gaps/questions become real
fields; modify the mapping in resume-parser.ts accordingly and ensure downstream
code expects the single-string field or the new typed fields.

---

Duplicate comments:
In `@submissions/harshul-dashora/prompts/resume-parser_llmnode-139_user_1.md`:
- Line 4: The file ends without the required final newline; add a single
trailing newline at EOF so the last line "Candidate Resume:
{{triggerNode_1.output.resumeText}}" (reference the template variable
triggerNode_1.output.resumeText) is terminated by one newline character. Ensure
only one newline is added (not multiple) and save the file so markdownlint will
pass.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI (base), Organization UI (inherited)

Review profile: ASSERTIVE

Plan: Pro

Run ID: 7aad757e-37b9-4dc4-a516-54d32d940839

📥 Commits

Reviewing files that changed from the base of the PR and between 870beba and a42e532.

📒 Files selected for processing (2)
  • submissions/harshul-dashora/flows/resume-parser.ts
  • submissions/harshul-dashora/prompts/resume-parser_llmnode-139_user_1.md

Comment thread submissions/harshul-dashora/flows/resume-parser.ts Outdated
@harshuldashora
Copy link
Copy Markdown
Author

All requested CodeRabbit changes have been addressed and the automated checks are now passing successfully.

The agent has been deployed and tested end-to-end. Documentation, screenshots, demo video, and exported AgentKit files have been included in the submission.

Looking forward to your review. Thank you!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants