인셔셔RSS 관심 있는 블로그, 뉴스, 기술 정보를 효율적으로 추적하고 읽으세요
원문 읽기 InertiaRSS에서 열기

추천 피드

博客园 - 司徒正美
V
V2EX
T
Tailwind CSS Blog
有赞技术团队
有赞技术团队
aimingoo的专栏
aimingoo的专栏
Apple Machine Learning Research
Apple Machine Learning Research
IT之家
IT之家
Blog — PlanetScale
Blog — PlanetScale
A
About on SuperTechFans
月光博客
月光博客
T
The Blog of Author Tim Ferriss
宝玉的分享
宝玉的分享
Martin Fowler
Martin Fowler
博客园 - 聂微东
The GitHub Blog
The GitHub Blog
V
Visual Studio Blog
WordPress大学
WordPress大学
酷 壳 – CoolShell
酷 壳 – CoolShell
Engineering at Meta
Engineering at Meta
GbyAI
GbyAI

DEV Community

Authentication Security Deep Dive: From Brute Force to Salted Hashing (With Java Examples) Why AI Systems Don’t Fail — They Drift Spilling beans for how i learn for exam😁"Reinforcement Learning Cheat Sheet" I Replaced Chrome with Safari for AI Browser Automation. Here's What Broke (and What Finally Worked) How Python Borrows Other People's Work The $40 Architecture: Processing 1 Billion API Requests with 99.99% Uptime Vibe Coding: A Workflow Guide (From Zero to SaaS) Most webhook security guides protect the wrong side. The scary part is delivery. Headless CMS for TanStack Start: Build a Blog with Cosmic EU Age Verification App "Hacked in 2 Minutes" — What Actually Happened Comfy Cloud’s delete function does not actually remove files Running AI Models on GPU Cloud Servers: A Beginner Guide Event-driven media intelligence with AWS Step Functions and Bedrock I scored 500 AI prompts across 8 quality dimensions — here's what broke How to Call Google Gemini API from Next.js (Free Tier, No Backend Needed) The Portal Protocol: Reclaiming Human Connection in the Age of AI How to Fix Your Team's Scattered Knowledge Problem With a Self-Hosted Forum Intro to tc Cloud Functors: A Graph-First Mental Model for the Modern Cloud Designing Multi-Tenant Backends With Both Ownership and Team Access I Built a Neumorphic CSS Library with 77+ Components — Here's What I Learned PostgreSQL Performance Optimization: Why Connection Pooling Is Critical at Scale Cómo construí un SaaS multi-rubro para gestionar expensas en Argentina con FastAPI + Vue 3 🚀 I Built an Ethical Hacking Scanner Tool – Open Source Project I Replaced /usage and /context in Claude Code With a Single Statusline A Pythonic Way to Handle Emails (IMAP/SMTP) with Auto-Discovery and AI-Ready Design I Collected 8.9 Million Polymarket Price Points — Here's What I Found About How Markets Really Move EcoTrack AI — Carbon Footprint Tracker & Dashboard Everyone's Using AI. No One Agrees How. 5 self-hosted ebook managers worth trying in 2026 Building Your First AI Agent with LangChain: From Chatbot to Autonomous Assistant Common SOC 2 Failures (Real World) Stop Vibe-Checking Your AI App: A Practical Guide to Evals How to Use SonarQube and SonarScanner Locally to Level Up Your Code Quality Your Next To-Do App Is Dead — I Replaced Mine with an OpenClaw AI Sign a Nostr event in 60 lines of Python using coincurve — no nostr-sdk, no nbxplorer, no rust toolchain ITGC Audit Explained Like You’re in Big 4 Patch Tuesday abril 2026: Microsoft parcha 163 vulnerabilidades y un zero-day en SharePoint Stop scraping everything: a better way to track competitor price changes Listing on MCPize + the Official MCP Registry while routing payments OUTSIDE the marketplace — how I kept 100% of my x402 revenue Building an AI-Powered Risk Intelligence System Using Serverless Architecture Why We Ripped Function Overloading Out of Our AI Toolchain Testing AI-Generated Code: How to Actually Know If It Works SaaS Churn Is Killing Your Business. Here Is What to Do About It (Without a Support Team) The Speed of AI Is No Longer Linear - And Self-Improving Models Are Why How to Implement RBAC for MCP Tools: A Practical Guide for Engineering Teams From Standard Quote to Persuasive Proposal: AI Automation for Arborists I built a CLI that scaffolds complete multi-tenant SaaS apps Axios CVE-2025–62718: The Silent SSRF Bug That Could Be Hiding in Your Node.js App Right Now The dashboard that ended our friendship Data Pipelines Explained Simply (and How to Build Them with Python)
나의 개인 AI 보조원을 되살렸다 — 이제 그것은 Windows에서 개인정보 우선 Telegram 봇이다
Sreedhara Murthy · 2026-05-24 · via DEV Community

이것은 GitHub Finish-Up-A-Thon Challenge


의 제출물입니다. 제가 만든 것

디지털 비서는 Windows PC에서 실행되는 프라이버시 우선 개인형 AI 비서로, Telegram을 통해 대화합니다. 클라우드 구독은 없습니다. Docker도 없습니다. 당신의 컴퓨터에서 데이터가 빠져나가지 않습니다. 당신이 선택하지 않는 한.

메시지를 보내시면 → 컴퓨터가 처리하면 → 지능적이고 메모리를 인지하는 답장을 받으십니다. 음성 입력, 음성 출력. 파일, 웹 검색, 알림, OCR - 모두 Telegram에서.

GitHub: github.com/sree1959git/Digital-Secretary


데모

설정 마법사

상호작용 마법사는 3분 미만으로 완료됩니다:

  ____  _       _ _        _   ____                    _
 |  _ \(_) __ _(_) |_ __ _| | / ___|  ___  ___ _ __ ___| |_ __ _ _ __ _   _
 | | | | |/ _` | | __/ _` | | \___ \ / _ \/ __| '__/ _ \ __/ _` | '__| | | |
 | |_| | | (_| | | || (_| | |  ___) |  __/ (__| | |  __/ || (_| | |  | |_| |
 |____/|_|\__, |_|\__\__,_|_| |____/ \___|\___| _|  \___|  \__\__,_|_|   \__, |
          |___/                                                              |___/

  Your personal AI secretary. On Telegram. On Windows.

  Step 1: Telegram Bot Token
  Step 2: OpenRouter API Key
  Step 3: Default AI Model
  Step 4: Name Your AI Secretary
  Step 5: Personality

전체 화면 모드 입력 전체 화면 모드 종료

봇이 작동 중

You: Remind me to call the dentist tomorrow at 10am
Digital Secretary: Done! I've set a reminder for tomorrow at 10:00 AM: "Call the dentist". 
                   I'll message you here on Telegram when it's time.

You: [sends photo of whiteboard]
Digital Secretary: I can see a whiteboard with what appears to be a sprint plan. 
                   The items listed are: [extracted text from OCR + vision analysis]

You: [voice message] "What did we discuss last week about the project?"
Digital Secretary: [voice reply] Based on our previous conversations, we talked about...

전체 화면 모드 입력 전체 화면 모드 종료

아키텍처 한눈에

Telegram (Your Phone)
        │
        ▼
Digital Secretary (Windows PC)
        │
        ├── 🧠 AI: OpenRouter / Ollama / llama.cpp
        ├── 💾 Memory: SQLite FTS5 (persistent, searchable)
        ├── 🛠️ Tools: files, shell, web, OCR, MCP servers
        ├── 📅 Scheduler: APScheduler-backed reminders
        ├── 🎙️ STT: faster-whisper (local Whisper)
        └── 🔊 TTS: edge-tts (Microsoft neural voices)

전체 화면 모드 입력 전체 화면 모드 종료


복귀 이야기

시작 장소 (이전)

6개월 전에, 저는 이 프로젝트의 첫 버전을 만들었습니다 — 당시에는 Antidote라고 불렸습니다 — 주말 실험으로서. 아이디어는 간단했습니다: 저는 개인 AI 보조원을 원했는데:

  1. 월간 구독이 필요 없는
  2. 내 Windows PC에서 실행되는
  3. Telegram(폰에 이미 있던 앱)을 사용하는

3일 안에 작동하는 프로토타입을 만들었어요. 하지만 그때 삶이 일어났어요. 프로젝트는 그저 그렇게 있었어요 — 기능은 있지만 거칠었어요:

  • 설정 파일에 깔끔하게 코딩된 경로 (C:/Users/Sreedhar/...)
  • 봇은 질문에 답했지만 재시작 사이에는 모든 것을 잊어버렸어요
  • 음성 지원이 전혀 없었어요
  • 단 하나의 파이썬 파일이 1,000줄까지 자라났어요
  • 문서화 없음 — 나 자신이 설정을 어떻게 해야 하는지조차 기억할 수 없었어

나는 CODE_REVIEW_REPORT.md에서 무자비하게 솔직하게 모든 것을 문서화했다__:

"설정 파일에는 개인 경로가 하드코딩되어 있어... 메모리는 세션마다만 유지된다... OcrImageTool은 Telegram 채널에 등록되어 있지만 주요 도구 등록에 없다... 자동 시작 작업 이름은 wizard.py와 autostart.py 사이에서 일관성이 없다..."

내가 바꾼 것 (이후)

이 챌린지를 다시 시작할 때, 이를 고객의 코드베이스를 처음 접하는 것처럼 다루었습니다. 변화된 점은 다음과 같습니다:

아키텍처 개선:

  • 모노리틱을 올바른 패키지 구조로 분리: agent/, channels/, memory/, providers/, security/tools/
  • SQLite FTS5로 MemoryStore를 추가했습니다 — 이제 봇이 세션 간에도 당신을 기억할 수 있습니다
  • ContextBuilder를 도입했습니다. 이는 정체성 파일(SOUL.md, AGENTS.md, USER.md)에서 시스템 프롬프트를 조합합니다
  • OpenAI 호환 함수 정의를 사용하여 올바른 ToolRegistry를 만들었습니다

새로운 기능이 추가되었습니다:

  • 🎙️음성 입력/출력 — Whisper (지역 STT) + Edge-TTS 신경 목소리 (3단계 목소리 시스템)
  • 📅 스케줄러 — "매일 3시에 일어나서 스트레칭하기를 알려줘요"
  • 🖼️ 시각 + OCR — 사진을 보내면 텍스트가 추출되고 이미지가 설명됩니다
  • 🔌 MCP 브릿지 — 모든 모델 컨텍스트 프로토콜 서버에 연결하세요
  • 🔐 하드웨어 결합 암호화 — 비밀 정보는 Windows UUID에 대한 Fernet 키로 저장됩니다

질의 삶:

  • 인터랙티브 설정 마법사 (더 이상 수동 JSON 편집이 필요 없음)
  • Windows Task Scheduler를 통해 자동 시작
  • Ctrl+C / SIGTERM에 대한 올바른 부드러운 종료
  • 단락 경계에서 응답을 분할하세요 (단어 중간 Telegram 잘림 없음)
  • /model 명령어를 사용하여 대화 중 AI 모델 전환

브랜드 변경:

  • Antidote에서 Digital Secretary으로 변경됨 — 새로운 이름은 실제로 하는 일을 더 잘 반영합니다: 이것은 당신의 개인 비서이지 "AI"만은 아닙니다
  • 새로운 CLI: digital_secretarydigital_secretary setup

GitHub Copilot과의 경험

GitHub Copilot (via Antigravity IDE)는 이번 부활 기간 동안 진정으로 귀중했습니다. 가장 큰 차이를 만든 구체적인 순간들이 있습니다:

1. 음성 파이프라인 설계

3계층 음성 응답 시스템이 가장 어려운 설계 과제였습니다:

  • 레벨 1: "그것을 읽어보세요" → 마지막 응답의 TTS 재생, LLM 호출 없음
  • 티어 2: "이것을 설명해" → LLM이 자연스러운 말투로 다시 설명합니다
  • 티어 3: 기본 음성 질의 → LLM이 음성용으로 응답을 요약합니다

영어로 문제를 설명했고, Copilot이 상태 기계를 그리고 초기 _is_readout_request() /_is_explain_request() 패턴 매칭. 엣지 케이스를 고려해보는 데 한 시간이 걸렸을 일이 몇 분 안에 구상되었습니다.

2. 하드웨어 결합 암호화

# Copilot suggested this elegant approach for Windows-specific key derivation
def _derive_key(uuid_bytes: bytes) -> bytes:
    return hashlib.pbkdf2_hmac(
        "sha256",
        uuid_bytes,
        salt=b"digital_secretary_v1",
        iterations=480_000,
    )

전체 화면 모드를 입력합니다. 전체 화면 모드를 종료합니다.

PBKDF2를 원시 HMAC보다 높은 반복 횟수로 사용해야 한다는 것을 인지했고, OWASP가 2024년에 제안한 특정 반복 횟수(480K)를 제안했습니다.

3. SQLite FTS5 메모리 검색

FTS5를 이전에 사용해보지 못했습니다. Copilot이 스키마 마이그레이션을 작성하고, MATCH 쿼리를 작성했으며, rank가 적절한 관련성 순서를 위해 부정되어야 하는지 설명해주었습니다. 이 과정에서 새로운 것을 배웠습니다.

4. Windows 신호 처리 버그

# This pattern only works on Unix:
loop.add_signal_handler(signal.SIGTERM, callback)

# Copilot caught this and suggested the Windows-compatible approach:
signal.signal(signal.SIGTERM, _signal_handler)

전체 화면 모드로 진입 전체 화면 모드 종료

코드 리뷰 패스에서 플랫폼 호환성 문제를 발견했습니다 — 사용자가 보고해주지 않았다면 발견하지 못했을 수 있는 일입니다.


사용 사례

디지털 비서는 개인 AI를 원하는 사람들을 위해 설계되었습니다:

시나리오 당신이 하는 일 그것이 하는 일
개인 비서 "우리 쇼핑 목록에 우유를 추가하세요" 메모리에 저장되어, 요청할 때 검색됩니다
일일 요약 8시에 예약된 메시지 잊을 것들을 요약해 보내줍니다
문서 리더 PDF 사진을 보내기 OCR + AI 요약
코드 도우미 오류를 붙여넣고 수정을 요청합니다 웹 검색, 파일 읽기, 해결책 제안
회의 메모 음성으로 핵심 내용 기록 감지 및 메모리에 저장
가족 비서 공유 알림 가족 구성원 모두를 위한 작업 일정 설정
연구 보조원 "X에 대한 최근 논문 찾기" 웹 검색 및 요약
오프라인 AI 로컬 llama.cpp 설정 클라우드 없이, 인터넷 없이 필요 없음

기술 아키텍처 강조 사항

지속 가능한 메모리

# Search semantic memory with FTS5
results = await memory.search("dentist appointment", limit=5)
# Returns: [Memory(content="User mentioned dentist on Tuesday...", category="fact")]

전체 화면 모드로 진입 전체 화면 모드 종료

모든 대화는 요약되어 저장됩니다. 다음에 관련 질문을 하면 관련 기억이 시스템 프롬프트에 자동으로 주입됩니다.

도구 사용 예시

"내일 날씨는 어떠할까요?"라고 질문하면 LLM:

  1. 호출을 결정합니다.web_search("weather tomorrow [your city]")
  2. 결과를 받습니다.
  3. 상세 예보를 위해 fetch_webpage(url)를 호출합니다
  4. 자연어 응답을 생성합니다

모든 것이 하나의 Telegram 교환에서

다중 공급자 AI

# Switch between providers transparently
provider = get_provider()  # reads config, returns right provider

# All providers implement the same interface
response = await provider.chat(messages=messages, tools=tool_defs)

전체 화면 모드로 진입 전체 화면 모드 종료

OpenRouter (100개 이상의 모델), Ollama (로컬), llama.cpp (극도로 로컬, GPU 또는 CPU)와 함께 작동합니다.


시작하기

git clone https://github.com/sree1959git/Digital-Secretary.git
cd Digital-Secretary
.\start.ps1

전체 화면 모드로 진입 전체 화면 모드 종료

발로더는 모든 것을 처리합니다 — 파이썬 버전 확인, venv 생성, 의존성 설치 및 마법사 시작

전체 설치 가이드: TELEGRAM_BOT_SETUP.md


다음 단계

프로젝트 로드맵은 아직 해야 할 일을 솔직하게 밝힙니다:

  • 다중 에이전트 라우팅 — 분리/finance, /health, /work 범위 제한 메모리를 가진 하위 에이전트
  • 승인 워크플로우 — 파일 쓰기와 셸 명령어를 승인하는 Telegram 인라인 버튼
  • 지속 가능한 대화 이력 — 모든 턴을 영구 저장, 요약만은 아님
  • 웹 UI — 메모리 검토, 알림 관리, 모델 전환을 위한 대시보드

이 도전은 바로 이 책상 위에 두고 있던 것을 멈추기 위해 필요했던 힘입니다.

이것을 시도해 보시면, 댓글에 어떻게 생각하는지 알려주세요. 👇


태그: #devchallenge #githubchallenge #python #telegram #ai #windows #opensource