Skip to main content

Python SDK and MCP server for the Intellign optimization platform — assignment, scheduling, routing, allocation, and matching problems solved via API

Project description

intellign

PyPI Python CI License: MIT

Python SDK + MCP server for the Intellign optimization platform — describe assignment, scheduling, routing, allocation, or matching problems and get solved rosters back. All computation runs server-side; this package is a typed HTTP client plus an MCP wrapper.

Guides: SDK guide · REST API reference · MCP server · Deployment · Examples


Install

pip install intellign                  # core SDK (httpx + pydantic)
pip install "intellign[mcp]"           # + intellign-mcp server
pip install "intellign[pandas]"        # + Result.to_dataframe()
pip install "intellign[ical]"          # + Result.export_ical()

Python ≥ 3.10. Get an API key from your Intellign dashboard — ik_live_ (production) or ik_test_ (free sandbox: ≤200 entities/targets, capped solver budget, no quota usage).

Quickstart

from intellign import Client, Problem

client = Client(
    api_key="ik_live_...",
    base_url="https://api.intellign.ai",   # or your deployment / http://localhost:8000
)

nurses = [
    {"id": "n1", "name": "Ada",  "skills": "triage,general"},
    {"id": "n2", "name": "Bola", "skills": "surgery"},
]
clinics = [
    {"id": "c1", "name": "ER",      "required_skills": "triage",  "capacity": 1},
    {"id": "c2", "name": "Theatre", "required_skills": "surgery", "capacity": 1},
]

problem = (
    Problem.assignment(name="Nurse assignment")
    .entities(rows=nurses)
    .targets(rows=clinics)
    .maximize("skill_match", weight=70,
              entity_column="skills", target_column="required_skills")
    .maximize("workload_balance", weight=30, target_column="capacity")
    .require("entity.skills superset_of target.required_skills")   # hard constraint
    .quality("balanced")                                           # fast | balanced | best
)

result = client.submit(problem).wait()
for a in result.assignments:
    print(a["resource_id"], "->", a["target_id"])

df = result.to_dataframe()              # optional pandas extra

Async — identical surface, plus SSE progress streaming:

from intellign import AsyncClient

async with AsyncClient(api_key="ik_live_...") as client:
    job = await client.submit(problem)
    async for event in job.stream_progress():
        print(event.get("current_generation"), event.get("best_fitness"))
    result = await job.result()

What you can do

Capability SDK entry point Example
Structured solve (builder) Problem.assignment()...client.submit() examples/01
Upload data once, reference by id client.upload_dataset("team.csv").entities(dataset_id=...) examples/02
Natural-language solve client.solve_nl("assign vans to zones...", ds_a, ds_b) examples/03
Starter templates client.templates() / client.template(name) examples/04
Live progress (SSE) job.stream_progress() (sync or async) examples/05
Webhooks on completion client.create_webhook(url) — HMAC-signed deliveries examples/06
Guided conversational flow client.create_session() / send_message() / export_session() examples/07
Robust error handling typed exceptions, idempotency keys, retries examples/08
LLM tool access (MCP) intellign-mcp — stdio + Streamable HTTP MCP guide

Objectives & constraints

Objectives are named metrics with weights (live catalog: client.capabilities()): skill_match, distance, workload_balance, attribute_match, cost, preference_match — each maximize or minimize.

Constraints use a small formal grammar (invalid expressions are rejected at create time with the reason):

entity.skills superset_of target.required_skills
entity.hours <= target.max_hours          # also >= == < >, or numeric literal
sum(entity.load) <= target.capacity
haversine(entity.location, target.location) <= 25
entity.region in ['north', 'east']

.require(expr) = hard (violation weight 100); .require(expr, hard=False) = soft.

Jobs & results

client.submit() returns a Job: .status(), .wait(timeout=300), .result(), .stream_progress(). Solves are asynchronous server-side — prefer webhooks over polling for production integrations.

Result: .assignments (list of dicts with resource_id/target_id/ score/rationale), .metrics, .best_fitness, .to_dataframe(), .export_ical(path) for scheduling results with start/end timestamps.

Errors, retries, idempotency

Every API failure raises a typed subclass of IntelligError carrying .code, .status_code, and .request_id (quote it in support requests): AuthenticationError, ScopeError, InvalidSpecError, NotFoundError, ConflictError, QuotaError, RateLimitError (.retry_after), SandboxLimitError, SolveFailedError, ServerError.

  • The client automatically retries 429/502/503/504 (honoring Retry-After).
  • Pass idempotency_key="your-uuid" to create_problem/solve_problem — retries return the original response instead of duplicating work (24 h window).
  • Rate limits per key/minute by plan: free 30, pro 120, enterprise 600.

Full error taxonomy and endpoint reference: API.md.

Webhooks

hook = client.create_webhook("https://myapp.com/hooks/intellign")
secret = hook["secret"]        # shown exactly once — store it

Deliveries are POSTs with X-Intellign-Event and X-Intellign-Signature: sha256=<hmac_sha256(secret, raw_body)>; verify with a constant-time compare (working receiver: examples/06_webhooks.py). Failed deliveries retry 3× and everything is inspectable via client.webhook_deliveries(id).

MCP server

Expose Intellign as tools to Claude or any MCP client:

pip install "intellign[mcp]"
INTELLIGN_API_KEY=ik_live_... intellign-mcp                          # stdio (local)
intellign-mcp --transport http --port 8001 --stateless               # hosted, multi-tenant

Tools: create_problem, solve_problem, get_status, get_result, list_templates, get_template. Resources: intellign://schema/spec, intellign://capabilities. Over HTTP each request authenticates with its own Authorization: Bearer ik_... header. Setup + hosting: MCP.md and DEPLOYMENT.md.

Development

python3 -m venv .venv && .venv/bin/pip install -e ".[dev]"
.venv/bin/python -m pytest -q                     # unit suite (offline)

# contract tests against a live server:
INTELLIGN_CONTRACT_BASE_URL=http://localhost:8000 \
INTELLIGN_CONTRACT_API_KEY=ik_... .venv/bin/python -m pytest -m contract -q

.venv/bin/python -m build                         # wheel + sdist into dist/

Layout: src/intellign/ (client, spec models, builders, job/result, errors, mcp/server.py), tests/ (unit, respx-mocked), tests/contract/ (env-gated, live server), examples/ (runnable per capability).

Releasing

CI (.github/workflows/ci.yml) tests every push/PR on Python 3.10–3.12 and builds artifacts. Publishing (publish.yml) uses PyPI Trusted Publishing:

  1. Bump src/intellign/_version.py.
  2. Commit, tag vX.Y.Z, push the tag.
  3. Create a GitHub Release from the tag → workflow builds, verifies the tag matches the package version, and publishes to PyPI via OIDC (no token secrets). One-time setup: add this repo as a trusted publisher on pypi.org (workflow publish.yml, environment pypi) and create the pypi environment in repo settings.

License

MIT

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

intellign-0.1.1.tar.gz (37.7 kB view details)

Uploaded Source

Built Distribution

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

intellign-0.1.1-py3-none-any.whl (19.8 kB view details)

Uploaded Python 3

File details

Details for the file intellign-0.1.1.tar.gz.

File metadata

  • Download URL: intellign-0.1.1.tar.gz
  • Upload date:
  • Size: 37.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for intellign-0.1.1.tar.gz
Algorithm Hash digest
SHA256 a35d4fa608caeccd9ded41a29b1575feec39b175e1b534a325ffbcc9c9c3e2d6
MD5 a19cda5ac62bc682a8845f0cc1393c59
BLAKE2b-256 e41462113d4ef66542b022103538f5756051347854893efb122c8ce4a37033c7

See more details on using hashes here.

Provenance

The following attestation bundles were made for intellign-0.1.1.tar.gz:

Publisher: publish.yml on DataBacked-Africa/intellign-python

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

File details

Details for the file intellign-0.1.1-py3-none-any.whl.

File metadata

  • Download URL: intellign-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 19.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for intellign-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 5d1a73613e42988459dc8dc2e7b247c5cf3749648db23bf79c5552b3a3f04112
MD5 944f985b72570cd4270eaf852a2296a7
BLAKE2b-256 2541aa6ff3d4d5d9174e7374dac72ef3ef63c28917c4166bc2b6e807dea3ad53

See more details on using hashes here.

Provenance

The following attestation bundles were made for intellign-0.1.1-py3-none-any.whl:

Publisher: publish.yml on DataBacked-Africa/intellign-python

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