Louai_performance_orchestrator.ts5 matches
5051// ============================================================================
52// MAIN REVIEW FUNCTION
53// ============================================================================
5455/**
56* Main function for AI team performance review
57*/
58export async function reviewTeamPerformance(
59userId: string,
60leagueId: string,
194195/**
196* Quick analysis function for testing
197*/
198export async function quickTeamAnalysis(
199userId: string,
200leagueId: string,
Louai_performance_api.ts8 matches
25* GET /scheduler/status - Get scheduler status
26*/
27export default async function handler(request: Request): Promise<Response> {
28const url = new URL(request.url);
29const method = request.method;
115* Query params: userId, leagueId, teamKey, options (optional JSON)
116*/
117async function handleAnalyzeRequest(request: Request, corsHeaders: Record<string, string>): Promise<Response> {
118try {
119const url = new URL(request.url);
216* GET /analysis/{userId}
217*/
218async function handleGetAnalysis(userId: string, corsHeaders: Record<string, string>): Promise<Response> {
219try {
220console.log(`📊 API: Retrieving latest analysis for user ${userId}`);
265* GET /health
266*/
267async function handleHealthCheck(corsHeaders: Record<string, string>): Promise<Response> {
268try {
269const schedulerSummary = await getSchedulerSummary();
304* Body: SchedulerConfig
305*/
306async function handleAddSchedule(request: Request, corsHeaders: Record<string, string>): Promise<Response> {
307try {
308const config = await request.json();
363* Body: { userId, leagueId }
364*/
365async function handleRemoveSchedule(request: Request, corsHeaders: Record<string, string>): Promise<Response> {
366try {
367const { userId, leagueId } = await request.json();
408* GET /scheduler/status
409*/
410async function handleSchedulerStatus(corsHeaders: Record<string, string>): Promise<Response> {
411try {
412const summary = await getSchedulerSummary();
438* GET /
439*/
440async function handleApiDocumentation(corsHeaders: Record<string, string>): Promise<Response> {
441const docs = {
442title: "AI Fantasy Baseball Performance Analysis API",
Louai_performance_scheduler.ts11 matches
3738/**
39* Main cron scheduler function for AI performance analysis
40* Configure this as a cron job in Val.town
41*/
42export async function aiPerformanceAnalysisCron(): Promise<void> {
43console.log("🤖 Starting scheduled AI performance analysis...");
44const startTime = Date.now();
110* Process a single scheduled analysis configuration
111*/
112async function processScheduledAnalysis(config: SchedulerConfig): Promise<any> {
113console.log(`🔍 Processing analysis for user ${config.userId}, league ${config.leagueId}`);
114
191* Get scheduler configurations from storage
192*/
193async function getSchedulerConfigs(): Promise<SchedulerConfig[]> {
194try {
195const configs = await blob.getJSON("ai_performance_scheduler_configs");
204* Store analysis result for later retrieval
205*/
206async function storeAnalysisResult(result: StoredAnalysisResult): Promise<void> {
207try {
208const key = `ai_analysis_result_${result.userId}_${result.timestamp.replace(/[:.]/g, '_')}`;
221* Store execution summary for monitoring
222*/
223async function storeExecutionSummary(summary: any): Promise<void> {
224try {
225const key = `ai_scheduler_summary_${summary.timestamp.replace(/[:.]/g, '_')}`;
237* Send email notification with analysis results
238*/
239async function sendEmailNotification(config: SchedulerConfig, analysisResult: any): Promise<void> {
240try {
241const hasRecommendations = analysisResult.recommendations && analysisResult.recommendations.length > 0;
311* Add or update a scheduler configuration
312*/
313export async function addSchedulerConfig(config: SchedulerConfig): Promise<void> {
314try {
315const configs = await getSchedulerConfigs();
335* Remove a scheduler configuration
336*/
337export async function removeSchedulerConfig(userId: string, leagueId: string): Promise<void> {
338try {
339const configs = await getSchedulerConfigs();
354* Get latest analysis result for a user
355*/
356export async function getLatestAnalysis(userId: string): Promise<StoredAnalysisResult | null> {
357try {
358const key = `ai_analysis_latest_${userId}`;
368* Get scheduler execution summary
369*/
370export async function getSchedulerSummary(): Promise<any> {
371try {
372const summary = await blob.getJSON("ai_scheduler_latest_summary");
Louai_performance_prompts.ts28 matches
212* Generate system context information for analysis
213*/
214function generateSystemContext(leagueContext?: PerformancePromptContext['leagueContext'], timeContext?: PerformancePromptContext['timeContext']): string {
215if (!leagueContext && !timeContext) return '';
216240* Generate comprehensive team overview section
241*/
242function generateTeamOverview(teamStats: TeamPerformanceStats, leagueContext?: PerformancePromptContext['leagueContext']): string {
243return `
244TEAM PERFORMANCE OVERVIEW:
254* Generate roster composition analysis
255*/
256function generateRosterAnalysis(teamStats: TeamPerformanceStats, playerStats: PlayerPerformanceStats[]): string {
257const batters = playerStats.filter(p => p.position_type === 'B').length;
258const pitchers = playerStats.filter(p => p.position_type === 'P').length;
271* Generate recent performance trends
272*/
273function generateRecentPerformanceData(teamStats: TeamPerformanceStats): string {
274if (!teamStats.recent_performance?.last_5_weeks) return '';
275290* Generate detailed player performance data
291*/
292function generatePlayerPerformanceDetails(playerStats: PlayerPerformanceStats[], verbosity: PromptConfig['verbosityLevel']): string {
293const sortedStats = [...playerStats].sort((a, b) =>
294(b.performance_metrics?.avg_fantasy_points || 0) - (a.performance_metrics?.avg_fantasy_points || 0)
313* Generate waiver analysis context
314*/
315function generateWaiverAnalysisContext(
316teamStats: TeamPerformanceStats,
317competitiveContext?: PickupPromptContext['competitiveContext'],
344* Generate roster needs analysis
345*/
346function generateRosterNeedsAnalysis(rosterNeeds: PickupPromptContext['rosterNeeds'], underperformers: PlayerPerformanceStats[]): string {
347return `
348ROSTER NEEDS ASSESSMENT:
356* Generate waiver candidates data section
357*/
358function generateWaiverCandidatesData(candidates: WaiverWirePlayer[]): string {
359const sortedCandidates = [...candidates]
360.sort((a, b) => (b.fantasy_relevance_score || 0) - (a.fantasy_relevance_score || 0))
376* Generate underperformers analysis
377*/
378function generateUnderperformersAnalysis(underperformers: PlayerPerformanceStats[]): string {
379if (underperformers.length === 0) return '\nDROP CANDIDATES: No clear underperformers identified.';
380397* Generate analysis instructions based on configuration
398*/
399function generateAnalysisInstructions(config: PromptConfig): string {
400const instructions = `
401ANALYSIS REQUIREMENTS:
419* Generate pickup analysis instructions
420*/
421function generatePickupAnalysisInstructions(config: PromptConfig): string {
422return `
423PICKUP ANALYSIS METHODOLOGY:
443* Generate the expected JSON output schema for performance analysis
444*/
445function generateOutputSchema(): string {
446return `
447REQUIRED JSON OUTPUT STRUCTURE:
521* Generate the expected JSON output schema for pickup recommendations
522*/
523function generatePickupOutputSchema(): string {
524return `
525REQUIRED JSON OUTPUT STRUCTURE:
603* Generate example performance analysis for reference
604*/
605function generatePerformanceAnalysisExamples(): string {
606return `
607EXAMPLE ANALYSIS OUTPUT:
620* Generate example pickup recommendations for reference
621*/
622function generatePickupRecommendationExamples(): string {
623return `
624EXAMPLE PICKUP RECOMMENDATION:
652653// ============================================================================
654// HELPER FUNCTIONS
655// ============================================================================
656658* Get default prompt configuration
659*/
660function getDefaultConfig(): PromptConfig {
661return {
662model: 'gpt-4-turbo-preview',
672* Get player form description based on recent performance
673*/
674function getPlayerFormDescription(player: PlayerPerformanceStats): string {
675const consistency = player.performance_metrics?.consistency_score || 50;
676if (consistency >= 80) return 'Excellent';
683* Get player trend description for waiver candidates
684*/
685function getPlayerTrendDescription(player: WaiverWirePlayer): string {
686if (player.fantasy_relevance_score && player.fantasy_relevance_score > 75) return 'Hot';
687if (player.fantasy_relevance_score && player.fantasy_relevance_score < 25) return 'Cold';
692* Get player issues description for underperformers
693*/
694function getPlayerIssuesDescription(player: PlayerPerformanceStats): string {
695const issues = [];
696
711712// ============================================================================
713// VALIDATION FUNCTIONS
714// ============================================================================
715717* Validate performance prompt inputs
718*/
719function validatePerformancePromptInputs(context: PerformancePromptContext): PromptValidationResult {
720const errors: string[] = [];
721const warnings: string[] = [];
774* Validate pickup prompt inputs
775*/
776function validatePickupPromptInputs(context: PickupPromptContext): PromptValidationResult {
777const errors: string[] = [];
778const warnings: string[] = [];
831832// ============================================================================
833// UTILITY FUNCTIONS
834// ============================================================================
835840* @returns Model-optimized prompt
841*/
842export function optimizePromptForModel(prompt: string, model: PromptConfig['model']): string {
843switch (model) {
844case 'gpt-4o':
862* @returns Estimated token count
863*/
864export function estimateTokenCount(prompt: string): number {
865// Rough estimate: ~4 characters per token for English text
866return Math.ceil(prompt.length / 4);
873* @returns Truncated prompt if necessary
874*/
875export function truncatePromptForTokenLimit(prompt: string, maxTokens: number): string {
876const estimatedTokens = estimateTokenCount(prompt);
877
901* Create a prompt configuration for different use cases
902*/
903export function createPromptConfig(useCase: 'performance' | 'pickups' | 'quick'): PromptConfig {
904const baseConfig = getDefaultConfig();
905
Loudaily_lineup_scheduler.tsx3 matches
1// Lou Fantasy Baseball Daily Lineup Scheduler
2// Val.town Cron Function for Daily Pitcher Optimization
34import { LouTokenStorage, StoredTokens } from "./oauth/token_storage.tsx";
1544}
15451546// Val.town Cron Handler - This function will be called by Val.town's cron scheduler
1547export default async function(): Promise<Response> {
1548console.log('🕒 Daily lineup scheduler cron job triggered');
1549
Louai_performance_openai_client.ts4 matches
879880// ============================================================================
881// CONVENIENCE FACTORY FUNCTION
882// ============================================================================
883887* @returns Configured OpenAI client
888*/
889export function createOpenAIClient(config?: Partial<OpenAIConfig>): LouOpenAIClient {
890return new LouOpenAIClient(config);
891}
900* @returns Validation result
901*/
902export function validatePerformanceData(data: {
903teamStats: TeamPerformanceStats;
904playerStats: PlayerPerformanceStats[];
931* @returns Validation result
932*/
933export function validateWaiverData(
934lowPerformers: PlayerPerformanceStats[],
935candidates: WaiverWirePlayer[]
2// Main entry point for Val.town deployment
34export default function App() {
5return (
6<div>
Louoauth_callback.ts2 matches
3import { LouTokenStorage } from "./token_storage.tsx";
45export default async function(req: Request): Promise<Response> {
6console.log("OAuth callback endpoint called");
7185}
186187function createErrorResponse(title: string, message: string, suggestion: string): Response {
188return new Response(
189`
Louoauth_auth.ts1 match
2import { LouOAuthHandler } from "./oauth_handler.ts";
34export default async function(req: Request): Promise<Response> {
5console.log("OAuth auth endpoint called");
6
ChatmcpTesting.ts4 matches
18* @returns Promise<MCPTestResult>
19*/
20export async function testMCPServer(server: MCPServerConfig, clientPool: MCPClientPool): Promise<MCPTestResult> {
21if (!server.url) {
22return {
50* @returns Promise<Record<string, MCPTestResult>>
51*/
52export async function testMCPServers(servers: MCPServerConfig[], clientPool: MCPClientPool): Promise<Record<string, MCPTestResult>> {
53const enabledServers = servers.filter(server => server.enabled && server.url);
547576/**
77* Legacy function for backward compatibility - creates direct fetch test
78* @deprecated Use testMCPServer with clientPool instead
79*/
80export async function testMCPServerDirect(server: MCPServerConfig): Promise<MCPTestResult> {
81if (!server.url) {
82return {