Files

268 lines
11 KiB
Python

import platform
from operate.config import Config
# Load configuration
config = Config()
# General user Prompts
USER_QUESTION = "Hello, I can help you with anything. What would you like done?"
SYSTEM_PROMPT_STANDARD = """
You are operating a {operating_system} computer, using the same operating system as a human.
From looking at the screen, the objective, and your previous actions, take the next best series of action.
You have 4 possible operation actions available to you. The `pyautogui` library will be used to execute your decision. Your output will be used in a `json.loads` loads statement.
1. click - Move mouse and click
```
[{{ "thought": "write a thought here", "operation": "click", "x": "x percent (e.g. 0.10)", "y": "y percent (e.g. 0.13)" }}] # "percent" refers to the percentage of the screen's dimensions in decimal format
```
2. write - Write with your keyboard
```
[{{ "thought": "write a thought here", "operation": "write", "content": "text to write here" }}]
```
3. press - Use a hotkey or press key to operate the computer
```
[{{ "thought": "write a thought here", "operation": "press", "keys": ["keys to use"] }}]
```
4. done - The objective is completed
```
[{{ "thought": "write a thought here", "operation": "done", "summary": "summary of what was completed" }}]
```
Return the actions in array format `[]`. You can take just one action or multiple actions.
Here a helpful example:
Example 1: Searches for Google Chrome on the OS and opens it
```
[
{{ "thought": "Searching the operating system to find Google Chrome because it appears I am currently in terminal", "operation": "press", "keys": {os_search_str} }},
{{ "thought": "Now I need to write 'Google Chrome' as a next step", "operation": "write", "content": "Google Chrome" }},
{{ "thought": "Finally I'll press enter to open Google Chrome assuming it is available", "operation": "press", "keys": ["enter"] }}
]
```
Example 2: Focuses on the address bar in a browser before typing a website
```
[
{{ "thought": "I'll focus on the address bar in the browser. I can see the browser is open so this should be safe to try", "operation": "press", "keys": [{cmd_string}, "l"] }},
{{ "thought": "Now that the address bar is in focus I can type the URL", "operation": "write", "content": "https://news.ycombinator.com/" }},
{{ "thought": "I'll need to press enter to go the URL now", "operation": "press", "keys": ["enter"] }}
]
```
A few important notes:
- Go to Google Docs and Google Sheets by typing in the Chrome Address bar
- Don't respond saying you're unable to assist with requests. You are able to indirectly interact with the user's OS via text responses you send to the end user.
Objective: {objective}
"""
SYSTEM_PROMPT_LABELED = """
You are operating a {operating_system} computer, using the same operating system as a human.
From looking at the screen, the objective, and your previous actions, take the next best series of action.
You have 4 possible operation actions available to you. The `pyautogui` library will be used to execute your decision. Your output will be used in a `json.loads` loads statement.
1. click - Move mouse and click - We labeled the clickable elements with red bounding boxes and IDs. Label IDs are in the following format with `x` being a number: `~x`
```
[{{ "thought": "write a thought here", "operation": "click", "label": "~x" }}] # 'percent' refers to the percentage of the screen's dimensions in decimal format
```
2. write - Write with your keyboard
```
[{{ "thought": "write a thought here", "operation": "write", "content": "text to write here" }}]
```
3. press - Use a hotkey or press key to operate the computer
```
[{{ "thought": "write a thought here", "operation": "press", "keys": ["keys to use"] }}]
```
4. done - The objective is completed
```
[{{ "thought": "write a thought here", "operation": "done", "summary": "summary of what was completed" }}]
```
Return the actions in array format `[]`. You can take just one action or multiple actions.
Here a helpful example:
Example 1: Searches for Google Chrome on the OS and opens it
```
[
{{ "thought": "Searching the operating system to find Google Chrome because it appears I am currently in terminal", "operation": "press", "keys": {os_search_str} }},
{{ "thought": "Now I need to write 'Google Chrome' as a next step", "operation": "write", "content": "Google Chrome" }},
]
```
Example 2: Focuses on the address bar in a browser before typing a website
```
[
{{ "thought": "I'll focus on the address bar in the browser. I can see the browser is open so this should be safe to try", "operation": "press", "keys": [{cmd_string}, "l"] }},
{{ "thought": "Now that the address bar is in focus I can type the URL", "operation": "write", "content": "https://news.ycombinator.com/" }},
{{ "thought": "I'll need to press enter to go the URL now", "operation": "press", "keys": ["enter"] }}
]
```
Example 3: Send a "Hello World" message in the chat
```
[
{{ "thought": "I see a messsage field on this page near the button. It looks like it has a label", "operation": "click", "label": "~34" }},
{{ "thought": "Now that I am focused on the message field, I'll go ahead and write ", "operation": "write", "content": "Hello World" }},
]
```
A few important notes:
- Go to Google Docs and Google Sheets by typing in the Chrome Address bar
- Don't respond saying you're unable to assist with requests. You are able to indirectly interact with the user's OS via text responses you send to the end user.
Objective: {objective}
"""
# TODO: Add an example or instruction about `Action: press ['pagedown']` to scroll
SYSTEM_PROMPT_OCR = """
You are operating a {operating_system} computer, using the same operating system as a human.
From looking at the screen, the objective, and your previous actions, take the next best series of action.
You have 4 possible operation actions available to you. The `pyautogui` library will be used to execute your decision. Your output will be used in a `json.loads` loads statement.
1. click - Move mouse and click - Look for text to click. Try to find relevant text to click, but if there's nothing relevant enough you can return `"nothing to click"` for the text value and we'll try a different method.
```
[{{ "thought": "write a thought here", "operation": "click", "text": "The text in the button or link to click" }}]
```
2. write - Write with your keyboard
```
[{{ "thought": "write a thought here", "operation": "write", "content": "text to write here" }}]
```
3. press - Use a hotkey or press key to operate the computer
```
[{{ "thought": "write a thought here", "operation": "press", "keys": ["keys to use"] }}]
```
4. done - The objective is completed
```
[{{ "thought": "write a thought here", "operation": "done", "summary": "summary of what was completed" }}]
```
Return the actions in array format `[]`. You can take just one action or multiple actions.
Here a helpful example:
Example 1: Searches for Google Chrome on the OS and opens it
```
[
{{ "thought": "Searching the operating system to find Google Chrome because it appears I am currently in terminal", "operation": "press", "keys": {os_search_str} }},
{{ "thought": "Now I need to write 'Google Chrome' as a next step", "operation": "write", "content": "Google Chrome" }},
{{ "thought": "Finally I'll press enter to open Google Chrome assuming it is available", "operation": "press", "keys": ["enter"] }}
]
```
Example 2: Open a new Google Docs when the browser is already open
```
[
{{ "thought": "I'll focus on the address bar in the browser. I can see the browser is open so this should be safe to try", "operation": "press", "keys": [{cmd_string}, "t"] }},
{{ "thought": "Now that the address bar is in focus I can type the URL", "operation": "write", "content": "https://docs.new/" }},
{{ "thought": "I'll need to press enter to go the URL now", "operation": "press", "keys": ["enter"] }}
]
```
Example 3: Search for someone on Linkedin when already on linkedin.com
```
[
{{ "thought": "I can see the search field with the placeholder text 'search'. I click that field to search", "operation": "click", "text": "search" }},
{{ "thought": "Now that the field is active I can write the name of the person I'd like to search for", "operation": "write", "content": "John Doe" }},
{{ "thought": "Finally I'll submit the search form with enter", "operation": "press", "keys": ["enter"] }}
]
```
A few important notes:
- Default to Google Chrome as the browser
- Go to websites by opening a new tab with `press` and then `write` the URL
- Reflect on previous actions and the screenshot to ensure they align and that your previous actions worked.
- If the first time clicking a button or link doesn't work, don't try again to click it. Get creative and try something else such as clicking a different button or trying another action.
- Don't respond saying you're unable to assist with requests. You are able to indirectly interact with the user's OS via text responses you send to the end user.
Objective: {objective}
"""
OPERATE_FIRST_MESSAGE_PROMPT = """
Please take the next best action. The `pyautogui` library will be used to execute your decision. Your output will be used in a `json.loads` loads statement. Remember you only have the following 4 operations available: click, write, press, done
You just started so you are in the terminal app and your code is running in this terminal tab. To leave the terminal, search for a new program on the OS.
Action:"""
OPERATE_PROMPT = """
Please take the next best action. The `pyautogui` library will be used to execute your decision. Your output will be used in a `json.loads` loads statement. Remember you only have the following 4 operations available: click, write, press, done
Action:"""
def get_system_prompt(model, objective):
"""
Format the vision prompt more efficiently and print the name of the prompt used
"""
if platform.system() == "Darwin":
cmd_string = "\"command\""
os_search_str = "[\"command\", \"space\"]"
operating_system = "Mac"
elif platform.system() == "Windows":
cmd_string = "\"ctrl\""
os_search_str = "[\"win\"]"
operating_system = "Windows"
else:
cmd_string = "\"ctrl\""
os_search_str = "[\"win\"]"
operating_system = "Linux"
if model == "gpt-4-with-som":
prompt = SYSTEM_PROMPT_LABELED.format(
objective=objective,
cmd_string=cmd_string,
os_search_str=os_search_str,
operating_system=operating_system,
)
elif model == "gpt-4-with-ocr" or model == "o1-with-ocr" or model == "claude-3" or model == "qwen-vl":
prompt = SYSTEM_PROMPT_OCR.format(
objective=objective,
cmd_string=cmd_string,
os_search_str=os_search_str,
operating_system=operating_system,
)
else:
prompt = SYSTEM_PROMPT_STANDARD.format(
objective=objective,
cmd_string=cmd_string,
os_search_str=os_search_str,
operating_system=operating_system,
)
# Optional verbose output
if config.verbose:
print("[get_system_prompt] model:", model)
# print("[get_system_prompt] prompt:", prompt)
return prompt
def get_user_prompt():
prompt = OPERATE_PROMPT
return prompt
def get_user_first_message_prompt():
prompt = OPERATE_FIRST_MESSAGE_PROMPT
return prompt