253 lines
6.8 KiB
Bash
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"
|