feat: add use_llm_for_source_links and use_llm_for_article_extraction settings

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
master
oabrivard 3 months ago
parent d508ea9620
commit e483789d1b

@ -117,7 +117,7 @@ cd frontend && npx tsc --noEmit
- `GET /api/v1/admin/users` — user list
- `PUT /api/v1/admin/users/:id/role` — role management
## Database (13 migrations)
## Database (14 migrations)
Tables: `users`, `sessions`, `magic_link_tokens`, `user_settings`, `sources`, `syntheses`, `admin_providers`, `admin_rate_limits`, `user_api_keys`, `audit_log`
## Environment Variables

@ -0,0 +1,2 @@
ALTER TABLE settings ADD COLUMN use_llm_for_source_links BOOLEAN NOT NULL DEFAULT false;
ALTER TABLE settings ADD COLUMN use_llm_for_article_extraction BOOLEAN NOT NULL DEFAULT false;

@ -19,6 +19,8 @@ struct SettingsRow {
max_items_per_category: i32,
max_articles_per_source: i32,
source_diversity_window: i32,
use_llm_for_source_links: bool,
use_llm_for_article_extraction: bool,
search_agent_behavior: String,
ai_provider: String,
ai_model: String,
@ -44,6 +46,8 @@ impl TryFrom<SettingsRow> for UserSettings {
max_items_per_category: row.max_items_per_category,
max_articles_per_source: row.max_articles_per_source,
source_diversity_window: row.source_diversity_window,
use_llm_for_source_links: row.use_llm_for_source_links,
use_llm_for_article_extraction: row.use_llm_for_article_extraction,
search_agent_behavior: row.search_agent_behavior,
ai_provider: row.ai_provider,
ai_model: row.ai_model,
@ -70,10 +74,10 @@ pub async fn get_or_create_default(
let row = sqlx::query_as::<_, SettingsRow>(
r#"
INSERT INTO settings (user_id, theme, max_age_days, categories, max_items_per_category, search_agent_behavior, ai_provider, ai_model, ai_model_writing, rate_limit_max_requests, rate_limit_time_window_seconds, max_articles_per_source, source_diversity_window)
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13)
INSERT INTO settings (user_id, theme, max_age_days, categories, max_items_per_category, search_agent_behavior, ai_provider, ai_model, ai_model_writing, rate_limit_max_requests, rate_limit_time_window_seconds, max_articles_per_source, source_diversity_window, use_llm_for_source_links, use_llm_for_article_extraction)
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15)
ON CONFLICT (user_id) DO UPDATE SET user_id = settings.user_id
RETURNING user_id, theme, max_age_days, categories, max_items_per_category, search_agent_behavior, ai_provider, ai_model, ai_model_writing, rate_limit_max_requests, rate_limit_time_window_seconds, max_articles_per_source, source_diversity_window, updated_at
RETURNING user_id, theme, max_age_days, categories, max_items_per_category, search_agent_behavior, ai_provider, ai_model, ai_model_writing, rate_limit_max_requests, rate_limit_time_window_seconds, max_articles_per_source, source_diversity_window, use_llm_for_source_links, use_llm_for_article_extraction, updated_at
"#,
)
.bind(user_id)
@ -89,6 +93,8 @@ pub async fn get_or_create_default(
.bind(defaults.rate_limit_time_window_seconds)
.bind(defaults.max_articles_per_source)
.bind(defaults.source_diversity_window)
.bind(defaults.use_llm_for_source_links)
.bind(defaults.use_llm_for_article_extraction)
.fetch_one(pool)
.await?;
@ -107,8 +113,8 @@ pub async fn upsert(
let row = sqlx::query_as::<_, SettingsRow>(
r#"
INSERT INTO settings (user_id, theme, max_age_days, categories, max_items_per_category, search_agent_behavior, ai_provider, ai_model, ai_model_writing, rate_limit_max_requests, rate_limit_time_window_seconds, max_articles_per_source, source_diversity_window)
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13)
INSERT INTO settings (user_id, theme, max_age_days, categories, max_items_per_category, search_agent_behavior, ai_provider, ai_model, ai_model_writing, rate_limit_max_requests, rate_limit_time_window_seconds, max_articles_per_source, source_diversity_window, use_llm_for_source_links, use_llm_for_article_extraction)
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15)
ON CONFLICT (user_id) DO UPDATE SET
theme = EXCLUDED.theme,
max_age_days = EXCLUDED.max_age_days,
@ -122,8 +128,10 @@ pub async fn upsert(
rate_limit_time_window_seconds = EXCLUDED.rate_limit_time_window_seconds,
max_articles_per_source = EXCLUDED.max_articles_per_source,
source_diversity_window = EXCLUDED.source_diversity_window,
use_llm_for_source_links = EXCLUDED.use_llm_for_source_links,
use_llm_for_article_extraction = EXCLUDED.use_llm_for_article_extraction,
updated_at = now()
RETURNING user_id, theme, max_age_days, categories, max_items_per_category, search_agent_behavior, ai_provider, ai_model, ai_model_writing, rate_limit_max_requests, rate_limit_time_window_seconds, max_articles_per_source, source_diversity_window, updated_at
RETURNING user_id, theme, max_age_days, categories, max_items_per_category, search_agent_behavior, ai_provider, ai_model, ai_model_writing, rate_limit_max_requests, rate_limit_time_window_seconds, max_articles_per_source, source_diversity_window, use_llm_for_source_links, use_llm_for_article_extraction, updated_at
"#,
)
.bind(user_id)
@ -139,6 +147,8 @@ pub async fn upsert(
.bind(req.rate_limit_time_window_seconds)
.bind(req.max_articles_per_source)
.bind(req.source_diversity_window)
.bind(req.use_llm_for_source_links)
.bind(req.use_llm_for_article_extraction)
.fetch_one(pool)
.await?;

@ -14,6 +14,8 @@ pub struct UserSettings {
pub max_items_per_category: i32,
pub max_articles_per_source: i32,
pub source_diversity_window: i32,
pub use_llm_for_source_links: bool,
pub use_llm_for_article_extraction: bool,
pub search_agent_behavior: String,
pub ai_provider: String,
pub ai_model: String,
@ -32,6 +34,8 @@ pub struct SettingsResponse {
pub max_items_per_category: i32,
pub max_articles_per_source: i32,
pub source_diversity_window: i32,
pub use_llm_for_source_links: bool,
pub use_llm_for_article_extraction: bool,
pub search_agent_behavior: String,
pub ai_provider: String,
pub ai_model: String,
@ -49,6 +53,8 @@ impl From<UserSettings> for SettingsResponse {
max_items_per_category: s.max_items_per_category,
max_articles_per_source: s.max_articles_per_source,
source_diversity_window: s.source_diversity_window,
use_llm_for_source_links: s.use_llm_for_source_links,
use_llm_for_article_extraction: s.use_llm_for_article_extraction,
search_agent_behavior: s.search_agent_behavior,
ai_provider: s.ai_provider,
ai_model: s.ai_model,
@ -68,6 +74,8 @@ pub struct UpdateSettingsRequest {
pub max_items_per_category: i32,
pub max_articles_per_source: i32,
pub source_diversity_window: i32,
pub use_llm_for_source_links: bool,
pub use_llm_for_article_extraction: bool,
pub search_agent_behavior: String,
pub ai_provider: String,
pub ai_model: String,
@ -160,6 +168,8 @@ impl Default for UserSettings {
max_items_per_category: 4,
max_articles_per_source: 3,
source_diversity_window: 3,
use_llm_for_source_links: false,
use_llm_for_article_extraction: false,
search_agent_behavior: String::new(),
ai_provider: String::new(),
ai_model: String::new(),
@ -184,6 +194,8 @@ mod tests {
max_items_per_category: 4,
max_articles_per_source: 3,
source_diversity_window: 3,
use_llm_for_source_links: false,
use_llm_for_article_extraction: false,
search_agent_behavior: String::new(),
ai_provider: String::new(),
ai_model: String::new(),

@ -232,6 +232,8 @@ mod tests {
max_items_per_category: 4,
max_articles_per_source: 3,
source_diversity_window: 3,
use_llm_for_source_links: false,
use_llm_for_article_extraction: false,
search_agent_behavior: String::new(),
ai_provider: String::new(),
ai_model: String::new(),

Loading…
Cancel
Save