Merge pull request #51 from KGAudioLab/feat/2026-06-01-enhance-ai-agent

Feat/2026 06 01 enhance ai agent
This commit is contained in:
Xiaohan-Tian
2026-06-05 18:34:47 -07:00
committed by GitHub
4 changed files with 22 additions and 11 deletions
+6 -4
View File
@@ -165,8 +165,9 @@ export class OpenAICompatibleLLMProvider implements LLMProvider {
requestParams.tool_choice = 'auto';
}
const stream = this.client.chat.completions.stream(requestParams);
const stream = await this.client.chat.completions.create(requestParams);
const toolCallAccumulator = new Map<number, { id: string; name: string; arguments: string }>();
let finishReason = 'stop';
for await (const chunk of stream) {
// Do not delete: leave this commented out for future debugging purpose.
@@ -174,6 +175,10 @@ export class OpenAICompatibleLLMProvider implements LLMProvider {
const choice = chunk.choices[0];
if (!choice) continue;
if (choice.finish_reason) {
finishReason = choice.finish_reason;
}
const delta = choice.delta;
if (delta.content) {
yield { type: 'text', content: delta.content };
@@ -197,9 +202,6 @@ export class OpenAICompatibleLLMProvider implements LLMProvider {
}
}
const finalCompletion = await stream.finalChatCompletion();
const finishReason = finalCompletion.choices[0]?.finish_reason ?? 'stop';
if (toolCallAccumulator.size > 0) {
for (const [, tc] of toolCallAccumulator) {
const toolCall: ToolCall = {
+3 -2
View File
@@ -137,10 +137,11 @@ export class UpdateTrackTool extends BaseTool {
let instrumentKey: InstrumentType | undefined;
if (instrumentName !== undefined) {
instrumentKey = resolveInstrumentKeyByEnglishName(instrumentName);
if (!instrumentKey) {
const resolvedInstrumentKey = resolveInstrumentKeyByEnglishName(instrumentName);
if (resolvedInstrumentKey === null) {
return this.createErrorResult(`Invalid instrument "${instrumentName}". Use the exact English name from list_all_available_instruments.`);
}
instrumentKey = resolvedInstrumentKey;
}
const trackNameChanged = newTrackName !== undefined && newTrackName !== resolvedTrack.getName();
+7 -5
View File
@@ -8,6 +8,7 @@ import { KGMidiNote } from '../core/midi/KGMidiNote';
import { KGCore } from '../core/KGCore';
import { KGProject } from '../core/KGProject';
import { KGChordRegion } from '../core/region/KGChordRegion';
import { KGMidiTrack } from '../core/track/KGMidiTrack';
import { FLUIDR3_INSTRUMENT_MAP } from '../constants/generalMidiConstants';
import { pitchToNoteName } from './midiUtil';
import { beatsToTicks, getTicksPerBar, reduceFraction } from './mathUtil';
@@ -174,14 +175,15 @@ function resolveRegionTrackMetadata(region: KGMidiRegion, project: KGProject): {
trackName: string;
instrumentName: string;
} {
const trackId = region.getTrackId();
const trackId = String(region.getTrackId());
const track = project.getTracks().find(candidate => candidate.getId().toString() === trackId);
const trackName = track?.getName() || 'Unnamed Track';
const instrumentKey = 'getInstrument' in (track ?? {}) && typeof track.getInstrument === 'function'
? track.getInstrument()
const midiTrack = track?.getCurrentType() === 'KGMidiTrack'
? track as KGMidiTrack
: null;
const trackName = track?.getName() || 'Unnamed Track';
const instrumentKey = midiTrack?.getInstrument() ?? null;
const instrumentName = instrumentKey
? FLUIDR3_INSTRUMENT_MAP[instrumentKey]?.displayName || instrumentKey
? FLUIDR3_INSTRUMENT_MAP[instrumentKey]?.displayName || String(instrumentKey)
: 'Unknown Instrument';
return { trackId, trackName, instrumentName };
+6
View File
@@ -16,6 +16,12 @@ export default defineConfig({
define: {
__APP_VERSION__: JSON.stringify(version),
},
esbuild: {
keepNames: true,
},
build: {
sourcemap: true,
},
server: {
host: true,
headers: {