Document Classification logo

Document Classification

Community
Ruinius
Document Classification

Classify financial PDFs by extracting company identity, document type, and date metadata. Validates ticker via Yahoo Finance with multi-step fallback. Uses a Python orchestration script for validation, file modification, and writing markdown.

Overview

PublisherRuinius
Repositoryfinancial-analyst-skills
Skill nameDocument Classification
Stars
5
Forks
1
Bundled files
6
LicenseMIT
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • 6 bundled files

    Scripts, templates, and references the model can read while it works. Files are read-only and never executed.

  • Open source

    Published by Ruinius on GitHub. Read the source before you install it.

Installation

Install the Document Classification AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
    https://github.com/Ruinius/financial-analyst-skills/tree/main/skills/document_classification
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/Ruinius/financial-analyst-skills.git /tmp/financial-analyst-skills
mkdir -p .claude/skills
cp -r /tmp/financial-analyst-skills/skills/document_classification .claude/skills/ruinius-document-classification
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Document Classification in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Document Classification on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Document Classification is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

Document Classification Skill

This skill takes a PDF from input_data/, classifies it, abstracts metadata, and uses an orchestration script to validate the company ticker and produce a standardized markdown file in processing_data/.

Prerequisites

  • Python 3.10+
  • PDFs placed in input_data/ directory at the project root
  • If a static file server is not running on localhost:8181 then ask the user to run .\tools\start_file_server.bat

DO NOT EVER start servers without human user.

Inputs

  • One or more PDF files in input_data/

Outputs

  • Renamed PDF in processing_data/: TICKER_DOCTYPE_YYYYMMDD_temp.pdf
  • Markdown file in processing_data/: TICKER_DOCTYPE_YYYYMMDD_temp.md

Step-by-Step Instructions

Batch Mode: Repeat Steps 1–6 for EVERY .pdf file in input_data/. Track which files have been processed and continue until all are done. Report a summary at the end.

Step 1: Pick the Next PDF to Process

  1. List all .pdf files in input_data/
  2. If no PDFs exist (or all have already been processed), stop and inform the user: "No PDFs found in input_data/" or "All PDFs processed."
  3. Pick the next unprocessed PDF in input_data/. Keep track of its filename.
  4. Continue to Step 2 for this PDF.

Step 2: Read the PDF

  1. Ensure a background process running the file server is active (.\tools\start_file_server.bat).
  2. Open the PDF in the browser using the browser_subagent tool:
    • Navigate to the PDF via the local server, e.g., http://localhost:8181/input_data/{filename}
    • The browser renders PDFs natively with full visual fidelity
  3. Read the first 1–3 pages to extract classification metadata (company name, ticker, document type, dates)
  4. For large documents (10-K, 10-Q, analyst reports), you do NOT need to read every page — focus on the cover page and table of contents
  5. Do NOT use PyPDF2 or other text extraction libraries — the browser approach preserves table layouts and handles scanned/image-based documents
  6. If the PDF cannot be opened in the browser, stop and inform the user

Step 3: Classify the Document

From the PDF content read in Step 2, extract the following fields. Refer to skills/document_classification/resources/document_types.json for validation and exact naming of Document Types.

Fields to extract:

FieldFormatDescription
document_typestringMUST strictly be one of the keys in document_types.json
company_namestring or nullCompany name as found in the document
tickerstring or nullStock ticker symbol (uppercase, 1-5 chars)
confidencestringOne of: high, medium, low

Anti-hallucination rules:

  • ONLY extract information EXPLICITLY shown in the document text
  • DO NOT invent, infer, or assume company names, tickers, or dates
  • If information is not visible, use null
  • DO NOT use external knowledge to fill in missing information at this step

Step 4: Extract Dates

Extract each date field carefully, paying close attention to the document context.

Fiscal Year Awareness: Before assigning time_period, check skills/document_classification/resources/fiscal_year_map.json to see if this company has a non-standard fiscal year. Many retail and tech companies (e.g., LULU, WMT, COST, NKE, BABA) have fiscal years ending in months other than December. This shifts which calendar months map to which fiscal quarters.

  • If the ticker IS in the map, use the fiscal_year_ends entry to determine the correct fiscal quarter from the period_end_date.
  • If the ticker is NOT in the map, assume a standard calendar fiscal year (ending December 31).
4a: Extract document_date
  • The date the document was published or released
  • Format: YYYY-MM-DD
4b: Extract time_period
  • The fiscal reporting period
  • Format: Q1 YYYY, Q2 YYYY, Q3 YYYY, Q4 YYYY, or FY YYYY
  • Important: Use the company's fiscal calendar, not the calendar year. For example, LULU's fiscal year ends in January, so a period ending Jan 28, 2024 is Q4 FY2023, not Q1 2024.
4c: Extract period_end_date
  • The date the financial period ended (quarter end or fiscal year end)
  • Format: YYYY-MM-DD

Step 5: Execute Orchestration Script

Run the python orchestration script to validate and finalize the classification. This script will automatically validate the ticker against Yahoo Finance, rename strings according to document type abbreviations, move the file, and create the final markdown file.

Execute the following terminal command with the correctly formatted strings from Steps 3 and 4:

bash
uv run python skills\document_classification\scripts\process_classification.py --filename "FILENAME.pdf" --company_name "Extracted Company Name" --ticker "TICKER" --document_type "document_type" --document_date "YYYY-MM-DD" --time_period "time_period" --period_end_date "YYYY-MM-DD" --confidence "high"

If it succeeds, output the success to the user. If there are more PDFs remaining in input_data/, return to Step 1 for the next file. Otherwise, print a final summary of all processed documents and finish the run.

💡 First-File Scenario: If the document is the first one being processed for a ticker (no output_data/TICKER exists), Phase 5 (Qualitative Assessment) will require you to manually initialize the ticker directory and TICKER_metadata.md file.

Step 6: Reflection — Use LLM Knowledge (Fallback)

If the script in Step 5 throws an error (e.g. invalid ticker):

  1. Ask the LLM: "Given this company name and document context, what is the correct stock ticker?"
  2. The LLM IS allowed to use its knowledge here (unlike Step 3)
  3. If a new ticker is found, re-run Step 5 with the new ticker.
  4. If it still fails, ask the human user for the correct ticker.

Error Handling

  • If PDF cannot be opened in the browser → Inform user, skip this PDF
  • If classification fails → Retry once, then inform user
  • If ticker validation completely fails → Ask human user for the correct ticker
  • If date extraction fails → Set failed fields to null, proceed with available data

Changelog

  • 2026-05-06: Updated example command to use uv run per project standards. Added note about first-file initialization for qualitative documents.

Bundled files

The model reads these on demand while the skill is loaded. They are exposed as readable files and are never executed.

Frequently asked questions

What does the Document Classification AI skill do?

Classify financial PDFs by extracting company identity, document type, and date metadata. Validates ticker via Yahoo Finance with multi-step fallback. Uses a Python orchestration script for validation, file modification, and writing markdown.

Why use Document Classification on TypingMind?

Because you install it once and use it with any model. Document Classification is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Document Classification in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/Ruinius/financial-analyst-skills/tree/main/skills/document_classification. TypingMind reads its SKILL.md and bundles its files and installs it as a skill you can enable per chat.

Which AI models can use Document Classification?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Document Classification?

As many as you like. As long as a model supports skills, you can use Document Classification with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Document Classification AI skill free?

Yes. It is published on GitHub by Ruinius under the MIT license. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇