Raycast에서 GPT 한 번에 실행하는 커스텀 버튼 만들기 - 5분 완성 가이드

Raycast를 쓰고 있다면 GPT를 단축키 하나로 바로 실행할 수 있어요. 매번 브라우저 열고 ChatGPT 접속하는 게 귀찮았다면 이 방법이 답이에요. OpenAI API 키만 있으면 지금 당장 만들 수 있어요.


Raycast 로고 - 빨간색 사각 아이콘과 검은색 텍스트


GPT API 연동 스크립트 먼저 만들기


Python 스크립트부터 준비해요. 터미널을 열고 원하는 폴더에 gpt_runner.py 파일을 만들어요. API 키는 절대 코드에 직접 넣지 마세요. 환경변수로 관리하는 게 안전해요.


#!/usr/bin/env python3
import openai
import sys
import os

# 환경변수에서 API 키 가져오기 - 보안 필수!
openai.api_key = os.getenv("OPENAI_API_KEY")

# 명령줄 인자로 프롬프트 받기
if len(sys.argv) > 1:
    prompt = " ".join(sys.argv[1:])
else:
    prompt = "오늘 할 일 3가지를 추천해줘"

try:
    # GPT-4 호출 (GPT-3.5를 쓰려면 model을 변경)
    response = openai.ChatCompletion.create(
        model="gpt-4",
        messages=[
            {"role": "system", "content": "당신은 유용한 어시스턴트입니다."},
            {"role": "user", "content": prompt}
        ],
        max_tokens=500,
        temperature=0.7  # 창의성 조절 (0~1)
    )
    
    # 결과 출력
    result = response.choices[0].message.content
    print(result)
    
except Exception as e:
    print(f"오류 발생: {str(e)}")
    print("API 키를 확인하세요!")


이 스크립트의 핵심은 sys.argv로 외부에서 프롬프트를 받는 거예요. Raycast에서 이 부분을 활용할 거예요.


환경변수에 OpenAI API 키 설정하기


터미널에서 환경변수를 설정해요. zsh를 쓴다면 .zshrc 파일을 편집해요.

# .zshrc 파일 열기
nano ~/.zshrc

# 이 줄을 추가 (본인의 API 키로 교체)
export OPENAI_API_KEY="sk-xxxxxxxxxxxxxxxxxxxxx"

# 저장 후 적용
source ~/.zshrc


환경변수 설정이 제대로 됐는지 확인하려면 echo $OPENAI_API_KEY 명령을 실행해보세요.


Raycast Script Command 만들기


이제 본격적으로 Raycast 버튼을 만들어요. Raycast Scripts 폴더가 없다면 먼저 만들어요.

mkdir -p ~/Raycast/Scripts
cd ~/Raycast/Scripts


여기에 gpt-quick-run.sh 파일을 생성해요. 이 파일이 실제 Raycast 명령이 돼요.

#!/bin/bash

# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title Quick GPT
# @raycast.mode fullOutput
# @raycast.icon 🤖
# @raycast.packageName GPT Tools
# @raycast.author YourName
# @raycast.description 즉시 GPT 실행하기

# 실행 위치를 스크립트가 있는 디렉토리로 변경
SCRIPT_DIR="$HOME/Raycast/Scripts"

# 고정 프롬프트로 바로 실행
echo "🚀 GPT 실행 중..."
/usr/bin/python3 "$SCRIPT_DIR/gpt_runner.py" "오늘의 날씨를 기반으로 옷차림 추천해줘"


스크립트에 실행 권한을 주는 걸 잊으면 안 돼요.

chmod +x gpt-quick-run.sh


사용자 입력을 받는 대화형 버전 만들기


고정된 프롬프트만 쓰는 건 재미없어요. 사용자가 직접 입력할 수 있게 만들어봐요.

#!/bin/bash

# Required parameters:
# @raycast.schemaVersion 1
# @raycast.title GPT Chat
# @raycast.mode fullOutput
# @raycast.icon 💬
# @raycast.packageName GPT Tools
# @raycast.argument1 { "type": "text", "placeholder": "무엇이든 물어보세요" }

SCRIPT_DIR="$HOME/Raycast/Scripts"

# 사용자가 입력한 텍스트를 그대로 전달
echo "🤔 생각 중..."
echo "━━━━━━━━━━━━━━━━━━━━━━━━━"
/usr/bin/python3 "$SCRIPT_DIR/gpt_runner.py" "$1"


이 버전은 Raycast에서 실행하면 입력창이 나타나요. 원하는 질문을 입력하면 바로 GPT가 답해요.


특수 용도별 전용 버튼 만들기


코드 리뷰, 번역, 요약 등 자주 쓰는 기능은 전용 버튼으로 만들면 편해요.


코드 리뷰 전용 버튼 (code-review.sh)

#!/bin/bash

# @raycast.schemaVersion 1
# @raycast.title Code Review
# @raycast.mode fullOutput
# @raycast.icon 🔍
# @raycast.argument1 { "type": "text", "placeholder": "코드를 붙여넣으세요" }

SCRIPT_DIR="$HOME/Raycast/Scripts"

# 코드 리뷰 전용 프롬프트 추가
PROMPT="다음 코드를 리뷰해주세요. 버그, 개선점, 최적화 방안을 알려주세요:\n\n$1"

echo "🔍 코드 분석 중..."
/usr/bin/python3 "$SCRIPT_DIR/gpt_runner.py" "$PROMPT"


한영 번역 버튼 (translate.sh)

#!/bin/bash

# @raycast.schemaVersion 1
# @raycast.title 한영 번역
# @raycast.mode fullOutput
# @raycast.icon 🌐
# @raycast.argument1 { "type": "text", "placeholder": "번역할 텍스트" }

SCRIPT_DIR="$HOME/Raycast/Scripts"

# 언어 자동 감지 후 번역
PROMPT="다음 텍스트를 한국어면 영어로, 영어면 한국어로 자연스럽게 번역해주세요:\n\n$1"

echo "🌐 번역 중..."
/usr/bin/python3 "$SCRIPT_DIR/gpt_runner.py" "$PROMPT"


클립보드 연동으로 더 편하게 만들기


결과를 자동으로 클립보드에 복사하면 바로 붙여넣기할 수 있어요.

#!/bin/bash

# @raycast.schemaVersion 1
# @raycast.title GPT to Clipboard
# @raycast.mode silent
# @raycast.icon 📋
# @raycast.argument1 { "type": "text", "placeholder": "프롬프트 입력" }

SCRIPT_DIR="$HOME/Raycast/Scripts"

# GPT 실행 후 결과를 클립보드로
RESULT=$(/usr/bin/python3 "$SCRIPT_DIR/gpt_runner.py" "$1")

# 클립보드에 복사
echo "$RESULT" | pbcopy

# 알림 표시 (Raycast가 자동으로 처리)
echo "✅ 클립보드에 복사됨"


고급 Python 스크립트로 업그레이드하기


기본 스크립트를 더 강력하게 만들어봐요. 대화 컨텍스트 유지, 스트리밍 응답, 에러 처리를 추가해요.

#!/usr/bin/env python3
import openai
import sys
import os
import json
from datetime import datetime

class GPTRunner:
    def __init__(self):
        self.api_key = os.getenv("OPENAI_API_KEY")
        openai.api_key = self.api_key
        
        # 대화 기록 파일 경로
        self.history_file = os.path.expanduser("~/.gpt_history.json")
        self.load_history()
    
    def load_history(self):
        """이전 대화 불러오기"""
        try:
            with open(self.history_file, 'r') as f:
                self.messages = json.load(f)
        except:
            # 시스템 메시지로 초기화
            self.messages = [{
                "role": "system",
                "content": "당신은 도움이 되는 어시스턴트입니다. 간결하고 명확하게 답변합니다."
            }]
    
    def save_history(self):
        """대화 저장 (최근 10개만 유지)"""
        # 시스템 메시지 + 최근 10개 메시지만 유지
        self.messages = self.messages[:1] + self.messages[-10:]
        with open(self.history_file, 'w') as f:
            json.dump(self.messages, f, ensure_ascii=False, indent=2)
    
    def run(self, prompt, reset=False):
        """GPT 실행"""
        if reset:
            # 대화 초기화 옵션
            self.messages = self.messages[:1]
        
        # 사용자 메시지 추가
        self.messages.append({"role": "user", "content": prompt})
        
        try:
            # GPT 호출 (스트리밍 모드)
            response = openai.ChatCompletion.create(
                model="gpt-4",
                messages=self.messages,
                max_tokens=800,
                temperature=0.7,
                stream=True  # 스트리밍 활성화
            )
            
            # 응답 수집
            full_response = ""
            for chunk in response:
                if chunk.choices[0].delta.get('content'):
                    content = chunk.choices[0].delta.content
                    print(content, end='', flush=True)
                    full_response += content
            
            # 응답 저장
            self.messages.append({"role": "assistant", "content": full_response})
            self.save_history()
            
        except Exception as e:
            print(f"\n❌ 오류: {str(e)}")
            sys.exit(1)

if __name__ == "__main__":
    runner = GPTRunner()
    
    # 명령줄 인자 처리
    if len(sys.argv) > 1:
        prompt = " ".join(sys.argv[1:])
        
        # --reset 옵션 확인
        if prompt.startswith("--reset"):
            runner.run("대화를 초기화했습니다. 무엇을 도와드릴까요?", reset=True)
        else:
            runner.run(prompt)
    else:
        print("프롬프트를 입력하세요")


이 스크립트는 대화 컨텍스트를 유지해요. 이전 대화를 기억하면서 연속적인 질문이 가능해요.


Raycast 단축키 설정하기


Raycast 설정에서 각 스크립트에 단축키를 할당할 수 있어요. Raycast를 열고 Settings로 가서 Extensions 탭에서 Script Commands를 찾아요.


각 스크립트 옆의 Record Hotkey를 클릭하고 원하는 단축키를 누르면 돼요. 추천하는 단축키 조합이에요.


  • Quick GPT: ⌘ + Shift + G
  • Code Review: ⌘ + Shift + R
  • 번역: ⌘ + Shift + T


문제 해결 팁


스크립트가 안 될 때 확인할 사항들이에요.


Python 경로가 맞는지 확인해요. which python3 명령으로 정확한 경로를 찾아서 스크립트에 넣어요.


OpenAI 라이브러리가 설치됐는지 확인해요. pip3 install openai 명령으로 설치할 수 있어요.


Raycast가 스크립트를 인식 못 한다면 Raycast를 재시작하거나 Reload Script Commands 명령을 실행해요.


API 사용량이 걱정된다면 Python 스크립트에서 max_tokens를 줄이거나 GPT-3.5-turbo 모델을 써요. 가격이 훨씬 저렴해요.



노션 페이지 수정할 때마다 깃허브에 자동으로 백업하는 방법