qwksearch-api-client 1.0.37 → 1.0.39

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.
package/README.md CHANGED
@@ -25,338 +25,212 @@
25
25
  </p>
26
26
  <!-- template-git-repo:badges:end -->
27
27
 
28
- <p align="center">
29
- <a href="https://qwksearch.com">Demo</a> •
30
- <a href="https://airesearch.js.org">Documentation</a> •
31
- <a href="https://github.com/vtempest/ai-research-agent">GitHub</a>
32
- </p>
33
-
34
-
35
- ## 🧠💻 Reimagine the Internet as Self-Organizing Mind Map
36
-
37
- <p align="center">
38
- <img src="https://i.imgur.com/Z9OJMwd.gif" />
39
- </p>
40
-
41
- Critical times call for critical thinkers to create a crowdsourced argument reasoning dataset, for AI models to recommend research quotes, to evolve crowdsourced chain-of-thought reasoning, to unlock faster ways to read long articles, to monitor developments by topic modeling a knowledge base graph, and to provide a public service of answers to research.
42
-
43
- Language Models can distill the essence of collective thought into a vector space where every point has a weighted value representing its contribution to the overall decision-making process. AI will show its reasoning based on what sentences and cites it used from the collective research, so that people can see it is aligned with our interests. Research Agents recommend articles for human researchers working alongside AI to develop a summarized topic outline as a public service. The agents monitor for any related articles via web searches for keywords associated with that Topic Model. Imagine uploading a research paper, then the app extracts full text of reference cites and creates topic model and keyword summaries, then monitors that literature base and stores highlights. People will make personal knowledge bases of what influences them to create AI assistants cloning their mind-uploaded perspective and interests in a self-organizing mind map.
44
-
45
- ```bash
46
- # Download Source
47
- bun x git0 vtempest/qwksearch-research-agent
48
- ```
49
-
50
- ```bash
51
- # Import API Client
52
- bun i qwksearch-api-client
53
- ```
54
-
55
- ## Overview
56
-
57
- QwkSearch API provides three core services for AI-powered research and content analysis:
58
-
59
- 1. **Content Extraction** - Extract structured content and citations from any URL
60
- 2. **Language Generation** - Generate AI responses using multiple language model providers
61
- 3. **Web Search** - Search the web using metasearch engine across 100+ sources
62
-
63
-
64
-
65
- ## Complete Example: Research Pipeline
66
-
67
- Combine all three endpoints to create a complete research pipeline:
68
-
69
- ```javascript
70
- import * as qwk from 'qwksearch-api-client';
71
-
72
- async function researchTopic(topic) {
73
- // 1. Search for relevant articles
74
- const searchResults = await qwk.searchWeb({
75
- query: {
76
- q: topic,
77
- cat: 'science',
78
- recency: 'month'
79
- }
80
- });
81
-
82
- console.log(`Found ${searchResults.results.length} results`);
83
-
84
- // 2. Extract content from top 3 results
85
- const articles = await Promise.all(
86
- searchResults.results.slice(0, 3).map(async (result) => {
87
- const content = await qwk.extractContent({
88
- query: {
89
- url: result.url
90
- }
91
- });
92
- return content;
93
- })
94
- );
95
-
96
- // 3. Generate summary of all articles
97
- const combinedText = articles
98
- .map(a => `${a.title}\n\n${a.html}`)
99
- .join('\n\n---\n\n');
100
-
101
- const summary = await qwk.writeLanguage({
102
- body: {
103
- provider: 'groq',
104
- key: process.env.GROQ_API_KEY,
105
- agent: 'summarize-bullets',
106
- article: combinedText
107
- }
108
- });
109
-
110
- return {
111
- searchResults: searchResults.results,
112
- articles,
113
- summary: summary.content
114
- };
115
- }
116
-
117
- // Run the research pipeline
118
- researchTopic('quantum computing applications')
119
- .then(results => {
120
- console.log('Research Summary:');
121
- console.log(results.summary);
122
- });
123
- ```
124
-
125
- ---
126
-
127
-
128
- ## API Endpoints
129
-
130
- ### 1. Extract Content (`/extract`)
131
-
132
- Extract structured content, citations, and metadata from any URL including articles, PDFs, and YouTube videos.
133
-
134
- #### Features
135
-
136
- - **Main Content Detection**: Combines Mozilla Readability and Postlight Mercury algorithms with 100+ custom adapters
137
- - **HTML Standardization**: Transforms complex HTML into simplified reading-mode format
138
- - **YouTube Transcripts**: Retrieves complete video transcripts with timestamps
139
- - **PDF Processing**: Extracts formatted text and infers heading hierarchy
140
- - **Citation Extraction**: Identifies author names, publication dates, sources, and titles
141
- - **Author Formatting**: Validates against 90,000+ name database for proper citation formatting
142
-
143
- #### Request
144
-
145
- ```http
146
- GET /extract?url={url}&images={boolean}&links={boolean}
147
- ```
148
-
149
- **Parameters:**
150
-
151
- | Parameter | Type | Required | Default | Description |
152
- |-----------|------|----------|---------|-------------|
153
- | `url` | string (uri) | Yes | - | URL to extract content from |
154
- | `images` | boolean | No | true | Include images in output |
155
- | `links` | boolean | No | true | Include hyperlinks in output |
156
- | `formatting` | boolean | No | true | Preserve text formatting |
157
- | `absoluteURLs` | boolean | No | true | Convert relative URLs to absolute |
158
- | `timeout` | integer | No | 5 | HTTP request timeout (1-30 seconds) |
159
-
160
-
161
- ### 2. Generate Language (`/agents`)
162
-
163
- Generate AI responses using various language model providers with pre-built agent templates.
164
-
165
- #### Language Intelligence Providers (LIPs)
166
-
167
- | Provider | Model Families | Cost (1M Output) | Valuation |
168
- |----------|----------------|------------------|-----------|
169
- | **Groq** | Llama, DeepSeek, Gemini, Mistral | $0.79 | $2.8B |
170
- | **Ollama** | llama, mistral, mixtral, gemma, qwen, deepseek | $0 (local) | - |
171
- | **OpenAI** | o1, o4, gpt-4, gpt-4-turbo, gpt-4-omni | $8.00 | $300B |
172
- | **Anthropic** | Claude Sonnet, Opus, Haiku | $15.00 | $61.5B |
173
- | **TogetherAI** | Llama, Mistral, Qwen, DeepSeek | $0.90 | $3.3B |
174
- | **Perplexity** | Sonar, Sonar Deep Research | $15.00 | $18B |
175
- | **XAI** | Grok, Grok Vision | $15.00 | $80B |
176
- | **Google** | Gemini | $10.00 | - |
177
- | **Cloudflare** | Llama, Gemma, Mistral, Phi, Qwen | $2.25 | $62.3B |
178
-
179
- #### Agent Templates
180
-
181
- | Agent | Context Variables | Description |
182
- |-------|------------------|-------------|
183
- | `question` | query, chat_history | Answer questions with conversation context |
184
- | `summarize-bullets` | article | Create bullet-point summaries |
185
- | `summarize` | article | Generate narrative summaries |
186
- | `suggest-followups` | chat_history, article | Suggest follow-up questions (returns string[]) |
187
- | `answer-cite-sources` | context, chat_history, query | Answer with source citations |
188
- | `query-resolution` | chat_history, query | Resolve ambiguous queries |
189
- | `knowledge-graph-nodes` | query, article | Extract knowledge graph nodes |
190
- | `summary-longtext` | summaries | Summarize multiple summaries |
191
-
192
- #### Request
193
-
194
- ```http
195
- POST /agents
196
- Content-Type: application/json
197
-
198
- {
199
- "provider": "groq",
200
- "key": "your-api-key",
201
- "agent": "question",
202
- "model": "llama-3.3-70b-versatile",
203
- "query": "What is quantum computing?",
204
- "temperature": 1.0,
205
- "html": true
206
- }
207
- ```
208
-
209
- **Body Parameters:**
210
-
211
- | Parameter | Type | Required | Default | Description |
212
- |-----------|------|----------|---------|-------------|
213
- | `provider` | string | Yes | - | LIP provider: groq, openai, anthropic, together, xai, google, perplexity, ollama, cloudflare |
214
- | `key` | string | Yes | - | API key for the provider |
215
- | `agent` | string | No | question | Agent template name |
216
- | `model` | string | No | llama-4-maverick-17b | Model name for the provider |
217
- | `html` | boolean | No | true | Format response as HTML (true) or Markdown (false) |
218
- | `temperature` | number | No | 1.0 | 0-1: deterministic, 1-2: creative |
219
- | `query` | string | No | - | Query text for certain agents |
220
- | `chat_history` | string | No | - | Conversation history for certain agents |
221
- | `article` | string | No | - | Article text for summarization agents |
222
-
223
- #### Response
224
-
225
- **200 OK**
226
-
227
- ```json
228
- {
229
- "content": "Generated response in HTML or Markdown format",
230
- "extract": {
231
- "structured": "data"
232
- }
233
- }
234
- ```
235
-
236
- #### Example Usage
237
-
238
- ```javascript
239
- import * as qwk from 'qwksearch-api-client';
240
-
241
- // Question answering
242
- const response = await qwk.writeLanguage({
243
- body: {
244
- provider: 'groq',
245
- key: process.env.GROQ_API_KEY,
246
- agent: 'question',
247
- query: 'Explain neural networks',
248
- temperature: 0.7
249
- }
250
- });
251
-
252
- const { content } = response;
253
- console.log(content);
254
-
255
- // Summarize article
256
- const summary = await qwk.writeLanguage({
257
- body: {
258
- provider: 'anthropic',
259
- key: process.env.ANTHROPIC_API_KEY,
260
- agent: 'summarize-bullets',
261
- article: articleText,
262
- html: false // Get Markdown
263
- }
264
- });
265
-
266
- // Answer with citations
267
- const answer = await qwk.writeLanguage({
268
- body: {
269
- provider: 'openai',
270
- key: process.env.OPENAI_API_KEY,
271
- agent: 'answer-cite-sources',
272
- query: 'What causes climate change?',
273
- context: 'Scientific articles about greenhouse gases...',
274
- temperature: 0.5
275
- }
276
- });
277
- console.log(answer.content);
278
- ```
279
-
280
- ---
281
-
282
- ### 3. Search Web (`/search`)
283
-
284
- Search the web using metasearch engine aggregating 100+ search sources.
285
-
286
- #### Features
287
-
288
- - **Privacy-Focused**: No tracking or personal data collection
289
- - **Multiple Categories**: General, news, videos, images, science, files, IT
290
- - **Recency Filters**: Filter by day, week, month, year
291
- - **Multi-Language**: Support for various languages
292
- - **Diverse Sources**: Aggregates from 100+ search engines
293
- - Search index exceeds 100,000,000 GB covering 130 trillion pages
294
- - Uses 200+ ranking factors including keywords, backlinks, page speed
295
-
296
- #### Request
297
-
298
- ```http
299
- GET /search?q={query}&cat={category}&recency={filter}&lang={language}
300
- ```
301
-
302
- **Parameters:**
303
-
304
- | Parameter | Type | Required | Default | Description |
305
- |-----------|------|----------|---------|-------------|
306
- | `q` | string | Yes | - | Search query string |
307
- | `cat` | string | No | general | Category: general, news, videos, images, science, files, it |
308
- | `recency` | string | No | all | Time filter: all, day, week, month, year |
309
- | `safesearch` | boolean | No | false | Block adult content |
310
- | `public` | boolean | No | false | Use public server instances |
311
- | `page` | integer | No | 1 | Pagination for results |
312
- | `lang` | string | No | en-US | Language code |
313
-
314
- #### Response
315
-
316
- **200 OK**
317
-
318
- ```json
319
- {
320
- "results": [
321
- {
322
- "title": "Search result title",
323
- "url": "https://example.com/page",
324
- "snippet": "Text snippet around the query...",
325
- "domain": "example.com",
326
- "favicon": "https://example.com/favicon.ico",
327
- "path": "/page",
328
- "engines": "google,bing"
329
- }
330
- ]
331
- }
332
- ```
333
-
334
- ## Installation
335
-
336
- ### NPM Package
337
-
338
- ```bash
339
- npm install qwksearch-api-client
340
- ```
341
-
342
- ---
343
-
344
-
345
-
346
- ## Links
347
-
348
- - **Documentation**: [airesearch.js.org](https://airesearch.js.org/)
349
- - **Demo**: [qwksearch.com](https://qwksearch.com/)
350
- - **GitHub**: [github.com/vtempest/ai-research-agent](https://github.com/vtempest/ai-research-agent)
351
- - **OpenAPI Spec**: [View Full Specification](./qwksearch-openapi.yml)
352
-
353
- - [LLM Training Example](https://github.com/vtempest/ai-research-agent/blob/master/packages/neural-net/src/train/predict-next-word.js)
354
- - [LangChain ReactAgent Tools](https://medium.com/@terrycho/how-langchain-agent-works-internally-trace-by-using-langsmith-df23766e7fb4)
355
- - [Hugging Face Tutorials](https://huggingface.co/learn)
356
- - [OpenAI Cookbook](https://cookbook.openai.com)
357
- - [Transformer Overview](https://jalammar.github.io/illustrated-transformer/)
358
- - [Building Transformer Guide](https://www.datacamp.com/tutorial/building-a-transformer-with-py-torch)
359
- - [PyTorch Overview](https://www.learnpytorch.io/pytorch_cheatsheet/)
360
- - [SearXNG Overview](https://medium.com/@elmo92/search-in-peace-with--an-alternative-search-engine-that-keeps-your-searches-private-accd8cddd6fc)
361
- - [Evaluating Large Language Models in Scientific Discovery](https://arxiv.org/pdf/2512.15567)
362
- ---
28
+ <p align="center">
29
+ <a href="https://qwksearch.com">Demo</a> •
30
+ <a href="https://airesearch.js.org">Documentation</a> •
31
+ <a href="https://github.com/vtempest/ai-research-agent">GitHub</a>
32
+ </p>
33
+
34
+
35
+ ## 🧠💻 Reimagine the Internet as Self-Organizing Mind Map
36
+
37
+ <p align="center">
38
+ <img src="https://i.imgur.com/Z9OJMwd.gif" />
39
+ </p>
40
+
41
+ Critical times call for critical thinkers to create a crowdsourced argument reasoning dataset, for AI models to recommend research quotes, to evolve crowdsourced chain-of-thought reasoning, to unlock faster ways to read long articles, to monitor developments by topic modeling a knowledge base graph, and to provide a public service of answers to research.
42
+
43
+ Language Models can distill the essence of collective thought into a vector space where every point has a weighted value representing its contribution to the overall decision-making process. AI will show its reasoning based on what sentences and cites it used from the collective research, so that people can see it is aligned with our interests. Research Agents recommend articles for human researchers working alongside AI to develop a summarized topic outline as a public service. The agents monitor for any related articles via web searches for keywords associated with that Topic Model. Imagine uploading a research paper, then the app extracts full text of reference cites and creates topic model and keyword summaries, then monitors that literature base and stores highlights. People will make personal knowledge bases of what influences them to create AI assistants cloning their mind-uploaded perspective and interests in a self-organizing mind map.
44
+
45
+ ```bash
46
+ # Download Source
47
+ bun x git0 vtempest/qwksearch-research-agent
48
+ ```
49
+
50
+ ```bash
51
+ # Import API Client
52
+ bun i qwksearch-api-client
53
+ ```
54
+
55
+ ## Overview
56
+
57
+ The typed client for the QwkSearch API — 85 functions generated from
58
+ [`qwksearch-openapi.json`](./qwksearch-openapi.json) with
59
+ [Hey API](https://heyapi.dev), covering research chat and search, article Q&A,
60
+ URL/PDF/YouTube scraping, the REASON document store, voice, provider and model
61
+ config, MCP servers, NotebookLM and accounts.
62
+
63
+
64
+
65
+ ## Transport: every call goes through `grab`
66
+
67
+ The generated SDK is wired to [**api2client**](https://github.com/OpenSourceAGI/GRAB-URL/tree/master/packages/api2client),
68
+ a [Hey API](https://heyapi.dev) client backed by [`grab`](https://grab.js.org),
69
+ rather than to `fetch`. The functions, their options and the
70
+ `{ data, error, request, response }` result are unchanged — only the transport
71
+ underneath is different — so every endpoint in this client picks up grab's
72
+ caching, retries, rate limiting, request dedupe, mock server and shared
73
+ request log.
74
+
75
+ Those are per-request options, alongside the usual `body`/`path`/`query`:
76
+
77
+ ```javascript
78
+ const { data, error } = await agentSearch({
79
+ query: { q: 'quantum computing' },
80
+ cache: true, // serve repeats from grab's cache
81
+ cacheForTime: 60, // …for 60 seconds
82
+ retryAttempts: 2,
83
+ timeout: 15,
84
+ rateLimit: 1, // min seconds between calls to this path
85
+ });
86
+ ```
87
+
88
+ Or client-wide, for every call on that client:
89
+
90
+ ```javascript
91
+ import { createClient, createConfig } from 'qwksearch-api-client/client';
92
+
93
+ const client = createClient(createConfig({ cache: true, retryAttempts: 2 }));
94
+ await agentSearch({ query: { q: 'quantum computing' }, client });
95
+ ```
96
+
97
+ Because grab keys its cache, dedupe and mocks by **path**, an endpoint can be
98
+ stubbed without touching the network:
99
+
100
+ ```javascript
101
+ import { grab } from 'grab-url';
102
+
103
+ grab.mock['/agent/search'] = { response: { results: [] } };
104
+ ```
105
+
106
+ > Recovering the HTTP status and the parsed error body from behind grab needs
107
+ > its `onRawResponse` hook, added in **grab-url 1.6.23**. On an older grab,
108
+ > api2client cannot hand back a `Response`, so `result.response` is
109
+ > `undefined` and `result.error` is grab's own `"HTTP error: <status>"` string
110
+ > instead of the handler's JSON body.
111
+
112
+ ## Complete Example: Research Pipeline
113
+
114
+ Search the web, read the top results, then ask a question grounded in them:
115
+
116
+ ```javascript
117
+ import { agentSearch, scrapeGet, articleQa } from 'qwksearch-api-client';
118
+
119
+ async function researchTopic(topic) {
120
+ // 1. Search for relevant articles
121
+ const { data: search } = await agentSearch({
122
+ query: { q: topic, cat: 'science', recency: 'month' },
123
+ });
124
+
125
+ console.log(`Found ${search.results.length} results`);
126
+
127
+ // 2. Read the top 3 results
128
+ const articles = await Promise.all(
129
+ search.results.slice(0, 3).map(async ({ url }) => {
130
+ const { data } = await scrapeGet({ query: { url, format: 'json' } });
131
+ return data;
132
+ }),
133
+ );
134
+
135
+ // 3. Ask a question grounded in all of them
136
+ const combinedText = articles
137
+ .map((a) => `${a.title}\n\n${a.html}`)
138
+ .join('\n\n---\n\n');
139
+
140
+ const { data: answer } = await articleQa({
141
+ body: {
142
+ article: combinedText,
143
+ question: `Summarise the state of ${topic} in bullet points.`,
144
+ chatModel: { providerId: 'groq', key: 'llama-3.3-70b-versatile' },
145
+ },
146
+ });
147
+
148
+ return { searchResults: search.results, articles, summary: answer.content };
149
+ }
150
+
151
+ researchTopic('quantum computing applications').then((results) => {
152
+ console.log('Research Summary:');
153
+ console.log(results.summary);
154
+ });
155
+ ```
156
+
157
+ Every function returns `{ data, error, request, response }` and **does not
158
+ throw** by default — read `error`, or pass `throwOnError: true`.
159
+
160
+ ---
161
+
162
+
163
+ ## API Endpoints
164
+
165
+ The full, current surface is the generated SDK itself — 85 typed functions, one
166
+ per operation in [`qwksearch-openapi.json`](./qwksearch-openapi.json), which
167
+ this package also exports:
168
+
169
+ ```javascript
170
+ import spec from 'qwksearch-api-client/openapi.json';
171
+ ```
172
+
173
+ Browse it rendered at [qwksearch.com/api/docs](https://qwksearch.com/api/docs),
174
+ or by area:
175
+
176
+ | Area | Functions |
177
+ | --- | --- |
178
+ | Agent | `agentChat`, `agentSearch`, `articleQa`, `articleFollowups`, `generateSuggestions`, `discoverContent`, `rewriteText`, `autocomplete` |
179
+ | Chats | `listChats`, `getChatById`, `searchChats`, `saveMessage`, `shareChat`, `deleteChatById`, `deleteAllChats` |
180
+ | Documents | `listDocuments`, `createDocument`, `getDocumentById`, `updateDocument`, `deleteDocument`, `shareDocument`, `getSharedDocument` |
181
+ | Articles & quotes | `getArticle`, `updateArticle`, `listQuotes`, `createQuote`, `updateQuote`, `deleteQuote`, `listFavorites`, `addFavorite`, `removeFavorite` |
182
+ | Files | `uploadFiles`, `getUploadedFile`, `deleteUploadedFile`, `getUserStorage` |
183
+ | Voice | `transcribeAudio`, `textToSpeech` |
184
+ | Config & models | `getConfig`, `saveConfig`, `listProviders`, `addProvider`, `updateProvider`, `deleteProvider`, `addProviderModel`, `deleteProviderModel`, `testModels` |
185
+ | MCP | `listMcpServers`, `addMcpServer`, `updateMcpServer`, `toggleMcpServer`, `deleteMcpServer` |
186
+ | Search & scraping | `agentSearch`, `listSearchEngines`, `getEngineStatus`, `updateEngineStatus`, `testSearchEngines`, `scrapeGet`, `scrapePost` |
187
+ | Google Docs / Drive | `googleDocsAuth`, `googleDocsAuthStatus`, `googleDocsCallback`, `exportToGoogleDocs`, `importFromGoogleDocs`, `getGoogleDriveFile`, `shareGoogleDoc`, `getGoogleToken`, `refreshGoogleToken` |
188
+ | NotebookLM | `notebooklmLogin`, `getNotebooklmStatus`, `disconnectNotebooklm`, `listNotebooks`, `createNotebook`, `deleteNotebook`, `askNotebook`, `listNotebookSources`, `addNotebookSource`, `generateNotebookAudio` |
189
+ | Accounts | `getUser`, `updateUser`, `deleteUser`, `deleteUserAccount`, `changePassword`, `listSessions`, `revokeSession`, `revokeOtherSessions`, `listUserAccounts` |
190
+
191
+ ### Removed in 1.0: `extractContent`, `writeLanguage`, `searchWeb`
192
+
193
+ The 0.x client wrapped three endpoints — `/extract`, `/agents` and `/search`.
194
+ All three are gone from the API, and so are those three functions. `/agents`
195
+ in particular now answers **501** and says so. Replace them with:
196
+
197
+ | 0.x | Use instead |
198
+ | --- | --- |
199
+ | `searchWeb({ query: { q } })` | `agentSearch({ query: { q } })` |
200
+ | `extractContent({ query: { url } })` | `scrapeGet({ query: { url } })` |
201
+ | `writeLanguage({ body: { agent: 'question', article } })` | `articleQa({ body: { article, question } })` |
202
+ | `writeLanguage({ body: { agent: 'summarize-bullets', article } })` | `articleQa({ body: { article, question: 'Summarise this in bullet points.' } })` |
203
+ | anything conversational | `agentChat` (server-sent events) |
204
+
205
+ Importing a removed function is not a runtime error — it is `undefined` until
206
+ you call it, and bundlers only warn. Check against the table above.
207
+
208
+ ## Installation
209
+
210
+ ### NPM Package
211
+
212
+ ```bash
213
+ npm install qwksearch-api-client
214
+ ```
215
+
216
+ ---
217
+
218
+
219
+
220
+ ## Links
221
+
222
+ - **Documentation**: [airesearch.js.org](https://airesearch.js.org/)
223
+ - **Demo**: [qwksearch.com](https://qwksearch.com/)
224
+ - **GitHub**: [github.com/vtempest/ai-research-agent](https://github.com/vtempest/ai-research-agent)
225
+ - **OpenAPI Spec**: [View Full Specification](./qwksearch-openapi.yml)
226
+
227
+ - [LLM Training Example](https://github.com/vtempest/ai-research-agent/blob/master/packages/neural-net/src/train/predict-next-word.js)
228
+ - [LangChain ReactAgent Tools](https://medium.com/@terrycho/how-langchain-agent-works-internally-trace-by-using-langsmith-df23766e7fb4)
229
+ - [Hugging Face Tutorials](https://huggingface.co/learn)
230
+ - [OpenAI Cookbook](https://cookbook.openai.com)
231
+ - [Transformer Overview](https://jalammar.github.io/illustrated-transformer/)
232
+ - [Building Transformer Guide](https://www.datacamp.com/tutorial/building-a-transformer-with-py-torch)
233
+ - [PyTorch Overview](https://www.learnpytorch.io/pytorch_cheatsheet/)
234
+ - [SearXNG Overview](https://medium.com/@elmo92/search-in-peace-with--an-alternative-search-engine-that-keeps-your-searches-private-accd8cddd6fc)
235
+ - [Evaluating Large Language Models in Scientific Discovery](https://arxiv.org/pdf/2512.15567)
236
+ ---