Group A — gap fills: - restore Client.GetWorkflowWorkerInfo (regression from v1.3.0; /v1/workflows/workers/whoami is still in the spec and is needed by callers running custom workers) - add Client.GetChatCompletionFields, GetChatCompletionFieldOptions, GetChatCompletionFieldOptionsCounts (previously-missing observability fields API) Group B — Python SDK v2.3.0..v2.4.3 sync: - workflow.EncodedPayloadOption typed enum (offloaded / encrypted / encrypted-partial); replaces []string on NetworkEncodedInput.EncodingOptions. Wire-compatible refinement; source-incompatible for callers that built the slice as []string literals. - workflow-connector integration: ConnectorSlot, ConnectorBindings, ConnectorExtensions, WorkflowExtensions, BuildConnectorExtensions(...) helper, ConnectorAuthTaskState, ConnectorAuthStatus constants. New Extensions map[string]any field on workflow.ExecutionRequest. - HITL confirmation constants: conversation.Confirmation enum (ConfirmationAllow/Deny) and ConfirmationStatusPending/Allowed/Denied alongside the pre-existing ToolCallConfirmation type and tool_confirmations field. No-op verification: - ChatCompletionChoice.message remains singular per spec v1.0.0; Python's 'messages[]' rename was internal SDK shape, not wire format. Tests: 297 (was 284), all green. go vet clean.
101 lines
3.1 KiB
Go
101 lines
3.1 KiB
Go
package mistral
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"testing"
|
|
|
|
"github.com/VikingOwl91/mistral-go-sdk/observability"
|
|
)
|
|
|
|
func TestGetChatCompletionFields_Success(t *testing.T) {
|
|
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
if r.Method != "GET" || r.URL.Path != "/v1/observability/chat-completion-fields" {
|
|
t.Errorf("unexpected %s %s", r.Method, r.URL.Path)
|
|
}
|
|
_ = json.NewEncoder(w).Encode(map[string]any{
|
|
"field_definitions": []map[string]any{
|
|
{
|
|
"name": "model",
|
|
"label": "Model",
|
|
"type": "ENUM",
|
|
"supported_operators": []string{"eq", "neq", "includes"},
|
|
},
|
|
},
|
|
"field_groups": []map[string]any{
|
|
{"name": "request", "label": "Request"},
|
|
},
|
|
})
|
|
}))
|
|
defer server.Close()
|
|
|
|
client := NewClient("key", WithBaseURL(server.URL))
|
|
resp, err := client.GetChatCompletionFields(context.Background())
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if len(resp.FieldDefinitions) != 1 {
|
|
t.Fatalf("got %d field definitions", len(resp.FieldDefinitions))
|
|
}
|
|
def := resp.FieldDefinitions[0]
|
|
if def.Name != "model" || def.Type != observability.FieldTypeEnum {
|
|
t.Errorf("unexpected field def: %+v", def)
|
|
}
|
|
if len(def.SupportedOperators) != 3 {
|
|
t.Errorf("got %d operators", len(def.SupportedOperators))
|
|
}
|
|
if len(resp.FieldGroups) != 1 || resp.FieldGroups[0].Name != "request" {
|
|
t.Errorf("unexpected groups: %+v", resp.FieldGroups)
|
|
}
|
|
}
|
|
|
|
func TestGetChatCompletionFieldOptions_Success(t *testing.T) {
|
|
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
if r.URL.Path != "/v1/observability/chat-completion-fields/model/options" {
|
|
t.Errorf("got path %s", r.URL.Path)
|
|
}
|
|
if got := r.URL.Query().Get("operator"); got != "eq" {
|
|
t.Errorf("got operator=%q want eq", got)
|
|
}
|
|
_ = json.NewEncoder(w).Encode(map[string]any{
|
|
"options": []any{"mistral-small-latest", "mistral-large-latest", nil, true},
|
|
})
|
|
}))
|
|
defer server.Close()
|
|
|
|
client := NewClient("key", WithBaseURL(server.URL))
|
|
resp, err := client.GetChatCompletionFieldOptions(context.Background(), "model", observability.FieldOperatorEq)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if len(resp.Options) != 4 {
|
|
t.Fatalf("got %d options", len(resp.Options))
|
|
}
|
|
}
|
|
|
|
func TestGetChatCompletionFieldOptionsCounts_Success(t *testing.T) {
|
|
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
if r.Method != "POST" || r.URL.Path != "/v1/observability/chat-completion-fields/model/options-counts" {
|
|
t.Errorf("unexpected %s %s", r.Method, r.URL.Path)
|
|
}
|
|
_ = json.NewEncoder(w).Encode(map[string]any{
|
|
"counts": []map[string]any{
|
|
{"value": "mistral-small-latest", "count": 42},
|
|
{"value": "mistral-large-latest", "count": 17},
|
|
},
|
|
})
|
|
}))
|
|
defer server.Close()
|
|
|
|
client := NewClient("key", WithBaseURL(server.URL))
|
|
resp, err := client.GetChatCompletionFieldOptionsCounts(context.Background(), "model", &observability.FieldOptionCountsRequest{})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if len(resp.Counts) != 2 || resp.Counts[0].Count != 42 {
|
|
t.Errorf("unexpected counts: %+v", resp.Counts)
|
|
}
|
|
}
|