| | import { readBody, HTTPError } from 'h3'; |
| | import { DustClient } from '../dust-client.js'; |
| |
|
| | |
| | |
| | |
| | export const chatCompletions = async (event) => { |
| | try { |
| | const body = await readBody(event); |
| |
|
| | |
| | if (!body.messages || !Array.isArray(body.messages)) { |
| | throw new HTTPError(400, 'Invalid request: messages array is required'); |
| | } |
| |
|
| | if (body.messages.length === 0) { |
| | throw new HTTPError(400, 'Invalid request: messages array cannot be empty'); |
| | } |
| |
|
| | |
| | const dustClient = new DustClient( |
| | process.env.WORKSPACE_ID, |
| | event.context.apiKey || process.env.DUST_API_KEY |
| | ); |
| |
|
| | |
| | if (body.stream === true) { |
| | return handleStreamingResponse(event, dustClient, body); |
| | } |
| |
|
| | |
| | const result = await dustClient.chatCompletion(body); |
| |
|
| | return result; |
| |
|
| | } catch (error) { |
| | console.error('Chat completion error:', error); |
| |
|
| | if (error instanceof HTTPError) { |
| | throw error; |
| | } |
| |
|
| | throw new HTTPError(500, `Internal server error: ${error.message}`); |
| | } |
| | }; |
| |
|
| | |
| |
|
| | |
| | |
| | |
| | async function handleStreamingResponse(event, dustClient, body) { |
| | |
| | event.res.headers.set('Content-Type', 'text/event-stream'); |
| | event.res.headers.set('Cache-Control', 'no-cache'); |
| | event.res.headers.set('Connection', 'keep-alive'); |
| |
|
| | |
| | return await dustClient.chatCompletion({ ...body, stream: true }); |
| | } |
| |
|
| | |
| |
|
| | |
| | |
| | |
| | |
| | export const listModels = async (event) => { |
| | try { |
| | |
| | const dustClient = new DustClient( |
| | process.env.WORKSPACE_ID, |
| | event.context.apiKey || process.env.DUST_API_KEY |
| | ); |
| |
|
| | |
| | const models = await dustClient.getModels(); |
| | return models; |
| |
|
| | } catch (error) { |
| | console.error('Failed to get models:', error); |
| |
|
| | |
| | return { |
| | object: "list", |
| | data: [ |
| | { |
| | id: "dust", |
| | object: "model", |
| | created: Math.floor(Date.now() / 1000), |
| | owned_by: "dust", |
| | permission: [], |
| | root: "dust", |
| | parent: null, |
| | name: "Default Dust Assistant", |
| | description: "Default Dust assistant agent" |
| | } |
| | ] |
| | }; |
| | } |
| | }; |
| |
|
| | |
| | |
| | |
| | |
| | export const getModel = async (event) => { |
| | try { |
| | const modelId = event.context.params?.model || 'dust'; |
| |
|
| | |
| | const dustClient = new DustClient( |
| | process.env.WORKSPACE_ID, |
| | event.context.apiKey || process.env.DUST_API_KEY |
| | ); |
| |
|
| | |
| | let agent; |
| | try { |
| | agent = await dustClient.getAgentConfiguration(modelId); |
| | } catch (error) { |
| | |
| | agent = await dustClient.findAgent(modelId); |
| | } |
| |
|
| | if (!agent) { |
| | throw new HTTPError(404, `Model '${modelId}' not found`); |
| | } |
| |
|
| | |
| | return { |
| | id: agent.sId, |
| | object: "model", |
| | created: agent.versionCreatedAt ? Math.floor(new Date(agent.versionCreatedAt).getTime() / 1000) : Math.floor(Date.now() / 1000), |
| | owned_by: "dust", |
| | permission: [], |
| | root: agent.sId, |
| | parent: null, |
| | name: agent.name, |
| | description: agent.description, |
| | scope: agent.scope, |
| | model: agent.model, |
| | actions: agent.actions?.length || 0, |
| | maxStepsPerRun: agent.maxStepsPerRun, |
| | visualizationEnabled: agent.visualizationEnabled |
| | }; |
| |
|
| | } catch (error) { |
| | console.error('Failed to get model:', error); |
| |
|
| | if (error instanceof HTTPError) { |
| | throw error; |
| | } |
| |
|
| | throw new HTTPError(500, `Failed to get model: ${error.message}`); |
| | } |
| | }; |
| |
|