{"id":40,"date":"2025-12-02T14:11:29","date_gmt":"2025-12-02T13:11:29","guid":{"rendered":"http:\/\/serwer402453.lh.pl\/autoinstalator\/serwer402453.lh.pl\/wordpress143401\/?p=40"},"modified":"2026-05-07T22:30:34","modified_gmt":"2026-05-07T20:30:34","slug":"data-pipelines-apis","status":"publish","type":"post","link":"https:\/\/chmielinski-konrad.info\/index.php\/2025\/12\/02\/data-pipelines-apis\/","title":{"rendered":"Data Pipelines &amp; API&#8217;s"},"content":{"rendered":"\n<!DOCTYPE html>\n<html lang=\"pl\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>Data Pipelines &#038; APIs &mdash; Konrad Chmieli&#324;ski<\/title>\n    <style>\n    <\/style>\n    <link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\n    <link rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin>\n    <link rel=\"stylesheet\" href=\"https:\/\/fonts.googleapis.com\/css2?family=JetBrains+Mono:wght@400;500;700&#038;family=Sora:wght@300;400;600;700&#038;display=swap\" media=\"print\" onload=\"this.media='all'\">\n    <noscript>\n        <link rel=\"stylesheet\" href=\"https:\/\/fonts.googleapis.com\/css2?family=JetBrains+Mono:wght@400;500;700&#038;family=Sora:wght@300;400;600;700&#038;display=swap\">\n    <\/noscript>\n    <style>\n    \/* font-display:swap handled by Google Fonts URL param *\/\n    :root {\n        --accent: #1D9E75;\n        --accent-dim: #0F6E56;\n        --accent-bg: #E1F5EE;\n        --mono: 'JetBrains Mono', monospace;\n        --sans: 'Sora', sans-serif;\n    }\n\n    * {\n        box-sizing: border-box;\n        margin: 0;\n        padding: 0;\n    }\n\n    body {\n        background: #fff;\n        color: #111;\n        -webkit-overflow-scrolling: touch;\n        overflow-x: hidden;\n    }\n\n    .blog-root {\n        font-family: var(--sans);\n        color: #111;\n        max-width: 100%;\n        margin: 0 auto;\n        padding: 2rem 1rem 4rem;\n        line-height: 1.7;\n    }\n\n    .eyebrow {\n        font-family: var(--mono);\n        font-size: 11px;\n        letter-spacing: .12em;\n        color: var(--accent-dim);\n        text-transform: uppercase;\n        margin-bottom: .75rem;\n        display: flex;\n        align-items: center;\n        gap: 8px;\n    }\n\n    .eyebrow::before {\n        content: '';\n        display: inline-block;\n        width: 24px;\n        height: 1.5px;\n        background: var(--accent);\n    }\n\n    h1.blog-title {\n        font-family: var(--sans);\n        font-size: 2.2rem;\n        font-weight: 700;\n        line-height: 1.2;\n        margin-bottom: .5rem;\n        color: #111;\n    }\n\n    .subtitle {\n        font-size: 1.05rem;\n        color: #555;\n        font-weight: 300;\n        margin-bottom: 1.75rem;\n    }\n\n    .meta-row {\n        display: flex;\n        align-items: center;\n        gap: 1rem;\n        padding: .75rem 0;\n        border-top: .5px solid #ddd;\n        border-bottom: .5px solid #ddd;\n        margin-bottom: 2rem;\n        flex-wrap: wrap;\n    }\n\n    .meta-chip {\n        font-family: var(--mono);\n        font-size: 11px;\n        background: #f4f4f2;\n        border: .5px solid #ddd;\n        border-radius: 4px;\n        padding: 3px 8px;\n        color: #555;\n    }\n\n    .meta-chip.green {\n        background: var(--accent-bg);\n        color: var(--accent-dim);\n        border-color: #9FE1CB;\n    }\n\n    .tech-grid {\n        display: grid;\n        grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));\n        gap: 10px;\n        margin: 1.5rem 0 2rem;\n    }\n\n    .tech-card {\n        background: #fff;\n        border: .5px solid #ddd;\n        border-radius: 12px;\n        padding: .875rem 1rem;\n        position: relative;\n    }\n\n    .tech-card .tc-label {\n        font-family: var(--mono);\n        font-size: 10px;\n        color: #777;\n        letter-spacing: .08em;\n        text-transform: uppercase;\n        margin-bottom: 4px;\n    }\n\n    .tech-card .tc-name {\n        font-size: 14px;\n        font-weight: 600;\n        color: #111;\n        margin-bottom: 4px;\n    }\n\n    .tech-card .tc-note {\n        font-size: 12px;\n        color: #555;\n        line-height: 1.4;\n    }\n\n    .tech-card .tc-dot {\n        position: absolute;\n        top: 12px;\n        right: 12px;\n        width: 7px;\n        height: 7px;\n        border-radius: 50%;\n        background: var(--accent);\n    }\n\n    .section-header {\n        display: flex;\n        align-items: center;\n        gap: 10px;\n        margin: 2.25rem 0 1rem;\n    }\n\n    .section-header h2 {\n        font-family: var(--sans);\n        font-size: 1.15rem;\n        font-weight: 600;\n        color: #111;\n    }\n\n    .sh-line {\n        flex: 1;\n        height: .5px;\n        background: #ddd;\n    }\n\n    .sh-badge {\n        font-family: var(--mono);\n        font-size: 10px;\n        background: var(--accent-bg);\n        color: var(--accent-dim);\n        border-radius: 4px;\n        padding: 2px 8px;\n        white-space: nowrap;\n        border: .5px solid #9FE1CB;\n    }\n\n    p.body {\n        font-size: 15px;\n        color: #111;\n        margin-bottom: 1rem;\n    }\n\n    .pipeline-visual {\n        background: #f7f7f5;\n        border: .5px solid #ddd;\n        border-radius: 12px;\n        padding: 1.25rem 1.5rem;\n        margin: 1.5rem 0;\n        overflow-x: auto;\n        -webkit-overflow-scrolling: touch;\n        touch-action: pan-x pan-y;\n    }\n\n    .pipeline-row {\n        display: flex;\n        align-items: center;\n        gap: 8px;\n        flex-wrap: nowrap;\n    }\n\n    .pipe-step {\n        background: #fff;\n        border: .5px solid #ddd;\n        border-radius: 6px;\n        padding: 6px 12px;\n        font-family: var(--mono);\n        font-size: 11px;\n        color: #111;\n        white-space: nowrap;\n        font-weight: 500;\n    }\n\n    .pipe-step.hl {\n        background: var(--accent-bg);\n        border-color: #9FE1CB;\n        color: var(--accent-dim);\n    }\n\n    .pipe-arrow {\n        color: #999;\n        font-size: 12px;\n        flex-shrink: 0;\n    }\n\n    .code-block {\n        background: #f7f7f5;\n        border: .5px solid #ddd;\n        border-left: 2.5px solid var(--accent);\n        border-radius: 0 8px 8px 0;\n        padding: 1rem 1.25rem;\n        margin: 1rem 0 1.5rem;\n        font-family: var(--mono);\n        font-size: 12px;\n        color: #555;\n        line-height: 1.65;\n        overflow-x: auto;\n    }\n\n    .code-block .kw {\n        color: #1D9E75;\n        font-weight: 500;\n    }\n\n    .code-block .str {\n        color: #BA7517;\n    }\n\n    .code-block .cmt {\n        color: #999;\n    }\n\n    .tag-cloud {\n        display: flex;\n        flex-wrap: wrap;\n        gap: 6px;\n        margin: 1rem 0 1.5rem;\n    }\n\n    .tag {\n        font-family: var(--mono);\n        font-size: 11px;\n        padding: 4px 10px;\n        border-radius: 100px;\n        border: .5px solid #ccc;\n        color: #555;\n        background: #fff;\n    }\n\n    .tag.primary {\n        background: var(--accent-bg);\n        border-color: #9FE1CB;\n        color: var(--accent-dim);\n        font-weight: 500;\n    }\n\n    .callout {\n        background: #f7f7f5;\n        border-left: 2px solid var(--accent);\n        border-radius: 0 8px 8px 0;\n        padding: 1rem 1.25rem;\n        margin: 1.5rem 0;\n        font-size: 14px;\n        color: #555;\n        line-height: 1.65;\n    }\n\n    .callout strong {\n        color: #111;\n        font-weight: 600;\n    }\n\n    .employer-row {\n        display: grid;\n        grid-template-columns: 1fr;\n        gap: 10px;\n        margin: 1rem 0;\n    }\n\n    .employer-card {\n        display: flex;\n        gap: 12px;\n        align-items: flex-start;\n        background: #fff;\n        border: .5px solid #ddd;\n        border-radius: 12px;\n        padding: .875rem 1rem;\n    }\n\n    .emp-logo {\n        width: 36px;\n        height: 36px;\n        border-radius: 8px;\n        background: var(--accent-bg);\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        font-family: var(--mono);\n        font-size: 10px;\n        font-weight: 700;\n        color: var(--accent-dim);\n        flex-shrink: 0;\n        letter-spacing: -.02em;\n        text-align: center;\n        line-height: 1.3;\n    }\n\n    .emp-body .emp-name {\n        font-size: 13px;\n        font-weight: 600;\n        color: #111;\n    }\n\n    .emp-body .emp-desc {\n        font-size: 12px;\n        color: #555;\n        margin-top: 3px;\n        line-height: 1.5;\n    }\n\n    .footer-note {\n        font-family: var(--mono);\n        font-size: 11px;\n        color: #777;\n        border-top: .5px solid #ddd;\n        margin-top: 3rem;\n        padding-top: 1rem;\n        display: flex;\n        justify-content: space-between;\n        flex-wrap: wrap;\n        gap: 4px;\n    }\n\n    .footer-note a {\n        color: #777;\n        text-decoration: none;\n    }\n\n    .footer-note a:hover {\n        color: var(--accent-dim);\n        text-decoration: underline;\n    }\n    <\/style>\n<\/head>\n<body>\n    <div class=\"blog-root\">\n        <div class=\"eyebrow\">Engineering Blog &middot; Konrad Chmieli&#324;ski<\/div>\n        <p class=\"subtitle\">How I design, build, and maintain end-to-end data flows &mdash; from raw source to actionable output.<\/p>\n        <div class=\"meta-row\">\n            <span class=\"meta-chip green\">RPA \/ AI Engineering<\/span>\n            <span class=\"meta-chip\">Python 5+ yrs<\/span>\n            <span class=\"meta-chip\">Azure &middot; REST &middot; ETL<\/span>\n            <span class=\"meta-chip\">Katowice, PL &middot; Remote OK<\/span>\n        <\/div>\n        <p class=\"body\">Data pipelines are the connective tissue of every automation project I&#8217;ve built. Whether extracting chemical research data from PDFs at ArcelorMittal or routing five years of invoice transactions through a duplicate-detection engine &mdash; the engineering challenge is always the same: move data reliably, transform it cleanly, and deliver it where decisions happen.<\/p>\n        <p class=\"body\">This post walks through the exact stack I use at each layer of a pipeline &mdash; with real-world context from production deployments.<\/p>\n\n        <div class=\"section-header\">\n            <h2>Pipeline architecture overview<\/h2>\n            <div class=\"sh-line\"><\/div>\n            <div class=\"sh-badge\">pattern I use<\/div>\n        <\/div>\n        <div class=\"pipeline-visual\">\n            <div class=\"pipeline-row\">\n                <div class=\"pipe-step hl\">Source<\/div>\n                <div class=\"pipe-arrow\">&#8594;<\/div>\n                <div class=\"pipe-step\">Extract<\/div>\n                <div class=\"pipe-arrow\">&#8594;<\/div>\n                <div class=\"pipe-step hl\">Transform<\/div>\n                <div class=\"pipe-arrow\">&#8594;<\/div>\n                <div class=\"pipe-step\">Validate<\/div>\n                <div class=\"pipe-arrow\">&#8594;<\/div>\n                <div class=\"pipe-step hl\">Load<\/div>\n                <div class=\"pipe-arrow\">&#8594;<\/div>\n                <div class=\"pipe-step\">Orchestrate<\/div>\n                <div class=\"pipe-arrow\">&#8594;<\/div>\n                <div class=\"pipe-step hl\">Monitor<\/div>\n            <\/div>\n        <\/div>\n\n        <div class=\"section-header\">\n            <h2>Extraction layer<\/h2>\n            <div class=\"sh-line\"><\/div>\n            <div class=\"sh-badge\">where data is born<\/div>\n        <\/div>\n        <p class=\"body\">Every pipeline starts with pulling data from a heterogeneous mix of sources. In my day-to-day work these include SAP GUI interfaces, REST APIs, Excel files, PDF reports, and web portals &mdash; often within the same pipeline.<\/p>\n        <div class=\"tag-cloud\">\n            <span class=\"tag primary\">Python requests<\/span>\n            <span class=\"tag primary\">REST APIs<\/span>\n            <span class=\"tag primary\">Microsoft Graph API<\/span>\n            <span class=\"tag\">BeautifulSoup<\/span>\n            <span class=\"tag\">Selenium \/ XPath<\/span>\n            <span class=\"tag\">SAP GUI scripting<\/span>\n            <span class=\"tag\">PyAutoGUI<\/span>\n            <span class=\"tag\">UIAutomation<\/span>\n            <span class=\"tag\">JSON \/ XML parsing<\/span>\n            <span class=\"tag\">openpyxl \/ xlrd<\/span>\n        <\/div>\n        <div class=\"code-block\">\n            <span class=\"cmt\"># Typical multi-source extract pattern (ArcelorMittal invoice dedup pipeline)<\/span>\n            <br>\n            <span class=\"kw\">import<\/span>\n             requests, pandas \n            <span class=\"kw\">as<\/span>\n             pd\n            <br>\n            <span class=\"kw\">from<\/span>\n             pydantic \n            <span class=\"kw\">import<\/span>\n             BaseModel\n            <br>\n            <br>\n\n                response = requests.get(\n            <span class=\"str\">&#8220;https:\/\/api.internal\/invoices&#8221;<\/span>\n            , headers=auth_headers)\n            <br>\n\n                df = pd.DataFrame(response.json()[\n            <span class=\"str\">&#8220;data&#8221;<\/span>\n            ])\n            <br>\n\n                validated = InvoiceSchema.parse_obj(df.to_dict(\n            <span class=\"str\">&#8220;records&#8221;<\/span>\n            ))\n              \n        <\/div>\n        <div class=\"callout\">\n            <strong>At ING (GKYC)<\/strong>\n             I built two RPA bots handling secure data exchange and portal report retrieval &mdash; these required coordinating REST API calls, session management, and filesystem writes in a single orchestrated flow using Automation Anywhere A360.\n        <\/div>\n\n        <div class=\"section-header\">\n            <h2>OCR &#038; document intelligence<\/h2>\n            <div class=\"sh-line\"><\/div>\n            <div class=\"sh-badge\">unstructured &#8594; structured<\/div>\n        <\/div>\n        <p class=\"body\">A large share of enterprise data lives in unstructured documents &mdash; scanned PDFs, identity documents, research reports, contracts. I&#8217;ve deployed production-grade document intelligence pipelines using both on-premise OCR and cloud-native services.<\/p>\n        <div class=\"tech-grid\">\n            <div class=\"tech-card\">\n                <div class=\"tc-dot\"><\/div>\n                <div class=\"tc-label\">Cloud &middot; Azure<\/div>\n                <div class=\"tc-name\">Document Intelligence<\/div>\n                <div class=\"tc-note\">Form Recognizer + custom models for structured field extraction<\/div>\n            <\/div>\n            <div class=\"tech-card\">\n                <div class=\"tc-dot\"><\/div>\n                <div class=\"tc-label\">On-premise<\/div>\n                <div class=\"tc-name\">ABBYY FlexiCapture<\/div>\n                <div class=\"tc-note\">Batch OCR with trained document classifiers<\/div>\n            <\/div>\n            <div class=\"tech-card\">\n                <div class=\"tc-dot\"><\/div>\n                <div class=\"tc-label\">Cloud &middot; Azure<\/div>\n                <div class=\"tc-name\">ABBYY Vantage<\/div>\n                <div class=\"tc-note\">Intelligent document processing with ML skill training<\/div>\n            <\/div>\n            <div class=\"tech-card\">\n                <div class=\"tc-dot\"><\/div>\n                <div class=\"tc-label\">Embedded<\/div>\n                <div class=\"tc-name\">Azure OCR<\/div>\n                <div class=\"tc-note\">Computer Vision API for raw text extraction from scanned pages<\/div>\n            <\/div>\n        <\/div>\n        <div class=\"callout\">\n            <strong>At ArcelorMittal<\/strong>\n             I maintain an Azure-based pipeline extracting and consolidating data from diverse chemical research reports &mdash; overseeing Document Intelligence workflows and ensuring accurate integration with centralized databases.\n        <\/div>\n        <div class=\"callout\">\n            <strong>At ING<\/strong>\n             I led development of an automated pipeline for power of attorney and identity documents across NL\/FR\/BE\/DE markets &mdash; multi-format OCR + signature presence detection &mdash; achieving 70% processing accuracy and substantially reducing manual verification effort.\n        <\/div>\n\n        <div class=\"section-header\">\n            <h2>Transform &#038; validate<\/h2>\n            <div class=\"sh-line\"><\/div>\n            <div class=\"sh-badge\">clean before load<\/div>\n        <\/div>\n        <p class=\"body\">Raw extracted data is never load-ready. I use Pandas for tabular wrangling, NumPy\/SciPy for numerical transformations, and Pydantic for schema validation &mdash; catching bad records before they corrupt downstream databases.<\/p>\n        <div class=\"tag-cloud\">\n            <span class=\"tag primary\">Pandas<\/span>\n            <span class=\"tag primary\">NumPy<\/span>\n            <span class=\"tag primary\">Pydantic<\/span>\n            <span class=\"tag\">SciPy<\/span>\n            <span class=\"tag\">Pillow \/ OpenCV<\/span>\n            <span class=\"tag\">Scikit-Learn<\/span>\n            <span class=\"tag\">regex \/ string normalization<\/span>\n            <span class=\"tag\">deduplication logic<\/span>\n        <\/div>\n        <div class=\"callout\">\n            <strong>Global invoice dedup (ArcelorMittal India):<\/strong>\n             developed an automated solution analysing five years of transactional data to identify potential duplicates &mdash; custom hashing logic + Pandas merge operations across millions of rows, with Pydantic models enforcing schema contracts at every stage.\n        <\/div>\n\n        <div class=\"section-header\">\n            <h2>Load &#038; storage layer<\/h2>\n            <div class=\"sh-line\"><\/div>\n            <div class=\"sh-badge\">persistence strategy<\/div>\n        <\/div>\n        <p class=\"body\">Output targets vary by use case: SQL databases for structured reporting, MongoDB for flexible document storage, Azure Blob\/cloud storage for file-based pipelines, Excel or SharePoint for business-user-facing deliverables, and web applications via REST.<\/p>\n        <div class=\"tech-grid\">\n            <div class=\"tech-card\">\n                <div class=\"tc-dot\"><\/div>\n                <div class=\"tc-label\">Relational<\/div>\n                <div class=\"tc-name\">SQL<\/div>\n                <div class=\"tc-note\">Primary store for structured reporting and analytics<\/div>\n            <\/div>\n            <div class=\"tech-card\">\n                <div class=\"tc-dot\"><\/div>\n                <div class=\"tc-label\">Document store<\/div>\n                <div class=\"tc-name\">MongoDB<\/div>\n                <div class=\"tc-note\">Flexible schemas for semi-structured pipeline outputs<\/div>\n            <\/div>\n            <div class=\"tech-card\">\n                <div class=\"tc-dot\"><\/div>\n                <div class=\"tc-label\">Search<\/div>\n                <div class=\"tc-name\">Solr &middot; Vector DBs<\/div>\n                <div class=\"tc-note\">Full-text search; Chroma \/ Pinecone for RAG pipelines<\/div>\n            <\/div>\n            <div class=\"tech-card\">\n                <div class=\"tc-dot\"><\/div>\n                <div class=\"tc-label\">File \/ cloud<\/div>\n                <div class=\"tc-name\">Azure Blob &middot; SharePoint<\/div>\n                <div class=\"tc-note\">Report delivery and file-based integration targets<\/div>\n            <\/div>\n        <\/div>\n\n        <div class=\"section-header\">\n            <h2>Orchestration &#038; CI\/CD<\/h2>\n            <div class=\"sh-line\"><\/div>\n            <div class=\"sh-badge\">keeping it running<\/div>\n        <\/div>\n        <p class=\"body\">Pipelines that aren&#8217;t monitored aren&#8217;t pipelines &mdash; they&#8217;re one-time scripts. I use Jenkins for CI\/CD and scheduled automation, Automation Anywhere (A11 &#038; A360) as an enterprise orchestration layer, and Python-native schedulers for lightweight flows. Version control through Git keeps all pipeline code reviewable and deployable.<\/p>\n        <div class=\"tag-cloud\">\n            <span class=\"tag primary\">Jenkins CI\/CD<\/span>\n            <span class=\"tag primary\">Automation Anywhere A360<\/span>\n            <span class=\"tag\">SAIO (ING proprietary)<\/span>\n            <span class=\"tag\">Git \/ branching strategy<\/span>\n            <span class=\"tag\">LangGraph (agentic flows)<\/span>\n            <span class=\"tag\">LangChain<\/span>\n            <span class=\"tag\">Azure Functions (conceptual)<\/span>\n            <span class=\"tag\">Cron \/ APScheduler<\/span>\n        <\/div>\n\n        <div class=\"section-header\">\n            <h2>AI-enhanced pipeline patterns<\/h2>\n            <div class=\"sh-line\"><\/div>\n            <div class=\"sh-badge\">LLM-in-the-loop<\/div>\n        <\/div>\n        <p class=\"body\">The most interesting pipelines I&#8217;ve worked on recently embed LLMs as processing steps &mdash; not as chatbots, but as transformation engines within a larger orchestrated flow. This includes prompt engineering for structured output, RAG over internal knowledge bases, and tool-calling agents that decide which pipeline branches to execute.<\/p>\n        <div class=\"tech-grid\">\n            <div class=\"tech-card\">\n                <div class=\"tc-dot\"><\/div>\n                <div class=\"tc-label\">Models<\/div>\n                <div class=\"tc-name\">GPT-4 \/ GPT-4o<\/div>\n                <div class=\"tc-note\">Azure OpenAI &mdash; structured output, entity extraction, classification<\/div>\n            <\/div>\n            <div class=\"tech-card\">\n                <div class=\"tc-dot\"><\/div>\n                <div class=\"tc-label\">Open-source<\/div>\n                <div class=\"tc-name\">Meta Llama<\/div>\n                <div class=\"tc-note\">Self-hosted inference for on-premise data scenarios<\/div>\n            <\/div>\n            <div class=\"tech-card\">\n                <div class=\"tc-dot\"><\/div>\n                <div class=\"tc-label\">Frameworks<\/div>\n                <div class=\"tc-name\">LangChain &middot; LangGraph<\/div>\n                <div class=\"tc-note\">Agentic pipeline composition with memory and tool calling<\/div>\n            <\/div>\n            <div class=\"tech-card\">\n                <div class=\"tc-dot\"><\/div>\n                <div class=\"tc-label\">Retrieval<\/div>\n                <div class=\"tc-name\">RAG Architecture<\/div>\n                <div class=\"tc-note\">Chunking, embeddings, semantic search over enterprise docs<\/div>\n            <\/div>\n        <\/div>\n        <div class=\"callout\">\n            <strong>AI Client Offer Generation (ArcelorMittal Luxembourg, 2024):<\/strong>\n             built an LLM-driven pipeline using Azure OpenAI to generate personalised client proposals from historical order data + new inquiries. The pipeline fetched data via REST, ran GPT-4o inference with structured prompts, formatted the output, and automated email dispatch &mdash; achieving ~60% accuracy and significantly reducing sales team workload.\n        <\/div>\n\n        <div class=\"section-header\">\n            <h2>Reporting &#038; visualisation output<\/h2>\n            <div class=\"sh-line\"><\/div>\n            <div class=\"sh-badge\">end of pipeline<\/div>\n        <\/div>\n        <p class=\"body\">The final stage of any pipeline is making data consumable. I deliver results via Streamlit dashboards, Matplotlib\/Seaborn charts embedded in reports, or direct integration with web application portals &mdash; depending on the audience.<\/p>\n        <div class=\"tag-cloud\">\n            <span class=\"tag primary\">Streamlit<\/span>\n            <span class=\"tag primary\">Matplotlib<\/span>\n            <span class=\"tag\">Seaborn<\/span>\n            <span class=\"tag\">Excel report generation<\/span>\n            <span class=\"tag\">PDF report output<\/span>\n            <span class=\"tag\">REST API write-back<\/span>\n            <span class=\"tag\">SharePoint integration<\/span>\n        <\/div>\n\n        <div class=\"section-header\">\n            <h2>Where I&#8217;ve built this in production<\/h2>\n            <div class=\"sh-line\"><\/div>\n            <div class=\"sh-badge\">employer context<\/div>\n        <\/div>\n        <div class=\"employer-row\">\n            <div class=\"employer-card\">\n                <div class=\"emp-logo\">AM<\/div>\n                <div class=\"emp-body\">\n                    <div class=\"emp-name\">ArcelorMittal BCoE Poland &middot; Oct 2023 &ndash; present<\/div>\n                    <div class=\"emp-desc\">Global market forecasting pipeline (Excel ETL &#8594; SQL &#8594; web app), Azure Document Intelligence for chemical reports, invoice dedup over 5yr transaction history, HR contract generation automation, compliance report pipeline from multimedia sources.<\/div>\n                <\/div>\n            <\/div>\n            <div class=\"employer-card\">\n                <div class=\"emp-logo\">\n                    AM\n                    <br>\n                    <span style=\"font-size:8px\">LUX<\/span>\n                <\/div>\n                <div class=\"emp-body\">\n                    <div class=\"emp-name\">ArcelorMittal Luxembourg &middot; Mar &ndash; Jul 2024 (secondment)<\/div>\n                    <div class=\"emp-desc\">End-to-end LLM pipeline: REST data fetch &#8594; GPT-4o inference &#8594; structured output &#8594; automated email dispatch. Full agentic flow using LangChain with tool calling.<\/div>\n                <\/div>\n            <\/div>\n            <div class=\"employer-card\">\n                <div class=\"emp-logo\">ING<\/div>\n                <div class=\"emp-body\">\n                    <div class=\"emp-name\">ING Hubs Poland (GKYC) &middot; Nov 2021 &ndash; Oct 2023<\/div>\n                    <div class=\"emp-desc\">Risk classifier pipeline (ML model training + inference), OCR document intelligence pipeline for 4 Western European markets, RPA bots for secure data exchange across portals. SAIO-based GUI automation for internal process flows.<\/div>\n                <\/div>\n            <\/div>\n        <\/div>\n\n        <div class=\"footer-note\">\n            <span><a href=\"mailto:konrad.chmielinski@outlook.com\">konrad.chmielinski@outlook.com<\/a><\/span>\n            <span><a href=\"https:\/\/www.linkedin.com\/in\/konrad-chmieli%C5%84ski-ba568320a\/\" target=\"_blank\" rel=\"noopener noreferrer\">linkedin.com\/in\/konrad-chmieli&#324;ski-ba568320a<\/a><\/span>\n            <span>Open to remote &middot; Full-time \/ B2B<\/span>\n        <\/div>\n    <\/div>\n<\/body>\n<\/html>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Data Pipelines &#038; APIs &mdash; Konrad Chmieli&#324;ski Engineering Blog &middot; Konrad Chmieli&#324;ski How I design, build, and maintain end-to-end data flows &mdash; from raw source to actionable output. RPA \/ AI Engineering Python 5+ yrs Azure &middot; REST &middot; ETL Katowice, PL &middot; Remote OK Data pipelines are the connective tissue of every automation project I&#8217;ve built. Whether extracting chemical [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":95,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[],"class_list":["post-40","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-skills"],"views":36,"_links":{"self":[{"href":"https:\/\/chmielinski-konrad.info\/index.php\/wp-json\/wp\/v2\/posts\/40","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/chmielinski-konrad.info\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/chmielinski-konrad.info\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/chmielinski-konrad.info\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/chmielinski-konrad.info\/index.php\/wp-json\/wp\/v2\/comments?post=40"}],"version-history":[{"count":24,"href":"https:\/\/chmielinski-konrad.info\/index.php\/wp-json\/wp\/v2\/posts\/40\/revisions"}],"predecessor-version":[{"id":528,"href":"https:\/\/chmielinski-konrad.info\/index.php\/wp-json\/wp\/v2\/posts\/40\/revisions\/528"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/chmielinski-konrad.info\/index.php\/wp-json\/wp\/v2\/media\/95"}],"wp:attachment":[{"href":"https:\/\/chmielinski-konrad.info\/index.php\/wp-json\/wp\/v2\/media?parent=40"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/chmielinski-konrad.info\/index.php\/wp-json\/wp\/v2\/categories?post=40"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/chmielinski-konrad.info\/index.php\/wp-json\/wp\/v2\/tags?post=40"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}