Skip to main content

Local CLI Agent for deterministic multi-round resume matching with Pydantic AI

Project description

SeekTalent

English 简体中文

English

SeekTalent is a local-first recruiter workbench with a stable CLI and a local browser UI. 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 local-first:

  • the CLI remains the stable terminal entrypoint;
  • the local recruiter workbench is the primary browser UI for business workflows;
  • business data, workbench state, run artifacts, provider snapshots, and backups stay local by default;
  • account entitlement may use a minimal remote control plane, but SeekTalent is not a hosted recruiting SaaS.

Highlights

  • Installable CLI with stable subcommands: run, workbench, init, doctor, version, update, inspect
  • Stable Python entrypoints: run_match(...) and run_match_async(...)
  • Structured run artifacts written under runs/ by default
  • Explicit text-LLM configuration using SEEKTALENT_TEXT_LLM_* plus bare *_MODEL_ID values
  • 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.6.4-py3-none-any.whl

If you prefer a plain Python environment:

pip install dist/seektalent-0.6.4-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

For installed PyPI users, seektalent init writes a minimal .env with only three required values:

SEEKTALENT_TEXT_LLM_API_KEY=
SEEKTALENT_CTS_TENANT_KEY=
SEEKTALENT_CTS_TENANT_SECRET=

All other runtime, output, cleanup, and model settings use product defaults. Source checkout developers should use .env.example for the full development configuration surface.

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

Installed PyPI users start the local Workbench with the packaged frontend:

seektalent workbench

The command starts the backend and serves the built Svelte Workbench from the same loopback origin. It does not require Bun, Node, Vite, or a repository checkout on the user's machine.

For source checkout development, use the repo-local OpenCLI/Svelte launcher:

scripts/start-dev-workbench.sh

The development launcher installs Svelte dependencies with Bun when needed, points SEEKTALENT_LIEPIN_OPENCLI_COMMAND at apps/web-svelte/node_modules/.bin/opencli, exports SEEKTALENT_LIEPIN_WORKER_MODE=opencli plus SEEKTALENT_LIEPIN_BROWSER_ACTION_BACKEND=opencli, then starts the backend on 127.0.0.1:8012 and the Svelte Workbench on 127.0.0.1:5178. The user still installs and connects the OpenCLI Chrome extension in their own Chrome profile. When OpenCLI is selected and ready, Liepin behavior is real local browser behavior, not fixture data.

doctor, inspect --json, cleanup, and Workbench startup do not upload local databases, provider cookies, browser sessions, raw resumes, or configured secrets. Runtime network calls are limited to the configured LLM provider and CTS provider. Remote eval logging through W&B/Weave is off by default and requires explicit configuration.

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.6.4-py3-none-any.whl

This gives you the seektalent command directly.

Python integrators

pip install dist/seektalent-0.6.4-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 run
  • seektalent init
  • seektalent doctor
  • seektalent version
  • seektalent update
  • seektalent inspect

Recommended black-box sequence:

  • seektalent --help
  • seektalent doctor
  • seektalent run
  • seektalent inspect --json
  • seektalent update

Key options on run:

  • --job-title or --job-title-file for the required job title
  • --jd or --jd-file for the required job description
  • --notes or --notes-file for 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_ID values
  • CTS settings such as SEEKTALENT_CTS_BASE_URL, SEEKTALENT_CTS_TENANT_KEY, and SEEKTALENT_CTS_TENANT_SECRET
  • runtime settings such as round limits, concurrency, and output directory

Full configuration reference:

Important rules:

  • active model variables use bare *_MODEL_ID values, 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_*

Local Workbench

The repository includes the source-checkout local workbench:

  • 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.log
  • events.jsonl
  • run_config.json
  • final_candidates.json
  • final_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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

seektalent-0.6.4.tar.gz (1.1 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

seektalent-0.6.4-py3-none-any.whl (1.2 MB view details)

Uploaded Python 3

File details

Details for the file seektalent-0.6.4.tar.gz.

File metadata

  • Download URL: seektalent-0.6.4.tar.gz
  • Upload date:
  • Size: 1.1 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for seektalent-0.6.4.tar.gz
Algorithm Hash digest
SHA256 aed3a772e9375705e20f5c5b7b22c449a0d5fe03ef7a6be49b1080a416e058d9
MD5 894761825a0e404475d8486250579070
BLAKE2b-256 9656aff4fcde090bd5ef8bcb5abd2f8a5abb61224f13d5b8b8fd7888af0e8451

See more details on using hashes here.

Provenance

The following attestation bundles were made for seektalent-0.6.4.tar.gz:

Publisher: publish-pypi.yml on FrankQDWang/SeekTalent

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file seektalent-0.6.4-py3-none-any.whl.

File metadata

  • Download URL: seektalent-0.6.4-py3-none-any.whl
  • Upload date:
  • Size: 1.2 MB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for seektalent-0.6.4-py3-none-any.whl
Algorithm Hash digest
SHA256 d532080649d3d2c71c800e62954c18a73c0d4f472f41f445fd5dc1022234e24a
MD5 ad4bfc1eeb7ad04decf6f7507362f711
BLAKE2b-256 42b46cf6953eae18f8f2834ee969b5a314ca62ee63d071f5aba33e51358f3512

See more details on using hashes here.

Provenance

The following attestation bundles were made for seektalent-0.6.4-py3-none-any.whl:

Publisher: publish-pypi.yml on FrankQDWang/SeekTalent

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page