{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "dashscrop-ai-provider",
  "type": "registry:lib",
  "title": "Dashscrop ai provider for ai sdk",
  "description": "Set up dashscrop ai provider for ai sdk. Add model provider to lib. Build with ai-sdk/openai-compatible",
  "dependencies": [
    "@ai-sdk/openai-compatible",
    "@ai-sdk/provider",
    "@ai-sdk/provider-utils"
  ],
  "files": [
    {
      "path": "src/lib/ai/providers/dashscope.ts",
      "content": "/**\n * 阿里云百炼 AI 提供商 for AI SDK\n *\n * @author Sawana Huang\n * @date 2025-04-25\n *\n * @description 基于 OpenAI 兼容的 API 实现\n *\n * @see https://bailian.console.aliyun.com/?tab=api#/api/?type=model&url=https%3A%2F%2Fhelp.aliyun.com%2Fdocument_detail%2F2833609.html&renderType=iframe\n * @see https://sdk.vercel.ai/providers/openai-compatible-providers/custom-providers\n *\n * IMPORTANT:\n * - The model ids should be defined manually\n * - Model id types: chat, completion, embedding, and image\n * - Add \"DASHSCOPE_API_KEY\" in your .env file\n */\n\n/**\n * Set up the base URL and environment variable name\n */\nexport const DASHSCOPE_BASE_URL =\n  \"https://dashscope.aliyuncs.com/compatible-mode/v1\";\nexport const DASHSCOPE_ENVIRONMENT_VARIABLE_NAME = \"DASHSCOPE_API_KEY\";\n\n/**\n * 1. Define chat model IDs and settings\n * example-chat-settings.ts\n *\n */\nimport { type OpenAICompatibleChatSettings } from \"@ai-sdk/openai-compatible\";\n\nexport type DashscopeChatModelId =\n  | \"qwen-plus\"\n  | \"qwen-turbo\"\n  | \"deepseek-v3\"\n  | \"deepseek-r1\"\n  | (string & {});\n\nexport interface DashscopeChatSettings extends OpenAICompatibleChatSettings {\n  // Specific settings\n  dashscope?: string;\n}\n\nexport type DashscopeCompletionModelId = string & {};\n\nexport interface DashscopeCompletionSettings\n  extends OpenAICompatibleChatSettings {\n  // Specific settings\n  dashscope?: string;\n}\n\nexport type DashscopeEmbeddingModelId = \"text-embedding-v2\" | (string & {});\n\nexport interface DashscopeEmbeddingSettings\n  extends OpenAICompatibleChatSettings {\n  // Specific settings\n  dashscope?: string;\n}\n\nexport type DashscopeImageModelId = string & {};\n\nexport interface DashscopeImageSettings extends OpenAICompatibleChatSettings {\n  // Specific settings\n  dashscope?: string;\n}\n\n/**\n * 2. Main provider implementation\n * example-provider.ts\n */\nimport type {\n  LanguageModelV1,\n  EmbeddingModelV1,\n  ImageModelV1,\n} from \"@ai-sdk/provider\";\nimport {\n  OpenAICompatibleChatLanguageModel,\n  OpenAICompatibleCompletionLanguageModel,\n  OpenAICompatibleEmbeddingModel,\n  OpenAICompatibleImageModel,\n} from \"@ai-sdk/openai-compatible\";\nimport {\n  type FetchFunction,\n  loadApiKey,\n  withoutTrailingSlash,\n} from \"@ai-sdk/provider-utils\";\n// Import your model id and settings here.\n\ninterface DashscopeProviderSettings {\n  /**\nExample API key.\n*/\n  apiKey?: string;\n  /**\nBase URL for the API calls.\n*/\n  baseURL?: string;\n  /**\nCustom headers to include in the requests.\n*/\n  headers?: Record<string, string>;\n  /**\nOptional custom url query parameters to include in request urls.\n*/\n  queryParams?: Record<string, string>;\n  /**\nCustom fetch implementation. You can use it as a middleware to intercept requests,\nor to provide a custom fetch implementation for e.g. testing.\n*/\n  fetch?: FetchFunction;\n}\n\ninterface DashscopeProvider {\n  /**\nCreates a model for text generation.\n*/\n  (\n    modelId: DashscopeChatModelId,\n    settings?: DashscopeChatSettings,\n  ): LanguageModelV1;\n\n  /**\nCreates a chat model for text generation.\n*/\n  chatModel(\n    modelId: DashscopeChatModelId,\n    settings?: DashscopeChatSettings,\n  ): LanguageModelV1;\n\n  /**\nCreates a completion model for text generation.\n*/\n  completionModel(\n    modelId: DashscopeCompletionModelId,\n    settings?: DashscopeCompletionSettings,\n  ): LanguageModelV1;\n\n  /**\nCreates a text embedding model for text generation.\n*/\n  textEmbeddingModel(\n    modelId: DashscopeEmbeddingModelId,\n    settings?: DashscopeEmbeddingSettings,\n  ): EmbeddingModelV1<string>;\n\n  /**\nCreates an image model for image generation.\n*/\n  imageModel(\n    modelId: DashscopeImageModelId,\n    settings?: DashscopeImageSettings,\n  ): ImageModelV1;\n}\n\nfunction createDashscope(\n  options: DashscopeProviderSettings = {},\n): DashscopeProvider {\n  const baseURL = withoutTrailingSlash(options.baseURL ?? DASHSCOPE_BASE_URL);\n  const getHeaders = () => ({\n    Authorization: `Bearer ${loadApiKey({\n      apiKey: options.apiKey,\n      environmentVariableName: DASHSCOPE_ENVIRONMENT_VARIABLE_NAME,\n      description: \"Dashscope API key\",\n    })}`,\n    ...options.headers,\n  });\n\n  interface CommonModelConfig {\n    provider: string;\n    url: ({ path }: { path: string }) => string;\n    headers: () => Record<string, string>;\n    fetch?: FetchFunction;\n  }\n\n  const getCommonModelConfig = (modelType: string): CommonModelConfig => ({\n    provider: `example.${modelType}`,\n    url: ({ path }) => {\n      const url = new URL(`${baseURL}${path}`);\n      if (options.queryParams) {\n        url.search = new URLSearchParams(options.queryParams).toString();\n      }\n      return url.toString();\n    },\n    headers: getHeaders,\n    fetch: options.fetch,\n  });\n\n  const createChatModel = (\n    modelId: DashscopeChatModelId,\n    settings: DashscopeChatSettings = {},\n  ) => {\n    return new OpenAICompatibleChatLanguageModel(modelId, settings, {\n      ...getCommonModelConfig(\"chat\"),\n      defaultObjectGenerationMode: \"tool\",\n    });\n  };\n\n  const createCompletionModel = (\n    modelId: DashscopeCompletionModelId,\n    settings: DashscopeCompletionSettings = {},\n  ) =>\n    new OpenAICompatibleCompletionLanguageModel(\n      modelId,\n      settings,\n      getCommonModelConfig(\"completion\"),\n    );\n\n  const createTextEmbeddingModel = (\n    modelId: DashscopeEmbeddingModelId,\n    settings: DashscopeEmbeddingSettings = {},\n  ) =>\n    new OpenAICompatibleEmbeddingModel(\n      modelId,\n      settings,\n      getCommonModelConfig(\"embedding\"),\n    );\n\n  const createImageModel = (\n    modelId: DashscopeImageModelId,\n    settings: DashscopeImageSettings = {},\n  ) =>\n    new OpenAICompatibleImageModel(\n      modelId,\n      settings,\n      getCommonModelConfig(\"image\"),\n    );\n\n  const provider = (\n    modelId: DashscopeChatModelId,\n    settings?: DashscopeChatSettings,\n  ) => createChatModel(modelId, settings);\n\n  provider.completionModel = createCompletionModel;\n  provider.chatModel = createChatModel;\n  provider.textEmbeddingModel = createTextEmbeddingModel;\n  provider.imageModel = createImageModel;\n\n  return provider;\n}\n\n// Export default instance\nconst dashscope = createDashscope();\n\n/**\n * 3. Public exports\n * index.ts\n */\nexport type { DashscopeProvider, DashscopeProviderSettings };\nexport { createDashscope, dashscope };\n",
      "type": "registry:lib",
      "target": "./lib/ai/providers/dashscope.ts"
    }
  ]
}