Files
2026-07-13 12:38:34 +08:00

253 lines
6.8 KiB
Bash

#!/bin/bash
# Check if provider name is provided
if [ -z "$1" ]; then
echo "Please provide a provider name"
echo "Usage: npm run create-provider <provider-name> [--agentic]"
exit 1
fi
TOOLSET_NAME=$1
TOOLSET_PATH="ts/packages/providers/$TOOLSET_NAME"
CAPITAL_TOOLSET_NAME="$(tr '[:lower:]' '[:upper:]' <<< ${TOOLSET_NAME:0:1})${TOOLSET_NAME:1}"
# Check if provider should be agentic
IS_AGENTIC=false
if [ "$2" = "--agentic" ]; then
IS_AGENTIC=true
fi
# Create directory structure
mkdir -p "$TOOLSET_PATH/src"
# Create package.json
cat > "$TOOLSET_PATH/package.json" << EOL
{
"name": "@composio/${TOOLSET_NAME}",
"version": "0.1.0",
"description": "${IS_AGENTIC:+Agentic }Provider for ${TOOLSET_NAME} in Composio SDK",
"main": "src/index.ts",
"type": "module",
"publishConfig": {
"access": "public",
"main": "dist/index.mjs",
"types": "dist/index.d.mts"
},
"exports": {
".": {
"types": "./dist/index.d.mts",
"default": "./dist/index.mjs"
}
},
"files": [
"README.md",
"dist"
],
"scripts": {
"build": "tsdown",
"test": "vitest run"
},
"keywords": ["composio", "provider", "${TOOLSET_NAME}"],
"author": "",
"license": "ISC",
"peerDependencies": {
"@composio/core": "^0.1.0"
},
"devDependencies": {
"@composio/core": "workspace:*",
"tsdown": "catalog:",
"typescript": "catalog:"
}
}
EOL
# Create tsconfig.json
cat > "$TOOLSET_PATH/tsconfig.json" << EOL
{
"extends": "../../../tsconfig.base.json",
"compilerOptions": {
"target": "es2022",
"module": "esnext",
"declaration": true,
"declarationDir": "./dist",
"outDir": "./dist",
"strict": true,
"esModuleInterop": true,
"moduleResolution": "bundler",
"skipLibCheck": true,
"resolveJsonModule": true
},
"include": ["src"]
}
EOL
# Create tsdown.config.ts
cat > "$TOOLSET_PATH/tsdown.config.ts" << EOL
import { defineConfig } from 'tsdown';
import { baseConfig } from '../../../../tsdown.config.base.ts';
export default defineConfig({
...baseConfig,
tsconfig: 'tsconfig.json',
});
EOL
# Create src/index.ts
cat > "$TOOLSET_PATH/src/index.ts" << EOL
/**
* ${CAPITAL_TOOLSET_NAME} Provider
*
* This provider provides a set of tools for interacting with ${CAPITAL_TOOLSET_NAME}.
*
* @packageDocumentation
* @module providers/${TOOLSET_NAME}
*/
import { ${IS_AGENTIC:+BaseAgenticProvider}${!IS_AGENTIC:+BaseNonAgenticProvider}, Tool${IS_AGENTIC:+, ExecuteToolFn} } from '@composio/core';
${IS_AGENTIC:+interface ${CAPITAL_TOOLSET_NAME}Tool {
// Add your tool type here
}}${!IS_AGENTIC:+interface ${CAPITAL_TOOLSET_NAME}Tool {
// Add your tool type here
}}
${IS_AGENTIC:+interface ${CAPITAL_TOOLSET_NAME}ToolCollection {
// Add your tool collection type here
}}${!IS_AGENTIC:+type ${CAPITAL_TOOLSET_NAME}ToolCollection = Array<${CAPITAL_TOOLSET_NAME}Tool>}
export class ${CAPITAL_TOOLSET_NAME}Provider extends ${IS_AGENTIC:+BaseAgenticProvider}${!IS_AGENTIC:+BaseNonAgenticProvider}<${CAPITAL_TOOLSET_NAME}ToolCollection, ${CAPITAL_TOOLSET_NAME}Tool> {
readonly name = '${TOOLSET_NAME}';
/**
* Wrap a tool in the ${TOOLSET_NAME} format.
* @param tool - The tool to wrap.
* @returns The wrapped tool.
*/
${IS_AGENTIC:+wrapTool(tool: Tool, executeTool: ExecuteToolFn): ${CAPITAL_TOOLSET_NAME}Tool {
return {
// Implement your tool wrapping logic here
} as ${CAPITAL_TOOLSET_NAME}Tool;
}}${!IS_AGENTIC:+wrapTool(tool: Tool): ${CAPITAL_TOOLSET_NAME}Tool {
return {
// Implement your tool wrapping logic here
} as ${CAPITAL_TOOLSET_NAME}Tool;
}}
/**
* Wrap a list of tools in the ${TOOLSET_NAME} format.
* @param tools - The tools to wrap.
* @returns The wrapped tools.
*/
${IS_AGENTIC:+wrapTools(tools: Tool[], executeTool: ExecuteToolFn): ${CAPITAL_TOOLSET_NAME}ToolCollection {
return tools.reduce((acc, tool) => {
// Implement your tool collection wrapping logic here
return acc;
}, {} as ${CAPITAL_TOOLSET_NAME}ToolCollection);
}}${!IS_AGENTIC:+wrapTools(tools: Tool[]): ${CAPITAL_TOOLSET_NAME}ToolCollection {
return tools.map(tool => this.wrapTool(tool));
}}
}
EOL
# Create README.md
cat > "$TOOLSET_PATH/README.md" << EOL
# @composio/${TOOLSET_NAME}
${IS_AGENTIC:+Agentic }Provider for ${CAPITAL_TOOLSET_NAME} in Composio SDK.
## Features
${IS_AGENTIC:+- **Full Modifier Support**: Support for both schema and execution modifiers
- **Tool Execution**: Execute tools with proper parameter handling
- **Type Safety**: Full TypeScript support with proper type definitions}${!IS_AGENTIC:+- **Schema Modifiers**: Support for transforming tool schemas
- **Type Safety**: Full TypeScript support with proper type definitions}
## Installation
\`\`\`bash
npm install @composio/${TOOLSET_NAME}
# or
yarn add @composio/${TOOLSET_NAME}
# or
pnpm add @composio/${TOOLSET_NAME}
\`\`\`
## Quick Start
\`\`\`typescript
import { Composio } from '@composio/core';
import { ${CAPITAL_TOOLSET_NAME}Provider } from '@composio/${TOOLSET_NAME}';
// Initialize Composio with ${CAPITAL_TOOLSET_NAME} provider
const composio = new Composio({
apiKey: 'your-composio-api-key',
provider: new ${CAPITAL_TOOLSET_NAME}Provider(),
});
// Get available tools
const tools = await composio.tools.get('user123', {
toolkits: ['gmail', 'googlecalendar'],
limit: 10,
});
\`\`\`
## Usage Examples
### Basic Example
\`\`\`typescript
import { Composio } from '@composio/core';
import { ${CAPITAL_TOOLSET_NAME}Provider } from '@composio/${TOOLSET_NAME}';
// Initialize Composio
const composio = new Composio({
apiKey: process.env.COMPOSIO_API_KEY,
provider: new ${CAPITAL_TOOLSET_NAME}Provider(),
});
// Get tools
const tools = await composio.tools.get('user123', {
toolkits: ['gmail'],
});
// Use tools with ${CAPITAL_TOOLSET_NAME}
// Add your usage example here
\`\`\`
## API Reference
### ${CAPITAL_TOOLSET_NAME}Provider Class
The \`${CAPITAL_TOOLSET_NAME}Provider\` class extends \`${IS_AGENTIC:+BaseAgenticProvider}${!IS_AGENTIC:+BaseNonAgenticProvider}\` and provides ${TOOLSET_NAME}-specific functionality.
#### Methods
##### \`wrapTool(tool: Tool${IS_AGENTIC:+, executeTool: ExecuteToolFn}): ${CAPITAL_TOOLSET_NAME}Tool\`
Wraps a tool in the ${TOOLSET_NAME} format.
\`\`\`typescript
const tool = provider.wrapTool(composioTool${IS_AGENTIC:+, executeTool});
\`\`\`
## Contributing
We welcome contributions! Please see our [Contributing Guide](../../CONTRIBUTING.md) for more details.
## License
ISC License
## Support
For support, please visit our [Documentation](https://docs.composio.dev) or join our [Discord Community](https://discord.gg/composio).
EOL
# Make the script executable
chmod +x "$TOOLSET_PATH"
# Install dependencies using pnpm
cd "$TOOLSET_PATH" && pnpm install
echo "✨ Created new ${IS_AGENTIC:+agentic }provider at $TOOLSET_PATH"
echo "✨ Dependencies installed successfully"