wavetermdev/waveterm · error

APIType must be ' ', got

Error message

APIType must be '%s', got '%s'

What it means

ConvertAIChatToUIChat only converts chats whose native format is the Anthropic Messages API. The guard verifies aiChat.APIType equals uctypes.APIType_AnthropicMessages; passing a chat produced by another provider (OpenAI, Google, etc.) is rejected with the expected and actual API types.

Solutions

  1. Ensure the chat was produced by the Anthropic converter and APIType is APIType_AnthropicMessages
  2. Check APIType before calling and route to the matching provider's ConvertAIChatToUIChat
  3. Fix the code path that sets APIType when constructing the AIChat

Example fix

// before
uiChat, err := anthropic.ConvertAIChatToUIChat(aiChat) // APIType=openai
// after
if aiChat.APIType == uctypes.APIType_AnthropicMessages {
    uiChat, err = anthropic.ConvertAIChatToUIChat(aiChat)
} else {
    uiChat, err = openai.ConvertAIChatToUIChat(aiChat)
}
Defensive patterns

Strategy: type-guard

Validate before calling

if aiChat.APIType != uctypes.APIType_AnthropicMessages {
    return fmt.Errorf("wrong converter for APIType %s", aiChat.APIType)
}

Type guard

func isAnthropicChat(c uctypes.AIChat) bool {
    return c.APIType == uctypes.APIType_AnthropicMessages
}

Try / catch

if !isAnthropicChat(aiChat) {
    return nil, fmt.Errorf("route %s chats to their provider converter", aiChat.APIType)
}
uiChat, err := anthropic.ConvertAIChatToUIChat(aiChat)

Prevention

When it happens

Trigger: Calling ConvertAIChatToUIChat with an AIChat whose APIType field is anything other than APIType_AnthropicMessages — e.g. a chat built by an OpenAI converter.

Common situations: Mixing provider chat objects after refactoring, storing chats in a shared cache without the APIType, or routing the wrong chat to the Anthropic UI converter.

Related errors


AI-assisted analysis of wavetermdev/waveterm@a4447c1563 (2026-09-01). Data as JSON: /api/errors/15d9645b77db6d7c. Report an issue: GitHub.

Appendix: source

Thrown at pkg/aiusechat/anthropic/anthropic-convertmessage.go:817

		contentBlocks = append(contentBlocks, anthropicMessageContentBlock{
			Type:      "tool_result",
			ToolUseID: result.ToolUseID,
			Content:   content,
			IsError:   isError,
		})
	}

	return &anthropicChatMessage{
		MessageId: uuid.New().String(),
		Role:      "user",
		Content:   contentBlocks,
	}, nil
}

// ConvertAIChatToUIChat converts an AIChat to a UIChat for Anthropic
func ConvertAIChatToUIChat(aiChat uctypes.AIChat) (*uctypes.UIChat, error) {
	if aiChat.APIType != uctypes.APIType_AnthropicMessages {
		return nil, fmt.Errorf("APIType must be '%s', got '%s'", uctypes.APIType_AnthropicMessages, aiChat.APIType)
	}

	uiMessages := make([]uctypes.UIMessage, 0, len(aiChat.NativeMessages))

	for i, nativeMsg := range aiChat.NativeMessages {
		anthropicMsg, ok := nativeMsg.(*anthropicChatMessage)
		if !ok {
			return nil, fmt.Errorf("message %d: expected *anthropicChatMessage, got %T", i, nativeMsg)
		}

		uiMsg := anthropicMsg.ConvertToUIMessage()
		if uiMsg != nil {
			uiMessages = append(uiMessages, *uiMsg)
		}
	}

	return &uctypes.UIChat{
		ChatId:     aiChat.ChatId,

View on GitHub (pinned to a4447c1563)