fix: let OpenAI API create notes

This commit is contained in:
lucaronin
2026-06-06 10:42:33 +02:00
parent 80ee94da73
commit 3c8edd8346
11 changed files with 966 additions and 93 deletions

View File

@@ -18,9 +18,22 @@ interface StreamAiModelRequest {
model: AiModelDefinition
message: string
systemPrompt?: string
vaultPath?: string
vaultPaths?: string[]
callbacks: AgentStreamCallbacks
}
interface NativeAiModelStreamRequest {
provider: AiModelProvider
model_id: string
message: string
system_prompt: string | null
vault_path: string | null
vault_paths: string[] | null
api_key_override: null
event_name: string
}
function mockModelResponse(provider: AiModelProvider, model: AiModelDefinition, message: string): string {
const displayName = model.display_name || model.id
return `[mock-${provider.name} ${displayName}] You asked: "${message.slice(0, 160)}"`
@@ -49,55 +62,79 @@ function handleStreamEvent(data: AiModelStreamEvent, callbacks: AgentStreamCallb
}
}
export async function streamAiModel({
provider,
model,
message,
systemPrompt,
callbacks,
}: StreamAiModelRequest): Promise<void> {
if (!isTauri()) {
setTimeout(() => {
callbacks.onText(mockModelResponse(provider, model, message))
callbacks.onDone()
}, 300)
return
}
function streamMockAiModel({ provider, model, message, callbacks }: StreamAiModelRequest): void {
setTimeout(() => {
callbacks.onText(mockModelResponse(provider, model, message))
callbacks.onDone()
}, 300)
}
const { invoke } = await import('@tauri-apps/api/core')
const { listen } = await import('@tauri-apps/api/event')
const eventName = createScopedStreamEventName('ai-model-stream')
function nativeVaultPaths(vaultPaths: string[] | undefined): string[] | null {
return vaultPaths && vaultPaths.length > 0 ? vaultPaths : null
}
function nativeAiModelRequest(request: StreamAiModelRequest, eventName: string): NativeAiModelStreamRequest {
return {
provider: request.provider,
model_id: request.model.id,
message: request.message,
system_prompt: request.systemPrompt || null,
vault_path: request.vaultPath || null,
vault_paths: nativeVaultPaths(request.vaultPaths),
api_key_override: null,
event_name: eventName,
}
}
function createStreamCloser(callbacks: AgentStreamCallbacks) {
let closed = false
const closeStream = (): void => {
return (): void => {
if (closed) return
closed = true
callbacks.onDone()
}
}
function handleNativeStreamEvent(
data: AiModelStreamEvent,
callbacks: AgentStreamCallbacks,
closeStream: () => void,
): void {
if (data.kind === 'Done') {
closeStream()
return
}
handleStreamEvent(data, callbacks)
}
async function streamNativeAiModel(request: StreamAiModelRequest): Promise<void> {
const { invoke } = await import('@tauri-apps/api/core')
const { listen } = await import('@tauri-apps/api/event')
const eventName = createScopedStreamEventName('ai-model-stream')
const closeStream = createStreamCloser(request.callbacks)
const unlisten = await listen<AiModelStreamEvent>(eventName, (event) => {
if (event.payload.kind === 'Done') {
closeStream()
return
}
handleStreamEvent(event.payload, callbacks)
handleNativeStreamEvent(event.payload, request.callbacks, closeStream)
})
try {
await invoke<string>('stream_ai_model', {
request: {
provider,
model_id: model.id,
message,
system_prompt: systemPrompt || null,
api_key_override: null,
event_name: eventName,
},
request: nativeAiModelRequest(request, eventName),
})
closeStream()
} catch (err) {
callbacks.onError(err instanceof Error ? err.message : String(err))
request.callbacks.onError(err instanceof Error ? err.message : String(err))
closeStream()
} finally {
cleanupTauriEventListener(unlisten)
}
}
export async function streamAiModel(request: StreamAiModelRequest): Promise<void> {
if (!isTauri()) {
streamMockAiModel(request)
return
}
await streamNativeAiModel(request)
}