feat(memory): implement stability stage
Some checks failed
CI / validate (push) Has been cancelled
CI / validate (pull_request) Has been cancelled

Co-authored-by: multica-agent <github@multica.ai>
This commit is contained in:
2026-09-02 15:04:18 +05:00
parent 4cd0b7b390
commit 031d094867
24 changed files with 1661 additions and 79 deletions

View File

@@ -1,7 +1,7 @@
import { z } from 'zod'
import { buildJsonCompletion, parseJsonCompletion } from '~/server/utils/ai-provider'
import { CoauthorQuestionSchema, StoredCoauthorQuestionSchema } from '~/server/utils/coauthor-question'
import { requireStageTwoSafeText, requireStageTwoUser, stageTwoApiError, stageTwoDatabase, stageTwoRpc, stageTwoUuid } from '~/server/utils/stage-two-supabase'
import { requireStageTwoSafeText, requireStageTwoUser, stageSixConsumeAiQuota, stageSixRecordAiUsage, stageTwoApiError, stageTwoDatabase, stageTwoRpc, stageTwoUuid } from '~/server/utils/stage-two-supabase'
const MessageSchema = z.object({ role: z.enum(['user', 'assistant']), content: z.string().min(1).max(5000) })
@@ -34,8 +34,10 @@ export default defineEventHandler(async (event) => {
schemaName: 'coauthor_question',
jsonSchema: CoauthorQuestionSchema.toJSONSchema(),
})
await stageSixConsumeAiQuota(user.id, null, 'coauthor-question')
const controller = new AbortController()
const timeout = setTimeout(() => controller.abort(), 30_000)
const startedAt = Date.now()
let response: Response
try {
response = await fetch(completion.endpoint, {
@@ -45,8 +47,12 @@ export default defineEventHandler(async (event) => {
clearTimeout(timeout)
}
if (!response.ok) throw createError({ statusCode: 502, statusMessage: 'The coauthor is temporarily unavailable.' })
const payload = await response.json()
await stageSixRecordAiUsage({
userId: user.id, campaignId: null, requestKind: 'coauthor-question', completion, payload, latencyMs: Date.now() - startedAt,
}).catch(error => console.error('[web] could not record coauthor question usage:', error))
try {
const parsed = CoauthorQuestionSchema.safeParse(parseJsonCompletion(await response.json()))
const parsed = CoauthorQuestionSchema.safeParse(parseJsonCompletion(payload))
if (parsed.success) question = parsed.data
} catch {
// Retry once when the provider ignores structured-output requirements.