Skip to content

Commit 65b1cf9

Browse files
authored
Merge pull request #202 from pavlovtech/chore/release-v11.1.0
release: prepare v11.1.0 (ADR-0084 AI extraction)
2 parents de3d728 + c2ed078 commit 65b1cf9

3 files changed

Lines changed: 25 additions & 1 deletion

File tree

.github/workflows/release.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ env:
6565
WebReaper.AzureServiceBus
6666
WebReaper.Sqlite
6767
WebReaper.AI
68+
WebReaper.AI.Http
6869
WebReaper.Extraction.Attributes
6970
WebReaper.Extraction.Generators
7071
WebReaper.Mcp

CHANGELOG.md

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,28 @@
11
# Changelog
22

3+
## 11.1.0: AI extraction in the CLI
4+
5+
`webreaper scrape` and `webreaper crawl` can now extract structured data with an LLM, on the AOT single binary, with your own key. This is the [ADR-0084](docs/adr/0084-ai-extraction-in-the-aot-cli.md) wave. It is additive: no breaking changes, one new package.
6+
7+
What you get:
8+
9+
- **`--prompt "<instruction>"`** runs schema-free, per-page LLM extraction: the model reads each page and returns JSON for whatever you describe ("all C-level execs with name and title"). Robust on heterogeneous pages; one LLM call per page.
10+
- **`--infer ["<goal>"]`** infers a schema once from the first page, then extracts the rest deterministically: about one LLM call for a whole crawl, the cheap path when pages share a shape.
11+
- **Bring your own model, explicitly.** `--model <id>` plus `--llm-url <url>` point at any OpenAI-compatible endpoint (OpenAI, Ollama, OpenRouter, vLLM, and so on). The API key is read from `WEBREAPER_LLM_API_KEY` or `OPENAI_API_KEY` only, never a command-line flag.
12+
- **`--output-dir [dir]`** writes one file per page (`.md` in Markdown mode, `.json` for schema / prompt / infer; default `./webreaper-out`), `--open` reveals the folder, and a hint reports where output landed. The default stays JSON Lines on stdout.
13+
- **`crawl --prompt` warns before a large per-page run** (one LLM call per page); `--yes` or a non-interactive shell skips the prompt.
14+
15+
New package:
16+
17+
- **`WebReaper.AI.Http`**: an AOT-clean, OpenAI-compatible `IChatClient` (`OpenAiCompatibleChatClient`) built on raw `HttpClient` and System.Text.Json source generation, no provider SDK. The bring-your-own chat client the .NET ecosystem otherwise lacks for Native-AOT. JSON-mode chat completions (all the extraction paths need); tool calling throws rather than silently dropping tools.
18+
19+
Under the hood:
20+
21+
- **`WebReaper.AI` is now Native-AOT clean** and baked into the CLI, so the single-binary AOT publish is preserved. Three reflection-JSON sites moved to source generation, gated by two new bake-the-satellite AOT smoke tests in CI. This reverses the ADR-0009 quarantine for the satellite's own code; the quarantine of concrete provider SDKs still holds (your `IChatClient` makes the call).
22+
- **`PromptContentExtractor`** is the new schema-free `IContentExtractor` strategy behind `--prompt`, reachable in code as the fourth `ICrawlSeed` terminal `.ExtractWithPrompt(chatClient, instruction)`.
23+
24+
All 14 packages ship at 11.1.0 (lockstep), now including `WebReaper.AI.Http`.
25+
326
## 11.0.0: block-aware escalating page loader
427

528
WebReaper now detects bot-check challenges and climbs through stronger transports automatically, per page, instead of silently harvesting challenge pages. This is the [ADR-0083](docs/adr/0083-escalating-page-loader.md) wave (5 slices), and it is a breaking major because it changes the core page-loader contract.

Directory.Build.props

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
-->
3434

3535
<PropertyGroup>
36-
<Version>11.0.0</Version>
36+
<Version>11.1.0</Version>
3737

3838
<Authors>Alex Pavlov</Authors>
3939
<Company>Alex Pavlov</Company>

0 commit comments

Comments
 (0)