-
-
Notifications
You must be signed in to change notification settings - Fork 9.7k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
✨ feat: add builtin search with SearXNG
- Loading branch information
Showing
31 changed files
with
1,995 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
import { createEnv } from '@t3-oss/env-nextjs'; | ||
import { z } from 'zod'; | ||
|
||
export const getToolsConfig = () => { | ||
return createEnv({ | ||
runtimeEnv: { | ||
SEARXNG_URL: process.env.SEARXNG_URL || 'https://searx.tiekoetter.com/', | ||
}, | ||
|
||
server: { | ||
SEARXNG_URL: z.string().url(), | ||
}, | ||
}); | ||
}; | ||
|
||
export const toolsEnv = getToolsConfig(); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,4 @@ | ||
export { asyncClient } from './async'; | ||
export { edgeClient } from './edge'; | ||
export * from './lambda'; | ||
export * from './tools'; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
import { createTRPCClient, httpBatchLink } from '@trpc/client'; | ||
import superjson from 'superjson'; | ||
|
||
import type { ToolsRouter } from '@/server/routers/tools'; | ||
|
||
export const toolsClient = createTRPCClient<ToolsRouter>({ | ||
links: [ | ||
httpBatchLink({ | ||
transformer: superjson, | ||
url: '/trpc/tools', | ||
}), | ||
], | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
import qs from 'query-string'; | ||
|
||
import { SearchResponse } from '@/types/tool/search'; | ||
|
||
export class SearXNGClient { | ||
private baseUrl: string; | ||
|
||
constructor(baseUrl: string) { | ||
this.baseUrl = baseUrl; | ||
} | ||
|
||
async search(query: string, engines?: string[]): Promise<SearchResponse> { | ||
try { | ||
const searchParams = qs.stringify({ | ||
engines: engines?.join(','), | ||
format: 'json', | ||
q: query, | ||
}); | ||
|
||
const response = await fetch(`${this.baseUrl}/search?${searchParams}`); | ||
|
||
return await response.json(); | ||
} catch (error) { | ||
console.error('Error searching:', error); | ||
throw error; | ||
} | ||
} | ||
} |
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
// @vitest-environment node | ||
import { beforeEach, describe, expect, it, vi } from 'vitest'; | ||
|
||
import { toolsEnv } from '@/config/tools'; | ||
|
||
/** | ||
* This file contains the root router of your tRPC-backend | ||
*/ | ||
import { createCallerFactory } from '@/libs/trpc'; | ||
import { AuthContext, createContextInner } from '@/server/context'; | ||
import { SearXNGClient } from '@/server/modules/SearXNG'; | ||
|
||
import { searchRouter } from '../search'; | ||
import { hetongxue } from './fixtures/searXNG'; | ||
|
||
vi.mock('@/config/tools', () => ({ | ||
toolsEnv: vi.fn(), | ||
})); | ||
|
||
const createCaller = createCallerFactory(searchRouter); | ||
let ctx: AuthContext; | ||
let router: ReturnType<typeof createCaller>; | ||
|
||
beforeEach(async () => { | ||
vi.resetAllMocks(); | ||
ctx = await createContextInner({ userId: 'mock' }); | ||
router = createCaller(ctx); | ||
}); | ||
|
||
describe('searchRouter', () => { | ||
describe('search', () => { | ||
it('搜索结果超过10个', async () => { | ||
vi.spyOn(SearXNGClient.prototype, 'search').mockResolvedValueOnce(hetongxue); | ||
|
||
const results = await router.query({ query: '何同学' }); | ||
|
||
// Assert | ||
expect(results.results.length).toEqual(10); | ||
}); | ||
}); | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,7 +1,10 @@ | ||
import { publicProcedure, router } from '@/libs/trpc'; | ||
|
||
import { searchRouter } from './search'; | ||
|
||
export const toolsRouter = router({ | ||
healthcheck: publicProcedure.query(() => "i'm live!"), | ||
search: searchRouter, | ||
}); | ||
|
||
export type ToolsRouter = typeof toolsRouter; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
import { z } from 'zod'; | ||
|
||
import { toolsEnv } from '@/config/tools'; | ||
import { authedProcedure, router } from '@/libs/trpc'; | ||
import { SearXNGClient } from '@/server/modules/SearXNG'; | ||
|
||
export const searchRouter = router({ | ||
query: authedProcedure | ||
.input( | ||
z.object({ | ||
query: z.string(), | ||
searchEngine: z.array(z.string()).optional(), | ||
}), | ||
) | ||
.query(async ({ input }) => { | ||
const client = new SearXNGClient(toolsEnv.SEARXNG_URL); | ||
|
||
return await client.search(input.query, input.searchEngine); | ||
}), | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
import { toolsClient } from '@/libs/trpc/client'; | ||
|
||
class SearchService { | ||
search(query: string, searchEngine?: string[]) { | ||
return toolsClient.search.query.query({ query, searchEngine }); | ||
} | ||
} | ||
|
||
export const searchService = new SearchService(); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,8 @@ | ||
import { BuiltinPortal } from '@/types/tool'; | ||
|
||
export const BuiltinToolsPortals: Record<string, BuiltinPortal> = {}; | ||
import { WebBrowsingManifest } from './web-browsing'; | ||
import WebBrowsing from './web-browsing/Portal'; | ||
|
||
export const BuiltinToolsPortals: Record<string, BuiltinPortal> = { | ||
[WebBrowsingManifest.identifier]: WebBrowsing as BuiltinPortal, | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.