Updated code with more simplification
This commit is contained in:
parent
42ad26a200
commit
202d1e904e
5 changed files with 25 additions and 50 deletions
Binary file not shown.
|
Before Width: | Height: | Size: 12 MiB After Width: | Height: | Size: 24 MiB |
|
|
@ -16,7 +16,7 @@
|
||||||
"openai"
|
"openai"
|
||||||
],
|
],
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"motia": "^0.2.1-beta.73",
|
"motia": "0.2.2",
|
||||||
"openai": "^4.102.0",
|
"openai": "^4.102.0",
|
||||||
"zod": "^3.25.20"
|
"zod": "^3.25.20"
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
import { EventConfig, Handlers } from 'motia'
|
import { EventConfig, Handlers } from 'motia'
|
||||||
import { OpenAI } from 'openai'
|
import { OpenAI } from 'openai'
|
||||||
import { z } from 'zod'
|
import { z } from 'zod'
|
||||||
|
// import { AzureOpenAI } from 'openai'
|
||||||
|
|
||||||
export const config: EventConfig = {
|
export const config: EventConfig = {
|
||||||
type: 'event',
|
type: 'event',
|
||||||
|
|
@ -22,6 +23,14 @@ export const handler: Handlers['AiResponse'] = async (input, context) => {
|
||||||
|
|
||||||
logger.info('Generating AI response', { conversationId })
|
logger.info('Generating AI response', { conversationId })
|
||||||
|
|
||||||
|
// For Azure OpenAI
|
||||||
|
// const openai = new AzureOpenAI({
|
||||||
|
// endpoint: process.env.AZURE_OPENAI_ENDPOINT || 'demo-key',
|
||||||
|
// apiKey: process.env.AZURE_OPENAI_API_KEY || 'demo-key',
|
||||||
|
// deployment: 'gpt-4o-mini',
|
||||||
|
// apiVersion: '2024-12-01-preview'
|
||||||
|
// })
|
||||||
|
|
||||||
const openai = new OpenAI({
|
const openai = new OpenAI({
|
||||||
apiKey: process.env.OPENAI_API_KEY,
|
apiKey: process.env.OPENAI_API_KEY,
|
||||||
baseURL: process.env.OPENAI_BASE_URL || 'https://api.openai.com/v1'
|
baseURL: process.env.OPENAI_BASE_URL || 'https://api.openai.com/v1'
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
import { ApiRouteConfig, Handlers } from 'motia'
|
import { ApiRouteConfig, Handlers } from 'motia'
|
||||||
import { z } from 'zod'
|
import { z } from 'zod'
|
||||||
|
import { conversationSchema } from './conversation.stream'
|
||||||
|
|
||||||
const inputSchema = z.object({
|
const inputSchema = z.object({
|
||||||
message: z.string().min(1, 'Message is required'),
|
message: z.string().min(1, 'Message is required'),
|
||||||
|
|
@ -15,11 +16,7 @@ export const config: ApiRouteConfig = {
|
||||||
emits: ['chat-message'],
|
emits: ['chat-message'],
|
||||||
bodySchema: inputSchema,
|
bodySchema: inputSchema,
|
||||||
responseSchema: {
|
responseSchema: {
|
||||||
200: z.object({
|
200: conversationSchema
|
||||||
conversationId: z.string(),
|
|
||||||
message: z.string(),
|
|
||||||
status: z.enum(['created', 'streaming', 'completed']).optional(),
|
|
||||||
})
|
|
||||||
},
|
},
|
||||||
flows: ['chat'],
|
flows: ['chat'],
|
||||||
}
|
}
|
||||||
|
|
@ -41,7 +38,7 @@ export const handler: Handlers['ChatApi'] = async (req, { logger, emit, streams
|
||||||
timestamp: new Date().toISOString(),
|
timestamp: new Date().toISOString(),
|
||||||
})
|
})
|
||||||
|
|
||||||
await streams.conversation.set(conversationId, assistantMessageId, {
|
const aiResponse = await streams.conversation.set(conversationId, assistantMessageId, {
|
||||||
message: '',
|
message: '',
|
||||||
from: 'assistant',
|
from: 'assistant',
|
||||||
status: 'created',
|
status: 'created',
|
||||||
|
|
@ -57,46 +54,13 @@ export const handler: Handlers['ChatApi'] = async (req, { logger, emit, streams
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
const maxWaitTime = 3000 // 3 seconds
|
|
||||||
const startTime = Date.now()
|
|
||||||
let aiResponse = null
|
|
||||||
|
|
||||||
// Initial delay to allow AI to start processing
|
|
||||||
await new Promise(resolve => setTimeout(resolve, 100))
|
|
||||||
|
|
||||||
while (Date.now() - startTime < maxWaitTime) {
|
|
||||||
const response = await streams.conversation.get(conversationId, assistantMessageId)
|
|
||||||
if (response) {
|
|
||||||
aiResponse = response
|
|
||||||
// Break only if we have a completed status
|
|
||||||
if (response.status === 'completed') {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
await new Promise(resolve => setTimeout(resolve, 100))
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get final response state
|
|
||||||
if (!aiResponse?.status || aiResponse.status !== 'completed') {
|
|
||||||
const finalResponse = await streams.conversation.get(conversationId, assistantMessageId)
|
|
||||||
if (finalResponse?.status === 'completed') {
|
|
||||||
aiResponse = finalResponse
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
logger.info('Returning chat response', {
|
logger.info('Returning chat response', {
|
||||||
conversationId,
|
conversationId,
|
||||||
messageId: assistantMessageId,
|
messageId: assistantMessageId,
|
||||||
status: aiResponse?.status,
|
|
||||||
hasMessage: !!aiResponse?.message
|
|
||||||
})
|
})
|
||||||
|
|
||||||
return {
|
return {
|
||||||
status: 200,
|
status: 200,
|
||||||
body: {
|
body: aiResponse,
|
||||||
conversationId,
|
|
||||||
message: aiResponse?.status === 'completed' ? aiResponse.message : 'Message received, AI is responding...',
|
|
||||||
status: aiResponse?.status || 'streaming',
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,15 @@
|
||||||
import { StateStreamConfig } from 'motia'
|
import { StreamConfig } from 'motia'
|
||||||
import { z } from 'zod'
|
import { z } from 'zod'
|
||||||
|
|
||||||
export const config: StateStreamConfig = {
|
export const conversationSchema = z.object({
|
||||||
|
message: z.string(),
|
||||||
|
from: z.enum(['user', 'assistant']),
|
||||||
|
status: z.enum(['created', 'streaming', 'completed']),
|
||||||
|
timestamp: z.string(),
|
||||||
|
})
|
||||||
|
|
||||||
|
export const config: StreamConfig = {
|
||||||
name: 'conversation',
|
name: 'conversation',
|
||||||
schema: z.object({
|
schema: conversationSchema,
|
||||||
message: z.string(),
|
baseConfig: { storageType: 'default' },
|
||||||
from: z.enum(['user', 'assistant']),
|
|
||||||
status: z.enum(['created', 'streaming', 'completed']),
|
|
||||||
timestamp: z.string(),
|
|
||||||
}),
|
|
||||||
baseConfig: { storageType: 'state' },
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue