-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathagent.py
More file actions
128 lines (97 loc) · 7.83 KB
/
agent.py
File metadata and controls
128 lines (97 loc) · 7.83 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
import asyncio
from dotenv import load_dotenv
from browser_use import Agent, Browser, BrowserSession, BrowserProfile, ChatAnthropic
from browser_use.browser import BrowserProfile, BrowserSession
from playwright.async_api import Page
# controller = Controller()
# SENSITIVE_DATA 로드 (스쿼트보이님이 제공해주신 구조 사용)
load_dotenv()
SENSITIVE_DATA = {
"first_name": "JaeYoung",
"last_name": "Lee",
"phone_number": "010-1234-5678", # 실제로는 01012345678 또는 12345678 형태로 입력될 수 있음
"gender": "남성", # "남성" 또는 "여성"
"birth_date": "2001-03-09", # YYYY-MM-DD
"email": "test@gmail.com",
"country": "대한민국",
}
def make_task_prompt(departure, arrival, depart_date, return_date, num_people):
# SENSITIVE_DATA의 birth_date를 년, 월, 일로 분리
birth_year, birth_month, birth_day = SENSITIVE_DATA["birth_date"].split("-")
# 월을 숫자만 남기기 (예: "03" -> "3")
birth_month_numeric = str(int(birth_month))
birth_day_numeric = str(int(birth_day))
return f"""Agoda에 접속해 항공권 예약을 진행해.
1. 항공예약 섹션을 클릭하고, 편도/왕복 선택 항목에서 **왕복**을 선택해
2. 출발지({departure})/도착지({arrival})/출발날짜({depart_date})-도착날짜({return_date})/인원 수({num_people})를 각 필드에 올바르게 입력해
* **정확한 데이터 매핑**:
* 인원 수 필드의 경우는 기본 인원 수가 1명으로 되있을거야. '-', '+' 버튼을 이용해서 인원 수를 {num_people}명으로 맞춰줘.
* 인원 수 예시: {num_people}이 2 인 경우
* 드롭다운 메뉴에서 성인 인원이 2명보다 많으면 마이너스("-") 버튼을 클릭하여 2명이 되도록 하세요.
* 드롭다운 메뉴에서 성인 인원이 2명보다 적으면 플러스("+") 버튼을 클릭하여 2명이 되도록 하세요.
3. 검색을 누른뒤 항공권 결과 항목에서 최저가 항공권을 찾아
4. 최저가 항공권을 선택하여 예약을 진행해
5. 항공권 선택 후 예약 페이지에 접속되었는지 확인 후 해당 페이지에서 동작 안정성을 위해 3초대기.
## 예약 절차 진행 (정보 입력):
6. **연락처 정보 입력**: 연락처 정보 입력 섹션에 다음 정보를 입력하십시오.
a. '영문 이름(First Name)' 필드에 `first_name`을 입력하십시오.
b. '영문 성(Last Name)' 필드에 `last_name`을 입력하십시오.
c. '이메일 주소' 필드에 `email`을 입력하십시오.
d. '거주 국가/지역' 드롭다운 버튼을 클릭한 후, 드롭다운의 검색창에 `country`를 입력하고, 드롭다운 목록에 나타나는 `country`의 라디오 버튼 또는 옵션을 한 번 클릭하여 선택하십시오.
e. '전화번호' 필드에 `phone_number`를 입력하십시오.
7. **페이지 스크롤**: 연락처 정보 입력 후, 웹 페이지 하단으로 스크롤하여 다음 단계로 넘어가십시오.
8. **탑승객 정보 (성인) 입력**: 이어서 탑승객 정보(성인) 섹션에 다음 정보를 입력하십시오.
* **성별**: '성별' 항목에서 `gender` 값에 해당하는 성별 라디오 버튼을 한 번 클릭하여 선택하십시오. (예: `gender`가 "남성"이면 '남성' 라디오 버튼 클릭)
* **영문 이름 및 영문 중간 이름**: '영문 이름 & 영문 중간 이름' 필드에 `first_name`을 입력하십시오. (중간 이름이 없다면 이름만 입력)
* **영문 성**: '영문 성(Last Name)' 필드에 `last_name`을 입력하십시오.
* **생년월일**: '생년월일' 섹션에 다음을 입력하십시오.
* '년도' 입력 필드에 `birth_date_year`을 입력하십시오.
* '월' 드롭다운 메뉴를 클릭하여 `birth_date_month`을 선택하십시오.
* '일' 입력 필드에 `birth_date_day`을 입력하십시오.
* **국적**: '국적' 드롭다운 버튼을 클릭한 후, 검색창에 `country`를 입력하고, 드롭다운 목록에 나타나는 `country` 라디오 버튼 또는 옵션을 한 번 클릭하여 선택하십시오.
* **선택 후, 국적 필드에 `country`가 올바르게 표시되는지 확인하고, 재선택하지 마십시오.**
* **여권 섹션**: (여권번호, 여권 발행 국적, 여권 만료일)
* **만약 여권 관련 정보 입력 항목 혹은 필드가 없다면 이 작업은 넘어가십시오!**
* '여권번호' 필드에 `passport_number`를 입력하십시오.
* '여권 발행 국가' 드롭다운 버튼을 클릭한 후, 검색창에 `country`를 입력하고, 드롭다운 목록에 나타나는 `country` 라디오 버튼 또는 옵션을 한 번 클릭하여 선택하십시오.
* **선택 후, 필드에 `country`가 올바르게 표시되는지 확인하고, 재선택하지 마십시오.**
* **여권 만료일**: '여권 만료일' 섹션에 다음을 입력하십시오.
* '년도' 입력 필드에 `passport_expire_date`의 연도 부분을 입력하십시오.
* '월' 드롭다운 버튼을 클릭하여 드롭다운 메뉴에서 `passport_expire_date`의 월 부분에 해당하는 라디오 버튼 또는 옵션을 한 번 클릭하여 선택하십시오.
* '일' 입력 필드에 `passport_expire_date`의 일 부분을 입력하십시오.
9. **최종 동의 및 진행**:
* 이용약관, 개인정보 처리방침 등의 모든 항목에 동의하는 체크박스를 클릭하세요.
* 동의 항목의 모든 체크박스가 체크되어 있는지 확인하십시오.
10. **부가서비스 및 여행 보험**:
* 부가서비스와 여행 보험 등의 관련 항목은 사용하지 않거나 기본으로 선택되있는 옵션으로 결제 페이지로 이동하십시오.
주의 사항!!
* 각 단계를 완료한 후, 현재 페이지 상태를 확인하여 모든 필드에 올바른 정보가 입력되었는지 **시각적으로 또는 DOM 요소 확인을 통해 명확히 검증하고** 다음 단계로 넘어가.
* 입력 필드에 한번 올바르게 입력했다면, 절대 같은 필드에 중복 입력하지 마.
* 각 입력필드에 올바르게 매칭되는 정보가 입력된지 확인해. (예: 카드번호에 CREDIT_CARD_NUMBER가 입력되었는지, 핸드폰 번호에 PHONE_NUMBER이 입력되었는지 확인)
* 의미가 불분명한 필드에는 절대 아무 정보도 입력하지 마.
* SENSITIVE_DATA의 값을 참조할 때는 `key` 형식을 사용하고, 실제 값은 LLM이 내부적으로 `sensitive_data` 딕셔너리에서 가져와 사용해야 해.
"""
llm = ChatAnthropic(
model="claude-sonnet-4-0",
)
browser = Browser()
async def main():
# 사용자입력 정보 추출 - 테스트용 예시값
departure = "Seoul"
arrival = "Tokyo"
depart_date = "2025-08-10"
return_date = "2025-08-20"
num_people = "1"
# TASK 동적 생성
TASK = make_task_prompt(departure, arrival, depart_date, return_date, num_people)
agent = Agent(
task=TASK,
llm=llm,
browser=browser,
sensitive_data=SENSITIVE_DATA,
)
await agent.run(
max_steps=100,
)
if __name__ == "__main__":
asyncio.run(main())