Hari Prakash K. Staff Engineer. Bengaluru, India.

Backend
engineering.
Applied AI.

I’m Hari, a Staff Engineer at Odessa Solutions in Bengaluru. I build Python backend services and agentic AI systems for finance and leasing, with 7+ years in engineering and 2+ years in agentic AI.

Architecture. Implementation. Evidence.

Selected impact

Results from the systems I build.

Highlights from my professional work at Odessa Solutions.

Lower API response latency
30%
Asynchronous Python/FastAPI services and SQLAlchemy connection pooling across high-volume data workloads.
Odessa Solutions | Senior Software Engineer
Lower token and cloud compute costs
35%
Containerized local/cloud LLM integration supporting on-premises enterprise data requirements.
Odessa Solutions | Staff Engineer
Read the experience behind these results

Areas of focus

From the service
to the intelligence.

Backend systems

Python/FastAPI services, SQL performance, and data flows for finance and leasing systems.

  • Python
  • FastAPI
  • SQL Server

Applied AI

Enterprise RAG, tool-calling agents, ticket triage, and retrieval evaluation.

  • LangGraph
  • Hybrid RAG
  • MCP

Engineering practice

Personal AWS deployments, containerized LLM integration, and AI-assisted development.

  • AWS
  • Docker
  • Claude Code / Codex

Project notebook

The thinking behind the work.

All projects
Personal projectPrototype

Twin — AI digital twin on AWS

A personal AI chat prototype that answers from profile context and conversation history, with a FastAPI backend and Terraform-defined AWS infrastructure.

  • Python
  • FastAPI
  • Amazon Bedrock
  • AWS Lambda
  • S3
  • Terraform
  • Next.js
Read project notes
Twin: application and AWS deployment architectureComponent and data flow map · based on repository code

On smaller screens, scroll the diagram horizontally or read the text version below.

Twin: application and AWS deployment architectureA browser loads the Next.js interface through CloudFront and S3. Chat requests reach API Gateway and a Lambda-hosted FastAPI app through Mangum. The backend combines profile context and session history, calls Bedrock, stores the conversation, and returns the reply. A separate GitHub Actions workflow packages and provisions the AWS resources with Terraform.Application and data flowDeployment configurationopen chatsite assetsmessage + session_idinvoke handlerprofile inputsession historyrequest / replyresponse payloadpackageapply + uploadVisitor / browserProfessional profile questionsMessage + session identifierNext.js chat interfaceStatic frontendDisplays conversation repliesCloudFront + S3CDN + static frontend bucketServes exported site assetsAPI GatewayHTTP API · POST /chatForwards requests to LambdaLambda + FastAPIMangum adapter · chat handlerLoad history · build promptProfile contextFacts · summary · style notesLinkedIn document contentConversation memoryS3 in AWS / local JSON filesLoad history · save new turnsAmazon BedrockConverse APIPrompt + recent 50 messagesChat responseGenerated reply + session_idReturned to the chat interfaceGitHub ActionsOIDC AWS credentialsRuns deployment scriptBuild + packagePython Lambda ZIPNext.js static exportTerraform + deploymentLambda · API · S3 · CloudFrontProvision resources · upload

Solid arrows: application and data flow. Dashed arrows: feedback or deployment configuration.

Read components and connections as text

A browser loads the Next.js interface through CloudFront and S3. Chat requests reach API Gateway and a Lambda-hosted FastAPI app through Mangum. The backend combines profile context and session history, calls Bedrock, stores the conversation, and returns the reply. A separate GitHub Actions workflow packages and provisions the AWS resources with Terraform.

  • Visitor / browser: Professional profile questions. Message + session identifier.
  • Next.js chat interface: Static frontend. Displays conversation replies.
  • CloudFront + S3: CDN + static frontend bucket. Serves exported site assets.
  • API Gateway: HTTP API · POST /chat. Forwards requests to Lambda.
  • Lambda + FastAPI: Mangum adapter · chat handler. Load history · build prompt.
  • Profile context: Facts · summary · style notes. LinkedIn document content.
  • Conversation memory: S3 in AWS / local JSON files. Load history · save new turns.
  • Amazon Bedrock: Converse API. Prompt + recent 50 messages.
  • Chat response: Generated reply + session_id. Returned to the chat interface.
  • GitHub Actions: OIDC AWS credentials. Runs deployment script.
  • Build + package: Python Lambda ZIP. Next.js static export.
  • Terraform + deployment: Lambda · API · S3 · CloudFront. Provision resources · upload.
  • Visitor / browser → Next.js chat interface: open chat.
  • CloudFront + S3 → Next.js chat interface: site assets.
  • Next.js chat interface → API Gateway: message + session_id.
  • API Gateway → Lambda + FastAPI: invoke handler.
  • Profile context → Lambda + FastAPI: profile input.
  • Lambda + FastAPI ↔ Conversation memory: session history.
  • Lambda + FastAPI ↔ Amazon Bedrock: request / reply.
  • Lambda + FastAPI → Chat response: response payload.
  • Chat response → Next.js chat interface: HTTP response.
  • GitHub Actions → Build + package: package.
  • Build + package → Terraform + deployment: apply + upload.
Personal projectIn progress

BugFixer

An agent-assisted debugging project using LangGraph, filesystem tools through MCP, and a pytest tool to investigate a codebase and suggest fixes.

  • Python
  • LangGraph
  • OpenAI
  • MCP
  • pytest
Read project notes
BugFixer: agent investigation and tool feedback loopComponent and data flow map · based on repository code

On smaller screens, scroll the diagram horizontally or read the text version below.

BugFixer: agent investigation and tool feedback loopThe CLI loads configured filesystem MCP tools and a separate pytest tool, then starts a LangGraph workflow with message state. The model either finishes with a diagnosis and suggested fix or routes tool calls through ToolNode. Filesystem access and captured pytest output return as tool results for the next model step. A verified patch-and-rerun workflow remains future work.Current implementation · investigation and suggestionsstartload settingsinitial messagesmessage historymodel outputtool callsno tool calls → finishfilesystem toolrun_tests toolfile accessexecute tests in configured codebaseDebugging requestCLI prompt in main.pyFind bug · explain · suggest fixApplication entry pointLoad MCP + pytest toolsCompile and invoke the graphCodebase configurationSettings.codebase_dirFilesystem server directoryMessage stateadd_messages reducerRequest + model / tool historyModel nodeOpenAI model with bound toolsChooses tools or final responseConditional routingLangGraph tools_conditionTool calls → tools; else finishDiagnosis + suggestionFinal assistant messagePrinted to the CLITool executionLangGraph ToolNodeDispatch + return tool resultsTarget codebaseSource files and test suiteConfigured local directoryFilesystem MCP serverstdio · npx filesystem serverTools loaded through MCP clientpytest subprocessuv run pytest · 60s timeoutCaptured output + exit status

Solid arrows: application and data flow. Dashed arrows: feedback or deployment configuration.

Read components and connections as text

The CLI loads configured filesystem MCP tools and a separate pytest tool, then starts a LangGraph workflow with message state. The model either finishes with a diagnosis and suggested fix or routes tool calls through ToolNode. Filesystem access and captured pytest output return as tool results for the next model step. A verified patch-and-rerun workflow remains future work.

  • Debugging request: CLI prompt in main.py. Find bug · explain · suggest fix.
  • Application entry point: Load MCP + pytest tools. Compile and invoke the graph.
  • Codebase configuration: Settings.codebase_dir. Filesystem server directory.
  • Message state: add_messages reducer. Request + model / tool history.
  • Model node: OpenAI model with bound tools. Chooses tools or final response.
  • Conditional routing: LangGraph tools_condition. Tool calls → tools; else finish.
  • Diagnosis + suggestion: Final assistant message. Printed to the CLI.
  • Tool execution: LangGraph ToolNode. Dispatch + return tool results.
  • Target codebase: Source files and test suite. Configured local directory.
  • Filesystem MCP server: stdio · npx filesystem server. Tools loaded through MCP client.
  • pytest subprocess: uv run pytest · 60s timeout. Captured output + exit status.
  • Debugging request → Application entry point: start.
  • Codebase configuration → Application entry point: load settings.
  • Application entry point → Model node: initial messages.
  • Message state ↔ Model node: message history.
  • Model node → Conditional routing: model output.
  • Conditional routing → Tool execution: tool calls.
  • Conditional routing → Diagnosis + suggestion: no tool calls → finish.
  • Tool execution → Model node: tool results → next model step.
  • Tool execution ↔ Filesystem MCP server: filesystem tool.
  • Tool execution ↔ pytest subprocess: run_tests tool.
  • Filesystem MCP server ↔ Target codebase: file access.
  • pytest subprocess → Target codebase: execute tests in configured codebase.
Learning exerciseEvaluation lab

DeepEval — agent and RAG evaluation

An evaluation lab covering agent task completion, tool correctness, retrieval quality, grounded answers, and multi-turn conversation behavior.

  • Python
  • DeepEval
  • LangChain
  • OpenAI
  • MCP
Read project notes
DeepEval: agent, retrieval, and conversation evaluationComponent and data flow map · based on repository code

On smaller screens, scroll the diagram horizontally or read the text version below.

DeepEval: agent, retrieval, and conversation evaluationGolden inputs and expected behavior feed evaluation runners. Separate support-agent, RAG-agent, and multi-turn chatbot paths exercise tools, policy retrieval, and conversation history. Agent and RAG callbacks capture traces; chatbot tests capture turns. Metric suites use this evidence and configured graders to produce per-case scores and reasons, with no benchmark result claimed here.Cases and expected behaviorThree evaluation pathsCaptured evidence, grading, and resultstest inputsexpectationsagent casesRAG casesconversation turnstool calls + resultssemantic searchretain turnsmodel + tool spansreply + contextcaptured turnsactual + expectedLLM gradingscores + reasonsGolden test casesOrder / refund / policy inputsSmall example datasetsEvaluation runnersDataset evaluation iteratorConversation evaluate()Expected behaviorExpected tool namesReference answers for RAGSupport agentLangChain + OpenAIInstrumented tool-calling agentRAG support agentLangChain + OpenAIsearch_policies toolMulti-turn chatbotOpenAI SDK tool loopKeeps history between turnsSupport toolsOrder status + refund lookupsMCP shipping-options toolPolicy retrieval9 policies · OpenAI embeddingsInMemoryVectorStore · top 3Conversation historyUser / assistant messagesTool calls and tool resultsCaptured evidenceCallbacks + observe → tracesChat turns + retrieval contextOpenAI judge modelsLLM-based metric gradingUsed by configured metricsDeepEval metric suitesTask / tools · RAG qualityConversation qualityEvaluation outputPer-case scores + reasonsConfigured metric thresholds

Solid arrows: application and data flow.

Read components and connections as text

Golden inputs and expected behavior feed evaluation runners. Separate support-agent, RAG-agent, and multi-turn chatbot paths exercise tools, policy retrieval, and conversation history. Agent and RAG callbacks capture traces; chatbot tests capture turns. Metric suites use this evidence and configured graders to produce per-case scores and reasons, with no benchmark result claimed here.

  • Golden test cases: Order / refund / policy inputs. Small example datasets.
  • Evaluation runners: Dataset evaluation iterator. Conversation evaluate().
  • Expected behavior: Expected tool names. Reference answers for RAG.
  • Support agent: LangChain + OpenAI. Instrumented tool-calling agent.
  • RAG support agent: LangChain + OpenAI. search_policies tool.
  • Multi-turn chatbot: OpenAI SDK tool loop. Keeps history between turns.
  • Support tools: Order status + refund lookups. MCP shipping-options tool.
  • Policy retrieval: 9 policies · OpenAI embeddings. InMemoryVectorStore · top 3.
  • Conversation history: User / assistant messages. Tool calls and tool results.
  • Captured evidence: Callbacks + observe → traces. Chat turns + retrieval context.
  • OpenAI judge models: LLM-based metric grading. Used by configured metrics.
  • DeepEval metric suites: Task / tools · RAG quality. Conversation quality.
  • Evaluation output: Per-case scores + reasons. Configured metric thresholds.
  • Golden test cases → Evaluation runners: test inputs.
  • Expected behavior → Evaluation runners: expectations.
  • Evaluation runners → Support agent: agent cases.
  • Evaluation runners → RAG support agent: RAG cases.
  • Evaluation runners → Multi-turn chatbot: conversation turns.
  • Support agent ↔ Support tools: tool calls + results.
  • RAG support agent ↔ Policy retrieval: semantic search.
  • Multi-turn chatbot ↔ Conversation history: retain turns.
  • Support agent → Captured evidence: model + tool spans.
  • RAG support agent → Captured evidence: reply + context.
  • Multi-turn chatbot → Captured evidence: captured turns.
  • Captured evidence → DeepEval metric suites: actual + expected.
  • DeepEval metric suites ↔ OpenAI judge models: LLM grading.
  • DeepEval metric suites → Evaluation output: scores + reasons.

Get in touch

Have a backend or AI problem to solve?

Get in touch about Python backend engineering, applied AI, or opportunities to work together.