Docs
The AI assistant
On this page
Ranking results means telling the tool what "best" means: which conditions a result has to meet, which figure to maximise, and how to weigh the rest. That is the What counts as best dialog in the results explorer, and it assumes you already know the figure vocabulary. The assistant is the other way in: you write a sentence, and it proposes a definition you read, edit and confirm.
It is off until you turn it on, and by default it runs on your own machine, where nothing leaves your computer at all. And it never applies anything: the proposal is a form you edit, and only pressing Confirm writes anything. The manual editor stays exactly as it was, in the same dialog, one click away from any proposal.
What it does
You type something like "I want steady returns, drawdown under 15 percent, and at least 150 trades". It comes back with a proposal: a maximum drawdown condition at 15, a minimum trade count at 150, an objective figure with its direction, and a weighting profile. Every part is an editable line, marked as either taken from your own words or suggested by the assistant.
| It does | It does not |
|---|---|
| Propose conditions, an objective and a weighting | Start, stop or change a run |
| Mark every threshold as yours or its own | Choose which inputs to sweep, or their ranges |
| Report the words it could not map, verbatim | Pick a search method, a budget or a validation period |
| Count how many of your results already satisfy it | Produce a number, a score or a verdict of its own |
The last one is the line that matters. The model never invents a performance figure: it selects from the figures TradingView already reported and from thresholds you stated. Everything it proposes is an input you confirm, never an output you are asked to trust.
Using it
- Turn it on and pick where the model runs
Open the extension's settings page: the gear in the side panel header, orOptions on the extension's own toolbar menu. That page is the only place the assistant is configured: which of the three kinds of model to use, what a request contains, and that kind's own setup. It is a setup you do once, and it holds for every chart and every results tab. See where the model runs.
- Open the results explorer
Open a session, then press Objective in the toolbar. The assistant sits at the top of that dialog, above the manual sections: a state chip and a text box, with the gear beside them going back to the settings page.
- Write what you want
Plain words, up to 1,000 characters. Name figures the way you would say them out loud ("drawdown", "profit factor", "trades"), and give the numbers in the units you speak: 15 percent is
15, not0.15. - Read the proposal, edit it, confirm
Nothing is applied until you press Confirm, and what is written is exactly what is on screen. Discard leaves your current definition untouched.
Reading a proposal
| On screen | What it means |
|---|---|
| your words | The number is one you actually typed. It is checked against your sentence, not taken on the model's word: a threshold claimed as yours whose number is not in what you wrote is demoted to a suggestion rather than presented as something you asked for. |
| suggested | The assistant chose this number. You named the figure but not a threshold, or it added the figure itself. Edit it or remove the line. |
| N of M results already satisfy this | How many rows you have already collected would pass these conditions, counted before you confirm. Zero is a legitimate answer, and confirming is still allowed: it may be exactly what you want to go looking for. |
| Compared with what is active now | Every element the proposal would add, change or remove against your current definition. |
| Could not be mapped | Words the assistant could not turn into a figure this system records, shown back to you exactly as you wrote them. Nothing is substituted for them. |
A confirmed proposal is an ordinary definition. Reopen the manual editor and it is a normal, fully editable definition with no trace of having come from the assistant.
Where the model runs
Three kinds, and the kind is the only thing that decides whether anything leaves your computer. You pick one; it survives a restart; the assistant never switches on its own.
| Kind | What it is | Leaves your machine | Costs |
|---|---|---|---|
| This browser's own model | Chrome's built-in model, running locally | Nothing | Nothing |
| A server on this machine | Ollama or llama.cpp on a loopback address | Nothing | Nothing |
| A provider you choose | One of five hosted companies, on your own API key | What you type, our vocabulary, and the strategy's control panel | Whatever that company charges you |
Firefox has no built-in model, so the first kind reports itself unavailable there and the other two work normally.
Chrome's own model
Chrome can run a model on your machine with no install and no key. It is the default and the least work: if your browser and hardware support it, there is nothing to set up.
If the assistant reports it unavailable, that is Chrome telling you this machine cannot run it, and it is not something this extension can change. Chrome's own pages explain what it needs:
The model may need downloading the first time. The assistant reports Preparing while that happens and will not start a multi-gigabyte download behind your back: it only ever begins one when you turn the assistant on or press check again.
A server on your machine
If you already run models locally, point the assistant at one. Two runtimes are supported by name, both through their OpenAI-compatible /v1 surface:
| Ollama | llama.cpp (llama-server) | |
|---|---|---|
| Default address | 127.0.0.1:11434 | 127.0.0.1:8080 |
| Model field | Must name a model you have pulled | Ignored when it serves a single model |
| Extension origin | Refused by default. See below | Allowed by default |
| Official pages | Download Ollama · Model library · FAQ: allowing extra web origins | llama.cpp on GitHub · llama-server documentation |
Paste the address into the setup panel and press Save. The browser asks for permission to reach that address, then the assistant probes it: it identifies which of the two runtimes answered, tells you which one it found, and offers the models that server actually listed. You pick from that list rather than typing a name, because a name the server does not know produces an error you cannot diagnose.
The address must be a loopback one: 127.0.0.1 or localhost. Anything else is refused before a request is ever attempted, including another machine on your own network. There is also no field for an authentication key: a local server that demands one is reported as unavailable rather than used, because there is no third party to authenticate to and a secret stored beside the thing it protects buys nothing.
Ollama refuses the extension
This is the one setup problem almost everyone hits, and it looks like a broken extension when it is not. Ollama's allowed-origins list does not include browser extensions out of the box, so it answers every request from one with a 403, before the assistant can even ask which runtime it is talking to.
The fix is to start Ollama with this extension's origin allowed:
OLLAMA_ORIGINS='chrome-extension://*' ollama serveThen press Check again in the extension. Ollama's own FAQ covers the same setting, including how to set it permanently on macOS, Linux and Windows:
The extension reports this refusal by name rather than as "the endpoint did not answer", because the two need opposite fixes. It also sends its real origin and never hides it: getting around your own server's security control would need a powerful new permission, and your runtime is entitled to know who is calling it. llama-server needs none of this; narrow it with --cors-origins if you want to.
A hosted provider, on your key
You can point the assistant at a hosted model instead. This is the only part of this product that sends anything to a company other than us, so it works on strict terms:
- It is a second, separate decision. Turning the assistant on does not enable it. Choosing a company has its own disclosure naming that company, and you accept it before a field to paste a key even exists.
- Your key, your account, your bill. We never hold it, never proxy the request, never meter it and never charge for it. It is available on every plan.
- Straight from your browser to them. The request never passes through our servers. We never see it, and we never see your key.
- A closed list. There is no "custom URL" field, by design: a user-typed address would make the guarantee above unenforceable, because the code path that legitimately reaches one company would then reach any host.
The five, each with the page where you create a key and that company's own API documentation. The extension offers a few current models per company and you pick one; which models those are moves with their release notes rather than with ours, so their documentation is where to read it.
- OpenAI get a key · API documentation
- Anthropic get a key · API documentation
- Zhipu AI get a key · API documentation
- DeepSeek get a key · API documentation
- Moonshot AI get a key · API documentation
It sits in the extension's local storage on your machine, in the clear, and the interface says so where you paste it. There is no passphrase in this product, so any key we encrypted it with would be stored right beside it: that would look like protection without being any. Remove is a single action, it deletes the key, and it stops any request already running. Keys are per company, so removing one says nothing about another.
What a request contains
The payload is identical whichever of the three kinds answers. There is no field, header or parameter that appears only when the destination is a company.
| In a request | Never in a request |
|---|---|
| The sentence you type, word for word | Any result row, and any figure value from any backtest |
| The names and labels of the figures TradingView reports, and which direction is better | Chart data, equity curves, trade lists, and any per-trade value |
| The names of the shipped weighting profiles | Strategy logic or Pine source, which the extension never receives at all |
| Your current definition of best: figure names, your thresholds, the profile | The strategy's stable identity. Its display name is enough for a proposal |
| The shape the answer has to come back in | The exchange, ever |
| The strategy's display name, and its control panel: per configurable input, the id, label, group, type, current value, default, and either the numeric bounds and step or the options it offers, plus the help text TradingView shows. Written by whoever published the script | The symbol and the timeframe, except when you are defining a community campaign, which is what a campaign is about. Even then the model picks from a list the request carries |
| A count of any input or characters left out to stay inside the request limits | Your identity, your session, your subscription, or any identifier of this project |
| Your own search space as it stands: which inputs you sweep, and how | The parameter limit your plan allows. It is checked on your machine, never sent |
| For a campaign only: the symbols and timeframes it could cover, and the axes the draft already holds | Any earlier sentence, proposal or refusal. None is stored, so none exists to send |
The left column is not one payload. The first five rows are in every request; the rest are carried by the kind that needs them, which is why the assistant can propose a search space without ever telling a provider what symbol you trade. Nothing you type and nothing proposed is ever written to disk. The only thing this feature stores is what you confirm, through the same path the manual editor uses. You can check all of this yourself: open your browser's Network panel and submit a goal. On the two local kinds you will see no request at all. See also the privacy policy.
When it refuses
The assistant would rather say no than guess, and a refusal never applies anything. Your current definition of best is untouched in every case below.
| What happened | What you see |
|---|---|
| You named a figure TradingView does not report | Those exact words reported back as unmapped, with nothing proposed for them. A Calmar ratio does not quietly become a Sharpe ratio. |
| The model's answer could not be read | The whole answer refused, nothing applied, and the raw text it returned available behind a control that starts collapsed. It is shown as plain text and is never stored. |
| The answer named a figure outside the list | The entire proposal refused, never partly applied. |
| The answer contradicted a figure's fixed direction | Refused. A deeper drawdown is never better, whatever a model says. |
| The model took too long | A timeout after 60 seconds, stated as a timeout and never as a missing model. |
| A hosted provider said no | The cause by name: a wrong key, a rate limit, an exhausted balance, or an outage. Those need four different actions, so they are four different messages. |
Limits
| Limit | Value |
|---|---|
| Goal length | 1,000 characters |
| Time a request is given | 60 seconds, the same for all three kinds |
| Requests at a time | One. A new one replaces the one before it |
| Plans | Every plan. Nothing here is metered, counted or billed by us |
Troubleshooting
| Symptom | What to do |
|---|---|
| The assistant is nowhere in the dialog | You are on a pooled campaign view, which has no local results to count a proposal against. Open one of your own sessions and try there. |
| It says "Not checked" | Nothing has been determined yet, on purpose: it never probes anything on its own. Press the state chip in its header to check now. |
| "This browser has no on-device model" | Firefox, or a Chrome without the built-in model. Use a local server or a hosted provider, or read Chrome's requirements. |
| "Ollama refused this extension's origin" | Start Ollama with the origin allowed. |
| "This is not a runtime the assistant supports" | Something answered on that port, but it is not Ollama or llama-server. Check the port, and check the server is actually running. |
| "Access to the local address was not granted" | The browser permission prompt was declined. Press Save again and accept it, or grant it in your browser's extension settings. |
| The provider rejected the key | Paste it again from that company's key page. A rate limit and an exhausted balance are reported separately, and neither is fixed by changing the key. |
| The proposal is not what you meant | Edit the lines, or discard it and rephrase. It is not deterministic, so the same sentence may map better the second time. The manual editor is always right there. |
FAQ
Does the assistant run backtests or pick strategies?
No. It proposes a definition of what counts as a best result, which you edit and confirm before anything is applied. It never starts a run, never changes what is being searched, never picks a method or a budget, and never produces a verdict about a result.
What leaves my machine?
Nothing, unless you choose a hosted provider yourself. On the browser's own model and on a server running on your machine, no request leaves your computer at all. Choosing a hosted provider is a separate decision with its own disclosure naming the company.
What is actually in a request?
Your goal sentence, the names and labels of the 17 figures TradingView reports, the names of the shipped weighting profiles, your current definition of best, and the shape the answer has to come back in. No result value, no chart data, no trade list, no strategy logic, no parameter, no symbol, no timeframe, and nothing identifying you or your subscription.
Who pays for a hosted model?
Yours. Bring your own key. We never hold it, never proxy the request, never meter it and never bill it. The request goes straight from your browser to the company you picked, and it is available on every plan.
Why does Ollama refuse the extension?
Ollama does not allow browser-extension origins out of the box and answers with a 403. Start it with OLLAMA_ORIGINS=chrome-extension://* and check again. The extension states this exact setting when it detects the refusal, and never disguises its own origin to get around it.
What if it does not understand a figure I named?
It says so and proposes nothing for that part. It reports the words it could not map back to you verbatim, and it never substitutes a figure that merely resembles what you asked for.
Is it deterministic?
Yes. The same goal may produce a different proposal next time, which is why nothing is applied until you confirm what is on screen. A run stays reproducible regardless, because it copies the definition in force when it starts.
Do I have to use it?
No. The manual editor is unchanged and stays the way it always was, in the same dialog. The assistant is off until you turn it on and can be turned back off at any time without losing anything.
Everything else the extension does is in the main documentation, and splitting a sweep across several machines is in testing communities.