algocoach 0.1.4 ā 0.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +661 -21
- package/README.md +173 -66
- package/dist/assets/index-C1FVIsAd.js +55 -0
- package/dist/index.html +1 -1
- package/package.json +2 -1
- package/server/db/schema.ts +1 -0
- package/server/db/setup.ts +9 -0
- package/server/index.ts +5 -0
- package/server/local-dev/.gitkeep +0 -0
- package/server/middleware/rate-limit.ts +7 -0
- package/server/routes/onboard.ts +0 -1
- package/server/routes/plan.ts +66 -27
- package/server/services/ai.ts +8 -1
- package/dist/assets/index-D5iezweF.js +0 -55
- package/server/local-dev/test-ai.ts +0 -88
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
import { getDb } from "../db"
|
|
3
|
-
import { userPreferences, roadmapPlan } from "../db/schema"
|
|
4
|
-
import { eq } from "drizzle-orm"
|
|
5
|
-
import { createProvider, extractJson } from "../services/ai-provider"
|
|
6
|
-
|
|
7
|
-
const USER_ID = process.env.LOCAL_USER_ID || "dev-user-id"
|
|
8
|
-
|
|
9
|
-
async function main() {
|
|
10
|
-
console.log("š§ Local Dev: AI Provider Test\n")
|
|
11
|
-
|
|
12
|
-
console.log("Environment:")
|
|
13
|
-
console.log(` AI_PROVIDER: ${process.env.AI_PROVIDER || "(not set, default: google)"}`)
|
|
14
|
-
console.log(` AI_MODEL: ${process.env.AI_MODEL || "(not set, using provider default)"}`)
|
|
15
|
-
console.log(` GEMINI_API_KEY: ${process.env.GEMINI_API_KEY ? "ā
set" : "ā not set"}`)
|
|
16
|
-
console.log(` GROQ_API_KEY: ${process.env.GROQ_API_KEY ? "ā
set" : "ā not set"}`)
|
|
17
|
-
console.log("")
|
|
18
|
-
|
|
19
|
-
console.log("1ļøā£ Creating provider...")
|
|
20
|
-
let provider
|
|
21
|
-
try {
|
|
22
|
-
provider = createProvider()
|
|
23
|
-
console.log(` ā
Provider: ${provider.constructor.name}, model: ${provider.model}\n`)
|
|
24
|
-
} catch (e: any) {
|
|
25
|
-
console.log(` ā ${e.message}\n`)
|
|
26
|
-
process.exit(1)
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
console.log("2ļøā£ Testing simple generation...")
|
|
30
|
-
let rawText = ""
|
|
31
|
-
try {
|
|
32
|
-
rawText = await provider.generate({
|
|
33
|
-
prompt: "Say hello as JSON: {\"message\": \"hello\"}",
|
|
34
|
-
temperature: 0.1,
|
|
35
|
-
jsonMode: true,
|
|
36
|
-
})
|
|
37
|
-
const cleaned = extractJson(rawText)
|
|
38
|
-
const parsed = JSON.parse(cleaned)
|
|
39
|
-
console.log(` ā
Response: ${JSON.stringify(parsed)}\n`)
|
|
40
|
-
} catch (e: any) {
|
|
41
|
-
console.log(` ā ${e.message}`)
|
|
42
|
-
console.log(` Raw AI response (first 500 chars):\n${"ā".repeat(60)}\n${rawText.slice(0, 500)}\n${"ā".repeat(60)}`)
|
|
43
|
-
console.log(` Cleaned (first 500 chars):\n${"ā".repeat(60)}\n${extractJson(rawText).slice(0, 500)}\n${"ā".repeat(60)}`)
|
|
44
|
-
process.exit(1)
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
console.log("3ļøā£ Testing roadmap generation...")
|
|
48
|
-
try {
|
|
49
|
-
const prefs = await getDb().query.userPreferences.findFirst({
|
|
50
|
-
where: eq(userPreferences.userId, USER_ID),
|
|
51
|
-
})
|
|
52
|
-
if (!prefs) {
|
|
53
|
-
console.log(" āļø No user preferences found (run onboarding first or create manually)")
|
|
54
|
-
} else {
|
|
55
|
-
const prompt = `You are a LeetCode coach creating a personalized study roadmap.
|
|
56
|
-
|
|
57
|
-
User Profile:
|
|
58
|
-
- Experience: ${prefs.experienceLevel}
|
|
59
|
-
- Goals: ${prefs.goals.join(", ")}
|
|
60
|
-
- Weak topics: ${prefs.weakTopics.join(", ")}
|
|
61
|
-
- Target companies: ${prefs.targetCompanies?.join(", ") || "Not specified"}
|
|
62
|
-
- Hours per week: ${prefs.hoursPerWeek}
|
|
63
|
-
- Target date: ${prefs.targetDate || "No deadline"}
|
|
64
|
-
|
|
65
|
-
Return a JSON array where each entry has: week (number), topic (string), description (string), problemsCount (number).
|
|
66
|
-
Aim for 4 weeks.`
|
|
67
|
-
|
|
68
|
-
rawText = ""
|
|
69
|
-
rawText = await provider.generate({ prompt, temperature: 0.7, jsonMode: true })
|
|
70
|
-
const cleaned = extractJson(rawText)
|
|
71
|
-
const parsed = JSON.parse(cleaned)
|
|
72
|
-
const weeks = Array.isArray(parsed) ? parsed : parsed.weeks || parsed.roadmap || []
|
|
73
|
-
console.log(` ā
Generated ${weeks.length} weeks`)
|
|
74
|
-
weeks.forEach((w: any) => console.log(` Week ${w.week}: ${w.topic}`))
|
|
75
|
-
}
|
|
76
|
-
} catch (e: any) {
|
|
77
|
-
console.log(` ā ${e.message}`)
|
|
78
|
-
console.log(` Raw AI response (first 500 chars):\n${"ā".repeat(60)}\n${rawText.slice(0, 500)}\n${"ā".repeat(60)}`)
|
|
79
|
-
if (e.stack) console.log(` Stack: ${e.stack.split("\n").slice(0, 3).join("\n ")}`)
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
console.log("\nā
Done")
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
main().catch((e) => {
|
|
86
|
-
console.error("Fatal:", e)
|
|
87
|
-
process.exit(1)
|
|
88
|
-
})
|