@directus/api
Version:
Directus is a real-time API and App dashboard for managing SQL database content
43 lines (42 loc) • 1.59 kB
JavaScript
import { createAnthropic } from '@ai-sdk/anthropic';
import { createOpenAI } from '@ai-sdk/openai';
import { ServiceUnavailableError } from '@directus/errors';
import { convertToModelMessages, stepCountIs, streamText, } from 'ai';
import { SYSTEM_PROMPT } from '../constants/system-prompt.js';
export const createUiStream = (messages, { provider, model, tools, apiKeys, systemPrompt, onUsage }) => {
if (apiKeys[provider] === null) {
throw new ServiceUnavailableError({ service: provider, reason: 'No API key configured for LLM provider' });
}
let modelProvider;
if (provider === 'openai') {
modelProvider = createOpenAI({ apiKey: apiKeys.openai });
}
else if (provider === 'anthropic') {
modelProvider = createAnthropic({ apiKey: apiKeys.anthropic });
}
else {
throw new Error(`Unexpected provider given: "${provider}"`);
}
systemPrompt ||= SYSTEM_PROMPT;
const stream = streamText({
system: systemPrompt,
model: modelProvider(model),
messages: convertToModelMessages(messages),
stopWhen: [stepCountIs(10)],
providerOptions: {
openai: {
reasoningSummary: 'auto',
store: false,
include: ['reasoning.encrypted_content'],
},
},
tools,
onFinish({ usage }) {
if (onUsage) {
const { inputTokens, outputTokens, totalTokens } = usage;
onUsage({ inputTokens, outputTokens, totalTokens });
}
},
});
return stream;
};