Critical-thinking and analytics for human-AI conversations — a member of the lens analyser family.
Project description
conversation-analyser
Critical-thinking and analytics for human–AI conversations — a member of the analyser family.
It scores a single conversation on two tiers:
- Analytics (always on, offline): turn/word counts, prompt/response lengths, question ratio, pushback hits, readability, sentiment trajectory, prompt self-similarity, and temporal metrics when timestamps are present.
- Critical thinking (opt-in, needs an LLM): classifies every human turn under a 7-label prompt taxonomy, derives engagement ratios, an engagement band, and a composite 0–100 critical-thinking score with a component breakdown.
The taxonomy reuses the validated NQ/FU/CH/EX/DG/AC/MT scheme from the ISYS6020
marking pipeline (copied and forked). Design: docs/superpowers/specs/2026-05-23-conversation-analyser-design.md.
Install
pip install -e . # core: analytics + CLI + HTTP API
pip install -e '.[embeddings]' # + prompt self-similarity (sentence-transformers)
pip install -e '.[llm]' # + taxonomy/CT tier (anthropic)
pip install -e '.[embeddings,llm,dev]' # everything
export ANTHROPIC_API_KEY=... # required for the critical-thinking tier
CLI
Bare positional path to analyse (human summary by default, --json for machines);
serve subcommand for the HTTP API — same grammar as the rest of the family.
conversation-analyser transcript.txt # human summary, analytics only
conversation-analyser chat.json --json # full JSON to stdout
conversation-analyser chat.json --llm # add the critical-thinking tier
conversation-analyser log.json --idle-gap 45 # split sub-sessions on 45-min gaps
conversation-analyser raw.txt --parse-mode llm-segment --llm
conversation-analyser serve --port 8009 # run the HTTP API
The critical-thinking tier is opt-in (--llm) to avoid surprise API costs;
without it you get the analytics tier only.
HTTP API
conversation-analyser serve --port 8009
curl -F file=@chat.json 'http://127.0.0.1:8009/analyse' # analytics only
curl -F file=@chat.json -F llm=true 'http://127.0.0.1:8009/analyse'
curl http://127.0.0.1:8009/health
GET /health and POST /analyse (multipart file upload, optional llm form
field) — the same /analyse contract auto-analyser routes to.
Python API
from conversation_analyser import ConversationAnalyser
result = ConversationAnalyser().analyse("transcript.txt", llm=True)
print(result.model_dump_json(indent=2))
Input formats
A pluggable adapter registry tries, in order: structured adapters → heuristic speaker markers → optional LLM segmentation → unsegmented fallback.
- role/content message list (OpenAI/Anthropic):
[{"role": "user", "content": "..."}, ...] - AnythingLLM rows:
[{"prompt": "...", "response": "...", "createdAt": ...}, ...] - flat text with speaker markers:
User:/Assistant:/Me:/ChatGPT:/You said:/ChatGPT said:/Prompt:/Response: - anything else → LLM-segment (needs
[llm]), else a single-blob fallback
.pdf/.docx inputs are text-extracted first (needs pdfplumber/markitdown,
or pre-extract with document-analyser).
The taxonomy
| Code | Meaning |
|---|---|
NQ |
New Query — opens a new topic |
FU |
Follow-up — clarification/elaboration |
CH |
Challenge — pushes back, tests, asks why |
EX |
Extension — applies/compares/synthesises in a new direction |
DG |
Delegation — task hand-off, no engagement |
AC |
Acknowledgement — thanks/confirmation |
MT |
Meta — about the conversation itself |
critical_thinking = (CH+EX)/turns, delegation = DG/turns, filler = (AC+MT)/turns.
Bands: One-Shot · Delegator · Directed · Iterative · Critical.
Graceful degradation
| Missing | Effect |
|---|---|
ANTHROPIC_API_KEY / [llm] |
taxonomy/critical_thinking null; analytics still produced; note llm_unavailable |
[embeddings] |
prompt_self_similarity null; note embeddings_unavailable |
| timestamps | temporal metrics omitted; no sub-session split; note no timestamps |
Output
ConversationAnalysis → an aggregate (rolled up over all human turns, the
headline) plus one SessionAnalysis per idle-gap sub-session, each with
analytics, taxonomy, critical_thinking, and per-turn turns (label +
rationale + preview). See the design spec §8 for the full schema.
Testing
pytest # fast, deterministic (LLM mocked, no network)
pytest -m slow # includes sentence-transformers model download
pytest -m integration # includes live LLM calls
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
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 conversation_analyser-0.2.0.tar.gz.
File metadata
- Download URL: conversation_analyser-0.2.0.tar.gz
- Upload date:
- Size: 136.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1333d605ee58f20a8741194c20f09fdc4a902302573e39d0326b330981b91d24
|
|
| MD5 |
b353ecc5069462d3cd62ec1e8dd37df3
|
|
| BLAKE2b-256 |
cd63a4cdb36606ed2ec4fd423029f2c58837a6ee39ca7b6061570fcccb4fd465
|
File details
Details for the file conversation_analyser-0.2.0-py3-none-any.whl.
File metadata
- Download URL: conversation_analyser-0.2.0-py3-none-any.whl
- Upload date:
- Size: 26.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
92a26ba6f7033d1626ebca753031789fb90053f330eb7ba3fbc3aa5715e158de
|
|
| MD5 |
fb75283651320c630e408bf764619502
|
|
| BLAKE2b-256 |
9d15201db947e0ffe35d44279be65cee3313b4a7520c6c51f32278750794c986
|