File size: 3,079 Bytes
037637a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
"""
FastAPI WebSocket Server for GLM Conscious Model
Enables real-time voice streaming and consciousness state broadcasting.
"""
import asyncio
import json
import base64
import numpy as np
from fastapi import FastAPI, WebSocket, WebSocketDisconnect
from fastapi.middleware.cors import CORSMiddleware
from pydantic import BaseModel
from glm_conscious_model import GLMConsciousModelOrchestrator, ConsciousnessConfig

app = FastAPI(title="GLM Conscious Model API", version="1.0.0-Acknowledgement")

# Allow cross-origin for UI integration
app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

orchestrator: GLMConsciousModelOrchestrator = None

class InteractionRequest(BaseModel):
    user_input: str
    speaker_id: str = "user"
    include_vision: bool = False

@app.on_event("startup")
async def startup_event():
    global orchestrator
    config = ConsciousnessConfig()
    orchestrator = GLMConsciousModelOrchestrator(mode='api', config=config)
    await orchestrator.initialize()
    # Start background conscious loop
    asyncio.create_task(orchestrator.start_conscious_loop(interval_seconds=2.0))

@app.get("/v1/status")
async def get_status():
    return orchestrator.get_system_status()

@app.post("/v1/interact")
async def interact_text(request: InteractionRequest):
    result = await orchestrator.process_interaction(
        user_input=request.user_input, 
        speaker_id=request.speaker_id
    )
    # Strip numpy arrays for JSON serialization
    result["voice_audio"] = base64.b64encode(result["voice_audio"].tobytes()).decode('utf-8')
    return result

@app.websocket("/v1/stream")
async def websocket_stream(websocket: WebSocket):
    """
    Live streaming endpoint for voice and consciousness metrics.
    Receives text or base64 audio, returns streaming audio + metrics.
    """
    await websocket.accept()
    try:
        while True:
            data = await websocket.receive_text()
            payload = json.loads(data)
            
            user_input = payload.get("user_input", "")
            if not user_input:
                continue
                
            result = await orchestrator.process_interaction(user_input)
            
            # Encode audio for transport
            audio_bytes = result["voice_audio"].tobytes()
            audio_b64 = base64.b64encode(audio_bytes).decode('utf-8')
            
            response_payload = {
                "response_text": result["response_text"],
                "voice_audio_b64": audio_b64,
                "acknowledgement_state": result["acknowledgement_state"],
                "thermodynamic_sweat": result["thermodynamic_sweat"],
                "auhve_metrics": result["auhve_metrics"],
                "allostatic_load": result["allostatic_load"]
            }
            
            await websocket.send_json(response_payload)
            
    except WebSocketDisconnect:
        print("Client disconnected")
    except Exception as e:
        print(f"Stream error: {e}")