chat-learnings-extractor

Extract structured learnings (lessons, decisions, patterns, dead ends) from AI conversation exports using a local Ollama model or any OpenAI-compatible API. Pairs with chat-history-importer. Trigger phrases: extract learnings from conversations, analyze chat exports, mine conversation insights, extract lessons from chats, chat learnings extractor.

Conversation Learnings Extractor

Extract structured learnings (lessons, decisions, patterns, dead ends) from exported AI conversations using either a local Ollama model or any OpenAI-compatible API. This skill is designed to work with exports from OpenAI and Anthropic, and pairs well with the chat-history-importer skill for a complete conversation analysis workflow.

Quick Start

Using Ollama (default)

python3 scripts/extract.py --dir /path/to/exports --limit 3 --dry-run
python3 scripts/extract.py --file single-conversation.json
python3 scripts/extract.py --dir /path/to/exports --since 2026-04-01

Using OpenAI-compatible API (e.g., OpenAI, Anthropic Bedrock, etc.)

export OPENAI_API_KEY=sk-...
export OPENAI_BASE_URL=https://api.openai.com/v1  # optional, defaults to OpenAI
python3 scripts/extract.py --dir /path/to/exports --model gpt-4o-mini

How It Works

  1. Parse OpenAI/Anthropic JSON exports using bundled parsers (from sibling chat-history-importer skill)
  2. Deduplicate via .processed_ids file (skip already-processed chats)
  3. Summarize conversation to key excerpts (to fit model context)
  4. Extract structured learnings using your chosen model: lessons, decisions, patterns, dead ends
  5. Append results to memory/semantic/learnings-from-exports.md

Integration with chat-history-importer

This skill pairs with chat-history-importer:

  1. First, run chat-history-importer to ingest raw conversations into episodic memory (memory/episodic/YYYY-MM-DD.md)
  2. Then, run this skill to extract structured learnings into semantic memory (memory/semantic/learnings-from-exports.md)

This workflow keeps raw conversation logs separate from actionable insights, enabling better knowledge organization.

Configuration

Using Ollama (Local)

Prerequisites: Ollama running at http://127.0.0.1:11434 (default)

# Use default model (gemma4:26b)
python3 scripts/extract.py --dir /path/to/exports

# Use a different local model
python3 scripts/extract.py --dir /path/to/exports --model llama2

# Custom Ollama endpoint
export OLLAMA_BASE_URL=http://ollama.example.com:11434
python3 scripts/extract.py --dir /path/to/exports

Environment Variables:

  • OLLAMA_BASE_URL — Ollama API endpoint (default: http://127.0.0.1:11434)

Using OpenAI-compatible API

Any API supporting the OpenAI /chat/completions endpoint (OpenAI, Bedrock, LM Studio, etc.)

export OPENAI_API_KEY=sk-...
export OPENAI_BASE_URL=https://api.openai.com/v1  # optional
python3 scripts/extract.py --dir /path/to/exports --model gpt-4o-mini

Environment Variables:

  • OPENAI_API_KEY — API key (required to enable this mode; if set, OpenAI mode is used instead of Ollama)
  • OPENAI_BASE_URL — API base URL (default: https://api.openai.com/v1)

Model auto-selection:

  • If OPENAI_API_KEY is set → defaults to gpt-4o-mini
  • If OPENAI_API_KEY is not set → defaults to gemma4:26b (Ollama)

Flags

  • --dir DIR — Process all JSON files in directory
  • --file FILE — Process single file
  • --limit N — Process only first N conversations (useful for testing or limiting API costs)
  • --since YYYY-MM-DD — Skip conversations before this date
  • --model MODEL — Override default model name
  • --dry-run — Print output without writing to disk or updating dedup state

Output Format

Results are appended to memory/semantic/learnings-from-exports.md with this structure:

## Chat Title (YYYY-MM-DD)

### Lessons Learned

- [bullet points]

### Decisions Made

- [bullet points]

### Patterns Noticed

- [bullet points]

### Dead Ends

- [bullet points]

Each category is optional — if a conversation doesn't have notable insights for a category, it will show "None".

References

  • references/prompt-template.md — The extraction prompt sent to the model
  • scripts/extract.py — Main script (reuses parsers from sibling skill)

Implementation Notes

  • Tracks processed chat IDs in .processed_ids to avoid re-processing
  • Workspace detection: checks OPENCLAW_WORKSPACE env var, falls back to ~/.openclaw/workspace
  • Automatically detects OpenAI vs Anthropic export formats
  • Truncates long messages for context efficiency