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.
Files changed (57) hide show
  1. weco-0.2.22/.github/workflows/lint.yml +51 -0
  2. {weco-0.2.20 → weco-0.2.22}/PKG-INFO +107 -32
  3. {weco-0.2.20 → weco-0.2.22}/README.md +105 -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.20 → weco-0.2.22}/examples/cuda/guide.md +0 -24
  7. weco-0.2.22/examples/prompt/README.md +64 -0
  8. weco-0.2.22/examples/spaceship-titanic/README.md +46 -0
  9. weco-0.2.22/examples/spaceship-titanic/evaluate.py +75 -0
  10. weco-0.2.22/examples/spaceship-titanic/train.py +90 -0
  11. weco-0.2.22/examples/triton/README.md +49 -0
  12. {weco-0.2.20 → weco-0.2.22}/pyproject.toml +7 -2
  13. weco-0.2.22/weco/__init__.py +9 -0
  14. weco-0.2.22/weco/api.py +359 -0
  15. weco-0.2.22/weco/auth.py +225 -0
  16. weco-0.2.22/weco/chatbot.py +797 -0
  17. weco-0.2.22/weco/cli.py +200 -0
  18. weco-0.2.22/weco/optimizer.py +479 -0
  19. {weco-0.2.20 → weco-0.2.22}/weco/panels.py +46 -0
  20. {weco-0.2.20 → weco-0.2.22}/weco/utils.py +31 -3
  21. {weco-0.2.20 → weco-0.2.22}/weco.egg-info/PKG-INFO +107 -32
  22. {weco-0.2.20 → weco-0.2.22}/weco.egg-info/SOURCES.txt +4 -1
  23. {weco-0.2.20 → weco-0.2.22}/weco.egg-info/requires.txt +1 -0
  24. weco-0.2.20/.github/workflows/lint.yml +0 -50
  25. weco-0.2.20/examples/cuda/README.md +0 -40
  26. weco-0.2.20/examples/prompt/README.md +0 -51
  27. weco-0.2.20/examples/spaceship-titanic/README.md +0 -42
  28. weco-0.2.20/examples/spaceship-titanic/evaluate.py +0 -43
  29. weco-0.2.20/examples/spaceship-titanic/requirements-test.txt +0 -7
  30. weco-0.2.20/examples/triton/README.md +0 -38
  31. weco-0.2.20/weco/__init__.py +0 -15
  32. weco-0.2.20/weco/api.py +0 -146
  33. weco-0.2.20/weco/auth.py +0 -64
  34. weco-0.2.20/weco/cli.py +0 -714
  35. {weco-0.2.20 → weco-0.2.22}/.github/workflows/release.yml +0 -0
  36. {weco-0.2.20 → weco-0.2.22}/.gitignore +0 -0
  37. {weco-0.2.20 → weco-0.2.22}/.repomixignore +0 -0
  38. {weco-0.2.20 → weco-0.2.22}/LICENSE +0 -0
  39. {weco-0.2.20 → weco-0.2.22}/assets/example-optimization.gif +0 -0
  40. {weco-0.2.20 → weco-0.2.22}/examples/cuda/evaluate.py +0 -0
  41. {weco-0.2.20 → weco-0.2.22}/examples/cuda/optimize.py +0 -0
  42. {weco-0.2.20 → weco-0.2.22}/examples/hello-kernel-world/colab_notebook_walkthrough.ipynb +0 -0
  43. {weco-0.2.20 → weco-0.2.22}/examples/hello-kernel-world/evaluate.py +0 -0
  44. {weco-0.2.20 → weco-0.2.22}/examples/hello-kernel-world/optimize.py +0 -0
  45. {weco-0.2.20 → weco-0.2.22}/examples/prompt/eval.py +0 -0
  46. {weco-0.2.20 → weco-0.2.22}/examples/prompt/optimize.py +0 -0
  47. {weco-0.2.20 → weco-0.2.22}/examples/prompt/prompt_guide.md +0 -0
  48. {weco-0.2.20 → weco-0.2.22}/examples/spaceship-titanic/competition_description.md +0 -0
  49. {weco-0.2.20 → weco-0.2.22}/examples/spaceship-titanic/data/sample_submission.csv +0 -0
  50. {weco-0.2.20 → weco-0.2.22}/examples/spaceship-titanic/data/test.csv +0 -0
  51. {weco-0.2.20 → weco-0.2.22}/examples/spaceship-titanic/data/train.csv +0 -0
  52. {weco-0.2.20 → weco-0.2.22}/examples/triton/evaluate.py +0 -0
  53. {weco-0.2.20 → weco-0.2.22}/examples/triton/optimize.py +0 -0
  54. {weco-0.2.20 → weco-0.2.22}/setup.cfg +0 -0
  55. {weco-0.2.20 → weco-0.2.22}/weco.egg-info/dependency_links.txt +0 -0
  56. {weco-0.2.20 → weco-0.2.22}/weco.egg-info/entry_points.txt +0 -0
  57. {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.20
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
- # 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/)
@@ -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 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.
55
59
 
56
60
  ![image](https://github.com/user-attachments/assets/a6ed63fa-9c40-498e-aa98-a873e5786509)
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 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:
71
75
 
72
- - **OpenAI:** `export OPENAI_API_KEY="your_key_here"`
73
- - **Anthropic:** `export ANTHROPIC_API_KEY="your_key_here"`
74
- - **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.)
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
- **Example: Optimizing Simple PyTorch Operations**
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
- This basic example shows how to optimize a simple PyTorch function for speedup.
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 (e.g., `optimize.py`). |
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 should match what's printed by your `--eval-command`. |
122
- | `-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` |
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., `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`). |
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
- ### Weco Dashboard
138
- 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
+
139
177
  ![image (16)](https://github.com/user-attachments/assets/8a0a285b-4894-46fa-b6a2-4990017ca0c6)
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 and Clone the Repository:**
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 Development Dependencies:**
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 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.
199
274
 
200
- 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.
201
276
 
202
277
  ---
@@ -1,6 +1,9 @@
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/)
@@ -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 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.
32
35
 
33
36
  ![image](https://github.com/user-attachments/assets/a6ed63fa-9c40-498e-aa98-a873e5786509)
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 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:
48
51
 
49
- - **OpenAI:** `export OPENAI_API_KEY="your_key_here"`
50
- - **Anthropic:** `export ANTHROPIC_API_KEY="your_key_here"`
51
- - **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.)
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
- **Example: Optimizing Simple PyTorch Operations**
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
- This basic example shows how to optimize a simple PyTorch function for speedup.
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 (e.g., `optimize.py`). |
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 should match what's printed by your `--eval-command`. |
99
- | `-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` |
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., `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`). |
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
- ### Weco Dashboard
115
- 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
+
116
153
  ![image (16)](https://github.com/user-attachments/assets/8a0a285b-4894-46fa-b6a2-4990017ca0c6)
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 and Clone the Repository:**
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 Development Dependencies:**
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 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.
176
250
 
177
- 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.
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>