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 }