{"record":{"id":"9cd6bc2d6b37ab79","repo":"ComposioHQ/composio","slug":"provider-not-passed-into-tools-instance","errorCode":null,"errorMessage":"Provider not passed into Tools instance","messagePattern":"Provider not passed into Tools instance","errorType":"exception","errorClass":"ComposioProviderNotDefinedError","httpStatus":null,"severity":"error","filePath":"ts/packages/core/src/models/Tools.ts","lineNumber":131,"sourceCode":"  };\n  /**\n   * Tracks tool slugs we've already warned about to avoid spamming the log when\n   * the same file-input tool is executed repeatedly while auto-upload is off.\n   * Scoped per-instance so a fresh `Composio` starts with a clean slate.\n   */\n  private readonly warnedAutoUploadDisabledForTool = new Set<string>();\n\n  /**\n   * Lazily-built sibling client with retries disabled; see `clientWithoutRetries`.\n   */\n  private clientWithoutRetriesCache?: ComposioClient;\n\n  constructor(client: ComposioClient, config?: ComposioConfig<TProvider>) {\n    if (!client) {\n      throw new Error('ComposioClient is required');\n    }\n    if (!config?.provider) {\n      throw new ComposioProviderNotDefinedError('Provider not passed into Tools instance');\n    }\n\n    this.client = client;\n    this.provider = config.provider;\n    this.autoUploadDownloadFiles = config?.dangerouslyAllowAutoUploadDownloadFiles === true;\n    this.toolkitVersions = config?.toolkitVersions ?? CONFIG_DEFAULTS.toolkitVersions;\n    this.fileUploadPathOptions = {\n      sensitiveFileUploadProtection: config?.sensitiveFileUploadProtection,\n      fileUploadPathDenySegments: config?.fileUploadPathDenySegments,\n      // The allowlist is only enforced during automatic upload (see\n      // FileToolModifier). Manual `composio.files.upload()` calls don't see it.\n      fileUploadAllowlist: this.autoUploadDownloadFiles\n        ? resolveEffectiveUploadAllowlist(config?.fileUploadDirs)\n        : undefined,\n      fileDownloadDir: config?.fileDownloadDir,\n    };\n    // Bind the execute method to ensure correct 'this' context\n    this.execute = this.execute.bind(this);","sourceCodeStart":113,"sourceCodeEnd":149,"githubUrl":"https://github.com/ComposioHQ/composio/blob/64b1b85502b1beeb2379e6c9e8bf1104504fa637/ts/packages/core/src/models/Tools.ts#L113-L149","documentation":"ComposioProviderNotDefinedError thrown by the Tools constructor when config.provider is absent. Tools needs an LLM provider to format tool schemas correctly, so omitting it is treated as a programming error.","triggerScenarios":"new Tools(client) or new Tools(client, {}) — no provider in config; or creating Composio without a provider and then accessing a Tools path that requires it.","commonSituations":"Initializing Composio without provider (valid for some flows) but then calling provider-dependent tool APIs; typos in the config object; version upgrades where provider moved into the config object.","solutions":["Pass provider when creating the client: new Composio({ apiKey, provider: 'openai' }).","Or set it per-call if the API supports it; otherwise construct Tools with { provider: 'your-provider' }.","Check migration notes if upgrading from an older @composio/core where provider was optional or positional."],"exampleFix":"// before\nconst tools = new Tools(client);\n\n// after\nconst tools = new Tools(client, { provider: 'openai' });\n// or typically:\nconst composio = new Composio({ apiKey: key, provider: 'openai' });\nconst tools = composio.tools;","handlingStrategy":"validation","validationCode":"if (!config?.provider) throw new Error('provider is required');\nnew Tools(client, { provider: config.provider });","typeGuard":"const hasProvider = (c?: ComposioConfig<unknown>): boolean => !!c?.provider;","tryCatchPattern":null,"preventionTips":["Always pass provider when constructing Composio for tool-use flows.","Let TypeScript types guide config; avoid partial objects."],"tags":["provider","constructor","misuse","typescript"],"backgroundTag":"missing-required-argument","analyzedSha":"64b1b85502b1beeb2379e6c9e8bf1104504fa637","analyzedAt":"2026-08-28T15:39:33.623Z","schemaVersion":2},"datasetVersion":"2026-08-28T16:17:29.566Z"}