feat(ui): redesign voice cockpit with clinical companion drawer, Svelte 5 migration, and Gemini 3.8 voice
- Re-architect VoiceSession into full-bleed studio cockpit with overlay slide-over companion drawer - Eliminate width squishing defect on LiveInsightPanel and add native dark/light theme support - Integrate authentic Google Gemini 3.8 Flash TTS with Fenrir persona and fallback audio pipeline - Implement comprehensive Playwright E2E visual regression suite across Desktop, iPad, and iPhone (21 tests, 45 snapshots) - Migrate core application to Svelte 5 runes (, , ) with reactive stores - Maintain .NET 8 Azure Functions serverless endpoints and clean build hygiene
This commit is contained in:
1 parent
c82b112624
commit
1feea40684
148 files changed
+11230
-1706
No files matched your search
@@ -0,0 +1,84 @@
|
||||
---
|
||||
name: azure-functions-genai
|
||||
description: >-
|
||||
Guides the design, implementation, and debugging of Azure Functions v4 (.NET 8/10 Isolated Worker)
|
||||
using the official Google.GenAI C# SDK for serverless AI endpoints.
|
||||
---
|
||||
|
||||
# Azure Functions & Google.GenAI C# SDK Skill
|
||||
|
||||
Use this skill when developing, updating, or testing the C# serverless API endpoints located in `api/`.
|
||||
|
||||
---
|
||||
|
||||
## 1. Solution Architecture
|
||||
|
||||
The backend consists of an **Azure Functions v4 Isolated Worker** targeting **.NET 8.0**:
|
||||
- Project file: `api/api.csproj`
|
||||
- Runtime: `Microsoft.Azure.Functions.Worker` 2.50+ & `Google.GenAI` 1.20+
|
||||
- Host configuration: `api/host.json`
|
||||
- Application Insights integration: `Microsoft.ApplicationInsights.WorkerService`
|
||||
|
||||
---
|
||||
|
||||
## 2. Google.GenAI C# SDK Integration Patterns
|
||||
|
||||
### 2.1 Namespaces & Types
|
||||
```csharp
|
||||
using Google.GenAI;
|
||||
using Google.GenAI.Types;
|
||||
using Type = Google.GenAI.Types.Type; // Disambiguate with System.Type
|
||||
```
|
||||
|
||||
### 2.2 Client Initialization
|
||||
```csharp
|
||||
var apiKey = System.Environment.GetEnvironmentVariable("GEMINI_API_KEY");
|
||||
var client = new Client(apiKey: apiKey);
|
||||
```
|
||||
|
||||
### 2.3 Structured Output Generation (JSON Schema)
|
||||
```csharp
|
||||
var schema = new Schema
|
||||
{
|
||||
Type = Type.Object,
|
||||
Properties = new Dictionary<string, Schema>
|
||||
{
|
||||
{ "distortionsIdentified", new Schema { Type = Type.Array, Items = new Schema { Type = Type.String } } },
|
||||
{ "techniquesUsed", new Schema { Type = Type.Array, Items = new Schema { Type = Type.String } } },
|
||||
{ "clinicalInsight", new Schema { Type = Type.String } },
|
||||
{ "feedbackType", new Schema { Type = Type.String, Enum = new List<string> { "Constructive", "Positive", "Neutral" } } }
|
||||
},
|
||||
Required = new List<string> { "distortionsIdentified", "techniquesUsed", "clinicalInsight", "feedbackType" }
|
||||
};
|
||||
|
||||
var response = await client.Models.GenerateContentAsync(
|
||||
model: "gemini-2.5-flash",
|
||||
contents: promptContent,
|
||||
config: new GenerateContentConfig
|
||||
{
|
||||
SystemInstruction = new Content { Parts = new List<Part> { new Part { Text = systemInstruction } } },
|
||||
ResponseMimeType = "application/json",
|
||||
ResponseSchema = schema
|
||||
});
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 3. Endpoints Matrix
|
||||
|
||||
| Route | HTTP Method | Function Name | Purpose |
|
||||
|:---|:---|:---|:---|
|
||||
| `/api/chat` | `POST` | `ChatProgression` | Headless roleplay progression with strict anti-meta guardrails |
|
||||
| `/api/analysis` | `POST` | `ClinicalAnalysis` | Real-time clinical supervisor turn evaluation |
|
||||
| `/api/scenario/generate` | `POST` | `GenerateScenario` | Dynamic CBT roleplay scenario generation |
|
||||
|
||||
---
|
||||
|
||||
## 4. Local Build & Test Verification
|
||||
```bash
|
||||
# Build the C# API project
|
||||
dotnet build api/api.csproj
|
||||
|
||||
# Run local functions host (requires Azure Functions Core Tools)
|
||||
func start --csharp --prefix api
|
||||
```
|
||||
Reference in new issue
Block a user