Claude Skills útmutató: Így építs működő Auto-Invoice Generátort

Az alábbi Claude Skills útmutató lépésről lépésre bemutatja, hogyan építhetsz új Skill modult, amely Excel timesheetből automatikusan készít professzionális számlát. A tutorial végére egy működő, hordozható Auto-Invoice Generator Skill áll majd rendelkezésedre.

Mi az a Claude Skills és miért fontos?

A Claude Skills olyan önálló feladatmodul, amely tartalmaz egy SKILL.md leírást, valamint opcionális kódot és eszközöket. A Claude Skills útmutató bemutatja, hogy ezek a modulok hogyan gyorsítják a munkát és miként csökkentik a hosszú, ismétlődő utasítások mennyiségét. A Skill tartalmazhat szkripteket és fájlokat, amelyeket Claude automatikusan felismer és hatékonyan használ.

A Skill előnyei:

  • jól szervezett és újrahasznosítható tudás
  • gyors végrehajtás, mert csak a szükséges elemek töltődnek be
  • következetes kimenetek a Claude alkalmazásokban
  • kódfuttatás lehetősége biztonságos környezetben

Az útmutató célja, hogy gyorsan megértsd, hogyan építs saját Skill modult és hogyan használd a Claude ökoszisztémában.

A Claude Skills működése a teljes ökoszisztémában

A Claude Skills modulok működnek a Claude aplikációkban, a Claude Code fejlesztői felületen és az API hívások során. A legnagyobb előnye a hordozhatóság. Egyetlen Skill egyszeri verziózással működik minden rendszerben. A fejlesztők és felhasználók így konzisztens eredményeket érnek el.

A Claude Skills útmutató szerint elég egyszer betölteni a Skill módosított ZIP fájlját. Innentől a rendszer automatikusan felismeri azt. Ha a kérés megfelel a Skill céljának, a modul aktiválódik. Ez automatikus és átlátható működés, mert a Skill aktiválása megjelenik a reasoning nézetben.

Skill létrehozása: SKILL.md és a ZIP fájl

A Skill alapja a SKILL.md fájl. Ez tartalmazza a Skill nevét és leírását YAML formátumban. A Claude Skills útmutató szerint a ZIP fájl csak egyetlen SKILL.md fájlt tartalmazhat a gyökérben.

Példa SKILL.md:

name: "auto-invoice-generator-monthly-articles"
description: "Generate monthly invoices for written content from simple line items. Produces a branded PDF or editable DOCX/RTF invoice and, optionally, a one-page timesheet if article titles/links are provided."

Ezt a fájlt a Claude App beállításain belül, a Skills menüpontban töltheted fel. A feltöltés után a Skill automatikusan rendelkezésre áll minden beszélgetésben.

A Claude App használata a Skill teszteléséhez

A Skill feltöltése után létrejön egy új chatablak, ahol a modul már aktív. A Claude Skills útmutató következő lépése, hogy kipróbáld a Skill működését. Ehhez tölts fel egy Excel timesheetet. Ezután kérhetsz tőle egy szerkeszthető Word vagy PDF számlát. A Claude automatikusan felismeri a Skill célját és aktiválja azt. A kimenet következetes és a brand beállításainak megfelelő lesz.

A Skill aktiválása nem igényel külön beállítást minden chatben. Ha be van töltve, a Claude automatikusan felismeri azt. A vállalati környezetben így egységes sablonok és kimenetek használhatók.

Az API használata: előkészületek

A Claude Skills útmutató következő lépése az API használata. Ehhez telepíteni kell a szükséges csomagokat.

!pip -q install anthropic pandas openpyxl reportlab

A futtatás után be kell állítani az API kulcsot.

import os, json, sys, re
import anthropic
from datetime import datetime, timedelta

API_KEY = "YOUR_ANTHROPIC_API_KEY"
client = anthropic.Client(api_key=API_KEY)

Az API kulcsot az Anthropic Console menüjében találod. Az SDK kliens innentől kezdve minden híváshoz használható.

Adatelőkészítés: az Excel timesheet feldolgozása

A Skill működésének alapja a rendezett JSON adatszerkezet. A Claude Skills útmutató szerint a feldolgozást érdemes pandas könyvtárral végezni.

def load_invoice_from_timesheet(excel_path):
    import pandas as pd
    df = pd.read_excel(excel_path)
    df.columns = df.columns.str.strip()

    invoice_period = "2025-10"
    if 'Date' in df.columns:
        first_date = str(df['Date'].iloc[0])
        date_match = re.search(r'(\d{2})\s+(\w+)\s+(\d{4})', first_date)
        if date_match:
            month_name = date_match.group(2)
            year = date_match.group(3)
            month_num = datetime.strptime(month_name[:3], '%b').month
            invoice_period = f"{year}-{month_num:02d}"

    article_col = next((col for col in df.columns if 'article' in col.lower() and 'name' in col.lower()), None)
    amount_col = next((col for col in df.columns if 'amount' in col.lower()), None)
    topic_col = next((col for col in df.columns if 'topic' in col.lower()), None)

    line_items = []
    timesheet_articles = []

    for idx, row in df.iterrows():
        if pd.isna(row.get(article_col)) or row.get(article_col) == '':
            continue

        article_name = str(row[article_col]).strip()
        amount = row.get(amount_col, 0)

        if isinstance(amount, str):
            amount = float(amount.replace('$', '').replace(',', '').strip())

        line_items.append({
            "title": article_name,
            "rate_type": "flat",
            "qty": 1,
            "rate": float(amount)
        })

        timesheet_articles.append({
            "title": article_name,
            "topic": str(row.get(topic_col, 'N/A')) if topic_col else 'N/A'
        })

    return {
        "client_name": "Client",
        "billing_contact": "billing@example.com",
        "invoice_period": invoice_period,
        "currency": "USD",
        "payment_terms": "Net-30",
        "line_items": line_items,
        "discount_pct": 0.0,
        "tax_pct": 0.0,
        "timesheet": timesheet_articles
    }

Ez a kód egységes JSON struktúrát ad vissza. Ez az adat kerül majd a Skillbe. A feldolgozás célja a stabil rendszer, mert a Skill nem a timesheet formátumát, hanem a kész JSON struktúrát használja.

Segédfüggvények a Skill által kért műveletekhez

A Claude Skills útmutató következő lépése, hogy biztonságosan futtatható eszközöket adjunk a Skill kezébe. A következő kód egy biztonságos bash parancsvégrehajtást és egy egyszerű szövegszerkesztő eszközt biztosít.

def execute_bash_tool(command):
    try:
        dangerous = ['rm -rf /', 'sudo', 'chmod', 'mkfs', '> /dev/']
        if any(d in command for d in dangerous):
            return f"Error: Command blocked for safety: {command}"

        result = subprocess.run(
            command,
            shell=True,
            capture_output=True,
            text=True,
            timeout=30,
            cwd=tempfile.gettempdir()
        )

        output = result.stdout if result.stdout else result.stderr
        return output if output else "Command executed successfully"
    except subprocess.TimeoutExpired:
        return "Error: Command timed out"
    except Exception as e:
        return f"Error executing command: {str(e)}"


def execute_text_editor_tool(params):
    try:
        command = params.get('command')
        path = params.get('path')

        if command == 'create':
            file_text = params.get('file_text', '')
            os.makedirs(os.path.dirname(path) if os.path.dirname(path) else '.', exist_ok=True)
            with open(path, 'w') as f:
                f.write(file_text)
            return f"File created: {path}"

        elif command == 'view':
            if os.path.exists(path):
                with open(path, 'r') as f:
                    content = f.read()
                return content[:1000]
            return f"Error: File not found: {path}"

        elif command == 'str_replace':
            if os.path.exists(path):
                with open(path, 'r') as f:
                    content = f.read()

                old_str = params.get('old_str', '')
                new_str = params.get('new_str', '')
                content = content.replace(old_str, new_str)

                with open(path, 'w') as f:
                    f.write(content)
                return f"File updated: {path}"

            return f"Error: File not found: {path}"

        return f"Unknown command: {command}"

    except Exception as e:
        return f"Error: {str(e)}"

Ezek a segédfüggvények teszik lehetővé a Claude által kért műveleteket biztonságos módon, miközben a Skill megőrzi a kontrollált működést.

Az Auto-Invoice Generator meghívása API-n keresztül

A Claude Skills útmutató most bemutatja a teljes folyamatot. A modell meghívása iteratív módon történik. A Skill kérései alapján a kód szimulálja az eszközhasználatot és összegyűjti a generált PDF fájlokat.

def generate_invoice_with_claude(invoice):
    user_text = f"""Generate a professional PDF invoice with the following data:
Client: {invoice['client_name']}
Period: {invoice['invoice_period']}
Currency: {invoice['currency']}
Payment Terms: {invoice['payment_terms']}
Line Items:
{json.dumps(invoice['line_items'], indent=2)}
Timesheet Articles:
{json.dumps(invoice['timesheet'], indent=2)}
Please create a professional PDF invoice with:
1. Invoice header with invoice number (INV-{invoice['invoice_period'].replace('-', '')}-001)
2. Client billing information
3. Line items table with amounts
4. Subtotal and total calculations
5. Timesheet section showing all articles and topics
Save the PDF as: invoice_{invoice['client_name'].lower()}_{invoice['invoice_period']}.pdf
"""

    tools = [
        {"type": "bash_20250124", "name": "bash"},
        {"type": "text_editor_20250728", "name": "str_replace_based_edit_tool"}
    ]

    messages = [{"role": "user", "content": user_text}]
    iteration = 0
    max_iterations = 15

    while iteration < max_iterations:
        iteration += 1

        response = client.messages.create(
            model="claude-sonnet-4-20250514",
            max_tokens=8192,
            tools=tools,
            messages=messages
        )

        messages.append({"role": "assistant", "content": response.content})

        if response.stop_reason == "end_turn":
            break

        if response.stop_reason == "tool_use":
            tool_results = []

            for block in response.content:
                if block.type == "tool_use":
                    tool_name = block.name
                    tool_input = block.input

                    if tool_name == "bash":
                        result = execute_bash_tool(tool_input.get('command', ''))
                    elif tool_name == "str_replace_based_edit_tool":
                        result = execute_text_editor_tool(tool_input)
                    else:
                        result = f"Unknown tool: {tool_name}"

                    tool_results.append({
                        "type": "tool_result",
                        "tool_use_id": block.id,
                        "content": result
                    })

            messages.append({"role": "user", "content": tool_results})

        else:
            break

    pdf_files = []

    for file in os.listdir('.'):
        if file.endswith('.pdf') and 'invoice' in file.lower():
            pdf_files.append(file)

    for file in os.listdir(tempfile.gettempdir()):
        if file.endswith('.pdf') and 'invoice' in file.lower():
            temp_path = os.path.join(tempfile.gettempdir(), file)
            import shutil
            dest_path = os.path.join('.', file)
            shutil.copy2(temp_path, dest_path)
            pdf_files.append(file)

    return pdf_files

Ez a megoldás biztosítja a biztonságos Skill-használatot. Az iterációk során minden lépést a modell indít el, így a folyamat átlátható és jól követhető marad.

CLI futtatás

A következő funkció kezeli a parancssori futtatást.

def main():
    if len(sys.argv) < 2:
        print("Usage: python app.py <timesheet.xlsx>")
        sys.exit(1)

    excel_file = sys.argv[1]

    if not os.path.exists(excel_file):
        print(f"Error: File not found: {excel_file}")
        sys.exit(1)

    try:
        invoice = load_invoice_from_timesheet(excel_file)
        pdf_files = generate_invoice_with_claude(invoice)

        if pdf_files:
            for pdf in pdf_files:
                print(f"Invoice generated: {os.path.abspath(pdf)}")
        else:
            print("Error: No PDF file was generated.")

    except Exception as e:
        print(f"Error: {e}")
        import traceback
        traceback.print_exc()
        sys.exit(1)

if __name__ == "__main__":
    main()

Ez a parancssori alkalmazás egyszerű futtatást biztosít. Egyetlen Excel fájlt kér bemenetként és generál egy kész PDF számlát.

Továbblépési lehetőségek

A Claude Skills útmutató végére egy működő Auto-Invoice Generator Skill áll össze. Ezt már használhatod a Claude alkalmazásokban és az API-n keresztül is. A következő lépés lehet egy új Skill kialakítása, például egy statisztikai jelentés generátor vagy automatikus adatellenőrző modul. A Skills modulok jól kombinálhatók, így később összetett, több lépéses munkafolyamatok is felépíthetők. A Claude ökoszisztéma ezt zökkenőmentesen támogatja, így a fejlesztés biztonságos és hatékony marad.

Kérjük, ellenőrizd a mező formátumát, és próbáld újra.
Köszönjük, hogy feliratkoztál.

vagyunk.hu hírlevél

Hozzászólás

Az e-mail címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük