import { Component, inject, OnInit } from '@angular/core'; import { CommonModule } from '@angular/common'; import { FormsModule } from '@angular/forms'; import { MatCardModule } from '@angular/material/card'; import { MatFormFieldModule } from '@angular/material/form-field'; import { MatInputModule } from '@angular/material/input'; import { MatSelectModule } from '@angular/material/select'; import { MatButtonModule } from '@angular/material/button'; import { MatIconModule } from '@angular/material/icon'; import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; import { MatSnackBar, MatSnackBarModule } from '@angular/material/snack-bar'; import { MatExpansionModule } from '@angular/material/expansion'; import { ApiService, Environment } from '../../services/api.service'; import { EnvironmentService } from '../../services/environment.service'; @Component({ selector: 'app-environment', standalone: true, imports: [ CommonModule, FormsModule, MatCardModule, MatFormFieldModule, MatInputModule, MatSelectModule, MatButtonModule, MatIconModule, MatProgressSpinnerModule, MatSnackBarModule, MatExpansionModule ], template: `
settings Environment Configuration @if (isGPTMode()) { info
{{ environment.work_mode === 'gpt4o' ? 'GPT-4o' : 'GPT-4o Mini' }} Mode

This mode uses OpenAI's API which has usage-based pricing.

Approximate cost: {{ environment.work_mode === 'gpt4o' ? '$0.01-0.03' : '$0.001-0.003' }} per conversation turn.

}
Work Mode HF Cloud Cloud On-Premise GPT-4o GPT-4o Mini cloud {{ getTokenLabel() }} vpn_key {{ isGPTMode() ? 'Required for OpenAI API access' : 'Required for HF Cloud and Cloud modes' }} Spark Endpoint link @if (isGPTMode()) { Not required for GPT mode }
TTS Engine No TTS ElevenLabs Blaze (Coming Soon) record_voice_over TTS API Key key
STT Engine No STT ElevenLabs Flicker (Coming Soon) mic STT API Key key
psychology Internal System Prompt Advanced configuration for LLM Internal Prompt This prompt will be prepended to all project prompts
`, styles: [` .environment-container { max-width: 800px; margin: 0 auto; } mat-card-header { margin-bottom: 24px; mat-card-title { display: flex; align-items: center; gap: 8px; font-size: 24px; mat-icon { font-size: 28px; width: 28px; height: 28px; } } } .info-card { margin-bottom: 20px; background-color: #e3f2fd; mat-card-content { display: flex; gap: 16px; align-items: flex-start; mat-icon { color: #1976d2; margin-top: 4px; } p { margin: 4px 0; font-size: 14px; } } } .full-width { width: 100%; margin-bottom: 20px; } .engine-row { display: flex; gap: 16px; align-items: flex-start; margin-bottom: 20px; .engine-field { flex: 1; } .api-key-field { flex: 1.5; } } .prompt-panel { margin-bottom: 20px; mat-expansion-panel-header { mat-panel-title { display: flex; align-items: center; gap: 8px; mat-icon { color: #666; } } } } .form-actions { display: flex; gap: 16px; margin-top: 24px; padding-top: 24px; border-top: 1px solid #e0e0e0; button { mat-spinner { margin-right: 8px; vertical-align: middle; // Spinner'ı hizalamak için ekleyin } mat-icon { vertical-align: middle; // Icon'u hizalamak için ekleyin margin-right: 4px; // Icon ile text arasına boşluk } } } ::ng-deep { .mat-mdc-form-field-icon-prefix { padding-right: 12px; } .mat-mdc-progress-spinner { --mdc-circular-progress-active-indicator-color: white; } .mat-expansion-panel-body { padding: 16px 0 !important; } } `] }) export class EnvironmentComponent implements OnInit { private apiService = inject(ApiService); private snackBar = inject(MatSnackBar); private environmentService = inject(EnvironmentService); environment: Environment = { work_mode: 'hfcloud', cloud_token: '', spark_endpoint: '', internal_prompt: '', tts_engine: 'no_tts', tts_engine_api_key: '', stt_engine: 'no_stt', stt_engine_api_key: '' }; loading = true; saving = false; ngOnInit() { this.loadEnvironment(); } loadEnvironment() { this.loading = true; this.apiService.getEnvironment().subscribe({ next: (env) => { this.environment = env; this.loading = false; }, error: (err) => { this.snackBar.open('Failed to load environment configuration', 'Close', { duration: 5000, panelClass: 'error-snackbar' }); this.loading = false; } }); } getTokenLabel(): string { switch(this.environment.work_mode) { case 'gpt4o': case 'gpt4o-mini': return 'OpenAI API Key'; case 'hfcloud': case 'cloud': return 'Cloud Token'; default: return 'Cloud Token'; } } getTokenPlaceholder(): string { switch(this.environment.work_mode) { case 'gpt4o': case 'gpt4o-mini': return 'Enter OpenAI API key (sk-...)'; case 'hfcloud': case 'cloud': return 'Enter cloud token'; default: return 'Enter cloud token'; } } isGPTMode(): boolean { return this.environment.work_mode === 'gpt4o' || this.environment.work_mode === 'gpt4o-mini'; } onWorkModeChange() { if (this.environment.work_mode === 'on-premise') { this.environment.cloud_token = ''; } } onTTSEngineChange() { if (this.environment.tts_engine === 'no_tts') { this.environment.tts_engine_api_key = ''; } } onSTTEngineChange() { if (this.environment.stt_engine === 'no_stt') { this.environment.stt_engine_api_key = ''; } } save() { this.saving = true; this.apiService.updateEnvironment(this.environment).subscribe({ next: () => { // Environment service'i güncelle this.environmentService.updateEnvironment(this.environment); this.snackBar.open('Environment configuration saved successfully', 'Close', { duration: 3000 }); this.saving = false; }, error: (err) => { this.snackBar.open( err.error?.detail || 'Failed to save configuration', 'Close', { duration: 5000, panelClass: 'error-snackbar' } ); this.saving = false; } }); } testConnection() { this.snackBar.open('Testing connection to Spark endpoint...', undefined, { duration: 2000 }); // TODO: Implement actual connection test setTimeout(() => { this.snackBar.open('Connection successful!', 'Close', { duration: 3000 }); }, 2000); } reloadFromSpark() { if (this.isGPTMode()) { return; } this.snackBar.open('Reloading configuration from Spark...', undefined, { duration: 2000 }); setTimeout(() => { this.loadEnvironment(); this.snackBar.open('Configuration reloaded', 'Close', { duration: 3000 }); }, 1000); } }