weco 0.2.20__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.
- weco-0.2.22/.github/workflows/lint.yml +51 -0
- {weco-0.2.20 → weco-0.2.22}/PKG-INFO +107 -32
- {weco-0.2.20 → weco-0.2.22}/README.md +105 -31
- weco-0.2.22/assets/weco.svg +91 -0
- weco-0.2.22/examples/cuda/README.md +48 -0
- {weco-0.2.20 → weco-0.2.22}/examples/cuda/guide.md +0 -24
- weco-0.2.22/examples/prompt/README.md +64 -0
- weco-0.2.22/examples/spaceship-titanic/README.md +46 -0
- weco-0.2.22/examples/spaceship-titanic/evaluate.py +75 -0
- weco-0.2.22/examples/spaceship-titanic/train.py +90 -0
- weco-0.2.22/examples/triton/README.md +49 -0
- {weco-0.2.20 → weco-0.2.22}/pyproject.toml +7 -2
- weco-0.2.22/weco/__init__.py +9 -0
- weco-0.2.22/weco/api.py +359 -0
- weco-0.2.22/weco/auth.py +225 -0
- weco-0.2.22/weco/chatbot.py +797 -0
- weco-0.2.22/weco/cli.py +200 -0
- weco-0.2.22/weco/optimizer.py +479 -0
- {weco-0.2.20 → weco-0.2.22}/weco/panels.py +46 -0
- {weco-0.2.20 → weco-0.2.22}/weco/utils.py +31 -3
- {weco-0.2.20 → weco-0.2.22}/weco.egg-info/PKG-INFO +107 -32
- {weco-0.2.20 → weco-0.2.22}/weco.egg-info/SOURCES.txt +4 -1
- {weco-0.2.20 → weco-0.2.22}/weco.egg-info/requires.txt +1 -0
- weco-0.2.20/.github/workflows/lint.yml +0 -50
- weco-0.2.20/examples/cuda/README.md +0 -40
- weco-0.2.20/examples/prompt/README.md +0 -51
- weco-0.2.20/examples/spaceship-titanic/README.md +0 -42
- weco-0.2.20/examples/spaceship-titanic/evaluate.py +0 -43
- weco-0.2.20/examples/spaceship-titanic/requirements-test.txt +0 -7
- weco-0.2.20/examples/triton/README.md +0 -38
- weco-0.2.20/weco/__init__.py +0 -15
- weco-0.2.20/weco/api.py +0 -146
- weco-0.2.20/weco/auth.py +0 -64
- weco-0.2.20/weco/cli.py +0 -714
- {weco-0.2.20 → weco-0.2.22}/.github/workflows/release.yml +0 -0
- {weco-0.2.20 → weco-0.2.22}/.gitignore +0 -0
- {weco-0.2.20 → weco-0.2.22}/.repomixignore +0 -0
- {weco-0.2.20 → weco-0.2.22}/LICENSE +0 -0
- {weco-0.2.20 → weco-0.2.22}/assets/example-optimization.gif +0 -0
- {weco-0.2.20 → weco-0.2.22}/examples/cuda/evaluate.py +0 -0
- {weco-0.2.20 → weco-0.2.22}/examples/cuda/optimize.py +0 -0
- {weco-0.2.20 → weco-0.2.22}/examples/hello-kernel-world/colab_notebook_walkthrough.ipynb +0 -0
- {weco-0.2.20 → weco-0.2.22}/examples/hello-kernel-world/evaluate.py +0 -0
- {weco-0.2.20 → weco-0.2.22}/examples/hello-kernel-world/optimize.py +0 -0
- {weco-0.2.20 → weco-0.2.22}/examples/prompt/eval.py +0 -0
- {weco-0.2.20 → weco-0.2.22}/examples/prompt/optimize.py +0 -0
- {weco-0.2.20 → weco-0.2.22}/examples/prompt/prompt_guide.md +0 -0
- {weco-0.2.20 → weco-0.2.22}/examples/spaceship-titanic/competition_description.md +0 -0
- {weco-0.2.20 → weco-0.2.22}/examples/spaceship-titanic/data/sample_submission.csv +0 -0
- {weco-0.2.20 → weco-0.2.22}/examples/spaceship-titanic/data/test.csv +0 -0
- {weco-0.2.20 → weco-0.2.22}/examples/spaceship-titanic/data/train.csv +0 -0
- {weco-0.2.20 → weco-0.2.22}/examples/triton/evaluate.py +0 -0
- {weco-0.2.20 → weco-0.2.22}/examples/triton/optimize.py +0 -0
- {weco-0.2.20 → weco-0.2.22}/setup.cfg +0 -0
- {weco-0.2.20 → weco-0.2.22}/weco.egg-info/dependency_links.txt +0 -0
- {weco-0.2.20 → weco-0.2.22}/weco.egg-info/entry_points.txt +0 -0
- {weco-0.2.20 → 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.
|
|
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,7 +24,10 @@ Dynamic: license-file
|
|
|
23
24
|
|
|
24
25
|
<div align="center">
|
|
25
26
|
|
|
26
|
-
|
|
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
|
[](https://www.python.org)
|
|
29
33
|
[](https://docs.weco.ai/)
|
|
@@ -51,7 +55,7 @@ Example applications include:
|
|
|
51
55
|
|
|
52
56
|
## Overview
|
|
53
57
|
|
|
54
|
-
The `weco` CLI leverages a tree search approach guided by
|
|
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.
|
|
55
59
|
|
|
56
60
|

|
|
57
61
|
|
|
@@ -67,28 +71,48 @@ The `weco` CLI leverages a tree search approach guided by Large Language Models
|
|
|
67
71
|
|
|
68
72
|
2. **Set Up LLM API Keys (Required):**
|
|
69
73
|
|
|
70
|
-
`weco` requires API keys for the
|
|
74
|
+
`weco` requires API keys for the LLMs it uses internally. You **must** provide these keys via environment variables:
|
|
71
75
|
|
|
72
|
-
- **OpenAI:** `export OPENAI_API_KEY="your_key_here"`
|
|
73
|
-
- **Anthropic:** `export ANTHROPIC_API_KEY="your_key_here"`
|
|
74
|
-
- **Google
|
|
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.)
|
|
75
79
|
|
|
76
80
|
---
|
|
77
81
|
|
|
78
82
|
## Get Started
|
|
79
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
|
+
|
|
80
106
|
<div style="background-color: #fff3cd; border: 1px solid #ffeeba; padding: 15px; border-radius: 4px; margin-bottom: 15px;">
|
|
81
107
|
<strong>⚠️ Warning: Code Modification</strong><br>
|
|
82
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.
|
|
83
109
|
</div>
|
|
84
110
|
|
|
85
|
-
|
|
111
|
+
### Manual Setup
|
|
86
112
|
|
|
87
|
-
**
|
|
113
|
+
**Configure optimization parameters yourself** - If you need precise control over the optimization parameters, you can use the direct `weco run` command:
|
|
88
114
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
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**
|
|
92
116
|
|
|
93
117
|
```bash
|
|
94
118
|
# Navigate to the example directory
|
|
@@ -97,7 +121,7 @@ cd examples/hello-kernel-world
|
|
|
97
121
|
# Install dependencies
|
|
98
122
|
pip install torch
|
|
99
123
|
|
|
100
|
-
# Run Weco
|
|
124
|
+
# Run Weco with manual configuration
|
|
101
125
|
weco run --source optimize.py \
|
|
102
126
|
--eval-command "python evaluate.py --solution-path optimize.py --device cpu" \
|
|
103
127
|
--metric speedup \
|
|
@@ -108,36 +132,87 @@ weco run --source optimize.py \
|
|
|
108
132
|
|
|
109
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`.
|
|
110
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
|
+
|
|
111
137
|
---
|
|
112
138
|
|
|
113
139
|
### Arguments for `weco run`
|
|
114
140
|
|
|
115
141
|
**Required:**
|
|
116
142
|
|
|
117
|
-
| Argument | Description |
|
|
118
|
-
| :------------------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
119
|
-
| `-s, --source` | Path to the source code file that will be optimized
|
|
120
|
-
| `-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. |
|
|
121
|
-
| `-m, --metric` | The name of the metric you want to optimize (e.g., 'accuracy', 'speedup', 'loss'). This metric name
|
|
122
|
-
| `-g, --goal`
|
|
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` |
|
|
123
149
|
|
|
124
150
|
<br>
|
|
125
151
|
|
|
126
152
|
**Optional:**
|
|
127
153
|
|
|
128
|
-
| Argument | Description | Default |
|
|
129
|
-
| :----------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
130
|
-
| `-n, --steps` | Number of optimization steps (LLM iterations) to run. | 100 |
|
|
131
|
-
| `-M, --model` | Model identifier for the LLM to use (e.g., `
|
|
132
|
-
| `-i, --additional-instructions`| Natural language description of specific instructions **or** path to a file containing detailed instructions to guide the LLM. | `None`
|
|
133
|
-
| `-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/` |
|
|
134
160
|
|
|
135
161
|
---
|
|
136
162
|
|
|
137
|
-
###
|
|
138
|
-
|
|
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
|
+
|
|
139
177
|

|
|
140
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
|
+
|
|
141
216
|
---
|
|
142
217
|
|
|
143
218
|
### Performance & Expectations
|
|
@@ -174,16 +249,16 @@ Weco will parse this output to extract the numerical value (1.5 in this case) as
|
|
|
174
249
|
|
|
175
250
|
## Contributing
|
|
176
251
|
|
|
177
|
-
We welcome contributions! To get started:
|
|
252
|
+
We welcome your contributions! To get started:
|
|
178
253
|
|
|
179
|
-
1. **Fork
|
|
254
|
+
1. **Fork & Clone the Repository:**
|
|
180
255
|
|
|
181
256
|
```bash
|
|
182
257
|
git clone https://github.com/WecoAI/weco-cli.git
|
|
183
258
|
cd weco-cli
|
|
184
259
|
```
|
|
185
260
|
|
|
186
|
-
2. **Install
|
|
261
|
+
2. **Install Dependencies:**
|
|
187
262
|
|
|
188
263
|
```bash
|
|
189
264
|
pip install -e ".[dev]"
|
|
@@ -195,8 +270,8 @@ We welcome contributions! To get started:
|
|
|
195
270
|
git checkout -b feature/your-feature-name
|
|
196
271
|
```
|
|
197
272
|
|
|
198
|
-
4. **Make
|
|
273
|
+
4. **Make Changes:** Ensure your code adheres to our style guidelines and includes relevant tests.
|
|
199
274
|
|
|
200
|
-
5. **Commit
|
|
275
|
+
5. **Commit, Push & Open a PR**: Commit your changes, and open a pull request with a clear description of your enhancements.
|
|
201
276
|
|
|
202
277
|
---
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
<div align="center">
|
|
2
2
|
|
|
3
|
-
|
|
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
|
[](https://www.python.org)
|
|
6
9
|
[](https://docs.weco.ai/)
|
|
@@ -28,7 +31,7 @@ Example applications include:
|
|
|
28
31
|
|
|
29
32
|
## Overview
|
|
30
33
|
|
|
31
|
-
The `weco` CLI leverages a tree search approach guided by
|
|
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.
|
|
32
35
|
|
|
33
36
|

|
|
34
37
|
|
|
@@ -44,28 +47,48 @@ The `weco` CLI leverages a tree search approach guided by Large Language Models
|
|
|
44
47
|
|
|
45
48
|
2. **Set Up LLM API Keys (Required):**
|
|
46
49
|
|
|
47
|
-
`weco` requires API keys for the
|
|
50
|
+
`weco` requires API keys for the LLMs it uses internally. You **must** provide these keys via environment variables:
|
|
48
51
|
|
|
49
|
-
- **OpenAI:** `export OPENAI_API_KEY="your_key_here"`
|
|
50
|
-
- **Anthropic:** `export ANTHROPIC_API_KEY="your_key_here"`
|
|
51
|
-
- **Google
|
|
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.)
|
|
52
55
|
|
|
53
56
|
---
|
|
54
57
|
|
|
55
58
|
## Get Started
|
|
56
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
|
+
|
|
57
82
|
<div style="background-color: #fff3cd; border: 1px solid #ffeeba; padding: 15px; border-radius: 4px; margin-bottom: 15px;">
|
|
58
83
|
<strong>⚠️ Warning: Code Modification</strong><br>
|
|
59
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.
|
|
60
85
|
</div>
|
|
61
86
|
|
|
62
|
-
|
|
87
|
+
### Manual Setup
|
|
63
88
|
|
|
64
|
-
**
|
|
89
|
+
**Configure optimization parameters yourself** - If you need precise control over the optimization parameters, you can use the direct `weco run` command:
|
|
65
90
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
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**
|
|
69
92
|
|
|
70
93
|
```bash
|
|
71
94
|
# Navigate to the example directory
|
|
@@ -74,7 +97,7 @@ cd examples/hello-kernel-world
|
|
|
74
97
|
# Install dependencies
|
|
75
98
|
pip install torch
|
|
76
99
|
|
|
77
|
-
# Run Weco
|
|
100
|
+
# Run Weco with manual configuration
|
|
78
101
|
weco run --source optimize.py \
|
|
79
102
|
--eval-command "python evaluate.py --solution-path optimize.py --device cpu" \
|
|
80
103
|
--metric speedup \
|
|
@@ -85,36 +108,87 @@ weco run --source optimize.py \
|
|
|
85
108
|
|
|
86
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`.
|
|
87
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
|
+
|
|
88
113
|
---
|
|
89
114
|
|
|
90
115
|
### Arguments for `weco run`
|
|
91
116
|
|
|
92
117
|
**Required:**
|
|
93
118
|
|
|
94
|
-
| Argument | Description |
|
|
95
|
-
| :------------------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
96
|
-
| `-s, --source` | Path to the source code file that will be optimized
|
|
97
|
-
| `-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. |
|
|
98
|
-
| `-m, --metric` | The name of the metric you want to optimize (e.g., 'accuracy', 'speedup', 'loss'). This metric name
|
|
99
|
-
| `-g, --goal`
|
|
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` |
|
|
100
125
|
|
|
101
126
|
<br>
|
|
102
127
|
|
|
103
128
|
**Optional:**
|
|
104
129
|
|
|
105
|
-
| Argument | Description | Default |
|
|
106
|
-
| :----------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
107
|
-
| `-n, --steps` | Number of optimization steps (LLM iterations) to run. | 100 |
|
|
108
|
-
| `-M, --model` | Model identifier for the LLM to use (e.g., `
|
|
109
|
-
| `-i, --additional-instructions`| Natural language description of specific instructions **or** path to a file containing detailed instructions to guide the LLM. | `None`
|
|
110
|
-
| `-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/` |
|
|
111
136
|
|
|
112
137
|
---
|
|
113
138
|
|
|
114
|
-
###
|
|
115
|
-
|
|
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
|
+
|
|
116
153
|

|
|
117
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
|
+
|
|
118
192
|
---
|
|
119
193
|
|
|
120
194
|
### Performance & Expectations
|
|
@@ -151,16 +225,16 @@ Weco will parse this output to extract the numerical value (1.5 in this case) as
|
|
|
151
225
|
|
|
152
226
|
## Contributing
|
|
153
227
|
|
|
154
|
-
We welcome contributions! To get started:
|
|
228
|
+
We welcome your contributions! To get started:
|
|
155
229
|
|
|
156
|
-
1. **Fork
|
|
230
|
+
1. **Fork & Clone the Repository:**
|
|
157
231
|
|
|
158
232
|
```bash
|
|
159
233
|
git clone https://github.com/WecoAI/weco-cli.git
|
|
160
234
|
cd weco-cli
|
|
161
235
|
```
|
|
162
236
|
|
|
163
|
-
2. **Install
|
|
237
|
+
2. **Install Dependencies:**
|
|
164
238
|
|
|
165
239
|
```bash
|
|
166
240
|
pip install -e ".[dev]"
|
|
@@ -172,8 +246,8 @@ We welcome contributions! To get started:
|
|
|
172
246
|
git checkout -b feature/your-feature-name
|
|
173
247
|
```
|
|
174
248
|
|
|
175
|
-
4. **Make
|
|
249
|
+
4. **Make Changes:** Ensure your code adheres to our style guidelines and includes relevant tests.
|
|
176
250
|
|
|
177
|
-
5. **Commit
|
|
251
|
+
5. **Commit, Push & Open a PR**: Commit your changes, and open a pull request with a clear description of your enhancements.
|
|
178
252
|
|
|
179
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>
|