package services import ( "bufio" "bytes" "encoding/json" "net/http" ) // DataIa estructura para el request a Ollama type DataIa struct { Prompt string `json:"prompt"` Model string `json:"model"` Stream bool `json:"stream"` } // respuestaOllama estructura para parsear la respuesta de Ollama type respuestaOllama struct { Response string `json:"response"` Done bool `json:"done"` } // GenerateTextoStream lee respuesta de Ollama en tiempo real y devuelve canal func GenerateTextoStream(data DataIa) (<-chan string, error) { out := make(chan string) // Convertir datos a JSON jsonData, err := json.Marshal(data) if err != nil { return nil, err } // Crear request con cabecera personalizada req, err := http.NewRequest("POST", "http://72.60.24.97:8080/ollama/api/generate", bytes.NewBuffer(jsonData)) if err != nil { return nil, err } req.Header.Set("Content-Type", "application/json") req.Header.Set("Authorization", "Bearer sk-43804e00f5294200ad1e599550fbee4f") // Ejecutar request client := &http.Client{} resp, err := client.Do(req) if err != nil { return nil, err } // Procesar en goroutine go func() { defer resp.Body.Close() defer close(out) scanner := bufio.NewScanner(resp.Body) for scanner.Scan() { var msg respuestaOllama if err := json.Unmarshal(scanner.Bytes(), &msg); err == nil { if msg.Response != "" { out <- msg.Response } if msg.Done { break } } } }() return out, nil }