diff --git a/frontend/src/components/Dashboard-AI.vue b/frontend/src/components/Dashboard-AI.vue
index e3a2923..41d7c77 100644
--- a/frontend/src/components/Dashboard-AI.vue
+++ b/frontend/src/components/Dashboard-AI.vue
@@ -55,6 +55,11 @@
+
+
+ {{ formatDate(scope.row.publishDate) }}
+
+
@@ -117,6 +122,7 @@ interface AIRecommendation {
url: string
source: string
confidence: number
+ publishDate?: string
}
interface Props {
diff --git a/src/ai/ai.service.ts b/src/ai/ai.service.ts
index 6c49ef0..c3db107 100644
--- a/src/ai/ai.service.ts
+++ b/src/ai/ai.service.ts
@@ -16,6 +16,7 @@ export interface AIRecommendation {
url: string;
source: string;
confidence: number;
+ publishDate?: Date;
}
@Injectable()
@@ -31,9 +32,14 @@ export class AiService {
private readonly bidItemRepository: Repository,
) {
const apiKey = this.configService.get('ARK_API_KEY');
+ // this.openai = new OpenAI({
+ // apiKey: apiKey || '',
+ // baseURL: 'https://ark.cn-beijing.volces.com/api/v3',
+ // timeout: 120000, // 120秒超时
+ // });
this.openai = new OpenAI({
- apiKey: apiKey || '',
- baseURL: 'https://ark.cn-beijing.volces.com/api/v3',
+ apiKey: 'sk-5sSOxrJl31MGz76bE14d2fDbA55b44869fCcA0C813Fc893a' ,
+ baseURL: 'https://aihubmix.com/v1',
timeout: 120000, // 120秒超时
});
}
@@ -43,7 +49,7 @@ export class AiService {
this.logger.log(`发送给 AI 的数据数量: ${bids.length}`);
try {
- const prompt =PromptString+ `请根据以下投标项目标题列表,推荐最值得关注的 5-10 个项目。请以 JSON 格式返回,格式如下:
+ const prompt =PromptString+ `请根据以下投标项目标题列表,筛选出我关心的项目。请以 JSON 格式返回,格式如下:
[
{
"title": "项目标题",
@@ -55,8 +61,8 @@ export class AiService {
${JSON.stringify(bids.map(b => b.title), null, 2)}`;
this.logger.log('发给AI的内容',prompt);
const completion = await this.openai.chat.completions.create({
- model: 'doubao-seed-1-6-lite-251015',
- max_tokens: 32768,
+ model: 'mimo-v2-flash-free',
+ // max_tokens: 32768,
reasoning_effort: 'medium',
messages: [
{
@@ -122,7 +128,7 @@ ${JSON.stringify(bids.map(b => b.title), null, 2)}`;
order: { confidence: 'DESC' }
});
- // 从 bid-items 表获取 url 和 source
+ // 从 bid-items 表获取 url、source 和 publishDate
const result: AIRecommendation[] = [];
for (const entity of entities) {
const bidItem = await this.bidItemRepository.findOne({
@@ -133,7 +139,8 @@ ${JSON.stringify(bids.map(b => b.title), null, 2)}`;
title: entity.title,
url: bidItem?.url || '',
source: bidItem?.source || '',
- confidence: entity.confidence
+ confidence: entity.confidence,
+ publishDate: bidItem?.publishDate
});
}
diff --git a/src/database/database.module.ts b/src/database/database.module.ts
index c1f55eb..8d7c935 100644
--- a/src/database/database.module.ts
+++ b/src/database/database.module.ts
@@ -4,6 +4,7 @@ import { ConfigModule, ConfigService } from '@nestjs/config';
import { BidItem } from '../bids/entities/bid-item.entity';
import { Keyword } from '../keywords/keyword.entity';
import { AiRecommendation } from '../ai/entities/ai-recommendation.entity';
+import { CrawlInfoAdd } from '../crawler/entities/crawl-info-add.entity';
@Module({
imports: [
@@ -17,7 +18,7 @@ import { AiRecommendation } from '../ai/entities/ai-recommendation.entity';
username: configService.get('DATABASE_USERNAME', 'root'),
password: configService.get('DATABASE_PASSWORD', 'root'),
database: configService.get('DATABASE_NAME', 'bidding'),
- entities: [BidItem, Keyword, AiRecommendation],
+ entities: [BidItem, Keyword, AiRecommendation, CrawlInfoAdd],
synchronize: configService.get('DATABASE_SYNCHRONIZE', true),
}),
}),