auspex 0.3.1 → 0.4.0

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 (2) hide show
  1. package/package.json +2 -1
  2. package/readme.md +137 -2
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "auspex",
3
- "version": "0.3.1",
3
+ "version": "0.4.0",
4
4
  "description": "AI-powered browser agent with tiered scraping — HTTP/Cheerio first, Playwright as fallback",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -19,6 +19,7 @@
19
19
  "build": "tsc",
20
20
  "dev": "tsx src/index.ts",
21
21
  "example": "tsx examples/basic.ts",
22
+ "example:websearch": "tsx examples/websearch.ts",
22
23
  "example:scraper": "tsx examples/scraper.ts",
23
24
  "install:browser": "playwright install chromium",
24
25
  "test": "vitest run",
package/readme.md CHANGED
@@ -4,7 +4,7 @@
4
4
  https://www.npmjs.com/package/auspex
5
5
 
6
6
  Framework de browser automation alimentado por LLM. Voce fornece uma **URL** e um **prompt em linguagem natural** — o agent decide sozinho se basta uma requisicao HTTP ou se precisa abrir o Playwright, navega, clica, preenche formularios e retorna o resultado com um relatorio completo.
7
-
7
+ Além disso, é compatível com Web Search através de SearXNG
8
8
  ---
9
9
 
10
10
  ## Indice
@@ -21,6 +21,7 @@ Framework de browser automation alimentado por LLM. Voce fornece uma **URL** e u
21
21
  - [Eventos](#eventos)
22
22
  - [Browser Pool](#browser-pool)
23
23
  - [Acoes do Agent](#acoes-do-agent)
24
+ - [Web Search com SearXNG](#web-search-com-searxng)
24
25
  - [Seguranca](#seguranca)
25
26
  - [Monitoramento — Tokens e Memoria](#monitoramento--tokens-e-memoria)
26
27
  - [Dicas de uso](#dicas-de-uso)
@@ -186,6 +187,9 @@ new Auspex({
186
187
  logDir: "logs", // diretorio dos logs
187
188
  vision: false, // fallback com screenshot apos falhas (modelo com vision)
188
189
  screenshotQuality: 75, // qualidade JPEG 1-100 (vision, default: 75)
190
+
191
+ // ──── Web Search ──────────────────────────────────
192
+ searxngUrl: "http://localhost:8080", // base URL do SearXNG (localhost por padrao; remoto exige allowedDomains)
189
193
  });
190
194
  ```
191
195
 
@@ -216,6 +220,7 @@ new Auspex({
216
220
  | `logDir` | `string` | Nao | `"logs"` | Diretorio dos arquivos de log |
217
221
  | `vision` | `boolean` | Nao | `false` | Fallback com screenshot apos falhas (modelo vision) |
218
222
  | `screenshotQuality` | `number` | Nao | `75` | Qualidade JPEG 1-100 para screenshots |
223
+ | `searxngUrl` | `string` | Nao | — | Base URL do SearXNG (loopback por padrao; instancia remota so se o host estiver em allowedDomains) |
219
224
 
220
225
  ---
221
226
 
@@ -225,7 +230,7 @@ Opcoes passadas para `agent.run(options)`:
225
230
 
226
231
  | Parametro | Tipo | Obrigatorio | Descricao |
227
232
  |-----------|------|:-----------:|-----------|
228
- | `url` | `string` | Sim | URL inicial para o agent navegar |
233
+ | `url` | `string` | Nao\* | URL inicial para o agent navegar (obrigatorio se sem SearXNG) |
229
234
  | `prompt` | `string` | Sim | Instrucao em linguagem natural |
230
235
  | `maxIterations` | `number` | Nao | Override de maxIterations para este run |
231
236
  | `timeoutMs` | `number` | Nao | Override de timeoutMs para este run |
@@ -233,6 +238,9 @@ Opcoes passadas para `agent.run(options)`:
233
238
  | `signal` | `AbortSignal` | Nao | AbortSignal para cancelar o run |
234
239
  | `schema` | `ZodType<T>` | Nao | Schema Zod: retorno tipado em `data` (T \| null) |
235
240
  | `vision` | `boolean` | Nao | Override do fallback com screenshot |
241
+ | `searxngUrl` | `string` | Nao | Override do SearXNG **neste run** (sobrescreve `AgentConfig` / `SEARXNG_URL`) |
242
+
243
+ \* Se `url` nao for fornecida, o agent usa web search (SearXNG) para a URL inicial. Nesse caso configure `searxngUrl` no `run()`, no `AgentConfig`, ou `SEARXNG_URL` no ambiente (na construcao do agent o env e aplicado ao config).
236
244
 
237
245
  ```typescript
238
246
  const result = await agent.run({
@@ -503,6 +511,7 @@ O LLM so pode executar acoes de uma **whitelist rigorosa**. Qualquer coisa fora
503
511
 
504
512
  | Acao | Formato JSON | Descricao |
505
513
  |------|-------------|-----------|
514
+ | **search** | `{"type":"search","query":"buscar isso"}` | Busca na web via SearXNG (max 500 chars) |
506
515
  | **click** | `{"type":"click","selector":"#btn"}` | Clica em um elemento (CSS ou role=button[name="..."] ) |
507
516
  | **type** | `{"type":"type","selector":"input[name='q']","text":"busca"}` | Digita texto em um campo (max 1000 chars) |
508
517
  | **select** | `{"type":"select","selector":"select#country","value":"br"}` | Seleciona opcao em `<select>` (value = option value) |
@@ -517,6 +526,125 @@ Selectors podem ser **CSS** ou **role-based** (ex.: `role=button[name="Submit"]`
517
526
 
518
527
  ---
519
528
 
529
+ ## Web Search com SearXNG
530
+
531
+ O auspex suporta busca web via [SearXNG](https://searxng.org/) para descobrir URLs automaticamente e permitir que o agente faca buscas durante o loop.
532
+
533
+ ### Exemplo no repositorio
534
+
535
+ Com `LLM_API_KEY` e `SEARXNG_URL` (ou SearXNG em localhost:8080) no `.env`:
536
+
537
+ ```bash
538
+ npm run example:websearch
539
+ ```
540
+
541
+ Veja [`examples/websearch.ts`](examples/websearch.ts) — execucao sem `url` (busca inicial) e com `url` (fluxo normal com acao `search` disponivel).
542
+
543
+ ### Configuracao
544
+
545
+ Configure a URL do SearXNG no `AgentConfig` ou via variavel de ambiente:
546
+
547
+ ```typescript
548
+ const agent = new Auspex({
549
+ llmApiKey: process.env.LLM_API_KEY!,
550
+ searxngUrl: process.env.SEARXNG_URL, // ex: "http://localhost:8080"
551
+ });
552
+ ```
553
+
554
+ Ou via variavel de ambiente:
555
+ ```bash
556
+ export SEARXNG_URL=http://localhost:8080
557
+ ```
558
+
559
+ > **Nota**: Por padrao o `searxngUrl` deve apontar para loopback (`localhost`, `127.0.0.1` ou `[::1]`). Para usar um SearXNG em outro host (ex.: rede interna), inclua o hostname desse servidor em `allowedDomains` (mesmas regras de subdominio que para navegacao).
560
+
561
+ ### Busca inicial (sem URL)
562
+
563
+ Quando voce nao fornece uma URL, o agent busca no SearXNG automaticamente e usa o primeiro resultado como ponto de partida:
564
+
565
+ ```typescript
566
+ const agent = new Auspex({
567
+ llmApiKey: process.env.LLM_API_KEY!,
568
+ searxngUrl: "http://localhost:8080",
569
+ });
570
+
571
+ // Sem URL — o agent busca primeiro e depois navega
572
+ const result = await agent.run({
573
+ prompt: "Encontre o preco do iPhone 15 no site da Apple",
574
+ });
575
+ ```
576
+
577
+ O agent ira:
578
+ 1. Buscar "preco do iPhone 15 site da Apple" no SearXNG
579
+ 2. Usar o primeiro resultado como URL inicial
580
+ 3. Navegar e executar a tarefa normalmente
581
+
582
+ ### Acao `search` durante o loop
583
+
584
+ O agent tambem pode usar a acao `search` durante o loop para encontrar informacoes adicionais:
585
+
586
+ ```typescript
587
+ const result = await agent.run({
588
+ url: "https://shop.example.com",
589
+ prompt: "Compare o preco deste produto com os concorrentes",
590
+ });
591
+ ```
592
+
593
+ O agent pode:
594
+ 1. Ler o preco na pagina atual
595
+ 2. Usar `{"type":"search","query":"produto X preco concorrentes"}` para buscar
596
+ 3. Analisar os resultados da busca
597
+ 4. Retornar a comparacao
598
+
599
+ ### Resultados de busca no snapshot
600
+
601
+ Quando uma busca e realizada, os resultados sao incluidos no proximo snapshot:
602
+
603
+ ```
604
+ ### Search Results (5)
605
+ 1. iPhone 15 - Apple
606
+ https://www.apple.com/iphone-15/
607
+ O novo iPhone 15 apresenta design renovado...
608
+ Score: 0.95
609
+
610
+ 2. iPhone 15 - Loja Exemplo
611
+ https://loja.example.com/iphone-15
612
+ iPhone 15 a partir de R$ 5.999...
613
+ Score: 0.87
614
+ ...
615
+ ```
616
+
617
+ ### Configuracao do SearXNG
618
+
619
+ Para rodar o SearXNG localmente com Docker:
620
+
621
+ ```bash
622
+ docker run -d --name searxng -p 8080:8080 \
623
+ -e BASE_URL=http://localhost:8080 \
624
+ quay.io/searxng/searxng:latest
625
+ ```
626
+
627
+ Ou via Docker Compose:
628
+
629
+ ```yaml
630
+ services:
631
+ searxng:
632
+ image: quay.io/searxng/searxng:latest
633
+ ports:
634
+ - "8080:8080"
635
+ environment:
636
+ - BASE_URL=http://localhost:8080
637
+ ```
638
+
639
+ ### Seguranca
640
+
641
+ - **Validacao de URL**: loopback por padrao; hosts remotos apenas se o hostname do SearXNG estiver em `allowedDomains` (e respeitando `blockedDomains`)
642
+ - **Sanitizacao de query**: maximo 500 caracteres, sem caracteres perigosos
643
+ - **Timeout**: 5 segundos para requisicoes ao SearXNG
644
+ - **Rate limiting**: configure rate limiting no proprio SearXNG se necessario
645
+
646
+ ---
647
+
520
648
  ## Eventos
521
649
 
522
650
  O `Auspex` estende `EventEmitter`. Voce pode escutar eventos por run:
@@ -895,6 +1023,9 @@ LLM_API_KEY=sk-your-key-here
895
1023
  # Opcional — trocar provider
896
1024
  # LLM_BASE_URL=https://api.groq.com/openai/v1
897
1025
  # LLM_MODEL=llama-3.3-70b-versatile
1026
+
1027
+ # Opcional — habilita web search com SearXNG
1028
+ # SEARXNG_URL=http://localhost:8080
898
1029
  ```
899
1030
 
900
1031
  > O framework em si recebe tudo via `AgentConfig` no construtor — as variaveis de ambiente sao usadas apenas pelo exemplo.
@@ -926,6 +1057,10 @@ import {
926
1057
  type BrowserPoolOptions,
927
1058
  UrlValidationError,
928
1059
  ActionValidationError,
1060
+ SearXNGClient,
1061
+ type SearchResult,
1062
+ type SearXNGResponse,
1063
+ type SearXNGClientOptions,
929
1064
  } from "auspex";
930
1065
  ```
931
1066