AI overview¶
FreeDR has an optional AI investigator and a few on-demand AI helpers. AI is off by default. Every detection, alert, case, Hunt and response feature works without it.
When AI is on, FreeDR sends bounded, redacted case evidence to one model
provider that you choose and pay for with your own API key. The model reads
FreeDR evidence through a fixed list of tools. It gives a verdict that must cite
retained evidence. Its tools include enrich, which runs the same threat-intel
lookups (VirusTotal, AbuseIPDB, OTX and others) as case enrichment; see
External enrichment.
What AI can change
The AI is not read-only. When enabled, it can:
- resolve a case when its verdict is benign;
- run four containment actions on targets it cites: terminate a process, quarantine a file, remediate (disable) persistence, block traffic. The Settings switch Let AI contain threats it finds controls this, and it is off by default: you must turn it on;
- file pending exclusions. These suppress nothing until you approve them.
It cannot isolate the host, permanently delete files, restore or release anything, approve exclusions, change built-in rules, change settings or run shell commands. For details, see AI features.
Providers and default models¶
You select one provider in Settings → Optional AI investigator or in the setup wizard. Each provider has a fixed HTTPS endpoint. FreeDR does not support custom endpoints, proxies, redirects or automatic failover to another provider.
| Provider (Settings label) | Endpoint | Protocol | Default model ID |
|---|---|---|---|
| CheaperInference (default provider) | https://api.cheaperinference.com/v1/chat/completions |
Chat Completions, bearer key | deepseek-v4.1-flash |
| OpenAI | https://api.openai.com/v1/responses |
Responses API (store: false), bearer key |
gpt-6.1-sol |
| Anthropic | https://api.anthropic.com/v1/messages |
Messages API (x-api-key, anthropic-version: 2023-06-01) |
claude-sonnet-5-5 |
| DeepSeek | https://api.deepseek.com/chat/completions |
Chat Completions, bearer key | deepseek-flash |
- Model ID is editable. You can enter any model ID that your key can use.
It must be 1–128 characters from letters, digits and
._:/-. When you change the provider, FreeDR selects that provider's default model and thinking level. - FreeDR sends
x-ci-techniques: offto CheaperInference so that optional account optimizations cannot replace the model or the evidence. - Each run records the provider and model it used. If you change the provider or model during a run, the run stops at its next round with "AI provider or model changed; start a follow-up to continue".
Thinking levels¶
Each provider has its own thinking (reasoning) levels. FreeDR uses the provider's names and does not map them to one shared scale. Settings lists only the levels of the selected provider, from least to most thinking.
| Provider | Levels | Default | Request parameter |
|---|---|---|---|
| CheaperInference | none low medium high xhigh max |
medium |
reasoning_effort (none turns thinking off) |
| OpenAI | none low medium high xhigh max |
medium |
reasoning.effort |
| Anthropic | disabled between_tools low medium high xhigh max |
medium |
disabled / between_tools → thinking.type; other levels → output_config.effort (adaptive thinking) |
| DeepSeek | disabled low high max |
high (DeepSeek has no medium) |
disabled → thinking: {type: disabled}; others → thinking: {type: enabled} plus reasoning_effort |
- Some levels exist only on some models. Anthropic
disabledandbetween_toolswork only on some models, and not every OpenAI model offersnone. If the provider rejects a level, FreeDR shows the provider's error. - Thinking tokens count against a reply's output limit. At any level other than
noneordisabled, FreeDR adds 16,384 tokens to each reply's output limit. - Reasoning is never stored or shown. FreeDR keeps it only in memory, so that it
can be sent back to the provider during tool calls: OpenAI encrypted reasoning,
Anthropic signed thinking blocks and DeepSeek-style
reasoning_content. - More thinking is slower and uses more tokens.
API key storage¶
- Each AI provider has its own write-only key slot. The four AI slots sit alongside the threat-intel provider keys. The FreeDR service encrypts the keys with Windows DPAPI under the service account and stores them in the control database.
- The console shows only whether a key is saved. It never shows the key value. You can keep, replace or remove a key with Save changes. Switching provider never copies a key to another provider.
- FreeDR rejects enabling AI for a provider that has no saved key.
- You can also enter a key in the setup wizard, or import one from the optional setup configuration file (JSON).
- FreeDR never shows provider error bodies, URLs or keys in its error messages.
It shows only fixed messages such as
external service HTTP 429; retryable=true; automatic retry disabled.
Settings¶
| Setting (UI label) | Default | Meaning |
|---|---|---|
| Enable AI investigation | off | Master switch for investigations and assists. |
| AI provider / Model ID / Thinking | CheaperInference / deepseek-v4.1-flash / medium |
See above. |
| Daily token limit | 20,000,000 | Allowed range is 400,000 to 20,000,000 tokens per UTC day. |
| Let AI contain threats it finds | off | Lets the investigator run its four containment actions. When off, its response plan is only a draft. |
| Enable public web research | off | Gives the investigator web_search and read_public_page. Also enables manual research from a case, which needs no AI key. |
Token accounting and budgets¶
FreeDR counts tokens, not money. It does not calculate or show prices. Your provider's own billing applies.
Daily cap. All AI work counts against one cap per UTC day: investigations, explanations and drafts. The default and maximum is 20,000,000 tokens.
Investigations.
- Up to 3 investigations run at once, and at most one per case.
- When an investigation starts, it reserves an equal share of the remaining daily headroom across the free run slots. It needs at least 50,000 tokens to start. Unused tokens go back to the budget when the run ends.
- Investigations always leave 96,000 tokens free (2 × 48,000), so explanations and drafts still work while investigations hold reservations.
- A run is limited to 30 rounds and 100 tool observations. One request can be at most 400,000 tokens.
- Every tool result shows the run's remaining tokens. The model is told to finish while one more request still fits.
Assists. Explanations and drafts are single requests:
- Up to 2 assists wait on the provider at once.
- One assist can reserve at most 48,000 tokens.
- Output caps: alert explanation 8,192 tokens, exclusion draft 2,048, Hunt and rule drafts 4,096. Thinking adds 16,384 to each cap.
Billing rules.
- When the provider reports usage, that number replaces the reservation.
- Some failures happen before the provider does billable work: the request is too large, the client cannot start, there is no connection, or the provider returns HTTP 401, 403 or 429. These release their reservation.
- If billing is unknown (timeout, interrupted response, restart), FreeDR keeps the tokens counted. For an investigation this is at most one request's worth.
- A reply cut off at the output limit is billed and discarded.
What the run shows. Each run shows tokens used (input and output) and tokens reserved.
Budget errors.
- If the budget is used up, requests fail with
ai_daily_budget_exhausted. - If running work holds the remaining headroom, requests fail with
ai_busy.
Retries.
- The HTTP client never retries on its own.
- The investigator retries transient provider failures with backoff: 2, 5, 15, 30, then 60 seconds, repeating until the run stops or its budget no longer fits. Transient failures are timeouts, lost connections, HTTP 429 and server errors. The run detail shows, for example, "provider HTTP 503; retrying in 15 s".
- A reply it cannot parse is retried once.
What is sent to the provider¶
What the model receives.
- The deterministic case summary, which is the same summary you see on the case.
- Tool results it asks for.
- A fixed system prompt that includes the evidence manual.
Redaction. FreeDR redacts locally supplied content before every request:
- These fields and columns are replaced with
[redacted]:password,secret,api_key,authorization,access_token,refresh_token,host_id,username. Account-name columns (user_name,actor_user_name) are not redacted, so the model sees names such asNT AUTHORITY\SYSTEM. - SIDs (
S-1-…, in any field) are handled by kind:- Well-known SIDs are kept: SYSTEM
S-1-5-18, LocalServiceS-1-5-19, NetworkServiceS-1-5-20, built-in groups such as AdministratorsS-1-5-32-544, service SIDsS-1-5-80-…, EveryoneS-1-1-0, and integrity labelsS-1-16-…. These name no person or machine, so the model can see who ran something. - Machine or domain accounts (
S-1-5-21-…) with a well-known RID below 1000 keep only the RID:S-1-5-21-[redacted]-500is the built-in Administrator. - User SIDs (
S-1-5-21-…with RID 1000 or more), Microsoft Entra ID SIDs (S-1-12-…) and any other SID become[redacted SID]. - Only a value that is a whole SID is changed; a SID inside a longer text
(for example an
HKU\S-1-5-21-…\registry path) is sent as is.
- Well-known SIDs are kept: SYSTEM
- Any string that contains credential markers becomes
[redacted credential-bearing text]. The markers includepassword=,--password,api_key=,bearer,token=,secret=,ghp_andgithub_pat_. - In
C:\Users\<name>\…paths, the user name becomes<user>.
Redaction is pattern-based
Other text in the evidence still goes to the provider: command lines, file paths, registry values, script blocks and host details. The provider's own terms and data retention apply. FreeDR does not claim zero data retention.
Web research. When web research is enabled, search terms go to
https://search.parallel.ai/mcp, an anonymous search service, and page reads go
to the public URL itself. See Web research.
Where AI results appear¶
| Place | What you see |
|---|---|
| Case → AI tab | Runs, live tool history and token usage, the report, response actions the AI ran, and the draft. |
| Alert detail | Explain this alert. |
| False-positive / Tune this rule dialog | Ask AI to draft. |
| Hunt | Describe what to find and Draft as rule. |
| Overview, case view and rule detail | Pending exclusions filed by the AI, with Approve / Reject. |
| Case → Response tab | AI-submitted jobs, under the purpose AI investigator (run <id>): …. |
API endpoints¶
All AI endpoints are on the local API. They need the local session, and every
POST also needs the CSRF token.
| Method and path | Purpose |
|---|---|
GET /api/v1/ai/status |
Shows whether a provider is configured for assists. |
GET /api/v1/cases/{case_id}/ai |
Lists a case's runs (limit 1–100, default 20, cursor). |
POST /api/v1/cases/{case_id}/ai |
Starts an investigation (question up to 2,048 bytes; optional previous_run_id for a follow-up). |
GET /api/v1/cases/{case_id}/ai/{run_id} |
Gets one run. |
POST /api/v1/cases/{case_id}/ai/{run_id}/cancel |
Stops a run. |
POST /api/v1/cases/{case_id}/research |
Runs a manual web search (query, up to 512 bytes) or page read (url, up to 2,048 bytes). |
POST /api/v1/detections/alerts/{alert_id}/ai-explanation |
Explains an alert. Returns the cached explanation unless regenerate is set. |
POST /api/v1/detections/alerts/{alert_id}/ai-exclusion |
Drafts an exclusion's field choice. |
POST /api/v1/hunt/ai-draft |
Drafts Hunt SQL (target: hunt) or a custom rule (target: rule). |
Error codes:
| Code | Meaning |
|---|---|
invalid_ai_request |
The request is malformed. |
ai_busy |
Slots or budget are held by running work. |
ai_disabled |
AI is switched off. |
ai_unavailable |
The service or provider cannot be reached. |
ai_daily_budget_exhausted |
The daily token cap is used up. |
ai_case_or_session_changed |
The case or the investigation session changed. |
ai_output_rejected |
The model's reply did not match the required shape and was discarded. |