79 lines
2.5 KiB
Go
79 lines
2.5 KiB
Go
package main
|
|
|
|
import (
|
|
"bytes"
|
|
"context"
|
|
"encoding/json"
|
|
"fmt"
|
|
"net/http"
|
|
"strings"
|
|
|
|
"git.cin.su/m/Assistant/contracts/epistemics"
|
|
)
|
|
|
|
type researchRuntimeClient struct {
|
|
baseURL string
|
|
client *http.Client
|
|
}
|
|
|
|
func newResearchRuntimeClient(rawURL string, client *http.Client) (researchRuntimeClient, error) {
|
|
base := strings.TrimRight(strings.TrimSpace(rawURL), "/")
|
|
if base == "" {
|
|
return researchRuntimeClient{}, fmt.Errorf("research runtime URL is empty")
|
|
}
|
|
if client == nil {
|
|
client = http.DefaultClient
|
|
}
|
|
return researchRuntimeClient{baseURL: base, client: client}, nil
|
|
}
|
|
|
|
func (c researchRuntimeClient) EvaluateWeb(ctx context.Context, request epistemics.WebResearchRequest) (epistemics.ResearchResult, error) {
|
|
payload, err := json.Marshal(request)
|
|
if err != nil {
|
|
return epistemics.ResearchResult{}, err
|
|
}
|
|
httpRequest, err := http.NewRequestWithContext(ctx, http.MethodPost, c.baseURL+"/v1/research/web/evaluate", bytes.NewReader(payload))
|
|
if err != nil {
|
|
return epistemics.ResearchResult{}, err
|
|
}
|
|
httpRequest.Header.Set("Content-Type", "application/json")
|
|
response, err := c.client.Do(httpRequest)
|
|
if err != nil {
|
|
return epistemics.ResearchResult{}, err
|
|
}
|
|
defer response.Body.Close()
|
|
if response.StatusCode < 200 || response.StatusCode >= 300 {
|
|
return epistemics.ResearchResult{}, fmt.Errorf("research runtime status %d", response.StatusCode)
|
|
}
|
|
var result epistemics.ResearchResult
|
|
if err := json.NewDecoder(response.Body).Decode(&result); err != nil {
|
|
return epistemics.ResearchResult{}, err
|
|
}
|
|
return result, nil
|
|
}
|
|
|
|
func (c researchRuntimeClient) SearchWeb(ctx context.Context, request epistemics.WebSearchRequest) (epistemics.ResearchResult, error) {
|
|
payload, err := json.Marshal(request)
|
|
if err != nil {
|
|
return epistemics.ResearchResult{}, err
|
|
}
|
|
httpRequest, err := http.NewRequestWithContext(ctx, http.MethodPost, c.baseURL+"/v1/research/web/search", bytes.NewReader(payload))
|
|
if err != nil {
|
|
return epistemics.ResearchResult{}, err
|
|
}
|
|
httpRequest.Header.Set("Content-Type", "application/json")
|
|
response, err := c.client.Do(httpRequest)
|
|
if err != nil {
|
|
return epistemics.ResearchResult{}, err
|
|
}
|
|
defer response.Body.Close()
|
|
if response.StatusCode < 200 || response.StatusCode >= 300 {
|
|
return epistemics.ResearchResult{}, fmt.Errorf("research search status %d", response.StatusCode)
|
|
}
|
|
var result epistemics.ResearchResult
|
|
if err := json.NewDecoder(response.Body).Decode(&result); err != nil {
|
|
return epistemics.ResearchResult{}, err
|
|
}
|
|
return result, nil
|
|
}
|