Skip to content

Commit 461910a

Browse files
authored
feat: integrate web search results into UI (#624)
Signed-off-by: Bob Du <[email protected]>
1 parent 068ca67 commit 461910a

File tree

13 files changed

+327
-16
lines changed

13 files changed

+327
-16
lines changed

service/src/chatgpt/index.ts

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import type { ClientOptions } from 'openai'
22
import type { RequestInit } from 'undici'
3-
import type { AuditConfig, Config, KeyConfig, UserInfo } from '../storage/model'
3+
import type { AuditConfig, Config, KeyConfig, SearchResult, UserInfo } from '../storage/model'
44
import type { TextAuditService } from '../utils/textAudit'
55
import type { ChatMessage, RequestOptions } from './types'
66
import { tavily } from '@tavily/core'
@@ -129,23 +129,42 @@ async function chatReplyProcess(options: RequestOptions) {
129129
if (searchQuery) {
130130
await updateChatSearchQuery(messageId, searchQuery)
131131

132+
process?.({
133+
searchQuery,
134+
})
135+
132136
const tvly = tavily({ apiKey: searchConfig.options?.apiKey })
133137
const response = await tvly.search(
134138
searchQuery,
135139
{
136140
includeRawContent: true,
137-
timeout: 300,
141+
// 0 <= x <= 20 https://docs.tavily.com/documentation/api-reference/endpoint/search#body-max-results
142+
maxResults: 20,
143+
// Max 120s, default to 60 https://github.com/tavily-ai/tavily-js/blob/de69e479c5d3f6c5d443465fa2c29407c0d3515d/src/search.ts#L118
144+
timeout: 120,
138145
},
139146
)
140147

141-
const searchResult = JSON.stringify(response)
142-
await updateChatSearchResult(messageId, searchResult)
148+
const searchResults = response.results as SearchResult[]
149+
const searchUsageTime = response.responseTime
150+
151+
await updateChatSearchResult(messageId, searchResults, searchUsageTime)
152+
153+
process?.({
154+
searchResults,
155+
searchUsageTime,
156+
})
157+
158+
let searchResultContent = JSON.stringify(searchResults)
159+
// remove base64 image content
160+
const base64Pattern = /data:image\/[a-zA-Z0-9+.-]+;base64,[A-Za-z0-9+/=]+/g
161+
searchResultContent = searchResultContent.replace(base64Pattern, '')
143162

144163
messages.push({
145164
role: 'user',
146165
content: `Additional information from web searche engine.
147166
search query: <search_query>${searchQuery}</search_query>
148-
search result: <search_result>${searchResult}</search_result>`,
167+
search result: <search_result>${searchResultContent}</search_result>`,
149168
})
150169

151170
messages[0].content = renderSystemMessage(searchConfig.systemMessageWithSearchResult, dayjs().format('YYYY-MM-DD HH:mm:ss'))

service/src/chatgpt/types.ts

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import type OpenAI from 'openai'
2-
import type { ChatRoom, UserInfo } from 'src/storage/model'
2+
import type { ChatRoom, SearchResult, UserInfo } from 'src/storage/model'
33

44
export interface ChatMessage {
55
id: string
@@ -12,11 +12,14 @@ export interface ChatMessage {
1212
}
1313

1414
export interface ResponseChunk {
15-
id: string
16-
text: string
17-
reasoning: string
18-
role: string
19-
finish_reason: string
15+
id?: string
16+
searchQuery?: string
17+
searchResults?: SearchResult[]
18+
searchUsageTime?: number
19+
text?: string
20+
reasoning?: string
21+
role?: string
22+
finish_reason?: string
2023
}
2124

2225
export interface RequestOptions {

service/src/routes/chat.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,9 @@ router.get('/chat-history', auth, async (req, res) => {
8888
result.push({
8989
uuid: c.uuid,
9090
dateTime: new Date(c.dateTime).toLocaleString(),
91+
searchQuery: c.searchQuery,
92+
searchResults: c.searchResults,
93+
searchUsageTime: c.searchUsageTime,
9194
reasoning: c.reasoning,
9295
text: c.response,
9396
inversion: false,

service/src/storage/model.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,12 @@ export class previousResponse {
117117
options: ChatOptions
118118
}
119119

120+
export class SearchResult {
121+
title: string
122+
url: string
123+
content: string
124+
}
125+
120126
export class ChatInfo {
121127
_id: ObjectId
122128
roomId: number
@@ -126,7 +132,8 @@ export class ChatInfo {
126132
prompt: string
127133
images?: string[]
128134
searchQuery?: string
129-
searchResult?: string
135+
searchResults?: SearchResult[]
136+
searchUsageTime?: number
130137
reasoning?: string
131138
response?: string
132139
status: Status = Status.Normal

service/src/storage/mongo.ts

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,14 @@
11
import type { WithId } from 'mongodb'
2-
import type { AdvancedConfig, ChatOptions, Config, GiftCard, KeyConfig, UsageResponse, UserPrompt } from './model'
2+
import type {
3+
AdvancedConfig,
4+
ChatOptions,
5+
Config,
6+
GiftCard,
7+
KeyConfig,
8+
SearchResult,
9+
UsageResponse,
10+
UserPrompt,
11+
} from './model'
312
import * as process from 'node:process'
413
import dayjs from 'dayjs'
514
import * as dotenv from 'dotenv'
@@ -125,11 +134,12 @@ export async function updateChatSearchQuery(chatId: string, searchQuery: string)
125134
return result.modifiedCount > 0
126135
}
127136

128-
export async function updateChatSearchResult(chatId: string, searchResult: string) {
137+
export async function updateChatSearchResult(chatId: string, searchResults: SearchResult[], searchUsageTime: number) {
129138
const query = { _id: new ObjectId(chatId) }
130139
const update = {
131140
$set: {
132-
searchResult,
141+
searchResults,
142+
searchUsageTime,
133143
},
134144
}
135145
const result = await chatCol.updateOne(query, update)

src/locales/en-US.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,12 @@ export default {
9898
reasoningProcess: 'Reasoning Process',
9999
noReasoningProcess: 'No Reasoning Process',
100100
expandCollapseReasoningProcess: 'Expand/Collapse Reasoning Process',
101+
searching: 'Searching',
102+
searchQuery: 'Search query',
103+
searchResults: 'Search Results',
104+
searchUsageTime: 'Search time',
105+
noSearchResults: 'No Search Results',
106+
expandCollapseSearchResults: 'Expand/Collapse Search Results',
101107
},
102108
setting: {
103109
overRide: 'Enable Override',

src/locales/ko-KR.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,12 @@ export default {
9898
reasoningProcess: '추론 과정',
9999
noReasoningProcess: '추론 과정 없음',
100100
expandCollapseReasoningProcess: '추론 과정 펼치기/접기',
101+
searching: '검색 중',
102+
searchQuery: '검색어',
103+
searchResults: '검색 결과',
104+
searchUsageTime: '검색 시간',
105+
noSearchResults: '검색 결과 없음',
106+
expandCollapseSearchResults: '검색 결과 펼치기/접기',
101107
},
102108
setting: {
103109
overRide: '덮어쓰기 활성화',

src/locales/zh-CN.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,12 @@ export default {
9898
reasoningProcess: '推理过程',
9999
noReasoningProcess: '无推理过程',
100100
expandCollapseReasoningProcess: '展开/折叠推理过程',
101+
searching: '搜索中',
102+
searchQuery: '搜索查询词',
103+
searchResults: '搜索结果',
104+
searchUsageTime: '搜索用时',
105+
noSearchResults: '无搜索结果',
106+
expandCollapseSearchResults: '展开/折叠搜索结果',
101107
},
102108
setting: {
103109
overRide: '开启覆写',

src/locales/zh-TW.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,12 @@ export default {
9898
reasoningProcess: '推理過程',
9999
noReasoningProcess: '無推理過程',
100100
expandCollapseReasoningProcess: '展開/收合推理過程',
101+
searching: '搜尋中',
102+
searchQuery: '搜尋詞',
103+
searchResults: '搜尋結果',
104+
searchUsageTime: '搜尋用時',
105+
noSearchResults: '無搜尋結果',
106+
expandCollapseSearchResults: '展開/收合搜尋結果',
101107
},
102108
setting: {
103109
overRide: '開啟覆寫',

src/typings/chat.d.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,16 @@
11
declare namespace Chat {
2+
interface SearchResult {
3+
title: string
4+
url: string
5+
content: string
6+
}
7+
28
interface Chat {
39
uuid?: number
410
dateTime: string
11+
searchQuery?: string
12+
searchResults?: SearchResult[]
13+
searchUsageTime?: number
514
reasoning?: string
615
finish_reason?: string
716
text: string

0 commit comments

Comments
 (0)