Skip to content

Commit

Permalink
fix background and song search
Browse files Browse the repository at this point in the history
  • Loading branch information
miku448 committed Dec 22, 2024
1 parent ce71869 commit b0db9be
Show file tree
Hide file tree
Showing 3 changed files with 133 additions and 31 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,9 @@ export default function NovelAssistant() {
window.dispatchEvent(event);
};

if (isCheckingPremium) {
return null;
}
return (
<>
<DisclaimerModal opened={showDisclaimer} onClose={handleDisclaimerClose} />
Expand Down Expand Up @@ -295,7 +298,7 @@ export default function NovelAssistant() {
maxCount: 6,
},
chatInput: {
disabled: !isPremium || isCheckingPremium,
disabled: !isPremium,
},
}}
/>
Expand Down
128 changes: 104 additions & 24 deletions apps/novel-builder/src/components/novel-assistant/prompt/NovelSpec.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
import { NovelV3, validateNovelState } from '@mikugg/bot-utils';
import { BackgroundResult, listSearch, SearchType, SongResult } from '../../../libs/listSearch';
import config from '../../../config';

export interface LoreBookEntry {
id: string;
Expand Down Expand Up @@ -415,20 +417,63 @@ export class NovelManager {
}

async addBackgroundFromDatabase(prompt: string): Promise<string> {
// In a real implementation, this would search a database
// For now, we'll create a mock background
const id = getId('background');
this.novel.backgrounds.push({
id,
name: `background_${id}`,
description: prompt,
source: {
jpg: 'empty_background.png',
},
attributes: [],
});
try {
let background: BackgroundResult = {
id: 'default_background',
description: 'default_background',
asset: 'default_background.png',
sdPrompt: null,
sdModel: null,
sdParams: null,
author: {
id: 'miku',
username: 'miku',
profilePic: null,
},
createdAt: new Date(),
tags: [],
};
let searchingError = false;
try {
// Use vector search to find the most similar background
const results = await listSearch<BackgroundResult>(config.platformAPIEndpoint, SearchType.BACKGROUND_VECTORS, {
search: prompt,
take: 1,
skip: 0,
});

if (!results.length) {
searchingError = true;
console.error('No matching background found for the given description');
} else {
background = results[0];
}
} catch (error) {
console.error('Error searching for background:', error);
searchingError = true;
}

const id = getId('background');

this.novel.backgrounds.push({
id,
name: `background_${id}`,
description: background.description,
source: {
jpg: background.asset,
},
attributes: background.tags?.map((tag) => ['tag', tag]) || [],
});

return `Background added with ID: ${id}. Description: ${prompt}`;
return `Background added with ID: ${id}. Description: ${background.description}.${
searchingError
? ' There was an error searching for the background in the database. Using default background'
: ''
}`;
} catch (error) {
console.error('Error searching for background:', error);
return 'Error searching for background in database';
}
}

async modifyBackgroundDescription(backgroundId: string, description: string): Promise<string> {
Expand Down Expand Up @@ -458,18 +503,53 @@ export class NovelManager {
}

async addMusicFromDatabase(prompt: string): Promise<string> {
// In a real implementation, this would search a music database
// For now, we'll create a mock music entry
const id = getId('music');
this.novel.songs.push({
id,
name: `song_${id}`,
description: prompt,
source: 'empty_song.mp3',
tags: [],
});
try {
let song: SongResult = {
id: 'devonshire',
title: 'default_song',
description: 'default_song',
asset: 'devonshire.mp3',
tags: [],
authorId: 'miku',
createdAt: new Date(),
updatedAt: new Date(),
};
let searchingError = false;
try {
// Use vector search to find the most similar song
const results = await listSearch<SongResult>(config.platformAPIEndpoint, SearchType.SONG_VECTOR, {
search: prompt,
take: 1,
skip: 0,
});

if (!results.length) {
searchingError = true;
} else {
song = results[0];
}
} catch (error) {
searchingError = true;
console.error('Error searching for song:', error);
}

return `Music added with ID: ${id}. Description: ${prompt}`;
const id = getId('music');

this.novel.songs.push({
id,
name: song.title || `song_${id}`,
description: song.description,
source: song.asset,
tags: song.tags || [],
});

return `Music added with ID: ${id}. Description: ${song.description}.${
searchingError ? ' There was an error searching for the song in the database. Using default song' : ''
}`;
} catch (error) {
console.error('Error searching for song:', error);
return 'Error searching for song in database';
}
}

async modifyMusicDescription(musicId: string, description: string): Promise<string> {
Expand Down
31 changes: 25 additions & 6 deletions apps/novel-builder/src/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ interface BuilderConfig {
assetsEndpoint: string;
assetsEndpointOptimized: string;
uploadAssetEndpoint: string;
platformAPIEndpoint: string;
isPremiumUser: () => Promise<boolean>;
genAssetLink: (asset: string, displayPrefix: AssetDisplayPrefix) => string;
uploadAsset: (
Expand Down Expand Up @@ -61,9 +62,15 @@ const configs: Map<'development' | 'staging' | 'production', BuilderConfig> = ne
assetsEndpoint: 'http://localhost:8585/s3/assets',
assetsEndpointOptimized: 'http://localhost:8585/s3/assets',
uploadAssetEndpoint: 'http://localhost:8585/asset-upload',
platformAPIEndpoint: 'http://localhost:8080',
isPremiumUser: async (): Promise<boolean> => {
const result = await axios.get<{ id: string; tier: 'REGULAR' | 'PREMIUM' }>(`http://localhost:8080/user`);
return !!(result.data.id && result.data.tier === 'PREMIUM');
try {
const result = await axios.get<{ id: string; tier: 'REGULAR' | 'PREMIUM' }>(`http://localhost:8080/user`);
return !!(result.data.id && result.data.tier === 'PREMIUM');
} catch (error) {
console.error('Failed to check premium status:', error);
return false;
}
},
genAssetLink: (asset: string) => {
if (asset.startsWith('data')) {
Expand Down Expand Up @@ -164,9 +171,15 @@ const configs: Map<'development' | 'staging' | 'production', BuilderConfig> = ne
assetsEndpoint: 'https://assets.miku.gg',
assetsEndpointOptimized: 'https://mikugg-assets.nyc3.digitaloceanspaces.com',
uploadAssetEndpoint: 'https://apidev.miku.gg/asset/upload',
platformAPIEndpoint: 'https://apidev.miku.gg',
isPremiumUser: async (): Promise<boolean> => {
const result = await axios.get<{ id: string; tier: 'REGULAR' | 'PREMIUM' }>(`https://apidev.miku.gg/user`);
return !!(result.data.id && result.data.tier === 'PREMIUM');
try {
const result = await axios.get<{ id: string; tier: 'REGULAR' | 'PREMIUM' }>(`https://apidev.miku.gg/user`);
return !!(result.data.id && result.data.tier === 'PREMIUM');
} catch (error) {
console.error('Failed to check premium status:', error);
return false;
}
},
genAssetLink: (asset: string, displayPrefix?: AssetDisplayPrefix) => {
if (asset.startsWith('data')) {
Expand Down Expand Up @@ -274,9 +287,15 @@ const configs: Map<'development' | 'staging' | 'production', BuilderConfig> = ne
assetsEndpoint: 'https://assets.miku.gg',
assetsEndpointOptimized: 'https://mikugg-assets.nyc3.digitaloceanspaces.com',
uploadAssetEndpoint: 'https://api.miku.gg/asset/upload',
platformAPIEndpoint: 'https://api.miku.gg',
isPremiumUser: async (): Promise<boolean> => {
const result = await axios.get<{ id: string; tier: 'REGULAR' | 'PREMIUM' }>(`https://api.miku.gg/user`);
return !!(result.data.id && result.data.tier === 'PREMIUM');
try {
const result = await axios.get<{ id: string; tier: 'REGULAR' | 'PREMIUM' }>(`https://api.miku.gg/user`);
return !!(result.data.id && result.data.tier === 'PREMIUM');
} catch (error) {
console.error('Failed to check premium status:', error);
return false;
}
},
genAssetLink: (asset: string, displayPrefix?: AssetDisplayPrefix) => {
if (asset.startsWith('data')) {
Expand Down

0 comments on commit b0db9be

Please sign in to comment.