weco 0.2.19__tar.gz → 0.2.22__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. weco-0.2.22/.github/workflows/lint.yml +51 -0
  2. {weco-0.2.19 → weco-0.2.22}/PKG-INFO +110 -32
  3. {weco-0.2.19 → weco-0.2.22}/README.md +108 -31
  4. weco-0.2.22/assets/weco.svg +91 -0
  5. weco-0.2.22/examples/cuda/README.md +48 -0
  6. {weco-0.2.19 → weco-0.2.22}/examples/cuda/guide.md +0 -24
  7. weco-0.2.22/examples/hello-kernel-world/colab_notebook_walkthrough.ipynb +310 -0
  8. weco-0.2.22/examples/prompt/README.md +64 -0
  9. weco-0.2.22/examples/spaceship-titanic/README.md +46 -0
  10. weco-0.2.22/examples/spaceship-titanic/evaluate.py +75 -0
  11. weco-0.2.22/examples/spaceship-titanic/train.py +90 -0
  12. weco-0.2.22/examples/triton/README.md +49 -0
  13. {weco-0.2.19 → weco-0.2.22}/pyproject.toml +7 -2
  14. weco-0.2.22/weco/__init__.py +9 -0
  15. weco-0.2.22/weco/api.py +359 -0
  16. weco-0.2.22/weco/auth.py +225 -0
  17. weco-0.2.22/weco/chatbot.py +797 -0
  18. weco-0.2.22/weco/cli.py +200 -0
  19. weco-0.2.22/weco/optimizer.py +479 -0
  20. {weco-0.2.19 → weco-0.2.22}/weco/panels.py +59 -10
  21. {weco-0.2.19 → weco-0.2.22}/weco/utils.py +31 -3
  22. {weco-0.2.19 → weco-0.2.22}/weco.egg-info/PKG-INFO +110 -32
  23. {weco-0.2.19 → weco-0.2.22}/weco.egg-info/SOURCES.txt +5 -1
  24. {weco-0.2.19 → weco-0.2.22}/weco.egg-info/requires.txt +1 -0
  25. weco-0.2.19/.github/workflows/lint.yml +0 -50
  26. weco-0.2.19/examples/cuda/README.md +0 -40
  27. weco-0.2.19/examples/prompt/README.md +0 -51
  28. weco-0.2.19/examples/spaceship-titanic/README.md +0 -42
  29. weco-0.2.19/examples/spaceship-titanic/evaluate.py +0 -43
  30. weco-0.2.19/examples/spaceship-titanic/requirements-test.txt +0 -7
  31. weco-0.2.19/examples/triton/README.md +0 -38
  32. weco-0.2.19/weco/__init__.py +0 -15
  33. weco-0.2.19/weco/api.py +0 -162
  34. weco-0.2.19/weco/auth.py +0 -64
  35. weco-0.2.19/weco/cli.py +0 -756
  36. {weco-0.2.19 → weco-0.2.22}/.github/workflows/release.yml +0 -0
  37. {weco-0.2.19 → weco-0.2.22}/.gitignore +0 -0
  38. {weco-0.2.19 → weco-0.2.22}/.repomixignore +0 -0
  39. {weco-0.2.19 → weco-0.2.22}/LICENSE +0 -0
  40. {weco-0.2.19 → weco-0.2.22}/assets/example-optimization.gif +0 -0
  41. {weco-0.2.19 → weco-0.2.22}/examples/cuda/evaluate.py +0 -0
  42. {weco-0.2.19 → weco-0.2.22}/examples/cuda/optimize.py +0 -0
  43. {weco-0.2.19 → weco-0.2.22}/examples/hello-kernel-world/evaluate.py +0 -0
  44. {weco-0.2.19 → weco-0.2.22}/examples/hello-kernel-world/optimize.py +0 -0
  45. {weco-0.2.19 → weco-0.2.22}/examples/prompt/eval.py +0 -0
  46. {weco-0.2.19 → weco-0.2.22}/examples/prompt/optimize.py +0 -0
  47. {weco-0.2.19 → weco-0.2.22}/examples/prompt/prompt_guide.md +0 -0
  48. {weco-0.2.19 → weco-0.2.22}/examples/spaceship-titanic/competition_description.md +0 -0
  49. {weco-0.2.19 → weco-0.2.22}/examples/spaceship-titanic/data/sample_submission.csv +0 -0
  50. {weco-0.2.19 → weco-0.2.22}/examples/spaceship-titanic/data/test.csv +0 -0
  51. {weco-0.2.19 → weco-0.2.22}/examples/spaceship-titanic/data/train.csv +0 -0
  52. {weco-0.2.19 → weco-0.2.22}/examples/triton/evaluate.py +0 -0
  53. {weco-0.2.19 → weco-0.2.22}/examples/triton/optimize.py +0 -0
  54. {weco-0.2.19 → weco-0.2.22}/setup.cfg +0 -0
  55. {weco-0.2.19 → weco-0.2.22}/weco.egg-info/dependency_links.txt +0 -0
  56. {weco-0.2.19 → weco-0.2.22}/weco.egg-info/entry_points.txt +0 -0
  57. {weco-0.2.19 → weco-0.2.22}/weco.egg-info/top_level.txt +0 -0
@@ -0,0 +1,51 @@
1
+ name: Lint and Format Code
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - dev
7
+ - main
8
+ pull_request: # Run on any pull request
9
+
10
+ jobs:
11
+ lint:
12
+ runs-on: ubuntu-latest
13
+
14
+ steps:
15
+ - name: Checkout code
16
+ uses: actions/checkout@v4
17
+ with:
18
+ token: ${{ secrets.GITHUB_TOKEN }}
19
+
20
+ - name: Set up Python
21
+ uses: actions/setup-python@v3
22
+ with:
23
+ python-version: "3.12.0"
24
+
25
+ - name: Install dependencies
26
+ run: |
27
+ python -m pip install --upgrade pip
28
+ pip install ruff
29
+
30
+ - name: Run Linter & Formatter
31
+ run: |
32
+ # Check if this is an external fork PR
33
+ if [[ "${{ github.event.pull_request.head.repo.full_name }}" != "${{ github.repository }}" ]] && [[ "${{ github.event_name }}" == "pull_request" ]]; then
34
+ echo "External fork PR detected. Running format check only."
35
+ ruff check .
36
+ ruff format --check .
37
+ else
38
+ echo "Internal PR or push event. Running format and commit."
39
+ ruff check . --fix
40
+ ruff format .
41
+
42
+ git config --local user.email "action@github.com"
43
+ git config --local user.name "GitHub Action"
44
+ git add -A
45
+ if git diff --exit-code --staged; then
46
+ echo "No changes to commit"
47
+ else
48
+ git commit -m "[GitHub Action] Lint and format code with Ruff"
49
+ git push https://${{ secrets.GITHUB_TOKEN }}@github.com/${{ github.repository }}
50
+ fi
51
+ fi
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: weco
3
- Version: 0.2.19
3
+ Version: 0.2.22
4
4
  Summary: Documentation for `weco`, a CLI for using Weco AI's code optimizer.
5
5
  Author-email: Weco AI Team <contact@weco.ai>
6
6
  License: MIT
@@ -15,6 +15,7 @@ License-File: LICENSE
15
15
  Requires-Dist: requests
16
16
  Requires-Dist: rich
17
17
  Requires-Dist: packaging
18
+ Requires-Dist: gitingest
18
19
  Provides-Extra: dev
19
20
  Requires-Dist: ruff; extra == "dev"
20
21
  Requires-Dist: build; extra == "dev"
@@ -23,12 +24,18 @@ Dynamic: license-file
23
24
 
24
25
  <div align="center">
25
26
 
26
- # Weco: The Platform for Self-Improving Code
27
+ <div align="center">
28
+ <img src="assets/weco.svg" alt="Weco Logo" width="120" height="120" style="margin-bottom: 20px;">
29
+ <h1>Weco: The Platform for Self-Improving Code</h1>
30
+ </div>
27
31
 
28
32
  [![Python](https://img.shields.io/badge/Python-3.8.0+-blue)](https://www.python.org)
29
33
  [![docs](https://img.shields.io/website?url=https://docs.weco.ai/&label=docs)](https://docs.weco.ai/)
30
34
  [![PyPI version](https://badge.fury.io/py/weco.svg)](https://badge.fury.io/py/weco)
31
35
  [![AIDE](https://img.shields.io/badge/AI--Driven_Exploration-arXiv-orange?style=flat-square&logo=arxiv)](https://arxiv.org/abs/2502.13138)
36
+ [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/WecoAI/weco-cli/blob/main/examples/hello-kernel-world/colab_notebook_walkthrough.ipynb)
37
+
38
+ `pip install weco`
32
39
 
33
40
  </div>
34
41
 
@@ -48,7 +55,7 @@ Example applications include:
48
55
 
49
56
  ## Overview
50
57
 
51
- The `weco` CLI leverages a tree search approach guided by Large Language Models (LLMs) to iteratively explore and refine your code. It automatically applies changes, runs your evaluation script, parses the results, and proposes further improvements based on the specified goal.
58
+ The `weco` CLI leverages a tree search approach guided by LLMs to iteratively explore and refine your code. It automatically applies changes, runs your evaluation script, parses the results, and proposes further improvements based on the specified goal.
52
59
 
53
60
  ![image](https://github.com/user-attachments/assets/a6ed63fa-9c40-498e-aa98-a873e5786509)
54
61
 
@@ -64,28 +71,48 @@ The `weco` CLI leverages a tree search approach guided by Large Language Models
64
71
 
65
72
  2. **Set Up LLM API Keys (Required):**
66
73
 
67
- `weco` requires API keys for the Large Language Models (LLMs) it uses internally. You **must** provide these keys via environment variables:
74
+ `weco` requires API keys for the LLMs it uses internally. You **must** provide these keys via environment variables:
68
75
 
69
- - **OpenAI:** `export OPENAI_API_KEY="your_key_here"`
70
- - **Anthropic:** `export ANTHROPIC_API_KEY="your_key_here"`
71
- - **Google DeepMind:** `export GEMINI_API_KEY="your_key_here"` (Google AI Studio has a free API usage quota. Create a key [here](https://aistudio.google.com/apikey) to use `weco` for free.)
76
+ - **OpenAI:** `export OPENAI_API_KEY="your_key_here"` (Create your API key [here](https://platform.openai.com/api-keys))
77
+ - **Anthropic:** `export ANTHROPIC_API_KEY="your_key_here"` (Create your API key [here](https://console.anthropic.com/settings/keys))
78
+ - **Google:** `export GEMINI_API_KEY="your_key_here"` (Google AI Studio has a free API usage quota. Create your API key [here](https://aistudio.google.com/apikey) to use `weco` for free.)
72
79
 
73
80
  ---
74
81
 
75
82
  ## Get Started
76
83
 
84
+ ### Quick Start (Recommended for New Users)
85
+
86
+ The easiest way to get started with Weco is to use the **interactive copilot**. Simply navigate to your project directory and run:
87
+
88
+ ```bash
89
+ weco
90
+ ```
91
+
92
+ Or specify a project path:
93
+
94
+ ```bash
95
+ weco /path/to/your/project
96
+ ```
97
+
98
+ This launches Weco's interactive copilot that will:
99
+
100
+ 1. **Analyze your codebase** using AI to understand your project structure and identify optimization opportunities
101
+ 2. **Suggest specific optimizations** tailored to your code (e.g., GPU kernel optimization, model improvements, prompt engineering)
102
+ 3. **Generate evaluation scripts** automatically or help you configure existing ones
103
+ 4. **Set up the complete optimization pipeline** with appropriate metrics and commands
104
+ 5. **Run the optimization** or provide you with the exact command to execute
105
+
77
106
  <div style="background-color: #fff3cd; border: 1px solid #ffeeba; padding: 15px; border-radius: 4px; margin-bottom: 15px;">
78
107
  <strong>⚠️ Warning: Code Modification</strong><br>
79
108
  <code>weco</code> directly modifies the file specified by <code>--source</code> during the optimization process. It is <strong>strongly recommended</strong> to use version control (like Git) to track changes and revert if needed. Alternatively, ensure you have a backup of your original file before running the command. Upon completion, the file will contain the best-performing version of the code found during the run.
80
109
  </div>
81
110
 
82
- ---
111
+ ### Manual Setup
83
112
 
84
- **Example: Optimizing Simple PyTorch Operations**
85
-
86
- This basic example shows how to optimize a simple PyTorch function for speedup.
113
+ **Configure optimization parameters yourself** - If you need precise control over the optimization parameters, you can use the direct `weco run` command:
87
114
 
88
- For more advanced examples, including [Triton](/examples/triton/README.md), [CUDA kernel optimization](/examples/cuda/README.md), [ML model optimization](/examples/spaceship-titanic/README.md), and [prompt engineering for math problems](https://github.com/WecoAI/weco-cli/tree/main/examples/prompt), please see the `README.md` files within the corresponding subdirectories under the [`examples/`](./examples/) folder.
115
+ **Example: Optimizing Simple PyTorch Operations**
89
116
 
90
117
  ```bash
91
118
  # Navigate to the example directory
@@ -94,7 +121,7 @@ cd examples/hello-kernel-world
94
121
  # Install dependencies
95
122
  pip install torch
96
123
 
97
- # Run Weco
124
+ # Run Weco with manual configuration
98
125
  weco run --source optimize.py \
99
126
  --eval-command "python evaluate.py --solution-path optimize.py --device cpu" \
100
127
  --metric speedup \
@@ -105,36 +132,87 @@ weco run --source optimize.py \
105
132
 
106
133
  **Note:** If you have an NVIDIA GPU, change the device in the `--eval-command` to `cuda`. If you are running this on Apple Silicon, set it to `mps`.
107
134
 
135
+ For more advanced examples, including [Triton](/examples/triton/README.md), [CUDA kernel optimization](/examples/cuda/README.md), [ML model optimization](/examples/spaceship-titanic/README.md), and [prompt engineering for math problems](examples/prompt/README.md), please see the `README.md` files within the corresponding subdirectories under the [`examples/`](examples/) folder.
136
+
108
137
  ---
109
138
 
110
139
  ### Arguments for `weco run`
111
140
 
112
141
  **Required:**
113
142
 
114
- | Argument | Description |
115
- | :------------------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
116
- | `-s, --source` | Path to the source code file that will be optimized (e.g., `optimize.py`). |
117
- | `-c, --eval-command`| Command to run for evaluating the code in `--source`. This command should print the target `--metric` and its value to the terminal (stdout/stderr). See note below. |
118
- | `-m, --metric` | The name of the metric you want to optimize (e.g., 'accuracy', 'speedup', 'loss'). This metric name should match what's printed by your `--eval-command`. |
119
- | `-g, --goal` | `maximize`/`max` to maximize the `--metric` or `minimize`/`min` to minimize it. |
143
+ | Argument | Description | Example |
144
+ | :------------------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :-------------------- |
145
+ | `-s, --source` | Path to the source code file that will be optimized. | `-s model.py` |
146
+ | `-c, --eval-command`| Command to run for evaluating the code in `--source`. This command should print the target `--metric` and its value to the terminal (stdout/stderr). See note below. | `-c "python eval.py"` |
147
+ | `-m, --metric` | The name of the metric you want to optimize (e.g., 'accuracy', 'speedup', 'loss'). This metric name does not need to match what's printed by your `--eval-command` exactly (e.g., its okay to use "speedup" instead of "Speedup:"). | `-m speedup` |
148
+ | `-g, --goal` | `maximize`/`max` to maximize the `--metric` or `minimize`/`min` to minimize it. | `-g maximize` |
120
149
 
121
150
  <br>
122
151
 
123
152
  **Optional:**
124
153
 
125
- | Argument | Description | Default |
126
- | :----------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :------ |
127
- | `-n, --steps` | Number of optimization steps (LLM iterations) to run. | 100 |
128
- | `-M, --model` | Model identifier for the LLM to use (e.g., `gpt-4o`, `claude-3.5-sonnet`). | `o4-mini` when `OPENAI_API_KEY` is set; `claude-3-7-sonnet-20250219` when `ANTHROPIC_API_KEY` is set; `gemini-2.5-pro-exp-03-25` when `GEMINI_API_KEY` is set (priority: `OPENAI_API_KEY` > `ANTHROPIC_API_KEY` > `GEMINI_API_KEY`). |
129
- | `-i, --additional-instructions`| Natural language description of specific instructions **or** path to a file containing detailed instructions to guide the LLM. | `None` |
130
- | `-l, --log-dir` | Path to the directory to log intermediate steps and final optimization result. | `.runs/` |
154
+ | Argument | Description | Default | Example |
155
+ | :----------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------ | :------------------ |
156
+ | `-n, --steps` | Number of optimization steps (LLM iterations) to run. | 100 | `-n 50` |
157
+ | `-M, --model` | Model identifier for the LLM to use (e.g., `o4-mini`, `claude-sonnet-4-0`). | `o4-mini` when `OPENAI_API_KEY` is set; `claude-sonnet-4-0` when `ANTHROPIC_API_KEY` is set; `gemini-2.5-pro` when `GEMINI_API_KEY` is set. | `-M o4-mini` |
158
+ | `-i, --additional-instructions`| Natural language description of specific instructions **or** path to a file containing detailed instructions to guide the LLM. | `None` | `-i instructions.md` or `-i "Optimize the model for faster inference"`|
159
+ | `-l, --log-dir` | Path to the directory to log intermediate steps and final optimization result. | `.runs/` | `-l ./logs/` |
131
160
 
132
161
  ---
133
162
 
134
- ### Weco Dashboard
135
- To associate your optimization runs with your Weco account and view them on the Weco dashboard, you can log in. `weco` uses a device authentication flow
163
+ ### Authentication & Dashboard
164
+
165
+ Weco offers both **anonymous** and **authenticated** usage:
166
+
167
+ #### Anonymous Usage
168
+ You can use Weco without creating an account by providing LLM API keys via environment variables. This is perfect for trying out Weco or for users who prefer not to create accounts.
169
+
170
+ #### Authenticated Usage (Recommended)
171
+ To save your optimization runs and view them on the Weco dashboard, you can log in using Weco's secure device authentication flow:
172
+
173
+ 1. **During onboarding**: When you run `weco` for the first time, you'll be prompted to log in or skip
174
+ 2. **Manual login**: Use `weco logout` to clear credentials, then run `weco` again to re-authenticate
175
+ 3. **Device flow**: Weco will open your browser automatically and guide you through a secure OAuth-style authentication
176
+
136
177
  ![image (16)](https://github.com/user-attachments/assets/8a0a285b-4894-46fa-b6a2-4990017ca0c6)
137
178
 
179
+ **Benefits of authenticated usage:**
180
+ - **Run history**: View all your optimization runs on the Weco dashboard
181
+ - **Progress tracking**: Monitor long-running optimizations remotely
182
+ - **Enhanced support**: Get better assistance with your optimization challenges
183
+
184
+ ---
185
+
186
+ ## Command Reference
187
+
188
+ ### Basic Usage Patterns
189
+
190
+ | Command | Description | When to Use |
191
+ |---------|-------------|-------------|
192
+ | `weco` | Launch interactive onboarding | **Recommended for beginners** - Analyzes your codebase and guides you through setup |
193
+ | `weco /path/to/project` | Launch onboarding for specific project | When working with a project in a different directory |
194
+ | `weco run [options]` | Direct optimization execution | **For advanced users** - When you know exactly what to optimize and how |
195
+ | `weco logout` | Clear authentication credentials | To switch accounts or troubleshoot authentication issues |
196
+
197
+ ### Model Selection
198
+
199
+ You can specify which LLM model to use with the `-M` or `--model` flag:
200
+
201
+ ```bash
202
+ # Use with onboarding
203
+ weco --model gpt-4o
204
+
205
+ # Use with direct execution
206
+ weco run --model claude-3.5-sonnet --source optimize.py [other options...]
207
+ ```
208
+
209
+ **Available models:**
210
+ - `gpt-4o`, `o4-mini` (requires `OPENAI_API_KEY`)
211
+ - `claude-3.5-sonnet`, `claude-sonnet-4-20250514` (requires `ANTHROPIC_API_KEY`)
212
+ - `gemini-2.5-pro` (requires `GEMINI_API_KEY`)
213
+
214
+ If no model is specified, Weco automatically selects the best available model based on your API keys.
215
+
138
216
  ---
139
217
 
140
218
  ### Performance & Expectations
@@ -171,16 +249,16 @@ Weco will parse this output to extract the numerical value (1.5 in this case) as
171
249
 
172
250
  ## Contributing
173
251
 
174
- We welcome contributions! To get started:
252
+ We welcome your contributions! To get started:
175
253
 
176
- 1. **Fork and Clone the Repository:**
254
+ 1. **Fork & Clone the Repository:**
177
255
 
178
256
  ```bash
179
257
  git clone https://github.com/WecoAI/weco-cli.git
180
258
  cd weco-cli
181
259
  ```
182
260
 
183
- 2. **Install Development Dependencies:**
261
+ 2. **Install Dependencies:**
184
262
 
185
263
  ```bash
186
264
  pip install -e ".[dev]"
@@ -192,8 +270,8 @@ We welcome contributions! To get started:
192
270
  git checkout -b feature/your-feature-name
193
271
  ```
194
272
 
195
- 4. **Make Your Changes:** Ensure your code adheres to our style guidelines and includes relevant tests.
273
+ 4. **Make Changes:** Ensure your code adheres to our style guidelines and includes relevant tests.
196
274
 
197
- 5. **Commit and Push** your changes, then open a pull request with a clear description of your enhancements.
275
+ 5. **Commit, Push & Open a PR**: Commit your changes, and open a pull request with a clear description of your enhancements.
198
276
 
199
277
  ---
@@ -1,11 +1,17 @@
1
1
  <div align="center">
2
2
 
3
- # Weco: The Platform for Self-Improving Code
3
+ <div align="center">
4
+ <img src="assets/weco.svg" alt="Weco Logo" width="120" height="120" style="margin-bottom: 20px;">
5
+ <h1>Weco: The Platform for Self-Improving Code</h1>
6
+ </div>
4
7
 
5
8
  [![Python](https://img.shields.io/badge/Python-3.8.0+-blue)](https://www.python.org)
6
9
  [![docs](https://img.shields.io/website?url=https://docs.weco.ai/&label=docs)](https://docs.weco.ai/)
7
10
  [![PyPI version](https://badge.fury.io/py/weco.svg)](https://badge.fury.io/py/weco)
8
11
  [![AIDE](https://img.shields.io/badge/AI--Driven_Exploration-arXiv-orange?style=flat-square&logo=arxiv)](https://arxiv.org/abs/2502.13138)
12
+ [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/WecoAI/weco-cli/blob/main/examples/hello-kernel-world/colab_notebook_walkthrough.ipynb)
13
+
14
+ `pip install weco`
9
15
 
10
16
  </div>
11
17
 
@@ -25,7 +31,7 @@ Example applications include:
25
31
 
26
32
  ## Overview
27
33
 
28
- The `weco` CLI leverages a tree search approach guided by Large Language Models (LLMs) to iteratively explore and refine your code. It automatically applies changes, runs your evaluation script, parses the results, and proposes further improvements based on the specified goal.
34
+ The `weco` CLI leverages a tree search approach guided by LLMs to iteratively explore and refine your code. It automatically applies changes, runs your evaluation script, parses the results, and proposes further improvements based on the specified goal.
29
35
 
30
36
  ![image](https://github.com/user-attachments/assets/a6ed63fa-9c40-498e-aa98-a873e5786509)
31
37
 
@@ -41,28 +47,48 @@ The `weco` CLI leverages a tree search approach guided by Large Language Models
41
47
 
42
48
  2. **Set Up LLM API Keys (Required):**
43
49
 
44
- `weco` requires API keys for the Large Language Models (LLMs) it uses internally. You **must** provide these keys via environment variables:
50
+ `weco` requires API keys for the LLMs it uses internally. You **must** provide these keys via environment variables:
45
51
 
46
- - **OpenAI:** `export OPENAI_API_KEY="your_key_here"`
47
- - **Anthropic:** `export ANTHROPIC_API_KEY="your_key_here"`
48
- - **Google DeepMind:** `export GEMINI_API_KEY="your_key_here"` (Google AI Studio has a free API usage quota. Create a key [here](https://aistudio.google.com/apikey) to use `weco` for free.)
52
+ - **OpenAI:** `export OPENAI_API_KEY="your_key_here"` (Create your API key [here](https://platform.openai.com/api-keys))
53
+ - **Anthropic:** `export ANTHROPIC_API_KEY="your_key_here"` (Create your API key [here](https://console.anthropic.com/settings/keys))
54
+ - **Google:** `export GEMINI_API_KEY="your_key_here"` (Google AI Studio has a free API usage quota. Create your API key [here](https://aistudio.google.com/apikey) to use `weco` for free.)
49
55
 
50
56
  ---
51
57
 
52
58
  ## Get Started
53
59
 
60
+ ### Quick Start (Recommended for New Users)
61
+
62
+ The easiest way to get started with Weco is to use the **interactive copilot**. Simply navigate to your project directory and run:
63
+
64
+ ```bash
65
+ weco
66
+ ```
67
+
68
+ Or specify a project path:
69
+
70
+ ```bash
71
+ weco /path/to/your/project
72
+ ```
73
+
74
+ This launches Weco's interactive copilot that will:
75
+
76
+ 1. **Analyze your codebase** using AI to understand your project structure and identify optimization opportunities
77
+ 2. **Suggest specific optimizations** tailored to your code (e.g., GPU kernel optimization, model improvements, prompt engineering)
78
+ 3. **Generate evaluation scripts** automatically or help you configure existing ones
79
+ 4. **Set up the complete optimization pipeline** with appropriate metrics and commands
80
+ 5. **Run the optimization** or provide you with the exact command to execute
81
+
54
82
  <div style="background-color: #fff3cd; border: 1px solid #ffeeba; padding: 15px; border-radius: 4px; margin-bottom: 15px;">
55
83
  <strong>⚠️ Warning: Code Modification</strong><br>
56
84
  <code>weco</code> directly modifies the file specified by <code>--source</code> during the optimization process. It is <strong>strongly recommended</strong> to use version control (like Git) to track changes and revert if needed. Alternatively, ensure you have a backup of your original file before running the command. Upon completion, the file will contain the best-performing version of the code found during the run.
57
85
  </div>
58
86
 
59
- ---
87
+ ### Manual Setup
60
88
 
61
- **Example: Optimizing Simple PyTorch Operations**
62
-
63
- This basic example shows how to optimize a simple PyTorch function for speedup.
89
+ **Configure optimization parameters yourself** - If you need precise control over the optimization parameters, you can use the direct `weco run` command:
64
90
 
65
- For more advanced examples, including [Triton](/examples/triton/README.md), [CUDA kernel optimization](/examples/cuda/README.md), [ML model optimization](/examples/spaceship-titanic/README.md), and [prompt engineering for math problems](https://github.com/WecoAI/weco-cli/tree/main/examples/prompt), please see the `README.md` files within the corresponding subdirectories under the [`examples/`](./examples/) folder.
91
+ **Example: Optimizing Simple PyTorch Operations**
66
92
 
67
93
  ```bash
68
94
  # Navigate to the example directory
@@ -71,7 +97,7 @@ cd examples/hello-kernel-world
71
97
  # Install dependencies
72
98
  pip install torch
73
99
 
74
- # Run Weco
100
+ # Run Weco with manual configuration
75
101
  weco run --source optimize.py \
76
102
  --eval-command "python evaluate.py --solution-path optimize.py --device cpu" \
77
103
  --metric speedup \
@@ -82,36 +108,87 @@ weco run --source optimize.py \
82
108
 
83
109
  **Note:** If you have an NVIDIA GPU, change the device in the `--eval-command` to `cuda`. If you are running this on Apple Silicon, set it to `mps`.
84
110
 
111
+ For more advanced examples, including [Triton](/examples/triton/README.md), [CUDA kernel optimization](/examples/cuda/README.md), [ML model optimization](/examples/spaceship-titanic/README.md), and [prompt engineering for math problems](examples/prompt/README.md), please see the `README.md` files within the corresponding subdirectories under the [`examples/`](examples/) folder.
112
+
85
113
  ---
86
114
 
87
115
  ### Arguments for `weco run`
88
116
 
89
117
  **Required:**
90
118
 
91
- | Argument | Description |
92
- | :------------------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
93
- | `-s, --source` | Path to the source code file that will be optimized (e.g., `optimize.py`). |
94
- | `-c, --eval-command`| Command to run for evaluating the code in `--source`. This command should print the target `--metric` and its value to the terminal (stdout/stderr). See note below. |
95
- | `-m, --metric` | The name of the metric you want to optimize (e.g., 'accuracy', 'speedup', 'loss'). This metric name should match what's printed by your `--eval-command`. |
96
- | `-g, --goal` | `maximize`/`max` to maximize the `--metric` or `minimize`/`min` to minimize it. |
119
+ | Argument | Description | Example |
120
+ | :------------------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :-------------------- |
121
+ | `-s, --source` | Path to the source code file that will be optimized. | `-s model.py` |
122
+ | `-c, --eval-command`| Command to run for evaluating the code in `--source`. This command should print the target `--metric` and its value to the terminal (stdout/stderr). See note below. | `-c "python eval.py"` |
123
+ | `-m, --metric` | The name of the metric you want to optimize (e.g., 'accuracy', 'speedup', 'loss'). This metric name does not need to match what's printed by your `--eval-command` exactly (e.g., its okay to use "speedup" instead of "Speedup:"). | `-m speedup` |
124
+ | `-g, --goal` | `maximize`/`max` to maximize the `--metric` or `minimize`/`min` to minimize it. | `-g maximize` |
97
125
 
98
126
  <br>
99
127
 
100
128
  **Optional:**
101
129
 
102
- | Argument | Description | Default |
103
- | :----------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :------ |
104
- | `-n, --steps` | Number of optimization steps (LLM iterations) to run. | 100 |
105
- | `-M, --model` | Model identifier for the LLM to use (e.g., `gpt-4o`, `claude-3.5-sonnet`). | `o4-mini` when `OPENAI_API_KEY` is set; `claude-3-7-sonnet-20250219` when `ANTHROPIC_API_KEY` is set; `gemini-2.5-pro-exp-03-25` when `GEMINI_API_KEY` is set (priority: `OPENAI_API_KEY` > `ANTHROPIC_API_KEY` > `GEMINI_API_KEY`). |
106
- | `-i, --additional-instructions`| Natural language description of specific instructions **or** path to a file containing detailed instructions to guide the LLM. | `None` |
107
- | `-l, --log-dir` | Path to the directory to log intermediate steps and final optimization result. | `.runs/` |
130
+ | Argument | Description | Default | Example |
131
+ | :----------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------ | :------------------ |
132
+ | `-n, --steps` | Number of optimization steps (LLM iterations) to run. | 100 | `-n 50` |
133
+ | `-M, --model` | Model identifier for the LLM to use (e.g., `o4-mini`, `claude-sonnet-4-0`). | `o4-mini` when `OPENAI_API_KEY` is set; `claude-sonnet-4-0` when `ANTHROPIC_API_KEY` is set; `gemini-2.5-pro` when `GEMINI_API_KEY` is set. | `-M o4-mini` |
134
+ | `-i, --additional-instructions`| Natural language description of specific instructions **or** path to a file containing detailed instructions to guide the LLM. | `None` | `-i instructions.md` or `-i "Optimize the model for faster inference"`|
135
+ | `-l, --log-dir` | Path to the directory to log intermediate steps and final optimization result. | `.runs/` | `-l ./logs/` |
108
136
 
109
137
  ---
110
138
 
111
- ### Weco Dashboard
112
- To associate your optimization runs with your Weco account and view them on the Weco dashboard, you can log in. `weco` uses a device authentication flow
139
+ ### Authentication & Dashboard
140
+
141
+ Weco offers both **anonymous** and **authenticated** usage:
142
+
143
+ #### Anonymous Usage
144
+ You can use Weco without creating an account by providing LLM API keys via environment variables. This is perfect for trying out Weco or for users who prefer not to create accounts.
145
+
146
+ #### Authenticated Usage (Recommended)
147
+ To save your optimization runs and view them on the Weco dashboard, you can log in using Weco's secure device authentication flow:
148
+
149
+ 1. **During onboarding**: When you run `weco` for the first time, you'll be prompted to log in or skip
150
+ 2. **Manual login**: Use `weco logout` to clear credentials, then run `weco` again to re-authenticate
151
+ 3. **Device flow**: Weco will open your browser automatically and guide you through a secure OAuth-style authentication
152
+
113
153
  ![image (16)](https://github.com/user-attachments/assets/8a0a285b-4894-46fa-b6a2-4990017ca0c6)
114
154
 
155
+ **Benefits of authenticated usage:**
156
+ - **Run history**: View all your optimization runs on the Weco dashboard
157
+ - **Progress tracking**: Monitor long-running optimizations remotely
158
+ - **Enhanced support**: Get better assistance with your optimization challenges
159
+
160
+ ---
161
+
162
+ ## Command Reference
163
+
164
+ ### Basic Usage Patterns
165
+
166
+ | Command | Description | When to Use |
167
+ |---------|-------------|-------------|
168
+ | `weco` | Launch interactive onboarding | **Recommended for beginners** - Analyzes your codebase and guides you through setup |
169
+ | `weco /path/to/project` | Launch onboarding for specific project | When working with a project in a different directory |
170
+ | `weco run [options]` | Direct optimization execution | **For advanced users** - When you know exactly what to optimize and how |
171
+ | `weco logout` | Clear authentication credentials | To switch accounts or troubleshoot authentication issues |
172
+
173
+ ### Model Selection
174
+
175
+ You can specify which LLM model to use with the `-M` or `--model` flag:
176
+
177
+ ```bash
178
+ # Use with onboarding
179
+ weco --model gpt-4o
180
+
181
+ # Use with direct execution
182
+ weco run --model claude-3.5-sonnet --source optimize.py [other options...]
183
+ ```
184
+
185
+ **Available models:**
186
+ - `gpt-4o`, `o4-mini` (requires `OPENAI_API_KEY`)
187
+ - `claude-3.5-sonnet`, `claude-sonnet-4-20250514` (requires `ANTHROPIC_API_KEY`)
188
+ - `gemini-2.5-pro` (requires `GEMINI_API_KEY`)
189
+
190
+ If no model is specified, Weco automatically selects the best available model based on your API keys.
191
+
115
192
  ---
116
193
 
117
194
  ### Performance & Expectations
@@ -148,16 +225,16 @@ Weco will parse this output to extract the numerical value (1.5 in this case) as
148
225
 
149
226
  ## Contributing
150
227
 
151
- We welcome contributions! To get started:
228
+ We welcome your contributions! To get started:
152
229
 
153
- 1. **Fork and Clone the Repository:**
230
+ 1. **Fork & Clone the Repository:**
154
231
 
155
232
  ```bash
156
233
  git clone https://github.com/WecoAI/weco-cli.git
157
234
  cd weco-cli
158
235
  ```
159
236
 
160
- 2. **Install Development Dependencies:**
237
+ 2. **Install Dependencies:**
161
238
 
162
239
  ```bash
163
240
  pip install -e ".[dev]"
@@ -169,8 +246,8 @@ We welcome contributions! To get started:
169
246
  git checkout -b feature/your-feature-name
170
247
  ```
171
248
 
172
- 4. **Make Your Changes:** Ensure your code adheres to our style guidelines and includes relevant tests.
249
+ 4. **Make Changes:** Ensure your code adheres to our style guidelines and includes relevant tests.
173
250
 
174
- 5. **Commit and Push** your changes, then open a pull request with a clear description of your enhancements.
251
+ 5. **Commit, Push & Open a PR**: Commit your changes, and open a pull request with a clear description of your enhancements.
175
252
 
176
253
  ---
@@ -0,0 +1,91 @@
1
+ <svg viewBox="457.34072022160666 394.2 109.83379501385042 113.4" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" data-name="Слой 1" id="_Слой_1" style="max-height: 500px" width="109.83379501385042" height="113.4">
2
+ <defs>
3
+ <style>
4
+ .cls-1 {
5
+ fill: url(#_Безымянный_градиент_8);
6
+ }
7
+
8
+ .cls-1, .cls-2, .cls-3, .cls-4, .cls-5, .cls-6, .cls-7, .cls-8, .cls-9 {
9
+ stroke-width: 0px;
10
+ }
11
+
12
+ .cls-1, .cls-2, .cls-3, .cls-5, .cls-6, .cls-7, .cls-8 {
13
+ fill-rule: evenodd;
14
+ }
15
+
16
+ .cls-2 {
17
+ fill: url(#_Безымянный_градиент_13);
18
+ }
19
+
20
+ .cls-3 {
21
+ fill: url(#_Безымянный_градиент_10);
22
+ }
23
+
24
+ .cls-4 {
25
+ fill: url(#_Безымянный_градиент_182);
26
+ }
27
+
28
+ .cls-5 {
29
+ fill: url(#_Безымянный_градиент_182-2);
30
+ }
31
+
32
+ .cls-6 {
33
+ fill: url(#_Безымянный_градиент_10-4);
34
+ }
35
+
36
+ .cls-7 {
37
+ fill: url(#_Безымянный_градиент_10-3);
38
+ }
39
+
40
+ .cls-8 {
41
+ fill: url(#_Безымянный_градиент_10-2);
42
+ }
43
+ </style>
44
+ <linearGradient gradientUnits="userSpaceOnUse" gradientTransform="translate(1103.6 -1390.4) rotate(45)" y2="1722.82" x2="894.85" y1="1722.82" x1="835.17" data-name="Безымянный градиент 10" id="_Безымянный_градиент_10">
45
+ <stop stop-color="#f99d24" offset="0"/>
46
+ <stop stop-color="#ff3c82" offset=".47"/>
47
+ <stop stop-color="#c649b6" offset=".69"/>
48
+ <stop stop-color="#9854e1" offset=".9"/>
49
+ <stop stop-color="#8759f2" offset="1"/>
50
+ </linearGradient>
51
+ <linearGradient gradientUnits="userSpaceOnUse" gradientTransform="translate(1103.6 -1390.4) rotate(45)" y2="1736.49" x2="882.93" y1="1736.49" x1="845.28" data-name="Безымянный градиент 13" id="_Безымянный_градиент_13">
52
+ <stop stop-color="#ff3c82" offset="0"/>
53
+ <stop stop-color="#fd3c83" offset="0"/>
54
+ <stop stop-color="#be4bbe" offset=".48"/>
55
+ <stop stop-color="#9655e3" offset=".82"/>
56
+ <stop stop-color="#8759f2" offset="1"/>
57
+ </linearGradient>
58
+ <linearGradient xlink:href="#_Безымянный_градиент_10" y2="1733.25" x2="930.17" y1="1733.25" x1="858.98" data-name="Безымянный градиент 10" id="_Безымянный_градиент_10-2"/>
59
+ <linearGradient xlink:href="#_Безымянный_градиент_10" y2="1699.44" x2="913.44" y1="1742.08" x1="913.44" data-name="Безымянный градиент 10" id="_Безымянный_градиент_10-3"/>
60
+ <linearGradient gradientUnits="userSpaceOnUse" gradientTransform="translate(1103.6 -1390.4) rotate(45)" y2="1664.98" x2="888.71" y1="1736.43" x1="888.71" data-name="Безымянный градиент 8" id="_Безымянный_градиент_8">
61
+ <stop stop-color="#8759f2" offset="0"/>
62
+ <stop stop-color="#9854e1" offset=".1"/>
63
+ <stop stop-color="#c649b6" offset=".31"/>
64
+ <stop stop-color="#ff3c82" offset=".53"/>
65
+ <stop stop-color="#f99d24" offset="1"/>
66
+ </linearGradient>
67
+ <linearGradient xlink:href="#_Безымянный_градиент_10" y2="1674.57" x2="886.51" y1="1702.9" x1="858.19" data-name="Безымянный градиент 10" id="_Безымянный_градиент_10-4"/>
68
+ <linearGradient gradientUnits="userSpaceOnUse" gradientTransform="translate(2223.51 -436.72) rotate(90)" y2="1711.15" x2="875.01" y1="1711.15" x1="875.01" data-name="Безымянный градиент 182" id="_Безымянный_градиент_182">
69
+ <stop stop-color="#4629bb" offset="0"/>
70
+ <stop stop-color="#cf77c1" offset="1"/>
71
+ </linearGradient>
72
+ <linearGradient xlink:href="#_Безымянный_градиент_182" gradientTransform="translate(1103.6 -1390.4) rotate(45)" y2="1717.03" x2="857.73" y1="1717.03" x1="856.1" data-name="Безымянный градиент 182" id="_Безымянный_градиент_182-2"/>
73
+ </defs>
74
+ <path d="M537.85,440.86c-3.78,3.48-8.57,6.37-14.29,8.63-1.58-1.99-3.35-3.96-5.29-5.91-1.94-1.94-3.91-3.71-5.9-5.29h0s0,0,0,0c-4.82-3.83-9.71-6.53-14.62-8.06h0c-.46-.15-.91-.28-1.37-.4-.65-.18-1.3-.29-1.95-.35-.02,0-.03,0-.05,0-14.05-2.04-26.22,6.4-28.64,19.29-1.28-4.77-1.33-9.86-.01-14.77,4.07-15.2,19.75-24.25,34.95-20.18,1.88.5,3.76,1.13,5.63,1.86,5.01,1.97,9.92,4.75,14.69,8.33,3.07,2.3,6.08,4.92,9.01,7.85,2.93,2.93,5.55,5.94,7.85,9.01Z" class="cls-3"/>
75
+ <path d="M491.71,470.14c-1.99-.3-3.93-.7-5.81-1.2-4.84-1.3-9.26-3.84-12.78-7.37-3.6-3.6-6.1-8.04-7.38-12.81,2.41-12.89,14.59-21.33,28.64-19.29-5.68-.52-11.11,3.11-12.63,8.81-1.1,4.11.09,8.54,3.1,11.56,1.47,1.47,3.32,2.53,5.34,3.08.46.12.92.24,1.38.34-.71,5.92-.67,11.56.13,16.88Z" class="cls-2"/>
76
+ <path d="M536.42,492.25c-2.58,1.74-5.46,3.05-8.56,3.88-9.82,2.63-20.38-.2-27.58-7.4-3.53-3.53-6.07-7.94-7.37-12.78-.5-1.88-.9-3.82-1.2-5.8,0,0,0,0,0,0-.8-5.33-.84-10.96-.13-16.88.46-3.81,1.22-7.73,2.29-11.73,1.07-4,2.37-7.77,3.88-11.3,4.91,1.53,9.8,4.23,14.62,8.06h0c-.93,2.36-1.76,4.87-2.47,7.53-.71,2.66-1.26,5.25-1.63,7.76,0,0,0,0,0,0-.9,6.09-.8,11.67.32,16.69h0c.1.47.22.93.34,1.38,1.31,12.42,15.82,24.79,27.48,20.59Z" class="cls-8"/>
77
+ <path d="M536.42,492.25c-11.67,4.2-26.17-8.17-27.48-20.59.54,2.03,1.61,3.87,3.08,5.34,3.02,3.02,7.45,4.21,11.56,3.1,3.08-.82,5.66-2.8,7.25-5.57,1.6-2.76,2.02-5.98,1.2-9.07-.12-.45-.26-.91-.4-1.37,5.48-2.35,10.35-5.2,14.56-8.56.74,1.87,1.36,3.75,1.86,5.63,1.97,7.36.96,15.05-2.85,21.65-2.21,3.83-5.21,7.02-8.77,9.42Z" class="cls-7"/>
78
+ <path d="M546.17,455.55h0c-4.21,3.36-9.07,6.21-14.56,8.56h0c-3.53,1.51-7.3,2.81-11.3,3.88-4,1.07-7.92,1.84-11.73,2.29-1.13-5.02-1.23-10.6-.32-16.69,2.51-.37,5.1-.91,7.76-1.63,2.65-.71,5.17-1.53,7.53-2.47h0c5.72-2.26,10.51-5.15,14.29-8.63.35-.32.69-.65,1.03-.99.52-.52.98-1.07,1.38-1.65,11.82-14.27,4.55-28.47-5.63-35.01,5.85.86,11.48,3.54,15.98,8.03,11.13,11.13,11.13,29.23,0,40.36-1.38,1.38-2.86,2.7-4.43,3.94Z" class="cls-1"/>
79
+ <path d="M540.26,438.22c3.22-4.66,2.76-11.1-1.38-15.24-4.66-4.66-12.24-4.66-16.9,0-.33.33-.66.68-.98,1.03-4.77-3.57-9.68-6.36-14.69-8.33,1.25-1.57,2.57-3.05,3.95-4.43,6.63-6.63,15.74-9.31,24.38-8.04h0c10.17,6.54,17.45,20.74,5.63,35.01Z" class="cls-6"/>
80
+ <rect transform="translate(-159.85 490.67) rotate(-45)" height="0" width="0" y="438.29" x="512.36" class="cls-4"/>
81
+ <path d="M496.38,429.83c-.66-.14-1.31-.26-1.95-.35" class="cls-5"/>
82
+ <g>
83
+ <g>
84
+ <path d="M610.02,478.03c-.16,0-.35-.1-.58-.29-.23-.19-.43-.45-.58-.76l-16.42-40.41c-.54-1.63-1.36-2.97-2.45-4.02-1.09-1.05-2.25-1.76-3.49-2.15-.7-.23-1.3-.52-1.8-.87-.51-.35-.76-.79-.76-1.34s.31-.87.93-.99c.62-.12,1.12-.17,1.51-.17,1.32,0,2.46.04,3.44.12.97.08,1.94.17,2.91.29.97.12,2.04.17,3.2.17,1.24,0,2.43-.06,3.55-.17,1.12-.12,2.23-.21,3.32-.29,1.09-.08,2.29-.12,3.61-.12.39,0,.89.08,1.51.23.62.16.93.47.93.93,0,.62-.29,1.07-.87,1.34-.58.27-1.18.56-1.8.87-.78.23-1.38.76-1.8,1.57-.43.82-.64,1.8-.64,2.97s.23,2.33.7,3.49l8.27,21.54c.08.23.23.35.47.35s.39-.12.47-.35l7.92-18.63c.31-.85.52-1.69.64-2.5.12-.82.17-1.61.17-2.39,0-1.4-.58-2.62-1.75-3.67-1.16-1.05-2.41-1.84-3.73-2.39-.7-.23-1.3-.5-1.8-.82-.51-.31-.76-.78-.76-1.4,0-.47.31-.78.93-.93.62-.15,1.2-.23,1.75-.23,1.4,0,2.83.1,4.31.29,1.47.2,3.1.29,4.89.29,2.17,0,4.08-.1,5.71-.29,1.63-.19,3.22-.29,4.77-.29.47,0,.99.08,1.57.23.58.16.87.51.87,1.05s-.29.97-.87,1.28c-.58.31-1.18.58-1.8.82-.86.31-1.65.74-2.39,1.28-.74.54-1.11,1.48-1.11,2.79,0,.62.06,1.26.17,1.92.12.66.33,1.34.64,2.04l8.15,20.96c.23.62.47.93.7.93s.47-.27.7-.82l8.04-19.21c.31-.7.52-1.49.64-2.39.12-.89.17-1.65.17-2.27,0-1.32-.41-2.43-1.22-3.32-.82-.89-1.69-1.49-2.62-1.8-.62-.23-1.22-.5-1.8-.82-.58-.31-.87-.78-.87-1.4,0-.47.31-.78.93-.93.62-.15,1.12-.23,1.51-.23,1.94,0,3.4.08,4.37.23.97.16,2.35.23,4.13.23,1.24,0,2.17-.04,2.79-.12.62-.08,1.22-.15,1.8-.23.58-.08,1.42-.12,2.5-.12.47,0,.99.06,1.57.17.58.12.87.45.87.99s-.25.99-.76,1.34c-.51.35-1.07.64-1.69.87-1.32.39-2.52,1.28-3.61,2.68-1.09,1.4-2.02,2.99-2.79,4.77l-16.07,39.01c-.31.62-.78.93-1.4.93-.47,0-.89-.31-1.28-.93l-12.93-31.21c-.16-.47-.35-.7-.58-.7s-.43.27-.58.82l-13.04,31.09c-.31.7-.78,1.05-1.4,1.05Z" class="cls-9"/>
85
+ <path d="M688.04,476.75c-4.19,0-7.9-1.07-11.12-3.2-3.22-2.13-5.76-5.12-7.63-8.97-1.86-3.84-2.79-8.29-2.79-13.33,0-4.58,1.07-8.77,3.2-12.58,2.13-3.8,4.99-6.85,8.56-9.14,3.57-2.29,7.49-3.44,11.76-3.44,3.18,0,6.04.64,8.56,1.92,2.52,1.28,4.5,3.07,5.94,5.36,1.44,2.29,2.15,4.91,2.15,7.86,0,2.56-1.2,3.84-3.61,3.84h-24.11c-1.09,0-1.86.31-2.33.93-.47.62-.7,1.75-.7,3.38,0,3.42.78,6.54,2.33,9.37,1.55,2.83,3.61,5.11,6.17,6.81,2.56,1.71,5.39,2.56,8.5,2.56,2.33,0,4.44-.45,6.35-1.34,1.9-.89,3.67-2.15,5.3-3.78.23-.31.45-.54.64-.7.19-.15.41-.23.64-.23.7,0,1.05.43,1.05,1.28,0,1.24-.54,2.72-1.63,4.42-1.09,1.63-2.47,3.13-4.13,4.48-1.67,1.36-3.61,2.45-5.82,3.26-2.21.82-4.64,1.22-7.28,1.22ZM679.08,441.11h9.32c2.02,0,3.61-.04,4.77-.12,1.16-.08,2.25-.23,3.26-.47.39-.15.66-.48.82-.99.15-.5.23-1.15.23-1.92,0-2.17-.89-4.02-2.68-5.53-1.79-1.51-3.92-2.27-6.4-2.27-1.71,0-3.4.51-5.07,1.51-1.67,1.01-3.05,2.27-4.13,3.78-1.09,1.51-1.59,3.05-1.51,4.6,0,.93.47,1.4,1.4,1.4Z" class="cls-9"/>
86
+ <path d="M759.66,476.75c-3.96,0-7.53-1.03-10.71-3.09-3.18-2.06-5.71-4.87-7.57-8.44-1.86-3.57-2.79-7.57-2.79-11.99,0-5.05,1.12-9.63,3.38-13.74,2.25-4.11,5.28-7.37,9.08-9.78,3.8-2.41,7.99-3.61,12.58-3.61,5.51,0,10.25,1.59,14.21,4.77.85.78,1.28,1.51,1.28,2.21,0,.54-.29,1.22-.87,2.04-.58.82-1.28,1.51-2.1,2.1-.82.58-1.57.87-2.27.87-.47,0-.95-.15-1.46-.47-.51-.31-.99-.66-1.46-1.05-1.86-1.47-3.82-2.78-5.88-3.9-2.06-1.12-3.82-1.69-5.3-1.69-3.49,0-6.27,1.57-8.33,4.72-2.06,3.14-3.09,7.55-3.09,13.22,0,3.73.72,7.03,2.15,9.9,1.44,2.87,3.42,5.12,5.94,6.75,2.52,1.63,5.41,2.45,8.68,2.45,2.25,0,4.21-.37,5.88-1.11,1.67-.74,3.44-2,5.3-3.78.23-.15.48-.31.76-.47.27-.16.52-.23.76-.23.85,0,1.28.58,1.28,1.75,0,.39-.12.87-.35,1.46-.23.58-.58,1.22-1.05,1.92-1.09,1.55-2.52,3.05-4.31,4.48-1.79,1.44-3.84,2.58-6.17,3.44-2.33.85-4.85,1.28-7.57,1.28Z" class="cls-9"/>
87
+ <path d="M808.22,476.63c-4.43,0-8.44-1.03-12.05-3.09-3.61-2.06-6.46-4.87-8.56-8.44-2.1-3.57-3.14-7.65-3.14-12.23,0-3.42.66-6.71,1.98-9.9,1.32-3.18,3.18-6.06,5.59-8.62,2.41-2.56,5.2-4.6,8.38-6.11,3.18-1.51,6.6-2.27,10.25-2.27,4.58,0,8.73,1.11,12.46,3.32,3.73,2.21,6.68,5.11,8.85,8.68,2.17,3.57,3.26,7.49,3.26,11.76,0,4.66-1.01,9.05-3.03,13.16-2.02,4.12-5.03,7.43-9.02,9.96-4,2.52-8.99,3.78-14.96,3.78ZM810.67,472.55c2.25,0,4.27-.45,6.06-1.34,1.79-.89,3.18-2.27,4.19-4.13.93-1.79,1.57-3.98,1.92-6.58.35-2.6.52-5.26.52-7.98,0-3.88-.62-7.53-1.86-10.95-1.24-3.42-2.95-6.17-5.12-8.27-2.17-2.1-4.74-3.14-7.69-3.14-1.79,0-3.4.29-4.83.87-1.44.58-2.74,1.57-3.9,2.97-1.48,1.79-2.45,4.1-2.91,6.93-.47,2.83-.7,5.92-.7,9.26,0,3.73.62,7.3,1.86,10.71,1.24,3.42,2.93,6.21,5.07,8.38,2.13,2.17,4.6,3.26,7.39,3.26Z" class="cls-9"/>
88
+ </g>
89
+ <path d="M721.82,459.27c-1.9,0-3.57-.7-5-2.1-1.43-1.4-2.14-3.08-2.14-5.04,0-2.08.71-3.84,2.14-5.26,1.43-1.43,3.09-2.14,5-2.14,2.14,0,3.91.71,5.31,2.14,1.4,1.43,2.1,3.18,2.1,5.26,0,1.96-.7,3.64-2.1,5.04-1.4,1.4-3.17,2.1-5.31,2.1Z" class="cls-9"/>
90
+ </g>
91
+ </svg>