Local CLI Agent for deterministic multi-round resume matching with Pydantic AI
Project description
SeekTalent
English
SeekTalent is an experimental local-first resume matching engine. It turns a required job title, a job description, and optional sourcing notes into a deterministic multi-round shortlist using requirement extraction, controlled CTS retrieval, per-resume scoring, reflection, and finalization.
The current product shape is intentionally narrow:
- the primary product is a local CLI
- the same runtime can also be imported as a Python dependency
- a minimal local web UI still exists, but it is secondary
Highlights
- Installable CLI with stable subcommands:
run,init,doctor,version,update,inspect - Stable Python entrypoints:
run_match(...)andrun_match_async(...) - Structured run artifacts written under
runs/by default - Explicit text-LLM configuration using
SEEKTALENT_TEXT_LLM_*plus bare*_MODEL_IDvalues - Real CTS integration with explicit credential requirements
Quick Start
Prerequisites
- Python
3.12+ - one supported LLM provider credential
- CTS credentials for real CTS mode
Install as a CLI
From a local checkout:
uv build
pipx install dist/seektalent-0.5.11-py3-none-any.whl
If you prefer a plain Python environment:
pip install dist/seektalent-0.5.11-py3-none-any.whl
The current starter env defaults to the canonical text-LLM surface, with SEEKTALENT_TEXT_LLM_PROTOCOL_FAMILY=openai_chat_completions_compatible, the matching SEEKTALENT_TEXT_LLM_ENDPOINT_* values, and bare stage *_MODEL_ID settings. Dual-protocol support still exists through the same SEEKTALENT_TEXT_LLM_* surface.
Create a starter env file
seektalent init
In a source checkout, .env.example is the single editable env template. The packaged mirror stays in src/seektalent/default.env so installed wheels can still run seektalent init.
Fill the required values in .env
At minimum:
SEEKTALENT_TEXT_LLM_API_KEY=your-text-llm-key
SEEKTALENT_CTS_TENANT_KEY=your-cts-tenant-key
SEEKTALENT_CTS_TENANT_SECRET=your-cts-tenant-secret
Active model configuration uses the SEEKTALENT_TEXT_LLM_* tuple plus bare *_MODEL_ID values. SEEKTALENT_TEXT_LLM_API_KEY is the canonical runtime credential.
Validate the local setup
seektalent doctor
Recommended black-box workflow
seektalent --help
seektalent doctor
seektalent run --job-title-file ./job_title.md --jd-file ./jd.md
seektalent inspect --json
seektalent update
Run one workflow
seektalent run \
--job-title "Python agent engineer" \
--jd "Python agent engineer with retrieval and ranking experience"
Add notes when you want to inject sourcing preferences or exclusions:
seektalent run \
--job-title "Python agent engineer" \
--jd "Python agent engineer with retrieval and ranking experience" \
--notes "Shanghai preferred, avoid pure frontend profiles"
Canonical output is human-readable. For wrappers and scripts, use machine output:
seektalent run \
--job-title "Python agent engineer" \
--jd "Python agent engineer" \
--notes "Shanghai preferred" \
--json
Print upgrade instructions
seektalent update
Inspect the published CLI contract
seektalent inspect --json
Install Paths
Terminal users
Recommended:
pipx install dist/seektalent-0.5.11-py3-none-any.whl
This gives you the seektalent command directly.
Python integrators
pip install dist/seektalent-0.5.11-py3-none-any.whl
Then:
from seektalent import run_match
result = run_match(
job_title="Python agent engineer",
jd="Python agent engineer",
)
print(result.final_markdown)
print(result.run_dir)
CLI
The canonical entrypoint is:
seektalent run --help
Available commands:
seektalent runseektalent initseektalent doctorseektalent versionseektalent updateseektalent inspect
Recommended black-box sequence:
seektalent --helpseektalent doctorseektalent runseektalent inspect --jsonseektalent update
Key options on run:
--job-titleor--job-title-filefor the required job title--jdor--jd-filefor the required job description--notesor--notes-filefor optional sourcing preferences--env-file--output-dir--json
The default output root is ./runs relative to the current working directory. Override it per run with:
seektalent run \
--job-title "Python agent engineer" \
--jd "Python agent engineer" \
--notes "Shanghai preferred" \
--output-dir ./outputs
Full CLI reference:
Wrapping SeekTalent
Two supported wrapper patterns are intentionally stable:
Wrap the CLI
Run:
seektalent run --job-title "..." --jd "..." --json
Then read the single JSON object from stdout.
Wrap the library
from seektalent import run_match
result = run_match(job_title="...", jd="...", notes="...")
payload = result.final_result.model_dump(mode="json")
Pass notes="..." when you want to add sourcing preferences; omit it when JD alone is enough.
Use this path when you want to build your own API server, desktop shell, or workflow wrapper around the runtime.
Configuration
Environment variables are read from .env by default. You will usually configure:
- the canonical text-LLM runtime credential
SEEKTALENT_TEXT_LLM_API_KEY - text-LLM protocol and endpoint settings under
SEEKTALENT_TEXT_LLM_*, plus bare stage*_MODEL_IDvalues - CTS settings such as
SEEKTALENT_CTS_BASE_URL,SEEKTALENT_CTS_TENANT_KEY, andSEEKTALENT_CTS_TENANT_SECRET - runtime settings such as round limits, concurrency, and output directory
Full configuration reference:
Important rules:
- active model variables use bare
*_MODEL_IDvalues, not provider-prefixed strings - the canonical runtime credential is
SEEKTALENT_TEXT_LLM_API_KEY - protocol selection and endpoint routing are configured through
SEEKTALENT_TEXT_LLM_*
Web UI
The repository still includes a minimal local web UI:
- backend API:
seektalent-ui-api - frontend app:
apps/web - default backend port:
8011 - default frontend port:
5176
Start the backend:
uv run seektalent-ui-api
Start the frontend in another terminal:
cd apps/web
bun install
bun run dev
Then open:
http://127.0.0.1:5176
Outputs
Each run creates a timestamped directory under runs/ by default, including files such as:
trace.logevents.jsonlrun_config.jsonfinal_candidates.jsonfinal_answer.md- per-round controller / retrieval / reflection / scoring artifacts
Output reference:
Limits
Current boundaries are intentional:
- this is an experimental local engine, not a hosted multi-tenant product
- the web UI is a thin local shim, not a full recruiting platform
- the CTS adapter is scoped to the fields and semantics implemented in this repository
- the runtime is built for auditable deterministic control flow, not open-ended autonomous tool use
Docs
Start with:
- Architecture for the component map, architecture diagram, and runtime sequence.
- CLI for the command contract.
- Configuration for environment variables and model settings.
- Outputs for run artifacts and diagnostics.
- UI for the local web shell.
- Development for local checks and repository conventions.
Historical versioned design notes remain under docs/v-*.
License
This project is licensed under the GNU Affero General Public License v3.0.
See LICENSE.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file seektalent-0.6.3.tar.gz.
File metadata
- Download URL: seektalent-0.6.3.tar.gz
- Upload date:
- Size: 249.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c34963d6eeb740e99d40d439850385b76403ce1d848f2164b1d916727d5f9e46
|
|
| MD5 |
cf3b7a117bf37fab94dc33fd22710132
|
|
| BLAKE2b-256 |
c58a42ab9208dc7d510196e6d348444042532436be5d48531f70a078a64e57b6
|
Provenance
The following attestation bundles were made for seektalent-0.6.3.tar.gz:
Publisher:
publish-pypi.yml on FrankQDWang/SeekTalent
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
seektalent-0.6.3.tar.gz -
Subject digest:
c34963d6eeb740e99d40d439850385b76403ce1d848f2164b1d916727d5f9e46 - Sigstore transparency entry: 1523677550
- Sigstore integration time:
-
Permalink:
FrankQDWang/SeekTalent@96cf616f071a9b320218407372469628dcae297e -
Branch / Tag:
refs/tags/0.6.3 - Owner: https://github.com/FrankQDWang
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@96cf616f071a9b320218407372469628dcae297e -
Trigger Event:
release
-
Statement type:
File details
Details for the file seektalent-0.6.3-py3-none-any.whl.
File metadata
- Download URL: seektalent-0.6.3-py3-none-any.whl
- Upload date:
- Size: 303.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f617f6c3f696243486276e8c1e419560491732ee9e48ad1b4d917120c1854970
|
|
| MD5 |
9deab4f0815461b6dda237e904f01aa6
|
|
| BLAKE2b-256 |
481827d642daefab2ed676e51ccbad2190656f9a0a5980f33363803e05267a8a
|
Provenance
The following attestation bundles were made for seektalent-0.6.3-py3-none-any.whl:
Publisher:
publish-pypi.yml on FrankQDWang/SeekTalent
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
seektalent-0.6.3-py3-none-any.whl -
Subject digest:
f617f6c3f696243486276e8c1e419560491732ee9e48ad1b4d917120c1854970 - Sigstore transparency entry: 1523677553
- Sigstore integration time:
-
Permalink:
FrankQDWang/SeekTalent@96cf616f071a9b320218407372469628dcae297e -
Branch / Tag:
refs/tags/0.6.3 - Owner: https://github.com/FrankQDWang
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@96cf616f071a9b320218407372469628dcae297e -
Trigger Event:
release
-
Statement type: