Skip to content

feat: add custom URL support and include all sources in array #2

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Feb 3, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .env.example
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@

OPENAI_API_KEY=your_openai_key

FIRECRAWL_API_KEY=your_firecrawl_key
NEXT_PUBLIC_FIRECRAWL_API_KEY=your_firecrawl_key

SERPER_API_KEY=your_serper_key

UPSTASH_REDIS_REST_URL=your_redis_url
UPSTASH_REDIS_REST_TOKEN=your_redis_token

API_ROUTE=http://localhost:3000
NEXT_PUBLIC_API_ROUTE=http://localhost:3000
3 changes: 2 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,8 @@ npm install
3. Create a `.env` file with the following variables:
```env
OPENAI_API_KEY=your_openai_key
FIRECRAWL_API_KEY=your_firecrawl_key
NEXT_PUBLIC_FIRECRAWL_API_KEY=your_firecrawl_key
SERPER_API_KEY=your_serper_key
UPSTASH_REDIS_REST_URL=your_redis_url
UPSTASH_REDIS_REST_TOKEN=your_redis_token
NEXT_PUBLIC_API_ROUTE=http://localhost:3000 # Your API base URL
Expand Down
41 changes: 36 additions & 5 deletions app/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,9 @@ export default function Home() {
const [isSearching, setIsSearching] = useState(false);
const [searchQuery, setSearchQuery] = useState('');

// Add state for custom URL input
const [customUrl, setCustomUrl] = useState('');

// Steps configuration
const steps = [
{ number: 1, title: 'Describe Your API', description: 'Tell us what data you want to extract' },
Expand Down Expand Up @@ -310,7 +313,12 @@ export default function Home() {
};

const handleExtractData = async () => {
if (!searchResults.some(r => r.selected)) {
const selectedUrls = [
...searchResults.filter(r => r.selected).map(r => r.url),
...(customUrl ? [customUrl] : [])
];

if (selectedUrls.length === 0) {
setError('Please select at least one source');
return;
}
Expand All @@ -321,7 +329,6 @@ export default function Home() {
setTransitionMessage('Extracting data from sources...');

try {
const selectedUrls = searchResults.filter(r => r.selected).map(r => r.url);
const schemaRequest = JSON.parse(schemaStr) as JsonSchema;

console.log('OpenAI Generated Schema:', schemaRequest);
Expand Down Expand Up @@ -507,8 +514,8 @@ export default function Home() {
};

const handleSourcesSubmit = async () => {
if (!searchResults.some(r => r.selected)) {
setError('Please select at least one source');
if (!searchResults.some(r => r.selected) && !customUrl) {
setError('Please select at least one source or enter a custom URL');
return;
}

Expand Down Expand Up @@ -713,7 +720,10 @@ export default function Home() {
metadata: {
query: query,
schema: JSON.parse(schemaStr),
sources: searchResults.filter(r => r.selected).map(r => r.url),
sources: [
...searchResults.filter(r => r.selected).map(r => r.url),
...(customUrl ? [customUrl] : [])
],
lastUpdated: new Date().toISOString()
}
},
Expand Down Expand Up @@ -1025,6 +1035,27 @@ export default function Home() {
</div>
</div>

{/* Custom URL input */}
<div className="px-6 pb-6">
<div className={`bg-white/5 backdrop-blur-sm rounded-lg p-6 border ${customUrl ? 'border-emerald-500' : 'border-white/10'}`}>
<div className="space-y-4">
<input
type="text"
placeholder="Enter a custom URL..."
className="w-full px-4 py-3 bg-white/5 border border-white/10 rounded-lg text-white placeholder-white/40 focus:outline-none focus:ring-2 focus:ring-emerald-500/50"
value={customUrl}
onChange={(e) => setCustomUrl(e.target.value)}
/>
{customUrl && (
<div className="flex items-center space-x-2 text-emerald-500">
<CheckIcon className="w-5 h-5" aria-hidden="true" />
<span className="text-sm">Custom URL is set</span>
</div>
)}
</div>
</div>
</div>

{/* Search results */}
<div className="px-6 pb-6">
<div className="bg-white/5 backdrop-blur-sm rounded-lg p-6 border border-white/10">
Expand Down