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.
107 lines
3.0 KiB
Go
107 lines
3.0 KiB
Go
package mistral
|
|
|
|
import (
|
|
"encoding/json"
|
|
"testing"
|
|
|
|
"github.com/VikingOwl91/mistral-go-sdk/conversation"
|
|
"github.com/VikingOwl91/mistral-go-sdk/workflow"
|
|
)
|
|
|
|
func TestNetworkEncodedInput_EncodingOptions(t *testing.T) {
|
|
in := workflow.NetworkEncodedInput{
|
|
B64Payload: "eyJrIjoidiJ9",
|
|
EncodingOptions: []workflow.EncodedPayloadOption{workflow.EncodedPayloadOffloaded, workflow.EncodedPayloadEncrypted},
|
|
}
|
|
b, err := json.Marshal(in)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
var got map[string]any
|
|
if err := json.Unmarshal(b, &got); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
opts, ok := got["encoding_options"].([]any)
|
|
if !ok || len(opts) != 2 {
|
|
t.Fatalf("unexpected encoding_options: %v", got["encoding_options"])
|
|
}
|
|
if opts[0] != "offloaded" || opts[1] != "encrypted" {
|
|
t.Errorf("got %v, want [offloaded encrypted]", opts)
|
|
}
|
|
}
|
|
|
|
func TestBuildConnectorExtensions_WireShape(t *testing.T) {
|
|
creds := "work-account"
|
|
ext := workflow.BuildConnectorExtensions(
|
|
workflow.ConnectorSlot{ConnectorName: "gmail"},
|
|
workflow.ConnectorSlot{ConnectorName: "notion", CredentialsName: &creds},
|
|
)
|
|
b, err := json.Marshal(ext)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
want := `{"mistralai":{"connectors":{"bindings":[{"connector_name":"gmail"},{"connector_name":"notion","credentials_name":"work-account"}]}}}`
|
|
if string(b) != want {
|
|
t.Errorf("\nwant %s\ngot %s", want, string(b))
|
|
}
|
|
}
|
|
|
|
func TestExecutionRequest_Extensions(t *testing.T) {
|
|
req := workflow.ExecutionRequest{
|
|
Extensions: workflow.BuildConnectorExtensions(workflow.ConnectorSlot{ConnectorName: "gmail"}),
|
|
}
|
|
b, err := json.Marshal(req)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
var got map[string]any
|
|
if err := json.Unmarshal(b, &got); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if _, ok := got["extensions"]; !ok {
|
|
t.Fatalf("expected extensions key in marshalled request: %s", string(b))
|
|
}
|
|
}
|
|
|
|
func TestConnectorAuthTaskState_Roundtrip(t *testing.T) {
|
|
authURL := "https://oauth.example.com/authorize"
|
|
in := workflow.ConnectorAuthTaskState{
|
|
ConnectorName: "gmail",
|
|
ConnectorID: "conn-1",
|
|
Status: workflow.ConnectorAuthWaitingForAuth,
|
|
AuthURL: &authURL,
|
|
}
|
|
b, err := json.Marshal(in)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
var out workflow.ConnectorAuthTaskState
|
|
if err := json.Unmarshal(b, &out); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if out.Status != workflow.ConnectorAuthWaitingForAuth {
|
|
t.Errorf("got status %q", out.Status)
|
|
}
|
|
if out.AuthURL == nil || *out.AuthURL != authURL {
|
|
t.Errorf("auth_url roundtrip failed")
|
|
}
|
|
}
|
|
|
|
func TestConfirmationConstants_WireValues(t *testing.T) {
|
|
// Reply constants.
|
|
c := conversation.ToolCallConfirmation{
|
|
ToolCallID: "call_1",
|
|
Confirmation: string(conversation.ConfirmationAllow),
|
|
}
|
|
b, _ := json.Marshal(c)
|
|
if string(b) != `{"tool_call_id":"call_1","confirmation":"allow"}` {
|
|
t.Errorf("got %s", string(b))
|
|
}
|
|
// Inbound status constants.
|
|
if conversation.ConfirmationStatusPending != "pending" ||
|
|
conversation.ConfirmationStatusAllowed != "allowed" ||
|
|
conversation.ConfirmationStatusDenied != "denied" {
|
|
t.Errorf("unexpected confirmation status constants")
|
|
}
|
|
}
|