Skip to content

Commit

Permalink
feat: partykit provider 🎈 (#146)
Browse files Browse the repository at this point in the history
  • Loading branch information
joelhooks committed Apr 6, 2024
1 parent 5894844 commit c56c4f9
Show file tree
Hide file tree
Showing 16 changed files with 170 additions and 125 deletions.
5 changes: 5 additions & 0 deletions .changeset/yellow-adults-talk.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@coursebuilder/core": patch
---

adds a partykit provider to core
Original file line number Diff line number Diff line change
Expand Up @@ -7,20 +7,15 @@ export const imageResourceCreated = inngest.createFunction(
{
event: IMAGE_RESOURCE_CREATED_EVENT,
},
async ({ event, step }) => {
async ({ event, step, partyProvider }) => {
await step.run('announce asset created', async () => {
await fetch(
`${env.NEXT_PUBLIC_PARTY_KIT_URL}/party/${env.NEXT_PUBLIC_PARTYKIT_ROOM_NAME}`,
{
method: 'POST',
body: JSON.stringify({
body: event.data,
requestId: event.data.resourceId,
name: 'image.resource.created',
}),
await partyProvider.broadcastMessage({
body: {
body: event.data,
requestId: event.data.resourceId,
name: 'image.resource.created',
},
).catch((e) => {
console.error(e)
roomId: env.NEXT_PUBLIC_PARTYKIT_ROOM_NAME,
})
})

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ export const performCodeExtraction = inngest.createFunction(
{
event: OCR_WEBHOOK_EVENT,
},
async ({ event, step }) => {
async ({ event, step, partyProvider }) => {
const screenshotUrl = event.data.ocrWebhookEvent.screenshotUrl as string
const resourceId = event.data.ocrWebhookEvent.resourceId as string

Expand All @@ -33,26 +33,17 @@ export const performCodeExtraction = inngest.createFunction(
)

await step.run(`partykit broadcast [${resourceId}]`, async () => {
return await fetch(
`${env.NEXT_PUBLIC_PARTY_KIT_URL}/party/${resourceId}`,
{
method: 'POST',
body: JSON.stringify({
body: {
content: extractedCode.codeString,
role: 'assistant',
},
requestId: resourceId,
name: 'code.extraction.completed',
}),
return await partyProvider.broadcastMessage({
body: {
body: {
content: extractedCode.codeString,
role: 'assistant',
},
requestId: resourceId,
name: 'code.extraction.completed',
},
)
.then((res) => {
return res.text()
})
.catch((e) => {
console.error(e)
})
roomId: resourceId,
})
})

return extractedCode.codeString
Expand Down
5 changes: 4 additions & 1 deletion apps/course-builder-web/src/inngest/inngest.server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ import {
import { CourseBuilderCoreEvents } from '@coursebuilder/core/inngest/video-processing/events'
import DeepgramProvider from '@coursebuilder/core/providers/deepgram'
import OpenAIProvider from '@coursebuilder/core/providers/openai'
import PartykitProvider from '@coursebuilder/core/providers/partykit'

import {
CONCEPT_SELECTED,
Expand Down Expand Up @@ -62,12 +63,14 @@ const callbackBase =
const middleware = createInngestMiddleware({
db: courseBuilderAdapter,
siteRootUrl: env.NEXT_PUBLIC_URL,
partyKitRootUrl: env.NEXT_PUBLIC_PARTY_KIT_URL,
mediaUploadProvider: new UTApi(),
openaiProvider: OpenAIProvider({
apiKey: env.OPENAI_API_KEY,
partyUrlBase: env.NEXT_PUBLIC_PARTY_KIT_URL,
}),
partyProvider: PartykitProvider({
partyUrlBase: env.NEXT_PUBLIC_PARTY_KIT_URL,
}),
transcriptProvider: DeepgramProvider({
apiKey: env.DEEPGRAM_API_KEY,
callbackUrl: `${callbackBase}/api/coursebuilder/webhook/deepgram`,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,20 +7,15 @@ export const imageResourceCreated = inngest.createFunction(
{
event: IMAGE_RESOURCE_CREATED_EVENT,
},
async ({ event, step }) => {
async ({ event, step, partyProvider }) => {
await step.run('announce asset created', async () => {
await fetch(
`${env.NEXT_PUBLIC_PARTY_KIT_URL}/party/${env.NEXT_PUBLIC_PARTYKIT_ROOM_NAME}`,
{
method: 'POST',
body: JSON.stringify({
body: event.data,
requestId: event.data.resourceId,
name: 'image.resource.created',
}),
await partyProvider.broadcastMessage({
body: {
body: event.data,
requestId: event.data.resourceId,
name: 'image.resource.created',
},
).catch((e) => {
console.error(e)
roomId: env.NEXT_PUBLIC_PARTYKIT_ROOM_NAME,
})
})

Expand Down
31 changes: 11 additions & 20 deletions apps/pro-aws/src/inngest/functions/ocr/ocr-code-extractor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ export const performCodeExtraction = inngest.createFunction(
{
event: OCR_WEBHOOK_EVENT,
},
async ({ event, step }) => {
async ({ event, step, partyProvider }) => {
const screenshotUrl = event.data.ocrWebhookEvent.screenshotUrl as string
const resourceId = event.data.ocrWebhookEvent.resourceId as string

Expand All @@ -33,26 +33,17 @@ export const performCodeExtraction = inngest.createFunction(
)

await step.run(`partykit broadcast [${resourceId}]`, async () => {
return await fetch(
`${env.NEXT_PUBLIC_PARTY_KIT_URL}/party/${resourceId}`,
{
method: 'POST',
body: JSON.stringify({
body: {
content: extractedCode.codeString,
role: 'assistant',
},
requestId: resourceId,
name: 'code.extraction.completed',
}),
return await partyProvider.broadcastMessage({
body: {
body: {
content: extractedCode.codeString,
role: 'assistant',
},
requestId: resourceId,
name: 'code.extraction.completed',
},
)
.then((res) => {
return res.text()
})
.catch((e) => {
console.error(e)
})
roomId: resourceId,
})
})

return extractedCode.codeString
Expand Down
7 changes: 5 additions & 2 deletions apps/pro-aws/src/inngest/inngest.server.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { courseBuilderAdapter, db } from '@/db'
import { courseBuilderAdapter } from '@/db'
import { env } from '@/env.mjs'
import {
EMAIL_SEND_BROADCAST,
Expand Down Expand Up @@ -27,6 +27,7 @@ import {
import { CourseBuilderCoreEvents } from '@coursebuilder/core/inngest/video-processing/events'
import DeepgramProvider from '@coursebuilder/core/providers/deepgram'
import OpenAIProvider from '@coursebuilder/core/providers/openai'
import PartykitProvider from '@coursebuilder/core/providers/partykit'

import {
CONCEPT_SELECTED,
Expand Down Expand Up @@ -62,12 +63,14 @@ const callbackBase =
const middleware = createInngestMiddleware({
db: courseBuilderAdapter,
siteRootUrl: env.NEXT_PUBLIC_URL,
partyKitRootUrl: env.NEXT_PUBLIC_PARTY_KIT_URL,
mediaUploadProvider: new UTApi(),
openaiProvider: OpenAIProvider({
apiKey: env.OPENAI_API_KEY,
partyUrlBase: env.NEXT_PUBLIC_PARTY_KIT_URL,
}),
partyProvider: PartykitProvider({
partyUrlBase: env.NEXT_PUBLIC_PARTY_KIT_URL,
}),
transcriptProvider: DeepgramProvider({
apiKey: env.DEEPGRAM_API_KEY,
callbackUrl: `${callbackBase}/api/coursebuilder/webhook/deepgram`,
Expand Down
29 changes: 13 additions & 16 deletions packages/core/src/inngest/co-gardener/resource-chat.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import { z } from 'zod'

import { CourseBuilderAdapter } from '../../adapters'
import { LlmProviderConfig } from '../../providers/openai'
import { PartyProviderConfig } from '../../providers/partykit'
import { User } from '../../schemas'
import {
CoreInngestFunctionInput,
Expand Down Expand Up @@ -62,6 +63,7 @@ export const resourceChat: CoreInngestHandler = async ({
event,
step,
openaiProvider,
partyProvider,
db,
}: CoreInngestFunctionInput) => {
const resourceId = event.data.resourceId
Expand All @@ -82,6 +84,7 @@ export const resourceChat: CoreInngestHandler = async ({
const messages = await resourceChatWorkflowExecutor({
db,
openaiProvider,
partyProvider,
step,
workflowTrigger,
resourceId,
Expand Down Expand Up @@ -117,9 +120,11 @@ export async function resourceChatWorkflowExecutor({
resource,
user,
openaiProvider,
partyProvider,
db,
}: {
openaiProvider: LlmProviderConfig
partyProvider: PartyProviderConfig
db: CourseBuilderAdapter
resource: ChatResource
step: any
Expand Down Expand Up @@ -216,16 +221,14 @@ export async function resourceChatWorkflowExecutor({
await step.run(
`partykit broadcast user prompt [${resourceId}]`,
async () => {
await fetch(`${openaiProvider.partyUrlBase}/party/${resourceId}`, {
method: 'POST',
body: JSON.stringify({
await partyProvider.broadcastMessage({
body: {
body: currentUserMessage.content,
requestId: resourceId,
name: 'resource.chat.prompted',
userId: user.id,
}),
}).catch((e) => {
console.error(e)
},
roomId: resourceId,
})
},
)
Expand Down Expand Up @@ -255,20 +258,14 @@ export async function resourceChatWorkflowExecutor({
})

await step.run(`partykit broadcast [${resourceId}]`, async () => {
return await fetch(`${openaiProvider.partyUrlBase}/party/${resourceId}`, {
method: 'POST',
body: JSON.stringify({
return await partyProvider.broadcastMessage({
body: {
body: messages,
requestId: resourceId,
name: 'resource.chat.completed',
}),
},
roomId: resourceId,
})
.then((res) => {
return res.text()
})
.catch((e) => {
console.error(e)
})
})

return messages
Expand Down
7 changes: 6 additions & 1 deletion packages/core/src/inngest/create-inngest-middleware.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,18 @@ import {
type TranscriptionConfig,
} from '../providers'
import { LlmProviderConfig, MockOpenAIProvider } from '../providers/openai'
import {
MockPartykitProvider,
PartyProviderConfig,
} from '../providers/partykit'
import { CourseBuilderCoreEvents } from './video-processing/events'

export interface CoreInngestContext {
db: CourseBuilderAdapter
siteRootUrl: string
partyKitRootUrl: string
transcriptProvider: TranscriptionConfig
openaiProvider: LlmProviderConfig
partyProvider: PartyProviderConfig
mediaUploadProvider: {
deleteFiles: (fileKey: string) => Promise<{ success: boolean }>
}
Expand Down Expand Up @@ -74,6 +78,7 @@ export const coreInngest = new Inngest({
partyKitRootUrl: '',
transcriptProvider: MockTranscriptionProvider,
openaiProvider: MockOpenAIProvider,
partyProvider: MockPartykitProvider,
mediaUploadProvider: {
deleteFiles: async (_) => Promise.resolve({ success: true }),
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ export const generateTranscriptWithScreenshotsTrigger: CoreInngestTrigger = {
}

export const generateTranscriptWithScreenshotsHandler: CoreInngestHandler =
async ({ event, step, db, partyKitRootUrl }: CoreInngestFunctionInput) => {
async ({ event, step, db, partyProvider }: CoreInngestFunctionInput) => {
const videoResourceId = event.data.videoResourceId

if (!videoResourceId) {
Expand Down Expand Up @@ -65,15 +65,13 @@ export const generateTranscriptWithScreenshotsHandler: CoreInngestHandler =
})

await step.run('send the transcript to the party', async () => {
await fetch(`${partyKitRootUrl}/party/${event.data.videoResourceId}`, {
method: 'POST',
body: JSON.stringify({
return await partyProvider.broadcastMessage({
body: {
body: transcriptWithScreenshots,
requestId: event.data.videoResourceId,
name: 'transcriptWithScreenshots.ready',
}),
}).catch((e) => {
console.error(e)
},
roomId: event.data.videoResourceId,
})
})

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ const transcriptReadyTrigger: CoreInngestTrigger = {
const transcriptReadyHandler: CoreInngestHandler = async ({
event,
step,
partyKitRootUrl,
partyProvider,
db,
}: CoreInngestFunctionInput) => {
const videoResourceId = event.data.videoResourceId
Expand Down Expand Up @@ -52,15 +52,13 @@ const transcriptReadyHandler: CoreInngestHandler = async ({
}

await step.run('send the transcript to the party', async () => {
await fetch(`${partyKitRootUrl}/party/${videoResourceId}`, {
method: 'POST',
body: JSON.stringify({
return await partyProvider.broadcastMessage({
body: {
body: transcript,
requestId: videoResourceId,
name: 'transcript.ready',
}),
}).catch((e) => {
console.error(e)
},
roomId: videoResourceId,
})
})

Expand Down
Loading

0 comments on commit c56c4f9

Please sign in to comment.