Skip to content

Latest commit

ย 

History

27 Commits

Folders and files

NameName
Last commit message
Last commit date
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

IEUM

ํšŒ์˜๋ก์„ ์กฐ์ง ์ง€์‹์— ๊ทผ๊ฑฐํ•œ ์‹คํ–‰ ๊ณ„ํš์œผ๋กœ ๋ฐ”๊พธ๊ณ 
์‚ฌ์šฉ์ž ์Šน์ธ ํ›„์—๋งŒ CalendarยทTo-doยทEmail ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” Meeting-to-Action Agent

Live Demo ยท API Docs ยท ๋ฐฐํฌ ๊ฒ€์ฆ ยท ์ „์ฒด ๋ฌธ์„œ

Python 3.12 FastAPI React Vite PostgreSQL pgvector NVIDIA NIM pytest 79 passed Backend CI


ํ”„๋กœ์ ํŠธ ์†Œ๊ฐœ

ํšŒ์˜๊ฐ€ ๋๋‚˜๋„ ์—…๋ฌด๋Š” ์ž๋™์œผ๋กœ ์ง„ํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฒฐ์ • ์‚ฌํ•ญ์„ ๋‹ค์‹œ ์ •๋ฆฌํ•˜๊ณ , ๊ด€๋ จ ๊ทœ์ •์„ ์ฐพ๊ณ , ์ผ์ •ยทํ•  ์ผยท๋ฉ”์ผ๋กœ ์˜ฎ๊ธฐ๋Š” ๊ณผ์ •์—์„œ ๋ˆ„๋ฝ๊ณผ ์ค‘๋ณต์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

IEUM์€ ํšŒ์˜๋ก์„ ๊ตฌ์กฐํ™”ํ•˜๊ณ  ์กฐ์ง ์ง€์‹์„ ๊ฒ€์ƒ‰ํ•ด ๊ทผ๊ฑฐ๊ฐ€ ์—ฐ๊ฒฐ๋œ Action Plan์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๊ณ„ํš์€ ์ฆ‰์‹œ ์‹คํ–‰๋˜์ง€ ์•Š์œผ๋ฉฐ, ์Šน์ธ ๊ถŒํ•œ์„ ๊ฐ€์ง„ ์‚ฌ์šฉ์ž๊ฐ€ ๊ฒ€ํ† ํ•œ ํ›„ ๋ณ„๋„์˜ ์‹คํ–‰ ์š”์ฒญ์„ ๋ณด๋ƒˆ์„ ๋•Œ๋งŒ ์™ธ๋ถ€ ๋„๊ตฌ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

Meeting Transcript
  โ†’ Structured Analysis
  โ†’ Organization Knowledge Retrieval
  โ†’ Evidence-grounded Action Plan
  โ†’ Human Approval
  โ†’ Calendar / To-do / Email
  โ†’ Per-tool Result & Audit Log

๊ณต๊ฐœ ๋ฐ๋ชจ์—์„œ๋Š” ์‹ค์ œ ํšŒ์‚ฌ ๋ฉ”์ผ์ด๋‚˜ ์ผ์ •์„ ๋งŒ๋“ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Microsoft 365 ์‹คํ–‰ ๊ณ„์ธต์„ Mock Provider๋กœ ๊ต์ฒดํ•ด ์Šน์ธ, ์ƒํƒœ ์ „์ด, ๋ฉฑ๋“ฑ์„ฑ, ๋ถ€๋ถ„ ์‹คํŒจ์™€ ์‹คํ–‰ ๊ฒฐ๊ณผ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•ต์‹ฌ ๊ฒฐ๊ณผ

๊ตฌ๋ถ„ ๊ฒฐ๊ณผ
๊ณต๊ฐœ ๋ฐฐํฌ Vercel Frontend + Render Backend + Supabase PostgreSQL
Agent Workflow Plan ์ƒ์„ฑ โ†’ ์Šน์ธ โ†’ Mock ์‹คํ–‰ SUCCEEDED ์šด์˜ ๊ฒ€์ฆ
RAG NVIDIA Embedding + Supabase pgvector ๊ฒ€์ƒ‰
Human-in-the-loop ์Šน์ธ ์ „ ์‹คํ–‰ ์ฐจ๋‹จ, ์Šน์ธ๊ณผ ์‹คํ–‰ API ๋ถ„๋ฆฌ
์‹คํ–‰ ์•ˆ์ „์„ฑ ์ค‘๋ณต action ID, ์žฌ์‹คํ–‰๊ณผ ๋™์‹œ ์‹คํ–‰ ์ฐจ๋‹จ
๋ถ€๋ถ„ ์‹คํŒจ ๋„๊ตฌ๋ณ„ ์ƒํƒœ ์ €์žฅ ๋ฐ PARTIALLY_SUCCEEDED ๊ตฌ๋ถ„
Provider ๊ฒฝ๊ณ„ Mock, Logic Apps, Microsoft Graph ๊ตฌํ˜„์ฒด ๋ถ„๋ฆฌ
์šด์˜ ๋ชจ๋“œ Demo์—์„œ Legacy Azure route์™€ ์‹ค์ œ Productivity Provider ์ฐจ๋‹จ
์ž๋™ ๊ฒ€์ฆ Backend 79 passed, 1 skipped, Frontend production build ํ†ต๊ณผ
๊ด€์ธก์„ฑ X-Request-ID์™€ payload ๋น„์ €์žฅ ๊ตฌ์กฐํ™” ๋กœ๊ทธ

PostgreSQL ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ 1๊ฑด์€ ์ „์šฉ DB๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•ด์•ผ ์‹คํ–‰๋˜๋Š” ๋ณดํ˜ธ๋œ ํ…Œ์ŠคํŠธ์ž…๋‹ˆ๋‹ค. ์‹ค์ œ Supabase migration, seed์™€ ๊ณต๊ฐœ Workflow๋Š” ๋ฐฐํฌ ํ™˜๊ฒฝ์—์„œ ๋ณ„๋„๋กœ ๊ฒ€์ฆํ–ˆ์Šต๋‹ˆ๋‹ค.

Live Demo

1. ์ƒ˜ํ”Œ ํšŒ์˜๋ก ํ™•์ธ ๋˜๋Š” ์ง์ ‘ ์ž…๋ ฅ
2. ๊ทผ๊ฑฐ ๊ฒ€์ƒ‰ ๋ฐ Action Plan ์ƒ์„ฑ
3. ๊ฒ€์ƒ‰ ๊ทผ๊ฑฐ์™€ ์ œ์•ˆ๋œ ์ž‘์—… ๊ฒ€ํ† 
4. ์‚ฌ์šฉ์ž ์Šน์ธ
5. Mock Microsoft 365 ์‹คํ–‰
6. SUCCEEDED ์ƒํƒœ์™€ Mock resource ID ํ™•์ธ

Render ๋ฌด๋ฃŒ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ ˆ์ „ ์ƒํƒœ์ด๋ฉด ์ฒซ ์š”์ฒญ์— ์ตœ๋Œ€ 60์ดˆ ์ •๋„ ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ™”๋ฉด์€ ์„œ๋ฒ„ ์‹œ์ž‘ ๊ฐ€๋Šฅ์„ฑ์„ ์•ˆ๋‚ดํ•˜๋ฉฐ, retryable=true์ธ 502/503 ๊ณ„ํš ์ƒ์„ฑ ์‹คํŒจ๋งŒ ํ•œ ๋ฒˆ ์ž๋™ ์žฌ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. ์Šน์ธยท๊ฑฐ์ ˆยท์‹คํ–‰ ์š”์ฒญ์€ ์ž๋™ ์žฌ์‹œ๋„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ณต๊ฐœ ํ™˜๊ฒฝ์˜ Productivity Provider๋Š” mock_microsoft_365์ด๋ฉฐ ์‹ค์ œ ์™ธ๋ถ€ ๋ถ€์ž‘์šฉ์€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ๋ฐ API ํ๋ฆ„

sequenceDiagram
    autonumber
    actor User
    participant Web as React / Vercel
    participant API as FastAPI / Render
    participant Vector as Supabase pgvector
    participant NIM as NVIDIA NIM
    participant DB as PostgreSQL
    participant Tool as Mock Microsoft 365

    User->>Web: ํšŒ์˜๋ก ์ž…๋ ฅ
    Web->>API: POST /action-plans/grounded
    API->>Vector: ๊ด€๋ จ ์กฐ์ง ์ง€์‹ ๊ฒ€์ƒ‰
    Vector-->>API: evidence chunks
    API->>NIM: ํšŒ์˜๋ก + ๊ทผ๊ฑฐ ๊ธฐ๋ฐ˜ ๊ณ„ํš ์š”์ฒญ
    NIM-->>API: ๊ตฌ์กฐํ™” Action Plan
    API->>DB: PENDING_APPROVAL ์ €์žฅ
    API-->>Web: ๊ณ„ํšยท๊ทผ๊ฑฐยท์ƒํƒœ ๋ฐ˜ํ™˜
    User->>Web: ์Šน์ธ
    Web->>API: POST /{id}/approve
    API->>DB: APPROVED ์ „์ด
    User->>Web: Mock ์‹คํ–‰
    Web->>API: POST /{id}/execute
    API->>Tool: Calendar / To-do / Email ์‹คํ–‰
    Tool-->>API: ๋„๊ตฌ๋ณ„ ๊ฒฐ๊ณผ์™€ resource ID
    API->>DB: ์ตœ์ข… ์ƒํƒœ ์ €์žฅ
    API-->>Web: SUCCEEDED / PARTIALLY_SUCCEEDED / FAILED
Loading

์ฃผ์š” ๊ธฐ๋Šฅ

1. ๊ทผ๊ฑฐ ๊ธฐ๋ฐ˜ Action Plan

  • ํšŒ์˜๋ก์„ summary, decisions, action items์™€ open issues๋กœ ๊ตฌ์กฐํ™”
  • NVIDIA embedding๊ณผ pgvector cosine distance ๊ธฐ๋ฐ˜ ์กฐ์ง ์ง€์‹ ๊ฒ€์ƒ‰
  • ๊ฒ€์ƒ‰๋œ chunk ID์™€ ๋ฌธ์„œ๋ช…ยท์นดํ…Œ๊ณ ๋ฆฌยท์ถœ์ฒ˜ยท๊ทผ๊ฑฐ ๋ณธ๋ฌธยทsimilarity๋ฅผ ๊ณ„ํš์— ํ•จ๊ป˜ ์ €์žฅ
  • ๊ณต๊ฐœ ํ™”๋ฉด์—์„œ ์›์‹œ Chunk ID ๋Œ€์‹  ์‚ฌ๋žŒ์ด ์ฝ์„ ์ˆ˜ ์žˆ๋Š” Evidence ์นด๋“œ ์ œ๊ณต
  • ์ตœ์†Œ ์œ ์‚ฌ๋„ ๊ธฐ์ค€์„ ์ถฉ์กฑํ•˜์ง€ ๋ชปํ•˜๋ฉด ๊ณ„ํš ์ƒ์„ฑ ๊ฑฐ๋ถ€
  • LLM JSON์„ Pydantic schema๋กœ ๊ฒ€์ฆํ•œ ํ›„์—๋งŒ ์ €์žฅ

2. Human-in-the-loop ์ƒํƒœ ์ „์ด

  • Plan ์ƒ์„ฑ๊ณผ ์™ธ๋ถ€ ์‹คํ–‰์„ ๋ณ„๋„ API๋กœ ๋ถ„๋ฆฌ
  • approver ์—ญํ• ๋งŒ ์Šน์ธยท๊ฑฐ์ ˆ ๊ฐ€๋Šฅ
  • executor ์—ญํ• ๋งŒ ์Šน์ธ๋œ ๊ณ„ํš ์‹คํ–‰ ๊ฐ€๋Šฅ
  • ๊ฑฐ์ ˆ๋œ ๊ณ„ํš๊ณผ ๋ฏธ์Šน์ธ ๊ณ„ํš์˜ ์‹คํ–‰ ์ฐจ๋‹จ
  • Demo mode์—์„œ๋Š” ์‹ ๋ขฐํ•  ์ˆ˜ ์—†๋Š” identity header๋ฅผ ๋ฌด์‹œํ•˜๊ณ  ๊ณ ์ • Demo actor ์‚ฌ์šฉ

3. ์•ˆ์ „ํ•œ ๋„๊ตฌ ์‹คํ–‰

  • Calendar, To-do, Email์„ ๊ณตํ†ต Productivity Provider ๊ณ„์•ฝ์œผ๋กœ ์ถ”์ƒํ™”
  • ๊ณ ์œ  action_id๋กœ ์ค‘๋ณต ์š”์ฒญ ์ฐจ๋‹จ
  • DB ์กฐ๊ฑด๋ถ€ ์ „์ด๋กœ ๋™์‹œ ์‹คํ–‰ ์ค‘ ํ•˜๋‚˜๋งŒ ์‹คํ–‰๊ถŒ ํš๋“
  • ์„ฑ๊ณตยท์‹คํŒจยทlatencyยทproviderยทexternal resource ID๋ฅผ ๋„๊ตฌ๋ณ„ ์ €์žฅ
  • ์ผ๋ถ€ ๋„๊ตฌ๋งŒ ์‹คํŒจํ•˜๋ฉด ์ „์ฒด๋ฅผ ์„ฑ๊ณต์œผ๋กœ ์ˆจ๊ธฐ์ง€ ์•Š๊ณ  PARTIALLY_SUCCEEDED ๋ฐ˜ํ™˜

4. Provider ๊ต์ฒด ๊ตฌ์กฐ

LLM Provider
  โ”œโ”€ Mock
  โ””โ”€ NVIDIA NIM

Vector Search Provider
  โ”œโ”€ Mock
  โ””โ”€ PostgreSQL / pgvector

Productivity Provider
  โ”œโ”€ Mock Microsoft 365       # ๊ณต๊ฐœ Demo
  โ”œโ”€ Logic Apps               # ๊ธฐ์กด Azure ์—ฐ๋™ ๊ณ„์•ฝ
  โ””โ”€ Microsoft Graph          # REST + OAuth token boundary

5. ์šด์˜ ์•ˆ์ „์žฅ์น˜

  • APP_MODE=demo์—์„œ NVIDIA + pgvector + Mock Productivity ์กฐํ•ฉ ๊ฐ•์ œ
  • Demo mode์—์„œ PostgreSQL URL ๊ฐ•์ œ
  • Legacy Azure router ๋ฏธ๋“ฑ๋ก ๋ฐ import ์ฐจ๋‹จ
  • ๊ณต๊ฐœ Knowledge index ์“ฐ๊ธฐ API ์ฐจ๋‹จ
  • postgresql:// URL์„ psycopg 3 dialect๋กœ ์ž๋™ ์ •๊ทœํ™”
  • Alembic migration โ†’ Demo seed โ†’ Uvicorn์„ Python entrypoint์—์„œ ์ˆœ์ฐจ ์‹คํ–‰
  • CORS allowlist๋กœ Vercel Production Origin๋งŒ ํ—ˆ์šฉ

๊ธฐ์ˆ  ์Šคํƒ

์˜์—ญ ๊ธฐ์ˆ  ์—ญํ•  ๋ฐ ์„ ํƒ ์ด์œ 
Frontend React 18, Vite, Chakra UI ์Šน์ธ ํ๋ฆ„์„ ํ•œ ํ™”๋ฉด์—์„œ ๋ณด์—ฌ์ฃผ๋Š” SPA
Backend Python 3.12, FastAPI, Pydantic ๋ช…์‹œ์ ์ธ APIยทschema ๊ณ„์•ฝ๊ณผ OpenAPI ์ œ๊ณต
ORM / Migration SQLAlchemy 2.0, Alembic ์ƒํƒœ ์ „์ด transaction๊ณผ ์žฌํ˜„ ๊ฐ€๋Šฅํ•œ schema ๊ด€๋ฆฌ
Database Supabase PostgreSQL ๊ณต๊ฐœ ํ™˜๊ฒฝ์˜ ์˜์† ๋ฐ์ดํ„ฐ ์ €์žฅ
Vector Search pgvector embedding ์ €์žฅ๊ณผ ์กฐ์ง ์ง€์‹ ์œ ์‚ฌ๋„ ๊ฒ€์ƒ‰
LLM / Embedding NVIDIA NIM OpenAI-compatible ๊ตฌ์กฐํ™” ๋ถ„์„๊ณผ embedding
Productivity Mock, Logic Apps, Microsoft Graph ๊ณต๊ฐœ ์•ˆ์ „์„ฑ๊ณผ ์‹ค์ œ ์—ฐ๋™ ๊ฒฝ๊ณ„๋ฅผ ๋™์‹œ์— ์œ ์ง€
Observability JSON logging, X-Request-ID ์š”์ฒญ๊ณผ Action ์‹คํ–‰ ์ถ”์ , ๋ฏผ๊ฐ payload ๋น„์ €์žฅ
Test pytest, FastAPI TestClient API, ์ƒํƒœ ์ „์ด, provider, migration๊ณผ ์‹คํŒจ ๊ฒฝ๋กœ ๊ฒ€์ฆ
CI/CD GitHub Actions, Render Blueprint, Vercel ํ…Œ์ŠคํŠธ ํ›„ ์ž๋™ ๋ฐฐํฌ์™€ ํ™˜๊ฒฝ๋ณ„ secret ๋ถ„๋ฆฌ

์ „์ฒด ์•„ํ‚คํ…์ฒ˜

์™ธ๋ถ€ Provider๋ฅผ ๋ณ„๋„ ์„œ๋น„์Šค๋กœ ์ชผ๊ฐœ๊ธฐ๋ณด๋‹ค, ํ˜„์žฌ ๊ทœ๋ชจ์—์„œ๋Š” ํ•˜๋‚˜์˜ FastAPI ๋ฐฐํฌ ๋‹จ์œ„๋ฅผ ์œ ์ง€ํ•˜๋Š” Provider ๊ธฐ๋ฐ˜ ๋ชจ๋“ˆ๋Ÿฌ ๋ชจ๋†€๋ฆฌ์Šค๋ฅผ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์„œ๋น„์Šคยท์ €์žฅ์†Œยท Provider ๊ฒฝ๊ณ„๋Š” ์ฝ”๋“œ ์ˆ˜์ค€์—์„œ ๋ถ„๋ฆฌํ•˜๊ณ , ์™ธ๋ถ€ ์‹œ์Šคํ…œ์€ interface ๋’ค์—์„œ ๊ต์ฒดํ•ฉ๋‹ˆ๋‹ค.

flowchart TB
    U[User Browser]

    subgraph Vercel
        FE[React + Vite SPA]
    end

    subgraph Render
        API[FastAPI Routers]
        SEC[Identity & Role Boundary]
        WF[Action Workflow Service]
        OBS[Request ID & JSON Audit Log]

        subgraph Providers
            LLM[NVIDIA LLM Provider]
            EMB[NVIDIA Embedding Provider]
            VS[pgvector Search Provider]
            PROD[Mock Microsoft 365]
            REAL[Logic Apps / Graph Adapters]
        end
    end

    subgraph Supabase
        PG[(PostgreSQL)]
        VEC[(pgvector Knowledge)]
    end

    NIM[NVIDIA NIM API]

    U -->|HTTPS| FE
    FE -->|CORS allowlisted API| API
    API --> SEC
    API --> WF
    API --> OBS
    WF --> LLM
    WF --> EMB
    WF --> VS
    WF --> PROD
    WF -. production adapter .-> REAL
    WF --> PG
    VS --> VEC
    LLM --> NIM
    EMB --> NIM
Loading

Backend ๋‚ด๋ถ€ ํ๋ฆ„

flowchart LR
    R[API Router] --> S[ActionWorkflowService]
    S --> K[VectorSearchProvider]
    S --> L[LLMProvider]
    S --> A[ActionPlanRepository]
    S --> P[ProductivityProvider]

    K --> C[(Knowledge Chunks)]
    A --> D[(Plans & Executions)]
    P --> M[Mock / Logic Apps / Graph]
Loading

Action Plan ์ƒํƒœ ๋ชจ๋ธ

stateDiagram-v2
    [*] --> PENDING_APPROVAL: grounded plan ์ƒ์„ฑ
    PENDING_APPROVAL --> APPROVED: approver ์Šน์ธ
    PENDING_APPROVAL --> REJECTED: approver ๊ฑฐ์ ˆ
    APPROVED --> EXECUTING: executor ์‹คํ–‰๊ถŒ ํš๋“
    EXECUTING --> SUCCEEDED: ๋ชจ๋“  ๋„๊ตฌ ์„ฑ๊ณต
    EXECUTING --> PARTIALLY_SUCCEEDED: ์ผ๋ถ€ ๋„๊ตฌ ์‹คํŒจ
    EXECUTING --> FAILED: ๋ชจ๋“  ๋„๊ตฌ ์‹คํŒจ ๋˜๋Š” timeout
    REJECTED --> [*]
    SUCCEEDED --> [*]
    PARTIALLY_SUCCEEDED --> [*]
    FAILED --> [*]
Loading

API

Method Endpoint ์„ค๋ช…
GET /health/live process liveness
GET /health/ready mode์™€ Provider readiness
POST /api/v1/meetings/analyze ํšŒ์˜๋ก ๊ตฌ์กฐํ™” ๋ถ„์„
POST /api/v1/knowledge/chunks ์กฐ์ง ์ง€์‹ chunk index, Demo ์“ฐ๊ธฐ ์ฐจ๋‹จ
POST /api/v1/knowledge/search ์œ ์‚ฌ ์กฐ์ง ์ง€์‹ ๊ฒ€์ƒ‰
POST /api/v1/action-plans ๋ช…์‹œ์  Action Plan ์ƒ์„ฑ
POST /api/v1/action-plans/grounded RAG ๊ธฐ๋ฐ˜ Action Plan ์ƒ์„ฑ
GET /api/v1/action-plans/{id} ๊ณ„ํšยท๊ทผ๊ฑฐยท๋„๊ตฌ ๊ฒฐ๊ณผ ์กฐํšŒ
POST /api/v1/action-plans/{id}/approve ๊ณ„ํš ์Šน์ธ
POST /api/v1/action-plans/{id}/reject ๊ณ„ํš ๊ฑฐ์ ˆ
POST /api/v1/action-plans/{id}/execute ์Šน์ธ๋œ ๊ณ„ํš ์‹คํ–‰

Legacy Azure endpoint๋Š” APP_MODE=azure์ผ ๋•Œ๋งŒ ๋“ฑ๋ก๋ฉ๋‹ˆ๋‹ค. ๊ณต๊ฐœ Demo์—์„œ๋Š” /chat, /files, /upload, /execute-action ๋“ฑ์ด 404๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋Œ€ํ‘œ์ ์ธ ๊ธฐ์ˆ ์  ๋ฌธ์ œ ํ•ด๊ฒฐ

์Šน์ธ๊ณผ ์‹คํ–‰์„ ํ•˜๋‚˜์˜ ์š”์ฒญ์—์„œ ๋ถ„๋ฆฌ

์ดˆ๊ธฐ ์—…๋ฌด ์ž๋™ํ™”๋Š” ๋ถ„์„ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ”๋กœ ์™ธ๋ถ€ ๋„๊ตฌ๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฐฉ์‹์€ LLM ์˜ค๋ฅ˜๊ฐ€ ์‹ค์ œ ๋ฉ”์ผ๊ณผ ์ผ์ •์œผ๋กœ ์ „ํŒŒ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Before: Analyze โ†’ Execute
After : Analyze โ†’ Persist PENDING_APPROVAL
                 โ†’ Human Approve
                 โ†’ Explicit Execute

์Šน์ธ์ž์™€ ์‹คํ–‰์ž์˜ ์—ญํ• ์„ ๋ถ„๋ฆฌํ•˜๊ณ  DB ์ƒํƒœ ์ „์ด๋ฅผ ๊ฒ€์ฆํ•ด ์š”์ฒญ body์˜ ์ž„์˜ actor๋‚˜ ์ค‘๋ณต ์š”์ฒญ์ด ์‹คํ–‰ ๊ถŒํ•œ์„ ๋งŒ๋“ค์ง€ ๋ชปํ•˜๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋™์‹œ ์‹คํ–‰๊ณผ ๋ถ€๋ถ„ ์‹คํŒจ๋ฅผ ์ƒํƒœ๋กœ ํ‘œํ˜„

๋ฉ”๋ชจ๋ฆฌ flag๊ฐ€ ์•„๋‹ˆ๋ผ DB์˜ ์กฐ๊ฑด๋ถ€ ์ƒํƒœ ์ „์ด๋กœ ์‹คํ–‰๊ถŒ์„ ํš๋“ํ•ฉ๋‹ˆ๋‹ค. ๋‘ ์š”์ฒญ์ด ๋™์‹œ์— ๋“ค์–ด์™€๋„ ํ•˜๋‚˜๋งŒ APPROVED โ†’ EXECUTING ์ „์ด์— ์„ฑ๊ณตํ•˜๋ฉฐ, ๊ฐ ๋„๊ตฌ ๊ฒฐ๊ณผ๋Š” ๋…๋ฆฝ์ ์œผ๋กœ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

Calendar  SUCCEEDED
To-do     FAILED
Email     SUCCEEDED
โ†’ Plan PARTIALLY_SUCCEEDED

Azure ๊ตฌ๋… ๋งŒ๋ฃŒ๋ฅผ Provider ๊ฒฝ๊ณ„๋กœ ์ „ํ™˜

๊ณผ๊ฑฐ Azure AI Search, Blob Storage์™€ Logic Apps์— ์ง์ ‘ ์˜์กดํ•˜๋˜ ๊ตฌ์กฐ๋Š” ๊ตฌ๋…์ด ์—†์œผ๋ฉด ์žฌํ˜„ํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. LLMยทVector SearchยทProductivity ๊ณ„์ธต์„ Provider๋กœ ๋ถ„๋ฆฌํ•ด ๊ณต๊ฐœ ํ™˜๊ฒฝ์„ NVIDIA NIM, Supabase์™€ Mock Microsoft 365๋กœ ๊ต์ฒดํ–ˆ์Šต๋‹ˆ๋‹ค. Logic Apps์™€ Microsoft Graph adapter๋Š” ์‹ค์ œ ์—…๋ฌด ํ™˜๊ฒฝ ์ „ํ™˜ ๊ฒฝ๋กœ๋กœ ๋ณด์กดํ•ฉ๋‹ˆ๋‹ค.

Render์™€ Supabase ๋ฐฐํฌ ์žฅ์•  ํ•ด๊ฒฐ

๋ฐฐํฌ ๊ณผ์ •์—์„œ ์…ธ ํ•ด์„, ๋“œ๋ผ์ด๋ฒ„ ์„ ํƒ๊ณผ ์ธ์ฆ ๋ฌธ์ œ๋ฅผ ๊ฐ๊ฐ ๋ถ„๋ฆฌํ•ด ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

Render sh -c / && parsing failure
  โ†’ shell-independent `python -m ieum.start`

SQLAlchemy selecting psycopg2
  โ†’ generic PostgreSQL URL normalized to psycopg 3

Supabase Session pooler auth failure
  โ†’ postgres.PROJECT_REF username + port 5432

Repeated authentication failure
  โ†’ credential correction + Supavisor circuit-breaker cooldown

์ „์ฒด ์žฅ์•  ๊ธฐ๋ก๊ณผ ์šด์˜ ๊ฒ€์ฆ์€ deployment-verification.md์— ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฒ€์ฆ ์ „๋žต

Unit
  โ†’ schema, chunker, URL normalization, identity, provider contract
Integration
  โ†’ API state transition, migration, repository and pgvector workflow
Concurrency
  โ†’ duplicate action ID and simultaneous execution claim
Failure path
  โ†’ timeout, partial failure, insufficient evidence, invalid transition
Mode boundary
  โ†’ Demo provider combination and Legacy Azure route isolation
Deployment
  โ†’ Render Blueprint, Vercel SPA, CORS and public end-to-end workflow

๋กœ์ปฌ ์ž๋™ ๊ฒ€์ฆ:

Set-Location ms-2nd-project-integration-ver-1\Backend
python -m pip install -r requirements.txt
python -m pytest -q

๊ฒฐ๊ณผ:

75 passed, 1 skipped

Frontend production build:

Set-Location ms-2nd-project-integration-ver-1
npm ci
npm.cmd run build

์šด์˜ ํ™˜๊ฒฝ์—์„œ๋Š” CORS preflight, readiness, grounded plan ์ƒ์„ฑ, ์Šน์ธ๊ณผ Mock ์‹คํ–‰๊นŒ์ง€ ์ง์ ‘ ๊ฒ€์ฆํ–ˆ์Šต๋‹ˆ๋‹ค.

๋กœ์ปฌ ์‹คํ–‰

Backend

Set-Location ms-2nd-project-integration-ver-1\Backend
python -m venv .venv
.\.venv\Scripts\Activate.ps1
python -m pip install -r requirements.txt

$env:APP_MODE = "mock"
$env:LLM_PROVIDER = "mock"
$env:EMBEDDING_PROVIDER = "mock"
$env:VECTOR_SEARCH_PROVIDER = "mock"
$env:PRODUCTIVITY_PROVIDER = "mock"

python -m alembic upgrade head
python -m uvicorn main:app --reload

Frontend

Set-Location ms-2nd-project-integration-ver-1
npm ci
$env:VITE_API_URL = "http://127.0.0.1:8000"
npm.cmd run dev

๋ธŒ๋ผ์šฐ์ €์—์„œ http://localhost:5173์„ ์—ฝ๋‹ˆ๋‹ค.

๋ฐฐํฌ ๊ตฌ์„ฑ

GitHub main
  โ”œโ”€ render.yaml โ†’ Render Docker Web Service
  โ”‚                    โ”œโ”€ Supabase Session pooler
  โ”‚                    โ””โ”€ NVIDIA NIM
  โ””โ”€ vercel.json โ†’ Vercel React SPA

Render secret:

DATABASE_URL
NVIDIA_API_KEY
ALLOWED_ORIGINS

Vercel environment:

VITE_API_URL=https://ieum-api-sgqw.onrender.com

์‹ค์ œ credential๊ณผ ์ „์ฒด Database URL์€ ์ €์žฅ์†Œ์— commitํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ

.
โ”œโ”€ README.md
โ”œโ”€ render.yaml
โ”œโ”€ docs/
โ”‚  โ”œโ”€ deployment-verification.md
โ”‚  โ”œโ”€ implementation-progress.md
โ”‚  โ”œโ”€ agentic-development-case-study.md
โ”‚  โ””โ”€ ...
โ”œโ”€ evaluation/rag/
โ””โ”€ ms-2nd-project-integration-ver-1/
   โ”œโ”€ src/
   โ”‚  โ”œโ”€ pages/DemoWorkflow.jsx
   โ”‚  โ””โ”€ lib/api.js
   โ”œโ”€ vercel.json
   โ””โ”€ Backend/
      โ”œโ”€ main.py
      โ”œโ”€ alembic/
      โ”œโ”€ ieum/
      โ”‚  โ”œโ”€ api/routers/
      โ”‚  โ”œโ”€ demo/
      โ”‚  โ”œโ”€ ingestion/
      โ”‚  โ”œโ”€ observability/
      โ”‚  โ”œโ”€ providers/
      โ”‚  โ”œโ”€ security/
      โ”‚  โ””โ”€ services/
      โ”œโ”€ scripts/verify_supabase.py
      โ””โ”€ tests/

์ฃผ์š” ์„ค๊ณ„ ๊ฒฐ์ •๊ณผ Trade-off

๊ฒฐ์ • ์„ ํƒ ๊ฐ์ˆ˜ํ•œ ํ•œ๊ณ„
์‹คํ–‰ ์ •์ฑ… ๋ช…์‹œ์  ์Šน์ธ ํ›„ ๋ณ„๋„ ์‹คํ–‰ ํด๋ฆญ ๋‹จ๊ณ„๊ฐ€ ๋Š˜์ง€๋งŒ ์™ธ๋ถ€ ๋ถ€์ž‘์šฉ ํ†ต์ œ
๊ณต๊ฐœ Productivity Mock Microsoft 365 ์‹ค์ œ ์ƒ์„ฑ ํ™”๋ฉด ๋Œ€์‹  ์•ˆ์ „ํ•œ ์ƒํƒœ ์ „์ด ์ฆ๋ช…
์„œ๋น„์Šค ๊ตฌ์กฐ Provider ๊ธฐ๋ฐ˜ ๋ชจ๋“ˆ๋Ÿฌ ๋ชจ๋†€๋ฆฌ์Šค ๋…๋ฆฝ ๋ฐฐํฌ๋ณด๋‹ค ํ˜„์žฌ ์šด์˜ ๋‹จ์ˆœ์„ฑ ์šฐ์„ 
Vector DB PostgreSQL + pgvector ์ „์šฉ ๊ฒ€์ƒ‰ ์„œ๋น„์Šค ๊ธฐ๋Šฅ๋ณด๋‹ค ์ด์‹์„ฑ๊ณผ ๋น„์šฉ ์šฐ์„ 
Demo identity ์„œ๋ฒ„ ๊ณ ์ • actor ๊ณต๊ฐœ ์‹œ์—ฐ์€ ๋‹จ์ˆœํ•˜์ง€๋งŒ ์‹ค์ œ ์‚ฌ์šฉ์ž ์ธ์ฆ ์•„๋‹˜
Legacy Azure Demo์—์„œ router ๋ฏธ๋“ฑ๋ก ๊ณผ๊ฑฐ ๊ธฐ๋Šฅ์„ ๊ณต๊ฐœ UI์—์„œ ์ง์ ‘ ์‹œ์—ฐํ•˜์ง€ ์•Š์Œ
Render free ์ ˆ์ „ ํ—ˆ์šฉ ๋น„์šฉ์„ ์ค„์ด๋Š” ๋Œ€์‹  cold start ๋ฐœ์ƒ
RAG ๊ณ„ํš ์ตœ์†Œ ์œ ์‚ฌ๋„ gate ๊ทผ๊ฑฐ ์—†๋Š” ์‹คํ–‰์€ ๋ง‰์ง€๋งŒ seed ํ’ˆ์งˆ์— ๋ฏผ๊ฐ

ํ˜„์žฌ ํ•œ๊ณ„์™€ ๋‹ค์Œ ๊ณผ์ œ

  • ๊ณต๊ฐœ Demo๋Š” ์‹ค์ œ Entra ID ์ธ์ฆ์ด ์•„๋‹ˆ๋ผ ๊ณ ์ • Demo actor๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • Microsoft Graph adapter๋Š” HTTP mock์œผ๋กœ ๊ฒ€์ฆํ–ˆ์œผ๋ฉฐ ์‹ค์ œ tenant consent์™€ ์šด์˜ token rotation์€ ์•„์ง ๊ฒ€์ฆํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
  • NVIDIA ์ฒซ ์š”์ฒญ์˜ ์ผ์‹œ์ ์ธ 502/503์€ ๊ณ„ํš ์ƒ์„ฑ์— ํ•œํ•ด ํ•œ ๋ฒˆ ์ž๋™ ์žฌ์‹œ๋„ํ•˜์ง€๋งŒ, ๋ฐ˜๋ณต ์žฅ์• ์—๋Š” ์‚ฌ์šฉ์ž์˜ ๋ช…์‹œ์ ์ธ ์žฌ์š”์ฒญ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ธฐ๋ณธ ์ƒ˜ํ”Œ์€ ์ถœ์žฅ๋น„ยท์Šน์ธ ๊ทœ์ •๊ณผ ์—ฐ๊ฒฐ๋˜๋„๋ก ์ •๋ฆฌํ–ˆ์œผ๋ฉฐ, ์‹ค์ œ ๊ณต๊ฐœ embedding ๊ฒ€์ƒ‰์˜ Top 1~3 ์ •ํ•ฉ์„ฑ์€ ๋ณ€๊ฒฝ ๋ฐฐํฌ ํ›„ ๋‹ค์‹œ ๊ฒ€์ฆํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • RAG ํ‰๊ฐ€๋Š” ์ž‘์€ ํ•ฉ์„ฑ lexical dataset ๊ธฐ์ค€์ด๋ฉฐ ์‹ค์ œ ์กฐ์ง ๋ฌธ์„œ corpus ํ‰๊ฐ€๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • Render ๋ฌด๋ฃŒ ์ธ์Šคํ„ด์Šค cold start ์•ˆ๋‚ด๋Š” ์ œ๊ณตํ•˜์ง€๋งŒ ์ง„ํ–‰๋ฅ ์ด๋‚˜ ์˜ˆ์ƒ ์™„๋ฃŒ ์‹œ๊ฐ์€ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • rate limiting, ๋งŒ๋ฃŒ Demo ๋ฐ์ดํ„ฐ scheduler์™€ ์™ธ๋ถ€ ๋ชจ๋‹ˆํ„ฐ๋ง์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์‹ค์ œ Graph/Logic Apps ์‹คํ–‰์€ ๋ณ„๋„ credential๊ณผ ์ตœ์†Œ ๊ถŒํ•œ ์„ค์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋ฌธ์„œ


๊ธฐ๋Šฅ ๋ชฉ๋ก๋ฟ ์•„๋‹ˆ๋ผ ์Šน์ธ ๊ฒฝ๊ณ„, ์‹คํŒจ ์ƒํƒœ, Provider ์„ ํƒ ์ด์œ ์™€ ์‹ค์ œ ๋ฐฐํฌ ๊ฒ€์ฆ์„ ํ•จ๊ป˜ ๊ธฐ๋กํ•˜๋Š” ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค.

About

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages