{"record":{"id":"93d6da5dd00036e4","repo":"continuedev/continue","slug":"invalid-assistant-identifier-options-assistant","errorCode":null,"errorMessage":"Invalid assistant identifier: ${options.assistant}. Expected format: owner-slug/package-slug","messagePattern":"Invalid assistant identifier: (.+?)\\. Expected format: owner-slug/package-slug","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/continue-sdk/typescript/src/Continue.ts","lineNumber":114,"sourceCode":"  ): Promise<ContinueClientBase | ContinueClient> {\n    const baseURL = options.baseURL || \"https://api.continue.dev/\";\n\n    const continueClient = new DefaultApi(\n      new Configuration({\n        basePath: baseURL,\n        accessToken: options.apiKey\n          ? async () => options.apiKey as string\n          : undefined,\n      }),\n    );\n\n    if (!options.assistant) {\n      return { api: continueClient };\n    }\n\n    const { ownerSlug, packageSlug } = decodePackageSlug(options.assistant);\n    if (!ownerSlug || !packageSlug) {\n      throw new Error(\n        `Invalid assistant identifier: ${options.assistant}. Expected format: owner-slug/package-slug`,\n      );\n    }\n\n    const assistants = await continueClient.listAssistants({\n      organizationId: options.organizationId,\n      alwaysUseProxy: \"true\",\n    });\n\n    const assistantRes = assistants.find(\n      (a) => a.ownerSlug === ownerSlug && a.packageSlug === packageSlug,\n    );\n\n    if (!assistantRes) {\n      throw new Error(`Assistant ${options.assistant} not found`);\n    }\n\n    const assistant = new Assistant(assistantRes.configResult.config);","sourceCodeStart":96,"sourceCodeEnd":132,"githubUrl":"https://github.com/continuedev/continue/blob/5522c6f44ca0ac3528b37244818fbfa39b5af470/packages/continue-sdk/typescript/src/Continue.ts#L96-L132","documentation":"Continue.from throws when decodePackageSlug could not split options.assistant into a non-empty ownerSlug and packageSlug — i.e. the identifier is not in 'owner-slug/package-slug' form.","triggerScenarios":"Calling Continue.from({ assistant: 'gpt4' }) or any string without a '/', or with empty segments like '/foo' or 'foo/'.","commonSituations":"Passing a bare assistant name, a hub URL instead of the slug, or whitespace/typo breaking the slash format.","solutions":["Use the exact 'owner-slug/package-slug' identifier from the hub listing","Verify with listAssistants that the identifier exists","Trim whitespace and check for the single '/' separator before calling","Validate the slug format with a regex first"],"exampleFix":"// before\nconst { api } = await Continue.from({ assistant: 'my-assistant' });\n\n// after\nconst { api } = await Continue.from({ assistant: 'continue/recommended' });","handlingStrategy":"validation","validationCode":"const m = /^([\\w-]+)\\/([\\w-]+)$/.exec(options.assistant ?? ''); if (!m) throw new Error('bad slug');","typeGuard":"function isAssistantSlug(s: string): s is `${string}/${string}` { return /^[^/\\s]+\\/[^/\\s]+$/.test(s); }","tryCatchPattern":"try { const { api } = await Continue.from(opts); } catch (e) { if (/Expected format/.test(e.message)) { /* prompt user for correct slug */ } else throw e; }","preventionTips":["Copy the identifier from listAssistants output","Validate slug shape before calling Continue.from","Avoid pasting hub URLs; use just owner/package"],"tags":["continue-sdk","assistant","identifier","validation"],"backgroundTag":"invalid-identifier-format","analyzedSha":"5522c6f44ca0ac3528b37244818fbfa39b5af470","analyzedAt":"2026-08-27T11:28:54.683Z","schemaVersion":2},"datasetVersion":"2026-08-27T13:17:12.746Z"}