File size: 3,714 Bytes
c9803a3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
60c7a7f
 
 
 
 
 
c9803a3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
60c7a7f
 
 
 
 
 
 
 
 
c9803a3
 
 
 
60c7a7f
c9803a3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import argparse
import asyncio
import base64
import os
from pathlib import Path

from proxy_lite import Runner, RunnerConfig
from proxy_lite.gif_maker import create_run_gif
from proxy_lite.logger import logger


def update_config_from_env(config: RunnerConfig) -> RunnerConfig:
    if os.getenv("PROXY_LITE_API_BASE"):
        config.solver.agent.client.api_base = os.getenv("PROXY_LITE_API_BASE")
    if os.getenv("PROXY_LITE_MODEL"):
        config.solver.agent.client.model_id = os.getenv("PROXY_LITE_MODEL")
    viewport_width = os.getenv("PROXY_LITE_VIEWPORT_WIDTH")
    if viewport_width:
        config.environment.viewport_width = int(viewport_width)
    viewport_height = os.getenv("PROXY_LITE_VIEWPORT_HEIGHT")
    if viewport_height:
        config.environment.viewport_height = int(viewport_height)
    return config


def do_command(args):
    do_text = " ".join(args.task)
    logger.info("🤖 Let me help you with that...")
    # Take default config from YAML
    config = RunnerConfig.from_yaml(args.config)
    # Update config from environment variables
    config = update_config_from_env(config)
    # Update config from command-line arguments
    if args.api_base:
        config.solver.agent.client.api_base = args.api_base
    if args.model:
        config.solver.agent.client.model_id = args.model
    if args.homepage:
        config.environment.homepage = args.homepage
    if args.viewport_width:
        config.environment.viewport_width = args.viewport_width
    if args.viewport_height:
        config.environment.viewport_height = args.viewport_height
    o = Runner(config=config)
    result = asyncio.run(o.run(do_text))

    # Check if we have observations and info data
    if result.observations and result.observations[-1].info:
        final_screenshot = result.observations[-1].info["original_image"]
        folder_path = Path(__file__).parent.parent.parent / "screenshots"
        folder_path.mkdir(parents=True, exist_ok=True)
        path = folder_path / f"{result.run_id}.png"
        with open(path, "wb") as f:
            f.write(base64.b64decode(final_screenshot))
        logger.info(f"🤖 Final screenshot saved to {path}")

    gif_folder_path = Path(__file__).parent.parent.parent / "gifs"
    gif_folder_path.mkdir(parents=True, exist_ok=True)
    gif_path = gif_folder_path / f"{result.run_id}.gif"
    create_run_gif(result, str(gif_path), duration=1500)
    logger.info(f"🤖 GIF saved to {gif_path}")


def main():
    parser = argparse.ArgumentParser(description="Proxy-Lite")
    parser.add_argument(
        "task",
        type=str,
        help="The task you want to accomplish",
        nargs="*",
    )
    parser.add_argument(
        "--model",
        type=str,
        default=None,
        help="The model to use.",
    )
    parser.add_argument(
        "--api_base",
        type=str,
        default=None,
        help="The API base URL to use.",
    )
    # New option for setting a homepage URL:
    parser.add_argument(
        "--homepage",
        type=str,
        default=None,
        help="The homepage URL to use.",
    )
    # New viewport controls:
    parser.add_argument(
        "--viewport-width",
        type=int,
        default=None,
        help="Viewport width in pixels.",
    )
    parser.add_argument(
        "--viewport-height",
        type=int,
        default=None,
        help="Viewport height in pixels.",
    )
    parser.add_argument(
        "--config",
        type=Path,
        default=Path(__file__).parent / "configs/default.yaml",
        help="Path to config file (default: configs/default.yaml)",
    )

    args = parser.parse_args()
    do_command(args)


if __name__ == "__main__":
    main()