SDK Reference
Official Python and JavaScript SDKs with identical feature coverage. Choose your language once — the tab selection persists across the page.
Installation
Terminal
pip install qlm
Requires Python 3.8+. No native dependencies.
Terminal
npm install @qlm/sdk
Works in Node.js 18+ and modern browsers. Zero dependencies.
Configuration
Python
import qlm
# Option 1: Pass directly
client = qlm.Client(api_key="qlm_live_YOUR_KEY")
# Option 2: Environment variable (recommended)
# export QLM_API_KEY=qlm_live_YOUR_KEY
client = qlm.Client()
# Custom base URL (for self-hosted)
client = qlm.Client(
api_key="qlm_live_YOUR_KEY",
base_url="https://your-instance.example.com",
timeout=30 # seconds
)
JavaScript
import { QLMClient } from '@qlm/sdk';
// Option 1: Pass directly
const client = new QLMClient({ apiKey: 'qlm_live_YOUR_KEY' });
// Option 2: Environment variable (Node.js)
// QLM_API_KEY=qlm_live_YOUR_KEY
const client = new QLMClient();
// Custom base URL
const client = new QLMClient({
apiKey: 'qlm_live_YOUR_KEY',
baseUrl: 'https://your-instance.example.com',
timeout: 30000 // milliseconds
});
Optimize
Select optimal items from an item bank using adaptive item selection.
Python
result = client.optimize(
item_bank_id="ib_m3n4o5",
skill_levels=[0.5, -0.2, 0.8],
items_administered=["item_001", "item_002"],
n_select=5,
constraints={
"max_time": 300,
"content_balance": True,
"exclude_items": ["item_099"]
}
)
# Access results
result.job_id # 'opt_7f2a3b4c'
result.status # 'completed'
result.selected_items # [{'item_id': 'item_014', 'rank': 1}, ...]
JavaScript
const result = await client.optimize({
itemBankId: 'ib_m3n4o5',
skillLevels: [0.5, -0.2, 0.8],
itemsAdministered: ['item_001', 'item_002'],
nSelect: 5,
constraints: {
maxTime: 300,
contentBalance: true,
excludeItems: ['item_099']
}
});
// Access results
result.jobId; // 'opt_7f2a3b4c'
result.status; // 'completed'
result.selectedItems; // [{itemId: 'item_014', rank: 1}, ...]
Sessions
Full lifecycle: create, submit responses, check status, and delete.
Create Session
Python
session = client.sessions.create(
organization_id="org_x9y8z7",
item_bank_id="ib_m3n4o5",
domain="clinical",
config={
"max_items": 30,
"completion_threshold": 0.95
}
)
session.session_id # 'ses_a1b2c3d4'
session.status # 'active'
JavaScript
const session = await client.sessions.create({
organizationId: 'org_x9y8z7',
itemBankId: 'ib_m3n4o5',
domain: 'clinical',
config: {
maxItems: 30,
completionThreshold: 0.95
}
});
session.sessionId; // 'ses_a1b2c3d4'
Submit Responses
Python
update = client.sessions.respond(
session_id="ses_a1b2c3d4",
responses=[
{"item_id": "item_014", "value": 3},
{"item_id": "item_027", "value": 1},
]
)
update.converged # False
update.next_items # [{'item_id': 'item_089', 'rank': 1}, ...]
JavaScript
const update = await client.sessions.respond('ses_a1b2c3d4', {
responses: [
{ itemId: 'item_014', value: 3 },
{ itemId: 'item_027', value: 1 },
]
});
update.converged; // false
update.nextItems; // [{itemId: 'item_089', rank: 1}, ...]
Check Status
Python
status = client.sessions.get("ses_a1b2c3d4")
status.converged # True
JavaScript
const status = await client.sessions.get('ses_a1b2c3d4');
status.converged; // true
Delete Session
Python
client.sessions.delete("ses_a1b2c3d4")
# Returns: {'deleted': True, 'session_id': 'ses_a1b2c3d4'}
JavaScript
await client.sessions.delete('ses_a1b2c3d4');
// Returns: { deleted: true, sessionId: 'ses_a1b2c3d4' }
Domains
Specialized domains use the same session API. Just change the domain parameter.
Python — All domains
# Clinical
session = client.sessions.create(domain="clinical", item_bank_id="ib_clinical_v2")
# Cybersecurity
session = client.sessions.create(domain="cyber", item_bank_id="ib_cyber_v1")
# Financial
session = client.sessions.create(domain="financial", item_bank_id="ib_fin_v1")
# Education
session = client.sessions.create(domain="education", item_bank_id="ib_edu_v1")
# HR / Talent
session = client.sessions.create(domain="hr", item_bank_id="ib_hr_v1")
# Compliance
session = client.sessions.create(domain="compliance", item_bank_id="ib_comp_v1")
# Medical
session = client.sessions.create(domain="medical", item_bank_id="ib_med_v1")
# Language
session = client.sessions.create(domain="language", item_bank_id="ib_lang_v1")
# Safety
session = client.sessions.create(domain="safety", item_bank_id="ib_safety_v1")
# Personality
session = client.sessions.create(domain="personality", item_bank_id="ib_pers_v1")
JavaScript — All domains
// Clinical
await client.sessions.create({ domain: 'clinical', itemBankId: 'ib_clinical_v2' });
// Cybersecurity
await client.sessions.create({ domain: 'cyber', itemBankId: 'ib_cyber_v1' });
// Financial
await client.sessions.create({ domain: 'financial', itemBankId: 'ib_fin_v1' });
// Education
await client.sessions.create({ domain: 'education', itemBankId: 'ib_edu_v1' });
// HR / Talent
await client.sessions.create({ domain: 'hr', itemBankId: 'ib_hr_v1' });
// Compliance, Medical, Language, Safety, Personality — same pattern
Error Handling
Both SDKs throw typed exceptions for API errors.
Python
from qlm.exceptions import (
QLMError,
AuthenticationError,
RateLimitError,
ValidationError,
NotFoundError
)
try:
result = client.optimize(item_bank_id="invalid", skill_levels=[0.5])
except AuthenticationError:
print("Check your API key")
except ValidationError as e:
print(f"Invalid request: {e.message}")
except RateLimitError as e:
print(f"Rate limited. Retry after {e.retry_after}s")
except NotFoundError:
print("Resource not found")
except QLMError as e:
print(f"API error: {e.status_code} {e.error_code}")
JavaScript
import {
QLMError,
AuthenticationError,
RateLimitError,
ValidationError,
NotFoundError
} from '@qlm/sdk';
try {
const result = await client.optimize({ itemBankId: 'invalid' });
} catch (err) {
if (err instanceof AuthenticationError) {
console.error('Check your API key');
} else if (err instanceof RateLimitError) {
console.error(`Rate limited. Retry after ${err.retryAfter}s`);
} else if (err instanceof ValidationError) {
console.error(`Invalid: ${err.message}`);
} else if (err instanceof QLMError) {
console.error(`API error: ${err.statusCode} ${err.errorCode}`);
}
}