Updated code with more simplification

This commit is contained in:
Rohit Ghumare 2025-06-11 19:55:51 +01:00
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

View file

@ -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"
}, },

View file

@ -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'

View file

@ -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',
},
} }
} }

View file

@ -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' },
} }