Iblai api agent eval
Measure and improve agent quality via the platform API — evaluation datasets, dataset items (JSON, CSV upload, or from chat traces), experiment runs, LLM-as-Judge and human-annotation scoring, score configs, and CSV export. Use to test an agent against a dataset and grade the results.From its SKILL.md
npx -y skills add iblai/api --skill iblai-api-agent-evalAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
4 things to look at
- reads credentialsReads from 3 credential sources: `$IBLAI_API_KEY` and 2 more.
- 15 stars15 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
- runs commandsInstructs the agent to run 1 command, including `curl -X POST "https://api.iblai.app/dm/api/ai-mentor/orgs/$IBLAI_ORG/users/$IBLAI_USERNAME/evaluations/datasets/support-qa/runs/" -H "Authorization: Api-Token $IBLAI_API_KEY" -H "Content-Type: applica`.
- fetches URLsInstructs the agent to fetch 2 URLs, including https://api.iblai.app/dm/api/ai-mentor/orgs/{org}/users/{username}/evaluations/datasets/ and 1 more.
SKILL.md
9.8 KB, ~2.7k tokens by cl100k_base, as published. Nobody here has run it
iblai-api-agent-eval
Measure and improve an agent's quality from the API: build evaluation datasets, run experiments that send each question to the agent, then grade the results with LLM-as-Judge and/or human scores and export to CSV. Use to test an agent against a dataset and grade the results.
Auth & conventions
- Base URL:
https://api.iblai.app - Header:
Authorization: Api-Token $IBLAI_API_KEYon every request. (The dev docs phrase this asAuthorization: Token <key>— it is the same platform key; use Api-Token.) - Path vars:
{org}=$IBLAI_ORG,{username}=$IBLAI_USERNAME. - Host root:
…/dm/api/ai-mentor/orgs/{org}/users/{username}/evaluations/. Below,…/evals= that root. (ai-mentoris the canonical mount; theai-agentspelling is an accept-only alias for the same routes.) - Not connected yet? Run
/iblai-api-loginfirst to populateIBLAI_ORG,IBLAI_USERNAME, andIBLAI_API_KEY.
Concepts
- These eval datasets are not the agent's RAG datasets.
evaluations/datasets/hold graded test cases (input + expected output) for measuring agent quality. They are unrelated to an agent's knowledge/training datasets in/iblai-api-agent-dataset(RAG documents) — do not cross-wire the two. - Eval data is org-scoped and isolated. Datasets, items, runs, scores, and
score configs belong to
$IBLAI_ORGalone — no other org can read them or grade against them. - Runs and judges are async task records. Starting a run (
POST …/runs/) or an LLM-as-Judge (POST …/evaluate/) dispatches a background task and returns 202 immediately with a task record that movespending → in_progress → completed(orfailed). Poll for status; a run must reachcompletedbefore you judge or export it. - Three grading paths. LLM-as-Judge (
…/evaluate/) scores every item in a run automatically from a free-textcriteriarubric. Scores (…/scores/) are individual human/numeric/boolean/categorical annotations on a trace. Score configs (…/score-configs/) are reusable rubrics a score references viaconfig_id. - Pagination. List endpoints take
?page=(1-indexed) and?limit=(default 50, max 200) and return{count, next, previous, results}. - On the wire the path segment is
users/{user_id}; its value is$IBLAI_USERNAME.
Reads
Datasets
- GET
https://api.iblai.app/dm/api/ai-mentor/orgs/{org}/users/{username}/evaluations/datasets/— list. Filters:?name=(substring),?user_email=(creator, exact). - GET
…/evaluations/datasets/{dataset_name}/— get one.
Dataset items
- GET
…/datasets/{dataset_name}/items/— list items. Filters:?status=ACTIVE|ARCHIVED,?include_trace=true(attachtrace_input/trace_outputfor items linked to a source trace). - GET
…/datasets/{dataset_name}/items/{item_id}/— get one item (includestrace_input/trace_outputwhen it has asource_trace_id).
Experiments (runs)
- GET
…/datasets/{dataset_name}/runs/— list runs (merges completed runs with in-flight pending records). Filters:?name=(substring),?user_email=. - GET
…/datasets/{dataset_name}/runs/{run_name}/— run details: header +dataset_run_items(each withinput,expected_output,actual_output,error,scores[]) +pending_judges[]. - GET
…/datasets/{dataset_name}/runs/{run_name}/export/— export results as CSV (columns:item_id,input,expected_output,actual_output,trace_id, plus onescore_<name>column per score).
LLM-as-Judge
- GET
…/datasets/{dataset_name}/runs/{run_name}/evaluate/— list judge task records for this run (all statuses). Filters:?status=pending|in_progress|completed|failed,?user_email=. - GET
…/evaluations/judges/— list judge task records across every dataset/run in the org. Filters:?status=,?user_email=,?dataset_name=.
Scores
- GET
…/evaluations/scores/— list scores (human annotations + LLM-judge results). Filters:?dataset_run_id=(scope to a run),?trace_id=(scope to one turn),?name=(exact),?user_email=.
Score configs
- GET
…/evaluations/score-configs/— list reusable scoring rubrics.
Writes
Datasets
- POST
…/evaluations/datasets/— create.
Dataset items
- POST
…/datasets/{dataset_name}/items/— add items. Provide either anitemsarray ({input, expected_output}) or atrace_idsarray (seeds items from existing chat traces — input + agent response copied from each trace). Exactly one of the two. - POST
…/datasets/{dataset_name}/items/upload/— bulk-create from a CSV (multipartfilefield). - PUT
…/datasets/{dataset_name}/items/{item_id}/— update an item (input,expected_output,metadata,status). - DELETE
…/datasets/{dataset_name}/items/{item_id}/— delete an item (async, returns202queued). Destructive — confirm with the user first.
Experiments (runs)
- POST
…/datasets/{dataset_name}/runs/— start an experiment (async; runs the agent —mentor_unique_id— against every dataset item, records responses). Returns202with a task record. - DELETE
…/datasets/{dataset_name}/runs/{run_name}/— delete a run (async,202queued). Destructive — confirm with the user first.
LLM-as-Judge
- POST
…/datasets/{dataset_name}/runs/{run_name}/evaluate/— start an LLM-as-Judge pass (async; a separate LLM scores each item's actual output against its input + expected output using yourcriteria). Writes one score per item namedscore_name, with the judge's reasoning in each score'scomment. Run must becompletedfirst. Returns202with a judge task record.
Scores
- POST
…/evaluations/scores/— create a score (human/numeric/boolean/categorical annotation on a trace). - DELETE
…/evaluations/scores/{score_id}/— delete a score (async,202queued). Destructive — confirm with the user first.
Score configs
- POST
…/evaluations/score-configs/— create a reusable scoring rubric.
Example
Start an experiment run against a dataset (runs async in the background):
curl -X POST \
"https://api.iblai.app/dm/api/ai-mentor/orgs/$IBLAI_ORG/users/$IBLAI_USERNAME/evaluations/datasets/support-qa/runs/" \
-H "Authorization: Api-Token $IBLAI_API_KEY" \
-H "Content-Type: application/json" \
-d '{"run_name": "baseline-2026-06", "mentor_unique_id": "d17dc729-60fd-4363-81a0-f67d9318b03e"}'
Notes
- Typical pipeline: create dataset → add items → start run (async) → poll
until
completed→ grade (LLM-as-Judge and/or human scores) → export CSV. - Runs and judges are background tasks — POST returns
202before results exist; poll the run-list or run-details endpoint untilstatusiscompletedbefore callingevaluate/orexport/. - LLM-as-Judge grades a completed run from a free-text
criteriarubric, writing one score per item (score_name) plus reasoning in each score'scomment. Per-item human scores go through…/evaluations/scores/and can reference a reusable rubric from…/evaluations/score-configs/viaconfig_id. - Dataset items can come from direct JSON (
items), a CSV upload, or existing chat traces (trace_ids— input + agent response pulled from each trace). - Deletes (item, run, score) are queued (
202), not immediate. A dataset itself has no update or delete endpoint.
Schema
Request bodies, verified against evaluation_serializers.py. All JSON except the
CSV upload (multipart). Fields are optional unless marked required.
Create dataset — POST …/datasets/
namerequired (≤255) ·description·metadata(object)
Add items — POST …/datasets/{dataset_name}/items/ (exactly one of)
items: array of{inputrequired, expected_output}trace_ids: array of strings (seed from existing traces)
Update item — PUT …/items/{item_id}/
input·expected_output·metadata(object) ·status(ACTIVE|ARCHIVED)
CSV upload — POST …/items/upload/ (multipart form)
filerequired — CSV with aninputcolumn and optionalexpected_output; empty-inputrows are skipped
Start run — POST …/runs/
mentor_unique_idrequired — the agent's unique idrun_name(≤255; autorun-<hex>if omitted) ·metadata(object)
LLM-as-Judge — POST …/runs/{run_name}/evaluate/
criteriarequired — the rubric the judge grades againstscore_namerequired (≤255) — name given to the judge's scorellm_provider(defaultopenai) ·llm_name(defaultgpt-4o-mini)max_concurrency(int, default 4, range 1–20)
Create score — POST …/scores/
trace_idrequired ·namerequired (≤255) ·valuerequired (number)data_type(NUMERIC|BOOLEAN|CATEGORICAL, defaultNUMERIC)comment·observation_id·config_id(score-config to validate against) ·dataset_run_id
Create score config — POST …/score-configs/
namerequired (≤255) ·data_type(NUMERIC|BOOLEAN|CATEGORICAL) requiredcategories: array of{value(number), label(string)}— for CATEGORICALmin_value/max_value(numbers — for NUMERIC) ·description
Reference material
references/guide.md— the eval pipeline as ordered steps, judge-rubric guidance, and CSV upload/export limits and columns.
What ships with it: 1 file
3.4 KB alongside SKILL.md
references/
- guide.md3.4 KB