fix(server): filter out attachment in pplx provider (#11986)

<!-- This is an auto-generated comment: release notes by coderabbit.ai -->

## Summary by CodeRabbit

- **Bug Fixes**
  - Improved handling of messages without attachments, ensuring a placeholder is shown when content is empty and attachments are omitted.
- **New Features**
  - Added the ability to selectively include or exclude attachments in message processing.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
This commit is contained in:
darkskygit
2025-04-25 09:50:32 +00:00
parent 4887e1d612
commit dc7bbddce1
2 changed files with 27 additions and 20 deletions

View File

@@ -82,7 +82,7 @@ export class PerplexityProvider
try {
metrics.ai.counter('chat_text_calls').add(1, { model });
const [system, msgs] = await chatToGPTMessage(messages);
const [system, msgs] = await chatToGPTMessage(messages, false);
const modelInstance = this.#instance(model);
@@ -119,7 +119,7 @@ export class PerplexityProvider
try {
metrics.ai.counter('chat_text_stream_calls').add(1, { model });
const [system, msgs] = await chatToGPTMessage(messages);
const [system, msgs] = await chatToGPTMessage(messages, false);
const modelInstance = this.#instance(model);

View File

@@ -58,7 +58,9 @@ async function inferMimeType(url: string) {
}
export async function chatToGPTMessage(
messages: PromptMessage[]
messages: PromptMessage[],
// TODO(@darkskygit): move this logic in interface refactoring
withAttachment: boolean = true
): Promise<[string | undefined, ChatMessage[], any]> {
const system = messages[0]?.role === 'system' ? messages.shift() : undefined;
const schema = system?.params?.schema;
@@ -77,26 +79,31 @@ export async function chatToGPTMessage(
contents.push({ type: 'text', text: content });
}
for (let attachment of attachments) {
let mimeType: string;
if (typeof attachment === 'string') {
mimeType =
typeof mimetype === 'string'
? mimetype
: await inferMimeType(attachment);
} else {
({ attachment, mimeType } = attachment);
}
if (SIMPLE_IMAGE_URL_REGEX.test(attachment)) {
if (mimeType.startsWith('image/')) {
contents.push({ type: 'image', image: attachment, mimeType });
if (withAttachment) {
for (let attachment of attachments) {
let mimeType: string;
if (typeof attachment === 'string') {
mimeType =
typeof mimetype === 'string'
? mimetype
: await inferMimeType(attachment);
} else {
const data = attachment.startsWith('data:')
? await fetch(attachment).then(r => r.arrayBuffer())
: new URL(attachment);
contents.push({ type: 'file' as const, data, mimeType });
({ attachment, mimeType } = attachment);
}
if (SIMPLE_IMAGE_URL_REGEX.test(attachment)) {
if (mimeType.startsWith('image/')) {
contents.push({ type: 'image', image: attachment, mimeType });
} else {
const data = attachment.startsWith('data:')
? await fetch(attachment).then(r => r.arrayBuffer())
: new URL(attachment);
contents.push({ type: 'file' as const, data, mimeType });
}
}
}
} else if (!content.length) {
// temp fix for pplx
contents.push({ type: 'text', text: '[no content]' });
}
msgs.push({ role, content: contents } as ChatMessage);