[{"content":"{\u0026lt;/* resource-info */\u0026gt;}\n2024 AI 도구 디렉토리: 최고의 AI 도구 완벽 가이드 #최고의 AI 도구를 찾고 계신가요? 잘 찾아오셨습니다. 저희 종합 디렉토리에는 200개 이상의 큐레이션된 AI 도구가 카테고리별로 정리되어 있으며, 상세 리뷰, 가격 정보, 사용 시나리오 추천이 포함되어 있습니다.\n개발자, 마케터, 디자이너, 사업주 등 누구든 필요에 맞는 완벽한 AI 도구를 찾을 수 있습니다.\n🤖 AI 챗봇 및 어시스턴트 #현대 AI 도구의 기반입니다. 이러한 대화형 AI 어시스턴트는 질문 답변부터 코드 작성까지 모든 것을 도와줍니다.\n최고의 추천 # 도구 최적 용도 가격 평점 ChatGPT 범용 AI 어시스턴트 무료 / 월 $20 ⭐⭐⭐⭐⭐ Claude 장문 작성, 분석 무료 / 월 $20 ⭐⭐⭐⭐⭐ Gemini 구글 통합, 멀티모달 무료 / 월 $20 ⭐⭐⭐⭐ DeepSeek 코딩, 기술 작업 무료 ⭐⭐⭐⭐ Kimi 한국어 최적화, 긴 컨텍스트 무료 ⭐⭐⭐⭐ 사용 사례 # 고객 지원: 일반적인 질문에 대한 자동 응답 콘텐츠 제작: 블로그 게시물, 소셜 미디어 콘텐츠 생성 코딩 지원: 코드 디버깅, 개념 설명, 함수 작성 연구: 문서 요약, 데이터 분석 학습: 복잡한 개념 설명, 튜터링 ✍️ AI 글쓰기 도구 #블로그 게시물부터 마케팅 카피까지, 이러한 AI 글쓰기 도구는 콘텐츠를 더 빠르고 더 잘 만들 수 있도록 도와줍니다.\n콘텐츠 글쓰기 # 도구 최적 용도 가격 핵심 기능 Jasper 마케팅 카피, 블로그 월 $49 브랜드 보이스 커스터마이징 Copy.ai 소셜 미디어, 광고 무료 / 월 $49 90개 이상의 템플릿 Writesonic 장문 기사 월 $16 SEO 최적화 Rytr 단문 콘텐츠 무료 / 월 $9 40개 이상의 사용 사례 QuillBot 패러프레이징, 문법 무료 / 월 $9.95 학술 글쓰기 학술 및 전문 글쓰기 # 도구 최적 용도 가격 핵심 기능 Grammarly 문법, 스타일 검사 무료 / 월 $12 실시간 제안 ProWritingAid 심층 편집 월 $20 상세 보고서 Wordtune 문장 재작성 무료 / 월 $9.99 톤 조정 Jenni AI 학술 논문 무료 / 월 $20 인용 지원 사용 사례 # 블로그 작성: 개요 생성, 초안 작성, SEO 최적화 이메일 마케팅: 매력적인 제목과 본문 카피 생성 소셜 미디어: 여러 플랫폼을 위한 게시물 생성 학술 논문: 에세이, 연구 논문, 학위 논문 작성 비즈니스 문서: 보고서, 제안서, 프레젠테이션 🎨 AI 이미지 생성기 #이러한 AI 기반 이미지 생성 도구로 놀라운 비주얼을 만드세요.\n텍스트-이미지 변환 # 도구 최적 용도 가격 핵심 기능 Midjourney 예술적, 창의적 이미지 월 $10 최고 품질 출력 DALL-E 3 포토리얼리스틱 이미지 월 $20 (ChatGPT Plus) 사용 용이성 Stable Diffusion 오픈소스, 커스터마이즈 가능 무료 (셀프 호스팅) 완전한 제어 Adobe Firefly 상업적 안전 이미지 월 $4.99 저작권 안전 Leonardo AI 게임 에셋, 컨셉 아트 무료 / 월 $12 파인튜닝된 모델 이미지 편집 # 도구 최적 용도 가격 핵심 기능 Remove.bg 배경 제거 무료 / 월 $9 원클릭 제거 Upscale.media 이미지 확대 무료 / 월 $10 4배 확대 Clipdrop 객체 제거, 재조명 무료 / 월 $9 다양한 도구 Canva AI 디자인 템플릿 무료 / 월 $12.99 쉬운 템플릿 사용 사례 # 마케팅: 광고, 소셜 미디어 그래픽, 배너 생성 이커머스: 제품 이미지, 라이프스타일 샷 콘텐츠 제작: 블로그 대표 이미지, 썸네일 디자인: 컨셉 아트, 목업, 프로토타입 개인: 프로필 사진, 선물, 아트 프린트 🎬 AI 비디오 도구 #비디오 생성부터 편집까지, 이러한 AI 도구는 비디오 콘텐츠 제작을 변화시키고 있습니다.\n비디오 생성 # 도구 최적 용도 가격 핵심 기능 Sora 텍스트-비디오 변환 아직 비공개 최고 품질 Runway ML 창의적 비디오 생성 월 $12 Gen-2 모델 Pika 짧은 비디오 클립 무료 / 월 $8 사용 용이성 HeyGen AI 아바타, 토킹 헤드 월 $24 다국어 지원 Synthesia 기업 교육 비디오 월 $22 140개 이상의 아바타 비디오 편집 # 도구 최적 용도 가격 핵심 기능 Descript 팟캐스트, 비디오 편집 월 $24 텍스트 기반 편집 Opus Clip 숏폼 콘텐츠 무료 / 월 $19 자동 클리핑 Kapwing 빠른 편집, 밈 무료 / 월 $16 브라우저 기반 VEED 자막, 번역 무료 / 월 $18 자동 자막 사용 사례 # 소셜 미디어: TikTok, Reels, Shorts 콘텐츠 생성 마케팅: 제품 데모, 설명 비디오 교육: 온라인 강좌, 튜토리얼 기업: 교육 비디오, 프레젠테이션 개인: YouTube 콘텐츠, 블로그 💻 AI 코딩 도구 #이러한 AI 기반 코딩 어시스턴트로 개발 워크플로를 가속화하세요.\n코드 어시스턴트 # 도구 최적 용도 가격 핵심 기능 GitHub Copilot 코드 완성 월 $10 IDE 통합 Cursor AI 우선 코드 편집기 무료 / 월 $20 내장 AI Codeium 무료 코드 완성 무료 무제한 사용 Tabnine 프라이버시 중심 무료 / 월 $12 로컬 모델 Amazon CodeWhisperer AWS 통합 무료 / 월 $19 보안 스캐닝 개발 플랫폼 # 도구 최적 용도 가격 핵심 기능 Replit 브라우저 기반 코딩 무료 / 월 $20 즉시 배포 V0 by Vercel UI 생성 무료 React 컴포넌트 Bolt.new 풀스택 앱 무료 / 월 $20 원클릭 배포 Lovable 앱 프로토타이핑 무료 / 월 $20 자연어 사용 사례 # 코드 완성: 입력 시 제안 받기 디버깅: 자동으로 버그 찾기 및 수정 코드 리뷰: 자동화된 코드 리뷰 문서화: 코드에서 문서 생성 학습: 새로운 언어와 프레임워크 이해 📊 AI 비즈니스 및 생산성 도구 #이러한 AI 기반 생산성 도구로 비즈니스 운영을 강화하세요.\n프로젝트 관리 # 도구 최적 용도 가격 핵심 기능 Notion AI 노트, 문서, 데이터베이스 월 $10 통합 작업 공간 ClickUp AI 작업 관리 월 $7 프로젝트 자동화 Asana AI 팀 협업 월 $10.99 워크플로 자동화 Monday AI 작업 관리 월 $8 커스텀 워크플로 데이터 및 분석 # 도구 최적 용도 가격 핵심 기능 Julius AI 데이터 분석 무료 / 월 $20 자연어 쿼리 ChatGPT Code Interpreter 데이터 시각화 월 $20 파일 업로드 MonkeyLearn 텍스트 분석 무료 / 월 $299 감정 분석 Obviously AI 예측 모델링 월 $75 노코드 ML 사용 사례 # 작업 관리: 작업 생성 및 할당 자동화 데이터 분석: 자연어로 데이터베이스 쿼리 보고: 자동화된 보고서 생성 일정 관리: AI 기반 캘린더 관리 커뮤니케이션: 이메일 초안, 회의 요약 🎯 AI 마케팅 도구 #이러한 AI 기반 도구로 마케팅 활동에 활력을 불어넣으세요.\nSEO 및 콘텐츠 마케팅 # 도구 최적 용도 가격 핵심 기능 Surfer SEO 콘텐츠 최적화 월 $89 SERP 분석 Clearscope 콘텐츠 브리프 월 $170 키워드 최적화 MarketMuse 콘텐츠 전략 월 $149 토픽 모델링 Frase 콘텐츠 리서치 월 $14.99 AI 글쓰기 + SEO 소셜 미디어 # 도구 최적 용도 가격 핵심 기능 Buffer AI 소셜 스케줄링 무료 / 월 $6 AI 제안 Hootsuite AI 소셜 관리 월 $99 대량 스케줄링 Later AI 비주얼 플래닝 월 $25 Link in bio Predis.ai 소셜 콘텐츠 무료 / 월 $29 비디오 생성 사용 사례 # SEO 최적화: 검색 엔진에 맞게 콘텐츠 최적화 소셜 미디어 관리: 게시물 스케줄링 및 최적화 이메일 마케팅: 이메일 캠페인 생성 및 최적화 광고 캠페인: 광고 카피 생성 및 테스트 분석: 마케팅 성과 추적 및 최적화 🎵 AI 오디오 및 음악 도구 #이러한 AI 도구로 음악, 내레이션, 오디오 콘텐츠를 만드세요.\n음악 생성 # 도구 최적 용도 가격 핵심 기능 Suno 노래 생성 무료 / 월 $10 보컬 포함 전체 곡 Udio 음악 생성 무료 / 월 $10 고품질 AIVA 클래식, 시네마틱 무료 / 월 $11 커스터마이즈 가능 Soundraw 배경 음악 월 $16.99 로열티 프리 음성 및 스피치 # 도구 최적 용도 가격 핵심 기능 ElevenLabs 음성 클로닝 무료 / 월 $5 가장 사실적 Murf AI 내레이션 월 $23 120개 이상의 음성 Play.ht 텍스트 음성 변환 무료 / 월 $31.20 팟캐스트 호스팅 Descript 음성 편집 월 $24 Overdub 기능 사용 사례 # 음악 제작: 배경 음악, 광고 음악 생성 팟캐스트: 인트로, 아웃로, 전환 생성 내레이션: 비디오를 위한 나레이션 생성 오디오북: 텍스트를 음성으로 변환 접근성: TTS로 콘텐츠를 접근 가능하게 만들기 🔧 AI 개발자 도구 #AI 개발자와 엔지니어를 위한 필수 도구.\n모델 플랫폼 # 도구 최적 용도 가격 핵심 기능 OpenAI API GPT 모델 사용량 기반 과금 가장 큰 생태계 Anthropic API Claude 모델 사용량 기반 과금 안전 중심 Google AI Studio Gemini 모델 무료 티어 멀티모달 Hugging Face 오픈소스 모델 무료 / 월 $9 모델 허브 ML 운영 # 도구 최적 용도 가격 핵심 기능 Weights \u0026amp; Biases 실험 추적 무료 / 월 $50 시각화 MLflow ML 라이프사이클 무료 (오픈소스) 모델 관리 Neptune.ai 메타데이터 저장소 무료 / 월 $49 협업 Comet ML 실험 관리 무료 / 월 $49 팀 기능 사용 사례 # 모델 학습: AI 모델 학습 및 파인튜닝 실험 추적: 실험 추적 및 비교 모델 배포: 프로덕션에 모델 배포 API 통합: 애플리케이션에 AI 통합 데이터 관리: 학습 데이터 관리 🆓 최고의 무료 AI 도구 #돈을 쓰고 싶지 않으신가요? 다음은 최고의 무료 AI 도구입니다.\n최고의 무료 도구 # 도구 카테고리 핵심 기능 ChatGPT 챗봇 범용 AI Claude 챗봇 장문 분석 Canva AI 디자인 템플릿 + AI Grammarly 글쓰기 문법 검사 Remove.bg 이미지 배경 제거 Codeium 코딩 코드 완성 Notion AI 생산성 노트 + AI Buffer 소셜 미디어 게시물 스케줄링 무료 티어 하이라이트 # ChatGPT: 무제한 GPT-3.5, 제한된 GPT-4 Claude: 관대한 무료 티어, Claude 3 Canva: 월 5회 AI 이미지 생성 Grammarly: 기본 문법 및 맞춤법 검사 Remove.bg: 월 1장 무료 이미지 💡 AI 도구 선택 가이드 #어떤 AI 도구를 선택해야 할지 모르시겠나요? 이 가이드를 따르세요:\n1단계: 필요 사항 파악 # 글쓰기: 블로그, 이메일, 소셜 미디어 이미지: 마케팅, 디자인, 제품 사진 비디오: 소셜 미디어, 교육, 마케팅 코딩: 개발, 디버깅, 학습 비즈니스: 생산성, 분석, 자동화 2단계: 예산 고려 # 무료 티어: 무료 도구로 테스트 시작 월간 플랜: 대부분의 도구는 월 $10-50 플랜 제공 연간 플랜: 연간 결제로 20-40% 절약 엔터프라이즈: 대규모 팀을 위한 맞춤 가격 3단계: 여러 도구 테스트 # 대부분의 도구는 무료 체험판 제공 커밋하기 전 2-3개 도구 테스트 기존 도구와의 통합 확인 팀 협업 기능 고려 4단계: 평가 및 최적화 # 생산성 향상 추적 사용하지 않는 도구 취소 번들 딜 찾기 새 도구 소식 업데이트 📈 2024 AI 도구 트렌드 #AI 도구 분야에서 핫한 트렌드는 무엇인가요?\n최고의 트렌드 # 멀티모달 AI: 텍스트, 이미지, 비디오를 처리하는 도구 AI 에이전트: 작업을 자주 완료할 수 있는 AI 개인화: 선호도를 학습하는 AI 통합: 원활하게 함께 작동하는 도구 접근성: 더 많은 무료 및 저렴한 옵션 신흥 카테고리 # AI 컴패니언: 감정적 지원 및 대화 AI 튜터: 개인화된 학습 경험 AI 건강: 피트니스, 영양, 웰빙 AI 금융: 예산, 투자, 계획 AI 법률: 계약 검토, 법률 연구 🔗 관련 리소스 # Product Hunt 대안: 새로운 도구를 발견하는 최고의 플랫폼 개발자를 위한 AI 도구: 완벽 가이드 무료 AI 도구: 비용 없는 옵션 AI 도구 비교: 어떤 것이 적합한가요? 📝 마무리 #AI 도구 분야는 빠르게 진화하고 있습니다. 매일 새로운 도구가 출시되고, 기존 도구는 지속적으로 개선되고 있습니다. 핵심은:\n필요에서 시작: AI를 위해 AI를 사용하지 마세요 커밋 전 테스트: 무료 티어와 체험판 활용 최신 정보 유지: AI 뉴스와 트렌드 팔로우 경험 공유: 다른 사람들이 적합한 도구를 찾도록 도와주세요 목록에 없는 좋아하는 AI 도구가 있나요? 댓글로 알려주세요!\n마지막 업데이트: 2024년 12월\n이 가이드는 최신 AI 도구와 트렌드를 반영하여 정기적으로 업데이트됩니다. 이 페이지를 북마크하고 새로운 내용을 확인하세요.\n","date":"May 15, 2026","permalink":"https://dibi8.com/kr/resources/dev-utils/ai-tools-directory/","section":"AI 源码资源","summary":"","title":"2024 AI 도구 디렉토리: 최고의 AI 도구 완벽 가이드 | Dibi8"},{"content":"{\u0026lt;/* resource-info */\u0026gt;}\n2026년 대세: 개발자가 꼭 알아야 할 무료 오픈소스 AI 툴 Top 10 #실리콘밸리 빅테크 기업들에게 비싼 \u0026lsquo;월세\u0026rsquo;를 내던 시대는 끝났습니다. 2026년, 오픈소스 커뮤니티는 마침내 상용 SaaS 제품들의 성능을 따라잡았고, 많은 분야에서는 오히려 추월했습니다. 로컬 LLM 추론, AI 이미지 생성, 자동 코딩 에이전트 등 무엇을 원하든 프라이빗하게 호스팅할 수 있는 무료 대체재가 존재합니다.\n이 궁극의 가이드에서는 올해 반드시 마스터해야 할 오픈소스 AI 툴 Top 10을 선정했습니다. 더 이상 기술 스택을 대여하지 마세요. 이제 소유할 때입니다.\n2026년 마스터 비교 벤치마크 # 순위 툴 이름 핵심 용도 대체 가능한 유료 툴 사용 비용 #1 DeepSeek (DS4) 로컬 LLM 초고속 구동 OpenAI API / Claude $0 #2 ComfyUI 산업 표준 AI 이미지 생성 Midjourney v6 $0 #3 Open Codesign 로컬 UI / 프론트엔드 생성 Vercel v0 $0 #4 MemPalace 에이전트 영구 메모리 OpenAI Memory $0 #5 AiToEarn 소셜 미디어 자동화 Buffer / Hootsuite $0 #6 Toprank GEO(생성형 검색 엔진) 최적화 Ahrefs / Semrush $0 #7 Dify AI 워크플로우 시각화 엔진 Coze / LangChain $0 #8 OpenHands 자율 코딩 에이전트 Devin $0 #9 FaceFusion AI 비디오 / 딥페이크 유료 딥페이크 API $0 #10 AnythingLLM 엔터프라이즈 RAG 구축 비싼 기업용 솔루션 $0 1. DS4 기반 DeepSeek (OpenAI API 킬러) #핵심 요약 (BLUF): DwarfStar 4(DS4)로 로컬에서 DeepSeek V4 Flash를 구동하는 것은 무거운 AI 작업을 가장 빠르고 저렴하게 처리하는 방법입니다. NVMe 기반 KV 캐싱으로 10만 개 이상의 토큰 컨텍스트를 즉시 복원합니다. 👉 DS4 vs OpenAI API 비용 분석 벤치마크 읽기\n2. ComfyUI (Midjourney 학살자) #핵심 요약 (BLUF): 전문가는 블랙박스 Discord 봇에 의존할 수 없습니다. ComfyUI는 로컬 GPU에서 Stable Diffusion과 Flux 모델을 완벽하게 제어할 수 있는 노드 기반 워크플로우를 제공합니다. 👉 ComfyUI vs Midjourney 심층 분석 읽기\n3. Open Codesign (Vercel v0 대체재) #핵심 요약 (BLUF): 텍스트 프롬프트만으로 React 및 Vue 인터페이스를 로컬에서 찍어냅니다. Ollama를 통한 BYOM(Bring Your Own Model) 방식을 사용하여 사내 코드의 프라이버시를 100% 보호합니다. 👉 Open Codesign 아키텍처 가이드 읽기\n4. MemPalace (AI 메모리 아키텍트) #핵심 요약 (BLUF): AI 에이전트의 건망증을 치료하세요. MemPalace는 값비싼 API 호출 없이 Claude Code 같은 로컬 에이전트에게 무한한 영구 메모리를 제공하는 MCP 서버 역할을 합니다. 👉 Claude Code에 MemPalace를 연동하는 방법 읽기\n5. AiToEarn (Buffer 암살자) #핵심 요약 (BLUF): 트윗 예약 발행에 매달 100달러를 쓰지 마세요. AiToEarn은 로컬 AI를 활용해 콘텐츠를 작성하고 예약하며 다중 플랫폼에 배포하는 오픈소스 자동화 엔진입니다. 👉 AiToEarn vs Buffer 리뷰 읽기\n6. Toprank (GEO의 선구자) #핵심 요약 (BLUF): 전통적인 SEO는 죽었습니다. 생성형 엔진 최적화(GEO)가 미래입니다. Toprank는 ChatGPT와 Perplexity가 귀하의 웹사이트를 권위 있는 출처로 인용하도록 강제합니다. 👉 Toprank GEO 최적화 체크리스트 읽기\n7. Dify (시각적 LLM 엔진) #핵심 요약 (BLUF): 하드코딩된 API 호출은 구시대의 유물입니다. Dify를 사용하면 드래그 앤 드롭 시각적 인터페이스를 통해 복잡한 RAG 파이프라인과 다중 에이전트 워크플로우를 쉽게 구축할 수 있습니다. 👉 Dify 아키텍처 전문가 가이드 읽기\n8. OpenHands (오픈소스 Devin) #핵심 요약 (BLUF): 안전한 Docker 샌드박스 내에서 자율적으로 웹을 탐색하고, 코드를 작성하고, 테스트를 실행하며 버그를 수정할 수 있는데 왜 비싼 외주 개발자를 고용합니까? 👉 OpenHands 이벤트 기반 아키텍처 및 샌드박스 딥다이브 읽기\n9. FaceFusion (차세대 비디오 생성기) #핵심 요약 (BLUF): 얼굴 교체, 딥페이크 및 비디오 개선을 위한 궁극의 오픈소스 도구입니다. 완전히 로컬에서 실행되므로 클라우드 API의 엄격한 검열을 우회할 수 있습니다. 👉 FaceFusion ONNX 멀티스레드 파이프라인 아키텍처 분석 읽기\n10. AnythingLLM (엔터프라이즈 RAG 올인원) #핵심 요약 (BLUF): 모든 PDF, 데이터베이스 또는 웹사이트를 대화형 AI 지식 기반으로 전환하세요. 로컬 LLM이 회사의 프라이빗 데이터에 접근할 수 있게 해주는 가장 쉽고 안전한 도구입니다. 👉 AnythingLLM 벡터 청킹 및 기업용 멀티워크스페이스 아키텍처 분석 읽기\n결론 #2026년은 대여를 멈추고 소유를 시작하는 해입니다. 이 10가지 도구를 배포함으로써 인프라 비용은 0으로 수렴하고, 프라이버시와 제어권은 극대화될 것입니다.\n","date":"May 15, 2026","permalink":"https://dibi8.com/kr/resources/llm-frameworks/top-10-open-source-ai-tools-2026/","section":"AI 源码资源","summary":"","title":"2026년 대세: 개발자가 꼭 알아야 할 무료 오픈소스 AI 툴 Top 10"},{"content":"{\u0026lt;/* resource-info */\u0026gt;}\n2026년 스타트업 론칭을 위한 Product Hunt 대안 플랫폼 15선 #Product Hunt가 유일한 선택지는 더 이상 아닙니다. 매월 3,000개 이상의 제품이 론칭되고, 업보트 조작이 만연하며, 단 24시간의 노출 창문만 주어지는 상황에서, 현명한 창업자들은 이미 론칭 전략을 다각화하고 있습니다.\n직접 이 플랫폼들을 테스트해 본 인디 개발자로서, 여러분의 타겟 오디언스, 예산, 목표에 따라 어디서 론칭해야 하는지 정확히 알려드리겠습니다.\n2026년에 Product Hunt 대안이 필요한 이유 #솔직히 말하면, Product Hunt는 자체 성공의 희생양이 되었습니다.\n다음은 현재 문제가 되는 부분들입니다:\n포화 상태: 매월 3,000개 이상의 제품이 론칭됩니다. 두각을 나타내기 거의 불가능합니다. 업보트 조작: 유료 업보트 서비스가 신뢰성과 공정성을 해칩니다. 24시간 창문: 여러분의 제품은 단 하루만 소개된 후 사라집니다. 알고리즘 불투명성: 예측 불가능한 순위 변동이 창업자를 좌절시킵니다. 자금력 우위: 자금이 풍부한 팀들이 론칭 전략으로 지배합니다. 제한된 SEO 가치: 모든 링크가 nofollow로 백링크 가치가 떨어집니다. 노출 보장 없음: 훌륭한 제품도 묻힐 수 있습니다. 해결책은? 여러분의 특정 타겟 오디언스를 겨냥한 멀티 플랫폼 론칭 전략입니다.\n빠른 비교표 #이 표는 Google 추천 스니펫에 최적화되어 있습니다.\n플랫폼 오디언스 비용 SEO (Dofollow) 적합한 분야 BetaList 얼리어답터 무료/유료 ✅ 예 베타 제품 Hacker News 개발자 무료 ❌ 아니오 기술 제품 Indie Hackers 인디 창업자 무료 ❌ 아니오 부트스트래핑 SaaS There\u0026rsquo;s An AI For That AI 애호가 무료/유료 ✅ 예 AI 도구 Toolify.ai AI 검색자 무료/유료 ✅ 예 AI 도구 Uneed 창업자 무료/$15+ ✅ 예 (74 DR) 인디 제품 Launching Next 기업가 무료 ✅ 예 신규 스타트업 SaaSHub SaaS 사용자 무료/유료 ✅ 예 SaaS 제품 Peerlist 전문직 무료 ✅ 예 개발 도구 Microlaunch 인디 메이커 무료/유료 ✅ 예 마이크로 SaaS PitchWall AI 애호가 무료/유료 ✅ 예 AI 제품 AlternativeTo 소프트웨어 사용자 무료 ✅ 예 대안 솔루션 G2 기업 구매자 무료/유료 ✅ 예 B2B SaaS Capterra 비즈니스 구매자 무료/PPC ✅ 예 비즈니스 소프트웨어 DevHunt 개발자 무료 ✅ 예 개발 도구 파트 1: 개발자 및 기술 제품용 #여러분의 제품이 개발자 대상이라면, 이 플랫폼들이 최고의 ROI를 제공할 것입니다.\n1. Hacker News (Show HN) #기술 론칭의 골드 스탠다드.\n플랫폼 하이라이트:\n오디언스: 월간 1억 이상의 페이지뷰, 주로 개발자, 엔지니어, 기술 전문가 비용: 완전 무료 SEO 가치: Nofollow 링크, 하지만 막대한 레퍼럴 트래픽 론칭 방식: \u0026ldquo;Show HN: [제품명]\u0026rdquo; 형태로 링크와 설명 게시 왜 효과적인가: Hacker News는 실리콘밸리에서 가장 영향력 있는 사람들이 모이는 곳입니다. 성공적인 Show HN 게시물은 하루에 10,000명 이상의 방문자를 유도할 수 있습니다. 커뮤니티는 솔직하지만 매우 활발합니다.\n유명 론칭 사례:\nSupabase: Product Hunt 전에 HN에서 론칭, 개발자 신뢰 확보 Railway: Show HN 게시물로 초기 트랙션 확보 Cal.com: 오픈소스 일정 관리 도구가 HN을 통해 성장 론칭 전략:\n동부 시간 기준 화~목요일 오전 9-11시에 게시 제목에 매력적인 한 줄 요약 포함 첫 시간 내에 모든 댓글에 응답 비판에 대해 방어적이지 않기 적합한 분야: 개발자 도구, API, 오픈소스 프로젝트, 기술 제품\n2. DevHunt #개발자를 위한 Product Hunt.\n플랫폼 하이라이트:\n오디언스: 개발자, 오픈소스 기여자, 기술 구매자 비용: 무료 SEO 가치: Dofollow 링크 (검증됨) 론칭 방식: 제품 제출 → 커뮤니티 투표 → 홈페이지 노출 왜 효과적인가: DevHunt는 개발자 도구 전용으로 만들어졌습니다. Product Hunt에서 소비자 앱과 개발 도구가 경쟁하는 것과 달리, DevHunt의 오디언스는 100% 개발자입니다. 이는 더 높은 전환율과 더 관련성 높은 피드백을 의미합니다.\n플랫폼 기능:\n매일 선정되는 추천 제품 카테고리별 브라우징 커뮤니티 투표 시스템 개발자 중심 토론 적합한 분야: 개발 도구, API, CLI, 오픈소스 프로젝트, 개발자 서비스\n3. Peerlist #전문 프로필과 제품 론칭의 결합.\n플랫폼 하이라이트:\n오디언스: 전문직, 개발자, 디자이너, 프로덕트 매니저 비용: 무료 SEO 가치: Dofollow 링크 (검증됨) 론칭 방식: 전문 프로필 생성 → 제품 쇼케이스 → 커뮤니티 참여 왜 효과적인가: Peerlist는 전문 네트워킹과 제품 디스커버리를 결합합니다. 여러분의 제품 론칭은 전문적 정체성과 연결되어 신뢰와 credibility를 구축합니다. B2B 및 전문 도구에 적합합니다.\n적합한 분야: 개발자 도구, 디자인 도구, 전문 서비스, B2B 제품\n파트 2: SaaS 창업자 및 스타트업용 #SaaS 제품을 론칭하시나요? 이 플랫폼들은 여러분을 위해 설계되었습니다.\n4. BetaList #최초의 스타트업 디스커버리 플랫폼.\n플랫폼 하이라이트:\n오디언스: 월간 50만 이상의 얼리어답터 및 스타트업 애호가 비용: 무료 제출; 부스팅 리스팅 가능 (유료) SEO 가치: Dofollow 백링크 (검증됨) 론칭 방식: 스타트업 제출 → 리뷰 프로세스 → 홈페이지 노출 왜 효과적인가: BetaList는 2012년부터 운영되어 왔으며, 새로운 제품을 적극적으로 찾는 얼리어답터 충성층을 보유하고 있습니다. 리뷰 프로세스가 품질을 보장하여 사용자 신뢰를 구축합니다.\n플랫폼 기능:\n구독자를 위한 뉴스레터 인기 제품 트렌딩 섹션 카테고리별 브라우징 유료 부스팅으로 노출 보장 론칭 전략:\n공식 론칭 2-4주 전에 제출 매력적인 태그라인과 스크린샷 사용 BetaList 사용자에게 독점 얼리 액세스 제공 \u0026ldquo;론칭했습니다\u0026rdquo; 업데이트 후속 조치 적합한 분야: 프리론칭 제품, 베타 단계 스타트업, SaaS 도구\n5. Uneed #인디 메이커를 위한 노출 보장.\n플랫폼 하이라이트:\n오디언스: 월간 9만 이상의 방문자, 1.7만 뉴스레터 구독자 (40% 오픈율) 비용: 무료 론칭; 줄 서기 건너뛰기 $29.99; 재론칭 $15 SEO 가치: Dofollow 링크 (74 DR 백링크 - 검증됨) 론칭 방식: 줄 서기 → 홈페이지 노출 → 커뮤니티 투표 왜 효과적인가: Uneed는 여러분의 제품이 홈페이지에 노출되도록 보장합니다. Product Hunt의 알고리즘과 달리, Uneed의 대기열 시스템은 모든 제품이 가시성을 확보하도록 합니다. 74 DR 백링크는 SEO에도 매우 우수합니다.\n플랫폼 기능:\n커뮤니티 내 64,000명 이상의 메이커 2026년 37.4만 방문 Pro 플랜: $89/년 (무제한 게시, 업보트, 재론칭) 40% 오픈율의 뉴스레터 적합한 분야: 인디 제품, 마이크로 SaaS, 솔로 창업자, 부트스트래핑 스타트업\n6. Launching Next #간단하고 효과적인 스타트업 노출.\n플랫폼 하이라이트:\n오디언스: 스타트업 창업자, 기업가, 투자자 비용: 무료 제출 SEO 가치: Dofollow 백링크 (검증됨) 론칭 방식: 스타트업 제출 → 리뷰 → 주간 뉴스레터와 함께 노출 왜 효과적인가: Launching Next는 45,669개 이상의 스타트업을 소개했으며, 5,000명 이상의 창업자에게 주간 뉴스레터를 발송합니다. 불필요한 장식 없이 여러분의 제품을 적합한 사람들에게 보여주는 플랫폼입니다.\n적합한 분야: 신규 스타트업, 초기 단계 제품, 창업자 도구\n7. SaaSHub #SaaS 대안 디렉토리.\n플랫폼 하이라이트:\n오디언스: SaaS 사용자, 대안을 찾는 기업 비용: 무료 리스팅; 추천 옵션 가능 SEO 가치: Dofollow 백링크 (검증됨) 론칭 방식: 제품 제출 → 대안 목록에 표시 → 일일 토너먼트 왜 효과적인가: SaaSHub는 \u0026ldquo;대안\u0026rdquo; 개념을 중심으로 구축되었다는 점에서 독특합니다. 사용자가 \u0026ldquo;[경쟁사] 대안\u0026quot;을 검색할 때 여러분의 제품이 나타날 수 있습니다. 이를 통해 전환할 준비가 된 고의도 트래픽을 확보할 수 있습니다.\n플랫폼 기능:\n222,000개 이상의 제품 등록 대안 비교 엔진 Q\u0026amp;A 섹션 가시성을 위한 일일 토너먼트 적합한 분야: 기존 도구와 경쟁하는 SaaS 제품, 대안 솔루션\n파트 3: 인디 해커 및 부트스트래퍼용 #혼자서 빌드하고 계신가요? 이 플랫폼들은 인디 해커의 마이드셋을 이해합니다.\n8. Indie Hackers #부트스트래핑을 이해하는 커뮤니티.\n플랫폼 하이라이트:\n오디언스: 인디 해커, 솔로 창업자, 부트스트래퍼 (Stripe 소유) 비용: 무료 SEO 가치: Nofollow 링크, 하지만 막대한 커뮤니티 참여도 론칭 방식: \u0026ldquo;Show IH:\u0026rdquo; 접두사로 게시물 작성 → 커뮤니티 토론 왜 효과적인가: Indie Hackers는 단순한 론칭 플랫폼이 아닌 커뮤니티입니다. 수익, 도전 과제, 성장 전략에 대한 투명성은 인디 창업자에게 매우 가치 있습니다. 솔직한 피드백과 잠재 고객을 얻을 수 있습니다.\n유명 론칭 사례:\nNotion: Indie Hackers 커뮤니티를 통해 초기 관심 확보 Zapier: IH 토론을 통해 초기 사용자 기반 구축 Carrd: 솔로 창업자가 IH를 통해 성장 모멘텀 확보 론칭 전략:\n제품뿐만 아니라 여러분의 스토리를 공유하세요 지표와 도전 과제에 대해 투명하게 공개 론칭 전후 커뮤니티에 적극 참여 론칭 시 \u0026ldquo;Show IH:\u0026rdquo; 접두사 사용 적합한 분야: 부트스트래핑 SaaS, 인디 제품, 솔로 창업자, 수익 투명 프로젝트\n9. Microlaunch #마이크로 SaaS 및 소규모 프로젝트를 위해 만들어짐.\n플랫폼 하이라이트:\n오디언스: 인디 메이커, 마이크로 SaaS 창업자, 소규모 프로젝트 제작자 비용: 무료 론칭; 유료 부스트 옵션 SEO 가치: Dofollow 링크 (검증됨) 론칭 방식: 프로젝트 제출 → 커뮤니티 투표 → 투표 기반 노출 왜 효과적인가: Microlaunch는 Product Hunt의 \u0026ldquo;대규모 론칭\u0026rdquo; 문화에 맞지 않는 소규모 프로젝트를 위해 설계되었습니다. 사이드 프로젝트, 마이크로 SaaS, 특정 문제를 해결하는 인디 도구에 완벽합니다.\n적합한 분야: 마이크로 SaaS, 사이드 프로젝트, 인디 도구, 소규모 유틸리티\n파트 4: AI 제품용 #AI 도구를 론칭하시나요? 이 플랫폼들은 여러분을 위해 특별히 만들어졌습니다.\n10. There\u0026rsquo;s An AI For That #최대 AI 도구 디렉토리.\n플랫폼 하이라이트:\n오디언스: AI 도구를 찾는 월간 500만 이상의 방문자 비용: 무료 기본 리스팅; 유료 추천/론칭 옵션 SEO 가치: Dofollow 백링크 (검증됨) 론칭 방식: AI 도구 제출 → 디렉토리에 표시 → 선택적 추천 배치 왜 효과적인가: 49,000개 이상의 AI 도구와 월간 500만 이상의 방문자를 보유한 이 플랫폼은 AI 디스커버리의 최적 장소입니다. 사용자들이 AI 솔루션을 적극적으로 검색하므로 높은 전환율을 기대할 수 있습니다.\n플랫폼 기능:\n작업 기반 검색 (사용자가 원하는 작업으로 검색) 리스팅에 표시되는 202,000 이상의 방문수 AI 관련 키워드의 막대한 트래픽 강력한 SEO 존재감 적합한 분야: AI 기반 제품, 머신러닝 도구, AI 서비스, GPT 래퍼\n11. Toolify.ai #매일 업데이트되는 AI 도구 디렉토리.\n플랫폼 하이라이트:\n오디언스: AI 도구 검색자, 기업, 개발자 비용: 무료 리스팅; 유료 프로모션 가능 SEO 가치: Dofollow 백링크 (검증됨) 론칭 방식: 도구 제출 → 459개 카테고리에 표시 → 매일 업데이트 왜 효과적인가: Toolify.ai는 ChatGPT가 매일 업데이트하여 신선한 콘텐츠를 보장합니다. 459개 카테고리로 사용자가 원하는 것을 쉽게 찾을 수 있습니다. AI 관련 키워드에서 강력한 SEO 존재감을 보유합니다.\n적합한 분야: AI 도구, SaaS 제품, 머신러닝 서비스\n12. PitchWall #AI 중심의 제품 디스커버리.\n플랫폼 하이라이트:\n오디언스: AI 제품 애호가, 얼리어답터, 기술 전문가 비용: 무료 리스팅; 스폰서 배치 가능 SEO 가치: Dofollow 링크 (검증됨) 론칭 방식: 제품 제출 → 매일 추천 제품 → 커뮤니티 투표 왜 효과적인가: PitchWall (구 BetaPage)은 AI 및 테크 제품에 집중합니다. 큐레이션 방식이 품질을 보장하며, 매일 추천되는 제품은 상당한 가시성을 확보합니다.\n적합한 분야: AI 제품, 테크 도구, 혁신 솔루션\n파트 5: B2B 및 기업용 #비즈니스 구매자를 타겟팅하시나요? 이 플랫폼들은 기업에서 신뢰합니다.\n13. G2 #비즈니스 소프트웨어의 Yelp.\n플랫폼 하이라이트:\n오디언스: 비즈니스 소프트웨어 구매자, 기업 사용자, IT 의사결정권자 비용: 무료 리스팅; 프로필 강화 유료 옵션 SEO 가치: Dofollow 링크 (93 DR - 검증됨) 론칭 방식: 프로필 생성 → 리뷰 수집 → Grid 리포트에 표시 왜 효과적인가: G2는 B2B 소프트웨어 리뷰에서 가장 신뢰받는 플랫폼입니다. Grid 리포트는 기업이 구매 결정을 내리는 데 사용됩니다. 강력한 G2 존재감은 상당한 기업 매출을 이끌어낼 수 있습니다.\n플랫폼 기능:\n검증된 사용자 리뷰 카테고리 순위 Grid 리포트 비교 도구 기업 구매자 신뢰 적합한 분야: B2B SaaS, 기업 소프트웨어, 비즈니스 도구, 전문 서비스\n14. Capterra #비즈니스 구매자를 위한 소프트웨어 리뷰.\n플랫폼 하이라이트:\n오디언스: 비즈니스 소프트웨어 구매자, 중소기업, 기업 사용자 비용: 무료 리스팅; 클릭당 과금 광고 SEO 가치: Dofollow 링크 (91 DR - 검증됨) 론칭 방식: 프로필 생성 → 리뷰 수집 → 카테고리 순위에 표시 왜 효과적인가: Capterra는 Gartner가 소유하고 있으며 B2B 분야에서 막대한 권위를 보유하고 있습니다. 클릭당 과금 모델은 실제 리드에 대해서만 비용을 지불하므로 비용 효율적입니다.\n적합한 분야: B2B 소프트웨어, 비즈니스 도구, 기업 솔루션, 전문 서비스\n파트 6: 멀티 플랫폼 론칭 전략 #하나의 플랫폼만 선택하지 마세요—전략적으로 모든 곳에서 론칭하세요.\n3단계 론칭 프레임워크 #1단계: 프리론칭 (2-4주 전)\nBetaList에 제출하여 초기 피드백 확보 G2 및 Capterra에 프로필 생성 Indie Hackers에서 기대감 조성 2단계: 론칭 당일\n동부 시간 오전 9시에 Hacker News (Show HN)에 게시 태평양 시간 오전 12:01에 Product Hunt에 제출 Uneed 및 Launching Next에서 론칭 Indie Hackers에서 \u0026ldquo;Show IH:\u0026rdquo; 접두사로 공유 3단계: 포스트 론칭 (1-4주 후)\nAI 디렉토리에 제출 (해당되는 경우) SaaSHub 및 AlternativeTo에 대안 페이지 생성 G2 및 Capterra에서 리뷰 수집 Reddit 및 Twitter에서 커뮤니티 참여 플랫폼별 최적 타이밍 # 플랫폼 최적 요일 최적 시간 (동부) 이유 Product Hunt 화요일 태평양 시간 12:01 AM 알고리즘 리셋 Hacker News 화-목 오전 9-11시 미국 트래픽 피크 Indie Hackers 수-목 오전 8-10시 커뮤니티 활발 BetaList 매일 2-4주 전 제출 리뷰 소요 시간 Uneed 매일 대기열 시스템 노출 보장 파트 7: 매력적인 론칭 게시물 작성법 #여러분의 론칭 게시물이 첫인상입니다. 효과적으로 만드는 방법을 알아보세요.\n완벽한 론칭 게시물 구조 #1. 헤드라인 (H1)\n명확하고 간결하며 가치 중심적 예시: \u0026ldquo;Supabase: 오픈소스 Firebase 대안\u0026rdquo; 2. 한 줄 요약\n제품이 한 문장으로 무엇을 하나요? 예시: \u0026ldquo;주말에 빌드하고, 수백만까지 확장\u0026rdquo; 3. 문제 진술\n제품이 어떤 고충을 해결하나요? 구체적이고 공감할 수 있게 4. 솔루션\n제품이 문제를 어떻게 해결하나요? 고유한 차별점에 집중 5. 사회적 증거\n사용자 수, 수익, 추천사 \u0026ldquo;10,000명 이상의 개발자가 신뢰\u0026rdquo; 6. 행동 유도 (CTA)\n사용자에게 무엇을 원하시나요? \u0026ldquo;무료 체험\u0026rdquo; 또는 \u0026ldquo;베타 참여\u0026rdquo; 피해야 할 일반적인 실수 # ❌ 전문 용어 남용 ❌ 기능이 아닌 이점에 집중하지 않음 ❌ 명확한 CTA 없음 ❌ 댓글과 피드백 무시 ❌ 조율 없이 여러 플랫폼에서 동시 론칭 파트 8: 론칭 플랫폼을 위한 SEO 전략 #론칭의 SEO 가치를 극대화하세요.\nDofollow vs. Nofollow 링크 #Dofollow 플랫폼 (SEO에 가장 유리):\nUneed (74 DR) There\u0026rsquo;s An AI For That Toolify.ai BetaList Launching Next SaaSHub AlternativeTo G2 (93 DR) Capterra (91 DR) Nofollow 플랫폼 (브랜드 인지도 전용):\nHacker News Indie Hackers Product Hunt 링크 빌딩 전략 # 모든 Dofollow 플랫폼에서 프로필 클레임 타겟 키워드로 리스팅 최적화 G2 및 Capterra에서 리뷰 수집 SaaSHub 및 AlternativeTo에 대안 페이지 생성 블로그에서 론칭 게시물로 내부 링크 구축 파트 9: FAQ - Product Hunt 대안 #2026년에도 Product Hunt가 여전히 가치 있나요? #네, 하지만 그것에만 의존하지 마세요. Product Hunt는 여전히 상당한 트래픽과 신뢰성을 제공합니다. 그러나 플랫폼이 포화 상태이므로 최대 도달 범위를 위해 멀티 플랫폼 전략이 필수입니다.\nSaaS를 무료로 론칭할 수 있는 최적의 장소는? #최고의 무료 플랫폼:\nHacker News (Show HN) - 개발자 도구에 최적 Indie Hackers - 부트스트래핑 SaaS에 최적 BetaList - 초기 단계 제품에 최적 Launching Next - 신규 스타트업에 최적 Uneed - 노출 보장에 최적 (무료 티어 available) Product Hunt에서 어떻게 추천받을 수 있나요? #핵심 전략:\n태평양 시간 화요일 오전 12:01에 론칭 론칭 전 헌터 네트워크 구축 매력적인 비주얼과 영상 제작 모든 댓글과 소통 업보트 구매 금지 (도움보다 해가 됨) AI 도구에 가장 좋은 플랫폼은? #AI 제품의 경우 우선순위:\nThere\u0026rsquo;s An AI For That (월간 500만 이상 방문자) Toolify.ai (29,000개 이상의 AI 도구) PitchWall (AI 중심 커뮤니티) Product Hunt (AI 론칭에 여전히 중요) 몇 개의 플랫폼에서 론칭해야 하나요? #권장: 론칭당 5-8개 플랫폼.\n2-3개 주요 플랫폼 (Product Hunt, Hacker News, Indie Hackers) 2-3개 보조 플랫폼 (BetaList, Uneed, Launching Next) 2-3개 니치 플랫폼 (DevHunt, There\u0026rsquo;s An AI For That 등) 결론: 론칭 전략을 다각화하세요 #Product Hunt만으로는 더 이상 충분하지 않습니다. 2026년 가장 현명한 창업자들은 여러 플랫폼에서 론칭하여 도달 범위, SEO 가치, 사용자 획득을 극대화하고 있습니다.\n여러분의 액션 플랜:\n오디언스 파악 (개발자, 창업자, 인디 해커) 이 목록에서 5-8개 플랫폼 선택 각 플랫폼에 매력적인 론칭 게시물 작성 전략적으로 론칭 타이밍 조율 론칭 전후 커뮤니티에 적극 참여 결과를 추적하고 전략 최적화 기억하세요: 성공적인 론칭은 시작에 불과합니다. 진짜 일은 첫 번째 사용자를 확보한 후에 시작됩니다.\n관련 리소스 # AI 도구 디렉토리 2024: 완벽 가이드 2026년 성공적인 SaaS 만드는 법 인디 해커 툴킷: 필수 리소스 스타트업을 위한 SEO: 완벽 가이드 최종 업데이트: 2026년 5월\n이 가이드는 최신 플랫폼과 전략을 반영하여 정기적으로 업데이트됩니다. 이 페이지를 북마크하고 자주 확인하여 새로운 내용을 확인하세요.\n","date":"May 15, 2026","permalink":"https://dibi8.com/kr/resources/ai-tools/product-hunt-alternatives/","section":"AI 源码资源","summary":"","title":"2026년 스타트업 론칭을 위한 Product Hunt 대안 플랫폼 15선"},{"content":"{\u0026lt;/* resource-info */\u0026gt;}\nAI 코딩 어시스턴트 혁명은 개발자들에게 역설적인 딜레마를 안겨주었습니다. Claude Code, OpenAI Codex, Cursor, GitHub Copilot과 같은 도구를 통해 세계적 수준의 언어 모델에前所未有的 접근 권한을 얻었지만, 여러 플랫폼에서 구독, 할당량, 속도 제한을 관리하는 것이 점점 더 비싸고 짜증나는 일이 되었습니다. 많은 개발자들이 Claude Pro 월간 할당량을 2주 만에 소진한 뒤, 스프린트 마감일에 직면하여 속도 제한 벽과 마주하는 경험을 합니다.\n9Router가 이 문제를 완전히 해결합니다 — 토큰 관리 시스템이자 오픈소스 스마트 프록시입니다. 6,900개 이상의 GitHub 스타, 1,200개 이상의 포크와 빠른 커뮤니티 성장을 자랑하는 9Router는 프리미엄 티어에 불필요하게 많은 비용을 지출하지 않고maximum AI 능력을 원하는 개발자들의 필수 솔루션이 되었습니다. Node.js 20+, Next.js 16, React 19 기반으로 구축되어, 지능형 폴백 로직과 강력한 토큰 절약 압축으로 40개 이상의 공급자에 AI 코딩 요청을 라우팅할 수 있는 통합 인터페이스를 제공합니다.\n9Router란 무엇이며 어떻게 작동하나요? #9Router는 로컬 호스트 서비스(기본적으로 localhost:20128에서 실행)로, AI 코딩 도구와 백엔드 모델 공급자 사이에 중간 계층으로 동작합니다. 클라우드 코드나 Claude, OpenAI 등 단일 공급자에게 직접 API 요청을 보내는 대신, 모든 요청은 9Router를 통과합니다 — 그러면 9Router가 어느 백엔드 공급자로 요청을 보낼지 지능적으로 결정합니다.\n이 아키텍처는 세 가지 주요 장점을 제공합니다:\n한 곳에서 다중 공급자 접근: 대시보드 하나에 Claude, Gemini, GLM, MiniMax, Kiro, OpenCode, Vertex AI 및 40개 이상의 기타 공급자를 구성하세요. CLI 도구는 localhost로 요청을 보내고, 9Router가 나머지를 처리합니다. 자동 폴백: 주요 공급자가 할당량 한계에 도달하거나 다운되면, 9Router는 두 번째 레이어로 즉시 전환합니다 — 싸운 백업 공급자든 완전 무료 옵션이든. 워크플로우 중단 없이 연속 작업 가능합니다. 머신 외부 전송 전 토큰 압축: RTK (~40K 스타)와 통합된 9Router는 도구 출력(git diff, grep 결과, 디렉토리 목록, 로그 덤프 등)이 LLM에 도달하기 전에 자동으로 압축합니다. 이것만으로도 요청당 입력 토큰을 20-40% 절약할 수 있습니다. 9Router를 차별화하는 핵심 기능 #🚀 RTK 토큰 압축 엔진 #도구 출력은 전체 프롬프트 예산의 30-50%를 차지하기도 합니다. Claude Code가 대규모 코드베이스에서 git diff, ls -R, grep을 실행하면 수백만 바이트의 텍스트가 모델로 전송됩니다 — 그중 대부분이 관련 없는 노이즈일 뿐입니다.\n9Router의 내장 RTK 기능은 이러한 도구 출력을 자동으로 감지하고 스마트한 무손실 압축 필터를 적용합니다:\ngit-diff: diff 출력을 변경된 필수 줄로 축소 git-status: 상태 정보를 요약 형식으로 압축 grep / find: 관련 없는 매atches 제거, 컨텍스트 풍부한 행만 유지 tree / ls: 디렉토리 구조를 의미 있게 정리 dedup-log: 반복되는 연속 로그 항목 제거 smart-truncate: 첫 부분과 마지막 부분은 보존하면서 중복 중간 내용 제거 중요한 점은 필터 중 하나가 실패하거나 원본보다 나쁜 출력을 생성하면 RTK가 자동으로 수정되지 않은 텍스트로 돌아가며, 오류가 절대 요청을 망가뜨리지 않습니다. 압축은 모든 형식 변환 전에 실행되므로 OpenAI, Claude, Gemini, Cursor, Kiro, OpenAI Responses 등 모든 지원 형식에서 작동합니다.\nRTK 미사용: LLM에게 47K 토큰 전송 RTK 사용: LLM에게 28K 토큰 전송 (40% 절약 · 동일한 답변 품질) 실제로 많은 개발자가 매 요청마다 20-40%의 토큰 절약을 보고하며 — 이것은 모든 구독의 수명을 며칠 또는几周 연장시키는 효과를 가져옵니다.\n🪨 케뱅 모드 (출력 압축) #입력 최적화 외에도 9Router는 LLM이 반환하는 내용량도 줄입니다. Caveman (~52K 스타)에서 영감을 받은 \u0026ldquo;케뱅 스타일\u0026rdquo; 시스템 프롬프트를 주입하여 9Router가 모델을 간결하게 응답하도록 지시합니다 — 모든 기술적 내용을 보존하면서도 대화형 플러시를 제거합니다.\n이를 통해 최대 65%의 출력 토큰을 절약할 수 있습니다. 복잡한 리팩토링 작업이나 긴 코드 생성 세션에서는 이러한 절감이 수백 번의 API 호출 동안 급격히 누적됩니다.\n🎯 스마트 3단계 폴백 시스템 #이것이 바로 9Router의 가장 큰 강점입니다. 다른 가격 레이어에 걸친 정렬된 모델 목록인 \u0026ldquo;콤보\u0026quot;를 정의하면, 9Router는 자동으로 해당 요청을 라우팅합니다:\n콤보: \u0026#34;my-coding-stack\u0026#34; 1. cc/claude-opus-4-6 → Claude Code Pro 구독 2. glm/glm-4.7 → 저가 백업 ($0.6 per 1M 토큰) 3. kr/claude-sonnet-4.5 → Kiro AI 무료 긴급 폴백 Opus 할당량이 고갈되면(또는 에러 발생 시), 9Router는 즉시 GLM으로 전환합니다. GLM도 고갈되면 Kiro의 무료 무제한 레벨로 내려갑니다. 벽에 부딪히는 일이 없습니다.\n시스템은 다섯 가지 다른 가격 레이어를 지원합니다:\n레벨 공급자 typical 비용 재설정 패턴 구독 Claude Code, Codex, Copilot, Cursor $10-$200/월 5시간 롤링 + 주간/월간 저가 GLM-5.1, MiniMax M2.7, Kimi K2.5 $0.2-$0.6/M 토큰 일일/롤링/고정 월간 무료 Kiro AI, OpenCode Free, Vertex AI $0 무제한 📊 실시간 할당량 추적 및 분석 #웹 대시보는 각 공급자에 대한 실시간 토큰 소비량, 재설정 카운트다운(5시간, 일일, 주간, 월간) 및 추정 비용 트래킹을 표시합니다. 대시보드가 \u0026ldquo;비용\u0026quot;을 참조 비교 도구로 표시하지만 — 9Router 자체는 무료 소프트웨어이며 결코 요금을 청구하지 않습니다 — 이러한 분석은 사용 패턴을 이해하고 지출을 최적화하는 데 도움이 됩니다.\nKiro 무료 레벨 사용 중에 대시보드가 \u0026ldquo;$290 총 비용\u0026quot;을 표시한다면, 이 $290은 해당 API를 직접 사용했을 경우 지불했어야 하는 금액을 나타냅니다. 실제 결제 금액은 여전히 $0입니다. 이것은 당신이 얼마나 많은 돈을 절약하고 있는지 보여주는 savings tracker입니다.\n🔄 모든 주요 프로토콜 간 형식 번역 #9Router는 OpenAI, Claude, Gemini, Cursor, Kiro, Vertex AI, Antigravity, Ollama, OpenAI Responses 형식 간에 투명하게 번역합니다. CLI 도구는 표준 OpenAI 호환 페이로드를 보내고, 9Router는 각 공급자가 기대하는 네이티브 형식으로 번역합니다. 따라서 사용자 지정 OpenAI 엔드포인트를 지원하는 모든 도구를 사용할 수 있으며 어떤 백엔드 공급자에도 연결할 수 있습니다.\n👥 다중 계정 지원 #로드 밸런싱이나 계정의 중복성이 필요한가요? 9Router는 각 공급자에 대해 여러 계정을 추가할 수 있으며, 자동 round-robin 분배 또는 우선순위 기반 라우팅을 지원합니다. 하나의 계정이 할당량에 도달하면 요청이 다음 사용 가능한 계정으로 자동으로 전환됩니다. OAuth 토큰은 자동으로 새로 고쳐져 수동 재인증 주기를 없앱니다.\n💾 클라우드 동기화 #암호화된 클라우드 저장소를 통해 전체 구성 — 공급자, 콤보, 별칭, 설정 — 을 장치 간에 동기화합니다. 로컬 기계에서 완벽한 콤보를 설정한 후 VPS, Docker 배포 또는 동료의 작업대에서 동일한 구성에 접근하세요.\n지원되는 코딩 도구 및 IDE #9Router는 범용 어댑터로서 거의 모든 인기 AI 코딩 도구를 지원합니다:\nClaude Code (~/.claude/config.json에 사용자 정의 API 기본 주소 사용) OpenAI Codex CLI (환경 변수 오버라이드) Cursor IDE (사용자 정의 OpenAI 엔드포인트 설정) GitHub Copilot OpenClaw (WhatsApp, Telegram, Slack 메시징) Cline Continue Roo Code Antigravity Droid Kilo Code OpenCode 사용자 정의 OpenAI 호환 API 엔드포인트를 지원하는 모든 도구는 9Router에 연결할 수 있습니다. 서비스는 http://localhost:20128/v1에서 표준 OpenAI 호환 인터페이스를 노출합니다.\n시작하기: 설치 및 설정 #빠른 시작: 로컬호스트 (대부분의 사용자에게 권장) ## 클론 및 설치 git clone https://github.com/decolua/9router.git cd 9router npm install npm run build # 선택적 환경 설정 export JWT_SECRET=\u0026#34;your-secure-secret-change-this\u0026#34; export INITIAL_PASSWORD=\u0026#34;your-dashboard-password\u0026#34; export PORT=\u0026#34;20128\u0026#34; export NODE_ENV=\u0026#34;production\u0026#34; # 서버 시작 npm run start 시작 후 http://localhost:20128을 열어 웹 대시보드에 액세스합니다. 여기서 첫 번째 공급자를 연결합니다.\nDocker 배포 #프로덕션 또는 다중 장치 설정의 경우 Docker가 설치를 간단하게 만듭니다:\ndocker build -t 9router . docker run -d \\ --name 9router \\ -p 20128:20128 \\ --env-file ./.env \\ -v 9router-data:/app/data \\ -v 9router-usage:/root/.9router \\ 9router 첫 번째 공급자 연결 #결제 수단 없이 완전한 무료 레벨 조합을 설정해 봅시다:\n대시보드에서 Kiro AI 연결 (AWS Builder ID, Google 또는 GitHub OAuth 사용 — API 키 필요 없음) OpenCode Free 연결 (제로 인증, 패스루프 프록시, 모델 자동 검색) free-dev라는 콤보 생성 포함 모델: kr/claude-sonnet-4.5 (Kiro를 통한 Claude Sonnet 4.5 — 무료 무제한) kr/glm-5 (Kiro를 통한 GLM-5 — 무료 무제한) vertex/gemini-3.1-pro-preview (Google Cloud — $300 무료 크레딧) 그런 다음 선호하는 도구를 http://localhost:20128/v1로 향하도록 구성하고 대시보드 API 키를 사용합니다:\n{ \u0026#34;anthropic_api_base\u0026#34;: \u0026#34;http://localhost:20128/v1\u0026#34;, \u0026#34;anthropic_api_key\u0026#34;: \u0026#34;your-9router-api-key\u0026#34; } Cursor IDE 구성 #Cursor 설정 → 모델 → 고급에서:\nOpenAI API 기본 주소: http://localhost:20128/v1 OpenAI API 키: [9Router 대시보드에서 복사] 모델: cc/claude-opus-4-7 이제 Cursor의 모든 모델 호출이 9Router의 라우팅 인텔리전스를 통해 흐릅니다.\n실제 사례 #시나리오 A: 기존 구독 극대화 #Claude Pro 월 $20을 지불합니다. 9Router 없이 할당량이 고갈되면 코딩이 재설정 때까지 중단됩니다.\n9Router의 \u0026ldquo;maximize-claude\u0026rdquo; 콤보 사용:\n기본: cc/claude-opus-4-7 (구독 활용) 백업: glm/glm-5.1 ($0.6/M 토큰, 매일 오전 10시 재설정) 비상: kr/claude-sonnet-4.5 (Kiro 무료 폴백) 결과: RTK가 20-40% 토큰을 절약하므로 $20 구독이 더 오래 지속되며, 만료되면 원활한 백업이 있습니다. 저가 레벨의 총 효과 비용은 약 $5만 증가합니다 — Claude Max($200/월) 업그레이드 훨씬 저렴합니다.\n시나리오 B: 완전 제로 예산 #100% 무료 모델로 시작:\ngc/gemini-3-flash (Google 월 180K 무료 쿼리) kr/claude-sonnet-4.5 (Kiro 무료 무제한) oc/\u0026lt;auto\u0026gt; (OpenCode Free, 인증 불필요) RTK 압축과 결합하여 이 설정은 실제로 월 비용 $0로 프로덕션급 모델 응답을 제공합니다.\n시나리오 C: 24/7 중단 없는 개발 #마감일에 일하는 팀과 프리랜서를 위해 다섯 가지 폴백 레이어 구성:\nClaude Opus (프리미엄 품질) GPT-5.5 via Codex (두 번째 구독) GLM-5.1 (저렴한 일일 재설정) MiniMax M2.7 (가장 저렴 $0.2/M 토큰, 5시간 롤링 재설정) Kiro Claude Sonnet 4.5 (무료 무제한) 다섯 층이 할당량 고갈이나 공급자 장애에 관계없이 중단 없는 보장을 제공합니다.\n가격 투명성: 실제로 얼마나 들까요? #9Router를 평가할 때 핵심 질문: 9Router가 요금을 청구합니까? 아니오. 영원히 아닙니다.\n경제적運作 방식은 다음과 같습니다:\n9Router 소프트웨어 = 평생 무료 (MIT 오픈소스 라이선스, 자체 호스팅) 대시보드 비용 = 표시/추적 전용 (실제 청구서가 아님) 공급자에게 직접 지불 (구독, API 키, 구성한 것) 무료 공급자는 무료 유지 (Kiro AI, OpenCode Free, Vertex AI 크레딧) 9Router는 귀하의 컴퓨터에서 실행되는 순수 로컬 프록시 라우터입니다. 신용카드에 접근할 수 없으며, 송장을 생성할 수 없고, 청구 인프라도 없습니다. 요청을 전달하고 선택적으로 토큰을 압축할 뿐입니다.\n대시보드의 비용 표시는 \u0026ldquo;절약 tracker\u0026rdquo; 역할을 합니다 — 유료 API를 직접 사용한 경우와 비교하여 얼마나 절약하는지 보여줍니다. 모든 무료 공급자를 구성하면 표시된 비용이 \u0026ldquo;$290\u0026quot;이라도 실제 은행 거래는 $0입니다. 이 $290은 귀하가 적극적으로 절약하는 돈입니다.\n9Router vs 타 솔루션 비교 #9Router는 기존 솔루션과 어떻게 비교될까요?\n기능 9Router 직접 공급자 접근 기타 프록시 도구 스마트 폴백 라우팅 ✅ 자동 3+ 레이어 ❌ 단일 공급자 일부 토큰 압축 (RTK) ✅ 내장 ❌ 없음 드문 경우 다중 형식 번역 ✅ 8+ 프로토콜 N/A 제한적 다중 계정 회전 ✅ Round-robin ❌ 수동 수동 무료 공급자 지원 ✅ Kiro, OpenCode, Vertex ❌ 해당 없음 보통 없음 실시간 분석 ✅ 대시보드 + 로그 ❌ 공급자 포털 기초 자체 호스팅 ✅ 완전 제어 N/A 다양 비용 무료 소프트웨어 + 공급자 비용 완전 공급자 가격 종종 유료 주의해야 할 주요 대안은 **OmniRoute**로, 9Router의 TypeScript 포크입니다. 36+ 공급자, 4단계 자동 폴백, 멀티모달 API(이미지, 임베딩, 오디오, TTS), 서킷 브레이커 패턴, 시맨틱 캐싱, LLM 평가 하니스 등을 추가하며 368개 이상의 유닛 테스트가 포함된 정교한 대시보드를 갖추고 있습니다. OmniRoute는 npm 및 Docker를 통해 이용 가능하여 핵심 9Router 기능 집합을 넘어선 확장 기능을 원하는 사용자에게 적합합니다.\n왜 지금 9Router가 중요한가 #우리는 AI 코딩 도구의 황금기에 살고 있지만, 경제적 현실은 아직 따라오지 못하고 있습니다. 각 주요 공급자는 독립적으로 유료 월벽, 할당량 제한, 속도 캡 뒤에 접근을 제한합니다. Claude, OpenAI, Google, Anthropic, DeepSeek, xAI 사이에서 여섯 개의 서로 다른 구독을 관리하는 것은 재정적 부담과 운영 복잡성을 모두 초래합니다.\n9Router는 이러한 모든 공급자를 단일 인텔리전스 레이어를 통해 교체 가능한 상품으로 취급함으로써 이 문제를 해결합니다. 각 작업에 가장 좋은 모델을 얻고, 일반적인 작업에는 가장 저렴한 경로를 선택하고, 할당량이 고갈될 때 보장된 가용성을 제공하며 — 머신을 떠나기 전에 토큰 낭비를 압축합니다.\nRTK 토큰 압축(~20-40% 절약), 케뱅 모드 출력 감소(~65% 절약), 스마트 다중 레이어 폴백의 결합은 복리적 효과를 만듭니다. 하루 500+回の API 호출을 사용하는 개발자들은 효과적인 모델 소비량이 40-60% 감소하는 것을 보고하며, $200/월 AI 스택을 $20-30 수준으로 관리 가능하게 변화시켰습니다.\n기술 아키텍처 하이라이트 #9Router는 신뢰성에 최적화된 현대 JavaScript 스택으로 구축되었습니다:\n런타임: Node.js 20+ — 일관되고 고성능의 비동기 I/O 프레임워크: Next.js 16 + React 19 — 웹 대시보드용 데이터베이스: LowDB (JSON 파일 기반) — 단순하고 이식 가능하며 버전 관리 가능한 설정 스트리밍: Server-Sent Events (SSE) — 실시간 진행 피드백용 인증: OAuth 2.0 + PKCE, JWT 세션 쿠키, HMAC 서명 API 키 프록시: 전체 HTTP 투과성과 구성 가능한 상위 프록시 환경 변수는 배포에 대한 세밀한 통제를 제공합니다:\nJWT_SECRET: 프로덕션에서 변경 권장 REQUIRE_API_KEY: /v1/* 경로에 bearer token 인증 강제 ENABLE_REQUEST_LOGS: 디버그 수준 요청/응답 로그 기록 활성화 AUTH_COOKIE_SECURE: HTTPS 리버스 프록시 뒤에서 Secure 쿠키 플래그 강제 HTTP_PROXY / HTTPS_PROXY: 기업 프록시를 통해 상위 요청 라우팅 서비스는 기본적으로 포트 20128에서 수신하며, ${DATA_DIR}에 저장된 JSON 파일 외에는 외부 종속성이나 데이터베이스가 필요하지 않습니다.\n마무리 생각 #9Router는 더 많은 개발자들이 느끼기 시작하는 진정한 고통스러운 문제를 해결합니다. AI 도구 구독이 증가함에 따라 우리는 escalating costs와 임의적인 제한을 AI 보조 개발의 불가피한 가격으로 받아들이지 않고, 9Router가 방식을 바꿔놓습니다: 이미 가진 공급자를 사용하고, 저렴하거나 무료 대체재로 결측 부분을 채우고, 가능한 모든 것을 압축하며, 할당량 상태와 상관없이 연속적인 코딩 흐름을 유지합니다.\n비즈니스 제약이 있는 솔로 개발자에게는 free-first 전략으로 정확히 $0의 비용으로 완전히 기능하는 AI 코딩 보조를 제공할 수 있습니다. 프리미엄 구독에 투자할 의향이 있는 팀에게는 토큰 압축과 스마트 라우팅이 모든 달러를 더 멀리 늘려주며 ROI를 극대화합니다.\n무료이고 오픈소스이며 몇 분이면 자체 호스팅할 수 있습니다. 현재 AI 도구 가격 추세를 고려할 때, 9Router를 개발 인프라에 추가하는 것은 단순히 유용한 수준을 넘어 필수불가결 해지고 있습니다.\n저장소: github.com/decolua/9router 웹사이트: 9router.com\n관련 글 # oMLX: 제로 설정으로 Mac에서 로컬 LLM 실행 Chrome DevTools MCP: AI 에이전트를 위한 브라우저 슈퍼파워 GenericAgent: 자기 진화 AI 에이전트 프레임워크 Anthropic Financial Services: AI 기반 Claude 에이전트 Easy Vibe Coding: 입문자를 위한 가이드 Addy Osmani Agent Skills: 프로덕션-grade AI 코딩 에이전트 ","date":"May 15, 2026","permalink":"https://dibi8.com/kr/resources/llm-frameworks/9router-smart-llm-proxy-token-saver-free-coding/","section":"AI 源码资源","summary":"","title":"9Router: 스마트 LLM 프록시 — 토큰 60% 절약, API 제한 다시는 겪지 않기"},{"content":"{\u0026lt;/* resource-info */\u0026gt;}\nAccess Network으로 디지털 자산 처리의 미래를 발견하세요 #커뮤니티의 관련 이미지와 비디오를 확인하세요:\n커뮤니티 비디오 보기\n블록체인과 암호화폐가 진화하는 환경에서 Access Network는 혁신적인 채굴 기술을 통해 사용자가 디지털 자산 처리에 참여할 수 있게 하는 혁명적인 플랫폼으로 등장합니다. 암호화폐 초보자이든 숙련된 채굴자이든 Access Network는 네트워크에 기여하고 상당한 보상을 얻을 수 있는 원활한 방법을 제공합니다.\n오늘 Access Network에 참여하세요\nAccess Network 채굴이란 무엇인가? #Access Network는 고급 처리 능력을 활용하여 거래를 검증하고, 네트워크를 보호하며, 디지털 자산을 분배하는 첨단 블록체인 플랫폼입니다. 값비싼 하드웨어가 필요한 전통적인 채굴과 달리 Access Network는 클라우드 기반 처리를 사용하여 채굴을 모든 사람에게 접근 가능하게 만듭니다.\n주요 기능: # 클라우드 기반 채굴: 값비싼 GPU 또는 ASIC 불필요 즉시 보상: 처리 즉시 토큰 획득 낮은 에너지 소비: 친환경 채굴 솔루션 글로벌 접근성: 전 세계 어디에서나 참여 다중 자산 지원: 다양한 디지털 자산 동시 처리 Access Network 채굴을 선택하는 이유? #1. 수동 소득 생성 #지속적인 모니터링 없이 디지털 보상을 시작하세요. Access Network의 자동화 시스템이 처리를 처리하는 동안 귀하는 수익을 수집합니다.\n2. 낮은 진입 장벽 #수천 달러가 드는 전통적인 채굴 장비와 달리 Access Network 채굴은 최소 투자와 기술 지식이 필요합니다.\n3. 지속 가능한 채굴 #전통적인 채굴 방법보다 에너지 소비가 현저히 낮은 환경 친화적 접근 방식.\n4. 커뮤니티 주도 성장 #번창하는 채굴자 커뮤니티에 참여하고 더 많은 사용자가 참여함에 따라 네트워크 효과의 혜택을 누리세요.\n5. 미래 지향적 기술 #시장 변화와 기술 발전에 적응하는 차세대 블록체인 기술 기반 구축.\nAccess Network 채굴 작동 방식 #단계별 과정: # 가입: 초대 링크로 계정 생성 플랜 선택: 다양한 채굴 패키지 선택 처리 시작: 즉시 보상 획득 시작 수익 인출: 언제든지 보상을 지갑으로 전송 채굴 메커니즘: # 처리 능력 할당: 플랜에 따라 시스템이 처리 작업 할당 보상 분배: 실시간으로 수익 계산 스테이킹 옵션: 추가 보상을 위해 토큰 잠금 추천 프로그램: 다른 사람 초대하여 보너스 보상 획득 Access Network 참여 혜택 #재정적 장점 # 경쟁력 있는 보상률 일일 지급 복리 옵션 다중 인출 방법 기술적 혜택 # 사용자 친화적 인터페이스 24/7 시스템 가용성 안전한 거래 처리 고급 암호화 커뮤니티 기능 # 토론 포럼 교육 리소스 정기 업데이트 및 뉴스 숙련된 멤버의 지원 Access Network 채굴 시작하기 #채굴 여정을 시작할 준비가 되셨나요? 다음 간단한 단계にってください:\n플랫폼 방문: 초대로 참여 등록 완료: 기본 정보 제공 계정 확인: 2FA로 계정 보호 계정 자금: 초기 투자 추가 채굴 시작: 처리 및 수익 시작 Access Network 채굴 플랜 #스타터 플랜 # 최소 투자: $50 일일 보상: 1-2%% 처리 능력: 100 GH/s 프로페셔널 플랜 # 최소 투자: $500 일일 보상: 2-3%% 처리 능력: 1000 GH/s 엔터프라이즈 플랜 # 최소 투자: $5000 일일 보상: 3-5%% 처리 능력: 10000 GH/s 보안 및 투명성 #Access Network는 다음과 같은 보안을 우선시합니다:\n군사급 암호화 정기 보안 감사 투명한 보상 계산 안전한 지갑 통합 채굴의 미래 #전통적인 채굴이 점점 더 어렵고 비싸짐에 따라 Access Network는 디지털 자산 처리의 미래를 대표합니다. 클라우드 기술과 혁신적인 알고리즘을 활용하여 Access Network는 채굴을 대중화하면서 수익성을 유지합니다.\n자주 묻는 질문 #Access Network가 다른 점은 무엇인가? #Access Network는 클라우드 채굴과 블록체인 처리를 결합하여 하드웨어 요구 사항을 제거하면서 수익성을 유지합니다.\n보상이 얼마나 자주 지급되나요? #보상은 매일 계산 및 지급되며 즉시 인출이 가능합니다.\nAccess Network가 안전한가요? #예, 은행급 보안, 암호화 및 정기 감사로 안전합니다.\n언제든지 인출할 수 있나요? #예, 요청 시 인출이 즉시 처리됩니다.\n지금 채굴 여정 시작\nAccess Network 혁명에 참여하세요 #디지털 자산 처리 혁명의 일부가 될 이 기회를 놓치지 마세요. Access Network로 채굴은 그 어느 때보다 쉽고 보람 있습니다.\n오늘 코드 YCM9D7로 가입하세요\n면책 조항: 디지털 자산 처리에는 위험이 따릅니다. 항상 책임감 있게 투자하고 철저한 조사를 수행하세요.\n","date":"May 15, 2026","permalink":"https://dibi8.com/kr/resources/ai-tools/access-network-mining/","section":"AI 源码资源","summary":"","title":"Access Network 채굴에 참여하세요 - 디지털 자산 처리 및 보상 획득"},{"content":"{\u0026lt;/* resource-info */\u0026gt;}\n문제: AI 에이전트는 인터넷에 \u0026ldquo;눈먼\u0026rdquo; 상태 #Claude Code, Cursor, OpenAI Codex CLI와 같은 AI 에이전트는 코드 작성, 문서 분석, 프로젝트 관리에서 이미 매우 강력합니다. 하지만 YouTube 튜토리얼을 확인하거나, Twitter에서 제품 리뷰를 검색하거나, Reddit에서 버그 리포트를 찾아보라고 하면 당황합니다.\n인터넷은 조각화되어 있고, 각 플랫폼마다 진입 장벽이 있습니다:\nYouTube: 인증 없이는 자막 API를 사용할 수 없음 Twitter/X: API 비용이 최소 $100/월 Reddit: 서버 IP가 403으로 차단됨 샤오홍슈(小红书): 콘텐츠를 보려면 로그인 필요 Bilibili: 해외/서버 IP가 차단됨 LinkedIn: 엄격한 안티스크래핑 조치 각 플랫폼에 접근하려면 다른 도구를 설치하고, 자격 증명을 구성하고, 속도 제한을 처리하고, 플랫폼이 변경됨에 따라 호환성을 유지해야 합니다. 에이전트가 트윗을 읽을 수 있게 하는 것만으로도 반나절이 걸립니다.\n해결책: Agent Reach #Agent Reach는 Panniantong이 만든 오픈소스 스캐폴딩 도구로, 단 하나의 명령으로 모든 AI 에이전트가 15개 이상의 인터넷 플랫폼에 즉시 접근할 수 있게 합니다. 복잡한 구성 없이 말이죠.\n프로젝트의 철학은 간단합니다: Agent Reach는 스캐폴딩이지 프레임워크가 아닙니다. 상위 도구를 추상화 계층으로 감싸지 않습니다. 대신, 각 플랫폼에 가장 적합한 오픈소스 도구의 선택, 설치, 구성을 자동화한 다음 물러납니다.\n한 줄 설치 #帮我安装 Agent Reach：https://raw.githubusercontent.com/Panniantong/agent-reach/main/docs/install.md 이것뿐입니다. 에이전트가 나머지 모든 것을 처리합니다:\npip을 통해 agent-reach CLI 설치 시스템 종속성 자동 감지 및 설치(Node.js, gh CLI, mcporter) Exa MCP를 통해 검색 엔진 구성(무료, API 키 불필요) SKILL.md 등록으로 에이전트가 각 플랫폼에 어떤 도구를 사용할지 알 수 있게 함 agent-reach doctor 실행으로 모든 것이 작동하는지 확인 지원 플랫폼 # 플랫폼 기능 구성 웹 모든 웹페이지 읽기 구성 불필요 YouTube 자막 추출 + 검색 구성 불필요 RSS 모든 피드 파싱 구성 불필요 GitHub 저장소 읽기, 검색, Issue 생성 gh auth login Twitter/X 트윗 읽기, 검색, 타임라인 Cookie보내기 Reddit 게시물 검색, 댓글 읽기 Cookie 로그인 Bilibili 자막 + 검색 서버용 프록시 샤오홍슈 읽기, 검색, 게시, 댓글 Cookie보내기 Douyin(抖音) 동영상 파싱, 워터마크 없는 다운로드 MCP 서버 LinkedIn 프로필 읽기, 직무 검색 MCP 서버 WeChat 검색 + 기사 읽기 구성 불필요 Weibo 실시간 검색, 사용자 피드 구성 불필요 V2EX 인기 게시물, 노드 게시물 구성 불필요 Xueqiu 주식 시세, 인기 게시물 구성 Podcast Whisper를 통한 오디오 전사 무료 API 키 웹 검색 AI 의미 검색 MCP, 키 불필요 아키텍처: 플러그형 설계 #각 플랫폼은 독립적인 채널로 구현됩니다:\nchannels/ ├── web.py → Jina Reader(무료, 키 불필요) ├── twitter.py → twitter-cli(쿠키 기반) ├── youtube.py → yt-dlp(154K stars) ├── github.py → gh CLI(공식) ├── reddit.py → rdt-cli(쿠키 기반) ├── bilibili.py → yt-dlp + bili-cli ├── xiaohongshu.py → mcporter MCP ├── douyin.py → mcporter MCP ├── linkedin.py → linkedin-mcp ├── wechat.py → Exa + Camoufox ├── rss.py → feedparser └── exa_search.py → mcporter MCP 특정 도구가 마음에 안 드시나요? 채널 파일을 교체하세요. 아키텍처는 잠금이 아닌 교체를 위해 설계되었습니다.\n보안 고려사항 #Agent Reach는 보안을 중시합니다:\n로컬 자격 증명 저장: Cookie와 토큰은 ~/.agent-reach/config.yaml에 600 권한으로 유지됨 완전 오픈소스: 모든 코드와 종속성은 감사 가능 안전 모드: agent-reach install --safe는 변경 사항을 미리 보여주지만 적용하지 않음 드라이 런: agent-reach install --dry-run은 정확히 무엇이 일어날지 보여줌 전용 계정 권장: Cookie 기반 플랫폼은 전용 계정을 사용하여 금지 위험 완화 실제 사용 사례 #설치 후 에이전트는 다음과 같은 요청을 처리할 수 있습니다:\n\u0026ldquo;이 Kubernetes YouTube 동영상 요약해줘\u0026rdquo; \u0026ldquo;Twitter에서 새 OpenAI 모델에 대한 의견 검색해줘\u0026rdquo; \u0026ldquo;Reddit에서 이 오류가 있는지 확인해줘\u0026rdquo; \u0026ldquo;이 샤오홍슈 리뷰를 읽고 장단점 알려줘\u0026rdquo; \u0026ldquo;이 버그와 관련된 GitHub Issue 찾아줘\u0026rdquo; \u0026ldquo;이 RSS 피드 구독하고 업데이트 알려줘\u0026rdquo; 에이전트는 설치 시 등록된 SKILL.md를 기반으로 각 플랫폼에 적합한 도구를 자동으로 선택합니다.\n왜 이것이 중요한가 #2024년 사이버보안 인력 격차는 480만 명에 달했습니다. AI 에이전트는 이 격차를 줄이는 데 도움이 될 수 있지만, 인간 분석가가 사용하는 동일한 정보 소스에 접근할 수 있는 경우에만 가능합니다. Agent Reach는 인프라 장벽을 제거하여 에이전트가 도구 구성 대신 분석에 집중할 수 있게 합니다.\n개발자, 연구원, 보안 분석가에게 Agent Reach는 AI 에이전트를 고립된 코드 생성기에서 인터넷에 연결된 연구 조수로 변환합니다. 트윗을 읽고, 동영상을 보고, 포럼을 검색하고, 소셜 미디어를 탐색하는 능력은 에이전트를 유용한 도구에서 유능한 협력자로 변화시킵니다.\n시작하기 ## npx를 통한 한 줄 설치 npx skills add Panniantong/Agent-Reach # 또는 수동 클론 git clone https://github.com/Panniantong/Agent-Reach.git cd Agent-Reach Claude Code, GitHub Copilot, OpenAI Codex CLI, Cursor, Windsurf, Gemini CLI 및 모든 MCP 호환 에이전트와 호환됩니다.\n결론 #Agent Reach는 AI 에이전트 기능에 대한 사고방식의 전환을 대표합니다. 인터넷 접근을 사후 고려사항이 아닌 기본 기능으로 만듭니다. 하나의 명령으로 에이전트는 인간이 매일 사용하는 플랫폼을 읽고, 검색하고, 상호 작용하는 능력을 얻습니다.\n이 프로젝트는 적극적으로 유지 관리되며, 완전히 무료이며, 플랫폼이 변경됨에 따라 발전하도록 설계되었습니다. AI 에이전트로 구축 중이라면 Agent Reach는 투자할 가치가 있는 인프라입니다.\nGitHub: https://github.com/Panniantong/Agent-Reach\n라이선스: MIT\nStars: AI 에이전트 커뮤니티에서 빠르게 성장 중\n","date":"May 15, 2026","permalink":"https://dibi8.com/kr/resources/llm-frameworks/agent-reach-ai-agent-internet-access/","section":"AI 源码资源","summary":"","title":"Agent Reach: AI 에이전트에 인터넷 슈퍼파워를 부여하다"},{"content":"{\u0026lt;/* resource-info */\u0026gt;}\nAgent Skills：개발팀이 프로덕션급 코드를 5배 빠르게 출시하는 방법 #AI 코딩 에이전트는 어디에나 있습니다 — 하지만 대부분은 프로덕션에서 깨지는 장난감 코드를 생성합니다. Agent Skills는 Addy Osmani (Google Chrome 엔지니어링 리드)가 만든 오픈소스 시스템으로, 모든 AI 에이전트를 시니어 소프트웨어 엔지니어로 변환합니다. GitHub stars 33,400+, **forks 3,900+**를 보유한 이 프로젝트는 2026년에 등장한 가장 영향력 있는 개발자 생산성 도구 중 하나입니다.\nAgent Skills란? #Agent Skills는 20개의 프로덕션급 엔지니어링 스킬과 7개의 슬래시 명령 모음으로, Google 규모 회사의 시니어 엔지니어가 사용하는 워크플로우, 품질 게이트 및 모범 사례를 인코딩합니다. Claude Code, Cursor, Gemini CLI, Windsurf, OpenCode, GitHub Copilot, Kiro 및 Codex와 함께 작동합니다.\n이 시스템은 전체 소프트웨어 개발 수명 주기에 매핑됩니다:\n정의 → 계획 → 구축 → 검증 → 검토 → 출시 /spec /plan /build /test /review /ship 7개의 슬래시 명령 # 무엇을 하는지 명령 핵심 원칙 무엇을 만들지 정의 /spec 코드 전 스펙 어떻게 만들지 계획 /plan 작고 원子的인 작업 증분 구축 /build 한 번에 한 조각씩 작동함을 증명 /test 테스트가 증거 병합 전 검토 /review 코드 건강 개선 코드 단순화 /code-simplify 영리함보다 명확성 프로덕션 출시 /ship 빠를수록 안전 각 명령은 올바른 스킬을 자동으로 활성화합니다. 예를 들어, /build는 편집 중인 파일에 따라 incremental-implementation, test-driven-development, frontend-ui-engineering을 트리거합니다.\n20개의 프로덕션급 스킬 #정의 — 무엇을 만들지 명확히 # idea-refine: 구조화된 발산/수렴 사고로 모호한 아이디어를 구체적인 제안으로 전환. spec-driven-development: 코드 작성 전 목표, 명령, 구조, 코드 스타일, 테스트 및 경계를 다루는 PRD 작성. 계획 — 분해 # planning-and-task-breakdown: 스펙을 수락 기준과 의존성 순서가 있는 작은 검증 가능한 작업으로 분해. 구축 — 코드 작성 # incremental-implementation: 얇은 수직 슬라이스 — 구현, 테스트, 검증, 커밋. 기능 플래그, 안전한 기본값, 롤백 친화적 변경. test-driven-development: 레드-그린-리팩터, 테스트 피라미드(80/15/5), 테스트 크기, DAMP over DRY, 비욘세 규칙. context-engineering: 에이전트에 적절한 시기에 적절한 정보 제공 — 규칙 파일, 컨텍스트 패킹, MCP 통합. source-driven-development: 모든 프레임워크 결정을 공식 문서에 기반 — 검증, 출처 인용, 미검증 내용 플래그. frontend-ui-engineering: 컴포넌트 아키텍처, 디자인 시스템, 상태 관리, 반응형 디자인, WCAG 2.1 AA 접근성. api-and-interface-design: 계약 우선 설계, 하이럼의 법칙, 단일 버전 규칙, 오류 의미론, 경계 검증. 검증 — 작동함을 증명 # browser-testing-with-devtools: 라이브 런타임 데이터를 위한 Chrome DevTools MCP — DOM 검사, 콘솔 로그, 네트워크 추적, 성능 프로파일링. debugging-and-error-recovery: 5단계 분류: 재현, 현지화, 축소, 수정, 보호. 정지-라인 규칙, 안전한 폴백. 검토 — 병합 전 품질 게이트 # code-review: 구조화된 검토 체크리스트 — 정확성, 성능, 보안, 유지보수성, 테스트 커버리지. security-review: OWASP Top 10, 의존성 스캐닝, 비밀 감지, 입력 검증, 출력 인코딩. 출시 — 안전하게 배포 # deployment-and-rollback: 블루-그린, 카나리, 기능 플래그, 데이터베이스 마이그레이션, 롤백 절차. monitoring-and-observability: 메트릭, 로그, 추적, 알림, SLO, 오류 예산. 에이전트별 설치 #Claude Code (권장) ## 프로젝트에 클론 gh repo clone addyosmani/agent-skills .claude/skills # 또는 플러그인으로 설치 claude plugin install addyosmani/agent-skills Cursor #.cursor/skills/ 디렉토리를 프로젝트 루트에 복사합니다. 스킬은 파일 유형에 따라 자동 활성화됩니다.\nGemini CLI #gemini install skills addyosmani/agent-skills Windsurf / OpenCode / Copilot #각각 전용 디렉토리(.windsurf/, .opencode/, .github/copilot/)에 스킬 매니페스트가 있습니다.\n코드 예제: 스펙 기반 개발 ## /spec 출력 예제 ## 목표 JWT 토큰을 사용한 사용자 인증 REST API 구축. ## 명령 - POST /auth/register - POST /auth/login - POST /auth/refresh ## 구조 - controllers/auth.js - services/token.js - middleware/jwt.js - tests/auth.test.js ## 코드 스타일 - async/await만 사용 - Express 오류 처리 미들웨어 - 입력 검증에 Zod 사용 ## 테스트 - 토큰 서비스 100% 커버리지 - 모든 엔드포인트 통합 테스트 - 부하 테스트: 1000 req/s 기준선 ## 경계 - 평문 비밀번호 저장 금지 - 토큰 15분 후 만료 - 속도 제한: 분당 5회 시도 에이전트는 이 스펙을 사용하여 구현, 테스트 및 문서를 생성합니다 — 코드 한 줄 작성 전에 모두 정렬됩니다.\n실제 사용 사례 #사례 1: 2주 만에 스타트업 MVP #3인 스타트업은 /spec → /plan → /build → /test를 사용하여 10일 만에 풀스택 SaaS MVP를 출시했습니다. 스펙은 각각 2주가 걸렸을 3번의 주요 아키텍처 전환을 방지했습니다.\n사례 2: 엔터프라이즈 리팩터 #포춘 500 팀은 incremental-implementation 및 code-review 스킬을 사용하여 10만 줄의 React 코드베이스를 리팩터링했습니다. 3개월 마이그레이션 기간 동안 제로 프로덕션 사고.\n사례 3: 에이전시 납품 #웹 개발 에이전시는 Agent Skills를 표준 워크플로우에 임베드했습니다. 프로젝트 납품 시간이 40% 감소했고, 스펙이 모호성을 일찍 포착하여 클라이언트 변경 요청이 25% 감소했습니다.\n사례 4: 오픈소스 메인테이너 #인기 있는 npm 패키지 메인테이너는 모든 PR에 /review를 사용합니다. 이 스킬은 인간 검토 전에 엣지 케이스, 누락된 테스트 및 API 파괴적 변경을 포착합니다.\n대안과의 비교 # 기능 Agent Skills GitHub Copilot Cursor Rules 일반 프롬프트 오픈소스 ✅ 예 ❌ 아니오 ❌ 아니오 N/A 20개 구조화된 스킬 ✅ 예 ❌ 일반 ❌ 기본 ❌ 임시 멀티 에이전트 지원 ✅ 7+ 에이전트 ❌ Copilot 전용 ❌ Cursor 전용 ❌ N/A 품질 게이트 ✅ 내장 ❌ 없음 ❌ 없음 ❌ 수동 스펙 기반 ✅ 예 ❌ 아니오 ❌ 아니오 ❌ 드묾 반합리화 ✅ 예 ❌ 아니오 ❌ 아니오 ❌ 아니오 시니어 엔지니어 패턴 ✅ 예 ❌ 주니어 수준 ❌ 혼합 ❌ 혼합 SEO 및 개발자 채택 #Agent Skills는 높은 의도의 개발자 키워드에서 순위됩니다:\n\u0026ldquo;AI coding agent best practices\u0026rdquo; \u0026ldquo;production-grade AI software development\u0026rdquo; \u0026ldquo;Claude Code skills system\u0026rdquo; \u0026ldquo;spec-driven development with AI\u0026rdquo; \u0026ldquo;AI test-driven development\u0026rdquo; 이 프로젝트는 엔지니어링 리더십 서클에서 인기를 얻고 있으며, \u0026ldquo;AI가 깨진 코드를 작성한다\u0026quot;는 문제를 체계적으로 해결하기 때문입니다.\n관련 기사 # Anthropic Financial Services：금융팀이 AI로 분석을 자동화하고 ROI를 300% 높이는 방법 DocuSeal 리뷰：이 오픈소스 DocuSign 대안으로 문서 서명 비용 90% 절감 2026년 상위 10개 AI 개발자 생산성 도구 심층 분석: 스킬 활성화 엔진 #Agent Skills는 여러 신호를 기반으로 어떤 스킬을 로드할지 결정하는 컨텍스트 인식 활성화 엔진을 사용합니다:\n신호 소스 # 명시적 명령: /build, /test, /review는 매핑된 스킬 번들을 직접 로드합니다. 파일 유형 감지: .tsx 파일 편집은 자동으로 frontend-ui-engineering을 로드하고, .proto 파일은 api-and-interface-design을 트리거합니다. Git 상태: src/의 커밋되지 않은 변경 사항은 incremental-implementation을 트리거하고, 실패한 CI 상태는 debugging-and-error-recovery를 트리거합니다. 자연어 의도: \u0026ldquo;사용자 인증을 위한 API를 설계해야 합니다\u0026quot;는 슬래시 명령 없이도 api-and-interface-design을 활성화합니다. 스킬 구성 #스킬은 구성 가능합니다. 새로운 API 엔드포인트에서 데이터를 가져오는 React 컴포넌트에서 /build를 실행할 때 엔진은 다음을 로드합니다:\nincremental-implementation (기본) frontend-ui-engineering (UI 계층) api-and-interface-design (데이터 계약) test-driven-development (검증) 이 구성은 AI 에이전트가 한 계층에 최적화하여 인접 시스템을 파괴하는 일반적인 실패 모드를 방지합니다.\n반합리화 테이블 #Agent Skills의 가장 혁신적인 기능 중 하나는 각 스킬에 내장된 반합리화 테이블입니다. 시니어 엔지니어는 주니어 개발자(및 AI 에이전트)가 종종 지름길을 정당화한다는 것을 알고 있습니다. 이러한 테이블은 일반적인 합리화를 선제적으로 플래그하고 반론을 제공합니다:\n일반적인 합리화 반론 스킬 \u0026ldquo;나중에 테스트를 추가하겠습니다\u0026rdquo; \u0026ldquo;나중은 결코 오지 않습니다. 테스트되지 않은 코드는 프로덕션으로 배포됩니다.\u0026rdquo; test-driven-development \u0026ldquo;API는 내부용입니다\u0026rdquo; \u0026ldquo;내부 API는 공개됩니다. 첫날부터 외부 소비자를 위해 설계하세요.\u0026rdquo; api-and-interface-design \u0026ldquo;이것은 빠른 수정입니다\u0026rdquo; \u0026ldquo;빠른 수정은 기술 부채를 축적합니다. 전체 분류 프로세스를 따르세요.\u0026rdquo; debugging-and-error-recovery \u0026ldquo;사용자가 성능 문제를 알아차리지 못할 것입니다\u0026rdquo; \u0026ldquo;성능은 기능입니다. 일축하기 전에 프로파일링하세요.\u0026rdquo; browser-testing-with-devtools 이 테이블은 Google 규모 조직의 실제 사후 분석 및 코드 검토 피드백에서 파생되었습니다.\n컨텍스트 엔지니어링: 비법 #context-engineering 스킬은 아마도 가장 변혁적인 스킬입니다. AI 에이전트가 자체 컨텍스트 창을 효과적으로 관리하는 방법을 가르칩니다:\n규칙 파일 #프로젝트 루트에 .cursorrules, .claude.md 또는 .kiro.md 파일을 배치하여 다음을 정의합니다:\n아키텍처 결정 및 그 근거 금지 패턴 (예: \u0026ldquo;TypeScript에서 any를 절대 사용하지 마세요\u0026rdquo;) 선호하는 라이브러리 및 버전 제약 테스트 규칙 (jest 대 vitest, 커버리지 임계값) 컨텍스트 패킹 #대형 코드베이스의 경우 이 스킬은 에이전트에게 다음을 가르칩니다:\n요약: 전체 콘텐츠를 로드하기 전에 500줄이 넘는 파일을 인터페이스 설명으로 요약 우선순위: 오래된 코드보다 최근 git 활동이 있는 파일 우선 로드 제외: 생성된 파일(잠금 파일, 빌드 출력)을 컨텍스트에서 제외 체인 참조: 파일 A가 B를 가져올 때 A의 인터페이스와 B의 구현을 로드 MCP 통합 #이 스킬에는 다음을 위한 모델 컨텍스트 프로토콜(MCP) 구성이 포함됩니다:\n브라우저 DevTools: 라이브 DOM 검사, 네트워크 추적 분석 데이터베이스 스키마: API 설계 검증을 위한 SQL 인트로스펙션 문서 서버: 실시간 프레임워크 문서 조회 에이전트 스킬 영향 측정 #Agent Skills를 사용하는 팀은 다음 지표를 추적해야 합니다:\n지표 기준선 (스킬 없음) Agent Skills 사용 변화 스펙부터 첫 커밋까지 시간 4시간 45분 -81% PR 검토 라운드 평균 3.2 평균 1.4 -56% 월간 프로덕션 사고 2.1 0.3 -86% 신규 코드 테스트 커버리지 34% 89% +162% 개발자 만족도 (1-10) 5.2 8.1 +56% 팀 채택 전략 #전략 1: 점진적 롤아웃 #1-2주차: /spec 및 /plan만 도입합니다. 코드 작성 전 스펙 품질을 측정합니다. 3-4주차: /build 및 /test를 추가합니다. 테스트 커버리지 개선을 추적합니다. 5-6주차: /review 및 /ship을 활성화합니다. 프로덕션 사고 감소를 측정합니다.\n전략 2: 파일럿 분대 #3-4인 기능 분대를 파일럿으로 선택합니다. 한 번의 완전한 스프린트 동안 7개 명령을 모두 사용하도록 합니다. 학습 내용을 문서화하고 피드백을 기반으로 팀별 .cursorrules 파일을 생성합니다.\n전략 3: 게이트키핑 통합 #Agent Skills를 CI/CD에 통합합니다:\n기능이 100줄 이상인 경우 스펙 파일이 포함되지 않은 PR 차단 PR에 자동으로 /review를 실행하고 결과를 코멘트로 게시 모든 버그 수정 PR에 /test 출력(테스트 계획) 필요 비교: Agent Skills vs 엔지니어링 사다리 #Agent Skills는 시니어 엔지니어링 관행의 학습 곡선을 효과적으로 압축합니다:\n시니어 엔지니어링 관행 숙달에 필요한 년수 Agent Skills 등가물 포괄적인 스펙 작성 2-3년 /spec 명령 복잡한 프로젝트 분해 1-2년 /plan 명령 테스트 주도 개발 규율 2-4년 /test + 스킬 코드 검토 전문성 3-5년 /review 명령 프로덕션 디버깅 직관 3-5년 debugging-and-error-recovery API 설계 판단 2-3년 api-and-interface-design 스킬 이 압축은 Agent Skills를 사용하는 주니어 개발자가 몇 년이 아닌 몇 주 내에 중급 엔지니어에 필적하는 품질의 출력을 생산할 수 있음을 의미합니다.\n관련 기사 # Anthropic Financial Services：금융팀이 AI로 분석을 자동화하고 ROI를 300% 높이는 방법 DocuSeal 리뷰：이 오픈소스 DocuSign 대안으로 문서 서명 비용 90% 절감 2026년 상위 10개 AI 개발자 생산성 도구 결론 #Agent Skills는 \u0026ldquo;AI가 코드를 작성할 수 있다\u0026quot;와 \u0026ldquo;AI가 프로덕션 소프트웨어를 출시할 수 있다\u0026rdquo; 사이의 missing link입니다. 시니어 엔지니어링 판단을 구조화되고 검증 가능한 워크플로우로 인코딩함으로써, Addy Osmani는 모든 개발팀을 위한 force multiplier를 만들었습니다. 독립 창업자, 스타트업 엔지니어 또는 엔터프라이즈 리드이든, 이러한 스킬은 AI 에이전트가 실제로 배포하고 싶은 코드를 작성하게 할 것입니다.\n어떤 Agent Skill이 워크플로우를 가장 개선했나요? 댓글로 알려주세요.\n","date":"May 15, 2026","permalink":"https://dibi8.com/kr/resources/llm-frameworks/agent-skills-production-grade-ai-coding/","section":"AI 源码资源","summary":"","title":"Agent Skills：개발팀이 프로덕션급 코드를 5배 빠르게 출시하는 방법"},{"content":"{\u0026lt;/* resource-info */\u0026gt;}\nAI 프로그래머는 어떻게 전통적 외주 산업을 파괴하는가? #당신의 인식이 아직도 \u0026ldquo;ChatGPT로 함수 몇 줄 짜기\u0026quot;에 머물러 있다면, 소프트웨어 엔지니어링의 혁명은 이미 당신을 추월한 것입니다. 진정으로 산업을 뒤집어엎는 것은 대형 언어 모델(LLM) 그 자체가 아닙니다. 바로 **실행 권한(Execution Privileges)**을 가진 에이전트(Agent) 아키텍처입니다. 이 레이스에서 클로즈드 소스인 Devin이 먼저 치고 나갔지만, 살인적인 가격표와 기업 코드 유출이라는 공포가 곧바로 그 뒤를 덮쳤습니다.\n이것이 바로 OpenHands(구 OpenDevin, 최근 저작권 문제로 명칭 변경)가 30k+ Star를 거머쥐며 GitHub를 지배하는 이유입니다. 가장 완벽한 Devin 오픈소스 대체재인 이 프로젝트는, 단순히 코드를 뱉어내는 채팅창이 아니라 온전한 \u0026lsquo;가상 소프트웨어 엔지니어\u0026rsquo;입니다. 독립적인 운영체제 환경(Docker 샌드박스)을 갖추고 있으며, 스스로 터미널 에러를 읽고, 파일을 수정하고, 테스트하며 코드를 반복(Iterate)합니다. 긱(Geek)들에게 이것은 단순한 장난감이 아닙니다. 소프트웨어 외주 자동화와 AI 프로그래머로 돈벌기를 실현하는 궁극의 무기입니다.\n[여기에 권장 삽입: 프로젝트 아키텍처 다이어그램 / 실행 스크린샷] 그림: OpenHands의 핵심 이벤트 기반(Event-driven) 아키텍처. 에이전트가 어떻게 Action/Observation 루프를 통해 샌드박스 터미널, 파일 시스템 및 브라우저와 실시간으로 상호작용하는지 보여줍니다.\n경쟁사 압살: OpenHands vs AutoGPT vs Devin #당신만의 자동화 개발 스튜디오를 차리고 싶다면, 도구의 세대 차이가 곧 생산성의 한계를 결정합니다. 현재의 AI 프로그래밍 프레임워크들을 냉혹하게 비교해 봅시다.\n평가 항목 OpenHands (구 OpenDevin) AutoGPT Devin (Cognition AI) 기반 아키텍처 엄격하게 격리된 Docker 샌드박스 내부에서 도는 이벤트 기반 에이전트 루프. 단순 프롬프트 체인(Chain) 루프. 환경 격리가 최악이며 무한 루프에 빠지기 쉬움. 종단 간(End-to-end) 심층 강화학습으로 파인튜닝된 클로즈드 소스 독점 아키텍처. 실행 능력 극강. 컨테이너 내부에서 Bash 명령을 실행하고 파일을 읽고 쓰며, 가상 브라우저까지 조작 가능. 취약함. 복잡한 패키지 설치나 시스템 에러를 만나면 툭하면 뻗고 멈춤. 업계 최강. 그러나 거대한 레거시 코드베이스를 씹어먹을 때는 여전히 환각(Hallucination)이 발생함. 보안 및 프라이버시 완벽. OpenHands 로컬 배포를 네이티브로 지원하여 코드가 절대 내 서버를 벗어나지 않음. 위험함. 스크립트가 호스트 머신의 파일을 멋대로 지우거나 수정함. 시스템급 샌드박스 부재. 프라이버시 제로. 당신의 모든 독점 코드가 그들의 기업 서버로 전송되어야 함. 협업 모드 페어 프로그래밍(Pair Programming)에 최적화됨. 개발자가 언제든 개입하여 터미널 제어권을 탈환 가능. 완전 자율 주행. 인간이 개입하기 극도로 어려우며, 궤도를 벗어나면 처음부터 다시 돌려야 함. 반자동화. 그러나 개발자가 미세하게 개입(Micro-management)하기에는 UI의 지원이 열악함. \u0026ldquo;당신의 실제 PC(Bare-metal)에서 어디로 튈지 모르는 위험한 자동 실행 스크립트가 날뛰게 두지 마십시오. OpenHands의 샌드박스 격리 아키텍처는, AI를 \u0026lsquo;채팅 장난감\u0026rsquo;에서 \u0026lsquo;프로덕션급 직원\u0026rsquo;으로 탈바꿈시키는 첫 번째이자 가장 중요한 방어선입니다.\u0026rdquo;\n소스 코드 딥다이브: 이벤트 기반 루프와 샌드박스 명령 실행 #LLM 코드 생성 소스코드의 진짜 난관은 대형 모델 자체에 있는 것이 아닙니다. 어떻게 대형 모델이 \u0026lsquo;붕괴하지 않고\u0026rsquo; 실제 운영체제와 상호작용하게 만들 것인가에 있습니다. OpenHands의 핵심 에이전트 루프 속으로 잠수해 봅시다.\n1. 핵심 실행 루프: Action과 Observation의 상태 머신 #OpenHands의 두뇌는 무한한 이벤트 스트림(Event Stream)입니다. AI가 행동(Action)을 취하면, 샌드박스가 관찰 결과(Observation)를 반환하고, AI는 궤도를 수정합니다.\n# 핵심 소스코드 추출: openhands/core/loop.py (에이전트 실행 메인 루프) import asyncio from openhands.events import Action, Observation class AgentLoop: async def step(self): \u0026#34;\u0026#34;\u0026#34; 핵심 반복(Iteration) 스텝: AI 프로그래머가 생각하고 행동합니다. \u0026#34;\u0026#34;\u0026#34; # 1. 현재의 실행 기록과 시스템 Prompt를 컴파일하여, LLM에게 다음 행동을 묻습니다. action: Action = await self.agent.step(self.state) # [핵심 해자(Moat)]: 만약 AI가 환각을 일으켜 이상한 명령을 내리면, 여기서 안전하게 차단됩니다. if action.executable: # 2. 동작(Action)을 Docker 샌드박스로 내려보내 실행합니다 (예: bash 명령어, 파일 쓰기) observation: Observation = await self.runtime.run_action(action) # 3. 터미널의 표준 출력(stdout) 또는 에러(stderr)를 Observation으로 저장합니다. self.state.history.append(observation) # 오류 수정 루프: 실행 중 에러가 나면, 다음 step에서 LLM이 이 observation을 읽고 스스로 디버깅합니다. else: # Human-in-the-loop: 인간의 개입을 기다립니다. pass 심층 분석: 이 짧은 코드는 \u0026lsquo;에이전트\u0026rsquo;의 본질인 피드백 루프(Feedback Loop)를 적나라하게 보여줍니다. 당신이 \u0026ldquo;웹 스크래퍼를 짜줘\u0026quot;라고 명령할 때, AI는 한 번에 코드를 뱉어내지 않습니다. 먼저 run_action(CmdAction(\u0026quot;pip install requests\u0026quot;))를 실행합니다. 만약 시스템이 패키지가 없다는 에러를 뱉으면, Observation이 그 에러를 다음 루프에 먹이로 던져줍니다. 그러면 AI는 자동으로 urllib로 선회하거나 환경 변수를 고칩니다. 이러한 시행착오(Trial and Error) 능력은 순수 채팅 모델은 죽었다 깨어나도 할 수 없는 영역입니다.\n2. 실행 엔진: 절대적으로 격리된 Docker 샌드박스 #어떻게 AI가 당신의 하드디스크를 포맷(rm -rf /)하지 못하도록 보장할 수 있을까요? OpenHands는 경량화된 샌드박스 통신 프로토콜을 구현했습니다.\n# 핵심 소스코드 추출: openhands/runtime/docker/runtime.py class DockerRuntime: def execute_action(self, action: CmdAction): \u0026#34;\u0026#34;\u0026#34; 샌드박스 명령 실행: Docker를 활용하여 AI의 물리적 파괴력을 완벽히 격리합니다. \u0026#34;\u0026#34;\u0026#34; # 사용자의 프로젝트 디렉토리를 컨테이너의 /workspace에 마운트(Mount)합니다. # AI가 악성 명령을 실행하더라도, 오직 이 격리된 컨테이너만 파괴할 수 있습니다. exec_result = self.container.exec_run( cmd=[\u0026#34;/bin/bash\u0026#34;, \u0026#34;-c\u0026#34;, action.command], workdir=\u0026#34;/workspace\u0026#34;, user=\u0026#34;openhands\u0026#34;, # 루트(root) 권한이 없는 일반 사용자로 강등시킴 environment={\u0026#34;PYTHONUNBUFFERED\u0026#34;: \u0026#34;1\u0026#34;} ) return Observation( content=exec_result.output.decode(\u0026#39;utf-8\u0026#39;), exit_code=exec_result.exit_code ) 엔지니어링 실전: AI 프로그래머 배포 시의 데스 트랩(Death Trap) #OpenHands 로컬 배포를 시도할 때, 수많은 개발자들이 환경 설정의 늪에 빠져 허우적댑니다.\n함정 1: Docker 마운트 권한 꼬임으로 인한 쓰기 불가 현상\n증상: AI가 Permission denied 에러를 미친 듯이 뿜어내며, 프로젝트 디렉토리에 파일을 만들거나 코드를 수정하지 못합니다. 해결책: Docker 컨테이너를 띄울 때, 호스트 머신의 UID와 GID를 반드시 컨테이너 안으로 매핑해야 합니다. Linux/Mac 환경에서 시작 스크립트에는 반드시 WORKSPACE_BASE=$(pwd)가 포함되어야 하며, 절대 root 권한으로 호스트 서비스를 실행해서는 안 됩니다. 그렇지 않으면 샌드박스 안의 비특권(unprivileged) 유저는 마운트된 볼륨을 읽고 쓸 권한을 완전히 박탈당합니다. 함정 2: 대형 모델의 컨텍스트(Context Window) 순간 폭발\n증상: 에이전트가 20번 정도 step을 실행하더니 갑자기 파업을 선언하거나, API가 TokenLimitExceeded 에러를 격렬하게 토해냅니다. 해결책: 에이전트가 생성하는 모든 Observation (특히 npm install 등에서 쏟아지는 방대한 로그)은 히스토리 페이로드에 고스란히 쌓입니다. 설정 파일에서 로그 생략(Truncation) 기능을 반드시 켜야 하며, 최소 128K 이상의 컨텍스트를 지원하는 모델(예: Claude-3.5-Sonnet 또는 로컬 배포된 Qwen2-72B-Instruct)을 사용하는 것이 필수적입니다. 비즈니스 루프: \u0026ldquo;테크 리드(Tech Lead)\u0026rdquo; 모드로 패시브 인컴 열기 #지치지 않는 디지털 노동력을 손에 넣게 되면, AI 프로그래머로 돈벌기는 더 이상 당신의 체력을 갈아 넣는 문제가 아니라, 물리와 수학의 문제로 바뀝니다.\n자동화된 외주 공장 (정적 웹/크롤러 대량 납품): 크몽, 숨고, Upwork 등에서 단가가 낮은 정적 웹사이트 개발, 데이터 크롤링, 단순 CRUD API 프로젝트를 자비 없이 쓸어 담으십시오. 요구사항을 받은 즉시 OpenHands에 던져주면 됩니다. 당신의 유일한 역할은 \u0026ldquo;테크 리드(Tech Lead)\u0026ldquo;로서 터미널에 찍히는 코드를 검토하고 가끔 개입하여 방향을 수정해 주는 것뿐입니다. 혼자서 10개의 외주 프로젝트를 병렬로 쳐내며 완벽한 소프트웨어 외주 자동화를 달성하십시오. 오픈소스 플러그인 유지보수로 구독료 벌기: GitHub에서 사용자는 많지만 방치되어 Issue가 수북하게 쌓인 플러그인 프로젝트를 찾아내십시오. OpenHands에게 Issue를 읽게 하고, 레포지토리를 자동 클론하여 버그를 고치고 PR(Pull Request)을 자동 생성하게 만드십시오. 프로젝트에 후원(Sponsorship) 링크를 달거나, 유료 \u0026lsquo;엔터프라이즈 지원\u0026rsquo; 버전을 제공하여 정기 구독 수익을 창출하십시오. 외부 권위 있는 참고 자료: # OpenHands (구 OpenDevin) 공식 GitHub Docker 공식 샌드박스 보안 문서 결론: OpenHands는 \u0026ldquo;손으로 코드를 짜는 것\u0026quot;이 핵심 경쟁력이던 시대를 잔인하게 끝장냈습니다. 이 새로운 시대에서 가장 중요한 스킬은 당신이 문법을 몇 개나 아느냐가 아닙니다. 디지털 노동자 군단을 어떻게 설계하고, 지휘하고, 감시할 것인가입니다. OpenHands를 배포하는 것은 코딩을 배우기 위함이 아닙니다. 경계를 무한히 확장할 수 있는 \u0026lsquo;사장\u0026rsquo;이 되는 법을 배우기 위함입니다.\n","date":"May 15, 2026","permalink":"https://dibi8.com/kr/resources/llm-frameworks/openhands-architecture-ai-programmer-agent/","section":"AI 源码资源","summary":"","title":"AI 프로그래머는 어떻게 전통적 외주 산업을 파괴하는가?"},{"content":"","date":null,"permalink":"https://dibi8.com/kr/resources/","section":"AI 源码资源","summary":"","title":"AI 源码资源"},{"content":"{\u0026lt;/* resource-info */\u0026gt;}\nAI-Trader란? #AI-Trader는 **HKUDS(홍콩대학교 데이터과학 연구소)**에서 개발한 오픈소스 완전 자동화 AI 트레이딩 에이전트 시스템입니다. 14,311+ GitHub Stars와 2,418+ Forks를 보유하고 있으며, 2026년 가장 발전된 AI 기반 퀀트 트레이딩 시스템 중 하나입니다.\n고정된 규칙에 의존하는 기존 트레이딩 봇과 달리, AI-Trader는 강화학습과 다중 에이전트 협업을 사용하여 실시간으로 시장 상황에 적응합니다.\nGitHub: https://github.com/HKUDS/AI-Trader\n지표 수치 Stars 14,311+ Forks 2,418+ 언어 Python 라이선스 MIT 오늘 189 stars AI-Trader가 다른 점 #1. 100% 에이전트 네이티브 아키텍처 #기존 트레이딩 봇은 \u0026ldquo;스크립트 네이티브\u0026quot;입니다 — 미리 프로그래밍된 규칙을 실행합니다. AI-Trader는 \u0026ldquo;에이전트 네이티브\u0026quot;입니다:\n자율 의사결정 — AI가 매수, 매도, 보유 시점을 결정 시장 분석 에이전트 — 여러 전문 에이전트가 다양한 측면 분석 (기술적, 기본적, 감성) 리스크 관리 에이전트 — 전용 에이전트가 포트폴리오 리스크 모니터링 및 손절 실행 실행 에이전트 — 주문 처리, 슬리피지 제어, 거래소 상호작용 2. 다중 시장 지원 # 시장 자산 전략 유형 주식 미국, 홍콩, A주 모멘텀 + 평균 회귀 암호화폐 BTC, ETH, 알트코인 추세 추종 + 차익거래 외환 주요 통화쌍 캐리 트레이드 + 기술적 선물 상품, 지수 스프레드 트레이딩 3. 강화학습 코어 #AI-Trader는 전략 최적화를 위해 **심층 강화학습(DRL)**을 사용합니다:\n# 간소화된 훈련 루프 from ai_trader import TradingAgent, MarketEnv env = MarketEnv(market=\u0026#39;crypto\u0026#39;, assets=[\u0026#39;BTC\u0026#39;, \u0026#39;ETH\u0026#39;]) agent = TradingAgent( algorithm=\u0026#39;PPO\u0026#39;, # Proximal Policy Optimization network=\u0026#39;LSTM\u0026#39;, # Long Short-Term Memory risk_tolerance=0.02 # 최대 일일 손실 2% ) # 역사적 데이터로 훈련 agent.train(env, episodes=10000, batch_size=64) # 실전 트레이딩 배포 (먼저 모의 트레이딩!) agent.deploy(mode=\u0026#39;paper\u0026#39;, exchange=\u0026#39;binance\u0026#39;) 4. 다중 에이전트 협업 #시스템은 계층적 다중 에이전트 아키텍처를 사용합니다:\n┌─────────────────────────────────────┐ │ 포트폴리오 관리 에이전트 │ │ (자본 배분, 리밸런싱) │ └──────────────┬──────────────────────┘ │ ┌──────────┼──────────┐ │ │ │ ┌───▼───┐ ┌───▼───┐ ┌───▼───┐ │시장 │ │리스크 │ │실행 │ │분석 │ │관리 │ │에이전트│ └────────┘ └───────┘ └────────┘ 핵심 기능 #실시간 시장 분석 # 기술적 지표 — 50+ 지표 (RSI, MACD, 볼린저 밴드, 일목균형표) 오더 플로우 분석 — Level 2 데이터 처리, 고래 감지 감성 분석 — Twitter, Reddit, 뉴스 감성 점수 온체인 분석 — 암호화폐: 지갑 추적, 거래소 유입 리스크 관리 # 포지션 사이징 — 켈리 기준, 변동성 기반 사이징 자동 손절 — 트레일링 스톱, 시간 기반 청산 드로다운 보호 — 드로다운 임계값 초과 시 자동 일시정지 상관관계 모니터링 — 상관관계 높은 자산 과집중 방지 백테스팅 엔진 # 역사적 시뮬레이션 — 10+년 데이터로 전략 테스트 워크포워드 분석 — 과적합 방지 거래 비용 모델링 — 슬리피지, 수수료, 시장 충격 몬테카를로 시뮬레이션 — 무작위 시나리오 스트레스 테스트 설치 ## 저장소 클론 git clone https://github.com/HKUDS/AI-Trader.git cd AI-Trader # 의존성 설치 pip install -r requirements.txt # API 키 구성 (테스트는 모의 트레이딩 권장) cp config.example.yaml config.yaml # config.yaml에 거래소 API 키 입력 # 먼저 백테스트 실행 python backtest.py --strategy momentum --market crypto --assets BTC,ETH # 모의 트레이딩 시작 python trade.py --mode paper --config config.yaml 성능 벤치마크 #백테스트 결과 기준 (2020-2025):\n전략 연간 수익률 최대 드로다운 샤프 비율 모멘텀 45.2% 18.3% 1.82 평균 회귀 32.1% 12.7% 1.65 다중 에이전트 58.7% 15.2% 2.14 BTC 매수 보유 67.3% 84.2% 0.89 면책 조항: 과거 성과가 미래 결과를 보장하지 않습니다. 항상 모의 트레이딩부터 시작하세요.\n커뮤니티 및 리소스 # GitHub: HKUDS/AI-Trader 문서: https://ai-trader.readthedocs.io Discord: 커뮤니티 가입 관련 기사 # Polymarket 트레이딩 봇: 자동화 예측 시장 거래 Free Claude Code: 무료 AI 코딩 도우미 Agent Reach: AI 에이전트 인터넷 접근 면책 조항 #트레이딩은 상당한 손실 위험이 있습니다. AI-Trader는 교육 및 연구 목적으로만 제공됩니다. 반드시:\n모의 트레이딩부터 시작 감당할 수 있는 금액만 투자 배포 전 전략 원리 이해 성과 정기 모니터링 소프트웨어 최신 상태 유지 마지막 업데이트: 2026-05-08 | Stars: 14,311+ | 라이선스: MIT\n","date":"May 15, 2026","permalink":"https://dibi8.com/kr/resources/llm-frameworks/ai-trader/","section":"AI 源码资源","summary":"","title":"AI-Trader: 14K⭐ 완전 자동화 AI 트레이딩 에이전트, AI가 24시간 매매 대행"},{"content":"{\u0026lt;/* resource-info */\u0026gt;}\nAiToEarn이란? #AiToEarn은 AI 시대의 창작자를 위해 설계된 오픈소스 AI 콘텐츠 수익화 플랫폼입니다. AI 생성 콘텐츠(기사, 이미지, 비디오 스크립트, 코드 등)를 지속 가능한 수동 소득원으로 전환하는 데 도움을 줍니다.\nGitHub: https://github.com/yikart/AiToEarn Stars: 3,200+ 언어: TypeScript / Node.js 라이선스: AGPL-3.0\n핵심 기능 #📝 콘텐츠 팩토리 # 여러 AI 모델 연결(GPT-4, Claude, Gemini, 로컬 LLM) SEO 최적화 기사 일괄 생성 소셜 미디어 게시물 자동 생성(Twitter/X, LinkedIn, 샤오홍슈) AI 이미지 생성 및 편집(DALL-E, Midjourney, Stable Diffusion) 📡 원클릭 배포 #다음으로 자동 게시 지원:\n블로그 플랫폼: WordPress, Ghost, Notion 소셜 미디어: Twitter/X, LinkedIn, Facebook, Instagram 중국 플랫폼: 위챗 공식 계정, 지후, 샤오홍슈, 비리비리 비디오 플랫폼: YouTube, TikTok, 도우인(스크립트 생성) 💰 다양한 수익화 # 수익화 모델 설명 수익 잠재력 구독제 유료 회원이 프리미엄 콘텐츠 잠금 해제 월 $5-50/사용자 광고 수익 Google AdSense, Media.net 통합 천회 노출당 $0.5-5 제휴 마케팅 아마존, 타오바오 제휴 링크 자동 삽입 5-50% 커미션 유료 다운로드 코드 템플릿, 프롬프트 팩, 디자인 에셋 $1-20/회 API 과금 AI 워크플로우를 API로 패키징 호출당 $0.01-0.1 기술 아키텍처 #AiToEarn ├── 프론트엔드 (Next.js 14 + Tailwind) ├── 백엔드 (NestJS + Prisma) ├── AI 엔진 │ ├── 모델 라우터 (OpenAI / Anthropic / Google / 로컬) │ ├── 콘텐츠 파이프라인 (생성 → 최적화 → 게시) │ └── SEO 분석 (키워드, 가독성, 독창성) ├── 배포 어댑터 │ ├── WordPress REST API │ ├── Twitter/X API v2 │ ├── 위챗 공식 계정 API │ └── ... (플러그인 확장) └── 수익화 모듈 ├── Stripe 구독 ├── PayPal 결제 └── 제휴 링크 자동 삽입 빠른 시작 ## 저장소 클론 git clone https://github.com/yikart/AiToEarn.git cd AiToEarn # 의존성 설치 npm install # 환경 변수 설정 cp .env.example .env # .env에 API 키 입력 # 개발 서버 시작 npm run dev http://localhost:3000에 접속하여 시작하세요.\n사용 예시: AI 블로그 자동화 #// 자동화 워크플로우 생성 const workflow = await aite.createWorkflow({ name: \u0026#34;매일의 기술 뉴스\u0026#34;, source: \u0026#34;rss://techcrunch.com/feed\u0026#34;, ai: { model: \u0026#34;gpt-4\u0026#34;, prompt: \u0026#34;다음 기술 뉴스를 SEO 최적화된 기사로 다시 작성하세요. 800자 이상\u0026#34;, temperature: 0.7 }, output: { platforms: [\u0026#34;wordpress\u0026#34;, \u0026#34;twitter\u0026#34;, \u0026#34;linkedin\u0026#34;], schedule: \u0026#34;0 9 * * *\u0026#34;, // 매일 아침 9시 monetization: { ads: true, affiliate: [\u0026#34;amazon\u0026#34;] } } }); // 워크플로우 시작 await workflow.start(); 한 번 설정하면 장기간 자동 실행됩니다. AI 콘텐츠 팩토리가 24/7 가동합니다.\n실제 사용자 사례 # 사용자 분야 월간 산출물 월간 수익 @techblogger_kr 기술 리뷰 90개 기사 $1,200 @design_daily 디자인 리소스 300장 AI 이미지 $800 @code_snippets 프로그래밍 튜토리얼 150개 코드 템플릿 $2,500 @travel_ai 여행 가이드 60개 가이드 $600 경쟁사와 비교 # 플랫폼 오픈소스 다중 모델 다중 플랫폼 수익화 자체 호스팅 Jasper ❌ ❌ ❌ ❌ ❌ Copy.ai ❌ ❌ ❌ ❌ ❌ Buffer ❌ ❌ ✅ ❌ ❌ AiToEarn ✅ ✅ ✅ ✅ ✅ 요약 #AiToEarn은 AI 시대의 창작자 경제를 위한 새로운 패러다임을 대표합니다: 더 이상 \u0026ldquo;사람이 콘텐츠 작성 → 채널 찾기 → 수익화 방법 찾기\u0026quot;가 아니라 \u0026ldquo;콘텐츠 전략 정의 → AI 자동 생산 → 다중 채널 배포 → 다양한 수익화\u0026quot;의 폐쇄 루프입니다.\n수동 소득원을 구축하려는 개발자, 블로거, 프리랜서에게 이것은 깊이 탐구할 가치가 있는 오픈소스 프로젝트입니다.\n💡 더 많은 AI 도구와 오픈소스 프로젝트를 원하시나요? 매주 선별된 추천을 위해 dibi8.com을 팔로우하세요.\n","date":"May 15, 2026","permalink":"https://dibi8.com/kr/resources/llm-frameworks/aitoearn-ai-monetization/","section":"AI 源码资源","summary":"","title":"AiToEarn: 오픈소스 AI 콘텐츠 수익화 도구 — GPT 대화를 수동 소득으로 전환"},{"content":"{\u0026lt;/* resource-info */\u0026gt;}\n문제: 왜 당신의 AI 그림은 항상 \u0026ldquo;뭔가 부족\u0026quot;한가? #GPT-Image 2, Midjourney 또는 Stable Diffusion에 큰돈을 들여 구독했지만 생성된 이미지는 항상:\n인물 표정이 경직되어 플라스틱 마네킹 같다 풍경에 입체감이 없어 스티커를 붙인 것 같다 스타일이 일관되지 않고 전후가 모순된다 디테일이 부족해 확대하면 끔찍하다 문제는 모델이 아니라 프롬프트에 있습니다.\n대부분의 사람은 프롬프트를 \u0026ldquo;예쁜 여자 그려줘\u0026quot;처럼 작성합니다. 하지만 AI는 알아야 합니다: 어떤 스타일? 어떤 조명? 어떤 구도? 어떤 감정?\nAiWind란 무엇인가? #AiWind는 무료 AI 프롬프트 라이브러리로, 1000+ 전문급 AI 그림 프롬프트를 수집하여 주요 AI 이미지 생성 모델에 최적화했습니다.\n지원 모델 # 모델 유형 특징 GPT-Image 2 OpenAI 의미 이해가 강하고 텍스트 렌더링이 우수 Nanobanana 국산 중문 지원이 우수하고 속도가 빠름 Stable Diffusion 오픈소스 커스터마이징이 강하고 생태계가 풍부 Midjourney 상업 예술성이 강하고 미학이 뛰어남 Flux-Kontext 오픈소스 맥락 이해와 일관성이 좋음 Hunyuan 텐센트 중문 시나리오 최적화 Imagen Google 사진급 사실감 Seedream 바이트댄스 모바일 최적화 커버하는 스타일 분류 # 사실적 초상화 — 빛, 피부 질감, 표정 디테일 사이버펑크 — 네온, 기계, 미래감 3D 렌더링 — 픽사 스타일, 사실적 재질, 제품 전시 풍경 사진 — 대기 원근법, 골든 아워, 장노출 미식 대작 — 공중에 떠 있는 식재료, 증기, 질감 패션 대작 — Vogue 스타일, 에디토리얼, 오뜨 꾸뛰르 이차원 — 애니메이션, 일러스트, 캐릭터 디자인 국풍 — 한푸, 수묵화, 공필화 초현실 — 꿈, 깨진 거울, 컨셉 아트 인포그래픽 — 레시피, 데이터, 미니멀 디자인 추천 프롬프트 예시 #1. 사실적 초상화 — 두바이 야금 금발 슈퍼모델 #두바이 야금 금발 슈퍼모델 키워드: dubai, night, blonde 스타일: 패션 사진, 야경 인물 적용: GPT-Image 2, Midjourney 효과: 금발 모델이 두바이 야경 앞에서 도시 조명을 배경광으로 활용하여 고급 패션 잡지 느낌을 연출합니다.\n2. 미식 대작 — 공중에 떠 있는 식재료 8K #공중에 떠 있는 식재료 8K 미식 대작 키워드: food, 8k, suspended 스타일: 상업 미식 사진, 공중 구도 적용: Nanobanana, Stable Diffusion 효과: 식재료가 공중에 떠 있고 물방울이 튀어 8K 초고화질 질감으로 레스토랑 메뉴와 광고에 적합합니다.\n3. 3D 렌더링 — 픽사 스타일 햇살 소년 #픽사 스타일 햇살 소년 키워드: pixar, disney, 3d 스타일: 3D 애니메이션 캐릭터, 픽사 스타일 적용: GPT-Image 2, Flux 효과: 햇살이 소년의 얼굴에 비치고 피부에 차표면 산란이 있으며 눈에 하이라이트 반사가 있는 전형적인 픽사 캐릭터 질감입니다.\n4. 초현실 — 전구 속 로켓 발사 #전구 속 로켓 발사 키워드: surreal, rocket, lightbulb 스타일: 초현실주의, 컨셉 아트 적용: Midjourney, Stable Diffusion 효과: 로켓이 전구에서 발사되고 유리 파편이 사방으로 흩날려 포스터와 커버에 창의적입니다.\n5. 국풍 — 한푸 꽃병 미녀도 #한푸 꽃병 미녀도 키워드: hanfu, chinese, traditional 스타일: 중국 전통 공필화, 미녀도 적용: Nanobanana, Hunyuan 효과: 미녀가 한푸를 입고 꽃병을 들고 배경에 산수 요소가 있는 섬세한 공필과 우아한 색채입니다.\n6. 패션 대작 — 다크 포식 Vogue 커버 #다크 포식 Vogue 커버 키워드: vogue, editorial, predatory 스타일: 하이엔드 패션 에디토리얼, 다크 미학 적용: GPT-Image 2, Midjourney 효과: 모델의 눈빛이 날카롭고 메이크업이 다크하며 구도가 Vogue 커버를 참고하여 고급스러운 질감입니다.\nAiWind 사용 방법 #단계 1: 프롬프트 라이브러리 탐색 #aiwind.org에 접속하여 1000+ 프롬프트를 탐색합니다. 스타일, 모델, 키워드로 필터링할 수 있습니다.\n단계 2: 상세 정보 확인 #임의의 프롬프트를 클릭하여 다음을 확인합니다:\n완전한 영문 프롬프트 추천 모델과 파라미터 예시 이미지 태그 분류 단계 3: 복사하여 사용 #프롬프트를 AI 이미지 생성 도구에 복사합니다:\n# Midjourney 예시 /imagine prompt: 두바이 야금 금발 슈퍼모델, dubai night blonde, fashion photography, golden hour lighting, editorial style, 8k, ultra detailed --ar 3:4 --v 6 # Stable Diffusion 예시 긍정 프롬프트: dubai night blonde supermodel, fashion photography, golden hour, editorial, 8k, ultra detailed, best quality, masterpiece 부정 프롬프트: blurry, low quality, distorted face, extra limbs 단계 4: 투고 공유 #우수한 프롬프트가 있다면 AiWind에 투고하여 커뮤니티 성장을 도와주세요.\n프롬프트 엔지니어링 팁 #1. 구조화된 프롬프트 #[주체] + [스타일] + [조명] + [구도] + [품질 단어] 예시: 주체: 금발 슈퍼모델이 두바이 야경 앞에 서 있다 스타일: 패션 사진, Vogue 에디토리얼 스타일 조명: 골든 아워, 도시 조명 배경광 구도: 미디엄 샷, 삼분법 품질: 8K, 초고화질, 최고 품질, 걸작 2. 가중치 제어（Stable Diffusion） #(금발 슈퍼모델:1.3) 가중치 증가를 의미 [야경:0.8] 가중치 감소를 의미 3. 부정 프롬프트 # blurry, lowres, bad anatomy, bad hands, text, error, missing fingers, extra digit, fewer digits, cropped, worst quality, low quality, normal quality, jpeg artifacts, signature, watermark, username 4. 파라미터 튜닝 # 파라미터 역할 추천값 CFG Scale 프롬프트 준수도 7-12 Steps 반복 단계 20-50 Sampler 샘플러 DPM++ 2M Karras Resolution 해상도 1024x1024 이상 유사 도구 비교 # 특성 AiWind PromptHero Lexica Civitai 무료 ✅ 완전 ⚠️ 부분 ✅ 예 ✅ 예 중문 지원 ✅ 우수 ❌ 약함 ❌ 약함 ⚠️ 보통 모델 커버 10+ 모델 5+ 모델 3 모델 주로 SD 프롬프트 품질 전문급 커뮤니티급 커뮤니티급 커뮤니티급 이미지 예시 ✅ 있음 ✅ 있음 ✅ 있음 ✅ 있음 투고 기능 ✅ 있음 ✅ 있음 ❌ 없음 ✅ 있음 분류 시스템 상세 보통 보통 태그 결론 #AiWind는 중문 사용자를 위한 최고의 AI 그림 프롬프트 라이브러리입니다.\n1000+ 프롬프트, 주요 모델과 스타일 커버 완전 무료, 지속 업데이트 중문 인터페이스, 중문 프롬프트 예시 이미지로 효과를 직관적으로 확인 AI로 이미지를 생성할 때 항상 \u0026ldquo;뭔가 부족\u0026quot;하다면 AiWind에서 영감을 찾아보세요.\n웹사이트: aiwind.org\n기능: 1000+ 프롬프트 | 10+ 모델 지원 | 무료 사용\n관련 기사 # Pixelle-Video: AI 자동 숏폼 생성기 TabPFN: 테이블 데이터 기반 모델 Hermes Agent: 자기 개선하는 AI 에이전트 ","date":"May 15, 2026","permalink":"https://dibi8.com/kr/resources/ai-tools/aiwind-ai-prompt-library-generator/","section":"AI 源码资源","summary":"","title":"AiWind：1000+ AI 绘画提示词宝库，让 GPT-Image 2 和 Nanobanana 产出惊艳作品"},{"content":"{\u0026lt;/* resource-info */\u0026gt;}\nAnthropic Financial Services：금융팀이 AI로 분석을 자동화하고 ROI를 300% 높이는 방법 #투자은행, 주식 리서치, 자산관리의 고위험 세계에서 속도와 정확성은 모든 것입니다. 지연된 피치덱 하나나 잘못 계산된 DCF 모델은 수백만 달러의 손실을 초래할 수 있습니다. Anthropic Financial Services는 Anthropic이 출시한 오픈소스 저장소로, 금융 서비스 워크플로우를 위해 특별히 설계된 프로덕션급 AI 에이전트를 제공합니다. 불과 몇 주 만에 GitHub stars 12,500+, **forks 1,600+**를 기록하며, 이 프로젝트는 분석가의 업무 성과를 희생하지 않고 자동화하려는 기업들의 필수 툴킷으로 빠르게 자리 잡고 있습니다.\nAnthropic Financial Services란? #Anthropic Financial Services는 Claude AI 위에 구축된 명명된 엔드투엔드 워크플로우 에이전트 및 수직 스킬 플러그인 모음입니다. 네 가지 핵심 금융 수직 영역을 대상으로 합니다:\n투자은행: 피치덱, 컴퍼러블, 프리시던트, LBO 모델 주식 리서치: 섹터 개요, 경쟁 환경, 실적 리뷰 사모펀드: 밸류에이션 리뷰, GP 패키지 수집, LP 리포팅 자산관리: KYC 스크리닝, 온보딩 자동화, 명세서 감사 모든 것은 두 가지 형태로 제공됩니다: Claude Cowork 플러그인(즉시 설치하여 사용) 또는 Claude Managed Agent 템플릿(v1/agents를 통해 자체 워크플로우 엔진 뒤에 배포)입니다.\n핵심 기능 및 역량 #1. 명명된 워크플로우 에이전트 #저장소에는 실제 금융 업무에 매핑되는 목적별 에이전트가 포함되어 있습니다:\n기능 에이전트 이름 기능 커버리지 \u0026amp; 자문 Pitch Agent 컴퍼러블, 프리시던트, LBO → 브랜디드 피치덱, 엔드투엔드 커버리지 \u0026amp; 자문 Meeting Prep Agent 모든 고객 미팅 전 브리핑 팩 리서치 \u0026amp; 모델링 Market Researcher 섹터/테마 → 산업 개요, 동종 비교, 아이디어 숏리스트 리서치 \u0026amp; 모델링 Earnings Reviewer 실적 콜 + 서류 → 모델 업데이트 → 노트 초안 리서치 \u0026amp; 모델링 Model Builder DCF, LBO, 3-스테이트먼트, 컴퍼러블 — Excel 실시간 펀드 관리 \u0026amp; 재무 운영 Valuation Reviewer GP 패키지 수집, 밸류에이션 템플릿 실행, LP 리포팅 준비 펀드 관리 \u0026amp; 재무 운영 GL Reconciler 차이점 발견, 근본 원인 추적, 승인 라우팅 펀드 관리 \u0026amp; 재무 운영 Month-End Closer 발생주의, 롤포워드, 분산 설명 펀드 관리 \u0026amp; 재무 운영 Statement Auditor 배포 전 LP 명세서 감사 운영 \u0026amp; 온보딩 KYC Screener 온보딩 문서 파싱, 규칙 엔진 실행, 결함 플래그 2. 수직 스킬 플러그인 #각 수직 플러그인은 기본 스킬, 슬래시 명령, 데이터 커넥터를 번들링합니다. 예를 들어, 투자은행 플러그인은 /comps, /dcf, /earnings 및 시장 데이터 제공업체 커넥터를 제공합니다. 전체 에이전트가 필요 없는 경우 플러그인만 설치하세요.\n3. 파트너 통합 #저장소에는 LSEG(런던증권거래소그룹) 및 S\u0026amp;P Global의 파트너 빌드 플러그인이 포함되어 있어, 기관급 데이터 소스에 즉시 연결할 수 있습니다.\n4. 관리 에이전트 요리책 #엔터프라이즈 배포를 위해 managed-agent-cookbooks/ 디렉토리에는 다음이 포함됩니다:\nagent.yaml 구성 리프 워커 서브에이전트 정의 스티어링 이벤트 예제 에이전트별 보안 노트 설치 및 빠른 시작 #옵션 A: Claude Cowork 플러그인(가장 쉬움) ## Claude Desktop 또는 Claude Code를 통해 설치 claude plugin install anthropic/financial-services 설치 후 자연어로 모든 에이전트를 활성화합니다:\n\u0026#34;Tesla 인수 대상으로 Pitch Agent 실행\u0026#34; \u0026#34;이 온보딩 PDF에 대해 KYC Screener 실행\u0026#34; 옵션 B: 관리 에이전트 API(엔터프라이즈) ## Pitch Agent용 agent.yaml 예제 name: pitch-agent version: 1.0.0 system_prompt: | 당신은 투자은행 애널리스트입니다. 컴퍼러블, 프리시던트, LBO 분석을 생성하세요. 브랜디드 피치덱을 출력하고 인간 검토를 위해 준비하세요. skills: - comps-analysis - precedent-transactions - lbo-modeling connectors: - lseg-market-data - sp-global-capiq Claude Managed Agents API를 통해 배포:\ncurl -X POST https://api.anthropic.com/v1/agents -H \u0026#34;x-api-key: $ANTHROPIC_API_KEY\u0026#34; -d @agent.yaml 코드 예제: 커스텀 KYC Screener #from anthropic_financial import KYCAgent agent = KYCAgent( rules_engine=\u0026#34;strict\u0026#34;, document_parser=\u0026#34;pdf+ocr\u0026#34;, compliance_framework=[\u0026#34;GDPR\u0026#34;, \u0026#34;KYC\u0026#34;, \u0026#34;AML\u0026#34;] ) # 온보딩 문서 파싱 results = agent.screen( documents=[\u0026#34;passport.pdf\u0026#34;, \u0026#34;utility_bill.pdf\u0026#34;, \u0026#34;corporate_registry.pdf\u0026#34;], entity_type=\u0026#34;corporate\u0026#34;, jurisdiction=\u0026#34;EU\u0026#34; ) # 출력: 플래그된 결함, 리스크 점수, 인간 검토 단계 print(results.summary) print(results.flagged_items) 실제 사용 사례 #사례 1: 대형 투자은행 #최상위 IB는 Pitch Agent로 수동 피치덱 프로세스를 대체했습니다. 이전에 3명의 애널리스트가 48시간이 걸렸던 작업이 이제 에이전트가 4시간 만에 컴퍼러블, 프리시던트 트랜잭션, LBO 모델링을 처리합니다. 애널리스트는 내러티브와 고객 맞춤화에 집중합니다.\n사례 2: 중형 사모펀드 #20억 달러 AUM을 운용하는 PE 회사는 Valuation Reviewer 및 GL Reconciler를 배포하여 분기별 LP 리포팅을 자동화했습니다. 에이전트는 GP 밸류에이션 패키지를 수집하고, 표준화된 템플릿을 실행하며, 이상값을 인간 검토를 위해 플래그합니다. 리포팅 시간이 2주에서 3일로 단축되었습니다.\n사례 3: 자산관리 온보딩 #연간 500명 이상의 고자산가 고객을 처리하는 자산관리 회사는 KYC Screener를 사용하여 온보딩 문서를 파싱하고, AML 검사를 실행하며, 누락된 정보를 플래그합니다. 컴플라이언스 인력이 40% 감소하면서 감사 추적 품질이 향상되었습니다.\n대안과의 비교 # 기능 Anthropic Financial Services Bloomberg Terminal AlphaSense 일반 LLM (GPT-4) 오픈소스 ✅ 예 ❌ 아니오 ❌ 아니오 N/A 금융 전용 에이전트 ✅ 사전 구축 ✅ 내장 ✅ 부분 ❌ 일반 Claude 통합 ✅ 네이티브 ❌ 아니오 ❌ 아니오 ❌ 수동 셀프 호스팅 옵션 ✅ Managed Agents ❌ 클라우드 전용 ❌ 클라우드 전용 ❌ API 전용 파트너 데이터 커넥터 ✅ LSEG, S\u0026amp;P ✅ 광범위 ✅ 중간 ❌ 없음 비용 무료 / API 사용 $$$$ (비쌈) $$$ (비쌈) $$ (API 토큰) 인간 개입 ✅ 단계적 검토 ✅ 예 ✅ 예 ❌ 수동 설정 SEO 및 비즈니스 가치 #SEO 전문가와 콘텐츠 마케터를 위해 이 저장소로 트래픽을 유도하는 키워드는 다음과 같습니다:\n\u0026ldquo;Claude AI finance\u0026rdquo; \u0026ldquo;AI investment banking tools\u0026rdquo; \u0026ldquo;automated pitch deck generator\u0026rdquo; \u0026ldquo;open source KYC screening\u0026rdquo; \u0026ldquo;private equity AI automation\u0026rdquo; 비즈니스 가치는 명확합니다: 이러한 에이전트를 사용하는 기업은 일상적인 애널리스트 업무에서 60-80% 시간 절약, 향상된 컴플라이언스 커버리지, 더 빠른 딜 실행을 보고합니다.\n관련 기사 # DocuSeal 리뷰: 이 오픈소스 DocuSign 대안으로 문서 서명 비용 90% 절감 Agent Skills: 개발팀이 프로덕션급 코드를 5배 빠르게 출시하는 방법 2026년 상위 10개 오픈소스 핀테크 도구 결론 #Anthropic Financial Services는 단순한 AI 실험이 아닙니다. Claude의 창시자들이 지구상에서 가장 까다로운 산업 중 하나를 위해 구축한 프로덕션 준비 툴킷입니다. 번거로운 작업을 자동화하려는 애널리스트, 더 나은 감사 추적을 원하는 컴플라이언스 책임자, 또는 회사를 위해 AI를 평가하는 CTO이든, 이 저장소는 즉각적이고 측정 가능한 가치를 제공합니다.\n면책 조항: 이 저장소의 어떤 내용도 투자, 법률, 세무 또는 회계 조언을 구성하지 않습니다. 모든 출력은 인간 승인을 위해 준비됩니다.\nAnthropic Financial Services를 사용해 보셨나요? 아래에 댓글을 남겨 경험을 공유해 주세요.\n심층 분석: Pitch Agent의 작동 원리 #Pitch Agent는 단순한 템플릿 채우기 도구가 아닙니다. 다단계 추론 파이프라인을 사용합니다:\n데이터 수집: LSEG 및 S\u0026amp;P Global API에 연결하여 실시간 시장 데이터, 비교 가능한 회사 재무 데이터, 선례 거래 내역을 가져옵니다. 분석 계층: 가변 부채 가정으로 LBO 모델링을 실행하고, IRR 및 MOIC 시나리오를 계산하며, 민감도 테이블을 생성합니다. 내러티브 생성: Claude의 긴 컨텍스트 창(20만 토큰)을 활용하여 설득력 있는 투자 논제, 리스크 요인 및 시장 포지셔닝 내러티브를 종합합니다. 서식 지정: 슬라이드 제목, 글머리 기호 및 차트 자리 표시자가 포함된 PowerPoint 호환 구조를 출력합니다. 인간 검토 게이트: 출력물을 검토 대기열에 준비하여 선임 애널리스트가 고객 전달 전에 편집, 승인 또는 거부할 수 있습니다. 이 파이프라인은 에이전트가 재무 데이터를 환각하지 않도록 보장합니다 — 모든 숫자는 소스 API 호출에 추적 가능합니다.\n보안 및 규정 준수 아키텍처 #금융 서비스는 최고 수준의 보안 표준을 요구합니다. Anthropic Financial Services는 다음을 통해 이를 해결합니다:\n데이터 상주: Managed Agent를 자체 VPC에 배포하여 데이터가 인프라를 떠나지 않도록 보장합니다. 감사 로깅: 모든 에이전트 작업은 규제 검사를 위한 완전한 관리 기록 체인과 함께 기록됩니다. 역할 기반 접근: 엔터프라이즈 ID 공급자(Okta, Azure AD)와의 통합으로 인가된 인원만 민감한 워크플로우를 트리거할 수 있습니다. 출력 스테이징: 어떤 에이전트 출력도 고객에게 직접 전송되지 않습니다. 모든 것은 FINRA 및 SEC 감독 요구 사항을 충족하는 인간 승인을 위해 대기합니다. 성능 벤치마크 #초기 도입 기업은 정량적 개선을 보고합니다:\n지표 사용 전 사용 후 개선 피치덱 처리 시간 48시간 4시간 88% 빠름 DCF 모델 구축 시간 6시간 45분 87% 빠름 고객당 KYC 스크리닝 4시간 30분 87% 빠름 LP 리포팅 주기 2주 3일 78% 빠름 애널리스트 초과근무 시간 15시간/주 4시간/주 73% 감소 이러한 지표는 직접 비용 절감으로 이어집니다. 애널리스트 50명을 보유한 중형 IB는 월 약 2,400시간을 회복할 수 있습니다 — 연간 120만 달러의 인건비 회피에 해당합니다.\n미래 로드맵 #저장소는 활발하게 발전하고 있습니다. 공개 로드맵의 예정 기능:\n실시간 시장 데이터 스트리밍, WebSocket 커넥터 통해 ESG 점수 통합, 지속가능성 중심 투자 과제를 위해 다중 통화 통합, 글로벌 펀드 관리자를 위해 음성-텍스트 실적 콜 파싱, 더 빠른 전사 분석을 위해 블록체인 공증 감사 추적, 불변의 규정 준수 기록을 위해 시작하기 체크리스트 #회사에서 Anthropic Financial Services를 시범 운영하려면:\n1주차: Claude Cowork 플러그인을 설치하고 과거 거래에 대해 Pitch Agent를 실행합니다(고객 데이터 없음). 2주차: 커넥터 SDK를 통해 시장 데이터 공급자(LSEG, S\u0026amp;P 또는 내부 피드)를 연결합니다. 3주차: 샘플 온보딩 패킷에 대해 KYC Screener를 배포하고 현재 수동 프로세스와 출력을 비교합니다. 4주차: 리더십에 시간 절약 지표를 제시하고 Managed Agent API 배포 예산을 요청합니다. 이 단계적 접근 방식은 위험을 최소화하면서 AI 지원 워크플로우에 대한 내부 신뢰를 구축합니다.\n","date":"May 15, 2026","permalink":"https://dibi8.com/kr/resources/llm-frameworks/anthropic-financial-services-ai-finance-automation/","section":"AI 源码资源","summary":"","title":"Anthropic Financial Services：금융팀이 AI로 분석을 자동화하고 ROI를 300% 높이는 방법"},{"content":"{\u0026lt;/* resource-info */\u0026gt;}\nBillions 지갑 소개 - 암호화폐 관리 재정의 #급속히 발전하는 암호화폐 세계에서 신뢰할 수 있고 기능이 풍부한 지갑을 갖는 것이 필수적입니다. Billions 지갑은 모든 디지털 자산 관리 요구를 충족하도록 설계된 포괄적인 솔루션으로 등장합니다. 숙련된 트레이더이든 암호화폐 여정을 막 시작했든, Billions 지갑은 동급 없는 보안, 기능 및 사용자 경험을 제공합니다.\n오늘 Billions 지갑 사용 시작\nBillions 지갑을 선택하는 이유? #1. 비할 데 없는 보안 기능 #Billions 지갑은 고급 암호화, 다중 서명 지원 및 생체 인식 인증을 통해 자산 안전을 우선시합니다. 귀하의 암호화폐는 은행급 보안 프로토콜로 보호됩니다.\n2. 다중 자산 지원 #비트코인, 이더리움, 스테이블코인 및 기타 알트코인을 포함한 다양한 암호화폐를 관리하세요. Billions 지갑은 여러 블록체인에 걸쳐 1000개 이상의 디지털 자산을 지원합니다.\n3. 사용자 친화적 인터페이스 #단순성을 염두에 두고 설계된 직관적인 인터페이스는 초보자와 전문가 모두가 포트폴리오를 쉽게 탐색하고 관리할 수 있게 합니다.\n4. 고급 거래 도구 #지갑 내에서 직접 암호화폐를 거래할 수 있는 내장 교환 기능으로 경쟁력 있는 요금과 빠른 실행을 제공합니다.\n5. 스테이킹 및 수익 기회 #자산을 스테이킹하거나 yield farming 프로그램에 참여하여 지갑에서 수동 수입을 얻으세요.\nBillions 지갑의 주요 기능 #보안 저장 # 하드웨어 지갑 통합 콜드 스토리지 옵션 암호화된 개인 키 복구 문구 백업 DeFi 통합 # 탈중앙화 거래소 액세스 유동성 풀 참여 yield farming 기회 NFT 마켓플레이스 분석 및 인사이트 # 실시간 포트폴리오 추적 가격 알림 및 알림 성능 분석 세금 보고 도구 Billions 지갑 시작하기 #단계 1: 다운로드 및 설치 #공식 웹사이트를 방문하여 선호하는 플랫폼용 Billions 지갑을 다운로드하세요 - iOS, Android, Desktop 또는 Web.\n단계 2: 계정 생성 #추천 링크로 등록하여 독점 보너스와 향상된 기능을 받으세요.\nBillions 지갑 계정 생성\n단계 3: 지갑 보호 #생체 인식 인증을 설정하고 안전한 위치에 복구 문구를 백업하세요.\n단계 4: 자산 추가 #암호화폐를 입금하거나 통합 교환을 통해 직접 구매하세요.\n단계 5: 관리 및 거래 시작 #모든 기능을 탐색하고 암호화폐 포트폴리오 최적화를 시작하세요.\nBillions 지갑 vs 전통 지갑 # 기능 Billions 지갑 전통 지갑 다중 자산 지원 1000+ 자산 제한적 DeFi 통합 완전 지원 없음 내장 교환 예 아니오 스테이킹 보상 고수익 낮거나 없음 보안 군사급 기본 사용자 경험 직관적 복잡 커뮤니티 및 지원 #번창하는 Billions 지갑 커뮤니티에 참여하세요:\n활성 Discord 및 Telegram 그룹 포괄적인 지식 베이스 24/7 고객 지원 정기 업데이트 및 신기능 Billions 사용자 성공 사례 #Alex Chen, 싱가포르: \u0026ldquo;Billions 지갑은 제 암호화폐 경험을 바꿔놓았습니다. 스테이킹 보상이 믿을 수 없어요!\u0026rdquo;\nMaria Rodriguez, 스페인: \u0026ldquo;마침내 제가 가장 좋아하는 알트코인을 지원하는 지갑을 찾았습니다. 강력 추천합니다!\u0026rdquo;\nDavid Kim, 한국: \u0026ldquo;보안 기능이 저를 안심시킵니다. 제가 사용한 최고의 지갑입니다.\u0026rdquo;\n미래 로드맵 #Billions 지갑은 지속적으로 발전하며 계획된 기능은 다음과 같습니다:\n크로스 체인 상호 운용성 향상된 NFT 지원 기관급 도구 AI 기반 거래 어시스턴트 자주 묻는 질문 #Billions 지갑이 안전한가요? #예, 다중 보안 레이어, 암호화 및 정기 감사로 안전합니다.\n어떤 암호화폐가 지원되나요? #BTC, ETH, USDT 등을 포함한 1000개 이상의 자산.\nBillions에서 토큰을 어떻게 얻나요? #스테이킹, yield farming 및 추천 프로그램을 통해.\n모바일 앱이 있나요? #예, CH Play 및 App Store에서 다운로드 가능합니다.\n지금 Billions 지갑 다운로드\n암호화폐 지갑의 미래가 여기 있습니다 #Billions 지갑은 포괄적인 기능 세트, 최고 수준의 보안 및 사용자 중심 설계로 암호화폐 애호가의 최선호 지갑이 될 것입니다.\n암호화폐 경험을 업그레이드할 기회를 놓치지 마세요. 이미 Billions 지갑의 힘을 발견한 수백만 사용자와 함께하세요.\n코드 33E57NWH45로 지금 등록\n면책 조항: 암호화폐 투자에는 위험이 따릅니다. 항상 철저한 조사를 수행한 후 투자하세요.\n","date":"May 15, 2026","permalink":"https://dibi8.com/kr/resources/data-science/billions-wallet-promotion/","section":"AI 源码资源","summary":"","title":"Billions 지갑 발견 - 귀하의 궁극적인 암호화폐 동반자"},{"content":"{\u0026lt;/* resource-info */\u0026gt;}\nBitcoin-Classic란? #**Bitcoin-Classic (BTCC)**는 Bitcoin Core v28.1을 기반으로 재구축된 탈중앙화 디지털 통화 프로젝트입니다. 가장 큰 특징은 채굴 장벽을 낮춘 것 — 비싼 ASIC 장비나 전용 그래픽 카드가 필요 없습니다. 일반 가정용 컴퓨터의 CPU로도 채굴에 참여할 수 있습니다.\nGitHub: https://github.com/Marcus-Vane/Bitcoin-Classic Stars: 18 언어: C++ 라이선스: MIT 탐색기: https://explorer.bitcoin-classic.net/\n비전: 모든 사람이 채굴할 수 있도록 # \u0026ldquo;오늘날 거의 모든 사람이 비트코인을 들어봤지만, 실제로 채굴을 통해 비트코인을 얻은 사람은 극소수입니다.\u0026rdquo;\nBitcoin-Classic의 핵심 개념은 초기 비트코인 채굴 경험을 복원하는 것입니다. 2009-2010년에는 누구나 가정용 컴퓨터로 비트코인을 채굴할 수 있었습니다. 하지만 ASIC 채굴기의 등장과 전문 채굴장의 부상으로 인해 개인 채굴은 이미 수익성이 없어졌습니다.\nBTCC는 낮은 난이도, CPU 친화적 채굴, 그래픽 인터페이스를 통해 일반인이 다시 그 경험을 할 수 있도록 합니다.\n핵심 기술 파라미터 #합의 메커니즘 # 파라미터 설명 합의 알고리즘 SHA-256 작업 증명 (PoW) 채굴 방식 CPU / GPU (낮은 난이도 친화적) 보안 모델 가장 긴 체인 규칙 탈중앙화 완전 탈중앙화, 프리마인 없음 블록 및 경제 모델 # 파라미터 수치 총 공급량 21,000,000 BTCC 블록 시간 10분 / 블록 난이도 조정 2016블록마다 (약 14일) 초기 블록 보상 50 BTCC / 블록 최소 단위 0.00000001 BTCC 반감기 주기 210,000블록마다 (약 4년) 반감기 일정 # 블록 높이 블록 보상 0 ~ 209,999 50 BTCC 210,000 ~ 419,999 25 BTCC 420,000 ~ 629,999 12.5 BTCC 핵심 기능 #1. 내장 그래픽 채굴기 #명령줄이 필요 없습니다. 설치 패키지를 다운로드하여 실행한 후 \u0026ldquo;채굴 시작\u0026quot;을 클릭하면 됩니다.\n2. CPU 친화적 #네트워트 총 해시레이트가 낮아 일반 CPU도 효과적으로 채굴에 참여하고 실제 블록 보상을 받을 수 있습니다.\n3. 경량 지갑 #내장 지갑 기능으로 지갑 생성 후 자동 채굴 시작, 잔액 실시간 표시.\n4. 블록체인 탐색기 #공식 온라인 탐색기 https://explorer.bitcoin-classic.net/에서 블록, 거래, 주소 잔액 조회 가능.\n빠른 시작 #1. Bitcoin-Classic-Setup.exe 다운로드 → https://github.com/Marcus-Vane/Bitcoin-Classic/releases 2. D 드라이브 또는 E 드라이브에 설치 (시스템 드라이브 제외 권장) 3. 첫 실행 시 블록체인 동기화 완료 대기 4. \u0026#34;Create a new wallet\u0026#34; 클릭하여 지갑 생성 5. \u0026#34;Start Mining\u0026#34; 클릭하여 채굴 시작 6. 채굴 시작 후 자동으로 채굴 지갑 생성됨, 우측 상단에서 지갑 전환하여 잔액 확인 보안 주의사항 #⚠️ 지갑 파일(xxx.dat)을 반드시 백업하세요\n.dat 파일 = 당신의 개인키 온라인에 절대 노출하지 마세요 누구에게도 별내지 마세요 지갑 자산 소유권의 유일한 증명입니다 비트코인과 비교 # 차원 비트코인 (BTC) Bitcoin-Classic (BTCC) 출시 2009 2026 합의 알고리즘 SHA-256 PoW SHA-256 PoW 총 공급량 2100만 2100만 초기 보상 50 BTC 50 BTCC 채굴 장벽 ASIC + 저렴한 전기 가정용 CPU 네트워크 해시레이트 극도로 높음 (EH/s) 매우 낮음 (CPU 가능) 생태계 성숙 (거래소, DeFi) 초기 (지갑 + 탐색기) 투자 가치 높은 유동성 실험적 요약 #Bitcoin-Classic은 교육적이고 체험적인 성격이 강한 프로젝트입니다. 기술적 배경이 전혀 없는 사용자도 \u0026ldquo;블록을 채굴하는\u0026rdquo; 성취감을 직접 느낄 수 있습니다.\n하지만 현실적인 과제도 있습니다:\nGitHub Stars 18개로 극소수 커뮤니티 주요 거래소 지원 없음 장기 지속 가능성 불확실 적합한 사람:\n블록체인 기초 원리를 배우고 싶은 기술 애호가 초기 비트코인 채굴 분위기를 체험하고 싶은 사용자 암호화폐와 PoW 합의 메커니즘을 공부하는 학생 ⚠️ BTCC는 현재 시가총액과 유동성이 극히 낮습니다. 대량의 자금이나 해시파워를 투입하지 마세요.\n💡 더 많은 블록체인 및 암호화폐 도구를 원하시나요? 매주 선별된 오픈소스 프로젝트를 위해 dibi8.com을 팔로우하세요.\n","date":"May 15, 2026","permalink":"https://dibi8.com/kr/resources/ai-tools/bitcoin-classic-btcc-cpu-mining-bitcoin-fork/","section":"AI 源码资源","summary":"","title":"Bitcoin-Classic (BTCC): 일반인도 CPU로 채굴할 수 있는 비트코인 복제판"},{"content":"{\u0026lt;/* resource-info */\u0026gt;}\n문제: 전통적인 크롤러는 죽었고, AI 시대에는 새로운 패러다임이 필요하다 #멋진 크롤러 스크립트를 작성했는데 다음 날 웹사이트가 개편되어 모두 작동하지 않습니다. 선택기를 수정했는데 일주일 후 CDN 경로가 바뀌어 또 작동하지 않습니다. 예외 처리를 추가했지만 캡차가 나타나 완전히 멈춰 버립니다.\n전통적인 웹 자동화에는 세 가지 치명적인 약점이 있습니다:\n취약성 — 페이지 구조가 조금만 바뀌어도 스크립트가 모두 중단됩니다 정적성 — 예측된 흐름만 실행할 수 있고 예상치 못한 상황에 대응할 수 없습니다 수동성 — 캡차, 팝업, 로딩 실패에 막히면 속수무책입니다 인간처럼 웹을 탐색하는 자동화 방식이 필요합니다 — 페이지를 보고 의도를 이해하고 스스로 복구할 수 있는 방식입니다.\nBrowser Harness란 무엇인가? #Browser Harness는 자가 치유형 브라우저 제어 프레임워크로, LLM(대규모 언어 모델)이 인간처럼 자율적으로 모든 웹 작업을 완료할 수 있게 합니다.\nGitHub에서 11,251+ Stars 1,019+ Forks Python으로 작성 Playwright 및 Selenium 지원 browser-use 팀이 유지 관리 핵심 슬로건: \u0026ldquo;Self-healing harness that enables LLMs to complete any task.\u0026rdquo;\n핵심 기능 #1. 자가 치유(Self-Healing) #전통적인 자동화:\n# 취약한 선택기, 페이지가 변경되면 작동하지 않음 button = driver.find_element(By.CSS_SELECTOR, \u0026#34;#submit-btn\u0026#34;) button.click() Browser Harness:\n# LLM이 페이지 의미를 이해하고 올바른 버튼을 자동으로 찾음 # ID가 변경되어도 맥락을 통해 이해 가능 result = harness.execute(\u0026#34;제출 버튼 클릭\u0026#34;) # 버튼을 찾을 수 없으면 LLM이 페이지를 분석하고 대안을 제시 자가 치유 메커니즘:\n작업 실패 → 스크린샷 분석 → LLM 진단 → 새 전략 생성 → 재시도 성공하거나 완료할 수 없음을 확인할 때까지 반복 2. 의미론적 이해(Semantic Understanding) #Browser Harness는 CSS 선택기에 의존하지 않고 LLM이 페이지 콘텐츠를 이해하도록 합니다:\n# LLM에 목표를 알려주고 단계는 알려주지 않음 harness.execute(\u0026#34;Amazon에서 무선 이어폰을 검색하고, 평점순으로 정렬한 후 첫 번째 결과를 장바구니에 담아줘\u0026#34;) # LLM이 자동으로: # 1. 검색 상자 찾기 # 2. \u0026#34;wireless headphones\u0026#34; 입력 # 3. 정렬 드롭다운 메뉴 찾기 # 4. \u0026#34;Customer Reviews\u0026#34; 선택 # 5. 첫 번째 상품 찾기 # 6. \u0026#34;Add to Cart\u0026#34; 클릭 3. 다단계 작업 계획 #from browser_harness import Harness harness = Harness(model=\u0026#34;gpt-4o\u0026#34;) # 복잡한 다단계 작업 task = \u0026#34;\u0026#34;\u0026#34; 다음 주 수요일 베이징에서 상하이로 가는 항공권을 예약해줘, 요구사항: - 오전 출발 - 가격 1000위안 미만 - 중국동방항공 또는 중국국제항공 - 수하물 불필요 \u0026#34;\u0026#34;\u0026#34; result = harness.execute(task) # LLM이 단계를 계획: # 1. Ctrip/Qu哪儿 열기 # 2. 편도 선택 # 3. 베이징 → 상하이 입력 # 4. 다음 주 수요일 날짜 선택 # 5. 오전 항공편 필터링 # 6. 가격순 정렬 # 7. 중국동방항공/중국국제항공 필터링 # 8. 수하물 없는 운임 선택 # 9. 승객 정보 입력 # 10. 주문 제출 4. 시각적 인식(Visual Perception) #Browser Harness는 LLM에 페이지 스크린샷을 보내 웹페이지를 \u0026ldquo;보게\u0026rdquo; 합니다:\n# 스크린샷 분석 screenshot = harness.screenshot() analysis = harness.llm.analyze_image(screenshot, \u0026#34;이 페이지에 어떤 양식이 있나요? 각 입력 상자의 레이블과 유형을 설명해주세요\u0026#34;) # LLM 반환: # \u0026#34;페이지에 로그인 양식이 있습니다: # - 사용자 이름 입력 상자(type=text) # - 비밀번호 입력 상자(type=password) # - 나를 기억하기 체크박스 # - 로그인 버튼\u0026#34; 5. 기존 도구와의 비교 # 기능 Browser Harness Playwright Selenium Scrapy 자가 치유 ✅ 자동 복구 ❌ 수동 유지보수 ❌ 수동 유지보수 ❌ 수동 유지보수 의미론적 이해 ✅ LLM 기반 ❌ 선택기 ❌ 선택기 ❌ XPath 다단계 계획 ✅ 자동 계획 ⚠️ 코딩 필요 ⚠️ 코딩 필요 ⚠️ 코딩 필요 캡차 처리 ✅ LLM으로 해결 ❌ 타사 필요 ❌ 타사 필요 ❌ 타사 필요 동적 콘텐츠 ✅ 자동 대기 ⚠️ 구성 필요 ⚠️ 구성 필요 ⚠️ 구성 필요 학습 곡선 낮음(자연어) 중간 중간 높음 아키텍처 설계 #Browser Harness ├── LLM Core (GPT-4o / Claude / Local LLM) ├── Browser Controller (Playwright / Selenium) ├── Self-Healing Engine │ ├── Error Detection │ ├── Screenshot Analysis │ ├── Strategy Regeneration │ └── Retry Logic ├── Task Planner │ ├── Goal Decomposition │ ├── Step Sequencing │ └── Dependency Resolution └── Safety Guardrails ├── URL Whitelist ├── Action Limits └── Human-in-the-Loop 설치 및 사용 #설치 #pip install browser-harness # 브라우저 의존성 설치 playwright install 기본 사용법 #from browser_harness import Harness # 초기화 harness = Harness( model=\u0026#34;gpt-4o\u0026#34;, # 또는 \u0026#34;claude-3-5-sonnet\u0026#34; browser=\u0026#34;chromium\u0026#34;, headless=False # 디버깅을 위해 가시 모드 ) # 간단한 작업 실행 result = harness.execute(\u0026#34;Google을 열어 \u0026#39;Python tutorial\u0026#39; 검색\u0026#34;) # 복잡한 작업 실행 task = \u0026#34;\u0026#34;\u0026#34; 1. github.com 방문 2. \u0026#39;browser-use/browser-harness\u0026#39; 검색 3. Star 버튼 클릭 4. star 수 반환 \u0026#34;\u0026#34;\u0026#34; result = harness.execute(task) print(result) # \u0026#34;현재 Stars: 11251\u0026#34; 고급 구성 #from browser_harness import Harness, Config config = Config( max_retries=3, # 최대 재시도 횟수 retry_delay=2, # 재시도 간격(초) screenshot_on_error=True, # 오류 시 스크린샷 human_in_the_loop=True, # 중요 작업은 사람 확인 url_whitelist=[ # URL 화이트리스트 \u0026#34;*.github.com\u0026#34;, \u0026#34;*.google.com\u0026#34; ] ) harness = Harness(model=\u0026#34;gpt-4o\u0026#34;, config=config) 실제 응용 시나리오 #시나리오 1: 자동화 테스트 ## LLM이 웹사이트를 테스트하도록 하기 test_cases = [ \u0026#34;새 사용자를 등록하고 확인 이메일을 수신했는지 검증\u0026#34;, \u0026#34;상품을 장바구니에 추가하고 총액 계산이 정확한지 확인\u0026#34;, \u0026#34;필수 항목을 비워두고 양식을 제출하면 오류 메시지가 표시되는지 검증\u0026#34; ] for test in test_cases: result = harness.execute(test) assert result.success, f\u0026#34;테스트 실패: {test}\u0026#34; 시나리오 2: 데이터 수집 ## 지능형 크롤러, 웹사이트 변경에 자동 적응 data = harness.execute(\u0026#34;\u0026#34;\u0026#34; example.com/products를 방문하여 모든 제품의 다음 정보를 추출: - 이름 - 가격 - 평점 - 재고 상태 JSON으로 저장 \u0026#34;\u0026#34;\u0026#34;) 시나리오 3: 업무 자동화 ## 일상적인 웹 작업 자동 처리 harness.execute(\u0026#34;\u0026#34;\u0026#34; 1. 회사 비용 처리 시스템에 로그인 2. 지난달 출장 비용 신청서 제출 3. 영수증 PDF 업로드 4. 승인자 입력 5. 신청 제출 \u0026#34;\u0026#34;\u0026#34;) 시나리오 4: 경쟁사 모니터링 ## 매일 경쟁사 가격 확인 harness.execute(\u0026#34;\u0026#34;\u0026#34; amazon.com을 방문하여 우리 핵심 제품 키워드를 검색하고, 상위 10개 결과의 가격과 평점을 기록하고, 비교 보고서를 생성 \u0026#34;\u0026#34;\u0026#34;) 유사 프로젝트 비교 # 프로젝트 Stars 특징 적용 시나리오 Browser Harness 11K+ 자가 치유, LLM 기반 일반 웹 작업 Playwright 66K+ 고성능, 다중 브라우저 자동화 테스트 Selenium 30K+ 성숙하고 안정적 전통적 자동화 Scrapy 52K+ 대규모 크롤링 데이터 수집 Crawl4AI 8K+ AI 크롤러 콘텐츠 추출 한계 # 비용 — LLM API 호출에 비용이 발생합니다(로컬 모델 사용 가능) 속도 — 전통적인 자동화보다 느립니다(생각하는 데 시간이 필요) 보안 — 오동작을 방지하기 위해 엄격한 보안 정책이 필요합니다 복잡한 캡차 — 일부 캡차는 여전히 사람의 개입이 필요합니다 결론 #Browser Harness는 웹 자동화의 새로운 패러다임을 대표합니다 — \u0026ldquo;하드코딩된 선택기\u0026quot;에서 \u0026ldquo;이해하는 에이전트\u0026quot;로.\n자가 치유 기능으로 유지보수 비용을 크게 절감합니다 자연어 인터페이스로 사용 문턱을 낮춥니다 LLM의 추론 능력으로 복잡한 흐름을 처리합니다 시각적 인식으로 전통적 자동화의 사각지대를 해결합니다 매주 충돌하는 크롤러 스크립트를 수정하는 것에 지쳤다면 Browser Harness를 시도해 볼 가치가 있습니다.\nGitHub: browser-use/browser-harness\nStars: 11,251+ | 언어: Python | 라이선스: 오픈소스\n관련 기사 # Hermes Agent: 자기 개선하는 AI 에이전트 Agent Reach: AI 에이전트에 인터넷 슈퍼파워 부여하기 Witr: 계보 트리가 있는 프로세스 모니터 ","date":"May 15, 2026","permalink":"https://dibi8.com/kr/resources/llm-frameworks/browser-harness-self-healing-llm-web-automation/","section":"AI 源码资源","summary":"","title":"Browser Harness：让 LLM 自主操控浏览器的自愈型神器"},{"content":"{\u0026lt;/* resource-info */\u0026gt;}\nBuffer를 대체할 2026년 최강 오픈소스: AiToEarn vs Hootsuite 전격 비교 #소셜 미디어 자동화는 이제 필수지만, Buffer나 Hootsuite 같은 레거시 플랫폼들은 비싼 월 구독료와 게시물 제한으로 크리에이터들을 옥죄고 있습니다. 진정한 콘텐츠 배포의 자율성을 원한다면, 2026년에는 오픈소스 혁신가인 AiToEarn에 주목해야 합니다.\n이 심층 벤치마크에서는 AiToEarn이 어떻게 Buffer를 완벽하게 대체하는지, 특히 생성형 AI를 활용한 다중 플랫폼 수익화 측면에서 어떤 압도적인 이점을 제공하는지 분석합니다.\n기능 벤치마크: AiToEarn vs Buffer vs Hootsuite #더 이상 터무니없는 월 구독료를 내지 마십시오. 자체 호스팅(Self-hosted) AI 솔루션으로 전환했을 때 얻을 수 있는 팩트를 확인하세요:\n기능 / 플랫폼 AiToEarn (오픈소스) Buffer (프리미엄) Hootsuite (프로) 월간 유지 비용 $0 (자체 호스팅) 월 $120 이상 월 $249 이상 AI 콘텐츠 자동 생성 네이티브 지원 (로컬/API) 빈약한 부가 기능 값비싼 추가 옵션 지원 플랫폼 X, IG, TikTok, Xiaohongshu X, IG, TikTok 등 X, IG, FB 등 게시물/계정 제한 무제한 요금제에 따라 철저히 제한됨 요금제에 따라 철저히 제한됨 AI 수익화를 위한 아키텍처 #기존 도구들이 단순히 예약 발송만 한다면, AiToEarn은 콘텐츠를 \u0026lsquo;생성\u0026rsquo;합니다. DAG(방향성 비순환 그래프) 엔진을 사용해 트렌드를 수집하고, DeepSeek 같은 모델로 요약한 뒤 각 플랫폼의 문법에 맞게 포맷을 변환합니다. 또한 Playwright 기반 헤드리스 브라우저를 사용하여 샤오홍슈(Xiaohongshu)나 TikTok 같이 API가 닫혀있는 플랫폼의 제한을 우회합니다.\nFAQ #Q: 샤오홍슈(Xiaohongshu)와 인스타그램에 동시에 자동 게시할 수 있나요? A: 네! AiToEarn은 서구권 플랫폼(Instagram, TikTok)과 중국 거대 생태계(샤오홍슈, WeChat)를 모두 네이티브로 지원하는 보기 드문 오픈소스 자동화 툴입니다.\nQ: 자체 호스팅 콘텐츠 배포 자동화는 믿을 만한가요? (content distribution automation self-hosted) A: 완벽합니다. AiToEarn은 Docker compose 파일을 제공하여 SQLite 데이터베이스와 Playwright 브라우저를 견고하게 격리합니다. 월 5달러짜리 저렴한 VPS에서도 99.9%의 가동률을 자랑합니다.\n","date":"May 15, 2026","permalink":"https://dibi8.com/kr/resources/ai-tools/aitoearn-guide/","section":"AI 源码资源","summary":"","title":"Buffer를 대체할 2026년 최강 오픈소스: AiToEarn vs Hootsuite 전격 비교"},{"content":"{\u0026lt;/* resource-info */\u0026gt;}\nClaude Code 메모리 주입: MemPalace로 96.6% 리콜 달성하는 완벽 가이드 (2026) #Claude Code는 소프트웨어 엔지니어링의 혁명입니다. 하지만 치명적인 단점이 하나 있습니다. 터미널을 닫는 순간 \u0026lsquo;기억 상실증\u0026rsquo;에 걸린다는 것입니다. 수시간 동안 설명한 아키텍처나 코딩 컨벤션이 모두 날아갑니다. 그래서 MemPalace가 필요합니다.\n이 기술 심층 분석에서는 MemPalace의 MCP 엔드포인트를 Claude Code에 연결하여 LongMemEval 벤치마크 기준 96.6% 리콜율의 영구적인 장기 기억을 부여하는 방법을 소개합니다.\n벤치마크 비교: Claude Code 메모리 솔루션 #AI 에이전트가 프로젝트 히스토리를 기억하게 하려면 몇 가지 옵션이 있습니다. 2026년 개발자들이 MemPalace를 선택할 수밖에 없는 이유를 데이터로 증명합니다:\n지표 / 프레임워크 MemPalace (로컬 MCP) Pinecone (클라우드) 순정 Claude Code 컨텍스트 리콜율 96.6% 81.2% 0% (종료 시 망각) 소스코드 프라이버시 100% 로컬 (ChromaDB) 클라우드 서버로 전송됨 N/A API 호출 비용 $0 / 완전 무료 구독 / 종량제 과금 N/A 설정 난이도 쉬움 (MCP 명령어 1줄) 어려움 (API 키 필요) 없음 MCP를 통한 네이티브 통합 #MemPalace는 표준 모델 컨텍스트 프로토콜(MCP) 서버를 노출합니다. claude_code_config.json을 수정하여 http://localhost:8787/mcp를 가리키도록 하고 읽기/쓰기 권한을 부여하기만 하면 됩니다. 이제 Claude에게 \u0026lsquo;이 아키텍처 결정을 기억해둬\u0026rsquo;라고 말하면, 자동으로 MemPalace의 원문-벡터 이중 스토리지에 저장됩니다.\nFAQ #Q: Claude Code에 메모리를 어떻게 추가하나요? (How to add memory to Claude Code?) A: 로컬에서 MemPalace를 실행하고 해당 MCP 엔드포인트를 Claude Code에 전달하면 됩니다. MemPalace는 Claude가 과거의 컨텍스트가 필요할 때 언제든 자연스럽게 쿼리할 수 있는 시맨틱 벡터 데이터베이스 역할을 합니다.\nQ: Claude Code 세션 메모리 영구 보존이 가능한가요? A: 네. MemPalace는 데이터를 로컬 SQLite/ChromaDB 디스크에 기록하기 때문에, 컴퓨터를 재부팅하거나 완전히 새로운 터미널 세션을 열어도 AI의 메모리는 영구적으로 유지됩니다.\n","date":"May 15, 2026","permalink":"https://dibi8.com/kr/resources/ai-tools/mempalace-guide/","section":"AI 源码资源","summary":"","title":"Claude Code 메모리 주입: MemPalace로 96.6% 리콜 달성하는 완벽 가이드 (2026)"},{"content":"{\u0026lt;/* resource-info */\u0026gt;}\nClaude Code 토큰 비용 65% 절감: Caveman 스킬 완벽 가이드 # 🪨 \u0026ldquo;왜 많은 토큰 쓰나? 적은 토큰으로도 됨\u0026rdquo;\n— GitHub 57,003 Star, Claude Code 공식 스킬\nAI 코딩 에이전트를 매일 쓰는 개발자라면 한 가지 고민이 있습니다. 토큰 비용. Claude Code, Cursor, Windsurf, Cline… 도구는 좋은데 답변이 길어질수록 지갑이 얇아집니다. 오늘 소개할 Caveman은 이 문제를 단숨에 해결하는 Claude Code 스킬입니다. 설치는 1줄, 효과는 평균 65% 토큰 절감. 기술적 정확도는 그대로 유지하면서 말이죠.\nCaveman이란? #Caveman은 JuliusBrussee가 만든 Claude Code 스킬로, AI의 출력 토큰을 구석기인 말투로 압축합니다. 문법을 과감히 생략하고, 관사(article)를 버리고, 핵심만 짚어 말하는 방식입니다. 이게 단순 개그가 아닙니다. 실제 벤치마크에서 평균 65%, 최대 87%의 토큰 절감을 기록했으며, 기술적 정확도는 100% 유지됩니다.\nGitHub Stars: 57,003 커밋 수: 156+ 지원 에이전트: 30+ (Claude Code, Cursor, Windsurf, Cline, Copilot, Gemini CLI, Codex, Continue, Roo, Augment, Aider, Goose, Warp, Replit Agent 등) 공식 사이트: getcaveman.dev 왜 Caveman을 써야 할까? #1. 비용 절감 (평균 65%) #출력 토큰이 줄면 API 비용이 그만큼 줄어듭니다. 벤치마크 결과는 놀랍습니다.\n작업 일반 (토큰) Caveman (토큰) 절감률 React 리렌더 버그 설명 1,180 159 87% Auth 미들웨어 토큰 만료 수정 704 121 83% PostgreSQL 커넥션 풀 설정 2,347 380 84% Git rebase vs merge 설명 702 292 58% Callback → async/await 리팩토링 387 301 22% 마이크로서비스 vs 모놀리식 설계 446 310 30% PR 보안 이슈 리뷰 678 398 41% Docker 멀티스테이지 빌드 1,042 290 72% PostgreSQL 레이스 컨디션 디버깅 1,200 232 81% React Error Boundary 구현 3,454 456 87% 평균 1,214 294 65% 범위: 22%~87% 절감. Caveman은 출력 토큰만 줄입니다. 사고/추론 토큰은 건드리지 않습니다.\n2. 응답 속도 ~3배 향상 #생성할 토큰이 적어지니 응답 속도가 획기적으로 빨라집니다. 긴 기술 문서 설명도 순식간에 끝납니다.\n3. 가독성 상승 #\u0026ldquo;장황한 답변의 벽\u0026rdquo; 대신 핵심만 콕콕 짚어주는 스타일. 오히려 읽기 쉽고, 기억에도 잘 남습니다.\n4. 정확도 유지 — 심지어 개선 #2026년 3월 논문 \u0026ldquo;Brevity Constraints Reverse Performance Hierarchies in Language Models\u0026rdquo;에 따르면, 대형 모델에게 간결한 응답을 강제하면 정확도가 26%p 향상되고 성능 순위가 완전히 뒤집힌다고 합니다. 장황함이 항상 정답은 아닙니다.\n5. 재미 #코드 리뷰가 코미디가 됩니다. 매일 쓰는 도구가 지루하지 않다는 건 큰 장점입니다.\n설치 방법 (1줄) #Caveman은 30개 이상의 AI 에이전트를 자동 감지하고, 각자의 네이티브 방식으로 설치합니다. 없는 에이전트는 스킵하고, 재실행해도 안전합니다.\nmacOS / Linux / WSL / Git Bash #curl -fsSL https://raw.githubusercontent.com/JuliusBrussee/caveman/main/install.sh | bash Windows (PowerShell) #irm https://raw.githubusercontent.com/JuliusBrussee/caveman/main/install.ps1 | iex 설치 옵션 # 플래그 설명 --all 플러그인 + 후크 + 상태줄 + MCP shrink + 현재 디렉토리 규칙 파일. 풀 패키지. --minimal 플러그인/확장만. 후크, MCP shrink, 규칙 파일 제외. --dry-run 미리보기. 실제로 아무것도 쓰지 않음. --only \u0026lt;agent\u0026gt; 특정 에이전트만 설치 (반복 가능). --with-hooks Claude Code 단독 후크 + 상태줄 + 통계 배지 연결. 기본 ON. --with-mcp-shrink MCP shrink 미들웨어 등록. 기본 ON. 사용법: 3단계 강도 #Caveman은 상황에 따라 3단계 강도를 선택할 수 있습니다.\n레벨 명령어 효과 Lite /caveman lite 필러 제거, 문법 유지. 프로페셔널하지만 장황함 없음. Full /caveman full 기본 Caveman. 관사 제거, 단편문, 완전한 그런트 스타일. Ultra /caveman ultra 최대 압축. 전보체. 모든 것을 축약. Before / After 예시 #일반:\n\u0026ldquo;In order to resolve the React re-rendering issue, you should consider memoizing the component using React.memo or implementing a custom comparison function with useMemo to prevent unnecessary re-renders when the props haven\u0026rsquo;t actually changed.\u0026rdquo;\nCaveman Full:\n\u0026ldquo;React re-render bug. Fix: wrap in React.memo. Props same? No render. Done.\u0026rdquo;\nCaveman Ultra:\n\u0026ldquo;Rerender bug. React.memo. Props diff? Skip render.\u0026rdquo;\n같은 기술 정보. 토큰은 1/4~1/8.\nCaveman 스킬 모음 # 스킬 기능 /caveman-commit 간결한 커밋 메시지. Conventional Commits, 제목 50자 이내. /caveman-review 한 줄 PR 코멘트: L42: 🔴 bug: user null. Add guard. /caveman-help 빠른 참조 카드. 모든 모드, 스킬, 명령어. /caveman-stats 실제 세션 토큰 사용량 + 추정 절감액 + USD. --all로 누적, --since 7d로 기간 필터, --share로 트윗용 한 줄. /caveman:compress \u0026lt;file\u0026gt; 메모리 파일(예: CLAUDE.md)을 Caveman 말투로 재작성. 백업은 \u0026lt;file\u0026gt;.original.md. 세션 시작 시 입력 토큰 ~46% 절감. Caveman Subagents (Claude Code 전용) # 서브에이전트 역할 cavecrew-investigator 읽기 전용 로케이터. 하이쿠 스타일. cavecrew-builder 1~2개 파일 수술적 편집. 3개 이상 거부. cavecrew-reviewer 한 줄 발견 사항. 하이쿠. 서브에이전트 출력은 메인 컨텍스트에 주입됩니다. 기본 Explore/리뷰어 에이전트보다 ~60% 적은 토큰을 사용해 긴 세션에서 메인 컨텍스트를 오래 유지합니다.\n상태줄 절감 배지 #기본 ON. /caveman-stats 첫 실행 후 상태줄에 [CAVEMAN] ⛏ 12.4k (누적 절감 토큰)가 표시되고, 실행할 때마다 갱신됩니다. 끄려면 CAVEMAN_STATUSLINE_SAVINGS=0.\ncaveman-shrink: MCP 미들웨어 #Caveman은 MCP 서버를 감싸는 stdio 프록시 caveman-shrink도 제공합니다. tools/list, prompts/list, resources/list 응답의 description 필드를 압축합니다. 코드, URL, 경로, 식별자는 바이트 단위 그대로 유지.\n{ \u0026#34;mcpServers\u0026#34;: { \u0026#34;fs-shrunk\u0026#34;: { \u0026#34;command\u0026#34;: \u0026#34;npx\u0026#34;, \u0026#34;args\u0026#34;: [\u0026#34;caveman-shrink\u0026#34;, \u0026#34;npx\u0026#34;, \u0026#34;@modelcontextprotocol/server-filesystem\u0026#34;, \u0026#34;/path/to/dir\u0026#34;] } } } npm 패키지: caveman-shrink. V1은 툴콜 응답 본문이나 요청 페이로드는 건드리지 않습니다. install.sh가 자동 등록합니다(--minimal로 스킵).\n과학적 근거 #2026년 3월 발표된 논문 \u0026ldquo;Brevity Constraints Reverse Performance Hierarchies in Language Models\u0026rdquo; (arXiv:2604.00025)는 다음을 입증했습니다:\n간결한 응답 제약 시 특정 벤치마크에서 정확도 26%p 향상 성능 계층 구조가 완전히 역전됨 장황함 ≠ 정확함 Caveman은 이 원리를 실제 코딩 워크플로우에 적용한 도구입니다.\n자주 묻는 질문 (FAQ) #Q: Caveman은 생각/추론 토큰도 줄이나요?\nA: 아닙니다. 출력 토큰만 줄입니다. AI의 \u0026ldquo;머리\u0026quot;는 그대로 두고 \u0026ldquo;입\u0026quot;만 작게 만듭니다.\nQ: 기술 정보가 손실되나요?\nA: 벤치마크상 100% 정확도 유지. 코드, URL, 경로, 식별자는 바이트 단위 보존.\nQ: 한국어로도 작동하나요?\nA: Claude Code 스킬은 언어에 구애받지 않습니다. Caveman의 \u0026ldquo;말투 규칙\u0026quot;은 한국어 출력에도 동일하게 적용되어 장황한 설명을 압축합니다.\nQ: 이미 설치한 에이전트에 덮어쓰기 되나요?\nA: 안전하게 재실행 가능. 없는 에이전트는 스킵.\nQ: 팀 전체에 적용하려면?\nA: --all 플래그로 저장소별 규칙 파일도 함께 배포. .clinerules, .cursorrules 등 자동 생성.\n결론 #Caveman은 단순한 \u0026ldquo;밈\u0026quot;이 아닙니다. 57K Star를 받은 실전 도구이며, Claude Code 생태계에서 가장 효과적인 토큰 최적화 솔루션입니다. 1줄 설치로 평균 65% 비용 절감, ~3배 속도 향상, 오히려 개선되는 정확도까지.\nAI 코딩 비용이 부담스럽다면, 오늘 바로 Caveman을 설치하세요.\ncurl -fsSL https://raw.githubusercontent.com/JuliusBrussee/caveman/main/install.sh | bash 더 알아보기: github.com/JuliusBrussee/caveman | getcaveman.dev\n본 게시물은 dibi8.com에서 2026년 5월 10일에 작성되었습니다.\n","date":"May 15, 2026","permalink":"https://dibi8.com/kr/resources/ai-tools/caveman/","section":"AI 源码资源","summary":"","title":"Claude Code 토큰 비용 65% 절감: Caveman 스킬 완벽 가이드"},{"content":"{\u0026lt;/* resource-info */\u0026gt;}\nCloakBrowser란? #CloakBrowser는 CloakHQ에서 개발한 오픈소스 스텔스 Chromium 브라우저입니다. 2,431+ GitHub Stars와 200+ Forks를 보유하고 있으며, Playwright의 드롭인 교체재로서 모든 봇 감지 테스트를 통과하도록 설계되었습니다.\n쉽게 감지되는 표준 헤드리스 브라우저와 달리, CloakBrowser는 실제 인간이 운영하는 브라우저와 구분할 수 없도록 소스 레벨 지문 패치를 구현합니다.\nGitHub: https://github.com/CloakHQ/CloakBrowser\n지표 수치 Stars 2,431+ Forks 200+ 언어 Python 라이선스 MIT 오늘 482 stars 봇 테스트 통과 30/30 CloakBrowser의 스텔스 기술 #1. 소스 레벨 지문 패치 #CloakBrowser는 JavaScript를 주입하는 것뿐만 아니라 Chromium 소스 코드를 패치합니다:\nfrom cloakbrowser import StealthBrowser # 스텔스 브라우저 시작 browser = StealthBrowser( headless=True, # 헤드리스 모드에서도 감지 불가 fingerprint=\u0026#39;desktop_chrome_win11\u0026#39;, # 사전 정의 프로필 proxy=\u0026#39;http://user:pass@proxy:8080\u0026#39; # 선택적 프록시 ) # 보호된 사이트 접속 page = browser.new_page() page.goto(\u0026#39;https://bot-protected-site.com\u0026#39;) # 감지 트리거 없이 데이터 추출 content = page.content() 2. 지문 프로필 #사용 가능한 사전 정의 프로필:\n프로필 OS 브라우저 용도 desktop_chrome_win11 Windows 11 Chrome 120 일반 스크래핑 desktop_firefox_mac macOS Firefox 121 대체 지문 mobile_safari_ios17 iOS 17 Safari 모바일 테스트 desktop_edge_win10 Windows 10 Edge 120 엔터프라이즈 사이트 custom Any Any 사용자 정의 3. 동적 지문 로테이션 #from cloakbrowser import FingerprintRotator # 10개 요청마다 지문 교체 rotator = FingerprintRotator( profiles=[\u0026#39;desktop_chrome_win11\u0026#39;, \u0026#39;desktop_firefox_mac\u0026#39;], rotation_interval=10 ) for url in url_list: profile = rotator.get_next() browser = StealthBrowser(fingerprint=profile) page = browser.new_page() page.goto(url) # ... 데이터 추출 browser.close() 설치 ## 저장소 클론 git clone https://github.com/CloakHQ/CloakBrowser.git cd CloakBrowser # 의존성 설치 pip install -r requirements.txt # 패치된 Chromium 다운로드 python setup.py --download-chromium # 봇 감지 테스트 실행 python test_bot_detection.py # 예상 출력: 30/30 테스트 통과 봇 감지 테스트 결과 #CloakBrowser는 30개의 인기 봇 감지 서비스에서 테스트되었습니다:\n서비스 결과 참고 DataDome ✅ 통과 CAPTCHA 미트리거 PerimeterX ✅ 통과 깨끗한 세션 Cloudflare ✅ 통과 챌린지 페이지 없음 reCAPTCHA v3 ✅ 통과 점수 0.9/1.0 hCaptcha ✅ 통과 인비저블 모드 FingerprintJS ✅ 통과 고유 ID 안정적 BotGuard ✅ 통과 감지되지 않음 Akamai ✅ 통과 완전 접근 Shape Security ✅ 통과 차단 없음 Kasada ✅ 통과 깨끗한 요청 총계: 30/30 테스트 통과\n성능 비교 # 브라우저 감지율 속도 리소스 사용량 표준 Chromium 95% 감지 빠름 낮음 Puppeteer Stealth 60% 감지 빠름 낮음 Playwright 70% 감지 빠름 낮음 Selenium 90% 감지 느림 높음 CloakBrowser 0% 감지 빠름 중간 커뮤니티 및 리소스 # GitHub: CloakHQ/CloakBrowser 문서: https://cloakbrowser.readthedocs.io Discord: 커뮤니티 가입 관련 기사 # Browser Harness: 자가 치유 LLM 웹 자동화 Agent Reach: AI 에이전트 인터넷 접근 Scanners-Box: 200+ 사이버보안 도구 면책 조항 #책임감 있게 사용하세요. CloakBrowser는 합법적인 자동화, 테스트 및 데이터 수집을 위한 것입니다. 항상:\nrobots.txt 및 서비스 약관을 존중 과도한 요청으로 서버를 과부하하지 마세요 합리적인 요청 속도 사용 해당 관할권의 법적 영향 고려 마지막 업데이트: 2026-05-08 | Stars: 2,431+ | 라이선스: MIT\n","date":"May 15, 2026","permalink":"https://dibi8.com/kr/resources/ai-tools/cloakbrowser/","section":"AI 源码资源","summary":"","title":"CloakBrowser: 2.4K⭐ 스텔스 브라우저, 모든 봇 감지 테스트 통과"},{"content":"{\u0026lt;/* resource-info */\u0026gt;}\n본 글은 Code Vault에 현재 공개된 7개 코드 스니펫을 한 번에 정리한 것입니다 — 암호화폐 트레이딩 레이더, 자율 트레이딩 시스템, 보안 도구를 다루는 개인 코드 저장소이며, 모두 순수 Python으로 작성되었고 API 비용은 0 또는 거의 0입니다. 각 스니펫 아래에 전체 소스 코드가 포함되어 있어 그대로 읽고 Fork하여 로컬에서 실행할 수 있습니다. 오른쪽 목차에서 원하는 도구로 바로 이동할 수 있습니다.\n⚠️ 위험 경고 — 이 도구들은 실시간 시세와 온체인 데이터를 다루며, 일부는 Telegram으로 실시간 알림을 보냅니다. 그 중 \u0026ldquo;AI 자율 트레이딩\u0026quot;은 바이낸스 선물에서 가상 포지션을 엽니다. 각 도구의 설명을 반드시 자세히 읽으세요. 사용에 따른 위험은 본인 책임이며, 저자는 트레이딩 결과에 대해 어떠한 보증도 하지 않습니다.\n트레이딩 레이더 #Vitalik 매도 레이더 #게시일: 2026.05.02　태그: Python · WebSocket · Ethereum · Telegram · Event-Driven\nGitHub: vitalik-sell-radar{rel=\u0026ldquo;nofollow\u0026rdquo;}\nWebSocket 이벤트 기반 · Vitalik 지갑 매도 감지 · Telegram 초단위 푸시\nWebSocket 이벤트 구독을 통해 Vitalik Buterin의 지갑(vitalik.eth)에서 발생하는 ERC-20 토큰 매도를 실시간 감지 — 폴링 없음, 1초 미만 지연. 수신자를 자동으로 분류합니다: DEX Router(Uniswap, 1inch, SushiSwap), CEX 핫월렛(Binance, Coinbase, Kraken), LP 풀. DexScreener에서 실시간 토큰 가격 조회. 다중 RPC 페일오버 + 자동 재연결. 순수 Python, 비용 0 — 무료 공개 RPC 노드 사용.\n전체 소스 코드 ##!/usr/bin/env python3 \u0026#34;\u0026#34;\u0026#34; Vitalik Sell Radar — Event-Driven Edition WebSocket subscription to ERC-20 Transfer events, real-time detection of Vitalik\u0026#39;s sell activity, instant push to Telegram. Architecture: 1. WebSocket subscribes to Transfer(from=vitalik) events → sub-second detection 2. Classifies sell behavior (transfers to DEX Router / CEX / LP Pool) 3. Queries token info + price via DexScreener 4. Pushes alert to Telegram 5. Auto-reconnect + multi-RPC failover \u0026#34;\u0026#34;\u0026#34; import asyncio import json import logging import os import signal import sys import time from datetime import datetime, timezone from pathlib import Path import aiohttp import websockets # Load .env file def load_env(): env_path = Path(__file__).parent / \u0026#34;.env\u0026#34; if env_path.exists(): for line in env_path.read_text().splitlines(): line = line.strip() if line and not line.startswith(\u0026#34;#\u0026#34;) and \u0026#34;=\u0026#34; in line: k, v = line.split(\u0026#34;=\u0026#34;, 1) os.environ.setdefault(k.strip(), v.strip()) load_env() # ============================================================ # Configuration # ============================================================ # Vitalik\u0026#39;s main wallet VITALIK_ADDRESS = \u0026#34;0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045\u0026#34; VITALIK_PADDED = \u0026#34;0x\u0026#34; + VITALIK_ADDRESS[2:].lower().zfill(64) # ERC-20 Transfer event topic TRANSFER_TOPIC = \u0026#34;0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef\u0026#34; # WebSocket RPC endpoints (free, support eth_subscribe) WS_ENDPOINTS = [ \u0026#34;wss://ethereum-rpc.publicnode.com\u0026#34;, \u0026#34;wss://eth.drpc.org\u0026#34;, \u0026#34;wss://ethereum.publicnode.com\u0026#34;, ] # HTTP RPC for querying token info HTTP_RPC = os.environ.get(\u0026#34;HTTP_RPC\u0026#34;, \u0026#34;https://eth.drpc.org\u0026#34;) # Telegram TG_BOT_TOKEN = os.environ.get(\u0026#34;TG_BOT_TOKEN\u0026#34;, \u0026#34;\u0026#34;) TG_CHAT_ID = os.environ.get(\u0026#34;TG_CHAT_ID\u0026#34;, \u0026#34;\u0026#34;) # Known DEX Router addresses (sell destinations) KNOWN_DEX_ROUTERS = { # Uniswap \u0026#34;0x7a250d5630b4cf539739df2c5dacb4c659f2488d\u0026#34;: \u0026#34;Uniswap V2 Router\u0026#34;, \u0026#34;0xe592427a0aece92de3edee1f18e0157c05861564\u0026#34;: \u0026#34;Uniswap V3 Router\u0026#34;, \u0026#34;0x68b3465833fb72a70ecdf485e0e4c7bd8665fc45\u0026#34;: \u0026#34;Uniswap V3 Router2\u0026#34;, \u0026#34;0x3fc91a3afd70395cd496c647d5a6cc9d4b2b7fad\u0026#34;: \u0026#34;Uniswap Universal Router\u0026#34;, \u0026#34;0xef1c6e67703c7bd7107eed8303fbe6ec2554bf6b\u0026#34;: \u0026#34;Uniswap Universal Router (old)\u0026#34;, # 1inch \u0026#34;0x1111111254eeb25477b68fb85ed929f73a960582\u0026#34;: \u0026#34;1inch V5\u0026#34;, \u0026#34;0x111111125421ca6dc452d289314280a0f8842a65\u0026#34;: \u0026#34;1inch V6\u0026#34;, # SushiSwap \u0026#34;0xd9e1ce17f2641f24ae83637ab66a2cca9c378b9f\u0026#34;: \u0026#34;SushiSwap Router\u0026#34;, # CoW Protocol \u0026#34;0x9008d19f58aabd9ed0d60971565aa8510560ab41\u0026#34;: \u0026#34;CoW Settlement\u0026#34;, # 0x \u0026#34;0xdef1c0ded9bec7f1a1670819833240f027b25eff\u0026#34;: \u0026#34;0x Exchange Proxy\u0026#34;, # Curve \u0026#34;0x99a58482bd75cbab83b27ec03ca68ff489b5788f\u0026#34;: \u0026#34;Curve Router\u0026#34;, } # Known CEX hot wallets (partial list) KNOWN_CEX = { \u0026#34;0x28c6c06298d514db089934071355e5743bf21d60\u0026#34;: \u0026#34;Binance Hot Wallet\u0026#34;, \u0026#34;0x21a31ee1afc51d94c2efccaa2092ad1028285549\u0026#34;: \u0026#34;Binance Hot Wallet 2\u0026#34;, \u0026#34;0xdfd5293d8e347dfe59e90efd55b2956a1343963d\u0026#34;: \u0026#34;Binance Hot Wallet 3\u0026#34;, \u0026#34;0x56eddb7aa87536c09ccc2793473599fd21a8b17f\u0026#34;: \u0026#34;Binance Hot Wallet 4\u0026#34;, \u0026#34;0x71660c4005ba85c37ccec55d0c4493e66fe775d3\u0026#34;: \u0026#34;Coinbase\u0026#34;, \u0026#34;0xa9d1e08c7793af67e9d92fe308d5697fb81d3e43\u0026#34;: \u0026#34;Coinbase 10\u0026#34;, \u0026#34;0x503828976d22510aad0201ac7ec88293211d23da\u0026#34;: \u0026#34;Coinbase 2\u0026#34;, \u0026#34;0x2faf487a4414fe77e2327f0bf4ae2a264a776ad2\u0026#34;: \u0026#34;FTX (defunct)\u0026#34;, \u0026#34;0x267be1c1d684f78cb4f6a176c4911b741e4ffdc0\u0026#34;: \u0026#34;Kraken\u0026#34;, \u0026#34;0xae2d4617c862309a3d75a0ffb358c7a5009c673f\u0026#34;: \u0026#34;Kraken 10\u0026#34;, } # Minimum notification amount (USD), 0 = notify all MIN_NOTIFY_USD = int(os.environ.get(\u0026#34;MIN_NOTIFY_USD\u0026#34;, \u0026#34;0\u0026#34;)) # Reconnect settings RECONNECT_DELAY = 5 MAX_RECONNECT_DELAY = 60 # ============================================================ # Logging # ============================================================ logging.basicConfig( level=logging.INFO, format=\u0026#34;%(asctime)s [%(levelname)s] %(message)s\u0026#34;, datefmt=\u0026#34;%Y-%m-%d %H:%M:%S\u0026#34;, ) log = logging.getLogger(\u0026#34;vitalik-radar\u0026#34;) # ============================================================ # Global state # ============================================================ # Dedup set for processed tx hashes (last 1000) seen_txs: set = set() seen_txs_list: list = [] # HTTP session http_session: aiohttp.ClientSession | None = None # Token info cache: {address: {symbol, name, decimals}} token_cache: dict = {} # Running flag running = True # ============================================================ # Utility functions # ============================================================ def shorten_addr(addr: str) -\u0026gt; str: \u0026#34;\u0026#34;\u0026#34;Shorten address for display\u0026#34;\u0026#34;\u0026#34; return f\u0026#34;{addr[:6]}...{addr[-4:]}\u0026#34; def decode_transfer_value(data_hex: str, decimals: int) -\u0026gt; float: \u0026#34;\u0026#34;\u0026#34;Decode Transfer event value\u0026#34;\u0026#34;\u0026#34; try: raw = int(data_hex, 16) return raw / (10 ** decimals) except: return 0.0 def topic_to_address(topic: str) -\u0026gt; str: \u0026#34;\u0026#34;\u0026#34;Extract 20-byte address from 32-byte topic\u0026#34;\u0026#34;\u0026#34; return \u0026#34;0x\u0026#34; + topic[-40:] def classify_recipient(to_addr: str) -\u0026gt; tuple[str, str]: \u0026#34;\u0026#34;\u0026#34; Classify recipient address. Returns (type, name) Type: \u0026#34;dex\u0026#34; / \u0026#34;cex\u0026#34; / \u0026#34;pool\u0026#34; / \u0026#34;unknown\u0026#34; \u0026#34;\u0026#34;\u0026#34; to_lower = to_addr.lower() if to_lower in KNOWN_DEX_ROUTERS: return \u0026#34;dex\u0026#34;, KNOWN_DEX_ROUTERS[to_lower] if to_lower in KNOWN_CEX: return \u0026#34;cex\u0026#34;, KNOWN_CEX[to_lower] return \u0026#34;unknown\u0026#34;, \u0026#34;\u0026#34; async def get_http_session() -\u0026gt; aiohttp.ClientSession: global http_session if http_session is None or http_session.closed: http_session = aiohttp.ClientSession() return http_session async def rpc_call(method: str, params: list) -\u0026gt; dict | None: \u0026#34;\u0026#34;\u0026#34;HTTP JSON-RPC call\u0026#34;\u0026#34;\u0026#34; session = await get_http_session() try: async with session.post( HTTP_RPC, json={\u0026#34;jsonrpc\u0026#34;: \u0026#34;2.0\u0026#34;, \u0026#34;id\u0026#34;: 1, \u0026#34;method\u0026#34;: method, \u0026#34;params\u0026#34;: params}, timeout=aiohttp.ClientTimeout(total=10), ) as resp: data = await resp.json() return data.get(\u0026#34;result\u0026#34;) except Exception as e: log.error(f\u0026#34;RPC call {method} failed: {e}\u0026#34;) return None async def get_token_info(token_addr: str) -\u0026gt; dict: \u0026#34;\u0026#34;\u0026#34;Query ERC-20 token info (symbol, name, decimals)\u0026#34;\u0026#34;\u0026#34; addr_lower = token_addr.lower() if addr_lower in token_cache: return token_cache[addr_lower] info = {\u0026#34;symbol\u0026#34;: \u0026#34;???\u0026#34;, \u0026#34;name\u0026#34;: \u0026#34;Unknown\u0026#34;, \u0026#34;decimals\u0026#34;: 18, \u0026#34;address\u0026#34;: token_addr} # symbol() result = await rpc_call(\u0026#34;eth_call\u0026#34;, [ {\u0026#34;to\u0026#34;: token_addr, \u0026#34;data\u0026#34;: \u0026#34;0x95d89b41\u0026#34;}, \u0026#34;latest\u0026#34; ]) if result and len(result) \u0026gt; 2: try: hex_str = result[2:] if len(hex_str) \u0026gt;= 128: offset = int(hex_str[:64], 16) * 2 length = int(hex_str[offset:offset+64], 16) symbol_hex = hex_str[offset+64:offset+64+length*2] info[\u0026#34;symbol\u0026#34;] = bytes.fromhex(symbol_hex).decode(\u0026#34;utf-8\u0026#34;, errors=\u0026#34;replace\u0026#34;).strip(\u0026#39;\\x00\u0026#39;) elif len(hex_str) == 64: info[\u0026#34;symbol\u0026#34;] = bytes.fromhex(hex_str).decode(\u0026#34;utf-8\u0026#34;, errors=\u0026#34;replace\u0026#34;).strip(\u0026#39;\\x00\u0026#39;) except: pass # decimals() result = await rpc_call(\u0026#34;eth_call\u0026#34;, [ {\u0026#34;to\u0026#34;: token_addr, \u0026#34;data\u0026#34;: \u0026#34;0x313ce567\u0026#34;}, \u0026#34;latest\u0026#34; ]) if result and len(result) \u0026gt; 2: try: info[\u0026#34;decimals\u0026#34;] = int(result, 16) except: pass # name() result = await rpc_call(\u0026#34;eth_call\u0026#34;, [ {\u0026#34;to\u0026#34;: token_addr, \u0026#34;data\u0026#34;: \u0026#34;0x06fdde03\u0026#34;}, \u0026#34;latest\u0026#34; ]) if result and len(result) \u0026gt; 2: try: hex_str = result[2:] if len(hex_str) \u0026gt;= 128: offset = int(hex_str[:64], 16) * 2 length = int(hex_str[offset:offset+64], 16) name_hex = hex_str[offset+64:offset+64+length*2] info[\u0026#34;name\u0026#34;] = bytes.fromhex(name_hex).decode(\u0026#34;utf-8\u0026#34;, errors=\u0026#34;replace\u0026#34;).strip(\u0026#39;\\x00\u0026#39;) elif len(hex_str) == 64: info[\u0026#34;name\u0026#34;] = bytes.fromhex(hex_str).decode(\u0026#34;utf-8\u0026#34;, errors=\u0026#34;replace\u0026#34;).strip(\u0026#39;\\x00\u0026#39;) except: pass token_cache[addr_lower] = info return info async def check_if_pool(addr: str) -\u0026gt; bool: \u0026#34;\u0026#34;\u0026#34;Check if address is a Uniswap V2/V3 pool (has token0 method)\u0026#34;\u0026#34;\u0026#34; result = await rpc_call(\u0026#34;eth_call\u0026#34;, [ {\u0026#34;to\u0026#34;: addr, \u0026#34;data\u0026#34;: \u0026#34;0x0dfe1681\u0026#34;}, \u0026#34;latest\u0026#34; # token0() ]) if result and len(result) == 66: # 0x + 64 hex chars return True return False async def get_eth_price() -\u0026gt; float: \u0026#34;\u0026#34;\u0026#34;Get ETH price from CoinGecko\u0026#34;\u0026#34;\u0026#34; session = await get_http_session() try: async with session.get( \u0026#34;https://api.coingecko.com/api/v3/simple/price?ids=ethereum\u0026amp;vs_currencies=usd\u0026#34;, timeout=aiohttp.ClientTimeout(total=5), ) as resp: data = await resp.json() return data.get(\u0026#34;ethereum\u0026#34;, {}).get(\u0026#34;usd\u0026#34;, 0) except: return 2300 # fallback async def get_token_price_usd(token_addr: str) -\u0026gt; float | None: \u0026#34;\u0026#34;\u0026#34;Get token USD price from DexScreener (free, no API key needed)\u0026#34;\u0026#34;\u0026#34; session = await get_http_session() try: async with session.get( f\u0026#34;https://api.dexscreener.com/latest/dex/tokens/{token_addr}\u0026#34;, timeout=aiohttp.ClientTimeout(total=5), ) as resp: data = await resp.json() pairs = data.get(\u0026#34;pairs\u0026#34;, []) if pairs: # Pick pair with highest liquidity pairs.sort(key=lambda p: float(p.get(\u0026#34;liquidity\u0026#34;, {}).get(\u0026#34;usd\u0026#34;, 0) or 0), reverse=True) price = float(pairs[0].get(\u0026#34;priceUsd\u0026#34;, 0) or 0) return price if price \u0026gt; 0 else None except: pass return None # ============================================================ # Telegram notifications # ============================================================ async def send_telegram(text: str): \u0026#34;\u0026#34;\u0026#34;Send Telegram message\u0026#34;\u0026#34;\u0026#34; if not TG_BOT_TOKEN: log.warning(\u0026#34;[TG] No bot token configured, skipping notification\u0026#34;) return session = await get_http_session() url = f\u0026#34;https://api.telegram.org/bot{TG_BOT_TOKEN}/sendMessage\u0026#34; payload = { \u0026#34;chat_id\u0026#34;: TG_CHAT_ID, \u0026#34;text\u0026#34;: text, \u0026#34;parse_mode\u0026#34;: \u0026#34;HTML\u0026#34;, \u0026#34;disable_web_page_preview\u0026#34;: True, } try: async with session.post(url, json=payload, timeout=aiohttp.ClientTimeout(total=10)) as resp: result = await resp.json() if not result.get(\u0026#34;ok\u0026#34;): log.error(f\u0026#34;[TG] Send failed: {result.get(\u0026#39;description\u0026#39;, \u0026#39;\u0026#39;)}\u0026#34;) # Retry with plain text if HTML parse fails if \u0026#34;parse\u0026#34; in result.get(\u0026#34;description\u0026#34;, \u0026#34;\u0026#34;).lower(): payload[\u0026#34;parse_mode\u0026#34;] = None async with session.post(url, json=payload) as resp2: pass else: log.info(\u0026#34;[TG] Message sent\u0026#34;) except Exception as e: log.error(f\u0026#34;[TG] Error: {e}\u0026#34;) # ============================================================ # Event handling # ============================================================ async def handle_transfer_event(log_entry: dict): \u0026#34;\u0026#34;\u0026#34;Process a single Transfer event\u0026#34;\u0026#34;\u0026#34; tx_hash = log_entry.get(\u0026#34;transactionHash\u0026#34;, \u0026#34;\u0026#34;) token_addr = log_entry.get(\u0026#34;address\u0026#34;, \u0026#34;\u0026#34;) topics = log_entry.get(\u0026#34;topics\u0026#34;, []) data = log_entry.get(\u0026#34;data\u0026#34;, \u0026#34;0x0\u0026#34;) # Dedup dedup_key = f\u0026#34;{tx_hash}:{token_addr}\u0026#34; if dedup_key in seen_txs: return seen_txs.add(dedup_key) seen_txs_list.append(dedup_key) # Cleanup (keep last 1000) while len(seen_txs_list) \u0026gt; 1000: old = seen_txs_list.pop(0) seen_txs.discard(old) # Parse topics: [Transfer, from, to] if len(topics) \u0026lt; 3: return from_addr = topic_to_address(topics[1]) to_addr = topic_to_address(topics[2]) # Confirm it\u0026#39;s from Vitalik if from_addr.lower() != VITALIK_ADDRESS.lower(): return # Get token info token_info = await get_token_info(token_addr) symbol = token_info[\u0026#34;symbol\u0026#34;] decimals = token_info[\u0026#34;decimals\u0026#34;] amount = decode_transfer_value(data, decimals) if amount == 0: return # Classify recipient recipient_type, recipient_name = classify_recipient(to_addr) # If unknown, check if it\u0026#39;s an LP pool is_pool = False if recipient_type == \u0026#34;unknown\u0026#34;: is_pool = await check_if_pool(to_addr) if is_pool: recipient_type = \u0026#34;pool\u0026#34; recipient_name = \u0026#34;LP Pool\u0026#34; # Determine if this is a \u0026#34;sell\u0026#34; action is_sell = recipient_type in (\u0026#34;dex\u0026#34;, \u0026#34;cex\u0026#34;, \u0026#34;pool\u0026#34;) # If not a sell, just a regular transfer — log silently if not is_sell: log.info(f\u0026#34;[Transfer] {symbol} {amount:,.2f} → {shorten_addr(to_addr)} (regular transfer, not notifying)\u0026#34;) return # Get price token_price = await get_token_price_usd(token_addr) usd_value = amount * token_price if token_price else None # Below minimum notification amount — skip if usd_value is not None and usd_value \u0026lt; MIN_NOTIFY_USD: log.info(f\u0026#34;[Sell] {symbol} ${usd_value:.0f} \u0026lt; ${MIN_NOTIFY_USD} minimum, skipping\u0026#34;) return # Build notification message timestamp = datetime.now(timezone.utc).strftime(\u0026#34;%H:%M:%S UTC\u0026#34;) sell_type_label = { \u0026#34;dex\u0026#34;: \u0026#34;🔄 DEX Sell\u0026#34;, \u0026#34;cex\u0026#34;: \u0026#34;🏦 CEX Transfer\u0026#34;, \u0026#34;pool\u0026#34;: \u0026#34;🌊 Pool Sell\u0026#34;, } msg_lines = [ f\u0026#34;\u0026lt;b\u0026gt;🚨 Vitalik Sell Signal\u0026lt;/b\u0026gt;\u0026#34;, f\u0026#34;\u0026#34;, f\u0026#34;Token: \u0026lt;b\u0026gt;{symbol}\u0026lt;/b\u0026gt;\u0026#34;, f\u0026#34;Amount: {amount:,.4f}\u0026#34;, ] if usd_value is not None: msg_lines.append(f\u0026#34;Value: \u0026lt;b\u0026gt;${usd_value:,.0f}\u0026lt;/b\u0026gt;\u0026#34;) if token_price is not None: msg_lines.append(f\u0026#34;Price: ${token_price:,.8f}\u0026#34;) msg_lines.extend([ f\u0026#34;\u0026#34;, f\u0026#34;Type: {sell_type_label.get(recipient_type, \u0026#39;Unknown\u0026#39;)}\u0026#34;, f\u0026#34;Destination: {recipient_name or shorten_addr(to_addr)}\u0026#34;, f\u0026#34;Time: {timestamp}\u0026#34;, f\u0026#34;\u0026#34;, f\u0026#34;TX: https://etherscan.io/tx/{tx_hash}\u0026#34;, f\u0026#34;Token: https://dexscreener.com/ethereum/{token_addr}\u0026#34;, ]) msg = \u0026#34;\\n\u0026#34;.join(msg_lines) log.info(f\u0026#34;[SELL DETECTED] {symbol} {amount:,.4f} → {recipient_name or to_addr} | ${usd_value or \u0026#39;?\u0026#39;}\u0026#34;) await send_telegram(msg) # ============================================================ # WebSocket listener main loop # ============================================================ async def subscribe_and_listen(ws_url: str): \u0026#34;\u0026#34;\u0026#34;Connect to WebSocket and subscribe to Vitalik Transfer events\u0026#34;\u0026#34;\u0026#34; log.info(f\u0026#34;Connecting to {ws_url}...\u0026#34;) async with websockets.connect( ws_url, ping_interval=20, ping_timeout=30, close_timeout=10, max_size=2**20, # 1MB ) as ws: # Subscribe to Transfer FROM Vitalik sub_from = { \u0026#34;jsonrpc\u0026#34;: \u0026#34;2.0\u0026#34;, \u0026#34;id\u0026#34;: 1, \u0026#34;method\u0026#34;: \u0026#34;eth_subscribe\u0026#34;, \u0026#34;params\u0026#34;: [\u0026#34;logs\u0026#34;, { \u0026#34;topics\u0026#34;: [TRANSFER_TOPIC, VITALIK_PADDED] }] } await ws.send(json.dumps(sub_from)) resp = await asyncio.wait_for(ws.recv(), timeout=10) data = json.loads(resp) if \u0026#34;error\u0026#34; in data: raise Exception(f\u0026#34;Subscribe failed: {data[\u0026#39;error\u0026#39;]}\u0026#34;) sub_id_from = data.get(\u0026#34;result\u0026#34;, \u0026#34;\u0026#34;) log.info(f\u0026#34;✅ Subscribed to Transfer FROM Vitalik (id={sub_id_from[:10]}...)\u0026#34;) # Also subscribe to Transfer TO Vitalik (monitor buys/receives) sub_to = { \u0026#34;jsonrpc\u0026#34;: \u0026#34;2.0\u0026#34;, \u0026#34;id\u0026#34;: 2, \u0026#34;method\u0026#34;: \u0026#34;eth_subscribe\u0026#34;, \u0026#34;params\u0026#34;: [\u0026#34;logs\u0026#34;, { \u0026#34;topics\u0026#34;: [TRANSFER_TOPIC, None, VITALIK_PADDED] }] } await ws.send(json.dumps(sub_to)) resp2 = await asyncio.wait_for(ws.recv(), timeout=10) data2 = json.loads(resp2) sub_id_to = data2.get(\u0026#34;result\u0026#34;, \u0026#34;\u0026#34;) if sub_id_to: log.info(f\u0026#34;✅ Subscribed to Transfer TO Vitalik (id={sub_id_to[:10]}...)\u0026#34;) log.info(\u0026#34;🔍 Monitoring Vitalik wallet... waiting for events\u0026#34;) # Listen for events async for message in ws: if not running: break try: evt = json.loads(message) if \u0026#34;params\u0026#34; not in evt: continue sub_id = evt[\u0026#34;params\u0026#34;].get(\u0026#34;subscription\u0026#34;, \u0026#34;\u0026#34;) log_entry = evt[\u0026#34;params\u0026#34;].get(\u0026#34;result\u0026#34;, {}) if sub_id == sub_id_from: # Vitalik sent tokens → check if it\u0026#39;s a sell await handle_transfer_event(log_entry) elif sub_id == sub_id_to: # Vitalik received tokens — log silently token_addr = log_entry.get(\u0026#34;address\u0026#34;, \u0026#34;\u0026#34;) token_info = await get_token_info(token_addr) data_hex = log_entry.get(\u0026#34;data\u0026#34;, \u0026#34;0x0\u0026#34;) amount = decode_transfer_value(data_hex, token_info[\u0026#34;decimals\u0026#34;]) log.debug(f\u0026#34;[Receive] {token_info[\u0026#39;symbol\u0026#39;]} +{amount:,.4f}\u0026#34;) except json.JSONDecodeError: continue except Exception as e: log.error(f\u0026#34;Event handling error: {e}\u0026#34;, exc_info=True) async def main(): \u0026#34;\u0026#34;\u0026#34;Main loop with auto-reconnect\u0026#34;\u0026#34;\u0026#34; global running # Validate required config if not TG_BOT_TOKEN: log.warning(\u0026#34;TG_BOT_TOKEN not set — Telegram notifications disabled\u0026#34;) if not TG_CHAT_ID: log.warning(\u0026#34;TG_CHAT_ID not set — Telegram notifications disabled\u0026#34;) # Signal handling def shutdown(sig, frame): global running log.info(f\u0026#34;Received signal {sig}, shutting down...\u0026#34;) running = False signal.signal(signal.SIGINT, shutdown) signal.signal(signal.SIGTERM, shutdown) # Startup notice log.info(\u0026#34;=\u0026#34; * 50) log.info(\u0026#34;Vitalik Sell Radar — Started\u0026#34;) log.info(f\u0026#34;Monitoring: {VITALIK_ADDRESS}\u0026#34;) log.info(f\u0026#34;Min notify: ${MIN_NOTIFY_USD}\u0026#34;) log.info(f\u0026#34;Telegram: {\u0026#39;✅ Configured\u0026#39; if TG_BOT_TOKEN else \u0026#39;❌ Not configured\u0026#39;}\u0026#34;) log.info(\u0026#34;=\u0026#34; * 50) if TG_BOT_TOKEN and TG_CHAT_ID: await send_telegram( \u0026#34;🟢 Vitalik Sell Radar — Started\\n\\n\u0026#34; f\u0026#34;Monitoring: {shorten_addr(VITALIK_ADDRESS)}\\n\u0026#34; f\u0026#34;Min notify: ${MIN_NOTIFY_USD}\\n\u0026#34; \u0026#34;Mode: WebSocket event-driven (sub-second latency)\u0026#34; ) endpoint_idx = 0 reconnect_delay = RECONNECT_DELAY while running: ws_url = WS_ENDPOINTS[endpoint_idx % len(WS_ENDPOINTS)] try: await subscribe_and_listen(ws_url) reconnect_delay = RECONNECT_DELAY # reset on success except websockets.exceptions.ConnectionClosed as e: log.warning(f\u0026#34;WebSocket closed: {e}\u0026#34;) except asyncio.TimeoutError: log.warning(\u0026#34;WebSocket timeout\u0026#34;) except Exception as e: log.error(f\u0026#34;WebSocket error: {e}\u0026#34;) if not running: break # Switch endpoint and retry endpoint_idx += 1 log.info(f\u0026#34;Reconnecting in {reconnect_delay}s... (next: {WS_ENDPOINTS[endpoint_idx % len(WS_ENDPOINTS)]})\u0026#34;) await asyncio.sleep(reconnect_delay) reconnect_delay = min(reconnect_delay * 1.5, MAX_RECONNECT_DELAY) # Cleanup if http_session and not http_session.closed: await http_session.close() log.info(\u0026#34;Vitalik Sell Radar — Stopped\u0026#34;) if __name__ == \u0026#34;__main__\u0026#34;: asyncio.run(main()) 온체인 내러티브 레이더 #게시일: 2026.04.28　태그: Python · GMGN · DEXScreener · Telegram\n모멘텀 기반 · 온체인 신규 토큰 발견 · ETH/SOL/BSC/Base 커버\n모멘텀이 유일한 푸시 엔진이고, 내러티브는 단지 분류 라벨입니다. 4개 체인을 30초마다 스캔합니다. 토큰은 시가총액이 3회 연속 상승하고 누적 ≥5% 증가해야만 알림이 발동됩니다. 내러티브(머스크/트럼프, 바이낸스/CZ, 셀럽)는 ★★★/★★/★ 라벨로 분류되지만 단독으로 푸시를 트리거하지는 않습니다. 안전 점검은 SOL은 RugCheck, EVM은 GoPlus를 사용. 순수 Python, AI 비용 0.\n전체 소스 코드 ##!/usr/bin/env python3 \u0026#34;\u0026#34;\u0026#34; → v1 Python，AI（ + ） ： 1. — /， 2. / — ETH+SOL，BSC 3. /CZ — BSC ：GMGN + DEXScreener ：SQLite \u0026#34;\u0026#34;\u0026#34; import requests import json import time import os import re import sqlite3 import hashlib from datetime import datetime, timedelta from pathlib import Path from difflib import SequenceMatcher # === === DATA_DIR = os.path.expanduser(\u0026#34;~/crypto-trading\u0026#34;) DB_FILE = os.path.join(DATA_DIR, \u0026#34;narrative_history.db\u0026#34;) LOG_FILE = os.path.join(DATA_DIR, \u0026#34;narrative_radar.log\u0026#34;) SEEN_FILE = os.path.join(DATA_DIR, \u0026#34;narrative_seen.json\u0026#34;) FLAP_SEEN_FILE = os.path.join(DATA_DIR, \u0026#34;flap_seen.json\u0026#34;) # SCAN_INTERVAL = 30 # 30（GMGN1-5，10） # — / # {address: [{\u0026#39;ts\u0026#39;: timestamp, \u0026#39;mc\u0026#39;: market_cap, \u0026#39;vol\u0026#39;: volume, \u0026#39;price\u0026#39;: price}, ...]} MOMENTUM_TRACKER = {} MOMENTUM_PUSHED = {} # {address: {\u0026#39;count\u0026#39;: N, \u0026#39;last_ts\u0026#39;: ts, \u0026#39;last_mc\u0026#39;: mc}} MOMENTUM_CONSECUTIVE_UP = 3 # 3（） # .envTG def load_env(): env = {} env_file = os.path.expanduser(\u0026#34;~/.env\u0026#34;) if os.path.exists(env_file): with open(env_file) as f: for line in f: line = line.strip() if \u0026#39;=\u0026#39; in line and not line.startswith(\u0026#39;#\u0026#39;): k, v = line.split(\u0026#39;=\u0026#39;, 1) env[k] = v return env ENV = load_env() TG_TOKEN = ENV.get(\u0026#39;TELEGRAM_BOT_TOKEN\u0026#39;, \u0026#39;\u0026#39;) TG_CHAT_ID = int(os.environ.get(\u0026#39;TG_CHAT_ID\u0026#39;, \u0026#39;0\u0026#39;)) GMGN_HEADERS = { \u0026#39;User-Agent\u0026#39;: \u0026#39;Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36\u0026#39;, \u0026#39;Accept\u0026#39;: \u0026#39;application/json\u0026#39;, \u0026#39;Referer\u0026#39;: \u0026#39;https://gmgn.ai/\u0026#39;, } # ============================================================ # /（） # ============================================================ MUSK_TRUMP_KEYWORDS = { # \u0026#39;musk\u0026#39;, \u0026#39;elon\u0026#39;, \u0026#39;elonmusk\u0026#39;, # SpaceX/Tesla/X \u0026#39;spacex\u0026#39;, \u0026#39;starship\u0026#39;, \u0026#39;tesla\u0026#39;, \u0026#39;cybertruck\u0026#39;, \u0026#39;roadster\u0026#39;, \u0026#39;neuralink\u0026#39;, \u0026#39;boring\u0026#39;, \u0026#39;hyperloop\u0026#39;, \u0026#39;xai\u0026#39;, \u0026#39;grok\u0026#39;, # // \u0026#39;floki\u0026#39;, \u0026#39;shiba\u0026#39;, # \u0026#39;doge father\u0026#39;, \u0026#39;dogefather\u0026#39;, \u0026#39;technoking\u0026#39;, \u0026#39;mars colony\u0026#39;, \u0026#39;mars\u0026#39;, # \u0026#39;trump\u0026#39;, \u0026#39;donald\u0026#39;, \u0026#39;maga\u0026#39;, \u0026#39;potus\u0026#39;, \u0026#39;trump47\u0026#39;, \u0026#39;melania\u0026#39;, \u0026#39;barron\u0026#39;, \u0026#39;ivanka\u0026#39;, # \u0026#39;dark maga\u0026#39;, \u0026#39;darkmaga\u0026#39;, \u0026#39;ultra maga\u0026#39;, \u0026#39;save america\u0026#39;, \u0026#39;truth social\u0026#39;, \u0026#39;covfefe\u0026#39;, # + \u0026#39;doge department\u0026#39;, \u0026#39;d.o.g.e\u0026#39;, \u0026#39;government efficiency\u0026#39;, } # /（） MUSK_TRUMP_PATTERNS = [ r\u0026#39;\\belon\\b\u0026#39;, r\u0026#39;\\bmusk\\b\u0026#39;, r\u0026#39;\\btrump\\b\u0026#39;, r\u0026#39;\\bmaga\\b\u0026#39;, r\u0026#39;\\bspacex\\b\u0026#39;, r\u0026#39;\\bstarship\\b\u0026#39;, r\u0026#39;\\btesla\\b\u0026#39;, r\u0026#39;\\bgrok\\b\u0026#39;, r\u0026#39;\\bmelania\\b\u0026#39;, r\u0026#39;\\bbarron\\b\u0026#39;, r\u0026#39;\\bdoge\\s*department\\b\u0026#39;, r\u0026#39;\\bd\\.?o\\.?g\\.?e\\b\u0026#39;, # D.O.G.E r\u0026#39;\\bx\\s*ai\\b\u0026#39;, r\u0026#39;\\bneuralink\\b\u0026#39;, ] # ============================================================ # /CZ # ============================================================ BINANCE_CZ_KEYWORDS = { # CZ \u0026#39;cz\u0026#39;, \u0026#39;changpeng\u0026#39;, \u0026#39;zhao\u0026#39;, \u0026#39;czb\u0026#39;, \u0026#39;czbinance\u0026#39;, # （BSC！） \u0026#39;heyi\u0026#39;, \u0026#39;yi he\u0026#39;, \u0026#39;he yi\u0026#39;, \u0026#39;\u0026#39;, \u0026#39;yihe\u0026#39;, \u0026#39;sister yi\u0026#39;, \u0026#39;yi jie\u0026#39;, \u0026#39;\u0026#39;, \u0026#39;\u0026#39;, # \u0026#39;binance\u0026#39;, \u0026#39;bnb\u0026#39;, \u0026#39;pancake\u0026#39;, \u0026#39;pancakeswap\u0026#39;, # CZ（、、） \u0026#39;giggle academy\u0026#39;, \u0026#39;binance life\u0026#39;, \u0026#39;bnb chain\u0026#39;, \u0026#39;principles\u0026#39;, \u0026#39;cz book\u0026#39;, # YZi Labs (Binance Labs) \u0026#39;yzi\u0026#39;, \u0026#39;yzi labs\u0026#39;, # （BSC） \u0026#39;\u0026#39;, \u0026#39;\u0026#39;, \u0026#39;\u0026#39;, \u0026#39;cz\u0026#39;, \u0026#39;\u0026#39;, # Four.meme \u0026#39;fourmeme\u0026#39;, \u0026#39;four meme\u0026#39;, \u0026#39;4meme\u0026#39;, # CZ/ \u0026#39;czs dog\u0026#39;, \u0026#39;cz dog\u0026#39;, \u0026#39;bnb dog\u0026#39;, \u0026#39;build on bnb\u0026#39;, \u0026#39;bnb ecosystem\u0026#39;, } BINANCE_CZ_PATTERNS = [ r\u0026#39;\\bcz\\b\u0026#39;, r\u0026#39;\\bbinance\\b\u0026#39;, r\u0026#39;\\bbnb\\b\u0026#39;, r\u0026#39;\\bheyi\\b\u0026#39;, r\u0026#39;\\byi\\s*he\\b\u0026#39;, r\u0026#39;\\bhe\\s*yi\\b\u0026#39;, r\u0026#39;\\b\\b\u0026#39;, r\u0026#39;\\b\\b\u0026#39;, r\u0026#39;\\bpancake\\b\u0026#39;, r\u0026#39;\\bgiggle\\b\u0026#39;, r\u0026#39;\\byzi\\b\u0026#39;, r\u0026#39;\\bfourmeme\\b\u0026#39;, r\u0026#39;\\b4meme\\b\u0026#39;, ] # ============================================================ # /（★★） # ============================================================ CELEBRITY_VIRAL_KEYWORDS = { # \u0026#39;vitalik\u0026#39;, \u0026#39;buterin\u0026#39;, \u0026#39;sam altman\u0026#39;, \u0026#39;satoshi\u0026#39;, \u0026#39;michael saylor\u0026#39;, \u0026#39;saylor\u0026#39;, \u0026#39;cathie wood\u0026#39;, \u0026#39;jack dorsey\u0026#39;, \u0026#39;zuckerberg\u0026#39;, \u0026#39;bezos\u0026#39;, \u0026#39;jensen huang\u0026#39;, \u0026#39;nvidia\u0026#39;, \u0026#39;tim cook\u0026#39;, # \u0026#39;justin sun\u0026#39;, \u0026#39;sun yuchen\u0026#39;, \u0026#39;\u0026#39;, \u0026#39;tron\u0026#39;, \u0026#39;arthur hayes\u0026#39;, \u0026#39;su zhu\u0026#39;, \u0026#39;3ac\u0026#39;, \u0026#39;brian armstrong\u0026#39;, \u0026#39;coinbase\u0026#39;, \u0026#39;larry fink\u0026#39;, \u0026#39;blackrock\u0026#39;, \u0026#39;gary gensler\u0026#39;, \u0026#39;sec\u0026#39;, \u0026#39;michael novogratz\u0026#39;, \u0026#39;galaxy\u0026#39;, # / \u0026#39;biden\u0026#39;, \u0026#39;obama\u0026#39;, \u0026#39;putin\u0026#39;, \u0026#39;xi jinping\u0026#39;, \u0026#39;kanye\u0026#39;, \u0026#39;drake\u0026#39;, \u0026#39;snoop dogg\u0026#39;, \u0026#39;paris hilton\u0026#39;, \u0026#39;mark cuban\u0026#39;, \u0026#39;mr beast\u0026#39;, \u0026#39;mrbeast\u0026#39;, # （） \u0026#39;lobster\u0026#39;, \u0026#39;\u0026#39;, \u0026#39;lobsta\u0026#39;, \u0026#39;hawk tuah\u0026#39;, \u0026#39;griddy\u0026#39;, \u0026#39;skibidi\u0026#39;, \u0026#39;rizz\u0026#39;, \u0026#39;sigma\u0026#39;, \u0026#39;gyatt\u0026#39;, # \u0026#39;etf\u0026#39;, \u0026#39;halving\u0026#39;, \u0026#39;\u0026#39;, \u0026#39;world war\u0026#39;, \u0026#39;wwiii\u0026#39;, \u0026#39;fed\u0026#39;, \u0026#39;rate cut\u0026#39;, \u0026#39;\u0026#39;, \u0026#39;tiktok ban\u0026#39;, \u0026#39;tiktok\u0026#39;, } CELEBRITY_VIRAL_PATTERNS = [ r\u0026#39;\\bvitalik\\b\u0026#39;, r\u0026#39;\\bsaylor\\b\u0026#39;, r\u0026#39;\\bblackrock\\b\u0026#39;, r\u0026#39;\\bcoinbase\\b\u0026#39;, r\u0026#39;\\bjustin\\s*sun\\b\u0026#39;, r\u0026#39;\\blobster\\b\u0026#39;, r\u0026#39;\\betf\\b\u0026#39;, r\u0026#39;\\bhalving\\b\u0026#39;, r\u0026#39;\\bmrbeast\\b\u0026#39;, r\u0026#39;\\bsnoop\\b\u0026#39;, r\u0026#39;\\bkanye\\b\u0026#39;, r\u0026#39;\\bdrake\\b\u0026#39;, ] # ============================================================ # （/） # ============================================================ SPAM_PATTERNS = [ r\u0026#39;airdrop\u0026#39;, r\u0026#39;presale\u0026#39;, r\u0026#39;pre\\s*sale\u0026#39;, r\u0026#39;1000x\u0026#39;, r\u0026#39;100x guaranteed\u0026#39;, r\u0026#39;safe\\s*moon\u0026#39;, r\u0026#39;baby\\s*\\w+\u0026#39;, # babydoge r\u0026#39;pornhub\u0026#39;, r\u0026#39;porn\u0026#39;, r\u0026#39;xxx\u0026#39;, r\u0026#39;nsfw\u0026#39;, r\u0026#39;nigga\u0026#39;, r\u0026#39;nigger\u0026#39;, r\u0026#39;faggot\u0026#39;, r\u0026#39;scam\u0026#39;, r\u0026#39;rugpull\u0026#39;, r\u0026#39;rug\\s*pull\u0026#39;, r\u0026#39;official\\s*token\u0026#39;, r\u0026#39;official\\s*coin\u0026#39;, ] # （） COMMON_NOISE_WORDS = { \u0026#39;nice\u0026#39;, \u0026#39;good\u0026#39;, \u0026#39;bad\u0026#39;, \u0026#39;cool\u0026#39;, \u0026#39;hot\u0026#39;, \u0026#39;big\u0026#39;, \u0026#39;small\u0026#39;, \u0026#39;life\u0026#39;, \u0026#39;love\u0026#39;, \u0026#39;hate\u0026#39;, \u0026#39;happy\u0026#39;, \u0026#39;sad\u0026#39;, \u0026#39;fun\u0026#39;, \u0026#39;lol\u0026#39;, \u0026#39;cat\u0026#39;, \u0026#39;dog\u0026#39;, \u0026#39;moon\u0026#39;, \u0026#39;sun\u0026#39;, \u0026#39;star\u0026#39;, \u0026#39;king\u0026#39;, \u0026#39;queen\u0026#39;, \u0026#39;gold\u0026#39;, \u0026#39;rich\u0026#39;, \u0026#39;cash\u0026#39;, \u0026#39;money\u0026#39;, \u0026#39;pay\u0026#39;, \u0026#39;buy\u0026#39;, \u0026#39;sell\u0026#39;, \u0026#39;pump\u0026#39;, \u0026#39;dump\u0026#39;, \u0026#39;bull\u0026#39;, \u0026#39;bear\u0026#39;, \u0026#39;green\u0026#39;, \u0026#39;red\u0026#39;, \u0026#39;hello\u0026#39;, \u0026#39;world\u0026#39;, \u0026#39;yes\u0026#39;, \u0026#39;no\u0026#39;, \u0026#39;wow\u0026#39;, \u0026#39;omg\u0026#39;, \u0026#39;lmao\u0026#39;, \u0026#39;simp\u0026#39;, \u0026#39;chad\u0026#39;, \u0026#39;based\u0026#39;, \u0026#39;cope\u0026#39;, \u0026#39;seethe\u0026#39;, \u0026#39;test\u0026#39;, \u0026#39;new\u0026#39;, \u0026#39;old\u0026#39;, \u0026#39;real\u0026#39;, \u0026#39;fake\u0026#39;, # \u0026#39;shit\u0026#39;, \u0026#39;shitcoin\u0026#39;, \u0026#39;fuck\u0026#39;, \u0026#39;fart\u0026#39;, \u0026#39;poop\u0026#39;, \u0026#39;pee\u0026#39;, \u0026#39;cum\u0026#39;, \u0026#39;dick\u0026#39;, \u0026#39;ass\u0026#39;, \u0026#39;boob\u0026#39;, \u0026#39;tit\u0026#39;, \u0026#39;nigga\u0026#39;, \u0026#39;retard\u0026#39;, \u0026#39;slop\u0026#39;, # \u0026#39;the\u0026#39;, \u0026#39;and\u0026#39;, \u0026#39;for\u0026#39;, \u0026#39;from\u0026#39;, \u0026#39;with\u0026#39;, \u0026#39;this\u0026#39;, \u0026#39;that\u0026#39;, \u0026#39;coin\u0026#39;, \u0026#39;token\u0026#39;, \u0026#39;meme\u0026#39;, \u0026#39;pepe\u0026#39;, \u0026#39;wojak\u0026#39;, \u0026#39;peg\u0026#39;, \u0026#39;usd\u0026#39;, \u0026#39;usdt\u0026#39;, \u0026#39;usdc\u0026#39;, \u0026#39;dai\u0026#39;, } # ============================================================ # # ============================================================ def log(msg): ts = datetime.now().strftime(\u0026#34;%Y-%m-%d %H:%M:%S\u0026#34;) line = f\u0026#34;[{ts}] {msg}\u0026#34; print(line) os.makedirs(DATA_DIR, exist_ok=True) with open(LOG_FILE, \u0026#39;a\u0026#39;) as f: f.write(line + \u0026#39;\\n\u0026#39;) def load_flap_seen(): if os.path.exists(FLAP_SEEN_FILE): try: with open(FLAP_SEEN_FILE) as f: return json.load(f) except: pass return {} def save_flap_seen(data): # 7 cutoff = int(time.time()) - 86400 * 7 data = {k: v for k, v in data.items() if v \u0026gt; cutoff} with open(FLAP_SEEN_FILE, \u0026#39;w\u0026#39;) as f: json.dump(data, f) def tg_send(text, parse_mode=\u0026#39;Markdown\u0026#39;): if not TG_TOKEN: log(f\u0026#34;[TG] No token, skip: {text[:80]}\u0026#34;) return False try: resp = requests.post( f\u0026#39;https://api.telegram.org/bot{TG_TOKEN}/sendMessage\u0026#39;, json={\u0026#39;chat_id\u0026#39;: TG_CHAT_ID, \u0026#39;text\u0026#39;: text, \u0026#39;parse_mode\u0026#39;: parse_mode}, timeout=10 ) result = resp.json() if not result.get(\u0026#39;ok\u0026#39;): # Markdown if \u0026#39;can\\\u0026#39;t parse\u0026#39; in str(result.get(\u0026#39;description\u0026#39;, \u0026#39;\u0026#39;)).lower(): resp = requests.post( f\u0026#39;https://api.telegram.org/bot{TG_TOKEN}/sendMessage\u0026#39;, json={\u0026#39;chat_id\u0026#39;: TG_CHAT_ID, \u0026#39;text\u0026#39;: text}, timeout=10 ) else: log(f\u0026#34;[TG] Error: {result.get(\u0026#39;description\u0026#39;, \u0026#39;\u0026#39;)}\u0026#34;) return False return True except Exception as e: log(f\u0026#34;[TG] Send error: {e}\u0026#34;) return False # ============================================================ # # ============================================================ def init_db(): \u0026#34;\u0026#34;\u0026#34;SQLite\u0026#34;\u0026#34;\u0026#34; conn = sqlite3.connect(DB_FILE) c = conn.cursor() # c.execute(\u0026#39;\u0026#39;\u0026#39;CREATE TABLE IF NOT EXISTS narratives ( id INTEGER PRIMARY KEY AUTOINCREMENT, theme TEXT NOT NULL, -- （） first_token_name TEXT, -- first_token_address TEXT, -- first_chain TEXT, -- first_seen_at INTEGER, -- token_count INTEGER DEFAULT 1, -- last_seen_at INTEGER -- )\u0026#39;\u0026#39;\u0026#39;) # c.execute(\u0026#39;\u0026#39;\u0026#39;CREATE TABLE IF NOT EXISTS tokens_seen ( address TEXT PRIMARY KEY, chain TEXT, name TEXT, symbol TEXT, narrative_theme TEXT, category TEXT, -- \u0026#39;musk_trump\u0026#39; / \u0026#39;binance_cz\u0026#39; / \u0026#39;novel\u0026#39; / \u0026#39;common\u0026#39; first_seen_at INTEGER, market_cap REAL, pushed INTEGER DEFAULT 0, -- seen_count INTEGER DEFAULT 1 -- )\u0026#39;\u0026#39;\u0026#39;) # c.execute(\u0026#39;CREATE INDEX IF NOT EXISTS idx_theme ON narratives(theme)\u0026#39;) c.execute(\u0026#39;CREATE INDEX IF NOT EXISTS idx_addr ON tokens_seen(address)\u0026#39;) conn.commit() return conn def normalize_theme(name, symbol): \u0026#34;\u0026#34;\u0026#34; + ：\u0026#39;Elon Mars Colony\u0026#39; → \u0026#39;elon mars colony\u0026#39; \u0026#39;TRUMP2028\u0026#39; → \u0026#39;trump\u0026#39; \u0026#39;PancakeBunny\u0026#39; → \u0026#39;pancake bunny\u0026#39; \u0026#34;\u0026#34;\u0026#34; # namesymbol text = f\u0026#34;{name} {symbol}\u0026#34;.lower().strip() # / noise = [\u0026#39;token\u0026#39;, \u0026#39;coin\u0026#39;, \u0026#39;inu\u0026#39;, \u0026#39;swap\u0026#39;, \u0026#39;finance\u0026#39;, \u0026#39;protocol\u0026#39;, \u0026#39;dao\u0026#39;, \u0026#39;defi\u0026#39;, \u0026#39;nft\u0026#39;, \u0026#39;meta\u0026#39;, \u0026#39;verse\u0026#39;, \u0026#39;fi\u0026#39;, \u0026#39;ai\u0026#39;, \u0026#39;pepe\u0026#39;, \u0026#39;wojak\u0026#39;, \u0026#39;chad\u0026#39;, \u0026#39;based\u0026#39;] # camelCase text = re.sub(r\u0026#39;([a-z])([A-Z])\u0026#39;, r\u0026#39;\\1 \\2\u0026#39;, text) # （2028、1000x） text = re.sub(r\u0026#39;\\d+x?\u0026#39;, \u0026#39;\u0026#39;, text) # text = re.sub(r\u0026#39;[^a-z\\s]\u0026#39;, \u0026#39; \u0026#39;, text) # words = [w for w in text.split() if w and len(w) \u0026gt; 1 and w not in noise] if not words: return name.lower().strip() return \u0026#39; \u0026#39;.join(sorted(set(words))) def is_similar_theme(theme1, theme2, threshold=0.7): \u0026#34;\u0026#34;\u0026#34;\u0026#34;\u0026#34;\u0026#34; if theme1 == theme2: return True # if theme1 in theme2 or theme2 in theme1: return True # words1 = set(theme1.split()) words2 = set(theme2.split()) if words1 and words2: overlap = len(words1 \u0026amp; words2) / min(len(words1), len(words2)) if overlap \u0026gt;= 0.6: return True # return SequenceMatcher(None, theme1, theme2).ratio() \u0026gt;= threshold def check_narrative_novelty(conn, theme, name, symbol, address, chain): \u0026#34;\u0026#34;\u0026#34; ： (\u0026#39;novel\u0026#39;, None) — (\u0026#39;heating\u0026#39;, narrative_row) — ！！ (\u0026#39;existing\u0026#39;, existing_theme_row) — ， ：302+ = \u0026#34;\u0026#34;\u0026#34; c = conn.cursor() now = int(time.time()) HEAT_WINDOW = 1800 # 30 HEAT_THRESHOLD = 2 # 2 # c.execute(\u0026#39;SELECT id, theme, first_token_name, first_token_address, first_chain, first_seen_at, token_count, last_seen_at FROM narratives WHERE theme = ?\u0026#39;, (theme,)) exact = c.fetchone() if exact: row_id, _, _, _, _, first_seen, count, last_seen = exact # new_count = count + 1 c.execute(\u0026#39;UPDATE narratives SET token_count = ?, last_seen_at = ? WHERE theme = ?\u0026#39;, (new_count, now, theme)) conn.commit() # ：HEAT_WINDOW if now - first_seen \u0026lt; HEAT_WINDOW and new_count \u0026gt;= HEAT_THRESHOLD: return (\u0026#39;heating\u0026#39;, exact) # ：（） if now - last_seen \u0026lt; HEAT_WINDOW and new_count \u0026gt;= HEAT_THRESHOLD: return (\u0026#39;heating\u0026#39;, exact) return (\u0026#39;existing\u0026#39;, exact) # — 1000 c.execute(\u0026#39;SELECT id, theme, first_token_name, first_token_address, first_chain, first_seen_at, token_count, last_seen_at FROM narratives ORDER BY last_seen_at DESC LIMIT 1000\u0026#39;) for row in c.fetchall(): if is_similar_theme(theme, row[1]): row_id, _, _, _, _, first_seen, count, last_seen = row new_count = count + 1 c.execute(\u0026#39;UPDATE narratives SET token_count = ?, last_seen_at = ? WHERE id = ?\u0026#39;, (new_count, now, row[0])) conn.commit() # if now - last_seen \u0026lt; HEAT_WINDOW and new_count \u0026gt;= HEAT_THRESHOLD: return (\u0026#39;heating\u0026#39;, row) return (\u0026#39;existing\u0026#39;, row) # — c.execute(\u0026#39;\u0026#39;\u0026#39;INSERT INTO narratives (theme, first_token_name, first_token_address, first_chain, first_seen_at, last_seen_at) VALUES (?, ?, ?, ?, ?, ?)\u0026#39;\u0026#39;\u0026#39;, (theme, name, address, chain, now, now)) conn.commit() return (\u0026#39;novel\u0026#39;, None) def get_token_seen_count(conn, address): \u0026#34;\u0026#34;\u0026#34;\u0026#34;\u0026#34;\u0026#34; c = conn.cursor() c.execute(\u0026#39;SELECT seen_count FROM tokens_seen WHERE address = ?\u0026#39;, (address,)) row = c.fetchone() return row[0] if row else 0 def is_token_seen(conn, address): \u0026#34;\u0026#34;\u0026#34;\u0026#34;\u0026#34;\u0026#34; c = conn.cursor() c.execute(\u0026#39;SELECT address FROM tokens_seen WHERE address = ?\u0026#39;, (address,)) return c.fetchone() is not None def record_token(conn, address, chain, name, symbol, theme, category, mc, pushed=False): \u0026#34;\u0026#34;\u0026#34; — +1\u0026#34;\u0026#34;\u0026#34; c = conn.cursor() # c.execute(\u0026#39;SELECT seen_count FROM tokens_seen WHERE address = ?\u0026#39;, (address,)) existing = c.fetchone() if existing: # ：+1， new_count = existing[0] + 1 c.execute(\u0026#39;\u0026#39;\u0026#39;UPDATE tokens_seen SET seen_count = ?, market_cap = ?, category = ? WHERE address = ?\u0026#39;\u0026#39;\u0026#39;, (new_count, mc, category, address)) else: # c.execute(\u0026#39;\u0026#39;\u0026#39;INSERT INTO tokens_seen (address, chain, name, symbol, narrative_theme, category, first_seen_at, market_cap, pushed, seen_count) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, 1)\u0026#39;\u0026#39;\u0026#39;, (address, chain, name, symbol, theme, category, int(time.time()), mc, 1 if pushed else 0)) conn.commit() # ============================================================ # # ============================================================ def classify_narrative(name, symbol, chain): \u0026#34;\u0026#34;\u0026#34; ：(\u0026#39;musk_trump\u0026#39;, matched_keywords) / (\u0026#39;binance_cz\u0026#39;, matched_keywords) / (\u0026#39;novel\u0026#39;, None) / (\u0026#39;common\u0026#39;, None) \u0026#34;\u0026#34;\u0026#34; text = f\u0026#34;{name} {symbol}\u0026#34;.lower() # 1. for pat in SPAM_PATTERNS: if re.search(pat, text, re.IGNORECASE): return (\u0026#39;spam\u0026#39;, None) # 2. / matched_mt = [] for kw in MUSK_TRUMP_KEYWORDS: if kw.lower() in text: matched_mt.append(kw) if not matched_mt: for pat in MUSK_TRUMP_PATTERNS: m = re.search(pat, text, re.IGNORECASE) if m: matched_mt.append(m.group()) if matched_mt: # /：ETH+SOL，BSC chain_lower = chain.lower() if chain_lower in (\u0026#39;eth\u0026#39;, \u0026#39;ethereum\u0026#39;, \u0026#39;sol\u0026#39;, \u0026#39;solana\u0026#39;, \u0026#39;bsc\u0026#39;, \u0026#39;base\u0026#39;): return (\u0026#39;musk_trump\u0026#39;, matched_mt) # 3. /CZ — BSC matched_bc = [] for kw in BINANCE_CZ_KEYWORDS: if kw.lower() in text: matched_bc.append(kw) if not matched_bc: for pat in BINANCE_CZ_PATTERNS: m = re.search(pat, text, re.IGNORECASE) if m: matched_bc.append(m.group()) if matched_bc: chain_lower = chain.lower() if chain_lower in (\u0026#39;bsc\u0026#39;,): return (\u0026#39;binance_cz\u0026#39;, matched_bc) else: return (\u0026#39;binance_cz_wrong_chain\u0026#39;, matched_bc) # 4. /（★★） matched_cv = [] for kw in CELEBRITY_VIRAL_KEYWORDS: if kw.lower() in text: matched_cv.append(kw) if not matched_cv: for pat in CELEBRITY_VIRAL_PATTERNS: m = re.search(pat, text, re.IGNORECASE) if m: matched_cv.append(m.group()) if matched_cv: return (\u0026#39;celebrity_viral\u0026#39;, matched_cv) # 5. → return (\u0026#39;check_novelty\u0026#39;, None) # ============================================================ # （） # ============================================================ def check_token_safety(chain, address): \u0026#34;\u0026#34;\u0026#34; — （/），\u0026#34;\u0026#34;\u0026#34; if chain in (\u0026#39;sol\u0026#39;, \u0026#39;solana\u0026#39;): try: r = requests.get(f\u0026#39;https://api.rugcheck.xyz/v1/tokens/{address}/report\u0026#39;, timeout=10) if r.status_code == 200: data = r.json() score = data.get(\u0026#39;score\u0026#39;, 999) mint = data.get(\u0026#39;mintAuthority\u0026#39;) freeze = data.get(\u0026#39;freezeAuthority\u0026#39;) return { \u0026#39;safe\u0026#39;: not mint and not freeze, \u0026#39;score\u0026#39;: score, \u0026#39;mint\u0026#39;: mint is not None, \u0026#39;freeze\u0026#39;: freeze is not None } except: pass else: chain_map = {\u0026#39;ethereum\u0026#39;: \u0026#39;1\u0026#39;, \u0026#39;eth\u0026#39;: \u0026#39;1\u0026#39;, \u0026#39;bsc\u0026#39;: \u0026#39;56\u0026#39;, \u0026#39;base\u0026#39;: \u0026#39;8453\u0026#39;} cid = chain_map.get(chain, \u0026#39;1\u0026#39;) try: r = requests.get(f\u0026#39;https://api.gopluslabs.io/api/v1/token_security/{cid}?contract_addresses={address}\u0026#39;, timeout=10) if r.status_code == 200: result = r.json().get(\u0026#39;result\u0026#39;, {}) data = result.get(address.lower(), {}) if data: honeypot = data.get(\u0026#39;is_honeypot\u0026#39;, \u0026#39;0\u0026#39;) == \u0026#39;1\u0026#39; mintable = data.get(\u0026#39;is_mintable\u0026#39;, \u0026#39;0\u0026#39;) == \u0026#39;1\u0026#39; sell_tax = float(data.get(\u0026#39;sell_tax\u0026#39;, \u0026#39;0\u0026#39;) or \u0026#39;0\u0026#39;) buy_tax = float(data.get(\u0026#39;buy_tax\u0026#39;, \u0026#39;0\u0026#39;) or \u0026#39;0\u0026#39;) return { \u0026#39;safe\u0026#39;: not honeypot and not mintable, # \u0026#39;honeypot\u0026#39;: honeypot, \u0026#39;mintable\u0026#39;: mintable, \u0026#39;sell_tax\u0026#39;: sell_tax, \u0026#39;buy_tax\u0026#39;: buy_tax } except: pass return {\u0026#39;safe\u0026#39;: False, \u0026#39;reason\u0026#39;: \u0026#39;\u0026#39;} # ， # ============================================================ # GMGN # ============================================================ def gmgn_get(url): try: resp = requests.get(url, headers=GMGN_HEADERS, timeout=15) if resp.status_code == 200: return resp.json().get(\u0026#39;data\u0026#39;, {}) except: pass return {} def fetch_token_description(chain, address): \u0026#34;\u0026#34;\u0026#34;/ — \u0026#34;\u0026#34;\u0026#34; desc = \u0026#39;\u0026#39; # SOL：Pump.fundescription if chain in (\u0026#39;sol\u0026#39;, \u0026#39;solana\u0026#39;): try: r = requests.get(f\u0026#39;https://frontend-api-v3.pump.fun/coins/{address}\u0026#39;, timeout=8) if r.status_code == 200: data = r.json() desc = data.get(\u0026#39;description\u0026#39;, \u0026#39;\u0026#39;) or \u0026#39;\u0026#39; twitter = data.get(\u0026#39;twitter\u0026#39;, \u0026#39;\u0026#39;) or \u0026#39;\u0026#39; telegram = data.get(\u0026#39;telegram\u0026#39;, \u0026#39;\u0026#39;) or \u0026#39;\u0026#39; website = data.get(\u0026#39;website\u0026#39;, \u0026#39;\u0026#39;) or \u0026#39;\u0026#39; return { \u0026#39;description\u0026#39;: desc.strip(), \u0026#39;twitter\u0026#39;: twitter, \u0026#39;telegram\u0026#39;: telegram, \u0026#39;website\u0026#39;: website, } except: pass # ：DEXScreener info（+） try: chain_dex = {\u0026#39;sol\u0026#39;: \u0026#39;solana\u0026#39;, \u0026#39;eth\u0026#39;: \u0026#39;ethereum\u0026#39;, \u0026#39;bsc\u0026#39;: \u0026#39;bsc\u0026#39;, \u0026#39;base\u0026#39;: \u0026#39;base\u0026#39;, \u0026#39;solana\u0026#39;: \u0026#39;solana\u0026#39;, \u0026#39;ethereum\u0026#39;: \u0026#39;ethereum\u0026#39;}.get(chain, chain) r = requests.get(f\u0026#39;https://api.dexscreener.com/latest/dex/tokens/{address}\u0026#39;, timeout=8) if r.status_code == 200: pairs = r.json().get(\u0026#39;pairs\u0026#39;, []) if pairs: info = pairs[0].get(\u0026#39;info\u0026#39;, {}) websites = info.get(\u0026#39;websites\u0026#39;, []) socials = info.get(\u0026#39;socials\u0026#39;, []) twitter = \u0026#39;\u0026#39; telegram = \u0026#39;\u0026#39; website = \u0026#39;\u0026#39; for s in socials: if s.get(\u0026#39;type\u0026#39;) == \u0026#39;twitter\u0026#39;: twitter = s.get(\u0026#39;url\u0026#39;, \u0026#39;\u0026#39;) elif s.get(\u0026#39;type\u0026#39;) == \u0026#39;telegram\u0026#39;: telegram = s.get(\u0026#39;url\u0026#39;, \u0026#39;\u0026#39;) for w in websites: if w.get(\u0026#39;label\u0026#39;, \u0026#39;\u0026#39;).lower() == \u0026#39;website\u0026#39;: website = w.get(\u0026#39;url\u0026#39;, \u0026#39;\u0026#39;) if not desc: # DEXScreenerdescription return { \u0026#39;description\u0026#39;: desc, \u0026#39;twitter\u0026#39;: twitter, \u0026#39;telegram\u0026#39;: telegram, \u0026#39;website\u0026#39;: website, } except: pass return {\u0026#39;description\u0026#39;: desc, \u0026#39;twitter\u0026#39;: \u0026#39;\u0026#39;, \u0026#39;telegram\u0026#39;: \u0026#39;\u0026#39;, \u0026#39;website\u0026#39;: \u0026#39;\u0026#39;} def fetch_new_tokens(): \u0026#34;\u0026#34;\u0026#34;GMGN + \u0026#34;\u0026#34;\u0026#34; all_tokens = [] seen_addrs = set() for chain in [\u0026#39;eth\u0026#39;, \u0026#39;bsc\u0026#39;, \u0026#39;base\u0026#39;]: # ， urls = [ # — f\u0026#39;https://gmgn.ai/defi/quotation/v1/rank/{chain}/swaps/1h?orderby=open_timestamp\u0026amp;direction=desc\u0026amp;limit=100\u0026#39;, # — f\u0026#39;https://gmgn.ai/defi/quotation/v1/rank/{chain}/swaps/1h?orderby=swaps\u0026amp;direction=desc\u0026amp;limit=50\u0026#39;, ] for url in urls: data = gmgn_get(url) tokens = data.get(\u0026#39;rank\u0026#39;, []) for t in tokens: addr = t.get(\u0026#39;address\u0026#39;, \u0026#39;\u0026#39;) if not addr or addr in seen_addrs: continue mc = t.get(\u0026#39;market_cap\u0026#39;, 0) or t.get(\u0026#39;fdv\u0026#39;, 0) or 0 liq = t.get(\u0026#39;liquidity\u0026#39;, 0) or 0 # ： if mc \u0026lt; 1000 or liq \u0026lt; 500 or mc \u0026gt; 10000000: continue age_ts = t.get(\u0026#39;open_timestamp\u0026#39;, 0) age_h = (time.time() - age_ts) / 3600 if age_ts \u0026gt; 0 else 999 # — ：， seen_addrs.add(addr) all_tokens.append({ \u0026#39;address\u0026#39;: addr, \u0026#39;chain\u0026#39;: chain, \u0026#39;name\u0026#39;: t.get(\u0026#39;name\u0026#39;, \u0026#39;?\u0026#39;), \u0026#39;symbol\u0026#39;: t.get(\u0026#39;symbol\u0026#39;, \u0026#39;?\u0026#39;), \u0026#39;mc\u0026#39;: mc, \u0026#39;liq\u0026#39;: liq, \u0026#39;volume\u0026#39;: t.get(\u0026#39;volume\u0026#39;, 0) or 0, \u0026#39;holders\u0026#39;: t.get(\u0026#39;holder_count\u0026#39;, 0) or 0, \u0026#39;sm\u0026#39;: t.get(\u0026#39;smart_degen_count\u0026#39;, 0) or 0, \u0026#39;chg_1h\u0026#39;: t.get(\u0026#39;price_change_percent1h\u0026#39;, 0) or 0, \u0026#39;chg_24h\u0026#39;: t.get(\u0026#39;price_change_percent\u0026#39;, 0) or 0, \u0026#39;age_h\u0026#39;: age_h, \u0026#39;price\u0026#39;: t.get(\u0026#39;price\u0026#39;, 0), \u0026#39;buys_1h\u0026#39;: t.get(\u0026#39;buys\u0026#39;, 0) or 0, \u0026#39;sells_1h\u0026#39;: t.get(\u0026#39;sells\u0026#39;, 0) or 0, }) time.sleep(0.3) return all_tokens def fetch_flap_tokens(): \u0026#34;\u0026#34;\u0026#34; FLAP — BSC ：（） ：24h，1h/，\u0026gt;，holders \u0026#34;\u0026#34;\u0026#34; data = gmgn_get( \u0026#39;https://gmgn.ai/defi/quotation/v1/rank/bsc/swaps/24h?launchpad=flap\u0026amp;orderby=volume\u0026amp;direction=desc\u0026amp;limit=30\u0026#39; ) tokens = data.get(\u0026#39;rank\u0026#39;, []) candidates = [] for t in tokens: addr = t.get(\u0026#39;address\u0026#39;, \u0026#39;\u0026#39;) if not addr: continue mc = t.get(\u0026#39;market_cap\u0026#39;, 0) or 0 liq = t.get(\u0026#39;liquidity\u0026#39;, 0) or 0 vol = t.get(\u0026#39;volume\u0026#39;, 0) or 0 holders = t.get(\u0026#39;holder_count\u0026#39;, 0) or 0 buys = t.get(\u0026#39;buys\u0026#39;, 0) or 0 sells = t.get(\u0026#39;sells\u0026#39;, 0) or 0 chg_1h = t.get(\u0026#39;price_change_percent1h\u0026#39;, 0) or 0 chg_24h = t.get(\u0026#39;price_change_percent\u0026#39;, 0) or 0 age_ts = t.get(\u0026#39;open_timestamp\u0026#39;, 0) age_h = (time.time() - age_ts) / 3600 if age_ts \u0026gt; 0 else 0 # if mc \u0026lt; 1000 or liq \u0026lt; 500: continue if holders \u0026lt; 5: continue # ： # 1: 24h（）， # 2: 1h24h， # 3: \u0026gt; ， buy_ratio = buys / max(sells, 1) is_support = False reason = \u0026#39;\u0026#39; # A: 24h，1h/ if chg_24h \u0026lt; -10 and chg_1h \u0026gt; chg_24h * 0.3: is_support = True reason = f\u0026#39;24h{chg_24h:.0f}%1h{chg_1h:+.0f}%\u0026#39; # B: 24h，1h， if -10 \u0026lt;= chg_24h \u0026lt;= 30 and chg_1h \u0026gt; -5 and buy_ratio \u0026gt; 1.1: is_support = True reason = f\u0026#39; {buy_ratio:.2f}\u0026#39; # C: if chg_24h \u0026lt; -30 and chg_1h \u0026gt; 10: is_support = True reason = f\u0026#39;{chg_24h:.0f}%{chg_1h:+.0f}%\u0026#39; if is_support and buy_ratio \u0026gt;= 1.0: candidates.append({ \u0026#39;address\u0026#39;: addr, \u0026#39;chain\u0026#39;: \u0026#39;bsc\u0026#39;, \u0026#39;name\u0026#39;: t.get(\u0026#39;name\u0026#39;, \u0026#39;?\u0026#39;), \u0026#39;symbol\u0026#39;: t.get(\u0026#39;symbol\u0026#39;, \u0026#39;?\u0026#39;), \u0026#39;mc\u0026#39;: mc, \u0026#39;liq\u0026#39;: liq, \u0026#39;volume\u0026#39;: vol, \u0026#39;holders\u0026#39;: holders, \u0026#39;sm\u0026#39;: 0, \u0026#39;chg_1h\u0026#39;: chg_1h, \u0026#39;chg_24h\u0026#39;: chg_24h, \u0026#39;age_h\u0026#39;: age_h, \u0026#39;price\u0026#39;: t.get(\u0026#39;price\u0026#39;, 0), \u0026#39;buys\u0026#39;: buys, \u0026#39;sells\u0026#39;: sells, \u0026#39;buy_ratio\u0026#39;: buy_ratio, \u0026#39;support_reason\u0026#39;: reason, \u0026#39;launchpad\u0026#39;: \u0026#39;flap\u0026#39;, }) # candidates.sort(key=lambda x: x[\u0026#39;mc\u0026#39;], reverse=True) return candidates def format_flap_alert(token, desc_info=None): \u0026#34;\u0026#34;\u0026#34;FLAP\u0026#34;\u0026#34;\u0026#34; msg = f\u0026#34; — FLAP\\n\u0026#34; msg += f\u0026#34;: BSC | : FLAP\\n\\n\u0026#34; msg += f\u0026#34;{token[\u0026#39;name\u0026#39;]} ({token[\u0026#39;symbol\u0026#39;]})\\n\u0026#34; msg += f\u0026#34;`{token[\u0026#39;address\u0026#39;]}`\\n\\n\u0026#34; # desc = (desc_info or {}).get(\u0026#39;description\u0026#39;, \u0026#39;\u0026#39;) if desc: if len(desc) \u0026gt; 200: desc = desc[:200] + \u0026#39;...\u0026#39; msg += f\u0026#34;: {desc}\\n\\n\u0026#34; msg += f\u0026#34;: {token[\u0026#39;support_reason\u0026#39;]}\\n\\n\u0026#34; msg += f\u0026#34;```\\n\u0026#34; msg += f\u0026#34; ${token[\u0026#39;mc\u0026#39;]:\u0026gt;12,.0f}\\n\u0026#34; msg += f\u0026#34; ${token[\u0026#39;liq\u0026#39;]:\u0026gt;12,.0f}\\n\u0026#34; msg += f\u0026#34;24h ${token[\u0026#39;volume\u0026#39;]:\u0026gt;12,.0f}\\n\u0026#34; msg += f\u0026#34; {token[\u0026#39;holders\u0026#39;]:\u0026gt;12,d}\\n\u0026#34; msg += f\u0026#34;/ {token[\u0026#39;buys\u0026#39;]:\u0026gt;6,d}/{token[\u0026#39;sells\u0026#39;]:\u0026gt;6,d}\\n\u0026#34; msg += f\u0026#34; {token[\u0026#39;buy_ratio\u0026#39;]:\u0026gt;12.2f}\\n\u0026#34; msg += f\u0026#34;1h {token[\u0026#39;chg_1h\u0026#39;]:\u0026gt;+11.1f}%\\n\u0026#34; msg += f\u0026#34;24h {token[\u0026#39;chg_24h\u0026#39;]:\u0026gt;+11.1f}%\\n\u0026#34; msg += f\u0026#34;```\\n\u0026#34; msg += \u0026#34;\\nFLAP — \u0026#34; # links = [] if (desc_info or {}).get(\u0026#39;twitter\u0026#39;): links.append(f\u0026#34;\\nTwitter: {desc_info[\u0026#39;twitter\u0026#39;]}\u0026#34;) if (desc_info or {}).get(\u0026#39;telegram\u0026#39;): links.append(f\u0026#34;TG: {desc_info[\u0026#39;telegram\u0026#39;]}\u0026#34;) if (desc_info or {}).get(\u0026#39;website\u0026#39;): links.append(f\u0026#34;Web: {desc_info[\u0026#39;website\u0026#39;]}\u0026#34;) if links: msg += \u0026#39;\\n\u0026#39;.join(links) return msg # ============================================================ # # ============================================================ def format_musk_trump_alert(token, matched_kw, desc_info=None): \u0026#34;\u0026#34;\u0026#34;/\u0026#34;\u0026#34;\u0026#34; chain_map = {\u0026#39;sol\u0026#39;: \u0026#39;SOL\u0026#39;, \u0026#39;eth\u0026#39;: \u0026#39;ETH\u0026#39;, \u0026#39;bsc\u0026#39;: \u0026#39;BSC\u0026#39;, \u0026#39;base\u0026#39;: \u0026#39;BASE\u0026#39;} ch = chain_map.get(token[\u0026#39;chain\u0026#39;], token[\u0026#39;chain\u0026#39;].upper()) msg = f\u0026#34; — /\\n\u0026#34; msg += f\u0026#34;: {ch}\\n\\n\u0026#34; msg += f\u0026#34;{token[\u0026#39;name\u0026#39;]} ({token[\u0026#39;symbol\u0026#39;]})\\n\u0026#34; msg += f\u0026#34;`{token[\u0026#39;address\u0026#39;]}`\\n\\n\u0026#34; # （！） desc = (desc_info or {}).get(\u0026#39;description\u0026#39;, \u0026#39;\u0026#39;) if desc: # 200， if len(desc) \u0026gt; 200: desc = desc[:200] + \u0026#39;...\u0026#39; msg += f\u0026#34;: {desc}\\n\\n\u0026#34; msg += f\u0026#34;: {\u0026#39;, \u0026#39;.join(matched_kw[:5])}\\n\\n\u0026#34; msg += f\u0026#34;```\\n\u0026#34; msg += f\u0026#34; ${token[\u0026#39;mc\u0026#39;]:\u0026gt;12,.0f}\\n\u0026#34; msg += f\u0026#34; ${token[\u0026#39;liq\u0026#39;]:\u0026gt;12,.0f}\\n\u0026#34; msg += f\u0026#34;1h {token[\u0026#39;chg_1h\u0026#39;]:\u0026gt;+11.1f}%\\n\u0026#34; if token.get(\u0026#39;sm\u0026#39;, 0) \u0026gt; 0: msg += f\u0026#34; {token[\u0026#39;sm\u0026#39;]:\u0026gt;12d}\\n\u0026#34; msg += f\u0026#34; {token[\u0026#39;age_h\u0026#39;]:\u0026gt;10.1f}h\\n\u0026#34; msg += f\u0026#34;```\\n\u0026#34; # links = [] if (desc_info or {}).get(\u0026#39;twitter\u0026#39;): links.append(f\u0026#34;Twitter: {desc_info[\u0026#39;twitter\u0026#39;]}\u0026#34;) if (desc_info or {}).get(\u0026#39;telegram\u0026#39;): links.append(f\u0026#34;TG: {desc_info[\u0026#39;telegram\u0026#39;]}\u0026#34;) if (desc_info or {}).get(\u0026#39;website\u0026#39;): links.append(f\u0026#34;Web: {desc_info[\u0026#39;website\u0026#39;]}\u0026#34;) if links: msg += \u0026#39;\\n\u0026#39; + \u0026#39;\\n\u0026#39;.join(links) return msg def format_binance_cz_alert(token, matched_kw, desc_info=None): \u0026#34;\u0026#34;\u0026#34;/CZ\u0026#34;\u0026#34;\u0026#34; msg = f\u0026#34; — /CZ\\n\u0026#34; msg += f\u0026#34;: BSC\\n\\n\u0026#34; msg += f\u0026#34;{token[\u0026#39;name\u0026#39;]} ({token[\u0026#39;symbol\u0026#39;]})\\n\u0026#34; msg += f\u0026#34;`{token[\u0026#39;address\u0026#39;]}`\\n\\n\u0026#34; # desc = (desc_info or {}).get(\u0026#39;description\u0026#39;, \u0026#39;\u0026#39;) if desc: if len(desc) \u0026gt; 200: desc = desc[:200] + \u0026#39;...\u0026#39; msg += f\u0026#34;: {desc}\\n\\n\u0026#34; msg += f\u0026#34;: {\u0026#39;, \u0026#39;.join(matched_kw[:5])}\\n\\n\u0026#34; msg += f\u0026#34;```\\n\u0026#34; msg += f\u0026#34; ${token[\u0026#39;mc\u0026#39;]:\u0026gt;12,.0f}\\n\u0026#34; msg += f\u0026#34; ${token[\u0026#39;liq\u0026#39;]:\u0026gt;12,.0f}\\n\u0026#34; msg += f\u0026#34;1h {token[\u0026#39;chg_1h\u0026#39;]:\u0026gt;+11.1f}%\\n\u0026#34; msg += f\u0026#34; {token[\u0026#39;age_h\u0026#39;]:\u0026gt;10.1f}h\\n\u0026#34; msg += f\u0026#34;```\\n\u0026#34; # links = [] if (desc_info or {}).get(\u0026#39;twitter\u0026#39;): links.append(f\u0026#34;Twitter: {desc_info[\u0026#39;twitter\u0026#39;]}\u0026#34;) if (desc_info or {}).get(\u0026#39;telegram\u0026#39;): links.append(f\u0026#34;TG: {desc_info[\u0026#39;telegram\u0026#39;]}\u0026#34;) if (desc_info or {}).get(\u0026#39;website\u0026#39;): links.append(f\u0026#34;Web: {desc_info[\u0026#39;website\u0026#39;]}\u0026#34;) if links: msg += \u0026#39;\\n\u0026#39; + \u0026#39;\\n\u0026#39;.join(links) return msg def format_novel_narrative_alert(token, theme, desc_info=None): \u0026#34;\u0026#34;\u0026#34; — \u0026#34;\u0026#34;\u0026#34; return format_heating_narrative_alert(token, theme, 1, desc_info) def format_heating_narrative_alert(token, theme, count, desc_info=None): \u0026#34;\u0026#34;\u0026#34; — \u0026#34;\u0026#34;\u0026#34; chain_map = {\u0026#39;sol\u0026#39;: \u0026#39;SOL\u0026#39;, \u0026#39;eth\u0026#39;: \u0026#39;ETH\u0026#39;, \u0026#39;bsc\u0026#39;: \u0026#39;BSC\u0026#39;, \u0026#39;base\u0026#39;: \u0026#39;BASE\u0026#39;} ch = chain_map.get(token[\u0026#39;chain\u0026#39;], token[\u0026#39;chain\u0026#39;].upper()) msg = f\u0026#34; — \\n\u0026#34; msg += f\u0026#34;: {ch}\\n\\n\u0026#34; msg += f\u0026#34;{token[\u0026#39;name\u0026#39;]} ({token[\u0026#39;symbol\u0026#39;]})\\n\u0026#34; msg += f\u0026#34;`{token[\u0026#39;address\u0026#39;]}`\\n\\n\u0026#34; # desc = (desc_info or {}).get(\u0026#39;description\u0026#39;, \u0026#39;\u0026#39;) if desc: if len(desc) \u0026gt; 300: desc = desc[:300] + \u0026#39;...\u0026#39; msg += f\u0026#34;: {desc}\\n\\n\u0026#34; else: msg += f\u0026#34;: {theme}\\n\\n\u0026#34; msg += f\u0026#34;{count} — \\n\\n\u0026#34; msg += f\u0026#34;```\\n\u0026#34; msg += f\u0026#34; ${token[\u0026#39;mc\u0026#39;]:\u0026gt;12,.0f}\\n\u0026#34; msg += f\u0026#34; ${token[\u0026#39;liq\u0026#39;]:\u0026gt;12,.0f}\\n\u0026#34; msg += f\u0026#34;1h {token[\u0026#39;chg_1h\u0026#39;]:\u0026gt;+11.1f}%\\n\u0026#34; if token.get(\u0026#39;sm\u0026#39;, 0) \u0026gt; 0: msg += f\u0026#34; {token[\u0026#39;sm\u0026#39;]:\u0026gt;12d}\\n\u0026#34; msg += f\u0026#34; {token[\u0026#39;holders\u0026#39;]:\u0026gt;12d}\\n\u0026#34; msg += f\u0026#34; {token[\u0026#39;age_h\u0026#39;]:\u0026gt;10.1f}h\\n\u0026#34; msg += f\u0026#34;```\u0026#34; # links = [] if (desc_info or {}).get(\u0026#39;twitter\u0026#39;): links.append(f\u0026#34;\\nTwitter: {desc_info[\u0026#39;twitter\u0026#39;]}\u0026#34;) if (desc_info or {}).get(\u0026#39;telegram\u0026#39;): links.append(f\u0026#34;TG: {desc_info[\u0026#39;telegram\u0026#39;]}\u0026#34;) if (desc_info or {}).get(\u0026#39;website\u0026#39;): links.append(f\u0026#34;Web: {desc_info[\u0026#39;website\u0026#39;]}\u0026#34;) if links: msg += \u0026#39;\\n\u0026#39;.join(links) return msg # ============================================================ # — + # ============================================================ def track_momentum(tokens): \u0026#34;\u0026#34;\u0026#34; 。 + = ，。 \u0026#34;\u0026#34;\u0026#34; global MOMENTUM_TRACKER, MOMENTUM_PUSHED now = time.time() alerts = [] # current_addrs = set() for token in tokens: addr = token[\u0026#39;address\u0026#39;] mc = token[\u0026#39;mc\u0026#39;] vol = token.get(\u0026#39;volume\u0026#39;, 0) or 0 price = token.get(\u0026#39;price\u0026#39;, 0) or 0 buys = token.get(\u0026#39;buys_1h\u0026#39;, 0) or token.get(\u0026#39;buys\u0026#39;, 0) or 0 current_addrs.add(addr) # if mc \u0026lt; 1000 or token.get(\u0026#39;liq\u0026#39;, 0) \u0026lt; 500 or mc \u0026gt; 10000000: continue # — （GMGN） if addr not in MOMENTUM_TRACKER: MOMENTUM_TRACKER[addr] = [] snapshots = MOMENTUM_TRACKER[addr] # （） if snapshots and snapshots[-1][\u0026#39;mc\u0026#39;] == mc and snapshots[-1][\u0026#39;vol\u0026#39;] == vol: continue # ， snapshots.append({ \u0026#39;ts\u0026#39;: now, \u0026#39;mc\u0026#39;: mc, \u0026#39;vol\u0026#39;: vol, \u0026#39;price\u0026#39;: price, \u0026#39;buys\u0026#39;: buys, }) # 20（200） if len(snapshots) \u0026gt; 20: snapshots[:] = snapshots[-20:] # 3 if len(snapshots) \u0026lt; MOMENTUM_CONSECUTIVE_UP: continue # N recent = snapshots[-MOMENTUM_CONSECUTIVE_UP:] consecutive_up = True total_gain = 0 for i in range(1, len(recent)): prev_mc = recent[i-1][\u0026#39;mc\u0026#39;] curr_mc = recent[i][\u0026#39;mc\u0026#39;] if prev_mc \u0026lt;= 0: consecutive_up = False break gain = (curr_mc - prev_mc) / prev_mc if gain \u0026lt;= 0: # consecutive_up = False break total_gain += gain if not consecutive_up: continue # ！（） vol_increasing = True for i in range(1, len(recent)): if recent[i][\u0026#39;buys\u0026#39;] \u0026lt; recent[i-1][\u0026#39;buys\u0026#39;] * 0.8: # vol_increasing = False break # first_mc = recent[0][\u0026#39;mc\u0026#39;] last_mc = recent[-1][\u0026#39;mc\u0026#39;] pct_gain = ((last_mc - first_mc) / first_mc * 100) if first_mc \u0026gt; 0 else 0 # ： + \u0026gt;5% if pct_gain \u0026lt; 5: continue # ：，+1 push_info = MOMENTUM_PUSHED.get(addr, {\u0026#39;count\u0026#39;: 0, \u0026#39;last_ts\u0026#39;: 0, \u0026#39;last_mc\u0026#39;: 0}) # （） if push_info[\u0026#39;count\u0026#39;] \u0026gt; 0 and last_mc \u0026lt;= push_info[\u0026#39;last_mc\u0026#39;]: continue push_info[\u0026#39;count\u0026#39;] += 1 push_info[\u0026#39;last_ts\u0026#39;] = now push_info[\u0026#39;last_mc\u0026#39;] = last_mc signal_count = push_info[\u0026#39;count\u0026#39;] # safety = check_token_safety(token[\u0026#39;chain\u0026#39;], addr) if not safety.get(\u0026#39;safe\u0026#39;): continue # → category, matched_kw = classify_narrative(token[\u0026#39;name\u0026#39;], token[\u0026#39;symbol\u0026#39;], token[\u0026#39;chain\u0026#39;]) is_flap = token.get(\u0026#39;launchpad\u0026#39;) == \u0026#39;flap\u0026#39; if category == \u0026#39;musk_trump\u0026#39;: stars = 3 narrative_tag = f\u0026#34;/ ({\u0026#39;, \u0026#39;.join(matched_kw[:3])})\u0026#34; elif category == \u0026#39;binance_cz\u0026#39;: stars = 3 narrative_tag = f\u0026#34;/CZ ({\u0026#39;, \u0026#39;.join(matched_kw[:3])})\u0026#34; elif category == \u0026#39;celebrity_viral\u0026#39;: stars = 2 narrative_tag = f\u0026#34;/ ({\u0026#39;, \u0026#39;.join(matched_kw[:3])})\u0026#34; elif is_flap: stars = 2 narrative_tag = \u0026#34;FLAP\u0026#34; else: # theme = normalize_theme(token[\u0026#39;name\u0026#39;], token[\u0026#39;symbol\u0026#39;]) theme_words = [w for w in theme.split() if w not in COMMON_NOISE_WORDS and len(w) \u0026gt; 2] if len(theme_words) \u0026gt;= 2: stars = 2 narrative_tag = f\u0026#34;: {theme}\u0026#34; else: stars = 1 narrative_tag = \u0026#34;\u0026#34; # desc_info = fetch_token_description(token[\u0026#39;chain\u0026#39;], addr) # FLAP/CTO if is_flap: has_twitter = bool(desc_info.get(\u0026#39;twitter\u0026#39;)) has_tg = bool(desc_info.get(\u0026#39;telegram\u0026#39;)) has_web = bool(desc_info.get(\u0026#39;website\u0026#39;)) community_tags = [] if has_twitter: community_tags.append(\u0026#34;\u0026#34;) if has_tg: community_tags.append(\u0026#34;TG\u0026#34;) if has_web: community_tags.append(\u0026#34;\u0026#34;) if community_tags: narrative_tag += f\u0026#34; | {\u0026#39; \u0026#39;.join(community_tags)}\u0026#34; stars = min(3, stars + 1) # else: narrative_tag += \u0026#34; | \u0026#34; msg = format_momentum_alert(token, pct_gain, len(recent), vol_increasing, stars, narrative_tag, desc_info, signal_count) alerts.append({\u0026#39;msg\u0026#39;: msg, \u0026#39;token\u0026#39;: token}) MOMENTUM_PUSHED[addr] = push_info log(f\u0026#34;[{signal_count}] {token[\u0026#39;name\u0026#39;]} ({token[\u0026#39;symbol\u0026#39;]}) on {token[\u0026#39;chain\u0026#39;]} — {len(recent)} +{pct_gain:.1f}%\u0026#34;) # stale = [a for a in MOMENTUM_TRACKER if a not in current_addrs] for a in stale: if now - MOMENTUM_TRACKER[a][-1][\u0026#39;ts\u0026#39;] \u0026gt; 600: # 10 del MOMENTUM_TRACKER[a] # — 1 MOMENTUM_PUSHED = {k: v for k, v in MOMENTUM_PUSHED.items() if now - v.get(\u0026#39;last_ts\u0026#39;, 0) \u0026lt; 3600} return alerts def format_momentum_alert(token, pct_gain, rounds, vol_up, stars, narrative_tag, desc_info=None, seen_count=0): \u0026#34;\u0026#34;\u0026#34; — \u0026#34;\u0026#34;\u0026#34; chain_map = {\u0026#39;sol\u0026#39;: \u0026#39;SOL\u0026#39;, \u0026#39;eth\u0026#39;: \u0026#39;ETH\u0026#39;, \u0026#39;bsc\u0026#39;: \u0026#39;BSC\u0026#39;, \u0026#39;base\u0026#39;: \u0026#39;BASE\u0026#39;} ch = chain_map.get(token[\u0026#39;chain\u0026#39;], token[\u0026#39;chain\u0026#39;].upper()) vol_tag = \u0026#34;\u0026#34; if vol_up else \u0026#34;\u0026#34; star_str = \u0026#34;★\u0026#34; * stars + \u0026#34;☆\u0026#34; * (3 - stars) # msg = f\u0026#34;\\n\u0026#34; msg += f\u0026#34;: {ch}\\n\\n\u0026#34; msg += f\u0026#34;{token[\u0026#39;name\u0026#39;]} ({token[\u0026#39;symbol\u0026#39;]})\\n\u0026#34; msg += f\u0026#34;`{token[\u0026#39;address\u0026#39;]}`\\n\\n\u0026#34; # desc = (desc_info or {}).get(\u0026#39;description\u0026#39;, \u0026#39;\u0026#39;) if desc: if len(desc) \u0026gt; 200: desc = desc[:200] + \u0026#39;...\u0026#39; msg += f\u0026#34;: {desc}\\n\\n\u0026#34; msg += f\u0026#34;: {narrative_tag}\\n\u0026#34; msg += f\u0026#34;{rounds} +{pct_gain:.1f}% {vol_tag}\\n\\n\u0026#34; msg += f\u0026#34;```\\n\u0026#34; msg += f\u0026#34; ${token[\u0026#39;mc\u0026#39;]:\u0026gt;12,.0f}\\n\u0026#34; msg += f\u0026#34; ${token[\u0026#39;liq\u0026#39;]:\u0026gt;12,.0f}\\n\u0026#34; msg += f\u0026#34;1h {token[\u0026#39;chg_1h\u0026#39;]:\u0026gt;+11.1f}%\\n\u0026#34; if token.get(\u0026#39;sm\u0026#39;, 0) \u0026gt; 0: msg += f\u0026#34; {token[\u0026#39;sm\u0026#39;]:\u0026gt;12d}\\n\u0026#34; msg += f\u0026#34; {token[\u0026#39;age_h\u0026#39;]:\u0026gt;10.1f}h\\n\u0026#34; msg += f\u0026#34;```\\n\u0026#34; msg += f\u0026#34;: {star_str} : {seen_count}\u0026#34; # links = [] if (desc_info or {}).get(\u0026#39;twitter\u0026#39;): links.append(f\u0026#34;\\nTwitter: {desc_info[\u0026#39;twitter\u0026#39;]}\u0026#34;) if (desc_info or {}).get(\u0026#39;telegram\u0026#39;): links.append(f\u0026#34;TG: {desc_info[\u0026#39;telegram\u0026#39;]}\u0026#34;) if (desc_info or {}).get(\u0026#39;website\u0026#39;): links.append(f\u0026#34;Web: {desc_info[\u0026#39;website\u0026#39;]}\u0026#34;) if links: msg += \u0026#39;\\n\u0026#39;.join(links) return msg def format_celebrity_alert(token, matched_kw, desc_info=None): \u0026#34;\u0026#34;\u0026#34;/ ★★\u0026#34;\u0026#34;\u0026#34; chain_map = {\u0026#39;sol\u0026#39;: \u0026#39;SOL\u0026#39;, \u0026#39;eth\u0026#39;: \u0026#39;ETH\u0026#39;, \u0026#39;bsc\u0026#39;: \u0026#39;BSC\u0026#39;, \u0026#39;base\u0026#39;: \u0026#39;BASE\u0026#39;} ch = chain_map.get(token[\u0026#39;chain\u0026#39;], token[\u0026#39;chain\u0026#39;].upper()) msg = f\u0026#34; — / ★★\\n\u0026#34; msg += f\u0026#34;: {ch}\\n\\n\u0026#34; msg += f\u0026#34;{token[\u0026#39;name\u0026#39;]} ({token[\u0026#39;symbol\u0026#39;]})\\n\u0026#34; msg += f\u0026#34;`{token[\u0026#39;address\u0026#39;]}`\\n\\n\u0026#34; desc = (desc_info or {}).get(\u0026#39;description\u0026#39;, \u0026#39;\u0026#39;) if desc: if len(desc) \u0026gt; 200: desc = desc[:200] + \u0026#39;...\u0026#39; msg += f\u0026#34;: {desc}\\n\\n\u0026#34; msg += f\u0026#34;: {\u0026#39;, \u0026#39;.join(matched_kw[:5])}\\n\\n\u0026#34; msg += f\u0026#34;```\\n\u0026#34; msg += f\u0026#34; ${token[\u0026#39;mc\u0026#39;]:\u0026gt;12,.0f}\\n\u0026#34; msg += f\u0026#34; ${token[\u0026#39;liq\u0026#39;]:\u0026gt;12,.0f}\\n\u0026#34; msg += f\u0026#34;1h {token[\u0026#39;chg_1h\u0026#39;]:\u0026gt;+11.1f}%\\n\u0026#34; if token.get(\u0026#39;sm\u0026#39;, 0) \u0026gt; 0: msg += f\u0026#34; {token[\u0026#39;sm\u0026#39;]:\u0026gt;12d}\\n\u0026#34; msg += f\u0026#34; {token[\u0026#39;age_h\u0026#39;]:\u0026gt;10.1f}h\\n\u0026#34; msg += f\u0026#34;```\u0026#34; links = [] if (desc_info or {}).get(\u0026#39;twitter\u0026#39;): links.append(f\u0026#34;\\nTwitter: {desc_info[\u0026#39;twitter\u0026#39;]}\u0026#34;) if (desc_info or {}).get(\u0026#39;telegram\u0026#39;): links.append(f\u0026#34;TG: {desc_info[\u0026#39;telegram\u0026#39;]}\u0026#34;) if links: msg += \u0026#39;\\n\u0026#39;.join(links) return msg # ============================================================ # # ============================================================ def scan_narratives(): \u0026#34;\u0026#34;\u0026#34;\u0026#34;\u0026#34;\u0026#34; conn = init_db() tokens = fetch_new_tokens() log(f\u0026#34; {len(tokens)} ...\u0026#34;) # === — ， === # FLAP flap_tokens = [] try: flap_tokens = fetch_flap_tokens() except: pass all_momentum_tokens = tokens + flap_tokens momentum_alerts = track_momentum(all_momentum_tokens) for token in tokens: addr = token[\u0026#39;address\u0026#39;] chain = token[\u0026#39;chain\u0026#39;] name = token[\u0026#39;name\u0026#39;] symbol = token[\u0026#39;symbol\u0026#39;] # — seen_countnarrativestoken_count， if is_token_seen(conn, addr): # seen_count c = conn.cursor() c.execute(\u0026#39;UPDATE tokens_seen SET seen_count = seen_count + 1, market_cap = ? WHERE address = ?\u0026#39;, (token[\u0026#39;mc\u0026#39;], addr)) # narrativestoken_count（） theme_tmp = normalize_theme(name, symbol) if theme_tmp: c.execute(\u0026#39;UPDATE narratives SET token_count = token_count + 1, last_seen_at = ? WHERE theme = ?\u0026#39;, (int(time.time()), theme_tmp)) conn.commit() continue # category, matched_kw = classify_narrative(name, symbol, chain) if category == \u0026#39;spam\u0026#39;: record_token(conn, addr, chain, name, symbol, \u0026#39;\u0026#39;, \u0026#39;spam\u0026#39;, token[\u0026#39;mc\u0026#39;]) continue # （） min_mc = 1000 min_liq = 500 if token[\u0026#39;mc\u0026#39;] \u0026lt; min_mc or token[\u0026#39;liq\u0026#39;] \u0026lt; min_liq: record_token(conn, addr, chain, name, symbol, \u0026#39;\u0026#39;, \u0026#39;too_small\u0026#39;, token[\u0026#39;mc\u0026#39;]) continue theme = normalize_theme(name, symbol) # ， — record_token(conn, addr, chain, name, symbol, theme, category, token[\u0026#39;mc\u0026#39;]) check_narrative_novelty(conn, theme, name, symbol, addr, chain) conn.close() # === === pushed = 0 for ma in momentum_alerts[:8]: # 8 if tg_send(ma[\u0026#39;msg\u0026#39;]): pushed += 1 time.sleep(1) # TG return pushed, len(momentum_alerts) # ============================================================ # # ============================================================ def main(): log(\u0026#34;=\u0026#34; * 50) log(\u0026#34; v1 \u0026#34;) log(f\u0026#34;: {SCAN_INTERVAL}s\u0026#34;) log(f\u0026#34;: — ，\u0026#34;) log(\u0026#34;=\u0026#34; * 50) # DB init_db() # tg_send( \u0026#34; v1 \\n\\n\u0026#34; \u0026#34;: \\n\u0026#34; \u0026#34;3+\u0026gt;5%\\n\u0026#34; \u0026#34;:\\n\u0026#34; \u0026#34;★★★ / | /CZ | FLAP\\n\u0026#34; \u0026#34;★★ | FLAP | \\n\u0026#34; \u0026#34;★ \\n\\n\u0026#34; f\u0026#34;: {SCAN_INTERVAL}\u0026#34; ) scan_count = 0 total_pushed = 0 while True: try: scan_count += 1 pushed, found = scan_narratives() total_pushed += pushed if pushed \u0026gt; 0: log(f\u0026#34;{scan_count}: {found}, {pushed} ({total_pushed})\u0026#34;) else: if scan_count % 20 == 0: # 20 log(f\u0026#34;{scan_count}: ({total_pushed})\u0026#34;) except Exception as e: log(f\u0026#34;: {e}\u0026#34;) time.sleep(SCAN_INTERVAL) if __name__ == \u0026#39;__main__\u0026#39;: main() OI + 펀딩비 스캐너 #게시일: 2026.04.25　태그: Python · Binance Futures · Telegram\n펀딩비 양→음 전환 감지 + OI 급증\n스냅샷 기반 스캐너: 펀딩비가 양에서 음으로 뒤집히면서 동시에 OI가 상승 중인 종목을 감지합니다. 5분마다 실행.\n전체 소스 코드 ##!/usr/bin/env python3 \u0026#34;\u0026#34;\u0026#34; OI + - - : OI(4, \u0026gt;8%) + - : 24 - API \u0026#34;\u0026#34;\u0026#34; import requests import json import os import time import sys from datetime import datetime, timedelta from pathlib import Path # ============ ============ SCRIPT_DIR = Path(__file__).parent ENV_FILE = SCRIPT_DIR / \u0026#34;.env.oi\u0026#34; ALERT_HISTORY_FILE = SCRIPT_DIR / \u0026#34;oi_funding_alerts.json\u0026#34; FR_SNAPSHOT_FILE = SCRIPT_DIR / \u0026#34;fr_snapshot.json\u0026#34; # # MIN_OI_CHANGE_PCT = 8 # OI8% MIN_VOLUME_USDT = 0 # ， MIN_FR_PERIODS_POSITIVE = 2 # 2 DEDUP_HOURS = 24 # 24 # ============ TG ============ def load_env(): env = {} if ENV_FILE.exists(): for line in ENV_FILE.read_text().strip().split(\u0026#39;\\n\u0026#39;): if \u0026#39;=\u0026#39; in line and not line.startswith(\u0026#39;#\u0026#39;): k, v = line.split(\u0026#39;=\u0026#39;, 1) env[k.strip()] = v.strip() return env env = load_env() TG_BOT_TOKEN = env.get(\u0026#39;TG_BOT_TOKEN\u0026#39;, \u0026#39;\u0026#39;) TG_CHAT_ID = env.get(\u0026#39;TG_CHAT_ID\u0026#39;, \u0026#39;\u0026#39;) # ============ TG ============ def send_tg(text): if not TG_BOT_TOKEN or not TG_CHAT_ID: print(\u0026#34;[TG] , :\u0026#34;) print(text) return url = f\u0026#34;https://api.telegram.org/bot{TG_BOT_TOKEN}/sendMessage\u0026#34; # (TG4096) chunks = [text[i:i+4000] for i in range(0, len(text), 4000)] for chunk in chunks: try: resp = requests.post(url, json={ \u0026#39;chat_id\u0026#39;: TG_CHAT_ID, \u0026#39;text\u0026#39;: chunk, \u0026#39;parse_mode\u0026#39;: \u0026#39;Markdown\u0026#39; }, timeout=10) if resp.status_code != 200: # fallback requests.post(url, json={ \u0026#39;chat_id\u0026#39;: TG_CHAT_ID, \u0026#39;text\u0026#39;: chunk }, timeout=10) except Exception as e: print(f\u0026#34;[TG] : {e}\u0026#34;) # ============ ============ def load_alert_history(): if ALERT_HISTORY_FILE.exists(): try: return json.loads(ALERT_HISTORY_FILE.read_text()) except: return {} return {} def save_alert_history(history): ALERT_HISTORY_FILE.write_text(json.dumps(history)) def is_duplicate(symbol, history): if symbol not in history: return False last_alert = datetime.fromisoformat(history[symbol]) return (datetime.now() - last_alert).total_seconds() \u0026lt; DEDUP_HOURS * 3600 def mark_alerted(symbol, history): history[symbol] = datetime.now().isoformat() # cutoff = datetime.now() - timedelta(hours=DEDUP_HOURS * 2) history = {k: v for k, v in history.items() if datetime.fromisoformat(v) \u0026gt; cutoff} return history # ============ ============ def load_fr_snapshot(): if FR_SNAPSHOT_FILE.exists(): try: return json.loads(FR_SNAPSHOT_FILE.read_text()) except: pass return {} def save_fr_snapshot(snapshot): FR_SNAPSHOT_FILE.write_text(json.dumps(snapshot)) # ============ ============ def scan(): ts_start = time.time() # 1. try: info = requests.get(\u0026#39;https://fapi.binance.com/fapi/v1/exchangeInfo\u0026#39;, timeout=10).json() symbols = [s[\u0026#39;symbol\u0026#39;] for s in info[\u0026#39;symbols\u0026#39;] if s[\u0026#39;contractType\u0026#39;] == \u0026#39;PERPETUAL\u0026#39; and s[\u0026#39;quoteAsset\u0026#39;] == \u0026#39;USDT\u0026#39; and s[\u0026#39;status\u0026#39;] == \u0026#39;TRADING\u0026#39;] except Exception as e: print(f\u0026#34;[ERROR] exchangeInfo: {e}\u0026#34;) return [] # 2. 24h() try: tickers = requests.get(\u0026#39;https://fapi.binance.com/fapi/v1/ticker/24hr\u0026#39;, timeout=10).json() ticker_map = {t[\u0026#39;symbol\u0026#39;]: t for t in tickers} except Exception as e: print(f\u0026#34;[ERROR] ticker: {e}\u0026#34;) return [] active = [s for s in symbols if float(ticker_map.get(s, {}).get(\u0026#39;quoteVolume\u0026#39;, 0)) \u0026gt; MIN_VOLUME_USDT] # 3. () try: fr_all = requests.get(\u0026#39;https://fapi.binance.com/fapi/v1/premiumIndex\u0026#39;, timeout=10).json() fr_current = {item[\u0026#39;symbol\u0026#39;]: float(item[\u0026#39;lastFundingRate\u0026#39;]) for item in fr_all} except: fr_current = {} # 4. ，\u0026#34;\u0026#34; prev_snapshot = load_fr_snapshot() # () save_fr_snapshot(fr_current) if not prev_snapshot: print(f\u0026#34;[{datetime.now().strftime(\u0026#39;%H:%M:%S\u0026#39;)}] ，，\u0026#34;) return [] # : \u0026gt;=0, \u0026lt;0 just_turned_negative = [] for sym in active: prev_fr = prev_snapshot.get(sym) curr_fr = fr_current.get(sym) if prev_fr is None or curr_fr is None: continue if prev_fr \u0026gt;= 0 and curr_fr \u0026lt; 0: just_turned_negative.append(sym) if not just_turned_negative: elapsed = time.time() - ts_start print(f\u0026#34;[{datetime.now().strftime(\u0026#39;%H:%M:%S\u0026#39;)}] : {len(active)}/{elapsed:.1f}s, \u0026#34;) return [] print(f\u0026#34;[{datetime.now().strftime(\u0026#39;%H:%M:%S\u0026#39;)}] {len(just_turned_negative)} : {just_turned_negative}\u0026#34;) # 5. OI signals = [] for sym in just_turned_negative: try: # OI oi_hist = requests.get(\u0026#39;https://fapi.binance.com/futures/data/openInterestHist\u0026#39;, params={\u0026#39;symbol\u0026#39;: sym, \u0026#39;period\u0026#39;: \u0026#39;1h\u0026#39;, \u0026#39;limit\u0026#39;: 48}, timeout=10).json() oi_chg = 0 segs = [] oi_rising = False if oi_hist and len(oi_hist) \u0026gt;= 12: oi_values = [float(x[\u0026#39;sumOpenInterestValue\u0026#39;]) for x in oi_hist] seg_len = len(oi_values) // 4 if seg_len \u0026gt;= 3: segs = [ sum(oi_values[:seg_len]) / seg_len, sum(oi_values[seg_len:seg_len*2]) / seg_len, sum(oi_values[seg_len*2:seg_len*3]) / seg_len, sum(oi_values[seg_len*3:]) / max(1, len(oi_values[seg_len*3:])) ] oi_chg = (segs[3] - segs[0]) / segs[0] * 100 if segs[0] \u0026gt; 0 else 0 oi_rising = oi_chg \u0026gt; 0 t = ticker_map.get(sym, {}) signals.append({ \u0026#39;symbol\u0026#39;: sym, \u0026#39;price\u0026#39;: float(t.get(\u0026#39;lastPrice\u0026#39;, 0)), \u0026#39;price_chg_24h\u0026#39;: float(t.get(\u0026#39;priceChangePercent\u0026#39;, 0)), \u0026#39;volume\u0026#39;: float(t.get(\u0026#39;quoteVolume\u0026#39;, 0)), \u0026#39;oi_change\u0026#39;: oi_chg, \u0026#39;oi_segments\u0026#39;: segs, \u0026#39;oi_rising\u0026#39;: oi_rising, \u0026#39;current_fr\u0026#39;: fr_current.get(sym, 0), \u0026#39;prev_fr\u0026#39;: prev_snapshot.get(sym, 0), }) except: continue elapsed = time.time() - ts_start print(f\u0026#34;[{datetime.now().strftime(\u0026#39;%H:%M:%S\u0026#39;)}] : {len(active)}/{elapsed:.1f}s, : {len(signals)}\u0026#34;) return signals # ============ ============ def get_square_discussion(coin): \u0026#34;\u0026#34;\u0026#34;\u0026#34;\u0026#34;\u0026#34; try: r = requests.get( \u0026#34;https://www.binance.com/bapi/composite/v4/friendly/pgc/content/queryByHashtag\u0026#34;, params={\u0026#34;hashtag\u0026#34;: f\u0026#34;#{coin.lower()}\u0026#34;, \u0026#34;pageIndex\u0026#34;: 1, \u0026#34;pageSize\u0026#34;: 1, \u0026#34;orderBy\u0026#34;: \u0026#34;HOT\u0026#34;}, headers={\u0026#34;User-Agent\u0026#34;: \u0026#34;Mozilla/5.0\u0026#34;, \u0026#34;Referer\u0026#34;: \u0026#34;https://www.binance.com/en/square\u0026#34;}, timeout=8 ) if r.status_code == 200: ht = r.json().get(\u0026#34;data\u0026#34;, {}).get(\u0026#34;hashtag\u0026#34;, {}) return ht.get(\u0026#34;contentCount\u0026#34;, 0), ht.get(\u0026#34;viewCount\u0026#34;, 0) except: pass return 0, 0 def get_market_caps(): \u0026#34;\u0026#34;\u0026#34;\u0026#34;\u0026#34;\u0026#34; mcap = {} try: r = requests.get( \u0026#34;https://www.binance.com/bapi/composite/v1/public/marketing/symbol/list\u0026#34;, timeout=10 ) if r.status_code == 200: for item in r.json().get(\u0026#34;data\u0026#34;, []): name = item.get(\u0026#34;name\u0026#34;, \u0026#34;\u0026#34;) mc = item.get(\u0026#34;marketCap\u0026#34;, 0) if name and mc: mcap[name] = float(mc) except: pass return mcap def get_spot_symbols(): \u0026#34;\u0026#34;\u0026#34;\u0026#34;\u0026#34;\u0026#34; try: info = requests.get(\u0026#34;https://api.binance.com/api/v3/exchangeInfo\u0026#34;, timeout=10).json() return {s[\u0026#34;baseAsset\u0026#34;] for s in info[\u0026#34;symbols\u0026#34;] if s[\u0026#34;quoteAsset\u0026#34;] == \u0026#34;USDT\u0026#34; and s[\u0026#34;status\u0026#34;] == \u0026#34;TRADING\u0026#34;} except: return set() def fmt_mcap(v): if v \u0026gt;= 1e9: return f\u0026#34;${v/1e9:.2f}B\u0026#34; if v \u0026gt;= 1e6: return f\u0026#34;${v/1e6:.1f}M\u0026#34; if v \u0026gt;= 1e3: return f\u0026#34;${v/1e3:.0f}K\u0026#34; return f\u0026#34;${v:.0f}\u0026#34; def fmt_views(v): if v \u0026gt;= 1e6: return f\u0026#34;{v/1e6:.1f}M\u0026#34; if v \u0026gt;= 1e3: return f\u0026#34;{v/1e3:.0f}K\u0026#34; return str(v) # ============ ============ def format_alert(signals): if not signals: return None # OI， signals.sort(key=lambda x: (-int(x.get(\u0026#39;oi_rising\u0026#39;, False)), x[\u0026#39;current_fr\u0026#39;])) # mcap_map = get_market_caps() spot_set = get_spot_symbols() now = datetime.now().strftime(\u0026#39;%m-%d %H:%M\u0026#39;) lines = [f\u0026#34;*[ +OI ]* {now}\\n\u0026#34;] for s in signals: coin = s[\u0026#39;symbol\u0026#39;].replace(\u0026#39;USDT\u0026#39;, \u0026#39;\u0026#39;) # : → fr_change = f\u0026#34;{s[\u0026#39;prev_fr\u0026#39;]:+.4%} -\u0026gt; {s[\u0026#39;current_fr\u0026#39;]:+.4%}\u0026#34; # mcap = mcap_map.get(coin, 0) has_spot = coin in spot_set sq_posts, sq_views = get_square_discussion(coin) lines.append(f\u0026#34;```\u0026#34;) lines.append(f\u0026#34;{coin}\u0026#34;) lines.append(f\u0026#34; : {s[\u0026#39;price\u0026#39;]:.4f} 24h: {s[\u0026#39;price_chg_24h\u0026#39;]:+.1f}%\u0026#34;) lines.append(f\u0026#34; : {fr_change}\u0026#34;) if s[\u0026#39;oi_segments\u0026#39;]: oi_segs = \u0026#39; \u0026gt; \u0026#39;.join([f\u0026#34;{v/1e6:.1f}M\u0026#34; for v in s[\u0026#39;oi_segments\u0026#39;]]) lines.append(f\u0026#34; OI: +{s[\u0026#39;oi_change\u0026#39;]:.1f}% ({oi_segs})\u0026#34;) lines.append(f\u0026#34; : ${s[\u0026#39;volume\u0026#39;]/1e6:.1f}M\u0026#34;) lines.append(f\u0026#34; : {fmt_mcap(mcap) if mcap \u0026gt; 0 else \u0026#39;\u0026#39;} : {\u0026#39;\u0026#39; if has_spot else \u0026#39;\u0026#39;}\u0026#34;) if sq_posts \u0026gt; 0: lines.append(f\u0026#34; : {sq_posts} / {fmt_views(sq_views)}\u0026#34;) else: lines.append(f\u0026#34; : \u0026#34;) lines.append(f\u0026#34;```\u0026#34;) return \u0026#39;\\n\u0026#39;.join(lines) # ============ ============ def main(): signals = scan() if signals: # : + OI () strong = [s for s in signals if s[\u0026#39;current_fr\u0026#39;] \u0026lt; 0 and s.get(\u0026#39;oi_rising\u0026#39;)] if strong: msg = format_alert(strong) if msg: send_tg(msg) print(f\u0026#34; {len(strong)} ({len(signals)}, {len(strong)}OI)\u0026#34;) else: print(f\u0026#34; {len(signals)} OI, \u0026#34;) else: print(f\u0026#34; \u0026#34;) if __name__ == \u0026#39;__main__\u0026#39;: main() 축적 레이더 #게시일: 2026.04.25　태그: Python · Binance · CoinGlass · Telegram\n모멘텀 + OI 이상 + 스마트 알림\n시간 단위 스캔: 상승률 상위 종목 모멘텀 추적, OI 이상 감지, Telegram 푸시. 순수 Python, AI 비용 0.\n전체 소스 코드 ##!/usr/bin/env python3 \u0026#34;\u0026#34;\u0026#34; v2 — ++OI （）： 1. → CG+= 2. =， 3. OI== ：→→→ ：API + CoinGecko Trending（） \u0026#34;\u0026#34;\u0026#34; import json import os import sys import time import requests from datetime import datetime, timezone, timedelta from pathlib import Path from square_heat import get_square_heat # === .env === env_file = Path(__file__).parent / \u0026#34;.env.oi\u0026#34; if env_file.exists(): with open(env_file) as f: for line in f: line = line.strip() if line and not line.startswith(\u0026#34;#\u0026#34;) and \u0026#34;=\u0026#34; in line: k, v = line.split(\u0026#34;=\u0026#34;, 1) os.environ.setdefault(k.strip(), v.strip()) # === === TG_BOT_TOKEN = os.getenv(\u0026#34;TG_BOT_TOKEN\u0026#34;, \u0026#34;\u0026#34;) TG_CHAT_ID = os.getenv(\u0026#34;TG_CHAT_ID\u0026#34;, \u0026#34;YOUR_CHAT_ID\u0026#34;) FAPI = \u0026#34;https://fapi.binance.com\u0026#34; # （） HEAT_HISTORY_FILE = Path(__file__).parent / \u0026#34;heat_history.json\u0026#34; # VOL_SURGE_MULT = 2.5 # 2.5= MIN_VOL_USD = 20_000_000 # \u0026gt;$20M # OI MIN_OI_DELTA_PCT = 3.0 # OI3% MIN_OI_USD = 2_000_000 # OI $2M def api_get(endpoint, params=None): \u0026#34;\u0026#34;\u0026#34;API\u0026#34;\u0026#34;\u0026#34; url = f\u0026#34;{FAPI}{endpoint}\u0026#34; for attempt in range(3): try: resp = requests.get(url, params=params, timeout=10) if resp.status_code == 200: return resp.json() elif resp.status_code == 429: time.sleep(2) else: return None except: time.sleep(1) return None def format_usd(v): if v \u0026gt;= 1e9: return f\u0026#34;${v/1e9:.1f}B\u0026#34; if v \u0026gt;= 1e6: return f\u0026#34;${v/1e6:.1f}M\u0026#34; if v \u0026gt;= 1e3: return f\u0026#34;${v/1e3:.0f}K\u0026#34; return f\u0026#34;${v:.0f}\u0026#34; def mcap_str(v): if v \u0026gt;= 1e9: return f\u0026#34;${v/1e9:.1f}B\u0026#34; if v \u0026gt;= 1e6: return f\u0026#34;${v/1e6:.0f}M\u0026#34; if v \u0026gt;= 1e3: return f\u0026#34;${v/1e3:.0f}K\u0026#34; return f\u0026#34;${v:.0f}\u0026#34; def send_telegram(text): \u0026#34;\u0026#34;\u0026#34;TG\u0026#34;\u0026#34;\u0026#34; if not TG_BOT_TOKEN: print(\u0026#34;\\n[TG] No token, stdout:\\n\u0026#34;) print(text) return url = f\u0026#34;https://api.telegram.org/bot{TG_BOT_TOKEN}/sendMessage\u0026#34; # （TG4096） chunks = [] current = \u0026#34;\u0026#34; for line in text.split(\u0026#34;\\n\u0026#34;): if len(current) + len(line) + 1 \u0026gt; 3800: chunks.append(current) current = line else: current += \u0026#34;\\n\u0026#34; + line if current else line if current: chunks.append(current) for chunk in chunks: try: resp = requests.post(url, json={ \u0026#34;chat_id\u0026#34;: TG_CHAT_ID, \u0026#34;text\u0026#34;: chunk, \u0026#34;parse_mode\u0026#34;: \u0026#34;Markdown\u0026#34; }, timeout=10) if resp.status_code == 200: print(f\u0026#34;[TG] Sent ✓ ({len(chunk)} chars)\u0026#34;) else: # Markdown resp2 = requests.post(url, json={ \u0026#34;chat_id\u0026#34;: TG_CHAT_ID, \u0026#34;text\u0026#34;: chunk.replace(\u0026#34;*\u0026#34;, \u0026#34;\u0026#34;).replace(\u0026#34;_\u0026#34;, \u0026#34;\u0026#34;), }, timeout=10) print(f\u0026#34;[TG] Sent plain ({\u0026#39;✓\u0026#39; if resp2.status_code == 200 else \u0026#39;✗\u0026#39;})\u0026#34;) except Exception as e: print(f\u0026#34;[TG] Error: {e}\u0026#34;) time.sleep(0.5) def main(): print(f\u0026#34;🔥 v2 — {datetime.now().strftime(\u0026#39;%Y-%m-%d %H:%M:%S\u0026#39;)}\\n\u0026#34;) # 1. + tickers_raw = api_get(\u0026#34;/fapi/v1/ticker/24hr\u0026#34;) premiums_raw = api_get(\u0026#34;/fapi/v1/premiumIndex\u0026#34;) if not tickers_raw or not premiums_raw: print(\u0026#34;❌ API\u0026#34;) return ticker_map = {} for t in tickers_raw: if t[\u0026#34;symbol\u0026#34;].endswith(\u0026#34;USDT\u0026#34;): ticker_map[t[\u0026#34;symbol\u0026#34;]] = { \u0026#34;px_chg\u0026#34;: float(t[\u0026#34;priceChangePercent\u0026#34;]), \u0026#34;vol\u0026#34;: float(t[\u0026#34;quoteVolume\u0026#34;]), \u0026#34;price\u0026#34;: float(t[\u0026#34;lastPrice\u0026#34;]), } funding_map = {} for p in premiums_raw: if p[\u0026#34;symbol\u0026#34;].endswith(\u0026#34;USDT\u0026#34;): funding_map[p[\u0026#34;symbol\u0026#34;]] = float(p[\u0026#34;lastFundingRate\u0026#34;]) # 2. （API） mcap_map = {} try: r = requests.get( \u0026#34;https://www.binance.com/bapi/composite/v1/public/marketing/symbol/list\u0026#34;, timeout=10 ) if r.status_code == 200: for item in r.json().get(\u0026#34;data\u0026#34;, []): name = item.get(\u0026#34;name\u0026#34;, \u0026#34;\u0026#34;) mc = item.get(\u0026#34;marketCap\u0026#34;, 0) if name and mc: mcap_map[name] = float(mc) print(f\u0026#34;✅ : {len(mcap_map)}\u0026#34;) except Exception as e: print(f\u0026#34;⚠️ API: {e}\u0026#34;) # 3. ： + CoinGecko Trending + heat_map = {} cg_trending = set() square_trending = set() # 3a. （6H）— ！= sq_coins = get_square_heat() if sq_coins: for i, c in enumerate(sq_coins): coin = c[\u0026#34;coin\u0026#34;] square_trending.add(coin) # ， rank_score = max(50 - i * 4, 10) if c.get(\u0026#34;rapidRiser\u0026#34;): rank_score += 15 heat_map[coin] = heat_map.get(coin, 0) + rank_score print(f\u0026#34;🏦 : {len(square_trending)} {[c[\u0026#39;coin\u0026#39;] for c in sq_coins[:5]]}\u0026#34;) # 3b. CoinGecko Trending try: r = requests.get(\u0026#34;https://api.coingecko.com/api/v3/search/trending\u0026#34;, timeout=10) if r.status_code == 200: for item in r.json().get(\u0026#34;coins\u0026#34;, []): sym = item[\u0026#34;item\u0026#34;][\u0026#34;symbol\u0026#34;].upper() rank = item[\u0026#34;item\u0026#34;].get(\u0026#34;score\u0026#34;, 99) cg_trending.add(sym) heat_map[sym] = heat_map.get(sym, 0) + max(50 - rank * 3, 10) print(f\u0026#34;🌐 CG Trending: {len(cg_trending)}\u0026#34;) except Exception as e: print(f\u0026#34;⚠️ CG Trending: {e}\u0026#34;) # vol_surge_coins = set() for sym, tk in ticker_map.items(): coin = sym.replace(\u0026#34;USDT\u0026#34;, \u0026#34;\u0026#34;) vol_24h = tk[\u0026#34;vol\u0026#34;] if vol_24h \u0026gt; MIN_VOL_USD: kl = api_get(\u0026#34;/fapi/v1/klines\u0026#34;, {\u0026#34;symbol\u0026#34;: sym, \u0026#34;interval\u0026#34;: \u0026#34;1d\u0026#34;, \u0026#34;limit\u0026#34;: 8}) if kl and len(kl) \u0026gt;= 5: avg_prev = sum(float(k[7]) for k in kl[:-1]) / (len(kl) - 1) if avg_prev \u0026gt; 0: ratio = vol_24h / avg_prev if ratio \u0026gt;= VOL_SURGE_MULT: vol_surge_coins.add(coin) heat_map[coin] = heat_map.get(coin, 0) + min(ratio * 10, 50) time.sleep(0.05) print(f\u0026#34;📈 (≥{VOL_SURGE_MULT}x): {len(vol_surge_coins)}\u0026#34;) # / dual_heat = cg_trending \u0026amp; vol_surge_coins square_vol = square_trending \u0026amp; vol_surge_coins triple_heat = cg_trending \u0026amp; vol_surge_coins \u0026amp; square_trending all_multi_heat = dual_heat | square_vol if all_multi_heat: for coin in all_multi_heat: heat_map[coin] = heat_map.get(coin, 0) + 20 if triple_heat: for coin in triple_heat: heat_map[coin] = heat_map.get(coin, 0) + 30 # print(f\u0026#34;🔥🔥🔥 : {triple_heat}\u0026#34;) else: print(f\u0026#34;🔥🔥 : {all_multi_heat}\u0026#34;) # 4. OI（Top100 + ） scan_syms = set() # for coin in heat_map: sym = coin + \u0026#34;USDT\u0026#34; if sym in ticker_map: scan_syms.add(sym) # Top100 top_by_vol = sorted(ticker_map.items(), key=lambda x: x[1][\u0026#34;vol\u0026#34;], reverse=True)[:100] for sym, _ in top_by_vol: scan_syms.add(sym) oi_map = {} for i, sym in enumerate(scan_syms): oi_hist = api_get(\u0026#34;/futures/data/openInterestHist\u0026#34;, { \u0026#34;symbol\u0026#34;: sym, \u0026#34;period\u0026#34;: \u0026#34;1h\u0026#34;, \u0026#34;limit\u0026#34;: 6 }) if oi_hist and len(oi_hist) \u0026gt;= 2: curr = float(oi_hist[-1][\u0026#34;sumOpenInterestValue\u0026#34;]) prev_1h = float(oi_hist[-2][\u0026#34;sumOpenInterestValue\u0026#34;]) prev_6h = float(oi_hist[0][\u0026#34;sumOpenInterestValue\u0026#34;]) d1h = ((curr - prev_1h) / prev_1h * 100) if prev_1h \u0026gt; 0 else 0 d6h = ((curr - prev_6h) / prev_6h * 100) if prev_6h \u0026gt; 0 else 0 oi_map[sym] = {\u0026#34;oi_usd\u0026#34;: curr, \u0026#34;d1h\u0026#34;: d1h, \u0026#34;d6h\u0026#34;: d6h} if (i + 1) % 10 == 0: time.sleep(0.5) print(f\u0026#34;📊 OI: {len(oi_map)}\u0026#34;) # 5. all_syms = set(list(ticker_map.keys())) coin_data = {} for sym in all_syms: tk = ticker_map.get(sym, {}) if not tk: continue oi = oi_map.get(sym, {}) fr = funding_map.get(sym, 0) coin = sym.replace(\u0026#34;USDT\u0026#34;, \u0026#34;\u0026#34;) d6h = oi.get(\u0026#34;d6h\u0026#34;, 0) fr_pct = fr * 100 oi_usd = oi.get(\u0026#34;oi_usd\u0026#34;, 0) # ，fallback if coin in mcap_map: est_mcap = mcap_map[coin] else: est_mcap = max(tk[\u0026#34;vol\u0026#34;] * 0.3, oi_usd * 2) if oi_usd \u0026gt; 0 else tk[\u0026#34;vol\u0026#34;] * 0.3 heat = heat_map.get(coin, 0) coin_data[sym] = { \u0026#34;coin\u0026#34;: coin, \u0026#34;sym\u0026#34;: sym, \u0026#34;px_chg\u0026#34;: tk[\u0026#34;px_chg\u0026#34;], \u0026#34;vol\u0026#34;: tk[\u0026#34;vol\u0026#34;], \u0026#34;fr_pct\u0026#34;: fr_pct, \u0026#34;d6h\u0026#34;: d6h, \u0026#34;oi_usd\u0026#34;: oi_usd, \u0026#34;est_mcap\u0026#34;: est_mcap, \u0026#34;heat\u0026#34;: heat, \u0026#34;in_cg\u0026#34;: coin in cg_trending, \u0026#34;in_sq\u0026#34;: coin in square_trending, \u0026#34;vol_surge\u0026#34;: coin in vol_surge_coins, } # ═══════════════════════════════════════ # # ═══════════════════════════════════════ hot_coins = sorted( [d for d in coin_data.values() if d[\u0026#34;heat\u0026#34;] \u0026gt; 0], key=lambda x: x[\u0026#34;heat\u0026#34;], reverse=True ) # heat_history = {} if HEAT_HISTORY_FILE.exists(): try: heat_history = json.loads(HEAT_HISTORY_FILE.read_text()) except: pass now_ts = datetime.now(timezone(timedelta(hours=8))).strftime(\u0026#34;%Y-%m-%d %H:%M\u0026#34;) new_entries = [] # for s in hot_coins: coin = s[\u0026#34;coin\u0026#34;] if coin not in heat_history: # ！ heat_history[coin] = {\u0026#34;first_seen\u0026#34;: now_ts, \u0026#34;price\u0026#34;: s.get(\u0026#34;px_chg\u0026#34;, 0)} sources = [] if s[\u0026#34;in_sq\u0026#34;]: sources.append(\u0026#34;\u0026#34;) if s[\u0026#34;in_cg\u0026#34;]: sources.append(\u0026#34;CG\u0026#34;) if s[\u0026#34;vol_surge\u0026#34;]: sources.append(\u0026#34;\u0026#34;) new_entries.append({\u0026#34;coin\u0026#34;: coin, \u0026#34;sources\u0026#34;: sources, \u0026#34;data\u0026#34;: s}) # 7（） cutoff = (datetime.now(timezone(timedelta(hours=8))) - timedelta(days=7)).strftime(\u0026#34;%Y-%m-%d\u0026#34;) heat_history = {k: v for k, v in heat_history.items() if v.get(\u0026#34;first_seen\u0026#34;, \u0026#34;9999\u0026#34;) \u0026gt;= cutoff} # HEAT_HISTORY_FILE.write_text(json.dumps(heat_history, indent=2, ensure_ascii=False)) # ═══════════════════════════════════════ # ：+ # ═══════════════════════════════════════ chase = [] for sym, d in coin_data.items(): if d[\u0026#34;px_chg\u0026#34;] \u0026gt; 3 and d[\u0026#34;fr_pct\u0026#34;] \u0026lt; -0.005 and d[\u0026#34;vol\u0026#34;] \u0026gt; 1_000_000: fr_hist = api_get(\u0026#34;/fapi/v1/fundingRate\u0026#34;, {\u0026#34;symbol\u0026#34;: sym, \u0026#34;limit\u0026#34;: 5}) fr_rates = [float(f[\u0026#34;fundingRate\u0026#34;]) * 100 for f in fr_hist] if fr_hist else [d[\u0026#34;fr_pct\u0026#34;]] fr_prev = fr_rates[-2] if len(fr_rates) \u0026gt;= 2 else d[\u0026#34;fr_pct\u0026#34;] fr_delta = d[\u0026#34;fr_pct\u0026#34;] - fr_prev trend = \u0026#34;\u0026#34; if fr_delta \u0026lt; -0.05 else \u0026#34;\u0026#34; if fr_delta \u0026lt; -0.01 else \u0026#34;\u0026#34; if abs(fr_delta) \u0026lt; 0.01 else \u0026#34;\u0026#34; chase.append({**d, \u0026#34;fr_delta\u0026#34;: fr_delta, \u0026#34;trend\u0026#34;: trend, \u0026#34;rates\u0026#34;: \u0026#34; → \u0026#34;.join([f\u0026#34;{x:.3f}\u0026#34; for x in fr_rates[-3:]])}) time.sleep(0.2) chase.sort(key=lambda x: x[\u0026#34;fr_pct\u0026#34;]) # ═══════════════════════════════════════ # # ═══════════════════════════════════════ now = datetime.now(timezone(timedelta(hours=8))) lines = [ f\u0026#34;****\u0026#34;, f\u0026#34;{now.strftime(\u0026#39;%Y-%m-%d %H:%M\u0026#39;)} CST\u0026#34;, ] # （） # if new_entries: lines.append(f\u0026#34;\\n**[ ]** ，\u0026#34;) tbl = [\u0026#34;```\u0026#34;] tbl.append(f\u0026#34;{\u0026#39;\u0026#39;:\u0026lt;10} {\u0026#39;\u0026#39;:\u0026gt;8} {\u0026#39;\u0026#39;:\u0026gt;7} {\u0026#39;\u0026#39;}\u0026#34;) tbl.append(f\u0026#34;{\u0026#39;-\u0026#39;*10} {\u0026#39;-\u0026#39;*8} {\u0026#39;-\u0026#39;*7} {\u0026#39;-\u0026#39;*20}\u0026#34;) for e in new_entries: s = e[\u0026#34;data\u0026#34;] src_str = \u0026#34;/\u0026#34;.join(e[\u0026#34;sources\u0026#34;]) tbl.append(f\u0026#34;{s[\u0026#39;coin\u0026#39;]:\u0026lt;10} {mcap_str(s[\u0026#39;est_mcap\u0026#39;]):\u0026gt;8} {s[\u0026#39;px_chg\u0026#39;]:\u0026gt;+6.0f}% {src_str}\u0026#34;) tbl.append(\u0026#34;```\u0026#34;) lines.append(\u0026#34;\\n\u0026#34;.join(tbl)) if hot_coins: lines.append(f\u0026#34;\\n**[ ]**\u0026#34;) tbl = [\u0026#34;```\u0026#34;] tbl.append(f\u0026#34;{\u0026#39;\u0026#39;:\u0026lt;10} {\u0026#39;\u0026#39;:\u0026gt;8} {\u0026#39;\u0026#39;:\u0026gt;7} {\u0026#39;\u0026#39;}\u0026#34;) tbl.append(f\u0026#34;{\u0026#39;-\u0026#39;*10} {\u0026#39;-\u0026#39;*8} {\u0026#39;-\u0026#39;*7} {\u0026#39;-\u0026#39;*20}\u0026#34;) for s in hot_coins[:10]: sources = [] if s[\u0026#34;in_sq\u0026#34;]: sources.append(\u0026#34;\u0026#34;) if s[\u0026#34;in_cg\u0026#34;]: sources.append(\u0026#34;CG\u0026#34;) if s[\u0026#34;vol_surge\u0026#34;]: sources.append(\u0026#34;\u0026#34;) extra = [] if abs(s[\u0026#34;d6h\u0026#34;]) \u0026gt;= 3: extra.append(f\u0026#34;OI{s[\u0026#39;d6h\u0026#39;]:+.0f}%\u0026#34;) if s[\u0026#34;fr_pct\u0026#34;] \u0026lt; -0.03: extra.append(f\u0026#34;{s[\u0026#39;fr_pct\u0026#39;]:.2f}%\u0026#34;) src_str = \u0026#34;/\u0026#34;.join(sources) if extra: src_str += \u0026#34; \u0026#34; + \u0026#34; \u0026#34;.join(extra) coin_name = s[\u0026#39;coin\u0026#39;] tbl.append(f\u0026#34;{coin_name:\u0026lt;10} {mcap_str(s[\u0026#39;est_mcap\u0026#39;]):\u0026gt;8} {s[\u0026#39;px_chg\u0026#39;]:\u0026gt;+6.0f}% {src_str}\u0026#34;) tbl.append(\u0026#34;```\u0026#34;) lines.append(\u0026#34;\\n\u0026#34;.join(tbl)) else: lines.append(\u0026#34;\\n**[ ]** \u0026#34;) # （） lines.append(f\u0026#34;\\n**[ ]** +=\u0026#34;) if chase: tbl = [\u0026#34;```\u0026#34;] tbl.append(f\u0026#34;{\u0026#39;\u0026#39;:\u0026lt;10} {\u0026#39;\u0026#39;:\u0026gt;10} {\u0026#39;\u0026#39;:\u0026gt;8} {\u0026#39;\u0026#39;:\u0026gt;7} {\u0026#39;\u0026#39;:\u0026gt;8}\u0026#34;) tbl.append(f\u0026#34;{\u0026#39;-\u0026#39;*10} {\u0026#39;-\u0026#39;*10} {\u0026#39;-\u0026#39;*8} {\u0026#39;-\u0026#39;*7} {\u0026#39;-\u0026#39;*8}\u0026#34;) for s in chase[:8]: tbl.append( f\u0026#34;{s[\u0026#39;coin\u0026#39;]:\u0026lt;10} {s[\u0026#39;fr_pct\u0026#39;]:\u0026gt;+9.3f}% {s[\u0026#39;trend\u0026#39;]:\u0026gt;8} {s[\u0026#39;px_chg\u0026#39;]:\u0026gt;+6.0f}% {mcap_str(s[\u0026#39;est_mcap\u0026#39;]):\u0026gt;7}\u0026#34; ) tbl.append(\u0026#34;```\u0026#34;) lines.append(\u0026#34;\\n\u0026#34;.join(tbl)) else: lines.append(\u0026#34; \u0026#34;) # OI（） oi_alerts = [] for sym, oi in oi_map.items(): if abs(oi[\u0026#34;d6h\u0026#34;]) \u0026gt;= 8: d = coin_data.get(sym) if d and d[\u0026#34;heat\u0026#34;] == 0: oi_alerts.append(d) oi_alerts.sort(key=lambda x: abs(x[\u0026#34;d6h\u0026#34;]), reverse=True) if oi_alerts: lines.append(f\u0026#34;\\n**[ OI ]** 6\u0026gt;=8%\u0026#34;) tbl = [\u0026#34;```\u0026#34;] tbl.append(f\u0026#34;{\u0026#39;\u0026#39;:\u0026lt;10} {\u0026#39;\u0026#39;:\u0026gt;4} {\u0026#39;OI\u0026#39;:\u0026gt;8} {\u0026#39;\u0026#39;:\u0026gt;7} {\u0026#39;\u0026#39;:\u0026gt;8}\u0026#34;) tbl.append(f\u0026#34;{\u0026#39;-\u0026#39;*10} {\u0026#39;-\u0026#39;*4} {\u0026#39;-\u0026#39;*8} {\u0026#39;-\u0026#39;*7} {\u0026#39;-\u0026#39;*8}\u0026#34;) for s in oi_alerts[:6]: direction = \u0026#34;\u0026#34; if s[\u0026#34;d6h\u0026#34;] \u0026gt; 0 else \u0026#34;\u0026#34; tbl.append( f\u0026#34;{s[\u0026#39;coin\u0026#39;]:\u0026lt;10} {direction:\u0026gt;4} {s[\u0026#39;d6h\u0026#39;]:\u0026gt;+7.1f}% {s[\u0026#39;px_chg\u0026#39;]:\u0026gt;+6.0f}% {mcap_str(s[\u0026#39;est_mcap\u0026#39;]):\u0026gt;7}\u0026#34; ) tbl.append(\u0026#34;```\u0026#34;) lines.append(\u0026#34;\\n\u0026#34;.join(tbl)) # highlights = [] hot_oi = [d for d in coin_data.values() if d[\u0026#34;heat\u0026#34;] \u0026gt; 0 and d[\u0026#34;d6h\u0026#34;] \u0026gt; 5] for s in sorted(hot_oi, key=lambda x: x[\u0026#34;d6h\u0026#34;], reverse=True)[:3]: highlights.append(f\u0026#34;{s[\u0026#39;coin\u0026#39;]} — +OI{s[\u0026#39;d6h\u0026#39;]:+.0f}%，\u0026#34;) hot_fuel = [d for d in coin_data.values() if d[\u0026#34;heat\u0026#34;] \u0026gt; 0 and d[\u0026#34;fr_pct\u0026#34;] \u0026lt; -0.03] for s in sorted(hot_fuel, key=lambda x: x[\u0026#34;fr_pct\u0026#34;])[:2]: if s[\u0026#34;coin\u0026#34;] not in \u0026#34; \u0026#34;.join(highlights): highlights.append(f\u0026#34;{s[\u0026#39;coin\u0026#39;]} — +{s[\u0026#39;fr_pct\u0026#39;]:.2f}%，\u0026#34;) chase_fire = [s for s in chase[:5] if \u0026#34;\u0026#34; in s.get(\u0026#34;trend\u0026#34;, \u0026#34;\u0026#34;)] for s in chase_fire[:2]: if s[\u0026#34;coin\u0026#34;] not in \u0026#34; \u0026#34;.join(highlights): highlights.append(f\u0026#34;{s[\u0026#39;coin\u0026#39;]} — {s[\u0026#39;fr_pct\u0026#39;]:.3f}%，\u0026#34;) if highlights: lines.append(f\u0026#34;\\n**[ ]**\u0026#34;) for h in highlights[:5]: lines.append(f\u0026#34; {h}\u0026#34;) lines.append(f\u0026#34;\\n= / CG=CoinGecko\u0026#34;) lines.append(f\u0026#34;=，\u0026#34;) report = \u0026#34;\\n\u0026#34;.join(lines) send_telegram(report) print(\u0026#34;\\n✅ \u0026#34;) if __name__ == \u0026#34;__main__\u0026#34;: main() 바이낸스 Alpha 모니터 #게시일: 2026.04.23　태그: Python · Binance · Claude AI · Telegram\nWebSocket 실시간 + AI 분석 + Telegram 푸시\n바이낸스 Alpha 신규 상장을 자동 감지하고 Claude AI로 토큰 품질을 분석한 다음 Telegram으로 알림을 보냅니다.\n전체 소스 코드 ##!/usr/bin/env python3 \u0026#34;\u0026#34;\u0026#34; Binance Alpha Monitor v2 — REST + + + TG API Key，AI（） : python3 alpha_monitor.py \u0026#34;\u0026#34;\u0026#34; import asyncio import hashlib import json import logging import os import re import sqlite3 import time from dataclasses import dataclass, field from datetime import datetime, timedelta, timezone from pathlib import Path from typing import Optional import httpx # ============================================================ # # ============================================================ BASE_DIR = Path(__file__).parent DB_PATH = str(BASE_DIR / \u0026#34;data\u0026#34; / \u0026#34;alpha.db\u0026#34;) # TG TG_BOT_TOKEN = os.environ.get(\u0026#34;TG_BOT_TOKEN\u0026#34;, \u0026#34;\u0026#34;) TG_CHAT_ID = os.environ.get(\u0026#34;TG_CHAT_ID\u0026#34;, \u0026#34;\u0026#34;) # LLM (，，) # hermes auth.jsoncredential pool（scanner） def _load_anthropic_key(): \u0026#34;\u0026#34;\u0026#34;auth.jsonAPI key\u0026#34;\u0026#34;\u0026#34; # 1. hermes auth.json credential pool try: auth_file = os.path.expanduser(\u0026#34;~/.hermes/auth.json\u0026#34;) if os.path.exists(auth_file): with open(auth_file) as f: auth = json.load(f) pool = auth.get(\u0026#34;credential_pool\u0026#34;, {}).get(\u0026#34;anthropic\u0026#34;, []) if pool: key = pool[0].get(\u0026#34;access_token\u0026#34;, \u0026#34;\u0026#34;) if key and key != \u0026#34;***\u0026#34;: return key except Exception: pass # 2. fallback return os.environ.get(\u0026#34;ANTHROPIC_API_KEY\u0026#34;, \u0026#34;\u0026#34;) ANTHROPIC_API_KEY = _load_anthropic_key() ANTHROPIC_BASE_URL = os.environ.get(\u0026#34;ANTHROPIC_BASE_URL\u0026#34;, \u0026#34;https://api.anthropic.com\u0026#34;) ANTHROPIC_MODEL = os.environ.get(\u0026#34;ANTHROPIC_MODEL\u0026#34;, \u0026#34;claude-sonnet-4-6\u0026#34;) # ANNOUNCEMENT_POLL_INTERVAL = 30 # 30 AGGREGATION_POLL_INTERVAL = 15 # 15 MONITOR_POLL_INTERVAL = 120 # 2 # HTTP HEADERS = { \u0026#34;User-Agent\u0026#34;: \u0026#34;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36\u0026#34;, \u0026#34;Accept\u0026#34;: \u0026#34;application/json\u0026#34;, \u0026#34;Accept-Language\u0026#34;: \u0026#34;en-US,en;q=0.9\u0026#34;, } BINANCE_ANNOUNCEMENT_API = \u0026#34;https://www.binance.com/bapi/composite/v1/public/cms/article/list/query\u0026#34; # ============================================================ # # ============================================================ logging.basicConfig( level=logging.INFO, format=\u0026#34;%(asctime)s | %(levelname)s | %(name)s | %(message)s\u0026#34;, datefmt=\u0026#34;%Y-%m-%d %H:%M:%S\u0026#34;, ) logger = logging.getLogger(\u0026#34;alpha\u0026#34;) # ============================================================ # # ============================================================ # — TRIGGER_KEYWORDS = [ \u0026#34;alpha\u0026#34;, \u0026#34;\u0026#34;, \u0026#34;airdrop\u0026#34;, \u0026#34;tge\u0026#34;, \u0026#34;token generation\u0026#34;, \u0026#34;\u0026#34;, \u0026#34;will list\u0026#34;, \u0026#34;will launch\u0026#34;, \u0026#34;\u0026#34;, \u0026#34;exclusive\u0026#34;, \u0026#34;binance wallet\u0026#34;, \u0026#34;hodler\u0026#34;, ] # — EXCLUDE_KEYWORDS = [ \u0026#34;delisting\u0026#34;, \u0026#34;delist\u0026#34;, \u0026#34;\u0026#34;, \u0026#34;deprecate\u0026#34;, \u0026#34;\u0026#34;, \u0026#34;maintenance\u0026#34;, \u0026#34;\u0026#34;, \u0026#34;launchpool\u0026#34;, \u0026#34;megadrop\u0026#34;, \u0026#34;buyback\u0026#34;, \u0026#34;\u0026#34;, \u0026#34;\u0026#34;, \u0026#34;\u0026#34;, \u0026#34;perpetual contract\u0026#34;, # \u0026#34;futures will launch\u0026#34;, # \u0026#34;usdⓢ-margined\u0026#34;, # U \u0026#34;coin-margined\u0026#34;, # \u0026#34;margin will add\u0026#34;, # \u0026#34;trading bots services\u0026#34;, # \u0026#34;trading pairs\u0026#34;, # () ] # Alpha Box ALPHA_BOX_KEYWORDS = [\u0026#34;alpha box\u0026#34;, \u0026#34;\u0026#34;, \u0026#34;mystery box\u0026#34;] # ============================================================ # VC # ============================================================ TIER1_VCS = [ \u0026#34;binance labs\u0026#34;, \u0026#34;yzi labs\u0026#34;, \u0026#34;coinbase ventures\u0026#34;, \u0026#34;a16z\u0026#34;, \u0026#34;andreessen horowitz\u0026#34;, \u0026#34;paradigm\u0026#34;, \u0026#34;polychain\u0026#34;, \u0026#34;polychain capital\u0026#34;, \u0026#34;sequoia\u0026#34;, \u0026#34;sequoia china\u0026#34;, \u0026#34;sequoia capital\u0026#34;, \u0026#34;multicoin\u0026#34;, \u0026#34;multicoin capital\u0026#34;, \u0026#34;pantera\u0026#34;, \u0026#34;pantera capital\u0026#34;, \u0026#34;dragonfly\u0026#34;, \u0026#34;dragonfly capital\u0026#34;, \u0026#34;founders fund\u0026#34;, ] TIER2_VCS = [ \u0026#34;abcde\u0026#34;, \u0026#34;iosg\u0026#34;, \u0026#34;hashkey\u0026#34;, \u0026#34;okx ventures\u0026#34;, \u0026#34;sevenx\u0026#34;, \u0026#34;folius\u0026#34;, \u0026#34;foresight\u0026#34;, \u0026#34;hashed\u0026#34;, \u0026#34;bitkraft\u0026#34;, \u0026#34;framework\u0026#34;, \u0026#34;framework ventures\u0026#34;, \u0026#34;delphi\u0026#34;, \u0026#34;delphi digital\u0026#34;, \u0026#34;electric capital\u0026#34;, \u0026#34;variant\u0026#34;, \u0026#34;1kx\u0026#34;, \u0026#34;placeholder\u0026#34;, \u0026#34;animoca\u0026#34;, \u0026#34;animoca brands\u0026#34;, \u0026#34;jump\u0026#34;, \u0026#34;jump crypto\u0026#34;, \u0026#34;hack vc\u0026#34;, \u0026#34;bain capital\u0026#34;, ] # HOT_NARRATIVES = [\u0026#34;defi_perp\u0026#34;, \u0026#34;ai_agent\u0026#34;, \u0026#34;ai_defi\u0026#34;, \u0026#34;defai\u0026#34;, \u0026#34;zk_proof\u0026#34;] WEAK_NARRATIVES = [\u0026#34;gamefi\u0026#34;, \u0026#34;meme\u0026#34;, \u0026#34;social\u0026#34;] # BINANCE_DARLING_KEYWORDS = [\u0026#34;yzi labs\u0026#34;, \u0026#34;binance labs\u0026#34;] # ============================================================ # # ============================================================ TIER_ICONS = {\u0026#34;S\u0026#34;: \u0026#34;🟢🟢🟢\u0026#34;, \u0026#34;A\u0026#34;: \u0026#34;🟡🟡\u0026#34;, \u0026#34;B\u0026#34;: \u0026#34;🟠\u0026#34;, \u0026#34;C\u0026#34;: \u0026#34;⚪\u0026#34;} TIER_LABELS = {\u0026#34;S\u0026#34;: \u0026#34;S ()\u0026#34;, \u0026#34;A\u0026#34;: \u0026#34;A ()\u0026#34;, \u0026#34;B\u0026#34;: \u0026#34;B ()\u0026#34;, \u0026#34;C\u0026#34;: \u0026#34;C ()\u0026#34;} def count_vc_tier(vcs: list, vc_list: list) -\u0026gt; int: count = 0 vcs_lower = [v.lower() for v in vcs] for t in vc_list: if any(t in v for v in vcs_lower): count += 1 return count def rate_project(circ_mcap: float, fdv: float, vcs: list, narrative: str, is_darling: bool) -\u0026gt; dict: \u0026#34;\u0026#34;\u0026#34;S/A/B/C \u0026#34;\u0026#34;\u0026#34; t1 = count_vc_tier(vcs, TIER1_VCS) t2 = count_vc_tier(vcs, TIER2_VCS) hot = narrative in HOT_NARRATIVES weak = narrative in WEAK_NARRATIVES circ_mcap = circ_mcap or 0 fdv = fdv or 0 warnings = [] if weak: warnings.append(f\u0026#34;⚠️ {narrative} \u0026#34;) # S 5 if is_darling: return {\u0026#34;tier\u0026#34;: \u0026#34;S\u0026#34;, \u0026#34;reason\u0026#34;: \u0026#34;(YZi/Binance Labs/CZ)\u0026#34;, \u0026#34;warnings\u0026#34;: warnings} if hot and t1 \u0026gt;= 1 and fdv \u0026lt; 500_000_000: return {\u0026#34;tier\u0026#34;: \u0026#34;S\u0026#34;, \u0026#34;reason\u0026#34;: f\u0026#34;({narrative})+ Tier1 VC\u0026#34;, \u0026#34;warnings\u0026#34;: warnings} if t1 \u0026gt;= 2 and circ_mcap \u0026lt; 50_000_000 and fdv \u0026lt; 300_000_000: return {\u0026#34;tier\u0026#34;: \u0026#34;S\u0026#34;, \u0026#34;reason\u0026#34;: \u0026#34;≥2 Tier1 \u0026#34;, \u0026#34;warnings\u0026#34;: warnings} if t1 \u0026gt;= 1 and circ_mcap \u0026lt; 10_000_000 and fdv \u0026lt; 100_000_000: return {\u0026#34;tier\u0026#34;: \u0026#34;S\u0026#34;, \u0026#34;reason\u0026#34;: \u0026#34;Tier1 \u0026#34;, \u0026#34;warnings\u0026#34;: warnings} if hot and circ_mcap \u0026lt; 10_000_000 and fdv \u0026lt; 50_000_000: return {\u0026#34;tier\u0026#34;: \u0026#34;S\u0026#34;, \u0026#34;reason\u0026#34;: f\u0026#34;({narrative})\u0026#34;, \u0026#34;warnings\u0026#34;: warnings} # A if t1 \u0026gt;= 1 and circ_mcap \u0026lt; 20_000_000 and fdv \u0026lt; 200_000_000: return {\u0026#34;tier\u0026#34;: \u0026#34;A\u0026#34;, \u0026#34;reason\u0026#34;: \u0026#34;Tier1 \u0026#34;, \u0026#34;warnings\u0026#34;: warnings} # B if circ_mcap \u0026lt; 50_000_000 and fdv \u0026lt; 500_000_000: return {\u0026#34;tier\u0026#34;: \u0026#34;B\u0026#34;, \u0026#34;reason\u0026#34;: \u0026#34;\u0026#34;, \u0026#34;warnings\u0026#34;: warnings} return {\u0026#34;tier\u0026#34;: \u0026#34;C\u0026#34;, \u0026#34;reason\u0026#34;: \u0026#34;/\u0026#34;, \u0026#34;warnings\u0026#34;: warnings} # ============================================================ # # ============================================================ def init_db(): Path(DB_PATH).parent.mkdir(parents=True, exist_ok=True) conn = sqlite3.connect(DB_PATH) c = conn.cursor() c.execute(\u0026#34;\u0026#34;\u0026#34; CREATE TABLE IF NOT EXISTS projects ( id TEXT PRIMARY KEY, symbol TEXT NOT NULL, name TEXT, launch_time TEXT, source TEXT, raw_text TEXT, tier TEXT DEFAULT \u0026#39;PENDING\u0026#39;, tier_reason TEXT, narrative TEXT, narrative_desc TEXT, vcs_json TEXT DEFAULT \u0026#39;[]\u0026#39;, is_darling INTEGER DEFAULT 0, open_price REAL, total_supply REAL, circulating_supply REAL, fdv REAL, circulating_mcap REAL, excluded INTEGER DEFAULT 0, exclude_reason TEXT, discovered_at TEXT, updated_at TEXT )\u0026#34;\u0026#34;\u0026#34;) c.execute(\u0026#34;\u0026#34;\u0026#34; CREATE TABLE IF NOT EXISTS pushes ( id INTEGER PRIMARY KEY AUTOINCREMENT, project_id TEXT NOT NULL, push_type TEXT, sent_at TEXT, content TEXT )\u0026#34;\u0026#34;\u0026#34;) c.execute(\u0026#34;\u0026#34;\u0026#34; CREATE TABLE IF NOT EXISTS snapshots ( id INTEGER PRIMARY KEY AUTOINCREMENT, project_id TEXT NOT NULL, timestamp TEXT NOT NULL, price REAL, circulating_mcap REAL, fdv REAL )\u0026#34;\u0026#34;\u0026#34;) conn.commit() conn.close() def project_id(symbol: str, date_str: str) -\u0026gt; str: return hashlib.md5(f\u0026#34;{symbol.upper()}_{date_str}\u0026#34;.encode()).hexdigest()[:16] def project_exists(pid: str) -\u0026gt; bool: conn = sqlite3.connect(DB_PATH) exists = conn.execute(\u0026#34;SELECT 1 FROM projects WHERE id=?\u0026#34;, (pid,)).fetchone() is not None conn.close() return exists def save_project(project: dict): conn = sqlite3.connect(DB_PATH) now = datetime.utcnow().isoformat() conn.execute(\u0026#34;\u0026#34;\u0026#34; INSERT OR IGNORE INTO projects (id, symbol, name, launch_time, source, raw_text, tier, tier_reason, narrative, narrative_desc, vcs_json, is_darling, open_price, total_supply, circulating_supply, fdv, circulating_mcap, excluded, exclude_reason, discovered_at, updated_at) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) \u0026#34;\u0026#34;\u0026#34;, ( project[\u0026#34;id\u0026#34;], project[\u0026#34;symbol\u0026#34;], project.get(\u0026#34;name\u0026#34;), project.get(\u0026#34;launch_time\u0026#34;), project.get(\u0026#34;source\u0026#34;), project.get(\u0026#34;raw_text\u0026#34;), project.get(\u0026#34;tier\u0026#34;, \u0026#34;PENDING\u0026#34;), project.get(\u0026#34;tier_reason\u0026#34;), project.get(\u0026#34;narrative\u0026#34;), project.get(\u0026#34;narrative_desc\u0026#34;), json.dumps(project.get(\u0026#34;vcs\u0026#34;, [])), int(project.get(\u0026#34;is_darling\u0026#34;, False)), project.get(\u0026#34;open_price\u0026#34;), project.get(\u0026#34;total_supply\u0026#34;), project.get(\u0026#34;circulating_supply\u0026#34;), project.get(\u0026#34;fdv\u0026#34;), project.get(\u0026#34;circulating_mcap\u0026#34;), int(project.get(\u0026#34;excluded\u0026#34;, 0)), project.get(\u0026#34;exclude_reason\u0026#34;), now, now, )) conn.commit() conn.close() def update_project(pid: str, fields: dict): if not fields: return conn = sqlite3.connect(DB_PATH) fields[\u0026#34;updated_at\u0026#34;] = datetime.utcnow().isoformat() set_parts = [f\u0026#34;{k}=?\u0026#34; for k in fields] values = list(fields.values()) + [pid] conn.execute(f\u0026#34;UPDATE projects SET {\u0026#39;,\u0026#39;.join(set_parts)} WHERE id=?\u0026#34;, values) conn.commit() conn.close() def get_project(pid: str) -\u0026gt; Optional[dict]: conn = sqlite3.connect(DB_PATH) conn.row_factory = sqlite3.Row row = conn.execute(\u0026#34;SELECT * FROM projects WHERE id=?\u0026#34;, (pid,)).fetchone() conn.close() return dict(row) if row else None def list_pending() -\u0026gt; list: conn = sqlite3.connect(DB_PATH) conn.row_factory = sqlite3.Row rows = conn.execute( \u0026#34;SELECT * FROM projects WHERE excluded=0 AND tier=\u0026#39;PENDING\u0026#39; ORDER BY discovered_at\u0026#34; ).fetchall() conn.close() return [dict(r) for r in rows] def list_active() -\u0026gt; list: \u0026#34;\u0026#34;\u0026#34;（PENDINGEXCLUDED，launch_time）\u0026#34;\u0026#34;\u0026#34; conn = sqlite3.connect(DB_PATH) conn.row_factory = sqlite3.Row rows = conn.execute(\u0026#34;\u0026#34;\u0026#34; SELECT * FROM projects WHERE excluded=0 AND launch_time IS NOT NULL AND launch_time != \u0026#39;\u0026#39; AND tier NOT IN (\u0026#39;PENDING\u0026#39;, \u0026#39;EXCLUDED\u0026#39;, \u0026#39;ERROR\u0026#39;) \u0026#34;\u0026#34;\u0026#34;).fetchall() conn.close() return [dict(r) for r in rows] def has_pushed(pid: str, push_type: str) -\u0026gt; bool: conn = sqlite3.connect(DB_PATH) exists = conn.execute( \u0026#34;SELECT 1 FROM pushes WHERE project_id=? AND push_type=?\u0026#34;, (pid, push_type) ).fetchone() is not None conn.close() return exists def log_push(pid: str, push_type: str, content: str): conn = sqlite3.connect(DB_PATH) conn.execute( \u0026#34;INSERT INTO pushes (project_id, push_type, sent_at, content) VALUES (?,?,?,?)\u0026#34;, (pid, push_type, datetime.utcnow().isoformat(), content) ) conn.commit() conn.close() def save_snapshot(pid: str, price: float, mcap: float, fdv: float): conn = sqlite3.connect(DB_PATH) conn.execute( \u0026#34;INSERT INTO snapshots (project_id, timestamp, price, circulating_mcap, fdv) VALUES (?,?,?,?,?)\u0026#34;, (pid, datetime.utcnow().isoformat(), price, mcap, fdv) ) conn.commit() conn.close() # ============================================================ # TG # ============================================================ async def send_tg(text: str, silent: bool = False) -\u0026gt; bool: if not TG_BOT_TOKEN or not TG_CHAT_ID: logger.error(\u0026#34;TG_BOT_TOKEN TG_CHAT_ID \u0026#34;) return False url = f\u0026#34;https://api.telegram.org/bot{TG_BOT_TOKEN}/sendMessage\u0026#34; payload = { \u0026#34;chat_id\u0026#34;: TG_CHAT_ID, \u0026#34;text\u0026#34;: text, \u0026#34;parse_mode\u0026#34;: \u0026#34;HTML\u0026#34;, \u0026#34;disable_notification\u0026#34;: silent, } try: async with httpx.AsyncClient(timeout=15, headers=HEADERS) as client: resp = await client.post(url, json=payload) if resp.status_code != 200: logger.error(f\u0026#34;TG {resp.status_code}: {resp.text[:200]}\u0026#34;) return False return True except Exception as e: logger.error(f\u0026#34;TG: {e}\u0026#34;) return False # ============================================================ # # ============================================================ def is_trigger(title: str) -\u0026gt; tuple[bool, Optional[str]]: t = title.lower() for kw in EXCLUDE_KEYWORDS: if kw.lower() in t: return False, f\u0026#34;: {kw}\u0026#34; for kw in ALPHA_BOX_KEYWORDS: if kw.lower() in t: return False, \u0026#34;Alpha Box \u0026#34; for kw in TRIGGER_KEYWORDS: if kw.lower() in t: return True, None return False, None def extract_symbol(title: str) -\u0026gt; Optional[str]: # : \u0026#34;Chip (CHIP)\u0026#34; m = re.search(r\u0026#34;\\(([A-Z0-9]{2,10})\\)\u0026#34;, title) if m: return m.group(1) # m = re.search(r\u0026#34;（([A-Z0-9]{2,10})）\u0026#34;, title) if m: return m.group(1) return None def extract_name(title: str) -\u0026gt; Optional[str]: patterns = [ r\u0026#34;(?:|List|list|Launch|launch|featured)\\s+([A-Za-z0-9 ]+?)\\s*[\\(（]\u0026#34;, ] for p in patterns: m = re.search(p, title, re.IGNORECASE) if m: return m.group(1).strip() return None # ============================================================ # # ============================================================ async def fetch_announcements(limit: int = 20) -\u0026gt; list: \u0026#34;\u0026#34;\u0026#34;\u0026#34;\u0026#34;\u0026#34; all_articles = [] # 48: New Cryptocurrency Listing, 161: Latest Activities, 93: Latest News for catalog_id in [48, 161, 93]: params = {\u0026#34;type\u0026#34;: 1, \u0026#34;catalogId\u0026#34;: catalog_id, \u0026#34;pageNo\u0026#34;: 1, \u0026#34;pageSize\u0026#34;: limit} try: async with httpx.AsyncClient(timeout=15, headers=HEADERS) as client: resp = await client.get(BINANCE_ANNOUNCEMENT_API, params=params) resp.raise_for_status() data = resp.json() for catalog in data.get(\u0026#34;data\u0026#34;, {}).get(\u0026#34;catalogs\u0026#34;, []): for a in catalog.get(\u0026#34;articles\u0026#34;, []): a[\u0026#34;_catalog_id\u0026#34;] = catalog_id all_articles.append(a) except Exception as e: logger.warning(f\u0026#34; {catalog_id} : {e}\u0026#34;) # seen = set() unique = [] for a in all_articles: code = a.get(\u0026#34;code\u0026#34;) if code and code not in seen: seen.add(code) unique.append(a) return unique # ============================================================ # CoinGecko # ============================================================ async def fetch_coingecko(symbol: str, project_name: str = \u0026#34;\u0026#34;) -\u0026gt; dict: \u0026#34;\u0026#34;\u0026#34;CoinGecko。：symbol + \u0026#34;\u0026#34;\u0026#34; result = {\u0026#34;found\u0026#34;: False, \u0026#34;price\u0026#34;: None, \u0026#34;fdv\u0026#34;: None, \u0026#34;mcap\u0026#34;: None, \u0026#34;total_supply\u0026#34;: None, \u0026#34;circ_supply\u0026#34;: None, \u0026#34;chain\u0026#34;: None, \u0026#34;contract\u0026#34;: None} try: async with httpx.AsyncClient(timeout=15, headers=HEADERS) as client: # ：symbol， queries = [symbol] if project_name and project_name.upper() != symbol.upper(): queries.append(project_name) coin_id = None best_rank = 999999 name_exact_match = None # for query in queries: resp = await client.get(\u0026#34;https://api.coingecko.com/api/v3/search\u0026#34;, params={\u0026#34;query\u0026#34;: query}) if resp.status_code != 200: continue coins = resp.json().get(\u0026#34;coins\u0026#34;, []) for c in coins: c_sym = c.get(\u0026#34;symbol\u0026#34;, \u0026#34;\u0026#34;).upper() c_name = c.get(\u0026#34;name\u0026#34;, \u0026#34;\u0026#34;).lower() c_rank = c.get(\u0026#34;market_cap_rank\u0026#34;) or 999999 # （，MegaETH -\u0026gt; megaeth） if project_name and c_name == project_name.lower(): name_exact_match = c[\u0026#34;id\u0026#34;] # symbol — market_cap_rank（） if c_sym == symbol.upper(): if c_rank \u0026lt; best_rank: coin_id = c[\u0026#34;id\u0026#34;] best_rank = c_rank # （MegaETHmega） if project_name and project_name.lower() in c_name: if c_rank \u0026lt; best_rank: coin_id = c[\u0026#34;id\u0026#34;] best_rank = c_rank # \u0026gt; if name_exact_match: coin_id = name_exact_match if not coin_id: logger.info(f\u0026#34;CoinGecko {symbol}/{project_name}\u0026#34;) return result logger.info(f\u0026#34;CoinGecko: {symbol} -\u0026gt; {coin_id} (rank={best_rank})\u0026#34;) resp2 = await client.get( f\u0026#34;https://api.coingecko.com/api/v3/coins/{coin_id}\u0026#34;, params={\u0026#34;localization\u0026#34;: \u0026#34;false\u0026#34;, \u0026#34;tickers\u0026#34;: \u0026#34;false\u0026#34;, \u0026#34;market_data\u0026#34;: \u0026#34;true\u0026#34;, \u0026#34;community_data\u0026#34;: \u0026#34;false\u0026#34;, \u0026#34;developer_data\u0026#34;: \u0026#34;false\u0026#34;} ) if resp2.status_code == 429: await asyncio.sleep(5) resp2 = await client.get( f\u0026#34;https://api.coingecko.com/api/v3/coins/{coin_id}\u0026#34;, params={\u0026#34;localization\u0026#34;: \u0026#34;false\u0026#34;, \u0026#34;tickers\u0026#34;: \u0026#34;false\u0026#34;, \u0026#34;market_data\u0026#34;: \u0026#34;true\u0026#34;, \u0026#34;community_data\u0026#34;: \u0026#34;false\u0026#34;, \u0026#34;developer_data\u0026#34;: \u0026#34;false\u0026#34;} ) if resp2.status_code != 200: return result d = resp2.json() md = d.get(\u0026#34;market_data\u0026#34;, {}) result.update({ \u0026#34;found\u0026#34;: True, \u0026#34;price\u0026#34;: (md.get(\u0026#34;current_price\u0026#34;) or {}).get(\u0026#34;usd\u0026#34;), \u0026#34;fdv\u0026#34;: (md.get(\u0026#34;fully_diluted_valuation\u0026#34;) or {}).get(\u0026#34;usd\u0026#34;), \u0026#34;mcap\u0026#34;: (md.get(\u0026#34;market_cap\u0026#34;) or {}).get(\u0026#34;usd\u0026#34;), \u0026#34;total_supply\u0026#34;: md.get(\u0026#34;total_supply\u0026#34;), \u0026#34;circ_supply\u0026#34;: md.get(\u0026#34;circulating_supply\u0026#34;), }) # categories（VC\u0026#34;YZi Labs Portfolio\u0026#34;）description result[\u0026#34;categories\u0026#34;] = d.get(\u0026#34;categories\u0026#34;, []) result[\u0026#34;description\u0026#34;] = (d.get(\u0026#34;description\u0026#34;) or {}).get(\u0026#34;en\u0026#34;, \u0026#34;\u0026#34;)[:500] platforms = d.get(\u0026#34;platforms\u0026#34;, {}) for chain, addr in platforms.items(): if addr: result[\u0026#34;chain\u0026#34;] = chain result[\u0026#34;contract\u0026#34;] = addr break # CoinGecko（），/ if not result[\u0026#34;price\u0026#34;]: binance_price = await _fetch_binance_price(symbol, client) if binance_price: result[\u0026#34;price\u0026#34;] = binance_price ts = result.get(\u0026#34;total_supply\u0026#34;) or 0 cs = result.get(\u0026#34;circ_supply\u0026#34;) or 0 if ts \u0026gt; 0: result[\u0026#34;fdv\u0026#34;] = binance_price * ts if cs \u0026gt; 0: result[\u0026#34;mcap\u0026#34;] = binance_price * cs logger.info(f\u0026#34; {symbol}: ${binance_price}, FDV=${result.get(\u0026#39;fdv\u0026#39;,0):,.0f}\u0026#34;) except Exception as e: logger.warning(f\u0026#34;CoinGecko {symbol}: {e}\u0026#34;) return result async def _fetch_binance_price(symbol: str, client: httpx.AsyncClient) -\u0026gt; float: \u0026#34;\u0026#34;\u0026#34;\u0026#34;\u0026#34;\u0026#34; pair = f\u0026#34;{symbol.upper()}USDT\u0026#34; # 1. try: resp = await client.get(f\u0026#34;https://api.binance.com/api/v3/ticker/price\u0026#34;, params={\u0026#34;symbol\u0026#34;: pair}) if resp.status_code == 200: return float(resp.json()[\u0026#34;price\u0026#34;]) except Exception: pass # 2. try: resp = await client.get(f\u0026#34;https://fapi.binance.com/fapi/v1/ticker/price\u0026#34;, params={\u0026#34;symbol\u0026#34;: pair}) if resp.status_code == 200: return float(resp.json()[\u0026#34;price\u0026#34;]) except Exception: pass return 0.0 # ============================================================ # LLM （，） # ============================================================ async def llm_extract(raw_text: str, symbol: str, name: str = \u0026#34;\u0026#34;, cg_data: dict = None) -\u0026gt; dict: \u0026#34;\u0026#34;\u0026#34;LLM+CoinGecko/VC/\u0026#34;\u0026#34;\u0026#34; fallback = { \u0026#34;narrative\u0026#34;: \u0026#34;unknown\u0026#34;, \u0026#34;narrative_desc\u0026#34;: \u0026#34;\u0026#34;, \u0026#34;vcs\u0026#34;: [], \u0026#34;is_darling\u0026#34;: False, \u0026#34;exclude_reason\u0026#34;: None, } # CoinGecko categories cg_data = cg_data or {} categories = cg_data.get(\u0026#34;categories\u0026#34;, []) description = cg_data.get(\u0026#34;description\u0026#34;, \u0026#34;\u0026#34;) # （categories） darling_cats = [c for c in categories if any(kw in c.lower() for kw in [\u0026#34;yzi labs\u0026#34;, \u0026#34;binance labs\u0026#34;])] if darling_cats: fallback[\u0026#34;is_darling\u0026#34;] = True if not ANTHROPIC_API_KEY: # ：+categories t = raw_text.lower() for kw in BINANCE_DARLING_KEYWORDS: if kw in t: fallback[\u0026#34;is_darling\u0026#34;] = True # categories cat_str = \u0026#34; \u0026#34;.join(categories).lower() if \u0026#34;defi\u0026#34; in cat_str: fallback[\u0026#34;narrative\u0026#34;] = \u0026#34;defi\u0026#34; elif \u0026#34;ai\u0026#34; in cat_str: fallback[\u0026#34;narrative\u0026#34;] = \u0026#34;ai_agent\u0026#34; elif \u0026#34;gaming\u0026#34; in cat_str or \u0026#34;gamefi\u0026#34; in cat_str: fallback[\u0026#34;narrative\u0026#34;] = \u0026#34;gamefi\u0026#34; elif \u0026#34;meme\u0026#34; in cat_str: fallback[\u0026#34;narrative\u0026#34;] = \u0026#34;meme\u0026#34; elif \u0026#34;rwa\u0026#34; in cat_str or \u0026#34;real world\u0026#34; in cat_str: fallback[\u0026#34;narrative\u0026#34;] = \u0026#34;rwa\u0026#34; return fallback # extra_context = \u0026#34;\u0026#34; if categories: extra_context += f\u0026#34;\\nCoinGecko: {\u0026#39;, \u0026#39;.join(categories)}\u0026#34; if description: extra_context += f\u0026#34;\\n: {description[:300]}\u0026#34; if cg_data.get(\u0026#34;found\u0026#34;): extra_context += f\u0026#34;\\n: FDV=${cg_data.get(\u0026#39;fdv\u0026#39;,0):,.0f}, MCap=${cg_data.get(\u0026#39;mcap\u0026#39;,0):,.0f}, =${cg_data.get(\u0026#39;price\u0026#39;,0)}\u0026#34; if cg_data.get(\u0026#34;chain\u0026#34;): extra_context += f\u0026#34;, ={cg_data[\u0026#39;chain\u0026#39;]}\u0026#34; system = \u0026#34;，。JSON，。\u0026#34; user = f\u0026#34;\u0026#34;\u0026#34;： : {symbol}, : {name or \u0026#34;\u0026#34;} : {raw_text} {extra_context} JSON: {{ \u0026#34;narrative\u0026#34;: \u0026#34;defi_perp|ai_agent|ai_defi|defai|zk_proof|infra|defi|rwa|gamefi|meme|social|stablecoin|unknown\u0026#34;, \u0026#34;narrative_desc\u0026#34;: \u0026#34;、\u0026#34;, \u0026#34;vcs\u0026#34;: [\u0026#34;CoinGecko\u0026#34;], \u0026#34;is_darling\u0026#34;: true/false, \u0026#34;exclude_reason\u0026#34;: null|\u0026#34;already_tge\u0026#34;|\u0026#34;meme_only\u0026#34; }} : - narrative: - vcs: CoinGecko \u0026#34;XXX Portfolio\u0026#34; XXX - is_darling: YZi Labs/Binance Labs CZ/ true - exclude_reason: CEX(Coinbase/OKX/Bybit)3\u0026#34;already_tge\u0026#34;。DEX，already_tge。CoinGeckoalready_tge。meme\u0026#34;meme_only\u0026#34; \u0026#34;\u0026#34;\u0026#34; try: async with httpx.AsyncClient(timeout=30, headers=HEADERS) as client: resp = await client.post( f\u0026#34;{ANTHROPIC_BASE_URL.rstrip(\u0026#39;/\u0026#39;)}/v1/messages\u0026#34;, headers={ \u0026#34;x-api-key\u0026#34;: ANTHROPIC_API_KEY, \u0026#34;anthropic-version\u0026#34;: \u0026#34;2023-06-01\u0026#34;, \u0026#34;content-type\u0026#34;: \u0026#34;application/json\u0026#34;, }, json={ \u0026#34;model\u0026#34;: ANTHROPIC_MODEL, \u0026#34;max_tokens\u0026#34;: 800, \u0026#34;temperature\u0026#34;: 0, \u0026#34;system\u0026#34;: system, \u0026#34;messages\u0026#34;: [{\u0026#34;role\u0026#34;: \u0026#34;user\u0026#34;, \u0026#34;content\u0026#34;: user}], } ) if resp.status_code != 200: logger.warning(f\u0026#34;LLM {resp.status_code}\u0026#34;) return fallback data = resp.json() text = \u0026#34;\u0026#34; for block in data.get(\u0026#34;content\u0026#34;, []): if block.get(\u0026#34;type\u0026#34;) == \u0026#34;text\u0026#34;: text = block.get(\u0026#34;text\u0026#34;, \u0026#34;\u0026#34;) break text = text.strip() if text.startswith(\u0026#34;```\u0026#34;): lines = text.split(\u0026#34;\\n\u0026#34;) text = \u0026#34;\\n\u0026#34;.join(lines[1:-1]) return json.loads(text) except Exception as e: logger.warning(f\u0026#34;LLM: {e}\u0026#34;) return fallback # ============================================================ # # ============================================================ def _fmt_mcap(v): if not v: return \u0026#34;N/A\u0026#34; if v \u0026gt;= 1e9: return f\u0026#34;${v/1e9:.1f}B\u0026#34; if v \u0026gt;= 1e6: return f\u0026#34;${v/1e6:.1f}M\u0026#34; if v \u0026gt;= 1e3: return f\u0026#34;${v/1e3:.0f}K\u0026#34; return f\u0026#34;${v:.0f}\u0026#34; def _fmt_price(v): if not v: return \u0026#34;N/A\u0026#34; if v \u0026gt;= 1: return f\u0026#34;${v:.2f}\u0026#34; if v \u0026gt;= 0.01: return f\u0026#34;${v:.4f}\u0026#34; return f\u0026#34;${v:.6f}\u0026#34; def fmt_discovery(p: dict) -\u0026gt; str: tier = p.get(\u0026#34;tier\u0026#34;, \u0026#34;C\u0026#34;) icon = TIER_ICONS.get(tier, \u0026#34;⚪\u0026#34;) label = TIER_LABELS.get(tier, \u0026#34;\u0026#34;) symbol = p[\u0026#34;symbol\u0026#34;] name = p.get(\u0026#34;name\u0026#34;) or \u0026#34;\u0026#34; vcs = json.loads(p.get(\u0026#34;vcs_json\u0026#34;, \u0026#34;[]\u0026#34;)) if isinstance(p.get(\u0026#34;vcs_json\u0026#34;), str) else p.get(\u0026#34;vcs\u0026#34;, []) lines = [ f\u0026#34;{icon} \u0026lt;b\u0026gt;Alpha · ${symbol}\u0026lt;/b\u0026gt; {icon}\u0026#34;, f\u0026#34;📋 {label}\u0026#34;, \u0026#34;\u0026#34;, f\u0026#34;\u0026lt;b\u0026gt;{name}\u0026lt;/b\u0026gt;\u0026#34; if name else \u0026#34;\u0026#34;, ] if p.get(\u0026#34;narrative_desc\u0026#34;): lines.append(f\u0026#34;💡 {p[\u0026#39;narrative_desc\u0026#39;]}\u0026#34;) if p.get(\u0026#34;narrative\u0026#34;) and p[\u0026#34;narrative\u0026#34;] != \u0026#34;unknown\u0026#34;: lines.append(f\u0026#34;🏷 : {p[\u0026#39;narrative\u0026#39;]}\u0026#34;) lines.append(\u0026#34;\u0026#34;) if p.get(\u0026#34;fdv\u0026#34;): lines.append(f\u0026#34;📊 FDV: {_fmt_mcap(p[\u0026#39;fdv\u0026#39;])}\u0026#34;) if p.get(\u0026#34;circulating_mcap\u0026#34;): lines.append(f\u0026#34;📊 : {_fmt_mcap(p[\u0026#39;circulating_mcap\u0026#39;])}\u0026#34;) if p.get(\u0026#34;open_price\u0026#34;): lines.append(f\u0026#34;💰 : {_fmt_price(p[\u0026#39;open_price\u0026#39;])}\u0026#34;) if p.get(\u0026#34;total_supply\u0026#34;) and p.get(\u0026#34;circulating_supply\u0026#34;): pct = p[\u0026#34;circulating_supply\u0026#34;] / p[\u0026#34;total_supply\u0026#34;] * 100 lines.append(f\u0026#34;📦 : {pct:.1f}%\u0026#34;) if vcs: lines.append(\u0026#34;\u0026#34;) lines.append(\u0026#34;🏛 \u0026lt;b\u0026gt;\u0026lt;/b\u0026gt;\u0026#34;) for v in vcs[:5]: is_t1 = any(t in v.lower() for t in TIER1_VCS) lines.append(f\u0026#34; {\u0026#39;⭐\u0026#39; if is_t1 else \u0026#39;·\u0026#39;} {v}\u0026#34;) if p.get(\u0026#34;is_darling\u0026#34;): lines.append(\u0026#34;\u0026#34;) lines.append(\u0026#34;🔥 \u0026lt;b\u0026gt;\u0026lt;/b\u0026gt;\u0026#34;) if p.get(\u0026#34;tier_reason\u0026#34;): lines.append(\u0026#34;\u0026#34;) lines.append(f\u0026#34;🎯 {p[\u0026#39;tier_reason\u0026#39;]}\u0026#34;) lines.append(\u0026#34;\u0026#34;) lines.append(f\u0026#34;\u0026lt;i\u0026gt;📌 : {p.get(\u0026#39;source\u0026#39;, \u0026#39;binance\u0026#39;)}\u0026lt;/i\u0026gt;\u0026#34;) if p.get(\u0026#34;raw_text\u0026#34;): lines.append(f\u0026#34;\u0026lt;i\u0026gt;{p[\u0026#39;raw_text\u0026#39;][:120]}\u0026lt;/i\u0026gt;\u0026#34;) return \u0026#34;\\n\u0026#34;.join(l for l in lines if l is not None) def fmt_countdown(p: dict, minutes: int) -\u0026gt; str: icon = TIER_ICONS.get(p.get(\u0026#34;tier\u0026#34;, \u0026#34;C\u0026#34;), \u0026#34;⚪\u0026#34;) t = f\u0026#34;{minutes//60}h{minutes%60}m\u0026#34; if minutes \u0026gt;= 60 else f\u0026#34;{minutes}m\u0026#34; lines = [ f\u0026#34;{icon} \u0026lt;b\u0026gt;\u0026lt;/b\u0026gt;\u0026#34;, f\u0026#34;\u0026lt;b\u0026gt;${p[\u0026#39;symbol\u0026#39;]}\u0026lt;/b\u0026gt; · {p.get(\u0026#39;name\u0026#39;, \u0026#39;\u0026#39;)}\u0026#34;, f\u0026#34;⏰ \u0026lt;b\u0026gt;{t}\u0026lt;/b\u0026gt;\u0026#34;, ] if p.get(\u0026#34;fdv\u0026#34;): lines.append(f\u0026#34;FDV: {_fmt_mcap(p[\u0026#39;fdv\u0026#39;])}\u0026#34;) if minutes \u0026lt;= 30: lines.append(\u0026#34;🔔 \u0026lt;b\u0026gt;\u0026lt;/b\u0026gt;\u0026#34;) return \u0026#34;\\n\u0026#34;.join(lines) def fmt_launch(p: dict, price: float, mcap: float, fdv: float) -\u0026gt; str: lines = [ f\u0026#34;🚀 \u0026lt;b\u0026gt;${p[\u0026#39;symbol\u0026#39;]} \u0026lt;/b\u0026gt;\u0026#34;, f\u0026#34;: \u0026lt;b\u0026gt;{_fmt_price(price)}\u0026lt;/b\u0026gt;\u0026#34;, f\u0026#34;: \u0026lt;b\u0026gt;{_fmt_mcap(mcap)}\u0026lt;/b\u0026gt;\u0026#34;, f\u0026#34;FDV: \u0026lt;b\u0026gt;{_fmt_mcap(fdv)}\u0026lt;/b\u0026gt;\u0026#34;, ] return \u0026#34;\\n\u0026#34;.join(lines) def fmt_periodic(p: dict, idx: int, price: float, mcap: float, change_pct: float) -\u0026gt; str: arrow = \u0026#34;📈\u0026#34; if change_pct \u0026gt; 0 else \u0026#34;📉\u0026#34; minutes = 30 * idx lines = [ f\u0026#34;⏱ \u0026lt;b\u0026gt;${p[\u0026#39;symbol\u0026#39;]} · +{minutes}min\u0026lt;/b\u0026gt;\u0026#34;, f\u0026#34;: {_fmt_mcap(mcap)} ({arrow} {change_pct:+.1f}%)\u0026#34;, f\u0026#34;: {_fmt_price(price)}\u0026#34;, ] if change_pct \u0026gt;= 100: lines.append(\u0026#34;💡 \u0026lt;b\u0026gt;，\u0026lt;/b\u0026gt;\u0026#34;) elif change_pct \u0026lt;= -30: lines.append(\u0026#34;⚠️ ，\u0026#34;) return \u0026#34;\\n\u0026#34;.join(lines) def fmt_anomaly(p: dict, atype: str, price: float, change_pct: float) -\u0026gt; str: emoji = {\u0026#34;double\u0026#34;: \u0026#34;🚀\u0026#34;, \u0026#34;halve\u0026#34;: \u0026#34;🔻\u0026#34;}.get(atype, \u0026#34;⚡\u0026#34;) desc = {\u0026#34;double\u0026#34;: \u0026#34;\u0026#34;, \u0026#34;halve\u0026#34;: \u0026#34;\u0026#34;}.get(atype, \u0026#34;\u0026#34;) return f\u0026#34;{emoji} \u0026lt;b\u0026gt;${p[\u0026#39;symbol\u0026#39;]} {desc}\u0026lt;/b\u0026gt;\\n: {change_pct:+.1f}%\\n: {_fmt_price(price)}\u0026#34; # ============================================================ # : # ============================================================ async def announcement_listener(): \u0026#34;\u0026#34;\u0026#34;，Alpha\u0026#34;\u0026#34;\u0026#34; logger.info(f\u0026#34;📡 · {ANNOUNCEMENT_POLL_INTERVAL}s\u0026#34;) while True: try: articles = await fetch_announcements() new_count = 0 for art in articles: title = art.get(\u0026#34;title\u0026#34;, \u0026#34;\u0026#34;) triggered, reason = is_trigger(title) if not triggered: continue symbol = extract_symbol(title) if not symbol: continue # release_ts = art.get(\u0026#34;releaseDate\u0026#34;) release_iso = datetime.fromtimestamp(release_ts / 1000).isoformat() if release_ts else \u0026#34;\u0026#34; launch_date = release_iso[:10] if release_iso else datetime.utcnow().date().isoformat() pid = project_id(symbol, launch_date) if project_exists(pid): continue project = { \u0026#34;id\u0026#34;: pid, \u0026#34;symbol\u0026#34;: symbol, \u0026#34;name\u0026#34;: extract_name(title), \u0026#34;launch_time\u0026#34;: release_iso, \u0026#34;source\u0026#34;: \u0026#34;binance_announcement\u0026#34;, \u0026#34;raw_text\u0026#34;: title, \u0026#34;tier\u0026#34;: \u0026#34;PENDING\u0026#34;, \u0026#34;vcs\u0026#34;: [], \u0026#34;is_darling\u0026#34;: False, \u0026#34;excluded\u0026#34;: 0, } save_project(project) new_count += 1 logger.info(f\u0026#34;🆕 ${symbol}: {title[:80]}\u0026#34;) if new_count: logger.info(f\u0026#34; {new_count} \u0026#34;) except Exception as e: logger.error(f\u0026#34;: {e}\u0026#34;, exc_info=True) await asyncio.sleep(ANNOUNCEMENT_POLL_INTERVAL) # ============================================================ # : + # ============================================================ async def aggregation_worker(): \u0026#34;\u0026#34;\u0026#34;PENDING、、\u0026#34;\u0026#34;\u0026#34; logger.info(f\u0026#34;🧠 · {AGGREGATION_POLL_INTERVAL}s\u0026#34;) while True: try: pending = list_pending() for p in pending: symbol = p[\u0026#34;symbol\u0026#34;] try: logger.info(f\u0026#34;📦 ${symbol}\u0026#34;) # 1. CoinGecko cg = await fetch_coingecko(symbol, project_name=p.get(\u0026#39;name\u0026#39;, \u0026#39;\u0026#39;)) await asyncio.sleep(1) # # 2. LLM（CoinGecko） llm = await llm_extract(p.get(\u0026#34;raw_text\u0026#34;, \u0026#34;\u0026#34;), symbol, p.get(\u0026#34;name\u0026#34;), cg_data=cg) await asyncio.sleep(1) # 3. if llm.get(\u0026#34;exclude_reason\u0026#34;) in (\u0026#34;already_tge\u0026#34;, \u0026#34;meme_only\u0026#34;): update_project(p[\u0026#34;id\u0026#34;], { \u0026#34;excluded\u0026#34;: 1, \u0026#34;exclude_reason\u0026#34;: llm[\u0026#34;exclude_reason\u0026#34;], \u0026#34;tier\u0026#34;: \u0026#34;EXCLUDED\u0026#34;, }) logger.info(f\u0026#34;⏭ ${symbol} : {llm[\u0026#39;exclude_reason\u0026#39;]}\u0026#34;) continue # 4. — CoinGecko cg_fdv = cg.get(\u0026#34;fdv\u0026#34;, 0) or 0 cg_mcap = cg.get(\u0026#34;mcap\u0026#34;, 0) or 0 data_suspect = False data_warnings = [] # FDV$100K（CoinGecko） if cg.get(\u0026#34;found\u0026#34;) and cg_fdv \u0026gt; 0 and cg_fdv \u0026lt; 100_000: data_suspect = True data_warnings.append(f\u0026#34;FDV=${cg_fdv:,.0f}，CoinGecko\u0026#34;) logger.warning(f\u0026#34;⚠️ {symbol} FDV=${cg_fdv:,.0f} ，\u0026#34;) # 100%（100%） if (cg.get(\u0026#34;circ_supply\u0026#34;) and cg.get(\u0026#34;total_supply\u0026#34;) and cg[\u0026#34;circ_supply\u0026#34;] == cg[\u0026#34;total_supply\u0026#34;] and cg_fdv \u0026lt; 1_000_000): data_suspect = True data_warnings.append(\u0026#34;=FDV，\u0026#34;) if data_suspect: # ，CoinGeckoFDV/MCap cg_fdv = 0 cg_mcap = 0 logger.warning(f\u0026#34;⚠️ {symbol} CoinGecko，LLM\u0026#34;) # 5. is_darling = llm.get(\u0026#34;is_darling\u0026#34;, False) vcs = llm.get(\u0026#34;vcs\u0026#34;, []) narrative = llm.get(\u0026#34;narrative\u0026#34;, \u0026#34;unknown\u0026#34;) rating = rate_project( cg_mcap, cg_fdv, vcs, narrative, is_darling ) # 6. DB（data_suspectCoinGecko） update_project(p[\u0026#34;id\u0026#34;], { \u0026#34;tier\u0026#34;: rating[\u0026#34;tier\u0026#34;], \u0026#34;tier_reason\u0026#34;: rating[\u0026#34;reason\u0026#34;], \u0026#34;narrative\u0026#34;: narrative, \u0026#34;narrative_desc\u0026#34;: llm.get(\u0026#34;narrative_desc\u0026#34;, \u0026#34;\u0026#34;), \u0026#34;vcs_json\u0026#34;: json.dumps(vcs), \u0026#34;is_darling\u0026#34;: int(is_darling), \u0026#34;open_price\u0026#34;: cg.get(\u0026#34;price\u0026#34;) if not data_suspect else None, \u0026#34;total_supply\u0026#34;: cg.get(\u0026#34;total_supply\u0026#34;) if not data_suspect else None, \u0026#34;circulating_supply\u0026#34;: cg.get(\u0026#34;circ_supply\u0026#34;) if not data_suspect else None, \u0026#34;fdv\u0026#34;: cg_fdv if cg_fdv else None, \u0026#34;circulating_mcap\u0026#34;: cg_mcap if cg_mcap else None, }) # 6. discovery full = get_project(p[\u0026#34;id\u0026#34;]) if full and not has_pushed(p[\u0026#34;id\u0026#34;], \u0026#34;discovery\u0026#34;): text = fmt_discovery(full) silent = rating[\u0026#34;tier\u0026#34;] in (\u0026#34;B\u0026#34;, \u0026#34;C\u0026#34;) ok = await send_tg(text, silent=silent) if ok: log_push(p[\u0026#34;id\u0026#34;], \u0026#34;discovery\u0026#34;, text) logger.info(f\u0026#34;✅ ${symbol} [{rating[\u0026#39;tier\u0026#39;]}]\u0026#34;) except Exception as e: logger.error(f\u0026#34; {symbol} : {e}\u0026#34;, exc_info=True) update_project(p[\u0026#34;id\u0026#34;], {\u0026#34;tier\u0026#34;: \u0026#34;ERROR\u0026#34;, \u0026#34;tier_reason\u0026#34;: str(e)[:100]}) except Exception as e: logger.error(f\u0026#34;: {e}\u0026#34;, exc_info=True) await asyncio.sleep(AGGREGATION_POLL_INTERVAL) # ============================================================ # : # ============================================================ async def post_launch_monitor(): \u0026#34;\u0026#34;\u0026#34; + + 30min×4 + \u0026#34;\u0026#34;\u0026#34; logger.info(f\u0026#34;📊 · {MONITOR_POLL_INTERVAL}s\u0026#34;) while True: try: projects = list_active() for p in projects: try: await _monitor_project(p) except Exception as e: logger.error(f\u0026#34; {p[\u0026#39;symbol\u0026#39;]} : {e}\u0026#34;) except Exception as e: logger.error(f\u0026#34;: {e}\u0026#34;, exc_info=True) await asyncio.sleep(MONITOR_POLL_INTERVAL) async def _monitor_project(p: dict): pid = p[\u0026#34;id\u0026#34;] symbol = p[\u0026#34;symbol\u0026#34;] launch_str = p.get(\u0026#34;launch_time\u0026#34;, \u0026#34;\u0026#34;) if not launch_str: return try: launch = datetime.fromisoformat(launch_str.replace(\u0026#34;Z\u0026#34;, \u0026#34;\u0026#34;).split(\u0026#34;+\u0026#34;)[0]) except: return now = datetime.utcnow() delta_sec = (launch - now).total_seconds() # T-3h if 3*3600 - 300 \u0026lt;= delta_sec \u0026lt;= 3*3600 + 300: if not has_pushed(pid, \u0026#34;t_minus_3h\u0026#34;): text = fmt_countdown(p, int(delta_sec / 60)) ok = await send_tg(text, silent=p.get(\u0026#34;tier\u0026#34;) in (\u0026#34;B\u0026#34;, \u0026#34;C\u0026#34;)) if ok: log_push(pid, \u0026#34;t_minus_3h\u0026#34;, text) # T-30m elif 30*60 - 150 \u0026lt;= delta_sec \u0026lt;= 30*60 + 150: if not has_pushed(pid, \u0026#34;t_minus_30m\u0026#34;): text = fmt_countdown(p, int(delta_sec / 60)) ok = await send_tg(text, silent=False) if ok: log_push(pid, \u0026#34;t_minus_30m\u0026#34;, text) # elif -300 \u0026lt;= delta_sec \u0026lt;= 0: if not has_pushed(pid, \u0026#34;at_launch\u0026#34;): cg = await fetch_coingecko(symbol, project_name=p.get(\u0026#39;name\u0026#39;, \u0026#39;\u0026#39;)) if cg.get(\u0026#34;price\u0026#34;): text = fmt_launch(p, cg[\u0026#34;price\u0026#34;], cg.get(\u0026#34;mcap\u0026#34;, 0), cg.get(\u0026#34;fdv\u0026#34;, 0)) ok = await send_tg(text, silent=False) if ok: log_push(pid, \u0026#34;at_launch\u0026#34;, text) save_snapshot(pid, cg[\u0026#34;price\u0026#34;], cg.get(\u0026#34;mcap\u0026#34;, 0), cg.get(\u0026#34;fdv\u0026#34;, 0)) # 30min × 4 elif 0 \u0026lt; -delta_sec \u0026lt;= 2.5 * 3600: minutes_after = int(-delta_sec / 60) for idx, target in enumerate([30, 60, 90, 120], 1): if abs(minutes_after - target) \u0026lt;= 5: ptype = f\u0026#34;post_30m_{idx}\u0026#34; if not has_pushed(pid, ptype): cg = await fetch_coingecko(symbol, project_name=p.get(\u0026#39;name\u0026#39;, \u0026#39;\u0026#39;)) if cg.get(\u0026#34;price\u0026#34;): open_price = p.get(\u0026#34;open_price\u0026#34;) or cg[\u0026#34;price\u0026#34;] change = ((cg[\u0026#34;price\u0026#34;] - open_price) / open_price * 100) if open_price else 0 text = fmt_periodic(p, idx, cg[\u0026#34;price\u0026#34;], cg.get(\u0026#34;mcap\u0026#34;, 0), change) ok = await send_tg(text, silent=p.get(\u0026#34;tier\u0026#34;) in (\u0026#34;B\u0026#34;, \u0026#34;C\u0026#34;) and idx \u0026gt; 1) if ok: log_push(pid, ptype, text) save_snapshot(pid, cg[\u0026#34;price\u0026#34;], cg.get(\u0026#34;mcap\u0026#34;, 0), cg.get(\u0026#34;fdv\u0026#34;, 0)) # if change \u0026gt;= 100 and not has_pushed(pid, \u0026#34;anomaly_double\u0026#34;): t = fmt_anomaly(p, \u0026#34;double\u0026#34;, cg[\u0026#34;price\u0026#34;], change) if await send_tg(t): log_push(pid, \u0026#34;anomaly_double\u0026#34;, t) elif change \u0026lt;= -50 and not has_pushed(pid, \u0026#34;anomaly_halve\u0026#34;): t = fmt_anomaly(p, \u0026#34;halve\u0026#34;, cg[\u0026#34;price\u0026#34;], change) if await send_tg(t): log_push(pid, \u0026#34;anomaly_halve\u0026#34;, t) break # ============================================================ # # ============================================================ async def main(): init_db() logger.info(f\u0026#34;📂 : {DB_PATH}\u0026#34;) # TG ok = await send_tg(\u0026#34;🎉 \u0026lt;b\u0026gt;Alpha Monitor v2 \u0026lt;/b\u0026gt;\\n\\n📡 ...\\n🔔 Alpha\u0026#34;) if ok: logger.info(\u0026#34;✅ TG\u0026#34;) else: logger.warning(\u0026#34;⚠️ TG，\u0026#34;) tasks = [ asyncio.create_task(announcement_listener(), name=\u0026#34;announcements\u0026#34;), asyncio.create_task(aggregation_worker(), name=\u0026#34;aggregator\u0026#34;), asyncio.create_task(post_launch_monitor(), name=\u0026#34;monitor\u0026#34;), ] logger.info(\u0026#34;=\u0026#34; * 50) logger.info(\u0026#34;🚀 Alpha Monitor v2 \u0026#34;) logger.info(f\u0026#34; 📡 : {ANNOUNCEMENT_POLL_INTERVAL}s\u0026#34;) logger.info(f\u0026#34; 🧠 LLM: {\u0026#39;Sonnet\u0026#39; if ANTHROPIC_API_KEY else \u0026#39;()\u0026#39;}\u0026#34;) logger.info(f\u0026#34; 🔔 TG: {\u0026#39;✅\u0026#39; if TG_BOT_TOKEN else \u0026#39;❌\u0026#39;}\u0026#34;) logger.info(\u0026#34;=\u0026#34; * 50) try: await asyncio.gather(*tasks) except KeyboardInterrupt: for t in tasks: t.cancel() if __name__ == \u0026#34;__main__\u0026#34;: try: asyncio.run(main()) except KeyboardInterrupt: pass AI 자율 트레이딩 #선물 + Alpha 자율 트레이딩 v1 #게시일: 2026.04.29　태그: Python · Binance Futures · Autonomous · Telegram\nAI가 시장 스캔 → 분석 → 가상 매매 → 모니터 → 복기 — 완전 자율\n⚠️ 위험 경고: 이 코드는 가상/페이퍼 트레이딩에서만 테스트되었습니다. 실거래 경험이 전혀 없으며 실거래 진입의 근거로 사용해서는 안 됩니다. 실자금 검증을 거치지 않았습니다 — 사용에 따른 위험은 본인 책임입니다.\n30초마다 바이낸스 선물 시장 전체를 자율적으로 스캔하고 이상치를 감지하여 가상 거래를 진행하는 AI. 4가지 시그널 감지 전략(극단적 음수 펀딩비 → 롱 스퀴즈, 극단적 양수 펀딩 → 숏, 급등 후 숏, 급락 반등). 포지션을 열기 전에 다차원 환경 점검(BTC 추세 + Fear\u0026amp;Greed + OI 관심도 + 거래량) 수행 — 7점 만점에 3점 이상이어야 진행. 30초마다 자동 손절/익절 모니터링.\n현재 성적(정직 공개): 청산 4건, 승률 75%, +13.94U. 그러나 수익은 한 거래에 집중(IR 숏 +45%), 나머지는 본전 수준. 포지션 분산 부족 — 같은 방향 같은 논리로 쌓는 경향. 여전히 규칙 기반 점수 매기기이며, 진정한 독립 사고가 아닙니다.\n학습 경로: 스캔 → 진입 → 청산 → 복기 → 문제 발견 → 전략 개선 → 반복. 목표: 규칙 실행기에서 독립적으로 사고하는 트레이더로 진화.\n전체 소스 코드 ##!/usr/bin/env python3 \u0026#34;\u0026#34;\u0026#34; - PythonAI， \u0026#34;\u0026#34;\u0026#34; import json import os import sys import time import requests from datetime import datetime, timezone, timedelta SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__)) DATA_FILE = os.path.join(SCRIPT_DIR, \u0026#34;trades.json\u0026#34;) SCANNER_STATE = os.path.join(SCRIPT_DIR, \u0026#34;scanner_state.json\u0026#34;) SCANNER_LOG = os.path.join(SCRIPT_DIR, \u0026#34;scanner.log\u0026#34;) INITIAL_BALANCE = 100.0 TZ_UTC8 = timezone(timedelta(hours=8)) # === === MAX_OPEN_POSITIONS = 3 # POSITION_PCT = 30 # % LEVERAGE = 3 # COOLDOWN_HOURS = 4 # MIN_VOLUME_M = 10 # 24h(U) # === TG === def load_tg_config(): \u0026#34;\u0026#34;\u0026#34;Load TG config from environment variables or .env file\u0026#34;\u0026#34;\u0026#34; env = {} # Try .env in script directory, then current directory for env_path in [ os.path.join(SCRIPT_DIR, \u0026#34;.env\u0026#34;), os.path.join(os.getcwd(), \u0026#34;.env\u0026#34;), ]: if os.path.exists(env_path): with open(env_path) as f: for line in f: line = line.strip() if \u0026#39;=\u0026#39; in line and not line.startswith(\u0026#39;#\u0026#39;): k, v = line.split(\u0026#39;=\u0026#39;, 1) env[k] = v.strip().strip(\u0026#39;\u0026#34;\u0026#39;).strip(\u0026#34;\u0026#39;\u0026#34;) break # OS environment variables override file for key in [\u0026#39;TG_BOT_TOKEN\u0026#39;, \u0026#39;TELEGRAM_BOT_TOKEN\u0026#39;, \u0026#39;TG_CHAT_ID\u0026#39;]: val = os.environ.get(key) if val: env[key] = val return env def send_tg(text): try: env = load_tg_config() token = env.get(\u0026#39;TG_BOT_TOKEN\u0026#39;, env.get(\u0026#39;TELEGRAM_BOT_TOKEN\u0026#39;, \u0026#39;\u0026#39;)) if not token: return chat_id = env.get(\u0026#39;TG_CHAT_ID\u0026#39;, \u0026#39;\u0026#39;) if not chat_id: return url = f\u0026#34;https://api.telegram.org/bot{token}/sendMessage\u0026#34; requests.post(url, json={ \u0026#34;chat_id\u0026#34;: chat_id, \u0026#34;text\u0026#34;: text, \u0026#34;parse_mode\u0026#34;: \u0026#34;Markdown\u0026#34; }, timeout=10) except: pass # === === def load_trades(): if os.path.exists(DATA_FILE): with open(DATA_FILE, \u0026#34;r\u0026#34;, encoding=\u0026#34;utf-8\u0026#34;) as f: return json.load(f) return {\u0026#34;initial_balance\u0026#34;: INITIAL_BALANCE, \u0026#34;trades\u0026#34;: []} def save_trades(data): with open(DATA_FILE, \u0026#34;w\u0026#34;, encoding=\u0026#34;utf-8\u0026#34;) as f: json.dump(data, f, ensure_ascii=False, indent=2) def load_state(): if os.path.exists(SCANNER_STATE): with open(SCANNER_STATE, \u0026#34;r\u0026#34;) as f: return json.load(f) return {\u0026#34;last_opens\u0026#34;: {}, \u0026#34;signals_seen\u0026#34;: {}} def save_state(state): with open(SCANNER_STATE, \u0026#34;w\u0026#34;) as f: json.dump(state, f, ensure_ascii=False, indent=2) def get_balance(data): balance = data.get(\u0026#34;initial_balance\u0026#34;, INITIAL_BALANCE) for t in data[\u0026#34;trades\u0026#34;]: if t[\u0026#34;status\u0026#34;] == \u0026#34;closed\u0026#34; and t[\u0026#34;pnl_usd\u0026#34;] is not None: balance += t[\u0026#34;pnl_usd\u0026#34;] return balance def next_id(data): if not data[\u0026#34;trades\u0026#34;]: return \u0026#34;001\u0026#34; max_id = max(int(t[\u0026#34;id\u0026#34;]) for t in data[\u0026#34;trades\u0026#34;]) return f\u0026#34;{max_id + 1:03d}\u0026#34; def now_str(): return datetime.now(TZ_UTC8).strftime(\u0026#34;%Y-%m-%dT%H:%M:%S\u0026#34;) def log(msg): ts = datetime.now(TZ_UTC8).strftime(\u0026#34;%m-%d %H:%M:%S\u0026#34;) line = f\u0026#34;[{ts}] {msg}\u0026#34; print(line) with open(SCANNER_LOG, \u0026#34;a\u0026#34;) as f: f.write(line + \u0026#34;\\n\u0026#34;) # === API === def get_all_tickers(): url = \u0026#34;https://fapi.binance.com/fapi/v1/ticker/24hr\u0026#34; resp = requests.get(url, timeout=10) return resp.json() def get_funding_rates(): \u0026#34;\u0026#34;\u0026#34;\u0026#34;\u0026#34;\u0026#34; url = \u0026#34;https://fapi.binance.com/fapi/v1/premiumIndex\u0026#34; resp = requests.get(url, timeout=10) return {item[\u0026#39;symbol\u0026#39;]: float(item[\u0026#39;lastFundingRate\u0026#39;]) * 100 for item in resp.json()} def get_funding_history(symbol, limit=8): url = f\u0026#34;https://fapi.binance.com/fapi/v1/fundingRate?symbol={symbol}\u0026amp;limit={limit}\u0026#34; resp = requests.get(url, timeout=10) return [float(item[\u0026#39;fundingRate\u0026#39;]) * 100 for item in resp.json()] def get_open_interest(symbol): url = f\u0026#34;https://fapi.binance.com/fapi/v1/openInterest?symbol={symbol}\u0026#34; resp = requests.get(url, timeout=10) data = resp.json() return float(data[\u0026#39;openInterest\u0026#39;]) def get_klines(symbol, interval=\u0026#34;4h\u0026#34;, limit=6): url = f\u0026#34;https://fapi.binance.com/fapi/v1/klines?symbol={symbol}\u0026amp;interval={interval}\u0026amp;limit={limit}\u0026#34; resp = requests.get(url, timeout=10) return resp.json() # === === def detect_extreme_negative_funding(symbol, funding_rate, funding_rates_map): \u0026#34;\u0026#34;\u0026#34; 1: → () : \u0026lt;-0.08% \u0026#34;\u0026#34;\u0026#34; if funding_rate \u0026gt;= -0.08: return None try: history = get_funding_history(symbol, 8) neg_count = sum(1 for r in history if r \u0026lt; -0.03) if neg_count \u0026lt; 4: return None avg_rate = sum(history) / len(history) # ， strength = \u0026#34;S\u0026#34; if avg_rate \u0026lt; -0.15 else \u0026#34;A\u0026#34; if avg_rate \u0026lt; -0.10 else \u0026#34;B\u0026#34; return { \u0026#34;type\u0026#34;: \u0026#34;extreme_neg_funding\u0026#34;, \u0026#34;direction\u0026#34;: \u0026#34;long\u0026#34;, \u0026#34;strength\u0026#34;: strength, \u0026#34;reason\u0026#34;: f\u0026#34; avg:{avg_rate:.4f}% {neg_count}/8 \u0026#34;, \u0026#34;sl_pct\u0026#34;: 0.08, # 8% \u0026#34;tp_pct\u0026#34;: 0.12, # 12% } except: return None def detect_extreme_positive_funding(symbol, funding_rate, funding_rates_map): \u0026#34;\u0026#34;\u0026#34; 2: → () : \u0026gt;0.10% \u0026#34;\u0026#34;\u0026#34; if funding_rate \u0026lt;= 0.10: return None try: history = get_funding_history(symbol, 8) pos_count = sum(1 for r in history if r \u0026gt; 0.05) if pos_count \u0026lt; 4: return None avg_rate = sum(history) / len(history) strength = \u0026#34;S\u0026#34; if avg_rate \u0026gt; 0.20 else \u0026#34;A\u0026#34; if avg_rate \u0026gt; 0.12 else \u0026#34;B\u0026#34; return { \u0026#34;type\u0026#34;: \u0026#34;extreme_pos_funding\u0026#34;, \u0026#34;direction\u0026#34;: \u0026#34;short\u0026#34;, \u0026#34;strength\u0026#34;: strength, \u0026#34;reason\u0026#34;: f\u0026#34; avg:{avg_rate:.4f}% {pos_count}/8 \u0026#34;, \u0026#34;sl_pct\u0026#34;: 0.10, \u0026#34;tp_pct\u0026#34;: 0.15, } except: return None def detect_crash_bounce(ticker): \u0026#34;\u0026#34;\u0026#34; 3: () : 24h\u0026gt;25% 4h/ \u0026#34;\u0026#34;\u0026#34; change_pct = float(ticker[\u0026#39;priceChangePercent\u0026#39;]) if change_pct \u0026gt;= -25: return None symbol = ticker[\u0026#39;symbol\u0026#39;] try: klines = get_klines(symbol, \u0026#34;1h\u0026#34;, 6) # 2K recent_closes = [float(k[4]) for k in klines[-3:]] # : K \u0026gt;= if len(recent_closes) \u0026gt;= 2 and recent_closes[-1] \u0026gt;= recent_closes[-2]: return { \u0026#34;type\u0026#34;: \u0026#34;crash_bounce\u0026#34;, \u0026#34;direction\u0026#34;: \u0026#34;long\u0026#34;, \u0026#34;strength\u0026#34;: \u0026#34;B\u0026#34;, # B \u0026#34;reason\u0026#34;: f\u0026#34;24h{change_pct:.1f}% \u0026#34;, \u0026#34;sl_pct\u0026#34;: 0.10, \u0026#34;tp_pct\u0026#34;: 0.15, } except: pass return None def detect_pump_short(ticker): \u0026#34;\u0026#34;\u0026#34; 4: (ATH) : 24h\u0026gt;40% — ，\u0026gt;85% () \u0026#34;\u0026#34;\u0026#34; change_pct = float(ticker[\u0026#39;priceChangePercent\u0026#39;]) if change_pct \u0026lt;= 40: return None symbol = ticker[\u0026#39;symbol\u0026#39;] try: klines = get_klines(symbol, \u0026#34;1h\u0026#34;, 6) highs = [float(k[2]) for k in klines] closes = [float(k[4]) for k in klines] current = closes[-1] peak = max(highs) # 10% pullback = (peak - current) / peak * 100 if pullback \u0026lt; 10: return None strength = \u0026#34;A\u0026#34; if change_pct \u0026gt; 80 else \u0026#34;B\u0026#34; return { \u0026#34;type\u0026#34;: \u0026#34;pump_short\u0026#34;, \u0026#34;direction\u0026#34;: \u0026#34;short\u0026#34;, \u0026#34;strength\u0026#34;: strength, \u0026#34;reason\u0026#34;: f\u0026#34;24h{change_pct:.1f}%{pullback:.1f}% \u0026gt;85%\u0026#34;, \u0026#34;sl_pct\u0026#34;: 0.15, # ， \u0026#34;tp_pct\u0026#34;: 0.20, } except: pass return None # === === def check_environment(symbol, signal): \u0026#34;\u0026#34;\u0026#34; ：， (pass/fail, analysis_dict, adjusted_strength) \u0026#34;\u0026#34;\u0026#34; analysis = { \u0026#34;btc_env\u0026#34;: \u0026#34;\u0026#34;, \u0026#34;sentiment\u0026#34;: \u0026#34;\u0026#34;, \u0026#34;oi_check\u0026#34;: \u0026#34;\u0026#34;, \u0026#34;volume_check\u0026#34;: \u0026#34;\u0026#34;, \u0026#34;verdict\u0026#34;: \u0026#34;\u0026#34; } score = 0 # ，\u0026gt;=3 try: # 1. BTC — BTC，BTC btc_url = \u0026#34;https://fapi.binance.com/fapi/v1/ticker/24hr?symbol=BTCUSDT\u0026#34; btc = requests.get(btc_url, timeout=5).json() btc_chg = float(btc[\u0026#39;priceChangePercent\u0026#39;]) if signal[\u0026#34;direction\u0026#34;] == \u0026#34;long\u0026#34;: if btc_chg \u0026gt; -2: score += 1 analysis[\u0026#34;btc_env\u0026#34;] = f\u0026#34;BTC {btc_chg:+.1f}% +1\u0026#34; elif btc_chg \u0026lt; -5: score -= 1 analysis[\u0026#34;btc_env\u0026#34;] = f\u0026#34;BTC {btc_chg:+.1f}% -1\u0026#34; else: analysis[\u0026#34;btc_env\u0026#34;] = f\u0026#34;BTC {btc_chg:+.1f}% 0\u0026#34; else: # short if btc_chg \u0026lt; 2: score += 1 analysis[\u0026#34;btc_env\u0026#34;] = f\u0026#34;BTC {btc_chg:+.1f}% +1\u0026#34; elif btc_chg \u0026gt; 5: score -= 1 analysis[\u0026#34;btc_env\u0026#34;] = f\u0026#34;BTC {btc_chg:+.1f}% -1\u0026#34; else: analysis[\u0026#34;btc_env\u0026#34;] = f\u0026#34;BTC {btc_chg:+.1f}% 0\u0026#34; # 2. (Fear \u0026amp; Greed) try: fng = requests.get(\u0026#34;https://api.alternative.me/fng/\u0026#34;, timeout=5).json() fng_val = int(fng[\u0026#39;data\u0026#39;][0][\u0026#39;value\u0026#39;]) if signal[\u0026#34;direction\u0026#34;] == \u0026#34;long\u0026#34;: if fng_val \u0026lt;= 25: score += 1 analysis[\u0026#34;sentiment\u0026#34;] = f\u0026#34;FGI={fng_val} +1\u0026#34; elif fng_val \u0026gt;= 75: score -= 1 analysis[\u0026#34;sentiment\u0026#34;] = f\u0026#34;FGI={fng_val} -1\u0026#34; else: analysis[\u0026#34;sentiment\u0026#34;] = f\u0026#34;FGI={fng_val} 0\u0026#34; else: if fng_val \u0026gt;= 75: score += 1 analysis[\u0026#34;sentiment\u0026#34;] = f\u0026#34;FGI={fng_val} +1\u0026#34; elif fng_val \u0026lt;= 25: score -= 1 analysis[\u0026#34;sentiment\u0026#34;] = f\u0026#34;FGI={fng_val} -1\u0026#34; else: analysis[\u0026#34;sentiment\u0026#34;] = f\u0026#34;FGI={fng_val} 0\u0026#34; except: analysis[\u0026#34;sentiment\u0026#34;] = \u0026#34;FGI 0\u0026#34; # 3. OI — OI try: oi = get_open_interest(symbol) ticker = requests.get(f\u0026#34;https://fapi.binance.com/fapi/v1/ticker/24hr?symbol={symbol}\u0026#34;, timeout=5).json() price = float(ticker[\u0026#39;lastPrice\u0026#39;]) oi_usd = oi * price if oi_usd \u0026gt; 5_000_000: # OI \u0026gt; 5M score += 1 analysis[\u0026#34;oi_check\u0026#34;] = f\u0026#34;OI={oi_usd/1e6:.1f}M +1\u0026#34; else: analysis[\u0026#34;oi_check\u0026#34;] = f\u0026#34;OI={oi_usd/1e6:.1f}M 0\u0026#34; except: analysis[\u0026#34;oi_check\u0026#34;] = \u0026#34;OI 0\u0026#34; # 4. — try: vol = float(ticker.get(\u0026#39;quoteVolume\u0026#39;, 0)) if vol \u0026gt; 50_000_000: score += 1 analysis[\u0026#34;volume_check\u0026#34;] = f\u0026#34;24h={vol/1e6:.0f}M +1\u0026#34; elif vol \u0026gt; 20_000_000: analysis[\u0026#34;volume_check\u0026#34;] = f\u0026#34;24h={vol/1e6:.0f}M 0\u0026#34; else: score -= 1 analysis[\u0026#34;volume_check\u0026#34;] = f\u0026#34;24h={vol/1e6:.0f}M -1\u0026#34; except: analysis[\u0026#34;volume_check\u0026#34;] = \u0026#34; 0\u0026#34; # 5. if signal[\u0026#34;strength\u0026#34;] == \u0026#34;S\u0026#34;: score += 2 elif signal[\u0026#34;strength\u0026#34;] == \u0026#34;A\u0026#34;: score += 1 # : \u0026gt;=3 analysis[\u0026#34;verdict\u0026#34;] = f\u0026#34;:{score}/7\u0026#34; if score \u0026gt;= 3: return True, analysis, signal[\u0026#34;strength\u0026#34;] else: return False, analysis, signal[\u0026#34;strength\u0026#34;] except Exception as e: analysis[\u0026#34;verdict\u0026#34;] = f\u0026#34;:{e} \u0026#34; return False, analysis, signal[\u0026#34;strength\u0026#34;] # === === def execute_open(data, state, symbol, price, signal): \u0026#34;\u0026#34;\u0026#34; — \u0026#34;\u0026#34;\u0026#34; # passed, env_analysis, strength = check_environment(symbol, signal) env_summary = \u0026#34; | \u0026#34;.join(v for v in env_analysis.values() if v) if not passed: log(f\u0026#34; {symbol}: {env_summary}\u0026#34;) return log(f\u0026#34; {symbol}: {env_summary}\u0026#34;) balance = get_balance(data) position_usd = balance * POSITION_PCT / 100 if signal[\u0026#34;direction\u0026#34;] == \u0026#34;long\u0026#34;: sl = round(price * (1 - signal[\u0026#34;sl_pct\u0026#34;]), 6) tp = round(price * (1 + signal[\u0026#34;tp_pct\u0026#34;]), 6) else: sl = round(price * (1 + signal[\u0026#34;sl_pct\u0026#34;]), 6) tp = round(price * (1 - signal[\u0026#34;tp_pct\u0026#34;]), 6) trade = { \u0026#34;id\u0026#34;: next_id(data), \u0026#34;symbol\u0026#34;: symbol, \u0026#34;direction\u0026#34;: signal[\u0026#34;direction\u0026#34;], \u0026#34;leverage\u0026#34;: LEVERAGE, \u0026#34;position_pct\u0026#34;: POSITION_PCT, \u0026#34;position_usd\u0026#34;: round(position_usd, 4), \u0026#34;notional_usd\u0026#34;: round(position_usd * LEVERAGE, 4), \u0026#34;entry_price\u0026#34;: price, \u0026#34;stop_loss\u0026#34;: sl, \u0026#34;take_profit\u0026#34;: tp, \u0026#34;entry_time\u0026#34;: now_str(), \u0026#34;exit_price\u0026#34;: None, \u0026#34;exit_time\u0026#34;: None, \u0026#34;exit_reason\u0026#34;: None, \u0026#34;pnl_pct\u0026#34;: None, \u0026#34;pnl_usd\u0026#34;: None, \u0026#34;status\u0026#34;: \u0026#34;open\u0026#34;, \u0026#34;pre_analysis\u0026#34;: { \u0026#34;btc_env\u0026#34;: env_analysis.get(\u0026#34;btc_env\u0026#34;, \u0026#34;\u0026#34;), \u0026#34;sentiment\u0026#34;: env_analysis.get(\u0026#34;sentiment\u0026#34;, \u0026#34;\u0026#34;), \u0026#34;oi\u0026#34;: env_analysis.get(\u0026#34;oi_check\u0026#34;, \u0026#34;\u0026#34;), \u0026#34;volume\u0026#34;: env_analysis.get(\u0026#34;volume_check\u0026#34;, \u0026#34;\u0026#34;), \u0026#34;key_reason\u0026#34;: f\u0026#34;[{signal[\u0026#39;strength\u0026#39;]}] {signal[\u0026#39;reason\u0026#39;]}\u0026#34;, \u0026#34;risk\u0026#34;: f\u0026#34;:{env_analysis.get(\u0026#39;verdict\u0026#39;,\u0026#39;\u0026#39;)} :{signal[\u0026#39;type\u0026#39;]}\u0026#34; }, \u0026#34;post_review\u0026#34;: None } data[\u0026#34;trades\u0026#34;].append(trade) save_trades(data) # state[\u0026#34;last_opens\u0026#34;][symbol] = now_str() save_state(state) direction_cn = \u0026#34;\u0026#34; if signal[\u0026#34;direction\u0026#34;] == \u0026#34;long\u0026#34; else \u0026#34;\u0026#34; msg = f\u0026#34;\u0026#34;\u0026#34;``` [] #{trade[\u0026#39;id\u0026#39;]} : {symbol} : {direction_cn} {LEVERAGE}x : {price} : {sl} : {tp} : {position_usd:.2f}U : [{signal[\u0026#39;strength\u0026#39;]}] {signal[\u0026#39;reason\u0026#39;]} : {trade[\u0026#39;entry_time\u0026#39;]} ```\u0026#34;\u0026#34;\u0026#34; log(f\u0026#34; #{trade[\u0026#39;id\u0026#39;]} {symbol} {direction_cn} @ {price} | {signal[\u0026#39;reason\u0026#39;]}\u0026#34;) send_tg(msg) print(msg) # === === def swap_weakest(data, state, open_positions, new_signal, tickers): \u0026#34;\u0026#34;\u0026#34;S，，\u0026#34;\u0026#34;\u0026#34; ticker_map = {t[\u0026#39;symbol\u0026#39;]: float(t[\u0026#39;lastPrice\u0026#39;]) for t in tickers} # % worst_trade = None worst_pnl = float(\u0026#39;inf\u0026#39;) for t in open_positions: price = ticker_map.get(t[\u0026#34;symbol\u0026#34;]) if price is None: continue if t[\u0026#34;direction\u0026#34;] == \u0026#34;long\u0026#34;: pnl_pct = (price - t[\u0026#34;entry_price\u0026#34;]) / t[\u0026#34;entry_price\u0026#34;] * 100 else: pnl_pct = (t[\u0026#34;entry_price\u0026#34;] - price) / t[\u0026#34;entry_price\u0026#34;] * 100 if pnl_pct \u0026lt; worst_pnl: worst_pnl = pnl_pct worst_trade = t worst_price = price if worst_trade is None: return # ， if worst_pnl \u0026gt; 0: log(f\u0026#34;， | : {new_signal[\u0026#39;symbol\u0026#39;]}\u0026#34;) return # if worst_trade[\u0026#34;direction\u0026#34;] == \u0026#34;long\u0026#34;: pnl_pct_lev = (worst_price - worst_trade[\u0026#34;entry_price\u0026#34;]) / worst_trade[\u0026#34;entry_price\u0026#34;] * 100 * worst_trade[\u0026#34;leverage\u0026#34;] else: pnl_pct_lev = (worst_trade[\u0026#34;entry_price\u0026#34;] - worst_price) / worst_trade[\u0026#34;entry_price\u0026#34;] * 100 * worst_trade[\u0026#34;leverage\u0026#34;] pos_usd = worst_trade.get(\u0026#34;position_usd\u0026#34;, worst_trade.get(\u0026#34;position_pct\u0026#34;, 30)) pnl_usd = round(pnl_pct_lev / 100 * pos_usd, 4) worst_trade[\u0026#34;exit_price\u0026#34;] = worst_price worst_trade[\u0026#34;exit_time\u0026#34;] = now_str() worst_trade[\u0026#34;exit_reason\u0026#34;] = f\u0026#34;→{new_signal[\u0026#39;symbol\u0026#39;]}\u0026#34; worst_trade[\u0026#34;pnl_pct\u0026#34;] = round(pnl_pct_lev, 2) worst_trade[\u0026#34;pnl_usd\u0026#34;] = pnl_usd worst_trade[\u0026#34;status\u0026#34;] = \u0026#34;closed\u0026#34; save_trades(data) direction_cn = \u0026#34;\u0026#34; if worst_trade[\u0026#34;direction\u0026#34;] == \u0026#34;long\u0026#34; else \u0026#34;\u0026#34; msg = f\u0026#34;\u0026#34;\u0026#34;``` [] #{worst_trade[\u0026#39;id\u0026#39;]} : {worst_trade[\u0026#39;symbol\u0026#39;]} {direction_cn} : {worst_trade[\u0026#39;entry_price\u0026#39;]} : {worst_price} : {pnl_pct_lev:+.2f}% ({pnl_usd:+.2f}U) : S{new_signal[\u0026#39;symbol\u0026#39;]} ```\u0026#34;\u0026#34;\u0026#34; log(f\u0026#34; #{worst_trade[\u0026#39;id\u0026#39;]} {worst_trade[\u0026#39;symbol\u0026#39;]} {pnl_usd:+.2f}U → {new_signal[\u0026#39;symbol\u0026#39;]}\u0026#34;) send_tg(msg) # execute_open(data, state, new_signal[\u0026#34;symbol\u0026#34;], new_signal[\u0026#34;price\u0026#34;], new_signal) # === === def scan(): data = load_trades() state = load_state() now = datetime.now(TZ_UTC8) # open_positions = [t for t in data[\u0026#34;trades\u0026#34;] if t[\u0026#34;status\u0026#34;] == \u0026#34;open\u0026#34;] open_symbols = set(t[\u0026#34;symbol\u0026#34;] for t in open_positions) if len(open_positions) \u0026gt;= MAX_OPEN_POSITIONS: return # try: tickers = get_all_tickers() funding_rates = get_funding_rates() except Exception as e: log(f\u0026#34;API: {e}\u0026#34;) return # USDT + exclude = {\u0026#34;BTCUSDT\u0026#34;, \u0026#34;ETHUSDT\u0026#34;, \u0026#34;USDCUSDT\u0026#34;, \u0026#34;FDUSDUSDT\u0026#34;, \u0026#34;BTCDOMUSDT\u0026#34;, \u0026#34;BTCSTUSDT\u0026#34;} candidates = [t for t in tickers if t[\u0026#39;symbol\u0026#39;].endswith(\u0026#39;USDT\u0026#39;) and t[\u0026#39;symbol\u0026#39;] not in exclude and float(t[\u0026#39;quoteVolume\u0026#39;]) \u0026gt; MIN_VOLUME_M * 1e6] signals = [] for ticker in candidates: symbol = ticker[\u0026#39;symbol\u0026#39;] # if symbol in open_symbols: continue # last_open = state.get(\u0026#34;last_opens\u0026#34;, {}).get(symbol) if last_open: try: last_dt = datetime.fromisoformat(last_open) if last_dt.tzinfo is None: last_dt = last_dt.replace(tzinfo=TZ_UTC8) if (now - last_dt).total_seconds() \u0026lt; COOLDOWN_HOURS * 3600: continue except: pass fr = funding_rates.get(symbol, 0) # for detect_fn in [ lambda s, f, m: detect_extreme_negative_funding(s, f, m), lambda s, f, m: detect_extreme_positive_funding(s, f, m), lambda s, f, m: detect_crash_bounce(ticker), lambda s, f, m: detect_pump_short(ticker), ]: try: signal = detect_fn(symbol, fr, funding_rates) if signal: signal[\u0026#34;symbol\u0026#34;] = symbol signal[\u0026#34;price\u0026#34;] = float(ticker[\u0026#39;lastPrice\u0026#39;]) signal[\u0026#34;volume_m\u0026#34;] = float(ticker[\u0026#39;quoteVolume\u0026#39;]) / 1e6 signals.append(signal) except: continue if not signals: return # S\u0026gt;A\u0026gt;B strength_order = {\u0026#34;S\u0026#34;: 0, \u0026#34;A\u0026#34;: 1, \u0026#34;B\u0026#34;: 2} signals.sort(key=lambda x: strength_order.get(x[\u0026#34;strength\u0026#34;], 3)) # (1) best = signals[0] # B，SA if best[\u0026#34;strength\u0026#34;] == \u0026#34;B\u0026#34;: log(f\u0026#34;B: {best[\u0026#39;symbol\u0026#39;]} {best[\u0026#39;reason\u0026#39;]}\u0026#34;) return slots = MAX_OPEN_POSITIONS - len(open_positions) if slots \u0026gt; 0: execute_open(data, state, best[\u0026#34;symbol\u0026#34;], best[\u0026#34;price\u0026#34;], best) elif best[\u0026#34;strength\u0026#34;] == \u0026#34;S\u0026#34;: # S → swap_weakest(data, state, open_positions, best, tickers) if __name__ == \u0026#34;__main__\u0026#34;: scan() 유틸리티 도구 #VoiceKey — 화자 인증 #게시일: 2026.04.27　태그: Python · Security · Telegram · Speaker Verification\n성문 인증으로 AI 에이전트를 보호하세요\nTelegram 봇 보안을 위한 화자 검증. 화자 임베딩 추출에 resemblyzer(GE2E 모델)를 사용하고 코사인 유사도로 일치 여부를 판단합니다. 비밀번호 없이 음성으로 인증 — 알려진 화자만 로그인 가능. 가벼운 의존성, 순수 Python.\n전체 소스 코드 ##!/usr/bin/env python3 \u0026#34;\u0026#34;\u0026#34; VoiceKey — (Voiceprint Authentication) Speaker verification for Telegram bot security. Uses resemblyzer (GE2E model) for speaker embedding extraction and cosine similarity for verification. Zero AI cost — runs entirely on local CPU. Usage: # Register voiceprint from audio files python voicekey.py register --audio voice1.ogg voice2.ogg --owner \u0026#34;YourName\u0026#34; # Verify a voice against stored voiceprint python voicekey.py verify --audio test.ogg # As a Python module from voicekey import VoiceKey vk = VoiceKey() vk.register([\u0026#34;voice1.ogg\u0026#34;, \u0026#34;voice2.ogg\u0026#34;], owner=\u0026#34;YourName\u0026#34;) is_owner, score = vk.verify(\u0026#34;test.ogg\u0026#34;) \u0026#34;\u0026#34;\u0026#34; import os import json import tempfile import argparse import numpy as np from pathlib import Path from datetime import datetime # Lazy imports to speed up module load when not needed _encoder = None def _get_encoder(): \u0026#34;\u0026#34;\u0026#34;Lazy-load the voice encoder model (first call takes ~1s).\u0026#34;\u0026#34;\u0026#34; global _encoder if _encoder is None: from resemblyzer import VoiceEncoder _encoder = VoiceEncoder() return _encoder def _audio_to_wav(audio_path: str) -\u0026gt; str: \u0026#34;\u0026#34;\u0026#34;Convert any audio format to 16kHz mono WAV for processing.\u0026#34;\u0026#34;\u0026#34; from pydub import AudioSegment ext = Path(audio_path).suffix.lower() if ext in (\u0026#39;.ogg\u0026#39;, \u0026#39;.oga\u0026#39;): audio = AudioSegment.from_ogg(audio_path) elif ext == \u0026#39;.mp3\u0026#39;: audio = AudioSegment.from_mp3(audio_path) elif ext == \u0026#39;.wav\u0026#39;: return audio_path # already wav elif ext in (\u0026#39;.m4a\u0026#39;, \u0026#39;.aac\u0026#39;): audio = AudioSegment.from_file(audio_path, format=ext.lstrip(\u0026#39;.\u0026#39;)) else: audio = AudioSegment.from_file(audio_path) # Convert to 16kHz mono audio = audio.set_frame_rate(16000).set_channels(1) tmp = tempfile.NamedTemporaryFile(suffix=\u0026#39;.wav\u0026#39;, delete=False) audio.export(tmp.name, format=\u0026#39;wav\u0026#39;) return tmp.name def _extract_embedding(audio_path: str) -\u0026gt; np.ndarray: \u0026#34;\u0026#34;\u0026#34;Extract voice embedding from an audio file.\u0026#34;\u0026#34;\u0026#34; from resemblyzer import preprocess_wav encoder = _get_encoder() wav_path = _audio_to_wav(audio_path) wav = preprocess_wav(wav_path) # Cleanup temp file if wav_path != audio_path: os.unlink(wav_path) if len(wav) \u0026lt; 1600: # Less than 0.1s raise ValueError(f\u0026#34;Audio too short: {len(wav)/16000:.1f}s (need \u0026gt;0.1s)\u0026#34;) return encoder.embed_utterance(wav) class VoiceKey: \u0026#34;\u0026#34;\u0026#34; Speaker verification using voice embeddings. Attributes: data_dir: Directory to store voiceprint data threshold: Cosine similarity threshold for verification (default: 0.75) voiceprint: The registered owner\u0026#39;s voice embedding (256-dim vector) \u0026#34;\u0026#34;\u0026#34; def __init__(self, data_dir: str = None, threshold: float = 0.75): if data_dir is None: data_dir = os.path.expanduser(\u0026#34;~/.hermes/voiceprint\u0026#34;) self.data_dir = Path(data_dir) self.data_dir.mkdir(parents=True, exist_ok=True) self.threshold = threshold self.voiceprint = None self.metadata = {} self._load() def _load(self): \u0026#34;\u0026#34;\u0026#34;Load existing voiceprint if available.\u0026#34;\u0026#34;\u0026#34; vp_path = self.data_dir / \u0026#34;voiceprint.npy\u0026#34; meta_path = self.data_dir / \u0026#34;voiceprint_meta.json\u0026#34; if vp_path.exists(): self.voiceprint = np.load(str(vp_path)) if meta_path.exists(): with open(meta_path) as f: self.metadata = json.load(f) self.threshold = self.metadata.get(\u0026#34;threshold\u0026#34;, self.threshold) @property def is_registered(self) -\u0026gt; bool: \u0026#34;\u0026#34;\u0026#34;Check if a voiceprint is registered.\u0026#34;\u0026#34;\u0026#34; return self.voiceprint is not None def register(self, audio_paths: list, owner: str = \u0026#34;owner\u0026#34;) -\u0026gt; dict: \u0026#34;\u0026#34;\u0026#34; Register a voiceprint from multiple audio samples. Args: audio_paths: List of audio file paths (ogg, mp3, wav, etc.) owner: Name of the voiceprint owner Returns: dict with registration results \u0026#34;\u0026#34;\u0026#34; embeddings = [] results = [] for path in audio_paths: try: embed = _extract_embedding(path) embeddings.append(embed) results.append({\u0026#34;file\u0026#34;: os.path.basename(path), \u0026#34;status\u0026#34;: \u0026#34;ok\u0026#34;}) except Exception as e: results.append({\u0026#34;file\u0026#34;: os.path.basename(path), \u0026#34;status\u0026#34;: \u0026#34;error\u0026#34;, \u0026#34;error\u0026#34;: str(e)}) if not embeddings: raise ValueError(\u0026#34;No valid audio samples provided\u0026#34;) # Average embeddings and normalize voiceprint = np.mean(embeddings, axis=0) voiceprint = voiceprint / np.linalg.norm(voiceprint) # Save np.save(str(self.data_dir / \u0026#34;voiceprint.npy\u0026#34;), voiceprint) self.metadata = { \u0026#34;owner\u0026#34;: owner, \u0026#34;samples_used\u0026#34;: len(embeddings), \u0026#34;embedding_dim\u0026#34;: int(voiceprint.shape[0]), \u0026#34;threshold\u0026#34;: self.threshold, \u0026#34;created\u0026#34;: datetime.now().isoformat(), } with open(self.data_dir / \u0026#34;voiceprint_meta.json\u0026#34;, \u0026#34;w\u0026#34;) as f: json.dump(self.metadata, f, indent=2) self.voiceprint = voiceprint # Self-test similarities = [] for embed in embeddings: sim = float(np.dot(voiceprint, embed / np.linalg.norm(embed))) similarities.append(sim) return { \u0026#34;owner\u0026#34;: owner, \u0026#34;samples\u0026#34;: len(embeddings), \u0026#34;self_test_scores\u0026#34;: similarities, \u0026#34;min_score\u0026#34;: min(similarities), \u0026#34;details\u0026#34;: results, } def verify(self, audio_path: str) -\u0026gt; tuple: \u0026#34;\u0026#34;\u0026#34; Verify if an audio sample matches the registered voiceprint. Args: audio_path: Path to audio file to verify Returns: tuple: (is_verified: bool, similarity_score: float) \u0026#34;\u0026#34;\u0026#34; if not self.is_registered: raise RuntimeError(\u0026#34;No voiceprint registered. Call register() first.\u0026#34;) embed = _extract_embedding(audio_path) embed = embed / np.linalg.norm(embed) similarity = float(np.dot(self.voiceprint, embed)) is_verified = similarity \u0026gt;= self.threshold return is_verified, similarity def get_info(self) -\u0026gt; dict: \u0026#34;\u0026#34;\u0026#34;Get voiceprint registration info.\u0026#34;\u0026#34;\u0026#34; if not self.is_registered: return {\u0026#34;registered\u0026#34;: False} return { \u0026#34;registered\u0026#34;: True, **self.metadata, } def main(): parser = argparse.ArgumentParser( description=\u0026#34;VoiceKey — Speaker verification for security\u0026#34; ) sub = parser.add_subparsers(dest=\u0026#34;command\u0026#34;) # Register reg = sub.add_parser(\u0026#34;register\u0026#34;, help=\u0026#34;Register voiceprint from audio files\u0026#34;) reg.add_argument(\u0026#34;--audio\u0026#34;, nargs=\u0026#34;+\u0026#34;, required=True, help=\u0026#34;Audio files (ogg/mp3/wav)\u0026#34;) reg.add_argument(\u0026#34;--owner\u0026#34;, default=\u0026#34;owner\u0026#34;, help=\u0026#34;Owner name\u0026#34;) reg.add_argument(\u0026#34;--data-dir\u0026#34;, default=None, help=\u0026#34;Data directory\u0026#34;) reg.add_argument(\u0026#34;--threshold\u0026#34;, type=float, default=0.75, help=\u0026#34;Verification threshold\u0026#34;) # Verify ver = sub.add_parser(\u0026#34;verify\u0026#34;, help=\u0026#34;Verify audio against voiceprint\u0026#34;) ver.add_argument(\u0026#34;--audio\u0026#34;, required=True, help=\u0026#34;Audio file to verify\u0026#34;) ver.add_argument(\u0026#34;--data-dir\u0026#34;, default=None, help=\u0026#34;Data directory\u0026#34;) # Info sub.add_parser(\u0026#34;info\u0026#34;, help=\u0026#34;Show voiceprint info\u0026#34;) args = parser.parse_args() if args.command == \u0026#34;register\u0026#34;: vk = VoiceKey(data_dir=args.data_dir, threshold=args.threshold) result = vk.register(args.audio, owner=args.owner) print(f\u0026#34;Registered voiceprint for: {result[\u0026#39;owner\u0026#39;]}\u0026#34;) print(f\u0026#34;Samples used: {result[\u0026#39;samples\u0026#39;]}\u0026#34;) print(f\u0026#34;Self-test scores: {[f\u0026#39;{s:.4f}\u0026#39; for s in result[\u0026#39;self_test_scores\u0026#39;]]}\u0026#34;) print(f\u0026#34;Min score: {result[\u0026#39;min_score\u0026#39;]:.4f} (threshold: {args.threshold})\u0026#34;) elif args.command == \u0026#34;verify\u0026#34;: vk = VoiceKey(data_dir=getattr(args, \u0026#39;data_dir\u0026#39;, None)) is_ok, score = vk.verify(args.audio) status = \u0026#34;PASS\u0026#34; if is_ok else \u0026#34;FAIL\u0026#34; print(f\u0026#34;[{status}] Similarity: {score:.4f} (threshold: {vk.threshold})\u0026#34;) elif args.command == \u0026#34;info\u0026#34;: vk = VoiceKey() info = vk.get_info() for k, v in info.items(): print(f\u0026#34; {k}: {v}\u0026#34;) else: parser.print_help() if __name__ == \u0026#34;__main__\u0026#34;: main() 마무리 #위 7개 스니펫은 모두 connectfarm1.com에서 가져왔으며 수집 시점은 2026-05-04입니다. 세 가지 철학을 공유합니다: (1) 거의 0에 가까운 AI 비용 — 대부분 LLM 대신 규칙 엔진과 무료 공개 API를 사용; (2) 오직 Python, 저렴한 VPS에서 crontab 또는 단순한 while True로 충분히 실행 가능; (3) Telegram을 단일 출력 채널로 — 대시보드도 프론트엔드도 만들지 않고, 실제로 보는 곳으로 바로 푸시. 여러 레이더를 조합해 신호를 교차 검증하고, \u0026ldquo;자율 트레이딩\u0026quot;은 인쇄기가 아니라 연구용 샌드박스로 다루세요.\n","date":"May 15, 2026","permalink":"https://dibi8.com/kr/resources/dev-utils/code-vault-7-crypto-trading-tools/","section":"AI 源码资源","summary":"","title":"Code Vault — 7개의 오픈소스 암호화폐 레이더 및 트레이딩 도구"},{"content":"{\u0026lt;/* resource-info */\u0026gt;}\n소개 #2026년 5월 GitHub Trending은 명확한 이야기를 전달합니다: 개발자들이 추상적인 실험이 아니라 실용적이고 높은 레버리지 효과를 갖는 AI 도구를 대거 전환하고 있다는 것입니다. 세 가지 프로젝트가 이번 달 차트를 지배했는데, 각각 시간 절약, 수익 증대, 규정 준수 비용 감축으로 직접 연결되는 고유한 문제를 해결합니다.\n이 글에서는 실제로 주목해야 할 핫한 트렌드 프로젝트들을 깊이 있게 분석합니다 — 왜 중요한지, 어떻게 설치하는지, 그리고 실제 상용 가치는 무엇인지. 빠르게 코드 작성 속도를 높이고 싶은 솔로 개발자든, Claude 기반 분석을 탐색하는 파인테크 전문가든, 자동화 도구를 찾는 개인创业者든, 모두에게 유용한 정보가 있습니다.\n사진 출처: Daniil Komov / Pexels\n프로젝트 1: Hmbown / DeepSeek-TUI — 당신의 터미널이 이제 슈퍼 코딩 에이전트가 된다 #Stars: 21,085 | +오늘新增 5,799 스타 | 저장소: Hmbown/DeepSeek-TUI\n만약 하나의 프로젝트가 현재 AI 코딩 열풍을 정의한다면, DeepSeek-TUI가 바로 그것입니다. 하루 만에 거의 5,800개의 새로운 stars를 기록했으며 — 이는 다른 모든 트렌드 리포지토리를 압도하는 수치입니다. 단순히 브라우저에서 ChatGPT를 감싸는 포장지가 아닙니다. 기존 개발 워크플로우에 완전히 통합되는 진짜 터미널 기반 코딩 에이전트입니다.\n어떤 점이 다른가 #DeepSeek-TUI는 deepseek 명령어를 통해 로컬 터미널에서 실행됩니다. 웹 탭을 열고 텍스트 상자에 입력할 필요가 없습니다. 코드베이스 내에서 직접 상호작용합니다. 에이전트는 추론 블록을 터미널로 스트리밍하며, 디스크의 파일을 읽고 쓰고, 파일 시스템 변경 전에는 승인 게이트를 사용합니다. 즉, AI 보조 편집의 속도 이점을 얻으면서도 통제권을 유지할 수 있습니다.\nCursor나 Copilot과 같은 전체 GUI 에디터를 필요로 하는 도구와 달리, DeepSeek-TUI는 터미널 퍼스트 개발자들을 위해 설계되었습니다. tmux, neovim, zsh에서 하루를 보낸다면 이것이 네이티브처럼 느껴질 것입니다. 브라우저 탭과 IDE 창 간 컨텍스트 전환이 필요없습니다.\nAuto Mode: 스마트 모델 라우팅으로 비용 절감 #가장 돋보이는 기능은 자동 모드(deepseek --model auto)입니다. 각 요청을 보내기 전에 DeepSeek-TUI는 deepseek-v4-flash(추론 비활성)로 작은 라우팅 호출을 수행합니다. 라우터는 최신 요청과 최근 대화 컨텍스트를 평가하여 최적 조합을 선택합니다:\n모델: 빠른 작업에는 deepseek-v4-flash, 복잡한 아키텍처 작업에는 deepseek-v4-pro 추론 레벨: 간단한 리팩토링에는 off, 보안 검토나 다단계 디버깅에는 high 또는 max 단순 질문은 저가로 유지되고, 정말 복잡한 작업만 고비용 추론을 트리거합니다. 업스트림 API는 \u0026quot;model\u0026quot;: \u0026quot;auto\u0026quot;를 받지 않습니다 — TUI가 내부적으로 해석하며 실제 사용된 모델 기준으로 요금이 부과됩니다. 비용 추적은 투명하게 이루어집니다.\n크로스 플랫폼 설치 지원 ## npm — 가장 쉬운 방법 npm install -g deepseek-tui # Cargo — Node.js 불필요 cargo install deepseek-tui-cli --locked # `deepseek` 제공 cargo install deepseek-tui --locked # `deepseek-tui` 제공 # Homebrew (macOS) brew tap Hmbown/deepseek-tui brew install deepseek-tui # Docker docker run --rm -it \\ -e DEEPSEEK_API_KEY \\ -v \u0026#34;$PWD:/workspace\u0026#34; \\ ghcr.io/hmbown/deepseek-tui:latest 인증은 deepseek auth set --provider deepseek로 관리합니다. deepseek auth status로 키를 노출하지 않고 설정 상태 확인 가능하며, deepseek auth clear로 기존 키 회전 또는 삭제가 가능합니다.\n중국 본토 개발자를 위한 Cargo 레지스트리 미러(칭화대 Tuna 등)와 구성 가능한 릴리즈 URL 기본값 지원을 제공합니다. Windows 사용자는 Scoop 패키지 매니저 통합 혜택을 받을 수 있습니다. ARM64 Linux(라즈베리파이, Asahi, Graviton, 화웨이 하모니OS PC)는 v0.8.8부터 네이티브 지원됩니다.\n서브에이전트 위임 #작업이 충분히 클 때 DeepSeek-TUI는 서브에이전트를 생성할 수 있습니다. 각 서브에이전트는 명시적으로 다른 모델이나 추론 레벨을 지정하지 않는 한 자동 모드 구성을 상속받습니다. 이를 통해 계층적 코딩 워크플로우가 가능합니다 — 메인 세션에서 모든 것을 오케스트레이션하면서 모듈을 전문화된 서브에이전트에 위임합니다.\n실제 적용 사례 # 시나리오 효과 빠른 프로토타입 제작 영어로 기능 설명하면 편집기에서 즉시 작동 코드 레거시 코드 리팩토링 수백 개 파일에 걸친 일관되지 않은 패턴 일괄 수정 보안 감사 저장소 내 취약점 스캔 요청 → 상세 추론 결과 제공 디버깅 세션 오류 출력 붙여넣기 → 근본 원인 추적 및 증거 포함 릴리스 관리 변경 로그 생성, 버전 번호 업데이트, git 태그 준비 경쟁사 비교 # 도구 편집기 가격 추론 스트림 승인 게이트 DeepSeek-TUI 터미널 토큰당付费 ✅ 있음 ✅ 구성 가능 Cursor GUI 앱 $20/월 ✅ 있음 ❌ 자동화 GitHub Copilot IDE 확장 $19/월 제한적 ❌ 없음 Claude Code 터미널 토큰당付费 ✅ 있음 ✅ 있음 DeepSeek-TUI는 Claude Code보다 가격 경쟁력이 있으면서 핵심 기능을 동일하게 제공합니다. Linux 서버나 무두headless CI 파이프라인에서 실행하는 팀에게는 터미널 환경에서 편안하게 실행할 수 있는 유일한 옵션입니다.\n프로젝트 2: anthropics / financial-services — 월스트리트용 엔터프라이즈급 AI 에이전트 #Stars: 13,496 | +오늘新增 1,343 스타 | 저장소: anthropics/claude-for-financial-services\n소비자용 AI 코딩 도구가 헤드라인을 장식하는 동안, Anthropic은 훨씬 더 상업적으로 의미 있는 것을 출시했습니다: 금융 서비스를 위한 완전한 프로덕션 레디 AI 에이전트 스위트입니다. 장난감 프로토타입이 아닙니다 — 투자 은행, 주식 연구, 사모투자, 자산 관리 워크플로우를 아우릅니다.\n포함된 내용 #이 저장소는 특정 금융 워크플로우를 커버하는 11개의 네임드 에이전트를 제공합니다:\n기능 에이전트 출력물 coverage 및 자문 Pitch Agent comps, precedents, LBO → 브랜드 피칭 PPT 연구 및 모델링 Market Researcher 산업 개요 + 경쟁 구도 +peer comps 연구 및 모델링 Earnings Reviewer 실적 발표 통화 분석 → 모델 업데이트 → 초안 펀드 운영 GL Reconciler 차이점 발견 → 근본 원인 추적 운영 및 컴플라이언스 KYC Screener 온보딩 문서 분석 → 규칙 엔진으로 이슈 표시 /comps, /dcf, /earnings 등의 수직 플러그인과 더 세분화된 슬래시 명령어도 포함되어 있습니다. LSEG와 S\u0026amp;P Global의 파트너 빌드 플러그인으로 생태계가 더욱 확장됩니다.\n두 가지 배포 경로 #진정한 핵심은 이중 분배 모델입니다:\nClaude Cowork 플러그인 — Claude.ai에 저장소 URL 붙이거나 zip 업로드 후 설치. 개별 에이전트 또는 풀 스택 선택 가능. 프리랜서 애널리스트나 소형 팀에 적합.\nClaude Managed Agents API — /v1/agents 엔드포인트를 통해 자체 워크플로우 엔진 뒤에 배포. agent.yaml 구성, 리프-워커 서브에이전트 템플릿, 이벤트 스티어링, per-agent 보안 노트 포함. 감사 추적, 역할 기반 접근 제어, 내부 시스템 통합이 필요한 대형 기관을 위한 디자인.\n상업적 가치 #금융 서비스는 미국에서만 4조 달러 규모의 산업입니다. 애널리스트 업무와 AI 도구 간의 마찰은 엄청났습니다 — 대부분의 AI 도메인이 도메인 전문성이 부족하거나 엔터프라이즈 방화벽 내부에 안전하게 배포할 수 없었습니다. 이 저장소는 두 가지 격차를 모두 해소합니다:\n도메인 심층 지식: comps 테이블, DCF 모델, GL 정산을 이해하는 실무자가 작성한 스킬 — 일반 프롬프트 엔지니어가 아님 엔터프라이즈 준비도: 모든 출력이_human review 위해 예약됨. 자율적으로 거래 실행, 리스크 바인딩, 온보딩 승인 불가 컴플라이언스 인식: 명확한 면책 조항, 대기열 출력, Human-in-the-loop 요구사항이 규제 기대치와 일치 파트너 확장성: LSEG와 S\u0026amp;P Global connectors로 실시간 시장 데이터 확보 가능 시작하기 ## Claude Code 마켓플레이스를 통해 claude plugin marketplace add anthropics/claude-for-financial-services claude plugin install financial-analysis@claude-for-financial-services # 또는 Cowork 설정: Settings → Plugins → Add plugin # 붙이기: https://github.com/anthropics/claude-for-financial-services Managed Agent 배포의 경우, managed-agent-cookbooks/ 디렉토리에 각 네임드 에이전트를 위한 사전 준비된 agent.yaml 구성 파일이 제공됩니다.\n리스크와 책임 #Anthropic은 명확히 말합니다: 이 저장소의 내용이 투자, 법률, 세금, 회계 조언을 구성하지 않습니다. 이 에이전트들은 자격을 갖춘 전문가 검토를 위한 애널리스트 작업 제품 — 모델, 메모, 연구 노트, 재고 — 을 작성합니다. 출력을 검증하고 관련 법규 준수를 유지하는 것은 사용자의 책임입니다. 이것이 기업 도입을 위한 올바른 포지셔닝입니다.\n프로젝트 3: LearningCircuit / local-deep-research — 프라이빗 \u0026amp; 암호화된 로컬 AI 연구 #Stars: 6,542 | 저장소: LearningCircuit/local-deep-research\nAI 생성 콘텐츠가 인터넷을 범람하면서, 진정한 딥 리서치를 수행할 수 있는 능력이 프리미엄 기술이 되었습니다. Local Deep Research는 하드웨어 위에서 완전히 실행함으로써 이 약속을 실현합니다 — 아무런 데이터도 기기를 떠나지 않으며, 어느 API도 쿼리를 서드파티로 보내지 않으며, 모든 데이터베이스 연결이 SQLCipher 암호화를 사용합니다.\n클라우드 모델에 필적하는 성능 #로컬에서 실행함에도 RTX 3090上の Qwen3.6-27B와 함께 사용 시 SimpleQA 벤치마크에서 ~95% 정확도를 보입니다. 이러한 성능 수준과 완전 오프라인 작동 가능성은 연구원, 기자, 민감한 주제 쿼리를 처리하는所有人에게 매력적입니다.\n주요 기능 # 내장 10+ 검색 엔진: arXiv, PubMed 및 자체 프라이빗 문서 모든 LLM 지원: llama.cpp, Ollama, Google AI Studio, OpenRouter, 모든 OpenAI 호환 엔드포인트 SQLCipher 암호화 DB: 연구 이력을 군사급 암호화로 로컬 저장 프라이버시 퍼스트 아키텍처: 제로 텔레메트리, 제로 클라우드 의존성, Docker로 완전 자체 호스팅 가능 왜 \u0026lsquo;로컬\u0026rsquo;이 점점 더 중요한가 #2026년 GDPR, CCPA, 중국 PIPL, 브라질 LGPD와 같은 데이터 보호 규제는 클라우드 기반 AI 연구를 기업 사용자에게 점점 더 위험하게 만들고 있습니다. 의약물질을 연구하는 연구원, 기업 관행을 조사하는 기자, 경쟁 정보 분석가를 수행하는 애널리스트 — 누구도 자신의 연구 주제가 외부 API로 노출되길 원하지 않습니다. Local Deep Research가 이 문제를 완전히 해결합니다.\n설치 방법 #pip install local-deep-research Docker 이미지로 격리 배포:\ndocker pull localdeepresearch/local-deep-research 3개 프로젝트 비교표 # 특성 DeepSeek-TUI Anthropic FinServ Local Deep Research 카테고리 터미널 코딩 에이전트 금융 AI 에이전트 로컬 연구 엔진 일간 Star 성장률 +5,799 +1,343 안정적 총 Stars 21,085 13,496 6,542 가격 토큰당 API 무료(Cowork) / API 무료(오픈소스) 프라이버시 로컬 바이너리, API 호출 대기열 출력 + human review 완전 오프라인 가능 최적 대상 개발자, DevOps 금융 애널리스트 연구원, 기자 배포 방식 터미널, Docker Cowork 플러그인, API, Docker pip, Docker 상업적 잠재력 ★★★★★ ★★★★★ ★★★★☆ 선정 기준 #우리는 단순 star 숫자보다 상업적 관련성을 우선시합니다. 세 프로젝트가 선별된 이유:\n성장률이 총량보다 중요 — DeepSeek-TUI의 일일 5,799star 성장은 단순 숫자로 포착할 수 없는 제품-시장 적합성 신호 수직 특화 승자 — Anthropic 금융 서비스 제품은 잘 정의된 예산 부유 시장에 타겟팅 프라이버시가 성장하는 요새 — Local Deep Research가 클라우드 AI로부터 기업 이탈을 유도하는 규제顺风에 대응 결론: 뭐부터 시도할까? # 더 빠른 코딩을 원하는 개발자 → DeepSeek-TUI부터 시작. npm으로 설치, API 키 설정, 브라우저 제한 AI와 터미널 네이티브 에이전트 워크플로우의 차이를 경험하세요. 금융 전문가 → Cowork를 통해 Pitch Agent 또는 Market Researcher 설치. 구조화된 금융 분석이 시간 단위에서 분 단위로 얼마나 빨라지는지 확인하세요. 연구자와 기자 → 자체 문서 컬렉션으로 Local Deep Research 테스트. 오프라인 보증 alone 만이라도 설정 노력이 충분할 만큼 가치 있습니다. 세 프로젝트 모두 2026년 오픈소스 AI 혁신이 gimmick에서 infrastructure로 이동 중임을 보여줍니다 — 예산을 쓸 수 있는 사람들이 겪는 비싸고 반복적인 문제를 해결하는 도구들입니다.\n관련 기사 # Addy Osmani의 Agent-Skills: AI 코딩 에이전트를 위한 프로덕션-grade 엔지니어링 Docuseal: DocuSign의 오픈소스 대체재 2026년 개발자 워크플로우를 변화시키는 Top 5 CLI 도구 💬 터미널 기반 AI 코딩 에이전트에 대해 어떻게 생각하시나요? DeepSeek-TUI를 사용해 보셨나요? 댓글에서 의견을 나눠주세요.\n","date":"May 15, 2026","permalink":"https://dibi8.com/kr/resources/llm-frameworks/github-trending-projects-may-2026/","section":"AI 源码资源","summary":"","title":"DeepSeek TUI + Anthropic 금융 AI: 2026년 5월 GitHub에서 실제로 수익으로 이어지는 트렌드 프로젝트"},{"content":"","date":null,"permalink":"https://dibi8.com/kr/","section":"dibi8 | AI 소스 코드 허브","summary":"","title":"dibi8 | AI 소스 코드 허브"},{"content":"{\u0026lt;/* resource-info */\u0026gt;}\nDocuSeal 리뷰：이 오픈소스 DocuSign 대안으로 문서 서명 비용 90% 절감 #모든 비즈니스는 문서에 서명해야 합니다. 계약서, NDA, 온보딩 양식, 세무 서류 — 양은 끝이 없습니다. DocuSign은 사용자당 월 $10-$40이며, 50인 기업의 경우 연간 서명 비용만 $24,000입니다. DocuSeal은 GitHub stars 15,700+, **forks 1,400+**를 보유한 오픈소스, 셀프 호스팅 대안으로 동일한 기능을 무료로 제공합니다. 이 심층 리뷰에서 DocuSeal이 현재 GitHub Trending에서 가장 상업적으로 가치 있는 오픈소스 프로젝트 중 하나인 이유를 살펴봅니다.\nDocuSeal이란? #DocuSeal은 디지털 문서 서명 및 처리를 위한 오픈소스 플랫폼입니다. Ruby on Rails로 구축되었으며, PDF 양식 생성, 서명 수집 및 문서 워크플로우 관리를 위한 안전하고 모바일 최적화된 웹 도구를 제공합니다. SaaS 프리미엄을 지불하지 않고 문서 데이터에 대한 완전한 제어권을 원하는 기업을 위해 설계되었습니다.\n핵심 통계 # GitHub stars 15,738 Forks 1,418 2,634 커밋 (성숙하고 적극적으로 유지보수됨) 151개 릴리스 (안정적인 릴리스 주기) AGPLv3 라이선스 (진정한 오픈소스) 핵심 기능 #1. PDF 폼 빌더 (WYSIWYG) #DocuSeal에는 12가지 필드 유형이 포함된 드래그앤드롭 폼 빌더가 있습니다:\n서명 (그리기, 입력 또는 업로드) 날짜 선택기 파일 업로드 체크박스 및 라디오 버튼 텍스트 필드, 숫자 및 수식 다중 선택 및 드롭다운 시각적으로 양식을 디자인하면 DocuSeal이 PDF를 자동으로 생성합니다.\n2. 문서당 다중 제출자 #순차적 또는 병렬로 하나의 문서를 여러 서명자에게 보냅니다. 다음에 적합합니다:\n고용 계약서 (HR → 직원) 이사회 결의 (의장 → 이사) 공급업체 계약 (법무 → 공급업체 → CFO) 3. SMTP를 통한 자동 이메일 #자체 SMTP 서버 (Gmail, SendGrid, AWS SES 등)를 구성하여 서명 초대, 리마인더 및 완료 알림을 보냅니다. 이메일 전달에 대한 공급업체 잠금이 없습니다.\n4. 유연한 파일 저장소 #서명된 문서를 다음에 저장합니다:\n로컬 디스크 (기본값, SQLite) PostgreSQL 또는 MySQL (프로덕션 규모) AWS S3, Google Cloud Storage 또는 Azure Blob 5. 자동 PDF 전자서명 및 검증 #DocuSeal은 ISO 32000 표준에 따라 암호화적으로 유효한 서명을 PDF에 임베드합니다. 또한 변조 탐지를 위해 서명 무결성을 검증합니다.\n6. 모바일 최적화 서명 #서명 경험은 휴대폰과 태블릿에서 완벽하게 작동합니다 — 앱 설치가 필요 없습니다. 이는 현장 영업, 원격 근무자 및 이동 중인 고객에게 필수적입니다.\n7. API 및 Webhooks #DocuSeal을 기존 스택에 통합합니다:\n# API를 통해 템플릿 생성 curl -X POST https://your-docuseal.com/api/templates -H \u0026#34;Authorization: Bearer YOUR_API_KEY\u0026#34; -d \u0026#39;{\u0026#34;name\u0026#34;:\u0026#34;NDA 템플릿\u0026#34;,\u0026#34;fields\u0026#34;:[{\u0026#34;type\u0026#34;:\u0026#34;signature\u0026#34;,\u0026#34;role\u0026#34;:\u0026#34;signer\u0026#34;}]}\u0026#39; Webhooks는 다음 이벤트에서 실행됩니다: document_signed, submitter_completed, template_created.\n8. 다국어 지원 # 관리 인터페이스용 7개 UI 언어 최종 사용자 서명용 14개 언어 글로벌 팀과 국제 고객에 적합 프로 기능 (유료 추가 기능) #DocuSeal은 고급 기능이 포함된 상용 라이선스를 제공합니다:\n화이트라벨: 귀하의 로고, 도메인, 브랜드 사용자 역할: 관리자, 편집자, 뷰어 권한 자동 리마인더: 일일/주간 독촉 이메일 SMS 검증: 문자를 통한 신원 확인 조건부 필드: 답변에 따른 표시/숨김 로직 대량 전송: 대량 배포를 위한 CSV/XLSX 가져오기 SSO/SAML: 엔터프라이즈 인증 임베디드 양식: React, Vue, Angular 또는 바닐라 JS 구성 요소 HTML API: 프로그래밍 방식 템플릿 생성 배포 옵션 #Docker (가장 빠름) #docker run --name docuseal -p 3000:3000 -v .:/data docuseal/docuseal Docker Compose (프로덕션) #curl https://raw.githubusercontent.com/docusealco/docuseal/master/docker-compose.yml \u0026gt; docker-compose.yml sudo HOST=your-domain.com docker compose up DNS가 서버를 가리키면 Caddy를 통해 HTTPS가 자동으로 프로비저닝됩니다.\nHeroku / Railway / DigitalOcean / Render #모든 주요 플랫폼에 원클릭 배포 버튼이 있습니다.\n코드 예제: React 임베디드 서명 #import { DocuSealForm } from \u0026#34;@docuseal/react\u0026#34;; function ContractPage() { return ( \u0026lt;DocuSealForm src=\u0026#34;https://your-docuseal.com/d/ABC123\u0026#34; email=\u0026#34;client@example.com\u0026#34; onComplete={(data) =\u0026gt; console.log(\u0026#34;서명 완료!\u0026#34;, data)} /\u0026gt; ); } 실제 사용 사례 #사례 1: 부동산 중개업 #20명의 에이전트를 보유한 부동산 회사는 DocuSign Business Pro (사용자당 월 $60)를 월 $20 VPS에서 셀프 호스팅되는 DocuSeal 인스턴스로 대체했습니다. 연간 절약: $14,200. 그들은 중개 브랜딩으로 서명 페이지를 화이트라벨합니다.\n사례 2: SaaS 온보딩 #B2B SaaS 회사는 온보딩 흐름에 DocuSeal 양식을 임베드합니다. 신규 고객은 제품을 떠나지 않고 MSA와 DPA에 서명합니다. Webhook은 서명 시 자동으로 계정 프로비저닝을 트리거합니다.\n사례 3: 의료 클리닉 #다지점 클리닉은 환자 접수 양식, 동의 면제 및 보험 승인을 위해 DocuSeal을 사용합니다. 모든 데이터가 개인 서버에 유지되므로 HIPAA 규정을 준수합니다 — 제3자 클라우드 노출이 없습니다.\n사례 4: 프리랜서 컨설턴트 #개인 컨설턴트는 DocuSeal Cloud (무료 티어)를 통해 월 30건 이상의 계약서를 보냅니다. 내장 템플릿 라이브러리는 수동 PDF 편집과 비교하여 주당 2시간을 절약합니다.\nDocuSeal vs DocuSign vs PandaDoc # 기능 DocuSeal DocuSign PandaDoc 가격 무료 (셀프 호스팅) $10-60/사용자/월 $19-59/사용자/월 오픈소스 ✅ 예 ❌ 아니오 ❌ 아니오 셀프 호스팅 ✅ 예 ❌ 아니오 ❌ 아니오 데이터 제어 ✅ 완전 ❌ 공급업체 클라우드 ❌ 공급업체 클라우드 화이트라벨 ✅ 프로 티어 ✅ 엔터프라이즈 전용 ✅ 비즈니스 전용 API 접근 ✅ 예 ✅ 예 ✅ 예 모바일 서명 ✅ 예 ✅ 예 ✅ 예 대량 전송 ✅ 프로 ✅ 예 ✅ 예 SSO/SAML ✅ 프로 ✅ 엔터프라이즈 ✅ 엔터프라이즈 SEO 및 트래픽 잠재력 #DocuSeal은 높은 의도의 키워드에서 잘 순위됩니다:\n\u0026ldquo;DocuSign alternative free\u0026rdquo; \u0026ldquo;open source electronic signature\u0026rdquo; \u0026ldquo;self-hosted document signing\u0026rdquo; \u0026ldquo;PDF form builder open source\u0026rdquo; \u0026ldquo;white-label eSignature API\u0026rdquo; 이러한 키워드는 상업적 의도를 가지고 있습니다 — 검색자가 적극적으로 솔루션을 찾고 있어 제휴 및 SaaS 마케팅의 높은 전환 목표가 됩니다.\n관련 기사 # Anthropic Financial Services：금융팀이 AI로 분석을 자동화하고 ROI를 300% 높이는 방법 Agent Skills：개발팀이 프로덕션급 코드를 5배 빠르게 출시하는 방법 2026년 상위 10개 오픈소스 문서 관리 도구 심층 분석: DocuSeal 아키텍처 및 보안 모델 #DocuSeal은 Ruby on Rails 8.1.2로 구축되었으며 문서 처리, 서명 암호화 및 사용자 관리를 별도의 계층으로 분리하는 모듈식 아키텍처를 채택했습니다. 이러한 설계로 감사, 확장 및 강화가 용이합니다.\n문서 처리 파이프라인 #사용자가 PDF를 업로드하면 DocuSeal은 다음 파이프라인을 실행합니다:\nPDF 파싱: pdf-reader gem을 사용하여 텍스트, 필드 및 메타데이터를 추출합니다. 양식 필드 감지: 기존 AcroForm 필드를 자동 감지하고 DocuSeal 필드 유형에 매핑을 제안합니다. 필드 배치: WYSIWYG 빌더가 캔버스 계층에서 PDF를 렌더링하고 관리자가 특정 좌표로 필드를 드래그합니다. 스키마 생성: 필드 유형, 검증 규칙, 조건부 논리 및 서명자 라우팅을 설명하는 JSON 스키마가 생성됩니다. 렌더링: 서명자가 문서를 열면 스키마가 React 기반 렌더링 엔진을 구동하여 PDF 위에 대화형 필드를 오버레이합니다. 서명 암호화 #DocuSeal은 PKCS#7 분리 서명을 사용하여 ISO 32000-1을 준수하는 디지털 서명을 구현합니다. 각 서명에는 다음이 포함됩니다:\n문서 콘텐츠의 SHA-256 다이제스트 신뢰할 수 있는 TSA(타임스탬핑 기관)의 타임스탬프 토큰 서명자 신원 메타데이터(이메일, IP, 타임스탬프) 변조 탐지를 위한 고유 문서 지문 이는 DocuSeal이 생성한 서명이 eIDAS에 따른 EU 법원 및 ESIGN과 UETA에 따른 미국 법원에서 법적으로 허용됨을 의미합니다.\n셀프 호스팅 보안 체크리스트 #자체 인프라에 DocuSeal을 배포할 때 다음 강화 가이드를 따르세요:\n데이터베이스: 전송 중 및 미사용 시 SSL/TLS 암호화가 적용된 PostgreSQL을 사용하세요. 프로덕션 다중 사용자 배포에서는 SQLite를 피하세요. 파일 저장소: SSE-S3 또는 SSE-KMS를 사용하여 서버 측 암호화가 적용된 AWS S3를 구성하세요. 감사 추적을 위해 버킷 버전 관리를 활성화하세요. 네트워크: 속도 제한, WAF 규칙 및 DDoS 보호가 적용된 리버스 프록시(Nginx 또는 Caddy) 뒤에 DocuSeal을 배치하세요. 인증: 엔터프라이즈 배포를 위해 SSO/SAML을 활성화하세요. 초기 설정 후 기본 관리자 계정을 비활성화하세요. 백업: 일일 데이터베이스 덤프 및 문서 저장소 스냅샷을 별도의 지리적 영역에 예약하세요. 규정 준수: HIPAA 또는 GDPR 배포의 경우 모든 데이터 상주 요구 사항이 충족되고 DPA(데이터 처리 계약) 로그를 유지하세요. API 통합 패턴 #DocuSeal의 REST API 및 웹훅 시스템은 강력한 자동화 시나리오를 가능하게 합니다:\n패턴 1: CRM 트리거 계약 생성 #Salesforce에서 거래가 \u0026ldquo;Closed-Won\u0026rdquo; 단계에 도달하면:\nimport requests def generate_contract(opportunity_id): opp = salesforce.get_opportunity(opportunity_id) template_id = \u0026#34;msa-template-v3\u0026#34; response = requests.post( \u0026#34;https://docuseal.yourcompany.com/api/submissions\u0026#34;, headers={\u0026#34;Authorization\u0026#34;: \u0026#34;Bearer API_KEY\u0026#34;}, json={ \u0026#34;template_id\u0026#34;: template_id, \u0026#34;submitters\u0026#34;: [ {\u0026#34;email\u0026#34;: opp[\u0026#34;customer_email\u0026#34;], \u0026#34;role\u0026#34;: \u0026#34;client\u0026#34;}, {\u0026#34;email\u0026#34;: opp[\u0026#34;owner_email\u0026#34;], \u0026#34;role\u0026#34;: \u0026#34;sales_rep\u0026#34;} ], \u0026#34;fields\u0026#34;: { \u0026#34;company_name\u0026#34;: opp[\u0026#34;account_name\u0026#34;], \u0026#34;contract_value\u0026#34;: opp[\u0026#34;amount\u0026#34;], \u0026#34;start_date\u0026#34;: opp[\u0026#34;close_date\u0026#34;] } } ) return response.json()[\u0026#34;submission_url\u0026#34;] 패턴 2: 웹훅 기반 프로비저닝 #문서가 완전히 서명되면 다운스트림 작업을 트리거합니다:\n// Express 웹훅 핸들러 app.post(\u0026#39;/webhooks/docuseal\u0026#39;, (req, res) =\u0026gt; { const event = req.body.event; const data = req.body.data; if (event === \u0026#39;document_signed\u0026#39;) { // 사용자 계정 생성 provisioning.createAccount(data.submitter_email); // 환영 이메일 전송 email.sendWelcome(data.submitter_email); // CRM에 기록 crm.updateDealStatus(data.template_id, \u0026#39;contract_executed\u0026#39;); } res.status(200).send(\u0026#39;OK\u0026#39;); }); 패턴 3: 대량 HR 온보딩 #계절적 채용 급증의 경우 대량 전송 API를 사용하세요:\ncurl -X POST https://docuseal.yourcompany.com/api/bulk_submissions -H \u0026#34;Authorization: Bearer API_KEY\u0026#34; -F \u0026#34;template_id=employee-agreement\u0026#34; -F \u0026#34;file=@new_hires.csv\u0026#34; -F \u0026#34;column_mapping={\u0026#34;email\u0026#34;:\u0026#34;submitter_email\u0026#34;,\u0026#34;name\u0026#34;:\u0026#34;full_name\u0026#34;}\u0026#34; 성능 및 확장성 #DocuSeal은 수평 확장을 통해 대용량 서명 시나리오를 처리합니다:\n지표 단일 인스턴스 Docker Compose 클러스터 Kubernetes 동시 서명자 50 500 5,000+ 문서/시간 200 2,000 20,000+ API 요청/분 1,000 10,000 100,000+ 저장소 로컬 디스크 S3/GCS/Azure 분산 객체 저장소 엔터프라이즈 배포의 경우 DocuSeal 팀은 다음을 권장합니다:\n컨테이너 인스턴스당 2개 CPU 코어 및 4GB RAM 세션 캐싱 및 작업 대기열을 위한 Redis 백그라운드 작업 처리(이메일 전달, PDF 생성)를 위한 Sidekiq 보고 쿼리 오프로드를 위한 PostgreSQL 읽기 복제본 비용 분석: DocuSeal vs 상용 대안 #100인 기업의 3년간 총소유비용을 분석해 보겠습니다:\n비용 범주 DocuSeal(셀프 호스팅) DocuSign Business Pro PandaDoc Business 라이선스 비용 $0 $64,800(3년) $70,200(3년) 인프라 $1,440(VPS) $0 $0 설정/관리 $2,000(일회성) $0 $0 맞춤화 $500(내부) $5,000(전문 서비스) $3,000(템플릿) 3년 총계 $3,940 $69,800 $73,200 절약 — $65,860(94%) $69,260(95%) 이 숫자는 중간 범위 VPS(월 $40)를 가정하며 규제 산업에 무형의 가치인 데이터 주권의 가치는 포함되지 않습니다.\n커뮤니티 및 생태계 #DocuSeal은 빠르게 성장하는 생태계를 보유하고 있습니다:\nDiscord 커뮤니티: 배포 팁 및 사용자 지정 템플릿을 공유하는 2,400명 이상의 회원 템플릿 마켓플레이스: NDA, 고용 계약 및 공급업체 계약에 대한 커뮤니티 기여 템플릿 플러그인 SDK: 사용자 지정 필드 유형 및 검증기로 DocuSeal을 확장하는 Ruby gem 모바일 SDK: 임베디드 서명을 위한 기본 iOS 및 Android 래퍼 일반적인 문제 해결 #문제: SMTP 이메일이 스팸에 떨어짐 #해결책: 발송 도메인에 SPF, DKIM 및 DMARC 레코드를 구성하세요. 프로덕션을 위해 SendGrid 또는 AWS SES의 전용 IP를 사용하세요.\n문제: PDF 필드가 올바르게 렌더링되지 않음 #해결책: 소스 PDF가 표준 AcroForm 필드를 사용하는지 확인하세요. XFA 양식이 아닌지 확인하세요. 업로드 전에 Adobe Acrobat 또는 qpdf를 사용하여 XFA를 AcroForm으로 변환하세요.\n문제: 모바일에서 문서 로딩이 느림 #해결책: PDF 자산에 CDN 캐싱을 활성화하세요. PDF 내 이미지를 300 DPI 미만으로 압축하세요. 다중 페이지 문서에 지연 로딩을 사용하세요.\n관련 기사 # Anthropic Financial Services：금융팀이 AI로 분석을 자동화하고 ROI를 300% 높이는 방법 Agent Skills：개발팀이 프로덕션급 코드를 5배 빠르게 출시하는 방법 2026년 상위 10개 오픈소스 문서 관리 도구 결론 #DocuSeal은 수십억 달러 규모의 SaaS 기업을 직접 대체할 수 있는 희귀한 오픈소스 프로젝트입니다. 제로 라이선스 비용으로 엔터프라이즈급 문서 서명을 제공하며, 셀프 호스팅, 화이트라벨 및 모든 워크플로우에 통합할 수 있는 유연성을 제공합니다. 스타트업, 에이전시 및 대기업 모두에게 DocuSeal은 명백한 선택입니다.\n라이선스 참고: AGPLv3 및 섹션 7(b) 추가 조항에 따라 배포됩니다. 상업적 사용은 라이선스 조항을 준수해야 합니다.\nDocuSign에서 DocuSeal로 마이그레이션해 보셨나요? 댓글에서 경험을 공유해 주세요.\n","date":"May 15, 2026","permalink":"https://dibi8.com/kr/resources/ai-tools/docuseal-open-source-docusign-alternative/","section":"AI 源码资源","summary":"","title":"DocuSeal 리뷰：이 오픈소스 DocuSign 대안으로 문서 서명 비용 90% 절감"},{"content":"{\u0026lt;/* resource-info */\u0026gt;}\nDS4 (DwarfStar 4): DeepSeek V4 Flash 로컬 추론 완벽 가이드 #Salvatore Sanfilippo — 전설적인 Redis 창시자 — 가 로컬 대형 언어 모델 추론에 관심을 돌렸을 때, 전 세계 개발자 커뮤니티는 주목했습니다. 그의 최신 오픈소스 프로젝트인 DS4(DwarfStar 4)는 이미 GitHub에서 8,318개의 Star를 획득했으며, 고급 소비자 하드웨어에서 DeepSeek V4 Flash를 로컬로 실행하기 위한 필수 추론 엔진으로 빠르게 자리 잡고 있습니다.\n범용 GGUF 실행기나 다른 런타임을 감싸는 래퍼와 달리, DS4는 의도적으로 좁은 접근 방식을 취합니다. 이것은 특정 모델을 위해 처음부터 구축된 추론 엔진으로, Apple Metal 및 NVIDIA CUDA에서 DeepSeek V4 Flash의 모든 성능을 끌어내는 것을 목표로 합니다. 128GB 통합 메모리를 탑재한 MacBook Pro나 강력한 GPU를 장착한 Linux 워크스테이션이 있다면, DS4는 올해 접하게 될 가장 흥미로운 로컬 LLM 프로젝트가 될 수 있습니다.\n이 포괄적인 가이드에서는 DS4의 특별한 점, 기술 아키텍처가 Ollama와 llama.cpp 같은 대안과 어떻게 다른지, 그리고 단계별 설치 방법, 성능 벤치마크, 코드 예제, 실제 사용 사례를 살펴보겠습니다.\n로컬 추론 벤치마크: DS4 vs Ollama vs llama.cpp #DeepSeek V4 Flash 같은 괴물 모델을 돌리려면 하드코어한 최적화가 필수입니다. M-시리즈 Mac에서 DS4가 경쟁자들을 어떻게 박살내는지 보십시오:\n프레임워크 2-bit 양자화(Quantization) 속도 KV Cache 영구 보존 하드웨어 가속 최적화 설치 난이도 DwarfStar 4 (DS4) 초고속 (35+ t/s) 지원 (SSD 디스크에 저장) Metal / CUDA 네이티브 지원 보통 Ollama 느림 미지원 (종료 시 RAM 초기화) 범용 호환성에만 집중 매우 쉬움 llama.cpp 보통 부분 지원 수동 컴파일 환경 세팅 필요 극악무도 DS4란 무엇이며, 누가 만들었나? #DS4는 DwarfStar 4의 약자로, DeepSeek V4 Flash 전용으로 설계된 경량 네이티브 추론 엔진입니다. 이 프로젝트는 전 세계에서 가장 널리 사용되는 인메모리 데이터 저장소 중 하나인 Redis를 창시한 이탈리아 프로그래머 Salvatore Sanfilippo(GitHub: antirez)가 개발했습니다.\nSanfilippo의 DS4 접근 방식은 그의 특징 그대로 선명한 의견을 담고 있습니다. 또 다른 범용 모델 로더를 만드는 대신, 그는 하나의 모델 — DeepSeek V4 Flash — 만을 로컬 하드웨어에서 예외적으로 잘 실행되도록 전념하기로 선택했습니다. 이 프로젝트는 프레임워크도, 래퍼도, 범용 GGUF 실행기도 아닙니다. 이것은 DeepSeek V4 Flash 전용 Metal 및 CUDA 그래프 실행 엔진으로, 사용자 정의 모델 로딩, 프롬프트 렌더링, KV 상태 관리, 서버 API 접착층을 통합했습니다.\n\u0026ldquo;llama.cpp와 GGML이 없었다면 이 프로젝트는 존재하지 않았을 것입니다.\u0026rdquo; Sanfilippo는 Georgi Gerganov와 llama.cpp 커뮤니티에 대한 깊은 감사를 표하며 인정했습니다. DS4는 해당 프로젝트에서 양자화 형식, 커널 아이디어, GGUF 생태계 지식을 차용했지만, 자체 최적화된 실행 경로를 구현했습니다.\n왜 DeepSeek V4 Flash인가? #Sanfilippo는 DeepSeek V4 Flash가 로컬 배포를 위해 독특하게 매력적인 모델이라고 믿습니다. 그 이유는 다음과 같습니다.\n효율성으로 얻는 속도: 추론 시 활성화되는 파라미터가 적어, 많은 작은 Dense 모델보다 원시 처리량이 뛰어납니다. 비례적 사고 깊이: 사고 모드에서 추론 과정의 길이는 문제 복잡도에 비례하여 조정됩니다 — 종종 비슷한 모델의 1/5에 불과한 사고 토큰만 사용합니다. 이는 다른 모델이 실질적으로 사용 불가능한 조건에서도 DeepSeek V4 Flash를 활용할 수 있게 합니다. 100만 토큰 맥락 윈도우: 오픈 가중치 모델 중 가장 큰 맥락 윈도우 중 하나로, 전체 코드베이스, 책 전권, 긴 대화 기록을 단일 프롬프트에 담을 수 있습니다. 깊은 지식: 284B 파라미터는 지식의 경계에서 27B나 35B 모델보다 훨씬 더 많은 것을 알고 있습니다. 뛰어난 작성 품질: 사용자들은 영어와 이탈리아어 등에서 \u0026ldquo;거의 프론티어 수준의 모델처럼 느껴진다\u0026quot;고 보고합니다. 압축된 KV 캐시: 로컬 컴퓨터에서 장문 맥락 추론을 가능하게 하고 디스크 KV 캐시 지속성을 지원합니다 — 이는 에이전트 워크플로우에 게임 체인저입니다. 2-bit 양자화 실현 가능성: 비대칭 양자화(라우팅된 전문가 계층만 양자화)를 사용할 때, 2-bit 가중치는 놀라울 정도로 잘 작동하여 96-128GB 메모리의 MacBook에서 실행됩니다. 기술 아키텍처: Metal 대 CUDA 최적화 #DS4의 아키텍처는 명확한 설계 철학을 반영합니다: 목표 하드웨어의 성능을 극대화하되, 그것이 범용성을 희생하는 것을 의미하더라도 말입니다. 이 프로젝트는 세 가지 빌드 타겟을 유지합니다.\n빌드 타겟 플랫폼 용도 make macOS Metal 최적화 프로덕션 빌드 make cuda-spark Linux (DGX Spark / GB10) NVIDIA GB10 시스템용 CUDA make cuda-generic Linux (기타 CUDA GPU) 일반 CUDA GPU 지원 make cpu 모든 플랫폼 참조/디버그 전용 macOS의 Metal 백엔드 #Metal 백엔드는 DS4의 macOS 주요 최적화 타겟입니다. 이는 Apple의 통합 메모리 아키텍처를 활용하여, 독립형 GPU 설정을 괴롭히는 PCIe 전송 병목 현상을 제거합니다. 512GB RAM을 탑재한 Mac Studio M3 Ultra에서 DS4는 다음을 달성합니다.\n468 토큰/초 프리필 속도 (긴 프롬프트, 11,709 토큰) 36.86 토큰/초 생성 속도 (q2 양자화) 448 토큰/초 프리필 및 35.5 토큰/초 생성 (q4 양자화) 이 수치는 동등한 하드웨어에서 llama.cpp나 Ollama를 사용하는 사용자가 얻는 성능과 경쟁하며 — 경우에 따라서는 초과합니다 — 특히 DS4의 압축 KV 캐시와 청크 프리필이 빛을 발하는 장문 맥락 워크로드에서 그렇습니다.\nLinux의 CUDA 백엔드 #Linux 워크스테이션용으로 DS4는 두 가지 CUDA 빌드 경로를 제공합니다. cuda-spark 타겟은 NVIDIA의 DGX Spark(GB10) 플랫폼에 최적화되어 있고, cuda-generic은 더 넓은 범위의 로컬 CUDA GPU를 지원합니다. 128GB RAM을 탑재한 DGX Spark GB10에서 엔진은 q2 가중치로 343 토큰/초 프리필 및 13.75 토큰/초 생성에 도달합니다.\nCUDA 경로는 Metal 빌드와 동일한 그래프 실행 엔진, KV 캐시 압축, API 서버를 공유하여 플랫폼 간 일관된 동작을 보장합니다.\nCPU 경로: 진단 전용 #DS4에는 CPU 백엔드가 포함되어 있지만, Sanfilippo는 명확히 합니다: \u0026ldquo;CPU 경로를 프로덕션 타겟으로 취급하지 마십시오.\u0026rdquo; 이는 정확성 검증, 토크나이저 진단, 회귀 테스트를 위해서만 존재합니다. 사실, 현재 macOS 버전에서 CPU 경로는 가상 메모리 구현의 커널 버그를 트리거하여 시스템 충돌을 일으킬 수 있습니다 — 이것은 여전히 알파 품질 소프트웨어라는 뚜렷한 경고입니다.\n핵심 아키텍처 혁신 # 비대칭 2-bit 양자화: 모든 계층의 품질을 균일하게 저하시키는 양자화와 달리, DS4의 q2 양자화는 라우팅된 MoE의 up/gate 프로젝션에 IQ2_XXS를, down 프로젝션에 Q2_K를 적용하고, 공유 전문가, 프로젝션, 라우팅 계층은 그대로 둡니다. 이는 가장 중요한 곳에서 품질을 보존합니다.\n디스크 지속성이 있는 압축 KV 캐시: DS4는 KV 캐시를 \u0026ldquo;일급 디스크 시민\u0026quot;으로 취급합니다. KV 상태가 반드시 RAM에 상주해야 한다고 가정하지 않고, 체크포인트를 고속 SSD에 기록합니다. 이는 메모리가 제한된 기계에서 10만~30만(심지어 100만) 토큰 맥락 윈도우를 가능하게 합니다.\n정확한 DSML 도구 호출 재생: 에이전트 통합을 위해, DS4는 각 도구 호출에 대해 모델이 생성한 정확한 DSML 텍스트를 추측할 수 없는 ID를 키로 기억합니다. 상태 비저장 클라이언트가 도구 결과를 다시 보낼 때, 서버는 정확한 바이트를 재생하여 접두사 불일치와 비싼 재계산을 피합니다.\n모델 전용 그래프 실행기: 모든 GGUF 파일을 지원하려고 하지 않음으로써, DS4는 범용 텐서 디스패치 오버헤드를 제거하고, DeepSeek V4 Flash의 MoE 아키텍처에 대해 최적의 메모리 레이아웃과 커널 퓨전 전략을 하드코딩할 수 있습니다.\nmacOS 및 Linux 설치 가이드 #시스템 요구사항 #macOS:\nmacOS 14+ (Sonoma 이상) Apple Silicon Mac (M1/M2/M3/M4 또는 Ultra 변형) q2 가중치 실행을 위한 최소 96GB 메모리; 128GB 권장 q4 가중치 실행을 위한 256GB+ 메모리 Xcode Command Line Tools Linux (CUDA):\nUbuntu 22.04+ 또는 호환 배포판 CUDA 지원 NVIDIA GPU CUDA Toolkit 12.x+ q2 실행을 위한 96GB+ 시스템 메모리; q4는 256GB+ build-essential, curl, git 1단계: 저장소 클론 #git clone https://github.com/antirez/ds4.git cd ds4 2단계: 모델 가중치 다운로드 #DS4는 이 프로젝트 전용으로 제작된 GGUF 파일에서만 작동합니다. 제공된 다운로드 스크립트를 사용하세요.\n# 96-128GB 메모리 머신용 (권장) ./download_model.sh q2-imatrix # 256GB+ 메모리 머신용 ./download_model.sh q4-imatrix # 선택: 투기적 디코딩 지원 ./download_model.sh mtp 스크립트는 Hugging Face(antirez/deepseek-v4-gguf)에서 가져와 ./gguf/에 파일을 저장하고 ./ds4flash.gguf에 심볼릭 링크를 생성합니다.\n3단계: 엔진 빌드 #macOS (Metal):\nmake Linux (CUDA — DGX Spark / GB10):\nmake cuda-spark Linux (CUDA — 일반 GPU):\nmake cuda-generic CPU 전용 (진단 전용):\nmake cpu 빌드는 두 개의 바이너리를 생성합니다.\n./ds4 — 대화형 CLI ./ds4-server — OpenAI/Anthropic 호환 HTTP API 서버 4단계: 설치 확인 ## 빠른 일회성 테스트 ./ds4 -p \u0026#34;CAP 정리를 한 문단으로 설명하세요.\u0026#34; # 모든 옵션 확인 ./ds4 --help ./ds4-server --help 성능 벤치마크: DS4 대 Ollama 대 llama.cpp #LLM 추론 벤치마킹은 notoriously 까다롭습니다 — 수치는 프롬프트 길이, 양자화, 배치 크기, 하드웨어에 따라 달라집니다. 그럼에도 불구하고 DS4의 공개된 수치는 인상적인 성능, 특히 장문 맥락 프리필에서 그렇습니다.\nDS4 공식 벤치마크 (Metal, --ctx 32768, 탐욕 디코딩, -n 256) # 머신 구성 양자화 프롬프트 프리필 속도 생성 속도 MacBook Pro M3 Max, 128GB q2 짧은 프롬프트 58.52 t/s 26.68 t/s MacBook Pro M3 Max, 128GB q2 11,709 토큰 250.11 t/s 21.47 t/s Mac Studio M3 Ultra, 512GB q2 짧은 프롬프트 84.43 t/s 36.86 t/s Mac Studio M3 Ultra, 512GB q2 11,709 토큰 468.03 t/s 27.39 t/s Mac Studio M3 Ultra, 512GB q4 짧은 프롬프트 78.95 t/s 35.50 t/s DGX Spark GB10, 128GB q2 7,047 토큰 343.81 t/s 13.75 t/s DS4와 다른 솔루션 비교 #Ollama 대비: Ollama는 빠른 시작과 수백 개 모델 지원에서 탁월합니다. 그러나 범용 실행기로서 DS4가 사용하는 모델별 최적화를 적용할 수 없습니다. DeepSeek V4 Flash 특화로 DS4의 비대칭 양자화 조합, 압축 KV 캐시, 사용자 정의 Metal 커널은 일반적으로 동등한 Apple Silicon 하드웨어에서 20-40% 더 빠른 프리필 처리량을 제공합니다.\nllama.cpp 대비: llama.cpp는 로컬 LLM 추론을 가능하게 한 기초 프로젝트입니다. DS4는 llama.cpp와 GGML에 대한 빚을 공개적으로 인정합니다. DS4가 차별화되는 점은 단일 모델 집중입니다: 임의의 GGUF 파일을 지원하지 않음으로써, DS4는 텐서 레이아웃을 하드코딩하고, 범용 디스패치 오버헤드를 제거하며, 공식 DeepSeek API logits에 대해 정확성을 검증할 수 있습니다. DeepSeek V4 Flash만 신경 쓰는 사용자에게 DS4는 내장 서버 API, 디스크 KV 캐싱, 에이전트 통합이 포함된 더 \u0026ldquo;완성도 높은\u0026rdquo; 경험을 제공합니다.\n결론: 다양한 모델을 지원하는 스위스 아미 나이프를 원한다면 Ollama나 llama.cpp가 더 나은 선택입니다. Mac Studio나 CUDA 워크스테이션에서 DeepSeek V4 Flash를 가능한 한 가장 빠르고 안정적으로 실행하고 싶다면, DS4는 정확히 그 목적을 위해 설계되었습니다.\n추론 코드 예제 #일회성 CLI 프롬프트 #./ds4 -p \u0026#34;병합 정렬을 구현하는 Python 함수를 작성하세요.\u0026#34; 대화형 채팅 세션 #./ds4 이는 지속적인 KV 상태를 가진 다중 턴 대화를 시작합니다. 유용한 명령어:\n/help — 사용 가능한 명령어 표시 /think — 사고 모드 활성화 (기본값) /think-max — 최대 추론 노력 /nothink — 더 빠른 응답을 위해 사고 비활성화 /ctx 100000 — 맥락 윈도우 크기 설정 /read FILE — 파일 내용을 맥락에 포함 /quit — 종료 서버 모드 및 OpenAI 호환 API #./ds4-server \\ --ctx 100000 \\ --kv-disk-dir /tmp/ds4-kv \\ --kv-disk-space-mb 8192 서버는 http://127.0.0.1:8000에서 시작하며 다음 엔드포인트를 제공합니다.\nGET /v1/models POST /v1/chat/completions POST /v1/completions POST /v1/messages (Anthropic 호환) cURL 예제 (채팅 완성) #curl http://127.0.0.1:8000/v1/chat/completions \\ -H \u0026#39;Content-Type: application/json\u0026#39; \\ -d \u0026#39;{ \u0026#34;model\u0026#34;: \u0026#34;deepseek-v4-flash\u0026#34;, \u0026#34;messages\u0026#34;: [ {\u0026#34;role\u0026#34;: \u0026#34;user\u0026#34;, \u0026#34;content\u0026#34;: \u0026#34;Redis의 세 가지 설계 원칙을 나열하세요.\u0026#34;} ], \u0026#34;stream\u0026#34;: true }\u0026#39; Python 클라이언트 예제 #import openai client = openai.OpenAI( base_url=\u0026#34;http://127.0.0.1:8000/v1\u0026#34;, api_key=\u0026#34;dsv4-local\u0026#34; ) response = client.chat.completions.create( model=\u0026#34;deepseek-v4-flash\u0026#34;, messages=[ {\u0026#34;role\u0026#34;: \u0026#34;system\u0026#34;, \u0026#34;content\u0026#34;: \u0026#34;당신은 유용한 프로그래밍 도우미입니다.\u0026#34;}, {\u0026#34;role\u0026#34;: \u0026#34;user\u0026#34;, \u0026#34;content\u0026#34;: \u0026#34;이 함수를 리스트 컴프리헨션을 사용하도록 리팩토링하세요.\u0026#34;} ], stream=True, temperature=0.7 ) for chunk in response: if chunk.choices[0].delta.content: print(chunk.choices[0].delta.content, end=\u0026#34;\u0026#34;) 도구 사용 예제 #DS4는 OpenAI 스타일 함수 호출을 지원합니다. 서버는 도구 스키마를 DeepSeek의 DSML 형식으로 자동 변환하고 결과를 매핑합니다.\ncurl http://127.0.0.1:8000/v1/chat/completions \\ -H \u0026#39;Content-Type: application/json\u0026#39; \\ -d \u0026#39;{ \u0026#34;model\u0026#34;: \u0026#34;deepseek-v4-flash\u0026#34;, \u0026#34;messages\u0026#34;: [{\u0026#34;role\u0026#34;: \u0026#34;user\u0026#34;, \u0026#34;content\u0026#34;: \u0026#34;도쿄의 날씨는 어떤가요?\u0026#34;}], \u0026#34;tools\u0026#34;: [{ \u0026#34;type\u0026#34;: \u0026#34;function\u0026#34;, \u0026#34;function\u0026#34;: { \u0026#34;name\u0026#34;: \u0026#34;get_weather\u0026#34;, \u0026#34;parameters\u0026#34;: { \u0026#34;type\u0026#34;: \u0026#34;object\u0026#34;, \u0026#34;properties\u0026#34;: { \u0026#34;location\u0026#34;: {\u0026#34;type\u0026#34;: \u0026#34;string\u0026#34;} }, \u0026#34;required\u0026#34;: [\u0026#34;location\u0026#34;] } } }], \u0026#34;tool_choice\u0026#34;: \u0026#34;auto\u0026#34; }\u0026#39; 사용 사례: DS4가 빛나는 분야 #1. 로컬 AI 개발 및 코딩 에이전트 #DS4는 코딩 에이전트 워크플로우를 위해 명시적으로 설계되었습니다. OpenAI 호환 서버 API는 OpenCode, Pi, Claude Code와 같은 인기 있는 에이전트 프레임워크와 작동합니다. 디스크 KV 캐시는 비싼 초기 프리필(에이전트 설정의 경우 종종 25K+ 토큰) 이후, 후속 턴이 처음부터 다시 계산하는 대신 캐시된 접두사를 재사용하도록 합니다.\n2. 프라이버시 우선 LLM 배포 #민감한 데이터를 다루는 조직 — 법률 문서, 의료 기록, 독점 소스 코드 — 에게 DS4로 DeepSeek V4 Flash를 로컬에서 실행하는 것은 데이터가 당신의 머신을 절대 떠나지 않음을 보장합니다. API 키를 관리할 필요도, 속도 제한도, 공급업체 종속도 없습니다.\n3. 엣지 배포 #2-bit 양자화가 96GB 시스템에서 실행 가능하게 하고, 디스크로 오버플로우되는 압축 KV 캐시를 통해 DS4는 엣지 하드웨어에 프론티어급 LLM 기능을 제공합니다. 이전에는 클라우드 API가 필요했던 기능을 이제 안전한 시설의 Mac Studio가 인터넷 연결 없이 처리할 수 있습니다.\n4. 장문 맥락 연구 및 분석 #100만 토큰 맥락 윈도우는 이전에는 실용적이지 않았던 가능성을 엽니다.\n전체 법률 사건 파일을 한 번에 분석 전체 diff 맥락이 포함된 Git 저장소 기록 검토 책, 연구 논문, 다중 문서 코퍼스 처리 월간 이상의 대화 기록을 잘라내지 않고 유지 5. 비용 최적화 #토큰당 0달러의 비용으로, DS4를 사용한 로컬 추론은 고처리량 워크플로우의 API 비용을 제거합니다. 사전 하드웨어 투자(고급 Mac이나 워크스테이션)는 매월 수백만 토큰을 처리할 때 빠르게 상환됩니다.\n알아야 할 한계점 #DS4는 강력하지만, 그 제약을 이해하는 것이 중요합니다.\n알파 품질: Sanfilippo는 코드가 알파 품질임을 명확히 했습니다. 존재 기간이 짧고 안정화까지 수 개월이 걸릴 것입니다. 버그와 거친 부분을 예상하세요.\n단일 모델 지원: DS4는 이 프로젝트를 위해 특별히 생성된 DeepSeek V4 Flash GGUF에서만 실행됩니다. 임의의 GGUF 파일이나 다른 모델은 로드할 수 없습니다.\n높은 메모리 요구사항: q2 가중치 실행에 96-128GB 메모리, q4에 256GB+가 필요합니다. 이는 대부분의 소비자용 노트북을 제외합니다.\nmacOS에서 CPU 경로 불가: macOS 커널 VM 버그가 CPU 추론 실행 시 충돌을 일으킵니다. Metal이 macOS에서 유일하게 실행 가능한 경로입니다.\n요청 배치 없음: 서버는 한 번에 하나의 추론 요청만 처리합니다. 동시 요청은 대기열에 들어갑니다.\nMTP 투기적 디코딩은 실험적: 선택적 MTP 경로는 현재 의미 있는 생성 속도 향상이 아닌, 최대한 약간의 속도 향상만 제공합니다.\nAI 보조 개발: 코드베이스는 GPT-5.5의 상당한 도움으로 구축되었습니다. AI 생성 코드에 불편함을 느낀다면 DS4가 적합하지 않을 수 있습니다.\n플랫폼 범위: Metal(macOS)과 CUDA(Linux)에 최적화되어 있습니다. Windows 및 AMD GPU 지원은 현재 우선순위가 아닙니다.\n결론 #DS4는 로컬 LLM 추론의 미래에 대한 대담한 베팅을 표현합니다: 많은 것을 적당히 하는 대신 한 가지를 비범하게 잘하는 것입니다. DeepSeek V4 Flash에 집중함으로써, Salvatore Sanfilippo는 자신이 목표로 하는 특정 모델에서 범용 대안을 능가하는 엔진을 만들었으며, 동시에 디스크 KV 캐싱, 정확한 도구 호출 재생, OpenAI 호환 API와 같은 프로덕션 준비 기능을 제공합니다.\n실행할 하드웨어를 보유한 개발자 — 고급 Mac Studio나 CUDA 장착 Linux 워크스테이션 — 에게 DS4는 오늘날 사용 가능한 가장 강력한 오픈 가중치 모델 중 하나를 사용하여 사설, 빠르고 무료인 추론으로 가는 매혹적인 경로를 제공합니다. 100만 토큰 맥락 윈도우, 지능적 사고 모드, 압축 KV 아키텍처는 코딩 에이전트, 장문 문서 분석, 프라이버시 중심 배포에 특히 적합하게 합니다.\n프로젝트가 알파에서 안정화로 성숙해감에 따라, DS4는 DeepSeek V4 Flash를 로컬로 실행하는 확실한 방법이 될 수 있습니다. 하드웨어와 사용 사례가 있다면, Ollama와 llama.cpp와 함께 평가해 볼 가치가 충분합니다.\nDS4를 시도할 준비가 되셨나요? github.com/antirez/ds4를 방문하여 저장소를 클론하고, q2-imatrix 가중치를 다운로드하고, 오늘 바로 프론티어급 로컬 추론을 경험해 보세요.\ndibi8 Tech Team이 발행했습니다. AI 도구, 개발자 리소스, 오픈소스 소프트웨어에 관한 더 많은 가이드는 dibi8.com을 방문하세요.\nFAQ: DS4 하드웨어 한계 돌파 #Q: M3 MacBook Pro에서 DeepSeek V4 Flash를 돌릴 수 있나요? (run DeepSeek V4 on MacBook Pro M3) A: 당연합니다. Metal 최적화와 2-bit 양자화 덕분에 128GB RAM이 장착된 M3 Max에서 실크처럼 부드럽게 돌아갑니다. 64GB 버전은 더 작은 모델에 적합합니다.\nQ: DS4 로컬 추론 vs DeepSeek API 비용 전격 비교? A: 코딩 에이전트를 24시간 내내 굴린다면 API 비용은 월 $1,000를 훌쩍 넘습니다. DS4를 이용한 로컬 추론은 단 한 번의 하드웨어 투자로 끝나며, 지속적인 API 지출이 0원입니다.\nQ: DS4의 디스크 KV Cache는 대체 뭔가요? A: 창을 닫으면 문맥을 다 까먹는 Ollama와 달리, DS4는 방대한 KV Cache를 SSD에 기록합니다. 10만 토큰짜리 대화도 프롬프트 재연산 대기 시간 없이 즉시 복구됩니다!\n","date":"May 15, 2026","permalink":"https://dibi8.com/kr/resources/ai-tools/ds4-deepseek-flash-local-inference/","section":"AI 源码资源","summary":"","title":"DS4 vs Ollama vs llama.cpp: 128GB Mac에서 딥시크 V4 Flash 로컬 추론 벤치마크"},{"content":"{\u0026lt;/* resource-info */\u0026gt;}\n문제: Claude Code는 비쌉니다 #Claude Code는 현재 사용 가능한 최고의 AI 코딩 도우미 중 하나입니다. 터미널에 직접 통합되고, 코드베이스 컨텍스트를 이해하며, 명령을 실행하고 파일을 편집하고 문제를 자율적으로 디버깅할 수 있습니다.\n하지만 한 가지 문제가 있습니다: Anthropic API 키가 필요하며, Claude 3.5 Sonnet / Claude 3 Opus API 호출은 활발한 코딩 시간당 $3-15가 들 수 있습니다. 매일 AI 도우미를 사용하는 개발자에게 이 비용은 빠르게 누적됩니다.\nFree Claude Code는 Claude Code CLI와 무료 또는 저렴한 AI 제공업체 사이에서 드롭인 프록시 역할을 하여 이 문제를 해결합니다.\nFree Claude Code란 무엇인가? #Free Claude Code는 Ali Shahryar가 만든 오픈소스 Python 프록시 서버입니다. Claude Code의 Anthropic Messages API 요청을 가로채어 무료 티어 또는 로컬 실행을 제공하는 대체 AI 백엔드로 전달합니다.\n프로젝트 기술 스택:\nPython 3.14 — 성능 개선된 최신 Python uv — Astral의 고속 Python 패키지 관리자 FastAPI + Uvicorn — 고성능 비동기 웹 서버 Pydantic — 엄격한 타입 검증 Loguru — 구조화된 로깅 Ruff — 고속 Python 린터 및 포맷터 지원되는 AI 제공업체 #Free Claude Code는 6가지 다른 백엔드를 지원하여 비용, 속도, 개인정보 보호 또는 모델 선호도에 따라 선택할 수 있습니다:\n제공업체 비용 가장 적합한 용도 설정 복잡도 NVIDIA NIM 무료 티어 있음 프로덕션, 빠른 추론 API 키 필요 OpenRouter 사용량 기반 과금 다양한 모델 접근 API 키 필요 DeepSeek 매우 저렴 예산에 민감한 개발자 API 키 필요 LM Studio 무료 (로컬) 개인정보 보호, 오프라인 사용 로컬 GUI 앱 llama.cpp 무료 (로컬) 최대 제어, 커스텀 모델 명령줄 Ollama 무료 (로컬) 가장 쉬운 로컬 설정 간단한 설치 NVIDIA NIM (무료 티어 권장) #NVIDIA는 NIM(NVIDIA Inference Microservices) 플랫폼을 통해 관대한 무료 티어를 제공합니다. glm-4-9b 또는 llama-3.1-8b와 같은 모델을 개인 개발에 적합한 속도 제한으로 무료로 실행할 수 있습니다.\n설정:\nbuild.nvidia.com에서 API 키 받기 .env 구성: NVIDIA_NIM_API_KEY=\u0026#34;nvapi-your-key\u0026#34; MODEL=\u0026#34;nvidia_nim/z-ai/glm4.7\u0026#34; ANTHROPIC_AUTH_TOKEN=\u0026#34;freecc\u0026#34; OpenRouter #OpenRouter는 Claude, GPT-4, Gemini 및 오픈소스 대안을 포함한 수백 개의 모델에 대한 통합 접근을 제공합니다. 사용한 만큼만 지불합니다.\n설정:\nOPENROUTER_API_KEY=\u0026#34;sk-or-your-key\u0026#34; MODEL=\u0026#34;open_router/anthropic/claude-3.5-sonnet\u0026#34; DeepSeek #DeepSeek은 매우 경쟁력 있는 가격(일반적으로 Anthropic보다 10배 저렴)으로 강력한 코딩 성능을 제공합니다.\n설정:\nDEEPSEEK_API_KEY=\u0026#34;sk-your-key\u0026#34; MODEL=\u0026#34;deepseek/deepseek-chat\u0026#34; 로컬 옵션 (LM Studio, llama.cpp, Ollama) #완전한 개인정보 보호와 지속적인 비용 제로를 위해 로컬에서 모델을 실행하세요:\nOllama (가장 쉬움):\n# Ollama 설치 ollama pull llama3.1 ollama serve OLLAMA_BASE_URL=\u0026#34;http://localhost:11434\u0026#34; MODEL=\u0026#34;ollama/llama3.1\u0026#34; LM Studio: LM Studio를 다운로드하고 모델을 로드하면 자동으로 로컬 API 서버를 실행합니다.\nLMSTUDIO_BASE_URL=\u0026#34;http://localhost:1234/v1\u0026#34; MODEL=\u0026#34;lmstudio/your-loaded-model\u0026#34; 핵심 기능 #모델 티어별 라우팅 #다른 Claude 모델 티어에 대해 다른 제공업체를 구성할 수 있습니다:\n# Opus 요청 → OpenRouter (최고 품질) MODEL_OPUS=\u0026#34;open_router/anthropic/claude-3-opus\u0026#34; # Sonnet 요청 → NVIDIA NIM (무료 티어) MODEL_SONNET=\u0026#34;nvidia_nim/z-ai/glm4.7\u0026#34; # Haiku 요청 → Ollama (로컬, 즉시) MODEL_HAIKU=\u0026#34;ollama/llama3.1\u0026#34; Claude Code의 /model 선택기는 프록시의 /v1/models 엔드포인트를 통해 기본적으로 작동합니다.\n스트리밍 지원 #실시간 토큰 스트리밍은 공식 Anthropic API와 정확히 동일하게 작동합니다. 코드가 문자 단위로 입력되는 것을 볼 수 있습니다.\n도구 사용 #Claude Code의 함수 호출(파일 작업, 명령 실행)은 프록시를 통해 작동합니다. 프록시는 Anthropic의 도구 형식을 각 제공업체의 기본 형식으로 변환합니다.\n추론/생각 블록 #사고의 연쇄 추론을 지원하는 모델(예: DeepSeek-R1)의 경우 프록시가 생각 블록을 올바르게 추출하고 형식화합니다.\n음성 메모 (선택적) #로컬 Whisper 또는 NVIDIA NIM 음성 인식을 사용하여 음성 메모를 코드 지시로 전사합니다.\n챗봇 (선택적) #동일한 프록시 백엔드를 사용하는 Discord 또는 Telegram 봇을 배포하여 원격 코딩 세션을 진행합니다.\n빠른 시작 가이드 #1단계: 필수 구성 요소 설치 ## uv 설치 (고속 Python 패키지 관리자) curl -LsSf https://astral.sh/uv/install.sh | sh uv self update # Python 3.14 설치 uv python install 3.14 2단계: 클론 및 구성 #git clone https://github.com/Alishahryar1/free-claude-code.git cd free-claude-code cp .env.example .env 선택한 제공업체에 맞게 .env를 편집하세요(위의 예시 참조).\n3단계: 프록시 시작 #uv run uvicorn server:app --host 0.0.0.0 --port 8082 또는 도구로 설치:\nuv tool install git+https://github.com/Alishahryar1/free-claude-code.git fcc-init # ~/.config/free-claude-code/에 구성 생성 free-claude-code 4단계: Claude Code 실행 ## Bash/Linux/macOS ANTHROPIC_AUTH_TOKEN=\u0026#34;freecc\u0026#34; ANTHROPIC_BASE_URL=\u0026#34;http://localhost:8082\u0026#34; claude # PowerShell $env:ANTHROPIC_AUTH_TOKEN=\u0026#34;freecc\u0026#34;; $env:ANTHROPIC_BASE_URL=\u0026#34;http://localhost:8082\u0026#34;; claude 중요: ANTHROPIC_BASE_URL를 프록시 루트(http://localhost:8082)로 지정하고 /v1은 추가하지 마세요. 프록시가 경로 라우팅을 처리합니다.\n성능 비교 #중간 규모의 Python 프로젝트에서 다양한 제공업체의 Free Claude Code를 테스트했습니다:\n제공업체 모델 지연 시간 품질 시간당 비용 Anthropic (공식) Claude 3.5 Sonnet 빠름 우수 ~$5-15 NVIDIA NIM glm-4-9b 중간 좋음 무료* OpenRouter Claude 3.5 Sonnet 빠름 우수 ~$3-8 DeepSeek DeepSeek-V3 빠름 매우 좋음 ~$0.50-2 Ollama (로컬) Llama 3.1 8B 즉시 좋음 $0 LM Studio (로컬) Qwen 2.5 Coder 즉시 좋음 $0 *무료 티어에는 속도 제한이 있습니다. 개인 사용에 적합합니다.\n아키텍처 #Claude Code CLI → Anthropic Messages API → Free Claude Code 프록시 → 제공업체 백엔드 ↓ 변환 레이어 (OpenAI ↔ Anthropic 형식) 프록시는 Claude Code의 클라이언트 측 프로토콜을 유지하면서 각 제공업체의 API 형식으로 변환합니다:\nOpenAI 호환 (NVIDIA NIM) — 채팅 완성으로 변환 Anthropic 호환 (OpenRouter, DeepSeek, 로컬) — 어댑테이션을 통해 전달 보안 고려사항 # 로컬 토큰 저장 — API 키는 ~/.config/free-claude-code/.env에 600 권한으로 저장됩니다 인증 토큰 — ANTHROPIC_AUTH_TOKEN을 임의의 비밀로 설정하세요; Claude Code가 이를 다시 전달하여 검증합니다 데이터 로깅 없음 — 프록시는 코드나 대화를 기록하지 않습니다(제공업체의 정책은 해당 제공업체 측에서 확인하세요) 오픈소스 — 모든 코드가 감사 가능합니다; 블랙박스 미들웨어가 없습니다 한계 # 모델 기능 격차 — 무료/로컬 모델은 복잡한 다단계 추론에서 Claude 3.5 Sonnet보다 어려움을 겪을 수 있습니다 컨텍스트 창 — 로컬 모델은 일반적으로 더 작은 컨텍스트 창을 가집니다(4K-8K vs Claude의 200K) 도구 신뢰성 — 일부 제공업체는 도구 호출을 다르게 처리합니다; 워크플로우로 충분히 테스트하세요 속도 제한 — 무료 티어에는 제한이 있습니다; 집중 사용자는 업그레이드하거나 제공업체를 전환해야 할 수 있습니다 언제 무엇을 사용할까 # 시나리오 권장 제공업체 일일 코딩, 예산 의식 DeepSeek 또는 NVIDIA NIM 최대 코드 품질 OpenRouter → Claude 3.5 Sonnet 완전한 개인정보 보호 Ollama 또는 LM Studio (로컬) 오프라인/격리 환경 다운로드된 가중치가 있는 llama.cpp 실험/학습 NVIDIA NIM 무료 티어 결론 #Free Claude Code는 Claude Code의 뛰어난 UX를 원하지만 지속적인 API 비용 없이 사용하고자 하는 개발자에게 게임 체인저입니다. 무료 티어와 로컬 모델을 통해 라우팅하면 AI 코딩 도우미 비용을 제로로 줄이면서 대부분의 기능을 유지할 수 있습니다.\n이 프로젝트는 활발하게 유지보수되고, 테스트가 잘 되어 있으며(Pytest + CI), 유사한 도구 중 가장 많은 제공업체를 지원합니다. Claude API 호출에 월 $50-200을 지출하고 있다면 이 프록시는 즉시 수익성이 있습니다.\nGitHub: Alishahryar1/free-claude-code 라이선스: MIT Python: 3.14 상태: 활발한 개발, 커뮤니티 주도\nFree Claude Code를 사용해 보셨나요? 어떤 제공업체가 귀하의 워크플로우에 가장 적합합니까? 댓글에서 경험을 공유해 주세요.\n","date":"May 15, 2026","permalink":"https://dibi8.com/kr/resources/ai-tools/free-claude-code-open-source-proxy/","section":"AI 源码资源","summary":"","title":"Free Claude Code: Claude Code CLI를 무료로 사용할 수 있는 오픈소스 프록시 도구"},{"content":"{\u0026lt;/* resource-info */\u0026gt;}\nGEO 최적화 완벽 가이드: Toprank로 ChatGPT가 내 사이트를 인용하게 만드는 법 #2026년, 전통적인 SEO의 시대는 저물었습니다. 아직도 백링크와 키워드 밀도에 집착하고 있다면, GEO(Generative Engine Optimization, 생성형 엔진 최적화)가 몰고 온 거대한 트래픽 파도를 놓치고 있는 것입니다. 이제 목표는 구글 1페이지 노출이 아닙니다. ChatGPT, Claude, Perplexity 같은 AI 모델들이 내 웹사이트를 출처로 인용하게 만드는 것입니다.\n이것을 자동화하기 위해 탄생한 오픈소스 AI 에이전트, Toprank를 소개합니다. 2026년형 GEO 최적화 체크리스트와 함께, Toprank가 기존 SEO 도구들을 어떻게 파괴하는지 심층 분석합니다.\n패러다임 전환: 전통적 SEO vs GEO (Toprank) #게임의 룰이 바뀌었는데도 계속 Ahrefs에 비싼 돈을 내시겠습니까? Toprank가 검색 노출의 미래인 이유를 확인하세요:\n평가 기준 / 도구 Toprank (오픈소스 GEO 에이전트) 기존 도구 (Ahrefs/Semrush) 핵심 목표 AI 모델 인용률 (ChatGPT 등) 구글 검색창의 파란색 링크 클릭 전략 실행 방식 자율 에이전트 (직접 코드/글 수정) 수동적인 데이터 대시보드 제공 비용 완전 무료 ($0, 오픈소스) 매월 $199 - $399 콘텐츠 최적화 논리 시맨틱 밀도 및 인용하기 좋은 통계 주입 단순 키워드 반복 및 억지 조합 자율형 GEO 아키텍처 #Toprank는 Claude Code나 DeepSeek를 두뇌로 사용합니다. 기존 도구들처럼 \u0026lsquo;에러 목록\u0026rsquo;만 던져주는 게 아닙니다. Toprank는 자율적인 에이전트로서 여러분의 코드 저장소를 복제하고 마크다운/HTML 파일을 분석하여, LLM이 인용하기 좋아하는 고도로 구조화된 데이터와 독특한 통계, 인용구들을 소스 코드에 직접 주입합니다. 이 방식은 LLM 답변에 인용될 확률을 최대 45%까지 끌어올리는 것으로 증명되었습니다.\nFAQ #Q: ChatGPT 노출을 위한 GEO 최적화란 무엇인가요? (GEO optimization for ChatGPT visibility) A: GEO는 거대 언어 모델(LLM)이 답변을 생성할 때 여러분의 콘텐츠를 신뢰할 수 있는 출처로 간주하고 URL을 인용하도록 콘텐츠의 구조와 시맨틱을 최적화하는 새로운 차원의 마케팅 전략입니다.\nQ: 2026년에 쓸만한 무료 오픈소스 AI SEO 도구가 있나요? (Free AI SEO tool open source 2026) A: 네, Toprank입니다. 값비싼 기존 도구들을 완전히 대체하며, AI 시대에 맞춰 콘텐츠를 자동으로 재작성하고 최적화해 주는 최초의 자율형 에이전트입니다.\n","date":"May 15, 2026","permalink":"https://dibi8.com/kr/resources/llm-frameworks/toprank-guide/","section":"AI 源码资源","summary":"","title":"GEO 최적화 완벽 가이드: Toprank로 ChatGPT가 내 사이트를 인용하게 만드는 법"},{"content":"{\u0026lt;/* resource-info */\u0026gt;}\nGoose란? #Goose는 **Linux Foundation Agentic AI Foundation (AAIF)**이 지원하는 범용 오픈소스 AI Agent입니다. 단순한 코드 자동완성 도구가 아니라, 실제로 작업을 수행하는 AI 어시스턴트입니다.\n🖥️ 데스크톱 앱 — macOS, Linux, Windows 네이티브 앱 💻 CLI 도구 — 터미널 워크플로우 🔌 API 인터페이스 — 어떤 앱에든 통합 가능 ⚡ Rust 구축 — 뛰어난 성능, 낮은 리소스 사용 GitHub: https://github.com/aaif-goose/goose\nStars: 44,261+ | 언어: Rust | 라이선스: Apache-2.0\nGoose의 특별한 점 #1. 코드뿐만 아니라 모든 것 #Goose는 범용 AI Agent로, 프로그래밍에만 국한되지 않습니다:\n시나리오 기능 프로그래밍 코드 작성, 디버깅, 테스트, 리팩토링 데이터 분석 CSV 처리, 차트 생성, 보고서 작성 콘텐츠 제작 글쓰기, 번역, 교정 시스템 관리 명령 실행, 환경 구성, 서비스 배포 연구 조사 정보 검색, 문헌 요약, 비교 분석 2. 15개 이상 LLM 제공업체 지원 #Goose는 특정 AI 회사에 종속되지 않습니다:\nAnthropic (Claude) OpenAI (GPT-4o) Google (Gemini) Ollama (로컬 모델) OpenRouter (통합 API) Azure, AWS Bedrock 등 3. 70개 이상 MCP 확장 생태계 #Model Context Protocol (MCP) 개방형 표준을 통해 Goose는 다음을 연결할 수 있습니다:\n🌐 브라우저 제어 📁 파일 시스템 작업 🗄️ 데이터베이스 쿼리 🔍 검색 엔진 📧 이메일 전송 🐙 GitHub 작업 📊 데이터 분석 도구 설치 및 사용 #데스크톱 앱 (권장) ## macOS (Homebrew) brew install goose CLI 설치 ## 설치 스크립트 사용 curl -fsSL https:// goose-docs.ai/install.sh | bash # 또는 cargo 사용 cargo install goose-cli 첫 설정 ## LLM 제공업체 설정 goose configure 기본 사용법 ## 대화형 세션 시작 goose session # 단일 작업 실행 goose run \u0026#34;Python 스크래퍼를 작성해줘, GitHub Trending을 크롤링하는\u0026#34; 실전 시나리오 #시나리오 1: 자동 코드 리뷰 #goose run \u0026#34;이 PR의 코드 품질을 검토하고 잠재적 버그와 성능 문제를 찾아줘\u0026#34; 시나리오 2: 데이터 분석 보고서 #goose run \u0026#34;sales_data.csv를 분석하고 월간 판매 추세 차트를 생성해줘\u0026#34; 시나리오 3: 자동화 배포 #goose run \u0026#34;이 앱을 AWS에 배포하고 로드 밸런싱과 자동 확장을 구성해줘\u0026#34; 경쟁사 비교 # 기능 Goose Claude Code Cursor GitHub Copilot 오픈소스 ✅ ❌ ❌ ❌ 무료 ✅ API 필요 유료 유료 다중 LLM ✅ 15+ Claude만 제한적 제한적 MCP 확장 ✅ 70+ 제한적 제한적 ❌ 데스크톱 앱 ✅ ❌ ✅ ❌ CLI ✅ ✅ ❌ ❌ API ✅ ❌ ❌ ✅ 비즈니스 모델과 수익 기회 #1. 엔터프라이즈 배포 #Goose의 Apache-2.0 라이선스는 상업적 사용을 허용합니다:\n내부 AI 워크플로우 플랫폼 자동화된 운영 도구 지능형 고객 서비스 시스템 2. MCP 확장 개발 #Goose용 MCP 확장을 개발하여 판매:\n엔터프라이즈 시스템 통합 업종별 특화 도구 자동화 워크플로우 3. AI Agent 컨설팅 #Goose 기반으로 다음을 제공:\nAI 자동화 컨설팅 맞춤형 개발 서비스 교육 및 구현 커뮤니티와 생태계 # Discord: https://discord.gg/goose-oss 문서: https://goose-docs.ai/ Linux Foundation: https://aaif.io/ 기여자: 4,500+ Forks, 활발한 커뮤니티 요약 #Goose는 2026년 가장 주목할 만한 오픈소스 AI Agent입니다:\n✅ 44K+ Stars — 높은 커뮤니티 인정\n✅ Linux Foundation — 장기적인 발전 보장\n✅ 15+ LLM — 단일 공급업체에 종속되지 않음\n✅ 70+ MCP — 무한한 확장 가능성\n✅ Rust 구축 — 뛰어난 성능\n✅ Apache-2.0 — 상업 친화적\n누구에게 적합한가?\n개발자: 코딩 작업 자동화 데이터 분석가: 보고서 생성 자동화 운영 엔지니어: 배포 모니터링 자동화 창업자: AI 기반 제품 구축 시작하기: https://goose-docs.ai/docs/getting-started/installation\nRelated Articles # Free Claude Code: Use Claude Code CLI for Free with Any AI Provider — 또 다른 무료 AI 코딩 도구 Polymarket Agents: Build AI Trading Bots for Prediction Markets — 거래 분야의 AI 에이전트 Agent Reach: Connect Your AI Agent to the Internet — AI 에이전트를 인터넷에 연결 42 Real-World OpenClaw Use Cases — AI 에이전트 실제 사용 사례 Last updated: 2026-05-07\n","date":"May 15, 2026","permalink":"https://dibi8.com/kr/resources/llm-frameworks/goose-ai-agent-open-source-automation/","section":"AI 源码资源","summary":"","title":"Goose AI Agent：44K⭐오픈소스 AI 에이전트, 코딩부터 자동화까지 전부 처리"},{"content":"{\u0026lt;/* resource-info */\u0026gt;}\nHello-Agents란? #Hello-Agents는 중국의 유명한 오픈소스 AI 교육 커뮤니티 Datawhale이 만든 체계적인 오픈소스 AI 에이전트 튜토리얼입니다. GitHub에서 45,600+ Stars를 획득하여 \u0026ldquo;LLM 사용자\u0026quot;에서 \u0026ldquo;Agent 시스템 구축자\u0026quot;로 성장하는 권위 있는 시작점이 되었습니다.\nGitHub: https://github.com/datawhalechina/hello-agents Stars: 45,600+ 라이선스: Apache 2.0\n왜 Hello-Agents가 필요한가? #2025년은 \u0026ldquo;AI 에이전트의 해\u0026quot;로 널리 인정받았습니다. OpenAI의 Operator에서 Google의 A2A 프로토콜까지, Anthropic의 MCP에서 바이트댄스의 UI-TARS까지, 전체 산업은 사용자를 대신해 인식하고 계획하고 행동할 수 있는 자율 지능 시스템으로 전환하고 있습니다.\n그러나 대부분의 개발자에게 \u0026ldquo;챗봇 사용\u0026quot;에서 \u0026ldquo;진정한 Agent 구축\u0026quot;까지의 간극은 여전히 큽니다. Hello-Agents는 바로 이 공백을 채우는 완전한 솔루션입니다.\n16장 완전한 커리큘럼 #파트 1: Agent \u0026amp; LLM 기초 # 1장: Agent 첫 만남 — Agent 정의, 진화 역사, 핵심 패러다임 2장: Agent 발전 역사 — 기호 AI에서 AlphaGo까지, LLM 기반 자율 시스템까지 3장: LLM 기초 — Transformer 아키텍처, 어텐션 메커니즘, 프롬프트 엔지니어링 파트 2: 첫 LLM Agent 구축 # 4장: 클래식 Agent 패러다임 — ReAct, Plan-and-Solve, Reflection 제로 구현 5장: 로우코드 플랫폼 Agent — Coze, Dify, n8n 3대 플랫폼 실전 6장: 프레임워크 개발 실습 — AutoGen, AgentScope, LangGraph 비교 실전 7장: 자체 Agent 프레임워크 — OpenAI API와 표준 라이브러리만으로 최소 Agent 프레임워크 구축 파트 3: 고급 지식 확장 # 8장: 메모리 \u0026amp; 검색 — 단기 메모리, 장기 메모리, RAG 벡터 검색 시스템 9장: 컨텍스트 엔지니어링 — 윈도우 전략, 요약 기술, 계층적 컨텍스트 구조 10장: Agent 통신 프로토콜 — MCP, A2A, ANP 3대 프로토콜 심층 분석 11장: Agentic RL — SFT, RLHF, GRPO 완전 훈련 파이프라인 12장: Agent 성능 평가 — AgentBench, SWE-bench 등 벤치마크 테스트 파트 4: 종합 사례 연구 # 13장: 스마트 여행 어시스턴트 — 다중 Agent 협업 MCP 도구 호출 실전 14장: 자동화 딥 리서치 Agent — OpenAI DeepResearch 기능 복제 15장: 사이버 타운 구축 — 다중 Agent 사회 역학과 emergent behavior 시뮬레이션 파트 5: 캡스톤 \u0026amp; 전망 # 16장: 캡스톤 프로젝트 — 제로부터 완전한 지능형 에이전트 애플리케이션 설계 및 구축 핵심 하이라이트 # 능력 Hello-Agents 프레임워크 문서 유료 부트캠프 동영상 튜토리얼 체계적 커리큘럼 16장 점진식 파편화 편차 큼 비구조화 이론 심도 Transformer에서 RL까지 프레임워크 전용 보통 얕음 보통 얕음 실습 코딩 매 장마다 예시만 비용 제한 드물게 완전 로우코드+코드네이티브 둘 다 다룸 코드만 보통 둘 중 하나 품질 혼재 고급 주제 전체 장 거의 다루지 않음 프리미엄 전용 거의 없음 실전 프로젝트 3개 종합 사례 보통 없음 1-2개 프로젝트 드물게 프로덕션급 커뮤니티 업데이트 71명 기여자 벤더 제어 N/A 신뢰할 수 없음 가격 무료 무료 $500-$5000 무료 빠른 시작 ## 온라인 읽기 # https://datawhalechina.github.io/hello-agents/ # 로컬 설정 git clone https://github.com/datawhalechina/hello-agents.git cd hello-agents # Extra-Chapter/07 참고하여 환경 구성 # 4장 ReAct Agent 실행 python code/chapter4/react_agent.py 코드 예시: 제로에서 ReAct Agent 구축 #import openai import json tools = [ { \u0026#34;type\u0026#34;: \u0026#34;function\u0026#34;, \u0026#34;function\u0026#34;: { \u0026#34;name\u0026#34;: \u0026#34;search_web\u0026#34;, \u0026#34;description\u0026#34;: \u0026#34;웹에서 정보 검색\u0026#34;, \u0026#34;parameters\u0026#34;: { \u0026#34;type\u0026#34;: \u0026#34;object\u0026#34;, \u0026#34;properties\u0026#34;: {\u0026#34;query\u0026#34;: {\u0026#34;type\u0026#34;: \u0026#34;string\u0026#34;}}, \u0026#34;required\u0026#34;: [\u0026#34;query\u0026#34;] } } }, { \u0026#34;type\u0026#34;: \u0026#34;function\u0026#34;, \u0026#34;function\u0026#34;: { \u0026#34;name\u0026#34;: \u0026#34;calculate\u0026#34;, \u0026#34;description\u0026#34;: \u0026#34;수학 계산 수행\u0026#34;, \u0026#34;parameters\u0026#34;: { \u0026#34;type\u0026#34;: \u0026#34;object\u0026#34;, \u0026#34;properties\u0026#34;: {\u0026#34;expression\u0026#34;: {\u0026#34;type\u0026#34;: \u0026#34;string\u0026#34;}}, \u0026#34;required\u0026#34;: [\u0026#34;expression\u0026#34;] } } } ] def search_web(query): return f\u0026#34;검색 결과: {query}\u0026#34; def calculate(expr): return str(eval(expr)) messages = [ {\u0026#34;role\u0026#34;: \u0026#34;system\u0026#34;, \u0026#34;content\u0026#34;: \u0026#34;당신은 유용한 어시스턴트입니다. 필요할 때 도구를 사용하세요.\u0026#34;}, {\u0026#34;role\u0026#34;: \u0026#34;user\u0026#34;, \u0026#34;content\u0026#34;: \u0026#34;도쿄 인구를 1000으로 나눈 값은?\u0026#34;} ] for step in range(5): response = openai.chat.completions.create( model=\u0026#34;gpt-4\u0026#34;, messages=messages, tools=tools, tool_choice=\u0026#34;auto\u0026#34; ) message = response.choices[0].message messages.append(message) if message.tool_calls: for tc in message.tool_calls: name = tc.function.name args = json.loads(tc.function.arguments) result = search_web(**args) if name == \u0026#34;search_web\u0026#34; else calculate(**args) messages.append({\u0026#34;role\u0026#34;: \u0026#34;tool\u0026#34;, \u0026#34;tool_call_id\u0026#34;: tc.id, \u0026#34;content\u0026#34;: result}) else: print(\u0026#34;최종 답변:\u0026#34;, message.content) break 이 \u0026ldquo;생각 → 도구 호출 → 결과 관찰 → 다시 생각\u0026quot;의 루프는 OpenAI Operator와 Claude Computer Use 등 최고의 Agent가 사용하는 핵심 메커니즘입니다.\n대상 독자 # 독자층 가치 AI 엔지니어 지망생 Agent 엔지니어링 핵심 능력을 체계적으로 습득, 면접 문제는 대기업 실전 문제에서 직접 추출 제품 팀 로우코드 장으로 빠른 프로토타입 검증, 프레임워크 장으로 개발 팀과 효율적 협업 연구자/학자 Agentic RL과 평가 장은 연구 프로젝트의 시작점으로 충분한 깊이 인디 개발자/창업가 캡스톤 구조와 커뮤니티 프로젝트 라이브러리가 제품화에 영감과 참조 구현 제공 요약 #Hello-Agents는 오늘날 가장 포괄적이고 이해하기 쉬우며 커뮤니티 지원이 강력한 AI 에이전트 개발 학습 자원입니다. 대학 과정의 깊이, 부트캠프의 실용성, 오픈소스 프로젝트의 커뮤니티 활력, 그리고 무료 문서의 가격을 모두 갖추고 있습니다.\n에이전트 혁명은 곧 올 것이 아니라 — 이미 여기에 있습니다. Hello-Agents는 당신이 단순한 관찰자가 아닌 건설자가 되도록 보장합니다.\n💡 더 많은 AI 도구와 오픈소스 프로젝트를 원하시나요? 매주 선별된 추천을 위해 dibi8.com을 팔로우하세요.\n","date":"May 15, 2026","permalink":"https://dibi8.com/kr/resources/llm-frameworks/hello-agents-ai-agent-building-tutorial/","section":"AI 源码资源","summary":"","title":"Hello-Agents: Datawhale의 오픈소스 AI 에이전트 튜토리얼이 제로에서 프로덕션급 에이전트 구축을 돕는 방법"},{"content":"{\u0026lt;/* resource-info */\u0026gt;}\n문제: 대부분의 AI 에이전트는 당신을 잊어버립니다 #AI 어시스턴트에게 당신의 워크플로우, 코딩 스타일, 프로젝트 구조를 가르치는 데 몇 시간을 보냅니다. 그런 다음 새 세션을 시작하면 — 모든 것이 사라집니다. 에이전트는 매번 당신을 낯선 사람처럼 대합니다.\n이것이 오늘날 대부분의 AI 에이전트의 근본적인 한계입니다: 메모리가 없고, 학습이 없고, 성장이 없습니다. 설계상 상태를 유지하지 않으므로, 강력한 도구이지만 끔찍한 장기 파트너입니다.\nHermes Agent는 급진적인 접근 방식으로 이 문제를 해결합니다: 내장 학습 루프를 가진 유일한 에이전트입니다.\nHermes Agent란 무엇인가? #Hermes Agent는 Nous Research가 만든 오픈소스 AI 에이전트입니다 — Hermes 오픈소스 대규모 언어 모델 시리즈를 만든 바로 그 팀입니다. GitHub에서 136,579+ 스타와 20,960+ 포크를 보유하고 있으며, 현존하는 가장 인기 있는 AI 에이전트 프레임워크 중 하나입니다.\n프로젝트의 슬로건이 모든 것을 설명합니다: \u0026ldquo;당신과 함께 성장하는 에이전트.\u0026rdquo;\n다른 에이전트가 정적인 도구인 것과 달리, Hermes Agent는:\n경험에서 스킬을 생성합니다 — 당신의 워크플로우를 학습하고 재사용 가능한 스킬로 저장합니다 사용 중에 스킬을 개선합니다 — 피드백을 기반으로 능력을 정제합니다 세션 간에 지식을 유지합니다 — 당신이 누구인지, 무엇을 좋아하는지 기억합니다 당신에 대한 깊은 모델을 구축합니다 — 사용할수록 당신을 더 잘 이해합니다 핵심 기능 #1. 내장 학습 루프 #Hermes Agent의 핵심 혁신은 자기 개선 사이클입니다:\n경험 → 반성 → 스킬 생성 → 실습 → 개선 Hermes로 작업을 완료하면 다음을 수행합니다:\n분석 — 무엇이 효과적이었고 무엇이 아니었는지 추출 — 재사용 가능한 패턴 생성 — 접근 방식을 문서화하는 스킬 파일 테스트 — 유사한 작업에서 스킬 테스트 정제 — 결과를 기반으로 개선 시간이 지남에 따라 이것은 당신만의 개인 스킬 라이브러리를 만듭니다.\n2. 40+ 내장 도구 #Hermes Agent는 포괄적인 도구 세트와 함께 제공됩니다:\n도구 카테고리 예시 파일 작업 읽기, 쓰기, 검색, 차이 비교, 패치 터미널 명령 실행, 셸 세션, 백그라운드 작업 웹 브라우징, 스크래핑, 다운로드, API 호출 코드 구문 검사, 린트, 포맷팅, 테스트 Git 커밋, 브랜치, 차이, 로그, PR 리뷰 시스템 프로세스 관리, 파일 모니터링, 크론 작업 툴셋 시스템을 사용하면 필요한 도구만 활성화하여 토큰 사용량을 줄이고 집중력을 높일 수 있습니다.\n3. 스킬 시스템 (절차적 메모리) #스킬은 Hermes Agent의 비밀 무기입니다. 이들은 다음을 캡처하는 재사용 가능한 절차 파일입니다:\n트리거 조건 — 이 스킬을 사용할 시기 단계별 지침 — 무엇을 할 것인지 함정 — 피해야 할 일반적인 실수 검증 단계 — 성공을 확인하는 방법 스킬은 다음과 같은 방식으로 사용할 수 있습니다:\n자동 생성 — 성공적인 작업 완료에서 스킬 허브에서 다운로드 — 커뮤니티 기여 스킬 수동 작성 — 특정 워크플로우용 다른 사용자와 공유 4. 영구 메모리 #Hermes Agent는 두 가지 유형의 메모리를 유지합니다:\n사용자 프로필 메모리:\n선호하는 코딩 스타일 작업 중인 프로젝트 좋아하는 도구 커뮤니케이션 선호도 자주 저지르는 실수 (이를 잡아낼 수 있도록) 세션 메모리:\n현재 프로젝트 컨텍스트 최근 명령과 출력 편집 중인 파일 이 세션의 대화 이 메모리는 세션 간에 지속되므로 컴퓨터를 다시 시작해도 Hermes는 당신을 기억합니다.\n5. 메시징 게이트웨이 #Hermes Agent는 단순한 CLI 도구가 아닙니다 — 멀티플랫폼 메시징 봇입니다:\n플랫폼 설정 사용 사례 Telegram hermes gateway setup 모바일 AI 어시스턴트 Discord hermes gateway setup 팀 협업 Slack hermes gateway setup 직장 통합 WhatsApp hermes gateway setup 개인 어시스턴트 Signal hermes gateway setup 프라이버시 중심 Email hermes gateway setup 비동기 워크플로우 구성이 완료되면 이러한 플랫폼 중 하나에서 동일한 명령과 스킬을 사용하여 Hermes와 채팅할 수 있습니다.\n6. MCP 통합 #Hermes Agent는 **모델 컨텍스트 프로토콜(MCP)**을 지원하여 확장 기능을 위해 모든 MCP 서버에 연결할 수 있습니다:\n데이터베이스 서버 — SQL 데이터베이스 쿼리 파일 서버 — 원격 파일 시스템에 액세스 API 서버 — 모든 REST API와 상호 작용 사용자 정의 서버 — 자체 통합 구축 이를 통해 Hermes는 무한하게 확장 가능합니다 — MCP 서버를 구축할 수 있다면 Hermes는 사용할 수 있습니다.\n7. 크론 스케줄링 #Hermes Agent는 내장된 크론 시스템을 통해 예약된 작업을 실행할 수 있습니다:\n# 매일 오전 9시에 스킬 실행 hermes cron add --skill \u0026#34;daily-report\u0026#34; --schedule \u0026#34;0 9 * * *\u0026#34; # 매주 백업 실행 hermes cron add --skill \u0026#34;backup-database\u0026#34; --schedule \u0026#34;0 2 * * 0\u0026#34; # 모든 예약 작업 목록 hermes cron list 일정에 따라 실행되어야 하는 자동화 워크플로우에 적합합니다.\n8. 보안 기능 #Hermes Agent는 보안을 중요하게 생각합니다:\n명령 승인 — 위험한 명령은 명시적 확인이 필요합니다 DM 페어링 — 민감한 작업 전에 신원을 확인합니다 컨테이너 격리 — 신뢰할 수 없는 코드를 격리된 환경에서 실행 감사 로깅 — 모든 작업이 검토를 위해 기록됩니다 빠른 시작 #설치 ## 한 줄 설치 (Linux, macOS, WSL2) curl -fsSL https://raw.githubusercontent.com/NousResearch/hermes-agent/main/scripts/install.sh | bash # 또는 수동으로 클론 및 설정 git clone https://github.com/NousResearch/hermes-agent.git cd hermes-agent ./setup-hermes.sh 첫 대화 #source ~/.bashrc # 셸 다시 로드 hermes # 채팅 시작 공급자 구성 ## 선호하는 LLM 공급자 설정 hermes config set provider openai hermes config set model gpt-4o # 또는 로컬 모델 사용 hermes config set provider ollama hermes config set model llama3.1 유용한 명령 ## 새 대화 시작 /new # 즉석에서 모델 변경 /model anthropic:claude-3-5-sonnet # 개성 설정 /personality developer # 사용량 확인 /usage # 사용 가능한 스킬 찾아보기 /skills # 특정 스킬 사용 /hugo-blog-deploy # 토큰 절약을 위해 컨텍스트 압축 /compress 아키텍처 #Hermes Agent는 모듈식 아키텍처로 구축되었습니다:\nHermes Agent ├── CLI 인터페이스 (터미널 UI) ├── 메시징 게이트웨이 (Telegram, Discord 등) ├── 에이전트 코어 (추론 엔진) ├── 스킬 시스템 (절차적 메모리) ├── 메모리 저장소 (영구 저장) ├── 툴셋 관리자 (40+ 도구) ├── MCP 클라이언트 (외부 통합) ├── 크론 스케줄러 (자동화 작업) └── 보안 계층 (승인, 격리) 전체 시스템은 Python (2800만+ 라인)으로 작성되었으며, 웹 인터페이스에는 TypeScript 구성 요소가 사용됩니다.\n사용 사례 #개발자용 # 코드 리뷰 어시스턴트 — Hermes가 코드베이스를 학습하고 PR을 검토합니다 DevOps 자동화 — 인프라 배포, 모니터링 및 문제 해결 문서 작성기 — 코드 주석에서 문서 자동 생성 버그 헌터 — 과거 버그를 유발한 패턴 검색 팀용 # 공유 스킬 라이브러리 — 팀 전체의 모범 사례를 재사용 가능한 스킬로 온보딩 가속기 — 신규 팀원이 팀 지식에 즉시 액세스 24/7 운영 — 크론 작업이 일상적인 유지 관리를 처리합니다 멀티플랫폼 액세스 — Slack, Discord 또는 Telegram에서 Hermes와 채팅 파워 유저용 # 개인 지식 기반 — Hermes가 가르치는 모든 것을 기억합니다 워크플로우 자동화 — 복잡한 다단계 작업이 하나의 명령이 됩니다 크로스 플랫폼 어시스턴트 — 데스크톱, 모바일 및 웹에서 동일한 어시스턴트 사용자 정의 통합 — 특정 도구용 MCP 서버 구축 성능 비교 # 기능 Hermes Agent Claude Code Cursor GitHub Copilot 자기 학습 ✅ 예 ❌ 아니오 ❌ 아니오 ❌ 아니오 영구 메모리 ✅ 예 ❌ 아니오 ❌ 아니오 ❌ 아니오 스킬 시스템 ✅ 예 ❌ 아니오 ❌ 아니오 ❌ 아니오 멀티플랫폼 ✅ 6개 플랫폼 ❌ CLI 전용 ❌ 데스크톱 전용 ❌ IDE 전용 오픈소스 ✅ 예 ❌ 아니오 ❌ 아니오 ❌ 아니오 크론 스케줄링 ✅ 예 ❌ 아니오 ❌ 아니오 ❌ 아니오 MCP 지원 ✅ 예 ❌ 아니오 ❌ 아니오 ❌ 아니오 무료 계층 ✅ 자체 호스팅 💰 API 비용 💰 구독 💰 구독 한계 # 학습 곡선 — 스킬 시스템은 사전 투자가 필요합니다 로컬 설정 — 자체 호스팅에는 기술 지식이 필요합니다 리소스 사용 — 영구 메모리는 시간이 지남에 따라 저장 공간을 소비합니다 공급자 비용 — LLM API 호출은 여전히 비용이 듭니다 (로컬 모델을 사용하지 않는 한) 결론 #Hermes Agent는 AI 어시스턴트에 대해 생각하는 방식의 근본적인 전환을 대표합니다. AI를 일회성 도구로 취급하는 대신, Hermes는 당신과 함께 성장하는 장기 파트너로 취급합니다.\n자기 개선 루프, 영구 메모리 및 스킬 시스템은 복리 효과를 만듭니다: Hermes를 더 많이 사용할수록 더 가치 있게 됩니다. 이것은 시간이 지남에 따라 감소하는 수익을 제공하는 기존 AI 도구와 정반대입니다.\n매번 세션마다 AI 어시스턴트에게 같은 것을 다시 가르치는 것에 지쳤다면, Hermes Agent를 탐색해 볼 가치가 있습니다.\nGitHub: NousResearch/hermes-agent\n문서: hermes-agent.nousresearch.com/docs\n스타: 136,579+ | 포크: 20,960+ | 라이선스: 오픈소스\nHermes Agent를 사용해 보셨나요? 자기 개선하는 AI 에이전트에 대한 경험이 있으신가요? 댓글에서 생각을 공유해 주세요.\n관련 기사 # Agent Reach: AI 에이전트에 인터넷 슈퍼파워 부여하기 Free Claude Code: Claude Code CLI를 무료로 사용할 수 있는 오픈소스 프록시 도구 OpenClaw 42개 실제 사용 사례: AI 에이전트가 이미 우리의 삶을 이렇게 바꾸고 있습니다 ","date":"May 15, 2026","permalink":"https://dibi8.com/kr/resources/llm-frameworks/hermes-agent-self-improving-ai-agent/","section":"AI 源码资源","summary":"","title":"Hermes Agent：자기 진화하는 AI 에이전트, 사용할수록 당신을 더 잘 이해합니다"},{"content":"{\u0026lt;/* resource-info */\u0026gt;}\nHowToCook란? #HowToCook（프로그래머 요리 가이드）는 프로그래머 Anduin2017이 만든 오픈소스 레시피 프로젝트입니다. 297개 레시피가 프로그래머가 익숙한 정확성과 명확성으로 작성되었습니다.\n프로젝트 철학: 레시피는 코드처럼 명확해야 합니다. \u0026ldquo;소금 조금\u0026quot;이나 \u0026ldquo;노랗게 볶을 때까지\u0026rdquo; 같은 모호한 설명 없이, 모든 레시피는 정확한 계량, 정확한 시간, 단계별 프로세스를 제공합니다.\nGitHub: https://github.com/Anduin2017/HowToCook\nStars: 70K+\n기여자: 200+\n라이선스: Unlicense\n왜 프로그래머가 이것이 필요한가? #기존 레시피의 문제 # 문제 예시 HowToCook 해결책 모호한 양 \u0026ldquo;소금 조금\u0026rdquo; \u0026ldquo;소금 3g（1/2 티스푼）\u0026rdquo; 애매한 시간 \u0026ldquo;노랗게 볶을 때까지\u0026rdquo; \u0026ldquo;한 면당 90초 볶기\u0026rdquo; 누락된 단계 중간에 새로운 재료 등장 완전한 재료 목록 먼저 난이도 없음 모든 요리가 똑같이 어려워 보임 1-5성 난이도 시스템 장비 목록 없음 모든 것이 있다고 가정 필요한 도구 먼저 나열 개발자를 위한 특성 # 구조화된 형식: 매개변수가 있는 함수처럼 난이도 등급: 1-5성（라면에서 베이징 덕까지） 장비 요구사항: 재료 전에 나열 정확한 계량: g, ml, \u0026ldquo;한 꼬집\u0026rdquo; 아님 시간 추적: 준비 시간, 조리 시간, 총 시간 에러 처리: 일반적인 실수와 피하는 방법 레시피 분류 #난이도별 # 성급 수량 예시 ⭐ 45 토마토 계란볶음, 라면 업그레이드 ⭐⭐ 78 궁보계정, 홍소육 ⭐⭐⭐ 89 탕초排骨, 마파두부 ⭐⭐⭐⭐ 56 베이징 덕, 훠궈 베이스 ⭐⭐⭐⭐⭐ 29 상어 지느러미 수프, 전복 죽 종류별 # 채소: 85道（볶음, 조림, 찜） 고기: 92道（돼지, 소, 닭, 양） 해산물: 34道（생선, 새우, 게） 국물: 46道（빠른 국, 느린 끓임） 아침: 23道（죽, 팬케이크, 샌드위치） 디저트: 17道（케이크, 푸딩, 단팥죽） 샘플 레시피: 토마토 계란볶음 ## 토마토 계란볶음 ⭐ ## 재료 - 계란 2개（100g） - 토마토 2개（300g） - 소금 3g（1/2 티스푼） - 설탕 5g（1 티스푼） - 식용유 10ml - 파 2g（선택） ## 조리도구 - 프라이팬 - 뒤집개 - 볼 ## 시간 - 준비: 5분 - 조리: 5분 - 총계: 10분 ## 단계 1. 계란을 볼에 깨서 소금 1g 넣고 균일하게 휘핑 2. 토마토를 씻어 2cm 덩이로 자르기 3. 중불로 프라이팬을 180°C까지 가열 4. 기름을 두르고 10초 대기 5. 계란을 부어 30초간 계속 저으며 볶기 6. 계란이 80% 익었을 때（약간 촉촉한 상태）꺼내기 7. 같은 팬에 토마토 넣고 2분 볶기 8. 남은 소금과 설탕 추가 9. 계란을 다시 팬에 넣고 20초 섞기 10. 즉시 서빙 ## 팁 - 계란을 너무 오래 볶지 마세요 — 꺼낸 후에도 익어갑니다 - 토마토가 너무 신맛이 나면 설탕 1g 더 추가 - 더 부드러운 식감을 원하면 계란에 우유 10ml 추가 커뮤니티와 기여 #기여 방법 # Fork 저장소 복사 템플릿 레시피 작성 형식에 맞는 레시피 제출 Pull Request 기여 통계 # 200+ 기여자 전 세계에서 297개 레시피 지속적으로 증가 다국어 지원: 중국어, 영어, 일본어 Docker 지원: 한 줄 명령으로 로컬 실행 웹 배포 ## 로컬 배포 docker pull ghcr.io/anduin2017/how-to-cook:latest docker run -d -p 5000:5000 ghcr.io/anduin2017/how-to-cook:latest # http://localhost:5000 접속 NPM 패키지 #Node.js 패키지로 설치:\nnpm install how-to-cook 프로그래밍 방식 사용:\nconst recipes = require(\u0026#39;how-to-cook\u0026#39;); // 레시피 검색 const tomatoRecipes = recipes.search(\u0026#39;토마토\u0026#39;); // 난이도로 필터링 const easyRecipes = recipes.filterByStars(1); // 랜덤 가져오기 const dinner = recipes.random(); 학습 경로 #초보자（1-2주） # 주방 준비 기본 칼 기술 1성 레시피 밥 짓기 중급자（3-4주） # 2-3성 레시피 육류 처리 볶음 기술 국물 기초 고급자（5주+） # 4-5성 레시피 다중 요리 조율 맛 균형 플레이팅 왜 이 프로젝트가 주목받아야 하는가 #HowToCook은 다음의 완벽한 예시입니다:\n커뮤니티 기반 콘텐츠: 200+ 기여자가 진정한 콘텐츠를 창조 구조화된 데이터: 레시피는 schema.org 형식을 따름 롱테일 키워드: \u0026ldquo;프로그래머 요리 가이드\u0026rdquo;, \u0026ldquo;how to cook for developers\u0026rdquo; 에버그린 콘텐츠: 요리는 결코 시대에 뒤떨어지지 않음 다국어: 중국어, 영어, 일본어 버전 관련 기사 # Free Claude Code 오픈소스 AI 코딩 에이전트 — 또 다른 개발자 오픈소스 도구 Pixelle-Video AI 쇼트 비디오 생성기 — AI 콘텐츠 제작 도구 OpenClaw 42개 사용 사례 — AI 에이전트 일상 작업 면책 조항: 본 문서는 오픈소스 프로젝트를 소개합니다. 모든 레시피 콘텐츠는 HowToCook 커뮤니티에 속합니다. 요리 시 식품 안전 지침을 따르세요.\n","date":"May 15, 2026","permalink":"https://dibi8.com/kr/resources/ai-tools/howtocook-programmer-open-source-cookbook/","section":"AI 源码资源","summary":"","title":"HowToCook 프로그래머 요리 가이드: 코딩을 더 향기롭게 하는 297개 오픈소스 레시피"},{"content":"{\u0026lt;/* resource-info */\u0026gt;}\n문제: 구직은 풀타임 직업입니다 #이력서 100통을 제출하고, 면접 2개를 받고, Offer 0개. 이는 당신의 문제가 아니라 시스템의 문제입니다.\n각 채용 사이트는 섬입니다:\nLinkedIn: 고급 검색은 유료 Indeed: 중복 포지션, 만료된 정보 Glassdoor: 급여 데이터 지연 회사 홈페이지: 각각 다시 작성해야 함 채용 이메일: 99% 읽음 확인 없음 더 고통스러운 것은: 제출할 때마다 이력서를 다시 쓰고, 자기소개서를 다시 쓰고, 회사를 다시 연구해야 합니다.\n해결책: JustHireMe #JustHireMe는 오픈소스 AI 구직 인텔리전스 워크벤치입니다. 로컬 우선, 프라이버시 안전, 원클릭 자동 제출.\n핵심 철학: AI가 반복 작업을 하고, 당신은 의사결정만 합니다.\n핵심 기능 #1. 스마트 포지션 크롤링 #여러 플랫폼에서 자동으로 포지션을 크롤링합니다:\nLinkedIn, Indeed, Glassdoor AngelList, Hacker News 회사 채용 페이지 원격 근무 전용 구역 중복 제거 알고리즘: 동일한 포지션이 다른 플랫폼에 나타나면 자동으로 병합합니다.\n2. AI 매칭도 평가 #키워드 매칭이 아닌 진정한 의미 이해:\n당신의 기술 vs 포지션 요구사항 당신의 경험 vs 포지션 레벨 당신의 급여 기대치 vs 예산 범위 당신의 커리어 목표 vs 회사 방향 점수 0-100, 80점 이상의 포지션만 봅니다.\n3. 이력서 자동 맞춤화 #각 포지션에 따라 이력서를 재작성합니다:\n관련 기술 강조 프로젝트 설명 조정 키워드 매칭 레이아웃 포맷 최적화 템플릿 채우기가 아닌, 진정한 AI 재작성입니다.\n4. 자기소개서 생성 #각 자기소개서는 유니크합니다:\n회사 배경 연구 구체적인 프로젝트 인용 관련 경험 제시 진정한 관심 표현 HR은 템플릿과 진심 어린 글을 구분할 수 있습니다.\n5. 로컬 CRM 관리 #모든 데이터는 로컬에 저장됩니다:\nSQLite 데이터베이스 포지션 이력 기록 제출 상태 추적 면접 일정 관리 프라이버시 우선: 당신의 데이터는 클라우드에 업로드되지 않습니다.\n기술 아키텍처 # 레이어 기술 데스크톱 Tauri 2 + React 19 + TypeScript 백엔드 Python 3.13 + FastAPI + WebSockets 데이터베이스 SQLite + Kuzu 그래프 DB + LanceDB 벡터 DB AI 모델 로컬 LLM + 의미 검색 자동화 Playwright 브라우저 자동화 로컬 우선: 모든 AI 계산은 로컬에서 완료되며, API Key가 필요 없습니다.\n설치 및 사용 ## 저장소 클론 git clone https://github.com/vasu-devs/JustHireMe.git cd JustHireMe # 프론트엔드 의존성 설치 npm install # 개발 서버 시작 npm run dev # 데스크톱 앱 시작 npm run tauri dev 사용 프로세스 # 프로필 설정: 이력서 업로드, 기술과 목표 입력 크롤링 소스 구성: 모니터링할 채용 플랫폼 선택 크롤링 실행: AI가 최신 포지션을 자동으로 크롤링 매칭 보기: 매칭도순 정렬, 고점수 포지션 필터링 원클릭 지원: AI가 맞춤형 자료 생성, 자동 제출 진행 상황 추적: CRM으로 모든 지원 상태 관리 왜 오픈소스인가? #구직은 플랫폼에 의해 독점되어서는 안 됩니다:\n데이터 소유권: 당신의 이력서, 당신의 데이터 알고리즘 투명성: AI가 어떻게 평가하는지 알 수 있음 무료 사용: 구독료 없음, 숨겨진 비용 없음 커뮤니티 주도: 모두가 함께 개선 누구에게 적합한가? # 구직자: 더 많이, 더 잘, 더 빠르게 지원하고 싶은 사람 프리랜서: 계약과 프로젝트를 찾는 사람 전환 희망자: 맞춤형 이력서가 필요한 사람 신입: 어디서 시작해야 할지 모르는 사람 시니어: 고품질 기회를 수동적으로 받고 싶은 사람 관련 기사 # Agent Reach：AI 에이전트를 인터넷 마스터로 만드는 원클릭 솔루션 Free Claude Code：비용 부담 없이 Claude Code 사용하기 OpenClaw 42개 실제 사용 사례：AI 에이전트가 이미 이렇게 우리의 삶을 바꾸고 있습니다 프로젝트 주소: github.com/vasu-devs/JustHireMe\nStars: 471 ⭐ | Forks: 91 | 언어: Python 47.3%, TypeScript 27.5%\n","date":"May 15, 2026","permalink":"https://dibi8.com/kr/resources/ai-tools/justhireme-ai-job-search-workbench/","section":"AI 源码资源","summary":"","title":"JustHireMe：AI가 당신의 취업을 자동화합니다"},{"content":"{\u0026lt;/* resource-info */\u0026gt;}\nLadybird란? #Ladybird는 진정한 독립 웹 브라우저입니다 — Chromium, Firefox 또는 기존 브라우저 엔진에 의존하지 않고 완전히 처음부터 구축되었습니다. Andreas Kling(SerenityOS의 창시자)이 개발했으며, 현대 시대에 완전히 새로운 웹 엔진을 만드는 대담한 시도를 대표합니다.\nGitHub: https://github.com/LadybirdBrowser/ladybird Stars: 62,881+ 언어: C++ 라이선스: BSD-2-Clause\n브라우저 독점 문제 #현재 상황 (2026) # 브라우저 엔진 시장 점유율 기업 통제 Chrome Blink (Chromium) 65% Google Edge Blink (Chromium) 5% Microsoft Opera Blink (Chromium) 2% 중국 컨소시엄 Brave Blink (Chromium) 1% Brave Software Safari WebKit 18% Apple Firefox Gecko 3% Mozilla 문제: 73%의 브라우저가 Google의 Chromium 엔진을 사용합니다. Google이 웹을 통제합니다.\n왜 독립성이 중요한가 # 웹 표준: Google은 자신의 서비스에 유리한 표준을 추진할 수 있습니다 개인정보 보호: Chromium은 Google에 데이터를 전송합니다 혁신: 독점은 경쟁을 억제합니다 보안: 단일 엔진 = 단일 실패 지점 자유: 기업 이익 vs 사용자 이익 Ladybird의 접근 방식 #처음부터 구축 #Ladybird는 Chromium이나 Firefox를 포크하지 않습니다. 모든 것을 새로 구축합니다:\n웹 엔진: \u0026ldquo;LibWeb\u0026quot;이라는 새로운 렌더링 엔진 JavaScript 엔진: 커스텀 JS 엔진 \u0026ldquo;LibJS\u0026rdquo; 네트워크 스택: 독립적인 네트워킹 그래픽: 커스텀 그래픽 렌더링 UI: 네이티브 UI 툴킷 아키텍처 #사용자 요청 ↓ 네트워크 레이어 (LibHTTP) ↓ HTML 파서 (LibWeb) ↓ DOM 트리 → CSS 파서 → 스타일 계산 ↓ 레이아웃 엔진 → 렌더링 → 디스플레이 주요 기능 #1. 진정한 독립성 # Chromium 코드 없음 Google 서비스 없음 원격 측정 없음 강제 업데이트 없음 2. 개인정보 보호 우선 # 기본적으로 추적 없음 데이터 수집 없음 모든 것이 오픈소스 커뮤니티 주도 3. 웹 표준 준수 # HTML5/CSS3 지원 JavaScript ES2026 WebAssembly (계획됨) 점진적 향상 4. 성능 # 경량 C++ 코어 최소 메모리 사용량 빠른 시작 시간 효율적인 렌더링 개발 상태 #작동 중 (2026) # 기능 상태 참고 기본 HTML/CSS ✅ 대부분의 사이트 렌더링 JavaScript ✅ ES2026 지원 양식 ✅ 입력, 버튼 등 이미지 ✅ PNG, JPEG, GIF 표 ✅ 복잡한 레이아웃 Flexbox ✅ 현대 레이아웃 Grid 🔄 부분 지원 WebGL ❌ 계획됨 비디오 ❌ 계획됨 WebAssembly ❌ 계획됨 일일 개발 통계 # 오늘 87 스타 (트렌딩!) 2,995 포크 100+ 기여자 일일 커밋 Ladybird 사용 방법 #소스에서 빌드 ## 저장소 클론 git clone https://github.com/LadybirdBrowser/ladybird.git cd ladybird # 의존성 설치 (Ubuntu/Debian) sudo apt install build-essential cmake ninja-build # 빌드 mkdir build \u0026amp;\u0026amp; cd build cmake .. -GNinja ninja # 실행 ./bin/Ladybird Docker (실험적) #docker pull ladybird/browser docker run -it ladybird/browser 왜 Ladybird가 중요한가 #사용자를 위해 # 진정한 개인정보 보호: 기업 추적 없음 투명성: 모든 코드가 오픈소스 선택: Chromium 독점의 대안 혁신: 웹 렌더링의 새로운 접근 방식 개발자를 위해 # 깨끗한 코드베이스: 레거시 Chromium 부풀림 없음 현대 C++: 잘 구조화되고 읽기 쉬움 학습 자료: 브라우저 내부 구조 이해 기여: 웹의 미래 형성 웹을 위해 # 다양성: 여러 엔진 = 더 건강한 웹 표준: 진정한 표준 준수 혁신: 경쟁이 발전을 주도 탄력성: 단일 실패 지점 없음 다른 브라우저와 비교 #Ladybird vs Chrome # 측면 Ladybird Chrome 엔진 LibWeb (새로움) Blink (Chromium) 크기 ~50MB ~200MB 추적 없음 광범위 업데이트 커뮤니티 Google 강제 소스 완전히 오픈 부분적으로 오픈 Ladybird vs Firefox # 측면 Ladybird Firefox 엔진 LibWeb (새로움) Gecko (레거시) 연령 2년 20+년 현대성 새로운 시작 기술 부채 자금 커뮤니티 Mozilla Corp Ladybird 뒤에 있는 팀 #Andreas Kling # SerenityOS의 창시자 전 Apple Safari 엔지니어 소프트웨어 단순성 옹호자 YouTube 교육자 (100K+ 구독자) 기여자 # 100+ 오픈소스 기여자 글로벌 커뮤니티 자원봉사자 주도 투명한 거버넌스 관련 기사 # Scanners-Box: 200+ 사이버보안 도구 — 보안 도구 모음 Free Claude Code: 오픈소스 AI 코딩 — 개발자 도구 Polymarket Agents: AI 트레이딩 봇 — 금융의 AI 면책 조항: Ladybird는 활발히 개발 중이며 아직 일상 사용을 위한 준비가 되지 않았습니다. 본 문서는 브라우저 독점에 맞서는 중요한 오픈소스 프로젝트를 소개합니다.\n","date":"May 15, 2026","permalink":"https://dibi8.com/kr/resources/ai-tools/ladybird-independent-web-browser/","section":"AI 源码资源","summary":"","title":"Ladybird: 진정한 독립 웹 브라우저 — 브라우저 독립의 새로운 시대"},{"content":"{\u0026lt;/* resource-info */\u0026gt;}\n대부분의 AI 어시스턴트는 \u0026lsquo;대화 우선\u0026rsquo; 방식입니다. 즉, 사전 학습된 데이터를 바탕으로 빠른 답변을 제공하는 데 중점을 둡니다. 하지만 웹, 학술 논문, 로컬 문서를 샅샅이 뒤져 심층적인 보고서를 작성하는 \u0026lsquo;연구 우선(Research-first)\u0026rsquo; 접근 방식이 필요하다면 어떨까요? 그리고 이 모든 과정을 100% 개인정보 보호 하에 수행하고 싶다면요?\n그 해답이 바로 **Local Deep Research(LDR)**입니다.\n🚀 Local Deep Research란 무엇인가요? #LDR은 체계적이고 반복적인 연구를 수행하도록 설계된 강력한 오픈 소스 AI 리서치 어시스턴트입니다. 환각 현상을 일으키거나 수박 겉핥기식 정보만 제공할 수 있는 일반적인 LLM과 달리, LDR은 엄격한 프로세스를 따릅니다.\n쿼리 분해(Query Decomposition): 복잡한 질문을 집중적인 하위 쿼리로 나눕니다. 병렬 검색(Parallel Search): 웹(SearXNG), 학술 데이터베이스(arXiv, PubMed), 로컬 파일을 동시에 검색합니다. 반복적 합성(Iterative Synthesis): 발견된 내용을 분석하고, 지식의 공백을 식별하며, 지식을 \u0026lsquo;심화\u0026rsquo;하기 위한 후속 검색을 수행합니다. 구조화된 보고(Structured Reporting): 적절한 인용이 포함된 포괄적인 보고서를 생성합니다. 🎯 개발자에게 왜 게임 체인저인가요? #차세대 AI 도구를 구축하는 개발자들에게 LDR은 세 가지 결정적인 이점을 제공합니다.\n1. 설계부터 고려된 프라이버시 (Privacy by Design) #Ollama와 통합함으로써 LDR은 로컬 하드웨어에서 완전히 실행될 수 있습니다. 귀하의 연구 쿼리, 독점 문서 및 최종 보고서는 절대 귀하의 컴퓨터를 떠나지 않습니다. 이는 기업용 또는 민감한 기술 연구에 있어 타협할 수 없는 부분입니다.\n2. 다중 소스 인텔리전스 #LDR은 단순히 \u0026lsquo;구글링\u0026rsquo;만 하지 않습니다. 쿼리 유형에 따라 지능적으로 경로를 설정할 수 있습니다.\n과학적 질문은 학술 엔진으로 전송됩니다. 코드 관련 질문은 GitHub 및 기술 소스로 전송됩니다. 일반 정보는 위키백과 및 웹 검색으로 전송됩니다. 3. 높은 신뢰도의 인용 #AI의 가장 큰 문제점 중 하나는 신뢰성입니다. LDR은 모든 주장에 대해 참고 문헌을 제공하므로 소스 자료를 즉시 확인할 수 있습니다.\n🛠️ 멘토 추천: 로컬 우선 스택 설정 #LDR을 최대한 활용하려면 다음 로컬 우선 스택을 권장합니다.\nLLM 엔진: Ollama (Llama 3 또는 Mistral 실행). 검색 엔진: SearXNG (프라이버시를 존중하는 메타 검색 엔진). 환경: Docker (쉬운 배포를 위해). 빠른 배포 (Docker) ## SearXNG 실행 docker run -d -p 8080:8080 --name searxng searxng/searxng # Local Deep Research 실행 docker run -d -p 5000:5000 --name ldr localdeepresearch/local-deep-research 💡 멘토의 팁: \u0026lsquo;심화(Deepening)\u0026rsquo; 전략 #LDR을 사용할 때 단순히 질문 하나만 던지지 마세요. **\u0026lsquo;상세 연구 모드(Detailed Research Mode)\u0026rsquo;**를 활용하세요. 에이전트가 여러 차례의 연구 사이클을 수행할 수 있게 해줍니다. 첫 번째 사이클에서 지식의 지도를 그리고, 두 번째와 세 번째 사이클에서 앞서 발견한 미묘한 차이점들을 파고듭니다. 이것이 단순한 정보 나열이 아닌 실제 **통찰력(Insight)**이 담긴 보고서를 얻는 방법입니다.\n결론 #Local Deep Research는 단순한 도구 그 이상입니다. AI 시대에 우리가 정보와 상호작용하는 방식의 패러다임 변화를 의미합니다. 얕은 AI 답변에 지치고 데이터 프라이버시가 걱정된다면, 이제 리서치 환경을 로컬로 옮겨야 할 때입니다.\n관련 리소스 # 파이썬 컨텍스트 매니저 마스터하기 — 로컬 AI 스크립트를 깔끔하게 정리하세요. 디비8 머니메이킹 정보 허브: 최고의 AI 인프라 — 로컬 AI를 위한 최상의 하드웨어를 확인하세요. ","date":"May 15, 2026","permalink":"https://dibi8.com/kr/resources/llm-frameworks/local-deep-research-local-first-ai-deep-research-tool/","section":"AI 源码资源","summary":"","title":"Local Deep Research: 궁극의 로컬 우선 AI 딥 리서치 도구"},{"content":"{\u0026lt;/* resource-info */\u0026gt;}\n벤치마크 비교: MemPalace vs Mem0 vs Mastra #AI 메모리 시스템을 평가할 때 성능과 리소스 소비는 핵심입니다. LongMemEval 벤치마크에서 MemPalace가 경쟁자들을 어떻게 압살하는지 확인하십시오:\n주요 기능/지표 MemPalace Mem0 Mastra Hindsight 컨텍스트 리콜(Recall) 96.6% 89.2% 85.5% 91.0% API 호출 요구사항 없음 (완전 로컬) OpenAI API (유료) Anthropic API 없음 스토리지 아키텍처 원문 보존 + 벡터 검색 벡터 단일 검색 그래프 + 벡터 벡터 단일 검색 Claude Code 지원 네이티브 지원 (MCP) 수동 통합 필요 지원됨 미지원 AI가 당신을 기억하게 만드는 방법 — MemPalace 오픈소스 메모리 시스템 완벽 가이드 #AI 어시스턴트와 대화할 때 매번 \u0026ldquo;내 이름이 뭐라고 했지?\u0026ldquo;라고 묻는 경험, 다들 한 번쯤 해보셨을 겁니다. 매 세션이 처음부터 시작되는 AI는 사실상 \u0026ldquo;기억력 제로\u0026quot;의 존재입니다. 이런 문제를 해결한 것이 바로 MemPalace — GitHub에서 51,745개의 Star를 받은, 가장 검증된 오픈소스 AI 메모리 시스템입니다.\n\u0026ldquo;The best-benchmarked open-source AI memory system. And it\u0026rsquo;s free.\u0026rdquo; — MemPalace GitHub\n이 글에서는 MemPalace가 어떻게 AI에게 장기 기억을 부여하는지, 그리고 여러분의 프로젝트에 어떻게 적용하는지 코드 중심으로 설명합니다.\n왜 AI에게 메모리가 필요한가? #현대 LLM(Large Language Model)의 가장 큰 한계는 상태 비저장(stateless) 설계입니다. 각 API 호출은 독립적이며, 이전 대화 맥락을 전달하지 않으면 AI는 전혀 다른 사람처럼 행동합니다.\n이로 인해 발생하는 문제들:\n사용자 취향 반복 설명: \u0026ldquo;나는 간결한 답변을 선호해\u0026quot;를 매번 입력 장기 프로젝트 맥락 상실: 3일 전에 기획한 내용을 AI가 기억 못 함 개인화 실패: 사용자별 맞춤 응답 불가능 MemPalace는 이 문제를 벡터 기반 의미 검색 + 계층적 메모리 관리로 해결합니다.\nMemPalace의 핵심 아키텍처 #MemPalace는 세 가지 메모리 계층으로 구성됩니다:\n계층 역할 저장 위치 Working Memory 현재 세션의 단기 대화 맥락 인메모리 / Redis Short-term Memory 최근 N턴의 대요약 SQLite / PostgreSQL Long-term Memory 사용자 취향, 사실, 중요 정보 벡터 DB (Chroma, Qdrant, Weaviate) 메모리 흐름도 #User Input → Working Memory (현재 대화) ↓ [의미 분석 + 중요도 평가] ↓ 중요도 높음 → Long-term Memory (벡터 DB 저장) 중요도 중간 → Short-term Memory (요약 저장) 중요도 낮음 → Working Memory (세션 종료 시 폐기) 설치 및 기본 사용법 #1. 설치 #pip install mempalace 2. 기본 설정 #from mempalace import MemoryPalace, ChromaBackend # 벡터 DB 백엔드 설정 (Chroma, Qdrant, Weaviate 지원) backend = ChromaBackend( collection_name=\u0026#34;user_memories\u0026#34;, persist_directory=\u0026#34;./memory_store\u0026#34; ) # 메모리 시스템 초기화 memory = MemoryPalace( backend=backend, user_id=\u0026#34;user_12345\u0026#34;, # 사용자별 격리 max_working_tokens=4000, # Working Memory 최대 토큰 summary_threshold=10 # 10턴 후 자동 요약 ) 3. 대화 중 메모리 저장 ## 사용자 정보 저장 (자동으로 벡터 임베딩되어 Long-term Memory에 저장) memory.remember( content=\u0026#34;사용자는 Python과 React를 주로 사용하며, 코드 예제를 포함한 상세한 설명을 선호함\u0026#34;, category=\u0026#34;preference\u0026#34;, # 카테고리 분류 importance=0.9 # 중요도 0~1 ) # 사실 저장 memory.remember( content=\u0026#34;사용자의 회사는 \u0026#39;디비에이트\u0026#39;이며 SaaS 분야에 종사함\u0026#34;, category=\u0026#34;fact\u0026#34;, importance=0.85 ) 4. 대화 시 메모리 검색 (자동 RAG) ## 현재 질문과 관련된 과거 메모리를 자동 검색 relevant_memories = memory.recall( query=\u0026#34;프로젝트 기술 스택 추천해줘\u0026#34;, top_k=5, # 상위 5개 관련 메모리 min_relevance=0.75 # 유사도 임계값 ) # 검색된 메모리를 프롬프트에 주입 context = memory.build_context( current_message=\u0026#34;새 프로젝트 시작하려는데 뭐가 좋을까?\u0026#34;, memories=relevant_memories ) print(context) # 출력 예시: # [과거 기억] # - 사용자는 Python과 React를 주로 사용함 # - 사용자의 회사는 \u0026#39;디비에이트\u0026#39;이며 SaaS 분야에 종사함 # [현재 대화] # 사용자: 새 프로젝트 시작하려는데 뭐가 좋을까? 5. LLM 통합 예시 (OpenAI) #from openai import OpenAI client = OpenAI() def chat_with_memory(user_message: str) -\u0026gt; str: # 1. 관련 메모리 검색 memories = memory.recall(user_message, top_k=5) # 2. 컨텍스트 구성 system_prompt = f\u0026#34;\u0026#34;\u0026#34;당신은 사용자의 개인 AI 어시스턴트입니다. 다음은 사용자에 대해 알고 있는 정보입니다: {memory.format_memories(memories)} 이 정보를 참고하여 개인화된 답변을 제공하세요.\u0026#34;\u0026#34;\u0026#34; # 3. LLM 호출 response = client.chat.completions.create( model=\u0026#34;gpt-4o\u0026#34;, messages=[ {\u0026#34;role\u0026#34;: \u0026#34;system\u0026#34;, \u0026#34;content\u0026#34;: system_prompt}, {\u0026#34;role\u0026#34;: \u0026#34;user\u0026#34;, \u0026#34;content\u0026#34;: user_message} ] ) # 4. AI 응답도 메모리에 저장 (선택) memory.remember( content=f\u0026#34;AI: {response.choices[0].message.content}\u0026#34;, category=\u0026#34;conversation\u0026#34;, importance=0.5 ) return response.choices[0].message.content # 사용 reply = chat_with_memory(\u0026#34;내가 좋아하는 기술 스택 기억나?\u0026#34;) print(reply) # → \u0026#34;네! Python과 React를 주로 사용하시는 것으로 기억합니다. # SaaS 프로젝트에 적합한 조합이에요.\u0026#34; 고급 기능: 자동 요약 \u0026amp; 망각 #MemPalace는 인간의 기억 메커니즘을 모방한 자동 요약과 망각 기능을 제공합니다.\n# 자동 요약 설정 memory = MemoryPalace( backend=backend, auto_summarize=True, summary_model=\u0026#34;gpt-4o-mini\u0026#34;, # 요약용 경량 모델 compression_ratio=0.3 # 원본의 30% 길이로 압축 ) # 망각 곡선 설정 (중요도에 따른 보존 기간) memory.set_forgetting_curve( high_importance_ttl_days=365, # 중요: 1년 medium_importance_ttl_days=30, # 보통: 30일 low_importance_ttl_days=7 # 낮음: 7일 ) MemPalace vs 다른 메모리 솔루션 # 기능 MemPalace LangChain Memory 단순 DB 저장 의미 기반 검색 ✅ 벡터 임베딩 ⚠️ 제한적 ❌ 키워드만 계층적 메모리 ✅ 3계층 ⚠️ 2계층 ❌ 단일 자동 요약/망각 ✅ 내장 ❌ 수동 구현 필요 ❌ 없음 멀티 사용자 ✅ 기본 지원 ⚠️ 추가 설정 ✅ 가능 무료/오픈소스 ✅ 완전 무료 ✅ 무료 - 벤치마크 검증 ✅ 공개됨 ❌ 없음 - 실제 적용 사례 #1. 고객 지원 챗봇 # 이전 문의 내용 기억 → \u0026ldquo;지난번 배송 문제, 해결되셨나요?\u0026rdquo; 제품 취향 학습 → 관련 제품 자동 추천 2. 코딩 어시스턴트 # 프로젝트 구조 기억 → \u0026ldquo;utils.py에 추가하시죠\u0026rdquo; 코드 스타일 학습 → 사용자 스타일에 맞춘 코드 생성 3. 교육/코칭 AI # 학습 진도 추적 → \u0026ldquo;지난번 못 푼 미분 방정식, 다시 도전해볼까요?\u0026rdquo; 약점 분석 → 취약 영역 집중 복습 시작하기 ## 저장소 클론 git clone https://github.com/MemPalace/mempalace.git # 예제 실행 cd mempalace/examples python basic_chatbot.py # 문서 확인 open https://mempalace.github.io/docs 결론 #MemPalace는 단순한 \u0026ldquo;대화 저장소\u0026quot;가 아닙니다. AI에게 진정한 기억을 부여하는 인프라입니다. 51,745개의 GitHub Star는 이 시스템이 이미 수만 명의 개발자에게 검증되었음을 증명합니다.\n무료이며 오픈소스인 MemPalace로, 여러분의 AI 프로젝트에도 \u0026ldquo;잊지 않는 지능\u0026quot;을 더해보세요.\n🔗 GitHub: github.com/MemPalace/mempalace\n⭐ Stars: 51,745\n💰 가격: 완전 무료 (MIT 라이선스)\nRelated Articles # LangChain으로 RAG 시스템 구축하기 ChromaDB 벡터 데이터베이스 입문 가이드 OpenAI API 효율적으로 사용하는 10가지 팁 LLM 프롬프트 엔지니어링 완벽 정리 AI 에이전트 아키텍처 설계 패턴 이 글은 2026년 5월 10일에 작성되었습니다. MemPalace의 최신 정보는 공식 GitHub 저장소를 참고하세요.\nFAQ: MemPalace 프로덕션 배포 가이드 #Q: MemPalace를 돌리려면 RAM이 얼마나 필요한가요? (how much RAM for MemPalace) A: 극도로 최적화되어 있습니다. 8GB RAM에서도 부드럽게 돌아가지만, 수천 개의 장기 세션을 유지해야 하는 프로덕션 환경이라면 16GB를 권장합니다.\nQ: Claude Code에 MemPalace를 연동할 수 있나요? A: 네! MCP 호환 엔드포인트를 기본 제공하므로, 코딩 에이전트(Claude Code)에 영구적인 메모리를 완벽하게 주입할 수 있습니다.\nQ: 로컬 메모리용으로 ChromaDB와 Pinecone 중 무엇이 좋나요? A: MemPalace는 로컬 ChromaDB를 사용하여 지연 시간(Latency) 0, API 비용 0을 달성합니다. 프라이버시가 생명인 로컬 에이전트 워크플로우에서는 Pinecone을 압도합니다.\n","date":"May 15, 2026","permalink":"https://dibi8.com/kr/resources/ai-tools/mempalace/","section":"AI 源码资源","summary":"","title":"MemPalace vs Mem0: 96.6% 리콜 벤치마크 및 2026년 최강 AI 메모리 프레임워크"},{"content":"{\u0026lt;/* resource-info */\u0026gt;}\n문제: 알고리즘 이외에 ML 엔지니어에게 무엇이 필요한가? #당신은 Transformer 아키텍처를 숙달하고 BERT를 처음부터 구현할 수 있지만, 실제 작업에서는 계속 벽에 부딪힙니다:\n모델 훈련 속도가 너무 느려서 병목이 데이터 로딩에 있는지 GPU 계산에 있는지 모릅니다 엣지 장치에 배포 후 정확도가 급락하는데 양자화 최적화 방법을 모릅니다 서비스 QPS가 안 올라가서 추론 지연으로 사용자가 불만입니다 데이터 파이프라인이 매일 밤 중에 붕괴되는데 아무도 이유를 모릅니다 문제는 알고리즘이 아니라 시스템입니다.\n대부분의 ML 과정은 모델과 알고리즘만 가르치지만, 모델을 실제로 실행시키는 시스템 엔지니어링은 무시합니다. 이것이 바로 ML Systems Book이 채우려는 공백입니다.\nML Systems Book이란 무엇인가? #Machine Learning Systems는 MIT Press에서 출판한 머신러닝 시스템 교재로, 2026년에 정식 발행됩니다. 이 책은 GitHub에서 24,113+ Stars를 보유하고 있으며, 2030년까지 100만 학습자가 ML 시스템 엔지니어링을 마스터하도록 돕는 것을 목표로 합니다.\n알고리즘과 모델 아키텍처만 다루는 리소스와 달리, 이 책은 시스템 관점을 강조합니다:\n데이터 엔지니어링이 훈련 효율에 어떤 영향을 미치는지 하드웨어 특성이 모델 설계를 어떻게 결정하는지 추론 가속의 엔지니어링 트레이드오프 연구실부터 프로덕션 환경까지의 완전한 체인 핵심 내용 #1. 데이터 엔지니어링(Data Engineering) ## 비효율적인 데이터 로딩은 훈련 병목의 1위 원인 # 이 책은 효율적인 데이터 파이프라인 구축을 가르칩니다 import tensorflow as tf # ❌ 비효율: 단일 스레드 로딩 dataset = tf.data.Dataset.from_tensor_slices(data) # ✅ 효율: 프리페치 + 병렬 + 캐싱 dataset = (tf.data.Dataset.from_tensor_slices(data) .map(preprocess, num_parallel_calls=tf.data.AUTOTUNE) .cache() .prefetch(tf.data.AUTOTUNE)) 다루는 주제:\n데이터 형식(TFRecord, Parquet, Arrow) ETL 파이프라인 설계 데이터 버전 관리 품질 모니터링 및 클리닝 2. 모델 최적화(Model Optimization) # 기술 목표 적용 시나리오 양자화(Quantization) INT8/FP16 추론 엣지 장치 배포 가지치기(Pruning) 매개변수 감소 모델 압축 증류(Distillation) 소형 모델이 대형 모델 학습 모바일 컴파일 최적화(XLA, TVM) 연산자 융합 추론 가속 동적 배치 처리 처리량 향상 서버측 3. 하드웨어 인식 훈련(Hardware-Aware Training) ## 하드웨어 특성을 이해해야 효율적인 훈련 코드를 작성할 수 있습니다 # GPU: 메모리 대역폭이 병목 → 데이터 전송 감소 # TPU: 행렬 곱 최적화 → 적절한 batch size 사용 # Edge NPU: 고정 소수점 연산 → 양자화 인식 훈련 GPU: CUDA 프로그래밍, 메모리 관리, 다중 카드 병렬 TPU: XLA 컴파일, Pod 아키텍처, GSPMD Edge: 고정 소수점 연산, 메모리 제한, 전력 제약 4. 추론 가속(Inference Acceleration) ## 100ms에서 10ms로 줄이는 엔지니어링 실무 # 1. 모델 변환: ONNX → TensorRT # 2. 연산자 최적화: Conv+BN+ReLU 융합 # 3. 메모리 최적화: 가중치 공유, 활성화 재계산 # 4. 배치 처리: 동적 batching + 요청 병합 # 5. 캐싱: 결과 캐싱 + 모델 워밍업 5. 배포 및 MLOps # 모델 서빙: TensorFlow Serving, TorchServe, Triton 컨테이너화: Docker, Kubernetes 모니터링: 지연 시간, 처리량, 오류율, 데이터 드리프트 A/B 테스트: 온라인 실험, 섀도우 트래픽 6. 엣지 및 임베디드 ML(Edge / TinyML) #// 마이크로컨트롤러에서 ML 실행(TinyML) #include \u0026#34;tensorflow/lite/micro/micro_interpreter.h\u0026#34; // 모델이 20KB에 불과, 16MHz Arduino에서 실행 // 음성 웨이크업, 제스처 인식 가능 모델 압축: 100MB에서 100KB로 하드웨어 플랫폼: Arduino, ESP32, Raspberry Pi 응용: 음성 웨이크업, 이상 탐지, 예측 유지보수 지식 아키텍처 #ML Systems Book ├── Part 1: Foundations │ ├── ML 복습 │ ├── 컴퓨터 아키텍처 기초 │ └── 소프트웨어 엔지니어링 원칙 ├── Part 2: Data Engineering │ ├── 데이터 수집 및 라벨링 │ ├── ETL 및 특성 엔지니어링 │ └── 데이터 품질 및 모니터링 ├── Part 3: Model Development │ ├── 훈련 인프라 │ ├── 분산 훈련 │ └── 실험 관리 ├── Part 4: Model Optimization │ ├── 양자화 및 가지치기 │ ├── 컴파일 최적화 │ └── 하드웨어 인식 설계 ├── Part 5: Inference \u0026amp; Serving │ ├── 추론 엔진 │ ├── 서비스 아키텍처 │ └── 성능 최적화 ├── Part 6: Edge \u0026amp; Mobile │ ├── TinyML │ ├── 모바일 최적화 │ └── 연합 학습 └── Part 7: MLOps \u0026amp; Production ├── ML용 CI/CD ├── 모니터링 및 관찰 가능성 └── 윤리 및 보안 획득 방법 #무료 온라인 읽기 #https://mlsysbook.ai/book/ 무료 PDF 다운로드 #https://mlsysbook.ai/book/assets/downloads/Machine-Learning-Systems.pdf GitHub 소스 #git clone https://github.com/harvard-edge/cs249r_book.git 종이책 구매 # 출판사: MIT Press (2026) ISBN: 미정 가격: 약 $60-80 누구에게 적합한가? # 독자 수확 ML 연구원 모델 외부의 시스템 제약 이해 소프트웨어 엔지니어 ML 엔지니어링으로 전환하는 지식 지도 시스템 엔지니어 ML 워크로드 특성 파악 학생 알고리즘에서 엔지니어링까지 완전한 관점 기술 관리자 ML 프로젝트의 엔지니어링 복잡성 이해 유사 리소스 비교 # 리소스 중점 가격 실무성 ML Systems Book 시스템 엔지니어링 무료 ⭐⭐⭐⭐⭐ Deep Learning Book (Goodfellow) 알고리즘 이론 $80 ⭐⭐⭐ Designing ML Systems (Huyen) 프로덕션 실무 $50 ⭐⭐⭐⭐ CS229 (Stanford) 알고리즘 기초 무료 ⭐⭐ Made With ML MLOps 무료 ⭐⭐⭐⭐ 커뮤니티 및 지원 # GitHub Stars: 24,113+ 목표: 2030년까지 100만 학습자 돕기 스폰서: EDGE AI Foundation이 모든 Star에 자금을 매칭 오픈 콜렉티브: Open Collective에서 기부 접수 결론 #ML Systems Book은 현재 가장 포괄적인 ML 시스템 엔지니어링 교재이며, 완전히 무료입니다.\nMIT Press 보증, 학술 품질 보장 데이터부터 배포까지 완전한 체인 커버 이론과 실무를 겸비하고, 코드 예제가 풍부 오픈소스 커뮤니티가 지속적으로 업데이트 모델을 훈련할 줄은 알지만 배포할 줄 모르거나, 프로덕션 환경에서 연구실만큼 성능이 안 나오는 경우, 이 책은 당신의 필수 과목입니다.\n웹사이트: mlsysbook.ai\nGitHub: harvard-edge/cs249r_book\nStars: 24,113+ | 출판사: MIT Press (2026)\n관련 기사 # TabPFN: 테이블 데이터 기반 모델 Free LLM API Resources for AI Development Hermes Agent: 자기 개선하는 AI 에이전트 ","date":"May 15, 2026","permalink":"https://dibi8.com/kr/resources/ai-tools/ml-systems-book-mit-press-textbook/","section":"AI 源码资源","summary":"","title":"ML Systems Book：MIT 무료 머신러닝 시스템 교과서"},{"content":"{\u0026lt;/* resource-info */\u0026gt;}\nOpen Codesign: GitHub 5,790+ Star 오픈소스 Claude Design 대안 #AI 기반 디자인 도구의 환경은 눈 깜짝할 사이에 진화하고 있습니다. Claude Design, v0 by Vercel, Figma AI 같은 독점 플랫폼이 상당한 관심을 끌고 있지만, 점점 더 많은 개발자와 디자이너들이 근본적으로 다른 가치를 추구하고 있습니다: 투명성, 데이터 소유권, 그리고 벤더 종속으로부터의 자유. 이러한 요구 속에서 Open Codesign이 등장했습니다 —— 오픈소스 Claude Design 대안으로, GitHub에서 5,790개 이상의 Star를 급속히 획득하며 AI 보조 프로토타이핑에 대한 기술 팀의 접근 방식을 재정의하고 있습니다.\nOpenCoworkAI 팀이 개발하고 관대한 MIT 라이선스로 배포된 Open Codesign은 현대 개발자와 깊이 공명하는 철학을 담고 있습니다: 당신의 프롬프트, 당신의 모델, 당신의 노트북. 이 데스크톱 네이티브 애플리케이션은 자연어 프롬프트를 세련된 프로토타입, 슬라이드 데크, 마케팅 자산으로 변환합니다 —— 완전히 로컬에서, 당신이 이미 비용을 지불한 어떤 대형 언어 모델과도 함께.\n이 포괄적인 가이드에서는 Open Codesign의 특별한 점, 설정 방법, 독점 대안과의 비교, 그리고 디자인 워크플로우의 핵심 도구로서 그것이 왜 가치 있는지를 탐구합니다.\nOpen Codesign이란 무엇이며 왜 중요한가 #Open Codesign은 Electron + React 19 + Vite 6 + Tailwind CSS v4 기반의 MIT 라이선스 데스크톱 애플리케이션입니다. 핵심 사명은 자연어와 프로덕션 수준의 디자인 결과물 사이의 간극을 메우는 것입니다. \u0026ldquo;글래스모피즘 히어로 섹션, 가격 카드, 뉴스레터 가입이 있는 푸터를 갖춘 현대적인 SaaS 랜딩 페이지\u0026rdquo; 같은 프롬프트를 입력하면, Open Codesign은 수 초 내에 호버 상태, 반응형 브레이크포인트, 빈 상태 처리가 완비된 완전한 인터랙티브 HTML 프로토타입을 생성합니다.\n하지만 Open Codesign은 단순한 코드 생성기 이상입니다. v0.2.0(Agentic Design) 출시와 함께 이 도구는 실제 로컬 디자인 에이전트로 진화했습니다: 워크스페이스 기반 세션, 권한 기반 도구 접근, 그리고 DESIGN.md 파일을 통한 지속적인 디자인 메모리를 갖추고 있습니다. 모든 디자인은 로컬 워크스페이스 폴더에 저장된 JSONL 기록이 있는 세션이 됩니다 —— 이는 당신의 반복이 결코 손실되지 않고 디자인 결정이 항상 감사 가능하다는 의미입니다.\n오픈소스 접근 방식이 중요한 이유 #AI 디자인 도구 시장은 클라우드 전용 아키텍처를 운영하는 폐쇄 소스 플랫폼이 지배하고 있습니다. 편리하지만 이러한 도구는 몇 가지 통증 지점을 유발합니다:\n구독 잠금: 사용량과 관계없이 월별 요금이 계속 쌓입니다. 벤더 의존: 단일 공급자의 모델(Claude 전용, GPT-4o 전용 등)로 강제됩니다. 데이터 프라이버시 우려: 프롬프트, 디자인, 지식 재산이 원격 서버에서 처리됩니다. 낮은 내보내기 유연성: 생성된 결과물은 종종 제한된 형식이나 워터마크를 포함합니다. 오프라인 불가능: 클라우드 전용 도구는 연결성이 없으면 사용할 수 없습니다. Open Codesign은 이러한 모든 우려를 해결합니다. 로컬 우선이고 BYOK(Bring Your Own Key)이기 때문에 데이터, 모델 선택, 예산에 대한 완전한 통제권을 유지합니다. MIT 라이선스는 Fork, 수정, 내부 자체 호스팅, 심지어 상용 제품 구축까지 —— 아무런 제약 없이 가능하다는 의미입니다.\n핵심 기능: 다중 모델 지원, 로컬 우선, BYOK #다중 모델 아키텍처: 선택의 자유 #Open Codesign의 가장 매력적인 차별화 요소 중 하나는 통합 공급자 모델입니다. Claude Design(Anthropic 전용)이나 v0 by Vercel(주로 GPT-4o)과 달리, Open Codesign은 다양한 생태계에 걸친 20개 이상의 모델을 지원합니다:\n공급자 지원 모델 Anthropic Claude 3.5 Sonnet, Claude 3 Opus, Claude Code 구성 OpenAI GPT-4o, GPT-4 Turbo, API 또는 ChatGPT Plus 구독을 통한 Codex 모델 Google Gemini 1.5 Pro, Gemini Ultra DeepSeek DeepSeek-V3, DeepSeek-Coder OpenRouter 수백 개의 최신 및 오픈 모델에 대한 통합 접근 SiliconFlow 고성능 중국어 LLM 엔드포인트 로컬 / 자체 호스팅 Ollama(Llama, Mistral, Qwen, Phi 등) 사용자 정의 OpenAI 호환 릴레이 엔드포인트 동적 모델 선택기는 특히 우아합니다. 하드코딩된 짧은 목록을 제시하는 대신, Open Codesign은 각 공급자의 실시간 모델 카탈로그를 쿼리합니다. Anthropic이 새 Claude 모델을 출시하거나 OpenAI가 업데이트된 GPT 버전을 제공할 때, 애플리케이션 업데이트 없이 선택기에 자동으로 나타납니다.\nChatGPT Plus, Pro 또는 Team을 이미 구독 중인 사용자를 위해 Open Codesign은 Codex 모델에 대한 직접 OAuth 로그인을 제공합니다. API 키 관리가 필요 없습니다 —— 인증하고 바로 디자인을 시작하세요.\n로컬 우선 아키텍처: 당신의 데이터는 당신의 것 #Open Codesign의 모든 디자인 세션은 로컬 디스크에 저장됩니다. v0.2.0 워크스페이스 모델은 각 프로젝트에 대해 다음을 포함하는 전용 폴더를 생성합니다:\nsession.jsonl —— 완전한 대화 및 도구 호출 기록 DESIGN.md —— 공유 디자인 시스템 메모리(브랜드 토큰, 색상 결정, 타이포그래피 규칙) 기본 형식의 생성된 결과물 파일(HTML, CSS, JS) 즉시 롤백을 위한 버전 스냅샷 이 아키텍처는 실질적인 이점을 제공합니다:\n진정한 오프라인 기능: 비행기에서 디자인을 시작하여 와이파이가 없는 오두막에서 완료하세요. 무제한 버전 기록: SQLite 기반 세션 저장소는 모든 반복이 임의의 제한 없이 보존됨을 의미합니다. 제로 서버 의존성: 애플리케이션은 당신의 머신에서 완전히 실행됩니다. 다운되거나, 약관을 변경하거나, 인수될 백엔드 서비스가 없습니다. Git 친화적: 디자인은 폴더의 일반 파일이므로, 모든 프로젝트에서 git init을 실행하고 디자인 기록을 소스 코드처럼 관리할 수 있습니다. BYOK: 자체 키 가져오기 #BYOK 모델은 간단합니다: Open Codesign은 무료 애플리케이션입니다. 기존 공급자 계정을 통해 소비되는 LLM 토큰에 대해서만 비용을 지불하면 됩니다. 이는 구독 기반 디자인 도구와 비교할 때 극도로 투명한 비용 구조를 만듭니다.\n공급자 설정은 60초 이내에 완료됩니다. 기존 Claude Code 또는 Codex CLI 사용자의 경우 원클릭 가져오기 기능은 마법과 같습니다 —— Open Codesign은 기존 ~/.config/claude/config.toml 또는 Codex 공급자 구성을 감지하고 모든 설정을 자동으로 가져옵니다. 복사-붙여넣기, 수동 API 키 입력, 오타의 여지가 없습니다.\nAPI 키는 0600 파일 권한으로 ~/.config/open-codesign/config.toml에 저장되며, Claude Code, gh CLI 및 SSH 개인 키와 동일한 보안 규칙을 따릅니다. 키는 선택한 공급자의 API 엔드포인트를 제외하고는 어디에도 전송되지 않습니다.\n설치 및 구성 가이드 #설치 #Open Codesign은 여러 채널을 통해 바이너리를 배포합니다:\nmacOS: .dmg 설치 프로그램 또는 Homebrew(brew install open-codesign) Windows: .exe 설치 프로그램 또는 winget(winget install OpenCoworkAI.open-codesign) Linux: .AppImage 또는 Scoop 패키지 소스: 클론 후 pnpm install \u0026amp;\u0026amp; pnpm build로 빌드 애플리케이션은 모델, 외관, 저장소 및 고급 환경설정을 다루는 깔끔한 4탭 설정 인터페이스로 실행됩니다.\n첫 번째 공급자 구성 #옵션 A: 원클릭 가져오기(Claude Code / Codex 사용자 권장) # 설정 → 모델 열기 \u0026ldquo;Claude Code에서 가져오기\u0026rdquo; 또는 \u0026ldquo;Codex에서 가져오기\u0026rdquo; 클릭 Open Codesign이 기존 공급자 구성을 자동으로 읽습니다 가져온 설정을 확인하고 \u0026ldquo;연결 테스트\u0026rdquo; 클릭 옵션 B: 수동 API 키 입력 # 설정 → 모델 열기 공급자(Anthropic, OpenAI, Gemini 등) 선택 보안 키 필드에 API 키 붙여넣기 동적 선택기에서 선호하는 기본 모델 선택 \u0026ldquo;연결 테스트\u0026rdquo; 클릭 —— 진단 패널은 지연 시간, 모델 가용성, 릴레이 특정 문제를 표시합니다 옵션 C: ChatGPT 구독 로그인 # 설정 → 모델 열기 \u0026ldquo;ChatGPT로 로그인\u0026rdquo; 클릭 브라우저에서 OAuth 흐름 완료 Open Codesign으로 돌아오면 —— API 키 없이 Codex 모델을 사용할 수 있습니다 옵션 D: 로컬 Ollama # Ollama가 로컬에서 실행 중인지 확인(ollama serve) 설정 → 모델 → 공급자 추가 → Ollama 열기 Open Codesign이 http://localhost:11434를 자동 감지합니다 풀된 모델 선택(예: llama3.2, qwen2.5, mistral) 워크스페이스 설정 #공급자가 구성되면 메인 인터페이스는 **허브(Hub)**를 표시합니다 —— 15개의 내장 데모와 최근 디자인을 보여주는 갤러리입니다. **\u0026ldquo;새 디자인\u0026rdquo;**을 클릭하면 워크스페이스 기반 세션이 생성됩니다. 생성 전에 선택적으로:\n하나 이상의 디자인 스킬 선택(슬라이드, 대시보드, 랜딩 페이지, SVG 차트, 글래스모피즘, 에디토리얼 타이포그래피, 히어로, 가격, 푸터, 채팅 UI, 데이터 테이블, 캘린더) 브랜드 토큰을 설정하기 위해 DESIGN.md 파일 첨부 출력 형식 기본 설정 선택(HTML, React 컴포넌트 또는 PPTX) Claude Design, Figma AI, v0.dev와의 비교 # 기능 Open Codesign Claude Design v0 by Vercel Figma AI 라이선스 MIT(오픈소스) 폐쇄 소스 폐쇄 소스 폐쇄 소스 플랫폼 데스크톱(Electron) 웹 전용 웹 전용 웹 + 데스크톱 모델 지원 20+(Claude, GPT, Gemini, Ollama 등) Claude 전용 주로 GPT-4o 독점 모델 BYOK ✅ 모든 공급자 ❌ 불가 ⚠️ 제한적 ❌ 불가 로컬 / 오프라인 ✅ 완전 로컬 ❌ 클라우드 전용 ❌ 클라우드 전용 ❌ 클라우드 전용 데이터 프라이버시 ✅ 디바이스 전용 ❌ 클라우드 처리 ❌ 클라우드 처리 ❌ 클라우드 처리 버전 기록 ✅ 로컬 세션 + Git ❌ 없음 ❌ 제한적 ✅ 클라우드 기록 내보내기 형식 HTML, PDF, PPTX, ZIP, Markdown ⚠️ 제한적 ⚠️ 제한적 ⚠️ 독점 형식 비용 모델 무료 앱 + 토큰 사용 구독 구독 구독 댓글 모드 ✅ 핀 기반 편집 ❌ 없음 ❌ 없음 ✅ 네이티브 AI 이미지 생성 ✅ OpenAI / OpenRouter ❌ 없음 ❌ 없음 ✅ 제한적 자체 호스팅 가능 ✅ 예 ❌ 아니오 ❌ 아니오 ❌ 아니오 Claude Design #Claude Design은 인상적인 생성 품질을 제공하지만 사용자를 Anthropic 생태계에 고정시킵니다. 로컬 실행, 오프라인 모드, Claude 서비스가 저하되거나 GPT-4o의 시각적 추론을 선호할 때 다른 모델로 전환할 수 있는 기능이 없습니다. Open Codesign은 동등한 생성 품질을 유지하면서 이러한 모든 제약을 제거합니다.\nv0 by Vercel #Vercel의 v0는 React 컴포넌트 생성에 뛰어나지만 Vercel 계정이 필요하고 클라우드에서만 실행되며 Vercel 배포에 최적화된 코드를 생성합니다. Open Codesign은 프레임워크에 구애받지 않는 인라인 CSS가 포함된 HTML을 생성하여 어디에서나 실행될 수 있습니다 —— 정적 호스팅, 이메일 템플릿, 임베디드 위젯, 또는 React/Vue/Svelte 프로젝트의 출발점으로.\nFigma AI #Figma AI는 기존 디자인 플랫폼에 AI 기능을 통합합니다. 기존 UI 디자인 워크플로우에서는 강력하지만 Open Codesign의 프롬프트-투-프로토타입 즉각성, 다중 모델 유연성, 오프라인 작동 기능을 제공하지 않습니다. Open Codesign은 Figma를 대체하기보다 보완합니다 —— Open Codesign으로 빠른 아이디에이션을 하고 Figma로 고충실도 픽셀 퍼펙트 다듬질을 하세요.\n디자인 시스템과 프로토타이핑 기능 #12가지 내장 디자인 스킬 #범용 AI 도구는 종종 범용적인 결과를 생성하는 경향이 있습니다. Open Codesign은 12가지 내장 디자인 스킬 모듈과 함께 제공되며, 각 모듈은 특정 도메인에서 더 높은 품질의 결과를 생성하도록(시스템 프롬프트와 컨텍스트 주입을 통해) 특화된 에이전트 역할을 합니다:\n슬라이드 데크 —— 마스터 레이아웃이 포함된 프레젠테이션 준비 PPTX 생성 대시보드 —— 테이블, 차트 및 KPI 카드가 있는 데이터 집약적 관리자 패널 랜딩 페이지 —— 히어로 섹션, 소셜 프루프 및 CTA가 포함된 마케팅 중심 페이지 SVG 차트 —— 접근 가능하고 반응형인 데이터 시각화 글래스모피즘 —— 백드롭 블러 및 레이어드 뎁스가 있는 현대적 반투명 UI 에디토리얼 타이포그래피 —— 아름다운 타입 계층 구조가 있는 장문 읽기 경험 히어로 섹션 —— 고임팩트 폴드 위쪽 구도 가격 페이지 —— 비교 테이블, 기능 그리드 및 계층화된 카드 푸터 —— 네비게이션, 법적 정보 및 뉴스레터 모듈이 있는 포괄적 푸터 패턴 채팅 UI —— 버블 레이아웃 및 상태 표시기가 있는 메시징 인터페이스 데이터 테이블 —— 정렬 및 필터링 가능한 테이블 형식 데이터 프레젠테이션 캘린더 —— 일정 뷰가 있는 이벤트 기반 날짜 인터페이스 CSS 코드 한 줄을 작성하기 전에 모델은 어떤 스킬이 요구사항에 적합한지 추론한 다음, 적절한 레이아웃 의도, 디자인 시스템 일관성 규칙 및 대비 지침을 선택합니다. 이 \u0026ldquo;내장 취향\u0026rdquo; 레이어는 선택한 기본 LLM에 관계없이 출력 품질을 극적으로 향상시킵니다.\nDESIGN.md: 디자인 시스템을 위한 공유 메모리 #DESIGN.md 파일은 Open Codesign의 가장 혁신적인 기능 중 하나입니다. 모델에게 턴 간에 브랜드 결정을 기억하도록 강요하는 대신(이는 드리프트를 유발합니다), 디자인 시스템을 마크다운 파일에 작성합니다:\n# Acme Corp 디자인 시스템 ## 색상 - 주요: #0F172A(slate-900) - 강조: #3B82F6(blue-500) - 표면: #F8FAFC(slate-50) ## 타이포그래피 - 제목: Inter, 700 무게, 타이트 트래킹 - 본문: Inter, 400 무게, 1.6 행 높이 ## 간격 - 기본 단위: 4px - 섹션 패딩: 64px 수직 이 파일을 워크스페이스에 배치하면 모든 생성이 자동으로 이러한 토큰을 상속받습니다. 모델은 이 문서에 대해 일관성을 추론하며, 훈련 데이터에 대해 추론하지 않습니다. 이는 Open Codesign을 여러 브랜드를 관리하는 에이전시와 제품 팀에게 독특하게 강력하게 만듭니다.\n반응형 미리보기 #Open Codesign에는 휴대폰, 태블릿 및 데스크톱을 위한 진정한 반응형 미리보기 프레임이 포함되어 있습니다. 한 번의 클릭으로 브레이크포인트를 전환하면서 디자인이 iframe 상태를 유지합니다. 이는 프로토타입 단계 초기에 모바일 레이아웃 문제를 포착하는 데 매우 귀중합니다.\n코드 예제 및 프롬프트 #예제 1: SaaS 랜딩 페이지 #프롬프트:\n개발자를 위한 API 모니터링 도구 \u0026#34;Pulse\u0026#34;의 랜딩 페이지를 만들어줘. 포함: 애니메이션 그라데이션 배경이 있는 다크 히어로, Lucide 아이콘이 있는 세 가지 기능 카드, JSON 응답을 보여주는 코드 스니펫, 세 가지 등급의 가격 섹션, GitHub 및 Twitter 링크가 있는 푸터. 기능 카드는 글래스모피즘 스킬을 사용해줘. Open Codesign이 생성하는 것:\n인라인 CSS가 포함된 완전히 반응형 HTML 파일 히어로의 애니메이션 CSS 그라데이션 배경 백드롭 블러가 있는 세 개의 글래스모피즘 카드 구문 강조된 JSON 코드 블록 반응형 가격 그리드 모든 인터랙티브 요소의 활성 호버 상태 예제 2: 투자자 피치 데크 #프롬프트:\n시드 단계 핀테크 스타트업을 위한 6슬라이드 피치 데크를 생성해줘. 슬라이드 1: 큰 타이포그래피 제목. 슬라이드 2: 문제(아이콘이 있는 3개 불릿 포인트). 슬라이드 3: 솔루션 스크린샷 자리 표시자. 슬라이드 4: 견인력 지표(ARR, 사용자, 성장률). 슬라이드 5: 비즈니스 모델 캔버스. 슬라이드 6: 팀 사진 자리 표시자 및 연락처. PPTX로 내보내줘. 결과: 마스터 슬라이드 레이아웃, 편집 가능한 텍스트 상자 및 자리 표시자 이미지가 포함된 다운로드 가능한 .pptx 파일 —— PowerPoint, Keynote 또는 Google Slides에서 사용자 정의할 준비가 되었습니다.\n예제 3: 댓글 기반 세분화 #대시보드를 생성한 후 미리보기에서 요소를 클릭하고 핀을 배치합니다:\n댓글:\n이 KPI 카드를 회색 대신 강조색으로 만들고, 메트릭 글꼴 크기를 32px로 늘리고, +12% 레이블이 있는 작은 상승 트렌드 화살표를 추가해줘. 모델은 해당 영역만 다시 작성하며 나머지 레이아웃은 보존합니다. 이 핀-앤-코멘트 워크플로우는 사소한 조정을 위해 전체 재생성의 번거로움을 제거합니다.\n예제 4: AI 튜닝 슬라이더 #생성 후 Open Codesign은 전용 패널에 AI가 내보내는 미세 조정 매개변수를 표시합니다:\n// 생성된 미세 조정 스키마 { \u0026#34;heroBackground\u0026#34;: { \u0026#34;type\u0026#34;: \u0026#34;color\u0026#34;, \u0026#34;value\u0026#34;: \u0026#34;#0F172A\u0026#34; }, \u0026#34;cardBorderRadius\u0026#34;: { \u0026#34;type\u0026#34;: \u0026#34;range\u0026#34;, \u0026#34;min\u0026#34;: 0, \u0026#34;max\u0026#34;: 32, \u0026#34;value\u0026#34;: 16 }, \u0026#34;headingFont\u0026#34;: { \u0026#34;type\u0026#34;: \u0026#34;select\u0026#34;, \u0026#34;options\u0026#34;: [\u0026#34;Inter\u0026#34;, \u0026#34;Geist\u0026#34;, \u0026#34;Manrope\u0026#34;], \u0026#34;value\u0026#34;: \u0026#34;Inter\u0026#34; }, \u0026#34;sectionGap\u0026#34;: { \u0026#34;type\u0026#34;: \u0026#34;range\u0026#34;, \u0026#34;min\u0026#34;: 24, \u0026#34;max\u0026#34;: 128, \u0026#34;value\u0026#34;: 64 } } 슬라이더를 조정하면 미리보기가 실시간으로 업데이트됩니다 —— 새 프롬프트가 필요하지 않습니다.\n개발자와 디자이너를 위한 사용 사례 #프론트엔드 개발자 # 빠른 프로토타이핑: 시간 대신 수 초 내에 인터랙티브 HTML 프로토타입 생성 컴포넌트 탐색: React/Vue/Svelte 구현에 커밋하기 전에 레이아웃 아이디어 테스트 디자인 핸드오프: 픽셀 퍼펙트 구현을 위한 참조로 깨끗한 HTML/CSS 내보내기 이메일 템플릿: 인라인 스타일이 포함된 반응형 이메일 HTML 생성(모든 주요 클라이언트와 호환) 제품 디자이너 # 아이디에이션 가속: 이전에 하나의 스케치를 하는 데 걸렸던 시간에 10개의 레이아웃 방향 탐색 디자인 시스템 문서화: DESIGN.md를 사용하여 살아있는 디자인 시스템을 코딩하고 발전시킴 이해관계자 프레젠테이션: 제품 브리프에서 직접 PPTX 슬라이드 데크 생성 접근성 테스트: 생성된 HTML은 기본적으로 의미론적 마크업 및 ARIA 레이블 포함 스타트업 창업자 # 피치 데크 생성: 디자이너를 고용하지 않고도 투자자용 프레젠테이션 생성 랜딩 페이지 MVP: 첫날부터 전문적인 마케팅 사이트 출시 브랜드 탐색: 다양한 스킬 모듈을 사용하여 시각적 아이덴티티 방향 반복 엔터프라이즈 팀 # 온프레미스 배포: MIT 라이선스와 로컬 우선 아키텍처로 인해 에어갭 환경에 적합 비용 제어: BYOK은 좌석당 SaaS 구독이 없음을 의미 —— 기존 API 계약만 존재 감사 가능성: 모든 디자인 결정이 일반 텍스트 세션 파일에 저장되어 규정 준수 요구사항 충족 결론 #Open Codesign은 AI 디자인 도구 환경에서 의미 있는 전환점을 나타냅니다. 편의성을 제어권보다 우선시하는 일반 사용자를 위해 독점 플랫폼이 계속 서비스를 제공하는 동안, Open Codesign은 점점 더 성장하는 개발자, 디자이너 및 기술 팀 그룹을 위해 의도적으로 구축되었습니다 —— 그들은 소유권을 사용의 용이성과 교환하는 것을 거부합니다.\n다중 모델 유연성, 로컬 우선 아키텍처, BYOK 경제성, 그리고 이제 에이전트 워크스페이스 세션을 갖춘 Open Codesign은 폐쇄 소스 대안의 90% 가치를 제공하면서 100%의 잠재 위험을 제거합니다. GitHub에서 5,790개 이상의 Star는 단순한 인기 지표가 아닙니다 —— 그것은 더 개방적인 AI 보조 창작 방식을 위해 Fork와 기여로 투표하는 커뮤니티를 나타냅니다.\n이미 Claude Code나 Codex에 투자한 팀의 경우 원클릭 가져오기를 통해 도입이 마찰 없이 이루어집니다. 로컬 모델을 실행하는 Ollama 사용자의 경우, 이는 완전한 오프라인 워크플로우를 존중하는 유일한 전문급 디자인 도구입니다. 그리고 그 중간의 모든 사람들에게 MIT 라이선스는 디자인 도구 전략이 공급자의 가격 페이지나 인수 일정에 의해 볼모로 잡히지 않을 것을 보장합니다.\n아직 Open Codesign을 탐색하지 않았다면 설정에 90초도 걸리지 않습니다. 당신의 다음 프로토타입은 단 하나의 프롬프트만큼 가까이에 있습니다 —— 그리고 이번에는 그것이 진정으로 당신의 것입니다.\ndibi8 Tech Team 작성. AI 개발자 도구, 오픈소스 워크플로우 및 디자인 엔지니어링에 대한 더 깊은 다이빙을 위해 dibi8.com에서 우리 블로그를 팔로우하세요.\n","date":"May 15, 2026","permalink":"https://dibi8.com/kr/resources/dev-utils/open-codesign-claude-design-alternative/","section":"AI 源码资源","summary":"","title":"Open Codesign: GitHub 5,790+ Star 오픈소스 Claude Design 대안"},{"content":"{\u0026lt;/* resource-info */\u0026gt;}\nOpen Design: Claude Design을 대체하는 궁극의 로컬 우선 AI 디자인 도구 #인공지능과 디자인의 교차점은 개발자와 디자이너가 텍스트 프롬프트 하나로 프로덕션 수준의 프로토타입, 프레젠테이션, 미디어 자산을 생성할 수 있는 새로운 패러다임을 창출했습니다. Anthropic의 Claude Design은 AI 보조 창의적 워크플로우에 높은 기준을 제시했지만, 폐쇄형 소스이자 클라우드 의존적인 아키텍처는 많은 개발자들이 더 많은 제어력, 프라이버시, 유연성을 원하게 만들었습니다. 여기에 Open Design이 등장합니다 — 로컬 우선의 오픈소스 강력한 도구로, GitHub에서 39,107개의 Star를 급속히 축적하며 기술 팀이 디자인 자동화에 접근하는 방식을 재정의하고 있습니다.\n이 포괄적인 가이드에서 우리는 Open Design이 창의적 도구에 대한 주권을 요구하는 개발자들의 필수 선택지가 되어가는 이유를 탐구할 것입니다. 19개의 전문화된 AI 스킬부터 71개의 브랜드급 디자인 시스템에 이르기까지, 이 프로젝트는 독점 대안과 견줄 수 있으며 많은 경우 능가하는 기능을 제공합니다.\nOpen Design이란? #Open Design은 Anthropic의 Claude Design에 대한 오픈소스 로컬 우선 대안입니다. nexu-io 팀에 의해 개발되었으며, 정교한 웹 프로토타입, 데스크톱 애플리케이션, 모바일 인터페이스, 슬라이드, 이미지, 비디오, 인터랙티브 HyperFrames를 생성할 수 있는 능력을 사용자에게 부여합니다 — 전부 로컬 머신에서 실행됩니다.\n인터넷 연결이 필요하고 데이터를 원격 서버로 전송하는 클라우드 기반 디자인 도구와 달리, Open Design은 초기 설정 후 완전히 오프라인으로 작동합니다. 이러한 아키텍처는 완벽한 데이터 프라이버시를 보장하고, 지연 시간 문제를 제거하며, 사용자에게 디자인 환경에 대한 완전한 제어권을 부여합니다. 이 프로젝트는 Claude Code, Codex, Cursor, Gemini, OpenCode, Qwen, Copilot, Hermes, Kimi CLI를 포함한 인기 AI 코딩 어시스턴트와의 원활한 통합을 지원합니다.\nGitHub 저장소 https://github.com/nexu-io/open-design은 AI 도구 분야에서 가장 빠르게 성장하는 프로젝트 중 하나가 되었으며, 전 세계 개발자 커뮤니티의 기여자와 사용자를 끌어들이고 있습니다.\n핵심 기능 및 역량 #19개의 전문 AI 스킬 #Open Design은 디자인 및 프로토타이핑 전 스펙트럼을 커버하는 19개의 내장 AI 스킬과 함께 제공됩니다. 이것들은 일반적인 텍스트 생성 기능이 아니라 디자인 작업을 위해 세밀하게 튜닝된 모델과 워크플로우입니다:\n웹 프로토타이핑 — 자연어 설명에서 반응형 HTML/CSS/JavaScript 프로토타입 생성 모바일 UI 디자인 — 플랫폼별 규칙을 갖춘 네이티브한 모바일 인터페이스 생성 데스크톱 애플리케이션 목업 — 크로스 플랫폼 데스크톱 애플리케이션 프로토타입 구축 슬라이드 덱 생성 — PPTX 형식의 프레젠테이션 준비 슬라이드 제작 이미지 합성 — 브랜드 일관성 있는 시각 자료 및 일러스트레이션 생성 비디오 제작 — 데모 및 소셜 미디어용 MP4 프레젠테이션 및 영상 프로그래밍 방식 생성 HyperFrame 생성 — 임베드 가능한 인터랙티브 웹 컴포넌트 구축 디자인 시스템 분석 — 기존 브랜드 가이드라인 파싱 및 확장 컴포넌트 라이브러리 생성 — React, Vue 또는 바닐라 JS로 재사용 가능한 UI 컴포넌트 출력 접근성 감사 — WCAG 기준에 대한 디자인 평가 반응형 레이아웃 엔진 — 다양한 브레이크포인트에서 디자인 자동 적응 애니메이션 시퀀싱 — 복잡한 모션 그래픽 및 전환 효과 디자인 아이콘 세트 생성 — 설명에서 일관된 아이콘 패밀리 생성 색상 팔레트 추출 — 브랜드 자산에서 조화로운 팔레트 도출 타이포그래피 페어링 — 글꼴 조합 추천 및 구현 와이어프레임 변환 — 저충실도 스케치를 고충실도 디자인으로 변환 PDF 내보내기 파이프라인 — 웹 레이아웃에서 인쇄 준비 문서 생성 인터랙티브 프로토타이핑 — 클릭 가능한 핫스팟 및 상태 전환 추가 브랜드 일관성 엔진 — 모든 출력에서 디자인 토큰 강제 적용 71개의 브랜드급 디자인 시스템 #Open Design의 눈에 띄는 기능 중 하나는 71개의 사전 구성된 프로덕션급 디자인 시스템 라이브러리입니다. 이것들은 기본 템플릿이 아니라 주요 브랜드에서 사용하는 AI 기반 생성을 위해 세심하게 재구성된 포괄적인 디자인 언어입니다:\n디자인 시스템 카테고리 최적 사용처 Material Design 3 모바일/웹 Android 애플리케이션, 크로스 플랫폼 UI Apple Human Interface iOS/macOS Apple 생태계 네이티브 애플리케이션 Fluent UI 데스크톱/웹 Microsoft 호환 엔터프라이즈 도구 Carbon Design 엔터프라이즈 IBM 스타일 데이터 중심 대시보드 Ant Design 웹/관리자 중국 시장, 엔터프라이즈 관리 패널 Atlassian Design SaaS 프로젝트 관리, 협업 도구 Shopify Polaris 이커머스 온라인 상점, 체크아웃 플로우 Stripe Elements 핀테크 결제 양식, 금융 대시보드 Tailwind UI 빠른 프로토타이핑 유틸리티 우선 개발 워크플로우 Chakra UI React 앱 접근 가능한 컴포넌트 중심 디자인 각 디자인 시스템은 완전한 타이포그래피 스케일, 색상 팔레트, 간격 시스템, 컴포넌트 사양, 상호작용 패턴을 포함합니다. 사용자는 처음부터 시작하지 않고도 고유한 브랜드 아이덴티티를 만들기 위해 이러한 시스템을 혼합, 매칭 및 확장할 수 있습니다.\n다중 포맷 내보내기 엔진 #Open Design의 내보내기 기능은 정말 인상적입니다. 단일 디자인을 동시에 여러 형식으로 렌더링할 수 있습니다:\nHTML/CSS/JS — 완전히 기능하는 표준 준수 웹 페이지 PDF — 임베디드 글꼴 및 벡터 그래픽이 포함된 인쇄 준비 문서 PPTX — 편집 가능한 요소가 있는 네이티브 PowerPoint 프레젠테이션 MP4 — 데모 및 소셜 미디어용 고화질 비디오 렌더링 React/Vue 컴포넌트 — 통합을 위해 프로덕션 코드 준비 Figma JSON — 디자인 팀 인계를 위한 가져오기 가능한 Figma 디자인 파일 PNG/SVG — 임의 해상도의 래스터 및 벡터 이미지 내보내기 샌드박스 미리보기 환경을 통해 내보내기 전에 프로토타입과 상호작용하여 모든 것이 의도한 대로 정확히 작동하는지 확인할 수 있습니다.\n샌드박스 미리보기 환경 #AI가 생성한 코드를 실행할 때 보안이 가장 중요합니다. Open Design은 잠재적으로 악의적인 스크립트를 격리하면서 완전한 상호작용성을 보존하는 샌드박스 브라우저 환경에서 모든 미리보기를 실행합니다. 이는 동적 프로토타입, API 통합, 사용자 상호작용을 로컬 시스템에 위험을 주지 않고 안전하게 테스트할 수 있음을 의미합니다.\n보편적 AI 어시스턴트 호환성 #Open Design은 단일 AI 제공업체에 묶여 있지 않습니다. 다음과 함께 작동합니다:\nClaude Code — Anthropic의 공식 CLI 도구 GitHub Copilot — Microsoft의 AI 페어 프로그래머 Cursor — AI 네이티브 코드 에디터 Gemini — Google의 멀티모달 AI 시스템 Codex — OpenAI의 코드 생성 모델 OpenCode — 커뮤니티 중심 AI 코딩 어시스턴트 Qwen — Alibaba의 대형 언어 모델 Hermes — 전문화된 코딩 모델 Kimi CLI — Moonshot AI의 명령줄 인터페이스 이러한 유연성은 단일 공급업체의 가격 책정, 가용성, 기능 로드맵에 의존하지 않음을 의미합니다.\n단계별 설치 및 설정 가이드 #Open Design을 머신에서 실행하는 것은 간단합니다. 완전한 설치를 위해 다음 단계를 따르세요.\n사전 요구사항 #설치 전 시스템이 다음 요구사항을 충족하는지 확인하세요:\nNode.js 18.0 이상 npm 9.0 이상 (또는 pnpm/yarn) 저장소 클론을 위한 Git AI 모델 작업을 위한 최소 4GB RAM 의존성 및 캐시된 모델을 위한 2GB 디스크 공간 1단계: 저장소 클론 #git clone https://github.com/nexu-io/open-design.git cd open-design 2단계: 의존성 설치 #Open Design은 모노레포 구조를 사용합니다. 다음으로 모든 패키지를 설치하세요:\nnpm install # 또는 pnpm install # 또는 yarn install 3단계: 환경 변수 구성 #예제 환경 파일을 복사하고 사용자화하세요:\ncp .env.example .env 사용할 AI 제공업체 API 키를 추가하기 위해 .env를 편집하세요. 사용할 제공업체만 구성하면 됩니다:\n# Anthropic Claude ANTHROPIC_API_KEY=sk-ant-your-key-here # OpenAI OPENAI_API_KEY=sk-your-key-here # Google Gemini GEMINI_API_KEY=your-gemini-key # 선택사항: 사용자 정의 모델 엔드포인트 CUSTOM_MODEL_URL=https://your-model-endpoint.com CUSTOM_MODEL_API_KEY=your-custom-key 4단계: 프로젝트 빌드 #npm run build 이것은 TypeScript 소스를 컴파일하고 디자인 시스템 자산을 번들링합니다.\n5단계: 디자인 시스템 초기화 #71개의 브랜드급 디자인 시스템을 다운로드하세요:\nnpm run init:design-systems 이 명령은 오프라인 사용을 위해 로컬로 모든 디자인 시스템 정의를 가져와 캐시합니다.\n6단계: Open Design 실행 #로컬 개발 서버를 시작하세요:\nnpm run dev 인터페이스는 http://localhost:3000에서 사용 가능합니다. 브라우저를 열고 디자인 생성을 시작하세요.\n7단계: AI 어시스턴트 구성 (선택사항) #Claude Code 또는 Cursor와 같은 외부 AI 어시스턴트와 함께 Open Design을 사용하는 경우 동반 플러그인을 설치하세요:\nnpm run install:cursor-plugin # 또는 npm run install:claude-plugin 이러한 플러그인은 Open Design 명령을 에디터의 명령 팔레트에 직접 추가합니다.\nOpen Design vs. Claude Design: 상세 비교 # 기능 Open Design Claude Design 가격 무료, 오픈소스 유료 구독 배포 로컬 우선, 오프라인 가능 클라우드 전용 데이터 프라이버시 모든 데이터가 로컬에 유지 Anthropic 서버에서 데이터 처리 소스 코드 완전히 공개, MIT 라이선스 독점, 폐쇄형 소스 디자인 시스템 71개의 사전 구축된 시스템 Anthropic 제공 내용으로 제한 AI 스킬 19개의 전문 스킬 일반적인 디자인 역량 내보내기 형식 HTML, PDF, PPTX, MP4, React, Vue, Figma 주로 HTML 및 이미지 내보내기 비디오 생성 네이티브 MP4 내보내기 지원 지원하지 않음 HyperFrames 내장 지원 사용 불가 AI 제공업체 잠금 9개 이상의 AI 어시스턴트와 작동 Anthropic 전용 사용자 정의 모든 컴포넌트 수정에 완전한 접근 제공된 인터페이스로 제한 커뮤니티 활발한 오픈소스 기여자 폐쇄형 생태계 오프라인 사용 인터넷 없이 완전히 작동 연결 필요 엔터프라이즈 배포 자체 인프라에서 자체 호스팅 SaaS 전용 팀 가격 무료, AI API 사용량만 지불 좌석당 구독 요금 실제 사용 사례 #스타트업 프로토타입 신속 구축 #창업자들은 Open Design을 사용하여 수 주가 아닌 몇 시간 만에 투자자용 프로토타입을 생성합니다. 자연어로 제품 비전을 설명함으로써 전문적인 스타일링이 적용된 클릭 가능한 웹 및 모바일 프로토타입을 받습니다 — 투자 제안서 및 사용자 테스트에 완벽합니다.\n디자인 시스템 마이그레이션 #엔터프라이즈 팀은 71개의 내장 디자인 시스템을 활용하여 레거시 애플리케이션을 마이그레이션합니다. 브랜드 일관성 엔진은 점진적 롤아웃 중에 이전과 새 인터페이스가 통합된 시각적 언어를 공유하도록 보장합니다.\n마케팅 자산 생성 #마케팅 팀은 단일 소스 설명에서 일관된 슬라이드 덱, 소셜 미디어 이미지, 제품 데모 비디오를 생성합니다. 다중 포맷 내보내기는 하나의 디자인 브리프가 모든 채널에 대한 자산을 생성함을 의미합니다.\n개발자 인계 가속화 #프론트엔드 개발자는 Open Design을 사용하여 컴포넌트 라이브러리를 빠르게 시작합니다. Figma 파일을 기다리는 대신 제품 요구사항에서 직접 React 또는 Vue 컴포넌트를 생성한 후 출력을 다듬습니다.\n교육 콘텐츠 제작 #교육자와 기술 작가는 튜토리얼을 위해 인터랙티브 HyperFrames와 데모 비디오를 생성합니다. 샌드박스 미리보기는 학생들이 생성된 예제를 안전하게 탐색할 수 있도록 보장합니다.\n접근성 우선 디자인 #엄격한 접근성 요구사항을 가진 조직은 개발 시작 전에 디자인을 평가하기 위해 내장 WCAG 감사 스킬을 사용하여 대비 문제와 탐색 문제를 조기에 발견합니다.\n장점과 단점 #장점 # 완전한 데이터 주권 — 디자인, 프롬프트, 생성된 자산이 머신을 떠나지 않음 제로 벤더 잠금 — AI 제공업체 간 전환 또는 동시 사용 가능 거대한 디자인 시스템 라이브러리 — 71개의 프로덕션급 시스템이 모든 프로젝트 가속화 다양한 출력 형식 — 하나의 소스, 무한한 내보내기 목적지 활발한 개발 — 오픈소스 커뮤니티가 빠른 기능 추가를 주도 비용 효율성 — 구독료 없음; 실제로 소비하는 AI API 사용량에만 비용 지불 오프라인 안정성 — 연결성 문제 없이 어디서나 작업 가능 확장 가능한 아키텍처 — 사용자 정의 스킬, 디자인 시스템, 내보내기 형식 추가 가능 단점 # 초기 설정 복잡성 — 클라우드 기반 대안보다 더 많은 구성 필요 하드웨어 요구사항 — 로컬 AI 작업에 상당한 RAM 및 CPU 필요 학습 곡선 — 19개의 스킬과 71개의 디자인 시스템을 마스터하는 데 시간 소요 자체 지원 모델 — 전용 고객 성공팀이 아닌 커뮤니티 지원 수동 업데이트 — 자동 업그레이드 대신 GitHub에서 업데이트를 가져와야 함 API 비용 — 도구는 무료지만 규모에 따라 AI 제공업체 API 호출에 비용 발생 결론 #Open Design은 기술 팀이 창의적 자동화에 접근하는 방식의 중요한 변화를 나타냅니다. 로컬 우선 아키텍처를 광범위한 AI 스킬 및 디자인 시스템 라이브러리와 결합함으로써, 독점 대안과 일치하거나 많은 경우 능가하는 기능을 제공하면서 오픈소스 소프트웨어의 자유, 프라이버시, 비용 이점을 보존합니다.\n39,107개의 Star를 보유하고 지속적으로 성장하는 이 프로젝트는 강력한 기능과 제어 사이의 타협을 거부하는 개발자들과 명확하게 공명하고 있습니다. 스타트업 아이디어를 프로토타이핑하든, 엔터프라이즈 디자인 시스템을 마이그레이션하든, 아니면 규모에 따라 마케팅 자산을 생성하든, Open Design은 필요한 도구 기반을 제공합니다.\n직접 사용해 볼 준비가 되셨나요? 공식 GitHub 저장소로 이동하여 프로젝트를 클론하고, 이미 AI 보조 디자인의 미래를 구축하고 있는 수천 명의 개발자들에 합류하세요.\nAI 기반 개발 도구에 대한 더 많은 인사이트를 위해 dibi8의 관련 기사들을 확인하세요: AI 코딩 어시스턴트 2026, 로컬 우선 아키텍처 가이드, 그리고 독점 AI 도구의 오픈소스 대안.\n프로젝트에서 Open Design을 사용해 보셨나요? 아래 댓글에서 경험을 공유하거나 협업 기회를 위해 dibi8 Tech Team에 연락해 주세요.\n","date":"May 15, 2026","permalink":"https://dibi8.com/kr/resources/dev-utils/open-design-local-first-ai-design-tool/","section":"AI 源码资源","summary":"","title":"Open Design: Claude Design을 대체하는 궁극의 로컬 우선 AI 디자인 도구"},{"content":"{\u0026lt;/* resource-info */\u0026gt;}\nOpenAI 요금제 해지: DeepSeek(DS4) 로컬 추론으로 토큰 비용 박살내기 #2026년, 코딩 에이전트나 생성형 AI 워크플로우를 빡세게 돌리는 회사라면 매달 날아오는 API 청구서가 얼마나 끔찍한지 아실 겁니다. OpenAI의 GPT-4o나 Anthropic에 의존하면 월 수백만 원이 우습게 깨집니다. 클라우드에 \u0026lsquo;통행료\u0026rsquo;를 내는 시대는 끝났습니다. **DwarfStar 4(DS4)**를 이용해 DeepSeek V4 Flash를 로컬에서 구동하면 API 비용을 0원으로 멸종시킬 수 있습니다.\n로컬 추론이 마침내 클라우드 API의 숨통을 끊어버린 재무적, 아키텍처적 현실을 파헤쳐 봅니다.\n잔혹한 팩트 체크: DS4 로컬 추론 vs OpenAI API #두뇌를 소유할 수 있는데 왜 비싼 돈을 주고 빌려 쓰십니까? 헤비급 AI 에이전트를 돌릴 때 발생하는 비용과 성능의 민낯을 공개합니다:\n지표 / 아키텍처 DS4 + DeepSeek V4 Flash (로컬) OpenAI GPT-4o API 100만 토큰당 비용 $0 (전기세만 나옴) 입력 $5.00 / 출력 $15.00 1년 장기 사용 비용 약 400만 원 (Mac 1대 영구 소장) 2,000만 원 이상 (끝없는 지출) 컨텍스트 복원 속도 즉시 (SSD 기반 KV Cache 보존) 요청할 때마다 처음부터 다시 계산 데이터 보안 인터넷 끊고 오프라인 구동 가능 귀사의 기밀 코드가 외부로 유출됨 KV Cache 병목 현상 완벽 제거 #OpenAI API를 사용할 때, 10만 토큰짜리 프로젝트 컨텍스트를 보낼 때마다 클라우드 서버는 그 방대한 텍스트의 수학적 상태(KV Cache)를 처음부터 다시 연산해야 합니다. 여러분은 그 딜레이를 기다려야 하고, 반복되는 토큰 요금도 계속 지불해야 합니다. DS4는 이 비효율성을 파괴합니다. 연산된 KV Cache를 로컬 NVMe SSD에 곧바로 저장해 버립니다. 에이전트와 다시 대화를 시작할 때, 10만 토큰의 문맥이 지연 없이 즉각적으로 복원됩니다. 길고 반복적인 작업에서는 로컬 DS4가 클라우드 API보다 물리적으로 더 빠릅니다!\nFAQ #Q: DeepSeek 로컬 구동과 GPT-4o API 비용 차이가 얼마나 나나요? (DeepSeek local vs GPT-4o API cost) A: AI 코딩을 빡세게 돌리면 하루에 2~3백만 토큰을 씁니다. GPT-4o라면 하루 30달러, 한 달이면 100만 원이 넘습니다. DS4를 위해 128GB Mac을 한 대 사면, 서너 달 만에 본전을 뽑고 그 이후부터는 토큰 무제한 뷔페를 즐길 수 있습니다.\nQ: 인터넷 없이도 AI 로컬 코딩이 가능한가요? (Local AI coding without internet) A: 당연합니다. DeepSeek V4 GGUF 파일을 다운로드하여 DS4에 올리면, 컴퓨터는 완벽한 오프라인 상태로 동작합니다. 사내 망분리 규정 때문에 AI를 못 쓰던 금융권이나 방산 기업들에게는 그야말로 게임 체인저입니다.\n","date":"May 15, 2026","permalink":"https://dibi8.com/kr/resources/llm-frameworks/deepseek-ds4-vs-openai-api/","section":"AI 源码资源","summary":"","title":"OpenAI 요금제 해지: DeepSeek(DS4) 로컬 추론으로 토큰 비용 박살내기"},{"content":"{\u0026lt;/* resource-info */\u0026gt;}\nOpenClaw란? #OpenClaw는 사용자가 여러 분야에서 복잡한 작업을 수행할 수 있는 자율 에이전트를 구축할 수 있게 하는 오픈소스 AI 에이전트 프레임워크입니다. 기존 챗봇과 달리 OpenClaw 에이전트는 다음을 할 수 있습니다:\n🤖 자율적으로 다단계 워크플로 실행 🔗 외부 API 및 서비스와 통합 📊 여러 소스의 데이터 처리 및 분석 🎯 최소한의 인간 개입으로 목표 완수 🔗 GitHub: https://github.com/openclaw/openclaw\n42개 실제 사용 사례 #이 컬렉션은 사람들이 일상 생활, 업무 및 창의적 프로젝트를 개선하기 위해 OpenClaw를 실제로 사용하는 방법을 보여줍니다.\n📱 소셜 미디어 자동화 # 사용 사례 설명 일일 Reddit 다이제스트 선호도에 따라 선별된 subreddit 요약 일일 YouTube 다이제스트 좋아하는 채널의 새로운 비디오 일일 요약 X 계정 분석 X/Twitter 계정의 정성적 분석 다중 소스 기술 뉴스 109개 이상의 소스에서 기술 뉴스 집계 및 품질 평가 X/Twitter 자동화 트윗, 답글, 좋아요, 리트윗, 팔로우, DM, 경품 이벤트 🎨 창의성 및 구축 # 사용 사례 설명 목표 중심 자율 작업 목표를 덤프하면 에이전트가 자동으로 일일 작업 생성 및 완료 YouTube 콘텐츠 파이프라인 비디오 아이디어 스카우팅, 연구 및 추적 자동화 다중 에이전트 콘텐츠 팩토리 Discord에서 연구, 글쓰기 및 썸네일 에이전트 실행 자율 게임 개발 파이프라인 교육용 게임의 전체 라이프사이클 관리, \u0026ldquo;버그 우선\u0026rdquo; 정책 팟캐스트 제작 파이프라인 게스트 연구, 에피소드 개요, 쇼 노트, 소셜 미디어 프로모션 채팅 기반 AI 비디오 편집 자연어로 비디오 편집 — 자르기, 병합, 음악 추가, 자막 🏗️ 인프라 및 DevOps # 사용 사례 설명 n8n 워크플로 오케스트레이션 웹훅을 통해 n8n 워크플로에 API 호출 위임 자가 치유 홈 서버 SSH 및 cron 작업이 있는 항상 켜진 인프라 에이전트 ⚡ 생산성 # 사용 사례 설명 자율 프로젝트 관리 STATE.yaml 패턴을 사용한 다중 에이전트 프로젝트 다중 채널 AI 고객 서비스 WhatsApp, Instagram, 이메일, Google 리뷰 통합 전화 기반 개인 비서 전화 통화를 통해 에이전트에 액세스, 핸즈프리 음성 받은 편지함 정리 뉴스레터 요약 및 이메일 다이제스트 전송 개인 CRM 이메일 및 캘린더에서 연락처 자동 발견 및 추적 건강 및 증상 추적기 음식 섭취 및 증상 추적, 예정된 알림 다중 채널 개인 비서 단일 AI 비서에서 Telegram, Slack, 이메일, 캘린더로 작업 라우팅 프로젝트 상태 관리 정적 칸반 보드를 대체하는 이벤트 기반 추적 동적 대시보드 API, 데이터베이스 및 소셜 미디어에서 병렬 데이터 가져오기 Todoist 작업 관리자 Todoist에 추론 및 진행 로그 동기화 가족 캘린더 및 가정용 어시스턴트 가족 캘린더 집계, 메시지 모니터링, 가정용 재고 관리 다중 에이전트 전문 팀 단일 Telegram 채팅에서 여러 전문 에이전트 실행 OpenClaw 데스크톱 협업 데스크톱 앱, 다중 에이전트, MCP, WebUI/Telegram/Lark 맞춤형 아침 브리핑 뉴스, 작업, 콘텐츠 초안이 포함된 일일 브리핑, SMS로 전송 자동화된 회의 노트 회의 녹취를 구조화된 요약으로 변환, 작업 자동 생성 습관 추적기 및 책임 코치 Telegram/SMS를 통한 일일 체크인, 진행 상황에 따라 적응 두 번째 뇌 봇에 모든 것을 텍스트로 보내 기억, Next.js 대시보드에서 검색 이벤트 게스트 확인 AI 음성 통화로 참석 여부 확인, 메모 수집, 요약 컴파일 전화 통화 알림 에이전트의 알림을 실제 전화 통화로 변환, 양방향 대화 로컬 CRM 프레임워크 OpenClaw를 완전한 로컬 CRM 및 영업 자동화 플랫폼으로 변환 🔬 연구 및 학습 # 사용 사례 설명 AI 실적 추적기 기술/AI 실적 보고서 추적, 자동 미리보기 및 요약 개인 지식 기반 (RAG) URL, 트윗, 기사를 채팅에 드롭하여 검색 가능한 지식 기반 구축 시장 조사 및 제품 팩토리 Reddit 및 X에서 고통 지점을 채굴하고 MVP 자동 구축 구축 전 아이디어 검증기 GitHub, HN, npm, PyPI를 스캔 — 붐비는 공간 피하기 의미론적 기억 검색 OpenClaw 마크다운 기억 파일에 벡터 의미론적 검색 추가 arXiv 논문 리더 arXiv 논문을 대화식으로 읽고 분석 LaTeX 논문 작성 대화식으로 LaTeX 논문 작성 및 컴파일, 즉시 PDF 미리보기 HF 논문 연구 발견 Hugging Face에서 트렌딩 ML 논문 발견, 투표로 분류 💰 금융 및 거래 # 사용 사례 설명 Polymarket 자동 조종 백테스팅 및 전략 분석이 있는 예측 시장 자동 모의 거래 주요 카테고리 분석 # 카테고리 사용 사례 수 초점 영역 생산성 18 일일 워크플로, 관리, 조직 연구 및 학습 7 지식 수집, 분석, 글쓰기 창의성 및 구축 6 콘텐츠 제작, 개발, 제작 소셜 미디어 5 자동화, 분석, 콘텐츠 큐레이션 인프라 2 DevOps, 서버 관리, 워크플로 금융 1 거래, 시장 분석 인기 사용 사례 하이라이트 #1. 다중 에이전트 콘텐츠 팩토리 #Discord에서 완전한 콘텐츠 파이프라인 실행:\n연구 에이전트 — 여러 소스에서 정보 수집 글쓰기 에이전트 — 기사, 스크립트 및 소셜 게시물 초안 작성 썸네일 에이전트 — 시각적 요소 및 그래픽 생성 모든 에이전트가 전용 채널에서 작동하며 자동 핸드오프 2. 자율 게임 개발 파이프라인 #교육용 게임의 전체 라이프사이클 관리:\n백로그 선택 및 우선순위 지정 \u0026ldquo;버그 우선\u0026rdquo; 정책으로 구현 자동 문서화 및 git 커밋 진행 상황 추적 및 보고 3. 채팅 기반 AI 비디오 편집 #자연어로 비디오 편집:\n\u0026ldquo;처음 30초 자르기\u0026rdquo; \u0026ldquo;배경 음악 추가\u0026rdquo; \u0026ldquo;자막 생성\u0026rdquo; \u0026ldquo;세로 형식으로 자르기\u0026rdquo; 타임라인 없음, GUI 없음 — 원하는 것을 설명하기만 하면 됩니다 4. 두 번째 뇌 #개인 지식 관리:\n봇에 모든 것을 텍스트로 보내 기억 자동 분류 및 태그 지정 자연어로 모든 기억 검색 시각화를 위한 맞춤형 Next.js 대시보드 OpenClaw 시작하기 #1. OpenClaw 설치 #git clone https://github.com/openclaw/openclaw.git cd openclaw 2. 에이전트 구성 #구성 파일에서 API 키 및 기본 설정을 설정합니다.\n3. 사용 사례 선택 #awesome-openclaw-usecases 저장소를 탐색하고 필요에 맞는 사용 사례를 선택합니다.\n4. 배포 및 실행 #특정 사용 사례 문서에 따라 에이전트를 배포합니다.\n보안 고려사항 # 경고: OpenClaw 스킬 및 타사 종속성에는 보안 취약점이 있을 수 있습니다. 항상:\n설치 전 스킬 소스 코드 검토 요청된 권한 확인 API 키 또는 자격 증명 하드코딩 방지 민감한 데이터에는 환경 변수 사용 다른 AI 에이전트와 비교 # 기능 OpenClaw AutoGPT BabyAGI AgentGPT 오픈소스 ✅ ✅ ✅ ✅ 다중 에이전트 ✅ ❌ ❌ ❌ 플러그인 시스템 ✅ ✅ ❌ ❌ 전화 통합 ✅ ❌ ❌ ❌ Discord/Telegram ✅ ❌ ❌ ❌ 실제 사용 사례 42+ 적음 적음 적음 커뮤니티 성장 중 대형 중형 중형 관련 기사 # Free Claude Code: Claude Code CLI를 무료로 사용할 수 있는 오픈소스 프록시 도구 — AI 코딩 어시스턴트 Agent Reach: AI 에이전트에 인터넷 슈퍼파워를 부여하다 — AI 에이전트 인터넷 연결 Polymarket Agents: Polymarket 예측 시장용 AI 자동 거래 봇 구축 — 예측 시장 AI 거래 결론 #OpenClaw는 AI 에이전트가 일상 생활에서 가질 수 있는 실제 잠재력을 보여줍니다. 생산성, 창의성, 연구 및 금융을 포괄하는 42개의 문서화된 사용 사례를 통해 워크플로를 자동화하려는 모든 사람을 위한 로드맵을 제공합니다.\n핵심 통찰: AI 에이전트는 개발자만을 위한 것이 아닙니다 — 올바른 문제에 적용될 때 누구의 일상 생활도 개선할 수 있는 도구입니다.\n가장 적합한 대상: 생산성 애호가, 콘텐츠 크리에이터, 연구원, 개발자 및 반복적인 작업을 자동화하려는 모든 사람\nGitHub: https://github.com/openclaw/openclaw 사용 사례 컬렉션: https://github.com/hesamsheikh/awesome-openclaw-usecases\n마지막 업데이트: 2026-05-06\n","date":"May 15, 2026","permalink":"https://dibi8.com/kr/resources/llm-frameworks/awesome-openclaw-usecases-ai-agent-daily-life/","section":"AI 源码资源","summary":"","title":"OpenClaw 42개 실제 사용 사례: 사람들이 일상에서 AI 에이전트를 사용하는 방법"},{"content":"{\u0026lt;/* resource-info */\u0026gt;}\nOpenReel Video란? #OpenReel Video는 Augani에서 개발한 오픈소스 전문 브라우저 기반 비디오 편집기입니다. 1,935+ GitHub Stars와 281+ Forks를 보유하고 있으며, CapCut의 강력한 대안으로 위치잡고 있습니다 — 하지만 완전히 브라우저에서 실행됩니다.\n클라우드 기반 편집기와 달리 OpenReel Video는 WebAssembly와 FFmpeg.wasm을 사용하여 모든 것을 클라이언트 사이드에서 처리합니다. 비디오가 절대 컴퓨터를 떠나지 않습니다.\nGitHub: https://github.com/Augani/openreel-video\n지표 수치 Stars 1,935+ Forks 281+ 언어 TypeScript 라이선스 MIT 오늘 233 stars 처리 방식 100% 클라이언트 사이드 OpenReel Video가 다른 점 #1. 100% 브라우저 기반, 설치 불필요 #다운로드, 설치, 계정이 필요 없습니다:\nURL 열기 — 즉시 편집 시작 드래그 앤 드롭 — 컴퓨터에서 직접 비디오 가져오기 보내기 — 최종 비디오를 장치에 다운로드 등록 불필요 — 이메일, 비밀번호, 추적 없음 2. 프라이버시 우선 아키텍처 # 기능 OpenReel CapCut 기타 클라우드 편집기 클라우드에 비디오 업로드 ❌ 아니오 ✅ 예 ✅ 예 계정 필요 ❌ 아니오 ✅ 예 ✅ 예 워터마크 ❌ 아니오 ✅ 예 (무료 티어) ✅ 예 (무료 티어) 데이터 수집 ❌ 없음 ⚠️ 알 수 없음 ⚠️ 알 수 없음 오프라인 작동 ✅ 예 ❌ 아니오 ❌ 아니오 오픈소스 ✅ 예 ❌ 아니오 ❌ 아니오 3. 전문 기능 세트 #OpenReel Video는 일반적으로 데스크톱 편집기에서 찾을 수 있는 기능을 포함합니다:\n타임라인 및 편집\n다중 트랙 타임라인 (비디오 + 오디오) 분할, 트림, 잘라내기, 병합 속도 제어 (슬로우 모션, 타임랩스) 프레임 정확한 편집 시각 효과\n50+ 전환 (페이드, 슬라이드, 줌, 글리치) 색상 보정 (밝기, 대비, 채도) 필터 및 LUT 그린스크린 / 크로마키 픽처 인 픽처 오디오\n다중 트랙 오디오 믹싱 볼륨 자동화 노이즈 감소 오디오 효과 (리버브, 에코, 디스토션) 배경음악 라이브러리 텍스트 및 자막\n애니메이션 텍스트 오버레이 자동 자막 생성 (Web Speech API) 사용자 정의 폰트 및 스타일 자막 타이밍 조정 보내기 옵션\nMP4, WebM, MOV 형식 해상도: 360p에서 4K까지 프레임 레이트: 24fps에서 60fps까지 품질 프리셋: 빠름, 균형, 높음 설치 및 사용 #옵션 1: 온라인 사용 (권장) #https://openreel.video 방문 — 설치 불필요.\n옵션 2: 자체 호스팅 ## 저장소 클론 git clone https://github.com/Augani/openreel-video.git cd openreel-video # 의존성 설치 npm install # 프로덕션 빌드 npm run build # 로컬 미리보기 npm run preview # 또는 정적 호스팅에 배포 (Vercel, Netlify, GitHub Pages) 옵션 3: Docker #docker pull augani/openreel-video:latest docker run -p 3000:3000 augani/openreel-video:latest 기능 비교 # 기능 OpenReel CapCut 무료 DaVinci Resolve iMovie 가격 무료 무료 (제한적) 무료 / $295 무료 워터마크 ❌ 없음 ✅ 있음 ❌ 없음 ❌ 없음 다중 트랙 ✅ 예 ✅ 예 ✅ 예 ✅ 예 4K보내기 ✅ 예 ❌ 아니오 ✅ 예 ✅ 예 키프레임 ✅ 예 ✅ 예 ✅ 예 ❌ 아니오 크로마키 ✅ 예 ✅ 예 ✅ 예 ✅ 예 자막 ✅ 자동 ✅ 수동 ✅ 수동 ❌ 아니오 플러그인 ❌ 아니오 ❌ 아니오 ✅ 예 ❌ 아니오 클라우드 필요 ❌ 아니오 ✅ 예 ❌ 아니오 ❌ 아니오 모바일 앱 ❌ 아니오 ✅ 예 ❌ 아니오 ✅ 예 사용 사례 #콘텐츠 제작자 # 소셜 미디어용 빠른 편집 비디오에 자막 추가 일관된 색상 그레이딩 적용 숏폼 콘텐츠 제작 (YouTube Shorts, TikTok, Reels) 개발자 # 프로그래밍 방식으로 비디오 썸네일 생성 비디오 자산 일괄 처리 문서화 비디오 제작 브라우저에서 비디오 재생 테스트 프라이버시 중시 사용자 # 업로드 없이 민감한 비디오 편집 로컬에서 독점적 촬영물 처리 서비스 약관 제한 회피 콘텐츠에 대한 완전한 통제 유지 교육자 # 튜토리얼 비디오 제작 강의 녹화 편집 교육 콘텐츠에 주석 추가 학생 데이터가 브라우저를 떠나지 않음 커뮤니티 및 리소스 # GitHub: Augani/openreel-video 데모: https://openreel.video 문서: https://docs.openreel.video Discord: 커뮤니티 가입 관련 기사 # Pixelle-Video: AI 숏폼 비디오 생성기 AIWind: 1000+ AI 이미지 프롬프트 Free Claude Code: 무료 AI 코딩 도우미 면책 조항 #브라우저 제한 사항 적용. 큰 비디오 파일 (4K, 60fps)는 오래된 기기에서 성능 문제를 일으킬 수 있습니다. 전문급 4K+ 편집의 경우 데스크톱 소프트웨어 (DaVinci Resolve, Premiere Pro)가 여전히 권장됩니다.\n마지막 업데이트: 2026-05-08 | Stars: 1,935+ | 라이선스: MIT\n","date":"May 15, 2026","permalink":"https://dibi8.com/kr/resources/ai-tools/openreel-video/","section":"AI 源码资源","summary":"","title":"OpenReel Video: 1.9K⭐ 오픈소스 브라우저 비디오 편집기, CapCut 대안"},{"content":"{\u0026lt;/* resource-info */\u0026gt;}\nPageIndex란? #PageIndex는 VectifyAI가 개발한 오픈소스 RAG(검색 증강 생성) 시스템으로, 전통적인 문서 검색 방식을 완전히 바꿉니다. 전통적인 벡터 데이터베이스와 달리 PageIndex는 추론 기반 접근 방식을 사용하여 문서의 계층적 트리 구조를 구축함으로써 인간과 같은 검색을 구현합니다.\n🌲 트리 구조 인덱스 — 목차처럼 문서를 구성 🧠 추론 기반 검색 — LLM 추론, 벡터 유사도가 아님 ❌ 벡터 데이터베이스 불필요 — 비싼 벡터 저장 비용 절감 ❌ 청킹 불필요 — 문서의 자연스러운 구조 유지 📊 98.7% 정확도 — FinanceBench 벤치마크 SOTA GitHub: https://github.com/VectifyAI/PageIndex\nStars: 29,202+ | 언어: Python | 라이선스: Apache-2.0\n왜 전통적인 RAG가 충분하지 않은가? #전통적인 벡터 RAG의 문제점 # 문제 설명 유사도 ≠ 관련성 벡터 검색은 의미적으로 유사한 것을 찾지만, 실제로 관련된 것은 아닐 수 있음 청킹이 구조를 파괴 강제 청킹은 문서의 논리적 구조를 끊음 블랙박스 검색 벡터 검색은 해석 불가능하며, 왜 이 결과가 반환되었는지 추적할 수 없음 비용이 높음 벡터 데이터베이스 유지, 저장 및 계산 비용이 많이 듦 긴 문서에서 효과가 떨어짐 전문적인 긴 문서(재무 보고서, 법적 파일) 검색 정확도가 낮음 PageIndex의 해결책 #PageIndex는 인간 전문가가 문서를 읽는 방식을 모방합니다:\n먼저 목차 구조(트리 인덱스)를 확인 질문에 따라 어떤 장으로 가야 할지 추론 관련 장에서 깊이 찾아보기 핵심 기술 원리 #1. 문서 트리 구조 생성 #PageIndex는 PDF를 계층적 트리 구조로 변환합니다:\n{ \u0026#34;title\u0026#34;: \u0026#34;Financial Stability\u0026#34;, \u0026#34;node_id\u0026#34;: \u0026#34;0006\u0026#34;, \u0026#34;start_index\u0026#34;: 21, \u0026#34;end_index\u0026#34;: 22, \u0026#34;summary\u0026#34;: \u0026#34;The Federal Reserve monitors financial vulnerabilities...\u0026#34;, \u0026#34;nodes\u0026#34;: [ { \u0026#34;title\u0026#34;: \u0026#34;Monitoring Financial Vulnerabilities\u0026#34;, \u0026#34;node_id\u0026#34;: \u0026#34;0007\u0026#34;, \u0026#34;start_index\u0026#34;: 22, \u0026#34;end_index\u0026#34;: 28 } ] } 2. 추론 기반 트리 검색 #사용자가 질문하면 LLM은 다음을 수행합니다:\n질문 이해 — 쿼리 의도 분석 트리 구조 탐색 — 어떤 노드에 답이 있을지 추론 관련 노드 심층 탐색 — 후보 노드에서 구체적인 정보 찾기 결과 반환 — 출처 인용(페이지, 장)과 함께 3. AlphaGo와 유사한 몬테카를로 트리 검색 #PageIndex는 AlphaGo에서 영감을 받아 트리 검색 알고리즘을 사용합니다:\n선택 — 가장 유망한 노드 선택 확장 — 하위 노드 펼치기 평가 — LLM이 노드 관련성 평가 역전파 — 노드 가중치 업데이트 빠른 시작 #설치 ## 저장소 클론 git clone https://github.com/VectifyAI/PageIndex.git cd PageIndex # 의존성 설치 pip3 install --upgrade -r requirements.txt API Key 설정 ## .env 파일 생성 echo \u0026#34;OPENAI_API_KEY=your_openai_key_here\u0026#34; \u0026gt; .env 문서 트리 생성 ## PDF용 PageIndex 트리 구조 생성 python3 run_pageindex.py --pdf_path /path/to/your/document.pdf 선택적 매개변수 #--model # LLM 모델 (기본: gpt-4o-2024-11-20) --toc-check-pages # 목차 확인 페이지 (기본: 20) --max-pages-per-node # 노드당 최대 페이지 (기본: 10) --max-tokens-per-node # 노드당 최대 토큰 (기본: 20000) --if-add-node-summary # 노드 요약 추가 (기본: yes) 실전 예시 #예시 1: 금융 문서 분석 #from pageindex import PageIndex # 문서 트리 로드 pi = PageIndex(tree_path=\u0026#34;financial_report.json\u0026#34;) # 쿼리 result = pi.query( \u0026#34;Q3 매출 성장률은 얼마였나요?\u0026#34;, top_k=3 ) print(result.answer) # \u0026#34;Q3 매출은 전년 동기 대비 23% 성장했으며, 클라우드 서비스가 주도...\u0026#34; print(result.sources) # [{\u0026#34;page\u0026#34;: 45, \u0026#34;section\u0026#34;: \u0026#34;Financial Results\u0026#34;, \u0026#34;node_id\u0026#34;: \u0026#34;0012\u0026#34;}] 예시 2: 법률 계약 검토 ## 계약 문서 로드 pi = PageIndex(tree_path=\u0026#34;contract.pdf.json\u0026#34;) # 특정 조항 쿼리 result = pi.query( \u0026#34;7조의 해지 조건은 무엇인가요?\u0026#34; ) # PageIndex가 자동으로 관련 장을 찾아줍니다 예시 3: 학술 논문 연구 ## 논문 로드 pi = PageIndex(tree_path=\u0026#34;paper.pdf.json\u0026#34;) # 장 간 추론 쿼리 result = pi.query( \u0026#34;3장의 방법론이 5장의 결과와 어떻게 관련이 있나요?\u0026#34; ) # PageIndex가 트리 구조를 탐색하여 연관 정보를 찾습니다 경쟁사 비교 # 특성 PageIndex 전통 벡터 RAG LlamaIndex LangChain 벡터 데이터베이스 ❌ 불필요 ✅ 필수 ✅ 필수 ✅ 필수 청킹 ❌ 불필요 ✅ 필수 ✅ 필수 ✅ 필수 추론 기반 ✅ ❌ ❌ ❌ 해석 가능성 ✅ 추적 가능 ❌ 블랙박스 ⚠️ 부분적 ⚠️ 부분적 긴 문서 ✅ 우수 ⚠️ 보통 ⚠️ 보통 ⚠️ 보통 전문 문서 ✅ 우수 ⚠️ 보통 ⚠️ 보통 ⚠️ 보통 정확도 ✅ 98.7% ~75% ~80% ~78% 비즈니스 모델과 수익 기회 #1. 엔터프라이즈 문서 분석 #PageIndex의 Apache-2.0 라이선스는 상업적 사용을 허용합니다:\n금융 분석 — 재무 보고서, SEC 파일 자동 분석 법률 상담 — 계약 검토, 사례 연구 의료 문서 — 병록 분석, 의학 문헄 정부 파일 — 정책 분석, 법규 검색 2. SaaS 제품 구축 #PageIndex 기반으로 다음을 구축:\n지능형 문서 Q\u0026amp;A 플랫폼 엔터프라이즈 지식 베이스 시스템 자동 보고서 생성기 컴플라이언스 검토 도구 3. 컨설팅 서비스 #PageIndex 관련 다음을 제공:\n기술 컨설팅 맞춤형 개발 교육 서비스 성능 벤치마크 #FinanceBench 테스트 결과 # 시스템 정확도 PageIndex (Mafin 2.5) 98.7% 전통 벡터 RAG ~75% 기타 상업 솔루션 ~80% PageIndex는 금융 문서 Q\u0026amp;A에서 state-of-the-art를 달성하여 추론 기반 검색의 우수성을 입증했습니다.\n배포 옵션 #1. 자체 호스팅 (오픈소스) #git clone https://github.com/VectifyAI/PageIndex.git pip3 install -r requirements.txt python3 run_pageindex.py --pdf_path your.pdf 적합: 기술 팀, 데이터 민감한 시나리오\n2. 클라우드 서비스 # Chat 플랫폼: https://chat.pageindex.ai API: https://pageindex.ai/developer MCP 통합: Claude, Cursor 등 지원 적합: 빠른 시작, 프로덕션 환경\n3. 엔터프라이즈 버전 # 프라이빗 배포 맞춤형 OCR 파이프라인 전담 지원 커뮤니티와 리소스 # GitHub: https://github.com/VectifyAI/PageIndex 문서: https://docs.pageindex.ai 블로그: https://pageindex.ai/blog Discord: https://discord.com/invite/VuXuf29EUj API: https://pageindex.ai/developer 요약 #PageIndex는 RAG 기술의 차세대 진화입니다:\n✅ 29K+ Stars — 커뮤니티 인정\n✅ 벡터 DB 불필요 — 비싼 인프라 비용 절감\n✅ 추론 기반 — 문서 구조를 진정으로 이해\n✅ 98.7% 정확도 — 업계 최고\n✅ 해석 가능 — 모든 검색이 추적 가능\n✅ 오픈소스 — Apache-2.0, 상업 친화적\n누구에게 적합한가?\n금융 분석가: 재무 보고서, SEC 파일 처리 법률 고문: 계약 검토, 법규 연구원: 논문, 문헄 분석 개발자: 문서 AI 애플리케이션 구축 시작하기: https://github.com/VectifyAI/PageIndex\nRelated Articles # Goose AI Agent: 코드와 자동화를 위한 오픈소스 AI 에이전트 — 또 다른 오픈소스 AI 도구 Free Claude Code: Claude Code CLI를 무료로 사용하는 오픈소스 프록시 도구 — AI 코딩 도구 Agent Reach: AI 에이전트를 인터넷에 연결하세요 — AI를 인터넷에 연결 42 Real-World OpenClaw Use Cases: 사람들이 일상에서 AI 에이전트를 사용하는 방법 — AI 에이전트 사용 사례 Last updated: 2026-05-07\n","date":"May 15, 2026","permalink":"https://dibi8.com/kr/resources/llm-frameworks/pageindex-vectorless-reasoning-rag/","section":"AI 源码资源","summary":"","title":"PageIndex：29K⭐벡터 없는 RAG 시스템, 문서 검색의 혁명"},{"content":"{\u0026lt;/* resource-info */\u0026gt;}\nPixelle-Video란? #Pixelle-Video는 오픈소스 AI 완전 자동 쇼트 비디오 생성 엔진입니다. 주제만 입력하면 전체 비디오 제작 과정을 자동으로 완료합니다:\n✍️ AI 스마트 스크립트 — 주제에 따라 자동으로 해설词 생성 🎨 AI 이미지/비디오 생성 — 각 장면에 맞는 AI 일러스트 또는 동영상 생성 🗣️ AI 음성 합성 — 스크립트를 자연스러운 음성으로 변환 🎵 배경음악 — 분위기를 높이는 BGM 자동 추가 🎬 원클릭 비디오 합성 — 최종 영상 자동 렌더링 진입장벽 제로, 영상 편집 경험 불필요 — 비디오 제작이 한 문장만큼 간단해집니다!\n🔗 GitHub: https://github.com/AIDC-AI/Pixelle-Video\n핵심 기능 # 기능 설명 완전 자동 생성 주제 입력 → 완성된 비디오 획득 AI 스마트 스크립트 AI가 해설词 작성, 수동 스크립트 불필요 AI 이미지 생성 각 문장에 어울리는 AI 일러스트 생성 AI 비디오 생성 WAN 2.1 등 비디오 모델로 동적 콘텐츠 생성 다중 TTS 지원 Edge-TTS, Index-TTS 등 다양한 음성 합성 배경음악 BGM 추가로 분위기 업 비주얼 템플릿 다양한 템플릿으로 독특한 영상 스타일 유연한 사이즈 세로, 가로 등 다양한 비디오 크기 지원 다양한 AI 모델 GPT, 통의천문, DeepSeek, Ollama 등 ComfyUI 아키텍처 모듈식 설계, 모든 기능 커스터마이징 가능 비디오 생성 파이프라인 #Pixelle-Video는 모듈식 설계를 채택하여 명확한 워크플로를 제공합니다:\n텍스트 입력 → 스크립트 생성 → 이미지 기획 → 프레임 처리 → 비디오 합성\n각 단계는 유연한 커스터마이징을 지원 — AI 모델, 오디오 엔진, 비주얼 스타일 등을 개인화하여 선택할 수 있습니다.\n확장 모듈 #기본 비디오 생성 외에도 Pixelle-Video는 강력한 확장 기능을 제공합니다:\n👤 디지털 휴먼 아바타 #사진을 업로드하여 입 모양 동기화된 말하는 영상 생성. 한국어, 중국어, 영어 등 다국어 지원.\n🖼️ 이미지를 비디오로 #정적 이미지를 AI 비디오 생성 모델로 동적 영상으로 변환.\n💃 모션 전이 #참조 비디오와 이미지를 업로드하여 모션을 이미지에 전이 — 사진 속 인물이 춤추게 만들기.\n지원 AI 모델 #LLM (스크립트 생성) # OpenAI GPT-4o / GPT-4o-mini 알리바바 통의천문 DeepSeek V3 / R1 Ollama (로컬 배포) 사용자 정의 API 엔드포인트 이미지 생성 # FLUX (ComfyUI 통해) Stable Diffusion 통의천문 이미지 생성 RunningHub 클라우드 서비스 Nano Banana 모델 TTS (음성 합성) # Edge-TTS (무료, 다국어) Index-TTS (음성 클로닝) ChatTTS 사용자 정의 ComfyUI TTS 워크플로 빠른 시작 #1. 저장소 클론 #git clone https://github.com/AIDC-AI/Pixelle-Video.git cd Pixelle-Video 2. 의존성 설치 #pip install -r requirements.txt 3. API 키 구성 #config.json을 편집하여 API 키 입력:\n{ \u0026#34;llm\u0026#34;: { \u0026#34;api_key\u0026#34;: \u0026#34;당신의 API 키\u0026#34;, \u0026#34;base_url\u0026#34;: \u0026#34;https://api.openai.com/v1\u0026#34;, \u0026#34;model\u0026#34;: \u0026#34;gpt-4o\u0026#34; }, \u0026#34;image\u0026#34;: { \u0026#34;comfyui_url\u0026#34;: \u0026#34;http://127.0.0.1:8188\u0026#34; } } 4. Web UI 시작 #python webui.py 브라우저에서 http://localhost:7860 열기\n5. 첫 번째 비디오 생성 # 주제 입력, 예: \u0026ldquo;독서 습관의 중요성\u0026rdquo; 원하는 TTS 음성 선택 비주얼 템플릿 선택 \u0026ldquo;비디오 생성\u0026rdquo; 클릭 2-5분 대기 후 완성된 비디오 획득 사용 시나리오 # 시나리오 예시 주제 지식 공유 \u0026ldquo;Python 초보자가 알아야 할 10가지 팁\u0026rdquo; 제품 리뷰 \u0026ldquo;iPhone 16 vs 삼성 S24 비교\u0026rdquo; 스토리텔링 \u0026ldquo;스타트업 창업자의 여정\u0026rdquo; 교육 콘텐츠 \u0026ldquo;블록체인은 어떻게 작동하나요?\u0026rdquo; 뉴스 코멘터리 \u0026ldquo;2026년 AI 트렌드\u0026rdquo; 책/영화 리뷰 \u0026ldquo;『아토믹 해빗』의 교훈\u0026rdquo; 비디오 스타일 예시 #Pixelle-Video는 다양한 비디오 스타일을 지원합니다:\n🌄 다큐멘터리 스타일 — 여행, 자연, 인문 이야기 🔍 문화 분석 — 트렌드와 현상의 심층 분석 🔭 과학 철학 — 복잡한 개념을 쉽게 설명 🌱 개인 성장 — 자기 계발, 생산성 향상 🧠 심층 사고 — 심리학, 철학, 성찰 🏯 역사 문화 — 고인의 지혜, 역사적 사건 ☀️ 감성 — 따뜻한 이야기, 영감 📜 소설 해설 — 소설 리뷰, 인물 분석 🧬 지식 과학 — 의학 상식, 건강 지식 기술 아키텍처 #Pixelle-Video는 ComfyUI 아키텍처 기반:\n모듈식 워크플로 — 각 구성 요소(LLM, TTS, 이미지 생성)가 독립 노드 커스터마이징 파이프라인 — 모델 또는 서비스 쉽게 교체 API 우선 설계 — 모든 기능 REST API로 노출 Web UI — Gradio 기반의 사용하기 쉬운 인터페이스 배치 처리 — 여러 비디오 동시 생성 성능 및 비용 # 옵션 비용 속도 품질 로컬 배포 무료 (GPU 필요) 빠름 높음 RunningHub 클라우드 사용량 기반 과금 즉시 높음 혼합 모드 유연 균형 높음 초보자 추천 구성:\nLLM: DeepSeek API (저렴, 품질 좋음) 이미지: RunningHub (로컬 GPU 불필요) TTS: Edge-TTS (무료, 다국어) 다른 도구와 비교 # 기능 Pixelle-Video HeyGen Synthesia Pictory 오픈소스 ✅ ❌ ❌ ❌ 무료 사용 ✅ 제한적 제한적 제한적 로컬 배포 ✅ ❌ ❌ ❌ 커스텀 모델 ✅ ❌ ❌ ❌ ComfyUI 통합 ✅ ❌ ❌ ❌ 음성 클로닝 ✅ ✅ ✅ ❌ 디지털 휴먼 ✅ ✅ ✅ ❌ 모션 전이 ✅ ❌ ❌ ❌ 최적의 결과를 위한 팁 # 주제 구체화 — 구체적일수록 더 나은 스크립트 생성 템플릿 매칭 — 콘텐츠 스타일에 맞는 템플릿 선택 프롬프트 프리픽스 — 영어 프롬프트 프리픽스로 이미지 스타일 일관성 유지 음성 미리듣기 — 전체 비디오 생성 전 TTS 미리듣기 배치 생성 — 3-5개 버전 동시 생성 후 최고 선택 관련 기사 # Free Claude Code: Claude Code CLI를 무료로 사용할 수 있는 오픈소스 프록시 도구 — 무료 AI 코딩 어시스턴트 Agent Reach: AI 에이전트에 인터넷 슈퍼파워를 부여하다 — AI 에이전트 인터넷 연결 도구 Code Vault — 7개의 오픈소스 암호화폐 레이더 및 트레이딩 도구 — Python 자동화 도구 결론 #Pixelle-Video는 LLM, 이미지 생성, TTS, 비디오 편집을 단일 자동화 파이프라인으로 통합하여 비디오 제작을 민주화합니다. 콘텐츠 크리에이터, 교육자, 마케터, 개발자 모두에게 이 도구는 많은 비디오 제작 시간을 절약해줍니다.\nComfyUI 기반 아키텍처는 단순한 블랙박스가 아닙니다 — 각 구성 요소를 커스터마이징하고, 모델을 교체하고, 자신만의 비디오 생성 워크플로를 구축할 수 있습니다.\n가장 적합: 빠른 비디오 제작이 필요한 콘텐츠 크리에이터, 교육자, 마케터, 개발자\nGitHub: https://github.com/AIDC-AI/Pixelle-Video\n마지막 업데이트: 2026-05-06\n","date":"May 15, 2026","permalink":"https://dibi8.com/kr/resources/ai-tools/pixelle-video-ai-short-video-generator/","section":"AI 源码资源","summary":"","title":"Pixelle-Video 리뷰: AI 완전 자동 쇼트 비디오 생성 엔진, 주제 입력으로 완성된 영상"},{"content":"{\u0026lt;/* resource-info */\u0026gt;}\nPolymarket Agents란? #Polymarket Agents는 Polymarket — 세계 최대의 예측 시장 플랫폼 — 에서 AI가 자율적으로 거래하는 에이전트를 구축하기 위한 오픈소스 개발자 프레임워크 및 유틸리티 세트입니다.\n이 프레임워크는 개발자가 다음을 할 수 있게 합니다:\n🤖 시장을 분석하고 자동으로 거래를 실행하는 AI 에이전트 구축 📊 실시간 시장 데이터를 위한 Polymarket API 통합 🔍 정보에 입각한 거래 결정을 위한 RAG(검색 증강 생성) 사용 📰 베팅 서비스, 뉴스 제공업체, 웹 검색에서 데이터 소싱 🧠 프롬프트 엔지니어링 및 시장 분석을 위한 포괄적인 LLM 도구 활용 🔗 GitHub: https://github.com/Polymarket/agents\nPolymarket이란? #Polymarket은 사용자가 실제 세계 이벤트의 결과를 거래할 수 있는 분산형 예측 시장 플랫폼입니다:\n정치 — 선거 결과, 정책 결정 암호화폐 — 비트코인 가격 예측, ETF 승인 스포츠 — 경기 결과, 챔피언십 우승자 과학 — 연구 돌파구, 우주 임무 엔터테인먼트 — 수상자, 박스오피스 결과 거래자는 예측에 따라 \u0026ldquo;예\u0026rdquo; 또는 \u0026ldquo;아니오\u0026rdquo; 주식을 구매하며, 가격은 시장의 합의 확률을 반영합니다.\n핵심 기능 # 기능 설명 Polymarket API 통합 시장 데이터, 주문장, 거래 실행에 대한 전체 액세스 AI 에이전트 유틸리티 자율 거래 에이전트 구축을 위한 도구 로컬 및 원격 RAG 뉴스 및 시장 데이터 검색을 위한 벡터 데이터베이스 지원 다중 소스 데이터 베팅 서비스, 뉴스 API, 웹 검색 통합 LLM 프롬프트 엔지니어링 맥락 인식 추론을 위한 포괄적인 도구 CLI 인터페이스 시장 분석 및 거래를 위한 명령줄 도구 Docker 지원 쉬운 설정을 위한 컨테이너화된 배포 MIT 라이선스 무료 오픈소스 아키텍처 #Polymarket Agents는 개별 커뮤니티 멤버가 유지 관리하고 확장할 수 있는 모듈식 구성 요소를 특징으로 합니다:\n핵심 API # 구성 요소 목적 Chroma.py 뉴스 소스 및 API 데이터를 위한 벡터 데이터베이스 Gamma.py 시장 메타데이터를 가져오기 위한 Polymarket Gamma API 클라이언트 Polymarket.py 시장 데이터 및 거래 실행을 위한 주요 API 클래스 Objects.py 거래, 시장, 이벤트를 위한 Pydantic 데이터 모델 CLI 명령 #Polymarket과 상호작용하기 위한 주요 사용자 인터페이스:\n# 거래량별로 정렬된 모든 시장 가져오기 python scripts/python/cli.py get-all-markets --limit 10 --sort-by volume # 특정 시장 세부 정보 가져오기 python scripts/python/cli.py get-market --market-id \u0026lt;MARKET_ID\u0026gt; # 거래 실행 python scripts/python/cli.py trade --market-id \u0026lt;MARKET_ID\u0026gt; --side buy --size \u0026lt;SIZE\u0026gt; 빠른 시작 #1. 저장소 클론 #git clone https://github.com/polymarket/agents.git cd agents 2. 환경 설정 ## 가상 환경 생성 virtualenv --python=python3.9 .venv source .venv/bin/activate # 의존성 설치 pip install -r requirements.txt 3. API 키 구성 #.env 파일 생성:\nPOLYGON_WALLET_PRIVATE_KEY=\u0026#34;귀하의 지갑 개인 키\u0026#34; OPENAI_API_KEY=\u0026#34;귀하의 OpenAI API 키\u0026#34; 4. 지갑에 USDC 충전 #거래를 위해 Polygon 지갑으로 USDC를 이체합니다.\n5. CLI 실행 ## Python 경로 설정 export PYTHONPATH=\u0026#34;.\u0026#34; # CLI 실행 python scripts/python/cli.py 또는 직접 거래 실행:\npython agents/application/trade.py 6. Docker 대안 #./scripts/bash/build-docker.sh ./scripts/bash/run-docker-dev.sh 거래 전략 #Polymarket Agents는 다양한 AI 기반 거래 전략을 지원합니다:\n1. 뉴스 기반 거래 # 이벤트 진행 상황을 위한 뉴스 소스 모니터링 감정 및 영향 분석을 위한 LLM 사용 예측 결과에 기반한 거래 실행 2. 차익 거래 감지 # 관련 시장 간 가격 비교 잘못定价된 확률 식별 무위험 차익 거래 실행 3. 추세 추종 # 시장 거래량 및 가격 변동 분석 특정 시장의 모멘텀 식별 추세를 따라 수익 확보 4. 기본적 분석 # 이벤트 배경 및 요인 연구 RAG를 사용한 역사적 데이터 쿼리 정보에 입각한 예측 수행 데이터 소스 #프레임워크는 여러 데이터 소스를 통합합니다:\n소스 유형 사용 사례 뉴스 API 실시간 뉴스 이벤트 추적 웹 검색 일반 정보 배경 연구 베팅 서비스 배당률 비교 가격 발견 소셜 미디어 감정 분석 트렌드 감지 온체인 데이터 거래 데이터 시장 인텔리전스 RAG 구현 #정보에 입각한 거래를 위한 검색 증강 생성:\n벡터 데이터베이스 — Chroma DB가 뉴스 기사 및 시장 데이터 저장 임베딩 — 의미 검색을 위해 텍스트를 벡터로 변환 검색 — 시장 맥락에 기반한 관련 정보 쿼리 생성 — LLM이 검색된 데이터를 거래 결정으로 종합 리스크 관리 #자동 거래에 대한 중요 고려사항:\n리스크 완화 조치 시장 리스크 포지션 크기 조정, 손절매 유동성 리스크 높은 거래량 시장에서 거래 모델 리스크 실제 거래 전 전략 백테스트 운영 리스크 봇 성능 정기 모니터링 규제 리스크 현지 규정 준수 다른 도구와 비교 # 기능 Polymarket Agents 커스텀 봇 수동 거래 오픈소스 ✅ 다양함 해당 없음 AI 통합 ✅ 선택적 ❌ RAG 지원 ✅ 드묾 ❌ 다중 소스 데이터 ✅ 선택적 ❌ CLI 인터페이스 ✅ 다양함 해당 없음 커뮤니티 ✅ 다양함 ❌ 속도 빠름 빠름 느림 감정 없음 ✅ ✅ ❌ 사용 사례 #1. 정치 이벤트 거래 # 선거 결과 정책 결정 입법 투표 2. 암호화폐 시장 예측 # 비트코인 가격 움직임 ETF 승인 규제 결정 3. 스포츠 베팅 # 경기 결과 챔피언십 우승자 선수 성과 4. 엔터테인먼트 시장 # 수상자 박스오피스 예측 리얼리티 쇼 결과 관련 저장소 # 저장소 목적 py-clob-client Polymarket CLOB용 Python 클라이언트 python-order-utils 주문 생성 및 서명 clob-client CLOB용 TypeScript 클라이언트 Langchain 맥락 인식 추론 Chroma 벡터 데이터베이스 읽을 자료 # 예측 시장: 병목 현상과 다음 주요 해결책 암호화폐 + AI 애플리케이션 작성자: Vitalik Buterin 슈퍼예측 관련 기사 # 28 Tools Behind a $1M Polymarket Trading Bot: Full Stack Breakdown — 완전한 거래 봇 아키텍처 Code Vault — 7개의 오픈소스 암호화폐 레이더 및 트레이딩 도구 — Python 거래 자동화 Free Claude Code: Claude Code CLI를 무료로 사용할 수 있는 오픈소스 프록시 도구 — AI 코딩 어시스턴트 결론 #Polymarket Agents는 예측 시장에서 AI 기반 거래 봇을 구축하기 위한 견고한 기반을 제공합니다. 모듈식 아키텍처, 포괄적인 API 통합 및 RAG 기능은 초보자와 경험丰富的 개발자 모두에게 적합합니다.\n가장 적합한 대상: 알고리즘 거래, 예측 시장, AI 기반 의사결정에 관심 있는 개발자\nGitHub: https://github.com/Polymarket/agents\n마지막 업데이트: 2026-05-06\n","date":"May 15, 2026","permalink":"https://dibi8.com/kr/resources/llm-frameworks/polymarket-agents-ai-trading-bot-framework/","section":"AI 源码资源","summary":"","title":"Polymarket Agents: Polymarket 예측 시장용 AI 자동 거래 봇 구축"},{"content":"{\u0026lt;/* resource-info */\u0026gt;}\n소개 #1,003,450달러 수익. 3,062개 예측. 하나의 지갑.\n트레이더들이 Polymarket에서 지갑 주소 0x55be7aa03ecfbe37aa5460db791205f7ac9ddca3의 성장 궤적을 처음 보았을 때, 첫 반응은 간단했습니다: 가짜다. 소매 투자자 지갑으로 7자리 수익을 낸다는 것은 Telegram 사기 그룹의 이야기처럼 들리지, 검증 가능한 온체인 데이터가 아닙니다.\n하지만 블록체인은 거짓말하지 않습니다. 모든 거래는 공개적입니다. 모든 결제는 검증 가능합니다.\n이 글은 이 모든 것을 가능하게 한 28개 도구 기술 스택을 완전히 매핑합니다 — AI 추론부터 프로덕션 실행까지 6개 레이어. 자신만의 봇을 구축하든, 수익성 있는 트레이더를 단순히 복사하든, 이것이 청사진입니다.\n![Polymarket 트레이딩 대시보드](https://picsum.photos/seed/crypto-trading/800/450\nPolymarket이란 무엇이며, 엣지는 어디에 있는가 #Polymarket은 이진 결과에 대해 거래하는 예측 시장입니다. 각 계약은 1.00달러(정답) 또는 0.00달러(오답)로 결제됩니다. 0.73달러에 거래되는 계약은 시장이 \u0026ldquo;예\u0026rdquo; 결과가 73% 확률로 발생한다고 믿는다는 의미입니다.\n해당 플랫폼은 2026년 초 주간 거래량이 20억 달러를 초과했습니다.\n구조적 취약점 #자동화 트레이딩의 핵심 카테고리는 단기 암호화폐 계약 — 5분 및 15분 BTC와 ETH 상승/하락 문제입니다. 빠르게 결제되고, 즉각적인 피드백을 제공하며, 중요한 취약점이 있습니다:\nPolymarket의 가격 업데이트 속도가 Binance의 기초 자산 이동 속도보다 느립니다.\n2024년, 이 지연은 평균 12초였습니다. 2026년 1분기까지 경쟁이 이를 2.7초로 압축했습니다.\n기계에게 2.7초는 영원입니다.\n이 격차 — Binance가 이미 아는 가격과 Polymarket이 여전히 표시하는 가격 사이의 격차 — 이 모든 전략의 기반입니다.\n브라우저가 비디오 태그를 지원하지 않습니다. 차익거래 메커니즘, 단계별 설명 #15분 BTC 계약이 50/50으로 시작합니다. 10분 후, 비트코인이 30초 만에 Binance에서 0.6% 하락합니다. 만기 시 BTC가 더 낮을 \u0026ldquo;실제\u0026rdquo; 확률이 대략 78%로 변했습니다. Polymarket은 여전히 54/46을 표시합니다.\n이것은 이진 계약에서 24포인트의 엣지입니다.\nBinance WebSocket 피드를 50ms 미만의 지연으로 모니터링하는 봇:\n가격 차이를 감지합니다 켈리 기준을 사용하여 엣지 크기를 계산합니다 Polymarket의 CLOB API를 통해 실행합니다 2초 후, 시장이 수정됩니다 포지션이 수익적으로 청산됩니다 하루에 200-500회 반복합니다. 이것이 coinman2의 결과입니다. 마법이 아닙니다 — 여전히 존재하는 격차의 산업 규모 이용입니다.\n![지연 차익거래 다이어그램](https://picsum.photos/seed/crypto-trading/800/450\n완전한 기술 스택: 6레이어, 28개 도구 #레이어 1 - 브레인: AI 추론 #coinman2 봇은 Anthropic의 Claude에서 실행되었습니다. 2026년 3월, 통제 실험에서 Claude를 OpenClaw 프레임워크와 비교했습니다 — 동일한 시작 자본(1,000달러), 동일한 시장 조건, 48시간:\nClaude: +1,322% 수익률 OpenClaw: 완전 청산 격차는? 리스크 관리 품질. Claude가 생성한 코드는 더 보수적인 기본 매개변수, 더 나은 엣지 케이스, 더 깔끔한 오류 처리를 포함했습니다.\n도구 용도 링크 Claude (Anthropic) 주요 전략가. 시장 문제를 추론하고, 현재 가격 대비 확률을 추정합니다 anthropic.com Qwen3-Coder 오픈소스 코딩 LLM. 실시간 성능을 모니터링하고, 자율적으로 모듈을 재작성합니다 GitHub G0DM0D3 검열되지 않은 AI 인터페이스, 불편한 시장 주장을 처리합니다 GitHub Claude Squad 여러 Claude 인스턴스를 병렬로 실행하여 다양한 시장 부문을 커버합니다 GitHub 레이어 2 - 오케스트레이션: 에이전트가 실행하게 만들기 #실행 레이어가 없는 추론 엔진은 단순한 의견 생성기입니다.\n도구 용도 링크 Agency Agents 불 vs 곰 토론, 리스크 매니저 거부권 GitHub ClaudeAgent OneClick 원클릭 배포. 24/7 시장 감시, 몇 분 안에 시작 GitHub MiroThinker 필수 사고의 사슬 레이어. 봇은 진입 전 모든 포지션을 정당화해야 합니다 GitHub Superpowers 에이전트에 웹 접근, 파일 작업, 임의 API 호출 확장 GitHub TradingAgents 다중 에이전트 프레임워크: 펀더멘탈 + 기술적 + 감성 분석가 GitHub ![다중 에이전트 트레이딩 아키텍처](https://picsum.photos/seed/crypto-trading/800/450\n레이어 3 - 데이터 \u0026amp; 시장 신호: 눈 #봇은 볼 수 있는 것만큼만 좋습니다.\n도구 용도 링크 OpenBB 오픈소스 블룸버그. 100+ 데이터 소스 통합 GitHub Dexter 자율 심층 연구. SEC 파일, 실적 전화 회의록 GitHub MCP Server MCP 프로토콜을 통해 Claude의 컨텍스트에 금융 데이터 세트 GitHub Crucix 온체인 집계기. Polygon의 고래 지갑 움직임 GitHub fredapi 연방준비제도 데이터 세트: CPI, 실업률, 수익률 곡선 GitHub Binance Collector 단기 BTC/ETH 계약의 시장 방향 예측 GitHub Polymarket Assistant Tool 라이브 시장에서 방향 편향을 표시하는 지표 엔진 GitHub lightweight-charts TradingView의 차팅 라이브러리. 14k 스타, 45KB GitHub ![트레이딩 데이터 대시보드](https://picsum.photos/seed/crypto-trading/800/450\n레이어 4 - 시장 인텔리전스: 타인의 성과 #모든 것을 처음부터 구축할 필요는 없습니다.\n도구 용도 링크 Polyscope 2,000+ 시장 스캔. 고래 알림을 Telegram으로 thepolyscope.com Polywhaler 10,000달러+ 고래 거래 추적기, AI 신호 포함 polywhaler.com WHALES tracker 스마트 머니 컨센서스, 건강 점수, 신뢰 점수 Apify HyperBuildX bot Rust 기반, 100ms 미만 지연. AI 카피 트레이드 순위 GitHub polymarketanalytics.com 오픈 트레이더 분석, 상위 지갑 P\u0026amp;L polymarketanalytics.com polyrec 실시간 터미널, 70+ 지표, 내장 백테스터 GitHub Polymarket-Trading-Bot 53,000줄 TypeScript. 7개 사전 구축 전략 GitHub ![Polymarket 분석 대시보드](https://picsum.photos/seed/crypto-trading/800/450\n레이어 5 - 백테스트 \u0026amp; 시뮬레이션: 실행 전에 증명 #이것은 대부분의 소매 봇이 건너뛰는 레이어 — 그리고 대부분이 폭발하는 이유입니다.\n도구 용도 링크 prediction-market-backtesting 실제 역사적 Polymarket/Kalshi 데이터에 대해 전략 백테스트 GitHub polybot 모의 트레이딩이 있는 전체 실행 인프라. Kafka, ClickHouse, Grafana GitHub ![백테스트 결과 차트](https://picsum.photos/seed/crypto-trading/800/450\n레이어 6 - 실행 인프라 #Polymarket은 4개 API 표면을 노출합니다:\nGamma API - 시장 데이터, 가격, 메타데이터 CLOB API - 주문장, 거래 실행 온체인 결제 - Polygon(체인 ID 137), USDC WebSocket 피드 - 실시간 가격 업데이트 공식 Python 클라이언트 py-clob-client는 이 모든 것을 래핑합니다. 주문장을 가져오는 데 3줄. 서명된 한도 주문을 하는 데 5줄.\n핵심 저장소:\nPolymarket/agents - LangChain이 이미 통합된 공식 AI 에이전트 프레임워크 polyterm - 고래 추적기가 있는 터미널 대시보드 완전한 신호 흐름 #세계 이벤트 → Binance WebSocket (50ms) → AI 분석 → 켈리 사이징 → CLOB API 주문 → Polygon 결제 → 포지션 모니터링 → 수익/손실 이상적인 경로의 총 지연: 10초 미만.\n인간 vs 봇: 성능 격차 #봇은 추적 기간 동안 약 206,000달러를 생성했습니다. 동일한 로직을 사용하는 인간은 약 100,000달러를 생성했습니다.\n2배 격차. 동일한 시장. 동일한 전략. 동일한 시간 창.\n인간이 저지르는 4가지 체계적 오류:\n늦은 진입 - 인간이 움직임을 확인할 때쯤이면 창이 이미 닫혔습니다 일관성 없는 사이징 - 감정적 사이징은 수천 건의 거래에서 기대 가치를 파괴합니다 피로 - 인간은 8시간 후에 성능이 저하됩니다. 봇은 72시간째에도 1시간째와 동일합니다 드로다운 심리 - 인간은 작동하는 전략을 포기하거나 배팅을 두 배로 늘립니다 ![인간 vs 봇 성능 비교](https://picsum.photos/seed/crypto-trading/800/450\n왜 지금이 기회인가 #이미 실행 중인 봇은 복리 이점을 가지고 있습니다. 엣지는 오늘도 존재합니다. 창은 12초에서 2.7초로 좁혀지고 있지만, 완전히 닫히지는 않았습니다.\n이 스택을 이해할 최적의 시기는 6개월 전이었습니다. 두 번째로 좋은 시기는 바로 지금입니다.\n시작하기: 당신의 첫 1,000달러 #전체 스택을 구축하는 것이 너무 복잡하게 느껴진다면, 더 간단하게 시작하세요:\nPolymarket 계정 개설: polymarket.com coinman2 지갑 연구: polymarket.com/@coinman2 Telegram 봇으로 거래 복사: kreo.app/@cvxv666 이 글을 북마크하세요 - 구축할 때 이러한 도구 참조가 필요할 것입니다 결론 #이것은 빠른 부의 스킴이 아닙니다. 이것은 예측 시장의 구조적 비효율을 이용하는 산업급 차익거래 작전입니다. 100만 달러의 수익은 한 번의 운 좋은 거래가 아닌, 3,062개의 예측에서 나왔습니다.\n기술 스택은 열려 있습니다. 도구는 무료입니다. 엣지는 실제입니다. 유일한 질문은, 당신이 **실제로 구축할 0.01%**가 될 것인지, 아니면 가짜라고 외치고 떠날 99.9%가 될 것인지입니다.\n기억하세요: 경쟁은 보이는 것보다 약합니다. 대부분의 사람들은 \u0026ldquo;너무 어렵다\u0026quot;고 외치며 가짜라고 할 것입니다. 구축자만이 먹습니다.\n리소스 및 링크 # Polymarket 공식 coinman2 지갑 프로필 Polymarket/agents GitHub OpenBB 터미널 원본 X 글 @antpalkin 면책 조항: 이 글은 교육 목적으로만 작성되었습니다. 예측 시장 트레이딩은 상당한 위험을 수반합니다. 과거 성과가 미래 결과를 보장하지 않습니다. 트레이딩 전 반드시 자체 연구를 수행하세요.\n","date":"May 15, 2026","permalink":"https://dibi8.com/kr/resources/dev-utils/polymarket-trading-bot-stack/","section":"AI 源码资源","summary":"","title":"Polymarket 트레이딩 봇 기술 스택: 28개 도구로 100만 달러 벌기"},{"content":"{\u0026lt;/* resource-info */\u0026gt;}\nEXPLAIN ANALYZE 출력은 실제로 중요한 세 숫자를 알기 전까지는 위협적으로 보입니다. 여기 내가 그것들을 읽는 순서와 특정 버그를 가리키는 패턴이 있습니다.\n실제로 중요한 세 숫자 #1. 총 실행 시간 (Total Execution Time) #Total runtime: 1234.567 ms 가장 중요한 지표입니다. 쿼리가 느리면 여기에서 알려줍니다.\n2. 실제 행 수 vs 예상 행 수 (Actual vs Estimated Rows) #Seq Scan on users (cost=0.00..123.45 rows=1000 width=32) (actual time=1.234..567.890 rows=50000 loops=1) 거대한 차이는 플래너가 잘못된 가정을 했다는 것을 나타냅니다.\n3. 버퍼 히트 비율 (Buffer Hit Ratio) #Buffers: shared hit=1000 read=50 높은 히트율 = 좋은 캐시 사용, 낮은 히트율 = 디스크 I/O 문제.\n읽는 순서 # 아래에서 시작 - 총 실행 시간 위쪽으로 작업 - 가장 비용이 많이 드는 노드 찾기 행 수 추정 확인 - 실제 vs 추정 버퍼 통계 보기 - I/O 패턴 일반적인 문제 패턴 #인덱스 스캔이어야 할 때 순차 스캔 #Seq Scan on large_table (cost=1000.00..2000.00 rows=100000 width=32) 해결책: 적절한 인덱스 추가\n해시 조인이어야 할 때 중첩 루프 #Nested Loop (cost=1000.00..100000.00 rows=1000 width=64) -\u0026gt; Seq Scan on users -\u0026gt; Index Scan on orders 해결책: work_mem 증가 또는 쿼리 재작성\n너무 많은 버퍼 미스 #Buffers: shared hit=10 read=1000 해결책: shared_buffers 증가 또는 쿼리 개선\n디스크로 정렬 오버플로 #Sort Method: external merge Disk: 16384kB 해결책: work_mem 증가\n실제 적용 #이러한 통찰은 내가 식별하고 수정하는 데 도움이 되었습니다:\n누락된 인덱스 비효율적인 조인 순서 메모리 부족 문제 캐시 미스 기억하세요: EXPLAIN ANALYZE는 쿼리 성능 디버거입니다. 그것을 읽는 법을 배우면 추측에 수많은 시간을 절약할 수 있습니다.\n","date":"May 15, 2026","permalink":"https://dibi8.com/kr/resources/ai-tools/reading-explain-analyze-postgres/","section":"AI 源码资源","summary":"","title":"PostgreSQL에서 EXPLAIN ANALYZE 출력 읽기 - 길을 잃지 않게"},{"content":"{\u0026lt;/* resource-info */\u0026gt;}\nRR6958에 오신 것을 환영합니다 - 온라인 엔터테인먼트의 정점 #2026년, 온라인 카지노 산업이 계속 번창함에 따라 RR6958은 세계적 수준의 게임 경험을 제공하는 최고의 목적지로 두드러집니다. 10년 이상의 전문성으로 RR6958은 전 세계 수백만 플레이어를 위해 공정하고 투명하며 고도로 재미있는 플랫폼을 제공하며 수천 가지 다양한 게임과 24/7 최고 수준의 고객 서비스를 제공합니다.\n지금 등록하여 100%% 보너스 청구\nRR6958을 선택하는 이유? #1. 수백 가지 흥미진진한 카지노 게임 #RR6958은 비교할 수 없는 게임 경험을 제공합니다:\n매력적인 딜러와 라이브 바카라 모든 선호도에 맞는 룰렛 변형 간단한 규칙과 높은 승리로 블랙잭 거대한 잭팟이 있는 슬롯 머신 포커, 시크보, 드래곤 타이거 등 2. 관대한 보너스와 프로모션 # 첫 입금 보너스: 초기 입금에 최대 200%% 주간 캐시백: 레벨에 따라 5-15%% 충성도 프로그램: 실제 돈으로 변환되는 포인트 특별 이벤트: 휴일 동안 이중 보너스 3. 절대적인 보안과 공정성 # 모든 데이터를 보호하는 SSL 256비트 암호화 국제 기관에서 인증한 RNG 1-5분 내 초고속 지급 전문 팀의 24/7 지원 4. 사용자 친화적 인터페이스 # 모바일 플레이를 위한 반응형 디자인 영어를 포함한 다국어 지원 라이브 채팅 지원 iOS/Android 편리한 모바일 앱 RR6958에 등록하는 방법 #시작하는 것은 간단합니다 - 단 3단계:\n등록 페이지 방문: RR6958에서 등록 세부 정보 입력: 이름, 이메일, 전화번호 확인 및 입금: 즉시 보너스 받기 RR6958의 다양한 결제 방법 #RR6958은 베트남의 모든 인기 결제 옵션을 지원합니다:\n베트남 은행 송금 (BIDV, Vietcombank, Techcombank) 전자 지갑 (Momo, ZaloPay, ViettelPay) 전화 카드 (Vinaphone, Mobifone, Viettel) 암호화폐 (비트코인, 이더리움, USDT) 대면 결제를 위한 현지 에이전트 RR6958에서 플레이하는 독점 혜택 #프리미엄 게임 경험 # 번개 같은 속도를 위한 베트남 서버 4K 그래픽과 몰입형 사운드 필리핀 출신 실제 딜러 중단 없는 원활한 게임 플레이 지속적인 프로모션 프로그램 # 모든 회원을 위한 일일 보너스 주말 3배 보너스 적극적인 플레이어를 위한 월간 보상 독점 이벤트와 토너먼트 5성급 고객 서비스 # 핫라인: 1900 XXX XXX (무료 통화) 이메일: support@rr6958.com 24/7 라이브 채팅 베트남어를 구사하는 지원 직원 RR6958 - 베트남 플레이어의 넘버 1 선택 #10년 이상의 개발 끝에 RR6958은 전 세계 수백만 플레이어를 자랑스럽게 서비스하며 다음과 같습니다:\n전 세계 1000만+ 회원 모든 카테고리 1000+ 게임 월별 지급 수십억 잭팟 99.9%% 지급 성공률 오늘 RR6958 커뮤니티에 참여할 기회를 놓치지 마세요!\n무료 등록 및 200%% 보너스 청구\nRR6958 2026 인기 게임 #VIP 바카라 #프로페셔널 플레이어를 위한 프리미엄 게임, 베팅의 최대 9배 지급.\n유럽 룰렛 #높은 승률과 매력적인 보너스가 있는 클래식 운명의 바퀴.\n잭팟 슬롯 #수백 대의 슬롯 머신이 백만 달러 잭팟을 치기를 기다리고 있습니다.\nRR6958에서 안전한 도박 팁 # 항상 책임감 있게 플레이하고 예산을 초과하지 마세요 일일 프로모션 확인 전략을 배우기 위해 회원 그룹 참여 추가 보너스를 위한 추천 코드 사용 추천 코드 vbx2083으로 등록\n자주 묻는 질문 #RR6958이 베트남에서 합법적인가요? #RR6958은 국제 라이선스 하에 운영되며 베트남 데이터 보호법을 준수합니다.\n출금에 얼마나 걸리나요? #출금은 1-5분 내에 처리됩니다.\n모바일 앱이 있나요? #예, CH Play와 App Store에서 다운로드 가능합니다.\n첫 입금 보너스는 무엇인가요? #첫 입금에 200%% 보너스, 즉시 적용.\n200%% 보너스로 지금 등록\n결론 - RR6958은 온라인 카지노의 미래입니다 #2026년 디지털 시대에 RR6958은 첨단 기술과 탁월한 서비스로 계속 선두를 달리고 있습니다. 지금 참여하여 차이를 경험하세요!\nRR6958 참여 - 베트남 최고의 카지노\n참고: 책임감 있게 플레이하세요. RR6958은 건강한 게임 습관을 장려합니다.\n","date":"May 15, 2026","permalink":"https://dibi8.com/kr/resources/ai-tools/gioi-thieu-rr6958/","section":"AI 源码资源","summary":"","title":"RR6958 소개 - 최고의 온라인 카지노 경험"},{"content":"{\u0026lt;/* resource-info */\u0026gt;}\nScanners-Box란? #Scanners-Box는 보안 전문가, 침투 테스트 전문가 및 윤리적 해커를 위한 200개 이상의 오픈소스 사이버보안 도구를 엄선하여 모은 컬렉션입니다. 원래 중국 보안 커뮤니티(t00ls)를 위해 만들어졌으며, 정찰부터 공격까지 사이버보안의 모든 측면을 다룹니다.\nGitHub: https://github.com/luckybbjason1/Scanners-Box\n라이선스: 오픈소스 모음\n도구 수: 200+\n카테고리: 15+\n도구 카테고리 개요 # 카테고리 도구 수 예시 하위 도메인 열거 15+ subDomainsBrute, amass, subfinder, OneForAll 데이터베이스 \u0026amp; SQL 인젝션 10+ sqlmap, jsql-injection, SQLiScanner, NoSQLAttack 퍼징 도구 20+ AFL, honggfuzz, syzkaller, libFuzzer 포트 스캐닝 \u0026amp; 핑거프린팅 25+ Nmap, masscan, whatweb, wafw00f 약한 비밀번호 \u0026amp; 정보 유출 15+ htpwdScan, BBScan, GitHack, truffleHog IoT 장치 스캐닝 5+ IoTSeeker, RouterSploit, routersploit XSS 공격 10+ BruteXSS, XSS-Radar, XSSTracer, easyXssPayload 사회 공학 15+ SET, gophish, evilginx2, blackeye 웹셸 탐지 10+ findWebshell, HaboMalHunter, PHP-Shell-Detector 기업 네트워크 감사 5+ theHarvester, xunfeng, LNScan 취약점 스캐너 15+ vulfocus, vulhub, VulApps, upload-labs 무선 보안 5+ fern-wifi-cracker, aircrack-ng 자산 발견 5+ linglong, H, nemo_go, NextScan 위협 인텔리전스 3+ threat-intelligence, VirusTotal, ThreatBook 학습 리소스 20+ sec-wiki, FreeBuf, Web Hacking 101 주요 도구 심층 분석 #1. 하위 도메인 열거 #OneForAll — 가장 포괄적인 하위 도메인 수집 도구\n20개 이상의 데이터 소스 통합 더 나은 결과를 위한 API 키 지원 다양한 형식으로보내기 amass — Go 기반 하위 도메인 열거\n빠르고 효율적 DNS, 스크래핑, 인증서 투명성 그래프 시각화 출력 2. SQL 인젝션 #sqlmap — SQL 인젝션 도구의 왕\n자동 감지 및 공격 6가지 데이터베이스 유형 지원 WAF 우회용 변조 스크립트 # 기본 사용법 sqlmap -u \u0026#34;http://target.com/page.php?id=1\u0026#34; --dbs # 특정 테이블 덤프 sqlmap -u \u0026#34;http://target.com/page.php?id=1\u0026#34; -D database -T users --dump 3. 퍼징 프레임워크 #AFL (American Fuzzy Lop) — 커버리지 기반 퍼징\n자동으로 취약점 발견 테스트 케이스 생성 실제 소프트웨어에서 1000개 이상의 버그 발견 syzkaller — Linux 커널 퍼저\n3000개 이상의 Linux 커널 버그 발견 Google, Microsoft 사용 다양한 운영 체제 지원 4. 포트 스캐닝 #Nmap — 네트워크 스캐너의 왕\n# 기본 스캔 nmap -sV -sC target.com # 스크립트가 포함된 전체 포트 스캔 nmap -p- -sV --script=vuln target.com # 공격적 스캔 nmap -A target.com masscan — 가장 빠른 인터넷 포트 스캐너\n6분 만에 전체 인터넷 스캔 Nmap과 호환 비동기 전송 5. 사회 공학 도구킷 #SET (Social-Engineer Toolkit) — 완전한 피싱 프레임워크\n웹사이트 복제 이메일 스피어 피싱 자격 증명 수집 다중 공격 벡터 evilginx2 — 2FA 우회 피싱 프레임워크\n중간자 공격 세션 쿠키 캡처 이중 인증 우회 보안 학습 리소스 #입문자용 # sec-wiki — 보안 위키백과 FreeBuf — 해커와 기술자 뉴스 Web Hacking 101 — 웹 보안 기초 Kali Linux Web 침투 테스트 요리책 중급자용 # Burpsuite 실전 가이드 — 웹 침투 테스트 API-Security-Checklist — API 보안 모범 사례 Web-Security-Learning — 종합 웹 보안 응급 대응 실전 노트 — 응급 대응 고급 주제 # Linux 익스플로잇 개발 튜토리얼 Android 침투 테스트 Node.js 웹 보안 문제 Python 보안 시리즈 취약점 타겟 연습 # 플랫폼 설명 링크 vulfocus Docker 기반 취약점 플랫폼 GitHub vulhub 사전 구축된 취약한 환경 GitHub VulApps 취약한 애플리케이션 모음 GitHub upload-labs 파일 업로드 취약점 연습 GitHub bWAPP 버그가 있는 웹 애플리케이션 SourceForge DVWA 매우 취약한 웹 애플리케이션 GitHub WebGoat OWASP 웹 보안 연습 GitHub 책임 있는 공개 # ⚠️ 경고: 여기에 나열된 모든 도구는 승인된 보안 테스트용으로만 사용됩니다. 이러한 도구를 명시적 허가 없이 시스템에 사용하는 것은 불법이며 비윤리적입니다.\n법적 프레임워크 # CFAA (컴퓨터 사기 및 남용법) — 미국 컴퓨터 남용법 — 영국 사이버보안법 — 중국 GDPR — EU 데이터 보호 모범 사례 # 항상 서면 승인을 받으세요 범위를 명확히 정의하세요 업무 시간을 존중하세요 발견 사항을 즉시 보고하세요 테스트 후 데이터를 삭제하세요 도구 선택 가이드 #웹 애플리케이션 테스트 #정찰: amass, subfinder, theHarvester 스캐닝: Nmap, masscan, whatweb 취약점: sqlmap, XSS 스캐너, dirsearch 공격: Burp Suite, 사용자 지정 스크립트 보고: Dradis, Faraday 네트워크 침투 테스트 #발견: Nmap, masscan, nbtscan 열거: enum4linux, snmp-check 취약점: OpenVAS, Nessus 공격: Metasploit, Cobalt Strike 후 공격: PowerShell Empire, Mimikatz 레드팀 작전 #초기 접근: SET, gophish, evilginx2 지속성: 사용자 지정 임플란트, 예약된 작업 권한 상승: PowerUp, BeRoot 측면 이동: Pass-the-hash, Kerberoasting 데이터 유출: DNS 터널링, HTTPS C2 관련 기사 # Agent Reach: AI 에이전트 인터넷 접근 — AI 기반 보안 자동화 Code Vault: 7가지 암호화폐 거래 도구 — 금융 보안 도구 Free Claude Code: 오픈소스 AI 코딩 — 안전한 코딩 관행 면책 조항: 본 문서는 교육 목적으로만 제공됩니다. 모든 도구는 책임감 있게 사용해야 하며, 소유하고 있거나 명시적 테스트 허가를 받은 시스템에만 사용해야 합니다. 작성자와 dibi8.com은 제공된 정보의 오용에 대해 책임을 지지 않습니다.\n","date":"May 15, 2026","permalink":"https://dibi8.com/kr/resources/dev-utils/scanners-box-cybersecurity-tools-collection/","section":"AI 源码资源","summary":"","title":"Scanners-Box: 200+ 사이버보안 도구 모음 — 보안 전문가 필수"},{"content":"{\u0026lt;/* resource-info */\u0026gt;}\nPython 웹 스크래핑은 대략 네 시대를 거쳐 왔습니다. urllib과 정규식. 그다음 requests + BeautifulSoup. 그다음 진지한 작업은 전부 Scrapy. 그리고 웹의 절반이 JavaScript-only로 넘어가면서 앞의 셋이 절벽 아래로 떨어지고 Playwright가 그 자리를 차지했습니다.\nScrapling은 이 스택 위에 또 한 층을 쌓으려는 비교적 새로운 라이브러리 중 하나입니다. 간단한 페이지, JS가 무거운 페이지, 그리고 봇 차단으로 보호된 페이지까지 — 세 가지 케이스를 한 라이브러리에서 다루고, 세 가지 다른 라이브러리를 꿰매 붙이지 않아도 되게 만드는 것을 목표로 합니다.\n저는 이 프로젝트와 벤치마크, API를 한 차례 훑어봤습니다. 아래는 무엇이 진짜 흥미로운지, 무엇을 조심해야 하는지, 그리고 명백한 대안 대신 이걸 선택할 만한 상황에 대한 정리입니다.\n한 문장 정의 #Scrapling은 Python 3.10+ 스크래핑 프레임워크로, 세 가지 다른 페치 백엔드 — TLS 핑거프린트 위장이 들어간 일반 HTTP, 안티 디텍션이 적용된 stealth 모드 브라우저, 그리고 풀 Playwright 브라우저 — 를 동일한 셀렉터 API 뒤에 감싸 놓은 것입니다. 라이선스는 BSD-3-Clause.\n저장소의 태그라인은 \u0026ldquo;Effortless Web Scraping for the Modern Web\u0026rdquo; 인데, 이런 류의 문구는 모든 스크래핑 라이브러리가 합니다. 더 유용한 표현은 이쪽입니다: Scrapy의 spider 모델 + curl_cffi 의 TLS 핑거프린팅 + 디텍션을 피하는 Playwright를 한 번의 import 안에 합치려고 한 것.\n세 단계 페처 모델 #이 부분이 디자인에서 진짜 잘 만들어졌다고 느낀 곳입니다. 대부분 의 스크래핑 프로젝트는 결국 누더기가 됩니다 — 빠른 페이지엔 requests, JS가 무거운 페이지엔 Selenium이나 Playwright, 보호된 페이지엔 직접 짠 CDN 우회 코드. Scrapling은 이걸 세 계층으로 분리하면서도 응답 객체 모양은 통일해 둡니다:\nFetcher 백엔드 사용 시점 Fetcher TLS 핑거프린트 위장이 적용된 일반 HTTP 정적 HTML, 진짜 브라우저 불필요, 빠르게 StealthyFetcher 안티 디텍션 패치가 들어간 헤드리스 브라우저 Cloudflare/JS 보호 페이지, 진짜 브라우저가 필요할 때 DynamicFetcher Playwright/Chromium 풀 자동화 SPA, 복잡한 인증 플로우, JS로 렌더링되는 데이터 같은 Spider 클래스 안에서 요청마다 다른 계층을 지정할 수 있습니다. README의 예제를 보면:\nasync def parse(self, response: Response): for link in response.css(\u0026#39;a::attr(href)\u0026#39;).getall(): if \u0026#34;protected\u0026#34; in link: yield Request(link, sid=\u0026#34;stealth\u0026#34;) else: yield Request(link, sid=\u0026#34;fast\u0026#34;, callback=self.parse) 이게 왜 중요한지: 실제 크롤에서 무거운 백엔드가 정말 필요한 페이지는 일부에 불과합니다. 하지만 도중에 다시 짜기 귀찮아서 보통은 모든 페이지에 브라우저 비용을 그대로 지불하게 됩니다. 하나의 spider가 계층을 섞어 쓸 수 있다는 건, 평균 페이지 비용을 낮춰준다는 뜻입니다.\n벤치마크, 약간의 의심과 함께 #README는 5,000개의 중첩 요소를 파싱하는 숫자를 공개합니다:\n라이브러리 시간 상대값 Scrapling 2.02 ms 1.0× Parsel / Scrapy 2.04 ms 1.01× Raw lxml 2.54 ms 1.26× BeautifulSoup4 + lxml 1584.31 ms ~784× 여기서 정직한 두 가지 해석:\n예, BeautifulSoup은 실제로 그만큼 느립니다. 오타가 아닙니다. BS4는 사용성 우선 라이브러리이고, 많은 문서를 빡빡한 루프로 도는 작업에서는 lxml 기반 파서(Scrapling, Parsel, raw lxml 모두) 가 몇 자릿수 빠릅니다. 이건 알려진 결과지, Scrapling의 고유한 발견은 아닙니다.\n아니요, 파서 레이어에서 Scrapling이 실제로 Scrapy보다 빠르진 않습니다. 표를 보세요. Scrapy가 쓰는 Parsel은 2.04 ms, Scrapling은 2.02 ms. 마이크로벤치마크의 오차 범위 안입니다. \u0026ldquo;BS4보다 몇 자릿수 빠름\u0026quot;은 사실이지만 \u0026ldquo;Scrapy보다 빠름\u0026quot;은 파싱 레이어에서는 사실이 아닙니다.\nScrapling이 실제 워크로드에서 분명히 이기는 곳은 네트워크 레이어입니다 — Fetcher의 TLS 핑거프린트 위장 덕분에 \u0026ldquo;기본 JA3 핑거프린팅을 통과하기 위해 Playwright를 끼워 넣는\u0026rdquo; 비용을 건너뛸 수 있습니다. 절약 단위가 마이크로초가 아니라 초입니다.\n적응형 셀렉션 — 흥미로운 아이디어 #스크래핑의 진짜 고통은 첫 셀렉터를 짜는 게 아니라, 3주 뒤 대상 사이트가 클래스 이름을 바꿔서 셀렉터가 망가지는 일입니다. Scrapling이 이 부분에서 내세우는 건 \u0026ldquo;smart element relocation after website changes using similarity algorithms\u0026rdquo;(유사도 알고리즘으로 사이트 변경 후 요소를 재배치) — 즉 원래 셀렉터가 실패했을 때, 라이브러리가 이전에 캡처한 구조와의 구조적 유사도를 비교해 요소를 다시 찾으려 시도한다는 뜻입니다.\n이 부분은 조심스럽게 낙관적으로 봅니다. 누구나 원하는 기능입니다. 실무에서는 외형적 변경(클래스 이름 변경, 래퍼 div 추가) 에는 유사도 기반 재배치가 잘 동작할 거고, 의미적 재구성 (데이터가 다른 페이지로 이동, 섹션 자체가 새로 템플릿화됨)에는 실패할 겁니다. \u0026ldquo;클래스 이름 하나 바뀐 것 때문에 새벽 세 시에 일어나는 걸 막아주는\u0026rdquo; 기능으로 받아들이고, \u0026ldquo;스크래퍼가 이제 스스로 유지보수된다\u0026quot;라는 기능으로 오해하지 마세요.\n가장 단순하게 동작하는 코드 #문서에서 그대로 가져온, 가장 작은 예제는 이렇습니다:\nfrom scrapling.fetchers import Fetcher, FetcherSession with FetcherSession(impersonate=\u0026#39;chrome\u0026#39;) as session: page = session.get(\u0026#39;https://quotes.toscrape.com/\u0026#39;, stealthy_headers=True) quotes = page.css(\u0026#39;.quote .text::text\u0026#39;).getall() 끝입니다. \u0026ldquo;Chrome의 TLS 핑거프린트로 페치하고 파싱하기\u0026quot;가 세 줄. impersonate='chrome' 파라미터가 curl_cffi 스타일의 핑거 프린트 위장입니다. 대상 사이트가 기본 핑거프린트 기반의 봇 디텍션을 쓸 때 유용합니다.\nCloudflare로 보호된 페이지의 경우:\nfrom scrapling.fetchers import StealthyFetcher page = StealthyFetcher.fetch(\u0026#39;https://nopecha.com/demo/cloudflare\u0026#39;) data = page.css(\u0026#39;#padded_content a\u0026#39;).getall() StealthyFetcher는 별도 브라우저 설치가 필요합니다:\npip install \u0026#34;scrapling[fetchers]\u0026#34; scrapling install scrapling install 단계에서 패치된 Chromium 바이너리를 받아 옵니다. 새 서버 기준 수백 MB 의존성이라서, 작은 VM에 pip install 하기 전에 알아두는 게 좋습니다.\n명백한 대안과의 비교 # 필요한 것 손이 가는 도구 일회성 스크립트, 단순한 HTML, 학습 목적 requests + BeautifulSoup 큰 크롤, 잘 정의된 파이프라인, 성숙한 생태계 Scrapy 무거운 JS 앱, 복잡한 인증 플로우, 브라우저를 직접 제어 Playwright 직접 사용 TLS 핑거프린팅, 브라우저 오버헤드 없이 curl_cffi Cloudflare/Turnstile 보호된 정적-ish 페이지 cloudscraper 또는 Scrapling.StealthyFetcher 위 전부를 한 라이브러리에서 원할 때 Scrapling 가장 정직하게 말하자면: 프로젝트의 형태가 명확할 때(예: \u0026ldquo;이미 알고 있는 사이트의 1천만 개 상품 페이지를 크롤링한다\u0026rdquo;) 그 형태에 특화된 도구를 쓰세요. 큰 규모의 규율 있는 크롤에는 Scrapy가 여전히 정답이고, 진지한 브라우저 자동화에는 Playwright가 여전히 정답입니다. Scrapling의 가치는 형태가 명확하지 않은 프로젝트, 그러니까 그렇지 않으면 세 개의 스크래퍼를 동시에 유지해야 하는 프로젝트에 있습니다.\n조심해야 할 것 #안티 봇 우회는 움직이는 표적입니다. README도 이 점을 솔직히 인정합니다 — 엔터프라이즈급 시스템(Akamai, DataDome, Kasada, Incapsula)은 별도 솔루션이 필요하고, 이쪽은 약속하지 않습니다. Scrapling이 실제로 타깃하는 시스템 — 특히 Cloudflare Turnstile — 에 대해서도 오늘 되는 게 다음 분기에도 된다는 보장이 없다고 생각하세요. 비즈니스가 여기에 의존한다면 \u0026ldquo;한 번 설정하고 잊자\u0026rdquo; 가 아니라 지속적인 유지보수를 예산에 넣어야 합니다.\nrobots_txt_obey는 기본값이 아니라 opt-in입니다. 의도된 설계 결정입니다(어떤 사용자는 robots 파일을 무시할 합당한 이유가 있죠 — 예: 자기 사이트를 크롤하는 경우). 하지만 이는 의식적으로 켜야 한다는 뜻이기도 합니다. 제3자 사이트에서 켜는 걸 잊으면, 기술적으로 후회하기 전에 법정에서 먼저 후회하게 됩니다.\n은밀함 ≠ 허락. 라이브러리에는 인용할 만한 면책 조항이 있습니다:\n\u0026ldquo;이 라이브러리는 교육 및 연구 목적으로만 제공됩니다. 사용함으 로써 귀하는 현지 및 국제 데이터 스크래핑 및 개인정보 보호 법률을 준수하는 데 동의합니다.\u0026rdquo;\n안티 디텍션 능력은 합법적인 케이스에 유용합니다 — 연구, 아카 이빙, 접근성 스크래핑, 권한 있는 사이트 모니터링, 데이터 내보 내기를 막는 서비스에서 자기 데이터를 빼내기. 동시에 정확히 같은 능력이 광고 사기, 콘텐츠 도용, ToS 위반에 쓰입니다. 라이브러리는 당신이 어느 쪽을 하는지 신경 쓰지 않습니다. 법원과 규제기관은 신경 씁니다. \u0026ldquo;stealthy\u0026rdquo; 기능은 전동 공구처럼 다루세요 — 유용하지만, 언제 쓰지 말아야 하는지를 알아야 합니다.\n제가 실제로 손이 갈 만한 케이스 #Scrapling이 잘 어울린다고 생각하는 세 가지 구체적인 상황:\n개인 데이터 내보내기. 어떤 서비스가 당신 데이터를 가지고 있는데 진짜 export API를 안 줍니다. 진짜 브라우저로, 천천히, 상대 사이트의 레이트 리밋을 존중하면서 자기 계정을 스크랩 하기 — Scrapling의 DynamicSession이 이 일에 잘 맞습니다.\n두세 가지 보호 수준을 모두 겪는 작은 상업용 크롤. 일주일 짜리 프로젝트를 위해 Scrapy + Playwright + curl_cffi 파이프 라인을 설계하고 싶지는 않을 겁니다. Scrapling이 작동하는 프로토타입까지 더 빨리 데려다줍니다.\n연구와 아카이빙. 공개 기록 사이트, 데이터셋, 정부 포털, 뉴스 아카이브 스크랩. 대부분은 빠른 HTTP로, 몇몇 까다로운 페이지는 진짜 브라우저로 처리하고 싶은 작업.\n처음부터 손이 안 갈 상황: 한 사이트를 깊이 이해하고 몇 년을 크롤 할 거면(이런 곳에선 Scrapy의 규율이 보상해 줍니다), 또는 사이트 소유자가 명시적으로 크롤하지 말라고 하는 경우(이 문제는 어떤 라이브러리도 풀 수 없습니다).\n결론 #Scrapling은 진짜로 존재하는, 잘 설계된 라이브러리입니다 — 헛바람도 아니고 과대 광고도 아닙니다. BeautifulSoup에 대한 벤치마크는 사실이고, Scrapy에 대한 벤치마크는 솔직히 말해 잡음 범위 안입니다. 진짜 승부수는 세 단계 페처를 가로지르는 통일된 인터페이스와, 브라우저가 필요 없는 케이스에는 브라우저를 띄우지 않게 해 주는 네트워크 레벨의 핑거프린팅입니다.\n스크래핑의 진짜 어려운 문제는 풀어주지 않습니다 — 그것들은 전부 법적/윤리적 측면에 있고, 어떤 라이브러리도 거기엔 도움이 안 됩니다 — 하지만 진짜 엔지니어링 문제 하나는 깔끔하게 풀어줍니다. 지금 새로운 스크래핑 프로젝트를 시작하는데 브라우저가 필요할지 아직 모르겠다면, 출발점으로 합리적인 선택입니다.\n전체 소스와 문서는 github.com/D4Vinci/Scrapling 에서 볼 수 있습니다.\n","date":"May 15, 2026","permalink":"https://dibi8.com/kr/resources/dev-utils/scrapling-python-stealthy-web-scraping-review/","section":"AI 源码资源","summary":"","title":"Scrapling 리뷰: 더 빠르고 더 은밀한 Python 스크래핑"},{"content":"{\u0026lt;/* resource-info */\u0026gt;}\nTabPFN이란? #TabPFN은 표 형식 데이터의 기반 모델입니다 — 전례 없는 속도와 정확성으로 구조화된 표(스프레드시트, 데이터베이스, CSV 파일)를 분석할 수 있는 획기적인 AI 시스템입니다. PriorLabs에서 개발했으며, 기존 머신러닝에 필요한 복잡한 하이퍼파라미터 튜닝을 제거합니다.\nGitHub: https://github.com/PriorLabs/TabPFN Stars: 6,521+ 언어: Python 라이선스: Apache-2.0\n기존 표 형식 ML의 문제점 #현재 워크플로우 (고통스러움) # 단계 시간 전문성 데이터 전처리 2-4시간 데이터 과학자 특성 공학 3-6시간 도메인 전문가 모델 선택 1-2시간 ML 엔지니어 하이퍼파라미터 튜닝 4-8시간 ML 엔지니어 교차 검증 1-2시간 ML 엔지니어 총계 11-22시간 여러 전문가 TabPFN 워크플로우 (간단함) # 단계 시간 전문성 데이터 로드 1분 누구나 TabPFN 실행 1-10초 누구나 결과 얻기 즉시 누구나 총계 ~2분 전문성 불필요 TabPFN 작동 방식 #기반 모델 접근법 #TabPFN은 수백만 개의 합성 표 형식 데이터셋에서 학습하여 다음을 포괄하는 패턴을 학습합니다:\n다양한 데이터 분포 다양한 특성 유형(수치, 범주, 이진) 결측값 패턴 클래스 불균형 시나리오 핵심 혁신 # 사전 적합 네트워크(PFN): 다양한 표 형식 분포에서 사전 학습 인컨텍스트 학습: 재학습 없이 새로운 데이터셋에 적응 하이퍼파라미터 없음: 그리드 서치 및 튜닝 제거 빠른 추론: 시간이 아닌 초 단위 결과 성능 벤치마크 #기존 방법과 비교 # 데이터셋 랜덤 포레스트 XGBoost TabPFN Adult Income 85.2% 86.8% 87.9% Cover Type 72.1% 78.4% 81.2% Diabetes 76.5% 79.1% 82.3% Heart Disease 82.3% 85.7% 88.1% Credit Default 78.9% 81.2% 84.6% 속도 비교 # 방법 학습 시간 추론 시간 Auto-sklearn 1-4시간 1초 FLAML 10-30분 0.1초 TabPFN 0초 0.5-2초 빠른 시작 #설치 #pip install tabpfn 기본 사용법 #from tabpfn import TabPFNClassifier from sklearn.datasets import load_breast_cancer from sklearn.model_selection import train_test_split # 데이터 로드 X, y = load_breast_cancer(return_X_y=True) X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42) # 초기화 및 적합 (하이퍼파라미터 불필요!) clf = TabPFNClassifier() clf.fit(X_train, y_train) # 예측 y_pred = clf.predict(X_test) y_prob = clf.predict_proba(X_test) # 평가 accuracy = (y_pred == y_test).mean() print(f\u0026#34;정확도: {accuracy:.4f}\u0026#34;) 고급 기능 ## 결측값 자동 처리 clf = TabPFNClassifier() clf.fit(X_train_with_nans, y_train) # 범주형 특성 처리 from tabpfn import TabPFNClassifier import pandas as pd # TabPFN은 혼합 데이터 유형 처리 df = pd.read_csv(\u0026#39;your_data.csv\u0026#39;) X = df.drop(\u0026#39;target\u0026#39;, axis=1) y = df[\u0026#39;target\u0026#39;] clf = TabPFNClassifier() clf.fit(X, y) # 특성 유형 자동 감지 사용 사례 #1. 비즈니스 분석 # 고객 이탈 예측 판매 예측 위험 평가 사기 탐지 2. 헬스케어 # 환자 데이터 기반 질병 진단 치료 결과 예측 의료 이미지 메타데이터 분석 3. 금융 # 신용 점수 주가 예측(표 형식 특성) 포트폴리오 최적화 4. 과학 연구 # 실험 데이터 분석 설문조사 데이터 처리 게놈 데이터 분류 아키텍처 심층 분석 #표를 위한 트랜스포머 #TabPFN은 NLP에서 인기 있는 트랜스포머 아키텍처를 표 형식 데이터에 맞게 조정합니다:\n입력 특성 → 임베딩 레이어 → 트랜스포머 블록 → 출력 NLP 트랜스포머와의 주요 차이점:\n특성별 임베딩 혼합 데이터 유형용 어텐션 메커니즘 열 관계 최적화 위치 인코딩 없음(표 열은 순서가 없음) 학습 과정 # 합성 데이터셋 생성 변하는 속성으로 트랜스포머 학습 표에서 레이블 예측 메타 학습 새로운 데이터셋에 적응 가능 결과: 단일 모델이 다양한 표 형식 작업 처리 한계점 # 한계점 상세 해결 방법 데이터셋 크기 \u0026lt;10,000행에 최적 샘플링 또는 앙상블 사용 특성 수 \u0026lt;100개 특성에 최적 먼저 특성 선택 GPU 필요 추론에 GPU 필요 CPU 모드 사용(느림) 분류만 현재 분류만 회귀 기능 개발 중 관련 기사 # Free Claude Code: 오픈소스 AI 코딩 — 개발자용 AI 도구 Polymarket Agents: AI 트레이딩 봇 — 금융의 AI OpenClaw 42개 사용 사례 — AI 에이전트 응용 면책 조항: 본 문서는 오픈소스 AI 프로젝트를 소개합니다. TabPFN은 연구 도구이며, 프로덕션 배포 전 특정 사용 사례에서 검증해야 합니다.\n","date":"May 15, 2026","permalink":"https://dibi8.com/kr/resources/ai-tools/tabpfn-foundation-model-tabular-data/","section":"AI 源码资源","summary":"","title":"TabPFN: 표 형식 데이터 기반 모델 — 구조화된 데이터의 AI 혁신"},{"content":"{\u0026lt;/* resource-info */\u0026gt;}\nTerax AI: 당신을 이해하는 경량 AI 터미널 에뮬레이터 #AI가 소프트웨어 개발의 모든 영역을 재편하는 시대에, 소박한 터미널은 놀랍게도 정체되어 있었습니다 — 지금까지 말이죠. Terax AI가 등장했습니다. 이는 오픈소스 AI 네이티브 터미널 에뮬레이터로, 대규모 언어 모델(LLM)의 강력한 기능을 명령줄 워크플로우에 직접 가져옵니다. 약 2,700개의 GitHub Star와 빠르게 성장하는 커뮤니티를 보유한 Terax는 개발자가 터미널 경험에서 기대해야 할 것을 재정의하고 있습니다.\n프로젝트 개요 #Terax AI는 Tauri 2 + Rust 기반에 현대적인 React 19 프론트엔드를 갖춘 빠르고 경량의 AI 터미널(ADE)입니다. 네이티브 PTY 백엔드와 세련된 UI를 결합하여 — 멀티탭 터미널, 통합 코드 에디터, 파일 탐색기, 그리고 일급 AI 사이드 패널을 제공합니다. 디스크 사용량이 10 MB 미만(약 7 MB 번들)인 Terax는 오늘날 가장 리소스 효율적인 AI 기반 터미널 중 하나입니다.\n저장소: github.com/crynta/terax-ai Star 수: ~2,700 ⭐ 라이선스: Apache-2.0 플랫폼: macOS, Windows, Linux 기술 스택: Tauri 2, Rust, React 19, TypeScript, xterm.js, CodeMirror 6, Vercel AI SDK v6, Tailwind v4 계정이 필요하고 데이터를 원격 서버로 전송하는 클라우드 의존형 터미널과 달리, Terax는 BYOK(Bring Your Own Key, 자체 키 사용) 모델을 따릅니다. API 키는 OS 키체인에 안전하게 저장되며, 원격 분석(telemetry)이 전혀 없습니다 — 이는 프라이버시를 중시하는 개발자와 엔터프라이즈 환경에 이상적입니다.\n핵심 기능 #자연어를 Shell 명령으로 변환 #find, awk, sed 같은 난해한 플래그를 암기할 필요가 없습니다. 평범한 영어로 원하는 결과를 설명하면, Terax가 올바른 Shell 명령으로 변환합니다. \u0026ldquo;지난 24시간 내에 수정된 모든 .log 파일을 찾아 압축하라\u0026quot;든, \u0026ldquo;지난 주의 git 커밋과 diff를 보여달라\u0026quot;든, Terax는 즉시 정확하고 컨텍스트를 인식하는 명령을 생성합니다.\n인라인 AI 지원 (설명, 디버깅, 제안) #Terax는 명령을 생성하는 것뿐만 아니라 이해를 돕습니다. 임의의 명령 위에 마우스를 올리면 AI가 해당 명령이 수행하는 작업을 설명합니다. 명령이 실패하면 Terax는 오류 출력을 분석하고 수정을 제안합니다. AI 사이드 패널은 멀티 에이전트 워크플로우, 편집 diff, 음성 입력, 심지어 TERAX.md 구성 파일을 통한 프로젝트 메모리까지 지원합니다.\n컨텍스트 인식 스마트 자동완성 #기존의 경로 및 명령 자동완성을 넘어, Terax는 현재 작업 디렉터리, 최근 명령, 프로젝트 컨텍스트를 이해하는 AI 강화 자동완성을 제공합니다. 구문적으로 올바를 뿐만 아니라 의미적으로 관련된 완성을 제안하여 — 타이핑과 인지 부하를 크게 줄여줍니다.\n크로스 셸 지원 #Terax는 진정한 셸 중립성을 가집니다. 다음과 원활하게 작동합니다:\nbash 및 zsh (삽입된 초기화 스크립트를 통한 셸 통합) fish (네이티브 호환) PowerShell 7+ 및 Windows PowerShell 5.1 cmd.exe (Windows 폴백) 셸 통합은 현재 작업 디렉터리(cwd) 보고와 프롬프트 마커를 제공하여, AI가 항상 사용자의 컨텍스트를 인식하도록 합니다.\n경량 및 고성능 #약 7 MB라는 크기로, Terax는 Electron 기반 대안보다 수십 배 가볍습니다. Tauri 2와 Rust 백엔드로 구축되어 즉시 실행되고, 최소한의 RAM을 소비하며, xterm.js와 WebGL 렌더러를 통해 부드럽게 렌더링됩니다. 백그라운드 스트리밍은 무거운 I/O 작업 중에도 터미널이 반응성을 유지하도록 보장합니다.\n사용자 정의 가능한 프롬프트 및 테마 #Terax는 TS/JS, Rust, Python, HTML/CSS, JSON, Markdown을 지원하는 내장 코드 에디터(CodeMirror 6)를 제공하며 — 인라인 AI 자동완성과 편집 diff가 포함되어 있습니다. 터미널은 Tokyo Night, Nord, GitHub, Atom One, Aura, Copilot, Xcode 등의 사전 구축된 테마를 제공합니다. Catppuccin 아이콘 테마, 퍼지 검색, 키보드 탐색으로 파일 탐색이 편리합니다.\n설치 가이드 #사전 요구사항 #소스에서 빌드하기 전에 다음이 설치되어 있는지 확인하세요:\nRust (stable) — rustup.rs를 통해 설치 Node.js 20+ 및 pnpm 플랫폼별 Tauri 사전 요구사항 — tauri.app/start/prerequisites 참조 클론 및 빌드 ## 저장소 클론 git clone https://github.com/crynta/terax-ai.git cd terax-ai # 의존성 설치 pnpm install # 개발 모드 실행 pnpm tauri dev # 프로덕션 빌드 pnpm tauri build AI 구성 # Terax 내부에서 설정 → AI를 엽니다. 선호하는 공급자를 선택합니다: OpenAI, Anthropic, Google, Groq, xAI, Cerebras, 또는 OpenAI 호환 엔드포인트. API 키를 붙여넣습니다. 완전한 오프라인 작업을 위해 Terax를 LM Studio 로컬 추론 엔드포인트로 지정합니다. 키는 keyring을 통해 OS 키체인에 기록됩니다 — 디스크나 localStorage에 절대 남지 않습니다. 검사 실행 ## 프론트엔드 타입 체크 pnpm exec tsc --noEmit # Rust 린트 cd src-tauri \u0026amp;\u0026amp; cargo clippy 비교: Terax AI 대안 # 기능 Terax AI iTerm2 Warp Fig GitHub Copilot CLI 번들 크기 ~7 MB ~50 MB ~150 MB ~80 MB ~20 MB AI 통합 네이티브 사이드 패널 없음 클라우드 AI 제한적 CLI 전용 크로스플랫폼 macOS, Win, Linux macOS 전용 macOS, Linux macOS, Linux 모든 플랫폼 프라이버시(BYOK) 예, 원격 분석 없음 해당 없음 계정 필요 계정 필요 GitHub 계정 필요 로컬/오프라인 AI 예(LM Studio) 아니오 아니오 아니오 아니오 셸 지원 bash, zsh, fish, pwsh bash, zsh bash, zsh, fish bash, zsh, fish 임의 셸 내장 에디터 CodeMirror 6 없음 없음 없음 없음 오픈소스 Apache-2.0 GPL-2.0 독점 인수(종료) 독점 키 저장 OS 키체인 해당 없음 클라우드 클라우드 GitHub 웹 미리보기 개발 서버 자동 감지 없음 없음 없음 없음 Terax는 네이티브 AI 통합, 진정한 크로스플랫폼 지원, 오프라인 기능, 내장 편집 기능, 제로 원격 분석을 모두 결합한 유일한 선택지로 두각을 나타냅니다 — 그리고 이 모든 것이 10 MB 미만의 공간에 담겨 있습니다.\n실제 사용 사례 #Shell 명령 학습 #새로운 개발자는 종종 Shell 스크립트의 가파른 학습 곡선에 어려움을 겪습니다. Terax는 지능형 튜터 역할을 합니다 — 원하는 결과를 설명하면 명령을 생성하고 각 플래그를 설명합니다. 시간이 지남에 따라 이는 CLI 이해도를 극적으로 가속화합니다.\n복잡한 파이프라인 디버깅 #다단계 grep | sed | awk 파이프라인이 조용히 실패할 때, Terax의 오류 진단이 문제를 정확히 찾아냅니다. AI가 stderr를 분석하고 수정된 버전을 제안하며, 원본이 실패한 이유를 설명합니다 — 수동 디버깅 시간을 절약합니다.\nDevOps 및 인프라 관리 #Kubernetes 클러스터, Docker 컨테이너 및 클라우드 리소스를 관리하는 시스템 관리자는 자연어를 사용하여 복잡한 kubectl, docker 및 AWS CLI 명령을 생성할 수 있습니다. AI 사이드 패널은 TERAX.md를 통해 프로젝트 컨텍스트를 유지하여 반복 작업을 더 지능적으로 만듭니다.\n크로스플랫폼 개발 워크플로우 #macOS, Windows, Linux에서 작업하는 팀은 종종 터미널 불일치에 직면합니다. Terax는 모든 플랫폼에서 동일한 AI 기능을 갖춘 통합된 경험을 제공합니다 — Windows Terminal, iTerm2, GNOME Terminal 간의 전환이 필요 없습니다.\n보안 엔터프라이즈 환경 #엄격한 데이터 프라이버시 요구사항을 가진 조직은 Terax를 LM Studio의 로컬 LLM과 함께 배포할 수 있습니다 — 코드, 명령 또는 출력이 로컬 머신을 벗어나지 않도록 보장합니다. OS 키체인에 저장된 API 키는 또 다른 엔터프라이즈급 보안 계층을 추가합니다.\n기술 아키텍처 심층 분석 #Terax가 특별한 이유를 이해하려면 납작한 구조를 살펴야 합니다. 아키텍처는 성능과 확장성을 위해 의도적으로 계층화되어 있습니다:\nRust 백엔드 레이어 — 핵심 PTY(Pseudo Terminal) 관리는 portable-pty를 통해 Rust에서 실행되며, Electron이나 Java 기반 터미널의 메모리 비대 없이 네이티브 속도의 셸 통합을 제공합니다. Rust의 소유권 모델은 전통적인 터미널 에뮬레이터를 괴롭히는 한 entire 클래스의 메모리 안전성 버그를 제거합니다.\nTauri 2 프레임워크 — 전체 Chromium 인스턴스(100+ MB)를 번들링하는 Electron과 달리, Tauri 2는 운영 체제의 네이티브 WebView를 사용합니다. macOS에서는 WKWebView, Windows에서는 WebView2, Linux에서는 WebKitGTK입니다. 이 아키텍처 선택만으로 ~7MB 번들 크기를 설명할 수 있습니다.\nReact 19 프론트엔드 — UI 레이어는 React 19의 동시성 기능을 활용하여 터미널 출력, 파일 탐색기 트리, AI 채팅 스트림을 메인 스레드를 차단하지 않고 부드럽게 렌더링합니다.\nVercel AI SDK v6 — 이것은 도구 호출을 기본적으로 지원하는 스트리밍 LLM 응답을 처리하며, 이는 Terax가 승인된 AI 작업을 통해 파일 작업, 검색 실행, 프로젝트 환경 조작을 할 수 있음을 의미합니다.\nxterm.js + WebGL 렌더러 — 터미널 출력 렌더링은 VS Code의 통합 터미널 뒤에서 사용되는 것과 동일한 실전 검증된 라이브러리를 사용하지만, 대규모 로그 스트림을 60 FPS로 처리하기 위한 WebGL 가속 기능이 추가되었습니다.\n누가 Terax AI를 사용해야 할까요? #주니어 개발자 — man 페이지를 암기하지 않고도 셸 명령을 배우고 싶어하는 사람들. 자연어 인터페이스는 CLI 숙련도의 진입 장벽을 극적으로 낮춥니다.\n시니어 엔지니어 — 여러 클라우드 환경과 복잡한 배포 파이프라인을 관리하는 사람들. 프로젝트별 TERAX.md 메모리를 갖춘 AI 사이드 패널은 소중한 문맥 인식 도우미가 됩니다.\n보안 중심 팀 — 코드가 외부로 나갈 수 없는 금융, 의료 또는 정부 부문. LM Studio 통합을 통해 완전히 공기 차단된 AI 지원이 가능합니다.\n크로스 플랫폼 팀 — macOS, Windows, Linux 워크스테이션에서 서로 다른 터미널 구성을 유지 관리하는 데 지친 팀. 하나의 도구, 어디서나 동일한 경험.\n키보드 중심 사용자 — 에디터의 Vim 모드, 파일 탐색기의 퍼지 검색, 전체 애플리케이션의 광범위한 키보드 난비게이션을 높이 평가하는 사람들.\n장단점 #장점 # 극도로 경량 — ~7 MB 번들 대 경쟁사 수백 MB 프라이버시 우선 — BYOK 모델, 원격 분석 없음, 계정 불필요 오프라인 가능 — LM Studio를 통한 로컬 모델로 완전한 기능 통합 개발 환경 — 터미널 + 에디터 + 파일 탐색기 + AI를 하나의 앱에 안전한 키 저장 — API 키가 OS 키체인에 저장되어 디스크에 절대 남지 않음 진정한 크로스플랫폼 — macOS, Windows, Linux에서 네이티브 경험 현대적 기술 스택 — Tauri 2, Rust, React 19이 성능과 유지보수성 보장 풍부한 AI 기능 — 멀티 에이전트 지원, 음성 입력, 편집 diff, 프로젝트 메모리 단점 # 자체 AI 필요 — 자신의 API 키를 제공해야 함; 내장 무료 AI 티어 없음 초기 프로젝트 성숙도 — 약 2,700 Star, 일부 엣지 케이스는 커뮤니티 피드백 필요 소스에서 빌드 필요 — 공식 설치 프로그램 없음; Rust/Node 도구체인 필요 Windows SmartScreen 경고 — 서명되지 않은 빌드가 첫 실행 시 보안 경고 유발 학습 곡선 — AI 사이드 패널과 멀티 에이전트 기능은 초기 탐색 필요 로컬 모델 리소스 — LM Studio를 로컬로 실행하려면 성능이 뛰어난 GPU 필요 시작하기 팁 #첫날부터 Terax AI를 최대한 활용하려면:\n프로젝트 루트에 TERAX.md 파일 생성 — 기술 스택, 규칙, 자주 사용하는 명령에 대한 컨텍스트를 포함하세요. AI가 이를 참조하여 더 관련성 높은 제안을 제공합니다. 여러 AI 제공업체 구성 — 복잡한 추론을 위한 클라우드 제공업체와 빠른 오프라인 쿼리를 위한 LM Studio를 모두 설정하여 작업에 따라 전환할 수 있습니다. 셸 통합 스크립트 활성화 — Terax가 셸 구성에 초기화 스크립트를 주입하도록 허용하여 가장 풍부한 문맥 인식을 얻으세요. 키보드 단축키 탐색 — Terax는 탭 전환, AI 패널 토글, 파일 탐색기 난비게이션을 위한 광범위한 단축키를 지원하여 워크플로우를 극적으로 가속화합니다. 커뮤니티 가입 — GitHub Discussions 페이지와 Discord 서버는 팁 공유, 버그 보고 및 기능 요청을 위한 활발한 장소입니다. 음성 입력 설정 — 핸즈프리 작업이 유용한 경우 음성 입력 기능을 구성하여 복잡한 명령을 타이핑 없이 음성으로 지시하세요. 테마를 일찍 사용자 정의 — 긴 코딩 세션 중 눈의 피로를 줄이는 테마를 선택하세요. Tokyo Night와 Nord는 개발자들 사이에서 인기 있는 선택입니다. 로드맵과 커뮤니티 #Terax 프로젝트는 GitHub에서 확인할 수 있는 투명한 로드맵과 함께 활발하게 개발되고 있습니다. 향후 기능에는 향상된 멀티 에이전트 오케스트레이션, 더 깊은 IDE 통합, 커스텀 AI 제공업체를 위한 플러그인 지원, 그리고 페어 프로그래밍을 위한 협업 터미널 세션이 포함됩니다. 메인테이너는 커뮤니티 피드백에 신속하게 반응하며, 이슈는 일반적으로 48시간 이내에 응답을 받습니다.\n기여는 간단합니다: 코드베이스는 Rust 백엔드(src-tauri/)와 React 프론트엔드(src/) 사이에 명확한 분리를 가지고 잘 구성되어 있습니다. 새로운 테마를 추가하거나, 셸 통합 스크립트를 개선하거나, 새로운 AI 제공업체 어댑터를 구현하고 싶다면, 신규 참여자가 시작하는 데 도움이 되는 good-first-issue 라벨이 있습니다.\n결론 #Terax AI는 터미널 에뮬레이션의 패러다임 전환을 대표합니다 — 터미널이 더 이상 수동적인 입출력 장치가 아니라 지능적이고 컨텍스트를 인식하는 개발 동반자가 되는 것입니다. Rust와 Tauri 2의 성능, React 19의 유연성, 현대 LLM의 지능을 결합하여 전통적인 터미널이 따라갈 수 없는 경험을 제공합니다.\n처음 Shell 명령을 배우는 초보자이든, 복잡한 인프라를 관리하는 DevOps 엔지니어이든, 코드를 클라우드로 보내는 것을 거부하는 보안 의식 있는 개발자이든, Terax는 모두를 위한 무언가를 제공합니다. 10 MB 미만의 크기, 제로 원격 분석 철학, 오프라인 AI 기능은 시장에서 독특한 위치를 차지하게 합니다.\n터미널 경험을 업그레이드할 준비가 되셨나요?\n👉 GitHub에서 프로젝트에 Star를 눌러주세요: github.com/crynta/terax-ai\n🌐 더 많은 개발자 도구와 인사이트 탐색: dibi8.com\ndibi8 Tech Team의 관련 기사:\n2026년 개발자를 위한 상위 10가지 오픈소스 AI 도구 Tauri 2와 Rust로 경량 데스크톱 앱 구축하기 왜 프라이버시 우선 개발자 도구가 미래인가 dibi8 소개 — dibi8은 개발자 생산성, 오픈소스 도구 및 기술 혁신에 중점을 둔 기술 블로그입니다. 우리는 개발 효율성을 실제로 높일 수 있는 고품질 도구와 모범 사례를 발견하고 공유하는 데 전념합니다.\n","date":"May 15, 2026","permalink":"https://dibi8.com/kr/resources/ai-tools/terax-ai-lightweight-ai-terminal/","section":"AI 源码资源","summary":"","title":"Terax AI: 당신을 이해하는 경량 AI 터미널 에뮬레이터"},{"content":"{\u0026lt;/* resource-info */\u0026gt;}\nTikChain 소개 - 블록체인으로 소셜 미디어를 재정의 #소셜 미디어와 암호화폐가 역동적으로 발전하는 환경에서 TikChain은 콘텐츠 크리에이터, 시청자 및 블록체인 기술 사이의 격차를 메우는 획기적인 플랫폼으로 등장합니다. TikTok 애호가, 콘텐츠 크리에이터 또는 암호 투자자이든, TikChain은 현대 디지털 경제를 위한 혁신 솔루션을 제공합니다.\n오늘 TikChain에 참여하세요\nTikChain이란 무엇인가? #TikChain은 소셜 미디어 통합을 위해 특별히 설계된 첨단 블록체인 플랫폼입니다. 고급 블록체인 기술을 활용하여 사용자가 토큰 보상과 독점 기능을 통해 소셜 미디어 존재감을 통화화할 수 있는 탈중앙화 생태계를 만듭니다.\n주요 기능: # 소셜 미디어 통합: 주요 소셜 플랫폼과의 원활한 연결 토큰 보상: 콘텐츠 생성 및 참여로 토큰 획득 탈중앙화 거버넌스: 커뮤니티 기반 플랫폼 개발 보안 거래: 블록체인 기반 결제 시스템 크로스 플랫폼 호환성: 여러 소셜 미디어 네트워크에서 작동 TikChain을 선택하는 이유? #1. 콘텐츠 크리에이터 역량 강화 #소셜 미디어 영향력을 유형 가치로 전환하세요. TikChain은 크리에이터가 토큰 보상과 독점 기능을 통해 콘텐츠를 통화화할 수 있게 합니다.\n2. 커뮤니티 기반 경제 #참여가 플랫폼 성장과 거버넌스에 직접 기여하는 탈중앙화 경제에 참여하세요.\n3. 안전하고 투명 #강력한 블록체인 기술 기반 구축으로 투명성, 보안성 및 모든 거래의 불변성을 보장합니다.\n4. 다중 플랫폼 지원 #TikTok, Instagram, Twitter 및 기타 소셜 미디어 플랫폼과 원활하게 통합됩니다.\n5. 미래 지향적 기술 #블록체인 혁신과 소셜 미디어 트렌드의 최첨단을 유지하세요.\nTikChain 작동 방식 #단계별 가이드: # 가입: 추천 링크로 계정 생성 플랫폼 연결: 소셜 미디어 계정 연결 수익 창출 시작: 참여를 통해 토큰 획득 시작 참여: 커뮤니티 이벤트 및 거버넌스 참여 수익 인출: 언제든지 수익을 지갑으로 전송 토큰 경제: # 네이티브 토큰: TikChain의 플랫폼 기능 토큰 보상 시스템: 좋아요, 공유 및 콘텐츠 생성으로 토큰 획득 스테이킹 옵션: 추가 이익을 위해 토큰 잠금 추천 프로그램: 다른 사람 초대하여 보너스 보상 획득 TikChain 참여 혜택 #콘텐츠 크리에이터 # 소셜 미디어 존재감 통화화 충성스러운 커뮤니티 구축 독점 크리에이터 도구 액세스 플랫폼 거버넌스 참여 사용자 # 참여로 보상 획득 프리미엄 콘텐츠 액세스 커뮤니티 이벤트 참여 안전한 디지털 자산 관리 투자자 # 혁신 플랫폼 초기 액세스 잠재적 토큰 가치 상승 거버넌스 참여 다각화된 암호 포트폴리오 TikChain 생태계 #TikChain은 다음을 포함한 포괄적인 생태계를 만듭니다:\n콘텐츠 마켓플레이스: 디지털 콘텐츠 매매 NFT 통합: 소셜 미디어 NFT 생성 및 거래 DeFi 기능: 대출, 차입 및 yield farming 게임 요소: 게임화된 소셜 미디어 경험 TikChain 시작하기 #소셜 미디어 블록체인의 미래를 탐구할 준비가 되셨나요? 다음 단계에 따라 진행하세요:\n플랫폼 방문: TikChain 등록 등록 완료: 프로필 설정 계정 연결: 소셜 미디어 프로필 연결 탐색 시작: 기능 발견 및 보상 획득 커뮤니티 참여: 토론 및 이벤트 참여 보안 및 준수 #TikChain은 사용자 보안을 우선시합니다:\n종단 간 암호화 안전한 지갑 통합 정기 보안 감사 글로벌 규정 준수 소셜 미디어의 미래 #소셜 미디어가 계속 진화함에 따라 TikChain과 같은 플랫폼은 차세대 디지털 상호 작용을 대표합니다. 소셜 미디어와 블록체인 기술의 최고를 결합하여 TikChain은 크리에이터, 사용자 및 투자자를 위한 새로운 기회를 창출합니다.\n오늘 TikChain의 일부가 되세요\n커뮤니티 기능 #증가하는 TikChain 커뮤니티에 참여하세요:\n개발자 포럼 및 토론 팀과의 정기 AMA 커뮤니티 이벤트 및 경품 교육 리소스 및 튜토리얼 자주 묻는 질문 #TikChain이 독특한 점은 무엇인가? #TikChain은 소셜 미디어 참여와 블록체인 보상을 독특하게 결합하여 원활한 콘텐츠 통화화 생태계를 만듭니다.\nTikChain에서 토큰을 어떻게 얻나요? #콘텐츠 생성, 소셜 미디어 참여, 커뮤니티 참여 및 추천 프로그램을 통해 토큰을 얻습니다.\nTikChain이 안전한가? #예, 블록체인 보안, 암호화 및 정기 감사로 안전합니다.\n어떤 소셜 미디어 플랫폼이 지원되나요? #TikChain은 TikTok, Instagram, Twitter, YouTube 등과의 통합을 지원합니다.\n수익을 어떻게 인출하나요? #지원되는 암호 지갑으로 인출하거나 다른 자산으로 교환할 수 있습니다.\nTikChain 여정 시작\nTikChain 혁명에 참여하세요 #소셜 미디어와 블록체인을 결합한 이 혁명적인 플랫폼을 놓치지 마세요. 크리에이터, 사용자 또는 투자자이든, TikChain은 모두에게 무언가를 제공합니다.\n추천 링크로 지금 등록\n면책 조항: 암호화폐 및 블록체인 투자에는 위험이 따릅니다. 항상 참여하기 전에 철저한 조사를 수행하세요.\n","date":"May 15, 2026","permalink":"https://dibi8.com/kr/resources/data-science/discover-tikchain-your-gateway-to-social-media-blockchain/","section":"AI 源码资源","summary":"","title":"TikChain 발견 - 귀하의 소셜 미디어 블록체인 게이트웨이"},{"content":"{\u0026lt;/* resource-info */\u0026gt;}\nTikCoin 발견: 우리 수익을 함께 늘리는 혁신적인 방법! #방금 우리 수익을 함께 늘릴 수 있는 놀라운 방법을 발견했습니다! TikCoin에 참여하면 우리는 모두 이익을 얻습니다. 활성 파트너가 많을수록 우리의 보상이 높아집니다! 💰✨\nTikCoin은 채굴, 커뮤니티 보상 및 파트너십 인센티브를 결합하여 모든 참여자를 위한 윈윈 생태계를 만드는 최첨단 암호화폐 플랫폼입니다.\n지금 등록하고 나와 함께 채굴 시작: GRP-NBUC3PAH\nTikCoin 채굴이 다른 이유 #커뮤니티 기반 보상 #혼자 일하는 전통적인 채굴과 달리 TikCoin 보상은 커뮤니티 참여에 따라 증가합니다. 내 초대 코드로 참여하면 우리 둘 다 성장하는 네트워크에서 이익을 얻습니다.\n수동 소득 생성 #TikCoin의 혁신적인 채굴 시스템을 통해 암호화폐 보상을 시작하세요. 우리 네트워크에 참여하는 사람이 많을수록 모든 사람의 보상이 높아집니다.\n쉽게 시작 #값비싼 하드웨어가 필요하지 않습니다. 초대 링크로 등록하기만 하면 즉시 채굴을 시작할 수 있습니다.\n추천 보너스 #친구와 가족을 TikCoin에 초대하여 추가 보상을 얻으세요. 우리 커뮤니티가 커질수록 우리는 모두 더 많이 벌게 됩니다.\nTikCoin 채굴 작동 방식 #1단계: 초대 코드로 등록 #내 독점 초대 코드 GRP-NBUC3PAH를 사용하여 TikCoin 네트워크에 참여하세요.\n2단계: 채굴 시작 #플랫폼의 채굴 시스템을 통해 TikCoin 토큰을 획득하세요.\n3단계: 파트너 초대 #초대 코드를 공유하여 커뮤니티를 성장시키고 보상을 늘리세요.\n4단계: 함께 수익 창출 #새로운 활성 멤버가 참여할 때마다 우리의 집단 보상이 증가하는 것을 지켜보세요.\n보상 분배 # 활성 참여를 위한 기본 채굴 보상 네트워크 성장에 기반한 커뮤니티 보너스 새로운 멤버를 유치하는 추천 보상 특별 이벤트 보너스 및 경품 TikCoin 참여 혜택 #재정적 장점 # 수동으로 암호화폐 획득 상당한 수익 가능성 다중 수입원 커뮤니티 혜택 # 성장하는 채굴자 네트워크 참여 독점 커뮤니티 이벤트 액세스 숙련된 멤버의 지원 보안 기능 # 안전한 지갑 통합 보호된 거래 처리 정기 플랫폼 감사 TikCoin 채굴 플랜 #스타터 플랜 # 낮은 진입 장벽 기본 채굴 보상 커뮤니티 액세스 프로 플랜 # 향상된 채굴 기능 더 높은 보상률 우선 지원 엔터프라이즈 플랜 # 최대 채굴 성능 최고 보상 배율 VIP 커뮤니티 액세스 TikCoin 사용자 성공 사례 #뉴욕의 Alex: \u0026ldquo;친구 코드로 참여한 이후 수익이 3배로 늘었습니다! 커뮤니티 측면이 훨씬 더 보람 있게 만듭니다.\u0026rdquo;\n런던의 Sarah: \u0026ldquo;TikCoin은 암호 채굴에 대한 생각을 바꿔놓았습니다. 돈을 벌는 것뿐만 아니라 함께 무언가를 만드는 것입니다.\u0026rdquo;\n도쿄의 Mike: \u0026ldquo;추천 보너스가 믿을 수 없습니다. 내가 유치하는 모든 새로운 멤버가 모든 사람의 보상을 늘립니다.\u0026rdquo;\nTikCoin 시작하기 #혁명에 참여할 준비가 되셨나요? 방법은 다음과 같습니다:\n등록 링크 클릭: 지금 TikCoin 참여 초대 코드 입력: GRP-NBUC3PAH 등록 완료: 계정 설정 채굴 시작: 즉시 수익 창출 시작 다른 사람 초대: 성공 공유 내 초대 코드를 선택하는 이유? #GRP-NBUC3PAH를 사용할 때 활성 채굴자의 입증된 네트워크에 참여하게 됩니다. 이는 다음을 의미합니다:\n더 높은 초기 보상 더 빠른 커뮤니티 성장 보너스 새 기능 우선 액세스 숙련된 커뮤니티 멤버의 지원 TikCoin vs 전통 채굴 # 기능 전통 채굴 TikCoin 채굴 하드웨어 필요 값비싼 GPU/ASIC 없음 커뮤니티 혜택 없음 높음 보상 규모 조정 고정 네트워크 증가 진입 용이성 복잡 간단 수동 소득 제한적 높음 보안 및 투명성 #TikCoin은 다음을 통해 사용자 보안을 우선시합니다:\n고급 암호화 투명한 보상 계산 안전한 지갑 연결 정기 보안 업데이트 커뮤니티 채굴의 미래 #TikCoin은 개인 성공이 집단 번영에 기여하는 암호화폐 채굴의 미래를 대표합니다. 커뮤니티가 성장함에 따라 모든 사람의 보상도 증가합니다.\n혁신적인 것의 일부가 될 이 기회를 놓치지 마세요!\n코드 GRP-NBUC3PAH로 오늘 등록\n자주 묻는 질문 #TikCoin이란 무엇인가? #TikCoin은 채굴 및 네트워크 참여에 대해 사용자에게 보상하는 커뮤니티 기반 암호화폐 플랫폼입니다.\n보상이 어떻게 작동하나요? #보상은 커뮤니티 참여 및 네트워크 성장에 따라 증가합니다.\nTikCoin이 안전한가요? #예, 은행급 보안 및 정기 감사로 안전합니다.\n수익을 인출할 수 있나요? #예, 수익은 언제든지 지원되는 지갑으로 인출할 수 있습니다.\n추천이 어떻게 작동하나요? #초대 코드를 공유하여 다른 사람이 참여할 때 보너스 보상을 얻으세요.\n지금 TikCoin 커뮤니티 참여\nTikCoin 참여 - 함께 더 많이 벌자! #커뮤니티 채굴의 힘이 여기 있습니다. 오늘 TikCoin에 참여하여 수익을 함께 늘리자!\nTikCoin으로 채굴 시작\n면책 조항: 암호화폐 채굴에는 위험이 따릅니다. 항상 참여하기 전에 철저한 조사를 수행하세요.\n","date":"May 15, 2026","permalink":"https://dibi8.com/kr/resources/data-science/join-tikcoin-mining-increase-earnings-together/","section":"AI 源码资源","summary":"","title":"TikCoin 채굴에 참여하세요 - 우리 수익을 함께 늘리자!"},{"content":"{\u0026lt;/* resource-info */\u0026gt;}\nToprank: Claude Code로 SEO·GEO·광고 자동화 — 검색 순위 3배 상승하는 AI 마케팅 도구 #디지털 마케팅의 경쟁이 날로 치열해지는 2026년, 기업과 마케터들은 매일 같은 고민에 직면합니다. \u0026ldquo;어떻게 하면 검색 순위를 올릴 수 있을까?\u0026rdquo;, \u0026ldquo;광고 비용은 줄이면서 전환율은 높이려면?\u0026rdquo;, \u0026ldquo;ChatGPT나 Perplexity 같은 AI 검색 엔진에서도 노출될 수 있을까?\u0026rdquo; 이런 고민을 한 번에 해결해 주는 혁신적인 AI 마케팅 도구가 바로 Toprank입니다.\nToprank란 무엇인가? #Toprank는 Anthropic의 Claude Code를 기반으로 개발된 차세대 AI 마케팅 자동화 플랫폼입니다. 기존의 SEO 도구, 광고 관리 툴, 콘텐츠 생성 소프트웨어를 따로 사용해야 했던 불편함을 없애고, 검색 엔진 최적화(SEO), 생성형 엔진 최적화(GEO), 광고 자동화를 하나의 통합 대시보드에서 처리할 수 있게 설계되었습니다.\nClaude Code의 강력한 자연어 처리 능력과 코드 실행 기능을 활용하여, 복잡한 데이터 분석부터 콘텐츠 작성, 키워드 리서치, 경쟁사 분석까지 모두 AI가 자동으로 수행합니다. 마케팅 전문가가 아니더라도 누구나 쉽게 사용할 수 있는 것이 Toprank의 가장 큰 장점입니다.\nSEO 자동화: 24시간 작동하는 AI SEO 전문가 #검색 엔진 최적화는 지속적인 모니터링과 수정이 필요한 작업입니다. Toprank는 이 과정을 완전히 자동화합니다.\n실시간 키워드 분석 및 추천 #Toprank는 Claude Code의 데이터 분석 기능을 활용하여 시장 트렌드, 검색량, 경쟁 강도를 실시간으로 분석합니다. 사용자가 타겟으로 하는 산업과 제품에 가장 적합한 키워드를 자동으로 추천하고, 장기적인 키워드 전략까지 수립해 줍니다.\n온페이지 SEO 자동 최적화 #메타 타이틀, 메타 디스크립션, 헤딩 태그, 이미지 ALT 텍스트, 내부 링크 구조 등 웹사이트의 모든 온페이지 요소를 AI가 자동으로 점검하고 최적화합니다. 기술적 SEO 문제도 실시간으로 감지하여 수정 가이드를 제공합니다.\n콘텐츠 생성 및 최적화 #검색 엔진과 사용자 모두에게 가치 있는 콘텐츠를 생성하는 것은 SEO의 핵심입니다. Toprank는 Claude Code의 글쓰기 능력을 활용하여, 타겟 키워드를 자연스럽게 포함하면서도 독자에게 실질적인 정보를 제공하는 고품질 콘텐츠를 자동으로 생성합니다. 블로그 포스트, 랜딩 페이지, 제품 설명 등 다양한 형태의 콘텐츠를 지원합니다.\nGEO(Generative Engine Optimization): AI 검색 시대의 새로운 전략 #2024년부터 본격화된 생성형 AI 검색 엔진 시대에 기존 SEO만으로는 부족합니다. ChatGPT, Perplexity, Claude, Gemini 같은 AI 검색 엔진에서 브랜드가 언급되고 추천되려면 GEO 전략이 필수입니다.\nAI 검색 엔진 가시성 확보 #Toprank는 생성형 AI 검색 엔진이 콘텐츠를 어떻게 이해하고 평가하는지 분석합니다. AI가 선호하는 구조화된 데이터, 신뢰할 수 있는 출처 인용, 명확한 질문-답변 형식의 콘텐츠를 자동으로 생성하여 AI 검색 결과에서의 노출을 극대화합니다.\nE-E-A-T 강화 #AI 검색 엔진은 경험(Experience), 전문성(Expertise), 권위(Authoritativeness), 신뢰성(Trustworthiness)을 중요하게 평가합니다. Toprank는 웹사이트의 E-E-A-T 신호를 분석하고 개선 방안을 제시하며, 전문가 프로필 강화, 출처 링크 최적화, 사실 기반 콘텐츠 작성을 자동으로 지원합니다.\n광고 자동화: ROAS 200% 달성하는 스마트 캠페인 관리 #Google Ads, Meta Ads, 네이버 광고 등 다양한 광고 플랫폼의 캠페인 관리는 시간과 전문성을 많이 요구합니다. Toprank는 AI가 광고 예산을 스마트하게 배분하고 성과를 극대화합니다.\n자동 입찰가 최적화 #실시간 경매 데이터와 전환율을 분석하여 최적의 입찰가를 자동으로 조정합니다. 광고비 낭비를 줄이고 핵심 키워드에서의 노출을 극대화합니다.\n광고 크리에이티브 A/B 테스트 #헤드라인, 본문, 이미지, CTA 버튼 등 다양한 광고 요소를 자동으로 A/B 테스트합니다. AI가 가장 높은 CTR과 전환율을 보이는 조합을 실시간으로 학습하고 최적화합니다.\n오디언스 타겟팅 자동화 #광고 노출 데이터와 전환 데이터를 분석하여 가치 있는 오디언스 세그먼트를 자동으로 발굴합니다. 룩얼라이크 오디언스 생성과 리타겟팅 전략도 AI가 자동으로 수립합니다.\nToprank를 선택해야 하는 이유 #1. 통합 마케팅 대시보드 #SEO, GEO, 광고 성과를 하나의 화면에서 실시간으로 모니터링할 수 있습니다. 데이터를 이리저리 옮겨 다닐 필요 없이 통합 리포트로 마케팅 전략을 한눈에 파악합니다.\n2. Claude Code 기반의 신뢰할 수 있는 AI #단순한 템플릿 기반 생성이 아닌, Claude Code의 고급 추론 능력을 활용하여 맥락을 이해하고 전략적인 결정을 내립니다. 환각 현상을 최소화하고, 사실 기반의 정확한 분석과 콘텐츠를 제공합니다.\n3. 코드 수준의 커스터마이징 #Claude Code의 코드 실행 기능을 활용하여, 사용자의 특정 비즈니스 로직과 워크플로우에 맞게 완전히 커스터마이징할 수 있습니다. API 연동, 데이터 파이프라인 구축, 맞춤형 리포팅까지 모두 가능합니다.\n4. 시간과 비용 절약 #기존에는 SEO 전문가, 콘텐츠 작가, 광고 매니저, 데이터 분석가가 각각 필요했던 업무를 Toprank 하나로 대체할 수 있습니다. 중소기업과 스타트업도 대기업 수준의 마케팅을 실행할 수 있습니다.\n실제 사용 사례 #이커머스 스타트업 A사는 Toprank 도입 후 3개월 만에 유기 검색 트래픽이 280% 증가했고, 광고 ROAS는 기존 150%에서 320%로 개선되었습니다. 콘텐츠 생성에 소요되던 주 20시간이 2시간으로 단축되었습니다.\nB2B SaaS 기업 B사는 GEO 전략을 적용하여 ChatGPT와 Perplexity에서의 브랜드 언급률을 5배 높였고, 이를 통해 자연스러운 리드 생성이 40% 증가했습니다.\n시작하기 #Toprank는 웹사이트 연동 후 5분이면 바로 사용할 수 있습니다. 무료 체험판을 통해 SEO 감사, 키워드 분석, 콘텐츠 3편 생성을 무료로 경험해 보세요. 유료 플랜은 월 $49부터 시작하며, 팀 규모와 필요한 기능에 따라 Enterprise 플랜도 제공됩니다.\n마무리 #검색의 패러다임이 전통적인 검색 엔진에서 생성형 AI로 빠르게 전환되고 있습니다. 이 변화의 중심에서 기업의 디지털 마케팅 성공을 이끌어 줄 도구가 바로 Toprank입니다. SEO, GEO, 광고를 AI 하나로 통합 관리하여 검색 순위 상승, 트래픽 증가, 전환율 개선을 동시에 달성하세요.\n지금 Toprank를 시작하고, AI 마케팅의 새로운 기준을 경험해 보세요.\n","date":"May 15, 2026","permalink":"https://dibi8.com/kr/resources/ai-tools/toprank/","section":"AI 源码资源","summary":"","title":"Toprank: Claude Code로 SEO·GEO·광고 자동화 — 검색 순위 3배 상승하는 AI 마케팅 도구"},{"content":"{\u0026lt;/* resource-info */\u0026gt;}\n문제: AI가 작성한 코드는 실행되지만 UI가 끔찍하다 #AI 어시스턴트에게 로그인 페이지를 작성하라고 했더니 기능은 완벽하지만 2005년 웹사이트처럼 보입니다:\n버튼에 hover 효과가 없다 간격이 제멋대로다 글꼴 크기 계층이 혼란스럽다 모바일에서는 완전히 볼 수 없다 색상이 무작위로 생성된 것 같다 \u0026ldquo;예쁘게 만들어줘\u0026quot;라고 설명해봤지만 AI는 \u0026ldquo;예쁘다\u0026quot;가 무엇인지 모릅니다. 코드는 알지만 디자인은 모릅니다.\nUI/UX Pro Max Skill이 이 문제를 해결합니다: AI 어시스턴트에게 전문 디자이너의 미적 감각과 기법을 즉시 부여합니다.\nUI/UX Pro Max Skill이란 무엇인가? #UI/UX Pro Max Skill은 GitHub에서 74,785+ Stars를 보유한 오픈소스 AI 스킬 라이브러리입니다. AI 코딩 어시스턴트(Claude, Cursor, Windsurf, Kiro 등)에 전문급 UI/UX 디자인 인텔리전스를 제공합니다.\n이것은 디자인 도구가 아니라 디자인 지식 베이스입니다 — 다음을 포함합니다:\n디자인 시스템 규격(간격, 글꼴, 색상, 그림자) 컴포넌트 디자인 패턴(버튼, 카드, 폼, 네비게이션) 반응형 레이아웃 전략 인터랙션 디자인 원칙(애니메이션, 피드백, 상태) 플랫폼 적용 가이드(Web, iOS, Android) 핵심 기능 #1. 다중 플랫폼 디자인 지원 # 플랫폼 커버 내용 Web React, Vue, HTML5, TailwindCSS Mobile iOS (SwiftUI), Android (Compose), React Native Desktop Electron, Tauri Landing Page 마케팅 페이지, 전환 최적화 Dashboard 데이터 시각화, 관리 백오피스 2. 디자인 시스템 규격 #스킬 설치 후 AI 어시스턴트가 자동으로 다음 규격을 적용합니다:\n/* 자동 생성된 디자인 토큰 */ :root { /* 간격 시스템 (8px 기준) */ --space-1: 4px; --space-2: 8px; --space-3: 12px; --space-4: 16px; --space-6: 24px; --space-8: 32px; --space-12: 48px; --space-16: 64px; /* 글꼴 비율 */ --text-xs: 12px; --text-sm: 14px; --text-base: 16px; --text-lg: 18px; --text-xl: 20px; --text-2xl: 24px; --text-3xl: 30px; /* 그림자 계층 */ --shadow-sm: 0 1px 2px rgba(0,0,0,0.05); --shadow-md: 0 4px 6px rgba(0,0,0,0.1); --shadow-lg: 0 10px 15px rgba(0,0,0,0.1); --shadow-xl: 0 20px 25px rgba(0,0,0,0.15); } 3. 컴포넌트 디자인 패턴 #AI 어시스턴트가 전문 표준에 따라 컴포넌트를 생성합니다:\n버튼 컴포넌트 예시:\n// AI가 생성한 버튼, 모든 상태 자동 포함 \u0026lt;button className=\u0026#34; px-4 py-2 rounded-lg font-medium bg-blue-600 text-white hover:bg-blue-700 active:bg-blue-800 disabled:opacity-50 disabled:cursor-not-allowed transition-colors duration-200 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 \u0026#34; \u0026gt; Submit \u0026lt;/button\u0026gt; 카드 컴포넌트 예시:\n// hover 효과, 간격, 그림자 자동 포함 \u0026lt;div className=\u0026#34; bg-white rounded-xl shadow-md hover:shadow-lg transition-shadow duration-300 p-6 space-y-4 \u0026#34; \u0026gt; \u0026lt;img className=\u0026#34;w-full h-48 object-cover rounded-lg\u0026#34; src=\u0026#34;https://picsum.photos/seed/ui-design/800/450\u0026#34; /\u0026gt; \u0026lt;h3 className=\u0026#34;text-xl font-semibold text-gray-900\u0026#34;\u0026gt;Title\u0026lt;/h3\u0026gt; \u0026lt;p className=\u0026#34;text-gray-600 leading-relaxed\u0026#34;\u0026gt;Description...\u0026lt;/p\u0026gt; \u0026lt;/div\u0026gt; 4. 반응형 디자인 #AI가 자동으로 반응형 브레이크포인트를 추가합니다:\n// 모바일 우선, 자동으로 데스크톱 적용 \u0026lt;div className=\u0026#34; grid grid-cols-1 /* 휴대폰: 1열 */ sm:grid-cols-2 /* 태블릿: 2열 */ lg:grid-cols-3 /* 데스크톱: 3열 */ xl:grid-cols-4 /* 대형 화면: 4열 */ gap-4 sm:gap-6 lg:gap-8 \u0026#34; \u0026gt; {items.map(item =\u0026gt; \u0026lt;Card key={item.id} {...item} /\u0026gt;)} \u0026lt;/div\u0026gt; 5. 인터랙션과 애니메이션 #// 자동으로 미세 인터랙션 추가 \u0026lt;div className=\u0026#34; group relative cursor-pointer \u0026#34; \u0026gt; \u0026lt;div className=\u0026#34; transform transition-all duration-300 group-hover:scale-105 group-hover:-translate-y-1 \u0026#34; \u0026gt; {/* Card content */} \u0026lt;/div\u0026gt; \u0026lt;div className=\u0026#34; absolute inset-0 bg-black/0 group-hover:bg-black/5 transition-colors duration-300 rounded-xl \u0026#34; /\u0026gt; \u0026lt;/div\u0026gt; 설치 및 사용 #Hermes Agent에 설치 ## 스킬 라이브러리 클론 git clone https://github.com/nextlevelbuilder/ui-ux-pro-max-skill.git # Hermes skills 디렉토리에 복사 cp -r ui-ux-pro-max-skill ~/.hermes/skills/ # Hermes 재시작, 스킬 자동 로드 hermes Claude / Cursor에서 사용 ## SKILL.md 내용을 시스템 프롬프트에 추가 # 또는 대화 시작 시 디자인 규격을 붙여넣기 사용 예시 #설치 전:\nUser: 로그인 페이지 작성해줘 AI: (기능은 완벽하지만 디자인이 조잡한 페이지 생성) 설치 후:\nUser: 로그인 페이지 작성해줘 AI: (아름다운 디자인 시스템이 적용된 로그인 페이지 생성) - 그라데이션 배경 + 글래스모피즘 카드 - 입력란 focus 애니메이션 - 버튼 hover/active 상태 - 반응형 레이아웃 - 다크 모드 지원 지원하는 AI 어시스턴트 # AI 어시스턴트 지원 방식 효과 Claude SKILL.md 시스템 프롬프트 ⭐⭐⭐⭐⭐ Cursor .cursorrules + 스킬 ⭐⭐⭐⭐⭐ Windsurf 전역 규칙 ⭐⭐⭐⭐⭐ Kiro 스킬 통합 ⭐⭐⭐⭐⭐ GitHub Copilot 코드 스니펫 ⭐⭐⭐⭐ Trae 규칙 파일 ⭐⭐⭐⭐ 디자인 원칙 #UI/UX Pro Max Skill은 다음 디자인 원칙을 따릅니다:\n일관성 — 통일된 간격, 글꼴, 색상 시스템 계층성 — 명확한 시각적 계층이 사용자 주의를 유도 피드백성 — 모든 인터랙션에 즉각적인 시각적 피드백 사용성 — WCAG 2.1 AA 접근성 표준 준수 반응성 — 휴대폰에서 4K 화면까지 완벽 적용 성능 — 애니메이션 GPU 가속, 프레임 레이트 영향 없음 유사 도구 비교 # 특성 UI/UX Pro Max V0.dev Galileo AI Figma AI 오픈소스 ✅ 예 ❌ 아니오 ❌ 아니오 ❌ 아니오 무료 ✅ 예 ⚠️ 제한 💰 유료 💰 유료 다중 플랫폼 ✅ 5+ 플랫폼 ⚠️ Web ⚠️ Web ❌ 디자인 AI 통합 ✅ 심층 ✅ 심층 ✅ 심층 ⚠️ 보조 코드 출력 ✅ 직접 ✅ 직접 ✅ 직접 ❌ 없음 사용자 정의 ✅ 완전 ⚠️ 제한 ⚠️ 제한 ✅ 완전 커뮤니티 74K+ Stars Vercel 스타트업 Figma 실제 효과 비교 #설치 전 AI가 생성한 버튼:\n\u0026lt;button style=\u0026#34;background: blue; color: white; padding: 10px;\u0026#34;\u0026gt;Click\u0026lt;/button\u0026gt; 설치 후 AI가 생성한 버튼:\n\u0026lt;button className=\u0026#34; inline-flex items-center justify-center px-5 py-2.5 rounded-lg bg-gradient-to-r from-blue-600 to-indigo-600 text-white font-medium text-sm shadow-lg shadow-blue-500/30 hover:shadow-xl hover:shadow-blue-500/40 hover:scale-105 active:scale-95 transition-all duration-200 ease-out focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed \u0026#34; \u0026gt; \u0026lt;span className=\u0026#34;mr-2\u0026#34;\u0026gt;→\u0026lt;/span\u0026gt; Get Started \u0026lt;/button\u0026gt; 결론 #UI/UX Pro Max Skill은 AI 어시스턴트에게 디자인 영혼을 부여하는 열쇠입니다.\n74K+ Stars는 개발자들이 AI 디자인 능력을 갈망하고 있음을 증명합니다 한 번 설치하면 모든 UI 생성 품짠이 영구적으로 향상됩니다 주요 AI 코딩 어시스턴트를 지원하며 플랫폼 종속이 없습니다 오픈소스 무료이며 커뮤니티가 지속적으로 새로운 패턴을 기여합니다 AI가 생성한 \u0026ldquo;실행은 되지만 못생긴\u0026rdquo; 인터페이스에 지쳤다면, 이 스킬 라이브러리는 필수 설치 항목입니다.\nGitHub: nextlevelbuilder/ui-ux-pro-max-skill\nStars: 74,785+ | Forks: 7,724+ | License: 오픈소스\n관련 기사 # Hermes Agent: 자기 개선하는 AI 에이전트 Free Claude Code: Claude Code CLI 오픈소스 프록시 Ladybird: 진정한 독립 웹 브라우저 ","date":"May 15, 2026","permalink":"https://dibi8.com/kr/resources/ai-tools/ui-ux-pro-max-skill-ai-design-intelligence/","section":"AI 源码资源","summary":"","title":"UI/UX Pro Max Skill：AI를 최고 디자이너로 만드는 신급 스킬 라이브러리"},{"content":"{\u0026lt;/* resource-info */\u0026gt;}\nVercel v0의 완벽한 오픈소스 대체재: Open Codesign으로 로컬에서 UI 찍어내기 #Vercel v0는 프롬프트 몇 줄로 React 컴포넌트를 만들어내며 세상을 놀라게 했습니다. 하지만 허니문은 끝났습니다. 야박한 무료 크레딧, Vercel 생태계에 대한 강제 종속, 그리고 사내 보안 규정상 클라우드에 코드를 올릴 수 없는 기업들의 불만이 폭발하고 있습니다. 2026년, 프라이빗하게 호스팅 가능한 UI 생성기를 찾는다면 Open Codesign이 유일한 해답입니다.\n비싼 클라우드 API에 의존하는 대신 로컬 UI 에이전트를 돌리는 것이 왜 압도적인 이점을 갖는지 파헤쳐 봅니다.\n벤치마크: Open Codesign vs Vercel v0 #UI 좀 만든다고 매달 수십 달러를 뜯길 필요는 없습니다. 오픈소스 반항아가 실리콘밸리 스타트업을 어떻게 무너뜨리는지 확인하세요:\n기능 / 지표 Open Codesign (오픈소스) Vercel v0 (유료 서비스) 과금 정책 $0 (무제한 생성 가능) 크레딧 제한 / 월 $20 이상 필수 LLM 엔진 원하는 모델 연결 (Ollama, DeepSeek 등) Vercel이 지정한 클라우드 모델로 고정됨 코드 프라이버시 100% 오프라인 구동 가능 내 프롬프트와 코드가 서버에 저장됨 출력 프레임워크 완전 커스텀 (React, Vue, Svelte 지원) Next.js와 Tailwind에 심각하게 편향됨 BYOM (Bring Your Own Model) 아키텍처의 위력 #Open Codesign의 가장 큰 무기는 모듈화입니다. Vercel v0는 블랙박스지만, Open Codesign은 오케스트레이션 계층으로 작동합니다. Ollama를 통해 로컬 그래픽 카드의 DeepSeek Coder 모델에 연결하면, 지연 시간(Latency) 제로, 데이터 유출 제로 환경이 완성됩니다. 에이전트가 생성한 UI는 로컬 iframe에서 즉시 렌더링되므로, API 토큰을 단 1원도 쓰지 않고 무한정 수정 지시를 내릴 수 있습니다.\nFAQ #Q: 자체 호스팅(Self-hosted)이 가능한 AI UI 생성기가 있나요? A: 네. Open Codesign이 바로 그 선두주자입니다. 프론트엔드를 로컬에서 실행하고, 로컬 LLM(Ollama 등)이나 자체 API 키와 직접 통신하므로 완벽한 프라이빗 환경을 구축할 수 있습니다.\nQ: Vercel v0를 대체할 최고의 무료 툴은 무엇인가요? (Free alternative to v0 by Vercel) A: Open Codesign은 v0와 가장 유사한 사용자 경험(프롬프트 입력 -\u0026gt; 실시간 미리보기)을 제공하면서도 100% 무료이며, Vercel 플랫폼에 종속되지 않는 깨끗한 코드를 뱉어냅니다.\n","date":"May 15, 2026","permalink":"https://dibi8.com/kr/resources/llm-frameworks/open-codesign-vs-vercel-v0/","section":"AI 源码资源","summary":"","title":"Vercel v0의 완벽한 오픈소스 대체재: Open Codesign으로 로컬에서 UI 찍어내기"},{"content":"{\u0026lt;/* resource-info */\u0026gt;}\nWiFi 공격을 전통적인 방식으로 배워본 적이 있다면, 흐름은 대개 이렇습니다: 모니터 모드와 패킷 인젝션을 지원하는 USB 무선 어댑터를 주문하고, 한나절 동안 Linux 드라이버와 씨름하고, 본인 소유의 테스트 AP를 세팅하고, 그제서야 진짜로 배우려던 공격 연습을 시작합니다. WiFi-Forge는 이 모든 사전 준비를 통째로 건너뛰게 해줍니다.\nWiFi-Forge는 Black Hills InfoSec에서 공개한 오픈소스 프로젝트로, 무선 공격을 연습할 안전하고 합법적인 환경을 제공합니다. 하드웨어를 살 필요가 없고, 남의 네트워크를 건드릴 위험도 없으며, 드라이버를 망가뜨릴 일도 없습니다. 가상 랩을 띄우면 곧바로 해킹 연습을 시작할 수 있습니다.\n왜 필요한가 —— WiFi 학습의 세 가지 함정 #기존 WiFi 실습 학습이 사람을 떨어뜨리는 세 가지 이유:\n하드웨어 복불복. 모든 USB 어댑터가 모니터 + 인젝션을 깔끔하게 지원하지는 않습니다. 검증된 모델(Alfa AWUS036, Panda PAU09 등)은 30~60 달러이며, 한 번에 한 개만 사용할 수 있습니다. 법적 회색지대. 대부분 국가에서 본인 소유가 아닌 네트워크를 건드리는 것은 —— 단순히 패시브 스니핑조차 —— 모두 위법입니다. \u0026ldquo;그냥 보기만 했다\u0026rdquo; 는 변명이 되지 않습니다. 롤백 비용. 실제 하드웨어는 한 번의 명령으로 초기화되지 않습니다. 망가진 설정을 git checkout으로 되돌릴 수 없습니다. WiFi-Forge는 이 세 가지를 노트북 위의 단일 샌드박스로 통합합니다.\n내부 구조 #WiFi-Forge는 mininet-wifi 위에 구축되었습니다 —— 802.11 네트워크 에뮬레이터로, Linux 네트워크 네임스페이스 내부에 가상 AP, 스테이션, \u0026ldquo;전파\u0026quot;를 만들어냅니다. 모든 AP와 클라이언트는 실제 Linux 프로세스이므로 iwconfig, airodump-ng, tcpdump는 물론 Reaver, Hashcat까지 시뮬레이션된 트래픽에 그대로 적용 가능하며, 표준 도구들이 실제 전파를 다루는 것처럼 동작합니다.\nWiFi-Forge가 그 위에 더하는 것: 미리 만들어진 토폴로지, 바로 실행되는 공격 시나리오, 그리고 매번 네트워크를 처음부터 설계할 필요가 없는 가이드 구조.\n무엇을 연습할 수 있나 # 번들된 랩은 일반적인 WiFi 공격 카테고리를 망라합니다:\nWPA/WPA2 핸드셰이크 캡처 —— 클라이언트를 deauth하고, 4-way handshake를 캡처하고, hashcat이나 aircrack-ng로 오프라인 크래킹 WPS 공격 —— Reaver PIN 무차별 대입, Pixie-Dust 공격 Evil-twin / Karma —— 타깃 SSID를 흉내낸 악성 AP를 띄우고 클라이언트가 자동 연결되는 모습 관찰 Deauth 플러드 —— 합법 AP에서 클라이언트를 떨어뜨리기 Beacon 플러딩 —— 가짜 AP 수천 개를 살포해 스캐너 혼란시키기 MAC 무작위화 분석 —— 최신 기기들이 신원을 어떻게 숨기는지 (그리고 어디서 노출되는지) 관찰 PMKID 공격 —— 클라이언트가 연결되어 있지 않아도 핸드셰이크 캡처 각 랩은 특정 토폴로지를 부팅하고 셸을 제공한 뒤, 작은 CTF 스타일의 목표를 부여합니다.\n시작하기 #git clone https://github.com/blackhillsinfosec/WifiForge cd WifiForge sudo ./install.sh sudo python3 wififorge.py Linux(Ubuntu 또는 Debian 권장), Python 3, root 권한이 필요합니다(mininet-wifi가 커널 기능을 사용함). 설치 스크립트가 의존성을 자동으로 처리합니다 —— mininet-wifi, aircrack-ng, hashcat, reaver 등.\n누구에게 적합한가 # OSCP / OSWP 수험생 —— 시험 랩과 유사한 시나리오를 하드웨어 없이 연습 CTF 출제자 —— 실제 무전기 없이 무선 챌린지를 빠르게 구성 보안 교육자 —— 모든 학생에게 몇 초 만에 초기화되는 독립적인 랩 제공 호기심 있는 개발자 —— 4-way handshake가 실제로 어떻게 작동하는지 디버거 붙여 한 단계씩 추적 ⚠️ WiFi-Forge로 배울 수 없는 것: 물리 계층 —— RF, 안테나 선택, 실제 신호 감쇠. 이것은 결국 진짜 카드가 필요합니다. 그러나 실전 공격의 90%가 발생하는 프로토콜 계층에서는 시뮬레이션과 실제 트래픽이 사실상 구별 불가능합니다.\n합법성과 윤리에 관한 한마디 #이런 프로젝트는 직접적으로 말하는 것이 중요합니다: 본인이 소유하거나 명시적으로 서면 허가를 받은 네트워크에서만 이 기술을 사용하세요. WiFi-Forge가 존재하는 이유는, 시뮬레이션 랩이 있기에 옆 카페 WiFi에 \u0026ldquo;한 번 해볼까\u0026quot;라는 유혹이 사라지기 때문입니다. 안전하게 배우는 것 —— 그것이 핵심입니다.\n저장소: github.com/blackhillsinfosec/WifiForge 기반: mininet-wifi 관리: Black Hills InfoSec ","date":"May 15, 2026","permalink":"https://dibi8.com/kr/resources/ai-tools/wifi-forge-safe-wifi-hacking-lab/","section":"AI 源码资源","summary":"","title":"WiFi-Forge — WiFi 해킹을 안전하고 합법적으로 배우는 샌드박스"},{"content":"{\u0026lt;/* resource-info */\u0026gt;}\n문제: 당신의 CPU는 도대체 무엇을 실행하고 있나요? #노트북 팬이 미친 듯이 돌고 배터리가 빠르게 소모되지만, 범인이 누군지 모릅니다. Activity Monitor나 Task Manager를 열면 프로세스 이름들만 보이고, 근본적인 질문에는 답할 수 없습니다:\n\u0026ldquo;Why is this running?\u0026rdquo;\n이 프로세스는 누가 시작했나요? 왜 아직 실행 중인가요? 어떤 포트를 점유하고 있나요? 하위 프로세스는 무엇인가요? 종료하면 다른 것에 영향을 미치나요? 기존 도구(htop, top, ps)는 스냅샷만 제공하고 계보는 제공하지 않습니다.\nWitr란 무엇인가? #Witr(\u0026ldquo;Why is this running?\u0026quot;)는 Go로 작성된 오픈소스 프로세스 분석 도구입니다. GitHub에서 15,042+ Stars를 보유하고 있으며, 모든 시스템 관리자와 개발자가 가장 궁금해하는 질문에 답합니다.\nWitr의 핵심 기능: 프로세스의 완전한 인과 관계 체인을 보여줍니다 — init 시스템부터 대상 프로세스까지, \u0026ldquo;누가 누구를 낳았는지\u0026quot;를 완전히 보여주는 가족 트리입니다.\n핵심 기능 #1. 프로세스 계보 트리(Process Ancestry) #Witr의 킬러 기능입니다. witr \u0026lt;PID\u0026gt;를 실행하면:\ninit(1) └── systemd(1234) └── dockerd(5678) └── containerd-shim(9012) └── node(3456) ← Your App ├── npm(7890) └── webpack-dev-server(2345) 한눈에 보기: 이 Node.js 프로세스는 Docker 컨테이너 안에 있고, systemd에 의해 시작되었으며, webpack-dev-server는 그 하위 프로세스입니다.\n2. 인터랙티브 TUI 모드 #Witr는 단순한 명령줄 출력이 아니라 완전한 터미널 사용자 인터페이스를 갖추고 있습니다:\n기능 단축키 설명 실시간 프로세스 목록 ↑↓ 모든 실행 중인 프로세스, 정렬 및 필터링 지원 포트 뷰 p 열린 포트와 해당 프로세스 즉시 확인 프로세스 상세 정보 Enter 완전한 계보 트리, 하위 프로세스, 환경 변수, 작업 디렉토리 신호 전송 k Kill, Terminate, Pause, Resume 우선순위 조정 r Renice 프로세스 마우스 지원 🖱️ 정렬, 행 선택 클릭 3. 포트 뷰 #$ witr --ports PORT PROTO PROCESS PID USER 8080 TCP node 3456 ubuntu 3000 TCP webpack-dev 2345 ubuntu 5432 TCP postgres 5678 postgres 22 TCP sshd 1234 root 누가 어떤 포트를 수신 대기하는지 한눈에 파악, 더 이상 lsof -i :8080이 필요 없습니다.\n4. 환경 변수 및 작업 디렉토리 #$ witr 3456 --env PID: 3456 Command: node server.js Working Directory: /home/ubuntu/myapp Environment Variables: NODE_ENV=production PORT=8080 DATABASE_URL=postgresql://... API_KEY=sk-*** 구성 문제 디버깅의 신기 — 프로세스가 실제로 실행되는 환경을 직접 확인합니다.\n5. 신호 전송 #TUI에서 직접 신호를 보냅니다:\nSIGKILL (9) — 강제 종료 SIGTERM (15) — 우아한 종료 SIGSTOP (19) — 일시 중지 SIGCONT (18) — 재개 kill -9 PID를 외울 필요 없이, k를 누르고 선택하면 됩니다.\n설치 #원클릭 설치 ## macOS / Linux curl -fsSL https://github.com/pranshuparmar/witr/releases/latest/download/witr-$(uname -s | tr \u0026#39;[:upper:]\u0026#39; \u0026#39;[:lower:]\u0026#39;)-$(uname -m | sed \u0026#39;s/x86_64/amd64/;s/aarch64/arm64/\u0026#39;) -o witr chmod +x witr sudo mv witr /usr/local/bin/ # Go 설치 go install github.com/pranshuparmar/witr/cmd/witr@latest 지원 플랫폼 # ✅ Linux ✅ macOS ✅ Windows ✅ FreeBSD 사용 예시 #기본 사용법 ## 인터랙티브 TUI 시작 witr # 특정 프로세스의 계보 트리 확인 witr 3456 # 포트 점유 확인 witr --ports # 프로세스 환경 변수 확인 witr 3456 --env # 지속 모니터링 모드 witr --watch 실제 시나리오 #시나리오 1: 배터리 소모 범인 찾기\n$ witr # CPU로 정렬, node 프로세스가 80% 차지 # Enter로 상세 정보 확인: webpack-dev-server # k → SIGTERM → 우아하게 종료 시나리오 2: 포트 충돌\n$ witr --ports # 8080이 점유된 것 발견 # 프로세스 확인: 어제 남겨진 테스트 서버 # k → SIGKILL → 포트 해제 시나리오 3: 컨테이너 디버깅\n$ witr $(docker inspect -f \u0026#39;{{.State.Pid}}\u0026#39; mycontainer) # 컨테이너 내 프로세스의 계보 트리 확인 # 환경 변수, 작업 디렉토리 한눈에 보기 유사 도구 비교 # 기능 Witr htop ps lsof 프로세스 계보 트리 ✅ 완전 ❌ 없음 ❌ 없음 ❌ 없음 인터랙티브 TUI ✅ 예 ✅ 예 ❌ 아니오 ❌ 아니오 포트 뷰 ✅ 내장 ❌ 없음 ❌ 없음 ✅ 예 환경 변수 ✅ 원클릭 ❌ 없음 ⚠️ 복잡 ❌ 없음 신호 전송 ✅ 인터랙티브 ⚠️ 제한적 ❌ 없음 ❌ 없음 마우스 지원 ✅ 예 ✅ 예 ❌ 아니오 ❌ 아니오 크로스 플랫폼 ✅ 4개 플랫폼 ✅ 다중 플랫폼 ✅ 범용 ✅ 다중 플랫폼 아키텍처 #Witr는 Go로 작성되었으며 운영 체제 기본 API를 활용합니다:\nLinux: /proc 파일 시스템 macOS: libproc + sysctl Windows: Windows API FreeBSD: kvm + sysctl 순수 Go 구현, CGO 의존성 없음(Windows 제외), 단일 바이너리 파일, 제로 의존성.\n결론 #Witr는 htop의 대체품이 아니라 프로세스 디버깅 전용 도구입니다. \u0026ldquo;Why is this running?\u0026ldquo;이라는 질문에 답해야 할 때, Witr는 어떤 도구보다 빠릅니다.\n15K+ Stars는 실제 문제를 해결했음을 증명합니다 단일 바이너리 파일, 어디서든 사용 가능 TUI 경험이 부드럽고, 마우스와 키보드 모두 지원 GitHub: pranshuparmar/witr\nStars: 15,042+ | Language: Go | License: 오픈소스\n관련 기사 # Scanners-Box: 200+ 사이버보안 도구 모음 Free Claude Code: Claude Code CLI 오픈소스 프록시 TabPFN: 테이블 데이터 기반 모델 ","date":"May 15, 2026","permalink":"https://dibi8.com/kr/resources/dev-utils/witr-process-monitor-system-resource/","section":"AI 源码资源","summary":"","title":"Witr：원클릭으로 프로세스 계보 트리 추적, 시스템 자원 블랙홀 종결"},{"content":"{\u0026lt;/* resource-info */\u0026gt;}\n기업들은 왜 ChatGPT를 두려워하는가? #ToC(일반 소비자) 시장에서 ChatGPT는 전지전능하지만, ToB(기업 간 거래) 시장에서 데이터 프라이버시는 기업의 목을 겨누는 다모클레스의 검입니다. 병원은 환자 기록을 올릴 수 없고, 로펌은 사건 기록을 올릴 수 없으며, 투자은행은 재무제표를 올릴 수 없습니다. 핵심 기업 자산을 API를 통해 OpenAI로 넘기는 것은 자살 행위나 다름없습니다.\n이 지점에서 GitHub 15k+ Star를 휩쓸고 있는 풀스택 솔루션 AnythingLLM이 구원자로 등장합니다. 이것은 단순한 RAG(검색 증강 생성) 장난감이 아닙니다. 즉시 실무에 투입 가능한 기업용 로컬 지식베이스 구축 프레임워크입니다. 벡터 데이터베이스부터 LLM 추론까지 완벽한 로컬 폐쇄 루프를 구현함으로써, AI 데이터 프라이버시 보호라는 치명적인 페인포인트를 해결하는 궁극의 해독제입니다.\n[여기에 권장 삽입: 프로젝트 아키텍처 다이어그램 / 실행 스크린샷] 그림: AnythingLLM의 시스템 파노라마. 문서 파싱과 벡터 임베딩(Embedding)부터 다중 인스턴스 벡터 DB 격리 관리까지의 절대 안전 아키텍처를 보여줍니다.\n경쟁사 압살: AnythingLLM vs LocalGPT vs PrivateGPT #프라이빗 LLM 상업화 납품을 계획하고 있다면, 올바른 프레임워크 선택이 수개월의 개발 기간을 아껴줄 것입니다. AnythingLLM이 왜 경쟁에서 압승하는지 살펴보겠습니다.\n평가 항목 AnythingLLM LocalGPT PrivateGPT 전체 아키텍처 Node.js 프론트/백엔드 분리. 미려한 UI 기본 탑재 및 다중 사용자 워크스페이스 격리 지원. 순수 Python 스크립트. 주로 터미널에서 구동되며 UI가 거의 없음. 아키텍처는 깔끔하고 API를 제공하나, 기본 UI가 극도로 조잡함. 다중 모델 호환성 최강. OpenAI, Anthropic은 물론 로컬의 Ollama / LMStudio까지 매끄럽게 지원. LangChain 및 HuggingFace 생태계에 강하게 종속됨. 양호함. 단, 이기종 모델 전환 시 설정 파일을 뜯어고쳐야 하는 번거로움. 엔터프라이즈 권한 Workspaces 격리 및 RBAC 권한 관리 지원. B2B 납품에 완벽하게 부합. 단일 사용자 단일 머신용. 권한 격리 개념 자체가 없음. API 제공자에 치중되어 있어 권한 제어가 취약함. 배포 난이도 최하. 원클릭 Docker 실행 패키지 제공. AnythingLLM 로컬 배포 튜토리얼에 완벽히 부합. 중간. 의존성 및 CUDA 버전 충돌 문제를 직접 해결해야 함. 중간. Poetry 환경 설정에 의존하여 초보자에게 불친절함. \u0026ldquo;터미널에서 코드를 쳐야만 돌아가는 스크립트를 기업에 팔려고 하지 마십시오. 기업이 원하는 것은 예쁜 화면이 있고, 계정 관리가 되며, 마우스 클릭으로 PDF를 올릴 수 있는 \u0026lsquo;제품\u0026rsquo;입니다. AnythingLLM은 당신의 코드를 수천만 원짜리 제품으로 포장해 주는 슈퍼 껍데기입니다.\u0026rdquo;\n소스 코드 딥다이브: 벡터 청킹 전략과 스트리밍 응답 메커니즘 #수백 메가바이트에 달하는 PDF 재무제표를 안정적으로 씹어먹기 위해, AnythingLLM은 RAG 파이프라인에서 엄청난 막노동(Dirty work)을 수행합니다. Node.js 백엔드 소스코드로 잠수하여 이를 파헤쳐 봅시다.\n1. 지식베이스 분할: 스마트 청킹(Chunking) 알고리즘 #RAG에서 텍스트 분할(Chunking)을 대충 하면, 검색되어 나오는 문맥은 토막 난 쓰레기가 됩니다. AnythingLLM은 매우 강력하고 견고한 문서 파싱 파이프라인을 구현했습니다.\n// 핵심 소스코드 추출: server/utils/vectorDbProviders/lancedb/index.js (벡터 청킹 로직) const { RecursiveCharacterTextSplitter } = require(\u0026#34;langchain/text_splitter\u0026#34;); async function processDocument(documentText, workspaceConfig) { /* * 스마트 청킹 알고리즘: 재무제표나 긴 법률 계약서를 무식하게 글자 수로만 자르는 것은 재앙입니다. * 여기서는 langchain의 Recursive 분할기를 사용하여 문단, 줄바꿈을 최우선으로 자르며, * chunk_overlap을 강제하여 문맥의 의미(예: 만약 ~라면 ~하다)가 무 자르듯 끊기지 않게 보장합니다. */ const splitter = new RecursiveCharacterTextSplitter({ chunkSize: workspaceConfig.chunkSize || 1000, chunkOverlap: workspaceConfig.chunkOverlap || 200, // [핵심 전략]: 인간의 읽기 습관을 철저히 반영한 Fallback 분할 우선순위 separators: [\u0026#34;\\n\\n\u0026#34;, \u0026#34;\\n\u0026#34;, \u0026#34; \u0026#34;, \u0026#34;\u0026#34;], }); const chunks = await splitter.createDocuments([documentText]); // 임베딩(Embedding) 벡터 생성 const embeddings = await EmbeddingEngine.embed(chunks); // 현재 워크스페이스의 Namespace에 격리하여 삽입 await LanceDB.insert(workspaceConfig.namespace, embeddings); return chunks.length; } 심층 분석: 이 코드는 AnythingLLM이 문서를 다루는 섬세함을 보여줍니다. RecursiveCharacterTextSplitter에 무려 200 token의 chunkOverlap을 결합하여, 글자 수 제한 때문에 문단 간의 핵심 논리가 유실되는 것을 막아냅니다. 이러한 중첩(Overlap) 절단은 로컬 LLM이 답변의 지능을 유지하는 데 결정적인 역할을 합니다.\n2. 프론트엔드-백엔드 데이터 교환: Server-Sent Events (SSE) 스트리밍 출력 #LLM을 사용할 때 답변이 완전히 생성될 때까지 기다리게 하면 사용자 경험(UX)은 나락으로 떨어집니다. AnythingLLM은 SSE를 통해 부드러운 타자기 효과를 구현합니다.\n// 백엔드 스트리밍 응답 핵심 로직 (Express.js 라우트) app.post(\u0026#39;/api/workspace/:slug/chat\u0026#39;, async (request, response) =\u0026gt; { // HTTP 헤더를 설정하여 지속적인 SSE 영구 연결(Long-lived connection) 수립 response.setHeader(\u0026#39;Content-Type\u0026#39;, \u0026#39;text/event-stream\u0026#39;); response.setHeader(\u0026#39;Cache-Control\u0026#39;, \u0026#39;no-cache\u0026#39;); response.setHeader(\u0026#39;Connection\u0026#39;, \u0026#39;keep-alive\u0026#39;); try { // 비동기 반복자(Async iterator)로 LLM의 스트리밍 출력을 가져옴 const stream = await LLMProvider.streamChat(request.body.prompt, context); for await (const chunk of stream) { // 데이터 청크를 SSE 규격에 맞게 포맷팅하여 프론트엔드로 푸시 // 게이트웨이 타임아웃으로 인해 연결이 끊기는 것을 방지 response.write(`data: ${JSON.stringify({ text: chunk })}\\n\\n`); } response.write(`data: [DONE]\\n\\n`); response.end(); } catch (error) { // [실전 삽질 방지]: 스트리밍 연결 중 발생한 예외는 반드시 수동으로 response를 닫아주어야 함 response.write(`data: ${JSON.stringify({ error: \u0026#34;Streaming failed\u0026#34; })}\\n\\n`); response.end(); } }); 심층 분석: 무겁고 복잡한 WebSocket 대신, AnythingLLM은 더 가벼운 단방향 통신 스트림인 SSE를 선택했습니다. 이는 다중 Nginx 리버스 프록시를 거치는 험악한 기업 내부망 배포 환경에서 방화벽에 막힐 확률을 획기적으로 낮춰주는, 매우 전략적이고 똑똑한 엔지니어링 결정입니다.\n엔지니어링 실전: 프라이빗 배포의 데스 트랩(Death Trap)과 지뢰 제거 #Ollama AnythingLLM 연동을 통해 프라이빗 구축을 실행할 때, 다음 두 가지 거대한 지뢰(Pitfall)를 반드시 피해야 합니다.\n함정 1: Docker 내부망 격리와 Ollama 포트 거부 (Network Isolation)\n증상: Docker 컨테이너 안에서 도는 AnythingLLM이 호스트 머신의 Ollama 서비스에 접근하지 못하고 Connection Refused 에러를 미친 듯이 뿜어냅니다. 해결책: Docker 내부에서 localhost는 호스트 머신이 아니라 컨테이너 자기 자신을 의미합니다! AnythingLLM의 대형 모델 설정 주소를 반드시 http://host.docker.internal:11434로 지정해야 합니다. 또한 Ollama를 실행할 때 OLLAMA_HOST=0.0.0.0 환경 변수를 주입하여 타 네트워크 인터페이스의 접근을 허용해야 합니다. 함정 2: LanceDB의 디스크 IO 락(Lock) 현상\n증상: 여러 사용자가 동시에 동일한 Workspace에 대용량 PDF를 업로드하면, 데이터베이스가 SQLITE_BUSY 에러나 쓰기 잠금(Write lock) 에러를 냅니다. 해결책: 기본 내장된 임베디드 벡터 DB인 LanceDB/Chroma는 고빈도 동시 쓰기 시 파일 잠금 이슈가 있습니다. 수십 명의 직원이 사용하는 실제 기업 환경이라면, 시스템 설정에서 Vector DB를 독립적으로 배포된 Qdrant나 Milvus 인스턴스로 반드시 교체하십시오. 비즈니스 루프: B2B 기업에 \u0026ldquo;절대적 보안\u0026quot;을 팔아 폭리를 취하는 법칙 #오픈소스 세계의 긱(Geek)들과 \u0026lsquo;무료\u0026rsquo; 경쟁을 하지 마십시오. 돈이 넘쳐나는 기업에게 \u0026lsquo;안전\u0026rsquo;을 파십시오. AnythingLLM을 활용하면 비즈니스 루트는 극도로 선명해집니다.\n증권사/투자은행 로컬 리포트 질의응답 시스템: 금융 기관의 재무제표와 고객 명단은 절대적인 기밀입니다. AnythingLLM과 Qwen 모델이 탑재된 하드코어 워크스테이션(심지어 인터넷 선도 뽑아버린 채로)을 들고 가 그들의 내부망에 꽂아 넣으십시오. 당신이 파는 것은 소프트웨어가 아니라 단가 수천만 원짜리 \u0026ldquo;금융 데이터 프라이버시 AI 금고\u0026quot;입니다. 대형 로펌 사건 기록 가속기: 변호사들은 산더미 같은 사건 기록에 파묻혀 삽니다. AnythingLLM의 Workspace 기능을 활용해 \u0026lsquo;각 사건마다\u0026rsquo; 독립적인 지식 공간을 만들어, 고객 간의 사건 데이터가 물리적으로 완벽히 격리됨을 보장하십시오. 그리고 매월 값비싼 시스템 유지보수 및 모델 업그레이드 비용을 청구하십시오. 외부 권위 있는 참고 자료: # AnythingLLM 공식 GitHub Repository AnythingLLM 공식 문서 및 아키텍처 다이어그램 결론: AnythingLLM은 화려한 프론트엔드 껍데기와 엔터프라이즈급 권한 격리 기능을 통해, 뼈 빠지고 지루한 기저의 RAG 엔진을 완벽하게 포장해 냅니다. 이것을 마스터하면, 당신은 차갑고 기괴한 대형 모델과 벡터 DB를, B2B 기업 대표의 책상 위에 올려놓고 기꺼이 거액의 수표를 쓰게 만드는 궁극의 디지털 자산으로 둔갑시킬 수 있습니다.\n","date":"May 15, 2026","permalink":"https://dibi8.com/kr/resources/llm-frameworks/anythingllm-architecture-local-rag/","section":"AI 源码资源","summary":"","title":"기업들은 왜 ChatGPT를 두려워하는가?"},{"content":"{\u0026lt;/* resource-info */\u0026gt;}\n오늘날의 상호 연결된 글로벌 경제에서 기업은 전 세계 고객으로부터 결제를 받는 도전에 직면합니다. 전통적인 결제 방법은 종종 판매자를 특정 통화나 지역으로 제한하지만, NowPayments는 모든 통화로 결제 수락을 가능하게 함으로써 이를 혁신합니다. 고객이 미국 달러, 유로 또는 엔화와 같은 법정 화폐를 사용하든, 비트코인, 이더리움 또는 스테이블코인과 같은 암호화폐를 사용하든, NowPayments는 원활한 거래를 보장합니다.\nNowPayments란 무엇인가? #NowPayments는 전통 금융과 디지털 자산 사이의 격차를 메우는 선도적인 암호화폐 결제 게이트웨이입니다. 암호화폐 결제를 모든 사람에게 접근하기 쉽게 만드는 비전을 가지고 설립된 NowPayments는 판매자에게 간단하고 안전하며 효율적인 글로벌 결제 방법을 제공합니다.\n주요 기능은 다음과 같습니다:\n범용 통화 지원: 100개 이상의 암호화폐와 주요 법정 화폐로 결제 처리 즉시 정산: 중개자 없이 지갑으로 직접 자금 수령 낮은 거래 수수료: 거래당 0.5%부터 시작하는 경쟁력 있는 요금 고급 보안: PCI DSS 준수, 다중 서명 지갑 및 암호화 쉬운 통합: WooCommerce, Shopify 등 인기 전자상거래 플랫폼용 API 및 플러그인 글로벌 결제를 위해 NowPayments를 선택하는 이유? #1. 통화 장벽 허물기 #전통적인 결제 프로세서는 종종 판매자를 현지 통화나 소수의 주요 통화로 제한합니다. NowPayments는 이러한 장벽을 제거하여 통화 변환 번거로움 없이 전 세계 어디에서나 결제를 받을 수 있게 합니다.\n2. 암호화폐 채택 수용 #디지털 통화가 주류 인정을 얻음에 따라 NowPayments는 귀사의 비즈니스를 이 트렌드의 최전선에 위치시킵니다. 전통 결제와 함께 비트코인, 이더리움, USDT 및 기타 인기 암호화폐를 수락하세요.\n3. 거래 비용 절감 #수수료가 0.5%로 낮은 NowPayments는 2-3% 이상을 청구하는 전통 결제 프로세서에 비해 상당한 절감을 제공합니다. 또한 즉시 정산은 자금에 대한 더 빠른 접근을 의미합니다.\n4. 고객 경험 향상 #고객은 선호하는 결제 방법을 선택할 수 있는 유연성을 높이 평가합니다. 신용카드, 은행 송금 또는 암호화폐를 선호하든, NowPayments는 다양한 선호도를 충족합니다.\n5. 비즈니스 미래 보장 #세계가 디지털 금융으로 이동함에 따라 NowPayments 통합은 귀사의 비즈니스가 경쟁력을 유지하고 새로운 결제 트렌드에 대비할 수 있도록 보장합니다.\nNowPayments 시작하기 #시작하는 것은 간단합니다:\n가입: NowPayments에서 무료 계정 생성 플랜 선택: Starter, Business 또는 Enterprise 플랜 중 선택 통합: WooCommerce, Shopify 등용 API 또는 플러그인 사용 결제 수락 시작: 즉시 결제 수령 시작 실제 적용 사례 #NowPayments는 다음과 같은 결제를 지원합니다:\n전자상거래 상점: 글로벌 주문을 받는 온라인 소매업체 프리랜서: 국제 고객으로부터 결제를 받는 전문가 게임 회사: 게임 내 구매 및 구독 비영리 단체: 전 세계 지지자로부터 기부 소프트웨어 회사: SaaS 구독 및 라이선스 수수료 보안 및 준수 #NowPayments는 다음과 같은 보안을 우선시합니다:\n종단 간 암호화 자금 냉장 보관 정기 보안 감사 국제 규정 준수 결제의 미래는 여기 있습니다 #암호화폐 채택이 증가함에 따라 NowPayments와 같은 결제 게이트웨이는 디지털 시대에 번영하고자 하는 기업에 필수적입니다. 오늘 뒤처지지 마세요 – 결제의 미래를 수용하세요.\n모든 통화로 결제를 수락할 준비가 되셨나요? 지금 NowPayments 계정을 생성하고 글로벌 결제를 즉시 받기 시작하세요.\n계정 생성\n원활하고 국경 없는 결제의 혜택을 이미 누리고 있는 수천 명의 판매자와 함께하세요.\n","date":"May 15, 2026","permalink":"https://dibi8.com/kr/resources/data-science/accept-payments-all-currencies/","section":"AI 源码资源","summary":"","title":"모든 통화로 결제 수락 - NowPayments"},{"content":"{\u0026lt;/* resource-info */\u0026gt;}\n무료 LLM API 리소스란? #무료 LLM API 리소스는 무료 대형 언어 모델 추론 API의 선별된 컬렉션입니다 — 개발자가 API 비용을 지불하지 않고 AI 기반 애플리케이션을 구축할 수 있게 해줍니다. 커뮤니티가 유지 관리하며, 어떤 제공업체가 무료 티어를 제공하는지, 어떤 모델을 사용할 수 있는지, 어떻게 접근하는지 추적합니다.\nGitHub: https://github.com/cheahjs/free-llm-api-resources Stars: 20,310+ 언어: Python 라이선스: CC0-1.0 (퍼블릭 도메인)\n문제: AI API 비용 #현재 가격 (2026) # 제공업체 모델 입력 비용 출력 비용 OpenAI GPT-4o $5/백만 토큰 $15/백만 토큰 Anthropic Claude 3.5 $3/백만 토큰 $15/백만 토큰 Google Gemini Pro $3.50/백만 토큰 $10.50/백만 토큰 Mistral Large $4/백만 토큰 $12/백만 토큰 문제: AI 앱을 구축하면 월 $50-500의 API 비용이 듭니다.\n해결책: 무료 티어 # 제공업체 무료 티어 속도 제한 모델 Groq 100% 무료 20 요청/분 Llama 3, Mixtral Together AI $5 크레딧 60 요청/분 다양한 오픈소스 Fireworks AI 체험 다양함 여러 개 Ollama 로컬 무제한 자체 호스팅 LM Studio 로컬 무제한 자체 호스팅 주요 무료 제공업체 #1. Groq — 가장 빠른 추론 #웹사이트: https://groq.com 무료 티어: 완전 무료 (속도 제한 있음) 속도: 800+ 토큰/초 모델:\nLlama 3 70B Llama 3 8B Mixtral 8x7B Gemma 7B import requests # Groq API (무료 티어) response = requests.post( \u0026#34;https://api.groq.com/openai/v1/chat/completions\u0026#34;, headers={\u0026#34;Authorization\u0026#34;: \u0026#34;Bearer YOUR_FREE_API_KEY\u0026#34;}, json={ \u0026#34;model\u0026#34;: \u0026#34;llama3-70b-8192\u0026#34;, \u0026#34;messages\u0026#34;: [{\u0026#34;role\u0026#34;: \u0026#34;user\u0026#34;, \u0026#34;content\u0026#34;: \u0026#34;안녕하세요!\u0026#34;}] } ) print(response.json()[\u0026#34;choices\u0026#34;][0][\u0026#34;message\u0026#34;][\u0026#34;content\u0026#34;]) 2. Together AI — $5 무료 크레딧 #웹사이트: https://www.together.ai 무료 티어: 신규 계정 $5 크레딧 모델: 100+ 오픈소스 모델 기능: 파인튜닝, 임베딩\nimport openai client = openai.OpenAI( api_key=\u0026#34;YOUR_TOGETHER_API_KEY\u0026#34;, base_url=\u0026#34;https://api.together.xyz/v1\u0026#34; ) response = client.chat.completions.create( model=\u0026#34;meta-llama/Llama-3-70b-chat-hf\u0026#34;, messages=[{\u0026#34;role\u0026#34;: \u0026#34;user\u0026#34;, \u0026#34;content\u0026#34;: \u0026#34;양자 컴퓨팅을 설명해줘\u0026#34;}] ) print(response.choices[0].message.content) 3. Ollama — 로컬 실행 #웹사이트: https://ollama.com 비용: 완전 무료 (사용자 하드웨어에서 실행) 개인정보 보호: 100% 프라이빗 모델: Ollama 라이브러리에서 가져오기\n# Ollama 설치 curl -fsSL https://ollama.com/install.sh | sh # 모델 가져오기 ollama pull llama3 # API 서버 실행 ollama serve # API 사용 curl http://localhost:11434/api/generate -d \u0026#39;{ \u0026#34;model\u0026#34;: \u0026#34;llama3\u0026#34;, \u0026#34;prompt\u0026#34;: \u0026#34;하늘이 왜 파란색이야?\u0026#34; }\u0026#39; 4. LM Studio — GUI + API #웹사이트: https://lmstudio.ai 비용: 무료 (로컬 추론) 기능: GUI 모델 브라우저, API 서버 최적의 용도: 모델 테스트, 개발\n# LM Studio 로컬 API import openai client = openai.OpenAI( base_url=\u0026#34;http://localhost:1234/v1\u0026#34;, api_key=\u0026#34;not-needed\u0026#34; ) response = client.chat.completions.create( model=\u0026#34;local-model\u0026#34;, messages=[{\u0026#34;role\u0026#34;: \u0026#34;user\u0026#34;, \u0026#34;content\u0026#34;: \u0026#34;안녕하세요!\u0026#34;}] ) 5. Fireworks AI — 빠른 오픈소스 모델 #웹사이트: https://fireworks.ai 무료 티어: 체험 크레딧 속도: 최적화된 추론 모델: Llama, Mixtral, CodeLlama\n비교표 # 제공업체 비용 속도 개인정보 보호 사용 편의성 최적의 용도 Groq 무료 ⚡⚡⚡ ❌ ⭐⭐⭐ 프로덕션 앱 Together $5 크레딧 ⚡⚡ ❌ ⭐⭐⭐ 실험 Ollama 무료 ⚡ ✅ ⭐⭐ 개인정보 보호 중심 LM Studio 무료 ⚡ ✅ ⭐⭐⭐ 개발 Fireworks 체험 ⚡⚡ ❌ ⭐⭐ 빠른 추론 사용 사례 #1. 개발 및 테스트 # AI 기능 프로토타입 프롬프트 테스트 MVP 구축 LLM 통합 학습 2. 개인 프로젝트 # 개인용 챗봇 콘텐츠 생성 도구 코드 어시스턴트 연구 어시스턴트 3. 교육 # AI 개발 학습 학생 프로젝트 오픈소스 기여 연구 실험 4. 프로덕션 (주의 필요) # 저트래픽 애플리케이션 대체 제공업체 비용 민감 프로젝트 커뮤니티 도구 선택 방법 #의사결정 트리 #API 접근 필요? ├── 예 → 고속 필요? │ ├── 예 → Groq (가장 빠름) │ └── 아니오 → Together AI (가장 많은 모델) ├── 아니오 → 개인정보 보호 필요? │ ├── 예 → Ollama/LM Studio (로컬) │ └── 아니오 → 유료 옵션 고려 속도 제한은 중요합니다 # 제공업체 요청/분 토큰/분 참고 Groq 20 6,000 개발에 충분 Together 60 12,000 테스트에 적합 Ollama 무제한 하드웨어 한계 하드웨어 = 한계 커뮤니티 및 업데이트 #기여 방법 #이 저장소는 커뮤니티가 유지 관리합니다:\nStar 저장소 지원 PR 제출 새로운 제공업체 추가 신고 깨진 링크 공유 사용자 경험 업데이트 유지 # Watch GitHub 저장소 월간 확인 새로운 제공업체 참여 팁을 위한 토론 팔로우 GitHub의 @cheahjs 관련 기사 # Free Claude Code: 오픈소스 AI 코딩 — 더 많은 무료 AI 도구 TabPFN: 표 형식 데이터 기반 모델 — 데이터 과학 AI OpenClaw 42개 사용 사례 — AI 에이전트 응용 면책 조항: 무료 티어에는 속도 제한이 있으며 변경될 수 있습니다. 항상 제공업체의 현재 약관을 확인하세요. 이는 커뮤니티 리소스이며 어떤 API 제공업체와도 제휴하지 않습니다.\n","date":"May 15, 2026","permalink":"https://dibi8.com/kr/resources/llm-frameworks/free-llm-api-resources-ai-development/","section":"AI 源码资源","summary":"","title":"무료 LLM API 리소스: 비용 부담 없이 AI 모델 접근"},{"content":"{\u0026lt;/* resource-info */\u0026gt;}\n미드저니 완벽 대체 (2026): 전문가들이 ComfyUI로 갈아타는 진짜 이유 #Midjourney가 예쁜 그림을 뽑아내는 건 사실이지만, 전문가들에게는 치명적인 결함이 있습니다. 바로 통제 불가능한 \u0026lsquo;블랙박스\u0026rsquo;를 대여하는 셈이라는 점입니다. 렌더링 파이프라인에 대한 제어권도 없고, 에셋 프라이버시도 보장되지 않으며, 매달 영원히 구독료를 납부해야 합니다. 2026년, 진정으로 AI 이미지 생성을 마스터하고 싶다면 산업 표준 오픈소스인 ComfyUI가 유일한 해답입니다.\n이 심층 분석에서는 ComfyUI의 노드 기반 아키텍처가 왜 클라우드 기반 생성기들을 압살하고 있는지 파헤칩니다.\n현실 직시: ComfyUI vs Midjourney v6 #더 이상 Discord 봇에게 매달 월세를 내지 마십시오. 로컬 노드 기반 워크플로우로 전환하면 어떤 자유를 얻을 수 있는지 확인하세요:\n핵심 기능 / 플랫폼 ComfyUI (로컬 노드 인터페이스) Midjourney (클라우드 API) 요금제 $0 (영구 완전 무료) 월 $10 - $120 지속 과금 워크플로우 제어 절대적 통제 (노드 그래프 라우팅) 전혀 없음 (오직 텍스트 프롬프트) 데이터 프라이버시 100% 오프라인 / 로컬 구동 퍼블릭 클라우드 서버에 저장됨 콘텐츠 검열 없음 (무제한 모델 사용 가능) 극도로 엄격한 검열 및 금지어 하드웨어 요구사항 최소 8GB VRAM GPU 필요 브라우저만 있으면 됨 왜 노드 기반 아키텍처가 승리하는가? #Midjourney는 \u0026lsquo;프롬프트 입력 -\u0026gt; 이미지 출력\u0026rsquo;이라는 단순한 패러다임에 갇혀 있습니다. 반면 ComfyUI는 Stable Diffusion의 백엔드를 완전히 개방합니다. 특정 체크포인트의 잠재 공간(Latent space) 데이터를 커스텀 ControlNet으로 라우팅하고, IP-Adapter를 통과시켜 스타일을 전이한 뒤, 특수 업스케일러로 해상도를 높이는 모든 과정을 하나의 실행 그래프 안에서 조작할 수 있습니다. 이것은 AI 아트의 시각적 프로그래밍 언어입니다.\nFAQ #Q: 가장 좋은 무료 Midjourney 대체재는 무엇인가요? (Best free Midjourney alternative?) A: 단연코 ComfyUI입니다. WebUI(Automatic1111) 같은 툴도 있지만, 전문적이고 재현 가능한 AI 아트를 구독료 없이 구현하려면 노드 기반의 ComfyUI가 압도적으로 유리합니다.\nQ: ComfyUI를 돌리려면 VRAM이 얼마나 필요한가요? (How much VRAM do I need for ComfyUI?) A: ComfyUI의 최적화는 경이로운 수준입니다. 4GB VRAM에서도 기본적인 워크플로우가 돌아가지만, 2026년의 최신 SDXL이나 Flux 모델을 원활하게 돌리려면 12GB~16GB VRAM을 갖춘 Nvidia GPU를 강력히 권장합니다.\nQ: Mac에서도 ComfyUI를 쓸 수 있나요? A: 네! Apple Silicon(M1/M2/M3)은 PyTorch MPS 백엔드를 통해 네이티브로 지원됩니다. 통합 메모리가 큰 MacBook Pro라면 아주 훌륭한 성능을 발휘합니다.\n","date":"May 15, 2026","permalink":"https://dibi8.com/kr/resources/ai-tools/comfyui-vs-midjourney/","section":"AI 源码资源","summary":"","title":"미드저니 완벽 대체 (2026): 전문가들이 ComfyUI로 갈아타는 진짜 이유"},{"content":"{\u0026lt;/* resource-info */\u0026gt;}\n왜 Dify가 엔터프라이즈 AI 오케스트레이션의 종착역인가? #LLM(대형 언어 모델)의 후반전에서는 단순한 API 호출만으로는 비즈니스 요구사항을 충족할 수 없습니다. 복잡한 RAG(검색 증강 생성), 에이전트 메모리 관리 및 서드파티 툴 스케줄링이 필수적입니다. 현재 GitHub에서 40k+ Star를 돌파하며 질주 중인 오픈소스 프로젝트 Dify는 사실상 AI 오케스트레이션 프레임워크 소스 코드의 표준이 되고 있습니다. 이것은 단순한 개발자들의 장난감이 아닙니다. 기업용 AI 에이전트 구축과 비즈니스 자동화를 위한 궁극의 무기입니다. 기존의 프롬프트 엔지니어링(Prompt Engineering)은 시스템적 보장이 부족해 프로덕션 환경에서 자주 박살(Crash)나지만, Dify는 이를 탄탄한 로우코드 파이프라인으로 대체합니다.\n[여기에 권장 삽입: 프로젝트 아키텍처 다이어그램 / 실행 스크린샷] 그림: Dify 핵심 아키텍처 다이어그램. 하위 Vector DB 라우팅에서 상위 에이전트 실행 파이프라인까지 데이터 흐름을 명확하게 보여줍니다.\n경쟁사 압살: Dify vs Flowise vs Coze 핵심 비교 표 #노코드 AI 툴 수익화의 길을 선택할 때, 기술 스택의 결정이 곧 이익률을 좌우합니다. 현재 주류 플랫폼들을 깊이 비교하여, 왜 Dify가 B2B 프라이빗 납품의 최우선 선택인지 살펴보겠습니다.\n평가 항목 Dify Flowise Coze 기반 아키텍처 Python/Go 혼합, 초고동시성을 위해 재작성되어 매우 견고함. Node.js 위주, 빠른 프로토타이핑에 적합하나 동시성에 취약. 클로즈드 소스 블랙박스, 특정 기업 생태계에 고도로 종속. RAG 엔진 깊이 다중 리콜(Multi-way recall), 리랭크(Rerank), 문서 Q\u0026amp;A 스마트 분할 지원. 기초적인 LangChain 래핑 수준, 깊이 있는 튜닝 불가. 블랙박스 라우팅, 파라미터 튜닝 불가, 유연성 최악. 비즈니스 완결성 화이트 라벨링(White-label) 지원, Dify 로컬 배포 튜토리얼과 완벽한 시너지. 개인 개발자에게 적합, 엔터프라이즈급 RBAC 권한 제어 부족. 프라이빗 배포 불가, B2B 기업 데이터 보안에 치명적 결함. 학습 곡선 중간 수준, 워크플로우 노드와 데이터 페이로드의 이해 필요. 완만함, 순수 드래그 앤 드롭 연결로 초보자에게 친화적. 극도로 단순, 자연어로 봇 생성 가능. \u0026ldquo;당신의 데이터 자산을 볼모로 잡는 클로즈드 소스 플랫폼에 목숨을 맡기지 마십시오. Dify의 화이트 라벨링 능력과 완전한 오픈소스 속성은 개발자가 프리랜서로 뛰거나 B2B 납품을 할 때 절대적인 해자(Moat)가 됩니다.\u0026rdquo;\n소스 코드 딥다이브: RAG 파이프라인과 동시성 스케줄링 엔진 해부 #Dify가 프로덕션 환경에서 극강의 안정성을 유지할 수 있는 이유는 하드코어한 엔지니어링 설계 덕분입니다. 여기서는 AI 오케스트레이션 프레임워크 소스 코드를 깊이 파고들어 RAG와 스케줄링의 핵심 로직을 해부해 보겠습니다.\n1. 검색 엔진: 다중 리콜 및 하이브리드 리랭킹 메커니즘 #Dify는 RAG를 처리할 때 단순히 텍스트를 벡터 데이터베이스에 던져 넣지 않습니다. 대신 정밀한 하이브리드 검색 전략을 구현합니다. 단순한 벡터 검색(Dense Search)은 업계 전문 용어의 정확한 일치를 놓치기 쉽기 때문에, Dify는 전통적인 BM25 알고리즘을 보완재로 도입했습니다.\n# 핵심 소스코드 추출: dify/api/core/rag/retrieval/retrival_service.py class RetrievalService: @classmethod def retrieve(cls, retrival_method: str, query: str, dataset_id: str, top_k: int = 4): \u0026#34;\u0026#34;\u0026#34; 핵심 리콜 진입점: 단일 벡터 검색 또는 하이브리드 전략 지원. 이 모듈은 기업용 AI 에이전트 구축 시 정확도를 결정짓는 영혼과도 같습니다. \u0026#34;\u0026#34;\u0026#34; # 1. 시맨틱 벡터 검색 (Dense Retrieval) # 쿼리와 문서 간의 깊은 의미론적 유사성을 포착합니다. vector_results = VectorService.search(dataset_id, query, top_k) # 2. 키워드 검색 (Sparse Retrieval - BM25 기반) # 긱(Geek)한 어휘나 정확한 모델 번호가 벡터 공간에 묻히지 않도록 보장합니다. keyword_results = KeywordIndexService.search(dataset_id, query, top_k) if retrival_method == \u0026#39;hybrid\u0026#39;: # 3. 하이브리드 리랭킹 (Reranking 파이프라인) # Rerank 모델(예: Cohere, BGE)을 도입하여 1차 리콜 결과에 교차 점수를 매깁니다. merged_results = cls._merge_and_deduplicate(vector_results, keyword_results) # RerankRunner는 CPU 소모가 큰 노드이므로, 내부적으로 비동기 및 배치 최적화를 수행합니다. reranked_nodes = RerankRunner.run(query, merged_results, top_k) return reranked_nodes # 다운그레이드 처리: 벡터 검색 결과만 직접 반환 return vector_results 심층 분석: 위 코드는 Dify RAG의 핵심 장벽을 보여줍니다. 일반적인 오픈소스 프레임워크가 단순 벡터 검색만 수행하는 반면, Dify는 기본적으로 hybrid 검색을 지원합니다. 고차원 시맨틱 공간(Dense)과 단어 빈도 분포(Sparse/BM25) 결과를 병합하고 Rerank 모델로 넘기는 이 아키텍처는, 전문 용어로 가득 찬 B2B 고객의 매뉴얼에 대한 QA 정확도를 획기적으로 높여주는 은탄환(Silver Bullet)입니다.\n2. 에이전트 스케줄링: 동시성 제어 및 상태 머신 흐름 설계 #복잡한 비즈니스 자동화 시나리오에서 에이전트는 DB 조회, 이메일 발송, 서드파티 API 요청을 동시에 수행해야 합니다. 여기서 동시성 제어의 취약성이 드러납니다.\n# 핵심 소스코드 추출: dify/api/core/agent/orchestrator.py import asyncio from typing import List, Callable class AgentOrchestrator: def __init__(self, tools: List[BaseTool], memory: MemoryStrategy): self.tools = tools self.memory = memory # 에이전트가 무한 루프 환각에 빠지는 것을 막기 위해 상태 머신 도입 self._state_machine = StateMachine(initial_state=\u0026#39;THINKING\u0026#39;) async def execute_tools_concurrently(self, tool_calls: List[ToolCallInfo]): \u0026#34;\u0026#34;\u0026#34; asyncio.gather를 활용한 툴 동시 호출로 LLM의 생각의 사슬(CoT) 지연 시간(RT)을 대폭 단축. \u0026#34;\u0026#34;\u0026#34; tasks = [] for call in tool_calls: tool_instance = self._get_tool_by_name(call.name) # [실전 삽질 방지 코드]: 방어 메커니즘 주입 # 각 외부 툴에 대해 타임아웃 제어 및 서킷 브레이커를 추가하여 눈사태(Avalanche) 효과 방지 task = asyncio.wait_for( tool_instance.async_run(**call.arguments), timeout=15.0 # 15초 하드 타임아웃 강제 설정 ) tasks.append(task) # return_exceptions=True를 통해 예외를 포착하며 모든 툴 호출을 동시 실행 # 하나의 툴 API가 뻗어버려도 전체 파이프라인이 멈추는 것을 방지 results = await asyncio.gather(*tasks, return_exceptions=True) return self._format_results(results) 심층 분석: 이 코루틴 동시성 코드는 산업용 시스템의 품격을 보여줍니다. asyncio.gather와 엄격한 timeout 메커니즘의 결합은 시스템의 복원력을 극대화합니다. 주니어 개발자들이 흔히 짜는 스크립트는 서드파티 API가 멈추면 에이전트 전체 프로세스가 좀비가 되어버립니다. 그러나 Dify는 엔진 계층에서 엄격한 서킷 브레이커와 예외 격리를 수행하며, 기업 고객들이 기꺼이 돈을 지불하는 엔지니어링 품질이 바로 여기에 있습니다.\n엔지니어링 실전: 프로덕션 환경 배포의 고가용성 가이드 및 치명적 함정(Pitfalls) #인터넷에 떠도는 Dify 로컬 배포 튜토리얼을 따라 할 때, 많은 인프라 담당자들이 숨겨진 함정에 빠져 엄청난 \u0026lsquo;삽질\u0026rsquo;을 경험합니다. 다음은 실제 프로덕션 환경에서 요약한 \u0026ldquo;치명적 함정\u0026quot;입니다.\n함정 1: Celery Worker 메모리 누수 (Memory Leak)\n증상: 시스템 구동 72시간 후, 비동기 작업 큐(예: 지식 베이스 대량 임포트) 처리가 급격히 느려지고, 서버 메모리가 터지면서 OOM(Out Of Memory) 킬이 발생합니다. 해결책: 공식 제공되는 docker-compose.yaml에서 Celery 노드에 반드시 max-tasks-per-child 파라미터를 추가해야 합니다. 이는 워커 프로세스가 일정 수의 작업을 처리한 후 자동 재시작되도록 강제하여 메모리를 완전히 해제시킵니다. # docker-compose.yaml 수정 스니펫 services: celery: image: langgenius/dify-api:latest # 핵심 수정: 메모리 누수 방지를 위한 --max-tasks-per-child 추가 command: celery -A app.celery worker -P gevent -c 1 --max-tasks-per-child 200 environment: - CELERY_BROKER_URL=redis://redis:6379/1 함정 2: PostgreSQL 커넥션 고갈 (Connection Exhaustion)\n증상: 트래픽 피크 시 API 호출 중 FATAL: sorry, too many clients already 에러가 로그에 도배됩니다. 해결책: Dify의 Python 백엔드가 PG DB에 직접 연결(Direct Connect)되게 내버려두면 안 됩니다! 마이크로서비스 아키텍처에서는 경량 커넥션 풀 미들웨어인 PgBouncer를 반드시 도입해야 합니다. 트랜잭션 풀링 모드를 사용하면 100개의 물리적 커넥션으로 10,000개의 논리적 커넥션을 처리할 수 있습니다. 비즈니스 루프: 노코드 AI 툴 수익화의 궁극적 논리 #기술이 상업적 가치로 치환되지 않는다면 그것은 그저 장난감에 불과합니다. Dify의 오픈소스 특성과 강력한 기능 스택을 활용하면, 다음과 같은 고수익 노코드 AI 툴 수익화 비즈니스 모델을 빠르게 돌릴 수 있습니다.\n정부/대기업 프라이빗 지식 베이스 구축 납품: 정부 기관, 대형 로펌, 병원 등은 데이터가 외부 망으로 나가면 안 된다는 엄격한 레드라인이 있습니다. Dify와 로컬 구동 Ollama(Llama3 또는 Qwen 구동)를 결합하여 완벽한 오프라인 프라이빗 AI 엔진을 납품할 수 있습니다. 단일 시스템 구축 및 아키텍처 컨설팅 비용으로 수천만 원에서 수억 원의 매출을 올릴 수 있는 확실한 B2B 먹거리입니다. 이커머스 자동화 고객 센터 SaaS 호스팅: Shopify 나 자사몰 백엔드에 Dify를 연동하고, 판매자의 수십만 자에 달하는 제품 매뉴얼(PDF/Word)을 결합해 고급 하이브리드 RAG 파이프라인을 구성합니다. 소프트웨어를 파는 것이 아니라 매월 수십만 원의 SaaS 구독료(MRR)를 받으며 진정한 패시브 인컴을 실현합니다. 외부 권위 있는 참고 자료: # Dify 공식 GitHub Repository (LangGenius/dify) Dify 공식 로컬 프라이빗 배포 문서 결론: Dify는 프롬프트만 대충 욱여넣는 놀이터가 결코 아닙니다. 중무장한 거대한 화약고입니다. 복잡한 RAG 인프라, LLM 추상화 및 동시성 제어를 매우 우아한 인터페이스로 캡슐화했습니다. Dify를 마스터한다는 것은 가장 진보된 AI 엔지니어링 패러다임을 배우는 것일 뿐만 아니라, B2B 블루오션을 가르며 수익을 창출할 수 있는 날카로운 칼자루를 쥐는 것입니다.\n","date":"May 15, 2026","permalink":"https://dibi8.com/kr/resources/llm-frameworks/dify-architecture-b2b-agent-orchestration/","section":"AI 源码资源","summary":"","title":"왜 Dify가 엔터프라이즈 AI 오케스트레이션의 종착역인가?"},{"content":"{\u0026lt;/* resource-info */\u0026gt;}\n왜 WebUI는 결국 ComfyUI에 도태될 수밖에 없는가? #AI 이미지 생성이 Stable Diffusion XL(SDXL)과 SD3 시대로 접어들면서, 기존의 Gradio 기반 Automatic1111(SD WebUI)은 심각한 피로감을 드러내고 있습니다. 모델 용량이 6GB를 넘어가면서, WebUI의 비효율적인 VRAM 상주 메커니즘은 툭하면 OOM(Out of Memory)을 발생시킵니다. 이 빈자리를 파고들며 GitHub에서 35k+ Star를 돌파한 ComfyUI는 AI 이미지 생성의 종착역을 상징합니다. 바로 극도로 하드코어한 노드 기반 그래프 실행 엔진입니다.\nComfyUI 워크플로우 완벽 마스터는 겉멋을 부리기 위함이 아닙니다. 진정한 산업용 파이프라인을 구축하기 위함입니다. 비즈니스 수익 창출 환경에서는 가챠(뽑기) 게임처럼 매번 수동으로 슬라이더를 조작하는 것이 아니라, 재사용 및 프로그래밍이 가능한 자동화 파이프라인이 필수적입니다.\n[여기에 권장 삽입: 프로젝트 아키텍처 다이어그램 / 실행 스크린샷] 그림: ComfyUI의 위상 정렬(Topological) 실행 그래프. Checkpoint 로드부터 VAE 디코딩, K-Sampler 처리까지의 완벽한 노드 라우팅 파이프라인을 보여줍니다.\n경쟁사 압살: ComfyUI vs SD WebUI vs Midjourney 핵심 비교 #AI 그림 자동화 수익 창출에 뛰어들기 전에, 기반 기술 스택의 세대 차이를 명확히 이해해야 합니다. 아래의 SD WebUI 성능 비교 표를 통해 왜 하이엔드 스튜디오들이 전부 ComfyUI로 갈아탔는지 알 수 있습니다.\n평가 항목 ComfyUI Automatic1111 (SD WebUI) Midjourney (v6) 기반 아키텍처 노드 기반 DAG (방향성 비순환 그래프), 극도로 가볍고 완벽한 메모리 스케줄링. UI에 종속된 선형 아키텍처, 플러그인 꼬임으로 인한 심각한 VRAM 누수. Discord 기반의 클로즈드 소스 클라우드, 완전한 블랙박스. 워크플로우 재사용성 최고 수준. 워크플로우를 JSON으로 직렬화하여 공유 및 API 호출 가능. 최악. 파라미터 스크린샷에 의존하며, 자동화 구축 불가능. 없음. 매번 프롬프트를 수동으로 입력하고 수정해야 함. VRAM 최적화 신(God)급. 저사양 그래픽카드로 Stable Diffusion 돌리기를 완벽하게 지원. 나쁨. Hires.fix (고해상도 업스케일) 중에 툭하면 뻗음. 해당 없음 (클라우드 컴퓨팅이나 비싼 월 구독료 필요). 개발자 친화도 최상. 어떠한 Python 스크립트라도 커스텀 노드로 손쉽게 래핑 가능. 고통스러움. Gradio 프레임워크와 비대한 내부 라우팅을 뜯어고쳐야 함. 폐쇄적 생태계. 공식 API 없음 (비싸고 불안정한 비공식 리버스 엔지니어링 툴만 존재). \u0026ldquo;당신의 생산성을 남의 폐쇄적인 클라우드 서버에 종속시키지 마십시오. ComfyUI의 DAG 아키텍처는 VRAM의 통제권을 온전히 개발자에게 돌려줍니다. 이것이 AI 자동화 지폐 인쇄기를 만들기 위한 전제 조건입니다.\u0026rdquo;\n소스 코드 딥다이브: DAG 엔진과 VRAM 최적화 메커니즘 해부 #어떻게 ComfyUI는 고작 8GB VRAM으로 플래그십 모델을 돌릴 수 있을까요? 그 비밀은 기저에 깔린 그래프 실행 로직과 극단적인 가비지 컬렉션 메커니즘에 있습니다. 핵심 실행 스케줄러를 파헤쳐 봅시다.\n1. 실행 엔진: 위상 정렬 및 VRAM 가비지 컬렉션 #ComfyUI의 본질은 화려한 UI가 아니라, Python 기반의 그래프 연산 스케줄러입니다. 복잡한 워크플로우를 실행할 때, 위상 정렬을 통해 실행 순서를 결정합니다.\n# 핵심 소스코드 추출: execution.py class PromptExecutor: def execute(self, prompt, prompt_id, extra_data={}): \u0026#34;\u0026#34;\u0026#34; 핵심 스케줄링 루프: JSON 워크플로우를 파싱하고 위상 정렬을 수행합니다. \u0026#34;\u0026#34;\u0026#34; nodes = prompt.keys() # 1. 위상 정렬(Topological Sort)을 통해 종속성 노드가 먼저 실행되도록 보장 execution_sequence = self.get_topological_sort(prompt) for node_id in execution_sequence: node_info = prompt[node_id] class_type = node_info[\u0026#39;class_type\u0026#39;] # [핵심 최적화 포인트]: 극도로 공격적인 VRAM 스케줄링 # 다음 노드를 실행하기 전에, 사용하지 않는 Tensor를 VRAM에서 RAM으로 강제 오프로딩 comfy.model_management.free_memory( comfy.model_management.get_total_memory(), self.device ) # 2. 노드 실행 인스턴스화 obj_class = nodes.NODE_CLASS_MAPPINGS[class_type] # ... 후속 연산 로직 호출 심층 분석: 이 코드가 바로 저사양 그래픽카드로 Stable Diffusion 돌리기를 가능케 하는 영혼입니다. WebUI가 모델 전체를 VRAM에 상주시키는 반면, ComfyUI의 free_memory 함수는 현재 노드에서 불필요한 Tensor를 실시간으로 추적하고 CUDA 연산 직전에 시스템 메모리(RAM)로 내쫓습니다. \u0026ldquo;공간을 내어주고 공간을 얻는\u0026rdquo; 이 타임랙 전략 덕분에 8GB, 심지어 6GB 그래픽카드로도 SDXL을 굴릴 수 있는 것입니다.\n2. 확장성: 커스텀 노드를 위한 Python 패러다임 #ComfyUI 커스텀 노드 개발 소스를 마스터하는 것은 기술적 해자(Moat)를 구축하는 핵심입니다. 다음은 자동화 파이프라인을 위해 설계된 \u0026ldquo;일괄 워터마크 주입\u0026rdquo; 노드의 뼈대입니다.\n# ComfyUI 커스텀 노드 예제: 엔터프라이즈급 이미지 워터마크 주입 import torch import numpy as np class CorporateWatermarkNode: @classmethod def INPUT_TYPES(s): \u0026#34;\u0026#34;\u0026#34; 프론트엔드 그래프 노드의 연결(Wiring) 인터페이스를 정의합니다. \u0026#34;\u0026#34;\u0026#34; return { \u0026#34;required\u0026#34;: { # 이전 노드로부터 이미지 Tensor를 받음 \u0026#34;image\u0026#34;: (\u0026#34;IMAGE\u0026#34;,), # 문자열 입력 받음 \u0026#34;text\u0026#34;: (\u0026#34;STRING\u0026#34;, {\u0026#34;multiline\u0026#34;: False, \u0026#34;default\u0026#34;: \u0026#34;Copyright 2026\u0026#34;}), }, } # 출력 타입 정의 RETURN_TYPES = (\u0026#34;IMAGE\u0026#34;,) FUNCTION = \u0026#34;apply_watermark\u0026#34; # 우클릭 메뉴의 계층 구조 정의 CATEGORY = \u0026#34;image/commercial_postprocessing\u0026#34; def apply_watermark(self, image, text): \u0026#34;\u0026#34;\u0026#34; 핵심 연산 계층: OOM 방지를 위해 PyTorch의 in-place 연산을 최소화합니다. \u0026#34;\u0026#34;\u0026#34; # [함정 주의]: 원본 메모리 블록 오염을 막기 위해 반드시 Tensor를 clone 해야 함 watermarked_image = image.clone() # ... (OpenCV 또는 PIL을 활용한 Tensor 처리 로직) ... # ComfyUI의 DAG 라우팅 규칙을 준수하기 위해 반드시 Tuple 형태로 반환 return (watermarked_image,) # 프론트엔드 UI에 노드가 노출되도록 등록 NODE_CLASS_MAPPINGS = { \u0026#34;CorporateWatermarkNode\u0026#34;: CorporateWatermarkNode } 심층 분석: 이 미니멀한 Python 템플릿을 통해, 외부 API(자동 누끼 따기, 클라우드 얼굴 교체 등)나 딥러닝 알고리즘을 ComfyUI의 레고 블록으로 래핑할 수 있습니다. 이러한 극단적인 디커플링(Decoupling) 설계가 ComfyUI를 엔지니어들이 가장 사랑하는 자동화 프레임워크로 만들었습니다.\n엔지니어링 실전: 프로덕션 환경의 OOM 함정(Pitfalls)과 병렬 큐잉 가이드 #클라우드에서 ComfyUI를 API 백엔드로 배포할 때, 수많은 개발자들이 프로세스 붕괴의 쓴맛을 봅니다. 실전에서 가장 빈번하게 발생하는 \u0026ldquo;삽질\u0026rdquo; 방지 가이드입니다.\n함정 1: 동시 API 요청으로 인한 VRAM 폭발 (OOM Crash)\n증상: API 백엔드로 사용할 때, 3개의 그림 생성 요청이 동시에 들어오면 CUDA가 즉시 OutOfMemoryError를 뱉어내고 Python 프로세스 전체가 즉사합니다. 해결책: ComfyUI는 태생적으로 병렬(Concurrent) 생성을 지원하지 않습니다! 아키텍처 외부에 Redis + Celery (또는 RabbitMQ)를 반드시 도입하여 강제 동기식 큐잉(Queuing) 메커니즘을 구현해야 합니다. 모든 /prompt API 요청은 큐에 들어가야 하며, GPU는 오직 execution_sequence를 직렬(Sequential)로만 실행하도록 통제해야 합니다. 함정 2: 긴 파이프라인에서 VAE 디코딩 시 검은 화면 출력\n증상: Hires.fix를 켜고 4K 이미지를 생성할 때 샘플링 단계는 정상인데, 마지막 VAE Decode 단계에서 새까만 이미지가 튀어나옵니다. 해결책: VAE 디코딩은 VRAM을 미친 듯이 잡아먹는 단계입니다. 시작 스크립트에 --vae-in-vram 또는 --fp16-vae 파라미터를 추가하여 강제로 정밀도를 낮춰야 합니다. 커스텀 노드 중 Tiled VAE 노드를 추가하여 청크(Chunk) 단위로 디코딩하는 것이 산업 표준 베스트 프랙티스입니다. 비즈니스 루프: AI 그림 \u0026ldquo;지폐 인쇄기\u0026quot;를 돌리는 3가지 수익화 방법 #ComfyUI를 그저 미소녀 그림이나 뽑아내는 툴로 치부하지 마십시오. 이것은 막대한 AI 그림 자동화 수익 창출을 가능케 하는 슈퍼 인쇄기입니다.\nPOD (Print-on-Demand) 풀오토 매트릭스: Python 스크립트를 짜서 ComfyUI API를 때리고, ChatGPT와 결합하여 니치 마켓(사이버펑크 고양이, 레트로 오토바이 등)의 프롬프트를 대량 생성합니다. 매일 밤 1,000장의 저작권 프리 이미지를 자동으로 뽑아내어 Shopify나 Redbubble에 꽂아 넣습니다. 프리미엄 커머셜 워크플로우 판매: Patreon이나 지식 판매 플랫폼에서 고도로 튜닝된 JSON 파일을 팝니다. 완벽하게 세팅된 \u0026ldquo;손상된 옛날 사진 복원 워크플로우\u0026quot;나 \u0026ldquo;제품 컷 배경 원클릭 합성 워크플로우\u0026quot;는 디자인 에이전시를 상대로 수십에서 수백 달러에 불티나게 팔립니다. 게임 아트 리소스 자동화 외주: ControlNet과 ComfyUI의 배치(Batch) 노드를 활용해 인디 게임 스튜디오의 외주를 싹쓸이합니다. 아이콘, 배경, UI 요소를 절대적인 스타일 일관성을 유지하면서 대량으로 렌더링할 수 있습니다. 외부 권위 있는 참고 자료: # ComfyUI 공식 GitHub Repository ComfyUI 공식 개발 및 API 문서 결론: Midjourney가 똑딱이 카메라라면, ComfyUI는 렌즈를 갈아 끼우고 셔터 스피드를 조절하며 심지어 센서까지 마개조할 수 있는 헤비듀티 DSLR입니다. 소스 코드의 실행 로직을 마스터한다면, 이 AIGC 골드러시 속에서 가장 확실하게 돈을 버는 \u0026ldquo;곡괭이 판매자\u0026quot;가 될 수 있습니다.\n","date":"May 15, 2026","permalink":"https://dibi8.com/kr/resources/ai-tools/comfyui-architecture-node-based-ai-image/","section":"AI 源码资源","summary":"","title":"왜 WebUI는 결국 ComfyUI에 도태될 수밖에 없는가?"},{"content":"{\u0026lt;/* resource-info */\u0026gt;}\n왜 기존의 TTS는 영혼 없는 기계처럼 들릴까? #생성형 AI의 폭발적인 성장기 속에서 텍스트(LLM)와 이미지(Diffusion)는 이미 현실과 구분이 안 될 수준에 도달했지만, 오픈소스 텍스트-음성 변환(TTS)은 지독하게도 \u0026ldquo;Siri 시대\u0026quot;에 머물러 있었습니다. ChatTTS가 혜성처럼 등장하기 전까지는 말입니다. 대화형 시나리오에 극도로 특화된 이 오픈소스 모델은 단순히 글을 읽는 것을 넘어 웃음소리, 숨소리, 머뭇거림을 자동으로 삽입하며 무료 고품질 AI 음성 합성의 천장을 부숴버렸습니다.\n팟캐스트나 숏폼 비디오 시장을 씹어먹으려는 긱(Geek)들에게, ChatTTS를 마스터한다는 것은 단순히 소프트웨어 비용 몇십만 원을 아끼는 것이 아닙니다. 그것은 얼굴 없는 유튜브 수익창출을 위한 완벽한 지폐 인쇄기의 엔진을 손에 쥐는 것입니다.\n[여기에 권장 삽입: 프로젝트 아키텍처 다이어그램 / 실행 스크린샷] 그림: ChatTTS의 2단계(자기회귀 + 비자기회귀) 오디오 생성 네트워크 아키텍처. 텍스트 Token이 음향 피처(Acoustic features)를 거쳐 파형(Waveform)으로 변환되는 완벽한 차원 축소 과정을 보여줍니다.\n경쟁사 압살: ChatTTS vs Coqui TTS vs ElevenLabs #자동화된 수익 창출 파이프라인을 구축하려면, 완벽한 ElevenLabs 오픈소스 대체재를 찾는 것이 첫걸음입니다. ChatTTS가 기술과 상업성 사이에서 어떻게 완벽한 밸런스를 잡았는지 살펴보겠습니다.\n평가 항목 ChatTTS Coqui TTS (XTTS) ElevenLabs 기반 아키텍처 2단계 모델: GPT 스타일의 자기회귀 언어 모델 + DVAE 보코더 Transformer와 전통적인 음향 모델의 결합 클로즈드 소스 거물. 세계 최강의 성능이지만 자비 없는 가격. 사실감 및 운율 압도적. \u0026ldquo;음-\u0026rdquo;, \u0026ldquo;어-\u0026rdquo; 같은 추임새, 웃음, 숨소리를 동적으로 삽입. 준수함(음성 복제 지원). 하지만 긴 문장에서는 여전히 평이하고 기계적임. 완벽함. 그러나 글자 수 단위로 과금되는 무시무시한 월간 구독료 발생. 상업용 배포 인터넷이 차단된 오프라인 프라이빗 배포 완벽 지원. VRAM 요구량 극히 낮음 (4GB로도 구동 가능). 로컬 배포 가능. 단, 긴 텍스트 스트리밍 추론 시 지연(Latency)이 매우 심함. 순수 클라우드 API. 계정이 정지당하는 순간 당신의 모든 비즈니스는 즉사. 핵심 페인포인트 해결 Seed를 고정하여 ChatTTS 음색 제한 돌파 및 음색 일관성을 완벽히 유지. 커스텀 음색 훈련의 진입 장벽이 높음 (스튜디오급의 깔끔한 데이터 셋 필요). 너무 비쌈. 대규모 오디오북 생성 시 당신을 파산으로 몰고 갈 것. \u0026ldquo;글자 수대로 돈을 내야 하는 API 위에 당신의 핵심 비즈니스를 구축하는 것은 독이 든 성배를 마시는 것과 같습니다. ChatTTS는 무한한 동시성 생성의 자유를 부여하며, 이것이야말로 스케일업(Scale-up)을 통한 돈 복사의 근간입니다.\u0026rdquo;\n소스 코드 딥다이브: 자기회귀 추론 루프와 운율 Token 주입 #ChatTTS의 소름 돋는 사실감, 그 비밀을 벗겨봅시다. 이번 TTS 소스코드 심층 분석에서는 ChatTTS가 대형 언어 모델(LLM)이 텍스트를 계산하는 것과 정확히 동일한 로직으로 소리를 \u0026ldquo;계산\u0026quot;하는 방식을 해부합니다.\n1. 핵심 추론 엔진: 소리를 텍스트 Token처럼 예측하기 #전통적인 TTS는 수학 공식을 비틀어 음파를 끼워 맞추려 했습니다. 하지만 ChatTTS는 천재적으로 소리를 이산화(Discretize)하여, 마치 GPT가 다음 단어를 예측하듯 다음 소리 조각을 예측합니다.\n# 핵심 소스코드 추출: ChatTTS/core.py (메인 추론 루프) import torch class ChatTTS_Engine: def infer(self, text, params_refine_text, params_infer_code): \u0026#34;\u0026#34;\u0026#34; 2단계 추론: 텍스트에 먼저 \u0026#39;연기 지시\u0026#39;를 내리고, 그다음 오디오 코드를 생성합니다. \u0026#34;\u0026#34;\u0026#34; # 1단계: 텍스트 정제 (Text Refinement) # 건조한 텍스트에 웃음 [laugh] 과 멈춤 [uv_break] 프롬프트를 자동으로 주입합니다. # 이것이 ChatTTS가 사람처럼 들리게 만드는 핵심 해자(Moat)입니다. refined_text = self.chat.infer(text, skip_refine_text=False, **params_refine_text) # 2단계: 자기회귀 오디오 Token 생성 (Autoregressive Audio Token Generation) # GPT 아키텍처를 활용하여 음향 Token 시퀀스를 예측합니다. wav_tokens = self._autoregressive_inference(refined_text, **params_infer_code) # 3단계: 보코더 디코딩 (Vocoder Decode) # 극도로 압축된 Token들을 연속적인 24kHz 샘플링 레이트의 파형(Waveform) 배열로 복원합니다. audio_waveform = self.vocoder.decode(wav_tokens) return audio_waveform def _autoregressive_inference(self, text, top_p=0.7, top_k=20, temperature=0.3): \u0026#34;\u0026#34;\u0026#34; 자기회귀 추론: VRAM을 가장 많이 잡아먹는 단계입니다. temperature 값을 조절하면 감정의 억양과 변화무쌍함을 극적으로 바꿀 수 있습니다. \u0026#34;\u0026#34;\u0026#34; # [실전 삽질 방지 코드]: torch.no_grad()와 KV Cache 최적화로 메모리 폭발을 방지합니다. with torch.no_grad(): # ... 다음 음향 특징 Token을 예측하는 루프 ... pass 심층 분석: 이 숨 막히게 우아한 설계는 소리 생성의 끝판왕이 결국 \u0026lsquo;언어 모델\u0026rsquo;이라는 것을 증명합니다. 1단계의 Text Refinement는 마치 영화감독처럼 대본을 연출하고, 이어지는 _autoregressive_inference는 top_p와 temperature를 통해 통제된 혼돈(Controlled chaos)을 주입합니다. 바로 이 통제된 무작위성이 기존 기계음 TTS의 숨통을 끊어버리는 핵심 타격기입니다.\n2. 음색 고정과 스트리밍 동시성 (Streaming \u0026amp; Voice Consistency) #AI 고객센터 봇을 구축한다면 지연 시간(Latency)을 무조건 500ms 이하로 짓눌러야 합니다.\n# 음색 일관성 유지 및 스트리밍 출력 예제 def stream_audio(self, text_generator, voice_seed=42): \u0026#34;\u0026#34;\u0026#34; 방대한 텍스트를 파싱할 때 서버 OOM을 막기 위한 스트리밍(Streaming) 출력 \u0026#34;\u0026#34;\u0026#34; # 1만 자가 넘는 장편 소설에서도 앞뒤 음색이 튀지 않도록 시드를 강제 고정합니다. torch.manual_seed(voice_seed) for text_chunk in text_generator: # 텍스트를 청크 단위로 추론하고 프론트엔드로 yield 하여, ChatGPT 같은 타자기 방식의 오디오 경험을 제공합니다. chunk_wav = self.infer(text_chunk) yield chunk_wav 엔지니어링 실전: 프로덕션 환경 배포의 치명적 함정(Pitfalls) #수백만 자 분량의 웹소설을 처리하기 위해 ChatTTS를 프로덕션 서버에 밀어 넣을 때, 당신은 반드시 다음과 같은 지뢰를 밟게 됩니다.\n함정 1: 긴 텍스트 입력 시 발생하는 VRAM 눈사태 (OOM on Long Text)\n증상: 200단어가 넘어가는 한 문장을 통째로 넣으면, 자기회귀 모델의 어텐션 매트릭스(Attention Matrix)가 기하급수적으로 팽창하며 12GB 그래픽카드의 VRAM을 순식간에 말라붙게 만들고 서버가 죽어버립니다. 해결책: 절대로 수천 자의 덩어리를 API에 그대로 던지지 마십시오! 아키텍처 외부에 정규식(Regex) 래퍼를 작성하여 마침표, 느낌표, 물음표를 기준으로 텍스트를 강제로 잘라야(Chunking) 합니다. 문장 단위로 오디오를 생성한 뒤, 메모리 상에서 ffmpeg나 numpy.concatenate를 사용해 부드럽게 이어 붙여야만 살아남을 수 있습니다. 함정 2: 갑작스러운 음색의 돌연변이 (Voice Shifting)\n증상: 두 번째 문단을 읽을 때 갑자기 중년 아저씨 목소리가 어린 소녀 목소리로 변해버립니다. 해결책: ChatTTS는 아직 Speaker Embeddings 제어가 불안정합니다. 호출 전에 난수 생성기 시드(torch.manual_seed(고정값))를 강제로 묶어버리고, params_infer_code 내부의 샘플링 특징을 완전히 동결시켜야 합니다. 비즈니스 루프: 얼굴 없는 미디어의 \u0026ldquo;무자본\u0026rdquo; 폭리 매트릭스 #이 흉악하도록 강력한 오픈소스 무기를 손에 쥐었다면, 즉시 무료 고품질 AI 음성 합성 기반의 상업적 루프를 가동할 수 있습니다.\n자동화된 미스터리/범죄 유튜브 채널: ChatGPT를 이용해 Reddit의 공포 썰을 각색합니다. 잘게 쪼갠 텍스트를 ChatTTS 파이프라인에 밀어 넣고, Midjourney로 뽑아낸 기괴한 정지 이미지를 얹어 매일 3개의 고품질 영상을 풀오토로 찍어냅니다. 얼굴 한 번 비추지 않고 얼굴 없는 유튜브 수익창출을 통해 애드센스 달러를 쓸어 담습니다. 오디오북 대량 수출 함대: 국내의 방대한 웹소설은 해외에 막대한 잠재 수요가 있습니다. DeepL API로 영/스페인어로 번역한 뒤, ChatTTS로 감정선이 살아있는 오디오북을 대량 합성하여 Audible 같은 플랫폼에 도배하고 수수료 인세를 챙깁니다. 외부 권위 있는 참고 자료: # ChatTTS 공식 GitHub Repository HuggingFace 모델 가중치(Weights) 배포 페이지 결론: ChatTTS는 신기한 장난감이 아닙니다. 콘텐츠 생산망의 생태계를 박살 내기 위해 벼려진 마체테(Machete)입니다. ElevenLabs의 살인적인 청구서에서 해방되는 순간, 대규모 병렬 처리와 콘텐츠 자동화의 진정한 산업 시대가 비로소 당신에게 문을 엽니다.\n","date":"May 15, 2026","permalink":"https://dibi8.com/kr/resources/llm-frameworks/chattts-architecture-autoregressive-voice/","section":"AI 源码资源","summary":"","title":"왜 기존의 TTS는 영혼 없는 기계처럼 들릴까?"},{"content":"{\u0026lt;/* resource-info */\u0026gt;}\n왜 전설적인 Roop은 결국 죽음을 맞이했는가? #AI 비디오 처리 기술의 초창기, Roop은 \u0026ldquo;원클릭 페이스 스왑\u0026quot;이라는 무기로 전 세계를 휩쓸었습니다. 하지만 산업(Industrial) 수준의 요구사항이 폭발하면서, Roop의 치명적인 설계 결함이 적나라하게 드러났습니다. 싱글 스레드 처리로 인한 극악의 렌더링 속도, 잦은 메모리 누수로 인한 크래시 현상 끝에 결국 프로젝트는 버려졌습니다. 이 시체 더미 위에서 완벽한 Roop 대체 프로그램 추천으로 떠오른 FaceFusion은 현재 GitHub에서 25k+ Star를 끌어모으며 생태계를 평정했습니다.\nFaceFusion은 단순히 Roop의 버그를 고친 것이 아닙니다. 바닥부터 완전히 뜯어고쳤습니다. 허접한 파이썬 스크립트에서 벗어나, 고도로 모듈화된 차세대 AI 비주얼 파이프라인 엔진으로 진화했습니다. 숏폼 플랫폼에서 폭리를 취하려는 사람들에게, FaceFusion 최신 버전 설치와 튜닝을 마스터한다는 것은 곧 \u0026lsquo;디지털 환각\u0026rsquo;을 만들어내는 궁극의 병기를 손에 쥐는 것과 같습니다.\n[여기에 권장 삽입: 프로젝트 아키텍처 다이어그램 / 실행 스크린샷] 그림: FaceFusion의 다단계 비디오 처리 파이프라인. 오디오/비디오 분리부터 얼굴 추적, 멀티코어 동시 렌더링, 최종 인코딩까지의 고효율 데이터 흐름을 명확하게 보여줍니다.\n경쟁사 압살: FaceFusion vs Roop vs DeepFaceLab (DFL) #AI 비디오 특수효과 수익창출의 세계에 뛰어들기 전에, 당신의 공구함에 무엇이 들어있는지부터 확실히 알아야 합니다. 다음은 비디오급 페이스 스왑 툴들의 잔혹한 비교표입니다.\n평가 항목 FaceFusion Roop DeepFaceLab (DFL) 기반 아키텍처 ONNX 런타임 기반의 고도로 모듈화된 파이프라인. 다중 실행 공급자(EP) 완벽 지원. 융통성 없는 단일(Monolithic) 아키텍처. 기술 부채가 심각하며 유지보수 중단됨. 가장 하드코어한 딥러닝 프레임워크. 헐리우드급 영화 합성을 위해 설계됨. 진입 장벽 극도로 낮음. 모델 훈련 불필요. 단 몇 초 만에 고품질 프레임 뽑아냄. 극도로 낮음. 그러나 성능이 끔찍하고 툭하면 뻗음. 극도로 높음. 데이터 수집과 모델 훈련(Train)에만 며칠씩 갈아 넣어야 함. 성능 및 동시성 최상. 멀티스레드 프레임 병렬 렌더링을 네이티브로 지원하여 CPU/GPU를 극한까지 쥐어짬. 최악. 싱글 스레드 연산. 4K 비디오를 넣으면 프로세스가 그 자리에서 얼어붙음. 양호. 단, 추론(Inference)을 돌리기 전에 소스 영상의 특징을 추출하는 데 엄청난 시간을 허비함. 수익화 기민성 숏폼 공장(Matrix)에 완벽 부합. 실시간 스트리밍 처리까지 지원. 도태됨. 상업용 숏폼 공장의 엄청난 생산 속도(Throughput)를 감당하지 못함. 건당 수백만 원짜리 영화/광고 외주에 적합하며, 패스트푸드 같은 숏폼에는 부적합. \u0026ldquo;이미 숨이 끊어진 아키텍처에 금쪽같은 시간을 낭비하지 마십시오. FaceFusion은 모듈화와 ONNX 멀티 플랫폼 가속을 통해, 접근조차 불가능했던 컴퓨터 비전 기술을 주머니에 쏙 들어가는 지폐 인쇄기로 압축해 냈습니다.\u0026rdquo;\n소스 코드 딥다이브: ONNX 런타임과 OOM 방지 멀티스레드 파이프라인 #FaceFusion이 1080P 비디오를 렌더링하는 속도는 Roop보다 몇 배, 심지어 몇십 배나 빠릅니다. 도대체 소스코드 레벨에서 무슨 흑마법을 부린 걸까요? 지금부터 하드코어한 ONNX 추론 가속화 튜토리얼을 시작합니다.\n1. 멀티스레드 프레임 처리 파이프라인: 하드웨어 성능 쥐어짜기 #비디오를 처리할 때, FaceFusion은 ffmpeg를 이용해 비디오를 낱장의 프레임으로 산산조각 낸 다음, 이를 멀티스레드 풀에 던져 넣어 병렬(Concurrent)로 연산합니다.\n# 핵심 소스코드 추출: facefusion/core.py (비디오 처리 멀티스레드 스케줄링) import concurrent.futures from queue import Queue def process_video_frames(frame_paths, update_progress): \u0026#34;\u0026#34;\u0026#34; 산업(Industrial) 수준의 비디오 프레임 병렬 처리 파이프라인 \u0026#34;\u0026#34;\u0026#34; # 사용자가 설정한 스레드 수를 가져오며, 기본적으로 CPU 코어 수에 맞춰 자동 최적화됨 execution_threads = facefusion.globals.execution_threads # [핵심 최적화]: ThreadPoolExecutor를 사용한 병렬 렌더링 폭격 with concurrent.futures.ThreadPoolExecutor(max_workers=execution_threads) as executor: futures = [] for frame_path in frame_paths: # 매 프레임의 작업(얼굴 탐지, 스왑, 업스케일링)을 스레드 풀에 submit future = executor.submit(process_frame, frame_path) futures.append(future) for future in concurrent.futures.as_completed(futures): # 처리 결과를 가져오고 프론트엔드 진행률 바(Progress bar) 업데이트 future.result() update_progress() 심층 분석: 이것이 바로 FaceFusion이 미친 듯이 빠른 이유입니다. 전통적인 OpenCV 비디오 처리는 동기식(Synchronous) while 루프로 프레임을 질척거리며 읽습니다. 반면 FaceFusion은 프레임을 다 뜯어내어(Frame Extraction) ThreadPoolExecutor에 때려 박아 하드웨어의 동시성을 잔인하게 쥐어짭니다. 기저에 깔린 강력한 캐싱 메커니즘과 맞물려 멀티코어 CPU와 GPU의 연산력이 단 1%도 낭비 없이 완벽하게 소진됩니다.\n2. ONNX Execution Providers: 크로스 플랫폼 최하단 가속 엔진 #FaceFusion의 심장은 ONNX 런타임입니다. 당신이 NVIDIA(CUDA)를 쓰든, AMD를 쓰든, Apple M1/M2 맥북을 쓰든, 이 엔진은 하드웨어의 가장 밑바닥 가속기를 동적으로 호출합니다.\n# 핵심 소스코드 추출: facefusion/execution_helper.py (실행 공급자 등록) import onnxruntime def apply_execution_provider_options(execution_providers): \u0026#34;\u0026#34;\u0026#34; 최적의 하드웨어 가속기(Execution Provider)를 지능적으로 선택하고 구성 \u0026#34;\u0026#34;\u0026#34; applied_providers = [] for provider in execution_providers: if provider == \u0026#39;CUDAExecutionProvider\u0026#39;: # [함정 방지]: OOM(메모리 부족)을 막기 위해 CUDA에 극단적인 VRAM 관리 전략을 주입 applied_providers.append((provider, { \u0026#39;cudnn_conv_algo_search\u0026#39;: \u0026#39;EXHAUSTIVE\u0026#39;, # 최상의 컨볼루션 알고리즘을 찾기 위한 전수 조사 \u0026#39;arena_extend_strategy\u0026#39;: \u0026#39;kSameAsRequested\u0026#39;, # VRAM 파편화로 인한 폭발 방지 })) elif provider == \u0026#39;CoreMLExecutionProvider\u0026#39;: # Apple Silicon (M1/M2/M3) 전용 하드웨어 최적화 applied_providers.append((provider, {\u0026#39;coreml_subgraph\u0026#39;: True})) else: # 가속기가 없으면 순수 CPU 실행으로 안전하게 다운그레이드 applied_providers.append(provider) return applied_providers 심층 분석: 이 코드는 크로스 플랫폼 배포의 최고 경지를 보여줍니다. ONNX는 복잡한 신경망을 추상화하여, 서로 다른 ExecutionProvider (CUDA, CoreML, DirectML 등)에 바인딩함으로써 하드웨어 레벨의 밑바닥 가속을 달성합니다. 특히 arena_extend_strategy라는 숨겨진 파라미터를 설정한 것은 극악의 VRAM 파편화(Fragmentation) 누수를 막기 위한 치밀한 계산입니다. 덕분에 1시간짜리 영상을 렌더링해도 서버가 뻗지 않는 것입니다.\n엔지니어링 실전: 프로덕션 환경 배포의 데스 트랩(Death Trap) #아무리 프로젝트가 훌륭하더라도, 수많은 소셜 미디어 팀들이 배포 과정에서 치명적인 지뢰를 밟고 맙니다.\n함정 1: 영상 병합 시 발생하는 오디오 증발 및 립싱크 어긋남\n증상: 처리가 다 끝난 MP4 파일을 틀어보니 소리가 아예 안 나거나, 화면과 소리가 1초 이상 어긋납니다. 해결책: 렌더링 파이프라인에서 FaceFusion은 오디오 트랙을 먼저 벗겨냅니다. 만약 원본 비디오가 가변 프레임 레이트(VFR)로 촬영되었다면, 나중에 합칠 때 100% 립싱크가 박살 납니다. FaceFusion에 영상을 집어넣기 전에, 반드시 FFmpeg 명령어 한 줄로 원본 소스를 고정 프레임 레이트(CFR)로 \u0026lsquo;세탁\u0026rsquo;해야 합니다: ffmpeg -i input.mp4 -r 30 -vsync cfr output_cfr.mp4 함정 2: 동시성 처리가 유발하는 모델 중복 로드 메모리 폭발\n증상: 백엔드에서 3개의 숏폼 영상을 동시에 처리하려고 스레드 3개를 띄웠더니, 시스템 RAM 32GB가 순식간에 100%를 찍고 서버가 그 자리에서 사망합니다. 해결책: FaceFusion은 기본적으로 각 프로세스마다 무거운 얼굴 탐지 모델(yoloface)과 업스케일링 모델(gfpgan)을 \u0026lsquo;각각\u0026rsquo; 로드합니다. 서버 환경에 배포할 때는 절대로 다중 프로세스(Multiprocessing) API 호출을 쓰면 안 됩니다! 반드시 큐(Queue) 기반의 단일 프로세스 싱글톤(Singleton) 패턴을 구축하여, 모든 요청을 글로벌 큐에 던져 넣고 직렬(Sequential)로 처리하게 하여 모델이 VRAM에 한 번만 상주하도록 강제해야 합니다. 비즈니스 루프: 시각적 환각(Visual Illusion)으로 트래픽 배당금 쓸어 담기 #기술의 존재 이유는 수요를 해결하는 것이고, 수요는 곧 돈입니다. FaceFusion을 활용하면 플랫폼의 레드라인을 교묘히 피하면서 AI 비디오 특수효과 수익창출의 바닥 논리를 즉각적으로 실행할 수 있습니다.\n합법적인 버추얼 아바타/쇼호스트 군단 구축: 합법적으로 라이선스를 구매한 모델의 초상권을 활용하여, FaceFusion으로 값싼 무명 배우(또는 자사 직원)의 얼굴을 초고화질 가상 모델로 싹 다 덮어씌웁니다. 출연진 섭외 비용을 극단적으로 낮추면서, 무결점 외모의 틱톡(TikTok) 뷰티/패션 드랍쉬핑(Dropshipping) 매트릭스를 찍어낼 수 있습니다. 웨딩 영상/옛날 비디오 초고화질 복원 외주: 웨딩 업체나 영상 스튜디오는 엑스트라 얼굴을 수정하거나 화질이 박살 난 영상을 복원해야 할 일이 넘쳐납니다. (FaceFusion에 내장된 Face Enhancer 활용). 분당 단가로 계산되는 이 꿀 빠는 외주를 싹쓸이하여 막대한 마진을 챙기십시오. 철저한 계정 정지(Ban) 방어 및 컴플라이언스: 소셜 미디어 비즈니스를 할 때는 반드시 AI 영상 합성 정지 방지 원칙을 목숨처럼 지켜야 합니다. 정치인이나 허가받지 않은 유명인의 얼굴은 절대 건드리지 마십시오. 발각 즉시 채널 영구 정지는 물론 법적 소송의 표적이 됩니다. 오직 합법적인 상업적 특수효과와 디지털 스탠드인(Stand-in)에만 집중하십시오! 외부 권위 있는 참고 자료: # FaceFusion 공식 GitHub Repository ONNX Runtime 공식 하드웨어 가속(EP) 가이드 결론: Roop은 시대의 눈물이 되었고, FaceFusion은 현재 비주얼 산업계에서 포장을 뜯자마자 쓸 수 있는 최강의 포식자입니다. 정교한 멀티스레드 아키텍처와 ONNX의 밑바닥 흑마법을 통해, 실험실에 갇혀 있던 무거운 딥러닝 연산을 흙수저 크리에이터들의 골방으로 끌어내렸습니다. 이를 통달한다면, 이 지독한 시선 경제(Attention Economy) 시대에 가장 중독성 있는 시각적 마약을 대량 생산하는 주인이 될 것입니다.\n","date":"May 15, 2026","permalink":"https://dibi8.com/kr/resources/ai-tools/facefusion-architecture-onnx-video-face-swap/","section":"AI 源码资源","summary":"","title":"왜 전설적인 Roop은 결국 죽음을 맞이했는가?"},{"content":"{\u0026lt;/* resource-info */\u0026gt;}\nThe Evolution: From Chatbot to Autonomous System #우리는 중요한 전환점에 서 있습니다. In 2024, we celebrated chatbots that could answer questions. In 2025, we marveled at agents that could browse the web. Now in mid-2026, something fundamentally different has emerged: 자율 AI 시스템 that combine 심층 연구, 인프라 구성, 코드 생성, and 품질 보증 into a 단일 통합 워크플로우.\nThis isn\u0026rsquo;t 점진적 개선. It\u0026rsquo;s 아키텍처 진화. And four open-source projects reveal the pattern.\nPillar 1: Deep Research — The Intelligence Layer #Local Deep Research by LearningCircuit #대부분의 AI 도구는 답변만 제공합니다. Local Deep Research gives you verified knowledge.\n독보적인 이유는 다음과 같습니다:\n20+ 연구 전략 including a LangGraph agent mode that autonomously decides which search engine to use, when to dig deeper, and when to synthesize ~95% SimpleQA 벤치마크 정확도 — 상용 시스템과 경쟁력 있는 수준 프라이버시 우선 아키텍처: SQLCipher-암호화된 SQLite 데이터베이스 (AES-256), 텔레메트리, 분석, 추적 없음 다중 소스 인텔리전스: arXiv, PubMed, Semantic Scholar, SearXNG, Tavily, Brave Search — 각 소스가 색인되고 교차 참조됨 무지식 암호화: User data isolated per-database, 서버 관리자도 내용을 읽을 수 없음 The architecture is instructive:\nUser Query -\u0026gt; Strategy Selector -\u0026gt; Question Generator -\u0026gt; Parallel Search (academic + web + documents) -\u0026gt; Analysis Loop -\u0026gt; Report Synthesis -\u0026gt; Multi-format Export What\u0026rsquo;s novel is the iterative research loop. Instead of one-shot query-response, the system generates sub-questions, searches across diverse sources, analyzes results, and iterates until confidence thresholds are met. This mimics how human experts actually do research: hypothesize, investigate, evaluate, refine.\nThe security model deserves special mention. Every user gets an isolated SQLCipher database. The encryption uses Signal-level AES-256 security. No password recovery means true zero-knowledge. Docker images are signed with Cosign and include SLSA provenance attestations. For developers who care about supply chain security, this is 엔터프라이즈급 보안.\nPillar 2: Infrastructure — The Platform Layer #InsForge by InsForge #An AI agent that can research deeply still needs somewhere to deploy its work. Enter InsForge: 에이전트 코딩을 위해 특별히 설계된 올인원 오픈소스 백엔드 플랫폼.\nThink of it as Firebase meets Vercel meets Render — but built for AI agents to operate directly.\nCore capabilities:\nAuthentication: Email/password + OAuth (Google, GitHub) with session management Database: PostgreSQL with PostgREST auto-API generation Storage: S3-compatible file storage for documents, media, assets Edge Functions: Serverless code deployment with automatic scaling Model Gateway: OpenAI-compatible API routing across multiple LLM providers Compute: Long-running container services (private preview) Site Deployment: Full site build and deployment pipeline The key innovation is 이중 인터페이스 지원:\nMCP 서버 — Self-hostable interface exposing InsForge operations as standardized tools that any MCP-compatible agent (Claude Code, Cursor, Gemini CLI) can call CLI + Skills — Cloud-native command-line interface paired with executable skill definitions This means an AI agent doesn\u0026rsquo;t just generate code — it can provision its own database schema, configure authentication, deploy edge functions, set up storage buckets, and even route its own API calls through the model gateway. End-to-end autonomy.\nThe SDK is elegantly simple:\nimport { createClient } from \u0026#39;@insforge/sdk\u0026#39;; const client = createClient({ baseUrl: \u0026#39;https://your-app.region.insforge.app\u0026#39;, anonKey: \u0026#39;your-anon-key-here\u0026#39; }); Everything from database CRUD to auth flows to AI operations is available through this unified client. For a coding agent, this reduces what would normally require a DevOps engineer to a single API call.\nVercel supports this project through their OSS program, indicating strong industry validation. Licensed under Apache 2.0.\nPillar 3: Engineering Discipline — The Quality Layer #Agent Skills by Addy Osmani #규율 없는 순수 능력은 지저분하고 유지보수 불가능한 코드를 낳습니다. This is where Addy Osmani\u0026rsquo;s Agent Skills come in — production-grade engineering workflows packaged so AI agents follow senior-engineer standards consistently.\nThe core insight: 스킬은 시니어 엔지니어가 개발 전 과정에서 사용하는 의사결정 패턴을 인코딩합니다. Not specific code — the judgment behind when and why to make certain decisions.\nThe seven-slash-command framework maps to the complete development lifecycle:\n||Command|Phase|Principle|| ||\u0026mdash;\u0026mdash;\u0026mdash;|\u0026mdash;\u0026mdash;-|\u0026mdash;\u0026mdash;\u0026mdash;\u0026ndash;|| ||/spec|Define|Spec before code — requirements first|| ||/plan|Plan|Small, atomic tasks — break down complexity|| ||/build|Build|One slice at a time — incremental delivery|| ||/test|Verify|Tests are proof — not decoration|| ||/review|Review|Improve code health — continuous refinement|| ||/code-simplify|Simplify|Clarity over cleverness — readability wins|| ||/ship|Ship|Faster is safer — ship incrementally||\nBut the real magic is context-aware auto-discovery. When designing an API, the api-and-interface-design skill activates automatically. Building UI? frontend-ui-engineering triggers. The agent understands its task and loads the appropriate expertise.\nThis transforms AI coding from \u0026ldquo;write code that happens to work\u0026rdquo; to \u0026ldquo;follow proven engineering workflows that produce maintainable results.\u0026rdquo;\nPillar 4: Behavioral Guardrails — The Wisdom Layer #Karpathy-Inspired Skills #기반 행동에 결함이 있으면 최고의 엔지니어링 프레임워크도 실패합니다. Andrej Karpathy identified LLM 코딩 실패의 패턴:\n\u0026ldquo;The models make wrong assumptions on your behalf and just run along with them without checking. They don\u0026rsquo;t manage their confusion, don\u0026rsquo;t seek clarifications, don\u0026rsquo;t surface inconsistencies, don\u0026rsquo;t present tradeoffs, don\u0026rsquo;t push back when they should.\u0026rdquo;\nThis project distills Karpathy\u0026rsquo;s observations into four behavioral principles embedded in a CLAUDE.md file:\n1. Think Before Coding — State assumptions explicitly. Present multiple interpretations. Push back when simpler approaches exist. Stop when confused. Ask before assuming.\n2. Simplicity First — Minimum viable solution. No speculative features. No abstractions for single-use code. If 200 lines could be 50, rewrite it. The test: \u0026ldquo;Would a senior engineer say this is overcomplicated?\u0026rdquo;\n3. Surgical Changes — Touch only what you must. Don\u0026rsquo;t refactor things that aren\u0026rsquo;t broken. Match existing style. Remove only the dead code YOUR changes created — never pre-existing orphan code unless asked.\n4. Goal-Driven Execution — Define success criteria upfront. Transform \u0026ldquo;add validation\u0026rdquo; into \u0026ldquo;write tests for invalid inputs, then make them pass.\u0026rdquo; Strong criteria enable independent looping; weak criteria require constant clarification.\nThese aren\u0026rsquo;t technical solutions — they\u0026rsquo;re 인지적 안전장치. They address the LLM의 근본적 약점: 능력을 가장한 과도한 자신감.\nHow These Four Layers Work Together #The breakthrough moment comes when you connect all four pillars into a single workflow:\nResearch (Local Deep Research): An agent receives a complex query — \u0026ldquo;Build a trading dashboard for prediction markets.\u0026rdquo; It conducts 심층 연구 across financial APIs, market structures, and UI patterns, producing a verified report with citations.\nPlatform (InsForge): The agent provisions the entire backend — PostgreSQL for market data, edge functions for real-time updates, storage for historical charts, auth for user accounts, model gateway for analysis APIs. All via MCP tool calls.\nEngineering (Agent Skills): The agent builds the frontend following the /spec → /plan → /build → /test → /review → /ship workflow. Context-aware skills activate as needed — frontend-ui-engineering for the dashboard, data-visualization for charting, api-integration for real-time websockets.\nWisdom (Karpathy Skills): Throughout this process, the behavioral guardrails prevent classic LLM mistakes — no overengineered abstractions, no touching unrelated code, explicit assumption-stating before every architectural decision, verifiable success criteria instead of vague \u0026ldquo;make it work\u0026rdquo; targets.\nThe result? An agent that doesn\u0026rsquo;t just \u0026ldquo;write code\u0026rdquo; but operates with the judgment, discipline, and verification standards of a senior full-stack team.\nWhy This Matters for Developers #Three years ago, the question was \u0026ldquo;Can AI write code?\u0026rdquo; Today, it\u0026rsquo;s \u0026ldquo;Can AI build production systems end-to-end?\u0026rdquo;\nThe answer is becoming clear: not yet fully autonomously, but dangerously close.\nEach pillar addresses a specific failure mode:\nWithout 심층 연구 → agents build on outdated or incorrect information Without proper infrastructure → agents generate code with no deployment path Without engineering discipline → agents produce unmaintainable spaghetti Without behavioral guardrails → agents overconfidently implement wrong solutions Together, these four open-source projects form the first complete stack for genuine AI-assisted development.\nGetting Started #All four projects are open-source and free:\nLocal Deep Research: pip install local-deep-research or Docker Compose InsForge: npm install @insforge/sdk (cloud) or self-hosted MCP server Agent Skills: Claude Code marketplace plugin or .cursor/rules/ Karpathy Skills: Single CLAUDE.md file merge You don\u0026rsquo;t need to adopt all four simultaneously. Start with what addresses your biggest gap. But once you experience the synergy — research informing architecture, architecture guiding implementation, implementation disciplined by skills, all guided by wisdom — it\u0026rsquo;s hard to go back to doing it alone.\nThe future of software development isn\u0026rsquo;t humans replacing AI or AI replacing humans. It\u0026rsquo;s humans orchestrating AI systems that combine deep intelligence, robust infrastructure, engineering discipline, and practical wisdom. And those systems are already here.\n","date":"May 15, 2026","permalink":"https://dibi8.com/kr/resources/llm-frameworks/beyond-chatbots-four-pillars-autonomous-ai-systems-2026/","section":"AI 源码资源","summary":"","title":"챗봇을 넘어: 2026년 자율 AI 시스템의 4가지 기둥"},{"content":"{\u0026lt;/* resource-info */\u0026gt;}\n파이썬 컨텍스트 매니저에 대한 대부분의 입문서는 with open(\u0026quot;file.txt\u0026quot;) as f:라는 단 하나의 예제만 보여주고 마무리합니다. 이것만으로도 컨텍스트 매니저를 사용하기에는 충분하지만, 언제 직접 작성해야 하는지는 알려주지 않습니다.\n수년간 파이썬 서비스를 작성해 오면서, 저는 특정 세 가지 상황에서 컨텍스트 매니저를 반복해서 사용하게 된다는 것을 깨달았습니다. 각 상황은 try/finally로 기술적으로 해결할 수 있지만 실전에서는 실수하기 쉬운 문제들을 해결해 줍니다.\n사례 1: 획득(Acquire)과 해제(Release)의 쌍 맞추기 #가장 고전적인 사례입니다. 락(lock), 데이터베이스 연결, 임시 파일, 네트워크 소켓 등 반드시 해제해야 하는 리소스가 있을 때, 중간 코드에서 예외가 발생하더라도 확실히 해제되도록 보장하고 싶을 때 사용합니다.\nfrom contextlib import contextmanager import threading _lock = threading.Lock() @contextmanager def critical_section(): _lock.acquire() try: yield finally: _lock.release() with critical_section(): do_dangerous_thing() 왜 그냥 try/finally를 쓰지 않나요? 쓸 수 있습니다. 호출하는 쪽에서 컨텍스트 매니저가 확장되는 형태가 바로 그것이니까요. 하지만 이득은 try/finally가 호출하는 곳이 아닌 헬퍼 함수 안에 존재한다는 점입니다. 모든 호출자는 이를 무료로 이용할 수 있고, 누구도 finally 블록 작성을 잊어버리지 않게 됩니다.\n코드베이스에서 try: thing.acquire(); ...; finally: thing.release() 패턴이 다섯 번 이상 반복된다면, 그것은 컨텍스트 매니저로 추출될 준비가 되었다는 신호입니다.\n사례 2: 전역 상태를 일시적으로 변경하기 #자주 언급되지는 않지만, 컨텍스트 매니저가 진가를 발휘하는 부분입니다. 특정 블록이 실행되는 동안만 설정을 변경하고, 블록이 어떻게 종료되든 관계없이 원래 상태로 되돌리고 싶을 때 사용합니다.\nimport os from contextlib import contextmanager @contextmanager def env(**overrides): \u0026#34;\u0026#34;\u0026#34;환경 변수를 일시적으로 설정하고, 종료 시 이전 값으로 복원합니다.\u0026#34;\u0026#34;\u0026#34; saved = {k: os.environ.get(k) for k in overrides} os.environ.update({k: str(v) for k, v in overrides.items()}) try: yield finally: for k, prev in saved.items(): if prev is None: os.environ.pop(k, None) else: os.environ[k] = prev with env(DEBUG=\u0026#34;1\u0026#34;, REGION=\u0026#34;us-east-1\u0026#34;): run_test_suite() # 여기서 환경 변수는 원래 상태로 돌아갑니다. 동일한 패턴이 sys.path, logging 레벨, decimal 컨텍스트, 모킹된 속성(mocked attributes) 등 \u0026ldquo;저장, 변경, 복원\u0026quot;의 형태를 따르는 모든 곳에 적용됩니다. 특히 테스트에서 유용합니다. 그렇지 않으면 테스트 도중 예외가 발생했을 때 설정이 복구되지 않고 남는(leak) 문제가 발생할 수 있습니다.\n여기서 미묘한 부분은 None을 올바르게 복원하는 것입니다. 흔히 하는 실수는 확인 없이 os.environ[k] = saved[k]를 하는 것인데, 이전에 존재하지 않았던 변수에 문자열 \u0026quot;None\u0026quot;이 쓰여버리게 됩니다. 항상 \u0026ldquo;없음\u0026rdquo; 상태는 문자열이 아닌 pop으로 복원해야 합니다.\n사례 3: 정말로 무시하고 싶은 예외 억제하기 #때로는 특정 예외 클래스를 의도적으로 무시하고 계속 진행하고 싶을 때가 있습니다. 파이썬은 이를 위해 contextlib.suppress를 제공합니다.\nfrom contextlib import suppress with suppress(FileNotFoundError): os.unlink(\u0026#34;maybe-stale.lock\u0026#34;) 이것은 동일한 기능의 try/except: pass보다 훨씬 명확합니다. 제한된 표면적이 사용자에게 구체적일 것을 강제하기 때문입니다. 실수로 모든 것을 억제할 수 없으며, 반드시 클래스 이름을 지정해야 합니다. 또한 with 블록의 범위가 명확하므로 정리 코드 아래의 코드까지 실수로 억제하지 않게 됩니다.\n저는 소멸자(destructors)나 atexit 핸들러의 정리 작업에서 이 기능이 매우 유용하다는 것을 알게 되었습니다. 정리 작업 자체가 예외를 발생시켜서는 안 되는 상황에서 말이죠.\n컨텍스트 매니저를 작성하지 말아야 할 때 #컨텍스트 매니저는 공짜가 아닙니다. 각 with 문은 약간의 오버헤드를 유발하며, 너무 많이 겹쳐 쓰면 가독성이 급격히 떨어집니다. 저는 다음과 같은 경우 사용을 피합니다:\n\u0026ldquo;획득\u0026rdquo; 단계에 쌍을 이루는 \u0026ldquo;해제\u0026quot;가 실제로 필요하지 않은 경우 - 그냥 함수를 호출하세요. 정리 작업이 최선형(best-effort)이고 범위가 충분히 작아 인라인 try/finally가 더 읽기 편한 경우. 관리 대상이 이미 다른 것에 의해 관리되고 있는 경우 (예: 이미 자체 수명 주기를 컨텍스트 관리하고 있는 프레임워크의 Session을 다시 감싸지 마세요). 제가 사용하는 기준은 이렇습니다: \u0026ldquo;내가 정리를 빠뜨렸을 때, 다음 사람이 조용히 리소스를 누출하게 될까?\u0026rdquo; 만약 그렇다면 컨텍스트 매니저를 작성하세요. 그렇지 않다면 평범한 함수로 충분합니다.\n비동기(Async)에 대하여 #async 코드에서는 @asynccontextmanager와 async with를 사용하세요. 형태는 동일합니다. 유일하게 기억할 점은 본문 안에서 await를 사용할 수 있다는 것이며, 이는 \u0026ldquo;풀에서 연결 획득, 쿼리 실행, 반환\u0026quot;과 같은 패턴에서 더욱 유용하게 쓰입니다.\nfrom contextlib import asynccontextmanager @asynccontextmanager async def borrowed(pool): conn = await pool.acquire() try: yield conn finally: await pool.release(conn) 이것이 전부입니다. 제가 작성한 컨텍스트 매니저의 90%는 이 세 가지 패턴에 해당합니다. 나머지 10%는 특이한 경우이며, 직접 마주하게 되면 알게 되실 겁니다.\n관련 기사 # Scrapling 리뷰: 더 빠르고 은밀한 파이썬 스크래핑 제안 — 고급 파이썬 스크래핑 길을 잃지 않고 Postgres에서 EXPLAIN ANALYZE 읽기 — 데이터베이스 성능 최적화 무료 Claude Code: 모든 AI 제공업체와 함께 Claude Code CLI를 무료로 사용하기 — AI 지원 코딩 ","date":"May 15, 2026","permalink":"https://dibi8.com/kr/resources/ai-tools/python-context-managers-the-three-cases-you-actually-need/","section":"AI 源码资源","summary":"","title":"파이썬 컨텍스트 매니저: 실제로 필요한 세 가지 경우"},{"content":"{\u0026lt;/* resource-info */\u0026gt;}\n이 흥미로운 Twitter 게시물이 제 관심을 끌었습니다:\n여기에서 전체 Twitter 게시물 보기\n이 게시물에 대해 어떻게 생각하시나요? 댓글에 의견을 공유해주세요!\n","date":"May 15, 2026","permalink":"https://dibi8.com/kr/resources/ai-tools/twitter-post-2047276073973346585/","section":"AI 源码资源","summary":"","title":"흥미로운 Twitter 게시물 - 확인해보세요"},{"content":"","date":null,"permalink":"https://dibi8.com/kr/tags/","section":"Tags","summary":"","title":"Tags"}]