diff options
| author | MaheshtheDev <[email protected]> | 2026-01-15 21:53:53 +0000 |
|---|---|---|
| committer | MaheshtheDev <[email protected]> | 2026-01-15 21:53:53 +0000 |
| commit | 59c294b29998a861a870629d513f6da74b3d76ac (patch) | |
| tree | 265c9fe27984c6d322ba2e51b0fc91bc2302698d /apps/web/app/api/onboarding/extract-content/route.ts | |
| parent | chore: quick bugs squash across the elements and added few more changes (#671) (diff) | |
| download | supermemory-59c294b29998a861a870629d513f6da74b3d76ac.tar.xz supermemory-59c294b29998a861a870629d513f6da74b3d76ac.zip | |
feat: deep-research on user profile and tiptap integration (#672)01-14-feat_deep-research_on_user_profile
deep-research on user profile
add novel integration
tiptap 3.x integration
Diffstat (limited to 'apps/web/app/api/onboarding/extract-content/route.ts')
| -rw-r--r-- | apps/web/app/api/onboarding/extract-content/route.ts | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/apps/web/app/api/onboarding/extract-content/route.ts b/apps/web/app/api/onboarding/extract-content/route.ts new file mode 100644 index 00000000..6cdb40d5 --- /dev/null +++ b/apps/web/app/api/onboarding/extract-content/route.ts @@ -0,0 +1,61 @@ +export interface ExaContentResult { + url: string + text: string + title: string + author?: string +} + +interface ExaApiResponse { + results: ExaContentResult[] +} + +export async function POST(request: Request) { + try { + const { urls } = await request.json() + + if (!Array.isArray(urls) || urls.length === 0) { + return Response.json( + { error: "Invalid input: urls must be a non-empty array" }, + { status: 400 }, + ) + } + + if (!urls.every((url) => typeof url === "string" && url.trim())) { + return Response.json( + { error: "Invalid input: all urls must be non-empty strings" }, + { status: 400 }, + ) + } + + const response = await fetch("https://api.exa.ai/contents", { + method: "POST", + headers: { + "x-api-key": process.env.EXA_API_KEY ?? "", + "Content-Type": "application/json", + }, + body: JSON.stringify({ + urls, + text: true, + livecrawl: "fallback", + }), + }) + + if (!response.ok) { + console.error( + "Exa API request failed:", + response.status, + response.statusText, + ) + return Response.json( + { error: "Failed to fetch content from Exa API" }, + { status: 500 }, + ) + } + + const data: ExaApiResponse = await response.json() + return Response.json({ results: data.results }) + } catch (error) { + console.error("Exa API request error:", error) + return Response.json({ error: "Internal server error" }, { status: 500 }) + } +} |