dapr/dapr · error

couldn't find conversation %s/%s

Error message

couldn't find conversation %s/%s

What it means

Thrown by the conversation component registry when Registry.Create cannot find a conversation factory for the requested name/version. Lookup is case-insensitive on 'name/version', with a fallback to the bare name when the version is an initial version ('', 'v0', 'v1'). The runtime therefore has no conversation component registered under that type+version.

Source

Thrown at pkg/components/conversation/registry.go:55

func NewRegistry() *Registry {
	return &Registry{
		Logger:        logger.NewLogger("dapr.conversation.registry"),
		conversations: make(map[string]func(logger.Logger) conversation.Conversation),
	}
}

// RegisterComponent adds a new conversation to the registry.
func (s *Registry) RegisterComponent(componentFactory func(logger.Logger) conversation.Conversation, names ...string) {
	for _, name := range names {
		s.conversations[createFullName(name)] = componentFactory
	}
}

func (s *Registry) Create(name, version, logName string) (conversation.Conversation, error) {
	if method, ok := s.getConversation(name, version, logName); ok {
		return method(), nil
	}
	return nil, fmt.Errorf("couldn't find conversation %s/%s", name, version)
}

func (s *Registry) getConversation(name, version, logName string) (func() conversation.Conversation, bool) {
	name = strings.ToLower(name)
	version = strings.ToLower(version)
	stateStoreFn, ok := s.conversations[name+"/"+version]

	if ok {
		return s.wrapFn(stateStoreFn, logName), true
	}
	if components.IsInitialVersion(version) {
		stateStoreFn, ok = s.conversations[name]
		if ok {
			return s.wrapFn(stateStoreFn, logName), true
		}
	}

	return nil, false

View on GitHub (pinned to 74ad417027)

Solutions

  1. Check spec.type/spec.version in the conversation component YAML against the components reference for your runtime version.
  2. List registered components with 'dapr components' / 'dapr components -k' and correct the type or version to a registered entry.
  3. Upgrade the Dapr runtime to the version whose conversation components the manifest targets.
  4. In custom builds, ensure the conversation contrib package is blank-imported so RegisterComponent ran.

Example fix

# before (conversation.yaml)
spec:
  type: conversation.ech0
  version: v1

# after — use a name listed by `dapr components` for your runtime
spec:
  type: conversation.echo
  version: v1
Defensive patterns

Strategy: validation

Validate before calling

// validate conversation component type+version before Create
func conversationSupported(supported map[string][]string, ctype, version string) bool {
	vers, ok := supported[strings.ToLower(ctype)] // names from `dapr components` for your runtime
	if !ok {
		return false
	}
	v := strings.ToLower(version)
	for _, reg := range vers {
		if reg == v || (reg == "v1" && (v == "" || v == "v0")) {
			return true
		}
	}
	return false
}

Try / catch

conv, err := registry.Create(name, version, logName)
if err != nil {
	// config bug, not transient — abort startup with actionable context
	return fmt.Errorf("conversation component %s/%s not registered: %w", name, version, err)
}

Prevention

When it happens

Trigger: Creating a conversation component whose type string does not match a registered one: typo in spec.type for a conversation.yaml, a version not present in this runtime's contrib set, or the conversation contrib package not imported into a custom build.

Common situations: Using the alpha Conversational AI building block with a manifest copied from a newer Dapr release than the running runtime; misspelled component name; self-hosted install where the component is not included; CI deploying manifests validated against a different runtime version.

Related errors


AI-assisted analysis of dapr/dapr@74ad417027 (2026-08-16). Data as JSON: /api/errors/63e89c84995cffa6. Report an issue: GitHub.