# gauris-io/90_degrees architecture

> Architecture diagram of the GitHub repository gauris-io/90_degrees, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-25). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/gauris-io/90_degrees
- Repository: https://github.com/gauris-io/90_degrees

## Overview

QuantHire is a simulated talent-sourcing agent: it reads a task brief, searches candidates or requests skill recommendations, shortlists candidates, and submits for a budget-sensitive score. The local agent loop and HTTP server are separate entry points into the same environment. The README describes an Alt-Data/GNN pipeline, but the sampled environment implements graph recommendations with a small in-memory skill map and candidate list; no ingestion or trained GNN implementation is evidenced here.

Main entry points: [`env.py`](https://github.com/gauris-io/90_degrees/blob/main/env.py) (Environment state and dispatcher), [`inference.py`](https://github.com/gauris-io/90_degrees/blob/main/inference.py) (Agent loop), [`server/app.py`](https://github.com/gauris-io/90_degrees/blob/main/server/app.py) (OpenEnv HTTP handler)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_agent["Agent"]
  node_inference["Agent loop<br/>[inference.py]"]
end

subgraph group_environment["Talent environment"]
  node_env["Environment state and dispatcher<br/>[env.py]"]
  node_brief["Task brief<br/>[env.py]"]
  node_catalog[("Candidate catalog<br/>[env.py]")]
  node_search["Candidate search<br/>[env.py]"]
  node_recommend["Skill recommendations<br/>[env.py]"]
  node_shortlist[("Shortlist<br/>[env.py]")]
  node_grader["Submission grader<br/>[env.py]"]
end

subgraph group_serving["HTTP serving"]
  node_http["OpenEnv HTTP handler<br/>[app.py]"]
end

node_recruiter(("Recruiter"))
node_llm["Hugging Face model API"]
node_client(("Evaluation client"))

node_recruiter -->|"starts task"| node_inference
node_inference -->|"resets and steps"| node_env
node_env -->|"builds brief"| node_brief
node_env -->|"returns observation"| node_inference
node_inference -.->|"requests action"| node_llm
node_llm -.->|"returns JSON"| node_inference
node_inference -->|"submits action"| node_env
node_env -->|"dispatches search"| node_search
node_search -->|"filters candidates"| node_catalog
node_env -->|"dispatches recommendation"| node_recommend
node_recommend -->|"selects adjacent skills"| node_catalog
node_env -->|"adds candidate"| node_shortlist
node_env -->|"grades submission"| node_grader
node_grader -->|"returns reward"| node_env
node_client -->|"sends requests"| node_http
node_http -->|"resets and steps"| node_env
node_env -->|"returns state and reward"| node_http

click node_inference "https://github.com/gauris-io/90_degrees/blob/main/inference.py"
click node_env "https://github.com/gauris-io/90_degrees/blob/main/env.py"
click node_brief "https://github.com/gauris-io/90_degrees/blob/main/env.py"
click node_catalog "https://github.com/gauris-io/90_degrees/blob/main/env.py"
click node_search "https://github.com/gauris-io/90_degrees/blob/main/env.py"
click node_recommend "https://github.com/gauris-io/90_degrees/blob/main/env.py"
click node_shortlist "https://github.com/gauris-io/90_degrees/blob/main/env.py"
click node_grader "https://github.com/gauris-io/90_degrees/blob/main/env.py"
click node_http "https://github.com/gauris-io/90_degrees/blob/main/server/app.py"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_inference,node_client toneBlue
class node_env,node_brief,node_catalog,node_search,node_recommend,node_shortlist,node_grader toneAmber
class node_http,node_llm toneMint
class node_recruiter toneIndigo
```

## Components

### Agent

- [Agent loop](https://github.com/gauris-io/90_degrees/blob/main/inference.py): `inference.py`

### Talent environment

- [Environment state and dispatcher](https://github.com/gauris-io/90_degrees/blob/main/env.py): `env.py`
- [Task brief](https://github.com/gauris-io/90_degrees/blob/main/env.py): `env.py`
- [Candidate catalog](https://github.com/gauris-io/90_degrees/blob/main/env.py): `env.py`
- [Candidate search](https://github.com/gauris-io/90_degrees/blob/main/env.py): `env.py`
- [Skill recommendations](https://github.com/gauris-io/90_degrees/blob/main/env.py): `env.py`
- [Shortlist](https://github.com/gauris-io/90_degrees/blob/main/env.py): `env.py`
- [Submission grader](https://github.com/gauris-io/90_degrees/blob/main/env.py): `env.py`

### HTTP serving

- [OpenEnv HTTP handler](https://github.com/gauris-io/90_degrees/blob/main/server/app.py): `server/app.py`

### Other components

- **Recruiter**
- **Hugging Face model API**
- **Evaluation client**

## Connections

- Recruiter → Agent loop: starts task
- Agent loop → Environment state and dispatcher: resets and steps
- Environment state and dispatcher → Task brief: builds brief
- Environment state and dispatcher → Agent loop: returns observation
- Agent loop → Hugging Face model API: requests action
- Hugging Face model API → Agent loop: returns JSON
- Agent loop → Environment state and dispatcher: submits action
- Environment state and dispatcher → Candidate search: dispatches search
- Candidate search → Candidate catalog: filters candidates
- Environment state and dispatcher → Skill recommendations: dispatches recommendation
- Skill recommendations → Candidate catalog: selects adjacent skills
- Environment state and dispatcher → Shortlist: adds candidate
- Environment state and dispatcher → Submission grader: grades submission
- Submission grader → Environment state and dispatcher: returns reward
- Evaluation client → OpenEnv HTTP handler: sends requests
- OpenEnv HTTP handler → Environment state and dispatcher: resets and steps
- Environment state and dispatcher → OpenEnv HTTP handler: returns state and reward
