From 3ced15e1cc3fc95597e18f34b43a8c56458f7bdb Mon Sep 17 00:00:00 2001 From: Marios Antonoudiou Date: Sun, 25 May 2025 22:33:13 +0300 Subject: [PATCH] Take previous activities into consideration --- server/api/rewrite.post.ts | 12 ++++++----- .../webhooks/strava/activity-create.post.ts | 12 ++++++----- server/utils/create-content.ts | 21 +++++++++++++------ 3 files changed, 29 insertions(+), 16 deletions(-) diff --git a/server/api/rewrite.post.ts b/server/api/rewrite.post.ts index bd4fba2..9292a16 100644 --- a/server/api/rewrite.post.ts +++ b/server/api/rewrite.post.ts @@ -26,12 +26,14 @@ export default defineEventHandler(async (event) => { const strava = await useStrava(session.user.id); - const activity = await strava!(`/activities/${activityId}`); + const currentActivity = await strava!(`/activities/${activityId}`); + const [, ...previousActivities] = await strava!(`/activities`); - const [aiError, stravaRequestBody] = await createActivityContent( - activity, - user!, - ); + const [aiError, stravaRequestBody] = await createActivityContent({ + currentActivity, + previousActivities, + user: user!, + }); if (aiError) { throw createError({ statusCode: 500, diff --git a/server/routes/webhooks/strava/activity-create.post.ts b/server/routes/webhooks/strava/activity-create.post.ts index 7eb93f2..6c22d34 100644 --- a/server/routes/webhooks/strava/activity-create.post.ts +++ b/server/routes/webhooks/strava/activity-create.post.ts @@ -18,12 +18,14 @@ export default defineEventHandler(async (event) => { const strava = await useStrava(body.owner_id); - const activity = await strava!(`/activities/${body.object_id}`); + const currentActivity = await strava!(`/activities/${body.object_id}`); + const [, ...previousActivities] = await strava!(`/activities`); - const [aiError, stravaRequestBody] = await createActivityContent( - activity, - user, - ); + const [aiError, stravaRequestBody] = await createActivityContent({ + currentActivity, + previousActivities, + user: user!, + }); if (aiError) { throw createError({ statusCode: 500, diff --git a/server/utils/create-content.ts b/server/utils/create-content.ts index b53d031..0a12b95 100644 --- a/server/utils/create-content.ts +++ b/server/utils/create-content.ts @@ -1,4 +1,4 @@ -import { chain, draw, get, omit, tryit } from "radash"; +import { chain, draw, get, omit, pick, tryit } from "radash"; import { safeDestr } from "destr"; import { User } from "./drizzle"; @@ -104,10 +104,15 @@ const stringifyActivity = chain<[Activity], Activity, string>( (activity) => JSON.stringify(activity), ); -export const createActivityContent = async ( - activity: Activity, - user: User & { preferences: any }, -) => { +export const createActivityContent = async ({ + currentActivity, + previousActivities, + user, +}: { + currentActivity: Activity; + previousActivities: Activity[]; + user: User & { preferences: any }; +}) => { const openai = useOpenAI(); const tone = draw([ @@ -131,6 +136,7 @@ export const createActivityContent = async ( Generate a short title and a ${length}-lengthed description for my strava activity. Use my preferred language and unit system. Try to not exaggerate as I am using Strava often and I want my activites to be unique and easy to read. Don't say things like nothing too fancy or wild. Use a little bit of ${tone} to make things less boring. Highlight any PR only if available, do not mention them if no PRs. + Maybe comment if any interesting fact in comparison to previous activities. Add #${tone} at the end of the description. Depending the length of the description, maybe add more hashtags. @@ -143,7 +149,10 @@ export const createActivityContent = async ( Convert distance to larger units when appropriate, keep in mind we don't need much accuracy. The activity data in json format from strava: - ${stringifyActivity(activity)} + ${stringifyActivity(currentActivity)} + + The recent previous activities in json format: + ${previousActivities.map((a) => pick(a, ["distance", "moving_time", "total_elavation_gain", "type", "start_date", "average_speed", "average_watts", "average_heartrate", "max_heartrate"])).map(stringifyActivity)} `; const [aiError, aiResponse] = await openai("/responses", {