{"record":{"id":"63e89c84995cffa6","repo":"dapr/dapr","slug":"couldn-t-find-conversation-s-s","errorCode":null,"errorMessage":"couldn't find conversation %s/%s","messagePattern":"couldn't find conversation (.+?)/(.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"pkg/components/conversation/registry.go","lineNumber":55,"sourceCode":"func NewRegistry() *Registry {\n\treturn &Registry{\n\t\tLogger:        logger.NewLogger(\"dapr.conversation.registry\"),\n\t\tconversations: make(map[string]func(logger.Logger) conversation.Conversation),\n\t}\n}\n\n// RegisterComponent adds a new conversation to the registry.\nfunc (s *Registry) RegisterComponent(componentFactory func(logger.Logger) conversation.Conversation, names ...string) {\n\tfor _, name := range names {\n\t\ts.conversations[createFullName(name)] = componentFactory\n\t}\n}\n\nfunc (s *Registry) Create(name, version, logName string) (conversation.Conversation, error) {\n\tif method, ok := s.getConversation(name, version, logName); ok {\n\t\treturn method(), nil\n\t}\n\treturn nil, fmt.Errorf(\"couldn't find conversation %s/%s\", name, version)\n}\n\nfunc (s *Registry) getConversation(name, version, logName string) (func() conversation.Conversation, bool) {\n\tname = strings.ToLower(name)\n\tversion = strings.ToLower(version)\n\tstateStoreFn, ok := s.conversations[name+\"/\"+version]\n\n\tif ok {\n\t\treturn s.wrapFn(stateStoreFn, logName), true\n\t}\n\tif components.IsInitialVersion(version) {\n\t\tstateStoreFn, ok = s.conversations[name]\n\t\tif ok {\n\t\t\treturn s.wrapFn(stateStoreFn, logName), true\n\t\t}\n\t}\n\n\treturn nil, false","sourceCodeStart":37,"sourceCodeEnd":73,"githubUrl":"https://github.com/dapr/dapr/blob/74ad41702745709bb15fe2114ff693b8c59bc3cc/pkg/components/conversation/registry.go#L37-L73","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","solutions":["Check spec.type/spec.version in the conversation component YAML against the components reference for your runtime version.","List registered components with 'dapr components' / 'dapr components -k' and correct the type or version to a registered entry.","Upgrade the Dapr runtime to the version whose conversation components the manifest targets.","In custom builds, ensure the conversation contrib package is blank-imported so RegisterComponent ran."],"exampleFix":"# before (conversation.yaml)\nspec:\n  type: conversation.ech0\n  version: v1\n\n# after — use a name listed by `dapr components` for your runtime\nspec:\n  type: conversation.echo\n  version: v1","handlingStrategy":"validation","validationCode":"// validate conversation component type+version before Create\nfunc conversationSupported(supported map[string][]string, ctype, version string) bool {\n\tvers, ok := supported[strings.ToLower(ctype)] // names from `dapr components` for your runtime\n\tif !ok {\n\t\treturn false\n\t}\n\tv := strings.ToLower(version)\n\tfor _, reg := range vers {\n\t\tif reg == v || (reg == \"v1\" && (v == \"\" || v == \"v0\")) {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}","typeGuard":null,"tryCatchPattern":"conv, err := registry.Create(name, version, logName)\nif err != nil {\n\t// config bug, not transient — abort startup with actionable context\n\treturn fmt.Errorf(\"conversation component %s/%s not registered: %w\", name, version, err)\n}","preventionTips":["Conversation is an alpha API — pin manifests and runtime to the same release line and re-verify after upgrades","Check `dapr components` output for conversation entries before deploying a manifest","Add a deploy-time dry-run that resolves every component spec against the registry"],"tags":["go","dapr","conversation","component-registry","startup","alpha"],"backgroundTag":null,"analyzedSha":"74ad41702745709bb15fe2114ff693b8c59bc3cc","analyzedAt":"2026-08-16T04:22:26.543Z","schemaVersion":2},"datasetVersion":"2026-08-16T08:17:34.114Z"}