[
  {
    "path": ".github/ISSUE_TEMPLATE/反馈失效提供方.md",
    "content": "---\nname: 反馈失效提供方\nabout: 反馈站点失效提供方\ntitle: 反馈站点失效提供方\nlabels: ''\nassignees: ''\n\n---\n\n---\nname: 反馈失效提供方\nabout: 反馈失效提供方模板\ntitle: 反馈失效提供方\nlabels: ''\nassignees: TechnologyStar\n\n---\n\n### 网址\n\n### 原因\n<!-- 将 [ ] 改为 [x] 即为选中 -->\n\n- [ ] 🚫网站无法正常打开\n- [ ] ❌api功能异常\n- [ ] 🛑api地址遭到中国国家防火墙拦截\n- [ ] 🤔其他：\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/添加api提供方.md",
    "content": "---\nname: 添加api提供方\nabout: 添加api提供方\ntitle: 添加api提供方\nlabels: ''\nassignees: TechnologyStar\n\n---\n\n---\nname: 添加api提供方\nabout: 添加api提供方模板\ntitle: 添加api提供方\nlabels: ''\nassignees: TechnologyStar\n\n---\n\n### 网址\n\n\n### 属性\n\n<!-- 将 [ ] 改为 [x] 即为选中 -->\n\n#### 基本属性（单选）\n- [ ] 🆓完全免费\n- [ ] 🔓有免费额度（注册赠送额度>0.15美元）\n- [ ] 💰只能充值领额度\n#### 扩展属性（多选）\n- [ ] 💪支持 Claude最新模型\n- [ ] ✌支持openai最新模型\n- [ ] 🎉支持其他模型或其他功能\n- [ ] 🌎需要国际网络\n- [ ] 🎁充值有较大优惠（<50%）\n- [ ] 🚀支持高并发\n- [ ] 😆签到领余额\n- [ ] 🚩网站通过中国备案\n\n### 附加信息\n"
  },
  {
    "path": ".github/workflows/clean.yml",
    "content": "name: Repository Maintenance\non:\n  workflow_dispatch:\n\npermissions:\n  contents: write\n\njobs:\n  repo-optimization:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout code\n        uses: actions/checkout@v4\n        with:\n          fetch-depth: 0\n\n      - name: Create archive branch\n        run: |\n          git push origin HEAD:archive-$(date +%Y%m%d)\n\n      - name: Repository optimization\n        run: |\n          git checkout --orphan temp-main\n          git add -A\n          git config --global user.name \"Repo Maintainer\"\n          git config --global user.email \"maintainer@noreply.github.com\"\n          git commit -m \"Repository optimization $(date +'%Y-%m-%d')\"\n          \n          echo \"File verification:\"\n          git ls-files | head -n 10\n          echo \"[...truncated...]\"\n          \n          git branch -D main\n          git branch -m main\n\n      - name: Apply changes\n        run: |\n          git remote set-url origin https://x-access-token:${{ secrets.GITHUB_TOKEN }}@github.com/${{ github.repository }}.git\n          git push -f origin main\n\n      - name: Verify completion\n        run: |\n          echo \"Process completed successfully\"\n          echo \"Commit count: $(git rev-list --count HEAD)\"\n          echo \"File count: $(git ls-files | wc -l)\"\n"
  },
  {
    "path": ".gitignore",
    "content": "# Common Node/Vite artifacts\nnode_modules/\ndist/\nbuild/\n.tmp/\n.temp/\n\n# Logs\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\npnpm-debug.log*\n\n# Environment files\n.env\n.env.*\n\n# Editor directories and files\n.vscode/\n.idea/\n*.swp\n.DS_Store\nThumbs.db\n\n# Coverage / test output\ncoverage/\n.junit/\n\n# Misc\n*.local\n"
  },
  {
    "path": "Automatically add.html",
    "content": "<!DOCTYPE html>\n<html lang=\"zh-CN\">\n<head>\n  <meta charset=\"UTF-8\" />\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n  <title>AI 聊天工具推荐表生成器</title>\n  <style>\n    /* 全局样式 */\n    * {\n      box-sizing: border-box;\n      margin: 0;\n      padding: 0;\n    }\n    body {\n      font-family: \"Segoe UI\", Tahoma, Geneva, Verdana, sans-serif;\n      background-color: #f0f2f5;\n      padding: 20px;\n      color: #333;\n    }\n    h2, h3 {\n      margin-bottom: 12px;\n      color: #444;\n    }\n    /* 卡片容器样式 */\n    .card {\n      background-color: #fff;\n      border-radius: 8px;\n      box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n      margin-bottom: 20px;\n      padding: 20px;\n    }\n    .legend p {\n      margin-bottom: 8px;\n      line-height: 1.6;\n    }\n    /* 输入区域样式 */\n    .input-row {\n      display: flex;\n      flex-wrap: wrap;\n      gap: 12px;\n      align-items: center;\n      margin-top: 10px;\n    }\n    .input-row input[type=\"text\"],\n    .input-row input[type=\"url\"],\n    .input-row input[type=\"password\"],\n    .input-row textarea {\n      border: 1px solid #ccc;\n      border-radius: 4px;\n      padding: 8px;\n      font-size: 14px;\n      background-color: #fafafa;\n      transition: border-color 0.2s;\n    }\n    .input-row input[type=\"text\"] {\n      width: 160px;\n    }\n    .input-row input[type=\"url\"] {\n      width: 200px;\n    }\n    .input-row input[type=\"password\"] {\n      width: 200px;\n    }\n    .input-row textarea {\n      width: 280px;\n      height: 28px;\n      resize: vertical;\n    }\n    .input-row input:focus,\n    .input-row textarea:focus {\n      border-color: #409eff;\n      outline: none;\n      background-color: #fff;\n    }\n    /* 按钮样式 */\n    button {\n      border: none;\n      border-radius: 4px;\n      background-color: #409eff;\n      color: #fff;\n      padding: 8px 14px;\n      font-size: 14px;\n      cursor: pointer;\n      transition: background-color 0.2s;\n    }\n    button:hover {\n      background-color: #66b1ff;\n    }\n    button:active {\n      background-color: #3a8ee6;\n    }\n    /* 复选框标签样式 */\n    #tagCheckboxes {\n      display: flex;\n      flex-wrap: wrap;\n      gap: 8px;\n      max-width: 400px;\n      margin-top: 4px;\n    }\n    #tagCheckboxes label {\n      display: flex;\n      align-items: center;\n      background-color: #eef2f7;\n      border-radius: 4px;\n      padding: 4px 8px;\n      font-size: 13px;\n      cursor: pointer;\n      transition: background-color 0.2s;\n    }\n    #tagCheckboxes input[type=\"checkbox\"] {\n      margin-right: 4px;\n      accent-color: #409eff;\n    }\n    #tagCheckboxes label:hover {\n      background-color: #dde6f7;\n    }\n    /* 表格样式 */\n    table {\n      width: 100%;\n      border-collapse: collapse;\n      background-color: #fff;\n      border-radius: 8px;\n      overflow: hidden;\n      box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n    }\n    th, td {\n      border-bottom: 1px solid #ececec;\n      padding: 12px;\n      text-align: left;\n      vertical-align: top;\n      font-size: 14px;\n      color: #555;\n    }\n    th {\n      background-color: #f7f9fc;\n      font-weight: 600;\n    }\n    tbody tr:hover {\n      background-color: #f5f7fa;\n    }\n    .row-buttons button {\n      margin-right: 6px;\n      padding: 4px 8px;\n      font-size: 13px;\n      background-color: #67c23a;\n    }\n    .row-buttons button:hover {\n      background-color: #85ce61;\n    }\n    .row-buttons button:active {\n      background-color: #5daf31;\n    }\n    /* 文本区域样式 */\n    #generatedHtml {\n      width: 100%;\n      height: 300px;\n      font-family: Consolas, \"Courier New\", monospace;\n      border: 1px solid #ccc;\n      border-radius: 4px;\n      padding: 10px;\n      resize: vertical;\n      background-color: #fafafa;\n      margin-top: 10px;\n    }\n    /* 辅助按钮样式 */\n    #copyHtmlBtn {\n      margin-left: 10px;\n      background-color: #e6a23c;\n    }\n    #copyHtmlBtn:hover {\n      background-color: #ebb563;\n    }\n    #copyHtmlBtn:active {\n      background-color: #c5802f;\n    }\n    /* 加载状态 */\n    .loading {\n      opacity: 0.6;\n      pointer-events: none;\n    }\n    /* 设置面板 */\n    #settingsPanel {\n      display: none;\n      position: fixed;\n      top: 50%;\n      left: 50%;\n      transform: translate(-50%, -50%);\n      background-color: #fff;\n      padding: 20px;\n      border-radius: 8px;\n      box-shadow: 0 2px 8px rgba(0,0,0,0.2);\n      width: 400px;\n      z-index: 1000;\n    }\n    #settingsPanel h3 {\n      margin-bottom: 10px;\n    }\n    #settingsOverlay {\n      display: none;\n      position: fixed;\n      top: 0;\n      left: 0;\n      width: 100%;\n      height: 100%;\n      background: rgba(0,0,0,0.5);\n      z-index: 999;\n    }\n    #settingsPanel input {\n      width: 100%;\n      margin-bottom: 12px;\n    }\n    #settingsPanel button {\n      width: 48%;\n      margin-right: 4%;\n    }\n    #settingsPanel button:last-child {\n      margin-right: 0;\n    }\n  </style>\n</head>\n<body>\n  <h2>AI 聊天工具推荐表生成器</h2>\n  <div class=\"card legend\">\n    <p><strong>赞助方平台将加入邀请码，感谢您的支持</strong></p>\n    <p><strong>标签含义：</strong><br>\n    &emsp;- 🆓 完全免费<br>\n    &emsp;- 🔓 有免费额度<br>\n    &emsp;- 💰 需要充值<br>\n    &emsp;- 💪 支持 Claude 最新模型<br>\n    &emsp;- ✌ 支持 OpenAI 最新模型<br>\n    &emsp;- 🎉 支持其他模型或其他功能<br>\n    &emsp;- 🌎 需要国际网络<br>\n    &emsp;- 🎁 充值有较大优惠（<50%）<br>\n    &emsp;- 🚀 支持高并发<br>\n    &emsp;- 😆 签到领余额<br>\n    &emsp;- 🚩 网站通过中国备案<br>\n    &emsp;- ✔ 已验证安全性/真实性</p>\n  </div>\n\n  <!-- 导入原有供应商 HTML -->\n  <div class=\"card import-section\">\n    <h3>📥 导入原有供应商 HTML</h3>\n    <p>请在下方粘贴已有的 <code>&lt;table&gt;</code> 部分（从 <code>&lt;table&gt;</code> 到 <code>&lt;/table&gt;</code>），然后点击“导入供应商”按钮。</p>\n    <textarea id=\"importHtmlTextarea\" placeholder=\"在此粘贴原有的 <table> ... </table> HTML 代码\"></textarea>\n    <button id=\"importBtn\" style=\"margin-top: 10px;\">导入供应商</button>\n  </div>\n\n  <!-- 新增或编辑供应商项 -->\n  <div class=\"card input-section\">\n    <h3>➕ 添加或编辑供应商</h3>\n    <div class=\"input-row\">\n      <input type=\"text\" id=\"siteName\" placeholder=\"网站名称\" disabled />\n      <input type=\"url\" id=\"siteLink\" placeholder=\"链接 (包含 https://)\" />\n      <input type=\"password\" id=\"apiKeyInput\" placeholder=\"OpenAI API Key (sk-...)\" />\n      <button id=\"autoTagBtn\">AI 自动标注</button>\n      <button id=\"openSettingsBtn\">设置</button>\n    </div>\n    <div class=\"input-row\" style=\"margin-top: 8px;\">\n      <div id=\"tagCheckboxes\">\n        <label><input type=\"checkbox\" value=\"🆓\">🆓</label>\n        <label><input type=\"checkbox\" value=\"🔓\">🔓</label>\n        <label><input type=\"checkbox\" value=\"💰\">💰</label>\n        <label><input type=\"checkbox\" value=\"💪\">💪</label>\n        <label><input type=\"checkbox\" value=\"✌\">✌</label>\n        <label><input type=\"checkbox\" value=\"🎉\">🎉</label>\n        <label><input type=\"checkbox\" value=\"🌎\">🌎</label>\n        <label><input type=\"checkbox\" value=\"🎁\">🎁</label>\n        <label><input type=\"checkbox\" value=\"🚀\">🚀</label>\n        <label><input type=\"checkbox\" value=\"😆\">😆</label>\n        <label><input type=\"checkbox\" value=\"🚩\">🚩</label>\n        <label><input type=\"checkbox\" value=\"✔\">✔</label>\n      </div>\n      <textarea id=\"siteRemark\" placeholder=\"备注\"></textarea>\n      <button id=\"addRowBtn\" disabled>添加提供方</button>\n    </div>\n  </div>\n\n  <!-- 编辑表格区 -->\n  <div class=\"card\">\n    <table id=\"providerTable\">\n      <thead>\n        <tr>\n          <th style=\"width: 60px;\">序号</th>\n          <th>网站</th>\n          <th>链接</th>\n          <th>标签</th>\n          <th>备注</th>\n          <th style=\"width: 120px;\">操作</th>\n        </tr>\n      </thead>\n      <tbody>\n        <!-- 动态插入行 -->\n      </tbody>\n    </table>\n  </div>\n\n  <!-- 生成与复制 HTML -->\n  <button id=\"generateHtmlBtn\">一键生成 HTML</button>\n  <button id=\"copyHtmlBtn\">复制 HTML 到剪贴板</button>\n  <textarea id=\"generatedHtml\" readonly placeholder=\"生成的 HTML 会显示在这里，可一键复制\"></textarea>\n\n  <!-- 设置面板 -->\n  <div id=\"settingsOverlay\"></div>\n  <div id=\"settingsPanel\">\n    <h3>⚙️ API 设置</h3>\n    <label for=\"apiUrlInput\">请求 URL:</label>\n    <input type=\"text\" id=\"apiUrlInput\" value=\"https://api.openai.com/v1/chat/completions\" />\n    <label for=\"modelInput\">模型:</label>\n    <input type=\"text\" id=\"modelInput\" value=\"gpt-3.5-turbo\" />\n    <div style=\"text-align: right;\">\n      <button id=\"saveSettingsBtn\">保存</button>\n      <button id=\"cancelSettingsBtn\">取消</button>\n    </div>\n  </div>\n\n  <script>\n    let apiUrl = 'https://api.openai.com/v1/chat/completions';\n    let modelName = 'gpt-3.5-turbo';\n\n    const providerTableBody = document.querySelector('#providerTable tbody');\n    const siteNameInput = document.getElementById('siteName');\n    const siteLinkInput = document.getElementById('siteLink');\n    const apiKeyInput = document.getElementById('apiKeyInput');\n    const autoTagBtn = document.getElementById('autoTagBtn');\n    const addRowBtn = document.getElementById('addRowBtn');\n    const generateHtmlBtn = document.getElementById('generateHtmlBtn');\n    const copyHtmlBtn = document.getElementById('copyHtmlBtn');\n    const generatedHtmlTextarea = document.getElementById('generatedHtml');\n    const importBtn = document.getElementById('importBtn');\n    const importHtmlTextarea = document.getElementById('importHtmlTextarea');\n    const openSettingsBtn = document.getElementById('openSettingsBtn');\n    const settingsOverlay = document.getElementById('settingsOverlay');\n    const settingsPanel = document.getElementById('settingsPanel');\n    const apiUrlInput = document.getElementById('apiUrlInput');\n    const modelInput = document.getElementById('modelInput');\n    const saveSettingsBtn = document.getElementById('saveSettingsBtn');\n    const cancelSettingsBtn = document.getElementById('cancelSettingsBtn');\n\n    // 更新序号\n    function updateRowNumbers() {\n      const rows = providerTableBody.querySelectorAll('tr');\n      rows.forEach((row, index) => {\n        row.querySelector('.indexCell').innerText = index + 1;\n      });\n    }\n\n    // 创建一行\n    function createRow(name, link, tags, remark) {\n      const tr = document.createElement('tr');\n\n      const indexTd = document.createElement('td');\n      indexTd.className = 'indexCell';\n      indexTd.innerText = providerTableBody.children.length + 1;\n\n      const nameTd = document.createElement('td');\n      nameTd.contentEditable = true;\n      nameTd.innerText = name;\n\n      const linkTd = document.createElement('td');\n      linkTd.contentEditable = true;\n      const a = document.createElement('a');\n      a.href = link;\n      a.innerText = link;\n      a.target = '_blank';\n      linkTd.appendChild(a);\n\n      const tagsTd = document.createElement('td');\n      tagsTd.contentEditable = true;\n      tagsTd.innerText = tags;\n\n      const remarkTd = document.createElement('td');\n      remarkTd.contentEditable = true;\n      remarkTd.innerText = remark;\n\n      const actionTd = document.createElement('td');\n      actionTd.className = 'row-buttons';\n      const upBtn = document.createElement('button');\n      upBtn.innerText = '↑'; upBtn.onclick = () => moveRowUp(tr);\n      const downBtn = document.createElement('button');\n      downBtn.innerText = '↓'; downBtn.onclick = () => moveRowDown(tr);\n      const deleteBtn = document.createElement('button');\n      deleteBtn.innerText = '删除'; deleteBtn.onclick = () => deleteRow(tr);\n      actionTd.appendChild(upBtn);\n      actionTd.appendChild(downBtn);\n      actionTd.appendChild(deleteBtn);\n\n      tr.appendChild(indexTd);\n      tr.appendChild(nameTd);\n      tr.appendChild(linkTd);\n      tr.appendChild(tagsTd);\n      tr.appendChild(remarkTd);\n      tr.appendChild(actionTd);\n\n      return tr;\n    }\n\n    // 清空输入框\n    function clearInputs() {\n      siteNameInput.value = '';\n      siteLinkInput.value = '';\n      apiKeyInput.value = '';\n      document.getElementById('siteRemark').value = '';\n      document.querySelectorAll('#tagCheckboxes input[type=\"checkbox\"]').forEach(chk => chk.checked = false);\n      addRowBtn.disabled = true;\n      siteNameInput.disabled = true;\n    }\n\n    // 手动添加行\n    function addRow() {\n      const name = siteNameInput.value.trim();\n      const link = siteLinkInput.value.trim();\n      const remark = document.getElementById('siteRemark').value.trim();\n\n      const tagCheckboxes = document.querySelectorAll('#tagCheckboxes input[type=\"checkbox\"]:checked');\n      const selectedTags = Array.from(tagCheckboxes).map(chk => chk.value);\n      const tags = selectedTags.join('');\n\n      if (!name || !link) {\n        alert('请填写“网站名称”和“链接”');\n        return;\n      }\n      const newRow = createRow(name, link, tags, remark);\n      providerTableBody.appendChild(newRow);\n      updateRowNumbers();\n      clearInputs();\n    }\n\n    // AI 自动标注，结果填充到输入框，待人工复核\n    async function autoTagAndFill() {\n      const key = apiKeyInput.value.trim();\n      const link = siteLinkInput.value.trim();\n      if (!key) { alert('请填写 OpenAI API Key。'); return; }\n      if (!link) { alert('请填写“链接”以进行 AI 自动标注。'); return; }\n      autoTagBtn.classList.add('loading');\n      autoTagBtn.innerText = '标注中...';\n\n      const prompt = `请根据以下网站链接，提取网站名称，并生成适合的标签（从以下列表中选择，多个标签请用无空格连续字符形式）：🆓🔓💰💪✌🎉🌎🎁🚀😆🚩✔ 。并生成一句简洁备注，说明该站的主要特点。例如：\\n输入链接：${link}\\n请输出 JSON 格式：{\\\"name\\\": \\\"网站名称\\\", \\\"tags\\\": \\\"标签串\\\", \\\"remark\\\": \\\"备注内容\\\"}`;\n\n      try {\n        const response = await fetch(apiUrl, {\n          method: 'POST', headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${key}` },\n          body: JSON.stringify({ model: modelName, messages: [{ role: 'user', content: prompt }], temperature: 0.7, max_tokens: 500 })\n        });\n        const data = await response.json();\n        const content = data.choices[0].message.content.trim();\n        let obj;\n        try { obj = JSON.parse(content); } catch (e) { const match = content.match(/\\{[\\s\\S]*\\}/); obj = match ? JSON.parse(match[0]) : null; }\n        if (!obj || !obj.name) throw new Error('AI 返回格式不符合要求');\n        siteNameInput.value = obj.name;\n        const tagsArr = obj.tags.split('');\n        document.querySelectorAll('#tagCheckboxes input[type=\"checkbox\"]').forEach(chk => chk.checked = tagsArr.includes(chk.value));\n        document.getElementById('siteRemark').value = obj.remark;\n        siteNameInput.disabled = false;\n        addRowBtn.disabled = false;\n      } catch (error) {\n        console.error(error);\n        alert('AI 自动标注出错，请检查 API Key 与网络连接，或稍后重试。');\n      } finally {\n        autoTagBtn.classList.remove('loading');\n        autoTagBtn.innerText = 'AI 自动标注';\n      }\n    }\n\n    // 行上移\n    function moveRowUp(row) {\n      const prev = row.previousElementSibling;\n      if (prev) { providerTableBody.insertBefore(row, prev); updateRowNumbers(); }\n    }\n\n    // 行下移\n    function moveRowDown(row) {\n      const next = row.nextElementSibling;\n      if (next) { providerTableBody.insertBefore(next, row); updateRowNumbers(); }\n    }\n\n    // 删除行\n    function deleteRow(row) {\n      providerTableBody.removeChild(row);\n      updateRowNumbers();\n    }\n\n    // 生成最终 HTML\n    function generateHtml() {\n      let html = '<p><strong>赞助方平台将加入邀请码，感谢您的支持</strong></p>\\n';\n      html += '<p><strong>标签含义：</strong><br>\\n';\n      html += '&emsp;- 🆓 完全免费<br>\\n';\n      html += '&emsp;- 🔓 有免费额度<br>\\n';\n      html += '&emsp;- 💰 需要充值<br>\\n';\n      html += '&emsp;- 💪 支持 Claude 最新模型<br>\\n';\n      html += '&emsp;- ✌ 支持 OpenAI 最新模型<br>\\n';\n      html += '&emsp;- 🎉 支持其他模型或其他功能<br>\\n';\n      html += '&emsp;- 🌎 需要国际网络<br>\\n';\n      html += '&emsp;- 🎁 充值有较大优惠（<50%）<br>\\n';\n      html += '&emsp;- 🚀 支持高并发<br>\\n';\n      html += '&emsp;- 😆 签到领余额<br>\\n';\n      html += '&emsp;- 🚩 网站通过中国备案<br>\\n';\n      html += '&emsp;- ✔ 已验证安全性/真实性</p>\\n\\n';\n\n      html += '<table border=\\\"1\\\" cellspacing=\\\"0\\\" cellpadding=\\\"6\\\">\\n';\n      html += '  <thead>\\n';\n      html += '    <tr>\\n';\n      html += '      <th>序号</th>\\n';\n      html += '      <th>网站</th>\\n';\n      html += '      <th>链接</th>\\n';\n      html += '      <th>标签</th>\\n';\n      html += '      <th>备注</th>\\n';\n      html += '    </tr>\\n';\n      html += '  </thead>\\n';\n      html += '  <tbody>\\n';\n\n      const rows = providerTableBody.querySelectorAll('tr');\n      rows.forEach((row, index) => {\n        const cols = row.querySelectorAll('td');\n        const name = cols[1].innerText.trim();\n        const link = cols[2].querySelector('a').href.trim();\n        const tags = cols[3].innerText.trim();\n        const remark = cols[4].innerText.trim();\n\n        html += '    <tr>\\n';\n        html += `      <td>${index + 1}</td>\\n`;\n        html += `      <td>${name}</td>\\n`;\n        html += `      <td><a href=\\\"${link}\\\" target=\\\"_blank\\\">${link}</a></td>\\n`;\n        html += `      <td>${tags}</td>\\n`;\n        html += `      <td>${remark}</td>\\n`;\n        html += '    </tr>\\n';\n      });\n\n      html += '  </tbody>\\n';\n      html += '</table>';\n\n      generatedHtmlTextarea.value = html;\n    }\n\n    // 复制 HTML 到剪贴板\n    function copyHtmlToClipboard() {\n      generatedHtmlTextarea.select();\n      document.execCommand('copy');\n      alert('HTML 已复制到剪贴板！');\n    }\n\n    // 导入已有的 <table> HTML\n    function importProvidersFromHtml() {\n      const rawHtml = importHtmlTextarea.value.trim();\n      if (!rawHtml) { alert('请先在上方粘贴已有的 <table> ... </table> HTML 代码！'); return; }\n      const parser = new DOMParser();\n      const doc = parser.parseFromString(rawHtml, 'text/html');\n      const rows = doc.querySelectorAll('tbody tr');\n      if (!rows.length) { alert('未能识别到有效的 <tbody><tr> ... 行，请检查粘贴内容格式'); return; }\n\n      providerTableBody.innerHTML = '';\n      rows.forEach(row => {\n        const cols = row.querySelectorAll('td');\n        if (cols.length < 5) return;\n        const name = cols[1].innerText.trim();\n        const linkATag = cols[2].querySelector('a');\n        const link = linkATag ? linkATag.href.trim() : cols[2].innerText.trim();\n        const tags = cols[3].innerText.trim();\n        const remark = cols[4].innerText.trim();\n        const newRow = createRow(name, link, tags, remark);\n        providerTableBody.appendChild(newRow);\n      });\n\n      updateRowNumbers();\n      alert('导入完成！已将行数添加到表格中。');\n      importHtmlTextarea.value = '';\n    }\n\n    // 打开设置面板\n    openSettingsBtn.addEventListener('click', () => {\n      settingsOverlay.style.display = 'block';\n      settingsPanel.style.display = 'block';\n      apiUrlInput.value = apiUrl;\n      modelInput.value = modelName;\n    });\n    // 取消设置\n    cancelSettingsBtn.addEventListener('click', () => {\n      settingsOverlay.style.display = 'none';\n      settingsPanel.style.display = 'none';\n    });\n    // 保存设置\n    saveSettingsBtn.addEventListener('click', () => {\n      apiUrl = apiUrlInput.value.trim() || apiUrl;\n      modelName = modelInput.value.trim() || modelName;\n      settingsOverlay.style.display = 'none';\n      settingsPanel.style.display = 'none';\n      alert(`设置已保存：\\n请求 URL：${apiUrl}\\n模型：${modelName}`);\n    });\n\n    autoTagBtn.addEventListener('click', autoTagAndFill);\n    addRowBtn.addEventListener('click', addRow);\n    generateHtmlBtn.addEventListener('click', generateHtml);\n    copyHtmlBtn.addEventListener('click', copyHtmlToClipboard);\n    importBtn.addEventListener('click', importProvidersFromHtml);\n  </script>\n</body>\n</html>\n"
  },
  {
    "path": "LICENSE",
    "content": "                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "README.md",
    "content": "# 🌐 OpenAI / Claude / DeepSeek API Provider\n\n[![Last Commit](https://img.shields.io/github/last-commit/TechnologyStar/Openai-Claude-Deepseek-API-provider)](https://github.com/TechnologyStar/Openai-Claude-Deepseek-API-provider)\n[![License](https://img.shields.io/github/license/TechnologyStar/Openai-Claude-Deepseek-API-provider)](https://github.com/TechnologyStar/Openai-Claude-Deepseek-API-provider/blob/main/LICENSE)\n\n> 🏗️ 精选第三方 **OpenAI / Claude / DeepSeek / Gemini 等大模型 API** 提供方导航，方便用于学习、研究与非商业用途。\n\n<p align=\"center\">\n  <a href=\"README.md\" title=\"中文\"><img src=\"https://img.shields.io/badge/🇨🇳 中文-阅读-blue?style=flat-square\" alt=\"中文版\"/></a>\n  <a href=\"en.md\" title=\"English\"><img src=\"https://img.shields.io/badge/🇬🇧 English-Read-blue?style=flat-square\" alt=\"English\"/></a>\n  <a href=\"ru.md\" title=\"Русский\"><img src=\"https://img.shields.io/badge/🇷🇺 Русский-Читать-blue?style=flat-square\" alt=\"Русская версия\"/></a>\n  <a href=\"fr.md\" title=\"Français\"><img src=\"https://img.shields.io/badge/🇫🇷 Français-Lire-blue?style=flat-square\" alt=\"Version Française\"/></a>\n</p>\n\n---\n\n> ⚠️ **使用与合规说明（必读）**\n>\n> 本项目为 **免费开源导航 / 整理项目/ 因部分链接还有aff，存在一定的商业性质**，仅用于技术研究与学习交流，**严禁任何违法违规用途**。\n>\n> - 本项目 **不提供任何代理、转发或 Key 生成服务**，仅做站点信息收录与聚合展示；\n> - **不会收录封闭式“内部 AI 论坛 / 暗网类站点”**，如有误收录，请提交 Issue 或联系删除；\n> - 一旦确认误收录，对造成不良影响的平台，将在评估后予以适当赔偿与公开说明；\n> - 使用任何第三方平台前，请务必自行仔细阅读其《用户协议》《隐私政策》等；\n> - 请严格遵守各官方条款：\n>   - 遵守 [OpenAI 使用条款](https://openai.com/policies/terms-of-use)\n>   - 遵守 [《生成式人工智能服务管理暂行办法》](http://www.cac.gov.cn/2023-07/13/c_1690898327029107.htm)，**请勿对中国公众提供未经备案的生成式 AI 服务**。\n>\n> 🏠 官网导航页：将于近期通过leaflow搭建\n> \n> 非常感谢 leaflow 提供服务支持！  \n\n---\n\n## 🚀 项目简介\n\n* 📌 收录并验证来自互联网的第三方 API 提供平台（部分免费）\n* 🔧 免注册 / 一键接入 / 支持多模型（OpenAI、Claude、DeepSeek 等）\n* 🔒 所有网站仅作收录展示，**请勿输入个人敏感信息**\n\n> 💡 如果觉得项目有帮助，欢迎 Star 🌟\n\n---\n\n## 🎁 特色标签说明\n\n### 💰 计费 & 额度\n\n| 标签 | 含义                             |\n| ---- | -------------------------------- |\n| ❤️   | 公益站点（纯公益，无商业收费行为） |\n| 🆓   | 免费站点（可零成本使用，通常也提供充值 / 赞助通道） |\n| 🎁   | **有 ≥ 5 美刀等值免费额度**（含活动赠送 / 新人礼等） |\n| 💰   | 原价充值 / 商业向平台（价格接近或等同官方） |\n\n### 🤖 模型支持\n\n| 标签 | 含义                                     |\n| ---- | ---------------------------------------- |\n| 💪   | 支持 **Claude 最新主力模型**            |\n| ✌   | 支持 **OpenAI 最新主力模型**（如 GPT-5 / 4o 等） |\n| ✨   | 支持 **Gemini 系列模型**                 |\n| 🎉   | 支持其他主流模型（如 DeepSeek、Llama、Qwen、国内模型等） |\n| 🏓   | 对话专用平台（以“聊天”为主，API 能力可能有限或需单独开通） |\n| 🍹  |  claudecode站点      |\n\n### 🎯 使用特性\n\n| 标签 | 含义                             |\n| ---- | -------------------------------- |\n| 🏷️   | 一元一刀（计费接近 1 元 / 1 美刀） |\n| 😆   | 可每日签到领余额 / 任务送代币      |\n| ✉️   | 含有邀请码 / 邀请奖励（本表中不超过 5 个站点打此标，在一定情况下，我们可以保证这些站点的可信度及可用性） |\n\n### 🌐 网络与合规\n\n| 标签 | 含义                     |\n| ---- | ------------------------ |\n| 🌎   | **需要国际网络** 才能稳定访问 |\n| 🚩   | 已备案平台（中国境内有备案信息） |\n\n### ⚙️ 性能与质量\n\n| 标签 | 含义                                  |\n| ---- | ------------------------------------- |\n| 🚀   | 支持高并发（适合批量请求 / 多用户场景） |\n| ⚡   | 低延迟（官方或实测延迟 ≲ 300ms）        |\n| 🎖️   | 推荐级优质平台（人工主观评价，**全表不超过 5 个**） |\n\n---\n\n## 📱 推荐应用支持\n\n<details>\n<summary>📦 点击展开查看兼容应用列表</summary>\n  \n### ✅ [Cherry Studio](https://github.com/CherryHQ/cherry-studio)\n> **跨平台桌面端 + 移动端，集成主流 AI 云服务 + 本地模型。**  \n> - **平台支持**：Windows、macOS、Linux、iOS、Android  \n> - **模型集成**：OpenAI、Anthropic、本地模型（Ollama、LM Studio 等）  \n> - **核心功能**：多会话管理、自定义提示词、插件扩展  \n> - **特色亮点**：统一的界面管理不同模型，适合需要混合云端和本地推理的用户  \n\n### ✅ [ChatGPT 好友插件 (uTools)](https://u.tools/plugins/detail/ChatGPT.%E5%A5%BD%E5%8F%8B/)\n> **桌面端智能聊天插件，支持角色设定、多模型、多会话管理。**  \n> - **平台支持**：Windows、macOS、Linux（需安装 uTools 平台）  \n> - **模型集成**：OpenAI、文心一言、通义千问、DeepSeek 等  \n> - **核心功能**：全局快捷键呼出、角色预设、对话历史保存  \n> - **特色亮点**：轻量级插件形式，适合追求效率的桌面用户  \n\n### ✅ [ChatGPT-Next-Web](https://github.com/Yidadaa/ChatGPT-Next-Web)\n> **开源网页端 ChatGPT 前端，支持 API Key 与多用户协作。**  \n> - **部署方式**：Vercel、Docker、本地部署  \n> - **模型集成**：OpenAI、Azure OpenAI、自定义代理  \n> - **核心功能**：多会话、对话分享、Markdown 渲染、多语言  \n> - **特色亮点**：界面简洁、部署简单，适合个人或团队快速搭建  \n\n### ✅ [LobeChat](https://github.com/lobehub/lobe-chat)\n> **支持视觉、语音交互和多模型切换，网页端 AI 会话框架。**  \n> - **部署方式**：Vercel、Docker、本地部署  \n> - **模型集成**：OpenAI、Claude、Gemini、本地模型（Ollama 等）  \n> - **核心功能**：语音输入/输出、文件上传解析、插件市场  \n> - **特色亮点**：现代化 UI、丰富的交互方式，适合多模态需求用户  \n\n### ✅ [BotGem](https://botgem.com/)\n> **移动端优先设计，支持语音交流与 AI 好友系统。**  \n> - **平台支持**：iOS、Android  \n> - **模型集成**：OpenAI、自定义 API  \n> - **核心功能**：语音对话、角色扮演、个性化 AI 助手  \n> - **特色亮点**：移动端优化体验，适合日常语音交互场景  \n\n### ✅ [ChatBox](https://github.com/Bin-Huang/chatbox)\n> **支持 iOS、Android 和桌面端，界面现代，功能完整。**  \n> - **平台支持**：Windows、macOS、Linux、iOS、Android  \n> - **模型集成**：OpenAI、自定义 API  \n> - **核心功能**：多会话、主题切换、API 配置管理  \n> - **特色亮点**：全平台覆盖，界面美观，适合跨设备用户  \n\n### ✅ [FastGPT](https://github.com/labring/FastGPT)\n> **知识库 + 工作流集成，企业内训/客服场景首选。**  \n> - **部署方式**：Docker、云服务  \n> - **模型集成**：OpenAI、本地模型、向量数据库  \n> - **核心功能**：知识库问答、工作流编排、多模型路由  \n> - **特色亮点**：企业级应用，适合构建定制化 AI 助手  \n\n### ✅ [AnythingLLM](https://github.com/Mintplex-Labs/anything-llm)\n> **支持本地部署与插件扩展，适合对数据隐私有要求的用户。**  \n> - **部署方式**：Docker、本地安装  \n> - **模型集成**：OpenAI、本地模型（Ollama、Llama.cpp）  \n> - **核心功能**：文档上传与分析、多用户管理、插件系统  \n> - **特色亮点**：隐私优先、支持私有化部署，适合企业或敏感数据场景  \n\n</details>\n\n## 正文\n\n<table border=\"1\" cellpadding=\"6\" cellspacing=\"0\" style=\"border-collapse:collapse\">\n<thead><tr><th>序号</th><th>网站</th><th>链接</th><th>标签</th><th>备注</th></tr></thead>\n<tbody>\n<tr><td>1</td><td>OpenRouter（优质）</td><td><a href=\"https://openrouter.ai\" target=\"_blank\">https://openrouter.ai</a></td><td>🔓✌💪🎉🚀</td><td>支持 293 个模型，提供免费额度，目前最正规的第三方中转，还部分开源免费模型</td></tr>\n<tr><td>2</td><td>zenmux（推荐；官转）</td><td><a href=\"https://zenmux.ai/invite/U1QU1H\" target=\"_blank\">https://zenmux.ai</a></td><td>🎖️🔓✌💰🚀</td><td>多模型聚合服务，提供免费模型（速率限制较严/有免费高级模型，但随时变化）、图像生成与各类文本模型，平台支持\"模型赔付\"机制，官转渠道，不掺水</td></tr>\n<tr><td>3</td><td>OAIPro（优质）</td><td><a href=\"https://api.oaipro.com\" target=\"_blank\">https://api.oaipro.com</a></td><td>💰✌💪</td><td>以接近官方的费率和稳定性提供 OpenAI 与 Claude 的标准兼容 API，官转，原价充值，模型不掺水</td></tr>\n<tr><td>4</td><td>chat01（推荐，对话+api）</td><td><a href=\"https://chat01.ai/?ref=j45ikbTa\" target=\"_blank\">https://chat01.ai/</a></td><td>🏓🎖️🔓✌💰✉️</td><td>提供 GPT-5、pro系列等高阶模型的聊天与 API 双用平台，注册赠送每日2免费积分，可长期零成本试用，按次计费，官网版本，可联网搜索，工具调用，不支持高并发</td></tr>\n<tr><td>5</td><td>星辰voaartun</td><td><a href=\"https://ai.centos.hk\" target=\"_blank\">https://ai.centos.hk</a></td><td></td><td>支持claudecode,codex，多渠道支持（codex）</td></tr>\n<tr><td>6</td><td>Portunex（优质）</td><td><a href=\"https://portunex.gewulabs.group/\" target=\"_blank\">https://portunex.gewulabs.group/</a></td><td></td><td>claudecode官逆max,价格极低，疑似目前全网最低价（官逆渠道），真实性请自行辨别</td></tr>\n<tr><td>7</td><td>PoloAPI</td><td><a href=\"https://poloai.top\" target=\"_blank\">https://ptargetai.top</a></td><td>🔓💪✌🎉💰</td><td>API聚合 API，提供 Claude</td></tr>\n<tr><td>8</td><td>VoAPI</td><td><a href=\"https://demo.voapi.top\" target=\"_blank\">https://demo.voapi.top</a></td><td>🆓😆💪✌</td><td>公益性质平台，免费开放模型 API，额度每日清零。</td></tr>\n<tr><td>9</td><td>V3 API（混合版）</td><td><a href=\"https://api.v3.cm\" target=\"_blank\">https://api.v3.cm</a></td><td>🚀🔓💪🎉✌</td><td>集成多种大模型，提供超高并发支持及稳定路由机制。</td></tr>\n<tr><td>10</td><td>硅基流动（企业级）</td><td><a href=\"https://cloud.siliconflow.cn\" target=\"_blank\">https://cloud.siliconflow.cn</a></td><td>🔓🎉🚀🚩✔</td><td>企业级 AI 模型推理平台，提供千亿级模型推理、向量检索、Embedding、多模态等能力。</td></tr>\n<tr><td>11</td><td>V3 API（官转版）</td><td><a href=\"https://gf.gpt.ge\" target=\"_blank\">https://gf.gpt.ge</a></td><td>🚀🌹🔓💪</td><td>官方中转路线，具备更稳定的调用链与地域就近加速能力。</td></tr>\n<tr><td>12</td><td>openai-hk</td><td><a href=\"https://openai-hk.com\" target=\"_blank\">https://openai-hk.com</a></td><td>🆓🔓🎉✌💪🚀</td><td>提供高并发的 OpenAI 兼容 API，注册赠送体验金额。</td></tr>\n<tr><td>13</td><td>ChatGPT API 水龙头</td><td><a href=\"https://faucet.openkey.cloud\" target=\"_blank\">https://faucet.openkey.cloud</a></td><td>🆓</td><td>免费 $1 额度，3 天有效期。</td></tr>\n<tr><td>14</td><td>公益免费的 ChatGPT API</td><td><a href=\"https://github.com/popjane/free_chatgpt_api\" target=\"_blank\">GitHub</a></td><td>🆓</td><td>公益免费。</td></tr>\n<tr><td>15</td><td>GPT-API-free</td><td><a href=\"https://github.com/chuyuewei/ChatGPT-API\" target=\"_blank\">GitHub</a></td><td>🆓💪</td><td>支持 GPT-4，每天 3 次。</td></tr>\n<tr><td>16</td><td>openkey</td><td><a href=\"https://openkey.cloud\" target=\"_blank\">https://openkey.cloud</a></td><td>🔓💪✌🚀</td><td>赠 $0.2，支持多并发。</td></tr>\n<tr><td>17</td><td>gptgod.online</td><td><a href=\"https://gptgod.online\" target=\"_blank\">https://gptgod.online</a></td><td>💪✌🎁💰🎉😆</td><td>按次计费，积分额度。</td></tr>\n<tr><td>18</td><td>duckcoding</td><td><a href=\"https://duckcoding.com\" target=\"_blank\">https://duckcoding.com</a></td><td>✌🎉😆🚀</td><td>多模型中转 API 服务，注册即送 1 美元。</td></tr>\n<tr><td>19</td><td>m3.ckit.gold</td><td><a href=\"https://m3.ckit.gold\" target=\"_blank\">https://m3.ckit.gold</a></td><td>💰💪✌</td><td>3 元 / 刀，注册送 $0.1。</td></tr>\n<tr><td>20</td><td>iaicnn</td><td><a href=\"https://aicnn.cn\" target=\"_blank\">https://aicnn.cn</a></td><td>💪✌🎁💰🎉</td><td>老用户支持 API，目前已迁移。</td></tr>\n<tr><td>21</td><td>goapi.gptnb.ai</td><td><a href=\"https://goapi.gptnb.ai\" target=\"_blank\">https://goapi.gptnb.ai</a></td><td>💪✌💰🎉</td><td></td></tr>\n<tr><td>22</td><td>api.aigc369.com</td><td><a href=\"https://api.aigc369.com/pricing\" target=\"_blank\">https://api.aigc369.com/pricing</a></td><td>💪✌💰🎉</td><td></td></tr>\n<tr><td>23</td><td>api.mjdjourney.cn</td><td><a href=\"https://api.mjdjourney.cn\" target=\"_blank\">https://api.mjdjourney.cn</a></td><td>💪✌💰🎉</td><td></td></tr>\n<tr><td>24</td><td>api.bltcy.ai</td><td><a href=\"https://api.bltcy.ai\" target=\"_blank\">https://api.bltcy.ai</a></td><td>💪✌💰🎉</td><td></td></tr>\n<tr><td>25</td><td>4Z API 中转站</td><td><a href=\"https://zzzzapi.com\" target=\"_blank\">https://4zapi.com</a></td><td>🔓✌💪🎉🚀</td><td>支持 GPT-4o、Claude 3.5，新用户赠 0.2 额度。</td></tr>\n<tr><td>26</td><td>简易API中转站</td><td><a href=\"https://jeniya.top\" target=\"_blank\">https://jeniya.top</a></td><td>🔓✌💪🎉🚀</td><td>聚合多模型，国内直连无限制，注册送 100 元测试额度。</td></tr>\n<tr><td>27</td><td>CloseAI</td><td><a href=\"https://closeai-asia.com\" target=\"_blank\">https://closeai-asia.com</a></td><td>💰✌💪🎉🚀</td><td>企业级代理，支持 GPT-4o、Claude 3.5，提供中文技术支持。</td></tr>\n<tr><td>28</td><td>云鲸AI</td><td><a href=\"https://api.atalk-ai.com\" target=\"_blank\">https://api.atalk-ai.com</a></td><td>🔓✌💪🎉🚀</td><td>聚合 ChatGPT、Claude、文心一言，注册赠 5 元体验券。</td></tr>\n<tr><td>29</td><td>ModelBridge</td><td><a href=\"https://model-bridge.okeeper.com\" target=\"_blank\">https://model-bridge.okeeper.com</a></td><td>🔓✌💪🎉🚀</td><td>国内免费代理，兼容 OpenAI 接口和国产模型。</td></tr>\n<tr><td>30</td><td>UiUi API</td><td><a href=\"https://sg.uiuiapi.com\" target=\"_blank\">https://sg.uiuiapi.com</a></td><td>🔓✌💪🎉🚀</td><td>支持 Claude 4、Gemini 等模型，兼容 OpenAI 接口格式。</td></tr>\n<tr><td>31</td><td>老张API中转服务</td><td><a href=\"https://api.laozhang.ai\" target=\"_blank\">https://api.laozhang.ai</a></td><td>🔓✌💪🎉🚀</td><td>支持 Claude 3 和 GPT-4o，新用户赠 20 元额度。</td></tr>\n<tr><td>32</td><td>海鲸AI聚合平台</td><td><a href=\"https://ai.atalk-ai.com\" target=\"_blank\">https://ai.atalk-ai.com</a></td><td>🔓✌💪🎉🚀</td><td>国内备案平台，支持多模型统一 API 接入。</td></tr>\n<tr><td>33</td><td>One API</td><td><a href=\"https://one-api.ai\" target=\"_blank\">https://one-api.ai</a></td><td>🔓✌💪🎉🚀</td><td>开源接口管理系统，支持多模型分发和私有化部署。</td></tr>\n<tr><td>34</td><td>Gemini API代理</td><td><a href=\"https://gemini-proxy.com\" target=\"_blank\">https://gemini-proxy.com</a></td><td>🔓✌🎉🚀</td><td>支持 Google Gemini 模型，兼容 OpenAI 接口。</td></tr>\n<tr><td>35</td><td>DeepSeek API聚合</td><td><a href=\"https://deepseek-aggregator.com\" target=\"_blank\">https://deepseek-aggregator.com</a></td><td>🔓💪🎉🚀</td><td>聚合 DeepSeek 系列模型，提供免费测试额度。</td></tr>\n<tr><td>36</td><td>Hugging Face模型代理</td><td><a href=\"https://huggingface.co/inference-api\" target=\"_blank\">https://huggingface.co/inference-api</a></td><td>🔓💪🎉🚀</td><td>支持开源模型（如 Llama 3），提供免费额度和企业级服务。</td></tr>\n<tr><td>37</td><td>AI21 Labs官方代理</td><td><a href=\"https://studio.ai21.com\" target=\"_blank\">https://studio.ai21.com</a></td><td>💰✌💪🎉</td><td>支持 Jurassic-2 模型，适合自然语言处理任务。</td></tr>\n<tr><td>38</td><td>Cohere API代理</td><td><a href=\"https://cohere.ai\" target=\"_blank\">https://cohere.ai</a></td><td>💰✌💪🎉</td><td>支持文本生成和分类模型，提供企业级 API。</td></tr>\n<tr><td>39</td><td>AI API聚合平台</td><td><a href=\"https://api.ai-aggregator.com\" target=\"_blank\">https://api.ai-aggregator.com</a></td><td>🔓✌💪🎉🚀</td><td>聚合多模型，提供统一接口和负载均衡。</td></tr>\n<tr><td>40</td><td>AI.LS</td><td><a href=\"https://ai.ls\" target=\"_blank\">https://ai.ls</a></td><td>🆓✌</td><td>极简接口，GPT-3.5 免费匿名使用。</td></tr>\n<tr><td>41</td><td>简易API</td><td><a href=\"https://jeniya.top\" target=\"_blank\">https://jeniya.top</a></td><td>🔓✌💪🎉🎁</td><td>注册送 ¥100 额度，支持 Claude / GPT-4o 多模型。</td></tr>\n<tr><td>42</td><td>OpenAI120</td><td><a href=\"https://openai120.com\" target=\"_blank\">https://openai120.com</a></td><td>🔓✌🎁</td><td>新用户送 $3 额度，单价同官方。</td></tr>\n<tr><td>43</td><td>DuckAGI</td><td><a href=\"https://duckagi.com\" target=\"_blank\">https://duckagi.com</a></td><td>💰✌🎉🚀</td><td>多模态支持 GPT-4o / Sora，适合 AI 绘图。</td></tr>\n<tr><td>44</td><td>Aihubmix</td><td><a href=\"https://aihubmix.com\" target=\"_blank\">https://aihubmix.com</a></td><td>💰🎉</td><td>国产模型聚合（文心一言 / 通义千问）。</td></tr>\n<tr><td>45</td><td>WokaAI</td><td><a href=\"https://wokaai.com\" target=\"_blank\">https://wokaai.com</a></td><td>✌</td><td>双线路。</td></tr>\n<tr><td>46</td><td>azapi</td><td><a href=\"https://azapi.com.cn\" target=\"_blank\">https://azapi.com.cn</a></td><td>💰</td><td>长期使用优惠。</td></tr>\n<tr><td>47</td><td>ClaudeAPI</td><td><a href=\"https://claudeapi.io\" target=\"_blank\">https://claudeapi.io</a></td><td>💪🚀✔</td><td>Anthropic 官方合作，支持文件解析。</td></tr>\n<tr><td>48</td><td>Gala API</td><td><a href=\"https://galaapi.com\" target=\"_blank\">https://galaapi.com</a></td><td>🎉🚀</td><td>谷歌 Gemini 专用高速通道。</td></tr>\n<tr><td>49</td><td>Google AI Studio</td><td><a href=\"https://ai.google.dev\" target=\"_blank\">https://ai.google.dev</a></td><td>🆓🌎✔</td><td>Gemini 系列完全免费，需科学上网访问。</td></tr>\n<tr><td>50</td><td>OpenAI 数据共享计划</td><td><a href=\"https://platform.openai.com\" target=\"_blank\">https://platform.openai.com</a></td><td>🔓✌🌎</td><td>开启数据共享后每日最高获 1M 免费 tokens。</td></tr>\n<tr><td>51</td><td>Mistral AI La Plateforme</td><td><a href=\"https://platform.mistral.ai\" target=\"_blank\">https://platform.mistral.ai</a></td><td>🔓🎉🌎</td><td>官方平台提供免费 API 试用额度（受限速率）。</td></tr>\n<tr><td>52</td><td>Cohere</td><td><a href=\"https://cohere.com\" target=\"_blank\">https://cohere.com</a></td><td>🔓🎉🌎</td><td>注册可获 Trial Key，免费调用但有速率限制。</td></tr>\n<tr><td>53</td><td>魔搭 ModelScope</td><td><a href=\"https://modelscope.cn\" target=\"_blank\">https://modelscope.cn</a></td><td>🔓🎉🚩</td><td>聚合 DeepSeek / Qwen 等模型，模型试用与下载免费。</td></tr>\n<tr><td>54</td><td>字节 方舟协作奖励计划</td><td><a href=\"https://www.volcengine.com/product/ark\" target=\"_blank\">https://www.volcengine.com/product/ark</a></td><td>🔓🎉</td><td>参与计划单模型每天送 50 万 Tokens。</td></tr>\n<tr><td>55</td><td>智谱 BigModel</td><td><a href=\"https://open.bigmodel.cn\" target=\"_blank\">https://open.bigmodel.cn</a></td><td>🆓🎉</td><td>GLM-4-Flash API 完全免费，支持 128K 上下文。</td></tr>\n<tr><td>56</td><td>书生 InternLM</td><td><a href=\"https://internlm.intern-ai.org.cn\" target=\"_blank\">https://internlm.intern-ai.org.cn</a></td><td>🆓🎉</td><td>官方开放免费 API，可直接调用。</td></tr>\n<tr><td>57</td><td>GitHub Models</td><td><a href=\"https://docs.github.com/github-models\" target=\"_blank\">https://docs.github.com/github-models</a></td><td>🔓✌🎉🌎</td><td>Azure 托管，提供受限免费 API 配额。</td></tr>\n<tr><td>58</td><td>OpenRouter（免费版）</td><td><a href=\"https://openrouter.ai\" target=\"_blank\">https://openrouter.ai</a></td><td>🔓💪✌🎉🌎✔</td><td>免费模型每日 ≤ 50 次，余额 ≥ 10$ 可升至 1000 次。</td></tr>\n<tr><td>59</td><td>Chutes</td><td><a href=\"https://chutes.ai\" target=\"_blank\">https://chutes.ai</a></td><td>🔓🎉</td><td>部分模型每日 200 条免费额度，支持 DeepSeek 等。</td></tr>\n<tr><td>60</td><td>Groq Cloud</td><td><a href=\"https://groq.com/groqcloud\" target=\"_blank\">https://groq.com/groqcloud</a></td><td>🔓🎉🌎</td><td>可申请免费 API Key，推理速度极快。</td></tr>\n<tr><td>61</td><td>Cerebras Inference</td><td><a href=\"https://inference.cerebras.ai\" target=\"_blank\">https://inference.cerebras.ai</a></td><td>🔓🎉🌎🚀</td><td>开发者每日享 1M 免费 tokens，LLM 推理可达 450 t/s+。</td></tr>\n<tr><td>62</td><td>无问芯穹 GenStudio</td><td><a href=\"https://cloud.infini-ai.com/genstudio\" target=\"_blank\">https://cloud.infini-ai.com/genstudio</a></td><td>🆓🎉</td><td>DeepSeek R1 / V3 满血版免费 Token，无需邀请码。</td></tr>\n<tr><td>63</td><td>PH8 大模型 MaaS 平台</td><td><a href=\"https://ph8.co\" target=\"_blank\">https://ph8.co</a></td><td>💰🎉✨✌💪</td><td>面向开发者的大模型聚合 / MaaS 平台。</td></tr>\n<tr><td>64</td><td>Cloudflare AI Gateway</td><td><a href=\"https://www.cloudflare.com/developer-platform/products/ai-gateway/\" target=\"_blank\">https://www.cloudflare.com</a></td><td>💰🎉✨✌💪</td><td>Cloudflare 提供的 AI 流量网关产品。</td></tr>\n<tr><td>65</td><td>ocoolAI API 站</td><td><a href=\"https://one.ocoolai.com\" target=\"_blank\">https://one.ocoolai.com</a></td><td>💰🎉✨✌💪</td><td>全球 AI 一站集成平台，完全兼容 OpenAI API。</td></tr>\n<tr><td>66</td><td>TokenFlux</td><td><a href=\"https://tokenflux.ai\" target=\"_blank\">https://tokenflux.ai</a></td><td>💰🎉✨✌💪</td><td>统一 AI API 网关，支持约 600 个 MCP 服务器。</td></tr>\n<tr><td>67</td><td>302.AI</td><td><a href=\"https://302.ai\" target=\"_blank\">https://302.ai</a></td><td>💰🎉✨✌💪</td><td>被称为\"AI 超市\"，聚合 50 万+ AI 应用。</td></tr>\n<tr><td>68</td><td>MegaLLM</td><td><a href=\"https://megallm.io\" target=\"_blank\">https://megallm.io</a></td><td>💰🎉✨✌💪</td><td>统一 AI Gateway，可连接 70+ 大模型。</td></tr>\n<tr><td>69</td><td>AI/ML API（AIMLAPI）</td><td><a href=\"https://aimlapi.com\" target=\"_blank\">https://aimlapi.com</a></td><td>💰🎉✨✌💪</td><td>单一 API 访问 400+ AI 模型。</td></tr>\n<tr><td>70</td><td>NagaAI</td><td><a href=\"https://naga.ac\" target=\"_blank\">https://naga.ac</a></td><td>💰🎉✨✌💪</td><td>Unified AI Aggregator。</td></tr>\n<tr><td>71</td><td>Groq / GroqCloud</td><td><a href=\"https://groq.com\" target=\"_blank\">https://groq.com</a></td><td>💰🎉✨✌💪</td><td>专注推理的硬件与云服务，LPU™ 主打极高吞吐。</td></tr>\n<tr><td>72</td><td>Eden AI</td><td><a href=\"https://www.edenai.co\" target=\"_blank\">https://www.edenai.co</a></td><td>💰🎉✨✌💪</td><td>统一 AI API，涵盖文本、语音、图像、OCR 等任务。</td></tr>\n<tr><td>73</td><td>Ikuncode</td><td><a href=\"https://api.ikuncode.cc\" target=\"_blank\">https://api.ikuncode.cc</a></td><td>🏷️💰✌💪</td><td>采用 New API 的统一网关。</td></tr>\n<tr><td>74</td><td>Duckcoding</td><td><a href=\"https://duckcoding.com\" target=\"_blank\">https://duckcoding.com</a></td><td>🏷️✨✌💪</td><td>提供 Claude Code / Codex / Gemini CLI 的令牌与分组管理。</td></tr>\n<tr><td>75</td><td>Right Code</td><td><a href=\"https://right.codes\" target=\"_blank\">https://right.codes</a></td><td>🏷️✨✌💪</td><td>面向团队 / 企业的 AI API 平台。</td></tr>\n<tr><td>76</td><td>GalaxyCode</td><td><a href=\"https://nf.video\" target=\"_blank\">https://nf.video</a></td><td>🏷️✨</td><td>品牌主页入口。</td></tr>\n<tr><td>77</td><td>YesCode</td><td><a href=\"https://co.yes.vg\" target=\"_blank\">https://co.yes.vg</a></td><td>🏷️💰✌💪</td><td>Claude API 路由与计量平台。</td></tr>\n<tr><td>78</td><td>PackyAPI（PackyCode）</td><td><a href=\"https://www.packyapi.com\" target=\"_blank\">https://www.packyapi.com</a></td><td>🍹🏷️💰🎉✨💪</td><td>大型 AI API 聚合平台。</td></tr>\n<tr><td>79</td><td>SSSAiCode</td><td><a href=\"https://www.sssaicode.com\" target=\"_blank\">https://www.sssaicode.com</a></td><td>🏷️✨💪</td><td>提供 Claude / Codex 代理封装及多语言 SDK。</td></tr>\n<tr><td>80</td><td>Cubence</td><td><a href=\"https://cubence.com\" target=\"_blank\">https://cubence.com</a></td><td>🏷️✨✌💪</td><td>企业级 AI API Gateway。</td></tr>\n<tr><td>81</td><td>EasyChat AI</td><td><a href=\"https://easychat.site\" target=\"_blank\">https://easychat.site</a></td><td>🍹🎉✨✌</td><td>桌面端 AI 工具。</td></tr>\n<tr><td>82</td><td>Clark</td><td><a href=\"https://clarkf.site\" target=\"_blank\">https://clarkf.site</a></td><td>✨✌</td><td>工具说明与入口站点。</td></tr>\n<tr><td>83</td><td>FoxCode</td><td><a href=\"https://foxcode.rjj.cc\" target=\"_blank\">https://foxcode.rjj.cc</a></td><td>🍹🎉✨✌💪</td><td>AI 编程平台，支持代码生成。</td></tr>\n<tr><td>84</td><td>AICodeMirror</td><td><a href=\"https://www.aicodemirror.com\" target=\"_blank\">https://www.aicodemirror.com</a></td><td>🍹🏷️🎉✨✌💪</td><td>支持 Claude Code / Codex / Gemini CLI 的综合平台。</td></tr>\n<tr><td>85</td><td>MikuCode</td><td><a href=\"https://mikucode.xyz\" target=\"_blank\">https://mikucode.xyz</a></td><td>🍹🏷️💰✨✌💪</td><td>统一 LLM API Gateway。</td></tr>\n<tr><td>86</td><td>CodeCli</td><td><a href=\"https://code-cli.cn\" target=\"_blank\">https://code-cli.cn</a></td><td>🏷️✨</td><td>CLI + AI 集成相关工具入口。</td></tr>\n<tr><td>87</td><td>Xyai</td><td><a href=\"https://new.xychatai.com\" target=\"_blank\">https://new.xychatai.com</a></td><td>🏷️✨✌</td><td>含 Vibe-Code / Claude Code 模块。</td></tr>\n<tr><td>88</td><td>AIMZ</td><td><a href=\"https://mzlone.top\" target=\"_blank\">https://mzlone.top</a></td><td>🏷️💰✨</td><td>基于 New API 的网关实例。</td></tr>\n<tr><td>89</td><td>Privnode</td><td><a href=\"https://privnode.com\" target=\"_blank\">https://privnode.com</a></td><td>🍹🏷️💰🎉✨💪</td><td>主打低成本接入 Claude Code / Codex。</td></tr>\n<tr><td>90</td><td>JikeAI</td><td><a href=\"https://magic666.top\" target=\"_blank\">https://magic666.top</a></td><td>🏷️💰✨💪</td><td>第三方 Claude Code 中转服务。</td></tr>\n<tr><td>91</td><td>Uucode</td><td><a href=\"https://www.uucode.org\" target=\"_blank\">https://www.uucode.org</a></td><td>🍹🏷️💰🎉✨💪</td><td>提供 Claude Code / Codex 专用 BASE_URL。</td></tr>\n<tr><td>92</td><td>88code</td><td><a href=\"https://www.88code.org\" target=\"_blank\">https://www.88code.org</a></td><td>🍹🏷️💰🎉✨💪</td><td>\"平价 Claude Code 中转站\"。</td></tr>\n<tr><td>93</td><td>小爱 New API 中转站</td><td><a href=\"https://xiaoai.plus\" target=\"_blank\">https://xiaoai.plus</a></td><td>💰🎉✨✌💪</td><td>基于 New API 的大模型聚合中转平台。</td></tr>\n<tr><td>94</td><td>AiCore / XTY 接口聚合</td><td><a href=\"https://svip.xty.app\" target=\"_blank\">https://svip.xty.app</a></td><td>💰🎉✨✌💪</td><td>典型 One API / New API 风格控制台。</td></tr>\n<tr><td>95</td><td>ChatAi API 聚合站</td><td><a href=\"https://www.chataiapi.com\" target=\"_blank\">https://www.chataiapi.com</a></td><td>💰🎉✨✌💪</td><td>企业级大模型 API 平台，主打官方价格约 1 折。</td></tr>\n<tr><td>96</td><td>One API 自建网关（zaiwen）</td><td><a href=\"https://oneapi.zaiwen.top\" target=\"_blank\">https://oneapi.zaiwen.top</a></td><td>💰🎉✨✌💪</td><td>面向自建用户的 One API 网关。</td></tr>\n<tr><td>97</td><td>钱多多 API 聚合平台</td><td><a href=\"https://api.ifopen.ai\" target=\"_blank\">https://api.ifopen.ai</a></td><td>💰🎉✨✌💪</td><td>以 New API 面板为核心的多模型中转站。</td></tr>\n<tr><td>98</td><td>Shell API / DPAPI 聚合网关</td><td><a href=\"https://dpapi.cn\" target=\"_blank\">https://dpapi.cn</a></td><td>💰🎉✨✌💪</td><td>品牌名为 Shell API 的多模型 API 平台。</td></tr>\n<tr><td>99</td><td>LittleWheat OpenAI 中转站</td><td><a href=\"https://chatapi.littlewheat.com\" target=\"_blank\">https://chatapi.littlewheat.com</a></td><td>💰🎉✨✌💪</td><td>以\"OpenAI 余额查询 + 中转接口\"闻名。</td></tr>\n<tr><td>100</td><td>VimsAI API 聚合平台</td><td><a href=\"https://www.vimsai.com\" target=\"_blank\">https://www.vimsai.com</a></td><td>💰🎉✨✌💪</td><td>兼容 OpenAI 标准的全球 AI 模型接入平台，900+ 模型。</td></tr>\n<tr><td>101</td><td>xcode</td><td><a href=\"https://xcode.best/\" target=\"_blank\">https://xcode.best/</a></td><td></td><td>claudecode专用，多渠道支持</td></tr>\n<tr><td>102</td><td>skapi</td><td><a href=\"https://jk.skcdn.cn/\" target=\"_blank\">https://jk.skcdn.cn/</a></td><td></td><td>支持claudecode,价额便宜</td></tr>\n</tbody></table>\n\n\n## 📖 使用指南\n\n1. 🔑 获取 API Key：注册平台后，在用户中心复制\n2. ⚙ 配置 Endpoint：填写 API 地址到支持应用中\n3. 🤖 选择模型：根据平台支持情况切换不同模型\n4. 📊 用量监控：推荐使用客户端自带用量限制功能\n\n---\n\n## 🙌 贡献指南\n\n我们欢迎以下贡献方式：\n\n* ✨ 添加新 API 提供商（需稳定运行 ≥ 3 天）\n* 🧰 补充使用教程（包括配置截图、录屏）\n* 🧪 开发验证脚本（自动检测失效平台）\n* 🌍 多语言翻译（如：英文、日文、韩文等）\n\n> 请提交 Pull Request 或 Issue，我们将尽快处理！\n\n---\n\n## ❌ 失效平台列表\n\n<details>\n<summary>📛 点击展开查看失效平台</summary>\n\n| # | 名称     | 链接                                       | 状态     |\n| - | ------ | ---------------------------------------- | ------ |\n| 1 | 464888 | [api.464888.xyz](https://api.464888.xyz) | ❌ 无法访问 |\n\n> 如发现新失效平台，欢迎通过 Issue 提交！\n\n</details>\n\n---\n\n## ⚖️ 法律免责声明\n\n* 本项目不存储任何 API Key，也不提供代理或转发服务。\n* 所有平台来源于互联网，使用风险请自行评估。\n* 若因使用第三方服务造成损失，作者不承担任何法律责任。---\n\n## 🙏 特别鸣谢\n\n非常感谢 zenmux 提供 api 平台支持！  \n[立即注册并使用优惠码](https://zenmux.ai/invite/U1QU1H)\n\n非常感谢 chat01 提供服务支持！  \n[访问 chat01 并使用优惠码](https://chat01.ai/?ref=j45ikbTa)\n\n非常感谢 leaflow 提供服务支持！  \n[访问 leaflow ](https://leaflow.net/)\n\n\n\n[![Powered by DartNode](https://dartnode.com/branding/DN-Open-Source-sm.png)](https://dartnode.com \"Powered by DartNode - Free VPS for Open Source\")\n---\n[![Star History](https://api.star-history.com/svg?repos=TechnologyStar/Openai-Claude-Deepseek-API-provider\\&type=Date)](https://star-history.com/#TechnologyStar/Openai-Claude-Deepseek-API-provider&Date)\nMade with ❤️ by [TechnologyStar](https://github.com/TechnologyStar)\n"
  },
  {
    "path": "en.md",
    "content": "# 🌐 Openai / Claude / Deepseek API Provider\n\n[![Last Commit](https://img.shields.io/github/last-commit/TechnologyStar/Openai-Claude-Deepseek-API-provider)](https://github.com/TechnologyStar/Openai-Claude-Deepseek-API-provider)\n[![License](https://img.shields.io/github/license/TechnologyStar/Openai-Claude-Deepseek-API-provider)](https://github.com/TechnologyStar/Openai-Claude-Deepseek-API-provider/blob/main/LICENSE)\n\n> 🏗️ A curated list of third-party platforms providing **OpenAI / Claude / DeepSeek** APIs for learning, research, and non-commercial use.\n\n<p align=\"center\">\n  <a href=\"README.md\" title=\"中文\"><img src=\"https://img.shields.io/badge/🇨🇳 中文-阅读-blue?style=flat-square\" alt=\"中文版\"/></a>\n  <a href=\"en.md\" title=\"English\"><img src=\"https://img.shields.io/badge/🇬🇧 English-Read-blue?style=flat-square\" alt=\"English\"/></a>\n  <a href=\"ru.md\" title=\"Русский\"><img src=\"https://img.shields.io/badge/🇷🇺 Русский-Читать-blue?style=flat-square\" alt=\"Русская версия\"/></a>\n  <a href=\"fr.md\" title=\"Français\"><img src=\"https://img.shields.io/badge/🇫🇷 Français-Lire-blue?style=flat-square\" alt=\"Version Française\"/></a>\n</p>\n\n---\n\n> ⚠️ **Usage Notes**\n>\n> This is a free, public-welfare project. Any illegal use is strictly prohibited.\n> **We do not include internal-only AI forum sites. If a site was added by mistake, please contact us for removal. After evaluation, we will compensate for verified mislistings.**\n> * Follow the [OpenAI Terms of Use](https://openai.com/policies/terms-of-use)\n> * Comply with the [Interim Measures for the Administration of Generative AI Services](http://www.cac.gov.cn/2023-07/13/c_1690898327029107.htm)—**do not provide unregistered generative AI services to the public in China**\n> * Official site: [Openai / Claude / Deepseek API Provider](https://d706445b-7658-4708-bb08-bac6c5a775ad-00-2z2hsdckl4fie.riker.replit.dev/)\n\n---\n\n## 🚀 Project Overview\n\n* 📌 Curates and validates third-party API providers across the internet (some are free)\n* 🔧 Zero registration / one-click access / multi-model support (OpenAI, Claude, DeepSeek, etc.)\n* 🔒 Listings are for reference only—**never enter sensitive personal information**\n\n> 💡 If you find this project helpful, feel free to leave a Star 🌟\n\n---\n\n## 🎁 Tag Legend\n\n| Tag | Meaning                                   |\n| --- | ----------------------------------------- |\n| 🆓  | Completely free                            |\n| 🔓  | Includes a free quota                      |\n| 💰  | Requires payment                           |\n| 💪  | Latest Claude support                      |\n| ✌  | Latest OpenAI support                       |\n| 🎉  | Other models supported (e.g., DeepSeek)    |\n| 🌎  | Requires international network access      |\n| 🎁  | Recharge bonus or promotional credits      |\n| 🚀  | High-concurrency support                   |\n| 😆  | Daily check-in rewards                     |\n| 🚩  | ICP-compliant / registered platform        |\n| ✔  | Manually verified for authenticity         |\n\n---\n\n## 📱 Compatible Applications\n\n<details>\n<summary>📦 Click to view the list of compatible apps</summary>\n\n### ✅ [Cherry Studio](https://github.com/CherryHQ/cherry-studio)\n\n> Cross-platform desktop + mobile client integrating mainstream AI cloud services and local models.\n\n### ✅ [ChatGPT Friends Plugin (uTools)](https://u.tools/plugins/detail/ChatGPT.%E5%A5%BD%E5%8F%8B/)\n\n> Desktop AI chat plugin with role presets, multi-model, and multi-session management.\n\n### ✅ [ChatGPT-Next-Web](https://github.com/Yidadaa/ChatGPT-Next-Web)\n\n> Open-source web front end for ChatGPT with API key support and multi-user collaboration.\n\n### ✅ [LobeChat](https://github.com/lobehub/lobe-chat)\n\n> Web-based AI chat framework with vision, speech, and multi-model switching.\n\n### ✅ [BotGem](https://botgem.com/)\n\n> Mobile-first design with voice conversations and AI companion system.\n\n### ✅ [ChatBox](https://github.com/Bin-Huang/chatbox)\n\n> Supports iOS, Android, and desktop with a modern, fully featured interface.\n\n### ✅ [FastGPT](https://github.com/labring/FastGPT)\n\n> Knowledge-base + workflow integration—ideal for enterprise training/customer support.\n\n### ✅ [AnythingLLM](https://github.com/Mintplex-Labs/anything-llm)\n\n> Supports local deployment and plugin extensions for privacy-conscious users.\n\n</details>\n\n---\n\n## 🌐 Third-Party API Providers\n\n<table border=\"1\" cellspacing=\"0\" cellpadding=\"6\">\n  <thead>\n    <tr><th>#</th><th>Platform</th><th>Link</th><th>Tags</th><th>Notes</th></tr>\n  </thead>\n  <tbody>\n    <tr><td>1</td><td>chat01 (recommended, invite code)</td><td><a href=\"https://chat01.ai/?ref=j45ikbTa\" target=\"_blank\">https://chat01.ai</a></td><td>🔓✌🎁💰✔</td><td>Supports Pro tier, fixes degraded responses, 2 free credits daily, chat + API on one site</td></tr>\n    <tr><td>2</td><td>SiliconFlow (enterprise)</td><td><a href=\"https://cloud.siliconflow.cn/i/ZKV30bdG\" target=\"_blank\">https://cloud.siliconflow.cn</a></td><td>🔓🎉🚀🚩✔</td><td>Huawei Cloud Ascend service with ¥14 signup bonus</td></tr>\n    <tr><td>3</td><td>zenmux (recommended, free Gemini 3 + images)</td><td><a href=\"https://zenmux.ai/invite/U1QU1H\" target=\"_blank\">https://zenmux.ai</a></td><td>🔓✌🎁💰</td><td>Free Gemini 3 Pro access, first aggregator offering compensation guarantees</td></tr>\n    <tr><td>4</td><td>PoloAPI</td><td><a href=\"https://poloai.top\" target=\"_blank\">https://poloai.top</a></td><td>🔓💪✌🎉🎁💰</td><td>New users receive $0.3 credit; aggregates Claude/Grok/OpenAI models</td></tr>\n    <tr><td>5</td><td>OAIPro</td><td><a href=\"https://api.oaipro.com\" target=\"_blank\">https://api.oaipro.com</a></td><td>💰✌💪</td><td>Official pricing, stable direct connectivity, supports OpenAI and Claude APIs</td></tr>\n    <tr><td>6</td><td>VoAPI</td><td><a href=\"https://demo.voapi.top\" target=\"_blank\">https://demo.voapi.top</a></td><td>🆓😆💪✌</td><td>Fully nonprofit site with balance reset every day</td></tr>\n    <tr><td>7</td><td>inscopilot (recommended)</td><td><a href=\"https://instcopilot-api.com/register?aff=Q2Z0\" target=\"_blank\">https://instcopilot-api.com</a></td><td>✌🎉😆🚀</td><td>$5 bonus, stable and affordable, supports credit cards</td></tr>\n    <tr><td>8</td><td>V3 API (hybrid)</td><td><a href=\"https://api.v3.cm\" target=\"_blank\">https://api.v3.cm</a></td><td>🚀🔓💪🎁🎉✌</td><td>$0.2 bonus, high concurrency, 30% recharge pricing, tons of models</td></tr>\n    <tr><td>9</td><td>V3 API (official relay)</td><td><a href=\"https://gf.gpt.ge\" target=\"_blank\">https://gf.gpt.ge</a></td><td>🚀🌹🔓💪</td><td>$0.2 bonus, high concurrency, recharge at 60% of face value</td></tr>\n    <tr><td>10</td><td>openai-hk</td><td><a href=\"https://openai-hk.com\" target=\"_blank\">https://openai-hk.com</a></td><td>🆓🔓🎉✌💪🚀</td><td>¥1 signup reward, ultra-high concurrency, includes GPT-3.5 public edition</td></tr>\n    <tr><td>11</td><td>ChatGPT API Faucet</td><td><a href=\"https://faucet.openkey.cloud\" target=\"_blank\">https://faucet.openkey.cloud</a></td><td>🆓</td><td>$1 free credit valid for 3 days</td></tr>\n    <tr><td>12</td><td>Charitable Free ChatGPT API</td><td><a href=\"https://github.com/popjane/free_chatgpt_api\" target=\"_blank\">GitHub</a></td><td>🆓</td><td>Completely free community API</td></tr>\n    <tr><td>13</td><td>GPT-API-free</td><td><a href=\"https://github.com/chuyuewei/ChatGPT-API\" target=\"_blank\">GitHub</a></td><td>🆓💪</td><td>Supports GPT-4 with three free requests per day</td></tr>\n    <tr><td>14</td><td>openkey</td><td><a href=\"https://openkey.cloud\" target=\"_blank\">https://openkey.cloud</a></td><td>🔓💪✌🚀</td><td>$0.2 bonus credit with multi-thread support</td></tr>\n    <tr><td>15</td><td>gptgod.online</td><td><a href=\"https://gptgod.online\" target=\"_blank\">https://gptgod.online</a></td><td>💪✌🎁💰🎉😆</td><td>Pay-per-use with a flexible credit system</td></tr>\n    <tr><td>16</td><td>m3.ckit.gold</td><td><a href=\"https://m3.ckit.gold\" target=\"_blank\">https://m3.ckit.gold</a></td><td>💰💪✌</td><td>3 RMB per USD, $0.1 signup bonus</td></tr>\n    <tr><td>17</td><td>iaicnn</td><td><a href=\"https://aicnn.cn\" target=\"_blank\">https://aicnn.cn</a></td><td>💪✌🎁💰🎉</td><td>Legacy API support available; services have migrated</td></tr>\n    <tr><td>18</td><td>goapi.gptnb.ai</td><td><a href=\"https://goapi.gptnb.ai\" target=\"_blank\">https://goapi.gptnb.ai</a></td><td>💪✌🎁💰🎉</td><td>—</td></tr>\n    <tr><td>19</td><td>api.aigc369.com</td><td><a href=\"https://api.aigc369.com/pricing\" target=\"_blank\">https://api.aigc369.com</a></td><td>💪✌🎁💰🎉</td><td>—</td></tr>\n    <tr><td>20</td><td>api.mjdjourney.cn</td><td><a href=\"https://api.mjdjourney.cn\" target=\"_blank\">https://api.mjdjourney.cn</a></td><td>💪✌🎁💰🎉</td><td>—</td></tr>\n    <tr><td>21</td><td>api.bltcy.ai</td><td><a href=\"https://api.bltcy.ai\" target=\"_blank\">https://api.bltcy.ai</a></td><td>💪✌🎁💰🎉</td><td>—</td></tr>\n    <tr><td>22</td><td>4Z API Relay</td><td><a href=\"https://zzzzapi.com\" target=\"_blank\">https://zzzzapi.com</a></td><td>🔓✌💪🎉🚀</td><td>Supports GPT-4o and Claude 3.5 with 0.2 bonus credit for new users</td></tr>\n    <tr><td>23</td><td>Jianyi API Relay</td><td><a href=\"https://jeniya.top\" target=\"_blank\">https://jeniya.top</a></td><td>🔓✌💪🎉🚀</td><td>Aggregates many models, unlimited domestic access, ¥100 testing credit on signup</td></tr>\n    <tr><td>24</td><td>CloseAI</td><td><a href=\"https://closeai-asia.com\" target=\"_blank\">https://closeai-asia.com</a></td><td>💰✌💪🎉🚀</td><td>Enterprise-grade proxy for GPT-4o & Claude 3.5 with Chinese technical support</td></tr>\n    <tr><td>25</td><td>Yunjing AI</td><td><a href=\"https://api.atalk-ai.com\" target=\"_blank\">https://api.atalk-ai.com</a></td><td>🔓✌💪🎉🚀</td><td>Aggregates ChatGPT, Claude, Wenxin Yiyan; ¥5 trial voucher for new users</td></tr>\n    <tr><td>26</td><td>ModelBridge</td><td><a href=\"https://model-bridge.okeeper.com\" target=\"_blank\">https://model-bridge.okeeper.com</a></td><td>🔓✌💪🎉🚀</td><td>Free domestic proxy compatible with OpenAI APIs and Chinese models</td></tr>\n    <tr><td>27</td><td>UiUi API</td><td><a href=\"https://sg.uiuiapi.com\" target=\"_blank\">https://sg.uiuiapi.com</a></td><td>🔓✌💪🎉🚀</td><td>Supports Claude 4, Gemini, and other models with OpenAI-compatible format</td></tr>\n    <tr><td>28</td><td>Old Zhang API Relay</td><td><a href=\"https://api.laozhang.ai\" target=\"_blank\">https://api.laozhang.ai</a></td><td>🔓✌💪🎉🚀</td><td>Supports Claude 3 and GPT-4o, ¥20 credit for new users, Alipay/WeChat payments</td></tr>\n    <tr><td>29</td><td>Haijing AI Aggregator</td><td><a href=\"https://ai.atalk-ai.com\" target=\"_blank\">https://ai.atalk-ai.com</a></td><td>🔓✌💪🎉🚀</td><td>ICP-registered domestic platform with unified multi-model API</td></tr>\n    <tr><td>30</td><td>One API</td><td><a href=\"https://one-api.ai\" target=\"_blank\">https://one-api.ai</a></td><td>🔓✌💪🎉🚀</td><td>Open-source interface manager for multi-model distribution and self-hosting</td></tr>\n    <tr><td>31</td><td>OpenRouter</td><td><a href=\"https://openrouter.ai\" target=\"_blank\">https://openrouter.ai</a></td><td>🔓✌💪🎉🚀</td><td>Supports 293+ models (OpenAI, Claude, Gemini) with complimentary quotas</td></tr>\n    <tr><td>32</td><td>Gemini API Proxy</td><td><a href=\"https://gemini-proxy.com\" target=\"_blank\">https://gemini-proxy.com</a></td><td>🔓✌🎉🚀</td><td>Google Gemini access with OpenAI-compatible interface and free credits</td></tr>\n    <tr><td>33</td><td>DeepSeek API Aggregator</td><td><a href=\"https://deepseek-aggregator.com\" target=\"_blank\">https://deepseek-aggregator.com</a></td><td>🔓💪🎉🚀</td><td>Bundles DeepSeek model family with complimentary testing quota</td></tr>\n    <tr><td>34</td><td>Hugging Face Model Proxy</td><td><a href=\"https://huggingface.co/inference-api\" target=\"_blank\">https://huggingface.co/inference-api</a></td><td>🔓💪🎉🚀</td><td>Access open-source models such as Llama 3 with free quota and enterprise support</td></tr>\n    <tr><td>35</td><td>AI21 Labs Official Proxy</td><td><a href=\"https://studio.ai21.com\" target=\"_blank\">https://studio.ai21.com</a></td><td>💰✌💪🎉</td><td>Supports Jurassic-2 models for advanced NLP workloads</td></tr>\n    <tr><td>36</td><td>Cohere API Proxy</td><td><a href=\"https://cohere.ai\" target=\"_blank\">https://cohere.ai</a></td><td>💰✌💪🎉</td><td>Enterprise-grade APIs for text generation, embeddings, and classification</td></tr>\n    <tr><td>37</td><td>AI API Aggregation Platform</td><td><a href=\"https://api.ai-aggregator.com\" target=\"_blank\">https://api.ai-aggregator.com</a></td><td>🔓✌💪🎉🚀</td><td>Unified interface with built-in load balancing across multiple models</td></tr>\n    <tr><td>38</td><td>AI.LS</td><td><a href=\"https://ai.ls\" target=\"_blank\">https://ai.ls</a></td><td>🆓✌</td><td>Minimalist endpoint offering free anonymous GPT-3.5 calls</td></tr>\n    <tr><td>39</td><td>Simple API</td><td><a href=\"https://jeniya.top\" target=\"_blank\">https://jeniya.top</a></td><td>🔓✌💪🎉🎁</td><td>¥100 signup credit with support for Claude/GPT-4o multi-model access</td></tr>\n    <tr><td>40</td><td>OpenAI120</td><td><a href=\"https://openai120.com\" target=\"_blank\">https://openai120.com</a></td><td>🔓✌🎁</td><td>$3 signup credit with official OpenAI pricing</td></tr>\n    <tr><td>41</td><td>DuckAGI</td><td><a href=\"https://duckagi.com\" target=\"_blank\">https://duckagi.com</a></td><td>💰✌🎉🚀</td><td>Multimodal GPT-4o/Sora support, ideal for AI art workflows</td></tr>\n    <tr><td>42</td><td>Aihubmix</td><td><a href=\"https://aihubmix.com\" target=\"_blank\">https://aihubmix.com</a></td><td>💰🎉</td><td>Aggregator for domestic models such as Wenxin Yiyan and Qwen</td></tr>\n    <tr><td>43</td><td>WokaAI</td><td><a href=\"https://wokaai.com\" target=\"_blank\">https://wokaai.com</a></td><td>✌</td><td>Dual-network routing for improved stability</td></tr>\n    <tr><td>44</td><td>azapi</td><td><a href=\"https://azapi.com.cn\" target=\"_blank\">https://azapi.com.cn</a></td><td>💰</td><td>Discounts available for long-term usage</td></tr>\n    <tr><td>45</td><td>ClaudeAPI</td><td><a href=\"https://claudeapi.io\" target=\"_blank\">https://claudeapi.io</a></td><td>💪🚀✔</td><td>Official Anthropic partner with document/file parsing support</td></tr>\n    <tr><td>46</td><td>Gala API</td><td><a href=\"https://galaapi.com\" target=\"_blank\">https://galaapi.com</a></td><td>🎉🚀</td><td>High-speed dedicated channel for Google Gemini</td></tr>\n    <tr><td>47</td><td>Google AI Studio</td><td><a href=\"https://ai.google.dev\" target=\"_blank\">https://ai.google.dev</a></td><td>🆓🌎✔</td><td>Gemini series fully free but requires international network access</td></tr>\n    <tr><td>48</td><td>OpenAI Data Sharing Program</td><td><a href=\"https://platform.openai.com\" target=\"_blank\">https://platform.openai.com</a></td><td>🔓✌🌎</td><td>Enable data sharing to earn up to 1M free tokens per day</td></tr>\n    <tr><td>49</td><td>Mistral AI La Plateforme</td><td><a href=\"https://platform.mistral.ai\" target=\"_blank\">https://platform.mistral.ai</a></td><td>🔓🎉🌎</td><td>Official platform with free trial credits (rate limited)</td></tr>\n    <tr><td>50</td><td>Cohere</td><td><a href=\"https://cohere.com\" target=\"_blank\">https://cohere.com</a></td><td>🔓🎉🌎</td><td>Trial key after signup; free calls with rate limits</td></tr>\n    <tr><td>51</td><td>ModelScope</td><td><a href=\"https://modelscope.cn\" target=\"_blank\">https://modelscope.cn</a></td><td>🔓🎉🚩</td><td>Aggregates DeepSeek/Qwen models with free trials and downloads</td></tr>\n    <tr><td>52</td><td>ByteDance Ark Collaboration Rewards</td><td><a href=\"https://www.volcengine.com/product/ark\" target=\"_blank\">https://www.volcengine.com/product/ark</a></td><td>🔓🎉</td><td>Participating teams receive 500K tokens per model each day</td></tr>\n    <tr><td>53</td><td>BigModel (Zhipu)</td><td><a href=\"https://open.bigmodel.cn\" target=\"_blank\">https://open.bigmodel.cn</a></td><td>🆓🎉</td><td>GLM-4-Flash API is completely free with 128K context</td></tr>\n    <tr><td>54</td><td>InternLM</td><td><a href=\"https://internlm.intern-ai.org.cn\" target=\"_blank\">https://internlm.intern-ai.org.cn</a></td><td>🆓🎉</td><td>Official free API access with direct invocation</td></tr>\n    <tr><td>55</td><td>GitHub Models</td><td><a href=\"https://docs.github.com/github-models\" target=\"_blank\">https://docs.github.com/github-models</a></td><td>🔓✌🎉🌎</td><td>Azure-hosted service with limited complimentary quota</td></tr>\n    <tr><td>56</td><td>OpenRouter (free tier)</td><td><a href=\"https://openrouter.ai\" target=\"_blank\">https://openrouter.ai</a></td><td>🔓💪✌🎉🌎✔</td><td>Free models allow ≤50 calls/day; balance ≥$10 increases limit to 1000</td></tr>\n    <tr><td>57</td><td>Chutes</td><td><a href=\"https://chutes.ai\" target=\"_blank\">https://chutes.ai</a></td><td>🔓🎉</td><td>Up to 200 free requests per day on select models, supports DeepSeek</td></tr>\n    <tr><td>58</td><td>Groq Cloud</td><td><a href=\"https://groq.com/groqcloud\" target=\"_blank\">https://groq.com/groqcloud</a></td><td>🔓🎉🌎</td><td>Apply for a free API key, OpenAI-compatible endpoints with extreme speed</td></tr>\n    <tr><td>59</td><td>Cerebras Inference</td><td><a href=\"https://inference.cerebras.ai\" target=\"_blank\">https://inference.cerebras.ai</a></td><td>🔓🎉🌎🚀</td><td>1M free tokens per day and up to 450+ tok/s inference throughput</td></tr>\n    <tr><td>60</td><td>Infini GenStudio</td><td><a href=\"https://cloud.infini-ai.com/genstudio\" target=\"_blank\">https://cloud.infini-ai.com/genstudio</a></td><td>🆓🎉</td><td>DeepSeek R1/V3 full-power tokens are free—no invite code required</td></tr>\n  </tbody>\n</table>\n\n---\n\n## 📖 How to Use\n\n1. 🔑 Get the API key: register on the target platform and copy it from your dashboard\n2. ⚙ Configure the endpoint: paste the API base URL into a supported application\n3. 🤖 Choose models: switch between Claude / GPT / Gemini / DeepSeek based on availability\n4. 📊 Monitor usage: enable built-in quota limits or alerts inside your client of choice\n\n---\n\n## 🙌 Contribution Guide\n\nWe welcome:\n\n* ✨ New API providers (must remain stable for ≥ 3 days)\n* 🧰 Additional tutorials (configuration screenshots, screen recordings)\n* 🧪 Verification scripts (automated detection of inactive platforms)\n* 🌍 Translations (English, Japanese, Korean, etc.)\n\n> Please submit a Pull Request or open an Issue—we respond as quickly as possible!\n\n---\n\n## ❌ Inactive Platforms\n\n<details>\n<summary>📛 Click to view inactive platforms</summary>\n\n| # | Name   | Link                                     | Status        |\n| - | ------ | ---------------------------------------- | ------------- |\n| 1 | 464888 | [api.464888.xyz](https://api.464888.xyz) | ❌ Unavailable |\n\n> If you discover another inactive platform, feel free to open an Issue!\n\n</details>\n\n---\n\n## ⚖️ Disclaimer\n\n* We do not store any API keys, nor do we offer proxy or relay services.\n* All platforms are sourced from the public internet; use them at your own risk.\n* The authors are not responsible for any loss caused by third-party services.\n\n---\n\n## 🙏 Special Thanks\n\nMany thanks to zenmux for providing API platform support!  \n[Register now and use the promo code](https://zenmux.ai/invite/U1QU1H)\n\nMany thanks to chat01 for providing service support!  \n[Visit chat01 and use the referral code](https://chat01.ai/?ref=j45ikbTa)\n\n[![Powered by DartNode](https://dartnode.com/branding/DN-Open-Source-sm.png)](https://dartnode.com \"Powered by DartNode - Free VPS for Open Source\")\n\n---\n\n[![Star History](https://api.star-history.com/svg?repos=TechnologyStar/Openai-Claude-Deepseek-API-provider&type=Date)](https://star-history.com/#TechnologyStar/Openai-Claude-Deepseek-API-provider&Date)\nMade with ❤️ by [TechnologyStar](https://github.com/TechnologyStar)\n"
  },
  {
    "path": "fr.md",
    "content": "# 🌐 Openai / Claude / Deepseek API Provider\n\n[![Last Commit](https://img.shields.io/github/last-commit/TechnologyStar/Openai-Claude-Deepseek-API-provider)](https://github.com/TechnologyStar/Openai-Claude-Deepseek-API-provider)\n[![License](https://img.shields.io/github/license/TechnologyStar/Openai-Claude-Deepseek-API-provider)](https://github.com/TechnologyStar/Openai-Claude-Deepseek-API-provider/blob/main/LICENSE)\n\n> 🏗️ Liste sélectionnée de plateformes tierces fournissant des API **OpenAI / Claude / DeepSeek** pour l'apprentissage, la recherche et un usage non commercial.\n\n<p align=\"center\">\n  <a href=\"README.md\" title=\"中文\"><img src=\"https://img.shields.io/badge/🇨🇳 中文-阅读-blue?style=flat-square\" alt=\"中文版\"/></a>\n  <a href=\"en.md\" title=\"English\"><img src=\"https://img.shields.io/badge/🇬🇧 English-Read-blue?style=flat-square\" alt=\"English\"/></a>\n  <a href=\"ru.md\" title=\"Русский\"><img src=\"https://img.shields.io/badge/🇷🇺 Русский-Читать-blue?style=flat-square\" alt=\"Русская версия\"/></a>\n  <a href=\"fr.md\" title=\"Français\"><img src=\"https://img.shields.io/badge/🇫🇷 Français-Lire-blue?style=flat-square\" alt=\"Version Française\"/></a>\n</p>\n\n---\n\n> ⚠️ **Instructions d'utilisation**\n>\n> Ce projet est gratuit et à but non lucratif. Toute utilisation illégale est strictement interdite.\n> **Nous n'incluons pas les sites internes des forums IA. Si un site a été ajouté par erreur, veuillez nous contacter pour son retrait. Après évaluation, nous compenserons les erreurs de référencement vérifiées.**\n> * Respectez les [conditions d'utilisation d'OpenAI](https://openai.com/policies/terms-of-use)\n> * Conformez-vous aux [mesures provisoires pour l'administration des services d'IA générative](http://www.cac.gov.cn/2023-07/13/c_1690898327029107.htm)—**ne fournissez pas de services d'IA générative non enregistrés au public en Chine**\n> * Site officiel : [Openai / Claude / Deepseek API Provider](https://d706445b-7658-4708-bb08-bac6c5a775ad-00-2z2hsdckl4fie.riker.replit.dev/)\n\n---\n\n## 🚀 Présentation du projet\n\n* 📌 Collecte et vérifie les fournisseurs d'API tiers disponibles sur Internet (certains sont gratuits)\n* 🔧 Sans inscription / accès en un clic / support multi-modèles (OpenAI, Claude, DeepSeek, etc.)\n* 🔒 Les sites sont répertoriés à titre indicatif uniquement—**n'entrez jamais d'informations personnelles sensibles**\n\n> 💡 Si ce projet vous est utile, n'hésitez pas à laisser une étoile 🌟\n\n---\n\n## 🎁 Légende des étiquettes\n\n| Étiquette | Signification                                      |\n| --------- | -------------------------------------------------- |\n| 🆓        | Entièrement gratuit                                |\n| 🔓        | Quota gratuit disponible                           |\n| 💰        | Paiement requis                                    |\n| 💪        | Support de Claude dernière version                 |\n| ✌         | Support d'OpenAI dernière version                  |\n| 🎉        | Autres modèles supportés (ex. DeepSeek)            |\n| 🌎        | Nécessite un accès réseau international            |\n| 🎁        | Bonus de recharge ou crédits promotionnels         |\n| 🚀        | Support de haute concurrence                       |\n| 😆        | Récompenses de connexion quotidienne               |\n| 🚩        | Plateforme enregistrée / conforme ICP              |\n| ✔         | Authenticité vérifiée manuellement                 |\n\n---\n\n## 📱 Applications compatibles\n\n<details>\n<summary>📦 Cliquez pour voir la liste des applications compatibles</summary>\n\n### ✅ [Cherry Studio](https://github.com/CherryHQ/cherry-studio)\n\n> Client multiplateforme desktop + mobile intégrant les services cloud d'IA grand public et les modèles locaux.\n\n### ✅ [Plugin ChatGPT Friends (uTools)](https://u.tools/plugins/detail/ChatGPT.%E5%A5%BD%E5%8F%8B/)\n\n> Plugin de chat IA desktop avec préréglages de rôles, multi-modèles et gestion multi-sessions.\n\n### ✅ [ChatGPT-Next-Web](https://github.com/Yidadaa/ChatGPT-Next-Web)\n\n> Interface web open source pour ChatGPT avec support de clé API et collaboration multi-utilisateurs.\n\n### ✅ [LobeChat](https://github.com/lobehub/lobe-chat)\n\n> Framework de chat IA web avec vision, parole et changement de modèle.\n\n### ✅ [BotGem](https://botgem.com/)\n\n> Design mobile-first avec conversations vocales et système de compagnon IA.\n\n### ✅ [ChatBox](https://github.com/Bin-Huang/chatbox)\n\n> Compatible iOS, Android et desktop avec une interface moderne et complète.\n\n### ✅ [FastGPT](https://github.com/labring/FastGPT)\n\n> Intégration base de connaissances + flux de travail—idéal pour la formation en entreprise/support client.\n\n### ✅ [AnythingLLM](https://github.com/Mintplex-Labs/anything-llm)\n\n> Support du déploiement local et des extensions de plugin pour les utilisateurs soucieux de la confidentialité.\n\n</details>\n\n---\n\n## 🌐 Fournisseurs d'API tiers\n\n<table border=\"1\" cellspacing=\"0\" cellpadding=\"6\">\n  <thead>\n    <tr><th>#</th><th>Plateforme</th><th>Lien</th><th>Étiquettes</th><th>Remarques</th></tr>\n  </thead>\n  <tbody>\n    <tr><td>1</td><td>chat01 (recommandé, code d'invitation)</td><td><a href=\"https://chat01.ai/?ref=j45ikbTa\" target=\"_blank\">https://chat01.ai</a></td><td>🔓✌🎁💰✔</td><td>Support niveau Pro, corrige les réponses dégradées, 2 crédits gratuits par jour, chat + API sur un même site</td></tr>\n    <tr><td>2</td><td>SiliconFlow (entreprise)</td><td><a href=\"https://cloud.siliconflow.cn/i/ZKV30bdG\" target=\"_blank\">https://cloud.siliconflow.cn</a></td><td>🔓🎉🚀🚩✔</td><td>Service Huawei Cloud Ascend avec bonus de 14 ¥ à l'inscription</td></tr>\n    <tr><td>3</td><td>zenmux (recommandé, Gemini 3 gratuit + images)</td><td><a href=\"https://zenmux.ai/invite/U1QU1H\" target=\"_blank\">https://zenmux.ai</a></td><td>🔓✌🎁💰</td><td>Accès gratuit Gemini 3 Pro, premier agrégateur offrant des garanties de compensation</td></tr>\n    <tr><td>4</td><td>PoloAPI</td><td><a href=\"https://poloai.top\" target=\"_blank\">https://poloai.top</a></td><td>🔓💪✌🎉🎁💰</td><td>Les nouveaux utilisateurs reçoivent 0,3 $ de crédit ; agrège les modèles Claude/Grok/OpenAI</td></tr>\n    <tr><td>5</td><td>OAIPro</td><td><a href=\"https://api.oaipro.com\" target=\"_blank\">https://api.oaipro.com</a></td><td>💰✌💪</td><td>Tarification officielle, connectivité directe stable, supporte les API OpenAI et Claude</td></tr>\n    <tr><td>6</td><td>VoAPI</td><td><a href=\"https://demo.voapi.top\" target=\"_blank\">https://demo.voapi.top</a></td><td>🆓😆💪✌</td><td>Site entièrement à but non lucratif avec réinitialisation du solde chaque jour</td></tr>\n    <tr><td>7</td><td>inscopilot (recommandé)</td><td><a href=\"https://instcopilot-api.com/register?aff=Q2Z0\" target=\"_blank\">https://instcopilot-api.com</a></td><td>✌🎉😆🚀</td><td>Bonus de 5 $, stable et abordable, supporte les cartes de crédit</td></tr>\n    <tr><td>8</td><td>V3 API (hybride)</td><td><a href=\"https://api.v3.cm\" target=\"_blank\">https://api.v3.cm</a></td><td>🚀🔓💪🎁🎉✌</td><td>Bonus de 0,2 $, haute concurrence, recharge à 30 %, nombreux modèles</td></tr>\n    <tr><td>9</td><td>V3 API (relais officiel)</td><td><a href=\"https://gf.gpt.ge\" target=\"_blank\">https://gf.gpt.ge</a></td><td>🚀🌹🔓💪</td><td>Bonus de 0,2 $, haute concurrence, recharge à 60 % de la valeur nominale</td></tr>\n    <tr><td>10</td><td>openai-hk</td><td><a href=\"https://openai-hk.com\" target=\"_blank\">https://openai-hk.com</a></td><td>🆓🔓🎉✌💪🚀</td><td>Récompense d'inscription de 1 ¥, concurrence ultra-élevée, inclut l'édition publique GPT-3.5</td></tr>\n    <tr><td>11</td><td>ChatGPT API Faucet</td><td><a href=\"https://faucet.openkey.cloud\" target=\"_blank\">https://faucet.openkey.cloud</a></td><td>🆓</td><td>1 $ de crédit gratuit valable 3 jours</td></tr>\n    <tr><td>12</td><td>ChatGPT API caritative gratuite</td><td><a href=\"https://github.com/popjane/free_chatgpt_api\" target=\"_blank\">GitHub</a></td><td>🆓</td><td>API communautaire entièrement gratuite</td></tr>\n    <tr><td>13</td><td>GPT-API-free</td><td><a href=\"https://github.com/chuyuewei/ChatGPT-API\" target=\"_blank\">GitHub</a></td><td>🆓💪</td><td>Supporte GPT-4 avec trois requêtes gratuites par jour</td></tr>\n    <tr><td>14</td><td>openkey</td><td><a href=\"https://openkey.cloud\" target=\"_blank\">https://openkey.cloud</a></td><td>🔓💪✌🚀</td><td>Crédit bonus de 0,2 $ avec support multi-thread</td></tr>\n    <tr><td>15</td><td>gptgod.online</td><td><a href=\"https://gptgod.online\" target=\"_blank\">https://gptgod.online</a></td><td>💪✌🎁💰🎉😆</td><td>Paiement à l'utilisation avec système de crédit flexible</td></tr>\n    <tr><td>16</td><td>m3.ckit.gold</td><td><a href=\"https://m3.ckit.gold\" target=\"_blank\">https://m3.ckit.gold</a></td><td>💰💪✌</td><td>3 RMB par USD, bonus d'inscription de 0,1 $</td></tr>\n    <tr><td>17</td><td>iaicnn</td><td><a href=\"https://aicnn.cn\" target=\"_blank\">https://aicnn.cn</a></td><td>💪✌🎁💰🎉</td><td>Support API legacy disponible ; les services ont migré</td></tr>\n    <tr><td>18</td><td>goapi.gptnb.ai</td><td><a href=\"https://goapi.gptnb.ai\" target=\"_blank\">https://goapi.gptnb.ai</a></td><td>💪✌🎁💰🎉</td><td>—</td></tr>\n    <tr><td>19</td><td>api.aigc369.com</td><td><a href=\"https://api.aigc369.com/pricing\" target=\"_blank\">https://api.aigc369.com</a></td><td>💪✌🎁💰🎉</td><td>—</td></tr>\n    <tr><td>20</td><td>api.mjdjourney.cn</td><td><a href=\"https://api.mjdjourney.cn\" target=\"_blank\">https://api.mjdjourney.cn</a></td><td>💪✌🎁💰🎉</td><td>—</td></tr>\n    <tr><td>21</td><td>api.bltcy.ai</td><td><a href=\"https://api.bltcy.ai\" target=\"_blank\">https://api.bltcy.ai</a></td><td>💪✌🎁💰🎉</td><td>—</td></tr>\n    <tr><td>22</td><td>4Z API Relay</td><td><a href=\"https://zzzzapi.com\" target=\"_blank\">https://zzzzapi.com</a></td><td>🔓✌💪🎉🚀</td><td>Supporte GPT-4o et Claude 3.5 avec crédit bonus de 0,2 pour les nouveaux utilisateurs</td></tr>\n    <tr><td>23</td><td>Jianyi API Relay</td><td><a href=\"https://jeniya.top\" target=\"_blank\">https://jeniya.top</a></td><td>🔓✌💪🎉🚀</td><td>Agrège de nombreux modèles, accès domestique illimité, crédit de test de 100 ¥ à l'inscription</td></tr>\n    <tr><td>24</td><td>CloseAI</td><td><a href=\"https://closeai-asia.com\" target=\"_blank\">https://closeai-asia.com</a></td><td>💰✌💪🎉🚀</td><td>Proxy de niveau entreprise pour GPT-4o et Claude 3.5 avec support technique en chinois</td></tr>\n    <tr><td>25</td><td>Yunjing AI</td><td><a href=\"https://api.atalk-ai.com\" target=\"_blank\">https://api.atalk-ai.com</a></td><td>🔓✌💪🎉🚀</td><td>Agrège ChatGPT, Claude, Wenxin Yiyan ; bon d'essai de 5 ¥ pour nouveaux utilisateurs</td></tr>\n    <tr><td>26</td><td>ModelBridge</td><td><a href=\"https://model-bridge.okeeper.com\" target=\"_blank\">https://model-bridge.okeeper.com</a></td><td>🔓✌💪🎉🚀</td><td>Proxy domestique gratuit compatible avec les API OpenAI et les modèles chinois</td></tr>\n    <tr><td>27</td><td>UiUi API</td><td><a href=\"https://sg.uiuiapi.com\" target=\"_blank\">https://sg.uiuiapi.com</a></td><td>🔓✌💪🎉🚀</td><td>Supporte Claude 4, Gemini et autres modèles au format compatible OpenAI</td></tr>\n    <tr><td>28</td><td>Old Zhang API Relay</td><td><a href=\"https://api.laozhang.ai\" target=\"_blank\">https://api.laozhang.ai</a></td><td>🔓✌💪🎉🚀</td><td>Supporte Claude 3 et GPT-4o, crédit de 20 ¥ pour nouveaux utilisateurs, paiements Alipay/WeChat</td></tr>\n    <tr><td>29</td><td>Haijing AI Aggregator</td><td><a href=\"https://ai.atalk-ai.com\" target=\"_blank\">https://ai.atalk-ai.com</a></td><td>🔓✌💪🎉🚀</td><td>Plateforme domestique enregistrée ICP avec API multi-modèles unifiée</td></tr>\n    <tr><td>30</td><td>One API</td><td><a href=\"https://one-api.ai\" target=\"_blank\">https://one-api.ai</a></td><td>🔓✌💪🎉🚀</td><td>Gestionnaire d'interface open source pour distribution multi-modèles et auto-hébergement</td></tr>\n    <tr><td>31</td><td>OpenRouter</td><td><a href=\"https://openrouter.ai\" target=\"_blank\">https://openrouter.ai</a></td><td>🔓✌💪🎉🚀</td><td>Supporte 293+ modèles (OpenAI, Claude, Gemini) avec quotas gratuits</td></tr>\n    <tr><td>32</td><td>Gemini API Proxy</td><td><a href=\"https://gemini-proxy.com\" target=\"_blank\">https://gemini-proxy.com</a></td><td>🔓✌🎉🚀</td><td>Accès Google Gemini avec interface compatible OpenAI et crédits gratuits</td></tr>\n    <tr><td>33</td><td>DeepSeek API Aggregator</td><td><a href=\"https://deepseek-aggregator.com\" target=\"_blank\">https://deepseek-aggregator.com</a></td><td>🔓💪🎉🚀</td><td>Regroupe la famille de modèles DeepSeek avec quota de test gratuit</td></tr>\n    <tr><td>34</td><td>Hugging Face Model Proxy</td><td><a href=\"https://huggingface.co/inference-api\" target=\"_blank\">https://huggingface.co/inference-api</a></td><td>🔓💪🎉🚀</td><td>Accès aux modèles open source comme Llama 3 avec quota gratuit et support entreprise</td></tr>\n    <tr><td>35</td><td>AI21 Labs Official Proxy</td><td><a href=\"https://studio.ai21.com\" target=\"_blank\">https://studio.ai21.com</a></td><td>💰✌💪🎉</td><td>Supporte les modèles Jurassic-2 pour charges de travail NLP avancées</td></tr>\n    <tr><td>36</td><td>Cohere API Proxy</td><td><a href=\"https://cohere.ai\" target=\"_blank\">https://cohere.ai</a></td><td>💰✌💪🎉</td><td>API de niveau entreprise pour génération de texte, embeddings et classification</td></tr>\n    <tr><td>37</td><td>AI API Aggregation Platform</td><td><a href=\"https://api.ai-aggregator.com\" target=\"_blank\">https://api.ai-aggregator.com</a></td><td>🔓✌💪🎉🚀</td><td>Interface unifiée avec équilibrage de charge intégré entre plusieurs modèles</td></tr>\n    <tr><td>38</td><td>AI.LS</td><td><a href=\"https://ai.ls\" target=\"_blank\">https://ai.ls</a></td><td>🆓✌</td><td>Point de terminaison minimaliste offrant des appels GPT-3.5 anonymes gratuits</td></tr>\n    <tr><td>39</td><td>Simple API</td><td><a href=\"https://jeniya.top\" target=\"_blank\">https://jeniya.top</a></td><td>🔓✌💪🎉🎁</td><td>Crédit d'inscription de 100 ¥ avec support pour accès multi-modèles Claude/GPT-4o</td></tr>\n    <tr><td>40</td><td>OpenAI120</td><td><a href=\"https://openai120.com\" target=\"_blank\">https://openai120.com</a></td><td>🔓✌🎁</td><td>Crédit d'inscription de 3 $ avec tarification officielle OpenAI</td></tr>\n    <tr><td>41</td><td>DuckAGI</td><td><a href=\"https://duckagi.com\" target=\"_blank\">https://duckagi.com</a></td><td>💰✌🎉🚀</td><td>Support multimodal GPT-4o/Sora, idéal pour workflows d'art IA</td></tr>\n    <tr><td>42</td><td>Aihubmix</td><td><a href=\"https://aihubmix.com\" target=\"_blank\">https://aihubmix.com</a></td><td>💰🎉</td><td>Agrégateur pour modèles domestiques tels que Wenxin Yiyan et Qwen</td></tr>\n    <tr><td>43</td><td>WokaAI</td><td><a href=\"https://wokaai.com\" target=\"_blank\">https://wokaai.com</a></td><td>✌</td><td>Routage bi-réseau pour stabilité améliorée</td></tr>\n    <tr><td>44</td><td>azapi</td><td><a href=\"https://azapi.com.cn\" target=\"_blank\">https://azapi.com.cn</a></td><td>💰</td><td>Remises disponibles pour utilisation à long terme</td></tr>\n    <tr><td>45</td><td>ClaudeAPI</td><td><a href=\"https://claudeapi.io\" target=\"_blank\">https://claudeapi.io</a></td><td>💪🚀✔</td><td>Partenaire officiel Anthropic avec support d'analyse de documents/fichiers</td></tr>\n    <tr><td>46</td><td>Gala API</td><td><a href=\"https://galaapi.com\" target=\"_blank\">https://galaapi.com</a></td><td>🎉🚀</td><td>Canal dédié haute vitesse pour Google Gemini</td></tr>\n    <tr><td>47</td><td>Google AI Studio</td><td><a href=\"https://ai.google.dev\" target=\"_blank\">https://ai.google.dev</a></td><td>🆓🌎✔</td><td>Série Gemini entièrement gratuite mais nécessite un accès réseau international</td></tr>\n    <tr><td>48</td><td>OpenAI Data Sharing Program</td><td><a href=\"https://platform.openai.com\" target=\"_blank\">https://platform.openai.com</a></td><td>🔓✌🌎</td><td>Activez le partage de données pour gagner jusqu'à 1M de tokens gratuits par jour</td></tr>\n    <tr><td>49</td><td>Mistral AI La Plateforme</td><td><a href=\"https://platform.mistral.ai\" target=\"_blank\">https://platform.mistral.ai</a></td><td>🔓🎉🌎</td><td>Plateforme officielle avec crédits d'essai gratuits (limité en débit)</td></tr>\n    <tr><td>50</td><td>Cohere</td><td><a href=\"https://cohere.com\" target=\"_blank\">https://cohere.com</a></td><td>🔓🎉🌎</td><td>Clé d'essai après inscription ; appels gratuits avec limites de débit</td></tr>\n    <tr><td>51</td><td>ModelScope</td><td><a href=\"https://modelscope.cn\" target=\"_blank\">https://modelscope.cn</a></td><td>🔓🎉🚩</td><td>Agrège modèles DeepSeek/Qwen avec essais et téléchargements gratuits</td></tr>\n    <tr><td>52</td><td>ByteDance Ark Collaboration Rewards</td><td><a href=\"https://www.volcengine.com/product/ark\" target=\"_blank\">https://www.volcengine.com/product/ark</a></td><td>🔓🎉</td><td>Les équipes participantes reçoivent 500K tokens par modèle chaque jour</td></tr>\n    <tr><td>53</td><td>BigModel (Zhipu)</td><td><a href=\"https://open.bigmodel.cn\" target=\"_blank\">https://open.bigmodel.cn</a></td><td>🆓🎉</td><td>L'API GLM-4-Flash est entièrement gratuite avec contexte 128K</td></tr>\n    <tr><td>54</td><td>InternLM</td><td><a href=\"https://internlm.intern-ai.org.cn\" target=\"_blank\">https://internlm.intern-ai.org.cn</a></td><td>🆓🎉</td><td>Accès API officiel gratuit avec invocation directe</td></tr>\n    <tr><td>55</td><td>GitHub Models</td><td><a href=\"https://docs.github.com/github-models\" target=\"_blank\">https://docs.github.com/github-models</a></td><td>🔓✌🎉🌎</td><td>Service hébergé Azure avec quota gratuit limité</td></tr>\n    <tr><td>56</td><td>OpenRouter (niveau gratuit)</td><td><a href=\"https://openrouter.ai\" target=\"_blank\">https://openrouter.ai</a></td><td>🔓💪✌🎉🌎✔</td><td>Les modèles gratuits autorisent ≤50 appels/jour ; solde ≥10 $ augmente la limite à 1000</td></tr>\n    <tr><td>57</td><td>Chutes</td><td><a href=\"https://chutes.ai\" target=\"_blank\">https://chutes.ai</a></td><td>🔓🎉</td><td>Jusqu'à 200 requêtes gratuites par jour sur certains modèles, supporte DeepSeek</td></tr>\n    <tr><td>58</td><td>Groq Cloud</td><td><a href=\"https://groq.com/groqcloud\" target=\"_blank\">https://groq.com/groqcloud</a></td><td>🔓🎉🌎</td><td>Demandez une clé API gratuite, points de terminaison compatibles OpenAI avec vitesse extrême</td></tr>\n    <tr><td>59</td><td>Cerebras Inference</td><td><a href=\"https://inference.cerebras.ai\" target=\"_blank\">https://inference.cerebras.ai</a></td><td>🔓🎉🌎🚀</td><td>1M de tokens gratuits par jour et débit d'inférence jusqu'à 450+ tok/s</td></tr>\n    <tr><td>60</td><td>Infini GenStudio</td><td><a href=\"https://cloud.infini-ai.com/genstudio\" target=\"_blank\">https://cloud.infini-ai.com/genstudio</a></td><td>🆓🎉</td><td>Les tokens DeepSeek R1/V3 pleine puissance sont gratuits—aucun code d'invitation requis</td></tr>\n  </tbody>\n</table>\n\n---\n\n## 📖 Guide d'utilisation\n\n1. 🔑 Obtenez la clé API : inscrivez-vous sur la plateforme cible et copiez-la depuis votre tableau de bord\n2. ⚙ Configurez le point de terminaison : collez l'URL de base de l'API dans une application compatible\n3. 🤖 Choisissez les modèles : basculez entre Claude / GPT / Gemini / DeepSeek selon la disponibilité\n4. 📊 Surveillez l'utilisation : activez les limites de quota intégrées ou les alertes dans votre client de choix\n\n---\n\n## 🙌 Guide de contribution\n\nNous accueillons :\n\n* ✨ Nouveaux fournisseurs d'API (doivent rester stables pendant ≥ 3 jours)\n* 🧰 Tutoriels supplémentaires (captures d'écran de configuration, enregistrements d'écran)\n* 🧪 Scripts de vérification (détection automatisée des plateformes inactives)\n* 🌍 Traductions (anglais, japonais, coréen, etc.)\n\n> Veuillez soumettre une Pull Request ou ouvrir une Issue—nous répondons aussi rapidement que possible !\n\n---\n\n## ❌ Plateformes inactives\n\n<details>\n<summary>📛 Cliquez pour voir les plateformes inactives</summary>\n\n| # | Nom    | Lien                                     | Statut         |\n| - | ------ | ---------------------------------------- | -------------- |\n| 1 | 464888 | [api.464888.xyz](https://api.464888.xyz) | ❌ Indisponible |\n\n> Si vous découvrez une autre plateforme inactive, n'hésitez pas à ouvrir une Issue !\n\n</details>\n\n---\n\n## ⚖️ Avertissement\n\n* Nous ne stockons aucune clé API et n'offrons pas de services de proxy ou de relais.\n* Toutes les plateformes proviennent de l'Internet public ; utilisez-les à vos propres risques.\n* Les auteurs ne sont pas responsables des pertes causées par des services tiers.\n\n---\n\n## 🙏 Remerciements spéciaux\n\nUn grand merci à zenmux pour avoir fourni le support de plateforme API !  \n[Inscrivez-vous maintenant et utilisez le code promo](https://zenmux.ai/invite/U1QU1H)\n\nUn grand merci à chat01 pour avoir fourni le support de service !  \n[Visitez chat01 et utilisez le code de parrainage](https://chat01.ai/?ref=j45ikbTa)\n\n[![Powered by DartNode](https://dartnode.com/branding/DN-Open-Source-sm.png)](https://dartnode.com \"Powered by DartNode - Free VPS for Open Source\")\n\n---\n\n[![Star History](https://api.star-history.com/svg?repos=TechnologyStar/Openai-Claude-Deepseek-API-provider&type=Date)](https://star-history.com/#TechnologyStar/Openai-Claude-Deepseek-API-provider&Date)\nRéalisé avec ❤️ par [TechnologyStar](https://github.com/TechnologyStar)\n"
  },
  {
    "path": "ru.md",
    "content": "# 🌐 Поставщики API Openai / Claude / Deepseek\n\n[![Last Commit](https://img.shields.io/github/last-commit/TechnologyStar/Openai-Claude-Deepseek-API-provider)](https://github.com/TechnologyStar/Openai-Claude-Deepseek-API-provider)\n[![License](https://img.shields.io/github/license/TechnologyStar/Openai-Claude-Deepseek-API-provider)](https://github.com/TechnologyStar/Openai-Claude-Deepseek-API-provider/blob/main/LICENSE)\n\n> 🏗️ Курированный список сторонних платформ, предоставляющих API **OpenAI / Claude / DeepSeek** для обучения, исследований и некоммерческого использования.\n\n<p align=\"center\">\n  <a href=\"README.md\" title=\"中文\"><img src=\"https://img.shields.io/badge/🇨🇳 中文-阅读-blue?style=flat-square\" alt=\"中文版\"/></a>\n  <a href=\"en.md\" title=\"English\"><img src=\"https://img.shields.io/badge/🇬🇧 English-Read-blue?style=flat-square\" alt=\"English\"/></a>\n  <a href=\"ru.md\" title=\"Русский\"><img src=\"https://img.shields.io/badge/🇷🇺 Русский-Читать-blue?style=flat-square\" alt=\"Русская версия\"/></a>\n  <a href=\"fr.md\" title=\"Français\"><img src=\"https://img.shields.io/badge/🇫🇷 Français-Lire-blue?style=flat-square\" alt=\"Version Française\"/></a>\n</p>\n\n---\n\n> ⚠️ **Инструкция по использованию**\n>\n> Проект бесплатный и некоммерческий. Любое незаконное использование запрещено.\n> **Мы не включаем закрытые сайты AI-форумов. Если ресурс добавлен по ошибке, свяжитесь с нами для удаления. После проверки мы компенсируем подтверждённые неверные добавления.**\n> * Соблюдайте [условия использования OpenAI](https://openai.com/policies/terms-of-use)\n> * Соблюдайте [Временные правила управления сервисами генеративного ИИ](http://www.cac.gov.cn/2023-07/13/c_1690898327029107.htm) — **не предоставляйте незарегистрированные сервисы генеративного ИИ пользователям в Китае**\n> * Официальный сайт: [Openai / Claude / Deepseek API Provider](https://d706445b-7658-4708-bb08-bac6c5a775ad-00-2z2hsdckl4fie.riker.replit.dev/)\n\n---\n\n## 🚀 Описание проекта\n\n* 📌 Собирает и проверяет сторонние платформы API в интернете (часть из них бесплатные)\n* 🔧 Без регистрации / подключение в один клик / поддержка нескольких моделей (OpenAI, Claude, DeepSeek и др.)\n* 🔒 Сайты приведены только для справки — **не вводите конфиденциальные данные**\n\n> 💡 Если проект оказался полезным, поставьте звезду 🌟\n\n---\n\n## 🎁 Обозначения меток\n\n| Метка | Значение                                   |\n| ----- | ------------------------------------------ |\n| 🆓    | Полностью бесплатно                        |\n| 🔓    | Есть бесплатный лимит                      |\n| 💰    | Требуется оплата                           |\n| 💪    | Поддержка последних моделей Claude         |\n| ✌     | Поддержка последних моделей OpenAI         |\n| 🎉    | Поддерживаются другие модели (например, DeepSeek) |\n| 🌎    | Нужен международный доступ в интернет      |\n| 🎁    | Бонус при пополнении или промокод          |\n| 🚀    | Поддерживается высокая нагрузка            |\n| 😆    | Ежедневные бонусы за вход                  |\n| 🚩    | Платформа с ICP/официальной регистрацией   |\n| ✔     | Подлинность вручную подтверждена           |\n\n---\n\n## 📱 Рекомендуемые приложения\n\n<details>\n<summary>📦 Нажмите, чтобы увидеть список совместимых приложений</summary>\n\n### ✅ [Cherry Studio](https://github.com/CherryHQ/cherry-studio)\n\n> Кроссплатформенный клиент (desktop + mobile), объединяющий облачные ИИ-сервисы и локальные модели.\n\n### ✅ [Плагин ChatGPT Friends (uTools)](https://u.tools/plugins/detail/ChatGPT.%E5%A5%BD%E5%8F%8B/)\n\n> Настольный плагин для интеллекта-чата с ролями, несколькими моделями и сессиями.\n\n### ✅ [ChatGPT-Next-Web](https://github.com/Yidadaa/ChatGPT-Next-Web)\n\n> Open-source веб-интерфейс ChatGPT с поддержкой API-ключей и совместной работы.\n\n### ✅ [LobeChat](https://github.com/lobehub/lobe-chat)\n\n> Веб-фреймворк с поддержкой визуальных/голосовых режимов и переключением моделей.\n\n### ✅ [BotGem](https://botgem.com/)\n\n> Mobile-first ассистент с голосовыми диалогами и системой ИИ-друзей.\n\n### ✅ [ChatBox](https://github.com/Bin-Huang/chatbox)\n\n> Клиент для iOS/Android/desktop с современным и полным интерфейсом.\n\n### ✅ [FastGPT](https://github.com/labring/FastGPT)\n\n> База знаний + workflow, подходит для корпоративного обучения и поддержки.\n\n### ✅ [AnythingLLM](https://github.com/Mintplex-Labs/anything-llm)\n\n> Локальный деплой с поддержкой плагинов для пользователей, ценящих приватность.\n\n</details>\n\n---\n\n## 🌐 Третьи поставщики API\n\n<table border=\"1\" cellspacing=\"0\" cellpadding=\"6\">\n  <thead>\n    <tr><th>#</th><th>Платформа</th><th>Ссылка</th><th>Метки</th><th>Описание</th></tr>\n  </thead>\n  <tbody>\n    <tr><td>1</td><td>chat01 (рекомендовано, с кодом)</td><td><a href=\"https://chat01.ai/?ref=j45ikbTa\" target=\"_blank\">https://chat01.ai</a></td><td>🔓✌🎁💰✔</td><td>Поддерживает тариф Pro, исправляет деградацию ответов, 2 бесплатных кредита в день, чат + API</td></tr>\n    <tr><td>2</td><td>SiliconFlow (для бизнеса)</td><td><a href=\"https://cloud.siliconflow.cn/i/ZKV30bdG\" target=\"_blank\">https://cloud.siliconflow.cn</a></td><td>🔓🎉🚀🚩✔</td><td>Сервис Huawei Cloud Ascend, бонус 14 ¥ при регистрации</td></tr>\n    <tr><td>3</td><td>zenmux (рекомендовано)</td><td><a href=\"https://zenmux.ai/invite/U1QU1H\" target=\"_blank\">https://zenmux.ai</a></td><td>🔓✌🎁💰</td><td>Бесплатный Gemini 3 Pro, первый агрегатор с гарантиями компенсаций</td></tr>\n    <tr><td>4</td><td>PoloAPI</td><td><a href=\"https://poloai.top\" target=\"_blank\">https://poloai.top</a></td><td>🔓💪✌🎉🎁💰</td><td>Новым пользователям 0,3 $; агрегирует Claude/Grok/OpenAI</td></tr>\n    <tr><td>5</td><td>OAIPro</td><td><a href=\"https://api.oaipro.com\" target=\"_blank\">https://api.oaipro.com</a></td><td>💰✌💪</td><td>Официальные тарифы, стабильное прямое соединение, поддержка OpenAI и Claude</td></tr>\n    <tr><td>6</td><td>VoAPI</td><td><a href=\"https://demo.voapi.top\" target=\"_blank\">https://demo.voapi.top</a></td><td>🆓😆💪✌</td><td>Полностью благотворительный сайт, баланс обнуляется ежедневно</td></tr>\n    <tr><td>7</td><td>inscopilot (рекомендовано)</td><td><a href=\"https://instcopilot-api.com/register?aff=Q2Z0\" target=\"_blank\">https://instcopilot-api.com</a></td><td>✌🎉😆🚀</td><td>Бонус 5 $, стабильный и недорогой, принимает банковские карты</td></tr>\n    <tr><td>8</td><td>V3 API (гибрид)</td><td><a href=\"https://api.v3.cm\" target=\"_blank\">https://api.v3.cm</a></td><td>🚀🔓💪🎁🎉✌</td><td>Бонус 0,2 $, высокая нагрузка, пополнение по цене 30 %, десятки моделей</td></tr>\n    <tr><td>9</td><td>V3 API (официальный релей)</td><td><a href=\"https://gf.gpt.ge\" target=\"_blank\">https://gf.gpt.ge</a></td><td>🚀🌹🔓💪</td><td>Бонус 0,2 $, высокая нагрузка, пополнение по 60 % от номинала</td></tr>\n    <tr><td>10</td><td>openai-hk</td><td><a href=\"https://openai-hk.com\" target=\"_blank\">https://openai-hk.com</a></td><td>🆓🔓🎉✌💪🚀</td><td>Бонус 1 ¥, сверхвысокая нагрузка, есть публичный GPT-3.5</td></tr>\n    <tr><td>11</td><td>ChatGPT API Faucet</td><td><a href=\"https://faucet.openkey.cloud\" target=\"_blank\">https://faucet.openkey.cloud</a></td><td>🆓</td><td>1 $ бесплатного кредита, действует 3 дня</td></tr>\n    <tr><td>12</td><td>Благотворительный бесплатный ChatGPT API</td><td><a href=\"https://github.com/popjane/free_chatgpt_api\" target=\"_blank\">GitHub</a></td><td>🆓</td><td>Полностью бесплатное общественное API</td></tr>\n    <tr><td>13</td><td>GPT-API-free</td><td><a href=\"https://github.com/chuyuewei/ChatGPT-API\" target=\"_blank\">GitHub</a></td><td>🆓💪</td><td>Поддерживает GPT-4, три бесплатных запроса в день</td></tr>\n    <tr><td>14</td><td>openkey</td><td><a href=\"https://openkey.cloud\" target=\"_blank\">https://openkey.cloud</a></td><td>🔓💪✌🚀</td><td>Бонус 0,2 $, поддержка мультипоточности</td></tr>\n    <tr><td>15</td><td>gptgod.online</td><td><a href=\"https://gptgod.online\" target=\"_blank\">https://gptgod.online</a></td><td>💪✌🎁💰🎉😆</td><td>Оплата по запросам, гибкая система кредитов</td></tr>\n    <tr><td>16</td><td>m3.ckit.gold</td><td><a href=\"https://m3.ckit.gold\" target=\"_blank\">https://m3.ckit.gold</a></td><td>💰💪✌</td><td>3 RMB за доллар, бонус 0,1 $ при регистрации</td></tr>\n    <tr><td>17</td><td>iaicnn</td><td><a href=\"https://aicnn.cn\" target=\"_blank\">https://aicnn.cn</a></td><td>💪✌🎁💰🎉</td><td>Доступна поддержка старых API, сервис частично перенесён</td></tr>\n    <tr><td>18</td><td>goapi.gptnb.ai</td><td><a href=\"https://goapi.gptnb.ai\" target=\"_blank\">https://goapi.gptnb.ai</a></td><td>💪✌🎁💰🎉</td><td>—</td></tr>\n    <tr><td>19</td><td>api.aigc369.com</td><td><a href=\"https://api.aigc369.com/pricing\" target=\"_blank\">https://api.aigc369.com</a></td><td>💪✌🎁💰🎉</td><td>—</td></tr>\n    <tr><td>20</td><td>api.mjdjourney.cn</td><td><a href=\"https://api.mjdjourney.cn\" target=\"_blank\">https://api.mjdjourney.cn</a></td><td>💪✌🎁💰🎉</td><td>—</td></tr>\n    <tr><td>21</td><td>api.bltcy.ai</td><td><a href=\"https://api.bltcy.ai\" target=\"_blank\">https://api.bltcy.ai</a></td><td>💪✌🎁💰🎉</td><td>—</td></tr>\n    <tr><td>22</td><td>4Z API Relay</td><td><a href=\"https://zzzzapi.com\" target=\"_blank\">https://zzzzapi.com</a></td><td>🔓✌💪🎉🚀</td><td>Поддержка GPT-4o и Claude 3.5, для новичков бонус 0,2</td></tr>\n    <tr><td>23</td><td>Jianyi API Relay</td><td><a href=\"https://jeniya.top\" target=\"_blank\">https://jeniya.top</a></td><td>🔓✌💪🎉🚀</td><td>Много моделей, неограниченный доступ из Китая, бонус 100 ¥</td></tr>\n    <tr><td>24</td><td>CloseAI</td><td><a href=\"https://closeai-asia.com\" target=\"_blank\">https://closeai-asia.com</a></td><td>💰✌💪🎉🚀</td><td>Прокси уровня enterprise для GPT-4o и Claude 3.5, китайский саппорт</td></tr>\n    <tr><td>25</td><td>Yunjing AI</td><td><a href=\"https://api.atalk-ai.com\" target=\"_blank\">https://api.atalk-ai.com</a></td><td>🔓✌💪🎉🚀</td><td>Агрегатор ChatGPT, Claude, Wenxin Yiyan; купон 5 ¥</td></tr>\n    <tr><td>26</td><td>ModelBridge</td><td><a href=\"https://model-bridge.okeeper.com\" target=\"_blank\">https://model-bridge.okeeper.com</a></td><td>🔓✌💪🎉🚀</td><td>Бесплатный отечественный прокси, совместим с OpenAI API и китайскими моделями</td></tr>\n    <tr><td>27</td><td>UiUi API</td><td><a href=\"https://sg.uiuiapi.com\" target=\"_blank\">https://sg.uiuiapi.com</a></td><td>🔓✌💪🎉🚀</td><td>Поддерживает Claude 4, Gemini и др., формат совместим с OpenAI</td></tr>\n    <tr><td>28</td><td>Old Zhang API Relay</td><td><a href=\"https://api.laozhang.ai\" target=\"_blank\">https://api.laozhang.ai</a></td><td>🔓✌💪🎉🚀</td><td>Claude 3 и GPT-4o, бонус 20 ¥, оплата Alipay/WeChat</td></tr>\n    <tr><td>29</td><td>Haijing AI Aggregator</td><td><a href=\"https://ai.atalk-ai.com\" target=\"_blank\">https://ai.atalk-ai.com</a></td><td>🔓✌💪🎉🚀</td><td>Домашняя платформа с ICP, единый API для множества моделей</td></tr>\n    <tr><td>30</td><td>One API</td><td><a href=\"https://one-api.ai\" target=\"_blank\">https://one-api.ai</a></td><td>🔓✌💪🎉🚀</td><td>Open-source менеждер интерфейсов для мульти-моделей и self-host</td></tr>\n    <tr><td>31</td><td>OpenRouter</td><td><a href=\"https://openrouter.ai\" target=\"_blank\">https://openrouter.ai</a></td><td>🔓✌💪🎉🚀</td><td>Поддерживает 293+ моделей (OpenAI, Claude, Gemini), выдаёт бесплатные квоты</td></tr>\n    <tr><td>32</td><td>Gemini API Proxy</td><td><a href=\"https://gemini-proxy.com\" target=\"_blank\">https://gemini-proxy.com</a></td><td>🔓✌🎉🚀</td><td>Доступ к Google Gemini через OpenAI-совместимый интерфейс, есть бесплатный лимит</td></tr>\n    <tr><td>33</td><td>DeepSeek API Aggregator</td><td><a href=\"https://deepseek-aggregator.com\" target=\"_blank\">https://deepseek-aggregator.com</a></td><td>🔓💪🎉🚀</td><td>Объединяет линейку DeepSeek и выдаёт тестовый кредит</td></tr>\n    <tr><td>34</td><td>Hugging Face Model Proxy</td><td><a href=\"https://huggingface.co/inference-api\" target=\"_blank\">https://huggingface.co/inference-api</a></td><td>🔓💪🎉🚀</td><td>Доступ к открытым моделям (Llama 3 и др.) с бесплатным лимитом и Enterprise-сервисом</td></tr>\n    <tr><td>35</td><td>AI21 Labs Official Proxy</td><td><a href=\"https://studio.ai21.com\" target=\"_blank\">https://studio.ai21.com</a></td><td>💰✌💪🎉</td><td>Jurassic-2 для продвинутых NLP-задач</td></tr>\n    <tr><td>36</td><td>Cohere API Proxy</td><td><a href=\"https://cohere.ai\" target=\"_blank\">https://cohere.ai</a></td><td>💰✌💪🎉</td><td>Корпоративные API для генерации текста, эмбеддингов и классификации</td></tr>\n    <tr><td>37</td><td>AI API Aggregation Platform</td><td><a href=\"https://api.ai-aggregator.com\" target=\"_blank\">https://api.ai-aggregator.com</a></td><td>🔓✌💪🎉🚀</td><td>Единый интерфейс с балансировкой нагрузки между моделями</td></tr>\n    <tr><td>38</td><td>AI.LS</td><td><a href=\"https://ai.ls\" target=\"_blank\">https://ai.ls</a></td><td>🆓✌</td><td>Минималистичное API с бесплатным анонимным GPT-3.5</td></tr>\n    <tr><td>39</td><td>Simple API</td><td><a href=\"https://jeniya.top\" target=\"_blank\">https://jeniya.top</a></td><td>🔓✌💪🎉🎁</td><td>100 ¥ за регистрацию, поддержка Claude/GPT-4o</td></tr>\n    <tr><td>40</td><td>OpenAI120</td><td><a href=\"https://openai120.com\" target=\"_blank\">https://openai120.com</a></td><td>🔓✌🎁</td><td>3 $ бонуса, цены как у OpenAI</td></tr>\n    <tr><td>41</td><td>DuckAGI</td><td><a href=\"https://duckagi.com\" target=\"_blank\">https://duckagi.com</a></td><td>💰✌🎉🚀</td><td>Мультимодальность GPT-4o/Sora, удобно для AI-арта</td></tr>\n    <tr><td>42</td><td>Aihubmix</td><td><a href=\"https://aihubmix.com\" target=\"_blank\">https://aihubmix.com</a></td><td>💰🎉</td><td>Агрегатор отечественных моделей (Wenxin Yiyan, Qwen)</td></tr>\n    <tr><td>43</td><td>WokaAI</td><td><a href=\"https://wokaai.com\" target=\"_blank\">https://wokaai.com</a></td><td>✌</td><td>Двойные маршруты для большей стабильности</td></tr>\n    <tr><td>44</td><td>azapi</td><td><a href=\"https://azapi.com.cn\" target=\"_blank\">https://azapi.com.cn</a></td><td>💰</td><td>Скидки для долгосрочного использования</td></tr>\n    <tr><td>45</td><td>ClaudeAPI</td><td><a href=\"https://claudeapi.io\" target=\"_blank\">https://claudeapi.io</a></td><td>💪🚀✔</td><td>Официальный партнёр Anthropic, поддержка анализа документов</td></tr>\n    <tr><td>46</td><td>Gala API</td><td><a href=\"https://galaapi.com\" target=\"_blank\">https://galaapi.com</a></td><td>🎉🚀</td><td>Высокоскоростной канал специально для Google Gemini</td></tr>\n    <tr><td>47</td><td>Google AI Studio</td><td><a href=\"https://ai.google.dev\" target=\"_blank\">https://ai.google.dev</a></td><td>🆓🌎✔</td><td>Линейка Gemini полностью бесплатна, но нужен международный доступ</td></tr>\n    <tr><td>48</td><td>OpenAI Data Sharing Program</td><td><a href=\"https://platform.openai.com\" target=\"_blank\">https://platform.openai.com</a></td><td>🔓✌🌎</td><td>Включите обмен данными и получайте до 1M бесплатных токенов в день</td></tr>\n    <tr><td>49</td><td>Mistral AI La Plateforme</td><td><a href=\"https://platform.mistral.ai\" target=\"_blank\">https://platform.mistral.ai</a></td><td>🔓🎉🌎</td><td>Официальная платформа с бесплатным пробным лимитом (есть rate limit)</td></tr>\n    <tr><td>50</td><td>Cohere</td><td><a href=\"https://cohere.com\" target=\"_blank\">https://cohere.com</a></td><td>🔓🎉🌎</td><td>Trial-ключ после регистрации, бесплатные вызовы с ограничением скорости</td></tr>\n    <tr><td>51</td><td>ModelScope</td><td><a href=\"https://modelscope.cn\" target=\"_blank\">https://modelscope.cn</a></td><td>🔓🎉🚩</td><td>Агрегатор DeepSeek/Qwen, бесплатные тесты и загрузки</td></tr>\n    <tr><td>52</td><td>ByteDance Ark Collaboration Rewards</td><td><a href=\"https://www.volcengine.com/product/ark\" target=\"_blank\">https://www.volcengine.com/product/ark</a></td><td>🔓🎉</td><td>Участникам программы выдаётся по 500k токенов на модель ежедневно</td></tr>\n    <tr><td>53</td><td>BigModel (Zhipu)</td><td><a href=\"https://open.bigmodel.cn\" target=\"_blank\">https://open.bigmodel.cn</a></td><td>🆓🎉</td><td>GLM-4-Flash полностью бесплатен, поддерживает 128K контекст</td></tr>\n    <tr><td>54</td><td>InternLM</td><td><a href=\"https://internlm.intern-ai.org.cn\" target=\"_blank\">https://internlm.intern-ai.org.cn</a></td><td>🆓🎉</td><td>Официальный бесплатный API, можно вызывать напрямую</td></tr>\n    <tr><td>55</td><td>GitHub Models</td><td><a href=\"https://docs.github.com/github-models\" target=\"_blank\">https://docs.github.com/github-models</a></td><td>🔓✌🎉🌎</td><td>Хостится в Azure, предоставляет ограниченный бесплатный лимит</td></tr>\n    <tr><td>56</td><td>OpenRouter (free tier)</td><td><a href=\"https://openrouter.ai\" target=\"_blank\">https://openrouter.ai</a></td><td>🔓💪✌🎉🌎✔</td><td>Бесплатные модели ≤50 запросов/день; при балансе ≥10 $ лимит до 1000</td></tr>\n    <tr><td>57</td><td>Chutes</td><td><a href=\"https://chutes.ai\" target=\"_blank\">https://chutes.ai</a></td><td>🔓🎉</td><td>До 200 бесплатных запросов в сутки на отдельных моделях, поддержка DeepSeek</td></tr>\n    <tr><td>58</td><td>Groq Cloud</td><td><a href=\"https://groq.com/groqcloud\" target=\"_blank\">https://groq.com/groqcloud</a></td><td>🔓🎉🌎</td><td>Заявка на бесплатный API-ключ, OpenAI-совместимые конечные точки с высокой скоростью</td></tr>\n    <tr><td>59</td><td>Cerebras Inference</td><td><a href=\"https://inference.cerebras.ai\" target=\"_blank\">https://inference.cerebras.ai</a></td><td>🔓🎉🌎🚀</td><td>1M бесплатных токенов ежедневно и скорость вывода до 450+ ток/с</td></tr>\n    <tr><td>60</td><td>Infini GenStudio</td><td><a href=\"https://cloud.infini-ai.com/genstudio\" target=\"_blank\">https://cloud.infini-ai.com/genstudio</a></td><td>🆓🎉</td><td>DeepSeek R1/V3 full-power токены бесплатны, без инвайт-кодов</td></tr>\n  </tbody>\n</table>\n\n---\n\n## 📖 Руководство по использованию\n\n1. 🔑 Получите API-ключ: зарегистрируйтесь на выбранной платформе и скопируйте его из кабинета\n2. ⚙ Настройте endpoint: вставьте базовый URL API в поддерживаемое приложение\n3. 🤖 Выберите модели: переключайтесь между Claude / GPT / Gemini / DeepSeek по доступности\n4. 📊 Следите за потреблением: включайте лимиты или напоминания внутри клиента\n\n---\n\n## 🙌 Как помочь проекту\n\nМы приветствуем:\n\n* ✨ Добавление новых поставщиков API (стабильная работа ≥ 3 дней)\n* 🧰 Туториалы (скриншоты настроек, запись экрана)\n* 🧪 Скрипты проверки (автоматическое выявление неактивных площадок)\n* 🌍 Переводы (английский, японский, корейский и др.)\n\n> Отправляйте Pull Request или Issue — мы постараемся ответить как можно быстрее!\n\n---\n\n## ❌ Неактивные платформы\n\n<details>\n<summary>📛 Нажмите, чтобы увидеть недоступные площадки</summary>\n\n| # | Название | Ссылка                                   | Статус       |\n| - | -------- | ---------------------------------------- | ------------ |\n| 1 | 464888   | [api.464888.xyz](https://api.464888.xyz) | ❌ Недоступно |\n\n> Нашли ещё неработающий сайт? Сообщите через Issue!\n\n</details>\n\n---\n\n## ⚖️ Отказ от ответственности\n\n* Мы не храним API-ключи и не предоставляем прокси или ретрансляцию.\n* Все площадки найдены в открытом интернете — используйте на свой страх и риск.\n* Авторы не несут ответственности за убытки, вызванные сторонними сервисами.\n\n---\n\n## 🙏 Особая благодарность\n\nБольшое спасибо zenmux за помощь с API-платформой!  \n[Зарегистрируйтесь и используйте промокод](https://zenmux.ai/invite/U1QU1H)\n\nСпасибо chat01 за поддержку сервиса!  \n[Посетите chat01 и используйте реферальный код](https://chat01.ai/?ref=j45ikbTa)\n\n[![Powered by DartNode](https://dartnode.com/branding/DN-Open-Source-sm.png)](https://dartnode.com \"Powered by DartNode - Free VPS for Open Source\")\n\n---\n\n[![Star History](https://api.star-history.com/svg?repos=TechnologyStar/Openai-Claude-Deepseek-API-provider&type=Date)](https://star-history.com/#TechnologyStar/Openai-Claude-Deepseek-API-provider&Date)\nСделано с ❤️ командой [TechnologyStar](https://github.com/TechnologyStar)\n"
  },
  {
    "path": "website/README-HTML.md",
    "content": "# 静态HTML多语言版本 / Static HTML Multilingual Version\n\n## 📁 文件说明 / File Description\n\n本目录包含完全独立的多语言静态HTML页面，无需Node.js环境即可直接在浏览器中打开使用。\n\nThis directory contains fully standalone multilingual static HTML pages that can be opened directly in a browser without requiring a Node.js environment.\n\n### 文件列表 / File List\n\n- **index.html** - 自动语言检测入口页面 / Auto language detection entry page\n- **index.zh-CN.html** - 中文版本（底本）/ Chinese version (base)\n- **index.en.html** - 英文版本 / English version\n- **index.ru.html** - 俄语版本 / Russian version\n- **index.fr.html** - 法语版本 / French version\n\n## 🌟 特性 / Features\n\n### ✅ 完全自包含 / Fully Self-Contained\n- 所有样式直接内嵌在HTML中\n- 无需外部CSS/JS文件\n- 无需构建工具或服务器\n- 可直接用浏览器打开\n\nAll styles are embedded directly in the HTML\nNo external CSS/JS files required\nNo build tools or server needed\nCan be opened directly with a browser\n\n### 🌍 多语言支持 / Multilingual Support\n- 🇨🇳 中文 (Chinese) - 底本版本\n- 🇬🇧 English - Based on Chinese content\n- 🇷🇺 Русский (Russian) - Based on Chinese content\n- 🇫🇷 Français (French) - Based on Chinese content\n\n### 📊 完整数据 / Complete Data\n- 60+ API提供商信息\n- 8个推荐应用\n- 标签图例说明\n- 使用指南\n- 贡献指南\n\n60+ API providers information\n8 recommended applications\nTag legend explanations\nUsage guide\nContribution guide\n\n### 🎨 现代设计 / Modern Design\n- 渐变背景色\n- 毛玻璃效果\n- 响应式布局\n- 移动端适配\n- 悬停动画效果\n\nGradient backgrounds\nGlassmorphism effects\nResponsive layout\nMobile-friendly\nHover animations\n\n## 🚀 使用方法 / Usage\n\n### 方法1：直接打开 / Method 1: Direct Opening\n\n```bash\n# 在浏览器中打开任意HTML文件\n# Open any HTML file in a browser\n\n# Windows\nstart index.html\n\n# Mac\nopen index.html\n\n# Linux\nxdg-open index.html\n```\n\n### 方法2：本地服务器 / Method 2: Local Server\n\n```bash\n# Python 3\npython3 -m http.server 8000\n\n# Python 2\npython -m SimpleHTTPServer 8000\n\n# Node.js (如果已安装 / if installed)\nnpx http-server -p 8000\n\n# 然后访问 / Then visit\n# http://localhost:8000\n```\n\n### 方法3：在线部署 / Method 3: Online Deployment\n\n可以直接将HTML文件部署到以下平台：\nYou can directly deploy HTML files to the following platforms:\n\n- **GitHub Pages**\n- **Netlify**\n- **Vercel**\n- **Cloudflare Pages**\n- **GitLab Pages**\n- 任何支持静态文件的主机 / Any static file hosting\n\n## 🔄 与React版本的关系 / Relationship with React Version\n\n### React版本 (client/) / React Version\n- 需要Node.js环境和构建\n- 支持更复杂的交互功能\n- 使用TanStack Query进行数据获取\n- 支持客户端路由\n- 适合开发和扩展功能\n\nRequires Node.js environment and build\nSupports more complex interactive features\nUses TanStack Query for data fetching\nSupports client-side routing\nSuitable for development and extending features\n\n### HTML版本 (当前目录) / HTML Version (Current Directory)\n- 纯静态文件，无需构建\n- 完全自包含，易于部署\n- 可直接分享和使用\n- 适合快速查看和分享\n- 适合无法运行Node.js的环境\n\nPure static files, no build required\nFully self-contained, easy to deploy\nCan be directly shared and used\nSuitable for quick viewing and sharing\nSuitable for environments without Node.js\n\n## 📝 内容更新 / Content Updates\n\n如需更新内容，请遵循以下步骤：\nTo update content, follow these steps:\n\n1. **更新中文版本（底本）**：编辑 `index.zh-CN.html`\n   Update Chinese version (base): Edit `index.zh-CN.html`\n\n2. **同步到其他语言**：根据中文版本更新其他语言文件\n   Sync to other languages: Update other language files based on Chinese version\n\n3. **保持一致性**：确保所有语言版本的数据条目数量一致\n   Maintain consistency: Ensure all language versions have the same number of data entries\n\n## 🎯 浏览器兼容性 / Browser Compatibility\n\n支持所有现代浏览器：\nSupports all modern browsers:\n\n- ✅ Chrome/Edge 90+\n- ✅ Firefox 88+\n- ✅ Safari 14+\n- ✅ Opera 76+\n\n## 📱 移动端支持 / Mobile Support\n\n所有HTML页面都经过优化，支持移动设备：\nAll HTML pages are optimized for mobile devices:\n\n- 响应式设计 / Responsive design\n- 触摸友好 / Touch-friendly\n- 性能优化 / Performance optimized\n- 小屏幕适配 / Small screen adapted\n\n## 🔗 相关链接 / Related Links\n\n- 项目主页 / Project Homepage: https://github.com/TechnologyStar/Openai-Claude-Deepseek-API-provider\n- 中文README / Chinese README: [../README.md](../README.md)\n- React版本 / React Version: [./client/](./client/)\n\n## 📄 许可证 / License\n\n与项目主仓库保持一致。\nSame as the main project repository.\n\n---\n\n**Made with ❤️ by TechnologyStar**\n"
  },
  {
    "path": "website/README.md",
    "content": "# 🌐 Openai / Claude / Deepseek API Provider\n\n[![Last Commit](https://img.shields.io/github/last-commit/TechnologyStar/Openai-Claude-Deepseek-API-provider)](https://github.com/TechnologyStar/Openai-Claude-Deepseek-API-provider)\n[![License](https://img.shields.io/github/license/TechnologyStar/Openai-Claude-Deepseek-API-provider)](https://github.com/TechnologyStar/Openai-Claude-Deepseek-API-provider/blob/main/LICENSE)\n\n> 🏗️ A curated list of third-party platforms providing **OpenAI / Claude / DeepSeek** APIs for learning, research, and non-commercial use.\n\n<p align=\"center\">\n  <a href=\"README.md\" title=\"中文\"><img src=\"https://img.shields.io/badge/🇨🇳 中文-阅读-blue?style=flat-square\" alt=\"中文版\"/></a>\n  <a href=\"en.md\" title=\"English\"><img src=\"https://img.shields.io/badge/🇬🇧 English-Read-blue?style=flat-square\" alt=\"English\"/></a>\n  <a href=\"Russian.md\" title=\"Русский\"><img src=\"https://img.shields.io/badge/🇷🇺 Русский-Читать-blue?style=flat-square\" alt=\"Русская версия\"/></a>\n  <a href=\"french.md\" title=\"Français\"><img src=\"https://img.shields.io/badge/🇫🇷 Français-Lire-blue?style=flat-square\" alt=\"Version Française\"/></a>\n</p>\n\n> 🏗️ 精选的第三方平台列表，提供 **OpenAI / Claude / DeepSeek** API，供学习、研究和非商业使用。\n\n---\n\n> ⚠️ **使用说明**\n>\n> 本项目为免费公益项目，严格禁止任何违法用途。\n>\n> * 遵守 [OpenAI 使用条款](https://openai.com/policies/terms-of-use)\n> * 遵守 [《生成式人工智能服务管理暂行办法》](http://www.cac.gov.cn/2023-07/13/c_1690898327029107.htm)，**请勿对中国公众提供未经备案的生成式AI服务**。\n> * 官网：[Openai / Claude / Deepseek API Provider](https://d706445b-7658-4708-bb08-bac6c5a775ad-00-2z2hsdckl4fie.riker.replit.dev/)\n\n---\n\n## 🚀 项目简介\n\n* 📌 收录并验证来自互联网的第三方 API 提供平台（部分免费）\n* 🔧 免注册 / 一键接入 / 支持多模型（OpenAI、Claude、DeepSeek 等）\n* 🔒 所有网站仅作收录展示，**请勿输入个人敏感信息**\n* 🌍 支持多语言界面（中文、English、Русский、Français）\n* 📱 响应式设计，支持桌面端和移动端\n\n> 💡 如果觉得项目有帮助，欢迎 Star 🌟\n\n---\n\n## 🎁 特色标签说明\n\n| 标签 | 含义                 |\n| -- | ------------------ |\n| 🆓 | 完全免费               |\n| 🔓 | 有免费额度              |\n| 💰 | 需要充值               |\n| 💪 | Claude 最新支持        |\n| ✌  | OpenAI 最新支持        |\n| 🎉 | 其他模型支持（如 DeepSeek） |\n| 🌎 | 需要国际网络             |\n| 🎁 | 充值赠送额度优惠           |\n| 🚀 | 支持高并发              |\n| 😆 | 每日签到领余额            |\n| 🚩 | 已备案平台              |\n| ✔  | 已验证真实性             |\n\n---\n\n## 📱 推荐应用支持\n\n<details>\n<summary>📦 点击展开查看兼容应用列表</summary>\n\n### ✅ [Cherry Studio](https://github.com/CherryHQ/cherry-studio)\n\n> 跨平台桌面端 + 移动端，集成主流 AI 云服务 + 本地模型。\n\n### ✅ [ChatGPT 好友插件 (uTools)](https://u.tools/plugins/detail/ChatGPT.%E5%A5%BD%E5%8F%8B/)\n\n> 桌面端智能聊天插件，支持角色设定、多模型、多会话管理。\n\n### ✅ [ChatGPT-Next-Web](https://github.com/Yidadaa/ChatGPT-Next-Web)\n\n> 开源网页端 ChatGPT 前端，支持 API Key 与多用户协作。\n\n### ✅ [LobeChat](https://github.com/lobehub/lobe-chat)\n\n> 支持视觉、语音交互和多模型切换，网页端 AI 会话框架。\n\n### ✅ [BotGem](https://botgem.com/)\n\n> 移动端优先设计，支持语音交流与 AI 好友系统。\n\n### ✅ [ChatBox](https://github.com/Bin-Huang/chatbox)\n\n> 支持 iOS、Android 和桌面端，界面现代，功能完整。\n\n### ✅ [FastGPT](https://github.com/labring/FastGPT)\n\n> 知识库 + 工作流集成，企业内训/客服场景首选。\n\n### ✅ [AnythingLLM](https://github.com/Mintplex-Labs/anything-llm)\n\n> 支持本地部署与插件扩展，适合对数据隐私有要求的用户。\n\n</details>\n\n---\n\n## 🌐 第三方 API 提供方列表\n\n<table border=\"1\" cellspacing=\"0\" cellpadding=\"6\">\n  <thead>\n    <tr>\n      <th>序号</th>\n      <th>网站</th>\n      <th>链接</th>\n      <th>标签</th>\n      <th>备注</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <td>1</td>\n      <td>chat01（推荐）(含邀请码)</td>\n      <td><a href=\"https://chat01.ai/?ref=j45ikbTa\" target=\"_blank\">https://chat01.ai</a></td>\n      <td>🔓✌🎁💰✔</td>\n      <td>支持pro,解决降智问题，每天免费2积分，聊天+api同站</td>\n    </tr>\n    <tr>\n      <td>2</td>\n      <td>cloud.siliconflow.cn(推荐/企业级)</td>\n      <td><a href=\"https://cloud.siliconflow.cn/i/ZKV30bdG\" target=\"_blank\">https://cloud.siliconflow.cn/models</a></td>\n      <td>🔓💪✌🎉🚀🚩✔</td>\n      <td>华为云昇腾服务，实名送14元，每日最多请求100次</td>\n    </tr>\n    <tr>\n      <td>3</td>\n      <td>VoAPI</td>\n      <td><a href=\"https://demo.voapi.top\" target=\"_blank\">https://demo.voapi.top</a></td>\n      <td>🆓😆💪✌</td>\n      <td>【全公益网站】余额每日清零</td>\n    </tr>\n    <tr>\n      <td>4</td>\n      <td>头顶冒火</td>\n      <td><a href=\"https://burn.hair\" target=\"_blank\">https://burn.hair</a></td>\n      <td>✌🎉😆🚀</td>\n      <td>赠 $0.3，每日签到得额度，支持高并发</td>\n    </tr>\n    <tr>\n      <td>5</td>\n      <td>V3 API（混合版）</td>\n      <td><a href=\"https://api.v3.cm\" target=\"_blank\">https://api.v3.cm</a></td>\n      <td>🚀🔓💪🎁🎉✌</td>\n      <td>赠 $0.2，高并发，3折充值，超多模型</td>\n    </tr>\n    <tr>\n      <td>6</td>\n      <td>V3 API（官转版）</td>\n      <td><a href=\"https://gf.gpt.ge\" target=\"_blank\">https://gf.gpt.ge</a></td>\n      <td>🚀🌹🔓💪</td>\n      <td>赠 $0.2，高并发，6折充值</td>\n    </tr>\n    <tr>\n      <td>7</td>\n      <td>openai-hk</td>\n      <td><a href=\"https://openai-hk.com/\" target=\"_blank\">https://openai-hk.com</a></td>\n      <td>🆓🔓🎉✌💪🚀</td>\n      <td>赠1元，超高并发，含GPT3.5公益版</td>\n    </tr>\n    <tr>\n      <td>8</td>\n      <td>ChatGPT API 水龙头</td>\n      <td><a href=\"https://faucet.openkey.cloud/\" target=\"_blank\">https://faucet.openkey.cloud</a></td>\n      <td>🆓</td>\n      <td>免费$1额度，3天有效期</td>\n    </tr>\n    <tr>\n      <td>9</td>\n      <td>公益免费的ChatGPT API</td>\n      <td><a href=\"https://github.com/popjane/free_chatgpt_api\" target=\"_blank\">GitHub</a></td>\n      <td>🆓</td>\n      <td>公益免费</td>\n    </tr>\n    <tr>\n      <td>10</td>\n      <td>GPT-API-free</td>\n      <td><a href=\"https://github.com/chuyuewei/ChatGPT-API\" target=\"_blank\">GitHub</a></td>\n      <td>🆓💪</td>\n      <td>支持 GPT-4，每天3次</td>\n    </tr>\n    <tr>\n      <td>11</td>\n      <td>openkey</td>\n      <td><a href=\"https://openkey.cloud/\" target=\"_blank\">https://openkey.cloud</a></td>\n      <td>🔓💪✌🚀</td>\n      <td>赠$0.2，支持多并发</td>\n    </tr>\n    <tr>\n      <td>12</td>\n      <td>gptgod.online</td>\n      <td><a href=\"https://gptgod.online/\" target=\"_blank\">https://gptgod.online</a></td>\n      <td>💪✌🎁💰🎉😆</td>\n      <td>按次计费，积分额度</td>\n    </tr>\n    <tr>\n      <td>13</td>\n      <td>m3.ckit.gold</td>\n      <td><a href=\"https://m3.ckit.gold/\" target=\"_blank\">https://m3.ckit.gold</a></td>\n      <td>💰💪✌</td>\n      <td>3元/刀，注册送$0.1</td>\n    </tr>\n    <tr>\n      <td>14</td>\n      <td>小兔api</td>\n      <td><a href=\"https://api.aischat.xy\" target=\"_blank\">https://api.aischat.xy</a></td>\n      <td>🆓💪✌</td>\n      <td></td>\n    </tr>\n    <tr>\n      <td>15</td>\n      <td>goapi.gptnb.ai</td>\n      <td><a href=\"https://goapi.gptnb.ai/\" target=\"_blank\">https://goapi.gptnb.ai</a></td>\n      <td>💪✌🎁💰🎉</td>\n      <td></td>\n    </tr>\n    <tr>\n      <td>16</td>\n      <td>api.aigc369.com</td>\n      <td><a href=\"https://api.aigc369.com/pricing\" target=\"_blank\">https://api.aigc369.com/pricing</a></td>\n      <td>💪✌🎁💰🎉</td>\n      <td></td>\n    </tr>\n    <tr>\n      <td>17</td>\n      <td>api.mjdjourney.cn</td>\n      <td><a href=\"https://api.mjdjourney.cn/\" target=\"_blank\">https://api.mjdjourney.cn</a></td>\n      <td>💪✌🎁💰🎉</td>\n      <td></td>\n    </tr>\n    <tr>\n      <td>18</td>\n      <td>api.bltcy.ai</td>\n      <td><a href=\"https://api.bltcy.ai/\" target=\"_blank\">https://api.bltcy.ai</a></td>\n      <td>💪✌🎁💰🎉</td>\n      <td></td>\n    </tr>\n  </tbody>\n</table>\n\n---\n\n## 📖 使用指南\n\n1. 🔑 **获取 API Key**：注册平台后，在用户中心复制您的API密钥\n2. ⚙ **配置 Endpoint**：填写 API 地址到支持的应用程序中\n3. 🤖 **选择模型**：根据平台支持情况切换不同的AI模型\n4. 📊 **用量监控**：推荐使用客户端自带的用量限制功能\n\n### 详细配置步骤\n\n#### 步骤一：选择合适的API提供商\n- 根据您的需求选择免费或付费服务\n- 查看标签了解平台支持的模型类型\n- 注意是否需要国际网络访问\n\n#### 步骤二：注册并获取API Key\n- 访问选定的平台并完成注册\n- 在用户中心或API设置页面找到您的API密钥\n- 妥善保管API密钥，不要泄露给他人\n\n#### 步骤三：配置应用程序\n- 在您使用的AI应用中找到API设置\n- 填入API端点地址和您的API密钥\n- 选择合适的模型进行测试\n\n---\n\n## 🙌 贡献指南\n\n我们欢迎以下贡献方式：\n\n* ✨ **添加新 API 提供商**（需稳定运行 ≥ 3 天）\n* 🧰 **补充使用教程**（包括配置截图、录屏）\n* 🧪 **开发验证脚本**（自动检测失效平台）\n* 🌍 **多语言翻译**（如：英文、日文、韩文等）\n* 🐛 **报告问题**（发现失效链接或错误信息）\n* 📝 **完善文档**（改进说明文档和使用指南）\n\n### 贡献方式\n\n1. **Fork 本仓库**\n2. **创建功能分支** (`git checkout -b feature/AmazingFeature`)\n3. **提交更改** (`git commit -m 'Add some AmazingFeature'`)\n4. **推送到分支** (`git push origin feature/AmazingFeature`)\n5. **开启 Pull Request**\n\n> 请提交 Pull Request 或 Issue，我们将尽快处理！\n\n---\n\n## 🛠️ 技术栈\n\n本项目采用现代化的全栈开发技术：\n\n### 前端技术\n- **React 18** - 现代化的UI框架\n- **TypeScript** - 类型安全的JavaScript\n- **Tailwind CSS** - 实用优先的CSS框架\n- **Vite** - 快速的构建工具\n- **TanStack Query** - 强大的数据获取库\n- **Wouter** - 轻量级路由库\n\n### 后端技术\n- **Node.js** - JavaScript运行环境\n- **Express.js** - Web应用框架\n- **TypeScript** - 类型安全开发\n- **Drizzle ORM** - 现代化的ORM\n- **PostgreSQL** - 关系型数据库\n\n### 特色功能\n- 🌍 国际化支持（i18n）\n- 📱 响应式设计\n- 🔍 实时搜索和过滤\n- 💾 本地存储偏好设置\n- 🎨 现代化UI组件库\n\n---\n\n## 🚀 快速开始\n\n### 本地开发\n\n```bash\n# 克隆项目\ngit clone https://github.com/TechnologyStar/Openai-Claude-Deepseek-API-provider.git\n\n# 进入项目目录\ncd Openai-Claude-Deepseek-API-provider\n\n# 安装依赖\nnpm install\n\n# 启动开发服务器\nnpm run dev\n```\n\n### 环境要求\n\n- Node.js 18+\n- npm 或 yarn\n- 现代浏览器支持\n\n---\n\n## ❌ 失效平台列表\n\n<details>\n<summary>📛 点击展开查看失效平台</summary>\n\n| # | 名称     | 链接                                       | 状态     | 失效时间 |\n| - | ------ | ---------------------------------------- | ------ | -------- |\n| 1 | 464888 | [api.464888.xyz](https://api.464888.xyz) | ❌ 无法访问 | 2024-12 |\n\n> 如发现新失效平台，欢迎通过 Issue 提交！\n\n</details>\n\n---\n\n## 📊 项目统计\n\n- 🔗 **API提供商数量**：18+\n- 🌍 **支持语言**：4种（中文、英文、俄文、法文）\n- 📱 **推荐应用**：8款\n- ⭐ **GitHub Stars**：持续增长中\n- 🔄 **更新频率**：每周更新\n\n---\n\n## 🙏 特别鸣谢\n\n### 平台支持\n- **Replit** - 提供优秀的在线开发环境\n  [立即注册并使用邀请码](https://replit.com/refer/HarmonyOSam)\n\n- **chat01** - 提供稳定的API服务支持\n  [访问 chat01 并使用邀请码](https://chat01.ai/?ref=j45ikbTa)\n\n### 开源项目\n感谢所有为开源社区贡献的开发者们，特别是以下项目：\n- [shadcn/ui](https://ui.shadcn.com/) - 优秀的UI组件库\n- [Tailwind CSS](https://tailwindcss.com/) - 实用的CSS框架\n- [React](https://reactjs.org/) - 强大的前端框架\n\n---\n\n## 📄 开源协议\n\n本项目采用 [MIT License](LICENSE) 开源协议。\n\n---\n\n## ⚖️ 法律免责声明\n\n- 本项目不存储任何 API Key，也不提供代理或转发服务\n- 所有平台来源于互联网，使用风险请自行评估\n- 项目仅供学习研究使用，严禁用于非法用途\n- 若因使用第三方服务造成损失，作者不承担任何法律责任\n- 使用前请仔细阅读各API提供商的服务条款\n\n---\n\n## 📞 联系我们\n\n- **GitHub Issues**：[提交问题](https://github.com/TechnologyStar/Openai-Claude-Deepseek-API-provider/issues)\n- **项目主页**：[API Provider Directory](https://d706445b-7658-4708-bb08-bac6c5a775ad-00-2z2hsdckl4fie.riker.replit.dev/)\n- **作者主页**：[TechnologyStar](https://github.com/TechnologyStar)\n\n---\n\n## 🔄 更新日志\n\n### 2024-12-27\n- ✅ 完成多语言网站界面开发\n- ✅ 添加响应式设计支持\n- ✅ 集成18个API提供商数据\n- ✅ 实现搜索和过滤功能\n\n### 更多更新\n查看 [CHANGELOG.md](CHANGELOG.md) 了解详细更新历史。\n\n---\n\n[![Star History](https://api.star-history.com/svg?repos=TechnologyStar/Openai-Claude-Deepseek-API-provider&type=Date)](https://star-history.com/#TechnologyStar/Openai-Claude-Deepseek-API-provider&Date)\n\nMade with ❤️ by [TechnologyStar](https://github.com/TechnologyStar)"
  },
  {
    "path": "website/attached_assets/Pasted--API-p-table-border-1-cellspacing-0-cellpadding-6-thead-tr--1751255126331_1751255126339.txt",
    "content": "## 🌐 第三方 API 提供方列表\n</p>\n\n<table border=\"1\" cellspacing=\"0\" cellpadding=\"6\">\n  <thead>\n    <tr>\n      <th>序号</th>\n      <th>网站</th>\n      <th>链接</th>\n      <th>标签</th>\n      <th>备注</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <td>1</td>\n      <td>chat01（推荐）(含邀请码)</td>\n      <td><a href=\"https://chat01.ai/?ref=j45ikbTa\" target=\"_blank\">https://chat01.ai</a></td>\n      <td>🔓✌🎁💰✔</td>\n      <td>支持pro,解决降智问题，每天免费2积分，聊天+api同站</td>\n    </tr>\n    <tr>\n      <td>2</td>\n      <td>cloud.siliconflow.cn(推荐/企业级)</td>\n      <td><a href=\"https://cloud.siliconflow.cn/i/ZKV30bdG\" target=\"_blank\">https://cloud.siliconflow.cn/models</a></td>\n      <td>🔓💪✌🎉🚀🚩✔</td>\n      <td>华为云昇腾服务，实名送14元，每日最多请求100次</td>\n    </tr>\n    <tr>\n      <td>3</td>\n      <td>VoAPI</td>\n      <td><a href=\"https://demo.voapi.top\" target=\"_blank\">https://demo.voapi.top</a></td>\n      <td>🆓😆💪✌</td>\n      <td>【全公益网站】余额每日清零</td>\n    </tr>\n    <tr>\n      <td>4</td>\n      <td>头顶冒火</td>\n      <td><a href=\"https://burn.hair\" target=\"_blank\">https://burn.hair</a></td>\n      <td>✌🎉😆🚀</td>\n      <td>赠 $0.3，每日签到得额度，支持高并发</td>\n    </tr>\n    <tr>\n      <td>5</td>\n      <td>V3 API（混合版）</td>\n      <td><a href=\"https://api.v3.cm\" target=\"_blank\">https://api.v3.cm</a></td>\n      <td>🚀🔓💪🎁🎉✌</td>\n      <td>赠 $0.2，高并发，3折充值，超多模型</td>\n    </tr>\n    <tr>\n      <td>6</td>\n      <td>V3 API（官转版）</td>\n      <td><a href=\"https://gf.gpt.ge\" target=\"_blank\">https://gf.gpt.ge</a></td>\n      <td>🚀🌹🔓💪</td>\n      <td>赠 $0.2，高并发，6折充值</td>\n    </tr>\n    <tr>\n      <td>7</td>\n      <td>openai-hk</td>\n      <td><a href=\"https://openai-hk.com/\" target=\"_blank\">https://openai-hk.com</a></td>\n      <td>🆓🔓🎉✌💪🚀</td>\n      <td>赠1元，超高并发，含GPT3.5公益版</td>\n    </tr>\n    <tr>\n      <td>8</td>\n      <td>ChatGPT API 水龙头</td>\n      <td><a href=\"https://faucet.openkey.cloud/\" target=\"_blank\">https://faucet.openkey.cloud</a></td>\n      <td>🆓</td>\n      <td>免费$1额度，3天有效期</td>\n    </tr>\n    <tr>\n      <td>9</td>\n      <td>公益免费的ChatGPT API</td>\n      <td><a href=\"https://github.com/popjane/free_chatgpt_api\" target=\"_blank\">GitHub</a></td>\n      <td>🆓</td>\n      <td>公益免费</td>\n    </tr>\n    <tr>\n      <td>10</td>\n      <td>GPT-API-free</td>\n      <td><a href=\"https://github.com/chuyuewei/ChatGPT-API\" target=\"_blank\">GitHub</a></td>\n      <td>🆓💪</td>\n      <td>支持 GPT-4，每天3次</td>\n    </tr>\n    <tr>\n      <td>11</td>\n      <td>openkey</td>\n      <td><a href=\"https://openkey.cloud/\" target=\"_blank\">https://openkey.cloud</a></td>\n      <td>🔓💪✌🚀</td>\n      <td>赠$0.2，支持多并发</td>\n    </tr>\n    <tr>\n      <td>12</td>\n      <td>gptgod.online</td>\n      <td><a href=\"https://gptgod.online/\" target=\"_blank\">https://gptgod.online</a></td>\n      <td>💪✌🎁💰🎉😆</td>\n      <td>按次计费，积分额度</td>\n    </tr>\n    <tr>\n      <td>13</td>\n      <td>m3.ckit.gold</td>\n      <td><a href=\"https://m3.ckit.gold/\" target=\"_blank\">https://m3.ckit.gold</a></td>\n      <td>💰💪✌</td>\n      <td>3元/刀，注册送$0.1</td>\n    </tr>\n    <tr>\n      <td>14</td>\n      <td>小兔api</td>\n      <td><a href=\"https://api.aischat.xy\" target=\"_blank\">https://api.aischat.xy</a></td>\n      <td>🆓💪✌</td>\n      <td></td>\n    </tr>\n    <tr>\n      <td>15</td>\n      <td>goapi.gptnb.ai</td>\n      <td><a href=\"https://goapi.gptnb.ai/\" target=\"_blank\">https://goapi.gptnb.ai</a></td>\n      <td>💪✌🎁💰🎉</td>\n      <td></td>\n    </tr>\n    <tr>\n      <td>16</td>\n      <td>api.aigc369.com</td>\n      <td><a href=\"https://api.aigc369.com/pricing\" target=\"_blank\">https://api.aigc369.com/pricing</a></td>\n      <td>💪✌🎁💰🎉</td>\n      <td></td>\n    </tr>\n    <tr>\n      <td>17</td>\n      <td>api.mjdjourney.cn</td>\n      <td><a href=\"https://api.mjdjourney.cn/\" target=\"_blank\">https://api.mjdjourney.cn</a></td>\n      <td>💪✌🎁💰🎉</td>\n      <td></td>\n    </tr>\n    <tr>\n      <td>18</td>\n      <td>api.bltcy.ai</td>\n      <td><a href=\"https://api.bltcy.ai/\" target=\"_blank\">https://api.bltcy.ai</a></td>\n      <td>💪✌🎁💰🎉</td>\n      <td></td>\n    </tr>\n    <tr>\n      <td>19</td>\n      <td>4Z API 中转站</td>\n      <td><a href=\"https://zzzzapi.com/\" target=\"_blank\">https://zzzzapi.com</a></td>\n      <td>🔓✌💪🎉🚀</td>\n      <td>华为云昇腾服务，支持GPT-4o、Claude 3.5，新用户赠100元额度，适合企业级高并发场景。</td>\n    </tr>\n<tr>\n      <td>20</td>\n      <td>简易API中转站</td>\n      <td><a href=\"https://jeniya.top/\" target=\"_blank\">https://jeniya.top</a></td>\n      <td>🔓✌💪🎉🚀</td>\n      <td>聚合多模型，国内直连无限制，注册送100元测试额度。</td>\n    </tr>\n<tr>\n      <td>21</td>\n      <td>CloseAI</td>\n      <td><a href=\"https://closeai-asia.com/\" target=\"_blank\">https://closeai-asia.com</a></td>\n      <td>💰✌💪🎉🚀</td>\n      <td>企业级代理，支持GPT-4o、Claude 3.5，提供中文技术支持。</td>\n    </tr>\n<tr>\n      <td>22</td>\n      <td>云鲸AI</td>\n      <td><a href=\"https://api.atalk-ai.com/\" target=\"_blank\">https://api.atalk-ai.com</a></td>\n      <td>🔓✌💪🎉🚀</td>\n      <td>聚合ChatGPT、Claude、文心一言，注册赠5元体验券。</td>\n    </tr>\n<tr>\n      <td>23</td>\n      <td>ModelBridge</td>\n      <td><a href=\"https://model-bridge.okeeper.com/\" target=\"_blank\">https://model-bridge.okeeper.com</a></td>\n      <td>🔓✌💪🎉🚀</td>\n      <td>国内免费代理，兼容OpenAI接口和国产模型（如文心一言）。</td>\n    </tr>\n<tr>\n      <td>24</td>\n      <td>UiUi API</td>\n      <td><a href=\"https://sg.uiuiapi.com/\" target=\"_blank\">https://sg.uiuiapi.com</a></td>\n      <td>🔓✌💪🎉🚀</td>\n      <td>支持Claude 4、Gemini等模型，兼容OpenAI接口格式。</td>\n    </tr>\n<tr>\n      <td>25</td>\n      <td>老张API中转服务</td>\n      <td><a href=\"https://api.laozhang.ai/\" target=\"_blank\">https://api.laozhang.ai</a></td>\n      <td>🔓✌💪🎉🚀</td>\n      <td>支持Claude 3和GPT-4o，新用户赠20元额度，支持支付宝/微信支付。</td>\n    </tr>\n<tr>\n      <td>26</td>\n      <td>海鲸AI聚合平台</td>\n      <td><a href=\"https://ai.atalk-ai.com/\" target=\"_blank\">https://ai.atalk-ai.com</a></td>\n      <td>🔓✌💪🎉🚀</td>\n      <td>国内备案平台，支持多模型统一API接入。</td>\n    </tr>\n<tr>\n      <td>27</td>\n      <td>One API</td>\n      <td><a href=\"https://one-api.ai/\" target=\"_blank\">https://one-api.ai</a></td>\n      <td>🔓✌💪🎉🚀</td>\n      <td>开源接口管理系统，支持多模型分发和私有化部署。</td>\n    </tr>\n<tr>\n      <td>28</td>\n      <td>OpenRouter</td>\n      <td><a href=\"https://openrouter.ai/\" target=\"_blank\">https://openrouter.ai</a></td>\n      <td>🔓✌💪🎉🚀</td>\n      <td>支持293个模型（含OpenAI、Claude、Gemini），提供免费额度。</td>\n    </tr>\n<tr>\n      <td>29</td>\n      <td>Gemini API代理</td>\n      <td><a href=\"https://gemini-proxy.com/\" target=\"_blank\">https://gemini-proxy.com</a></td>\n      <td>🔓✌🎉🚀</td>\n      <td>支持Google Gemini模型，兼容OpenAI接口，提供免费额度。</td>\n    </tr>\n<tr>\n      <td>30</td>\n      <td>DeepSeek API聚合</td>\n      <td><a href=\"https://deepseek-aggregator.com/\" target=\"_blank\">https://deepseek-aggregator.com</a></td>\n      <td>🔓💪🎉🚀</td>\n      <td>聚合DeepSeek系列模型，提供免费测试额度。</td>\n    </tr>\n<tr>\n      <td>31</td>\n      <td>Hugging Face模型代理</td>\n      <td><a href=\"https://huggingface.co/inference-api/\" target=\"_blank\">https://huggingface.co/inference-api</a></td>\n      <td>🔓💪🎉🚀</td>\n      <td>支持开源模型（如Llama 3），提供免费额度和企业级服务。</td>\n    </tr>\n<tr>\n      <td>32</td>\n      <td>AI21 Labs官方代理</td>\n      <td><a href=\"https://studio.ai21.com/\" target=\"_blank\">https://studio.ai21.com</a></td>\n      <td>💰✌💪🎉</td>\n      <td>支持Jurassic-2模型，适合自然语言处理任务。</td>\n    </tr>\n<tr>\n      <td>33</td>\n      <td>Cohere API代理</td>\n      <td><a href=\"https://cohere.ai/\" target=\"_blank\">https://cohere.ai</a></td>\n      <td>💰✌💪🎉</td>\n      <td>支持文本生成和分类模型，提供企业级API。</td>\n    </tr>\n<tr>\n      <td>34</td>\n      <td>AI API聚合平台</td>\n      <td><a href=\"https://api.ai-aggregator.com/\" target=\"_blank\">https://api.ai-aggregator.com</a></td>\n      <td>🔓✌💪🎉🚀</td>\n      <td>聚合多模型，提供统一接口和负载均衡。</td>\n    </tr>\n<tr>\n  <td>35</td>\n  <td>AI.LS</td>\n  <td><a href=\"https://ai.ls/\" target=\"_blank\">https://ai.ls</a></td>\n  <td>🆓✌</td>\n  <td>极简接口，GPT-3.5免费匿名使用</td>\n</tr>\n<tr>\n  <td>36</td>\n  <td>简易API</td>\n  <td><a href=\"https://jeniya.top/\" target=\"_blank\">https://jeniya.top</a></td>\n  <td>🔓✌💪🎉🎁</td>\n  <td>注册送¥100额度，支持Claude/GPT-4o多模型</td>\n</tr>\n<tr>\n  <td>37</td>\n  <td>OpenAI120</td>\n  <td><a href=\"https://openai120.com/\" target=\"_blank\">https://openai120.com</a></td>\n  <td>🔓✌🎁</td>\n  <td>新用户送$3额度，单价同官方</td>\n</tr>\n<tr>\n  <td>38</td>\n  <td>DuckAGI</td>\n  <td><a href=\"https://duckagi.com/\" target=\"_blank\">https://duckagi.com</a></td>\n  <td>💰✌🎉🚀</td>\n  <td>多模态支持GPT-4o/Sora，适合AI绘图</td>\n</tr>\n<tr>\n  <td>39</td>\n  <td>Aihubmix</td>\n  <td><a href=\"https://aihubmix.com/\" target=\"_blank\">https://aihubmix.com</a></td>\n  <td>💰🎉</td>\n  <td>国产模型聚合（文心一言/通义千问）</td>\n</tr>\n<tr>\n  <td>40</td>\n  <td>WokaAI</td>\n  <td><a href=\"https://wokaai.com/\" target=\"_blank\">https://wokaai.com</a></td>\n  <td>✌🚩✔</td>\n  <td>上海企业运营，ICP备案双线路</td>\n</tr>\n<tr>\n  <td>41</td>\n  <td>azapi</td>\n  <td><a href=\"https://azapi.com.cn/\" target=\"_blank\">https://azapi.com.cn</a></td>\n  <td>💰🚩✔</td>\n  <td>杭州企业备案，长期使用优惠</td>\n</tr>\n<tr>\n  <td>42</td>\n  <td>ClaudeAPI</td>\n  <td><a href=\"https://claudeapi.io/\" target=\"_blank\">https://claudeapi.io</a></td>\n  <td>💪🚀✔</td>\n  <td>Anthropic官方合作，支持文件解析</td>\n</tr>\n<tr>\n  <td>43</td>\n  <td>Gala API</td>\n  <td><a href=\"https://galaapi.com/\" target=\"_blank\">https://galaapi.com</a></td>\n  <td>🎉🚀✔</td>\n  <td>谷歌Gemini专用高速通道</td>\n</tr>\n  </tbody>\n</table>\n"
  },
  {
    "path": "website/attached_assets/Pasted--DOCTYPE-html-html-lang-zh-CN-head-meta-charset-UTF-8-meta-name-viewport-co-1751255172628_1751255172630.txt",
    "content": "<!DOCTYPE html>\r\n<html lang=\"zh-CN\">\r\n<head>\r\n  <meta charset=\"UTF-8\" />\r\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\r\n  <title>AI 聊天工具推荐表生成器</title>\r\n  <style>\r\n    /* 全局样式 */\r\n    * {\r\n      box-sizing: border-box;\r\n      margin: 0;\r\n      padding: 0;\r\n    }\r\n    body {\r\n      font-family: \"Segoe UI\", Tahoma, Geneva, Verdana, sans-serif;\r\n      background-color: #f0f2f5;\r\n      padding: 20px;\r\n      color: #333;\r\n    }\r\n    h2, h3 {\r\n      margin-bottom: 12px;\r\n      color: #444;\r\n    }\r\n    /* 卡片容器样式 */\r\n    .card {\r\n      background-color: #fff;\r\n      border-radius: 8px;\r\n      box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\r\n      margin-bottom: 20px;\r\n      padding: 20px;\r\n    }\r\n    .legend p {\r\n      margin-bottom: 8px;\r\n      line-height: 1.6;\r\n    }\r\n    /* 输入区域样式 */\r\n    .input-row {\r\n      display: flex;\r\n      flex-wrap: wrap;\r\n      gap: 12px;\r\n      align-items: center;\r\n      margin-top: 10px;\r\n    }\r\n    .input-row input[type=\"text\"],\r\n    .input-row input[type=\"url\"],\r\n    .input-row input[type=\"password\"],\r\n    .input-row textarea {\r\n      border: 1px solid #ccc;\r\n      border-radius: 4px;\r\n      padding: 8px;\r\n      font-size: 14px;\r\n      background-color: #fafafa;\r\n      transition: border-color 0.2s;\r\n    }\r\n    .input-row input[type=\"text\"] {\r\n      width: 160px;\r\n    }\r\n    .input-row input[type=\"url\"] {\r\n      width: 200px;\r\n    }\r\n    .input-row input[type=\"password\"] {\r\n      width: 200px;\r\n    }\r\n    .input-row textarea {\r\n      width: 280px;\r\n      height: 28px;\r\n      resize: vertical;\r\n    }\r\n    .input-row input:focus,\r\n    .input-row textarea:focus {\r\n      border-color: #409eff;\r\n      outline: none;\r\n      background-color: #fff;\r\n    }\r\n    /* 按钮样式 */\r\n    button {\r\n      border: none;\r\n      border-radius: 4px;\r\n      background-color: #409eff;\r\n      color: #fff;\r\n      padding: 8px 14px;\r\n      font-size: 14px;\r\n      cursor: pointer;\r\n      transition: background-color 0.2s;\r\n    }\r\n    button:hover {\r\n      background-color: #66b1ff;\r\n    }\r\n    button:active {\r\n      background-color: #3a8ee6;\r\n    }\r\n    /* 复选框标签样式 */\r\n    #tagCheckboxes {\r\n      display: flex;\r\n      flex-wrap: wrap;\r\n      gap: 8px;\r\n      max-width: 400px;\r\n      margin-top: 4px;\r\n    }\r\n    #tagCheckboxes label {\r\n      display: flex;\r\n      align-items: center;\r\n      background-color: #eef2f7;\r\n      border-radius: 4px;\r\n      padding: 4px 8px;\r\n      font-size: 13px;\r\n      cursor: pointer;\r\n      transition: background-color 0.2s;\r\n    }\r\n    #tagCheckboxes input[type=\"checkbox\"] {\r\n      margin-right: 4px;\r\n      accent-color: #409eff;\r\n    }\r\n    #tagCheckboxes label:hover {\r\n      background-color: #dde6f7;\r\n    }\r\n    /* 表格样式 */\r\n    table {\r\n      width: 100%;\r\n      border-collapse: collapse;\r\n      background-color: #fff;\r\n      border-radius: 8px;\r\n      overflow: hidden;\r\n      box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\r\n    }\r\n    th, td {\r\n      border-bottom: 1px solid #ececec;\r\n      padding: 12px;\r\n      text-align: left;\r\n      vertical-align: top;\r\n      font-size: 14px;\r\n      color: #555;\r\n    }\r\n    th {\r\n      background-color: #f7f9fc;\r\n      font-weight: 600;\r\n    }\r\n    tbody tr:hover {\r\n      background-color: #f5f7fa;\r\n    }\r\n    .row-buttons button {\r\n      margin-right: 6px;\r\n      padding: 4px 8px;\r\n      font-size: 13px;\r\n      background-color: #67c23a;\r\n    }\r\n    .row-buttons button:hover {\r\n      background-color: #85ce61;\r\n    }\r\n    .row-buttons button:active {\r\n      background-color: #5daf31;\r\n    }\r\n    /* 文本区域样式 */\r\n    #generatedHtml {\r\n      width: 100%;\r\n      height: 300px;\r\n      font-family: Consolas, \"Courier New\", monospace;\r\n      border: 1px solid #ccc;\r\n      border-radius: 4px;\r\n      padding: 10px;\r\n      resize: vertical;\r\n      background-color: #fafafa;\r\n      margin-top: 10px;\r\n    }\r\n    /* 辅助按钮样式 */\r\n    #copyHtmlBtn {\r\n      margin-left: 10px;\r\n      background-color: #e6a23c;\r\n    }\r\n    #copyHtmlBtn:hover {\r\n      background-color: #ebb563;\r\n    }\r\n    #copyHtmlBtn:active {\r\n      background-color: #c5802f;\r\n    }\r\n    /* 加载状态 */\r\n    .loading {\r\n      opacity: 0.6;\r\n      pointer-events: none;\r\n    }\r\n    /* 设置面板 */\r\n    #settingsPanel {\r\n      display: none;\r\n      position: fixed;\r\n      top: 50%;\r\n      left: 50%;\r\n      transform: translate(-50%, -50%);\r\n      background-color: #fff;\r\n      padding: 20px;\r\n      border-radius: 8px;\r\n      box-shadow: 0 2px 8px rgba(0,0,0,0.2);\r\n      width: 400px;\r\n      z-index: 1000;\r\n    }\r\n    #settingsPanel h3 {\r\n      margin-bottom: 10px;\r\n    }\r\n    #settingsOverlay {\r\n      display: none;\r\n      position: fixed;\r\n      top: 0;\r\n      left: 0;\r\n      width: 100%;\r\n      height: 100%;\r\n      background: rgba(0,0,0,0.5);\r\n      z-index: 999;\r\n    }\r\n    #settingsPanel input {\r\n      width: 100%;\r\n      margin-bottom: 12px;\r\n    }\r\n    #settingsPanel button {\r\n      width: 48%;\r\n      margin-right: 4%;\r\n    }\r\n    #settingsPanel button:last-child {\r\n      margin-right: 0;\r\n    }\r\n  </style>\r\n</head>\r\n<body>\r\n  <h2>AI 聊天工具推荐表生成器</h2>\r\n  <div class=\"card legend\">\r\n    <p><strong>赞助方平台将加入邀请码，感谢您的支持</strong></p>\r\n    <p><strong>标签含义：</strong><br>\r\n    &emsp;- 🆓 完全免费<br>\r\n    &emsp;- 🔓 有免费额度<br>\r\n    &emsp;- 💰 需要充值<br>\r\n    &emsp;- 💪 支持 Claude 最新模型<br>\r\n    &emsp;- ✌ 支持 OpenAI 最新模型<br>\r\n    &emsp;- 🎉 支持其他模型或其他功能<br>\r\n    &emsp;- 🌎 需要国际网络<br>\r\n    &emsp;- 🎁 充值有较大优惠（<50%）<br>\r\n    &emsp;- 🚀 支持高并发<br>\r\n    &emsp;- 😆 签到领余额<br>\r\n    &emsp;- 🚩 网站通过中国备案<br>\r\n    &emsp;- ✔ 已验证安全性/真实性</p>\r\n  </div>\r\n\r\n  <!-- 导入原有供应商 HTML -->\r\n  <div class=\"card import-section\">\r\n    <h3>📥 导入原有供应商 HTML</h3>\r\n    <p>请在下方粘贴已有的 <code>&lt;table&gt;</code> 部分（从 <code>&lt;table&gt;</code> 到 <code>&lt;/table&gt;</code>），然后点击“导入供应商”按钮。</p>\r\n    <textarea id=\"importHtmlTextarea\" placeholder=\"在此粘贴原有的 <table> ... </table> HTML 代码\"></textarea>\r\n    <button id=\"importBtn\" style=\"margin-top: 10px;\">导入供应商</button>\r\n  </div>\r\n\r\n  <!-- 新增或编辑供应商项 -->\r\n  <div class=\"card input-section\">\r\n    <h3>➕ 添加或编辑供应商</h3>\r\n    <div class=\"input-row\">\r\n      <input type=\"text\" id=\"siteName\" placeholder=\"网站名称\" disabled />\r\n      <input type=\"url\" id=\"siteLink\" placeholder=\"链接 (包含 https://)\" />\r\n      <input type=\"password\" id=\"apiKeyInput\" placeholder=\"OpenAI API Key (sk-...)\" />\r\n      <button id=\"autoTagBtn\">AI 自动标注</button>\r\n      <button id=\"openSettingsBtn\">设置</button>\r\n    </div>\r\n    <div class=\"input-row\" style=\"margin-top: 8px;\">\r\n      <div id=\"tagCheckboxes\">\r\n        <label><input type=\"checkbox\" value=\"🆓\">🆓</label>\r\n        <label><input type=\"checkbox\" value=\"🔓\">🔓</label>\r\n        <label><input type=\"checkbox\" value=\"💰\">💰</label>\r\n        <label><input type=\"checkbox\" value=\"💪\">💪</label>\r\n        <label><input type=\"checkbox\" value=\"✌\">✌</label>\r\n        <label><input type=\"checkbox\" value=\"🎉\">🎉</label>\r\n        <label><input type=\"checkbox\" value=\"🌎\">🌎</label>\r\n        <label><input type=\"checkbox\" value=\"🎁\">🎁</label>\r\n        <label><input type=\"checkbox\" value=\"🚀\">🚀</label>\r\n        <label><input type=\"checkbox\" value=\"😆\">😆</label>\r\n        <label><input type=\"checkbox\" value=\"🚩\">🚩</label>\r\n        <label><input type=\"checkbox\" value=\"✔\">✔</label>\r\n      </div>\r\n      <textarea id=\"siteRemark\" placeholder=\"备注\"></textarea>\r\n      <button id=\"addRowBtn\" disabled>添加提供方</button>\r\n    </div>\r\n  </div>\r\n\r\n  <!-- 编辑表格区 -->\r\n  <div class=\"card\">\r\n    <table id=\"providerTable\">\r\n      <thead>\r\n        <tr>\r\n          <th style=\"width: 60px;\">序号</th>\r\n          <th>网站</th>\r\n          <th>链接</th>\r\n          <th>标签</th>\r\n          <th>备注</th>\r\n          <th style=\"width: 120px;\">操作</th>\r\n        </tr>\r\n      </thead>\r\n      <tbody>\r\n        <!-- 动态插入行 -->\r\n      </tbody>\r\n    </table>\r\n  </div>\r\n\r\n  <!-- 生成与复制 HTML -->\r\n  <button id=\"generateHtmlBtn\">一键生成 HTML</button>\r\n  <button id=\"copyHtmlBtn\">复制 HTML 到剪贴板</button>\r\n  <textarea id=\"generatedHtml\" readonly placeholder=\"生成的 HTML 会显示在这里，可一键复制\"></textarea>\r\n\r\n  <!-- 设置面板 -->\r\n  <div id=\"settingsOverlay\"></div>\r\n  <div id=\"settingsPanel\">\r\n    <h3>⚙️ API 设置</h3>\r\n    <label for=\"apiUrlInput\">请求 URL:</label>\r\n    <input type=\"text\" id=\"apiUrlInput\" value=\"https://api.openai.com/v1/chat/completions\" />\r\n    <label for=\"modelInput\">模型:</label>\r\n    <input type=\"text\" id=\"modelInput\" value=\"gpt-3.5-turbo\" />\r\n    <div style=\"text-align: right;\">\r\n      <button id=\"saveSettingsBtn\">保存</button>\r\n      <button id=\"cancelSettingsBtn\">取消</button>\r\n    </div>\r\n  </div>\r\n\r\n  <script>\r\n    let apiUrl = 'https://api.openai.com/v1/chat/completions';\r\n    let modelName = 'gpt-3.5-turbo';\r\n\r\n    const providerTableBody = document.querySelector('#providerTable tbody');\r\n    const siteNameInput = document.getElementById('siteName');\r\n    const siteLinkInput = document.getElementById('siteLink');\r\n    const apiKeyInput = document.getElementById('apiKeyInput');\r\n    const autoTagBtn = document.getElementById('autoTagBtn');\r\n    const addRowBtn = document.getElementById('addRowBtn');\r\n    const generateHtmlBtn = document.getElementById('generateHtmlBtn');\r\n    const copyHtmlBtn = document.getElementById('copyHtmlBtn');\r\n    const generatedHtmlTextarea = document.getElementById('generatedHtml');\r\n    const importBtn = document.getElementById('importBtn');\r\n    const importHtmlTextarea = document.getElementById('importHtmlTextarea');\r\n    const openSettingsBtn = document.getElementById('openSettingsBtn');\r\n    const settingsOverlay = document.getElementById('settingsOverlay');\r\n    const settingsPanel = document.getElementById('settingsPanel');\r\n    const apiUrlInput = document.getElementById('apiUrlInput');\r\n    const modelInput = document.getElementById('modelInput');\r\n    const saveSettingsBtn = document.getElementById('saveSettingsBtn');\r\n    const cancelSettingsBtn = document.getElementById('cancelSettingsBtn');\r\n\r\n    // 更新序号\r\n    function updateRowNumbers() {\r\n      const rows = providerTableBody.querySelectorAll('tr');\r\n      rows.forEach((row, index) => {\r\n        row.querySelector('.indexCell').innerText = index + 1;\r\n      });\r\n    }\r\n\r\n    // 创建一行\r\n    function createRow(name, link, tags, remark) {\r\n      const tr = document.createElement('tr');\r\n\r\n      const indexTd = document.createElement('td');\r\n      indexTd.className = 'indexCell';\r\n      indexTd.innerText = providerTableBody.children.length + 1;\r\n\r\n      const nameTd = document.createElement('td');\r\n      nameTd.contentEditable = true;\r\n      nameTd.innerText = name;\r\n\r\n      const linkTd = document.createElement('td');\r\n      linkTd.contentEditable = true;\r\n      const a = document.createElement('a');\r\n      a.href = link;\r\n      a.innerText = link;\r\n      a.target = '_blank';\r\n      linkTd.appendChild(a);\r\n\r\n      const tagsTd = document.createElement('td');\r\n      tagsTd.contentEditable = true;\r\n      tagsTd.innerText = tags;\r\n\r\n      const remarkTd = document.createElement('td');\r\n      remarkTd.contentEditable = true;\r\n      remarkTd.innerText = remark;\r\n\r\n      const actionTd = document.createElement('td');\r\n      actionTd.className = 'row-buttons';\r\n      const upBtn = document.createElement('button');\r\n      upBtn.innerText = '↑'; upBtn.onclick = () => moveRowUp(tr);\r\n      const downBtn = document.createElement('button');\r\n      downBtn.innerText = '↓'; downBtn.onclick = () => moveRowDown(tr);\r\n      const deleteBtn = document.createElement('button');\r\n      deleteBtn.innerText = '删除'; deleteBtn.onclick = () => deleteRow(tr);\r\n      actionTd.appendChild(upBtn);\r\n      actionTd.appendChild(downBtn);\r\n      actionTd.appendChild(deleteBtn);\r\n\r\n      tr.appendChild(indexTd);\r\n      tr.appendChild(nameTd);\r\n      tr.appendChild(linkTd);\r\n      tr.appendChild(tagsTd);\r\n      tr.appendChild(remarkTd);\r\n      tr.appendChild(actionTd);\r\n\r\n      return tr;\r\n    }\r\n\r\n    // 清空输入框\r\n    function clearInputs() {\r\n      siteNameInput.value = '';\r\n      siteLinkInput.value = '';\r\n      apiKeyInput.value = '';\r\n      document.getElementById('siteRemark').value = '';\r\n      document.querySelectorAll('#tagCheckboxes input[type=\"checkbox\"]').forEach(chk => chk.checked = false);\r\n      addRowBtn.disabled = true;\r\n      siteNameInput.disabled = true;\r\n    }\r\n\r\n    // 手动添加行\r\n    function addRow() {\r\n      const name = siteNameInput.value.trim();\r\n      const link = siteLinkInput.value.trim();\r\n      const remark = document.getElementById('siteRemark').value.trim();\r\n\r\n      const tagCheckboxes = document.querySelectorAll('#tagCheckboxes input[type=\"checkbox\"]:checked');\r\n      const selectedTags = Array.from(tagCheckboxes).map(chk => chk.value);\r\n      const tags = selectedTags.join('');\r\n\r\n      if (!name || !link) {\r\n        alert('请填写“网站名称”和“链接”');\r\n        return;\r\n      }\r\n      const newRow = createRow(name, link, tags, remark);\r\n      providerTableBody.appendChild(newRow);\r\n      updateRowNumbers();\r\n      clearInputs();\r\n    }\r\n\r\n    // AI 自动标注，结果填充到输入框，待人工复核\r\n    async function autoTagAndFill() {\r\n      const key = apiKeyInput.value.trim();\r\n      const link = siteLinkInput.value.trim();\r\n      if (!key) { alert('请填写 OpenAI API Key。'); return; }\r\n      if (!link) { alert('请填写“链接”以进行 AI 自动标注。'); return; }\r\n      autoTagBtn.classList.add('loading');\r\n      autoTagBtn.innerText = '标注中...';\r\n\r\n      const prompt = `请根据以下网站链接，提取网站名称，并生成适合的标签（从以下列表中选择，多个标签请用无空格连续字符形式）：🆓🔓💰💪✌🎉🌎🎁🚀😆🚩✔ 。并生成一句简洁备注，说明该站的主要特点。例如：\\n输入链接：${link}\\n请输出 JSON 格式：{\\\"name\\\": \\\"网站名称\\\", \\\"tags\\\": \\\"标签串\\\", \\\"remark\\\": \\\"备注内容\\\"}`;\r\n\r\n      try {\r\n        const response = await fetch(apiUrl, {\r\n          method: 'POST', headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${key}` },\r\n          body: JSON.stringify({ model: modelName, messages: [{ role: 'user', content: prompt }], temperature: 0.7, max_tokens: 500 })\r\n        });\r\n        const data = await response.json();\r\n        const content = data.choices[0].message.content.trim();\r\n        let obj;\r\n        try { obj = JSON.parse(content); } catch (e) { const match = content.match(/\\{[\\s\\S]*\\}/); obj = match ? JSON.parse(match[0]) : null; }\r\n        if (!obj || !obj.name) throw new Error('AI 返回格式不符合要求');\r\n        siteNameInput.value = obj.name;\r\n        const tagsArr = obj.tags.split('');\r\n        document.querySelectorAll('#tagCheckboxes input[type=\"checkbox\"]').forEach(chk => chk.checked = tagsArr.includes(chk.value));\r\n        document.getElementById('siteRemark').value = obj.remark;\r\n        siteNameInput.disabled = false;\r\n        addRowBtn.disabled = false;\r\n      } catch (error) {\r\n        console.error(error);\r\n        alert('AI 自动标注出错，请检查 API Key 与网络连接，或稍后重试。');\r\n      } finally {\r\n        autoTagBtn.classList.remove('loading');\r\n        autoTagBtn.innerText = 'AI 自动标注';\r\n      }\r\n    }\r\n\r\n    // 行上移\r\n    function moveRowUp(row) {\r\n      const prev = row.previousElementSibling;\r\n      if (prev) { providerTableBody.insertBefore(row, prev); updateRowNumbers(); }\r\n    }\r\n\r\n    // 行下移\r\n    function moveRowDown(row) {\r\n      const next = row.nextElementSibling;\r\n      if (next) { providerTableBody.insertBefore(next, row); updateRowNumbers(); }\r\n    }\r\n\r\n    // 删除行\r\n    function deleteRow(row) {\r\n      providerTableBody.removeChild(row);\r\n      updateRowNumbers();\r\n    }\r\n\r\n    // 生成最终 HTML\r\n    function generateHtml() {\r\n      let html = '<p><strong>赞助方平台将加入邀请码，感谢您的支持</strong></p>\\n';\r\n      html += '<p><strong>标签含义：</strong><br>\\n';\r\n      html += '&emsp;- 🆓 完全免费<br>\\n';\r\n      html += '&emsp;- 🔓 有免费额度<br>\\n';\r\n      html += '&emsp;- 💰 需要充值<br>\\n';\r\n      html += '&emsp;- 💪 支持 Claude 最新模型<br>\\n';\r\n      html += '&emsp;- ✌ 支持 OpenAI 最新模型<br>\\n';\r\n      html += '&emsp;- 🎉 支持其他模型或其他功能<br>\\n';\r\n      html += '&emsp;- 🌎 需要国际网络<br>\\n';\r\n      html += '&emsp;- 🎁 充值有较大优惠（<50%）<br>\\n';\r\n      html += '&emsp;- 🚀 支持高并发<br>\\n';\r\n      html += '&emsp;- 😆 签到领余额<br>\\n';\r\n      html += '&emsp;- 🚩 网站通过中国备案<br>\\n';\r\n      html += '&emsp;- ✔ 已验证安全性/真实性</p>\\n\\n';\r\n\r\n      html += '<table border=\\\"1\\\" cellspacing=\\\"0\\\" cellpadding=\\\"6\\\">\\n';\r\n      html += '  <thead>\\n';\r\n      html += '    <tr>\\n';\r\n      html += '      <th>序号</th>\\n';\r\n      html += '      <th>网站</th>\\n';\r\n      html += '      <th>链接</th>\\n';\r\n      html += '      <th>标签</th>\\n';\r\n      html += '      <th>备注</th>\\n';\r\n      html += '    </tr>\\n';\r\n      html += '  </thead>\\n';\r\n      html += '  <tbody>\\n';\r\n\r\n      const rows = providerTableBody.querySelectorAll('tr');\r\n      rows.forEach((row, index) => {\r\n        const cols = row.querySelectorAll('td');\r\n        const name = cols[1].innerText.trim();\r\n        const link = cols[2].querySelector('a').href.trim();\r\n        const tags = cols[3].innerText.trim();\r\n        const remark = cols[4].innerText.trim();\r\n\r\n        html += '    <tr>\\n';\r\n        html += `      <td>${index + 1}</td>\\n`;\r\n        html += `      <td>${name}</td>\\n`;\r\n        html += `      <td><a href=\\\"${link}\\\" target=\\\"_blank\\\">${link}</a></td>\\n`;\r\n        html += `      <td>${tags}</td>\\n`;\r\n        html += `      <td>${remark}</td>\\n`;\r\n        html += '    </tr>\\n';\r\n      });\r\n\r\n      html += '  </tbody>\\n';\r\n      html += '</table>';\r\n\r\n      generatedHtmlTextarea.value = html;\r\n    }\r\n\r\n    // 复制 HTML 到剪贴板\r\n    function copyHtmlToClipboard() {\r\n      generatedHtmlTextarea.select();\r\n      document.execCommand('copy');\r\n      alert('HTML 已复制到剪贴板！');\r\n    }\r\n\r\n    // 导入已有的 <table> HTML\r\n    function importProvidersFromHtml() {\r\n      const rawHtml = importHtmlTextarea.value.trim();\r\n      if (!rawHtml) { alert('请先在上方粘贴已有的 <table> ... </table> HTML 代码！'); return; }\r\n      const parser = new DOMParser();\r\n      const doc = parser.parseFromString(rawHtml, 'text/html');\r\n      const rows = doc.querySelectorAll('tbody tr');\r\n      if (!rows.length) { alert('未能识别到有效的 <tbody><tr> ... 行，请检查粘贴内容格式'); return; }\r\n\r\n      providerTableBody.innerHTML = '';\r\n      rows.forEach(row => {\r\n        const cols = row.querySelectorAll('td');\r\n        if (cols.length < 5) return;\r\n        const name = cols[1].innerText.trim();\r\n        const linkATag = cols[2].querySelector('a');\r\n        const link = linkATag ? linkATag.href.trim() : cols[2].innerText.trim();\r\n        const tags = cols[3].innerText.trim();\r\n        const remark = cols[4].innerText.trim();\r\n        const newRow = createRow(name, link, tags, remark);\r\n        providerTableBody.appendChild(newRow);\r\n      });\r\n\r\n      updateRowNumbers();\r\n      alert('导入完成！已将行数添加到表格中。');\r\n      importHtmlTextarea.value = '';\r\n    }\r\n\r\n    // 打开设置面板\r\n    openSettingsBtn.addEventListener('click', () => {\r\n      settingsOverlay.style.display = 'block';\r\n      settingsPanel.style.display = 'block';\r\n      apiUrlInput.value = apiUrl;\r\n      modelInput.value = modelName;\r\n    });\r\n    // 取消设置\r\n    cancelSettingsBtn.addEventListener('click', () => {\r\n      settingsOverlay.style.display = 'none';\r\n      settingsPanel.style.display = 'none';\r\n    });\r\n    // 保存设置\r\n    saveSettingsBtn.addEventListener('click', () => {\r\n      apiUrl = apiUrlInput.value.trim() || apiUrl;\r\n      modelName = modelInput.value.trim() || modelName;\r\n      settingsOverlay.style.display = 'none';\r\n      settingsPanel.style.display = 'none';\r\n      alert(`设置已保存：\\n请求 URL：${apiUrl}\\n模型：${modelName}`);\r\n    });\r\n\r\n    autoTagBtn.addEventListener('click', autoTagAndFill);\r\n    addRowBtn.addEventListener('click', addRow);\r\n    generateHtmlBtn.addEventListener('click', generateHtml);\r\n    copyHtmlBtn.addEventListener('click', copyHtmlToClipboard);\r\n    importBtn.addEventListener('click', importProvidersFromHtml);\r\n  </script>\r\n</body>\r\n</html>"
  },
  {
    "path": "website/attached_assets/Pasted--Logo-lionbridge-com-weglot-c-1750993147083_1750993147084.txt",
    "content": "网站应采用一致的全局模板保证各语言界面风格统一。页面风格要简洁明快，品牌元素（Logo、色彩、字体）在各语种页面中保持一致，这可以提高用户识别度和信任感\nlionbridge.com\nweglot.com\n。推荐使用响应式设计与灵活布局，以便不同语言（包括中、英、俄、法等）文字长度变化时，都能自动适配界面而不破坏排版。 图：带有全球旗帜的地图示意网站面向全球用户。\n全局模板：采用相同布局模板，各语种页面仅作必要定制，避免重复开发，确保品牌形象一致\nlionbridge.com\nweglot.com\n。例如，所有语言版本应使用相同的导航栏、页面结构和配色方案。\n简洁风格：界面应保持简洁，避免过度复杂的交互（如多层级步骤），否则会增加后续本地化难度\nrubric.com\n。文本用语应清晰易懂，并预留足够空间，因为多数语言（如德语、法语）翻译后比英语或中文占用更大篇幅\nrubric.com\nsmart-interface-design-patterns.com\n。\n语言切换与导航设计\n页面顶部或底部要放置语言切换器，位置醒目且易于访问\nweglot.com\nlionbridge.com\n。常见做法是在顶栏右上角或页脚提供下拉菜单，让用户能够随时更换语言。语言列表应以原生语言名称显示（如「English」、「中文」、「Русский」、「Français」），而不是使用国旗图标，以避免同一语言对应多个国家（如阿拉伯语）或多语言国家的歧义\nlionbridge.com\nweglot.com\n。也可以根据需要结合自动检测（根据浏览器语言或地区）与手动选择，使用户体验更友好\nrubric.com\nrubric.com\n。\n易查找：确保切换器在每页均可见；使用下拉框或固定按钮形式都可，但要直观标明“语言”或使用地球等通用图标。\nweglot.com\n语言名称：始终用目标语言自身的名称标识（如「Deutsch」而非“German”）\nweglot.com\n；避免使用国家/地区标志图标来代表语言\nlionbridge.com\n。\n导航一致：导航菜单、侧边栏等在不同语言间结构相同，各项功能（如 API 列表、使用指南、失效列表等）应一一对应，保持布局和层级一致性。\n图：手机应用中的语言选择界面示例（原生语言名称）。\n内容展示与数据表格\n项目的核心是第三方 API 提供商列表，界面展示时可采用表格或卡片式列表。表格设计应遵循可读性和响应式原则\nuxpin.com\nuxpin.com\n：\n清晰表头与排版：每列有明确表头（如「序号」「网站」「链接」「标签」「备注」）。使用可分辨的字体、适当的行列间距，以及斑马纹等视觉分隔\nuxpin.com\nuxpin.com\n，以提高扫描效率。\n信息层级：重要信息置于左侧（如网站名和链接），按重要性合理排序\nuxpin.com\n。标签列可使用图标+文字（例如🔓 表示解锁模式，🆓 表示免费），使属性一目了然。链接列可以提供超链接或复制按钮方便访问。\n响应式布局：表格在小屏设备上应自动适应。可以在移动端使用水平滚动或卡片布局，确保阅读体验不受影响\nuxpin.com\nrubric.com\n。\n辅助功能：为表格添加 <caption>、表头作用域（<th scope>）等 HTML 标记，以提升可访问性；确保文字大小、颜色对比度满足无障碍标准，便于不同用户群体使用\nuxpin.com\n。\n若列表数据较长，可加入搜索和筛选功能，让用户按标签（如免费、有优惠、支持模型）过滤平台；或者提供分页、排序等交互，方便快速定位目标项\nuxpin.com\nuxpin.com\n。\n图标、徽章与交互元素\n在品牌和表格基础上，可使用**徽章（Badge）**或图标来突出信息，但要保持简洁不繁琐\ncieden.com\ncieden.com\n：\n状态徽章：在表格“标签”列为各平台添加状态徽章，如“🆓”标记免费，“✔”标记已验证，“💰”表示付费等。使用简短文字或符号加图标的组合，以提高可读性\ncieden.com\n。\n一致风格：徽章大小、形状和颜色应与整体UI风格一致，不抢夺主体内容注意力。图标选用各文化通用的符号，避免含义可能产生歧义的表情或国旗\ncieden.com\nrubric.com\n。\n可交互提示：对重要按钮（如“复制链接”、“更多详情”等）使用悬浮提示（Tooltip）说明其功能，或增加点击反馈。确保交互元素（链接、按钮）明显可识别，并使用对比色或下划线加以区分。\n响应式布局与无障碍\n网站必须响应式设计，在不同分辨率和设备上均能良好展示\nuxpin.com\nrubric.com\n。设计时要考虑文字长度变化对布局的影响\nsmart-interface-design-patterns.com\n：例如中文标题较短但德语或俄语可能更长，应留白以防文字溢出。可以通过**伪本地化（pseudolocalization）**测试工具，模拟文本拉长后界面表现，及时调整布局。\nsmart-interface-design-patterns.com\n移动端优先：鉴于手机用户众多，设计要保证在小屏幕下菜单可折叠、表格可横向滑动或变换为卡片显示\nrubric.com\nuxpin.com\n。关键按钮和链接区域留足点触尺寸，使用弹性布局避免内容被遮挡。\n字体与图形：选择支持多语言字符集的字体，尤其要涵盖汉字、西里尔字母、拉丁字母等字符。考虑界面元素在不同语言下的视觉效果（如翻译后图像描述是否适用）。\n无障碍：所有图片应提供 alt 文本说明，表格提供 caption 说明。导航和互动元素使用语义 HTML（如 <nav>, <button>）并保证键盘可操作，以方便使用辅助技术的用户。\n国际化和本地化细节\n从项目一开始就规划国际化非常关键\nrubric.com\n。以下是一些关键点：\n避免拼接文本：设计界面时尽量不将可变部分和固定文本简单拼接。各语言语法顺序不同，拼接容易导致翻译错误\nrubric.com\n。可用占位符方式或整体短语来避免翻译紊乱。\n文化差异：图标、颜色和习惯用语在不同文化中含义不同。使用前测试图标象征意义，避免敏感色彩（如部分地区避免红色、白色组合），确保所用图像和例子在目标市场可接受。\nRTL 支持：若未来支持阿拉伯语、希伯来语等右到左语言，需要提前考虑整个界面水平翻转的能力\nsmart-interface-design-patterns.com\n。字体选择、组件方向（如切换器下拉打开方向）都需适配。\n测试与迭代：利用多语言测试和用户反馈，不断改进。可以请不同母语的同事或用户试用并提出意见，确保文本无歧义、界面易用。\n总之，高质量多语言网站应以一致性和简洁性为核心，结合响应式布局、清晰交互和国际化设计，确保无论用何种语言访问，用户都能获得流畅、直观的体验\nweglot.com\nrubric.com\n。 主要设计要点：\n使用全局模板保证品牌和布局一致；界面简洁，考虑文本长度差异\nlionbridge.com\nrubric.com\n。\n语言切换器显眼可点，列出语言本名，避免单用国旗\nweglot.com\nlionbridge.com\n。\n列表或表格遵循可读性原则：清晰表头、固定首行、适度空白、斑马线划分\nuxpin.com\nuxpin.com\n。\n徽章和图标要简练、可理解，提示性功能使用悬停提示\ncieden.com\nrubric.com\n。\n界面需响应式且无障碍：在不同设备上都能正常操作，并支持辅助技术\nuxpin.com\nrubric.com\n。\n从设计阶段即支持国际化，预留布局灵活性，避免拼接文本，以便后续翻译和语言扩展"
  },
  {
    "path": "website/attached_assets/Pasted--UI-Openai-Claude-Deepseek-API-Provider-Last-Commit-https-img--1750993131108_1750993131110.txt",
    "content": "根据以下内容生成一个高质量UI网站（多语言支持）  # 🌐 Openai / Claude / Deepseek API Provider\n\n[![Last Commit](https://img.shields.io/github/last-commit/TechnologyStar/Openai-Claude-Deepseek-API-provider)](https://github.com/TechnologyStar/Openai-Claude-Deepseek-API-provider)\n[![License](https://img.shields.io/github/license/TechnologyStar/Openai-Claude-Deepseek-API-provider)](https://github.com/TechnologyStar/Openai-Claude-Deepseek-API-provider/blob/main/LICENSE)\n\n\n> 🏗️ A curated list of third-party platforms providing **OpenAI / Claude / DeepSeek** APIs for learning, research, and non-commercial use.\n\n<p align=\"center\">\n  <a href=\"README.md\" title=\"中文\"><img src=\"https://img.shields.io/badge/🇨🇳 中文-阅读-blue?style=flat-square\" alt=\"中文版\"/></a>\n  <a href=\"en.md\" title=\"English\"><img src=\"https://img.shields.io/badge/🇬🇧 English-Read-blue?style=flat-square\" alt=\"English\"/></a>\n  <a href=\"Russian.md\" title=\"Русский\"><img src=\"https://img.shields.io/badge/🇷🇺 Русский-Читать-blue?style=flat-square\" alt=\"Русская версия\"/></a>\n  <a href=\"french.md\" title=\"Français\"><img src=\"https://img.shields.io/badge/🇫🇷 Français-Lire-blue?style=flat-square\" alt=\"Version Française\"/></a>\n</p>\n\n> 🏗️ 精选的第三方平台列表，提供 **OpenAI / Claude / DeepSeek** API，供学习、研究和非商业使用。\n\n---\n\n> ⚠️ **使用说明**\n>\n> 本项目为免费公益项目，严格禁止任何违法用途。\n>\n> * 遵守 [OpenAI 使用条款](https://openai.com/policies/terms-of-use)\n> * 遵守 [《生成式人工智能服务管理暂行办法》](http://www.cac.gov.cn/2023-07/13/c_1690898327029107.htm)，**请勿对中国公众提供未经备案的生成式AI服务**。\n\n---\n\n## 🚀 项目简介\n\n* 📌 收录并验证来自互联网的第三方 API 提供平台（部分免费）\n* 🔧 免注册 / 一键接入 / 支持多模型（OpenAI、Claude、DeepSeek 等）\n* 🔒 所有网站仅作收录展示，**请勿输入个人敏感信息**\n\n> 💡 如果觉得项目有帮助，欢迎 Star 🌟\n\n---\n\n## 🎁 特色标签说明\n\n| 标签 | 含义                 |\n| -- | ------------------ |\n| 🆓 | 完全免费               |\n| 🔓 | 有免费额度              |\n| 💰 | 需要充值               |\n| 💪 | Claude 最新支持        |\n| ✌  | OpenAI 最新支持        |\n| 🎉 | 其他模型支持（如 DeepSeek） |\n| 🌎 | 需要国际网络             |\n| 🎁 | 充值赠送额度优惠           |\n| 🚀 | 支持高并发              |\n| 😆 | 每日签到领余额            |\n| 🚩 | 已备案平台              |\n| ✔  | 已验证真实性             |\n\n---\n\n## 📱 推荐应用支持\n\n<details>\n<summary>📦 点击展开查看兼容应用列表</summary>\n\n### ✅ [Cherry Studio](https://github.com/CherryHQ/cherry-studio)\n\n> 跨平台桌面端 + 移动端，集成主流 AI 云服务 + 本地模型。\n\n### ✅ [ChatGPT 好友插件 (uTools)](https://u.tools/plugins/detail/ChatGPT.%E5%A5%BD%E5%8F%8B/)\n\n> 桌面端智能聊天插件，支持角色设定、多模型、多会话管理。\n\n### ✅ [ChatGPT-Next-Web](https://github.com/Yidadaa/ChatGPT-Next-Web)\n\n> 开源网页端 ChatGPT 前端，支持 API Key 与多用户协作。\n\n### ✅ [LobeChat](https://github.com/lobehub/lobe-chat)\n\n> 支持视觉、语音交互和多模型切换，网页端 AI 会话框架。\n\n### ✅ [BotGem](https://botgem.com/)\n\n> 移动端优先设计，支持语音交流与 AI 好友系统。\n\n### ✅ [ChatBox](https://github.com/Bin-Huang/chatbox)\n\n> 支持 iOS、Android 和桌面端，界面现代，功能完整。\n\n### ✅ [FastGPT](https://github.com/labring/FastGPT)\n\n> 知识库 + 工作流集成，企业内训/客服场景首选。\n\n### ✅ [AnythingLLM](https://github.com/Mintplex-Labs/anything-llm)\n\n> 支持本地部署与插件扩展，适合对数据隐私有要求的用户。\n\n</details>\n\n---\n\n## 🌐 第三方 API 提供方列表\n</p>\n\n<table border=\"1\" cellspacing=\"0\" cellpadding=\"6\">\n  <thead>\n    <tr>\n      <th>序号</th>\n      <th>网站</th>\n      <th>链接</th>\n      <th>标签</th>\n      <th>备注</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <td>1</td>\n      <td>chat01（推荐）(含邀请码)</td>\n      <td><a href=\"https://chat01.ai/?ref=j45ikbTa\" target=\"_blank\">https://chat01.ai</a></td>\n      <td>🔓✌🎁💰✔</td>\n      <td>支持pro,解决降智问题，每天免费2积分，聊天+api同站</td>\n    </tr>\n    <tr>\n      <td>2</td>\n      <td>cloud.siliconflow.cn(推荐/企业级)</td>\n      <td><a href=\"https://cloud.siliconflow.cn/i/ZKV30bdG\" target=\"_blank\">https://cloud.siliconflow.cn/models</a></td>\n      <td>🔓💪✌🎉🚀🚩✔</td>\n      <td>华为云昇腾服务，实名送14元，每日最多请求100次</td>\n    </tr>\n    <tr>\n      <td>3</td>\n      <td>VoAPI</td>\n      <td><a href=\"https://demo.voapi.top\" target=\"_blank\">https://demo.voapi.top</a></td>\n      <td>🆓😆💪✌</td>\n      <td>【全公益网站】余额每日清零</td>\n    </tr>\n    <tr>\n      <td>4</td>\n      <td>头顶冒火</td>\n      <td><a href=\"https://burn.hair\" target=\"_blank\">https://burn.hair</a></td>\n      <td>✌🎉😆🚀</td>\n      <td>赠 $0.3，每日签到得额度，支持高并发</td>\n    </tr>\n    <tr>\n      <td>5</td>\n      <td>V3 API（混合版）</td>\n      <td><a href=\"https://api.v3.cm\" target=\"_blank\">https://api.v3.cm</a></td>\n      <td>🚀🔓💪🎁🎉✌</td>\n      <td>赠 $0.2，高并发，3折充值，超多模型</td>\n    </tr>\n    <tr>\n      <td>6</td>\n      <td>V3 API（官转版）</td>\n      <td><a href=\"https://gf.gpt.ge\" target=\"_blank\">https://gf.gpt.ge</a></td>\n      <td>🚀🌹🔓💪</td>\n      <td>赠 $0.2，高并发，6折充值</td>\n    </tr>\n    <tr>\n      <td>7</td>\n      <td>openai-hk</td>\n      <td><a href=\"https://openai-hk.com/\" target=\"_blank\">https://openai-hk.com</a></td>\n      <td>🆓🔓🎉✌💪🚀</td>\n      <td>赠1元，超高并发，含GPT3.5公益版</td>\n    </tr>\n    <tr>\n      <td>8</td>\n      <td>ChatGPT API 水龙头</td>\n      <td><a href=\"https://faucet.openkey.cloud/\" target=\"_blank\">https://faucet.openkey.cloud</a></td>\n      <td>🆓</td>\n      <td>免费$1额度，3天有效期</td>\n    </tr>\n    <tr>\n      <td>9</td>\n      <td>公益免费的ChatGPT API</td>\n      <td><a href=\"https://github.com/popjane/free_chatgpt_api\" target=\"_blank\">GitHub</a></td>\n      <td>🆓</td>\n      <td>公益免费</td>\n    </tr>\n    <tr>\n      <td>10</td>\n      <td>GPT-API-free</td>\n      <td><a href=\"https://github.com/chuyuewei/ChatGPT-API\" target=\"_blank\">GitHub</a></td>\n      <td>🆓💪</td>\n      <td>支持 GPT-4，每天3次</td>\n    </tr>\n    <tr>\n      <td>11</td>\n      <td>openkey</td>\n      <td><a href=\"https://openkey.cloud/\" target=\"_blank\">https://openkey.cloud</a></td>\n      <td>🔓💪✌🚀</td>\n      <td>赠$0.2，支持多并发</td>\n    </tr>\n    <tr>\n      <td>12</td>\n      <td>gptgod.online</td>\n      <td><a href=\"https://gptgod.online/\" target=\"_blank\">https://gptgod.online</a></td>\n      <td>💪✌🎁💰🎉😆</td>\n      <td>按次计费，积分额度</td>\n    </tr>\n    <tr>\n      <td>13</td>\n      <td>m3.ckit.gold</td>\n      <td><a href=\"https://m3.ckit.gold/\" target=\"_blank\">https://m3.ckit.gold</a></td>\n      <td>💰💪✌</td>\n      <td>3元/刀，注册送$0.1</td>\n    </tr>\n    <tr>\n      <td>14</td>\n      <td>小兔api</td>\n      <td><a href=\"https://api.aischat.xy\" target=\"_blank\">https://api.aischat.xy</a></td>\n      <td>🆓💪✌</td>\n      <td></td>\n    </tr>\n    <tr>\n      <td>15</td>\n      <td>goapi.gptnb.ai</td>\n      <td><a href=\"https://goapi.gptnb.ai/\" target=\"_blank\">https://goapi.gptnb.ai</a></td>\n      <td>💪✌🎁💰🎉</td>\n      <td></td>\n    </tr>\n    <tr>\n      <td>16</td>\n      <td>api.aigc369.com</td>\n      <td><a href=\"https://api.aigc369.com/pricing\" target=\"_blank\">https://api.aigc369.com/pricing</a></td>\n      <td>💪✌🎁💰🎉</td>\n      <td></td>\n    </tr>\n    <tr>\n      <td>17</td>\n      <td>api.mjdjourney.cn</td>\n      <td><a href=\"https://api.mjdjourney.cn/\" target=\"_blank\">https://api.mjdjourney.cn</a></td>\n      <td>💪✌🎁💰🎉</td>\n      <td></td>\n    </tr>\n    <tr>\n      <td>18</td>\n      <td>api.bltcy.ai</td>\n      <td><a href=\"https://api.bltcy.ai/\" target=\"_blank\">https://api.bltcy.ai</a></td>\n      <td>💪✌🎁💰🎉</td>\n      <td></td>\n    </tr>\n  </tbody>\n</table>\n\n\n## 📖 使用指南\n\n1. 🔑 获取 API Key：注册平台后，在用户中心复制\n2. ⚙ 配置 Endpoint：填写 API 地址到支持应用中\n3. 🤖 选择模型：根据平台支持情况切换不同模型\n4. 📊 用量监控：推荐使用客户端自带用量限制功能\n\n---\n\n## 🙌 贡献指南\n\n我们欢迎以下贡献方式：\n\n* ✨ 添加新 API 提供商（需稳定运行 ≥ 3 天）\n* 🧰 补充使用教程（包括配置截图、录屏）\n* 🧪 开发验证脚本（自动检测失效平台）\n* 🌍 多语言翻译（如：英文、日文、韩文等）\n\n> 请提交 Pull Request 或 Issue，我们将尽快处理！\n\n---\n\n## ❌ 失效平台列表\n\n<details>\n<summary>📛 点击展开查看失效平台</summary>\n\n| # | 名称     | 链接                                       | 状态     |\n| - | ------ | ---------------------------------------- | ------ |\n| 1 | 464888 | [api.464888.xyz](https://api.464888.xyz) | ❌ 无法访问 |\n\n> 如发现新失效平台，欢迎通过 Issue 提交！\n\n</details>\n\n---\n\n## ⚖️ 法律免责声明\n\n* 本项目不存储任何 API Key，也不提供代理或转发服务。\n* 所有平台来源于互联网，使用风险请自行评估。\n* 若因使用第三方服务造成损失，作者不承担任何法律责任。\n\n---\n[![Star History](https://api.star-history.com/svg?repos=TechnologyStar/Openai-Claude-Deepseek-API-provider\\&type=Date)](https://star-history.com/#TechnologyStar/Openai-Claude-Deepseek-API-provider&Date)\nMade with ❤️ by [TechnologyStar](https://github.com/TechnologyStar)\n\n"
  },
  {
    "path": "website/client/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"zh-CN\">\n  <head>\n    <meta charset=\"UTF-8\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, maximum-scale=1\" />\n    <title>🌐 OpenAI / Claude / DeepSeek API Provider Directory</title>\n    <meta name=\"description\" content=\"精选的第三方平台列表，提供 OpenAI / Claude / DeepSeek API，供学习、研究和非商业使用。\" />\n    <meta name=\"keywords\" content=\"OpenAI, Claude, DeepSeek, API, 第三方, 免费, 人工智能, AI\" />\n    \n    <!-- Open Graph tags -->\n    <meta property=\"og:title\" content=\"OpenAI / Claude / DeepSeek API Provider Directory\" />\n    <meta property=\"og:description\" content=\"精选的第三方平台列表，提供 OpenAI / Claude / DeepSeek API，供学习、研究和非商业使用。\" />\n    <meta property=\"og:type\" content=\"website\" />\n    <meta property=\"og:url\" content=\"https://api-directory.example.com\" />\n    \n    <!-- Twitter Card tags -->\n    <meta name=\"twitter:card\" content=\"summary_large_image\" />\n    <meta name=\"twitter:title\" content=\"OpenAI / Claude / DeepSeek API Provider Directory\" />\n    <meta name=\"twitter:description\" content=\"精选的第三方平台列表，提供 OpenAI / Claude / DeepSeek API，供学习、研究和非商业使用。\" />\n    \n    <!-- Favicon -->\n    <link rel=\"icon\" href=\"data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'><text y='.9em' font-size='90'>🌐</text></svg>\" />\n    \n    <!-- Preconnect to improve performance -->\n    <link rel=\"preconnect\" href=\"https://fonts.googleapis.com\" />\n    <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin />\n    \n    <!-- Theme color -->\n    <meta name=\"theme-color\" content=\"#2563eb\" />\n  </head>\n  <body>\n    <div id=\"root\"></div>\n    <script type=\"module\" src=\"/src/main.tsx\"></script>\n    <!-- This is a replit script which adds a banner on the top of the page when opened in development mode outside the replit environment -->\n    <script type=\"text/javascript\" src=\"https://replit.com/public/js/replit-dev-banner.js\"></script>\n  </body>\n</html>\n"
  },
  {
    "path": "website/client/src/App.tsx",
    "content": "import { Switch, Route } from \"wouter\";\nimport { queryClient } from \"./lib/queryClient\";\nimport { QueryClientProvider } from \"@tanstack/react-query\";\nimport { Toaster } from \"@/components/ui/toaster\";\nimport { TooltipProvider } from \"@/components/ui/tooltip\";\nimport { LanguageProvider } from \"@/hooks/use-language\";\nimport Home from \"@/pages/home\";\nimport NotFound from \"@/pages/not-found\";\n\nfunction Router() {\n  return (\n    <Switch>\n      <Route path=\"/\" component={Home} />\n      <Route component={NotFound} />\n    </Switch>\n  );\n}\n\nfunction App() {\n  return (\n    <QueryClientProvider client={queryClient}>\n      <LanguageProvider>\n        <TooltipProvider>\n          <Toaster />\n          <Router />\n        </TooltipProvider>\n      </LanguageProvider>\n    </QueryClientProvider>\n  );\n}\n\nexport default App;\n"
  },
  {
    "path": "website/client/src/components/advanced-filters.tsx",
    "content": "import { useState, useEffect } from \"react\";\nimport { useLanguage } from \"@/hooks/use-language\";\nimport { Button } from \"@/components/ui/button\";\nimport { Card, CardContent, CardHeader, CardTitle } from \"@/components/ui/card\";\nimport { Checkbox } from \"@/components/ui/checkbox\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { Slider } from \"@/components/ui/slider\";\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from \"@/components/ui/select\";\nimport { Filter, RefreshCw, Bookmark, TrendingUp } from \"lucide-react\";\n\ninterface AdvancedFiltersProps {\n  providers: any[];\n  onFiltersChange: (filteredProviders: any[]) => void;\n}\n\nexport function AdvancedFilters({ providers, onFiltersChange }: AdvancedFiltersProps) {\n  const { t } = useLanguage();\n  const [filters, setFilters] = useState({\n    tags: new Set<string>(),\n    pricing: 'all', // all, free, freemium, paid\n    models: new Set<string>(),\n    features: new Set<string>(),\n    verification: 'all', // all, verified, unverified\n    sortBy: 'recommended' // recommended, name, newest\n  });\n\n  const tagOptions = [\n    { value: '🆓', label: '完全免费', color: 'bg-green-100 text-green-800' },\n    { value: '🔓', label: '有免费额度', color: 'bg-blue-100 text-blue-800' },\n    { value: '💰', label: '需要充值', color: 'bg-yellow-100 text-yellow-800' },\n    { value: '💪', label: 'Claude支持', color: 'bg-red-100 text-red-800' },\n    { value: '✌', label: 'OpenAI支持', color: 'bg-blue-100 text-blue-800' },\n    { value: '🎉', label: '其他模型', color: 'bg-purple-100 text-purple-800' },\n    { value: '🌎', label: '需要国际网络', color: 'bg-cyan-100 text-cyan-800' },\n    { value: '🎁', label: '充值优惠', color: 'bg-pink-100 text-pink-800' },\n    { value: '🚀', label: '高并发', color: 'bg-orange-100 text-orange-800' },\n    { value: '😆', label: '每日签到', color: 'bg-yellow-100 text-yellow-800' },\n    { value: '🚩', label: '已备案', color: 'bg-green-100 text-green-800' },\n    { value: '✔', label: '已验证', color: 'bg-gray-100 text-gray-800' }\n  ];\n\n  const applyFilters = () => {\n    let filtered = [...providers];\n\n    // 标签过滤\n    if (filters.tags.size > 0) {\n      filtered = filtered.filter(provider => \n        Array.from(filters.tags).some(tag => provider.tags.includes(tag))\n      );\n    }\n\n    // 定价模式过滤\n    if (filters.pricing !== 'all') {\n      switch (filters.pricing) {\n        case 'free':\n          filtered = filtered.filter(provider => provider.tags.includes('🆓'));\n          break;\n        case 'freemium':\n          filtered = filtered.filter(provider => provider.tags.includes('🔓'));\n          break;\n        case 'paid':\n          filtered = filtered.filter(provider => provider.tags.includes('💰'));\n          break;\n      }\n    }\n\n    // 模型支持过滤\n    if (filters.models.size > 0) {\n      filtered = filtered.filter(provider => {\n        if (filters.models.has('openai') && !provider.tags.includes('✌')) return false;\n        if (filters.models.has('claude') && !provider.tags.includes('💪')) return false;\n        if (filters.models.has('other') && !provider.tags.includes('🎉')) return false;\n        return true;\n      });\n    }\n\n    // 功能特性过滤\n    if (filters.features.size > 0) {\n      filtered = filtered.filter(provider => {\n        if (filters.features.has('highConcurrency') && !provider.tags.includes('🚀')) return false;\n        if (filters.features.has('dailyCheckin') && !provider.tags.includes('😆')) return false;\n        if (filters.features.has('bonus') && !provider.tags.includes('🎁')) return false;\n        return true;\n      });\n    }\n\n    // 验证状态过滤\n    if (filters.verification !== 'all') {\n      switch (filters.verification) {\n        case 'verified':\n          filtered = filtered.filter(provider => \n            provider.tags.includes('✔') || provider.tags.includes('🚩')\n          );\n          break;\n        case 'unverified':\n          filtered = filtered.filter(provider => \n            !provider.tags.includes('✔') && !provider.tags.includes('🚩')\n          );\n          break;\n      }\n    }\n\n    // 排序\n    switch (filters.sortBy) {\n      case 'name':\n        filtered.sort((a, b) => a.displayName.localeCompare(b.displayName));\n        break;\n      case 'newest':\n        filtered.sort((a, b) => b.sortOrder - a.sortOrder);\n        break;\n      case 'recommended':\n      default:\n        filtered.sort((a, b) => {\n          if (a.isRecommended && !b.isRecommended) return -1;\n          if (!a.isRecommended && b.isRecommended) return 1;\n          return a.sortOrder - b.sortOrder;\n        });\n        break;\n    }\n\n    onFiltersChange(filtered);\n  };\n\n  useEffect(() => {\n    applyFilters();\n  }, [filters, providers]);\n\n  const handleTagToggle = (tag: string, checked: boolean) => {\n    const newTags = new Set(filters.tags);\n    if (checked) {\n      newTags.add(tag);\n    } else {\n      newTags.delete(tag);\n    }\n    setFilters(prev => ({ ...prev, tags: newTags }));\n  };\n\n  const handleModelToggle = (model: string, checked: boolean) => {\n    const newModels = new Set(filters.models);\n    if (checked) {\n      newModels.add(model);\n    } else {\n      newModels.delete(model);\n    }\n    setFilters(prev => ({ ...prev, models: newModels }));\n  };\n\n  const handleFeatureToggle = (feature: string, checked: boolean) => {\n    const newFeatures = new Set(filters.features);\n    if (checked) {\n      newFeatures.add(feature);\n    } else {\n      newFeatures.delete(feature);\n    }\n    setFilters(prev => ({ ...prev, features: newFeatures }));\n  };\n\n  const resetFilters = () => {\n    setFilters({\n      tags: new Set(),\n      pricing: 'all',\n      models: new Set(),\n      features: new Set(),\n      verification: 'all',\n      sortBy: 'recommended'\n    });\n  };\n\n  const getActiveFiltersCount = () => {\n    let count = 0;\n    if (filters.tags.size > 0) count++;\n    if (filters.pricing !== 'all') count++;\n    if (filters.models.size > 0) count++;\n    if (filters.features.size > 0) count++;\n    if (filters.verification !== 'all') count++;\n    return count;\n  };\n\n  return (\n    <Card className=\"mb-8\">\n      <CardHeader>\n        <CardTitle className=\"flex items-center justify-between\">\n          <div className=\"flex items-center\">\n            <Filter className=\"w-5 h-5 mr-2\" />\n            高级筛选\n            {getActiveFiltersCount() > 0 && (\n              <Badge variant=\"secondary\" className=\"ml-2\">\n                {getActiveFiltersCount()} 个筛选条件\n              </Badge>\n            )}\n          </div>\n          <Button variant=\"outline\" size=\"sm\" onClick={resetFilters}>\n            <RefreshCw className=\"w-4 h-4 mr-2\" />\n            重置\n          </Button>\n        </CardTitle>\n      </CardHeader>\n      <CardContent className=\"space-y-6\">\n        {/* 功能标签筛选 */}\n        <div>\n          <h4 className=\"font-medium text-gray-900 mb-3\">功能标签</h4>\n          <div className=\"grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-3\">\n            {tagOptions.map(({ value, label, color }) => (\n              <div key={value} className=\"flex items-center space-x-2\">\n                <Checkbox\n                  checked={filters.tags.has(value)}\n                  onCheckedChange={(checked) => handleTagToggle(value, checked as boolean)}\n                />\n                <Badge className={`text-xs ${color}`}>\n                  {value} {label}\n                </Badge>\n              </div>\n            ))}\n          </div>\n        </div>\n\n        {/* 定价模式 */}\n        <div>\n          <h4 className=\"font-medium text-gray-900 mb-3\">定价模式</h4>\n          <Select value={filters.pricing} onValueChange={(value) => \n            setFilters(prev => ({ ...prev, pricing: value }))\n          }>\n            <SelectTrigger className=\"w-full\">\n              <SelectValue placeholder=\"选择定价模式\" />\n            </SelectTrigger>\n            <SelectContent>\n              <SelectItem value=\"all\">全部</SelectItem>\n              <SelectItem value=\"free\">完全免费</SelectItem>\n              <SelectItem value=\"freemium\">有免费额度</SelectItem>\n              <SelectItem value=\"paid\">付费服务</SelectItem>\n            </SelectContent>\n          </Select>\n        </div>\n\n        {/* 模型支持 */}\n        <div>\n          <h4 className=\"font-medium text-gray-900 mb-3\">模型支持</h4>\n          <div className=\"grid grid-cols-1 md:grid-cols-3 gap-3\">\n            <div className=\"flex items-center space-x-2\">\n              <Checkbox\n                checked={filters.models.has('openai')}\n                onCheckedChange={(checked) => handleModelToggle('openai', checked as boolean)}\n              />\n              <span className=\"text-sm\">OpenAI 模型</span>\n            </div>\n            <div className=\"flex items-center space-x-2\">\n              <Checkbox\n                checked={filters.models.has('claude')}\n                onCheckedChange={(checked) => handleModelToggle('claude', checked as boolean)}\n              />\n              <span className=\"text-sm\">Claude 模型</span>\n            </div>\n            <div className=\"flex items-center space-x-2\">\n              <Checkbox\n                checked={filters.models.has('other')}\n                onCheckedChange={(checked) => handleModelToggle('other', checked as boolean)}\n              />\n              <span className=\"text-sm\">其他模型</span>\n            </div>\n          </div>\n        </div>\n\n        {/* 特殊功能 */}\n        <div>\n          <h4 className=\"font-medium text-gray-900 mb-3\">特殊功能</h4>\n          <div className=\"grid grid-cols-1 md:grid-cols-3 gap-3\">\n            <div className=\"flex items-center space-x-2\">\n              <Checkbox\n                checked={filters.features.has('highConcurrency')}\n                onCheckedChange={(checked) => handleFeatureToggle('highConcurrency', checked as boolean)}\n              />\n              <span className=\"text-sm\">高并发支持</span>\n            </div>\n            <div className=\"flex items-center space-x-2\">\n              <Checkbox\n                checked={filters.features.has('dailyCheckin')}\n                onCheckedChange={(checked) => handleFeatureToggle('dailyCheckin', checked as boolean)}\n              />\n              <span className=\"text-sm\">每日签到</span>\n            </div>\n            <div className=\"flex items-center space-x-2\">\n              <Checkbox\n                checked={filters.features.has('bonus')}\n                onCheckedChange={(checked) => handleFeatureToggle('bonus', checked as boolean)}\n              />\n              <span className=\"text-sm\">充值优惠</span>\n            </div>\n          </div>\n        </div>\n\n        {/* 验证状态和排序 */}\n        <div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n          <div>\n            <h4 className=\"font-medium text-gray-900 mb-3\">验证状态</h4>\n            <Select value={filters.verification} onValueChange={(value) => \n              setFilters(prev => ({ ...prev, verification: value }))\n            }>\n              <SelectTrigger>\n                <SelectValue placeholder=\"选择验证状态\" />\n              </SelectTrigger>\n              <SelectContent>\n                <SelectItem value=\"all\">全部</SelectItem>\n                <SelectItem value=\"verified\">已验证</SelectItem>\n                <SelectItem value=\"unverified\">未验证</SelectItem>\n              </SelectContent>\n            </Select>\n          </div>\n\n          <div>\n            <h4 className=\"font-medium text-gray-900 mb-3\">排序方式</h4>\n            <Select value={filters.sortBy} onValueChange={(value) => \n              setFilters(prev => ({ ...prev, sortBy: value }))\n            }>\n              <SelectTrigger>\n                <SelectValue placeholder=\"选择排序方式\" />\n              </SelectTrigger>\n              <SelectContent>\n                <SelectItem value=\"recommended\">\n                  <div className=\"flex items-center\">\n                    <Bookmark className=\"w-4 h-4 mr-2\" />\n                    推荐优先\n                  </div>\n                </SelectItem>\n                <SelectItem value=\"name\">按名称排序</SelectItem>\n                <SelectItem value=\"newest\">\n                  <div className=\"flex items-center\">\n                    <TrendingUp className=\"w-4 h-4 mr-2\" />\n                    最新添加\n                  </div>\n                </SelectItem>\n              </SelectContent>\n            </Select>\n          </div>\n        </div>\n      </CardContent>\n    </Card>\n  );\n}"
  },
  {
    "path": "website/client/src/components/contribute-section.tsx",
    "content": "import { useLanguage } from \"@/hooks/use-language\";\nimport { Button } from \"@/components/ui/button\";\nimport { Plus, Book, Code, Globe, Github, Bug } from \"lucide-react\";\n\nconst contributions = [\n  {\n    icon: Plus,\n    titleKey: \"addProvider\",\n    title: \"✨ 添加新 API 提供商\",\n    description: \"需稳定运行 ≥ 3 天，提供详细的功能说明和使用方法\",\n    color: \"bg-green-100 text-green-600\"\n  },\n  {\n    icon: Book,\n    titleKey: \"addTutorial\",\n    title: \"🧰 补充使用教程\",\n    description: \"包括配置截图、录屏演示等详细的使用指导\",\n    color: \"bg-blue-100 text-blue-600\"\n  },\n  {\n    icon: Code,\n    titleKey: \"developScript\",\n    title: \"🧪 开发验证脚本\",\n    description: \"自动检测失效平台，提高维护效率\",\n    color: \"bg-purple-100 text-purple-600\"\n  },\n  {\n    icon: Globe,\n    titleKey: \"translate\",\n    title: \"🌍 多语言翻译\",\n    description: \"如：英文、日文、韩文等语言版本的翻译工作\",\n    color: \"bg-orange-100 text-orange-600\"\n  }\n];\n\nexport function ContributeSection() {\n  const { t } = useLanguage();\n\n  return (\n    <section id=\"contribute\" className=\"py-16 bg-white\">\n      <div className=\"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8\">\n        <div className=\"text-center mb-12\">\n          <h2 className=\"text-3xl font-bold text-gray-900 mb-4\">\n            🙌 {t('contribute.title')}\n          </h2>\n          <p className=\"text-gray-600 max-w-2xl mx-auto\">\n            {t('contribute.description')}\n          </p>\n        </div>\n\n        <div className=\"grid grid-cols-1 md:grid-cols-2 gap-8\">\n          {contributions.map((contribution, index) => {\n            const IconComponent = contribution.icon;\n            \n            return (\n              <div key={index} className=\"flex items-start space-x-4\">\n                <div className={`w-8 h-8 rounded-full flex items-center justify-center flex-shrink-0 ${contribution.color}`}>\n                  <IconComponent size={16} />\n                </div>\n                <div>\n                  <h3 className=\"text-lg font-semibold text-gray-900 mb-2\">\n                    {contribution.title}\n                  </h3>\n                  <p className=\"text-gray-600 text-sm\">\n                    {contribution.description}\n                  </p>\n                </div>\n              </div>\n            );\n          })}\n        </div>\n\n        <div className=\"text-center mt-12\">\n          <div className=\"bg-gray-50 rounded-lg p-6 inline-block\">\n            <p className=\"text-gray-700 mb-4\">请提交 Pull Request 或 Issue，我们将尽快处理！</p>\n            <div className=\"flex justify-center space-x-4\">\n              <Button \n                className=\"bg-blue-600 text-white hover:bg-blue-700 transition-colors duration-200\"\n                onClick={() => window.open('https://github.com/TechnologyStar/Openai-Claude-Deepseek-API-provider', '_blank')}\n              >\n                <Github className=\"mr-2\" size={16} />\n                GitHub\n              </Button>\n              <Button \n                variant=\"outline\"\n                className=\"border-gray-600 text-gray-600 hover:bg-gray-50 transition-colors duration-200\"\n                onClick={() => window.open('https://github.com/TechnologyStar/Openai-Claude-Deepseek-API-provider/issues', '_blank')}\n              >\n                <Bug className=\"mr-2\" size={16} />\n                Report Issue\n              </Button>\n            </div>\n          </div>\n        </div>\n      </div>\n    </section>\n  );\n}\n"
  },
  {
    "path": "website/client/src/components/footer.tsx",
    "content": "import { useLanguage } from \"@/hooks/use-language\";\nimport { Globe, Github, Twitter } from \"lucide-react\";\n\nexport function Footer() {\n  const { t } = useLanguage();\n\n  const scrollToSection = (sectionId: string) => {\n    const element = document.getElementById(sectionId);\n    if (element) {\n      element.scrollIntoView({ behavior: 'smooth', block: 'start' });\n    }\n  };\n\n  return (\n    <footer className=\"bg-gray-900 text-gray-300 py-12\">\n      <div className=\"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8\">\n        <div className=\"grid grid-cols-1 md:grid-cols-3 gap-8\">\n          <div>\n            <div className=\"flex items-center space-x-2 mb-4\">\n              <div className=\"w-8 h-8 bg-gradient-to-br from-blue-500 to-blue-600 rounded-lg flex items-center justify-center\">\n                <Globe className=\"w-4 h-4 text-white\" />\n              </div>\n              <span className=\"text-xl font-bold text-white\">API Directory</span>\n            </div>\n            <p className=\"text-sm text-gray-400 mb-4\">\n              精选的第三方API提供商目录，供学习研究使用。\n            </p>\n            <div className=\"flex space-x-4\">\n              <button\n                onClick={() => window.open('https://github.com/TechnologyStar/Openai-Claude-Deepseek-API-provider', '_blank')}\n                className=\"text-gray-400 hover:text-white transition-colors duration-200\"\n              >\n                <Github size={20} />\n              </button>\n              <button className=\"text-gray-400 hover:text-white transition-colors duration-200\">\n                <Twitter size={20} />\n              </button>\n            </div>\n          </div>\n\n          <div>\n            <h3 className=\"text-lg font-semibold text-white mb-4\">\n              {t('footer.links')}\n            </h3>\n            <ul className=\"space-y-2\">\n              <li>\n                <button\n                  onClick={() => scrollToSection('providers')}\n                  className=\"text-gray-400 hover:text-white transition-colors duration-200\"\n                >\n                  {t('footer.providers')}\n                </button>\n              </li>\n              <li>\n                <button\n                  onClick={() => scrollToSection('apps')}\n                  className=\"text-gray-400 hover:text-white transition-colors duration-200\"\n                >\n                  {t('footer.apps')}\n                </button>\n              </li>\n              <li>\n                <button\n                  onClick={() => scrollToSection('guide')}\n                  className=\"text-gray-400 hover:text-white transition-colors duration-200\"\n                >\n                  {t('footer.guide')}\n                </button>\n              </li>\n              <li>\n                <button\n                  onClick={() => scrollToSection('contribute')}\n                  className=\"text-gray-400 hover:text-white transition-colors duration-200\"\n                >\n                  {t('footer.contribute')}\n                </button>\n              </li>\n            </ul>\n          </div>\n\n          <div>\n            <h3 className=\"text-lg font-semibold text-white mb-4\">\n              {t('footer.legal')}\n            </h3>\n            <ul className=\"space-y-2 text-sm text-gray-400\">\n              <li>• 本项目不存储任何 API Key</li>\n              <li>• 不提供代理或转发服务</li>\n              <li>• 使用风险请自行评估</li>\n              <li>• 遵守相关法律法规</li>\n            </ul>\n          </div>\n        </div>\n\n        <div className=\"border-t border-gray-800 mt-8 pt-8 text-center\">\n          <p className=\"text-sm text-gray-400\">\n            Made with ❤️ by{\" \"}\n            <button\n              onClick={() => window.open('https://github.com/TechnologyStar', '_blank')}\n              className=\"text-blue-400 hover:text-blue-300 transition-colors duration-200\"\n            >\n              TechnologyStar\n            </button>\n          </p>\n        </div>\n      </div>\n    </footer>\n  );\n}\n"
  },
  {
    "path": "website/client/src/components/header.tsx",
    "content": "import { useState } from \"react\";\nimport { Button } from \"@/components/ui/button\";\nimport { LanguageSwitcher } from \"@/components/language-switcher\";\nimport { useLanguage } from \"@/hooks/use-language\";\nimport { Globe, Menu, X } from \"lucide-react\";\n\nexport function Header() {\n  const { t } = useLanguage();\n  const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false);\n\n  const scrollToSection = (sectionId: string) => {\n    const element = document.getElementById(sectionId);\n    if (element) {\n      element.scrollIntoView({ behavior: 'smooth', block: 'start' });\n    }\n    setIsMobileMenuOpen(false);\n  };\n\n  return (\n    <header className=\"bg-white shadow-sm border-b border-gray-200 sticky top-0 z-50\">\n      <div className=\"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8\">\n        <div className=\"flex justify-between items-center h-16\">\n          {/* Logo and Brand */}\n          <div className=\"flex items-center space-x-4\">\n            <div className=\"flex items-center space-x-2\">\n              <div className=\"w-8 h-8 bg-gradient-to-br from-blue-500 to-blue-600 rounded-lg flex items-center justify-center\">\n                <Globe className=\"w-4 h-4 text-white\" />\n              </div>\n              <span className=\"text-xl font-bold text-gray-900\">API Directory</span>\n            </div>\n          </div>\n\n          {/* Desktop Navigation */}\n          <nav className=\"hidden md:flex items-center space-x-8\">\n            <button\n              onClick={() => scrollToSection('providers')}\n              className=\"text-gray-700 hover:text-blue-600 transition-colors duration-200 font-medium\"\n            >\n              {t('nav.providers')}\n            </button>\n            <button\n              onClick={() => scrollToSection('apps')}\n              className=\"text-gray-700 hover:text-blue-600 transition-colors duration-200 font-medium\"\n            >\n              {t('nav.apps')}\n            </button>\n            <button\n              onClick={() => scrollToSection('guide')}\n              className=\"text-gray-700 hover:text-blue-600 transition-colors duration-200 font-medium\"\n            >\n              {t('nav.guide')}\n            </button>\n            <button\n              onClick={() => scrollToSection('contribute')}\n              className=\"text-gray-700 hover:text-blue-600 transition-colors duration-200 font-medium\"\n            >\n              {t('nav.contribute')}\n            </button>\n          </nav>\n\n          {/* Language Switcher and Mobile Menu Button */}\n          <div className=\"flex items-center space-x-4\">\n            <LanguageSwitcher />\n            <Button\n              variant=\"ghost\"\n              size=\"sm\"\n              className=\"md:hidden p-2 rounded-lg hover:bg-gray-100\"\n              onClick={() => setIsMobileMenuOpen(!isMobileMenuOpen)}\n            >\n              {isMobileMenuOpen ? <X className=\"w-5 h-5\" /> : <Menu className=\"w-5 h-5\" />}\n            </Button>\n          </div>\n        </div>\n      </div>\n\n      {/* Mobile Navigation */}\n      {isMobileMenuOpen && (\n        <div className=\"md:hidden bg-white border-t border-gray-200\">\n          <div className=\"px-4 py-2 space-y-2\">\n            <button\n              onClick={() => scrollToSection('providers')}\n              className=\"block w-full text-left px-3 py-2 text-gray-700 hover:bg-gray-50 rounded-lg\"\n            >\n              {t('nav.providers')}\n            </button>\n            <button\n              onClick={() => scrollToSection('apps')}\n              className=\"block w-full text-left px-3 py-2 text-gray-700 hover:bg-gray-50 rounded-lg\"\n            >\n              {t('nav.apps')}\n            </button>\n            <button\n              onClick={() => scrollToSection('guide')}\n              className=\"block w-full text-left px-3 py-2 text-gray-700 hover:bg-gray-50 rounded-lg\"\n            >\n              {t('nav.guide')}\n            </button>\n            <button\n              onClick={() => scrollToSection('contribute')}\n              className=\"block w-full text-left px-3 py-2 text-gray-700 hover:bg-gray-50 rounded-lg\"\n            >\n              {t('nav.contribute')}\n            </button>\n          </div>\n        </div>\n      )}\n    </header>\n  );\n}\n"
  },
  {
    "path": "website/client/src/components/hero-section.tsx",
    "content": "import { useLanguage } from \"@/hooks/use-language\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { AlertTriangle, Star, Scale, Code } from \"lucide-react\";\n\nexport function HeroSection() {\n  const { t } = useLanguage();\n\n  return (\n    <section className=\"bg-gradient-to-br from-blue-50 to-indigo-100 py-16\">\n      <div className=\"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8\">\n        <div className=\"text-center\">\n          <h1 className=\"text-4xl md:text-5xl font-bold text-gray-900 mb-6\">\n            <span className=\"text-blue-600\">🌐</span>\n            <span className=\"ml-2\">{t('hero.title')}</span>\n          </h1>\n          <p className=\"text-xl text-gray-600 mb-8 max-w-3xl mx-auto leading-relaxed\">\n            {t('hero.description')}\n          </p>\n          \n          {/* Project Badges */}\n          <div className=\"flex flex-wrap justify-center gap-3 mb-8\">\n            <Badge variant=\"secondary\" className=\"bg-white shadow-sm\">\n              <Code className=\"w-4 h-4 mr-2 text-blue-600\" />\n              Last Commit\n            </Badge>\n            <Badge variant=\"secondary\" className=\"bg-white shadow-sm\">\n              <Scale className=\"w-4 h-4 mr-2 text-green-500\" />\n              MIT License\n            </Badge>\n            <Badge variant=\"secondary\" className=\"bg-white shadow-sm\">\n              <Star className=\"w-4 h-4 mr-2 text-yellow-500\" />\n              Free & Open Source\n            </Badge>\n          </div>\n\n          {/* Warning Notice */}\n          <div className=\"bg-yellow-50 border border-yellow-200 rounded-lg p-4 max-w-4xl mx-auto\">\n            <div className=\"flex items-start space-x-3\">\n              <AlertTriangle className=\"text-yellow-600 mt-1 flex-shrink-0\" size={20} />\n              <div className=\"text-left\">\n                <h3 className=\"font-semibold text-yellow-800 mb-2\">{t('warning.title')}</h3>\n                <p className=\"text-yellow-700 text-sm mb-2\">\n                  {t('warning.content')}\n                </p>\n                <ul className=\"text-yellow-700 text-sm space-y-1\">\n                  <li>• 遵守 OpenAI 使用条款</li>\n                  <li>• 遵守《生成式人工智能服务管理暂行办法》</li>\n                </ul>\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n    </section>\n  );\n}\n"
  },
  {
    "path": "website/client/src/components/language-switcher.tsx",
    "content": "import { useState, useRef, useEffect } from \"react\";\nimport { Button } from \"@/components/ui/button\";\nimport { useLanguage } from \"@/hooks/use-language\";\nimport { ChevronDown, Globe } from \"lucide-react\";\n\nconst languages = {\n  zh: { name: '中文', flag: '🇨🇳' },\n  en: { name: 'English', flag: '🇺🇸' },\n  ru: { name: 'Русский', flag: '🇷🇺' },\n  fr: { name: 'Français', flag: '🇫🇷' }\n};\n\nexport function LanguageSwitcher() {\n  const { language, setLanguage, t } = useLanguage();\n  const [isOpen, setIsOpen] = useState(false);\n  const dropdownRef = useRef<HTMLDivElement>(null);\n\n  useEffect(() => {\n    function handleClickOutside(event: MouseEvent) {\n      if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {\n        setIsOpen(false);\n      }\n    }\n\n    document.addEventListener('mousedown', handleClickOutside);\n    return () => document.removeEventListener('mousedown', handleClickOutside);\n  }, []);\n\n  const handleLanguageChange = (lang: keyof typeof languages) => {\n    setLanguage(lang);\n    setIsOpen(false);\n  };\n\n  return (\n    <div className=\"relative\" ref={dropdownRef}>\n      <Button\n        variant=\"ghost\"\n        onClick={() => setIsOpen(!isOpen)}\n        className=\"flex items-center space-x-2 px-3 py-2 text-sm font-medium text-gray-700 bg-gray-100 rounded-lg hover:bg-gray-200 transition-colors duration-200\"\n      >\n        <Globe className=\"w-4 h-4\" />\n        <span>{languages[language].name}</span>\n        <ChevronDown className=\"w-3 h-3\" />\n      </Button>\n\n      {isOpen && (\n        <div className=\"absolute right-0 mt-2 w-48 bg-white rounded-lg shadow-lg border border-gray-200 py-2 z-50\">\n          {Object.entries(languages).map(([code, lang]) => (\n            <button\n              key={code}\n              onClick={() => handleLanguageChange(code as keyof typeof languages)}\n              className=\"w-full px-4 py-2 text-left hover:bg-gray-50 flex items-center space-x-2 transition-colors duration-200\"\n            >\n              <span>{lang.flag}</span>\n              <span>{lang.name}</span>\n            </button>\n          ))}\n        </div>\n      )}\n    </div>\n  );\n}\n"
  },
  {
    "path": "website/client/src/components/provider-comparison.tsx",
    "content": "import { useState, useMemo } from \"react\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { useLanguage } from \"@/hooks/use-language\";\nimport { Button } from \"@/components/ui/button\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { Card, CardContent, CardHeader, CardTitle } from \"@/components/ui/card\";\nimport { Checkbox } from \"@/components/ui/checkbox\";\nimport { useToast } from \"@/hooks/use-toast\";\nimport { GitCompare, ExternalLink, Plus, Minus, Star } from \"lucide-react\";\nimport type { ApiProvider } from \"@shared/schema\";\n\nexport function ProviderComparison() {\n  const { t } = useLanguage();\n  const { toast } = useToast();\n  const [selectedProviders, setSelectedProviders] = useState<Set<number>>(new Set());\n  const [showComparison, setShowComparison] = useState(false);\n\n  const { data: providers = [], isLoading } = useQuery<ApiProvider[]>({\n    queryKey: ['/api/providers']\n  });\n\n  const recommendedProviders = useMemo(() => \n    providers.filter(p => p.isRecommended).slice(0, 6),\n    [providers]\n  );\n\n  const selectedProviderData = useMemo(() => \n    providers.filter(p => selectedProviders.has(p.id)),\n    [providers, selectedProviders]\n  );\n\n  const handleProviderToggle = (providerId: number, checked: boolean) => {\n    const newSelected = new Set(selectedProviders);\n    \n    if (checked) {\n      if (newSelected.size >= 4) {\n        toast({\n          title: \"最多只能选择4个提供商进行比较\",\n          variant: \"destructive\",\n          duration: 3000,\n        });\n        return;\n      }\n      newSelected.add(providerId);\n    } else {\n      newSelected.delete(providerId);\n    }\n    \n    setSelectedProviders(newSelected);\n  };\n\n  const clearSelection = () => {\n    setSelectedProviders(new Set());\n    setShowComparison(false);\n  };\n\n  const getTagColor = (tag: string) => {\n    const colors: Record<string, string> = {\n      \"🆓\": \"bg-green-100 text-green-800\",\n      \"🔓\": \"bg-blue-100 text-blue-800\",\n      \"💰\": \"bg-yellow-100 text-yellow-800\",\n      \"💪\": \"bg-red-100 text-red-800\",\n      \"✌\": \"bg-blue-100 text-blue-800\",\n      \"🎉\": \"bg-purple-100 text-purple-800\",\n      \"🌎\": \"bg-cyan-100 text-cyan-800\",\n      \"🎁\": \"bg-pink-100 text-pink-800\",\n      \"🚀\": \"bg-orange-100 text-orange-800\",\n      \"😆\": \"bg-yellow-100 text-yellow-800\",\n      \"🚩\": \"bg-green-100 text-green-800\",\n      \"✔\": \"bg-gray-100 text-gray-800\",\n      \"🌹\": \"bg-pink-100 text-pink-800\"\n    };\n    return colors[tag] || \"bg-gray-100 text-gray-800\";\n  };\n\n  if (isLoading) {\n    return (\n      <section className=\"py-12 bg-gray-50\">\n        <div className=\"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8\">\n          <div className=\"animate-pulse\">\n            <div className=\"h-8 bg-gray-200 rounded w-1/3 mx-auto mb-8\"></div>\n            <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6\">\n              {[...Array(6)].map((_, i) => (\n                <div key={i} className=\"h-48 bg-gray-200 rounded-lg\"></div>\n              ))}\n            </div>\n          </div>\n        </div>\n      </section>\n    );\n  }\n\n  return (\n    <section className=\"py-12 bg-gray-50\">\n      <div className=\"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8\">\n        <div className=\"text-center mb-12\">\n          <h2 className=\"text-3xl font-bold text-gray-900 mb-4\">\n            <GitCompare className=\"inline w-8 h-8 mr-2\" />\n            提供商对比分析\n          </h2>\n          <p className=\"text-gray-600 max-w-2xl mx-auto\">\n            选择最多4个API提供商进行详细对比，帮助您做出最佳选择\n          </p>\n        </div>\n\n        {/* 选择控制面板 */}\n        <div className=\"bg-white rounded-lg shadow-sm border border-gray-200 p-6 mb-8\">\n          <div className=\"flex flex-col sm:flex-row justify-between items-start sm:items-center gap-4\">\n            <div>\n              <h3 className=\"text-lg font-semibold text-gray-900 mb-2\">\n                选择提供商进行比较\n              </h3>\n              <p className=\"text-sm text-gray-600\">\n                已选择 {selectedProviders.size}/4 个提供商\n              </p>\n            </div>\n            <div className=\"flex gap-2\">\n              <Button\n                variant=\"outline\"\n                onClick={clearSelection}\n                disabled={selectedProviders.size === 0}\n              >\n                <Minus className=\"w-4 h-4 mr-2\" />\n                清空选择\n              </Button>\n              <Button\n                onClick={() => setShowComparison(!showComparison)}\n                disabled={selectedProviders.size < 2}\n              >\n                <GitCompare className=\"w-4 h-4 mr-2\" />\n                {showComparison ? \"隐藏对比\" : \"开始对比\"}\n              </Button>\n            </div>\n          </div>\n        </div>\n\n        {/* 推荐提供商快选 */}\n        <div className=\"mb-8\">\n          <h3 className=\"text-xl font-semibold text-gray-900 mb-6\">推荐提供商</h3>\n          <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6\">\n            {recommendedProviders.map((provider) => (\n              <Card key={provider.id} className=\"hover:shadow-md transition-shadow duration-200\">\n                <CardHeader className=\"pb-3\">\n                  <div className=\"flex items-start justify-between\">\n                    <div className=\"flex items-center space-x-2\">\n                      <Checkbox\n                        checked={selectedProviders.has(provider.id)}\n                        onCheckedChange={(checked) => \n                          handleProviderToggle(provider.id, checked as boolean)\n                        }\n                      />\n                      <Star className=\"w-4 h-4 text-yellow-500\" />\n                    </div>\n                    <Badge variant=\"secondary\" className=\"bg-yellow-100 text-yellow-800\">\n                      推荐\n                    </Badge>\n                  </div>\n                  <CardTitle className=\"text-lg\">{provider.displayName}</CardTitle>\n                </CardHeader>\n                <CardContent>\n                  <div className=\"space-y-3\">\n                    <a\n                      href={provider.url}\n                      target=\"_blank\"\n                      rel=\"noopener noreferrer\"\n                      className=\"text-blue-600 hover:text-blue-800 text-sm flex items-center\"\n                    >\n                      {provider.url.replace(/^https?:\\/\\//, '')}\n                      <ExternalLink size={12} className=\"ml-1\" />\n                    </a>\n                    \n                    <div className=\"flex flex-wrap gap-1\">\n                      {provider.tags.map((tag, index) => (\n                        <Badge key={index} className={`text-xs ${getTagColor(tag)}`}>\n                          {tag}\n                        </Badge>\n                      ))}\n                    </div>\n                    \n                    {provider.notes && (\n                      <p className=\"text-sm text-gray-600 line-clamp-2\">\n                        {provider.notes}\n                      </p>\n                    )}\n                  </div>\n                </CardContent>\n              </Card>\n            ))}\n          </div>\n        </div>\n\n        {/* 详细对比表 */}\n        {showComparison && selectedProviderData.length >= 2 && (\n          <Card>\n            <CardHeader>\n              <CardTitle className=\"flex items-center\">\n                <GitCompare className=\"w-5 h-5 mr-2\" />\n                详细对比分析\n              </CardTitle>\n            </CardHeader>\n            <CardContent>\n              <div className=\"overflow-x-auto\">\n                <table className=\"w-full border-collapse\">\n                  <thead>\n                    <tr className=\"border-b border-gray-200\">\n                      <th className=\"text-left py-3 px-4 font-semibold text-gray-900\">\n                        对比项目\n                      </th>\n                      {selectedProviderData.map((provider) => (\n                        <th key={provider.id} className=\"text-left py-3 px-4 font-semibold text-gray-900\">\n                          {provider.displayName}\n                        </th>\n                      ))}\n                    </tr>\n                  </thead>\n                  <tbody>\n                    <tr className=\"border-b border-gray-100\">\n                      <td className=\"py-3 px-4 font-medium text-gray-700\">网站链接</td>\n                      {selectedProviderData.map((provider) => (\n                        <td key={provider.id} className=\"py-3 px-4\">\n                          <a\n                            href={provider.url}\n                            target=\"_blank\"\n                            rel=\"noopener noreferrer\"\n                            className=\"text-blue-600 hover:text-blue-800 flex items-center\"\n                          >\n                            访问\n                            <ExternalLink size={14} className=\"ml-1\" />\n                          </a>\n                        </td>\n                      ))}\n                    </tr>\n                    \n                    <tr className=\"border-b border-gray-100\">\n                      <td className=\"py-3 px-4 font-medium text-gray-700\">功能标签</td>\n                      {selectedProviderData.map((provider) => (\n                        <td key={provider.id} className=\"py-3 px-4\">\n                          <div className=\"flex flex-wrap gap-1\">\n                            {provider.tags.map((tag, index) => (\n                              <Badge key={index} className={`text-xs ${getTagColor(tag)}`}>\n                                {tag}\n                              </Badge>\n                            ))}\n                          </div>\n                        </td>\n                      ))}\n                    </tr>\n\n                    <tr className=\"border-b border-gray-100\">\n                      <td className=\"py-3 px-4 font-medium text-gray-700\">免费额度</td>\n                      {selectedProviderData.map((provider) => (\n                        <td key={provider.id} className=\"py-3 px-4\">\n                          {provider.tags.includes('🆓') ? (\n                            <Badge className=\"bg-green-100 text-green-800\">完全免费</Badge>\n                          ) : provider.tags.includes('🔓') ? (\n                            <Badge className=\"bg-blue-100 text-blue-800\">有免费额度</Badge>\n                          ) : (\n                            <Badge className=\"bg-gray-100 text-gray-800\">付费服务</Badge>\n                          )}\n                        </td>\n                      ))}\n                    </tr>\n\n                    <tr className=\"border-b border-gray-100\">\n                      <td className=\"py-3 px-4 font-medium text-gray-700\">模型支持</td>\n                      {selectedProviderData.map((provider) => (\n                        <td key={provider.id} className=\"py-3 px-4\">\n                          <div className=\"space-y-1\">\n                            {provider.tags.includes('✌') && (\n                              <Badge className=\"bg-blue-100 text-blue-800 mr-1\">OpenAI</Badge>\n                            )}\n                            {provider.tags.includes('💪') && (\n                              <Badge className=\"bg-red-100 text-red-800 mr-1\">Claude</Badge>\n                            )}\n                            {provider.tags.includes('🎉') && (\n                              <Badge className=\"bg-purple-100 text-purple-800 mr-1\">其他模型</Badge>\n                            )}\n                          </div>\n                        </td>\n                      ))}\n                    </tr>\n\n                    <tr className=\"border-b border-gray-100\">\n                      <td className=\"py-3 px-4 font-medium text-gray-700\">高级功能</td>\n                      {selectedProviderData.map((provider) => (\n                        <td key={provider.id} className=\"py-3 px-4\">\n                          <div className=\"space-y-1\">\n                            {provider.tags.includes('🚀') && (\n                              <div className=\"text-sm text-green-600\">✓ 高并发支持</div>\n                            )}\n                            {provider.tags.includes('🎁') && (\n                              <div className=\"text-sm text-purple-600\">✓ 充值优惠</div>\n                            )}\n                            {provider.tags.includes('😆') && (\n                              <div className=\"text-sm text-yellow-600\">✓ 每日签到</div>\n                            )}\n                            {provider.tags.includes('🌎') && (\n                              <div className=\"text-sm text-blue-600\">⚠ 需要国际网络</div>\n                            )}\n                          </div>\n                        </td>\n                      ))}\n                    </tr>\n\n                    <tr className=\"border-b border-gray-100\">\n                      <td className=\"py-3 px-4 font-medium text-gray-700\">可信度</td>\n                      {selectedProviderData.map((provider) => (\n                        <td key={provider.id} className=\"py-3 px-4\">\n                          <div className=\"space-y-1\">\n                            {provider.tags.includes('✔') && (\n                              <Badge className=\"bg-green-100 text-green-800\">已验证</Badge>\n                            )}\n                            {provider.tags.includes('🚩') && (\n                              <Badge className=\"bg-blue-100 text-blue-800\">已备案</Badge>\n                            )}\n                            {provider.isRecommended && (\n                              <Badge className=\"bg-yellow-100 text-yellow-800\">推荐</Badge>\n                            )}\n                          </div>\n                        </td>\n                      ))}\n                    </tr>\n\n                    <tr>\n                      <td className=\"py-3 px-4 font-medium text-gray-700\">备注说明</td>\n                      {selectedProviderData.map((provider) => (\n                        <td key={provider.id} className=\"py-3 px-4\">\n                          <p className=\"text-sm text-gray-600\">\n                            {provider.notes || \"暂无备注\"}\n                          </p>\n                        </td>\n                      ))}\n                    </tr>\n                  </tbody>\n                </table>\n              </div>\n            </CardContent>\n          </Card>\n        )}\n\n        {/* 选择提示 */}\n        {selectedProviders.size === 0 && (\n          <Card className=\"border-dashed border-2 border-gray-300\">\n            <CardContent className=\"text-center py-12\">\n              <Plus className=\"w-12 h-12 text-gray-400 mx-auto mb-4\" />\n              <h3 className=\"text-lg font-medium text-gray-900 mb-2\">\n                开始选择提供商\n              </h3>\n              <p className=\"text-gray-600\">\n                选择2-4个API提供商进行详细对比分析\n              </p>\n            </CardContent>\n          </Card>\n        )}\n      </div>\n    </section>\n  );\n}"
  },
  {
    "path": "website/client/src/components/provider-stats.tsx",
    "content": "import { useQuery } from \"@tanstack/react-query\";\nimport { useLanguage } from \"@/hooks/use-language\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { Card, CardContent, CardHeader, CardTitle } from \"@/components/ui/card\";\nimport { Progress } from \"@/components/ui/progress\";\nimport { BarChart, TrendingUp, Users, Shield, Zap, DollarSign } from \"lucide-react\";\nimport type { ApiProvider } from \"@shared/schema\";\n\nexport function ProviderStats() {\n  const { t } = useLanguage();\n\n  const { data: providers = [], isLoading } = useQuery<ApiProvider[]>({\n    queryKey: ['/api/providers']\n  });\n\n  if (isLoading) {\n    return (\n      <section className=\"py-12 bg-white\">\n        <div className=\"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8\">\n          <div className=\"animate-pulse\">\n            <div className=\"h-8 bg-gray-200 rounded w-1/3 mx-auto mb-8\"></div>\n            <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6\">\n              {[...Array(4)].map((_, i) => (\n                <div key={i} className=\"h-32 bg-gray-200 rounded-lg\"></div>\n              ))}\n            </div>\n          </div>\n        </div>\n      </section>\n    );\n  }\n\n  // 计算统计数据\n  const totalProviders = providers.length;\n  const freeProviders = providers.filter(p => p.tags.includes('🆓')).length;\n  const freemiumProviders = providers.filter(p => p.tags.includes('🔓')).length;\n  const claudeProviders = providers.filter(p => p.tags.includes('💪')).length;\n  const openaiProviders = providers.filter(p => p.tags.includes('✌')).length;\n  const verifiedProviders = providers.filter(p => p.tags.includes('✔')).length;\n  const highConcurrencyProviders = providers.filter(p => p.tags.includes('🚀')).length;\n  const recommendedProviders = providers.filter(p => p.isRecommended).length;\n\n  const stats = [\n    {\n      title: \"总提供商数量\",\n      value: totalProviders,\n      icon: BarChart,\n      color: \"text-blue-600\",\n      bgColor: \"bg-blue-50\"\n    },\n    {\n      title: \"免费服务\",\n      value: freeProviders + freemiumProviders,\n      subtitle: `${freeProviders} 完全免费 + ${freemiumProviders} 有免费额度`,\n      icon: DollarSign,\n      color: \"text-green-600\",\n      bgColor: \"bg-green-50\"\n    },\n    {\n      title: \"已验证平台\",\n      value: verifiedProviders,\n      subtitle: `${Math.round((verifiedProviders / totalProviders) * 100)}% 通过验证`,\n      icon: Shield,\n      color: \"text-purple-600\",\n      bgColor: \"bg-purple-50\"\n    },\n    {\n      title: \"高并发支持\",\n      value: highConcurrencyProviders,\n      subtitle: `${Math.round((highConcurrencyProviders / totalProviders) * 100)}% 支持高并发`,\n      icon: Zap,\n      color: \"text-orange-600\",\n      bgColor: \"bg-orange-50\"\n    }\n  ];\n\n  const modelStats = [\n    {\n      name: \"OpenAI 支持\",\n      count: openaiProviders,\n      percentage: Math.round((openaiProviders / totalProviders) * 100),\n      color: \"bg-blue-500\"\n    },\n    {\n      name: \"Claude 支持\", \n      count: claudeProviders,\n      percentage: Math.round((claudeProviders / totalProviders) * 100),\n      color: \"bg-red-500\"\n    },\n    {\n      name: \"推荐平台\",\n      count: recommendedProviders,\n      percentage: Math.round((recommendedProviders / totalProviders) * 100),\n      color: \"bg-yellow-500\"\n    }\n  ];\n\n  return (\n    <section className=\"py-12 bg-white\">\n      <div className=\"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8\">\n        <div className=\"text-center mb-12\">\n          <h2 className=\"text-3xl font-bold text-gray-900 mb-4\">\n            📊 平台统计分析\n          </h2>\n          <p className=\"text-gray-600 max-w-2xl mx-auto\">\n            实时统计和分析当前收录的API提供商数据\n          </p>\n        </div>\n\n        {/* 主要统计卡片 */}\n        <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6 mb-8\">\n          {stats.map((stat, index) => {\n            const IconComponent = stat.icon;\n            return (\n              <Card key={index} className=\"hover:shadow-lg transition-shadow duration-200\">\n                <CardContent className=\"p-6\">\n                  <div className=\"flex items-center justify-between\">\n                    <div>\n                      <p className=\"text-sm font-medium text-gray-600 mb-1\">\n                        {stat.title}\n                      </p>\n                      <p className=\"text-3xl font-bold text-gray-900\">\n                        {stat.value}\n                      </p>\n                      {stat.subtitle && (\n                        <p className=\"text-xs text-gray-500 mt-1\">\n                          {stat.subtitle}\n                        </p>\n                      )}\n                    </div>\n                    <div className={`w-12 h-12 ${stat.bgColor} rounded-lg flex items-center justify-center`}>\n                      <IconComponent className={`w-6 h-6 ${stat.color}`} />\n                    </div>\n                  </div>\n                </CardContent>\n              </Card>\n            );\n          })}\n        </div>\n\n        {/* 模型支持统计 */}\n        <Card>\n          <CardHeader>\n            <CardTitle className=\"flex items-center\">\n              <TrendingUp className=\"w-5 h-5 mr-2 text-blue-600\" />\n              模型支持分布\n            </CardTitle>\n          </CardHeader>\n          <CardContent>\n            <div className=\"space-y-6\">\n              {modelStats.map((model, index) => (\n                <div key={index} className=\"space-y-2\">\n                  <div className=\"flex justify-between items-center\">\n                    <span className=\"text-sm font-medium text-gray-700\">\n                      {model.name}\n                    </span>\n                    <div className=\"flex items-center space-x-2\">\n                      <span className=\"text-sm text-gray-600\">\n                        {model.count} 个平台\n                      </span>\n                      <Badge variant=\"secondary\" className=\"text-xs\">\n                        {model.percentage}%\n                      </Badge>\n                    </div>\n                  </div>\n                  <Progress value={model.percentage} className=\"h-2\" />\n                </div>\n              ))}\n            </div>\n          </CardContent>\n        </Card>\n\n        {/* 标签统计 */}\n        <Card className=\"mt-6\">\n          <CardHeader>\n            <CardTitle className=\"flex items-center\">\n              <Users className=\"w-5 h-5 mr-2 text-green-600\" />\n              功能标签分布\n            </CardTitle>\n          </CardHeader>\n          <CardContent>\n            <div className=\"grid grid-cols-2 md:grid-cols-4 lg:grid-cols-6 gap-4\">\n              {[\n                { tag: '🆓', name: '完全免费', count: freeProviders },\n                { tag: '🔓', name: '有免费额度', count: freemiumProviders },\n                { tag: '💪', name: 'Claude支持', count: claudeProviders },\n                { tag: '✌', name: 'OpenAI支持', count: openaiProviders },\n                { tag: '🚀', name: '高并发', count: highConcurrencyProviders },\n                { tag: '✔', name: '已验证', count: verifiedProviders }\n              ].map((item, index) => (\n                <div key={index} className=\"text-center p-4 bg-gray-50 rounded-lg hover:bg-gray-100 transition-colors duration-200\">\n                  <div className=\"text-2xl mb-2\">{item.tag}</div>\n                  <div className=\"text-lg font-semibold text-gray-900\">{item.count}</div>\n                  <div className=\"text-xs text-gray-600\">{item.name}</div>\n                </div>\n              ))}\n            </div>\n          </CardContent>\n        </Card>\n      </div>\n    </section>\n  );\n}"
  },
  {
    "path": "website/client/src/components/providers-table.tsx",
    "content": "import { useState, useMemo } from \"react\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { useLanguage } from \"@/hooks/use-language\";\nimport { Button } from \"@/components/ui/button\";\nimport { Input } from \"@/components/ui/input\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { useToast } from \"@/hooks/use-toast\";\nimport { AdvancedFilters } from \"@/components/advanced-filters\";\nimport { Search, Copy, Heart, ExternalLink, ChevronDown, Filter, SlidersHorizontal } from \"lucide-react\";\nimport type { ApiProvider } from \"@shared/schema\";\n\nconst tagColors: Record<string, string> = {\n  \"🆓\": \"bg-green-100 text-green-800\",\n  \"🔓\": \"bg-green-100 text-green-800\",\n  \"💰\": \"bg-yellow-100 text-yellow-800\",\n  \"💪\": \"bg-red-100 text-red-800\",\n  \"✌\": \"bg-blue-100 text-blue-800\",\n  \"🎉\": \"bg-indigo-100 text-indigo-800\",\n  \"🌎\": \"bg-cyan-100 text-cyan-800\",\n  \"🎁\": \"bg-purple-100 text-purple-800\",\n  \"🚀\": \"bg-orange-100 text-orange-800\",\n  \"😆\": \"bg-yellow-100 text-yellow-800\",\n  \"🚩\": \"bg-green-100 text-green-800\",\n  \"✔\": \"bg-gray-100 text-gray-800\",\n  \"🌹\": \"bg-pink-100 text-pink-800\"\n};\n\nexport function ProvidersTable() {\n  const { t } = useLanguage();\n  const { toast } = useToast();\n  const [searchTerm, setSearchTerm] = useState(\"\");\n  const [activeFilter, setActiveFilter] = useState(\"all\");\n  const [favorites, setFavorites] = useState<Set<number>>(new Set());\n  const [showAdvancedFilters, setShowAdvancedFilters] = useState(false);\n  const [filteredByAdvanced, setFilteredByAdvanced] = useState<ApiProvider[]>([]);\n\n  const { data: providers = [], isLoading } = useQuery<ApiProvider[]>({\n    queryKey: ['/api/providers']\n  });\n\n  const filteredProviders = useMemo(() => {\n    const baseProviders = showAdvancedFilters ? filteredByAdvanced : providers;\n    \n    return baseProviders.filter(provider => {\n      const matchesSearch = searchTerm === '' || \n        provider.displayName.toLowerCase().includes(searchTerm.toLowerCase()) ||\n        provider.notes?.toLowerCase().includes(searchTerm.toLowerCase());\n\n      const matchesFilter = activeFilter === 'all' ||\n        (activeFilter === 'free' && provider.tags.includes('🆓')) ||\n        (activeFilter === 'claude' && provider.tags.includes('💪')) ||\n        (activeFilter === 'openai' && provider.tags.includes('✌')) ||\n        (activeFilter === 'verified' && provider.tags.includes('✔'));\n\n      return matchesSearch && matchesFilter;\n    });\n  }, [providers, filteredByAdvanced, searchTerm, activeFilter, showAdvancedFilters]);\n\n  const handleCopyLink = async (url: string) => {\n    try {\n      await navigator.clipboard.writeText(url);\n      toast({\n        title: t('toast.copied'),\n        description: url,\n        duration: 3000,\n      });\n    } catch (err) {\n      // Fallback for older browsers\n      const textArea = document.createElement('textarea');\n      textArea.value = url;\n      document.body.appendChild(textArea);\n      textArea.select();\n      document.execCommand('copy');\n      document.body.removeChild(textArea);\n      toast({\n        title: t('toast.copied'),\n        description: url,\n        duration: 3000,\n      });\n    }\n  };\n\n  const handleFavorite = (providerId: number) => {\n    const newFavorites = new Set(favorites);\n    if (favorites.has(providerId)) {\n      newFavorites.delete(providerId);\n      toast({\n        title: t('toast.favoriteRemoved'),\n        duration: 2000,\n      });\n    } else {\n      newFavorites.add(providerId);\n      toast({\n        title: t('toast.favoriteAdded'),\n        duration: 2000,\n      });\n    }\n    setFavorites(newFavorites);\n  };\n\n  const filterButtons = [\n    { key: 'all', label: t('providers.filter.all') },\n    { key: 'free', label: `🆓 ${t('providers.filter.free')}` },\n    { key: 'claude', label: `💪 ${t('providers.filter.claude')}` },\n    { key: 'openai', label: `✌ ${t('providers.filter.openai')}` },\n    { key: 'verified', label: `✔ ${t('providers.filter.verified')}` }\n  ];\n\n  if (isLoading) {\n    return (\n      <section id=\"providers\" className=\"py-16 bg-gray-50\">\n        <div className=\"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8\">\n          <div className=\"text-center\">\n            <div className=\"animate-spin rounded-full h-8 w-8 border-b-2 border-blue-600 mx-auto\"></div>\n            <p className=\"mt-4 text-gray-600\">Loading providers...</p>\n          </div>\n        </div>\n      </section>\n    );\n  }\n\n  return (\n    <section id=\"providers\" className=\"py-16 bg-gray-50\">\n      <div className=\"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8\">\n        <div className=\"text-center mb-12\">\n          <h2 className=\"text-3xl font-bold text-gray-900 mb-4\">\n            🌐 {t('providers.title')}\n          </h2>\n          <p className=\"text-gray-600 max-w-2xl mx-auto\">\n            {t('providers.description')}\n          </p>\n        </div>\n\n        {/* Search and Filter Controls */}\n        <div className=\"bg-white rounded-lg shadow-sm border border-gray-200 p-6 mb-8\">\n          <div className=\"flex flex-col lg:flex-row gap-4\">\n            {/* Search Bar */}\n            <div className=\"flex-1\">\n              <div className=\"relative\">\n                <Search className=\"absolute left-3 top-1/2 transform -translate-y-1/2 text-gray-400\" size={20} />\n                <Input\n                  type=\"text\"\n                  placeholder={t('providers.search')}\n                  value={searchTerm}\n                  onChange={(e) => setSearchTerm(e.target.value)}\n                  className=\"pl-10\"\n                />\n              </div>\n            </div>\n\n            {/* Filter Buttons */}\n            <div className=\"flex flex-wrap gap-2\">\n              <Button\n                variant={showAdvancedFilters ? \"default\" : \"outline\"}\n                size=\"sm\"\n                onClick={() => setShowAdvancedFilters(!showAdvancedFilters)}\n                className=\"transition-colors duration-200\"\n              >\n                <SlidersHorizontal className=\"w-4 h-4 mr-2\" />\n                高级筛选\n              </Button>\n              {filterButtons.map((button) => (\n                <Button\n                  key={button.key}\n                  variant={activeFilter === button.key ? \"default\" : \"outline\"}\n                  size=\"sm\"\n                  onClick={() => setActiveFilter(button.key)}\n                  className=\"transition-colors duration-200\"\n                >\n                  {button.label}\n                </Button>\n              ))}\n            </div>\n          </div>\n        </div>\n\n        {/* Advanced Filters */}\n        {showAdvancedFilters && (\n          <AdvancedFilters \n            providers={providers} \n            onFiltersChange={setFilteredByAdvanced}\n          />\n        )}\n\n        {/* API Providers Table */}\n        <div className=\"bg-white rounded-lg shadow-sm border border-gray-200 overflow-hidden\">\n          {/* Desktop Table View */}\n          <div className=\"hidden lg:block overflow-x-auto\">\n            <table className=\"w-full\">\n              <thead className=\"bg-gray-50 border-b border-gray-200\">\n                <tr>\n                  <th className=\"px-6 py-4 text-left text-xs font-medium text-gray-500 uppercase tracking-wider\">\n                    {t('table.index')}\n                  </th>\n                  <th className=\"px-6 py-4 text-left text-xs font-medium text-gray-500 uppercase tracking-wider\">\n                    {t('table.website')}\n                  </th>\n                  <th className=\"px-6 py-4 text-left text-xs font-medium text-gray-500 uppercase tracking-wider\">\n                    {t('table.link')}\n                  </th>\n                  <th className=\"px-6 py-4 text-left text-xs font-medium text-gray-500 uppercase tracking-wider\">\n                    {t('table.tags')}\n                  </th>\n                  <th className=\"px-6 py-4 text-left text-xs font-medium text-gray-500 uppercase tracking-wider\">\n                    {t('table.notes')}\n                  </th>\n                  <th className=\"px-6 py-4 text-left text-xs font-medium text-gray-500 uppercase tracking-wider\">\n                    {t('table.actions')}\n                  </th>\n                </tr>\n              </thead>\n              <tbody className=\"bg-white divide-y divide-gray-200\">\n                {filteredProviders.map((provider, index) => (\n                  <tr key={provider.id} className=\"hover:bg-gray-50 transition-colors duration-200\">\n                    <td className=\"px-6 py-4 whitespace-nowrap text-sm text-gray-900\">\n                      {index + 1}\n                    </td>\n                    <td className=\"px-6 py-4 whitespace-nowrap\">\n                      <div className=\"text-sm font-medium text-gray-900\">\n                        {provider.displayName}\n                      </div>\n                    </td>\n                    <td className=\"px-6 py-4 whitespace-nowrap\">\n                      <a\n                        href={provider.url}\n                        target=\"_blank\"\n                        rel=\"noopener noreferrer\"\n                        className=\"text-blue-600 hover:text-blue-800 text-sm flex items-center\"\n                      >\n                        {provider.url.replace(/^https?:\\/\\//, '')}\n                        <ExternalLink size={12} className=\"ml-1\" />\n                      </a>\n                    </td>\n                    <td className=\"px-6 py-4 whitespace-nowrap\">\n                      <div className=\"flex flex-wrap gap-1\">\n                        {provider.tags.map((tag, tagIndex) => (\n                          <Badge\n                            key={tagIndex}\n                            className={`text-xs ${tagColors[tag] || 'bg-gray-100 text-gray-800'}`}\n                          >\n                            {tag}\n                          </Badge>\n                        ))}\n                      </div>\n                    </td>\n                    <td className=\"px-6 py-4 text-sm text-gray-500 max-w-xs\">\n                      {provider.notes}\n                    </td>\n                    <td className=\"px-6 py-4 whitespace-nowrap text-sm\">\n                      <div className=\"flex space-x-2\">\n                        <Button\n                          variant=\"ghost\"\n                          size=\"sm\"\n                          onClick={() => handleCopyLink(provider.url)}\n                          className=\"text-blue-600 hover:text-blue-800\"\n                        >\n                          <Copy size={16} />\n                        </Button>\n                        <Button\n                          variant=\"ghost\"\n                          size=\"sm\"\n                          onClick={() => handleFavorite(provider.id)}\n                          className={favorites.has(provider.id) \n                            ? \"text-red-500 hover:text-red-600\" \n                            : \"text-gray-400 hover:text-red-500\"\n                          }\n                        >\n                          <Heart size={16} fill={favorites.has(provider.id) ? \"currentColor\" : \"none\"} />\n                        </Button>\n                      </div>\n                    </td>\n                  </tr>\n                ))}\n              </tbody>\n            </table>\n          </div>\n\n          {/* Mobile Card View */}\n          <div className=\"lg:hidden\">\n            {filteredProviders.map((provider, index) => (\n              <div key={provider.id} className=\"border-b border-gray-200 p-6\">\n                <div className=\"flex justify-between items-start mb-3\">\n                  <div>\n                    <h3 className=\"text-lg font-medium text-gray-900\">\n                      {provider.displayName}\n                    </h3>\n                    <p className=\"text-sm text-gray-500\">#{index + 1}</p>\n                  </div>\n                  <div className=\"flex space-x-2\">\n                    <Button\n                      variant=\"ghost\"\n                      size=\"sm\"\n                      onClick={() => handleCopyLink(provider.url)}\n                      className=\"text-blue-600 hover:text-blue-800\"\n                    >\n                      <Copy size={16} />\n                    </Button>\n                    <Button\n                      variant=\"ghost\"\n                      size=\"sm\"\n                      onClick={() => handleFavorite(provider.id)}\n                      className={favorites.has(provider.id) \n                        ? \"text-red-500 hover:text-red-600\" \n                        : \"text-gray-400 hover:text-red-500\"\n                      }\n                    >\n                      <Heart size={16} fill={favorites.has(provider.id) ? \"currentColor\" : \"none\"} />\n                    </Button>\n                  </div>\n                </div>\n                \n                <div className=\"mb-3\">\n                  <a\n                    href={provider.url}\n                    target=\"_blank\"\n                    rel=\"noopener noreferrer\"\n                    className=\"text-blue-600 hover:text-blue-800 text-sm flex items-center\"\n                  >\n                    {provider.url.replace(/^https?:\\/\\//, '')}\n                    <ExternalLink size={12} className=\"ml-1\" />\n                  </a>\n                </div>\n                \n                <div className=\"flex flex-wrap gap-1 mb-3\">\n                  {provider.tags.map((tag, tagIndex) => (\n                    <Badge\n                      key={tagIndex}\n                      className={`text-xs ${tagColors[tag] || 'bg-gray-100 text-gray-800'}`}\n                    >\n                      {tag}\n                    </Badge>\n                  ))}\n                </div>\n                \n                {provider.notes && (\n                  <p className=\"text-sm text-gray-600\">\n                    {provider.notes}\n                  </p>\n                )}\n              </div>\n            ))}\n          </div>\n        </div>\n\n        {filteredProviders.length === 0 && (\n          <div className=\"text-center py-12\">\n            <p className=\"text-gray-500\">No providers found matching your criteria.</p>\n          </div>\n        )}\n\n        {/* Load More Button (placeholder for future pagination) */}\n        <div className=\"text-center mt-8\">\n          <Button className=\"bg-blue-600 text-white px-6 py-3 rounded-lg hover:bg-blue-700 transition-colors duration-200 font-medium\">\n            <ChevronDown className=\"mr-2\" size={16} />\n            {t('providers.loadMore')}\n          </Button>\n        </div>\n      </div>\n    </section>\n  );\n}\n"
  },
  {
    "path": "website/client/src/components/recommended-apps.tsx",
    "content": "import { useQuery } from \"@tanstack/react-query\";\nimport { useLanguage } from \"@/hooks/use-language\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { ExternalLink, Github, Monitor, Globe, MessageSquare, Smartphone, MessageCircle, Zap } from \"lucide-react\";\nimport type { RecommendedApp } from \"@shared/schema\";\n\nconst iconMap: Record<string, React.ComponentType<any>> = {\n  desktop: Monitor,\n  globe: Globe,\n  comments: MessageSquare,\n  mobile: Smartphone,\n  \"message-square\": MessageCircle,\n  zap: Zap\n};\n\nconst tagColors: Record<string, string> = {\n  \"开源\": \"bg-green-100 text-green-800\",\n  \"跨平台\": \"bg-blue-100 text-blue-800\",\n  \"网页端\": \"bg-purple-100 text-purple-800\",\n  \"多模态\": \"bg-red-100 text-red-800\",\n  \"移动端\": \"bg-indigo-100 text-indigo-800\",\n  \"语音\": \"bg-orange-100 text-orange-800\",\n  \"现代界面\": \"bg-cyan-100 text-cyan-800\",\n  \"企业级\": \"bg-gray-100 text-gray-800\",\n  \"知识库\": \"bg-yellow-100 text-yellow-800\"\n};\n\nexport function RecommendedApps() {\n  const { t } = useLanguage();\n\n  const { data: apps = [], isLoading } = useQuery<RecommendedApp[]>({\n    queryKey: ['/api/apps']\n  });\n\n  if (isLoading) {\n    return (\n      <section id=\"apps\" className=\"py-16 bg-white\">\n        <div className=\"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8\">\n          <div className=\"text-center\">\n            <div className=\"animate-spin rounded-full h-8 w-8 border-b-2 border-blue-600 mx-auto\"></div>\n            <p className=\"mt-4 text-gray-600\">Loading apps...</p>\n          </div>\n        </div>\n      </section>\n    );\n  }\n\n  return (\n    <section id=\"apps\" className=\"py-16 bg-white\">\n      <div className=\"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8\">\n        <div className=\"text-center mb-12\">\n          <h2 className=\"text-3xl font-bold text-gray-900 mb-4\">\n            📱 {t('apps.title')}\n          </h2>\n          <p className=\"text-gray-600 max-w-2xl mx-auto\">\n            {t('apps.description')}\n          </p>\n        </div>\n\n        <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6\">\n          {apps.map((app) => {\n            const IconComponent = iconMap[app.icon] || Monitor;\n            \n            return (\n              <div key={app.id} className=\"bg-gray-50 rounded-lg p-6 hover:shadow-lg transition-shadow duration-200\">\n                <div className=\"flex items-start space-x-4\">\n                  <div className=\"w-12 h-12 bg-gradient-to-br from-blue-500 to-purple-600 rounded-lg flex items-center justify-center flex-shrink-0\">\n                    <IconComponent className=\"w-6 h-6 text-white\" />\n                  </div>\n                  <div className=\"flex-1 min-w-0\">\n                    <div className=\"flex items-center justify-between mb-2\">\n                      <h3 className=\"text-lg font-semibold text-gray-900 truncate\">\n                        {app.name}\n                      </h3>\n                      <div className=\"flex space-x-2 ml-2\">\n                        {app.githubUrl && (\n                          <a\n                            href={app.githubUrl}\n                            target=\"_blank\"\n                            rel=\"noopener noreferrer\"\n                            className=\"text-gray-500 hover:text-gray-700 transition-colors duration-200\"\n                          >\n                            <Github size={16} />\n                          </a>\n                        )}\n                        {app.websiteUrl && (\n                          <a\n                            href={app.websiteUrl}\n                            target=\"_blank\"\n                            rel=\"noopener noreferrer\"\n                            className=\"text-gray-500 hover:text-gray-700 transition-colors duration-200\"\n                          >\n                            <ExternalLink size={16} />\n                          </a>\n                        )}\n                      </div>\n                    </div>\n                    <p className=\"text-sm text-gray-600 mb-3 line-clamp-2\">\n                      {app.description}\n                    </p>\n                    <div className=\"flex flex-wrap gap-1\">\n                      {app.tags.map((tag, index) => (\n                        <Badge\n                          key={index}\n                          className={`text-xs ${tagColors[tag] || 'bg-gray-100 text-gray-800'}`}\n                        >\n                          {tag}\n                        </Badge>\n                      ))}\n                    </div>\n                  </div>\n                </div>\n              </div>\n            );\n          })}\n        </div>\n      </div>\n    </section>\n  );\n}\n"
  },
  {
    "path": "website/client/src/components/tags-legend.tsx",
    "content": "import { useLanguage } from \"@/hooks/use-language\";\n\nconst tagData = [\n  { emoji: \"🆓\", key: \"free\" },\n  { emoji: \"🔓\", key: \"freemium\" },\n  { emoji: \"💰\", key: \"paid\" },\n  { emoji: \"💪\", key: \"claude\" },\n  { emoji: \"✌\", key: \"openai\" },\n  { emoji: \"🎉\", key: \"other\" },\n  { emoji: \"🌎\", key: \"vpn\" },\n  { emoji: \"🎁\", key: \"bonus\" },\n  { emoji: \"🚀\", key: \"concurrent\" },\n  { emoji: \"😆\", key: \"daily\" },\n  { emoji: \"🚩\", key: \"verified\" },\n  { emoji: \"✔\", key: \"validated\" }\n];\n\nexport function TagsLegend() {\n  const { t } = useLanguage();\n\n  return (\n    <section id=\"tags\" className=\"py-12 bg-white\">\n      <div className=\"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8\">\n        <h2 className=\"text-2xl font-bold text-gray-900 mb-6 text-center\">\n          🎁 {t('tags.title')}\n        </h2>\n        <div className=\"grid grid-cols-2 md:grid-cols-4 lg:grid-cols-6 gap-4\">\n          {tagData.map((tag) => (\n            <div key={tag.key} className=\"bg-gray-50 rounded-lg p-4 text-center hover:bg-gray-100 transition-colors duration-200\">\n              <div className=\"text-2xl mb-2\">{tag.emoji}</div>\n              <div className=\"text-sm font-medium text-gray-900\">\n                {t(`tags.${tag.key}`)}\n              </div>\n            </div>\n          ))}\n        </div>\n      </div>\n    </section>\n  );\n}\n"
  },
  {
    "path": "website/client/src/components/ui/accordion.tsx",
    "content": "import * as React from \"react\"\nimport * as AccordionPrimitive from \"@radix-ui/react-accordion\"\nimport { ChevronDown } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Accordion = AccordionPrimitive.Root\n\nconst AccordionItem = React.forwardRef<\n  React.ElementRef<typeof AccordionPrimitive.Item>,\n  React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Item>\n>(({ className, ...props }, ref) => (\n  <AccordionPrimitive.Item\n    ref={ref}\n    className={cn(\"border-b\", className)}\n    {...props}\n  />\n))\nAccordionItem.displayName = \"AccordionItem\"\n\nconst AccordionTrigger = React.forwardRef<\n  React.ElementRef<typeof AccordionPrimitive.Trigger>,\n  React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Trigger>\n>(({ className, children, ...props }, ref) => (\n  <AccordionPrimitive.Header className=\"flex\">\n    <AccordionPrimitive.Trigger\n      ref={ref}\n      className={cn(\n        \"flex flex-1 items-center justify-between py-4 font-medium transition-all hover:underline [&[data-state=open]>svg]:rotate-180\",\n        className\n      )}\n      {...props}\n    >\n      {children}\n      <ChevronDown className=\"h-4 w-4 shrink-0 transition-transform duration-200\" />\n    </AccordionPrimitive.Trigger>\n  </AccordionPrimitive.Header>\n))\nAccordionTrigger.displayName = AccordionPrimitive.Trigger.displayName\n\nconst AccordionContent = React.forwardRef<\n  React.ElementRef<typeof AccordionPrimitive.Content>,\n  React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Content>\n>(({ className, children, ...props }, ref) => (\n  <AccordionPrimitive.Content\n    ref={ref}\n    className=\"overflow-hidden text-sm transition-all data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down\"\n    {...props}\n  >\n    <div className={cn(\"pb-4 pt-0\", className)}>{children}</div>\n  </AccordionPrimitive.Content>\n))\n\nAccordionContent.displayName = AccordionPrimitive.Content.displayName\n\nexport { Accordion, AccordionItem, AccordionTrigger, AccordionContent }\n"
  },
  {
    "path": "website/client/src/components/ui/alert-dialog.tsx",
    "content": "import * as React from \"react\"\nimport * as AlertDialogPrimitive from \"@radix-ui/react-alert-dialog\"\n\nimport { cn } from \"@/lib/utils\"\nimport { buttonVariants } from \"@/components/ui/button\"\n\nconst AlertDialog = AlertDialogPrimitive.Root\n\nconst AlertDialogTrigger = AlertDialogPrimitive.Trigger\n\nconst AlertDialogPortal = AlertDialogPrimitive.Portal\n\nconst AlertDialogOverlay = React.forwardRef<\n  React.ElementRef<typeof AlertDialogPrimitive.Overlay>,\n  React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n  <AlertDialogPrimitive.Overlay\n    className={cn(\n      \"fixed inset-0 z-50 bg-black/80  data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n      className\n    )}\n    {...props}\n    ref={ref}\n  />\n))\nAlertDialogOverlay.displayName = AlertDialogPrimitive.Overlay.displayName\n\nconst AlertDialogContent = React.forwardRef<\n  React.ElementRef<typeof AlertDialogPrimitive.Content>,\n  React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Content>\n>(({ className, ...props }, ref) => (\n  <AlertDialogPortal>\n    <AlertDialogOverlay />\n    <AlertDialogPrimitive.Content\n      ref={ref}\n      className={cn(\n        \"fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg\",\n        className\n      )}\n      {...props}\n    />\n  </AlertDialogPortal>\n))\nAlertDialogContent.displayName = AlertDialogPrimitive.Content.displayName\n\nconst AlertDialogHeader = ({\n  className,\n  ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n  <div\n    className={cn(\n      \"flex flex-col space-y-2 text-center sm:text-left\",\n      className\n    )}\n    {...props}\n  />\n)\nAlertDialogHeader.displayName = \"AlertDialogHeader\"\n\nconst AlertDialogFooter = ({\n  className,\n  ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n  <div\n    className={cn(\n      \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\n      className\n    )}\n    {...props}\n  />\n)\nAlertDialogFooter.displayName = \"AlertDialogFooter\"\n\nconst AlertDialogTitle = React.forwardRef<\n  React.ElementRef<typeof AlertDialogPrimitive.Title>,\n  React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n  <AlertDialogPrimitive.Title\n    ref={ref}\n    className={cn(\"text-lg font-semibold\", className)}\n    {...props}\n  />\n))\nAlertDialogTitle.displayName = AlertDialogPrimitive.Title.displayName\n\nconst AlertDialogDescription = React.forwardRef<\n  React.ElementRef<typeof AlertDialogPrimitive.Description>,\n  React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n  <AlertDialogPrimitive.Description\n    ref={ref}\n    className={cn(\"text-sm text-muted-foreground\", className)}\n    {...props}\n  />\n))\nAlertDialogDescription.displayName =\n  AlertDialogPrimitive.Description.displayName\n\nconst AlertDialogAction = React.forwardRef<\n  React.ElementRef<typeof AlertDialogPrimitive.Action>,\n  React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Action>\n>(({ className, ...props }, ref) => (\n  <AlertDialogPrimitive.Action\n    ref={ref}\n    className={cn(buttonVariants(), className)}\n    {...props}\n  />\n))\nAlertDialogAction.displayName = AlertDialogPrimitive.Action.displayName\n\nconst AlertDialogCancel = React.forwardRef<\n  React.ElementRef<typeof AlertDialogPrimitive.Cancel>,\n  React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Cancel>\n>(({ className, ...props }, ref) => (\n  <AlertDialogPrimitive.Cancel\n    ref={ref}\n    className={cn(\n      buttonVariants({ variant: \"outline\" }),\n      \"mt-2 sm:mt-0\",\n      className\n    )}\n    {...props}\n  />\n))\nAlertDialogCancel.displayName = AlertDialogPrimitive.Cancel.displayName\n\nexport {\n  AlertDialog,\n  AlertDialogPortal,\n  AlertDialogOverlay,\n  AlertDialogTrigger,\n  AlertDialogContent,\n  AlertDialogHeader,\n  AlertDialogFooter,\n  AlertDialogTitle,\n  AlertDialogDescription,\n  AlertDialogAction,\n  AlertDialogCancel,\n}\n"
  },
  {
    "path": "website/client/src/components/ui/alert.tsx",
    "content": "import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst alertVariants = cva(\n  \"relative w-full rounded-lg border p-4 [&>svg~*]:pl-7 [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg]:text-foreground\",\n  {\n    variants: {\n      variant: {\n        default: \"bg-background text-foreground\",\n        destructive:\n          \"border-destructive/50 text-destructive dark:border-destructive [&>svg]:text-destructive\",\n      },\n    },\n    defaultVariants: {\n      variant: \"default\",\n    },\n  }\n)\n\nconst Alert = React.forwardRef<\n  HTMLDivElement,\n  React.HTMLAttributes<HTMLDivElement> & VariantProps<typeof alertVariants>\n>(({ className, variant, ...props }, ref) => (\n  <div\n    ref={ref}\n    role=\"alert\"\n    className={cn(alertVariants({ variant }), className)}\n    {...props}\n  />\n))\nAlert.displayName = \"Alert\"\n\nconst AlertTitle = React.forwardRef<\n  HTMLParagraphElement,\n  React.HTMLAttributes<HTMLHeadingElement>\n>(({ className, ...props }, ref) => (\n  <h5\n    ref={ref}\n    className={cn(\"mb-1 font-medium leading-none tracking-tight\", className)}\n    {...props}\n  />\n))\nAlertTitle.displayName = \"AlertTitle\"\n\nconst AlertDescription = React.forwardRef<\n  HTMLParagraphElement,\n  React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n  <div\n    ref={ref}\n    className={cn(\"text-sm [&_p]:leading-relaxed\", className)}\n    {...props}\n  />\n))\nAlertDescription.displayName = \"AlertDescription\"\n\nexport { Alert, AlertTitle, AlertDescription }\n"
  },
  {
    "path": "website/client/src/components/ui/aspect-ratio.tsx",
    "content": "import * as AspectRatioPrimitive from \"@radix-ui/react-aspect-ratio\"\n\nconst AspectRatio = AspectRatioPrimitive.Root\n\nexport { AspectRatio }\n"
  },
  {
    "path": "website/client/src/components/ui/avatar.tsx",
    "content": "\"use client\"\n\nimport * as React from \"react\"\nimport * as AvatarPrimitive from \"@radix-ui/react-avatar\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Avatar = React.forwardRef<\n  React.ElementRef<typeof AvatarPrimitive.Root>,\n  React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Root>\n>(({ className, ...props }, ref) => (\n  <AvatarPrimitive.Root\n    ref={ref}\n    className={cn(\n      \"relative flex h-10 w-10 shrink-0 overflow-hidden rounded-full\",\n      className\n    )}\n    {...props}\n  />\n))\nAvatar.displayName = AvatarPrimitive.Root.displayName\n\nconst AvatarImage = React.forwardRef<\n  React.ElementRef<typeof AvatarPrimitive.Image>,\n  React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Image>\n>(({ className, ...props }, ref) => (\n  <AvatarPrimitive.Image\n    ref={ref}\n    className={cn(\"aspect-square h-full w-full\", className)}\n    {...props}\n  />\n))\nAvatarImage.displayName = AvatarPrimitive.Image.displayName\n\nconst AvatarFallback = React.forwardRef<\n  React.ElementRef<typeof AvatarPrimitive.Fallback>,\n  React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Fallback>\n>(({ className, ...props }, ref) => (\n  <AvatarPrimitive.Fallback\n    ref={ref}\n    className={cn(\n      \"flex h-full w-full items-center justify-center rounded-full bg-muted\",\n      className\n    )}\n    {...props}\n  />\n))\nAvatarFallback.displayName = AvatarPrimitive.Fallback.displayName\n\nexport { Avatar, AvatarImage, AvatarFallback }\n"
  },
  {
    "path": "website/client/src/components/ui/badge.tsx",
    "content": "import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst badgeVariants = cva(\n  \"inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2\",\n  {\n    variants: {\n      variant: {\n        default:\n          \"border-transparent bg-primary text-primary-foreground hover:bg-primary/80\",\n        secondary:\n          \"border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n        destructive:\n          \"border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80\",\n        outline: \"text-foreground\",\n      },\n    },\n    defaultVariants: {\n      variant: \"default\",\n    },\n  }\n)\n\nexport interface BadgeProps\n  extends React.HTMLAttributes<HTMLDivElement>,\n    VariantProps<typeof badgeVariants> {}\n\nfunction Badge({ className, variant, ...props }: BadgeProps) {\n  return (\n    <div className={cn(badgeVariants({ variant }), className)} {...props} />\n  )\n}\n\nexport { Badge, badgeVariants }\n"
  },
  {
    "path": "website/client/src/components/ui/breadcrumb.tsx",
    "content": "import * as React from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { ChevronRight, MoreHorizontal } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Breadcrumb = React.forwardRef<\n  HTMLElement,\n  React.ComponentPropsWithoutRef<\"nav\"> & {\n    separator?: React.ReactNode\n  }\n>(({ ...props }, ref) => <nav ref={ref} aria-label=\"breadcrumb\" {...props} />)\nBreadcrumb.displayName = \"Breadcrumb\"\n\nconst BreadcrumbList = React.forwardRef<\n  HTMLOListElement,\n  React.ComponentPropsWithoutRef<\"ol\">\n>(({ className, ...props }, ref) => (\n  <ol\n    ref={ref}\n    className={cn(\n      \"flex flex-wrap items-center gap-1.5 break-words text-sm text-muted-foreground sm:gap-2.5\",\n      className\n    )}\n    {...props}\n  />\n))\nBreadcrumbList.displayName = \"BreadcrumbList\"\n\nconst BreadcrumbItem = React.forwardRef<\n  HTMLLIElement,\n  React.ComponentPropsWithoutRef<\"li\">\n>(({ className, ...props }, ref) => (\n  <li\n    ref={ref}\n    className={cn(\"inline-flex items-center gap-1.5\", className)}\n    {...props}\n  />\n))\nBreadcrumbItem.displayName = \"BreadcrumbItem\"\n\nconst BreadcrumbLink = React.forwardRef<\n  HTMLAnchorElement,\n  React.ComponentPropsWithoutRef<\"a\"> & {\n    asChild?: boolean\n  }\n>(({ asChild, className, ...props }, ref) => {\n  const Comp = asChild ? Slot : \"a\"\n\n  return (\n    <Comp\n      ref={ref}\n      className={cn(\"transition-colors hover:text-foreground\", className)}\n      {...props}\n    />\n  )\n})\nBreadcrumbLink.displayName = \"BreadcrumbLink\"\n\nconst BreadcrumbPage = React.forwardRef<\n  HTMLSpanElement,\n  React.ComponentPropsWithoutRef<\"span\">\n>(({ className, ...props }, ref) => (\n  <span\n    ref={ref}\n    role=\"link\"\n    aria-disabled=\"true\"\n    aria-current=\"page\"\n    className={cn(\"font-normal text-foreground\", className)}\n    {...props}\n  />\n))\nBreadcrumbPage.displayName = \"BreadcrumbPage\"\n\nconst BreadcrumbSeparator = ({\n  children,\n  className,\n  ...props\n}: React.ComponentProps<\"li\">) => (\n  <li\n    role=\"presentation\"\n    aria-hidden=\"true\"\n    className={cn(\"[&>svg]:w-3.5 [&>svg]:h-3.5\", className)}\n    {...props}\n  >\n    {children ?? <ChevronRight />}\n  </li>\n)\nBreadcrumbSeparator.displayName = \"BreadcrumbSeparator\"\n\nconst BreadcrumbEllipsis = ({\n  className,\n  ...props\n}: React.ComponentProps<\"span\">) => (\n  <span\n    role=\"presentation\"\n    aria-hidden=\"true\"\n    className={cn(\"flex h-9 w-9 items-center justify-center\", className)}\n    {...props}\n  >\n    <MoreHorizontal className=\"h-4 w-4\" />\n    <span className=\"sr-only\">More</span>\n  </span>\n)\nBreadcrumbEllipsis.displayName = \"BreadcrumbElipssis\"\n\nexport {\n  Breadcrumb,\n  BreadcrumbList,\n  BreadcrumbItem,\n  BreadcrumbLink,\n  BreadcrumbPage,\n  BreadcrumbSeparator,\n  BreadcrumbEllipsis,\n}\n"
  },
  {
    "path": "website/client/src/components/ui/button.tsx",
    "content": "import * as React from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst buttonVariants = cva(\n  \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n  {\n    variants: {\n      variant: {\n        default: \"bg-primary text-primary-foreground hover:bg-primary/90\",\n        destructive:\n          \"bg-destructive text-destructive-foreground hover:bg-destructive/90\",\n        outline:\n          \"border border-input bg-background hover:bg-accent hover:text-accent-foreground\",\n        secondary:\n          \"bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n        ghost: \"hover:bg-accent hover:text-accent-foreground\",\n        link: \"text-primary underline-offset-4 hover:underline\",\n      },\n      size: {\n        default: \"h-10 px-4 py-2\",\n        sm: \"h-9 rounded-md px-3\",\n        lg: \"h-11 rounded-md px-8\",\n        icon: \"h-10 w-10\",\n      },\n    },\n    defaultVariants: {\n      variant: \"default\",\n      size: \"default\",\n    },\n  }\n)\n\nexport interface ButtonProps\n  extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n    VariantProps<typeof buttonVariants> {\n  asChild?: boolean\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n  ({ className, variant, size, asChild = false, ...props }, ref) => {\n    const Comp = asChild ? Slot : \"button\"\n    return (\n      <Comp\n        className={cn(buttonVariants({ variant, size, className }))}\n        ref={ref}\n        {...props}\n      />\n    )\n  }\n)\nButton.displayName = \"Button\"\n\nexport { Button, buttonVariants }\n"
  },
  {
    "path": "website/client/src/components/ui/calendar.tsx",
    "content": "import * as React from \"react\"\nimport { ChevronLeft, ChevronRight } from \"lucide-react\"\nimport { DayPicker } from \"react-day-picker\"\n\nimport { cn } from \"@/lib/utils\"\nimport { buttonVariants } from \"@/components/ui/button\"\n\nexport type CalendarProps = React.ComponentProps<typeof DayPicker>\n\nfunction Calendar({\n  className,\n  classNames,\n  showOutsideDays = true,\n  ...props\n}: CalendarProps) {\n  return (\n    <DayPicker\n      showOutsideDays={showOutsideDays}\n      className={cn(\"p-3\", className)}\n      classNames={{\n        months: \"flex flex-col sm:flex-row space-y-4 sm:space-x-4 sm:space-y-0\",\n        month: \"space-y-4\",\n        caption: \"flex justify-center pt-1 relative items-center\",\n        caption_label: \"text-sm font-medium\",\n        nav: \"space-x-1 flex items-center\",\n        nav_button: cn(\n          buttonVariants({ variant: \"outline\" }),\n          \"h-7 w-7 bg-transparent p-0 opacity-50 hover:opacity-100\"\n        ),\n        nav_button_previous: \"absolute left-1\",\n        nav_button_next: \"absolute right-1\",\n        table: \"w-full border-collapse space-y-1\",\n        head_row: \"flex\",\n        head_cell:\n          \"text-muted-foreground rounded-md w-9 font-normal text-[0.8rem]\",\n        row: \"flex w-full mt-2\",\n        cell: \"h-9 w-9 text-center text-sm p-0 relative [&:has([aria-selected].day-range-end)]:rounded-r-md [&:has([aria-selected].day-outside)]:bg-accent/50 [&:has([aria-selected])]:bg-accent first:[&:has([aria-selected])]:rounded-l-md last:[&:has([aria-selected])]:rounded-r-md focus-within:relative focus-within:z-20\",\n        day: cn(\n          buttonVariants({ variant: \"ghost\" }),\n          \"h-9 w-9 p-0 font-normal aria-selected:opacity-100\"\n        ),\n        day_range_end: \"day-range-end\",\n        day_selected:\n          \"bg-primary text-primary-foreground hover:bg-primary hover:text-primary-foreground focus:bg-primary focus:text-primary-foreground\",\n        day_today: \"bg-accent text-accent-foreground\",\n        day_outside:\n          \"day-outside text-muted-foreground aria-selected:bg-accent/50 aria-selected:text-muted-foreground\",\n        day_disabled: \"text-muted-foreground opacity-50\",\n        day_range_middle:\n          \"aria-selected:bg-accent aria-selected:text-accent-foreground\",\n        day_hidden: \"invisible\",\n        ...classNames,\n      }}\n      components={{\n        IconLeft: ({ className, ...props }) => (\n          <ChevronLeft className={cn(\"h-4 w-4\", className)} {...props} />\n        ),\n        IconRight: ({ className, ...props }) => (\n          <ChevronRight className={cn(\"h-4 w-4\", className)} {...props} />\n        ),\n      }}\n      {...props}\n    />\n  )\n}\nCalendar.displayName = \"Calendar\"\n\nexport { Calendar }\n"
  },
  {
    "path": "website/client/src/components/ui/card.tsx",
    "content": "import * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Card = React.forwardRef<\n  HTMLDivElement,\n  React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n  <div\n    ref={ref}\n    className={cn(\n      \"rounded-lg border bg-card text-card-foreground shadow-sm\",\n      className\n    )}\n    {...props}\n  />\n))\nCard.displayName = \"Card\"\n\nconst CardHeader = React.forwardRef<\n  HTMLDivElement,\n  React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n  <div\n    ref={ref}\n    className={cn(\"flex flex-col space-y-1.5 p-6\", className)}\n    {...props}\n  />\n))\nCardHeader.displayName = \"CardHeader\"\n\nconst CardTitle = React.forwardRef<\n  HTMLDivElement,\n  React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n  <div\n    ref={ref}\n    className={cn(\n      \"text-2xl font-semibold leading-none tracking-tight\",\n      className\n    )}\n    {...props}\n  />\n))\nCardTitle.displayName = \"CardTitle\"\n\nconst CardDescription = React.forwardRef<\n  HTMLDivElement,\n  React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n  <div\n    ref={ref}\n    className={cn(\"text-sm text-muted-foreground\", className)}\n    {...props}\n  />\n))\nCardDescription.displayName = \"CardDescription\"\n\nconst CardContent = React.forwardRef<\n  HTMLDivElement,\n  React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n  <div ref={ref} className={cn(\"p-6 pt-0\", className)} {...props} />\n))\nCardContent.displayName = \"CardContent\"\n\nconst CardFooter = React.forwardRef<\n  HTMLDivElement,\n  React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n  <div\n    ref={ref}\n    className={cn(\"flex items-center p-6 pt-0\", className)}\n    {...props}\n  />\n))\nCardFooter.displayName = \"CardFooter\"\n\nexport { Card, CardHeader, CardFooter, CardTitle, CardDescription, CardContent }\n"
  },
  {
    "path": "website/client/src/components/ui/carousel.tsx",
    "content": "import * as React from \"react\"\nimport useEmblaCarousel, {\n  type UseEmblaCarouselType,\n} from \"embla-carousel-react\"\nimport { ArrowLeft, ArrowRight } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Button } from \"@/components/ui/button\"\n\ntype CarouselApi = UseEmblaCarouselType[1]\ntype UseCarouselParameters = Parameters<typeof useEmblaCarousel>\ntype CarouselOptions = UseCarouselParameters[0]\ntype CarouselPlugin = UseCarouselParameters[1]\n\ntype CarouselProps = {\n  opts?: CarouselOptions\n  plugins?: CarouselPlugin\n  orientation?: \"horizontal\" | \"vertical\"\n  setApi?: (api: CarouselApi) => void\n}\n\ntype CarouselContextProps = {\n  carouselRef: ReturnType<typeof useEmblaCarousel>[0]\n  api: ReturnType<typeof useEmblaCarousel>[1]\n  scrollPrev: () => void\n  scrollNext: () => void\n  canScrollPrev: boolean\n  canScrollNext: boolean\n} & CarouselProps\n\nconst CarouselContext = React.createContext<CarouselContextProps | null>(null)\n\nfunction useCarousel() {\n  const context = React.useContext(CarouselContext)\n\n  if (!context) {\n    throw new Error(\"useCarousel must be used within a <Carousel />\")\n  }\n\n  return context\n}\n\nconst Carousel = React.forwardRef<\n  HTMLDivElement,\n  React.HTMLAttributes<HTMLDivElement> & CarouselProps\n>(\n  (\n    {\n      orientation = \"horizontal\",\n      opts,\n      setApi,\n      plugins,\n      className,\n      children,\n      ...props\n    },\n    ref\n  ) => {\n    const [carouselRef, api] = useEmblaCarousel(\n      {\n        ...opts,\n        axis: orientation === \"horizontal\" ? \"x\" : \"y\",\n      },\n      plugins\n    )\n    const [canScrollPrev, setCanScrollPrev] = React.useState(false)\n    const [canScrollNext, setCanScrollNext] = React.useState(false)\n\n    const onSelect = React.useCallback((api: CarouselApi) => {\n      if (!api) {\n        return\n      }\n\n      setCanScrollPrev(api.canScrollPrev())\n      setCanScrollNext(api.canScrollNext())\n    }, [])\n\n    const scrollPrev = React.useCallback(() => {\n      api?.scrollPrev()\n    }, [api])\n\n    const scrollNext = React.useCallback(() => {\n      api?.scrollNext()\n    }, [api])\n\n    const handleKeyDown = React.useCallback(\n      (event: React.KeyboardEvent<HTMLDivElement>) => {\n        if (event.key === \"ArrowLeft\") {\n          event.preventDefault()\n          scrollPrev()\n        } else if (event.key === \"ArrowRight\") {\n          event.preventDefault()\n          scrollNext()\n        }\n      },\n      [scrollPrev, scrollNext]\n    )\n\n    React.useEffect(() => {\n      if (!api || !setApi) {\n        return\n      }\n\n      setApi(api)\n    }, [api, setApi])\n\n    React.useEffect(() => {\n      if (!api) {\n        return\n      }\n\n      onSelect(api)\n      api.on(\"reInit\", onSelect)\n      api.on(\"select\", onSelect)\n\n      return () => {\n        api?.off(\"select\", onSelect)\n      }\n    }, [api, onSelect])\n\n    return (\n      <CarouselContext.Provider\n        value={{\n          carouselRef,\n          api: api,\n          opts,\n          orientation:\n            orientation || (opts?.axis === \"y\" ? \"vertical\" : \"horizontal\"),\n          scrollPrev,\n          scrollNext,\n          canScrollPrev,\n          canScrollNext,\n        }}\n      >\n        <div\n          ref={ref}\n          onKeyDownCapture={handleKeyDown}\n          className={cn(\"relative\", className)}\n          role=\"region\"\n          aria-roledescription=\"carousel\"\n          {...props}\n        >\n          {children}\n        </div>\n      </CarouselContext.Provider>\n    )\n  }\n)\nCarousel.displayName = \"Carousel\"\n\nconst CarouselContent = React.forwardRef<\n  HTMLDivElement,\n  React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => {\n  const { carouselRef, orientation } = useCarousel()\n\n  return (\n    <div ref={carouselRef} className=\"overflow-hidden\">\n      <div\n        ref={ref}\n        className={cn(\n          \"flex\",\n          orientation === \"horizontal\" ? \"-ml-4\" : \"-mt-4 flex-col\",\n          className\n        )}\n        {...props}\n      />\n    </div>\n  )\n})\nCarouselContent.displayName = \"CarouselContent\"\n\nconst CarouselItem = React.forwardRef<\n  HTMLDivElement,\n  React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => {\n  const { orientation } = useCarousel()\n\n  return (\n    <div\n      ref={ref}\n      role=\"group\"\n      aria-roledescription=\"slide\"\n      className={cn(\n        \"min-w-0 shrink-0 grow-0 basis-full\",\n        orientation === \"horizontal\" ? \"pl-4\" : \"pt-4\",\n        className\n      )}\n      {...props}\n    />\n  )\n})\nCarouselItem.displayName = \"CarouselItem\"\n\nconst CarouselPrevious = React.forwardRef<\n  HTMLButtonElement,\n  React.ComponentProps<typeof Button>\n>(({ className, variant = \"outline\", size = \"icon\", ...props }, ref) => {\n  const { orientation, scrollPrev, canScrollPrev } = useCarousel()\n\n  return (\n    <Button\n      ref={ref}\n      variant={variant}\n      size={size}\n      className={cn(\n        \"absolute  h-8 w-8 rounded-full\",\n        orientation === \"horizontal\"\n          ? \"-left-12 top-1/2 -translate-y-1/2\"\n          : \"-top-12 left-1/2 -translate-x-1/2 rotate-90\",\n        className\n      )}\n      disabled={!canScrollPrev}\n      onClick={scrollPrev}\n      {...props}\n    >\n      <ArrowLeft className=\"h-4 w-4\" />\n      <span className=\"sr-only\">Previous slide</span>\n    </Button>\n  )\n})\nCarouselPrevious.displayName = \"CarouselPrevious\"\n\nconst CarouselNext = React.forwardRef<\n  HTMLButtonElement,\n  React.ComponentProps<typeof Button>\n>(({ className, variant = \"outline\", size = \"icon\", ...props }, ref) => {\n  const { orientation, scrollNext, canScrollNext } = useCarousel()\n\n  return (\n    <Button\n      ref={ref}\n      variant={variant}\n      size={size}\n      className={cn(\n        \"absolute h-8 w-8 rounded-full\",\n        orientation === \"horizontal\"\n          ? \"-right-12 top-1/2 -translate-y-1/2\"\n          : \"-bottom-12 left-1/2 -translate-x-1/2 rotate-90\",\n        className\n      )}\n      disabled={!canScrollNext}\n      onClick={scrollNext}\n      {...props}\n    >\n      <ArrowRight className=\"h-4 w-4\" />\n      <span className=\"sr-only\">Next slide</span>\n    </Button>\n  )\n})\nCarouselNext.displayName = \"CarouselNext\"\n\nexport {\n  type CarouselApi,\n  Carousel,\n  CarouselContent,\n  CarouselItem,\n  CarouselPrevious,\n  CarouselNext,\n}\n"
  },
  {
    "path": "website/client/src/components/ui/chart.tsx",
    "content": "\"use client\"\n\nimport * as React from \"react\"\nimport * as RechartsPrimitive from \"recharts\"\n\nimport { cn } from \"@/lib/utils\"\n\n// Format: { THEME_NAME: CSS_SELECTOR }\nconst THEMES = { light: \"\", dark: \".dark\" } as const\n\nexport type ChartConfig = {\n  [k in string]: {\n    label?: React.ReactNode\n    icon?: React.ComponentType\n  } & (\n    | { color?: string; theme?: never }\n    | { color?: never; theme: Record<keyof typeof THEMES, string> }\n  )\n}\n\ntype ChartContextProps = {\n  config: ChartConfig\n}\n\nconst ChartContext = React.createContext<ChartContextProps | null>(null)\n\nfunction useChart() {\n  const context = React.useContext(ChartContext)\n\n  if (!context) {\n    throw new Error(\"useChart must be used within a <ChartContainer />\")\n  }\n\n  return context\n}\n\nconst ChartContainer = React.forwardRef<\n  HTMLDivElement,\n  React.ComponentProps<\"div\"> & {\n    config: ChartConfig\n    children: React.ComponentProps<\n      typeof RechartsPrimitive.ResponsiveContainer\n    >[\"children\"]\n  }\n>(({ id, className, children, config, ...props }, ref) => {\n  const uniqueId = React.useId()\n  const chartId = `chart-${id || uniqueId.replace(/:/g, \"\")}`\n\n  return (\n    <ChartContext.Provider value={{ config }}>\n      <div\n        data-chart={chartId}\n        ref={ref}\n        className={cn(\n          \"flex aspect-video justify-center text-xs [&_.recharts-cartesian-axis-tick_text]:fill-muted-foreground [&_.recharts-cartesian-grid_line[stroke='#ccc']]:stroke-border/50 [&_.recharts-curve.recharts-tooltip-cursor]:stroke-border [&_.recharts-dot[stroke='#fff']]:stroke-transparent [&_.recharts-layer]:outline-none [&_.recharts-polar-grid_[stroke='#ccc']]:stroke-border [&_.recharts-radial-bar-background-sector]:fill-muted [&_.recharts-rectangle.recharts-tooltip-cursor]:fill-muted [&_.recharts-reference-line_[stroke='#ccc']]:stroke-border [&_.recharts-sector[stroke='#fff']]:stroke-transparent [&_.recharts-sector]:outline-none [&_.recharts-surface]:outline-none\",\n          className\n        )}\n        {...props}\n      >\n        <ChartStyle id={chartId} config={config} />\n        <RechartsPrimitive.ResponsiveContainer>\n          {children}\n        </RechartsPrimitive.ResponsiveContainer>\n      </div>\n    </ChartContext.Provider>\n  )\n})\nChartContainer.displayName = \"Chart\"\n\nconst ChartStyle = ({ id, config }: { id: string; config: ChartConfig }) => {\n  const colorConfig = Object.entries(config).filter(\n    ([, config]) => config.theme || config.color\n  )\n\n  if (!colorConfig.length) {\n    return null\n  }\n\n  return (\n    <style\n      dangerouslySetInnerHTML={{\n        __html: Object.entries(THEMES)\n          .map(\n            ([theme, prefix]) => `\n${prefix} [data-chart=${id}] {\n${colorConfig\n  .map(([key, itemConfig]) => {\n    const color =\n      itemConfig.theme?.[theme as keyof typeof itemConfig.theme] ||\n      itemConfig.color\n    return color ? `  --color-${key}: ${color};` : null\n  })\n  .join(\"\\n\")}\n}\n`\n          )\n          .join(\"\\n\"),\n      }}\n    />\n  )\n}\n\nconst ChartTooltip = RechartsPrimitive.Tooltip\n\nconst ChartTooltipContent = React.forwardRef<\n  HTMLDivElement,\n  React.ComponentProps<typeof RechartsPrimitive.Tooltip> &\n    React.ComponentProps<\"div\"> & {\n      hideLabel?: boolean\n      hideIndicator?: boolean\n      indicator?: \"line\" | \"dot\" | \"dashed\"\n      nameKey?: string\n      labelKey?: string\n    }\n>(\n  (\n    {\n      active,\n      payload,\n      className,\n      indicator = \"dot\",\n      hideLabel = false,\n      hideIndicator = false,\n      label,\n      labelFormatter,\n      labelClassName,\n      formatter,\n      color,\n      nameKey,\n      labelKey,\n    },\n    ref\n  ) => {\n    const { config } = useChart()\n\n    const tooltipLabel = React.useMemo(() => {\n      if (hideLabel || !payload?.length) {\n        return null\n      }\n\n      const [item] = payload\n      const key = `${labelKey || item?.dataKey || item?.name || \"value\"}`\n      const itemConfig = getPayloadConfigFromPayload(config, item, key)\n      const value =\n        !labelKey && typeof label === \"string\"\n          ? config[label as keyof typeof config]?.label || label\n          : itemConfig?.label\n\n      if (labelFormatter) {\n        return (\n          <div className={cn(\"font-medium\", labelClassName)}>\n            {labelFormatter(value, payload)}\n          </div>\n        )\n      }\n\n      if (!value) {\n        return null\n      }\n\n      return <div className={cn(\"font-medium\", labelClassName)}>{value}</div>\n    }, [\n      label,\n      labelFormatter,\n      payload,\n      hideLabel,\n      labelClassName,\n      config,\n      labelKey,\n    ])\n\n    if (!active || !payload?.length) {\n      return null\n    }\n\n    const nestLabel = payload.length === 1 && indicator !== \"dot\"\n\n    return (\n      <div\n        ref={ref}\n        className={cn(\n          \"grid min-w-[8rem] items-start gap-1.5 rounded-lg border border-border/50 bg-background px-2.5 py-1.5 text-xs shadow-xl\",\n          className\n        )}\n      >\n        {!nestLabel ? tooltipLabel : null}\n        <div className=\"grid gap-1.5\">\n          {payload.map((item, index) => {\n            const key = `${nameKey || item.name || item.dataKey || \"value\"}`\n            const itemConfig = getPayloadConfigFromPayload(config, item, key)\n            const indicatorColor = color || item.payload.fill || item.color\n\n            return (\n              <div\n                key={item.dataKey}\n                className={cn(\n                  \"flex w-full flex-wrap items-stretch gap-2 [&>svg]:h-2.5 [&>svg]:w-2.5 [&>svg]:text-muted-foreground\",\n                  indicator === \"dot\" && \"items-center\"\n                )}\n              >\n                {formatter && item?.value !== undefined && item.name ? (\n                  formatter(item.value, item.name, item, index, item.payload)\n                ) : (\n                  <>\n                    {itemConfig?.icon ? (\n                      <itemConfig.icon />\n                    ) : (\n                      !hideIndicator && (\n                        <div\n                          className={cn(\n                            \"shrink-0 rounded-[2px] border-[--color-border] bg-[--color-bg]\",\n                            {\n                              \"h-2.5 w-2.5\": indicator === \"dot\",\n                              \"w-1\": indicator === \"line\",\n                              \"w-0 border-[1.5px] border-dashed bg-transparent\":\n                                indicator === \"dashed\",\n                              \"my-0.5\": nestLabel && indicator === \"dashed\",\n                            }\n                          )}\n                          style={\n                            {\n                              \"--color-bg\": indicatorColor,\n                              \"--color-border\": indicatorColor,\n                            } as React.CSSProperties\n                          }\n                        />\n                      )\n                    )}\n                    <div\n                      className={cn(\n                        \"flex flex-1 justify-between leading-none\",\n                        nestLabel ? \"items-end\" : \"items-center\"\n                      )}\n                    >\n                      <div className=\"grid gap-1.5\">\n                        {nestLabel ? tooltipLabel : null}\n                        <span className=\"text-muted-foreground\">\n                          {itemConfig?.label || item.name}\n                        </span>\n                      </div>\n                      {item.value && (\n                        <span className=\"font-mono font-medium tabular-nums text-foreground\">\n                          {item.value.toLocaleString()}\n                        </span>\n                      )}\n                    </div>\n                  </>\n                )}\n              </div>\n            )\n          })}\n        </div>\n      </div>\n    )\n  }\n)\nChartTooltipContent.displayName = \"ChartTooltip\"\n\nconst ChartLegend = RechartsPrimitive.Legend\n\nconst ChartLegendContent = React.forwardRef<\n  HTMLDivElement,\n  React.ComponentProps<\"div\"> &\n    Pick<RechartsPrimitive.LegendProps, \"payload\" | \"verticalAlign\"> & {\n      hideIcon?: boolean\n      nameKey?: string\n    }\n>(\n  (\n    { className, hideIcon = false, payload, verticalAlign = \"bottom\", nameKey },\n    ref\n  ) => {\n    const { config } = useChart()\n\n    if (!payload?.length) {\n      return null\n    }\n\n    return (\n      <div\n        ref={ref}\n        className={cn(\n          \"flex items-center justify-center gap-4\",\n          verticalAlign === \"top\" ? \"pb-3\" : \"pt-3\",\n          className\n        )}\n      >\n        {payload.map((item) => {\n          const key = `${nameKey || item.dataKey || \"value\"}`\n          const itemConfig = getPayloadConfigFromPayload(config, item, key)\n\n          return (\n            <div\n              key={item.value}\n              className={cn(\n                \"flex items-center gap-1.5 [&>svg]:h-3 [&>svg]:w-3 [&>svg]:text-muted-foreground\"\n              )}\n            >\n              {itemConfig?.icon && !hideIcon ? (\n                <itemConfig.icon />\n              ) : (\n                <div\n                  className=\"h-2 w-2 shrink-0 rounded-[2px]\"\n                  style={{\n                    backgroundColor: item.color,\n                  }}\n                />\n              )}\n              {itemConfig?.label}\n            </div>\n          )\n        })}\n      </div>\n    )\n  }\n)\nChartLegendContent.displayName = \"ChartLegend\"\n\n// Helper to extract item config from a payload.\nfunction getPayloadConfigFromPayload(\n  config: ChartConfig,\n  payload: unknown,\n  key: string\n) {\n  if (typeof payload !== \"object\" || payload === null) {\n    return undefined\n  }\n\n  const payloadPayload =\n    \"payload\" in payload &&\n    typeof payload.payload === \"object\" &&\n    payload.payload !== null\n      ? payload.payload\n      : undefined\n\n  let configLabelKey: string = key\n\n  if (\n    key in payload &&\n    typeof payload[key as keyof typeof payload] === \"string\"\n  ) {\n    configLabelKey = payload[key as keyof typeof payload] as string\n  } else if (\n    payloadPayload &&\n    key in payloadPayload &&\n    typeof payloadPayload[key as keyof typeof payloadPayload] === \"string\"\n  ) {\n    configLabelKey = payloadPayload[\n      key as keyof typeof payloadPayload\n    ] as string\n  }\n\n  return configLabelKey in config\n    ? config[configLabelKey]\n    : config[key as keyof typeof config]\n}\n\nexport {\n  ChartContainer,\n  ChartTooltip,\n  ChartTooltipContent,\n  ChartLegend,\n  ChartLegendContent,\n  ChartStyle,\n}\n"
  },
  {
    "path": "website/client/src/components/ui/checkbox.tsx",
    "content": "import * as React from \"react\"\nimport * as CheckboxPrimitive from \"@radix-ui/react-checkbox\"\nimport { Check } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Checkbox = React.forwardRef<\n  React.ElementRef<typeof CheckboxPrimitive.Root>,\n  React.ComponentPropsWithoutRef<typeof CheckboxPrimitive.Root>\n>(({ className, ...props }, ref) => (\n  <CheckboxPrimitive.Root\n    ref={ref}\n    className={cn(\n      \"peer h-4 w-4 shrink-0 rounded-sm border border-primary ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=checked]:text-primary-foreground\",\n      className\n    )}\n    {...props}\n  >\n    <CheckboxPrimitive.Indicator\n      className={cn(\"flex items-center justify-center text-current\")}\n    >\n      <Check className=\"h-4 w-4\" />\n    </CheckboxPrimitive.Indicator>\n  </CheckboxPrimitive.Root>\n))\nCheckbox.displayName = CheckboxPrimitive.Root.displayName\n\nexport { Checkbox }\n"
  },
  {
    "path": "website/client/src/components/ui/collapsible.tsx",
    "content": "\"use client\"\n\nimport * as CollapsiblePrimitive from \"@radix-ui/react-collapsible\"\n\nconst Collapsible = CollapsiblePrimitive.Root\n\nconst CollapsibleTrigger = CollapsiblePrimitive.CollapsibleTrigger\n\nconst CollapsibleContent = CollapsiblePrimitive.CollapsibleContent\n\nexport { Collapsible, CollapsibleTrigger, CollapsibleContent }\n"
  },
  {
    "path": "website/client/src/components/ui/command.tsx",
    "content": "import * as React from \"react\"\nimport { type DialogProps } from \"@radix-ui/react-dialog\"\nimport { Command as CommandPrimitive } from \"cmdk\"\nimport { Search } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Dialog, DialogContent } from \"@/components/ui/dialog\"\n\nconst Command = React.forwardRef<\n  React.ElementRef<typeof CommandPrimitive>,\n  React.ComponentPropsWithoutRef<typeof CommandPrimitive>\n>(({ className, ...props }, ref) => (\n  <CommandPrimitive\n    ref={ref}\n    className={cn(\n      \"flex h-full w-full flex-col overflow-hidden rounded-md bg-popover text-popover-foreground\",\n      className\n    )}\n    {...props}\n  />\n))\nCommand.displayName = CommandPrimitive.displayName\n\nconst CommandDialog = ({ children, ...props }: DialogProps) => {\n  return (\n    <Dialog {...props}>\n      <DialogContent className=\"overflow-hidden p-0 shadow-lg\">\n        <Command className=\"[&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground [&_[cmdk-group]:not([hidden])_~[cmdk-group]]:pt-0 [&_[cmdk-group]]:px-2 [&_[cmdk-input-wrapper]_svg]:h-5 [&_[cmdk-input-wrapper]_svg]:w-5 [&_[cmdk-input]]:h-12 [&_[cmdk-item]]:px-2 [&_[cmdk-item]]:py-3 [&_[cmdk-item]_svg]:h-5 [&_[cmdk-item]_svg]:w-5\">\n          {children}\n        </Command>\n      </DialogContent>\n    </Dialog>\n  )\n}\n\nconst CommandInput = React.forwardRef<\n  React.ElementRef<typeof CommandPrimitive.Input>,\n  React.ComponentPropsWithoutRef<typeof CommandPrimitive.Input>\n>(({ className, ...props }, ref) => (\n  <div className=\"flex items-center border-b px-3\" cmdk-input-wrapper=\"\">\n    <Search className=\"mr-2 h-4 w-4 shrink-0 opacity-50\" />\n    <CommandPrimitive.Input\n      ref={ref}\n      className={cn(\n        \"flex h-11 w-full rounded-md bg-transparent py-3 text-sm outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50\",\n        className\n      )}\n      {...props}\n    />\n  </div>\n))\n\nCommandInput.displayName = CommandPrimitive.Input.displayName\n\nconst CommandList = React.forwardRef<\n  React.ElementRef<typeof CommandPrimitive.List>,\n  React.ComponentPropsWithoutRef<typeof CommandPrimitive.List>\n>(({ className, ...props }, ref) => (\n  <CommandPrimitive.List\n    ref={ref}\n    className={cn(\"max-h-[300px] overflow-y-auto overflow-x-hidden\", className)}\n    {...props}\n  />\n))\n\nCommandList.displayName = CommandPrimitive.List.displayName\n\nconst CommandEmpty = React.forwardRef<\n  React.ElementRef<typeof CommandPrimitive.Empty>,\n  React.ComponentPropsWithoutRef<typeof CommandPrimitive.Empty>\n>((props, ref) => (\n  <CommandPrimitive.Empty\n    ref={ref}\n    className=\"py-6 text-center text-sm\"\n    {...props}\n  />\n))\n\nCommandEmpty.displayName = CommandPrimitive.Empty.displayName\n\nconst CommandGroup = React.forwardRef<\n  React.ElementRef<typeof CommandPrimitive.Group>,\n  React.ComponentPropsWithoutRef<typeof CommandPrimitive.Group>\n>(({ className, ...props }, ref) => (\n  <CommandPrimitive.Group\n    ref={ref}\n    className={cn(\n      \"overflow-hidden p-1 text-foreground [&_[cmdk-group-heading]]:px-2 [&_[cmdk-group-heading]]:py-1.5 [&_[cmdk-group-heading]]:text-xs [&_[cmdk-group-heading]]:font-medium [&_[cmdk-group-heading]]:text-muted-foreground\",\n      className\n    )}\n    {...props}\n  />\n))\n\nCommandGroup.displayName = CommandPrimitive.Group.displayName\n\nconst CommandSeparator = React.forwardRef<\n  React.ElementRef<typeof CommandPrimitive.Separator>,\n  React.ComponentPropsWithoutRef<typeof CommandPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n  <CommandPrimitive.Separator\n    ref={ref}\n    className={cn(\"-mx-1 h-px bg-border\", className)}\n    {...props}\n  />\n))\nCommandSeparator.displayName = CommandPrimitive.Separator.displayName\n\nconst CommandItem = React.forwardRef<\n  React.ElementRef<typeof CommandPrimitive.Item>,\n  React.ComponentPropsWithoutRef<typeof CommandPrimitive.Item>\n>(({ className, ...props }, ref) => (\n  <CommandPrimitive.Item\n    ref={ref}\n    className={cn(\n      \"relative flex cursor-default gap-2 select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none data-[disabled=true]:pointer-events-none data-[selected='true']:bg-accent data-[selected=true]:text-accent-foreground data-[disabled=true]:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n      className\n    )}\n    {...props}\n  />\n))\n\nCommandItem.displayName = CommandPrimitive.Item.displayName\n\nconst CommandShortcut = ({\n  className,\n  ...props\n}: React.HTMLAttributes<HTMLSpanElement>) => {\n  return (\n    <span\n      className={cn(\n        \"ml-auto text-xs tracking-widest text-muted-foreground\",\n        className\n      )}\n      {...props}\n    />\n  )\n}\nCommandShortcut.displayName = \"CommandShortcut\"\n\nexport {\n  Command,\n  CommandDialog,\n  CommandInput,\n  CommandList,\n  CommandEmpty,\n  CommandGroup,\n  CommandItem,\n  CommandShortcut,\n  CommandSeparator,\n}\n"
  },
  {
    "path": "website/client/src/components/ui/context-menu.tsx",
    "content": "import * as React from \"react\"\nimport * as ContextMenuPrimitive from \"@radix-ui/react-context-menu\"\nimport { Check, ChevronRight, Circle } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst ContextMenu = ContextMenuPrimitive.Root\n\nconst ContextMenuTrigger = ContextMenuPrimitive.Trigger\n\nconst ContextMenuGroup = ContextMenuPrimitive.Group\n\nconst ContextMenuPortal = ContextMenuPrimitive.Portal\n\nconst ContextMenuSub = ContextMenuPrimitive.Sub\n\nconst ContextMenuRadioGroup = ContextMenuPrimitive.RadioGroup\n\nconst ContextMenuSubTrigger = React.forwardRef<\n  React.ElementRef<typeof ContextMenuPrimitive.SubTrigger>,\n  React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.SubTrigger> & {\n    inset?: boolean\n  }\n>(({ className, inset, children, ...props }, ref) => (\n  <ContextMenuPrimitive.SubTrigger\n    ref={ref}\n    className={cn(\n      \"flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground\",\n      inset && \"pl-8\",\n      className\n    )}\n    {...props}\n  >\n    {children}\n    <ChevronRight className=\"ml-auto h-4 w-4\" />\n  </ContextMenuPrimitive.SubTrigger>\n))\nContextMenuSubTrigger.displayName = ContextMenuPrimitive.SubTrigger.displayName\n\nconst ContextMenuSubContent = React.forwardRef<\n  React.ElementRef<typeof ContextMenuPrimitive.SubContent>,\n  React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.SubContent>\n>(({ className, ...props }, ref) => (\n  <ContextMenuPrimitive.SubContent\n    ref={ref}\n    className={cn(\n      \"z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-context-menu-content-transform-origin]\",\n      className\n    )}\n    {...props}\n  />\n))\nContextMenuSubContent.displayName = ContextMenuPrimitive.SubContent.displayName\n\nconst ContextMenuContent = React.forwardRef<\n  React.ElementRef<typeof ContextMenuPrimitive.Content>,\n  React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.Content>\n>(({ className, ...props }, ref) => (\n  <ContextMenuPrimitive.Portal>\n    <ContextMenuPrimitive.Content\n      ref={ref}\n      className={cn(\n        \"z-50 max-h-[--radix-context-menu-content-available-height] min-w-[8rem] overflow-y-auto overflow-x-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md animate-in fade-in-80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-context-menu-content-transform-origin]\",\n        className\n      )}\n      {...props}\n    />\n  </ContextMenuPrimitive.Portal>\n))\nContextMenuContent.displayName = ContextMenuPrimitive.Content.displayName\n\nconst ContextMenuItem = React.forwardRef<\n  React.ElementRef<typeof ContextMenuPrimitive.Item>,\n  React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.Item> & {\n    inset?: boolean\n  }\n>(({ className, inset, ...props }, ref) => (\n  <ContextMenuPrimitive.Item\n    ref={ref}\n    className={cn(\n      \"relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n      inset && \"pl-8\",\n      className\n    )}\n    {...props}\n  />\n))\nContextMenuItem.displayName = ContextMenuPrimitive.Item.displayName\n\nconst ContextMenuCheckboxItem = React.forwardRef<\n  React.ElementRef<typeof ContextMenuPrimitive.CheckboxItem>,\n  React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.CheckboxItem>\n>(({ className, children, checked, ...props }, ref) => (\n  <ContextMenuPrimitive.CheckboxItem\n    ref={ref}\n    className={cn(\n      \"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n      className\n    )}\n    checked={checked}\n    {...props}\n  >\n    <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n      <ContextMenuPrimitive.ItemIndicator>\n        <Check className=\"h-4 w-4\" />\n      </ContextMenuPrimitive.ItemIndicator>\n    </span>\n    {children}\n  </ContextMenuPrimitive.CheckboxItem>\n))\nContextMenuCheckboxItem.displayName =\n  ContextMenuPrimitive.CheckboxItem.displayName\n\nconst ContextMenuRadioItem = React.forwardRef<\n  React.ElementRef<typeof ContextMenuPrimitive.RadioItem>,\n  React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.RadioItem>\n>(({ className, children, ...props }, ref) => (\n  <ContextMenuPrimitive.RadioItem\n    ref={ref}\n    className={cn(\n      \"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n      className\n    )}\n    {...props}\n  >\n    <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n      <ContextMenuPrimitive.ItemIndicator>\n        <Circle className=\"h-2 w-2 fill-current\" />\n      </ContextMenuPrimitive.ItemIndicator>\n    </span>\n    {children}\n  </ContextMenuPrimitive.RadioItem>\n))\nContextMenuRadioItem.displayName = ContextMenuPrimitive.RadioItem.displayName\n\nconst ContextMenuLabel = React.forwardRef<\n  React.ElementRef<typeof ContextMenuPrimitive.Label>,\n  React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.Label> & {\n    inset?: boolean\n  }\n>(({ className, inset, ...props }, ref) => (\n  <ContextMenuPrimitive.Label\n    ref={ref}\n    className={cn(\n      \"px-2 py-1.5 text-sm font-semibold text-foreground\",\n      inset && \"pl-8\",\n      className\n    )}\n    {...props}\n  />\n))\nContextMenuLabel.displayName = ContextMenuPrimitive.Label.displayName\n\nconst ContextMenuSeparator = React.forwardRef<\n  React.ElementRef<typeof ContextMenuPrimitive.Separator>,\n  React.ComponentPropsWithoutRef<typeof ContextMenuPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n  <ContextMenuPrimitive.Separator\n    ref={ref}\n    className={cn(\"-mx-1 my-1 h-px bg-border\", className)}\n    {...props}\n  />\n))\nContextMenuSeparator.displayName = ContextMenuPrimitive.Separator.displayName\n\nconst ContextMenuShortcut = ({\n  className,\n  ...props\n}: React.HTMLAttributes<HTMLSpanElement>) => {\n  return (\n    <span\n      className={cn(\n        \"ml-auto text-xs tracking-widest text-muted-foreground\",\n        className\n      )}\n      {...props}\n    />\n  )\n}\nContextMenuShortcut.displayName = \"ContextMenuShortcut\"\n\nexport {\n  ContextMenu,\n  ContextMenuTrigger,\n  ContextMenuContent,\n  ContextMenuItem,\n  ContextMenuCheckboxItem,\n  ContextMenuRadioItem,\n  ContextMenuLabel,\n  ContextMenuSeparator,\n  ContextMenuShortcut,\n  ContextMenuGroup,\n  ContextMenuPortal,\n  ContextMenuSub,\n  ContextMenuSubContent,\n  ContextMenuSubTrigger,\n  ContextMenuRadioGroup,\n}\n"
  },
  {
    "path": "website/client/src/components/ui/dialog.tsx",
    "content": "\"use client\"\n\nimport * as React from \"react\"\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\"\nimport { X } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Dialog = DialogPrimitive.Root\n\nconst DialogTrigger = DialogPrimitive.Trigger\n\nconst DialogPortal = DialogPrimitive.Portal\n\nconst DialogClose = DialogPrimitive.Close\n\nconst DialogOverlay = React.forwardRef<\n  React.ElementRef<typeof DialogPrimitive.Overlay>,\n  React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n  <DialogPrimitive.Overlay\n    ref={ref}\n    className={cn(\n      \"fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n      className\n    )}\n    {...props}\n  />\n))\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName\n\nconst DialogContent = React.forwardRef<\n  React.ElementRef<typeof DialogPrimitive.Content>,\n  React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>\n>(({ className, children, ...props }, ref) => (\n  <DialogPortal>\n    <DialogOverlay />\n    <DialogPrimitive.Content\n      ref={ref}\n      className={cn(\n        \"fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg\",\n        className\n      )}\n      {...props}\n    >\n      {children}\n      <DialogPrimitive.Close className=\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground\">\n        <X className=\"h-4 w-4\" />\n        <span className=\"sr-only\">Close</span>\n      </DialogPrimitive.Close>\n    </DialogPrimitive.Content>\n  </DialogPortal>\n))\nDialogContent.displayName = DialogPrimitive.Content.displayName\n\nconst DialogHeader = ({\n  className,\n  ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n  <div\n    className={cn(\n      \"flex flex-col space-y-1.5 text-center sm:text-left\",\n      className\n    )}\n    {...props}\n  />\n)\nDialogHeader.displayName = \"DialogHeader\"\n\nconst DialogFooter = ({\n  className,\n  ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n  <div\n    className={cn(\n      \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\n      className\n    )}\n    {...props}\n  />\n)\nDialogFooter.displayName = \"DialogFooter\"\n\nconst DialogTitle = React.forwardRef<\n  React.ElementRef<typeof DialogPrimitive.Title>,\n  React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n  <DialogPrimitive.Title\n    ref={ref}\n    className={cn(\n      \"text-lg font-semibold leading-none tracking-tight\",\n      className\n    )}\n    {...props}\n  />\n))\nDialogTitle.displayName = DialogPrimitive.Title.displayName\n\nconst DialogDescription = React.forwardRef<\n  React.ElementRef<typeof DialogPrimitive.Description>,\n  React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n  <DialogPrimitive.Description\n    ref={ref}\n    className={cn(\"text-sm text-muted-foreground\", className)}\n    {...props}\n  />\n))\nDialogDescription.displayName = DialogPrimitive.Description.displayName\n\nexport {\n  Dialog,\n  DialogPortal,\n  DialogOverlay,\n  DialogClose,\n  DialogTrigger,\n  DialogContent,\n  DialogHeader,\n  DialogFooter,\n  DialogTitle,\n  DialogDescription,\n}\n"
  },
  {
    "path": "website/client/src/components/ui/drawer.tsx",
    "content": "\"use client\"\n\nimport * as React from \"react\"\nimport { Drawer as DrawerPrimitive } from \"vaul\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Drawer = ({\n  shouldScaleBackground = true,\n  ...props\n}: React.ComponentProps<typeof DrawerPrimitive.Root>) => (\n  <DrawerPrimitive.Root\n    shouldScaleBackground={shouldScaleBackground}\n    {...props}\n  />\n)\nDrawer.displayName = \"Drawer\"\n\nconst DrawerTrigger = DrawerPrimitive.Trigger\n\nconst DrawerPortal = DrawerPrimitive.Portal\n\nconst DrawerClose = DrawerPrimitive.Close\n\nconst DrawerOverlay = React.forwardRef<\n  React.ElementRef<typeof DrawerPrimitive.Overlay>,\n  React.ComponentPropsWithoutRef<typeof DrawerPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n  <DrawerPrimitive.Overlay\n    ref={ref}\n    className={cn(\"fixed inset-0 z-50 bg-black/80\", className)}\n    {...props}\n  />\n))\nDrawerOverlay.displayName = DrawerPrimitive.Overlay.displayName\n\nconst DrawerContent = React.forwardRef<\n  React.ElementRef<typeof DrawerPrimitive.Content>,\n  React.ComponentPropsWithoutRef<typeof DrawerPrimitive.Content>\n>(({ className, children, ...props }, ref) => (\n  <DrawerPortal>\n    <DrawerOverlay />\n    <DrawerPrimitive.Content\n      ref={ref}\n      className={cn(\n        \"fixed inset-x-0 bottom-0 z-50 mt-24 flex h-auto flex-col rounded-t-[10px] border bg-background\",\n        className\n      )}\n      {...props}\n    >\n      <div className=\"mx-auto mt-4 h-2 w-[100px] rounded-full bg-muted\" />\n      {children}\n    </DrawerPrimitive.Content>\n  </DrawerPortal>\n))\nDrawerContent.displayName = \"DrawerContent\"\n\nconst DrawerHeader = ({\n  className,\n  ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n  <div\n    className={cn(\"grid gap-1.5 p-4 text-center sm:text-left\", className)}\n    {...props}\n  />\n)\nDrawerHeader.displayName = \"DrawerHeader\"\n\nconst DrawerFooter = ({\n  className,\n  ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n  <div\n    className={cn(\"mt-auto flex flex-col gap-2 p-4\", className)}\n    {...props}\n  />\n)\nDrawerFooter.displayName = \"DrawerFooter\"\n\nconst DrawerTitle = React.forwardRef<\n  React.ElementRef<typeof DrawerPrimitive.Title>,\n  React.ComponentPropsWithoutRef<typeof DrawerPrimitive.Title>\n>(({ className, ...props }, ref) => (\n  <DrawerPrimitive.Title\n    ref={ref}\n    className={cn(\n      \"text-lg font-semibold leading-none tracking-tight\",\n      className\n    )}\n    {...props}\n  />\n))\nDrawerTitle.displayName = DrawerPrimitive.Title.displayName\n\nconst DrawerDescription = React.forwardRef<\n  React.ElementRef<typeof DrawerPrimitive.Description>,\n  React.ComponentPropsWithoutRef<typeof DrawerPrimitive.Description>\n>(({ className, ...props }, ref) => (\n  <DrawerPrimitive.Description\n    ref={ref}\n    className={cn(\"text-sm text-muted-foreground\", className)}\n    {...props}\n  />\n))\nDrawerDescription.displayName = DrawerPrimitive.Description.displayName\n\nexport {\n  Drawer,\n  DrawerPortal,\n  DrawerOverlay,\n  DrawerTrigger,\n  DrawerClose,\n  DrawerContent,\n  DrawerHeader,\n  DrawerFooter,\n  DrawerTitle,\n  DrawerDescription,\n}\n"
  },
  {
    "path": "website/client/src/components/ui/dropdown-menu.tsx",
    "content": "import * as React from \"react\"\nimport * as DropdownMenuPrimitive from \"@radix-ui/react-dropdown-menu\"\nimport { Check, ChevronRight, Circle } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst DropdownMenu = DropdownMenuPrimitive.Root\n\nconst DropdownMenuTrigger = DropdownMenuPrimitive.Trigger\n\nconst DropdownMenuGroup = DropdownMenuPrimitive.Group\n\nconst DropdownMenuPortal = DropdownMenuPrimitive.Portal\n\nconst DropdownMenuSub = DropdownMenuPrimitive.Sub\n\nconst DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup\n\nconst DropdownMenuSubTrigger = React.forwardRef<\n  React.ElementRef<typeof DropdownMenuPrimitive.SubTrigger>,\n  React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubTrigger> & {\n    inset?: boolean\n  }\n>(({ className, inset, children, ...props }, ref) => (\n  <DropdownMenuPrimitive.SubTrigger\n    ref={ref}\n    className={cn(\n      \"flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent data-[state=open]:bg-accent [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n      inset && \"pl-8\",\n      className\n    )}\n    {...props}\n  >\n    {children}\n    <ChevronRight className=\"ml-auto\" />\n  </DropdownMenuPrimitive.SubTrigger>\n))\nDropdownMenuSubTrigger.displayName =\n  DropdownMenuPrimitive.SubTrigger.displayName\n\nconst DropdownMenuSubContent = React.forwardRef<\n  React.ElementRef<typeof DropdownMenuPrimitive.SubContent>,\n  React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent>\n>(({ className, ...props }, ref) => (\n  <DropdownMenuPrimitive.SubContent\n    ref={ref}\n    className={cn(\n      \"z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-dropdown-menu-content-transform-origin]\",\n      className\n    )}\n    {...props}\n  />\n))\nDropdownMenuSubContent.displayName =\n  DropdownMenuPrimitive.SubContent.displayName\n\nconst DropdownMenuContent = React.forwardRef<\n  React.ElementRef<typeof DropdownMenuPrimitive.Content>,\n  React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n  <DropdownMenuPrimitive.Portal>\n    <DropdownMenuPrimitive.Content\n      ref={ref}\n      sideOffset={sideOffset}\n      className={cn(\n        \"z-50 max-h-[var(--radix-dropdown-menu-content-available-height)] min-w-[8rem] overflow-y-auto overflow-x-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-dropdown-menu-content-transform-origin]\",\n        className\n      )}\n      {...props}\n    />\n  </DropdownMenuPrimitive.Portal>\n))\nDropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName\n\nconst DropdownMenuItem = React.forwardRef<\n  React.ElementRef<typeof DropdownMenuPrimitive.Item>,\n  React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Item> & {\n    inset?: boolean\n  }\n>(({ className, inset, ...props }, ref) => (\n  <DropdownMenuPrimitive.Item\n    ref={ref}\n    className={cn(\n      \"relative flex cursor-default select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n      inset && \"pl-8\",\n      className\n    )}\n    {...props}\n  />\n))\nDropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName\n\nconst DropdownMenuCheckboxItem = React.forwardRef<\n  React.ElementRef<typeof DropdownMenuPrimitive.CheckboxItem>,\n  React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.CheckboxItem>\n>(({ className, children, checked, ...props }, ref) => (\n  <DropdownMenuPrimitive.CheckboxItem\n    ref={ref}\n    className={cn(\n      \"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n      className\n    )}\n    checked={checked}\n    {...props}\n  >\n    <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n      <DropdownMenuPrimitive.ItemIndicator>\n        <Check className=\"h-4 w-4\" />\n      </DropdownMenuPrimitive.ItemIndicator>\n    </span>\n    {children}\n  </DropdownMenuPrimitive.CheckboxItem>\n))\nDropdownMenuCheckboxItem.displayName =\n  DropdownMenuPrimitive.CheckboxItem.displayName\n\nconst DropdownMenuRadioItem = React.forwardRef<\n  React.ElementRef<typeof DropdownMenuPrimitive.RadioItem>,\n  React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.RadioItem>\n>(({ className, children, ...props }, ref) => (\n  <DropdownMenuPrimitive.RadioItem\n    ref={ref}\n    className={cn(\n      \"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n      className\n    )}\n    {...props}\n  >\n    <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n      <DropdownMenuPrimitive.ItemIndicator>\n        <Circle className=\"h-2 w-2 fill-current\" />\n      </DropdownMenuPrimitive.ItemIndicator>\n    </span>\n    {children}\n  </DropdownMenuPrimitive.RadioItem>\n))\nDropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName\n\nconst DropdownMenuLabel = React.forwardRef<\n  React.ElementRef<typeof DropdownMenuPrimitive.Label>,\n  React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Label> & {\n    inset?: boolean\n  }\n>(({ className, inset, ...props }, ref) => (\n  <DropdownMenuPrimitive.Label\n    ref={ref}\n    className={cn(\n      \"px-2 py-1.5 text-sm font-semibold\",\n      inset && \"pl-8\",\n      className\n    )}\n    {...props}\n  />\n))\nDropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName\n\nconst DropdownMenuSeparator = React.forwardRef<\n  React.ElementRef<typeof DropdownMenuPrimitive.Separator>,\n  React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n  <DropdownMenuPrimitive.Separator\n    ref={ref}\n    className={cn(\"-mx-1 my-1 h-px bg-muted\", className)}\n    {...props}\n  />\n))\nDropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName\n\nconst DropdownMenuShortcut = ({\n  className,\n  ...props\n}: React.HTMLAttributes<HTMLSpanElement>) => {\n  return (\n    <span\n      className={cn(\"ml-auto text-xs tracking-widest opacity-60\", className)}\n      {...props}\n    />\n  )\n}\nDropdownMenuShortcut.displayName = \"DropdownMenuShortcut\"\n\nexport {\n  DropdownMenu,\n  DropdownMenuTrigger,\n  DropdownMenuContent,\n  DropdownMenuItem,\n  DropdownMenuCheckboxItem,\n  DropdownMenuRadioItem,\n  DropdownMenuLabel,\n  DropdownMenuSeparator,\n  DropdownMenuShortcut,\n  DropdownMenuGroup,\n  DropdownMenuPortal,\n  DropdownMenuSub,\n  DropdownMenuSubContent,\n  DropdownMenuSubTrigger,\n  DropdownMenuRadioGroup,\n}\n"
  },
  {
    "path": "website/client/src/components/ui/form.tsx",
    "content": "\"use client\"\n\nimport * as React from \"react\"\nimport * as LabelPrimitive from \"@radix-ui/react-label\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport {\n  Controller,\n  FormProvider,\n  useFormContext,\n  type ControllerProps,\n  type FieldPath,\n  type FieldValues,\n} from \"react-hook-form\"\n\nimport { cn } from \"@/lib/utils\"\nimport { Label } from \"@/components/ui/label\"\n\nconst Form = FormProvider\n\ntype FormFieldContextValue<\n  TFieldValues extends FieldValues = FieldValues,\n  TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>\n> = {\n  name: TName\n}\n\nconst FormFieldContext = React.createContext<FormFieldContextValue>(\n  {} as FormFieldContextValue\n)\n\nconst FormField = <\n  TFieldValues extends FieldValues = FieldValues,\n  TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>\n>({\n  ...props\n}: ControllerProps<TFieldValues, TName>) => {\n  return (\n    <FormFieldContext.Provider value={{ name: props.name }}>\n      <Controller {...props} />\n    </FormFieldContext.Provider>\n  )\n}\n\nconst useFormField = () => {\n  const fieldContext = React.useContext(FormFieldContext)\n  const itemContext = React.useContext(FormItemContext)\n  const { getFieldState, formState } = useFormContext()\n\n  const fieldState = getFieldState(fieldContext.name, formState)\n\n  if (!fieldContext) {\n    throw new Error(\"useFormField should be used within <FormField>\")\n  }\n\n  const { id } = itemContext\n\n  return {\n    id,\n    name: fieldContext.name,\n    formItemId: `${id}-form-item`,\n    formDescriptionId: `${id}-form-item-description`,\n    formMessageId: `${id}-form-item-message`,\n    ...fieldState,\n  }\n}\n\ntype FormItemContextValue = {\n  id: string\n}\n\nconst FormItemContext = React.createContext<FormItemContextValue>(\n  {} as FormItemContextValue\n)\n\nconst FormItem = React.forwardRef<\n  HTMLDivElement,\n  React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => {\n  const id = React.useId()\n\n  return (\n    <FormItemContext.Provider value={{ id }}>\n      <div ref={ref} className={cn(\"space-y-2\", className)} {...props} />\n    </FormItemContext.Provider>\n  )\n})\nFormItem.displayName = \"FormItem\"\n\nconst FormLabel = React.forwardRef<\n  React.ElementRef<typeof LabelPrimitive.Root>,\n  React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root>\n>(({ className, ...props }, ref) => {\n  const { error, formItemId } = useFormField()\n\n  return (\n    <Label\n      ref={ref}\n      className={cn(error && \"text-destructive\", className)}\n      htmlFor={formItemId}\n      {...props}\n    />\n  )\n})\nFormLabel.displayName = \"FormLabel\"\n\nconst FormControl = React.forwardRef<\n  React.ElementRef<typeof Slot>,\n  React.ComponentPropsWithoutRef<typeof Slot>\n>(({ ...props }, ref) => {\n  const { error, formItemId, formDescriptionId, formMessageId } = useFormField()\n\n  return (\n    <Slot\n      ref={ref}\n      id={formItemId}\n      aria-describedby={\n        !error\n          ? `${formDescriptionId}`\n          : `${formDescriptionId} ${formMessageId}`\n      }\n      aria-invalid={!!error}\n      {...props}\n    />\n  )\n})\nFormControl.displayName = \"FormControl\"\n\nconst FormDescription = React.forwardRef<\n  HTMLParagraphElement,\n  React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => {\n  const { formDescriptionId } = useFormField()\n\n  return (\n    <p\n      ref={ref}\n      id={formDescriptionId}\n      className={cn(\"text-sm text-muted-foreground\", className)}\n      {...props}\n    />\n  )\n})\nFormDescription.displayName = \"FormDescription\"\n\nconst FormMessage = React.forwardRef<\n  HTMLParagraphElement,\n  React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, children, ...props }, ref) => {\n  const { error, formMessageId } = useFormField()\n  const body = error ? String(error?.message ?? \"\") : children\n\n  if (!body) {\n    return null\n  }\n\n  return (\n    <p\n      ref={ref}\n      id={formMessageId}\n      className={cn(\"text-sm font-medium text-destructive\", className)}\n      {...props}\n    >\n      {body}\n    </p>\n  )\n})\nFormMessage.displayName = \"FormMessage\"\n\nexport {\n  useFormField,\n  Form,\n  FormItem,\n  FormLabel,\n  FormControl,\n  FormDescription,\n  FormMessage,\n  FormField,\n}\n"
  },
  {
    "path": "website/client/src/components/ui/hover-card.tsx",
    "content": "\"use client\"\n\nimport * as React from \"react\"\nimport * as HoverCardPrimitive from \"@radix-ui/react-hover-card\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst HoverCard = HoverCardPrimitive.Root\n\nconst HoverCardTrigger = HoverCardPrimitive.Trigger\n\nconst HoverCardContent = React.forwardRef<\n  React.ElementRef<typeof HoverCardPrimitive.Content>,\n  React.ComponentPropsWithoutRef<typeof HoverCardPrimitive.Content>\n>(({ className, align = \"center\", sideOffset = 4, ...props }, ref) => (\n  <HoverCardPrimitive.Content\n    ref={ref}\n    align={align}\n    sideOffset={sideOffset}\n    className={cn(\n      \"z-50 w-64 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-hover-card-content-transform-origin]\",\n      className\n    )}\n    {...props}\n  />\n))\nHoverCardContent.displayName = HoverCardPrimitive.Content.displayName\n\nexport { HoverCard, HoverCardTrigger, HoverCardContent }\n"
  },
  {
    "path": "website/client/src/components/ui/input-otp.tsx",
    "content": "import * as React from \"react\"\nimport { OTPInput, OTPInputContext } from \"input-otp\"\nimport { Dot } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst InputOTP = React.forwardRef<\n  React.ElementRef<typeof OTPInput>,\n  React.ComponentPropsWithoutRef<typeof OTPInput>\n>(({ className, containerClassName, ...props }, ref) => (\n  <OTPInput\n    ref={ref}\n    containerClassName={cn(\n      \"flex items-center gap-2 has-[:disabled]:opacity-50\",\n      containerClassName\n    )}\n    className={cn(\"disabled:cursor-not-allowed\", className)}\n    {...props}\n  />\n))\nInputOTP.displayName = \"InputOTP\"\n\nconst InputOTPGroup = React.forwardRef<\n  React.ElementRef<\"div\">,\n  React.ComponentPropsWithoutRef<\"div\">\n>(({ className, ...props }, ref) => (\n  <div ref={ref} className={cn(\"flex items-center\", className)} {...props} />\n))\nInputOTPGroup.displayName = \"InputOTPGroup\"\n\nconst InputOTPSlot = React.forwardRef<\n  React.ElementRef<\"div\">,\n  React.ComponentPropsWithoutRef<\"div\"> & { index: number }\n>(({ index, className, ...props }, ref) => {\n  const inputOTPContext = React.useContext(OTPInputContext)\n  const { char, hasFakeCaret, isActive } = inputOTPContext.slots[index]\n\n  return (\n    <div\n      ref={ref}\n      className={cn(\n        \"relative flex h-10 w-10 items-center justify-center border-y border-r border-input text-sm transition-all first:rounded-l-md first:border-l last:rounded-r-md\",\n        isActive && \"z-10 ring-2 ring-ring ring-offset-background\",\n        className\n      )}\n      {...props}\n    >\n      {char}\n      {hasFakeCaret && (\n        <div className=\"pointer-events-none absolute inset-0 flex items-center justify-center\">\n          <div className=\"h-4 w-px animate-caret-blink bg-foreground duration-1000\" />\n        </div>\n      )}\n    </div>\n  )\n})\nInputOTPSlot.displayName = \"InputOTPSlot\"\n\nconst InputOTPSeparator = React.forwardRef<\n  React.ElementRef<\"div\">,\n  React.ComponentPropsWithoutRef<\"div\">\n>(({ ...props }, ref) => (\n  <div ref={ref} role=\"separator\" {...props}>\n    <Dot />\n  </div>\n))\nInputOTPSeparator.displayName = \"InputOTPSeparator\"\n\nexport { InputOTP, InputOTPGroup, InputOTPSlot, InputOTPSeparator }\n"
  },
  {
    "path": "website/client/src/components/ui/input.tsx",
    "content": "import * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Input = React.forwardRef<HTMLInputElement, React.ComponentProps<\"input\">>(\n  ({ className, type, ...props }, ref) => {\n    return (\n      <input\n        type={type}\n        className={cn(\n          \"flex h-10 w-full rounded-md border border-input bg-background px-3 py-2 text-base ring-offset-background file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n          className\n        )}\n        ref={ref}\n        {...props}\n      />\n    )\n  }\n)\nInput.displayName = \"Input\"\n\nexport { Input }\n"
  },
  {
    "path": "website/client/src/components/ui/label.tsx",
    "content": "import * as React from \"react\"\nimport * as LabelPrimitive from \"@radix-ui/react-label\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst labelVariants = cva(\n  \"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\"\n)\n\nconst Label = React.forwardRef<\n  React.ElementRef<typeof LabelPrimitive.Root>,\n  React.ComponentPropsWithoutRef<typeof LabelPrimitive.Root> &\n    VariantProps<typeof labelVariants>\n>(({ className, ...props }, ref) => (\n  <LabelPrimitive.Root\n    ref={ref}\n    className={cn(labelVariants(), className)}\n    {...props}\n  />\n))\nLabel.displayName = LabelPrimitive.Root.displayName\n\nexport { Label }\n"
  },
  {
    "path": "website/client/src/components/ui/menubar.tsx",
    "content": "\"use client\"\n\nimport * as React from \"react\"\nimport * as MenubarPrimitive from \"@radix-ui/react-menubar\"\nimport { Check, ChevronRight, Circle } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\n\nfunction MenubarMenu({\n  ...props\n}: React.ComponentProps<typeof MenubarPrimitive.Menu>) {\n  return <MenubarPrimitive.Menu {...props} />\n}\n\nfunction MenubarGroup({\n  ...props\n}: React.ComponentProps<typeof MenubarPrimitive.Group>) {\n  return <MenubarPrimitive.Group {...props} />\n}\n\nfunction MenubarPortal({\n  ...props\n}: React.ComponentProps<typeof MenubarPrimitive.Portal>) {\n  return <MenubarPrimitive.Portal {...props} />\n}\n\nfunction MenubarRadioGroup({\n  ...props\n}: React.ComponentProps<typeof MenubarPrimitive.RadioGroup>) {\n  return <MenubarPrimitive.RadioGroup {...props} />\n}\n\nfunction MenubarSub({\n  ...props\n}: React.ComponentProps<typeof MenubarPrimitive.Sub>) {\n  return <MenubarPrimitive.Sub data-slot=\"menubar-sub\" {...props} />\n}\n\nconst Menubar = React.forwardRef<\n  React.ElementRef<typeof MenubarPrimitive.Root>,\n  React.ComponentPropsWithoutRef<typeof MenubarPrimitive.Root>\n>(({ className, ...props }, ref) => (\n  <MenubarPrimitive.Root\n    ref={ref}\n    className={cn(\n      \"flex h-10 items-center space-x-1 rounded-md border bg-background p-1\",\n      className\n    )}\n    {...props}\n  />\n))\nMenubar.displayName = MenubarPrimitive.Root.displayName\n\nconst MenubarTrigger = React.forwardRef<\n  React.ElementRef<typeof MenubarPrimitive.Trigger>,\n  React.ComponentPropsWithoutRef<typeof MenubarPrimitive.Trigger>\n>(({ className, ...props }, ref) => (\n  <MenubarPrimitive.Trigger\n    ref={ref}\n    className={cn(\n      \"flex cursor-default select-none items-center rounded-sm px-3 py-1.5 text-sm font-medium outline-none focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground\",\n      className\n    )}\n    {...props}\n  />\n))\nMenubarTrigger.displayName = MenubarPrimitive.Trigger.displayName\n\nconst MenubarSubTrigger = React.forwardRef<\n  React.ElementRef<typeof MenubarPrimitive.SubTrigger>,\n  React.ComponentPropsWithoutRef<typeof MenubarPrimitive.SubTrigger> & {\n    inset?: boolean\n  }\n>(({ className, inset, children, ...props }, ref) => (\n  <MenubarPrimitive.SubTrigger\n    ref={ref}\n    className={cn(\n      \"flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[state=open]:bg-accent data-[state=open]:text-accent-foreground\",\n      inset && \"pl-8\",\n      className\n    )}\n    {...props}\n  >\n    {children}\n    <ChevronRight className=\"ml-auto h-4 w-4\" />\n  </MenubarPrimitive.SubTrigger>\n))\nMenubarSubTrigger.displayName = MenubarPrimitive.SubTrigger.displayName\n\nconst MenubarSubContent = React.forwardRef<\n  React.ElementRef<typeof MenubarPrimitive.SubContent>,\n  React.ComponentPropsWithoutRef<typeof MenubarPrimitive.SubContent>\n>(({ className, ...props }, ref) => (\n  <MenubarPrimitive.SubContent\n    ref={ref}\n    className={cn(\n      \"z-50 min-w-[8rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-menubar-content-transform-origin]\",\n      className\n    )}\n    {...props}\n  />\n))\nMenubarSubContent.displayName = MenubarPrimitive.SubContent.displayName\n\nconst MenubarContent = React.forwardRef<\n  React.ElementRef<typeof MenubarPrimitive.Content>,\n  React.ComponentPropsWithoutRef<typeof MenubarPrimitive.Content>\n>(\n  (\n    { className, align = \"start\", alignOffset = -4, sideOffset = 8, ...props },\n    ref\n  ) => (\n    <MenubarPrimitive.Portal>\n      <MenubarPrimitive.Content\n        ref={ref}\n        align={align}\n        alignOffset={alignOffset}\n        sideOffset={sideOffset}\n        className={cn(\n          \"z-50 min-w-[12rem] overflow-hidden rounded-md border bg-popover p-1 text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-menubar-content-transform-origin]\",\n          className\n        )}\n        {...props}\n      />\n    </MenubarPrimitive.Portal>\n  )\n)\nMenubarContent.displayName = MenubarPrimitive.Content.displayName\n\nconst MenubarItem = React.forwardRef<\n  React.ElementRef<typeof MenubarPrimitive.Item>,\n  React.ComponentPropsWithoutRef<typeof MenubarPrimitive.Item> & {\n    inset?: boolean\n  }\n>(({ className, inset, ...props }, ref) => (\n  <MenubarPrimitive.Item\n    ref={ref}\n    className={cn(\n      \"relative flex cursor-default select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n      inset && \"pl-8\",\n      className\n    )}\n    {...props}\n  />\n))\nMenubarItem.displayName = MenubarPrimitive.Item.displayName\n\nconst MenubarCheckboxItem = React.forwardRef<\n  React.ElementRef<typeof MenubarPrimitive.CheckboxItem>,\n  React.ComponentPropsWithoutRef<typeof MenubarPrimitive.CheckboxItem>\n>(({ className, children, checked, ...props }, ref) => (\n  <MenubarPrimitive.CheckboxItem\n    ref={ref}\n    className={cn(\n      \"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n      className\n    )}\n    checked={checked}\n    {...props}\n  >\n    <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n      <MenubarPrimitive.ItemIndicator>\n        <Check className=\"h-4 w-4\" />\n      </MenubarPrimitive.ItemIndicator>\n    </span>\n    {children}\n  </MenubarPrimitive.CheckboxItem>\n))\nMenubarCheckboxItem.displayName = MenubarPrimitive.CheckboxItem.displayName\n\nconst MenubarRadioItem = React.forwardRef<\n  React.ElementRef<typeof MenubarPrimitive.RadioItem>,\n  React.ComponentPropsWithoutRef<typeof MenubarPrimitive.RadioItem>\n>(({ className, children, ...props }, ref) => (\n  <MenubarPrimitive.RadioItem\n    ref={ref}\n    className={cn(\n      \"relative flex cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n      className\n    )}\n    {...props}\n  >\n    <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n      <MenubarPrimitive.ItemIndicator>\n        <Circle className=\"h-2 w-2 fill-current\" />\n      </MenubarPrimitive.ItemIndicator>\n    </span>\n    {children}\n  </MenubarPrimitive.RadioItem>\n))\nMenubarRadioItem.displayName = MenubarPrimitive.RadioItem.displayName\n\nconst MenubarLabel = React.forwardRef<\n  React.ElementRef<typeof MenubarPrimitive.Label>,\n  React.ComponentPropsWithoutRef<typeof MenubarPrimitive.Label> & {\n    inset?: boolean\n  }\n>(({ className, inset, ...props }, ref) => (\n  <MenubarPrimitive.Label\n    ref={ref}\n    className={cn(\n      \"px-2 py-1.5 text-sm font-semibold\",\n      inset && \"pl-8\",\n      className\n    )}\n    {...props}\n  />\n))\nMenubarLabel.displayName = MenubarPrimitive.Label.displayName\n\nconst MenubarSeparator = React.forwardRef<\n  React.ElementRef<typeof MenubarPrimitive.Separator>,\n  React.ComponentPropsWithoutRef<typeof MenubarPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n  <MenubarPrimitive.Separator\n    ref={ref}\n    className={cn(\"-mx-1 my-1 h-px bg-muted\", className)}\n    {...props}\n  />\n))\nMenubarSeparator.displayName = MenubarPrimitive.Separator.displayName\n\nconst MenubarShortcut = ({\n  className,\n  ...props\n}: React.HTMLAttributes<HTMLSpanElement>) => {\n  return (\n    <span\n      className={cn(\n        \"ml-auto text-xs tracking-widest text-muted-foreground\",\n        className\n      )}\n      {...props}\n    />\n  )\n}\nMenubarShortcut.displayname = \"MenubarShortcut\"\n\nexport {\n  Menubar,\n  MenubarMenu,\n  MenubarTrigger,\n  MenubarContent,\n  MenubarItem,\n  MenubarSeparator,\n  MenubarLabel,\n  MenubarCheckboxItem,\n  MenubarRadioGroup,\n  MenubarRadioItem,\n  MenubarPortal,\n  MenubarSubContent,\n  MenubarSubTrigger,\n  MenubarGroup,\n  MenubarSub,\n  MenubarShortcut,\n}\n"
  },
  {
    "path": "website/client/src/components/ui/navigation-menu.tsx",
    "content": "import * as React from \"react\"\nimport * as NavigationMenuPrimitive from \"@radix-ui/react-navigation-menu\"\nimport { cva } from \"class-variance-authority\"\nimport { ChevronDown } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst NavigationMenu = React.forwardRef<\n  React.ElementRef<typeof NavigationMenuPrimitive.Root>,\n  React.ComponentPropsWithoutRef<typeof NavigationMenuPrimitive.Root>\n>(({ className, children, ...props }, ref) => (\n  <NavigationMenuPrimitive.Root\n    ref={ref}\n    className={cn(\n      \"relative z-10 flex max-w-max flex-1 items-center justify-center\",\n      className\n    )}\n    {...props}\n  >\n    {children}\n    <NavigationMenuViewport />\n  </NavigationMenuPrimitive.Root>\n))\nNavigationMenu.displayName = NavigationMenuPrimitive.Root.displayName\n\nconst NavigationMenuList = React.forwardRef<\n  React.ElementRef<typeof NavigationMenuPrimitive.List>,\n  React.ComponentPropsWithoutRef<typeof NavigationMenuPrimitive.List>\n>(({ className, ...props }, ref) => (\n  <NavigationMenuPrimitive.List\n    ref={ref}\n    className={cn(\n      \"group flex flex-1 list-none items-center justify-center space-x-1\",\n      className\n    )}\n    {...props}\n  />\n))\nNavigationMenuList.displayName = NavigationMenuPrimitive.List.displayName\n\nconst NavigationMenuItem = NavigationMenuPrimitive.Item\n\nconst navigationMenuTriggerStyle = cva(\n  \"group inline-flex h-10 w-max items-center justify-center rounded-md bg-background px-4 py-2 text-sm font-medium transition-colors hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground focus:outline-none disabled:pointer-events-none disabled:opacity-50 data-[state=open]:text-accent-foreground data-[state=open]:bg-accent/50 data-[state=open]:hover:bg-accent data-[state=open]:focus:bg-accent\"\n)\n\nconst NavigationMenuTrigger = React.forwardRef<\n  React.ElementRef<typeof NavigationMenuPrimitive.Trigger>,\n  React.ComponentPropsWithoutRef<typeof NavigationMenuPrimitive.Trigger>\n>(({ className, children, ...props }, ref) => (\n  <NavigationMenuPrimitive.Trigger\n    ref={ref}\n    className={cn(navigationMenuTriggerStyle(), \"group\", className)}\n    {...props}\n  >\n    {children}{\" \"}\n    <ChevronDown\n      className=\"relative top-[1px] ml-1 h-3 w-3 transition duration-200 group-data-[state=open]:rotate-180\"\n      aria-hidden=\"true\"\n    />\n  </NavigationMenuPrimitive.Trigger>\n))\nNavigationMenuTrigger.displayName = NavigationMenuPrimitive.Trigger.displayName\n\nconst NavigationMenuContent = React.forwardRef<\n  React.ElementRef<typeof NavigationMenuPrimitive.Content>,\n  React.ComponentPropsWithoutRef<typeof NavigationMenuPrimitive.Content>\n>(({ className, ...props }, ref) => (\n  <NavigationMenuPrimitive.Content\n    ref={ref}\n    className={cn(\n      \"left-0 top-0 w-full data-[motion^=from-]:animate-in data-[motion^=to-]:animate-out data-[motion^=from-]:fade-in data-[motion^=to-]:fade-out data-[motion=from-end]:slide-in-from-right-52 data-[motion=from-start]:slide-in-from-left-52 data-[motion=to-end]:slide-out-to-right-52 data-[motion=to-start]:slide-out-to-left-52 md:absolute md:w-auto \",\n      className\n    )}\n    {...props}\n  />\n))\nNavigationMenuContent.displayName = NavigationMenuPrimitive.Content.displayName\n\nconst NavigationMenuLink = NavigationMenuPrimitive.Link\n\nconst NavigationMenuViewport = React.forwardRef<\n  React.ElementRef<typeof NavigationMenuPrimitive.Viewport>,\n  React.ComponentPropsWithoutRef<typeof NavigationMenuPrimitive.Viewport>\n>(({ className, ...props }, ref) => (\n  <div className={cn(\"absolute left-0 top-full flex justify-center\")}>\n    <NavigationMenuPrimitive.Viewport\n      className={cn(\n        \"origin-top-center relative mt-1.5 h-[var(--radix-navigation-menu-viewport-height)] w-full overflow-hidden rounded-md border bg-popover text-popover-foreground shadow-lg data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-90 md:w-[var(--radix-navigation-menu-viewport-width)]\",\n        className\n      )}\n      ref={ref}\n      {...props}\n    />\n  </div>\n))\nNavigationMenuViewport.displayName =\n  NavigationMenuPrimitive.Viewport.displayName\n\nconst NavigationMenuIndicator = React.forwardRef<\n  React.ElementRef<typeof NavigationMenuPrimitive.Indicator>,\n  React.ComponentPropsWithoutRef<typeof NavigationMenuPrimitive.Indicator>\n>(({ className, ...props }, ref) => (\n  <NavigationMenuPrimitive.Indicator\n    ref={ref}\n    className={cn(\n      \"top-full z-[1] flex h-1.5 items-end justify-center overflow-hidden data-[state=visible]:animate-in data-[state=hidden]:animate-out data-[state=hidden]:fade-out data-[state=visible]:fade-in\",\n      className\n    )}\n    {...props}\n  >\n    <div className=\"relative top-[60%] h-2 w-2 rotate-45 rounded-tl-sm bg-border shadow-md\" />\n  </NavigationMenuPrimitive.Indicator>\n))\nNavigationMenuIndicator.displayName =\n  NavigationMenuPrimitive.Indicator.displayName\n\nexport {\n  navigationMenuTriggerStyle,\n  NavigationMenu,\n  NavigationMenuList,\n  NavigationMenuItem,\n  NavigationMenuContent,\n  NavigationMenuTrigger,\n  NavigationMenuLink,\n  NavigationMenuIndicator,\n  NavigationMenuViewport,\n}\n"
  },
  {
    "path": "website/client/src/components/ui/pagination.tsx",
    "content": "import * as React from \"react\"\nimport { ChevronLeft, ChevronRight, MoreHorizontal } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\nimport { ButtonProps, buttonVariants } from \"@/components/ui/button\"\n\nconst Pagination = ({ className, ...props }: React.ComponentProps<\"nav\">) => (\n  <nav\n    role=\"navigation\"\n    aria-label=\"pagination\"\n    className={cn(\"mx-auto flex w-full justify-center\", className)}\n    {...props}\n  />\n)\nPagination.displayName = \"Pagination\"\n\nconst PaginationContent = React.forwardRef<\n  HTMLUListElement,\n  React.ComponentProps<\"ul\">\n>(({ className, ...props }, ref) => (\n  <ul\n    ref={ref}\n    className={cn(\"flex flex-row items-center gap-1\", className)}\n    {...props}\n  />\n))\nPaginationContent.displayName = \"PaginationContent\"\n\nconst PaginationItem = React.forwardRef<\n  HTMLLIElement,\n  React.ComponentProps<\"li\">\n>(({ className, ...props }, ref) => (\n  <li ref={ref} className={cn(\"\", className)} {...props} />\n))\nPaginationItem.displayName = \"PaginationItem\"\n\ntype PaginationLinkProps = {\n  isActive?: boolean\n} & Pick<ButtonProps, \"size\"> &\n  React.ComponentProps<\"a\">\n\nconst PaginationLink = ({\n  className,\n  isActive,\n  size = \"icon\",\n  ...props\n}: PaginationLinkProps) => (\n  <a\n    aria-current={isActive ? \"page\" : undefined}\n    className={cn(\n      buttonVariants({\n        variant: isActive ? \"outline\" : \"ghost\",\n        size,\n      }),\n      className\n    )}\n    {...props}\n  />\n)\nPaginationLink.displayName = \"PaginationLink\"\n\nconst PaginationPrevious = ({\n  className,\n  ...props\n}: React.ComponentProps<typeof PaginationLink>) => (\n  <PaginationLink\n    aria-label=\"Go to previous page\"\n    size=\"default\"\n    className={cn(\"gap-1 pl-2.5\", className)}\n    {...props}\n  >\n    <ChevronLeft className=\"h-4 w-4\" />\n    <span>Previous</span>\n  </PaginationLink>\n)\nPaginationPrevious.displayName = \"PaginationPrevious\"\n\nconst PaginationNext = ({\n  className,\n  ...props\n}: React.ComponentProps<typeof PaginationLink>) => (\n  <PaginationLink\n    aria-label=\"Go to next page\"\n    size=\"default\"\n    className={cn(\"gap-1 pr-2.5\", className)}\n    {...props}\n  >\n    <span>Next</span>\n    <ChevronRight className=\"h-4 w-4\" />\n  </PaginationLink>\n)\nPaginationNext.displayName = \"PaginationNext\"\n\nconst PaginationEllipsis = ({\n  className,\n  ...props\n}: React.ComponentProps<\"span\">) => (\n  <span\n    aria-hidden\n    className={cn(\"flex h-9 w-9 items-center justify-center\", className)}\n    {...props}\n  >\n    <MoreHorizontal className=\"h-4 w-4\" />\n    <span className=\"sr-only\">More pages</span>\n  </span>\n)\nPaginationEllipsis.displayName = \"PaginationEllipsis\"\n\nexport {\n  Pagination,\n  PaginationContent,\n  PaginationEllipsis,\n  PaginationItem,\n  PaginationLink,\n  PaginationNext,\n  PaginationPrevious,\n}\n"
  },
  {
    "path": "website/client/src/components/ui/popover.tsx",
    "content": "import * as React from \"react\"\nimport * as PopoverPrimitive from \"@radix-ui/react-popover\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Popover = PopoverPrimitive.Root\n\nconst PopoverTrigger = PopoverPrimitive.Trigger\n\nconst PopoverContent = React.forwardRef<\n  React.ElementRef<typeof PopoverPrimitive.Content>,\n  React.ComponentPropsWithoutRef<typeof PopoverPrimitive.Content>\n>(({ className, align = \"center\", sideOffset = 4, ...props }, ref) => (\n  <PopoverPrimitive.Portal>\n    <PopoverPrimitive.Content\n      ref={ref}\n      align={align}\n      sideOffset={sideOffset}\n      className={cn(\n        \"z-50 w-72 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-popover-content-transform-origin]\",\n        className\n      )}\n      {...props}\n    />\n  </PopoverPrimitive.Portal>\n))\nPopoverContent.displayName = PopoverPrimitive.Content.displayName\n\nexport { Popover, PopoverTrigger, PopoverContent }\n"
  },
  {
    "path": "website/client/src/components/ui/progress.tsx",
    "content": "import * as React from \"react\"\nimport * as ProgressPrimitive from \"@radix-ui/react-progress\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Progress = React.forwardRef<\n  React.ElementRef<typeof ProgressPrimitive.Root>,\n  React.ComponentPropsWithoutRef<typeof ProgressPrimitive.Root>\n>(({ className, value, ...props }, ref) => (\n  <ProgressPrimitive.Root\n    ref={ref}\n    className={cn(\n      \"relative h-4 w-full overflow-hidden rounded-full bg-secondary\",\n      className\n    )}\n    {...props}\n  >\n    <ProgressPrimitive.Indicator\n      className=\"h-full w-full flex-1 bg-primary transition-all\"\n      style={{ transform: `translateX(-${100 - (value || 0)}%)` }}\n    />\n  </ProgressPrimitive.Root>\n))\nProgress.displayName = ProgressPrimitive.Root.displayName\n\nexport { Progress }"
  },
  {
    "path": "website/client/src/components/ui/radio-group.tsx",
    "content": "import * as React from \"react\"\nimport * as RadioGroupPrimitive from \"@radix-ui/react-radio-group\"\nimport { Circle } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst RadioGroup = React.forwardRef<\n  React.ElementRef<typeof RadioGroupPrimitive.Root>,\n  React.ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Root>\n>(({ className, ...props }, ref) => {\n  return (\n    <RadioGroupPrimitive.Root\n      className={cn(\"grid gap-2\", className)}\n      {...props}\n      ref={ref}\n    />\n  )\n})\nRadioGroup.displayName = RadioGroupPrimitive.Root.displayName\n\nconst RadioGroupItem = React.forwardRef<\n  React.ElementRef<typeof RadioGroupPrimitive.Item>,\n  React.ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Item>\n>(({ className, ...props }, ref) => {\n  return (\n    <RadioGroupPrimitive.Item\n      ref={ref}\n      className={cn(\n        \"aspect-square h-4 w-4 rounded-full border border-primary text-primary ring-offset-background focus:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50\",\n        className\n      )}\n      {...props}\n    >\n      <RadioGroupPrimitive.Indicator className=\"flex items-center justify-center\">\n        <Circle className=\"h-2.5 w-2.5 fill-current text-current\" />\n      </RadioGroupPrimitive.Indicator>\n    </RadioGroupPrimitive.Item>\n  )\n})\nRadioGroupItem.displayName = RadioGroupPrimitive.Item.displayName\n\nexport { RadioGroup, RadioGroupItem }\n"
  },
  {
    "path": "website/client/src/components/ui/resizable.tsx",
    "content": "\"use client\"\n\nimport { GripVertical } from \"lucide-react\"\nimport * as ResizablePrimitive from \"react-resizable-panels\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst ResizablePanelGroup = ({\n  className,\n  ...props\n}: React.ComponentProps<typeof ResizablePrimitive.PanelGroup>) => (\n  <ResizablePrimitive.PanelGroup\n    className={cn(\n      \"flex h-full w-full data-[panel-group-direction=vertical]:flex-col\",\n      className\n    )}\n    {...props}\n  />\n)\n\nconst ResizablePanel = ResizablePrimitive.Panel\n\nconst ResizableHandle = ({\n  withHandle,\n  className,\n  ...props\n}: React.ComponentProps<typeof ResizablePrimitive.PanelResizeHandle> & {\n  withHandle?: boolean\n}) => (\n  <ResizablePrimitive.PanelResizeHandle\n    className={cn(\n      \"relative flex w-px items-center justify-center bg-border after:absolute after:inset-y-0 after:left-1/2 after:w-1 after:-translate-x-1/2 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring focus-visible:ring-offset-1 data-[panel-group-direction=vertical]:h-px data-[panel-group-direction=vertical]:w-full data-[panel-group-direction=vertical]:after:left-0 data-[panel-group-direction=vertical]:after:h-1 data-[panel-group-direction=vertical]:after:w-full data-[panel-group-direction=vertical]:after:-translate-y-1/2 data-[panel-group-direction=vertical]:after:translate-x-0 [&[data-panel-group-direction=vertical]>div]:rotate-90\",\n      className\n    )}\n    {...props}\n  >\n    {withHandle && (\n      <div className=\"z-10 flex h-4 w-3 items-center justify-center rounded-sm border bg-border\">\n        <GripVertical className=\"h-2.5 w-2.5\" />\n      </div>\n    )}\n  </ResizablePrimitive.PanelResizeHandle>\n)\n\nexport { ResizablePanelGroup, ResizablePanel, ResizableHandle }\n"
  },
  {
    "path": "website/client/src/components/ui/scroll-area.tsx",
    "content": "import * as React from \"react\"\nimport * as ScrollAreaPrimitive from \"@radix-ui/react-scroll-area\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst ScrollArea = React.forwardRef<\n  React.ElementRef<typeof ScrollAreaPrimitive.Root>,\n  React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.Root>\n>(({ className, children, ...props }, ref) => (\n  <ScrollAreaPrimitive.Root\n    ref={ref}\n    className={cn(\"relative overflow-hidden\", className)}\n    {...props}\n  >\n    <ScrollAreaPrimitive.Viewport className=\"h-full w-full rounded-[inherit]\">\n      {children}\n    </ScrollAreaPrimitive.Viewport>\n    <ScrollBar />\n    <ScrollAreaPrimitive.Corner />\n  </ScrollAreaPrimitive.Root>\n))\nScrollArea.displayName = ScrollAreaPrimitive.Root.displayName\n\nconst ScrollBar = React.forwardRef<\n  React.ElementRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>,\n  React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>\n>(({ className, orientation = \"vertical\", ...props }, ref) => (\n  <ScrollAreaPrimitive.ScrollAreaScrollbar\n    ref={ref}\n    orientation={orientation}\n    className={cn(\n      \"flex touch-none select-none transition-colors\",\n      orientation === \"vertical\" &&\n        \"h-full w-2.5 border-l border-l-transparent p-[1px]\",\n      orientation === \"horizontal\" &&\n        \"h-2.5 flex-col border-t border-t-transparent p-[1px]\",\n      className\n    )}\n    {...props}\n  >\n    <ScrollAreaPrimitive.ScrollAreaThumb className=\"relative flex-1 rounded-full bg-border\" />\n  </ScrollAreaPrimitive.ScrollAreaScrollbar>\n))\nScrollBar.displayName = ScrollAreaPrimitive.ScrollAreaScrollbar.displayName\n\nexport { ScrollArea, ScrollBar }\n"
  },
  {
    "path": "website/client/src/components/ui/select.tsx",
    "content": "\"use client\"\n\nimport * as React from \"react\"\nimport * as SelectPrimitive from \"@radix-ui/react-select\"\nimport { Check, ChevronDown, ChevronUp } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Select = SelectPrimitive.Root\n\nconst SelectGroup = SelectPrimitive.Group\n\nconst SelectValue = SelectPrimitive.Value\n\nconst SelectTrigger = React.forwardRef<\n  React.ElementRef<typeof SelectPrimitive.Trigger>,\n  React.ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>\n>(({ className, children, ...props }, ref) => (\n  <SelectPrimitive.Trigger\n    ref={ref}\n    className={cn(\n      \"flex h-10 w-full items-center justify-between rounded-md border border-input bg-background px-3 py-2 text-sm ring-offset-background data-[placeholder]:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 [&>span]:line-clamp-1\",\n      className\n    )}\n    {...props}\n  >\n    {children}\n    <SelectPrimitive.Icon asChild>\n      <ChevronDown className=\"h-4 w-4 opacity-50\" />\n    </SelectPrimitive.Icon>\n  </SelectPrimitive.Trigger>\n))\nSelectTrigger.displayName = SelectPrimitive.Trigger.displayName\n\nconst SelectScrollUpButton = React.forwardRef<\n  React.ElementRef<typeof SelectPrimitive.ScrollUpButton>,\n  React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollUpButton>\n>(({ className, ...props }, ref) => (\n  <SelectPrimitive.ScrollUpButton\n    ref={ref}\n    className={cn(\n      \"flex cursor-default items-center justify-center py-1\",\n      className\n    )}\n    {...props}\n  >\n    <ChevronUp className=\"h-4 w-4\" />\n  </SelectPrimitive.ScrollUpButton>\n))\nSelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName\n\nconst SelectScrollDownButton = React.forwardRef<\n  React.ElementRef<typeof SelectPrimitive.ScrollDownButton>,\n  React.ComponentPropsWithoutRef<typeof SelectPrimitive.ScrollDownButton>\n>(({ className, ...props }, ref) => (\n  <SelectPrimitive.ScrollDownButton\n    ref={ref}\n    className={cn(\n      \"flex cursor-default items-center justify-center py-1\",\n      className\n    )}\n    {...props}\n  >\n    <ChevronDown className=\"h-4 w-4\" />\n  </SelectPrimitive.ScrollDownButton>\n))\nSelectScrollDownButton.displayName =\n  SelectPrimitive.ScrollDownButton.displayName\n\nconst SelectContent = React.forwardRef<\n  React.ElementRef<typeof SelectPrimitive.Content>,\n  React.ComponentPropsWithoutRef<typeof SelectPrimitive.Content>\n>(({ className, children, position = \"popper\", ...props }, ref) => (\n  <SelectPrimitive.Portal>\n    <SelectPrimitive.Content\n      ref={ref}\n      className={cn(\n        \"relative z-50 max-h-[--radix-select-content-available-height] min-w-[8rem] overflow-y-auto overflow-x-hidden rounded-md border bg-popover text-popover-foreground shadow-md data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-select-content-transform-origin]\",\n        position === \"popper\" &&\n          \"data-[side=bottom]:translate-y-1 data-[side=left]:-translate-x-1 data-[side=right]:translate-x-1 data-[side=top]:-translate-y-1\",\n        className\n      )}\n      position={position}\n      {...props}\n    >\n      <SelectScrollUpButton />\n      <SelectPrimitive.Viewport\n        className={cn(\n          \"p-1\",\n          position === \"popper\" &&\n            \"h-[var(--radix-select-trigger-height)] w-full min-w-[var(--radix-select-trigger-width)]\"\n        )}\n      >\n        {children}\n      </SelectPrimitive.Viewport>\n      <SelectScrollDownButton />\n    </SelectPrimitive.Content>\n  </SelectPrimitive.Portal>\n))\nSelectContent.displayName = SelectPrimitive.Content.displayName\n\nconst SelectLabel = React.forwardRef<\n  React.ElementRef<typeof SelectPrimitive.Label>,\n  React.ComponentPropsWithoutRef<typeof SelectPrimitive.Label>\n>(({ className, ...props }, ref) => (\n  <SelectPrimitive.Label\n    ref={ref}\n    className={cn(\"py-1.5 pl-8 pr-2 text-sm font-semibold\", className)}\n    {...props}\n  />\n))\nSelectLabel.displayName = SelectPrimitive.Label.displayName\n\nconst SelectItem = React.forwardRef<\n  React.ElementRef<typeof SelectPrimitive.Item>,\n  React.ComponentPropsWithoutRef<typeof SelectPrimitive.Item>\n>(({ className, children, ...props }, ref) => (\n  <SelectPrimitive.Item\n    ref={ref}\n    className={cn(\n      \"relative flex w-full cursor-default select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50\",\n      className\n    )}\n    {...props}\n  >\n    <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n      <SelectPrimitive.ItemIndicator>\n        <Check className=\"h-4 w-4\" />\n      </SelectPrimitive.ItemIndicator>\n    </span>\n\n    <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n  </SelectPrimitive.Item>\n))\nSelectItem.displayName = SelectPrimitive.Item.displayName\n\nconst SelectSeparator = React.forwardRef<\n  React.ElementRef<typeof SelectPrimitive.Separator>,\n  React.ComponentPropsWithoutRef<typeof SelectPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n  <SelectPrimitive.Separator\n    ref={ref}\n    className={cn(\"-mx-1 my-1 h-px bg-muted\", className)}\n    {...props}\n  />\n))\nSelectSeparator.displayName = SelectPrimitive.Separator.displayName\n\nexport {\n  Select,\n  SelectGroup,\n  SelectValue,\n  SelectTrigger,\n  SelectContent,\n  SelectLabel,\n  SelectItem,\n  SelectSeparator,\n  SelectScrollUpButton,\n  SelectScrollDownButton,\n}\n"
  },
  {
    "path": "website/client/src/components/ui/separator.tsx",
    "content": "import * as React from \"react\"\nimport * as SeparatorPrimitive from \"@radix-ui/react-separator\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Separator = React.forwardRef<\n  React.ElementRef<typeof SeparatorPrimitive.Root>,\n  React.ComponentPropsWithoutRef<typeof SeparatorPrimitive.Root>\n>(\n  (\n    { className, orientation = \"horizontal\", decorative = true, ...props },\n    ref\n  ) => (\n    <SeparatorPrimitive.Root\n      ref={ref}\n      decorative={decorative}\n      orientation={orientation}\n      className={cn(\n        \"shrink-0 bg-border\",\n        orientation === \"horizontal\" ? \"h-[1px] w-full\" : \"h-full w-[1px]\",\n        className\n      )}\n      {...props}\n    />\n  )\n)\nSeparator.displayName = SeparatorPrimitive.Root.displayName\n\nexport { Separator }\n"
  },
  {
    "path": "website/client/src/components/ui/sheet.tsx",
    "content": "\"use client\"\n\nimport * as React from \"react\"\nimport * as SheetPrimitive from \"@radix-ui/react-dialog\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { X } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Sheet = SheetPrimitive.Root\n\nconst SheetTrigger = SheetPrimitive.Trigger\n\nconst SheetClose = SheetPrimitive.Close\n\nconst SheetPortal = SheetPrimitive.Portal\n\nconst SheetOverlay = React.forwardRef<\n  React.ElementRef<typeof SheetPrimitive.Overlay>,\n  React.ComponentPropsWithoutRef<typeof SheetPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n  <SheetPrimitive.Overlay\n    className={cn(\n      \"fixed inset-0 z-50 bg-black/80  data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n      className\n    )}\n    {...props}\n    ref={ref}\n  />\n))\nSheetOverlay.displayName = SheetPrimitive.Overlay.displayName\n\nconst sheetVariants = cva(\n  \"fixed z-50 gap-4 bg-background p-6 shadow-lg transition ease-in-out data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:duration-300 data-[state=open]:duration-500\",\n  {\n    variants: {\n      side: {\n        top: \"inset-x-0 top-0 border-b data-[state=closed]:slide-out-to-top data-[state=open]:slide-in-from-top\",\n        bottom:\n          \"inset-x-0 bottom-0 border-t data-[state=closed]:slide-out-to-bottom data-[state=open]:slide-in-from-bottom\",\n        left: \"inset-y-0 left-0 h-full w-3/4 border-r data-[state=closed]:slide-out-to-left data-[state=open]:slide-in-from-left sm:max-w-sm\",\n        right:\n          \"inset-y-0 right-0 h-full w-3/4  border-l data-[state=closed]:slide-out-to-right data-[state=open]:slide-in-from-right sm:max-w-sm\",\n      },\n    },\n    defaultVariants: {\n      side: \"right\",\n    },\n  }\n)\n\ninterface SheetContentProps\n  extends React.ComponentPropsWithoutRef<typeof SheetPrimitive.Content>,\n    VariantProps<typeof sheetVariants> {}\n\nconst SheetContent = React.forwardRef<\n  React.ElementRef<typeof SheetPrimitive.Content>,\n  SheetContentProps\n>(({ side = \"right\", className, children, ...props }, ref) => (\n  <SheetPortal>\n    <SheetOverlay />\n    <SheetPrimitive.Content\n      ref={ref}\n      className={cn(sheetVariants({ side }), className)}\n      {...props}\n    >\n      {children}\n      <SheetPrimitive.Close className=\"absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-secondary\">\n        <X className=\"h-4 w-4\" />\n        <span className=\"sr-only\">Close</span>\n      </SheetPrimitive.Close>\n    </SheetPrimitive.Content>\n  </SheetPortal>\n))\nSheetContent.displayName = SheetPrimitive.Content.displayName\n\nconst SheetHeader = ({\n  className,\n  ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n  <div\n    className={cn(\n      \"flex flex-col space-y-2 text-center sm:text-left\",\n      className\n    )}\n    {...props}\n  />\n)\nSheetHeader.displayName = \"SheetHeader\"\n\nconst SheetFooter = ({\n  className,\n  ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n  <div\n    className={cn(\n      \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\n      className\n    )}\n    {...props}\n  />\n)\nSheetFooter.displayName = \"SheetFooter\"\n\nconst SheetTitle = React.forwardRef<\n  React.ElementRef<typeof SheetPrimitive.Title>,\n  React.ComponentPropsWithoutRef<typeof SheetPrimitive.Title>\n>(({ className, ...props }, ref) => (\n  <SheetPrimitive.Title\n    ref={ref}\n    className={cn(\"text-lg font-semibold text-foreground\", className)}\n    {...props}\n  />\n))\nSheetTitle.displayName = SheetPrimitive.Title.displayName\n\nconst SheetDescription = React.forwardRef<\n  React.ElementRef<typeof SheetPrimitive.Description>,\n  React.ComponentPropsWithoutRef<typeof SheetPrimitive.Description>\n>(({ className, ...props }, ref) => (\n  <SheetPrimitive.Description\n    ref={ref}\n    className={cn(\"text-sm text-muted-foreground\", className)}\n    {...props}\n  />\n))\nSheetDescription.displayName = SheetPrimitive.Description.displayName\n\nexport {\n  Sheet,\n  SheetPortal,\n  SheetOverlay,\n  SheetTrigger,\n  SheetClose,\n  SheetContent,\n  SheetHeader,\n  SheetFooter,\n  SheetTitle,\n  SheetDescription,\n}\n"
  },
  {
    "path": "website/client/src/components/ui/sidebar.tsx",
    "content": "import * as React from \"react\"\nimport { Slot } from \"@radix-ui/react-slot\"\nimport { VariantProps, cva } from \"class-variance-authority\"\nimport { PanelLeft } from \"lucide-react\"\n\nimport { useIsMobile } from \"@/hooks/use-mobile\"\nimport { cn } from \"@/lib/utils\"\nimport { Button } from \"@/components/ui/button\"\nimport { Input } from \"@/components/ui/input\"\nimport { Separator } from \"@/components/ui/separator\"\nimport {\n  Sheet,\n  SheetContent,\n  SheetDescription,\n  SheetHeader,\n  SheetTitle,\n} from \"@/components/ui/sheet\"\nimport { Skeleton } from \"@/components/ui/skeleton\"\nimport {\n  Tooltip,\n  TooltipContent,\n  TooltipProvider,\n  TooltipTrigger,\n} from \"@/components/ui/tooltip\"\n\nconst SIDEBAR_COOKIE_NAME = \"sidebar_state\"\nconst SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7\nconst SIDEBAR_WIDTH = \"16rem\"\nconst SIDEBAR_WIDTH_MOBILE = \"18rem\"\nconst SIDEBAR_WIDTH_ICON = \"3rem\"\nconst SIDEBAR_KEYBOARD_SHORTCUT = \"b\"\n\ntype SidebarContextProps = {\n  state: \"expanded\" | \"collapsed\"\n  open: boolean\n  setOpen: (open: boolean) => void\n  openMobile: boolean\n  setOpenMobile: (open: boolean) => void\n  isMobile: boolean\n  toggleSidebar: () => void\n}\n\nconst SidebarContext = React.createContext<SidebarContextProps | null>(null)\n\nfunction useSidebar() {\n  const context = React.useContext(SidebarContext)\n  if (!context) {\n    throw new Error(\"useSidebar must be used within a SidebarProvider.\")\n  }\n\n  return context\n}\n\nconst SidebarProvider = React.forwardRef<\n  HTMLDivElement,\n  React.ComponentProps<\"div\"> & {\n    defaultOpen?: boolean\n    open?: boolean\n    onOpenChange?: (open: boolean) => void\n  }\n>(\n  (\n    {\n      defaultOpen = true,\n      open: openProp,\n      onOpenChange: setOpenProp,\n      className,\n      style,\n      children,\n      ...props\n    },\n    ref\n  ) => {\n    const isMobile = useIsMobile()\n    const [openMobile, setOpenMobile] = React.useState(false)\n\n    // This is the internal state of the sidebar.\n    // We use openProp and setOpenProp for control from outside the component.\n    const [_open, _setOpen] = React.useState(defaultOpen)\n    const open = openProp ?? _open\n    const setOpen = React.useCallback(\n      (value: boolean | ((value: boolean) => boolean)) => {\n        const openState = typeof value === \"function\" ? value(open) : value\n        if (setOpenProp) {\n          setOpenProp(openState)\n        } else {\n          _setOpen(openState)\n        }\n\n        // This sets the cookie to keep the sidebar state.\n        document.cookie = `${SIDEBAR_COOKIE_NAME}=${openState}; path=/; max-age=${SIDEBAR_COOKIE_MAX_AGE}`\n      },\n      [setOpenProp, open]\n    )\n\n    // Helper to toggle the sidebar.\n    const toggleSidebar = React.useCallback(() => {\n      return isMobile\n        ? setOpenMobile((open) => !open)\n        : setOpen((open) => !open)\n    }, [isMobile, setOpen, setOpenMobile])\n\n    // Adds a keyboard shortcut to toggle the sidebar.\n    React.useEffect(() => {\n      const handleKeyDown = (event: KeyboardEvent) => {\n        if (\n          event.key === SIDEBAR_KEYBOARD_SHORTCUT &&\n          (event.metaKey || event.ctrlKey)\n        ) {\n          event.preventDefault()\n          toggleSidebar()\n        }\n      }\n\n      window.addEventListener(\"keydown\", handleKeyDown)\n      return () => window.removeEventListener(\"keydown\", handleKeyDown)\n    }, [toggleSidebar])\n\n    // We add a state so that we can do data-state=\"expanded\" or \"collapsed\".\n    // This makes it easier to style the sidebar with Tailwind classes.\n    const state = open ? \"expanded\" : \"collapsed\"\n\n    const contextValue = React.useMemo<SidebarContextProps>(\n      () => ({\n        state,\n        open,\n        setOpen,\n        isMobile,\n        openMobile,\n        setOpenMobile,\n        toggleSidebar,\n      }),\n      [state, open, setOpen, isMobile, openMobile, setOpenMobile, toggleSidebar]\n    )\n\n    return (\n      <SidebarContext.Provider value={contextValue}>\n        <TooltipProvider delayDuration={0}>\n          <div\n            style={\n              {\n                \"--sidebar-width\": SIDEBAR_WIDTH,\n                \"--sidebar-width-icon\": SIDEBAR_WIDTH_ICON,\n                ...style,\n              } as React.CSSProperties\n            }\n            className={cn(\n              \"group/sidebar-wrapper flex min-h-svh w-full has-[[data-variant=inset]]:bg-sidebar\",\n              className\n            )}\n            ref={ref}\n            {...props}\n          >\n            {children}\n          </div>\n        </TooltipProvider>\n      </SidebarContext.Provider>\n    )\n  }\n)\nSidebarProvider.displayName = \"SidebarProvider\"\n\nconst Sidebar = React.forwardRef<\n  HTMLDivElement,\n  React.ComponentProps<\"div\"> & {\n    side?: \"left\" | \"right\"\n    variant?: \"sidebar\" | \"floating\" | \"inset\"\n    collapsible?: \"offcanvas\" | \"icon\" | \"none\"\n  }\n>(\n  (\n    {\n      side = \"left\",\n      variant = \"sidebar\",\n      collapsible = \"offcanvas\",\n      className,\n      children,\n      ...props\n    },\n    ref\n  ) => {\n    const { isMobile, state, openMobile, setOpenMobile } = useSidebar()\n\n    if (collapsible === \"none\") {\n      return (\n        <div\n          className={cn(\n            \"flex h-full w-[--sidebar-width] flex-col bg-sidebar text-sidebar-foreground\",\n            className\n          )}\n          ref={ref}\n          {...props}\n        >\n          {children}\n        </div>\n      )\n    }\n\n    if (isMobile) {\n      return (\n        <Sheet open={openMobile} onOpenChange={setOpenMobile} {...props}>\n          <SheetContent\n            data-sidebar=\"sidebar\"\n            data-mobile=\"true\"\n            className=\"w-[--sidebar-width] bg-sidebar p-0 text-sidebar-foreground [&>button]:hidden\"\n            style={\n              {\n                \"--sidebar-width\": SIDEBAR_WIDTH_MOBILE,\n              } as React.CSSProperties\n            }\n            side={side}\n          >\n            <SheetHeader className=\"sr-only\">\n              <SheetTitle>Sidebar</SheetTitle>\n              <SheetDescription>Displays the mobile sidebar.</SheetDescription>\n            </SheetHeader>\n            <div className=\"flex h-full w-full flex-col\">{children}</div>\n          </SheetContent>\n        </Sheet>\n      )\n    }\n\n    return (\n      <div\n        ref={ref}\n        className=\"group peer hidden text-sidebar-foreground md:block\"\n        data-state={state}\n        data-collapsible={state === \"collapsed\" ? collapsible : \"\"}\n        data-variant={variant}\n        data-side={side}\n      >\n        {/* This is what handles the sidebar gap on desktop */}\n        <div\n          className={cn(\n            \"relative w-[--sidebar-width] bg-transparent transition-[width] duration-200 ease-linear\",\n            \"group-data-[collapsible=offcanvas]:w-0\",\n            \"group-data-[side=right]:rotate-180\",\n            variant === \"floating\" || variant === \"inset\"\n              ? \"group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)_+_theme(spacing.4))]\"\n              : \"group-data-[collapsible=icon]:w-[--sidebar-width-icon]\"\n          )}\n        />\n        <div\n          className={cn(\n            \"fixed inset-y-0 z-10 hidden h-svh w-[--sidebar-width] transition-[left,right,width] duration-200 ease-linear md:flex\",\n            side === \"left\"\n              ? \"left-0 group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]\"\n              : \"right-0 group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]\",\n            // Adjust the padding for floating and inset variants.\n            variant === \"floating\" || variant === \"inset\"\n              ? \"p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)_+_theme(spacing.4)_+2px)]\"\n              : \"group-data-[collapsible=icon]:w-[--sidebar-width-icon] group-data-[side=left]:border-r group-data-[side=right]:border-l\",\n            className\n          )}\n          {...props}\n        >\n          <div\n            data-sidebar=\"sidebar\"\n            className=\"flex h-full w-full flex-col bg-sidebar group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:border group-data-[variant=floating]:border-sidebar-border group-data-[variant=floating]:shadow\"\n          >\n            {children}\n          </div>\n        </div>\n      </div>\n    )\n  }\n)\nSidebar.displayName = \"Sidebar\"\n\nconst SidebarTrigger = React.forwardRef<\n  React.ElementRef<typeof Button>,\n  React.ComponentProps<typeof Button>\n>(({ className, onClick, ...props }, ref) => {\n  const { toggleSidebar } = useSidebar()\n\n  return (\n    <Button\n      ref={ref}\n      data-sidebar=\"trigger\"\n      variant=\"ghost\"\n      size=\"icon\"\n      className={cn(\"h-7 w-7\", className)}\n      onClick={(event) => {\n        onClick?.(event)\n        toggleSidebar()\n      }}\n      {...props}\n    >\n      <PanelLeft />\n      <span className=\"sr-only\">Toggle Sidebar</span>\n    </Button>\n  )\n})\nSidebarTrigger.displayName = \"SidebarTrigger\"\n\nconst SidebarRail = React.forwardRef<\n  HTMLButtonElement,\n  React.ComponentProps<\"button\">\n>(({ className, ...props }, ref) => {\n  const { toggleSidebar } = useSidebar()\n\n  return (\n    <button\n      ref={ref}\n      data-sidebar=\"rail\"\n      aria-label=\"Toggle Sidebar\"\n      tabIndex={-1}\n      onClick={toggleSidebar}\n      title=\"Toggle Sidebar\"\n      className={cn(\n        \"absolute inset-y-0 z-20 hidden w-4 -translate-x-1/2 transition-all ease-linear after:absolute after:inset-y-0 after:left-1/2 after:w-[2px] hover:after:bg-sidebar-border group-data-[side=left]:-right-4 group-data-[side=right]:left-0 sm:flex\",\n        \"[[data-side=left]_&]:cursor-w-resize [[data-side=right]_&]:cursor-e-resize\",\n        \"[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize\",\n        \"group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full group-data-[collapsible=offcanvas]:hover:bg-sidebar\",\n        \"[[data-side=left][data-collapsible=offcanvas]_&]:-right-2\",\n        \"[[data-side=right][data-collapsible=offcanvas]_&]:-left-2\",\n        className\n      )}\n      {...props}\n    />\n  )\n})\nSidebarRail.displayName = \"SidebarRail\"\n\nconst SidebarInset = React.forwardRef<\n  HTMLDivElement,\n  React.ComponentProps<\"main\">\n>(({ className, ...props }, ref) => {\n  return (\n    <main\n      ref={ref}\n      className={cn(\n        \"relative flex w-full flex-1 flex-col bg-background\",\n        \"md:peer-data-[variant=inset]:m-2 md:peer-data-[state=collapsed]:peer-data-[variant=inset]:ml-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow\",\n        className\n      )}\n      {...props}\n    />\n  )\n})\nSidebarInset.displayName = \"SidebarInset\"\n\nconst SidebarInput = React.forwardRef<\n  React.ElementRef<typeof Input>,\n  React.ComponentProps<typeof Input>\n>(({ className, ...props }, ref) => {\n  return (\n    <Input\n      ref={ref}\n      data-sidebar=\"input\"\n      className={cn(\n        \"h-8 w-full bg-background shadow-none focus-visible:ring-2 focus-visible:ring-sidebar-ring\",\n        className\n      )}\n      {...props}\n    />\n  )\n})\nSidebarInput.displayName = \"SidebarInput\"\n\nconst SidebarHeader = React.forwardRef<\n  HTMLDivElement,\n  React.ComponentProps<\"div\">\n>(({ className, ...props }, ref) => {\n  return (\n    <div\n      ref={ref}\n      data-sidebar=\"header\"\n      className={cn(\"flex flex-col gap-2 p-2\", className)}\n      {...props}\n    />\n  )\n})\nSidebarHeader.displayName = \"SidebarHeader\"\n\nconst SidebarFooter = React.forwardRef<\n  HTMLDivElement,\n  React.ComponentProps<\"div\">\n>(({ className, ...props }, ref) => {\n  return (\n    <div\n      ref={ref}\n      data-sidebar=\"footer\"\n      className={cn(\"flex flex-col gap-2 p-2\", className)}\n      {...props}\n    />\n  )\n})\nSidebarFooter.displayName = \"SidebarFooter\"\n\nconst SidebarSeparator = React.forwardRef<\n  React.ElementRef<typeof Separator>,\n  React.ComponentProps<typeof Separator>\n>(({ className, ...props }, ref) => {\n  return (\n    <Separator\n      ref={ref}\n      data-sidebar=\"separator\"\n      className={cn(\"mx-2 w-auto bg-sidebar-border\", className)}\n      {...props}\n    />\n  )\n})\nSidebarSeparator.displayName = \"SidebarSeparator\"\n\nconst SidebarContent = React.forwardRef<\n  HTMLDivElement,\n  React.ComponentProps<\"div\">\n>(({ className, ...props }, ref) => {\n  return (\n    <div\n      ref={ref}\n      data-sidebar=\"content\"\n      className={cn(\n        \"flex min-h-0 flex-1 flex-col gap-2 overflow-auto group-data-[collapsible=icon]:overflow-hidden\",\n        className\n      )}\n      {...props}\n    />\n  )\n})\nSidebarContent.displayName = \"SidebarContent\"\n\nconst SidebarGroup = React.forwardRef<\n  HTMLDivElement,\n  React.ComponentProps<\"div\">\n>(({ className, ...props }, ref) => {\n  return (\n    <div\n      ref={ref}\n      data-sidebar=\"group\"\n      className={cn(\"relative flex w-full min-w-0 flex-col p-2\", className)}\n      {...props}\n    />\n  )\n})\nSidebarGroup.displayName = \"SidebarGroup\"\n\nconst SidebarGroupLabel = React.forwardRef<\n  HTMLDivElement,\n  React.ComponentProps<\"div\"> & { asChild?: boolean }\n>(({ className, asChild = false, ...props }, ref) => {\n  const Comp = asChild ? Slot : \"div\"\n\n  return (\n    <Comp\n      ref={ref}\n      data-sidebar=\"group-label\"\n      className={cn(\n        \"flex h-8 shrink-0 items-center rounded-md px-2 text-xs font-medium text-sidebar-foreground/70 outline-none ring-sidebar-ring transition-[margin,opacity] duration-200 ease-linear focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0\",\n        \"group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0\",\n        className\n      )}\n      {...props}\n    />\n  )\n})\nSidebarGroupLabel.displayName = \"SidebarGroupLabel\"\n\nconst SidebarGroupAction = React.forwardRef<\n  HTMLButtonElement,\n  React.ComponentProps<\"button\"> & { asChild?: boolean }\n>(({ className, asChild = false, ...props }, ref) => {\n  const Comp = asChild ? Slot : \"button\"\n\n  return (\n    <Comp\n      ref={ref}\n      data-sidebar=\"group-action\"\n      className={cn(\n        \"absolute right-3 top-3.5 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground outline-none ring-sidebar-ring transition-transform hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0\",\n        // Increases the hit area of the button on mobile.\n        \"after:absolute after:-inset-2 after:md:hidden\",\n        \"group-data-[collapsible=icon]:hidden\",\n        className\n      )}\n      {...props}\n    />\n  )\n})\nSidebarGroupAction.displayName = \"SidebarGroupAction\"\n\nconst SidebarGroupContent = React.forwardRef<\n  HTMLDivElement,\n  React.ComponentProps<\"div\">\n>(({ className, ...props }, ref) => (\n  <div\n    ref={ref}\n    data-sidebar=\"group-content\"\n    className={cn(\"w-full text-sm\", className)}\n    {...props}\n  />\n))\nSidebarGroupContent.displayName = \"SidebarGroupContent\"\n\nconst SidebarMenu = React.forwardRef<\n  HTMLUListElement,\n  React.ComponentProps<\"ul\">\n>(({ className, ...props }, ref) => (\n  <ul\n    ref={ref}\n    data-sidebar=\"menu\"\n    className={cn(\"flex w-full min-w-0 flex-col gap-1\", className)}\n    {...props}\n  />\n))\nSidebarMenu.displayName = \"SidebarMenu\"\n\nconst SidebarMenuItem = React.forwardRef<\n  HTMLLIElement,\n  React.ComponentProps<\"li\">\n>(({ className, ...props }, ref) => (\n  <li\n    ref={ref}\n    data-sidebar=\"menu-item\"\n    className={cn(\"group/menu-item relative\", className)}\n    {...props}\n  />\n))\nSidebarMenuItem.displayName = \"SidebarMenuItem\"\n\nconst sidebarMenuButtonVariants = cva(\n  \"peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm outline-none ring-sidebar-ring transition-[width,height,padding] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 group-has-[[data-sidebar=menu-action]]/menu-item:pr-8 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[active=true]:bg-sidebar-accent data-[active=true]:font-medium data-[active=true]:text-sidebar-accent-foreground data-[state=open]:hover:bg-sidebar-accent data-[state=open]:hover:text-sidebar-accent-foreground group-data-[collapsible=icon]:!size-8 group-data-[collapsible=icon]:!p-2 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0\",\n  {\n    variants: {\n      variant: {\n        default: \"hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\",\n        outline:\n          \"bg-background shadow-[0_0_0_1px_hsl(var(--sidebar-border))] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_hsl(var(--sidebar-accent))]\",\n      },\n      size: {\n        default: \"h-8 text-sm\",\n        sm: \"h-7 text-xs\",\n        lg: \"h-12 text-sm group-data-[collapsible=icon]:!p-0\",\n      },\n    },\n    defaultVariants: {\n      variant: \"default\",\n      size: \"default\",\n    },\n  }\n)\n\nconst SidebarMenuButton = React.forwardRef<\n  HTMLButtonElement,\n  React.ComponentProps<\"button\"> & {\n    asChild?: boolean\n    isActive?: boolean\n    tooltip?: string | React.ComponentProps<typeof TooltipContent>\n  } & VariantProps<typeof sidebarMenuButtonVariants>\n>(\n  (\n    {\n      asChild = false,\n      isActive = false,\n      variant = \"default\",\n      size = \"default\",\n      tooltip,\n      className,\n      ...props\n    },\n    ref\n  ) => {\n    const Comp = asChild ? Slot : \"button\"\n    const { isMobile, state } = useSidebar()\n\n    const button = (\n      <Comp\n        ref={ref}\n        data-sidebar=\"menu-button\"\n        data-size={size}\n        data-active={isActive}\n        className={cn(sidebarMenuButtonVariants({ variant, size }), className)}\n        {...props}\n      />\n    )\n\n    if (!tooltip) {\n      return button\n    }\n\n    if (typeof tooltip === \"string\") {\n      tooltip = {\n        children: tooltip,\n      }\n    }\n\n    return (\n      <Tooltip>\n        <TooltipTrigger asChild>{button}</TooltipTrigger>\n        <TooltipContent\n          side=\"right\"\n          align=\"center\"\n          hidden={state !== \"collapsed\" || isMobile}\n          {...tooltip}\n        />\n      </Tooltip>\n    )\n  }\n)\nSidebarMenuButton.displayName = \"SidebarMenuButton\"\n\nconst SidebarMenuAction = React.forwardRef<\n  HTMLButtonElement,\n  React.ComponentProps<\"button\"> & {\n    asChild?: boolean\n    showOnHover?: boolean\n  }\n>(({ className, asChild = false, showOnHover = false, ...props }, ref) => {\n  const Comp = asChild ? Slot : \"button\"\n\n  return (\n    <Comp\n      ref={ref}\n      data-sidebar=\"menu-action\"\n      className={cn(\n        \"absolute right-1 top-1.5 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground outline-none ring-sidebar-ring transition-transform hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 peer-hover/menu-button:text-sidebar-accent-foreground [&>svg]:size-4 [&>svg]:shrink-0\",\n        // Increases the hit area of the button on mobile.\n        \"after:absolute after:-inset-2 after:md:hidden\",\n        \"peer-data-[size=sm]/menu-button:top-1\",\n        \"peer-data-[size=default]/menu-button:top-1.5\",\n        \"peer-data-[size=lg]/menu-button:top-2.5\",\n        \"group-data-[collapsible=icon]:hidden\",\n        showOnHover &&\n          \"group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 data-[state=open]:opacity-100 peer-data-[active=true]/menu-button:text-sidebar-accent-foreground md:opacity-0\",\n        className\n      )}\n      {...props}\n    />\n  )\n})\nSidebarMenuAction.displayName = \"SidebarMenuAction\"\n\nconst SidebarMenuBadge = React.forwardRef<\n  HTMLDivElement,\n  React.ComponentProps<\"div\">\n>(({ className, ...props }, ref) => (\n  <div\n    ref={ref}\n    data-sidebar=\"menu-badge\"\n    className={cn(\n      \"pointer-events-none absolute right-1 flex h-5 min-w-5 select-none items-center justify-center rounded-md px-1 text-xs font-medium tabular-nums text-sidebar-foreground\",\n      \"peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[active=true]/menu-button:text-sidebar-accent-foreground\",\n      \"peer-data-[size=sm]/menu-button:top-1\",\n      \"peer-data-[size=default]/menu-button:top-1.5\",\n      \"peer-data-[size=lg]/menu-button:top-2.5\",\n      \"group-data-[collapsible=icon]:hidden\",\n      className\n    )}\n    {...props}\n  />\n))\nSidebarMenuBadge.displayName = \"SidebarMenuBadge\"\n\nconst SidebarMenuSkeleton = React.forwardRef<\n  HTMLDivElement,\n  React.ComponentProps<\"div\"> & {\n    showIcon?: boolean\n  }\n>(({ className, showIcon = false, ...props }, ref) => {\n  // Random width between 50 to 90%.\n  const width = React.useMemo(() => {\n    return `${Math.floor(Math.random() * 40) + 50}%`\n  }, [])\n\n  return (\n    <div\n      ref={ref}\n      data-sidebar=\"menu-skeleton\"\n      className={cn(\"flex h-8 items-center gap-2 rounded-md px-2\", className)}\n      {...props}\n    >\n      {showIcon && (\n        <Skeleton\n          className=\"size-4 rounded-md\"\n          data-sidebar=\"menu-skeleton-icon\"\n        />\n      )}\n      <Skeleton\n        className=\"h-4 max-w-[--skeleton-width] flex-1\"\n        data-sidebar=\"menu-skeleton-text\"\n        style={\n          {\n            \"--skeleton-width\": width,\n          } as React.CSSProperties\n        }\n      />\n    </div>\n  )\n})\nSidebarMenuSkeleton.displayName = \"SidebarMenuSkeleton\"\n\nconst SidebarMenuSub = React.forwardRef<\n  HTMLUListElement,\n  React.ComponentProps<\"ul\">\n>(({ className, ...props }, ref) => (\n  <ul\n    ref={ref}\n    data-sidebar=\"menu-sub\"\n    className={cn(\n      \"mx-3.5 flex min-w-0 translate-x-px flex-col gap-1 border-l border-sidebar-border px-2.5 py-0.5\",\n      \"group-data-[collapsible=icon]:hidden\",\n      className\n    )}\n    {...props}\n  />\n))\nSidebarMenuSub.displayName = \"SidebarMenuSub\"\n\nconst SidebarMenuSubItem = React.forwardRef<\n  HTMLLIElement,\n  React.ComponentProps<\"li\">\n>(({ ...props }, ref) => <li ref={ref} {...props} />)\nSidebarMenuSubItem.displayName = \"SidebarMenuSubItem\"\n\nconst SidebarMenuSubButton = React.forwardRef<\n  HTMLAnchorElement,\n  React.ComponentProps<\"a\"> & {\n    asChild?: boolean\n    size?: \"sm\" | \"md\"\n    isActive?: boolean\n  }\n>(({ asChild = false, size = \"md\", isActive, className, ...props }, ref) => {\n  const Comp = asChild ? Slot : \"a\"\n\n  return (\n    <Comp\n      ref={ref}\n      data-sidebar=\"menu-sub-button\"\n      data-size={size}\n      data-active={isActive}\n      className={cn(\n        \"flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md px-2 text-sidebar-foreground outline-none ring-sidebar-ring hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0 [&>svg]:text-sidebar-accent-foreground\",\n        \"data-[active=true]:bg-sidebar-accent data-[active=true]:text-sidebar-accent-foreground\",\n        size === \"sm\" && \"text-xs\",\n        size === \"md\" && \"text-sm\",\n        \"group-data-[collapsible=icon]:hidden\",\n        className\n      )}\n      {...props}\n    />\n  )\n})\nSidebarMenuSubButton.displayName = \"SidebarMenuSubButton\"\n\nexport {\n  Sidebar,\n  SidebarContent,\n  SidebarFooter,\n  SidebarGroup,\n  SidebarGroupAction,\n  SidebarGroupContent,\n  SidebarGroupLabel,\n  SidebarHeader,\n  SidebarInput,\n  SidebarInset,\n  SidebarMenu,\n  SidebarMenuAction,\n  SidebarMenuBadge,\n  SidebarMenuButton,\n  SidebarMenuItem,\n  SidebarMenuSkeleton,\n  SidebarMenuSub,\n  SidebarMenuSubButton,\n  SidebarMenuSubItem,\n  SidebarProvider,\n  SidebarRail,\n  SidebarSeparator,\n  SidebarTrigger,\n  useSidebar,\n}\n"
  },
  {
    "path": "website/client/src/components/ui/skeleton.tsx",
    "content": "import { cn } from \"@/lib/utils\"\n\nfunction Skeleton({\n  className,\n  ...props\n}: React.HTMLAttributes<HTMLDivElement>) {\n  return (\n    <div\n      className={cn(\"animate-pulse rounded-md bg-muted\", className)}\n      {...props}\n    />\n  )\n}\n\nexport { Skeleton }\n"
  },
  {
    "path": "website/client/src/components/ui/slider.tsx",
    "content": "import * as React from \"react\"\nimport * as SliderPrimitive from \"@radix-ui/react-slider\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Slider = React.forwardRef<\n  React.ElementRef<typeof SliderPrimitive.Root>,\n  React.ComponentPropsWithoutRef<typeof SliderPrimitive.Root>\n>(({ className, ...props }, ref) => (\n  <SliderPrimitive.Root\n    ref={ref}\n    className={cn(\n      \"relative flex w-full touch-none select-none items-center\",\n      className\n    )}\n    {...props}\n  >\n    <SliderPrimitive.Track className=\"relative h-2 w-full grow overflow-hidden rounded-full bg-secondary\">\n      <SliderPrimitive.Range className=\"absolute h-full bg-primary\" />\n    </SliderPrimitive.Track>\n    <SliderPrimitive.Thumb className=\"block h-5 w-5 rounded-full border-2 border-primary bg-background ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50\" />\n  </SliderPrimitive.Root>\n))\nSlider.displayName = SliderPrimitive.Root.displayName\n\nexport { Slider }\n"
  },
  {
    "path": "website/client/src/components/ui/switch.tsx",
    "content": "import * as React from \"react\"\nimport * as SwitchPrimitives from \"@radix-ui/react-switch\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Switch = React.forwardRef<\n  React.ElementRef<typeof SwitchPrimitives.Root>,\n  React.ComponentPropsWithoutRef<typeof SwitchPrimitives.Root>\n>(({ className, ...props }, ref) => (\n  <SwitchPrimitives.Root\n    className={cn(\n      \"peer inline-flex h-6 w-11 shrink-0 cursor-pointer items-center rounded-full border-2 border-transparent transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary data-[state=unchecked]:bg-input\",\n      className\n    )}\n    {...props}\n    ref={ref}\n  >\n    <SwitchPrimitives.Thumb\n      className={cn(\n        \"pointer-events-none block h-5 w-5 rounded-full bg-background shadow-lg ring-0 transition-transform data-[state=checked]:translate-x-5 data-[state=unchecked]:translate-x-0\"\n      )}\n    />\n  </SwitchPrimitives.Root>\n))\nSwitch.displayName = SwitchPrimitives.Root.displayName\n\nexport { Switch }\n"
  },
  {
    "path": "website/client/src/components/ui/table.tsx",
    "content": "import * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Table = React.forwardRef<\n  HTMLTableElement,\n  React.HTMLAttributes<HTMLTableElement>\n>(({ className, ...props }, ref) => (\n  <div className=\"relative w-full overflow-auto\">\n    <table\n      ref={ref}\n      className={cn(\"w-full caption-bottom text-sm\", className)}\n      {...props}\n    />\n  </div>\n))\nTable.displayName = \"Table\"\n\nconst TableHeader = React.forwardRef<\n  HTMLTableSectionElement,\n  React.HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n  <thead ref={ref} className={cn(\"[&_tr]:border-b\", className)} {...props} />\n))\nTableHeader.displayName = \"TableHeader\"\n\nconst TableBody = React.forwardRef<\n  HTMLTableSectionElement,\n  React.HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n  <tbody\n    ref={ref}\n    className={cn(\"[&_tr:last-child]:border-0\", className)}\n    {...props}\n  />\n))\nTableBody.displayName = \"TableBody\"\n\nconst TableFooter = React.forwardRef<\n  HTMLTableSectionElement,\n  React.HTMLAttributes<HTMLTableSectionElement>\n>(({ className, ...props }, ref) => (\n  <tfoot\n    ref={ref}\n    className={cn(\n      \"border-t bg-muted/50 font-medium [&>tr]:last:border-b-0\",\n      className\n    )}\n    {...props}\n  />\n))\nTableFooter.displayName = \"TableFooter\"\n\nconst TableRow = React.forwardRef<\n  HTMLTableRowElement,\n  React.HTMLAttributes<HTMLTableRowElement>\n>(({ className, ...props }, ref) => (\n  <tr\n    ref={ref}\n    className={cn(\n      \"border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted\",\n      className\n    )}\n    {...props}\n  />\n))\nTableRow.displayName = \"TableRow\"\n\nconst TableHead = React.forwardRef<\n  HTMLTableCellElement,\n  React.ThHTMLAttributes<HTMLTableCellElement>\n>(({ className, ...props }, ref) => (\n  <th\n    ref={ref}\n    className={cn(\n      \"h-12 px-4 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0\",\n      className\n    )}\n    {...props}\n  />\n))\nTableHead.displayName = \"TableHead\"\n\nconst TableCell = React.forwardRef<\n  HTMLTableCellElement,\n  React.TdHTMLAttributes<HTMLTableCellElement>\n>(({ className, ...props }, ref) => (\n  <td\n    ref={ref}\n    className={cn(\"p-4 align-middle [&:has([role=checkbox])]:pr-0\", className)}\n    {...props}\n  />\n))\nTableCell.displayName = \"TableCell\"\n\nconst TableCaption = React.forwardRef<\n  HTMLTableCaptionElement,\n  React.HTMLAttributes<HTMLTableCaptionElement>\n>(({ className, ...props }, ref) => (\n  <caption\n    ref={ref}\n    className={cn(\"mt-4 text-sm text-muted-foreground\", className)}\n    {...props}\n  />\n))\nTableCaption.displayName = \"TableCaption\"\n\nexport {\n  Table,\n  TableHeader,\n  TableBody,\n  TableFooter,\n  TableHead,\n  TableRow,\n  TableCell,\n  TableCaption,\n}\n"
  },
  {
    "path": "website/client/src/components/ui/tabs.tsx",
    "content": "import * as React from \"react\"\nimport * as TabsPrimitive from \"@radix-ui/react-tabs\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Tabs = TabsPrimitive.Root\n\nconst TabsList = React.forwardRef<\n  React.ElementRef<typeof TabsPrimitive.List>,\n  React.ComponentPropsWithoutRef<typeof TabsPrimitive.List>\n>(({ className, ...props }, ref) => (\n  <TabsPrimitive.List\n    ref={ref}\n    className={cn(\n      \"inline-flex h-10 items-center justify-center rounded-md bg-muted p-1 text-muted-foreground\",\n      className\n    )}\n    {...props}\n  />\n))\nTabsList.displayName = TabsPrimitive.List.displayName\n\nconst TabsTrigger = React.forwardRef<\n  React.ElementRef<typeof TabsPrimitive.Trigger>,\n  React.ComponentPropsWithoutRef<typeof TabsPrimitive.Trigger>\n>(({ className, ...props }, ref) => (\n  <TabsPrimitive.Trigger\n    ref={ref}\n    className={cn(\n      \"inline-flex items-center justify-center whitespace-nowrap rounded-sm px-3 py-1.5 text-sm font-medium ring-offset-background transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow-sm\",\n      className\n    )}\n    {...props}\n  />\n))\nTabsTrigger.displayName = TabsPrimitive.Trigger.displayName\n\nconst TabsContent = React.forwardRef<\n  React.ElementRef<typeof TabsPrimitive.Content>,\n  React.ComponentPropsWithoutRef<typeof TabsPrimitive.Content>\n>(({ className, ...props }, ref) => (\n  <TabsPrimitive.Content\n    ref={ref}\n    className={cn(\n      \"mt-2 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\",\n      className\n    )}\n    {...props}\n  />\n))\nTabsContent.displayName = TabsPrimitive.Content.displayName\n\nexport { Tabs, TabsList, TabsTrigger, TabsContent }\n"
  },
  {
    "path": "website/client/src/components/ui/textarea.tsx",
    "content": "import * as React from \"react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst Textarea = React.forwardRef<\n  HTMLTextAreaElement,\n  React.ComponentProps<\"textarea\">\n>(({ className, ...props }, ref) => {\n  return (\n    <textarea\n      className={cn(\n        \"flex min-h-[80px] w-full rounded-md border border-input bg-background px-3 py-2 text-base ring-offset-background placeholder:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 md:text-sm\",\n        className\n      )}\n      ref={ref}\n      {...props}\n    />\n  )\n})\nTextarea.displayName = \"Textarea\"\n\nexport { Textarea }\n"
  },
  {
    "path": "website/client/src/components/ui/toast.tsx",
    "content": "import * as React from \"react\"\nimport * as ToastPrimitives from \"@radix-ui/react-toast\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\nimport { X } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst ToastProvider = ToastPrimitives.Provider\n\nconst ToastViewport = React.forwardRef<\n  React.ElementRef<typeof ToastPrimitives.Viewport>,\n  React.ComponentPropsWithoutRef<typeof ToastPrimitives.Viewport>\n>(({ className, ...props }, ref) => (\n  <ToastPrimitives.Viewport\n    ref={ref}\n    className={cn(\n      \"fixed top-0 z-[100] flex max-h-screen w-full flex-col-reverse p-4 sm:bottom-0 sm:right-0 sm:top-auto sm:flex-col md:max-w-[420px]\",\n      className\n    )}\n    {...props}\n  />\n))\nToastViewport.displayName = ToastPrimitives.Viewport.displayName\n\nconst toastVariants = cva(\n  \"group pointer-events-auto relative flex w-full items-center justify-between space-x-4 overflow-hidden rounded-md border p-6 pr-8 shadow-lg transition-all data-[swipe=cancel]:translate-x-0 data-[swipe=end]:translate-x-[var(--radix-toast-swipe-end-x)] data-[swipe=move]:translate-x-[var(--radix-toast-swipe-move-x)] data-[swipe=move]:transition-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[swipe=end]:animate-out data-[state=closed]:fade-out-80 data-[state=closed]:slide-out-to-right-full data-[state=open]:slide-in-from-top-full data-[state=open]:sm:slide-in-from-bottom-full\",\n  {\n    variants: {\n      variant: {\n        default: \"border bg-background text-foreground\",\n        destructive:\n          \"destructive group border-destructive bg-destructive text-destructive-foreground\",\n      },\n    },\n    defaultVariants: {\n      variant: \"default\",\n    },\n  }\n)\n\nconst Toast = React.forwardRef<\n  React.ElementRef<typeof ToastPrimitives.Root>,\n  React.ComponentPropsWithoutRef<typeof ToastPrimitives.Root> &\n    VariantProps<typeof toastVariants>\n>(({ className, variant, ...props }, ref) => {\n  return (\n    <ToastPrimitives.Root\n      ref={ref}\n      className={cn(toastVariants({ variant }), className)}\n      {...props}\n    />\n  )\n})\nToast.displayName = ToastPrimitives.Root.displayName\n\nconst ToastAction = React.forwardRef<\n  React.ElementRef<typeof ToastPrimitives.Action>,\n  React.ComponentPropsWithoutRef<typeof ToastPrimitives.Action>\n>(({ className, ...props }, ref) => (\n  <ToastPrimitives.Action\n    ref={ref}\n    className={cn(\n      \"inline-flex h-8 shrink-0 items-center justify-center rounded-md border bg-transparent px-3 text-sm font-medium ring-offset-background transition-colors hover:bg-secondary focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 group-[.destructive]:border-muted/40 group-[.destructive]:hover:border-destructive/30 group-[.destructive]:hover:bg-destructive group-[.destructive]:hover:text-destructive-foreground group-[.destructive]:focus:ring-destructive\",\n      className\n    )}\n    {...props}\n  />\n))\nToastAction.displayName = ToastPrimitives.Action.displayName\n\nconst ToastClose = React.forwardRef<\n  React.ElementRef<typeof ToastPrimitives.Close>,\n  React.ComponentPropsWithoutRef<typeof ToastPrimitives.Close>\n>(({ className, ...props }, ref) => (\n  <ToastPrimitives.Close\n    ref={ref}\n    className={cn(\n      \"absolute right-2 top-2 rounded-md p-1 text-foreground/50 opacity-0 transition-opacity hover:text-foreground focus:opacity-100 focus:outline-none focus:ring-2 group-hover:opacity-100 group-[.destructive]:text-red-300 group-[.destructive]:hover:text-red-50 group-[.destructive]:focus:ring-red-400 group-[.destructive]:focus:ring-offset-red-600\",\n      className\n    )}\n    toast-close=\"\"\n    {...props}\n  >\n    <X className=\"h-4 w-4\" />\n  </ToastPrimitives.Close>\n))\nToastClose.displayName = ToastPrimitives.Close.displayName\n\nconst ToastTitle = React.forwardRef<\n  React.ElementRef<typeof ToastPrimitives.Title>,\n  React.ComponentPropsWithoutRef<typeof ToastPrimitives.Title>\n>(({ className, ...props }, ref) => (\n  <ToastPrimitives.Title\n    ref={ref}\n    className={cn(\"text-sm font-semibold\", className)}\n    {...props}\n  />\n))\nToastTitle.displayName = ToastPrimitives.Title.displayName\n\nconst ToastDescription = React.forwardRef<\n  React.ElementRef<typeof ToastPrimitives.Description>,\n  React.ComponentPropsWithoutRef<typeof ToastPrimitives.Description>\n>(({ className, ...props }, ref) => (\n  <ToastPrimitives.Description\n    ref={ref}\n    className={cn(\"text-sm opacity-90\", className)}\n    {...props}\n  />\n))\nToastDescription.displayName = ToastPrimitives.Description.displayName\n\ntype ToastProps = React.ComponentPropsWithoutRef<typeof Toast>\n\ntype ToastActionElement = React.ReactElement<typeof ToastAction>\n\nexport {\n  type ToastProps,\n  type ToastActionElement,\n  ToastProvider,\n  ToastViewport,\n  Toast,\n  ToastTitle,\n  ToastDescription,\n  ToastClose,\n  ToastAction,\n}\n"
  },
  {
    "path": "website/client/src/components/ui/toaster.tsx",
    "content": "import { useToast } from \"@/hooks/use-toast\"\nimport {\n  Toast,\n  ToastClose,\n  ToastDescription,\n  ToastProvider,\n  ToastTitle,\n  ToastViewport,\n} from \"@/components/ui/toast\"\n\nexport function Toaster() {\n  const { toasts } = useToast()\n\n  return (\n    <ToastProvider>\n      {toasts.map(function ({ id, title, description, action, ...props }) {\n        return (\n          <Toast key={id} {...props}>\n            <div className=\"grid gap-1\">\n              {title && <ToastTitle>{title}</ToastTitle>}\n              {description && (\n                <ToastDescription>{description}</ToastDescription>\n              )}\n            </div>\n            {action}\n            <ToastClose />\n          </Toast>\n        )\n      })}\n      <ToastViewport />\n    </ToastProvider>\n  )\n}\n"
  },
  {
    "path": "website/client/src/components/ui/toggle-group.tsx",
    "content": "\"use client\"\n\nimport * as React from \"react\"\nimport * as ToggleGroupPrimitive from \"@radix-ui/react-toggle-group\"\nimport { type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\nimport { toggleVariants } from \"@/components/ui/toggle\"\n\nconst ToggleGroupContext = React.createContext<\n  VariantProps<typeof toggleVariants>\n>({\n  size: \"default\",\n  variant: \"default\",\n})\n\nconst ToggleGroup = React.forwardRef<\n  React.ElementRef<typeof ToggleGroupPrimitive.Root>,\n  React.ComponentPropsWithoutRef<typeof ToggleGroupPrimitive.Root> &\n    VariantProps<typeof toggleVariants>\n>(({ className, variant, size, children, ...props }, ref) => (\n  <ToggleGroupPrimitive.Root\n    ref={ref}\n    className={cn(\"flex items-center justify-center gap-1\", className)}\n    {...props}\n  >\n    <ToggleGroupContext.Provider value={{ variant, size }}>\n      {children}\n    </ToggleGroupContext.Provider>\n  </ToggleGroupPrimitive.Root>\n))\n\nToggleGroup.displayName = ToggleGroupPrimitive.Root.displayName\n\nconst ToggleGroupItem = React.forwardRef<\n  React.ElementRef<typeof ToggleGroupPrimitive.Item>,\n  React.ComponentPropsWithoutRef<typeof ToggleGroupPrimitive.Item> &\n    VariantProps<typeof toggleVariants>\n>(({ className, children, variant, size, ...props }, ref) => {\n  const context = React.useContext(ToggleGroupContext)\n\n  return (\n    <ToggleGroupPrimitive.Item\n      ref={ref}\n      className={cn(\n        toggleVariants({\n          variant: context.variant || variant,\n          size: context.size || size,\n        }),\n        className\n      )}\n      {...props}\n    >\n      {children}\n    </ToggleGroupPrimitive.Item>\n  )\n})\n\nToggleGroupItem.displayName = ToggleGroupPrimitive.Item.displayName\n\nexport { ToggleGroup, ToggleGroupItem }\n"
  },
  {
    "path": "website/client/src/components/ui/toggle.tsx",
    "content": "import * as React from \"react\"\nimport * as TogglePrimitive from \"@radix-ui/react-toggle\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst toggleVariants = cva(\n  \"inline-flex items-center justify-center rounded-md text-sm font-medium ring-offset-background transition-colors hover:bg-muted hover:text-muted-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 data-[state=on]:bg-accent data-[state=on]:text-accent-foreground [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0 gap-2\",\n  {\n    variants: {\n      variant: {\n        default: \"bg-transparent\",\n        outline:\n          \"border border-input bg-transparent hover:bg-accent hover:text-accent-foreground\",\n      },\n      size: {\n        default: \"h-10 px-3 min-w-10\",\n        sm: \"h-9 px-2.5 min-w-9\",\n        lg: \"h-11 px-5 min-w-11\",\n      },\n    },\n    defaultVariants: {\n      variant: \"default\",\n      size: \"default\",\n    },\n  }\n)\n\nconst Toggle = React.forwardRef<\n  React.ElementRef<typeof TogglePrimitive.Root>,\n  React.ComponentPropsWithoutRef<typeof TogglePrimitive.Root> &\n    VariantProps<typeof toggleVariants>\n>(({ className, variant, size, ...props }, ref) => (\n  <TogglePrimitive.Root\n    ref={ref}\n    className={cn(toggleVariants({ variant, size, className }))}\n    {...props}\n  />\n))\n\nToggle.displayName = TogglePrimitive.Root.displayName\n\nexport { Toggle, toggleVariants }\n"
  },
  {
    "path": "website/client/src/components/ui/tooltip.tsx",
    "content": "\"use client\"\n\nimport * as React from \"react\"\nimport * as TooltipPrimitive from \"@radix-ui/react-tooltip\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst TooltipProvider = TooltipPrimitive.Provider\n\nconst Tooltip = TooltipPrimitive.Root\n\nconst TooltipTrigger = TooltipPrimitive.Trigger\n\nconst TooltipContent = React.forwardRef<\n  React.ElementRef<typeof TooltipPrimitive.Content>,\n  React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content>\n>(({ className, sideOffset = 4, ...props }, ref) => (\n  <TooltipPrimitive.Content\n    ref={ref}\n    sideOffset={sideOffset}\n    className={cn(\n      \"z-50 overflow-hidden rounded-md border bg-popover px-3 py-1.5 text-sm text-popover-foreground shadow-md animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-[--radix-tooltip-content-transform-origin]\",\n      className\n    )}\n    {...props}\n  />\n))\nTooltipContent.displayName = TooltipPrimitive.Content.displayName\n\nexport { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }\n"
  },
  {
    "path": "website/client/src/components/usage-guide.tsx",
    "content": "import { useLanguage } from \"@/hooks/use-language\";\nimport { Key, Settings, Bot, BarChart3 } from \"lucide-react\";\n\nconst steps = [\n  {\n    number: \"1\",\n    icon: Key,\n    titleKey: \"getApiKey\",\n    title: \"🔑 获取 API Key\",\n    description: \"注册平台后，在用户中心复制您的API密钥\"\n  },\n  {\n    number: \"2\",\n    icon: Settings,\n    titleKey: \"configEndpoint\",\n    title: \"⚙ 配置 Endpoint\",\n    description: \"填写 API 地址到支持的应用程序中\"\n  },\n  {\n    number: \"3\",\n    icon: Bot,\n    titleKey: \"selectModel\",\n    title: \"🤖 选择模型\",\n    description: \"根据平台支持情况切换不同的AI模型\"\n  },\n  {\n    number: \"4\",\n    icon: BarChart3,\n    titleKey: \"monitorUsage\",\n    title: \"📊 用量监控\",\n    description: \"推荐使用客户端自带的用量限制功能\"\n  }\n];\n\nexport function UsageGuide() {\n  const { t } = useLanguage();\n\n  return (\n    <section id=\"guide\" className=\"py-16 bg-gray-50\">\n      <div className=\"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8\">\n        <div className=\"text-center mb-12\">\n          <h2 className=\"text-3xl font-bold text-gray-900 mb-4\">\n            📖 {t('guide.title')}\n          </h2>\n          <p className=\"text-gray-600 max-w-2xl mx-auto\">\n            {t('guide.description')}\n          </p>\n        </div>\n\n        <div className=\"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6\">\n          {steps.map((step) => {\n            const IconComponent = step.icon;\n            \n            return (\n              <div key={step.number} className=\"bg-white rounded-lg p-6 shadow-sm border border-gray-200 hover:shadow-md transition-shadow duration-200\">\n                <div className=\"w-12 h-12 bg-blue-600 rounded-lg flex items-center justify-center mb-4\">\n                  <span className=\"text-white font-bold text-lg\">{step.number}</span>\n                </div>\n                <h3 className=\"text-lg font-semibold text-gray-900 mb-3 flex items-center\">\n                  <IconComponent className=\"w-5 h-5 mr-2 text-blue-600\" />\n                  {step.title}\n                </h3>\n                <p className=\"text-gray-600 text-sm leading-relaxed\">\n                  {step.description}\n                </p>\n              </div>\n            );\n          })}\n        </div>\n      </div>\n    </section>\n  );\n}\n"
  },
  {
    "path": "website/client/src/hooks/use-language.tsx",
    "content": "import { createContext, useContext, useState, useEffect, ReactNode } from \"react\";\nimport { translations, Language } from \"@/lib/translations\";\n\ntype LanguageContextType = {\n  language: Language;\n  setLanguage: (lang: Language) => void;\n  t: (key: string) => string;\n};\n\nconst LanguageContext = createContext<LanguageContextType | undefined>(undefined);\n\nexport function LanguageProvider({ children }: { children: ReactNode }) {\n  const [language, setLanguageState] = useState<Language>(() => {\n    const saved = localStorage.getItem('preferred-language') as Language;\n    return saved && translations[saved] ? saved : 'zh';\n  });\n\n  const setLanguage = (lang: Language) => {\n    setLanguageState(lang);\n    localStorage.setItem('preferred-language', lang);\n    document.documentElement.lang = lang;\n  };\n\n  const t = (key: string): string => {\n    const keys = key.split('.');\n    let value: any = translations[language];\n    \n    for (const k of keys) {\n      value = value?.[k];\n    }\n    \n    return value || key;\n  };\n\n  useEffect(() => {\n    document.documentElement.lang = language;\n  }, [language]);\n\n  return (\n    <LanguageContext.Provider value={{ language, setLanguage, t }}>\n      {children}\n    </LanguageContext.Provider>\n  );\n}\n\nexport function useLanguage() {\n  const context = useContext(LanguageContext);\n  if (context === undefined) {\n    throw new Error('useLanguage must be used within a LanguageProvider');\n  }\n  return context;\n}\n"
  },
  {
    "path": "website/client/src/hooks/use-mobile.tsx",
    "content": "import * as React from \"react\"\n\nconst MOBILE_BREAKPOINT = 768\n\nexport function useIsMobile() {\n  const [isMobile, setIsMobile] = React.useState<boolean | undefined>(undefined)\n\n  React.useEffect(() => {\n    const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`)\n    const onChange = () => {\n      setIsMobile(window.innerWidth < MOBILE_BREAKPOINT)\n    }\n    mql.addEventListener(\"change\", onChange)\n    setIsMobile(window.innerWidth < MOBILE_BREAKPOINT)\n    return () => mql.removeEventListener(\"change\", onChange)\n  }, [])\n\n  return !!isMobile\n}\n"
  },
  {
    "path": "website/client/src/hooks/use-toast.ts",
    "content": "import * as React from \"react\"\n\nimport type {\n  ToastActionElement,\n  ToastProps,\n} from \"@/components/ui/toast\"\n\nconst TOAST_LIMIT = 1\nconst TOAST_REMOVE_DELAY = 1000000\n\ntype ToasterToast = ToastProps & {\n  id: string\n  title?: React.ReactNode\n  description?: React.ReactNode\n  action?: ToastActionElement\n}\n\nconst actionTypes = {\n  ADD_TOAST: \"ADD_TOAST\",\n  UPDATE_TOAST: \"UPDATE_TOAST\",\n  DISMISS_TOAST: \"DISMISS_TOAST\",\n  REMOVE_TOAST: \"REMOVE_TOAST\",\n} as const\n\nlet count = 0\n\nfunction genId() {\n  count = (count + 1) % Number.MAX_SAFE_INTEGER\n  return count.toString()\n}\n\ntype ActionType = typeof actionTypes\n\ntype Action =\n  | {\n      type: ActionType[\"ADD_TOAST\"]\n      toast: ToasterToast\n    }\n  | {\n      type: ActionType[\"UPDATE_TOAST\"]\n      toast: Partial<ToasterToast>\n    }\n  | {\n      type: ActionType[\"DISMISS_TOAST\"]\n      toastId?: ToasterToast[\"id\"]\n    }\n  | {\n      type: ActionType[\"REMOVE_TOAST\"]\n      toastId?: ToasterToast[\"id\"]\n    }\n\ninterface State {\n  toasts: ToasterToast[]\n}\n\nconst toastTimeouts = new Map<string, ReturnType<typeof setTimeout>>()\n\nconst addToRemoveQueue = (toastId: string) => {\n  if (toastTimeouts.has(toastId)) {\n    return\n  }\n\n  const timeout = setTimeout(() => {\n    toastTimeouts.delete(toastId)\n    dispatch({\n      type: \"REMOVE_TOAST\",\n      toastId: toastId,\n    })\n  }, TOAST_REMOVE_DELAY)\n\n  toastTimeouts.set(toastId, timeout)\n}\n\nexport const reducer = (state: State, action: Action): State => {\n  switch (action.type) {\n    case \"ADD_TOAST\":\n      return {\n        ...state,\n        toasts: [action.toast, ...state.toasts].slice(0, TOAST_LIMIT),\n      }\n\n    case \"UPDATE_TOAST\":\n      return {\n        ...state,\n        toasts: state.toasts.map((t) =>\n          t.id === action.toast.id ? { ...t, ...action.toast } : t\n        ),\n      }\n\n    case \"DISMISS_TOAST\": {\n      const { toastId } = action\n\n      // ! Side effects ! - This could be extracted into a dismissToast() action,\n      // but I'll keep it here for simplicity\n      if (toastId) {\n        addToRemoveQueue(toastId)\n      } else {\n        state.toasts.forEach((toast) => {\n          addToRemoveQueue(toast.id)\n        })\n      }\n\n      return {\n        ...state,\n        toasts: state.toasts.map((t) =>\n          t.id === toastId || toastId === undefined\n            ? {\n                ...t,\n                open: false,\n              }\n            : t\n        ),\n      }\n    }\n    case \"REMOVE_TOAST\":\n      if (action.toastId === undefined) {\n        return {\n          ...state,\n          toasts: [],\n        }\n      }\n      return {\n        ...state,\n        toasts: state.toasts.filter((t) => t.id !== action.toastId),\n      }\n  }\n}\n\nconst listeners: Array<(state: State) => void> = []\n\nlet memoryState: State = { toasts: [] }\n\nfunction dispatch(action: Action) {\n  memoryState = reducer(memoryState, action)\n  listeners.forEach((listener) => {\n    listener(memoryState)\n  })\n}\n\ntype Toast = Omit<ToasterToast, \"id\">\n\nfunction toast({ ...props }: Toast) {\n  const id = genId()\n\n  const update = (props: ToasterToast) =>\n    dispatch({\n      type: \"UPDATE_TOAST\",\n      toast: { ...props, id },\n    })\n  const dismiss = () => dispatch({ type: \"DISMISS_TOAST\", toastId: id })\n\n  dispatch({\n    type: \"ADD_TOAST\",\n    toast: {\n      ...props,\n      id,\n      open: true,\n      onOpenChange: (open) => {\n        if (!open) dismiss()\n      },\n    },\n  })\n\n  return {\n    id: id,\n    dismiss,\n    update,\n  }\n}\n\nfunction useToast() {\n  const [state, setState] = React.useState<State>(memoryState)\n\n  React.useEffect(() => {\n    listeners.push(setState)\n    return () => {\n      const index = listeners.indexOf(setState)\n      if (index > -1) {\n        listeners.splice(index, 1)\n      }\n    }\n  }, [state])\n\n  return {\n    ...state,\n    toast,\n    dismiss: (toastId?: string) => dispatch({ type: \"DISMISS_TOAST\", toastId }),\n  }\n}\n\nexport { useToast, toast }\n"
  },
  {
    "path": "website/client/src/index.css",
    "content": "@tailwind base;\n@tailwind components;\n@tailwind utilities;\n\n:root {\n  --background: hsl(0, 0%, 100%);\n  --foreground: hsl(20, 14.3%, 4.1%);\n  --muted: hsl(60, 4.8%, 95.9%);\n  --muted-foreground: hsl(25, 5.3%, 44.7%);\n  --popover: hsl(0, 0%, 100%);\n  --popover-foreground: hsl(20, 14.3%, 4.1%);\n  --card: hsl(0, 0%, 100%);\n  --card-foreground: hsl(20, 14.3%, 4.1%);\n  --border: hsl(20, 5.9%, 90%);\n  --input: hsl(20, 5.9%, 90%);\n  --primary: hsl(207, 90%, 54%);\n  --primary-foreground: hsl(211, 100%, 99%);\n  --secondary: hsl(60, 4.8%, 95.9%);\n  --secondary-foreground: hsl(24, 9.8%, 10%);\n  --accent: hsl(60, 4.8%, 95.9%);\n  --accent-foreground: hsl(24, 9.8%, 10%);\n  --destructive: hsl(0, 84.2%, 60.2%);\n  --destructive-foreground: hsl(60, 9.1%, 97.8%);\n  --ring: hsl(20, 14.3%, 4.1%);\n  --radius: 0.5rem;\n}\n\n.dark {\n  --background: hsl(240, 10%, 3.9%);\n  --foreground: hsl(0, 0%, 98%);\n  --muted: hsl(240, 3.7%, 15.9%);\n  --muted-foreground: hsl(240, 5%, 64.9%);\n  --popover: hsl(240, 10%, 3.9%);\n  --popover-foreground: hsl(0, 0%, 98%);\n  --card: hsl(240, 10%, 3.9%);\n  --card-foreground: hsl(0, 0%, 98%);\n  --border: hsl(240, 3.7%, 15.9%);\n  --input: hsl(240, 3.7%, 15.9%);\n  --primary: hsl(207, 90%, 54%);\n  --primary-foreground: hsl(211, 100%, 99%);\n  --secondary: hsl(240, 3.7%, 15.9%);\n  --secondary-foreground: hsl(0, 0%, 98%);\n  --accent: hsl(240, 3.7%, 15.9%);\n  --accent-foreground: hsl(0, 0%, 98%);\n  --destructive: hsl(0, 62.8%, 30.6%);\n  --destructive-foreground: hsl(0, 0%, 98%);\n  --ring: hsl(240, 4.9%, 83.9%);\n  --radius: 0.5rem;\n}\n\n@layer base {\n  * {\n    @apply border-border;\n  }\n\n  body {\n    @apply font-sans antialiased bg-background text-foreground;\n  }\n}\n\n@layer utilities {\n  .line-clamp-2 {\n    display: -webkit-box;\n    -webkit-line-clamp: 2;\n    -webkit-box-orient: vertical;\n    overflow: hidden;\n  }\n\n  .animate-fade-in {\n    animation: fadeIn 0.6s ease-out forwards;\n  }\n\n  @keyframes fadeIn {\n    from {\n      opacity: 0;\n      transform: translateY(20px);\n    }\n    to {\n      opacity: 1;\n      transform: translateY(0);\n    }\n  }\n}\n\n/* Custom scrollbar */\n::-webkit-scrollbar {\n  width: 8px;\n  height: 8px;\n}\n\n::-webkit-scrollbar-track {\n  background: hsl(var(--muted));\n}\n\n::-webkit-scrollbar-thumb {\n  background: hsl(var(--muted-foreground));\n  border-radius: 4px;\n}\n\n::-webkit-scrollbar-thumb:hover {\n  background: hsl(var(--foreground));\n}\n\n/* Smooth scrolling */\nhtml {\n  scroll-behavior: smooth;\n}\n\n/* Focus styles */\n.focus\\:ring-2:focus {\n  outline: 2px solid transparent;\n  outline-offset: 2px;\n  box-shadow: 0 0 0 2px hsl(var(--ring));\n}\n\n/* Hover effects */\n.hover-lift:hover {\n  transform: translateY(-2px);\n  box-shadow: 0 8px 25px -5px rgba(0, 0, 0, 0.1);\n}\n\n/* Responsive table */\n@media (max-width: 1024px) {\n  .table-container {\n    overflow-x: auto;\n    -webkit-overflow-scrolling: touch;\n  }\n  \n  .table-container::-webkit-scrollbar {\n    height: 6px;\n  }\n}\n"
  },
  {
    "path": "website/client/src/lib/api-providers-data.ts",
    "content": "// Utility functions and constants for API providers\nexport const TAG_DESCRIPTIONS = {\n  \"🆓\": \"completely_free\",\n  \"🔓\": \"free_credits\", \n  \"💰\": \"requires_payment\",\n  \"💪\": \"claude_support\",\n  \"✌\": \"openai_support\", \n  \"🎉\": \"other_models\",\n  \"🌎\": \"international_network\",\n  \"🎁\": \"recharge_bonus\",\n  \"🚀\": \"high_concurrency\",\n  \"😆\": \"daily_checkin\",\n  \"🚩\": \"registered_platform\",\n  \"✔\": \"verified_authentic\",\n  \"🌹\": \"premium_service\"\n} as const;\n\nexport const TAG_COLORS = {\n  \"🆓\": \"bg-green-100 text-green-800\",\n  \"🔓\": \"bg-green-100 text-green-800\", \n  \"💰\": \"bg-yellow-100 text-yellow-800\",\n  \"💪\": \"bg-red-100 text-red-800\",\n  \"✌\": \"bg-blue-100 text-blue-800\",\n  \"🎉\": \"bg-indigo-100 text-indigo-800\",\n  \"🌎\": \"bg-cyan-100 text-cyan-800\",\n  \"🎁\": \"bg-purple-100 text-purple-800\",\n  \"🚀\": \"bg-orange-100 text-orange-800\",\n  \"😆\": \"bg-yellow-100 text-yellow-800\",\n  \"🚩\": \"bg-green-100 text-green-800\",\n  \"✔\": \"bg-gray-100 text-gray-800\",\n  \"🌹\": \"bg-pink-100 text-pink-800\"\n} as const;\n\nexport const FILTER_OPTIONS = [\n  { key: 'all', emoji: '', label: 'all' },\n  { key: 'free', emoji: '🆓', label: 'free' },\n  { key: 'claude', emoji: '💪', label: 'claude' },\n  { key: 'openai', emoji: '✌', label: 'openai' },\n  { key: 'verified', emoji: '✔', label: 'verified' }\n] as const;\n\nexport const APP_ICON_MAP = {\n  desktop: \"Monitor\",\n  globe: \"Globe\", \n  comments: \"MessageSquare\",\n  mobile: \"Smartphone\",\n  \"message-square\": \"MessageCircle\",\n  zap: \"Zap\"\n} as const;\n\nexport const APP_TAG_COLORS = {\n  \"开源\": \"bg-green-100 text-green-800\",\n  \"跨平台\": \"bg-blue-100 text-blue-800\",\n  \"网页端\": \"bg-purple-100 text-purple-800\", \n  \"多模态\": \"bg-red-100 text-red-800\",\n  \"移动端\": \"bg-indigo-100 text-indigo-800\",\n  \"语音\": \"bg-orange-100 text-orange-800\",\n  \"现代界面\": \"bg-cyan-100 text-cyan-800\",\n  \"企业级\": \"bg-gray-100 text-gray-800\",\n  \"知识库\": \"bg-yellow-100 text-yellow-800\"\n} as const;\n\n// Helper functions for filtering and searching\nexport function filterProvidersByTag(providers: any[], tag: string): any[] {\n  if (tag === 'all') return providers;\n  return providers.filter(provider => provider.tags.includes(getTagEmoji(tag)));\n}\n\nexport function searchProviders(providers: any[], searchTerm: string): any[] {\n  if (!searchTerm.trim()) return providers;\n  \n  const term = searchTerm.toLowerCase();\n  return providers.filter(provider => \n    provider.displayName.toLowerCase().includes(term) ||\n    provider.name.toLowerCase().includes(term) ||\n    provider.notes?.toLowerCase().includes(term) ||\n    provider.url.toLowerCase().includes(term)\n  );\n}\n\nexport function getTagEmoji(filterKey: string): string {\n  const option = FILTER_OPTIONS.find(opt => opt.key === filterKey);\n  return option?.emoji || '';\n}\n\nexport function getTagColor(tag: string): string {\n  return TAG_COLORS[tag as keyof typeof TAG_COLORS] || 'bg-gray-100 text-gray-800';\n}\n\nexport function getAppTagColor(tag: string): string {\n  return APP_TAG_COLORS[tag as keyof typeof APP_TAG_COLORS] || 'bg-gray-100 text-gray-800';\n}\n\n// URL validation and formatting\nexport function formatUrl(url: string): string {\n  return url.replace(/^https?:\\/\\//, '');\n}\n\nexport function isValidUrl(url: string): boolean {\n  try {\n    new URL(url.startsWith('http') ? url : `https://${url}`);\n    return true;\n  } catch {\n    return false;\n  }\n}\n\n// Local storage helpers for user preferences\nexport function saveFavorites(favorites: Set<number>): void {\n  localStorage.setItem('api-provider-favorites', JSON.stringify(Array.from(favorites)));\n}\n\nexport function loadFavorites(): Set<number> {\n  try {\n    const saved = localStorage.getItem('api-provider-favorites');\n    return new Set(saved ? JSON.parse(saved) : []);\n  } catch {\n    return new Set();\n  }\n}\n\nexport function saveFilterPreference(filter: string): void {\n  localStorage.setItem('api-provider-filter', filter);\n}\n\nexport function loadFilterPreference(): string {\n  return localStorage.getItem('api-provider-filter') || 'all';\n}\n\n// Analytics and tracking helpers (for future implementation)\nexport function trackProviderClick(providerId: number, providerName: string): void {\n  // This could be implemented to track user interactions\n  console.log(`Provider clicked: ${providerName} (ID: ${providerId})`);\n}\n\nexport function trackSearch(searchTerm: string): void {\n  // This could be implemented to track search patterns\n  console.log(`Search performed: ${searchTerm}`);\n}\n\nexport function trackFilterUsage(filter: string): void {\n  // This could be implemented to track filter usage\n  console.log(`Filter applied: ${filter}`);\n}\n\n// Copy to clipboard with fallback\nexport async function copyToClipboard(text: string): Promise<boolean> {\n  try {\n    if (navigator.clipboard && window.isSecureContext) {\n      await navigator.clipboard.writeText(text);\n      return true;\n    } else {\n      // Fallback for older browsers or non-secure contexts\n      const textArea = document.createElement('textarea');\n      textArea.value = text;\n      textArea.style.position = 'fixed';\n      textArea.style.left = '-999999px';\n      textArea.style.top = '-999999px';\n      document.body.appendChild(textArea);\n      textArea.focus();\n      textArea.select();\n      const successful = document.execCommand('copy');\n      document.body.removeChild(textArea);\n      return successful;\n    }\n  } catch (err) {\n    console.error('Failed to copy text: ', err);\n    return false;\n  }\n}\n\n// Scroll utilities\nexport function scrollToSection(sectionId: string): void {\n  const element = document.getElementById(sectionId);\n  if (element) {\n    const headerHeight = 80; // Account for sticky header\n    const elementPosition = element.offsetTop - headerHeight;\n    window.scrollTo({\n      top: elementPosition,\n      behavior: 'smooth'\n    });\n  }\n}\n\n// Debounce function for search input\nexport function debounce<T extends (...args: any[]) => any>(\n  func: T,\n  wait: number\n): (...args: Parameters<T>) => void {\n  let timeout: NodeJS.Timeout;\n  return (...args: Parameters<T>) => {\n    clearTimeout(timeout);\n    timeout = setTimeout(() => func(...args), wait);\n  };\n}\n\n// Sort providers by various criteria\nexport function sortProviders(providers: any[], sortBy: 'name' | 'recommended' | 'tags' = 'recommended'): any[] {\n  return [...providers].sort((a, b) => {\n    switch (sortBy) {\n      case 'name':\n        return a.displayName.localeCompare(b.displayName);\n      case 'recommended':\n        if (a.isRecommended && !b.isRecommended) return -1;\n        if (!a.isRecommended && b.isRecommended) return 1;\n        return a.sortOrder - b.sortOrder;\n      case 'tags':\n        return b.tags.length - a.tags.length;\n      default:\n        return a.sortOrder - b.sortOrder;\n    }\n  });\n}\n\n// Constants for UI\nexport const MOBILE_BREAKPOINT = 1024;\nexport const SEARCH_DEBOUNCE_MS = 300;\nexport const TOAST_DURATION = 3000;\nexport const ANIMATION_DURATION = 200;\n\n// Language-specific formatting\nexport const LANGUAGE_FLAGS = {\n  zh: '🇨🇳',\n  en: '🇺🇸', \n  ru: '🇷🇺',\n  fr: '🇫🇷'\n} as const;\n\nexport const LANGUAGE_NAMES = {\n  zh: '中文',\n  en: 'English',\n  ru: 'Русский', \n  fr: 'Français'\n} as const;\n"
  },
  {
    "path": "website/client/src/lib/queryClient.ts",
    "content": "import { QueryClient, QueryFunction } from \"@tanstack/react-query\";\n\nasync function throwIfResNotOk(res: Response) {\n  if (!res.ok) {\n    const text = (await res.text()) || res.statusText;\n    throw new Error(`${res.status}: ${text}`);\n  }\n}\n\nexport async function apiRequest(\n  method: string,\n  url: string,\n  data?: unknown | undefined,\n): Promise<Response> {\n  const res = await fetch(url, {\n    method,\n    headers: data ? { \"Content-Type\": \"application/json\" } : {},\n    body: data ? JSON.stringify(data) : undefined,\n    credentials: \"include\",\n  });\n\n  await throwIfResNotOk(res);\n  return res;\n}\n\ntype UnauthorizedBehavior = \"returnNull\" | \"throw\";\nexport const getQueryFn: <T>(options: {\n  on401: UnauthorizedBehavior;\n}) => QueryFunction<T> =\n  ({ on401: unauthorizedBehavior }) =>\n  async ({ queryKey }) => {\n    const res = await fetch(queryKey[0] as string, {\n      credentials: \"include\",\n    });\n\n    if (unauthorizedBehavior === \"returnNull\" && res.status === 401) {\n      return null;\n    }\n\n    await throwIfResNotOk(res);\n    return await res.json();\n  };\n\nexport const queryClient = new QueryClient({\n  defaultOptions: {\n    queries: {\n      queryFn: getQueryFn({ on401: \"throw\" }),\n      refetchInterval: false,\n      refetchOnWindowFocus: false,\n      staleTime: Infinity,\n      retry: false,\n    },\n    mutations: {\n      retry: false,\n    },\n  },\n});\n"
  },
  {
    "path": "website/client/src/lib/translations.ts",
    "content": "export const translations = {\n  zh: {\n    nav: {\n      providers: \"API提供商\",\n      apps: \"推荐应用\",\n      guide: \"使用指南\",\n      contribute: \"贡献\"\n    },\n    hero: {\n      title: \"OpenAI / Claude / DeepSeek API Provider\",\n      description: \"精选的第三方平台列表，提供 OpenAI / Claude / DeepSeek API，供学习、研究和非商业使用。\"\n    },\n    warning: {\n      title: \"使用说明\",\n      content: \"本项目为免费公益项目，严格禁止任何违法用途。所有网站仅作收录展示，请勿输入个人敏感信息。\"\n    },\n    tags: {\n      title: \"特色标签说明\",\n      free: \"完全免费\",\n      freemium: \"有免费额度\",\n      paid: \"需要充值\",\n      claude: \"Claude 支持\",\n      openai: \"OpenAI 支持\",\n      other: \"其他模型\",\n      vpn: \"需要国际网络\",\n      bonus: \"充值优惠\",\n      concurrent: \"高并发\",\n      daily: \"每日签到\",\n      verified: \"已备案\",\n      validated: \"已验证\"\n    },\n    providers: {\n      title: \"第三方 API 提供方列表\",\n      description: \"以下是经过验证的第三方API提供商，请根据您的需求选择合适的服务商。\",\n      search: \"搜索API提供商...\",\n      filter: {\n        all: \"全部\",\n        free: \"免费\",\n        claude: \"Claude\",\n        openai: \"OpenAI\",\n        verified: \"已验证\"\n      },\n      loadMore: \"加载更多\"\n    },\n    table: {\n      index: \"序号\",\n      website: \"网站\",\n      link: \"链接\",\n      tags: \"标签\",\n      notes: \"备注\",\n      actions: \"操作\"\n    },\n    apps: {\n      title: \"推荐应用支持\",\n      description: \"以下应用已经兼容并支持使用这些第三方API服务\"\n    },\n    guide: {\n      title: \"使用指南\",\n      description: \"按照以下步骤快速开始使用第三方API服务\"\n    },\n    contribute: {\n      title: \"贡献指南\",\n      description: \"我们欢迎各种形式的贡献，让这个项目变得更好\"\n    },\n    footer: {\n      links: \"快速链接\",\n      providers: \"API提供商\",\n      apps: \"推荐应用\",\n      guide: \"使用指南\",\n      contribute: \"贡献指南\",\n      legal: \"法律声明\"\n    },\n    toast: {\n      copied: \"链接已复制到剪贴板\",\n      favoriteAdded: \"已添加到收藏\",\n      favoriteRemoved: \"已从收藏中移除\",\n      languageChanged: \"语言已切换到\"\n    }\n  },\n  en: {\n    nav: {\n      providers: \"API Providers\",\n      apps: \"Recommended Apps\",\n      guide: \"Usage Guide\",\n      contribute: \"Contribute\"\n    },\n    hero: {\n      title: \"OpenAI / Claude / DeepSeek API Provider\",\n      description: \"A curated list of third-party platforms providing OpenAI / Claude / DeepSeek APIs for learning, research, and non-commercial use.\"\n    },\n    warning: {\n      title: \"Usage Notice\",\n      content: \"This project is a free public service, strictly prohibiting any illegal use. All websites are for display only, please do not enter personal sensitive information.\"\n    },\n    tags: {\n      title: \"Feature Tags Explanation\",\n      free: \"Completely Free\",\n      freemium: \"Free Credits\",\n      paid: \"Requires Payment\",\n      claude: \"Claude Support\",\n      openai: \"OpenAI Support\",\n      other: \"Other Models\",\n      vpn: \"International Network Required\",\n      bonus: \"Recharge Bonus\",\n      concurrent: \"High Concurrency\",\n      daily: \"Daily Check-in\",\n      verified: \"Registered\",\n      validated: \"Verified\"\n    },\n    providers: {\n      title: \"Third-party API Provider List\",\n      description: \"The following are verified third-party API providers, please choose the appropriate service provider according to your needs.\",\n      search: \"Search API providers...\",\n      filter: {\n        all: \"All\",\n        free: \"Free\",\n        claude: \"Claude\",\n        openai: \"OpenAI\",\n        verified: \"Verified\"\n      },\n      loadMore: \"Load More\"\n    },\n    table: {\n      index: \"Index\",\n      website: \"Website\",\n      link: \"Link\",\n      tags: \"Tags\",\n      notes: \"Notes\",\n      actions: \"Actions\"\n    },\n    apps: {\n      title: \"Recommended Apps Support\",\n      description: \"The following applications are compatible and support using these third-party API services\"\n    },\n    guide: {\n      title: \"Usage Guide\",\n      description: \"Follow these steps to quickly start using third-party API services\"\n    },\n    contribute: {\n      title: \"Contribution Guide\",\n      description: \"We welcome all forms of contributions to make this project better\"\n    },\n    footer: {\n      links: \"Quick Links\",\n      providers: \"API Providers\",\n      apps: \"Recommended Apps\",\n      guide: \"Usage Guide\",\n      contribute: \"Contribution Guide\",\n      legal: \"Legal Disclaimer\"\n    },\n    toast: {\n      copied: \"Link copied to clipboard\",\n      favoriteAdded: \"Added to favorites\",\n      favoriteRemoved: \"Removed from favorites\",\n      languageChanged: \"Language switched to\"\n    }\n  },\n  ru: {\n    nav: {\n      providers: \"API провайдеры\",\n      apps: \"Рекомендуемые приложения\",\n      guide: \"Руководство\",\n      contribute: \"Участие\"\n    },\n    hero: {\n      title: \"OpenAI / Claude / DeepSeek API Provider\",\n      description: \"Тщательно отобранный список сторонних платформ, предоставляющих OpenAI / Claude / DeepSeek API для обучения, исследований и некоммерческого использования.\"\n    },\n    warning: {\n      title: \"Уведомление об использовании\",\n      content: \"Этот проект является бесплатной общественной службой, строго запрещающей любое незаконное использование. Все веб-сайты предназначены только для отображения, пожалуйста, не вводите личную конфиденциальную информацию.\"\n    },\n    tags: {\n      title: \"Объяснение тегов функций\",\n      free: \"Полностью бесплатно\",\n      freemium: \"Бесплатные кредиты\",\n      paid: \"Требует оплаты\",\n      claude: \"Поддержка Claude\",\n      openai: \"Поддержка OpenAI\",\n      other: \"Другие модели\",\n      vpn: \"Требуется международная сеть\",\n      bonus: \"Бонус за пополнение\",\n      concurrent: \"Высокая параллельность\",\n      daily: \"Ежедневная регистрация\",\n      verified: \"Зарегистрировано\",\n      validated: \"Проверено\"\n    },\n    providers: {\n      title: \"Список сторонних API провайдеров\",\n      description: \"Ниже приведены проверенные сторонние API провайдеры, пожалуйста, выберите подходящего поставщика услуг в соответствии с вашими потребностями.\",\n      search: \"Поиск API провайдеров...\",\n      filter: {\n        all: \"Все\",\n        free: \"Бесплатно\",\n        claude: \"Claude\",\n        openai: \"OpenAI\",\n        verified: \"Проверено\"\n      },\n      loadMore: \"Загрузить еще\"\n    },\n    table: {\n      index: \"Индекс\",\n      website: \"Веб-сайт\",\n      link: \"Ссылка\",\n      tags: \"Теги\",\n      notes: \"Примечания\",\n      actions: \"Действия\"\n    },\n    apps: {\n      title: \"Поддержка рекомендуемых приложений\",\n      description: \"Следующие приложения совместимы и поддерживают использование этих сторонних API сервисов\"\n    },\n    guide: {\n      title: \"Руководство по использованию\",\n      description: \"Следуйте этим шагам, чтобы быстро начать использовать сторонние API сервисы\"\n    },\n    contribute: {\n      title: \"Руководство по участию\",\n      description: \"Мы приветствуем все формы участия, чтобы сделать этот проект лучше\"\n    },\n    footer: {\n      links: \"Быстрые ссылки\",\n      providers: \"API провайдеры\",\n      apps: \"Рекомендуемые приложения\",\n      guide: \"Руководство\",\n      contribute: \"Руководство по участию\",\n      legal: \"Правовая оговорка\"\n    },\n    toast: {\n      copied: \"Ссылка скопирована в буфер обмена\",\n      favoriteAdded: \"Добавлено в избранное\",\n      favoriteRemoved: \"Удалено из избранного\",\n      languageChanged: \"Язык переключен на\"\n    }\n  },\n  fr: {\n    nav: {\n      providers: \"Fournisseurs API\",\n      apps: \"Applications recommandées\",\n      guide: \"Guide d'utilisation\",\n      contribute: \"Contribuer\"\n    },\n    hero: {\n      title: \"OpenAI / Claude / DeepSeek API Provider\",\n      description: \"Une liste organisée de plateformes tierces fournissant des API OpenAI / Claude / DeepSeek pour l'apprentissage, la recherche et l'utilisation non commerciale.\"\n    },\n    warning: {\n      title: \"Avertissement d'utilisation\",\n      content: \"Ce projet est un service public gratuit, interdisant strictement toute utilisation illégale. Tous les sites Web sont uniquement à des fins d'affichage, veuillez ne pas saisir d'informations personnelles sensibles.\"\n    },\n    tags: {\n      title: \"Explication des balises de fonctionnalités\",\n      free: \"Entièrement gratuit\",\n      freemium: \"Crédits gratuits\",\n      paid: \"Nécessite un paiement\",\n      claude: \"Support Claude\",\n      openai: \"Support OpenAI\",\n      other: \"Autres modèles\",\n      vpn: \"Réseau international requis\",\n      bonus: \"Bonus de recharge\",\n      concurrent: \"Haute concurrence\",\n      daily: \"Enregistrement quotidien\",\n      verified: \"Enregistré\",\n      validated: \"Vérifié\"\n    },\n    providers: {\n      title: \"Liste des fournisseurs API tiers\",\n      description: \"Voici les fournisseurs API tiers vérifiés, veuillez choisir le fournisseur de services approprié selon vos besoins.\",\n      search: \"Rechercher des fournisseurs API...\",\n      filter: {\n        all: \"Tous\",\n        free: \"Gratuit\",\n        claude: \"Claude\",\n        openai: \"OpenAI\",\n        verified: \"Vérifié\"\n      },\n      loadMore: \"Charger plus\"\n    },\n    table: {\n      index: \"Index\",\n      website: \"Site Web\",\n      link: \"Lien\",\n      tags: \"Balises\",\n      notes: \"Notes\",\n      actions: \"Actions\"\n    },\n    apps: {\n      title: \"Support d'applications recommandées\",\n      description: \"Les applications suivantes sont compatibles et prennent en charge l'utilisation de ces services API tiers\"\n    },\n    guide: {\n      title: \"Guide d'utilisation\",\n      description: \"Suivez ces étapes pour commencer rapidement à utiliser les services API tiers\"\n    },\n    contribute: {\n      title: \"Guide de contribution\",\n      description: \"Nous accueillons toutes les formes de contributions pour améliorer ce projet\"\n    },\n    footer: {\n      links: \"Liens rapides\",\n      providers: \"Fournisseurs API\",\n      apps: \"Applications recommandées\",\n      guide: \"Guide d'utilisation\",\n      contribute: \"Guide de contribution\",\n      legal: \"Avis de non-responsabilité légale\"\n    },\n    toast: {\n      copied: \"Lien copié dans le presse-papiers\",\n      favoriteAdded: \"Ajouté aux favoris\",\n      favoriteRemoved: \"Supprimé des favoris\",\n      languageChanged: \"Langue changée pour\"\n    }\n  }\n};\n\nexport type Language = keyof typeof translations;\nexport type TranslationKey = keyof typeof translations.zh;\n"
  },
  {
    "path": "website/client/src/lib/utils.ts",
    "content": "import { clsx, type ClassValue } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n  return twMerge(clsx(inputs))\n}\n"
  },
  {
    "path": "website/client/src/main.tsx",
    "content": "import { createRoot } from \"react-dom/client\";\nimport App from \"./App\";\nimport \"./index.css\";\n\ncreateRoot(document.getElementById(\"root\")!).render(<App />);\n"
  },
  {
    "path": "website/client/src/pages/home.tsx",
    "content": "import { Header } from \"@/components/header\";\nimport { HeroSection } from \"@/components/hero-section\";\nimport { TagsLegend } from \"@/components/tags-legend\";\nimport { ProviderStats } from \"@/components/provider-stats\";\nimport { ProvidersTable } from \"@/components/providers-table\";\nimport { ProviderComparison } from \"@/components/provider-comparison\";\nimport { RecommendedApps } from \"@/components/recommended-apps\";\nimport { UsageGuide } from \"@/components/usage-guide\";\nimport { ContributeSection } from \"@/components/contribute-section\";\nimport { Footer } from \"@/components/footer\";\n\nexport default function Home() {\n  return (\n    <div className=\"min-h-screen bg-gray-50\">\n      <Header />\n      <HeroSection />\n      <TagsLegend />\n      <ProviderStats />\n      <ProvidersTable />\n      <ProviderComparison />\n      <RecommendedApps />\n      <UsageGuide />\n      <ContributeSection />\n      <Footer />\n    </div>\n  );\n}\n"
  },
  {
    "path": "website/client/src/pages/not-found.tsx",
    "content": "import { Card, CardContent } from \"@/components/ui/card\";\nimport { AlertCircle } from \"lucide-react\";\n\nexport default function NotFound() {\n  return (\n    <div className=\"min-h-screen w-full flex items-center justify-center bg-gray-50\">\n      <Card className=\"w-full max-w-md mx-4\">\n        <CardContent className=\"pt-6\">\n          <div className=\"flex mb-4 gap-2\">\n            <AlertCircle className=\"h-8 w-8 text-red-500\" />\n            <h1 className=\"text-2xl font-bold text-gray-900\">404 Page Not Found</h1>\n          </div>\n\n          <p className=\"mt-4 text-sm text-gray-600\">\n            Did you forget to add the page to the router?\n          </p>\n        </CardContent>\n      </Card>\n    </div>\n  );\n}\n"
  },
  {
    "path": "website/components.json",
    "content": "{\n    \"$schema\": \"https://ui.shadcn.com/schema.json\",\n    \"style\": \"new-york\",\n    \"rsc\": false,\n    \"tsx\": true,\n    \"tailwind\": {\n      \"config\": \"tailwind.config.ts\",\n      \"css\": \"client/src/index.css\",\n      \"baseColor\": \"neutral\",\n      \"cssVariables\": true,\n      \"prefix\": \"\"\n    },\n    \"aliases\": {\n      \"components\": \"@/components\",\n      \"utils\": \"@/lib/utils\",\n      \"ui\": \"@/components/ui\",\n      \"lib\": \"@/lib\",\n      \"hooks\": \"@/hooks\"\n    }\n}"
  },
  {
    "path": "website/drizzle.config.ts",
    "content": "import { defineConfig } from \"drizzle-kit\";\n\nif (!process.env.DATABASE_URL) {\n  throw new Error(\"DATABASE_URL, ensure the database is provisioned\");\n}\n\nexport default defineConfig({\n  out: \"./migrations\",\n  schema: \"./shared/schema.ts\",\n  dialect: \"postgresql\",\n  dbCredentials: {\n    url: process.env.DATABASE_URL,\n  },\n});\n"
  },
  {
    "path": "website/index.en.html",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <title>🌐 OpenAI / Claude / DeepSeek API Provider Directory</title>\n  <meta name=\"description\" content=\"A curated list of third-party platforms providing OpenAI / Claude / DeepSeek APIs for learning, research, and non-commercial use.\">\n  <meta name=\"keywords\" content=\"OpenAI, Claude, DeepSeek, API, third-party, free, artificial intelligence, AI\">\n  <style>\n    * {\n      margin: 0;\n      padding: 0;\n      box-sizing: border-box;\n    }\n    \n    body {\n      font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", \"Roboto\", \"Helvetica Neue\", Arial, sans-serif;\n      line-height: 1.6;\n      color: #333;\n      background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n      min-height: 100vh;\n    }\n    \n    .container {\n      max-width: 1200px;\n      margin: 0 auto;\n      padding: 20px;\n    }\n    \n    header {\n      background: rgba(255, 255, 255, 0.95);\n      backdrop-filter: blur(10px);\n      border-radius: 15px;\n      padding: 30px;\n      margin-bottom: 30px;\n      box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1);\n      text-align: center;\n    }\n    \n    h1 {\n      font-size: 2.5em;\n      margin-bottom: 15px;\n      color: #667eea;\n      text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.1);\n    }\n    \n    .subtitle {\n      font-size: 1.2em;\n      color: #666;\n      margin-bottom: 20px;\n    }\n    \n    .badges {\n      display: flex;\n      gap: 10px;\n      justify-content: center;\n      flex-wrap: wrap;\n      margin: 20px 0;\n    }\n    \n    .badges img {\n      height: 20px;\n    }\n    \n    .lang-switcher {\n      display: flex;\n      gap: 10px;\n      justify-content: center;\n      margin-top: 20px;\n      flex-wrap: wrap;\n    }\n    \n    .lang-btn {\n      padding: 8px 16px;\n      background: #667eea;\n      color: white;\n      text-decoration: none;\n      border-radius: 20px;\n      font-size: 14px;\n      transition: all 0.3s;\n    }\n    \n    .lang-btn:hover {\n      background: #764ba2;\n      transform: translateY(-2px);\n      box-shadow: 0 5px 15px rgba(102, 126, 234, 0.3);\n    }\n    \n    .lang-btn.active {\n      background: #764ba2;\n    }\n    \n    .notice {\n      background: #fff3cd;\n      border-left: 4px solid #ffc107;\n      padding: 20px;\n      border-radius: 10px;\n      margin-bottom: 30px;\n    }\n    \n    .section {\n      background: rgba(255, 255, 255, 0.95);\n      backdrop-filter: blur(10px);\n      border-radius: 15px;\n      padding: 30px;\n      margin-bottom: 30px;\n      box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1);\n    }\n    \n    h2 {\n      font-size: 2em;\n      margin-bottom: 20px;\n      color: #667eea;\n      border-bottom: 3px solid #667eea;\n      padding-bottom: 10px;\n    }\n    \n    h3 {\n      font-size: 1.5em;\n      margin: 20px 0 10px;\n      color: #764ba2;\n    }\n    \n    .tags-legend {\n      display: grid;\n      grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\n      gap: 10px;\n      margin: 20px 0;\n    }\n    \n    .tag-item {\n      padding: 10px;\n      background: #f8f9fa;\n      border-radius: 8px;\n      border-left: 3px solid #667eea;\n    }\n    \n    .providers-table {\n      width: 100%;\n      border-collapse: collapse;\n      margin: 20px 0;\n      overflow-x: auto;\n      display: block;\n    }\n    \n    .providers-table table {\n      width: 100%;\n      min-width: 800px;\n    }\n    \n    .providers-table th,\n    .providers-table td {\n      padding: 12px;\n      text-align: left;\n      border-bottom: 1px solid #e0e0e0;\n    }\n    \n    .providers-table th {\n      background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n      color: white;\n      font-weight: 600;\n      position: sticky;\n      top: 0;\n    }\n    \n    .providers-table tr:hover {\n      background: #f5f5f5;\n    }\n    \n    .providers-table a {\n      color: #667eea;\n      text-decoration: none;\n      font-weight: 500;\n    }\n    \n    .providers-table a:hover {\n      text-decoration: underline;\n    }\n    \n    .apps-grid {\n      display: grid;\n      grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));\n      gap: 20px;\n      margin: 20px 0;\n    }\n    \n    .app-card {\n      padding: 20px;\n      background: #f8f9fa;\n      border-radius: 10px;\n      border-left: 4px solid #667eea;\n      transition: all 0.3s;\n    }\n    \n    .app-card:hover {\n      transform: translateY(-5px);\n      box-shadow: 0 5px 20px rgba(0, 0, 0, 0.1);\n    }\n    \n    .app-card h4 {\n      color: #667eea;\n      margin-bottom: 10px;\n    }\n    \n    .usage-steps {\n      counter-reset: step;\n      list-style: none;\n      padding: 0;\n    }\n    \n    .usage-steps li {\n      counter-increment: step;\n      padding: 15px;\n      margin: 10px 0;\n      background: #f8f9fa;\n      border-radius: 10px;\n      position: relative;\n      padding-left: 60px;\n    }\n    \n    .usage-steps li::before {\n      content: counter(step);\n      position: absolute;\n      left: 15px;\n      top: 50%;\n      transform: translateY(-50%);\n      background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n      color: white;\n      width: 35px;\n      height: 35px;\n      border-radius: 50%;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      font-weight: bold;\n    }\n    \n    footer {\n      background: rgba(255, 255, 255, 0.95);\n      backdrop-filter: blur(10px);\n      border-radius: 15px;\n      padding: 30px;\n      text-align: center;\n      margin-top: 30px;\n      box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1);\n    }\n    \n    .stats {\n      display: grid;\n      grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n      gap: 20px;\n      margin: 20px 0;\n    }\n    \n    .stat-card {\n      background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n      color: white;\n      padding: 25px;\n      border-radius: 10px;\n      text-align: center;\n    }\n    \n    .stat-number {\n      font-size: 3em;\n      font-weight: bold;\n      margin-bottom: 5px;\n    }\n    \n    .stat-label {\n      font-size: 1.1em;\n      opacity: 0.9;\n    }\n    \n    @media (max-width: 768px) {\n      h1 {\n        font-size: 1.8em;\n      }\n      \n      .providers-table {\n        font-size: 14px;\n      }\n      \n      .container {\n        padding: 10px;\n      }\n    }\n    \n    details {\n      margin: 20px 0;\n    }\n    \n    summary {\n      cursor: pointer;\n      padding: 15px;\n      background: #f8f9fa;\n      border-radius: 10px;\n      font-weight: 600;\n      color: #667eea;\n      user-select: none;\n    }\n    \n    summary:hover {\n      background: #e9ecef;\n    }\n    \n    details[open] summary {\n      margin-bottom: 15px;\n    }\n  </style>\n</head>\n<body>\n  <div class=\"container\">\n    <header>\n      <h1>🌐 OpenAI / Claude / DeepSeek API Provider</h1>\n      <p class=\"subtitle\">A curated list of third-party platforms providing</p>\n      <p class=\"subtitle\">OpenAI / Claude / DeepSeek APIs for learning, research, and non-commercial use</p>\n      \n      <div class=\"badges\">\n        <img src=\"https://img.shields.io/github/last-commit/TechnologyStar/Openai-Claude-Deepseek-API-provider\" alt=\"Last Commit\">\n        <img src=\"https://img.shields.io/github/license/TechnologyStar/Openai-Claude-Deepseek-API-provider\" alt=\"License\">\n      </div>\n      \n      <div class=\"lang-switcher\">\n        <a href=\"index.zh-CN.html\" class=\"lang-btn\">🇨🇳 中文</a>\n        <a href=\"index.en.html\" class=\"lang-btn active\">🇬🇧 English</a>\n        <a href=\"index.ru.html\" class=\"lang-btn\">🇷🇺 Русский</a>\n        <a href=\"index.fr.html\" class=\"lang-btn\">🇫🇷 Français</a>\n      </div>\n    </header>\n    \n    <div class=\"notice section\">\n      <h3>⚠️ Usage Notice</h3>\n      <p><strong>This is a free public service project. Any illegal use is strictly prohibited.</strong></p>\n      <ul style=\"margin-top: 10px; margin-left: 20px;\">\n        <li>Follow <a href=\"https://openai.com/policies/terms-of-use\" target=\"_blank\">OpenAI Terms of Use</a></li>\n        <li>Respect local laws and regulations regarding generative AI services</li>\n      </ul>\n    </div>\n    \n    <div class=\"section\">\n      <h2>🚀 Project Overview</h2>\n      <p>📌 A collection of verified third-party API providers (some offer free access)</p>\n      <p>🔧 No registration / Easy access / Multi-model support (OpenAI, Claude, DeepSeek, etc.)</p>\n      <p>🔐 Use caution: <strong>Do not enter sensitive personal data</strong> on any platform</p>\n      <p style=\"margin-top: 15px;\">💡 If you find this helpful, consider giving it a Star! ⭐</p>\n    </div>\n    \n    <div class=\"section\">\n      <h2>📊 Statistics</h2>\n      <div class=\"stats\">\n        <div class=\"stat-card\">\n          <div class=\"stat-number\">60+</div>\n          <div class=\"stat-label\">API Providers</div>\n        </div>\n        <div class=\"stat-card\">\n          <div class=\"stat-number\">20+</div>\n          <div class=\"stat-label\">Free Platforms</div>\n        </div>\n        <div class=\"stat-card\">\n          <div class=\"stat-number\">8</div>\n          <div class=\"stat-label\">Recommended Apps</div>\n        </div>\n      </div>\n    </div>\n    \n    <div class=\"section\">\n      <h2>🎁 Tag Legend</h2>\n      <div class=\"tags-legend\">\n        <div class=\"tag-item\">🆓 Completely Free</div>\n        <div class=\"tag-item\">🔓 Free Quota Available</div>\n        <div class=\"tag-item\">💰 Requires Payment</div>\n        <div class=\"tag-item\">💪 Supports Latest Claude</div>\n        <div class=\"tag-item\">✌ Supports Latest OpenAI</div>\n        <div class=\"tag-item\">🎉 Other Models (e.g., DeepSeek)</div>\n        <div class=\"tag-item\">🌎 International Network Required</div>\n        <div class=\"tag-item\">🎁 Bonus Credits/Discounts</div>\n        <div class=\"tag-item\">🚀 High Concurrency Support</div>\n        <div class=\"tag-item\">😆 Daily Check-in Rewards</div>\n        <div class=\"tag-item\">🚩 Verified Platform</div>\n        <div class=\"tag-item\">✔ Verified Authenticity</div>\n      </div>\n    </div>\n    \n    <div class=\"section\">\n      <h2>🌐 Third-Party API Providers</h2>\n      <div class=\"providers-table\">\n        <table>\n          <thead>\n            <tr>\n              <th>#</th>\n              <th>Platform</th>\n              <th>Link</th>\n              <th>Tags</th>\n              <th>Notes</th>\n            </tr>\n          </thead>\n          <tbody>\n            <tr><td>1</td><td>chat01 (Recommended)</td><td><a href=\"https://chat01.ai/?ref=j45ikbTa\" target=\"_blank\">https://chat01.ai</a></td><td>🔓✌🎁💰✔</td><td>Supports Pro, solves degradation issues, 2 free credits/day, chat + API</td></tr>\n            <tr><td>2</td><td>SiliconFlow (Enterprise)</td><td><a href=\"https://cloud.siliconflow.cn/i/ZKV30bdG\" target=\"_blank\">https://cloud.siliconflow.cn</a></td><td>🔓🎉🚀🚩✔</td><td>Huawei Cloud Ascend service, ¥14 registration bonus</td></tr>\n            <tr><td>3</td><td>zenmux (Recommended)</td><td><a href=\"https://zenmux.ai/invite/U1QU1H\" target=\"_blank\">https://zenmux.ai</a></td><td>🔓✌🎁💰</td><td>Free Gemini 3 Pro, world's first compensated LLM aggregation</td></tr>\n            <tr><td>4</td><td>PoloAPI</td><td><a href=\"https://poloai.top\" target=\"_blank\">https://poloai.top</a></td><td>🔓💪✌🎉🎁💰</td><td>New users get $0.3, aggregates Claude/Grok/OpenAI models</td></tr>\n            <tr><td>5</td><td>OAIPro</td><td><a href=\"https://api.oaipro.com\" target=\"_blank\">https://api.oaipro.com</a></td><td>💰✌💪</td><td>Official pricing, stable connection, OpenAI & Claude support</td></tr>\n            <tr><td>6</td><td>VoAPI</td><td><a href=\"https://demo.voapi.top\" target=\"_blank\">https://demo.voapi.top</a></td><td>🆓😆💪✌</td><td>Free public platform, balance resets daily</td></tr>\n            <tr><td>7</td><td>inscopilot (Recommended)</td><td><a href=\"https://instcopilot-api.com/register?aff=Q2Z0\" target=\"_blank\">https://instcopilot-api.com</a></td><td>✌🎉😆🚀</td><td>$5 bonus, stable & cheap, supports CC</td></tr>\n            <tr><td>8</td><td>V3 API (Mixed)</td><td><a href=\"https://api.v3.cm\" target=\"_blank\">https://api.v3.cm</a></td><td>🚀🔓💪🎁🎉✌</td><td>$0.2 bonus, high concurrency, 30% recharge, many models</td></tr>\n            <tr><td>9</td><td>V3 API (Official)</td><td><a href=\"https://gf.gpt.ge\" target=\"_blank\">https://gf.gpt.ge</a></td><td>🚀🌹🔓💪</td><td>$0.2 bonus, high concurrency, 60% recharge</td></tr>\n            <tr><td>10</td><td>openai-hk</td><td><a href=\"https://openai-hk.com\" target=\"_blank\">https://openai-hk.com</a></td><td>🆓🔓🎉✌💪🚀</td><td>¥1 bonus, ultra-high concurrency, includes GPT-3.5 free version</td></tr>\n            <tr><td>11</td><td>ChatGPT API Faucet</td><td><a href=\"https://faucet.openkey.cloud\" target=\"_blank\">https://faucet.openkey.cloud</a></td><td>🆓</td><td>Free $1 credit, valid for 3 days</td></tr>\n            <tr><td>12</td><td>Free ChatGPT API</td><td><a href=\"https://github.com/popjane/free_chatgpt_api\" target=\"_blank\">GitHub</a></td><td>🆓</td><td>Free public service</td></tr>\n            <tr><td>13</td><td>GPT-API-free</td><td><a href=\"https://github.com/chuyuewei/ChatGPT-API\" target=\"_blank\">GitHub</a></td><td>🆓💪</td><td>Supports GPT-4, 3 calls per day</td></tr>\n            <tr><td>14</td><td>openkey</td><td><a href=\"https://openkey.cloud\" target=\"_blank\">https://openkey.cloud</a></td><td>🔓💪✌🚀</td><td>$0.2 bonus, multi-concurrency support</td></tr>\n            <tr><td>15</td><td>gptgod.online</td><td><a href=\"https://gptgod.online\" target=\"_blank\">https://gptgod.online</a></td><td>💪✌🎁💰🎉😆</td><td>Pay-per-use, credit system</td></tr>\n            <tr><td>16</td><td>m3.ckit.gold</td><td><a href=\"https://m3.ckit.gold\" target=\"_blank\">https://m3.ckit.gold</a></td><td>💰💪✌</td><td>¥3 per dollar, $0.1 signup bonus</td></tr>\n            <tr><td>17</td><td>iaicnn</td><td><a href=\"https://aicnn.cn\" target=\"_blank\">https://aicnn.cn</a></td><td>💪✌🎁💰🎉</td><td>API support for legacy users, migrated</td></tr>\n            <tr><td>18</td><td>goapi.gptnb.ai</td><td><a href=\"https://goapi.gptnb.ai\" target=\"_blank\">https://goapi.gptnb.ai</a></td><td>💪✌🎁💰🎉</td><td></td></tr>\n            <tr><td>19</td><td>api.aigc369.com</td><td><a href=\"https://api.aigc369.com/pricing\" target=\"_blank\">https://api.aigc369.com</a></td><td>💪✌🎁💰🎉</td><td></td></tr>\n            <tr><td>20</td><td>api.mjdjourney.cn</td><td><a href=\"https://api.mjdjourney.cn\" target=\"_blank\">https://api.mjdjourney.cn</a></td><td>💪✌🎁💰🎉</td><td></td></tr>\n            <tr><td>21</td><td>api.bltcy.ai</td><td><a href=\"https://api.bltcy.ai\" target=\"_blank\">https://api.bltcy.ai</a></td><td>💪✌🎁💰🎉</td><td></td></tr>\n            <tr><td>22</td><td>4Z API Relay</td><td><a href=\"https://zzzzapi.com\" target=\"_blank\">https://zzzzapi.com</a></td><td>🔓✌💪🎉🚀</td><td>Supports GPT-4o, Claude 3.5, $0.2 for new users</td></tr>\n            <tr><td>23</td><td>Simple API Relay</td><td><a href=\"https://jeniya.top\" target=\"_blank\">https://jeniya.top</a></td><td>🔓✌💪🎉🚀</td><td>Multi-model aggregation, no restrictions, ¥100 test credit</td></tr>\n            <tr><td>24</td><td>CloseAI</td><td><a href=\"https://closeai-asia.com\" target=\"_blank\">https://closeai-asia.com</a></td><td>💰✌💪🎉🚀</td><td>Enterprise proxy, GPT-4o & Claude 3.5, Chinese support</td></tr>\n            <tr><td>25</td><td>Cloud Whale AI</td><td><a href=\"https://api.atalk-ai.com\" target=\"_blank\">https://api.atalk-ai.com</a></td><td>🔓✌💪🎉🚀</td><td>Aggregates ChatGPT, Claude, Wenxin, ¥5 trial voucher</td></tr>\n            <tr><td>26</td><td>ModelBridge</td><td><a href=\"https://model-bridge.okeeper.com\" target=\"_blank\">https://model-bridge.okeeper.com</a></td><td>🔓✌💪🎉🚀</td><td>Free domestic proxy, OpenAI compatible with Chinese models</td></tr>\n            <tr><td>27</td><td>UiUi API</td><td><a href=\"https://sg.uiuiapi.com\" target=\"_blank\">https://sg.uiuiapi.com</a></td><td>🔓✌💪🎉🚀</td><td>Supports Claude 4, Gemini, OpenAI format compatible</td></tr>\n            <tr><td>28</td><td>LaoZhang API Relay</td><td><a href=\"https://api.laozhang.ai\" target=\"_blank\">https://api.laozhang.ai</a></td><td>🔓✌💪🎉🚀</td><td>Claude 3 & GPT-4o, ¥20 for new users, Alipay/WeChat</td></tr>\n            <tr><td>29</td><td>Haiwhale AI Platform</td><td><a href=\"https://ai.atalk-ai.com\" target=\"_blank\">https://ai.atalk-ai.com</a></td><td>🔓✌💪🎉🚀</td><td>Registered platform, unified multi-model API access</td></tr>\n            <tr><td>30</td><td>One API</td><td><a href=\"https://one-api.ai\" target=\"_blank\">https://one-api.ai</a></td><td>🔓✌💪🎉🚀</td><td>Open-source interface management, multi-model & private deployment</td></tr>\n            <tr><td>31</td><td>OpenRouter</td><td><a href=\"https://openrouter.ai\" target=\"_blank\">https://openrouter.ai</a></td><td>🔓✌💪🎉🚀</td><td>293 models (OpenAI, Claude, Gemini), free quota provided</td></tr>\n            <tr><td>32</td><td>Gemini API Proxy</td><td><a href=\"https://gemini-proxy.com\" target=\"_blank\">https://gemini-proxy.com</a></td><td>🔓✌🎉🚀</td><td>Google Gemini models, OpenAI compatible, free quota</td></tr>\n            <tr><td>33</td><td>DeepSeek API Aggregation</td><td><a href=\"https://deepseek-aggregator.com\" target=\"_blank\">https://deepseek-aggregator.com</a></td><td>🔓💪🎉🚀</td><td>DeepSeek series aggregation, free test quota</td></tr>\n            <tr><td>34</td><td>Hugging Face Inference</td><td><a href=\"https://huggingface.co/inference-api\" target=\"_blank\">https://huggingface.co/inference-api</a></td><td>🔓💪🎉🚀</td><td>Open-source models (Llama 3), free & enterprise tiers</td></tr>\n            <tr><td>35</td><td>AI21 Labs Official</td><td><a href=\"https://studio.ai21.com\" target=\"_blank\">https://studio.ai21.com</a></td><td>💰✌💪🎉</td><td>Jurassic-2 models, NLP tasks</td></tr>\n            <tr><td>36</td><td>Cohere API</td><td><a href=\"https://cohere.ai\" target=\"_blank\">https://cohere.ai</a></td><td>💰✌💪🎉</td><td>Text generation & classification, enterprise API</td></tr>\n            <tr><td>37</td><td>AI API Aggregator</td><td><a href=\"https://api.ai-aggregator.com\" target=\"_blank\">https://api.ai-aggregator.com</a></td><td>🔓✌💪🎉🚀</td><td>Multi-model aggregation, unified interface, load balancing</td></tr>\n            <tr><td>38</td><td>AI.LS</td><td><a href=\"https://ai.ls\" target=\"_blank\">https://ai.ls</a></td><td>🆓✌</td><td>Minimal interface, GPT-3.5 free anonymous use</td></tr>\n            <tr><td>39</td><td>Simple API</td><td><a href=\"https://jeniya.top\" target=\"_blank\">https://jeniya.top</a></td><td>🔓✌💪🎉🎁</td><td>¥100 signup credit, Claude/GPT-4o support</td></tr>\n            <tr><td>40</td><td>OpenAI120</td><td><a href=\"https://openai120.com\" target=\"_blank\">https://openai120.com</a></td><td>🔓✌🎁</td><td>$3 for new users, official pricing</td></tr>\n            <tr><td>41</td><td>DuckAGI</td><td><a href=\"https://duckagi.com\" target=\"_blank\">https://duckagi.com</a></td><td>💰✌🎉🚀</td><td>Multimodal GPT-4o/Sora, AI art generation</td></tr>\n            <tr><td>42</td><td>Aihubmix</td><td><a href=\"https://aihubmix.com\" target=\"_blank\">https://aihubmix.com</a></td><td>💰🎉</td><td>Chinese model aggregation (Wenxin/Tongyi)</td></tr>\n            <tr><td>43</td><td>WokaAI</td><td><a href=\"https://wokaai.com\" target=\"_blank\">https://wokaai.com</a></td><td>✌</td><td>Dual routes</td></tr>\n            <tr><td>44</td><td>azapi</td><td><a href=\"https://azapi.com.cn\" target=\"_blank\">https://azapi.com.cn</a></td><td>💰</td><td>Long-term user discounts</td></tr>\n            <tr><td>45</td><td>ClaudeAPI</td><td><a href=\"https://claudeapi.io\" target=\"_blank\">https://claudeapi.io</a></td><td>💪🚀✔</td><td>Anthropic official partnership, file parsing support</td></tr>\n            <tr><td>46</td><td>Gala API</td><td><a href=\"https://galaapi.com\" target=\"_blank\">https://galaapi.com</a></td><td>🎉🚀</td><td>Google Gemini dedicated high-speed channel</td></tr>\n            <tr><td>47</td><td>Google AI Studio</td><td><a href=\"https://ai.google.dev\" target=\"_blank\">https://ai.google.dev</a></td><td>🆓🌎✔</td><td>Gemini series completely free, VPN required</td></tr>\n            <tr><td>48</td><td>OpenAI Data Sharing</td><td><a href=\"https://platform.openai.com\" target=\"_blank\">https://platform.openai.com</a></td><td>🔓✌🌎</td><td>Up to 1M free tokens daily with data sharing enabled</td></tr>\n            <tr><td>49</td><td>Mistral AI Platform</td><td><a href=\"https://platform.mistral.ai\" target=\"_blank\">https://platform.mistral.ai</a></td><td>🔓🎉🌎</td><td>Official platform free API trial (rate limited)</td></tr>\n            <tr><td>50</td><td>Cohere</td><td><a href=\"https://cohere.com\" target=\"_blank\">https://cohere.com</a></td><td>🔓🎉🌎</td><td>Trial key on registration, free with rate limits</td></tr>\n            <tr><td>51</td><td>ModelScope</td><td><a href=\"https://modelscope.cn\" target=\"_blank\">https://modelscope.cn</a></td><td>🔓🎉🚩</td><td>Aggregates DeepSeek/Qwen, free model trial & download</td></tr>\n            <tr><td>52</td><td>ByteDance Ark Plan</td><td><a href=\"https://www.volcengine.com/product/ark\" target=\"_blank\">https://www.volcengine.com/product/ark</a></td><td>🔓🎉</td><td>500K tokens daily per model in collaboration plan</td></tr>\n            <tr><td>53</td><td>Zhipu BigModel</td><td><a href=\"https://open.bigmodel.cn\" target=\"_blank\">https://open.bigmodel.cn</a></td><td>🆓🎉</td><td>GLM-4-Flash API completely free, 128K context</td></tr>\n            <tr><td>54</td><td>InternLM</td><td><a href=\"https://internlm.intern-ai.org.cn\" target=\"_blank\">https://internlm.intern-ai.org.cn</a></td><td>🆓🎉</td><td>Official free API, direct access</td></tr>\n            <tr><td>55</td><td>GitHub Models</td><td><a href=\"https://docs.github.com/github-models\" target=\"_blank\">https://docs.github.com/github-models</a></td><td>🔓✌🎉🌎</td><td>Azure-hosted, limited free API quota</td></tr>\n            <tr><td>56</td><td>OpenRouter (Free)</td><td><a href=\"https://openrouter.ai\" target=\"_blank\">https://openrouter.ai</a></td><td>🔓💪✌🎉🌎✔</td><td>Free models ≤50 daily, ≥$10 balance upgrades to 1000</td></tr>\n            <tr><td>57</td><td>Chutes</td><td><a href=\"https://chutes.ai\" target=\"_blank\">https://chutes.ai</a></td><td>🔓🎉</td><td>Some models 200 free calls daily, DeepSeek support</td></tr>\n            <tr><td>58</td><td>Groq Cloud</td><td><a href=\"https://groq.com/groqcloud\" target=\"_blank\">https://groq.com/groqcloud</a></td><td>🔓🎉🌎</td><td>Free API key available, OpenAI compatible, ultra-fast inference</td></tr>\n            <tr><td>59</td><td>Cerebras Inference</td><td><a href=\"https://inference.cerebras.ai\" target=\"_blank\">https://inference.cerebras.ai</a></td><td>🔓🎉🌎🚀</td><td>Developers enjoy 1M free tokens daily, LLM inference 450+ t/s</td></tr>\n            <tr><td>60</td><td>Infini-AI GenStudio</td><td><a href=\"https://cloud.infini-ai.com/genstudio\" target=\"_blank\">https://cloud.infini-ai.com/genstudio</a></td><td>🆓🎉</td><td>DeepSeek R1/V3 full version free tokens, no invite code needed</td></tr>\n          </tbody>\n        </table>\n      </div>\n    </div>\n    \n    <div class=\"section\">\n      <h2>📱 Compatible Applications</h2>\n      <details>\n        <summary>📦 Click to view compatible apps</summary>\n        <div class=\"apps-grid\">\n          <div class=\"app-card\">\n            <h4>✅ <a href=\"https://github.com/CherryHQ/cherry-studio\" target=\"_blank\">Cherry Studio</a></h4>\n            <p>Cross-platform desktop/mobile client with cloud and local AI model integration.</p>\n          </div>\n          <div class=\"app-card\">\n            <h4>✅ <a href=\"https://u.tools/plugins/detail/ChatGPT.%E5%A5%BD%E5%8F%8B/\" target=\"_blank\">ChatGPT Friends Plugin (uTools)</a></h4>\n            <p>Desktop AI chat tool supporting custom roles, multi-model, multi-session.</p>\n          </div>\n          <div class=\"app-card\">\n            <h4>✅ <a href=\"https://github.com/Yidadaa/ChatGPT-Next-Web\" target=\"_blank\">ChatGPT-Next-Web</a></h4>\n            <p>Open-source web front-end supporting API key and multi-user use.</p>\n          </div>\n          <div class=\"app-card\">\n            <h4>✅ <a href=\"https://github.com/lobehub/lobe-chat\" target=\"_blank\">LobeChat</a></h4>\n            <p>Web-based AI chat framework supporting vision, speech, and multi-model interaction.</p>\n          </div>\n          <div class=\"app-card\">\n            <h4>✅ <a href=\"https://botgem.com/\" target=\"_blank\">BotGem</a></h4>\n            <p>Mobile-first chat assistant with voice and AI friends.</p>\n          </div>\n          <div class=\"app-card\">\n            <h4>✅ <a href=\"https://github.com/Bin-Huang/chatbox\" target=\"_blank\">ChatBox</a></h4>\n            <p>Multi-platform AI chat client with a modern interface.</p>\n          </div>\n          <div class=\"app-card\">\n            <h4>✅ <a href=\"https://github.com/labring/FastGPT\" target=\"_blank\">FastGPT</a></h4>\n            <p>Knowledge base + visual workflow for internal training or customer service.</p>\n          </div>\n          <div class=\"app-card\">\n            <h4>✅ <a href=\"https://github.com/Mintplex-Labs/anything-llm\" target=\"_blank\">AnythingLLM</a></h4>\n            <p>Privacy-focused local LLM deployment with plugin support.</p>\n          </div>\n        </div>\n      </details>\n    </div>\n    \n    <div class=\"section\">\n      <h2>📖 How to Use</h2>\n      <ol class=\"usage-steps\">\n        <li>🔑 <strong>Get API Key</strong>: Register on the target platform and find it in your dashboard</li>\n        <li>⚙ <strong>Set Endpoint</strong>: Add API URL into the supported app</li>\n        <li>🤖 <strong>Choose Model</strong>: Pick the model based on platform support</li>\n        <li>📊 <strong>Monitor Usage</strong>: Use in-app limits to track API usage</li>\n      </ol>\n    </div>\n    \n    <div class=\"section\">\n      <h2>🙌 Contribution Guide</h2>\n      <p>We welcome:</p>\n      <ul style=\"margin-left: 20px; margin-top: 10px;\">\n        <li>✨ New API platforms (must be stable ≥ 3 days)</li>\n        <li>🛠️ Usage tutorials (screenshots, screen recordings)</li>\n        <li>🧪 Automated scripts (detect dead platforms)</li>\n        <li>🌍 Translations (English, Japanese, Korean, etc.)</li>\n      </ul>\n      <p style=\"margin-top: 15px;\">💡 PRs and issues are welcome!</p>\n    </div>\n    \n    <div class=\"section\">\n      <h2>❌ Inactive Platforms</h2>\n      <details>\n        <summary>📛 Click to expand</summary>\n        <table style=\"width: 100%; margin-top: 15px;\">\n          <thead>\n            <tr>\n              <th>#</th>\n              <th>Name</th>\n              <th>Link</th>\n              <th>Status</th>\n            </tr>\n          </thead>\n          <tbody>\n            <tr>\n              <td>1</td>\n              <td>464888</td>\n              <td><a href=\"https://api.464888.xyz\" target=\"_blank\">api.464888.xyz</a></td>\n              <td>❌ Unavailable</td>\n            </tr>\n          </tbody>\n        </table>\n        <p style=\"margin-top: 10px;\">💡 Found an inactive platform? Submit an issue!</p>\n      </details>\n    </div>\n    \n    <div class=\"section\">\n      <h2>⚖️ Disclaimer</h2>\n      <ul style=\"margin-left: 20px;\">\n        <li>We do not store API keys or provide proxy services.</li>\n        <li>All platforms listed are from the public internet.</li>\n        <li>Use at your own risk. We are not liable for any losses.</li>\n      </ul>\n    </div>\n    \n    <div class=\"section\">\n      <h2>🙏 Special Thanks</h2>\n      <p>Many thanks to <strong>zenmux</strong> for providing API platform support!<br>\n      <a href=\"https://zenmux.ai/invite/U1QU1H\" target=\"_blank\">Register now and use invite code</a></p>\n      \n      <p style=\"margin-top: 15px;\">Many thanks to <strong>chat01</strong> for providing service support!<br>\n      <a href=\"https://chat01.ai/?ref=j45ikbTa\" target=\"_blank\">Visit chat01 and use referral code</a></p>\n      \n      <p style=\"margin-top: 15px;\">\n        <a href=\"https://dartnode.com\" target=\"_blank\">\n          <img src=\"https://dartnode.com/branding/DN-Open-Source-sm.png\" alt=\"Powered by DartNode\">\n        </a>\n      </p>\n    </div>\n    \n    <footer>\n      <p style=\"margin-bottom: 15px;\">\n        <a href=\"https://star-history.com/#TechnologyStar/Openai-Claude-Deepseek-API-provider&Date\" target=\"_blank\">\n          <img src=\"https://api.star-history.com/svg?repos=TechnologyStar/Openai-Claude-Deepseek-API-provider&type=Date\" alt=\"Star History\" style=\"max-width: 100%; height: auto;\">\n        </a>\n      </p>\n      <p>Made with ❤️ by <a href=\"https://github.com/TechnologyStar\" target=\"_blank\">TechnologyStar</a></p>\n      <p style=\"margin-top: 10px; font-size: 0.9em; color: #666;\">\n        <a href=\"https://github.com/TechnologyStar/Openai-Claude-Deepseek-API-provider\" target=\"_blank\">GitHub Repository</a>\n      </p>\n    </footer>\n  </div>\n</body>\n</html>\n"
  },
  {
    "path": "website/index.fr.html",
    "content": "<!DOCTYPE html>\n<html lang=\"fr\">\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <title>🌐 OpenAI / Claude / DeepSeek API Provider - Répertoire</title>\n  <meta name=\"description\" content=\"Liste sélectionnée de plateformes tierces fournissant les API OpenAI / Claude / DeepSeek pour l'apprentissage, la recherche et un usage non commercial.\">\n  <meta name=\"keywords\" content=\"OpenAI, Claude, DeepSeek, API, tiers, gratuit, intelligence artificielle, IA\">\n  <style>\n    * {\n      margin: 0;\n      padding: 0;\n      box-sizing: border-box;\n    }\n    body {\n      font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Helvetica Neue', Arial, sans-serif;\n      line-height: 1.6;\n      color: #333;\n      background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n      min-height: 100vh;\n    }\n    .container {\n      max-width: 1200px;\n      margin: 0 auto;\n      padding: 20px;\n    }\n    header {\n      background: rgba(255, 255, 255, 0.95);\n      backdrop-filter: blur(10px);\n      border-radius: 15px;\n      padding: 30px;\n      margin-bottom: 30px;\n      box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1);\n      text-align: center;\n    }\n    h1 {\n      font-size: 2.5em;\n      margin-bottom: 15px;\n      color: #667eea;\n      text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.1);\n    }\n    .subtitle {\n      font-size: 1.2em;\n      color: #666;\n      margin-bottom: 20px;\n    }\n    .badges {\n      display: flex;\n      gap: 10px;\n      justify-content: center;\n      flex-wrap: wrap;\n      margin: 20px 0;\n    }\n    .badges img {\n      height: 20px;\n    }\n    .lang-switcher {\n      display: flex;\n      gap: 10px;\n      justify-content: center;\n      flex-wrap: wrap;\n      margin-top: 20px;\n    }\n    .lang-btn {\n      padding: 8px 16px;\n      background: #667eea;\n      color: #fff;\n      text-decoration: none;\n      border-radius: 20px;\n      font-size: 14px;\n      transition: all 0.3s;\n    }\n    .lang-btn:hover {\n      background: #764ba2;\n      transform: translateY(-2px);\n      box-shadow: 0 5px 15px rgba(102, 126, 234, 0.3);\n    }\n    .lang-btn.active {\n      background: #764ba2;\n    }\n    .section {\n      background: rgba(255, 255, 255, 0.95);\n      backdrop-filter: blur(10px);\n      border-radius: 15px;\n      padding: 30px;\n      margin-bottom: 30px;\n      box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1);\n    }\n    .notice {\n      background: #fff3cd;\n      border-left: 4px solid #ffc107;\n      border-radius: 10px;\n    }\n    h2 {\n      font-size: 2em;\n      margin-bottom: 20px;\n      color: #667eea;\n      border-bottom: 3px solid #667eea;\n      padding-bottom: 10px;\n    }\n    h3 {\n      font-size: 1.5em;\n      margin: 20px 0 10px;\n      color: #764ba2;\n    }\n    .tags-legend {\n      display: grid;\n      grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\n      gap: 10px;\n      margin: 20px 0;\n    }\n    .tag-item {\n      padding: 10px;\n      background: #f8f9fa;\n      border-radius: 8px;\n      border-left: 3px solid #667eea;\n    }\n    .stats {\n      display: grid;\n      grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n      gap: 20px;\n      margin: 20px 0;\n    }\n    .stat-card {\n      background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n      color: #fff;\n      padding: 25px;\n      border-radius: 12px;\n      text-align: center;\n    }\n    .stat-number {\n      font-size: 3em;\n      font-weight: 700;\n      margin-bottom: 5px;\n    }\n    .stat-label {\n      font-size: 1.1em;\n      opacity: 0.9;\n    }\n    .providers-table {\n      width: 100%;\n      border-collapse: collapse;\n      margin: 20px 0;\n      overflow-x: auto;\n      display: block;\n    }\n    .providers-table table {\n      width: 100%;\n      min-width: 900px;\n    }\n    .providers-table th,\n    .providers-table td {\n      padding: 12px;\n      border-bottom: 1px solid #e0e0e0;\n      text-align: left;\n    }\n    .providers-table th {\n      background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n      color: #fff;\n      font-weight: 600;\n      position: sticky;\n      top: 0;\n    }\n    .providers-table tr:hover {\n      background: #f5f5f5;\n    }\n    .providers-table a {\n      color: #667eea;\n      text-decoration: none;\n      font-weight: 500;\n    }\n    .providers-table a:hover {\n      text-decoration: underline;\n    }\n    .apps-grid {\n      display: grid;\n      grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));\n      gap: 20px;\n      margin: 20px 0;\n    }\n    .app-card {\n      padding: 20px;\n      background: #f8f9fa;\n      border-radius: 12px;\n      border-left: 4px solid #667eea;\n      transition: transform 0.2s ease, box-shadow 0.2s ease;\n    }\n    .app-card:hover {\n      transform: translateY(-4px);\n      box-shadow: 0 8px 20px rgba(0,0,0,0.12);\n    }\n    .app-card h4 {\n      color: #667eea;\n      margin-bottom: 8px;\n    }\n    .usage-steps {\n      counter-reset: step;\n      list-style: none;\n      padding: 0;\n    }\n    .usage-steps li {\n      counter-increment: step;\n      padding: 15px 15px 15px 60px;\n      margin: 10px 0;\n      background: #f8f9fa;\n      border-radius: 12px;\n      position: relative;\n    }\n    .usage-steps li::before {\n      content: counter(step);\n      position: absolute;\n      left: 15px;\n      top: 50%;\n      transform: translateY(-50%);\n      background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n      color: #fff;\n      width: 35px;\n      height: 35px;\n      border-radius: 50%;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      font-weight: 600;\n    }\n    details {\n      margin: 20px 0;\n    }\n    summary {\n      cursor: pointer;\n      padding: 15px;\n      background: #f8f9fa;\n      border-radius: 10px;\n      font-weight: 600;\n      color: #667eea;\n      user-select: none;\n    }\n    summary:hover {\n      background: #e9ecef;\n    }\n    footer {\n      background: rgba(255, 255, 255, 0.95);\n      border-radius: 15px;\n      padding: 30px;\n      text-align: center;\n      box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1);\n      margin-bottom: 20px;\n    }\n    footer a {\n      color: #667eea;\n      text-decoration: none;\n    }\n    footer a:hover {\n      text-decoration: underline;\n    }\n    @media (max-width: 768px) {\n      h1 {\n        font-size: 1.8em;\n      }\n      .providers-table {\n        font-size: 0.9em;\n      }\n      .container {\n        padding: 12px;\n      }\n    }\n  </style>\n</head>\n<body>\n  <div class=\"container\">\n    <header>\n      <h1>🌐 OpenAI / Claude / DeepSeek API Provider</h1>\n      <p class=\"subtitle\">Répertoire mondial des plateformes tierces offrant des API OpenAI / Claude / DeepSeek</p>\n      <p class=\"subtitle\">Pour l'apprentissage, la recherche et tout usage non commercial</p>\n      <div class=\"badges\">\n        <img src=\"https://img.shields.io/github/last-commit/TechnologyStar/Openai-Claude-Deepseek-API-provider\" alt=\"Dernier commit\">\n        <img src=\"https://img.shields.io/github/license/TechnologyStar/Openai-Claude-Deepseek-API-provider\" alt=\"Licence\">\n      </div>\n      <div class=\"lang-switcher\">\n        <a href=\"index.zh-CN.html\" class=\"lang-btn\">🇨🇳 中文</a>\n        <a href=\"index.en.html\" class=\"lang-btn\">🇬🇧 English</a>\n        <a href=\"index.ru.html\" class=\"lang-btn\">🇷🇺 Русский</a>\n        <a href=\"index.fr.html\" class=\"lang-btn active\">🇫🇷 Français</a>\n      </div>\n    </header>\n\n    <section class=\"section notice\">\n      <h3>⚠️ Instructions d'utilisation</h3>\n      <p><strong>Ce projet est gratuit et à but non lucratif. Toute utilisation illégale est strictement interdite.</strong></p>\n      <ul style=\"margin-top: 10px; margin-left: 20px;\">\n        <li>Respectez les <a href=\"https://openai.com/policies/terms-of-use\" target=\"_blank\">conditions d'utilisation d'OpenAI</a></li>\n        <li>Respectez les lois locales concernant la fourniture de services d'IA générative</li>\n      </ul>\n    </section>\n\n    <section class=\"section\">\n      <h2>🚀 Présentation du projet</h2>\n      <p>📌 Répertorie et vérifie les principales plateformes API (plusieurs gratuites)</p>\n      <p>🔧 Intégration sans inscription, connexion simple, support multi-modèles (OpenAI, Claude, DeepSeek, etc.)</p>\n      <p>🔒 Ces sites sont listés à titre d'information — <strong>n'entrez jamais de données sensibles</strong></p>\n      <p style=\"margin-top: 15px;\">💡 Si le projet vous aide, laissez une étoile 🌟</p>\n    </section>\n\n    <section class=\"section\">\n      <h2>📊 Statistiques</h2>\n      <div class=\"stats\">\n        <div class=\"stat-card\">\n          <div class=\"stat-number\">60+</div>\n          <div class=\"stat-label\">Fournisseurs API</div>\n        </div>\n        <div class=\"stat-card\">\n          <div class=\"stat-number\">20+</div>\n          <div class=\"stat-label\">Plateformes gratuites</div>\n        </div>\n        <div class=\"stat-card\">\n          <div class=\"stat-number\">8</div>\n          <div class=\"stat-label\">Applications recommandées</div>\n        </div>\n      </div>\n    </section>\n\n    <section class=\"section\">\n      <h2>🎁 Légende des étiquettes</h2>\n      <div class=\"tags-legend\">\n        <div class=\"tag-item\">🆓 Entièrement gratuit</div>\n        <div class=\"tag-item\">🔓 Crédit gratuit disponible</div>\n        <div class=\"tag-item\">💰 Paiement requis</div>\n        <div class=\"tag-item\">💪 Support des derniers modèles Claude</div>\n        <div class=\"tag-item\">✌ Support des derniers modèles OpenAI</div>\n        <div class=\"tag-item\">🎉 Autres modèles (ex. DeepSeek)</div>\n        <div class=\"tag-item\">🌎 Accès international requis</div>\n        <div class=\"tag-item\">🎁 Bonus ou remises à la recharge</div>\n        <div class=\"tag-item\">🚀 Haute concurrence supportée</div>\n        <div class=\"tag-item\">😆 Récompense quotidienne</div>\n        <div class=\"tag-item\">🚩 Plateforme enregistrée</div>\n        <div class=\"tag-item\">✔ Authenticité vérifiée</div>\n      </div>\n    </section>\n\n    <section class=\"section\" id=\"providers\">\n      <h2>🌐 Fournisseurs d’API tiers</h2>\n      <div class=\"providers-table\">\n        <table>\n          <thead>\n            <tr>\n              <th>#</th>\n              <th>Plateforme</th>\n              <th>Lien</th>\n              <th>Étiquettes</th>\n              <th>Remarques</th>\n            </tr>\n          </thead>\n          <tbody>\n            <tr><td>1</td><td>chat01 (recommandé)</td><td><a href=\"https://chat01.ai/?ref=j45ikbTa\" target=\"_blank\">https://chat01.ai</a></td><td>🔓✌🎁💰✔</td><td>Supporte les comptes Pro, corrige les dégradations, 2 crédits gratuits/jour, chat + API</td></tr>\n            <tr><td>2</td><td>SiliconFlow (entreprise)</td><td><a href=\"https://cloud.siliconflow.cn/i/ZKV30bdG\" target=\"_blank\">https://cloud.siliconflow.cn</a></td><td>🔓🎉🚀🚩✔</td><td>Service Huawei Cloud Ascend, 14 ¥ offerts à l'inscription</td></tr>\n            <tr><td>3</td><td>zenmux (recommandé)</td><td><a href=\"https://zenmux.ai/invite/U1QU1H\" target=\"_blank\">https://zenmux.ai</a></td><td>🔓✌🎁💰</td><td>Gemini 3 Pro gratuit, premier agrégateur LLM avec compensation</td></tr>\n            <tr><td>4</td><td>PoloAPI</td><td><a href=\"https://poloai.top\" target=\"_blank\">https://poloai.top</a></td><td>🔓💪✌🎉🎁💰</td><td>$0,3 offerts aux nouveaux utilisateurs, agrège Claude/Grok/OpenAI</td></tr>\n            <tr><td>5</td><td>OAIPro</td><td><a href=\"https://api.oaipro.com\" target=\"_blank\">https://api.oaipro.com</a></td><td>💰✌💪</td><td>Tarifs officiels, connexion stable, support OpenAI & Claude</td></tr>\n            <tr><td>6</td><td>VoAPI</td><td><a href=\"https://demo.voapi.top\" target=\"_blank\">https://demo.voapi.top</a></td><td>🆓😆💪✌</td><td>Site public gratuit, solde remis à zéro chaque jour</td></tr>\n            <tr><td>7</td><td>inscopilot (recommandé)</td><td><a href=\"https://instcopilot-api.com/register?aff=Q2Z0\" target=\"_blank\">https://instcopilot-api.com</a></td><td>✌🎉😆🚀</td><td>$5 offerts, stable et économique, supporte les cartes internationales</td></tr>\n            <tr><td>8</td><td>V3 API (mixte)</td><td><a href=\"https://api.v3.cm\" target=\"_blank\">https://api.v3.cm</a></td><td>🚀🔓💪🎁🎉✌</td><td>$0,2 offerts, haute concurrence, recharge à -70 %, nombreux modèles</td></tr>\n            <tr><td>9</td><td>V3 API (officiel)</td><td><a href=\"https://gf.gpt.ge\" target=\"_blank\">https://gf.gpt.ge</a></td><td>🚀🌹🔓💪</td><td>$0,2 offerts, haute concurrence, recharge à -40 %</td></tr>\n            <tr><td>10</td><td>openai-hk</td><td><a href=\"https://openai-hk.com\" target=\"_blank\">https://openai-hk.com</a></td><td>🆓🔓🎉✌💪🚀</td><td>1 ¥ offert, très haute concurrence, inclut GPT-3.5 communautaire</td></tr>\n            <tr><td>11</td><td>ChatGPT API Faucet</td><td><a href=\"https://faucet.openkey.cloud\" target=\"_blank\">https://faucet.openkey.cloud</a></td><td>🆓</td><td>1 $ de crédit gratuit, valable 3 jours</td></tr>\n            <tr><td>12</td><td>API caritative ChatGPT</td><td><a href=\"https://github.com/popjane/free_chatgpt_api\" target=\"_blank\">GitHub</a></td><td>🆓</td><td>Projet open source gratuit</td></tr>\n            <tr><td>13</td><td>GPT-API-free</td><td><a href=\"https://github.com/chuyuewei/ChatGPT-API\" target=\"_blank\">GitHub</a></td><td>🆓💪</td><td>Supporte GPT-4, 3 requêtes par jour</td></tr>\n            <tr><td>14</td><td>openkey</td><td><a href=\"https://openkey.cloud\" target=\"_blank\">https://openkey.cloud</a></td><td>🔓💪✌🚀</td><td>$0,2 offerts, support multi-thread</td></tr>\n            <tr><td>15</td><td>gptgod.online</td><td><a href=\"https://gptgod.online\" target=\"_blank\">https://gptgod.online</a></td><td>💪✌🎁💰🎉😆</td><td>Paiement à l'usage, système de crédits</td></tr>\n            <tr><td>16</td><td>m3.ckit.gold</td><td><a href=\"https://m3.ckit.gold\" target=\"_blank\">https://m3.ckit.gold</a></td><td>💰💪✌</td><td>3 ¥ pour 1 $, bonus d'inscription $0,1</td></tr>\n            <tr><td>17</td><td>iaicnn</td><td><a href=\"https://aicnn.cn\" target=\"_blank\">https://aicnn.cn</a></td><td>💪✌🎁💰🎉</td><td>Support API pour anciens utilisateurs, nouvelle infrastructure</td></tr>\n            <tr><td>18</td><td>goapi.gptnb.ai</td><td><a href=\"https://goapi.gptnb.ai\" target=\"_blank\">https://goapi.gptnb.ai</a></td><td>💪✌🎁💰🎉</td><td>Passerelle multi-modèles axée sur GPT</td></tr>\n            <tr><td>19</td><td>api.aigc369.com</td><td><a href=\"https://api.aigc369.com/pricing\" target=\"_blank\">https://api.aigc369.com</a></td><td>💪✌🎁💰🎉</td><td>Tarifs flexibles, compatibilité OpenAI</td></tr>\n            <tr><td>20</td><td>api.mjdjourney.cn</td><td><a href=\"https://api.mjdjourney.cn\" target=\"_blank\">https://api.mjdjourney.cn</a></td><td>💪✌🎁💰🎉</td><td>Interface spécialisée pour Midjourney/GPT</td></tr>\n            <tr><td>21</td><td>api.bltcy.ai</td><td><a href=\"https://api.bltcy.ai\" target=\"_blank\">https://api.bltcy.ai</a></td><td>💪✌🎁💰🎉</td><td>Pont OpenAI/Claude, facturation flexible</td></tr>\n            <tr><td>22</td><td>4Z API Relay</td><td><a href=\"https://zzzzapi.com\" target=\"_blank\">https://zzzzapi.com</a></td><td>🔓✌💪🎉🚀</td><td>Supporte GPT-4o et Claude 3.5, bonus 0,2 pour les nouveaux comptes</td></tr>\n            <tr><td>23</td><td>Simple API Relay</td><td><a href=\"https://jeniya.top\" target=\"_blank\">https://jeniya.top</a></td><td>🔓✌💪🎉🚀</td><td>Multi-modèles, accès domestique illimité, 100 ¥ de tests</td></tr>\n            <tr><td>24</td><td>CloseAI</td><td><a href=\"https://closeai-asia.com\" target=\"_blank\">https://closeai-asia.com</a></td><td>💰✌💪🎉🚀</td><td>Proxy entreprise, GPT-4o/Claude 3.5, support technique chinois</td></tr>\n            <tr><td>25</td><td>Cloud Whale AI</td><td><a href=\"https://api.atalk-ai.com\" target=\"_blank\">https://api.atalk-ai.com</a></td><td>🔓✌💪🎉🚀</td><td>Unifie ChatGPT, Claude, Wenxin, bon d'essai 5 ¥</td></tr>\n            <tr><td>26</td><td>ModelBridge</td><td><a href=\"https://model-bridge.okeeper.com\" target=\"_blank\">https://model-bridge.okeeper.com</a></td><td>🔓✌💪🎉🚀</td><td>Proxy gratuit, compatible OpenAI et modèles chinois</td></tr>\n            <tr><td>27</td><td>UiUi API</td><td><a href=\"https://sg.uiuiapi.com\" target=\"_blank\">https://sg.uiuiapi.com</a></td><td>🔓✌💪🎉🚀</td><td>Claude 4, Gemini, format OpenAI compatible</td></tr>\n            <tr><td>28</td><td>LaoZhang API</td><td><a href=\"https://api.laozhang.ai\" target=\"_blank\">https://api.laozhang.ai</a></td><td>🔓✌💪🎉🚀</td><td>Supporte Claude 3/GPT-4o, 20 ¥ offerts, paiement local</td></tr>\n            <tr><td>29</td><td>Haiwhale AI</td><td><a href=\"https://ai.atalk-ai.com\" target=\"_blank\">https://ai.atalk-ai.com</a></td><td>🔓✌💪🎉🚀</td><td>Plateforme enregistrée, accès API unifié multi-modèles</td></tr>\n            <tr><td>30</td><td>One API</td><td><a href=\"https://one-api.ai\" target=\"_blank\">https://one-api.ai</a></td><td>🔓✌💪🎉🚀</td><td>Gestion open source des clés API, support du déploiement privé</td></tr>\n            <tr><td>31</td><td>OpenRouter</td><td><a href=\"https://openrouter.ai\" target=\"_blank\">https://openrouter.ai</a></td><td>🔓✌💪🎉🚀</td><td>293 modèles (OpenAI, Claude, Gemini), quota gratuit fourni</td></tr>\n            <tr><td>32</td><td>Gemini API Proxy</td><td><a href=\"https://gemini-proxy.com\" target=\"_blank\">https://gemini-proxy.com</a></td><td>🔓✌🎉🚀</td><td>Proxy dédié Google Gemini, compatible OpenAI, crédits offerts</td></tr>\n            <tr><td>33</td><td>DeepSeek Aggregator</td><td><a href=\"https://deepseek-aggregator.com\" target=\"_blank\">https://deepseek-aggregator.com</a></td><td>🔓💪🎉🚀</td><td>Spécialisé DeepSeek, crédits de test gratuits</td></tr>\n            <tr><td>34</td><td>Hugging Face Inference</td><td><a href=\"https://huggingface.co/inference-api\" target=\"_blank\">https://huggingface.co/inference-api</a></td><td>🔓💪🎉🚀</td><td>Supporte Llama 3 et modèles open source, niveau gratuit disponible</td></tr>\n            <tr><td>35</td><td>AI21 Labs</td><td><a href=\"https://studio.ai21.com\" target=\"_blank\">https://studio.ai21.com</a></td><td>💰✌💪🎉</td><td>Jurassic-2 pour les tâches NLP professionnelles</td></tr>\n            <tr><td>36</td><td>Cohere API</td><td><a href=\"https://cohere.ai\" target=\"_blank\">https://cohere.ai</a></td><td>💰✌💪🎉</td><td>Génération et classification de texte, API entreprise</td></tr>\n            <tr><td>37</td><td>AI API Aggregator</td><td><a href=\"https://api.ai-aggregator.com\" target=\"_blank\">https://api.ai-aggregator.com</a></td><td>🔓✌💪🎉🚀</td><td>Orchestration multi-modèles, interface unifiée</td></tr>\n            <tr><td>38</td><td>AI.LS</td><td><a href=\"https://ai.ls\" target=\"_blank\">https://ai.ls</a></td><td>🆓✌</td><td>Interface minimaliste, GPT-3.5 gratuit et anonyme</td></tr>\n            <tr><td>39</td><td>Simple API</td><td><a href=\"https://jeniya.top\" target=\"_blank\">https://jeniya.top</a></td><td>🔓✌💪🎉🎁</td><td>100 ¥ offerts à l'inscription, support Claude/GPT-4o</td></tr>\n            <tr><td>40</td><td>OpenAI120</td><td><a href=\"https://openai120.com\" target=\"_blank\">https://openai120.com</a></td><td>🔓✌🎁</td><td>$3 offerts, même tarification que l'officiel</td></tr>\n            <tr><td>41</td><td>DuckAGI</td><td><a href=\"https://duckagi.com\" target=\"_blank\">https://duckagi.com</a></td><td>💰✌🎉🚀</td><td>Support multimodal GPT-4o/Sora, pensé pour la créativité</td></tr>\n            <tr><td>42</td><td>Aihubmix</td><td><a href=\"https://aihubmix.com\" target=\"_blank\">https://aihubmix.com</a></td><td>💰🎉</td><td>Agrégation de modèles chinois (Wenxin, Tongyi)</td></tr>\n            <tr><td>43</td><td>WokaAI</td><td><a href=\"https://wokaai.com\" target=\"_blank\">https://wokaai.com</a></td><td>✌</td><td>Double routage vers les modèles OpenAI</td></tr>\n            <tr><td>44</td><td>azapi</td><td><a href=\"https://azapi.com.cn\" target=\"_blank\">https://azapi.com.cn</a></td><td>💰</td><td>Réductions pour les utilisateurs de longue durée</td></tr>\n            <tr><td>45</td><td>ClaudeAPI</td><td><a href=\"https://claudeapi.io\" target=\"_blank\">https://claudeapi.io</a></td><td>💪🚀✔</td><td>Partenaire officiel Anthropic, supporte l'analyse de fichiers</td></tr>\n            <tr><td>46</td><td>Gala API</td><td><a href=\"https://galaapi.com\" target=\"_blank\">https://galaapi.com</a></td><td>🎉🚀</td><td>Canal haute vitesse dédié aux modèles Gemini</td></tr>\n            <tr><td>47</td><td>Google AI Studio</td><td><a href=\"https://ai.google.dev\" target=\"_blank\">https://ai.google.dev</a></td><td>🆓🌎✔</td><td>API Gemini gratuite, nécessite un accès international</td></tr>\n            <tr><td>48</td><td>Programme OpenAI Data Sharing</td><td><a href=\"https://platform.openai.com\" target=\"_blank\">https://platform.openai.com</a></td><td>🔓✌🌎</td><td>Jusqu'à 1M de jetons gratuits/jour avec partage de données activé</td></tr>\n            <tr><td>49</td><td>Mistral AI Platform</td><td><a href=\"https://platform.mistral.ai\" target=\"_blank\">https://platform.mistral.ai</a></td><td>🔓🎉🌎</td><td>Essai API officiel gratuit (débit limité)</td></tr>\n            <tr><td>50</td><td>Cohere</td><td><a href=\"https://cohere.com\" target=\"_blank\">https://cohere.com</a></td><td>🔓🎉🌎</td><td>Clé d'essai offerte, appels gratuits limités</td></tr>\n            <tr><td>51</td><td>ModelScope</td><td><a href=\"https://modelscope.cn\" target=\"_blank\">https://modelscope.cn</a></td><td>🔓🎉🚩</td><td>Agrège DeepSeek/Qwen, essais et téléchargements gratuits</td></tr>\n            <tr><td>52</td><td>Programme ByteDance Ark</td><td><a href=\"https://www.volcengine.com/product/ark\" target=\"_blank\">https://www.volcengine.com/product/ark</a></td><td>🔓🎉</td><td>Jusqu'à 500k tokens/jour par modèle pour les collaborateurs</td></tr>\n            <tr><td>53</td><td>Zhipu BigModel</td><td><a href=\"https://open.bigmodel.cn\" target=\"_blank\">https://open.bigmodel.cn</a></td><td>🆓🎉</td><td>GLM-4-Flash gratuit, contexte 128K</td></tr>\n            <tr><td>54</td><td>InternLM</td><td><a href=\"https://internlm.intern-ai.org.cn\" target=\"_blank\">https://internlm.intern-ai.org.cn</a></td><td>🆓🎉</td><td>API officielle gratuite, accès direct</td></tr>\n            <tr><td>55</td><td>GitHub Models</td><td><a href=\"https://docs.github.com/github-models\" target=\"_blank\">https://docs.github.com/github-models</a></td><td>🔓✌🎉🌎</td><td>Hébergé sur Azure, quota gratuit limité</td></tr>\n            <tr><td>56</td><td>OpenRouter (gratuit)</td><td><a href=\"https://openrouter.ai\" target=\"_blank\">https://openrouter.ai</a></td><td>🔓💪✌🎉🌎✔</td><td>Modèles gratuits ≤50/jour, passe à 1000 avec ≥10 $ de solde</td></tr>\n            <tr><td>57</td><td>Chutes</td><td><a href=\"https://chutes.ai\" target=\"_blank\">https://chutes.ai</a></td><td>🔓🎉</td><td>Certains modèles 200 appels gratuits/jour, support DeepSeek</td></tr>\n            <tr><td>58</td><td>Groq Cloud</td><td><a href=\"https://groq.com/groqcloud\" target=\"_blank\">https://groq.com/groqcloud</a></td><td>🔓🎉🌎</td><td>Clé API gratuite, compatible OpenAI, inférence ultra rapide</td></tr>\n            <tr><td>59</td><td>Cerebras Inference</td><td><a href=\"https://inference.cerebras.ai\" target=\"_blank\">https://inference.cerebras.ai</a></td><td>🔓🎉🌎🚀</td><td>1M tokens gratuits par jour, 450 t/s+ pour les LLM</td></tr>\n            <tr><td>60</td><td>Infini-AI GenStudio</td><td><a href=\"https://cloud.infini-ai.com/genstudio\" target=\"_blank\">https://cloud.infini-ai.com/genstudio</a></td><td>🆓🎉</td><td>DeepSeek R1/V3 complet gratuit, sans code d'invitation</td></tr>\n          </tbody>\n        </table>\n      </div>\n    </section>\n\n    <section class=\"section\" id=\"apps\">\n      <h2>📱 Applications compatibles</h2>\n      <details>\n        <summary>📦 Cliquez pour afficher la liste complète</summary>\n        <div class=\"apps-grid\">\n          <div class=\"app-card\">\n            <h4>✅ <a href=\"https://github.com/CherryHQ/cherry-studio\" target=\"_blank\">Cherry Studio</a></h4>\n            <p>Application desktop/mobile intégrant services cloud et modèles locaux.</p>\n          </div>\n          <div class=\"app-card\">\n            <h4>✅ <a href=\"https://u.tools/plugins/detail/ChatGPT.%E5%A5%BD%E5%8F%8B/\" target=\"_blank\">Plugin ChatGPT pour uTools</a></h4>\n            <p>Plugin de chat intelligent, rôles personnalisés, multi-modèles.</p>\n          </div>\n          <div class=\"app-card\">\n            <h4>✅ <a href=\"https://github.com/Yidadaa/ChatGPT-Next-Web\" target=\"_blank\">ChatGPT-Next-Web</a></h4>\n            <p>Interface web open-source, gestion multi-utilisateurs et API Key.</p>\n          </div>\n          <div class=\"app-card\">\n            <h4>✅ <a href=\"https://github.com/lobehub/lobe-chat\" target=\"_blank\">LobeChat</a></h4>\n            <p>Cadre web supportant voix, vision et changement de modèles.</p>\n          </div>\n          <div class=\"app-card\">\n            <h4>✅ <a href=\"https://botgem.com/\" target=\"_blank\">BotGem</a></h4>\n            <p>Application mobile centrée sur la voix et les compagnons IA.</p>\n          </div>\n          <div class=\"app-card\">\n            <h4>✅ <a href=\"https://github.com/Bin-Huang/chatbox\" target=\"_blank\">ChatBox</a></h4>\n            <p>Client IA moderne pour iOS, Android et desktop.</p>\n          </div>\n          <div class=\"app-card\">\n            <h4>✅ <a href=\"https://github.com/labring/FastGPT\" target=\"_blank\">FastGPT</a></h4>\n            <p>Base de connaissances + workflow visuel pour l'entreprise.</p>\n          </div>\n          <div class=\"app-card\">\n            <h4>✅ <a href=\"https://github.com/Mintplex-Labs/anything-llm\" target=\"_blank\">AnythingLLM</a></h4>\n            <p>Déploiement local axé confidentialité avec plugins.</p>\n          </div>\n        </div>\n      </details>\n    </section>\n\n    <section class=\"section\" id=\"guide\">\n      <h2>📖 Guide d'utilisation</h2>\n      <ol class=\"usage-steps\">\n        <li>🔑 <strong>Obtenez votre API Key :</strong> inscrivez-vous et copiez la clé dans votre tableau de bord.</li>\n        <li>⚙ <strong>Configurez l'endpoint :</strong> ajoutez l'URL de l'API dans l'application compatible.</li>\n        <li>🤖 <strong>Choisissez le modèle :</strong> sélectionnez GPT, Claude, DeepSeek selon les supports.</li>\n        <li>📊 <strong>Surveillez l'usage :</strong> activez les limites ou notifications de consommation.</li>\n      </ol>\n    </section>\n\n    <section class=\"section\" id=\"contribute\">\n      <h2>🙌 Guide de contribution</h2>\n      <p>Nous acceptons volontiers :</p>\n      <ul style=\"margin-left: 20px; margin-top: 10px;\">\n        <li>✨ Ajout de nouveaux fournisseurs (fiables ≥ 3 jours)</li>\n        <li>🧰 Tutoriels et captures d'écran</li>\n        <li>🧪 Scripts pour détecter les plateformes inactives</li>\n        <li>🌍 Traductions supplémentaires (anglais, japonais, coréen, etc.)</li>\n      </ul>\n      <p style=\"margin-top: 15px;\">💡 Envoyez une Pull Request ou ouvrez un Issue, nous répondrons rapidement.</p>\n    </section>\n\n    <section class=\"section\">\n      <h2>❌ Plateformes inactives</h2>\n      <details>\n        <summary>📛 Cliquez pour voir les entrées signalées</summary>\n        <table style=\"width: 100%; margin-top: 15px;\">\n          <thead>\n            <tr>\n              <th>#</th>\n              <th>Nom</th>\n              <th>Lien</th>\n              <th>Statut</th>\n            </tr>\n          </thead>\n          <tbody>\n            <tr>\n              <td>1</td>\n              <td>464888</td>\n              <td><a href=\"https://api.464888.xyz\" target=\"_blank\">api.464888.xyz</a></td>\n              <td>❌ Inaccessible</td>\n            </tr>\n          </tbody>\n        </table>\n        <p style=\"margin-top: 10px;\">💡 Vous avez trouvé une nouvelle plateforme HS ? Merci de créer un Issue.</p>\n      </details>\n    </section>\n\n    <section class=\"section\">\n      <h2>⚖️ Avertissement</h2>\n      <ul style=\"margin-left: 20px;\">\n        <li>Nous ne stockons aucune clé API et ne proposons pas de service proxy.</li>\n        <li>Toutes les plateformes proviennent d'Internet public. Utilisez-les à vos risques.</li>\n        <li>L'auteur n'est pas responsable des pertes éventuelles causées par ces services tiers.</li>\n      </ul>\n    </section>\n\n    <section class=\"section\">\n      <h2>🙏 Remerciements</h2>\n      <p>Un grand merci à <strong>zenmux</strong> pour le soutien de la plateforme API.<br>\n        <a href=\"https://zenmux.ai/invite/U1QU1H\" target=\"_blank\">S'inscrire et profiter du code promo</a>\n      </p>\n      <p style=\"margin-top: 15px;\">Merci à <strong>chat01</strong> pour le support technique.<br>\n        <a href=\"https://chat01.ai/?ref=j45ikbTa\" target=\"_blank\">Visiter chat01 et utiliser le code de parrainage</a>\n      </p>\n      <p style=\"margin-top: 15px;\">\n        <a href=\"https://dartnode.com\" target=\"_blank\">\n          <img src=\"https://dartnode.com/branding/DN-Open-Source-sm.png\" alt=\"Powered by DartNode\">\n        </a>\n      </p>\n    </section>\n\n    <footer>\n      <p style=\"margin-bottom: 15px;\">\n        <a href=\"https://star-history.com/#TechnologyStar/Openai-Claude-Deepseek-API-provider&Date\" target=\"_blank\">\n          <img src=\"https://api.star-history.com/svg?repos=TechnologyStar/Openai-Claude-Deepseek-API-provider&type=Date\" alt=\"Star History\" style=\"max-width: 100%; height: auto;\">\n        </a>\n      </p>\n      <p>Réalisé avec ❤️ par <a href=\"https://github.com/TechnologyStar\" target=\"_blank\">TechnologyStar</a></p>\n      <p style=\"margin-top: 10px; font-size: 0.9em; color: #666;\">\n        <a href=\"https://github.com/TechnologyStar/Openai-Claude-Deepseek-API-provider\" target=\"_blank\">Consulter le dépôt GitHub</a>\n      </p>\n    </footer>\n  </div>\n</body>\n</html>\n"
  },
  {
    "path": "website/index.html",
    "content": "<!DOCTYPE html>\n<html lang=\"zh-CN\">\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <title>🌐 OpenAI / Claude / DeepSeek API Provider Directory</title>\n  <meta http-equiv=\"refresh\" content=\"0; url=index.zh-CN.html\">\n  <script>\n    // Detect browser language and redirect\n    const browserLang = navigator.language || navigator.userLanguage;\n    const lang = browserLang.toLowerCase();\n    \n    if (lang.startsWith('en')) {\n      window.location.href = 'index.en.html';\n    } else if (lang.startsWith('ru')) {\n      window.location.href = 'index.ru.html';\n    } else if (lang.startsWith('fr')) {\n      window.location.href = 'index.fr.html';\n    } else {\n      window.location.href = 'index.zh-CN.html';\n    }\n  </script>\n  <style>\n    body {\n      font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Helvetica Neue', Arial, sans-serif;\n      display: flex;\n      justify-content: center;\n      align-items: center;\n      min-height: 100vh;\n      margin: 0;\n      background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n      color: #fff;\n    }\n    .loading {\n      text-align: center;\n    }\n    .loading h1 {\n      font-size: 3em;\n      margin-bottom: 20px;\n    }\n    .loading p {\n      font-size: 1.2em;\n    }\n    .lang-links {\n      margin-top: 30px;\n    }\n    .lang-links a {\n      display: inline-block;\n      margin: 10px;\n      padding: 12px 24px;\n      background: rgba(255, 255, 255, 0.2);\n      color: #fff;\n      text-decoration: none;\n      border-radius: 8px;\n      font-weight: 600;\n      transition: all 0.3s;\n    }\n    .lang-links a:hover {\n      background: rgba(255, 255, 255, 0.3);\n      transform: translateY(-2px);\n    }\n  </style>\n</head>\n<body>\n  <div class=\"loading\">\n    <h1>🌐</h1>\n    <p>Redirecting to your language version...</p>\n    <p>正在跳转到您的语言版本...</p>\n    <div class=\"lang-links\">\n      <p>Or choose manually / 或手动选择：</p>\n      <a href=\"index.zh-CN.html\">🇨🇳 中文</a>\n      <a href=\"index.en.html\">🇬🇧 English</a>\n      <a href=\"index.ru.html\">🇷🇺 Русский</a>\n      <a href=\"index.fr.html\">🇫🇷 Français</a>\n    </div>\n  </div>\n</body>\n</html>\n"
  },
  {
    "path": "website/index.ru.html",
    "content": "<!DOCTYPE html>\n<html lang=\"ru\">\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <title>🌐 OpenAI / Claude / DeepSeek API Provider - Каталог поставщиков</title>\n  <meta name=\"description\" content=\"Курированный список сторонних платформ, предоставляющих API OpenAI / Claude / DeepSeek для обучения, исследований и некоммерческого использования.\">\n  <meta name=\"keywords\" content=\"OpenAI, Claude, DeepSeek, API, сторонние, бесплатно, искусственный интеллект, ИИ\">\n  <style>\n    * {\n      margin: 0;\n      padding: 0;\n      box-sizing: border-box;\n    }\n    \n    body {\n      font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", \"Roboto\", \"Helvetica Neue\", Arial, sans-serif;\n      line-height: 1.6;\n      color: #333;\n      background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n      min-height: 100vh;\n    }\n    \n    .container {\n      max-width: 1200px;\n      margin: 0 auto;\n      padding: 20px;\n    }\n    \n    header {\n      background: rgba(255, 255, 255, 0.95);\n      backdrop-filter: blur(10px);\n      border-radius: 15px;\n      padding: 30px;\n      margin-bottom: 30px;\n      box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1);\n      text-align: center;\n    }\n    \n    h1 {\n      font-size: 2.5em;\n      margin-bottom: 15px;\n      color: #667eea;\n      text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.1);\n    }\n    \n    .subtitle {\n      font-size: 1.2em;\n      color: #666;\n      margin-bottom: 20px;\n    }\n    \n    .badges {\n      display: flex;\n      gap: 10px;\n      justify-content: center;\n      flex-wrap: wrap;\n      margin: 20px 0;\n    }\n    \n    .badges img {\n      height: 20px;\n    }\n    \n    .lang-switcher {\n      display: flex;\n      gap: 10px;\n      justify-content: center;\n      margin-top: 20px;\n      flex-wrap: wrap;\n    }\n    \n    .lang-btn {\n      padding: 8px 16px;\n      background: #667eea;\n      color: white;\n      text-decoration: none;\n      border-radius: 20px;\n      font-size: 14px;\n      transition: all 0.3s;\n    }\n    \n    .lang-btn:hover {\n      background: #764ba2;\n      transform: translateY(-2px);\n      box-shadow: 0 5px 15px rgba(102, 126, 234, 0.3);\n    }\n    \n    .lang-btn.active {\n      background: #764ba2;\n    }\n    \n    .notice {\n      background: #fff3cd;\n      border-left: 4px solid #ffc107;\n      padding: 20px;\n      border-radius: 10px;\n      margin-bottom: 30px;\n    }\n    \n    .section {\n      background: rgba(255, 255, 255, 0.95);\n      backdrop-filter: blur(10px);\n      border-radius: 15px;\n      padding: 30px;\n      margin-bottom: 30px;\n      box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1);\n    }\n    \n    h2 {\n      font-size: 2em;\n      margin-bottom: 20px;\n      color: #667eea;\n      border-bottom: 3px solid #667eea;\n      padding-bottom: 10px;\n    }\n    \n    h3 {\n      font-size: 1.5em;\n      margin: 20px 0 10px;\n      color: #764ba2;\n    }\n    \n    .tags-legend {\n      display: grid;\n      grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\n      gap: 10px;\n      margin: 20px 0;\n    }\n    \n    .tag-item {\n      padding: 10px;\n      background: #f8f9fa;\n      border-radius: 8px;\n      border-left: 3px solid #667eea;\n    }\n    \n    .providers-table {\n      width: 100%;\n      border-collapse: collapse;\n      margin: 20px 0;\n      overflow-x: auto;\n      display: block;\n    }\n    \n    .providers-table table {\n      width: 100%;\n      min-width: 800px;\n    }\n    \n    .providers-table th,\n    .providers-table td {\n      padding: 12px;\n      text-align: left;\n      border-bottom: 1px solid #e0e0e0;\n    }\n    \n    .providers-table th {\n      background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n      color: white;\n      font-weight: 600;\n      position: sticky;\n      top: 0;\n    }\n    \n    .providers-table tr:hover {\n      background: #f5f5f5;\n    }\n    \n    .providers-table a {\n      color: #667eea;\n      text-decoration: none;\n      font-weight: 500;\n    }\n    \n    .providers-table a:hover {\n      text-decoration: underline;\n    }\n    \n    .apps-grid {\n      display: grid;\n      grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));\n      gap: 20px;\n      margin: 20px 0;\n    }\n    \n    .app-card {\n      padding: 20px;\n      background: #f8f9fa;\n      border-radius: 10px;\n      border-left: 4px solid #667eea;\n      transition: all 0.3s;\n    }\n    \n    .app-card:hover {\n      transform: translateY(-5px);\n      box-shadow: 0 5px 20px rgba(0, 0, 0, 0.1);\n    }\n    \n    .app-card h4 {\n      color: #667eea;\n      margin-bottom: 10px;\n    }\n    \n    .usage-steps {\n      counter-reset: step;\n      list-style: none;\n      padding: 0;\n    }\n    \n    .usage-steps li {\n      counter-increment: step;\n      padding: 15px;\n      margin: 10px 0;\n      background: #f8f9fa;\n      border-radius: 10px;\n      position: relative;\n      padding-left: 60px;\n    }\n    \n    .usage-steps li::before {\n      content: counter(step);\n      position: absolute;\n      left: 15px;\n      top: 50%;\n      transform: translateY(-50%);\n      background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n      color: white;\n      width: 35px;\n      height: 35px;\n      border-radius: 50%;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      font-weight: bold;\n    }\n    \n    footer {\n      background: rgba(255, 255, 255, 0.95);\n      backdrop-filter: blur(10px);\n      border-radius: 15px;\n      padding: 30px;\n      text-align: center;\n      margin-top: 30px;\n      box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1);\n    }\n    \n    .stats {\n      display: grid;\n      grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n      gap: 20px;\n      margin: 20px 0;\n    }\n    \n    .stat-card {\n      background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n      color: white;\n      padding: 25px;\n      border-radius: 10px;\n      text-align: center;\n    }\n    \n    .stat-number {\n      font-size: 3em;\n      font-weight: bold;\n      margin-bottom: 5px;\n    }\n    \n    .stat-label {\n      font-size: 1.1em;\n      opacity: 0.9;\n    }\n    \n    @media (max-width: 768px) {\n      h1 {\n        font-size: 1.8em;\n      }\n      \n      .providers-table {\n        font-size: 14px;\n      }\n      \n      .container {\n        padding: 10px;\n      }\n    }\n    \n    details {\n      margin: 20px 0;\n    }\n    \n    summary {\n      cursor: pointer;\n      padding: 15px;\n      background: #f8f9fa;\n      border-radius: 10px;\n      font-weight: 600;\n      color: #667eea;\n      user-select: none;\n    }\n    \n    summary:hover {\n      background: #e9ecef;\n    }\n    \n    details[open] summary {\n      margin-bottom: 15px;\n    }\n  </style>\n</head>\n<body>\n  <div class=\"container\">\n    <header>\n      <h1>🌐 Поставщики API OpenAI / Claude / DeepSeek</h1>\n      <p class=\"subtitle\">Курированный список сторонних платформ,</p>\n      <p class=\"subtitle\">предоставляющих API для обучения, исследований и некоммерческого использования</p>\n      \n      <div class=\"badges\">\n        <img src=\"https://img.shields.io/github/last-commit/TechnologyStar/Openai-Claude-Deepseek-API-provider\" alt=\"Last Commit\">\n        <img src=\"https://img.shields.io/github/license/TechnologyStar/Openai-Claude-Deepseek-API-provider\" alt=\"License\">\n      </div>\n      \n      <div class=\"lang-switcher\">\n        <a href=\"index.zh-CN.html\" class=\"lang-btn\">🇨🇳 中文</a>\n        <a href=\"index.en.html\" class=\"lang-btn\">🇬🇧 English</a>\n        <a href=\"index.ru.html\" class=\"lang-btn active\">🇷🇺 Русский</a>\n        <a href=\"index.fr.html\" class=\"lang-btn\">🇫🇷 Français</a>\n      </div>\n    </header>\n    \n    <div class=\"notice section\">\n      <h3>⚠️ Инструкция по использованию</h3>\n      <p><strong>Проект бесплатный и некоммерческий. Любое незаконное использование запрещено.</strong></p>\n      <ul style=\"margin-top: 10px; margin-left: 20px;\">\n        <li>Соблюдайте <a href=\"https://openai.com/policies/terms-of-use\" target=\"_blank\">условия использования OpenAI</a></li>\n        <li>Соблюдайте местные законы и правила, касающиеся генеративных AI-сервисов</li>\n      </ul>\n    </div>\n    \n    <div class=\"section\">\n      <h2>🚀 Описание проекта</h2>\n      <p>📌 Сбор и верификация сторонних платформ API из интернета (некоторые бесплатны)</p>\n      <p>🔧 Без регистрации / подключение в один клик / поддержка нескольких моделей (OpenAI, Claude, DeepSeek и др.)</p>\n      <p>🔒 Все сайты указаны только как ссылки — <strong>не вводите личные данные</strong></p>\n      <p style=\"margin-top: 15px;\">💡 Если проект оказался полезным, поставьте звезду 🌟</p>\n    </div>\n    \n    <div class=\"section\">\n      <h2>📊 Статистика</h2>\n      <div class=\"stats\">\n        <div class=\"stat-card\">\n          <div class=\"stat-number\">60+</div>\n          <div class=\"stat-label\">Поставщиков API</div>\n        </div>\n        <div class=\"stat-card\">\n          <div class=\"stat-number\">20+</div>\n          <div class=\"stat-label\">Бесплатных платформ</div>\n        </div>\n        <div class=\"stat-card\">\n          <div class=\"stat-number\">8</div>\n          <div class=\"stat-label\">Рекомендуемых приложений</div>\n        </div>\n      </div>\n    </div>\n    \n    <div class=\"section\">\n      <h2>🎁 Обозначения меток</h2>\n      <div class=\"tags-legend\">\n        <div class=\"tag-item\">🆓 Полностью бесплатно</div>\n        <div class=\"tag-item\">🔓 Есть бесплатный кредит</div>\n        <div class=\"tag-item\">💰 Платная услуга</div>\n        <div class=\"tag-item\">💪 Поддержка последней версии Claude</div>\n        <div class=\"tag-item\">✌ Поддержка последней версии OpenAI</div>\n        <div class=\"tag-item\">🎉 Поддержка других моделей (DeepSeek)</div>\n        <div class=\"tag-item\">🌎 Требуется международный доступ</div>\n        <div class=\"tag-item\">🎁 Бонус при пополнении счета</div>\n        <div class=\"tag-item\">🚀 Высокая производительность</div>\n        <div class=\"tag-item\">😆 Ежедневный бесплатный кредит</div>\n        <div class=\"tag-item\">🚩 Проверенная платформа</div>\n        <div class=\"tag-item\">✔ Подлинность подтверждена</div>\n      </div>\n    </div>\n    \n    <div class=\"section\">\n      <h2>🌐 Список поставщиков API</h2>\n      <div class=\"providers-table\">\n        <table>\n          <thead>\n            <tr>\n              <th>#</th>\n              <th>Платформа</th>\n              <th>Ссылка</th>\n              <th>Метки</th>\n              <th>Примечания</th>\n            </tr>\n          </thead>\n          <tbody>\n            <tr><td>1</td><td>chat01 (рекомендуется)</td><td><a href=\"https://chat01.ai/?ref=j45ikbTa\" target=\"_blank\">https://chat01.ai</a></td><td>🔓✌🎁💰✔</td><td>Поддержка pro, решает проблему снижения качества, 2 кредита в день, чат + API</td></tr>\n            <tr><td>2</td><td>SiliconFlow (корпоративный)</td><td><a href=\"https://cloud.siliconflow.cn/i/ZKV30bdG\" target=\"_blank\">https://cloud.siliconflow.cn</a></td><td>🔓🎉🚀🚩✔</td><td>Сервис Ascend от Huawei Cloud, при регистрации 14 ¥</td></tr>\n            <tr><td>3</td><td>zenmux (рекомендуется)</td><td><a href=\"https://zenmux.ai/invite/U1QU1H\" target=\"_blank\">https://zenmux.ai</a></td><td>🔓✌🎁💰</td><td>Бесплатный Gemini 3 Pro, первая в мире компенсируемая агрегация LLM</td></tr>\n            <tr><td>4</td><td>PoloAPI</td><td><a href=\"https://poloai.top\" target=\"_blank\">https://poloai.top</a></td><td>🔓💪✌🎉🎁💰</td><td>Новые пользователи получают $0.3, агрегирует Claude/Grok/OpenAI</td></tr>\n            <tr><td>5</td><td>OAIPro</td><td><a href=\"https://api.oaipro.com\" target=\"_blank\">https://api.oaipro.com</a></td><td>💰✌💪</td><td>Официальные тарифы, стабильное соединение, поддержка OpenAI и Claude</td></tr>\n            <tr><td>6</td><td>VoAPI</td><td><a href=\"https://demo.voapi.top\" target=\"_blank\">https://demo.voapi.top</a></td><td>🆓😆💪✌</td><td>Бесплатная общественная платформа, баланс сбрасывается ежедневно</td></tr>\n            <tr><td>7</td><td>inscopilot (рекомендуется)</td><td><a href=\"https://instcopilot-api.com/register?aff=Q2Z0\" target=\"_blank\">https://instcopilot-api.com</a></td><td>✌🎉😆🚀</td><td>Бонус $5, стабильно и дешево, поддержка CC</td></tr>\n            <tr><td>8</td><td>V3 API (смешанная)</td><td><a href=\"https://api.v3.cm\" target=\"_blank\">https://api.v3.cm</a></td><td>🚀🔓💪🎁🎉✌</td><td>Бонус $0.2, высокая нагрузка, скидка 70%, много моделей</td></tr>\n            <tr><td>9</td><td>V3 API (официальная)</td><td><a href=\"https://gf.gpt.ge\" target=\"_blank\">https://gf.gpt.ge</a></td><td>🚀🌹🔓💪</td><td>Бонус $0.2, высокая нагрузка, скидка 60%</td></tr>\n            <tr><td>10</td><td>openai-hk</td><td><a href=\"https://openai-hk.com\" target=\"_blank\">https://openai-hk.com</a></td><td>🆓🔓🎉✌💪🚀</td><td>Бонус 1 ¥, сверхвысокая конкуренция, включает GPT-3.5 публичную версию</td></tr>\n            <tr><td>11</td><td>ChatGPT API Faucet</td><td><a href=\"https://faucet.openkey.cloud\" target=\"_blank\">https://faucet.openkey.cloud</a></td><td>🆓</td><td>$1 бесплатного кредита, действует 3 дня</td></tr>\n            <tr><td>12</td><td>Бесплатный ChatGPT API</td><td><a href=\"https://github.com/popjane/free_chatgpt_api\" target=\"_blank\">GitHub</a></td><td>🆓</td><td>Полностью бесплатно</td></tr>\n            <tr><td>13</td><td>GPT-API-free</td><td><a href=\"https://github.com/chuyuewei/ChatGPT-API\" target=\"_blank\">GitHub</a></td><td>🆓💪</td><td>Поддержка GPT-4, 3 запроса в день</td></tr>\n            <tr><td>14</td><td>openkey</td><td><a href=\"https://openkey.cloud\" target=\"_blank\">https://openkey.cloud</a></td><td>🔓💪✌🚀</td><td>Бонус $0.2, поддержка высокой нагрузки</td></tr>\n            <tr><td>15</td><td>gptgod.online</td><td><a href=\"https://gptgod.online\" target=\"_blank\">https://gptgod.online</a></td><td>💪✌🎁💰🎉😆</td><td>Оплата за запрос, система кредитов</td></tr>\n            <tr><td>16</td><td>m3.ckit.gold</td><td><a href=\"https://m3.ckit.gold\" target=\"_blank\">https://m3.ckit.gold</a></td><td>💰💪✌</td><td>3 ¥ за доллар, бонус $0.1 при регистрации</td></tr>\n            <tr><td>17</td><td>iaicnn</td><td><a href=\"https://aicnn.cn\" target=\"_blank\">https://aicnn.cn</a></td><td>💪✌🎁💰🎉</td><td>Поддержка API для старых пользователей, мигрирован</td></tr>\n            <tr><td>18</td><td>goapi.gptnb.ai</td><td><a href=\"https://goapi.gptnb.ai\" target=\"_blank\">https://goapi.gptnb.ai</a></td><td>💪✌🎁💰🎉</td><td></td></tr>\n            <tr><td>19</td><td>api.aigc369.com</td><td><a href=\"https://api.aigc369.com/pricing\" target=\"_blank\">https://api.aigc369.com</a></td><td>💪✌🎁💰🎉</td><td></td></tr>\n            <tr><td>20</td><td>api.mjdjourney.cn</td><td><a href=\"https://api.mjdjourney.cn\" target=\"_blank\">https://api.mjdjourney.cn</a></td><td>💪✌🎁💰🎉</td><td></td></tr>\n            <tr><td>21</td><td>api.bltcy.ai</td><td><a href=\"https://api.bltcy.ai\" target=\"_blank\">https://api.bltcy.ai</a></td><td>💪✌🎁💰🎉</td><td></td></tr>\n            <tr><td>22</td><td>4Z API Relay</td><td><a href=\"https://zzzzapi.com\" target=\"_blank\">https://zzzzapi.com</a></td><td>🔓✌💪🎉🚀</td><td>Поддержка GPT-4o, Claude 3.5, $0.2 для новых пользователей</td></tr>\n            <tr><td>23</td><td>Простой API Relay</td><td><a href=\"https://jeniya.top\" target=\"_blank\">https://jeniya.top</a></td><td>🔓✌💪🎉🚀</td><td>Агрегация моделей, без ограничений, 100 ¥ тестовый кредит</td></tr>\n            <tr><td>24</td><td>CloseAI</td><td><a href=\"https://closeai-asia.com\" target=\"_blank\">https://closeai-asia.com</a></td><td>💰✌💪🎉🚀</td><td>Корпоративный прокси, GPT-4o и Claude 3.5, китайская поддержка</td></tr>\n            <tr><td>25</td><td>Cloud Whale AI</td><td><a href=\"https://api.atalk-ai.com\" target=\"_blank\">https://api.atalk-ai.com</a></td><td>🔓✌💪🎉🚀</td><td>Агрегация ChatGPT, Claude, Wenxin, купон 5 ¥</td></tr>\n            <tr><td>26</td><td>ModelBridge</td><td><a href=\"https://model-bridge.okeeper.com\" target=\"_blank\">https://model-bridge.okeeper.com</a></td><td>🔓✌💪🎉🚀</td><td>Бесплатный внутренний прокси, совместимый с OpenAI и китайскими моделями</td></tr>\n            <tr><td>27</td><td>UiUi API</td><td><a href=\"https://sg.uiuiapi.com\" target=\"_blank\">https://sg.uiuiapi.com</a></td><td>🔓✌💪🎉🚀</td><td>Поддержка Claude 4, Gemini, совместимость с форматом OpenAI</td></tr>\n            <tr><td>28</td><td>LaoZhang API Relay</td><td><a href=\"https://api.laozhang.ai\" target=\"_blank\">https://api.laozhang.ai</a></td><td>🔓✌💪🎉🚀</td><td>Claude 3 и GPT-4o, 20 ¥ для новых пользователей, Alipay/WeChat</td></tr>\n            <tr><td>29</td><td>Haiwhale AI Platform</td><td><a href=\"https://ai.atalk-ai.com\" target=\"_blank\">https://ai.atalk-ai.com</a></td><td>🔓✌💪🎉🚀</td><td>Зарегистрированная платформа, унифицированный доступ к API</td></tr>\n            <tr><td>30</td><td>One API</td><td><a href=\"https://one-api.ai\" target=\"_blank\">https://one-api.ai</a></td><td>🔓✌💪🎉🚀</td><td>Управление интерфейсами с открытым кодом, частное развертывание</td></tr>\n            <tr><td>31</td><td>OpenRouter</td><td><a href=\"https://openrouter.ai\" target=\"_blank\">https://openrouter.ai</a></td><td>🔓✌💪🎉🚀</td><td>293 модели (OpenAI, Claude, Gemini), бесплатная квота</td></tr>\n            <tr><td>32</td><td>Gemini API Proxy</td><td><a href=\"https://gemini-proxy.com\" target=\"_blank\">https://gemini-proxy.com</a></td><td>🔓✌🎉🚀</td><td>Модели Google Gemini, совместимость с OpenAI, бесплатная квота</td></tr>\n            <tr><td>33</td><td>DeepSeek API Aggregation</td><td><a href=\"https://deepseek-aggregator.com\" target=\"_blank\">https://deepseek-aggregator.com</a></td><td>🔓💪🎉🚀</td><td>Агрегация серии DeepSeek, бесплатная тестовая квота</td></tr>\n            <tr><td>34</td><td>Hugging Face Inference</td><td><a href=\"https://huggingface.co/inference-api\" target=\"_blank\">https://huggingface.co/inference-api</a></td><td>🔓💪🎉🚀</td><td>Модели с открытым кодом (Llama 3), бесплатный и корпоративный уровни</td></tr>\n            <tr><td>35</td><td>AI21 Labs Official</td><td><a href=\"https://studio.ai21.com\" target=\"_blank\">https://studio.ai21.com</a></td><td>💰✌💪🎉</td><td>Модели Jurassic-2, задачи NLP</td></tr>\n            <tr><td>36</td><td>Cohere API</td><td><a href=\"https://cohere.ai\" target=\"_blank\">https://cohere.ai</a></td><td>💰✌💪🎉</td><td>Генерация и классификация текста, корпоративный API</td></tr>\n            <tr><td>37</td><td>AI API Aggregator</td><td><a href=\"https://api.ai-aggregator.com\" target=\"_blank\">https://api.ai-aggregator.com</a></td><td>🔓✌💪🎉🚀</td><td>Агрегация моделей, унифицированный интерфейс, балансировка нагрузки</td></tr>\n            <tr><td>38</td><td>AI.LS</td><td><a href=\"https://ai.ls\" target=\"_blank\">https://ai.ls</a></td><td>🆓✌</td><td>Минимальный интерфейс, GPT-3.5 бесплатно анонимно</td></tr>\n            <tr><td>39</td><td>Simple API</td><td><a href=\"https://jeniya.top\" target=\"_blank\">https://jeniya.top</a></td><td>🔓✌💪🎉🎁</td><td>Кредит 100 ¥ при регистрации, поддержка Claude/GPT-4o</td></tr>\n            <tr><td>40</td><td>OpenAI120</td><td><a href=\"https://openai120.com\" target=\"_blank\">https://openai120.com</a></td><td>🔓✌🎁</td><td>$3 для новых пользователей, официальная цена</td></tr>\n            <tr><td>41</td><td>DuckAGI</td><td><a href=\"https://duckagi.com\" target=\"_blank\">https://duckagi.com</a></td><td>💰✌🎉🚀</td><td>Мультимодальный GPT-4o/Sora, генерация AI-изображений</td></tr>\n            <tr><td>42</td><td>Aihubmix</td><td><a href=\"https://aihubmix.com\" target=\"_blank\">https://aihubmix.com</a></td><td>💰🎉</td><td>Агрегация китайских моделей (Wenxin/Tongyi)</td></tr>\n            <tr><td>43</td><td>WokaAI</td><td><a href=\"https://wokaai.com\" target=\"_blank\">https://wokaai.com</a></td><td>✌</td><td>Двойные маршруты</td></tr>\n            <tr><td>44</td><td>azapi</td><td><a href=\"https://azapi.com.cn\" target=\"_blank\">https://azapi.com.cn</a></td><td>💰</td><td>Скидки для долгосрочных пользователей</td></tr>\n            <tr><td>45</td><td>ClaudeAPI</td><td><a href=\"https://claudeapi.io\" target=\"_blank\">https://claudeapi.io</a></td><td>💪🚀✔</td><td>Официальное партнерство Anthropic, поддержка парсинга файлов</td></tr>\n            <tr><td>46</td><td>Gala API</td><td><a href=\"https://galaapi.com\" target=\"_blank\">https://galaapi.com</a></td><td>🎉🚀</td><td>Выделенный высокоскоростной канал Google Gemini</td></tr>\n            <tr><td>47</td><td>Google AI Studio</td><td><a href=\"https://ai.google.dev\" target=\"_blank\">https://ai.google.dev</a></td><td>🆓🌎✔</td><td>Серия Gemini полностью бесплатна, требуется VPN</td></tr>\n            <tr><td>48</td><td>OpenAI Data Sharing</td><td><a href=\"https://platform.openai.com\" target=\"_blank\">https://platform.openai.com</a></td><td>🔓✌🌎</td><td>До 1M бесплатных токенов в день с включенной передачей данных</td></tr>\n            <tr><td>49</td><td>Mistral AI Platform</td><td><a href=\"https://platform.mistral.ai\" target=\"_blank\">https://platform.mistral.ai</a></td><td>🔓🎉🌎</td><td>Официальная платформа бесплатного API-тестирования (ограничение скорости)</td></tr>\n            <tr><td>50</td><td>Cohere</td><td><a href=\"https://cohere.com\" target=\"_blank\">https://cohere.com</a></td><td>🔓🎉🌎</td><td>Пробный ключ при регистрации, бесплатно с ограничениями скорости</td></tr>\n            <tr><td>51</td><td>ModelScope</td><td><a href=\"https://modelscope.cn\" target=\"_blank\">https://modelscope.cn</a></td><td>🔓🎉🚩</td><td>Агрегация DeepSeek/Qwen, бесплатные тесты и загрузка моделей</td></tr>\n            <tr><td>52</td><td>ByteDance Ark Plan</td><td><a href=\"https://www.volcengine.com/product/ark\" target=\"_blank\">https://www.volcengine.com/product/ark</a></td><td>🔓🎉</td><td>500K токенов в день на модель в плане сотрудничества</td></tr>\n            <tr><td>53</td><td>Zhipu BigModel</td><td><a href=\"https://open.bigmodel.cn\" target=\"_blank\">https://open.bigmodel.cn</a></td><td>🆓🎉</td><td>GLM-4-Flash API полностью бесплатен, контекст 128K</td></tr>\n            <tr><td>54</td><td>InternLM</td><td><a href=\"https://internlm.intern-ai.org.cn\" target=\"_blank\">https://internlm.intern-ai.org.cn</a></td><td>🆓🎉</td><td>Официальный бесплатный API, прямой доступ</td></tr>\n            <tr><td>55</td><td>GitHub Models</td><td><a href=\"https://docs.github.com/github-models\" target=\"_blank\">https://docs.github.com/github-models</a></td><td>🔓✌🎉🌎</td><td>Размещение Azure, ограниченная бесплатная квота API</td></tr>\n            <tr><td>56</td><td>OpenRouter (Free)</td><td><a href=\"https://openrouter.ai\" target=\"_blank\">https://openrouter.ai</a></td><td>🔓💪✌🎉🌎✔</td><td>Бесплатные модели ≤50 в день, баланс ≥$10 до 1000</td></tr>\n            <tr><td>57</td><td>Chutes</td><td><a href=\"https://chutes.ai\" target=\"_blank\">https://chutes.ai</a></td><td>🔓🎉</td><td>Некоторые модели 200 бесплатных вызовов в день, поддержка DeepSeek</td></tr>\n            <tr><td>58</td><td>Groq Cloud</td><td><a href=\"https://groq.com/groqcloud\" target=\"_blank\">https://groq.com/groqcloud</a></td><td>🔓🎉🌎</td><td>Доступен бесплатный API-ключ, совместимость с OpenAI, сверхбыстрый вывод</td></tr>\n            <tr><td>59</td><td>Cerebras Inference</td><td><a href=\"https://inference.cerebras.ai\" target=\"_blank\">https://inference.cerebras.ai</a></td><td>🔓🎉🌎🚀</td><td>Разработчики получают 1M бесплатных токенов в день, LLM вывод 450+ t/s</td></tr>\n            <tr><td>60</td><td>Infini-AI GenStudio</td><td><a href=\"https://cloud.infini-ai.com/genstudio\" target=\"_blank\">https://cloud.infini-ai.com/genstudio</a></td><td>🆓🎉</td><td>DeepSeek R1/V3 полная версия бесплатных токенов, без пригласительного кода</td></tr>\n          </tbody>\n        </table>\n      </div>\n    </div>\n    \n    <div class=\"section\">\n      <h2>📱 Рекомендуемые приложения</h2>\n      <details>\n        <summary>📦 Нажмите, чтобы увидеть список приложений</summary>\n        <div class=\"apps-grid\">\n          <div class=\"app-card\">\n            <h4>✅ <a href=\"https://github.com/CherryHQ/cherry-studio\" target=\"_blank\">Cherry Studio</a></h4>\n            <p>Кроссплатформенное приложение, интеграция облачных AI-сервисов и локальных моделей.</p>\n          </div>\n          <div class=\"app-card\">\n            <h4>✅ <a href=\"https://u.tools/plugins/detail/ChatGPT.%E5%A5%BD%E5%8F%8B/\" target=\"_blank\">Плагин ChatGPT для uTools</a></h4>\n            <p>Десктоп-плагин для интеллектуального чата, поддержка нескольких моделей и сессий.</p>\n          </div>\n          <div class=\"app-card\">\n            <h4>✅ <a href=\"https://github.com/Yidadaa/ChatGPT-Next-Web\" target=\"_blank\">ChatGPT-Next-Web</a></h4>\n            <p>Открытая веб-оболочка для ChatGPT, поддержка API Key и совместной работы.</p>\n          </div>\n          <div class=\"app-card\">\n            <h4>✅ <a href=\"https://github.com/lobehub/lobe-chat\" target=\"_blank\">LobeChat</a></h4>\n            <p>Веб-фреймворк с голосовой и визуальной поддержкой.</p>\n          </div>\n          <div class=\"app-card\">\n            <h4>✅ <a href=\"https://botgem.com/\" target=\"_blank\">BotGem</a></h4>\n            <p>Мобильное приложение с голосовым общением и AI-друзьями.</p>\n          </div>\n          <div class=\"app-card\">\n            <h4>✅ <a href=\"https://github.com/Bin-Huang/chatbox\" target=\"_blank\">ChatBox</a></h4>\n            <p>Поддержка iOS, Android и десктопа, современный интерфейс.</p>\n          </div>\n          <div class=\"app-card\">\n            <h4>✅ <a href=\"https://github.com/labring/FastGPT\" target=\"_blank\">FastGPT</a></h4>\n            <p>Интеграция базы знаний и рабочих процессов, корпоративное решение.</p>\n          </div>\n          <div class=\"app-card\">\n            <h4>✅ <a href=\"https://github.com/Mintplex-Labs/anything-llm\" target=\"_blank\">AnythingLLM</a></h4>\n            <p>Локальный деплой и расширения, для пользователей, заботящихся о приватности.</p>\n          </div>\n        </div>\n      </details>\n    </div>\n    \n    <div class=\"section\">\n      <h2>📖 Руководство по использованию</h2>\n      <ol class=\"usage-steps\">\n        <li>🔑 <strong>Получите API Key</strong>: зарегистрируйтесь и скопируйте из личного кабинета</li>\n        <li>⚙ <strong>Настройте Endpoint</strong>: вставьте адрес API в поддерживаемое приложение</li>\n        <li>🤖 <strong>Выберите модель</strong>: в зависимости от платформы выберите Claude / GPT и др.</li>\n        <li>📊 <strong>Мониторинг использования</strong>: включите лимиты в настройках приложения</li>\n      </ol>\n    </div>\n    \n    <div class=\"section\">\n      <h2>🙌 Руководство по вкладу</h2>\n      <p>Принимаем:</p>\n      <ul style=\"margin-left: 20px; margin-top: 10px;\">\n        <li>✨ Добавление новых поставщиков API (стабильная работа ≥ 3 дней)</li>\n        <li>🧰 Добавление руководств (скриншоты, видео)</li>\n        <li>🧪 Скрипты верификации (авто-проверка недоступных платформ)</li>\n        <li>🌍 Мультиязычные переводы (английский, японский, корейский и др.)</li>\n      </ul>\n      <p style=\"margin-top: 15px;\">💡 Пожалуйста, создайте Pull Request или Issue — мы оперативно рассмотрим.</p>\n    </div>\n    \n    <div class=\"section\">\n      <h2>❌ Неактивные платформы</h2>\n      <details>\n        <summary>📛 Нажмите, чтобы увидеть недоступные платформы</summary>\n        <table style=\"width: 100%; margin-top: 15px;\">\n          <thead>\n            <tr>\n              <th>#</th>\n              <th>Название</th>\n              <th>Ссылка</th>\n              <th>Статус</th>\n            </tr>\n          </thead>\n          <tbody>\n            <tr>\n              <td>1</td>\n              <td>464888</td>\n              <td><a href=\"https://api.464888.xyz\" target=\"_blank\">api.464888.xyz</a></td>\n              <td>❌ Недоступна</td>\n            </tr>\n          </tbody>\n        </table>\n        <p style=\"margin-top: 10px;\">💡 Если обнаружите новую неработающую платформу, сообщите через Issue.</p>\n      </details>\n    </div>\n    \n    <div class=\"section\">\n      <h2>⚖️ Отказ от ответственности</h2>\n      <ul style=\"margin-left: 20px;\">\n        <li>Этот проект не хранит API Key и не предоставляет прокси или ретрансляторы.</li>\n        <li>Платформы в списке — публичные. Использование на ваш страх и риск.</li>\n        <li>Автор не несет ответственности за возможные убытки или ущерб.</li>\n      </ul>\n    </div>\n    \n    <div class=\"section\">\n      <h2>🙏 Особая благодарность</h2>\n      <p>Огромная благодарность <strong>zenmux</strong> за поддержку платформы API!<br>\n      <a href=\"https://zenmux.ai/invite/U1QU1H\" target=\"_blank\">Зарегистрируйтесь и используйте пригласительный код</a></p>\n      \n      <p style=\"margin-top: 15px;\">Огромная благодарность <strong>chat01</strong> за поддержку сервиса!<br>\n      <a href=\"https://chat01.ai/?ref=j45ikbTa\" target=\"_blank\">Посетите chat01 и используйте реферальный код</a></p>\n      \n      <p style=\"margin-top: 15px;\">\n        <a href=\"https://dartnode.com\" target=\"_blank\">\n          <img src=\"https://dartnode.com/branding/DN-Open-Source-sm.png\" alt=\"Powered by DartNode\">\n        </a>\n      </p>\n    </div>\n    \n    <footer>\n      <p style=\"margin-bottom: 15px;\">\n        <a href=\"https://star-history.com/#TechnologyStar/Openai-Claude-Deepseek-API-provider&Date\" target=\"_blank\">\n          <img src=\"https://api.star-history.com/svg?repos=TechnologyStar/Openai-Claude-Deepseek-API-provider&type=Date\" alt=\"Star History\" style=\"max-width: 100%; height: auto;\">\n        </a>\n      </p>\n      <p>Сделано с ❤️ by <a href=\"https://github.com/TechnologyStar\" target=\"_blank\">TechnologyStar</a></p>\n      <p style=\"margin-top: 10px; font-size: 0.9em; color: #666;\">\n        <a href=\"https://github.com/TechnologyStar/Openai-Claude-Deepseek-API-provider\" target=\"_blank\">Репозиторий GitHub</a>\n      </p>\n    </footer>\n  </div>\n</body>\n</html>\n"
  },
  {
    "path": "website/index.zh-CN.html",
    "content": "<!DOCTYPE html>\n<html lang=\"zh-CN\">\n<head>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n  <title>🌐 OpenAI / Claude / DeepSeek API Provider - 第三方API提供商目录</title>\n  <meta name=\"description\" content=\"精选的第三方平台列表，提供 OpenAI / Claude / DeepSeek API，供学习、研究和非商业使用。\">\n  <meta name=\"keywords\" content=\"OpenAI, Claude, DeepSeek, API, 第三方, 免费, 人工智能, AI\">\n  <style>\n    * {\n      margin: 0;\n      padding: 0;\n      box-sizing: border-box;\n    }\n    \n    body {\n      font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", \"Roboto\", \"Helvetica Neue\", Arial, sans-serif;\n      line-height: 1.6;\n      color: #333;\n      background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n      min-height: 100vh;\n    }\n    \n    .container {\n      max-width: 1200px;\n      margin: 0 auto;\n      padding: 20px;\n    }\n    \n    header {\n      background: rgba(255, 255, 255, 0.95);\n      backdrop-filter: blur(10px);\n      border-radius: 15px;\n      padding: 30px;\n      margin-bottom: 30px;\n      box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1);\n      text-align: center;\n    }\n    \n    h1 {\n      font-size: 2.5em;\n      margin-bottom: 15px;\n      color: #667eea;\n      text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.1);\n    }\n    \n    .subtitle {\n      font-size: 1.2em;\n      color: #666;\n      margin-bottom: 20px;\n    }\n    \n    .badges {\n      display: flex;\n      gap: 10px;\n      justify-content: center;\n      flex-wrap: wrap;\n      margin: 20px 0;\n    }\n    \n    .badges img {\n      height: 20px;\n    }\n    \n    .lang-switcher {\n      display: flex;\n      gap: 10px;\n      justify-content: center;\n      margin-top: 20px;\n      flex-wrap: wrap;\n    }\n    \n    .lang-btn {\n      padding: 8px 16px;\n      background: #667eea;\n      color: white;\n      text-decoration: none;\n      border-radius: 20px;\n      font-size: 14px;\n      transition: all 0.3s;\n    }\n    \n    .lang-btn:hover {\n      background: #764ba2;\n      transform: translateY(-2px);\n      box-shadow: 0 5px 15px rgba(102, 126, 234, 0.3);\n    }\n    \n    .lang-btn.active {\n      background: #764ba2;\n    }\n    \n    .notice {\n      background: #fff3cd;\n      border-left: 4px solid #ffc107;\n      padding: 20px;\n      border-radius: 10px;\n      margin-bottom: 30px;\n    }\n    \n    .section {\n      background: rgba(255, 255, 255, 0.95);\n      backdrop-filter: blur(10px);\n      border-radius: 15px;\n      padding: 30px;\n      margin-bottom: 30px;\n      box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1);\n    }\n    \n    h2 {\n      font-size: 2em;\n      margin-bottom: 20px;\n      color: #667eea;\n      border-bottom: 3px solid #667eea;\n      padding-bottom: 10px;\n    }\n    \n    h3 {\n      font-size: 1.5em;\n      margin: 20px 0 10px;\n      color: #764ba2;\n    }\n    \n    .tags-legend {\n      display: grid;\n      grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\n      gap: 10px;\n      margin: 20px 0;\n    }\n    \n    .tag-item {\n      padding: 10px;\n      background: #f8f9fa;\n      border-radius: 8px;\n      border-left: 3px solid #667eea;\n    }\n    \n    .providers-table {\n      width: 100%;\n      border-collapse: collapse;\n      margin: 20px 0;\n      overflow-x: auto;\n      display: block;\n    }\n    \n    .providers-table table {\n      width: 100%;\n      min-width: 800px;\n    }\n    \n    .providers-table th,\n    .providers-table td {\n      padding: 12px;\n      text-align: left;\n      border-bottom: 1px solid #e0e0e0;\n    }\n    \n    .providers-table th {\n      background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n      color: white;\n      font-weight: 600;\n      position: sticky;\n      top: 0;\n    }\n    \n    .providers-table tr:hover {\n      background: #f5f5f5;\n    }\n    \n    .providers-table a {\n      color: #667eea;\n      text-decoration: none;\n      font-weight: 500;\n    }\n    \n    .providers-table a:hover {\n      text-decoration: underline;\n    }\n    \n    .apps-grid {\n      display: grid;\n      grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));\n      gap: 20px;\n      margin: 20px 0;\n    }\n    \n    .app-card {\n      padding: 20px;\n      background: #f8f9fa;\n      border-radius: 10px;\n      border-left: 4px solid #667eea;\n      transition: all 0.3s;\n    }\n    \n    .app-card:hover {\n      transform: translateY(-5px);\n      box-shadow: 0 5px 20px rgba(0, 0, 0, 0.1);\n    }\n    \n    .app-card h4 {\n      color: #667eea;\n      margin-bottom: 10px;\n    }\n    \n    .usage-steps {\n      counter-reset: step;\n      list-style: none;\n      padding: 0;\n    }\n    \n    .usage-steps li {\n      counter-increment: step;\n      padding: 15px;\n      margin: 10px 0;\n      background: #f8f9fa;\n      border-radius: 10px;\n      position: relative;\n      padding-left: 60px;\n    }\n    \n    .usage-steps li::before {\n      content: counter(step);\n      position: absolute;\n      left: 15px;\n      top: 50%;\n      transform: translateY(-50%);\n      background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n      color: white;\n      width: 35px;\n      height: 35px;\n      border-radius: 50%;\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      font-weight: bold;\n    }\n    \n    footer {\n      background: rgba(255, 255, 255, 0.95);\n      backdrop-filter: blur(10px);\n      border-radius: 15px;\n      padding: 30px;\n      text-align: center;\n      margin-top: 30px;\n      box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1);\n    }\n    \n    .stats {\n      display: grid;\n      grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\n      gap: 20px;\n      margin: 20px 0;\n    }\n    \n    .stat-card {\n      background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n      color: white;\n      padding: 25px;\n      border-radius: 10px;\n      text-align: center;\n    }\n    \n    .stat-number {\n      font-size: 3em;\n      font-weight: bold;\n      margin-bottom: 5px;\n    }\n    \n    .stat-label {\n      font-size: 1.1em;\n      opacity: 0.9;\n    }\n    \n    @media (max-width: 768px) {\n      h1 {\n        font-size: 1.8em;\n      }\n      \n      .providers-table {\n        font-size: 14px;\n      }\n      \n      .container {\n        padding: 10px;\n      }\n    }\n    \n    details {\n      margin: 20px 0;\n    }\n    \n    summary {\n      cursor: pointer;\n      padding: 15px;\n      background: #f8f9fa;\n      border-radius: 10px;\n      font-weight: 600;\n      color: #667eea;\n      user-select: none;\n    }\n    \n    summary:hover {\n      background: #e9ecef;\n    }\n    \n    details[open] summary {\n      margin-bottom: 15px;\n    }\n  </style>\n</head>\n<body>\n  <div class=\"container\">\n    <header>\n      <h1>🌐 OpenAI / Claude / DeepSeek API Provider</h1>\n      <p class=\"subtitle\">精选的第三方平台列表，提供 OpenAI / Claude / DeepSeek API</p>\n      <p class=\"subtitle\">供学习、研究和非商业使用</p>\n      \n      <div class=\"badges\">\n        <img src=\"https://img.shields.io/github/last-commit/TechnologyStar/Openai-Claude-Deepseek-API-provider\" alt=\"Last Commit\">\n        <img src=\"https://img.shields.io/github/license/TechnologyStar/Openai-Claude-Deepseek-API-provider\" alt=\"License\">\n      </div>\n      \n      <div class=\"lang-switcher\">\n        <a href=\"index.zh-CN.html\" class=\"lang-btn active\">🇨🇳 中文</a>\n        <a href=\"index.en.html\" class=\"lang-btn\">🇬🇧 English</a>\n        <a href=\"index.ru.html\" class=\"lang-btn\">🇷🇺 Русский</a>\n        <a href=\"index.fr.html\" class=\"lang-btn\">🇫🇷 Français</a>\n      </div>\n    </header>\n    \n    <div class=\"notice section\">\n      <h3>⚠️ 使用说明</h3>\n      <p><strong>本项目为免费公益项目，严格禁止任何违法用途。</strong></p>\n      <p><strong>本项目不会收录一些AI论坛内部的站点，如有误收录，请联系删除，在评估后将会对部分误收录网站进行赔偿。</strong></p>\n      <ul style=\"margin-top: 10px; margin-left: 20px;\">\n        <li>遵守 <a href=\"https://openai.com/policies/terms-of-use\" target=\"_blank\">OpenAI 使用条款</a></li>\n        <li>遵守 <a href=\"http://www.cac.gov.cn/2023-07/13/c_1690898327029107.htm\" target=\"_blank\">《生成式人工智能服务管理暂行办法》</a>，<strong>请勿对中国公众提供未经备案的生成式AI服务</strong></li>\n      </ul>\n    </div>\n    \n    <div class=\"section\">\n      <h2>🚀 项目简介</h2>\n      <p>📌 收录并验证来自互联网的第三方 API 提供平台（部分免费）</p>\n      <p>🔧 免注册 / 一键接入 / 支持多模型（OpenAI、Claude、DeepSeek 等）</p>\n      <p>🔒 所有网站仅作收录展示，<strong>请勿输入个人敏感信息</strong></p>\n      <p style=\"margin-top: 15px;\">💡 如果觉得项目有帮助，欢迎 Star 🌟</p>\n    </div>\n    \n    <div class=\"section\">\n      <h2>📊 统计数据</h2>\n      <div class=\"stats\">\n        <div class=\"stat-card\">\n          <div class=\"stat-number\">60+</div>\n          <div class=\"stat-label\">API 提供商</div>\n        </div>\n        <div class=\"stat-card\">\n          <div class=\"stat-number\">20+</div>\n          <div class=\"stat-label\">免费平台</div>\n        </div>\n        <div class=\"stat-card\">\n          <div class=\"stat-number\">8</div>\n          <div class=\"stat-label\">推荐应用</div>\n        </div>\n      </div>\n    </div>\n    \n    <div class=\"section\">\n      <h2>🎁 特色标签说明</h2>\n      <div class=\"tags-legend\">\n        <div class=\"tag-item\">🆓 完全免费</div>\n        <div class=\"tag-item\">🔓 有免费额度</div>\n        <div class=\"tag-item\">💰 需要充值</div>\n        <div class=\"tag-item\">💪 Claude 最新支持</div>\n        <div class=\"tag-item\">✌ OpenAI 最新支持</div>\n        <div class=\"tag-item\">🎉 其他模型支持（如 DeepSeek）</div>\n        <div class=\"tag-item\">🌎 需要国际网络</div>\n        <div class=\"tag-item\">🎁 充值赠送额度优惠</div>\n        <div class=\"tag-item\">🚀 支持高并发</div>\n        <div class=\"tag-item\">😆 每日签到领余额</div>\n        <div class=\"tag-item\">🚩 已备案平台</div>\n        <div class=\"tag-item\">✔ 已验证真实性</div>\n      </div>\n    </div>\n    \n    <div class=\"section\">\n      <h2>🌐 第三方 API 提供方列表</h2>\n      <div class=\"providers-table\">\n        <table>\n          <thead>\n            <tr>\n              <th>序号</th>\n              <th>网站</th>\n              <th>链接</th>\n              <th>标签</th>\n              <th>备注</th>\n            </tr>\n          </thead>\n          <tbody>\n            <tr><td>1</td><td>chat01（推荐，含邀请码）</td><td><a href=\"https://chat01.ai/?ref=j45ikbTa\" target=\"_blank\">https://chat01.ai</a></td><td>🔓✌🎁💰✔</td><td>支持Pro，解决降智问题，每天免费2积分，聊天+API同站</td></tr>\n            <tr><td>2</td><td>硅基流动（企业级）</td><td><a href=\"https://cloud.siliconflow.cn/i/ZKV30bdG\" target=\"_blank\">https://cloud.siliconflow.cn</a></td><td>🔓🎉🚀🚩✔</td><td>华为云昇腾服务，注册送14元</td></tr>\n            <tr><td>3</td><td>zenmux(推荐，含免费gemini3及画图)</td><td><a href=\"https://zenmux.ai/invite/U1QU1H\" target=\"_blank\">https://zenmux.ai</a></td><td>🔓✌🎁💰</td><td>免费gemini3pro,全球首个支持赔付的大模型聚合</td></tr>\n            <tr><td>4</td><td>PoloAPI</td><td><a href=\"https://poloai.top\" target=\"_blank\">https://poloai.top</a></td><td>🔓💪✌🎉🎁💰</td><td>新用户注册送0.3 $额度，聚合Claude/Grok/OpenAI等多模型</td></tr>\n            <tr><td>5</td><td>OAIPro</td><td><a href=\"https://api.oaipro.com\" target=\"_blank\">https://api.oaipro.com</a></td><td>💰✌💪</td><td>官方费率，稳定直连，支持OpenAI与Claude接口</td></tr>\n            <tr><td>6</td><td>VoAPI</td><td><a href=\"https://demo.voapi.top\" target=\"_blank\">https://demo.voapi.top</a></td><td>🆓😆💪✌</td><td>【全公益网站】余额每日清零</td></tr>\n            <tr><td>7</td><td>inscopilot(推荐)</td><td><a href=\"https://instcopilot-api.com/register?aff=Q2Z0\" target=\"_blank\">https://instcopilot-api.com</a></td><td>✌🎉😆🚀</td><td>赠$5，稳定便宜，支持cc</td></tr>\n            <tr><td>8</td><td>V3 API（混合版）</td><td><a href=\"https://api.v3.cm\" target=\"_blank\">https://api.v3.cm</a></td><td>🚀🔓💪🎁🎉✌</td><td>赠$0.2，高并发，3折充值，超多模型</td></tr>\n            <tr><td>9</td><td>V3 API（官转版）</td><td><a href=\"https://gf.gpt.ge\" target=\"_blank\">https://gf.gpt.ge</a></td><td>🚀🌹🔓💪</td><td>赠$0.2，高并发，6折充值</td></tr>\n            <tr><td>10</td><td>openai-hk</td><td><a href=\"https://openai-hk.com\" target=\"_blank\">https://openai-hk.com</a></td><td>🆓🔓🎉✌💪🚀</td><td>赠1元，超高并发，含GPT-3.5公益版</td></tr>\n            <tr><td>11</td><td>ChatGPT API 水龙头</td><td><a href=\"https://faucet.openkey.cloud\" target=\"_blank\">https://faucet.openkey.cloud</a></td><td>🆓</td><td>免费$1额度，3天有效期</td></tr>\n            <tr><td>12</td><td>公益免费的ChatGPT API</td><td><a href=\"https://github.com/popjane/free_chatgpt_api\" target=\"_blank\">GitHub</a></td><td>🆓</td><td>公益免费</td></tr>\n            <tr><td>13</td><td>GPT-API-free</td><td><a href=\"https://github.com/chuyuewei/ChatGPT-API\" target=\"_blank\">GitHub</a></td><td>🆓💪</td><td>支持GPT-4，每天3次</td></tr>\n            <tr><td>14</td><td>openkey</td><td><a href=\"https://openkey.cloud\" target=\"_blank\">https://openkey.cloud</a></td><td>🔓💪✌🚀</td><td>赠$0.2，支持多并发</td></tr>\n            <tr><td>15</td><td>gptgod.online</td><td><a href=\"https://gptgod.online\" target=\"_blank\">https://gptgod.online</a></td><td>💪✌🎁💰🎉😆</td><td>按次计费，积分额度</td></tr>\n            <tr><td>16</td><td>m3.ckit.gold</td><td><a href=\"https://m3.ckit.gold\" target=\"_blank\">https://m3.ckit.gold</a></td><td>💰💪✌</td><td>3元/刀，注册送$0.1</td></tr>\n            <tr><td>17</td><td>iaicnn</td><td><a href=\"https://aicnn.cn\" target=\"_blank\">https://aicnn.cn</a></td><td>💪✌🎁💰🎉</td><td>老用户支持api，目前已迁移</td></tr>\n            <tr><td>18</td><td>goapi.gptnb.ai</td><td><a href=\"https://goapi.gptnb.ai\" target=\"_blank\">https://goapi.gptnb.ai</a></td><td>💪✌🎁💰🎉</td><td></td></tr>\n            <tr><td>19</td><td>api.aigc369.com</td><td><a href=\"https://api.aigc369.com/pricing\" target=\"_blank\">https://api.aigc369.com</a></td><td>💪✌🎁💰🎉</td><td></td></tr>\n            <tr><td>20</td><td>api.mjdjourney.cn</td><td><a href=\"https://api.mjdjourney.cn\" target=\"_blank\">https://api.mjdjourney.cn</a></td><td>💪✌🎁💰🎉</td><td></td></tr>\n            <tr><td>21</td><td>api.bltcy.ai</td><td><a href=\"https://api.bltcy.ai\" target=\"_blank\">https://api.bltcy.ai</a></td><td>💪✌🎁💰🎉</td><td></td></tr>\n            <tr><td>22</td><td>4Z API 中转站</td><td><a href=\"https://zzzzapi.com\" target=\"_blank\">https://zzzzapi.com</a></td><td>🔓✌💪🎉🚀</td><td>支持GPT-4o、Claude 3.5，新用户赠0.2额度。</td></tr>\n            <tr><td>23</td><td>简易API中转站</td><td><a href=\"https://jeniya.top\" target=\"_blank\">https://jeniya.top</a></td><td>🔓✌💪🎉🚀</td><td>聚合多模型，国内直连无限制，注册送100元测试额度。</td></tr>\n            <tr><td>24</td><td>CloseAI</td><td><a href=\"https://closeai-asia.com\" target=\"_blank\">https://closeai-asia.com</a></td><td>💰✌💪🎉🚀</td><td>企业级代理，支持GPT-4o、Claude 3.5，提供中文技术支持。</td></tr>\n            <tr><td>25</td><td>云鲸AI</td><td><a href=\"https://api.atalk-ai.com\" target=\"_blank\">https://api.atalk-ai.com</a></td><td>🔓✌💪🎉🚀</td><td>聚合ChatGPT、Claude、文心一言，注册赠5元体验券。</td></tr>\n            <tr><td>26</td><td>ModelBridge</td><td><a href=\"https://model-bridge.okeeper.com\" target=\"_blank\">https://model-bridge.okeeper.com</a></td><td>🔓✌💪🎉🚀</td><td>国内免费代理，兼容OpenAI接口和国产模型（如文心一言）。</td></tr>\n            <tr><td>27</td><td>UiUi API</td><td><a href=\"https://sg.uiuiapi.com\" target=\"_blank\">https://sg.uiuiapi.com</a></td><td>🔓✌💪🎉🚀</td><td>支持Claude 4、Gemini等模型，兼容OpenAI接口格式。</td></tr>\n            <tr><td>28</td><td>老张API中转服务</td><td><a href=\"https://api.laozhang.ai\" target=\"_blank\">https://api.laozhang.ai</a></td><td>🔓✌💪🎉🚀</td><td>支持Claude 3和GPT-4o，新用户赠20元额度，支持支付宝/微信支付。</td></tr>\n            <tr><td>29</td><td>海鲸AI聚合平台</td><td><a href=\"https://ai.atalk-ai.com\" target=\"_blank\">https://ai.atalk-ai.com</a></td><td>🔓✌💪🎉🚀</td><td>国内备案平台，支持多模型统一API接入。</td></tr>\n            <tr><td>30</td><td>One API</td><td><a href=\"https://one-api.ai\" target=\"_blank\">https://one-api.ai</a></td><td>🔓✌💪🎉🚀</td><td>开源接口管理系统，支持多模型分发和私有化部署。</td></tr>\n            <tr><td>31</td><td>OpenRouter</td><td><a href=\"https://openrouter.ai\" target=\"_blank\">https://openrouter.ai</a></td><td>🔓✌💪🎉🚀</td><td>支持293个模型（含OpenAI、Claude、Gemini），提供免费额度。</td></tr>\n            <tr><td>32</td><td>Gemini API代理</td><td><a href=\"https://gemini-proxy.com\" target=\"_blank\">https://gemini-proxy.com</a></td><td>🔓✌🎉🚀</td><td>支持Google Gemini模型，兼容OpenAI接口，提供免费额度。</td></tr>\n            <tr><td>33</td><td>DeepSeek API聚合</td><td><a href=\"https://deepseek-aggregator.com\" target=\"_blank\">https://deepseek-aggregator.com</a></td><td>🔓💪🎉🚀</td><td>聚合DeepSeek系列模型，提供免费测试额度。</td></tr>\n            <tr><td>34</td><td>Hugging Face模型代理</td><td><a href=\"https://huggingface.co/inference-api\" target=\"_blank\">https://huggingface.co/inference-api</a></td><td>🔓💪🎉🚀</td><td>支持开源模型（如Llama 3），提供免费额度和企业级服务。</td></tr>\n            <tr><td>35</td><td>AI21 Labs官方代理</td><td><a href=\"https://studio.ai21.com\" target=\"_blank\">https://studio.ai21.com</a></td><td>💰✌💪🎉</td><td>支持Jurassic-2模型，适合自然语言处理任务。</td></tr>\n            <tr><td>36</td><td>Cohere API代理</td><td><a href=\"https://cohere.ai\" target=\"_blank\">https://cohere.ai</a></td><td>💰✌💪🎉</td><td>支持文本生成和分类模型，提供企业级API。</td></tr>\n            <tr><td>37</td><td>AI API聚合平台</td><td><a href=\"https://api.ai-aggregator.com\" target=\"_blank\">https://api.ai-aggregator.com</a></td><td>🔓✌💪🎉🚀</td><td>聚合多模型，提供统一接口和负载均衡。</td></tr>\n            <tr><td>38</td><td>AI.LS</td><td><a href=\"https://ai.ls\" target=\"_blank\">https://ai.ls</a></td><td>🆓✌</td><td>极简接口，GPT-3.5免费匿名使用</td></tr>\n            <tr><td>39</td><td>简易API</td><td><a href=\"https://jeniya.top\" target=\"_blank\">https://jeniya.top</a></td><td>🔓✌💪🎉🎁</td><td>注册送¥100额度，支持Claude/GPT-4o多模型</td></tr>\n            <tr><td>40</td><td>OpenAI120</td><td><a href=\"https://openai120.com\" target=\"_blank\">https://openai120.com</a></td><td>🔓✌🎁</td><td>新用户送$3额度，单价同官方</td></tr>\n            <tr><td>41</td><td>DuckAGI</td><td><a href=\"https://duckagi.com\" target=\"_blank\">https://duckagi.com</a></td><td>💰✌🎉🚀</td><td>多模态支持GPT-4o/Sora，适合AI绘图</td></tr>\n            <tr><td>42</td><td>Aihubmix</td><td><a href=\"https://aihubmix.com\" target=\"_blank\">https://aihubmix.com</a></td><td>💰🎉</td><td>国产模型聚合（文心一言/通义千问）</td></tr>\n            <tr><td>43</td><td>WokaAI</td><td><a href=\"https://wokaai.com\" target=\"_blank\">https://wokaai.com</a></td><td>✌</td><td>双线路</td></tr>\n            <tr><td>44</td><td>azapi</td><td><a href=\"https://azapi.com.cn\" target=\"_blank\">https://azapi.com.cn</a></td><td>💰</td><td>长期使用优惠</td></tr>\n            <tr><td>45</td><td>ClaudeAPI</td><td><a href=\"https://claudeapi.io\" target=\"_blank\">https://claudeapi.io</a></td><td>💪🚀✔</td><td>Anthropic官方合作，支持文件解析</td></tr>\n            <tr><td>46</td><td>Gala API</td><td><a href=\"https://galaapi.com\" target=\"_blank\">https://galaapi.com</a></td><td>🎉🚀</td><td>谷歌Gemini专用高速通道</td></tr>\n            <tr><td>47</td><td>Google AI Studio</td><td><a href=\"https://ai.google.dev\" target=\"_blank\">https://ai.google.dev</a></td><td>🆓🌎✔</td><td>Gemini系列完全免费，需科学上网访问</td></tr>\n            <tr><td>48</td><td>OpenAI 数据共享计划</td><td><a href=\"https://platform.openai.com\" target=\"_blank\">https://platform.openai.com</a></td><td>🔓✌🌎</td><td>开启数据共享后每日最高获1 M免费tokens</td></tr>\n            <tr><td>49</td><td>Mistral AI La Plateforme</td><td><a href=\"https://platform.mistral.ai\" target=\"_blank\">https://platform.mistral.ai</a></td><td>🔓🎉🌎</td><td>官方平台提供免费API试用额度（受限速率）</td></tr>\n            <tr><td>50</td><td>Cohere</td><td><a href=\"https://cohere.com\" target=\"_blank\">https://cohere.com</a></td><td>🔓🎉🌎</td><td>注册可获Trial Key，免费调用但有速率限制</td></tr>\n            <tr><td>51</td><td>魔搭 ModelScope</td><td><a href=\"https://modelscope.cn\" target=\"_blank\">https://modelscope.cn</a></td><td>🔓🎉🚩</td><td>聚合DeepSeek/Qwen等模型，模型试用与下载免费</td></tr>\n            <tr><td>52</td><td>字节 方舟协作奖励计划</td><td><a href=\"https://www.volcengine.com/product/ark\" target=\"_blank\">https://www.volcengine.com/product/ark</a></td><td>🔓🎉</td><td>参与计划单模型每天送50万Tokens</td></tr>\n            <tr><td>53</td><td>智谱 BigModel</td><td><a href=\"https://open.bigmodel.cn\" target=\"_blank\">https://open.bigmodel.cn</a></td><td>🆓🎉</td><td>GLM-4-Flash API完全免费，支持128K上下文</td></tr>\n            <tr><td>54</td><td>书生 InternLM</td><td><a href=\"https://internlm.intern-ai.org.cn\" target=\"_blank\">https://internlm.intern-ai.org.cn</a></td><td>🆓🎉</td><td>官方开放免费API，可直接调用</td></tr>\n            <tr><td>55</td><td>GitHub Models</td><td><a href=\"https://docs.github.com/github-models\" target=\"_blank\">https://docs.github.com/github-models</a></td><td>🔓✌🎉🌎</td><td>Azure托管，提供受限免费API配额</td></tr>\n            <tr><td>56</td><td>OpenRouter（免费版）</td><td><a href=\"https://openrouter.ai\" target=\"_blank\">https://openrouter.ai</a></td><td>🔓💪✌🎉🌎✔</td><td>免费模型每日≤50次，余额≥10 $可升至1000次</td></tr>\n            <tr><td>57</td><td>Chutes</td><td><a href=\"https://chutes.ai\" target=\"_blank\">https://chutes.ai</a></td><td>🔓🎉</td><td>部分模型每日200条免费额度，支持DeepSeek等</td></tr>\n            <tr><td>58</td><td>Groq Cloud</td><td><a href=\"https://groq.com/groqcloud\" target=\"_blank\">https://groq.com/groqcloud</a></td><td>🔓🎉🌎</td><td>可申请免费API Key，OpenAI兼容端点，推理速度极快</td></tr>\n            <tr><td>59</td><td>Cerebras Inference</td><td><a href=\"https://inference.cerebras.ai\" target=\"_blank\">https://inference.cerebras.ai</a></td><td>🔓🎉🌎🚀</td><td>开发者每日享1 M免费tokens，LLM推理可达450 t/s+</td></tr>\n            <tr><td>60</td><td>无问芯穹 GenStudio</td><td><a href=\"https://cloud.infini-ai.com/genstudio\" target=\"_blank\">https://cloud.infini-ai.com/genstudio</a></td><td>🆓🎉</td><td>DeepSeek R1/V3满血版免费Token，无需邀请码</td></tr>\n          </tbody>\n        </table>\n      </div>\n    </div>\n    \n    <div class=\"section\">\n      <h2>📱 推荐应用支持</h2>\n      <details>\n        <summary>📦 点击展开查看兼容应用列表</summary>\n        <div class=\"apps-grid\">\n          <div class=\"app-card\">\n            <h4>✅ <a href=\"https://github.com/CherryHQ/cherry-studio\" target=\"_blank\">Cherry Studio</a></h4>\n            <p>跨平台桌面端 + 移动端，集成主流 AI 云服务 + 本地模型。</p>\n          </div>\n          <div class=\"app-card\">\n            <h4>✅ <a href=\"https://u.tools/plugins/detail/ChatGPT.%E5%A5%BD%E5%8F%8B/\" target=\"_blank\">ChatGPT 好友插件 (uTools)</a></h4>\n            <p>桌面端智能聊天插件，支持角色设定、多模型、多会话管理。</p>\n          </div>\n          <div class=\"app-card\">\n            <h4>✅ <a href=\"https://github.com/Yidadaa/ChatGPT-Next-Web\" target=\"_blank\">ChatGPT-Next-Web</a></h4>\n            <p>开源网页端 ChatGPT 前端，支持 API Key 与多用户协作。</p>\n          </div>\n          <div class=\"app-card\">\n            <h4>✅ <a href=\"https://github.com/lobehub/lobe-chat\" target=\"_blank\">LobeChat</a></h4>\n            <p>支持视觉、语音交互和多模型切换，网页端 AI 会话框架。</p>\n          </div>\n          <div class=\"app-card\">\n            <h4>✅ <a href=\"https://botgem.com/\" target=\"_blank\">BotGem</a></h4>\n            <p>移动端优先设计，支持语音交流与 AI 好友系统。</p>\n          </div>\n          <div class=\"app-card\">\n            <h4>✅ <a href=\"https://github.com/Bin-Huang/chatbox\" target=\"_blank\">ChatBox</a></h4>\n            <p>支持 iOS、Android 和桌面端，界面现代，功能完整。</p>\n          </div>\n          <div class=\"app-card\">\n            <h4>✅ <a href=\"https://github.com/labring/FastGPT\" target=\"_blank\">FastGPT</a></h4>\n            <p>知识库 + 工作流集成，企业内训/客服场景首选。</p>\n          </div>\n          <div class=\"app-card\">\n            <h4>✅ <a href=\"https://github.com/Mintplex-Labs/anything-llm\" target=\"_blank\">AnythingLLM</a></h4>\n            <p>支持本地部署与插件扩展，适合对数据隐私有要求的用户。</p>\n          </div>\n        </div>\n      </details>\n    </div>\n    \n    <div class=\"section\">\n      <h2>📖 使用指南</h2>\n      <ol class=\"usage-steps\">\n        <li>🔑 <strong>获取 API Key</strong>：注册平台后，在用户中心复制</li>\n        <li>⚙ <strong>配置 Endpoint</strong>：填写 API 地址到支持应用中</li>\n        <li>🤖 <strong>选择模型</strong>：根据平台支持情况切换不同模型</li>\n        <li>📊 <strong>用量监控</strong>：推荐使用客户端自带用量限制功能</li>\n      </ol>\n    </div>\n    \n    <div class=\"section\">\n      <h2>🙌 贡献指南</h2>\n      <p>我们欢迎以下贡献方式：</p>\n      <ul style=\"margin-left: 20px; margin-top: 10px;\">\n        <li>✨ 添加新 API 提供商（需稳定运行 ≥ 3 天）</li>\n        <li>🧰 补充使用教程（包括配置截图、录屏）</li>\n        <li>🧪 开发验证脚本（自动检测失效平台）</li>\n        <li>🌍 多语言翻译（如：英文、日文、韩文等）</li>\n      </ul>\n      <p style=\"margin-top: 15px;\">💡 请提交 Pull Request 或 Issue，我们将尽快处理！</p>\n    </div>\n    \n    <div class=\"section\">\n      <h2>❌ 失效平台列表</h2>\n      <details>\n        <summary>📛 点击展开查看失效平台</summary>\n        <table style=\"width: 100%; margin-top: 15px;\">\n          <thead>\n            <tr>\n              <th>#</th>\n              <th>名称</th>\n              <th>链接</th>\n              <th>状态</th>\n            </tr>\n          </thead>\n          <tbody>\n            <tr>\n              <td>1</td>\n              <td>464888</td>\n              <td><a href=\"https://api.464888.xyz\" target=\"_blank\">api.464888.xyz</a></td>\n              <td>❌ 无法访问</td>\n            </tr>\n          </tbody>\n        </table>\n        <p style=\"margin-top: 10px;\">💡 如发现新失效平台，欢迎通过 Issue 提交！</p>\n      </details>\n    </div>\n    \n    <div class=\"section\">\n      <h2>⚖️ 法律免责声明</h2>\n      <ul style=\"margin-left: 20px;\">\n        <li>本项目不存储任何 API Key，也不提供代理或转发服务。</li>\n        <li>所有平台来源于互联网，使用风险请自行评估。</li>\n        <li>若因使用第三方服务造成损失，作者不承担任何法律责任。</li>\n      </ul>\n    </div>\n    \n    <div class=\"section\">\n      <h2>🙏 特别鸣谢</h2>\n      <p>非常感谢 <strong>zenmux</strong> 提供 API 平台支持！<br>\n      <a href=\"https://zenmux.ai/invite/U1QU1H\" target=\"_blank\">立即注册并使用优惠码</a></p>\n      \n      <p style=\"margin-top: 15px;\">非常感谢 <strong>chat01</strong> 提供服务支持！<br>\n      <a href=\"https://chat01.ai/?ref=j45ikbTa\" target=\"_blank\">访问 chat01 并使用优惠码</a></p>\n      \n      <p style=\"margin-top: 15px;\">\n        <a href=\"https://dartnode.com\" target=\"_blank\">\n          <img src=\"https://dartnode.com/branding/DN-Open-Source-sm.png\" alt=\"Powered by DartNode\">\n        </a>\n      </p>\n    </div>\n    \n    <footer>\n      <p style=\"margin-bottom: 15px;\">\n        <a href=\"https://star-history.com/#TechnologyStar/Openai-Claude-Deepseek-API-provider&Date\" target=\"_blank\">\n          <img src=\"https://api.star-history.com/svg?repos=TechnologyStar/Openai-Claude-Deepseek-API-provider&type=Date\" alt=\"Star History\" style=\"max-width: 100%; height: auto;\">\n        </a>\n      </p>\n      <p>Made with ❤️ by <a href=\"https://github.com/TechnologyStar\" target=\"_blank\">TechnologyStar</a></p>\n      <p style=\"margin-top: 10px; font-size: 0.9em; color: #666;\">\n        <a href=\"https://github.com/TechnologyStar/Openai-Claude-Deepseek-API-provider\" target=\"_blank\">GitHub 仓库</a>\n      </p>\n    </footer>\n  </div>\n</body>\n</html>\n"
  },
  {
    "path": "website/package.json",
    "content": "{\n  \"name\": \"rest-express\",\n  \"version\": \"1.0.0\",\n  \"type\": \"module\",\n  \"license\": \"MIT\",\n  \"scripts\": {\n    \"dev\": \"NODE_ENV=development tsx server/index.ts\",\n    \"build\": \"vite build && esbuild server/index.ts --platform=node --packages=external --bundle --format=esm --outdir=dist\",\n    \"start\": \"NODE_ENV=production node dist/index.js\",\n    \"check\": \"tsc\",\n    \"db:push\": \"drizzle-kit push\"\n  },\n  \"dependencies\": {\n    \"@hookform/resolvers\": \"^3.10.0\",\n    \"@jridgewell/trace-mapping\": \"^0.3.25\",\n    \"@neondatabase/serverless\": \"^0.10.4\",\n    \"@radix-ui/react-accordion\": \"^1.2.4\",\n    \"@radix-ui/react-alert-dialog\": \"^1.1.7\",\n    \"@radix-ui/react-aspect-ratio\": \"^1.1.3\",\n    \"@radix-ui/react-avatar\": \"^1.1.4\",\n    \"@radix-ui/react-checkbox\": \"^1.1.5\",\n    \"@radix-ui/react-collapsible\": \"^1.1.4\",\n    \"@radix-ui/react-context-menu\": \"^2.2.7\",\n    \"@radix-ui/react-dialog\": \"^1.1.7\",\n    \"@radix-ui/react-dropdown-menu\": \"^2.1.7\",\n    \"@radix-ui/react-hover-card\": \"^1.1.7\",\n    \"@radix-ui/react-label\": \"^2.1.3\",\n    \"@radix-ui/react-menubar\": \"^1.1.7\",\n    \"@radix-ui/react-navigation-menu\": \"^1.2.6\",\n    \"@radix-ui/react-popover\": \"^1.1.7\",\n    \"@radix-ui/react-progress\": \"^1.1.7\",\n    \"@radix-ui/react-radio-group\": \"^1.2.4\",\n    \"@radix-ui/react-scroll-area\": \"^1.2.4\",\n    \"@radix-ui/react-select\": \"^2.1.7\",\n    \"@radix-ui/react-separator\": \"^1.1.3\",\n    \"@radix-ui/react-slider\": \"^1.2.4\",\n    \"@radix-ui/react-slot\": \"^1.2.0\",\n    \"@radix-ui/react-switch\": \"^1.1.4\",\n    \"@radix-ui/react-tabs\": \"^1.1.4\",\n    \"@radix-ui/react-toast\": \"^1.2.7\",\n    \"@radix-ui/react-toggle\": \"^1.1.3\",\n    \"@radix-ui/react-toggle-group\": \"^1.1.3\",\n    \"@radix-ui/react-tooltip\": \"^1.2.0\",\n    \"@tanstack/react-query\": \"^5.60.5\",\n    \"class-variance-authority\": \"^0.7.1\",\n    \"clsx\": \"^2.1.1\",\n    \"cmdk\": \"^1.1.1\",\n    \"connect-pg-simple\": \"^10.0.0\",\n    \"date-fns\": \"^3.6.0\",\n    \"drizzle-orm\": \"^0.39.1\",\n    \"drizzle-zod\": \"^0.7.0\",\n    \"embla-carousel-react\": \"^8.6.0\",\n    \"express\": \"^4.21.2\",\n    \"express-session\": \"^1.18.1\",\n    \"framer-motion\": \"^11.13.1\",\n    \"input-otp\": \"^1.4.2\",\n    \"lucide-react\": \"^0.453.0\",\n    \"memorystore\": \"^1.6.7\",\n    \"next-themes\": \"^0.4.6\",\n    \"passport\": \"^0.7.0\",\n    \"passport-local\": \"^1.0.0\",\n    \"react\": \"^18.3.1\",\n    \"react-day-picker\": \"^8.10.1\",\n    \"react-dom\": \"^18.3.1\",\n    \"react-hook-form\": \"^7.55.0\",\n    \"react-icons\": \"^5.4.0\",\n    \"react-resizable-panels\": \"^2.1.7\",\n    \"recharts\": \"^2.15.2\",\n    \"tailwind-merge\": \"^2.6.0\",\n    \"tailwindcss-animate\": \"^1.0.7\",\n    \"tw-animate-css\": \"^1.2.5\",\n    \"vaul\": \"^1.1.2\",\n    \"wouter\": \"^3.3.5\",\n    \"ws\": \"^8.18.0\",\n    \"zod\": \"^3.24.2\",\n    \"zod-validation-error\": \"^3.4.0\"\n  },\n  \"devDependencies\": {\n    \"@replit/vite-plugin-cartographer\": \"^0.2.7\",\n    \"@replit/vite-plugin-runtime-error-modal\": \"^0.0.3\",\n    \"@tailwindcss/typography\": \"^0.5.15\",\n    \"@tailwindcss/vite\": \"^4.1.3\",\n    \"@types/connect-pg-simple\": \"^7.0.3\",\n    \"@types/express\": \"4.17.21\",\n    \"@types/express-session\": \"^1.18.0\",\n    \"@types/node\": \"20.16.11\",\n    \"@types/passport\": \"^1.0.16\",\n    \"@types/passport-local\": \"^1.0.38\",\n    \"@types/react\": \"^18.3.11\",\n    \"@types/react-dom\": \"^18.3.1\",\n    \"@types/ws\": \"^8.5.13\",\n    \"@vitejs/plugin-react\": \"^4.3.2\",\n    \"autoprefixer\": \"^10.4.20\",\n    \"drizzle-kit\": \"^0.30.4\",\n    \"esbuild\": \"^0.25.0\",\n    \"postcss\": \"^8.4.47\",\n    \"tailwindcss\": \"^3.4.17\",\n    \"tsx\": \"^4.19.1\",\n    \"typescript\": \"5.6.3\",\n    \"vite\": \"^5.4.19\"\n  },\n  \"optionalDependencies\": {\n    \"bufferutil\": \"^4.0.8\"\n  }\n}\n"
  },
  {
    "path": "website/postcss.config.js",
    "content": "export default {\n  plugins: {\n    tailwindcss: {},\n    autoprefixer: {},\n  },\n}\n"
  },
  {
    "path": "website/replit.md",
    "content": "# OpenAI / Claude / DeepSeek API Provider Directory\n\n## Overview\n\nThis is a full-stack web application that serves as a directory for third-party API providers offering OpenAI, Claude, and DeepSeek APIs. The application is built with a modern React frontend and Express.js backend, designed to help users discover and compare different API providers for learning and research purposes.\n\n## System Architecture\n\nThe application follows a traditional client-server architecture with clear separation of concerns:\n\n- **Frontend**: React-based SPA using Vite for bundling and development\n- **Backend**: Express.js REST API server\n- **Database**: PostgreSQL with Drizzle ORM for type-safe database operations\n- **Styling**: Tailwind CSS with shadcn/ui component library for consistent UI\n- **State Management**: TanStack Query for server state management\n- **Routing**: Wouter for lightweight client-side routing\n\n## Key Components\n\n### Frontend Architecture\n- **Component-Based**: Uses shadcn/ui components for consistent design system\n- **Internationalization**: Multi-language support with context-based language switching\n- **Responsive Design**: Mobile-first approach with Tailwind CSS\n- **Type Safety**: Full TypeScript implementation with shared types\n\n### Backend Architecture\n- **RESTful API**: Express.js server with structured route handling\n- **Storage Abstraction**: Interface-based storage layer supporting both in-memory and database implementations\n- **Type Safety**: Shared schema definitions between frontend and backend\n- **Middleware**: Request logging and error handling middleware\n\n### Database Schema\n- **API Providers Table**: Stores information about third-party API providers including name, URL, tags, and metadata\n- **Recommended Apps Table**: Contains curated applications that work with the API providers\n- **Flexible Tagging**: JSON-based tag system for categorizing providers and apps\n\n### UI Components\n- **Providers Table**: Searchable and filterable table of API providers\n- **Tags Legend**: Visual explanation of provider capabilities and features\n- **Recommended Apps**: Grid layout showcasing compatible applications\n- **Usage Guide**: Step-by-step instructions for using the APIs\n- **Contribution Section**: Information for community contributions\n\n## Data Flow\n\n1. **Initial Load**: Client fetches API providers and recommended apps from REST endpoints\n2. **Filtering**: Client-side filtering based on search terms and tag categories\n3. **User Interactions**: Real-time UI updates with optimistic loading states\n4. **Data Persistence**: All changes go through the backend API to ensure consistency\n\n## External Dependencies\n\n### Frontend Dependencies\n- **React**: Core UI library with hooks-based architecture\n- **TanStack Query**: Server state management and caching\n- **Radix UI**: Accessible component primitives\n- **Tailwind CSS**: Utility-first CSS framework\n- **Lucide React**: Consistent icon library\n\n### Backend Dependencies\n- **Express.js**: Web application framework\n- **Drizzle ORM**: Type-safe database operations\n- **Neon Database**: Serverless PostgreSQL provider\n- **Zod**: Runtime type validation\n\n### Development Tools\n- **Vite**: Fast build tool and development server\n- **TypeScript**: Static type checking\n- **ESBuild**: Fast JavaScript bundler for production\n\n## Deployment Strategy\n\nThe application is configured for deployment on Replit with the following setup:\n\n- **Development**: `npm run dev` runs both frontend and backend in development mode\n- **Build Process**: Vite builds the frontend, ESBuild bundles the backend\n- **Production**: Serves static files through Express with API routes\n- **Database**: Uses PostgreSQL module provided by Replit environment\n- **Port Configuration**: Configured to run on port 5000 with external port 80\n\nThe build process creates optimized bundles for both client and server code, with the frontend assets served as static files by the Express server in production.\n\n## Changelog\n\n```\nChangelog:\n- June 27, 2025. Initial setup\n```\n\n## User Preferences\n\n```\nPreferred communication style: Simple, everyday language.\n```"
  },
  {
    "path": "website/server/index.ts",
    "content": "import express, { type Request, Response, NextFunction } from \"express\";\nimport { registerRoutes } from \"./routes\";\nimport { setupVite, serveStatic, log } from \"./vite\";\n\nconst app = express();\napp.use(express.json());\napp.use(express.urlencoded({ extended: false }));\n\napp.use((req, res, next) => {\n  const start = Date.now();\n  const path = req.path;\n  let capturedJsonResponse: Record<string, any> | undefined = undefined;\n\n  const originalResJson = res.json;\n  res.json = function (bodyJson, ...args) {\n    capturedJsonResponse = bodyJson;\n    return originalResJson.apply(res, [bodyJson, ...args]);\n  };\n\n  res.on(\"finish\", () => {\n    const duration = Date.now() - start;\n    if (path.startsWith(\"/api\")) {\n      let logLine = `${req.method} ${path} ${res.statusCode} in ${duration}ms`;\n      if (capturedJsonResponse) {\n        logLine += ` :: ${JSON.stringify(capturedJsonResponse)}`;\n      }\n\n      if (logLine.length > 80) {\n        logLine = logLine.slice(0, 79) + \"…\";\n      }\n\n      log(logLine);\n    }\n  });\n\n  next();\n});\n\n(async () => {\n  const server = await registerRoutes(app);\n\n  app.use((err: any, _req: Request, res: Response, _next: NextFunction) => {\n    const status = err.status || err.statusCode || 500;\n    const message = err.message || \"Internal Server Error\";\n\n    res.status(status).json({ message });\n    throw err;\n  });\n\n  // importantly only setup vite in development and after\n  // setting up all the other routes so the catch-all route\n  // doesn't interfere with the other routes\n  if (app.get(\"env\") === \"development\") {\n    await setupVite(app, server);\n  } else {\n    serveStatic(app);\n  }\n\n  // ALWAYS serve the app on port 5000\n  // this serves both the API and the client.\n  // It is the only port that is not firewalled.\n  const port = 5000;\n  server.listen({\n    port,\n    host: \"0.0.0.0\",\n    reusePort: true,\n  }, () => {\n    log(`serving on port ${port}`);\n  });\n})();\n"
  },
  {
    "path": "website/server/routes.ts",
    "content": "import type { Express } from \"express\";\nimport { createServer, type Server } from \"http\";\nimport { storage } from \"./storage\";\n\nexport async function registerRoutes(app: Express): Promise<Server> {\n  // API Providers routes\n  app.get(\"/api/providers\", async (req, res) => {\n    try {\n      const providers = await storage.getApiProviders();\n      res.json(providers);\n    } catch (error) {\n      res.status(500).json({ message: \"Failed to fetch API providers\" });\n    }\n  });\n\n  app.get(\"/api/providers/:id\", async (req, res) => {\n    try {\n      const id = parseInt(req.params.id);\n      const provider = await storage.getApiProvider(id);\n      \n      if (!provider) {\n        return res.status(404).json({ message: \"API provider not found\" });\n      }\n      \n      res.json(provider);\n    } catch (error) {\n      res.status(500).json({ message: \"Failed to fetch API provider\" });\n    }\n  });\n\n  // Recommended Apps routes\n  app.get(\"/api/apps\", async (req, res) => {\n    try {\n      const apps = await storage.getRecommendedApps();\n      res.json(apps);\n    } catch (error) {\n      res.status(500).json({ message: \"Failed to fetch recommended apps\" });\n    }\n  });\n\n  app.get(\"/api/apps/:id\", async (req, res) => {\n    try {\n      const id = parseInt(req.params.id);\n      const app = await storage.getRecommendedApp(id);\n      \n      if (!app) {\n        return res.status(404).json({ message: \"Recommended app not found\" });\n      }\n      \n      res.json(app);\n    } catch (error) {\n      res.status(500).json({ message: \"Failed to fetch recommended app\" });\n    }\n  });\n\n  const httpServer = createServer(app);\n  return httpServer;\n}\n"
  },
  {
    "path": "website/server/storage.ts",
    "content": "import { apiProviders, recommendedApps, type ApiProvider, type InsertApiProvider, type RecommendedApp, type InsertRecommendedApp } from \"@shared/schema\";\n\nexport interface IStorage {\n  getApiProviders(): Promise<ApiProvider[]>;\n  getApiProvider(id: number): Promise<ApiProvider | undefined>;\n  createApiProvider(provider: InsertApiProvider): Promise<ApiProvider>;\n  updateApiProvider(id: number, provider: Partial<InsertApiProvider>): Promise<ApiProvider | undefined>;\n  deleteApiProvider(id: number): Promise<boolean>;\n  \n  getRecommendedApps(): Promise<RecommendedApp[]>;\n  getRecommendedApp(id: number): Promise<RecommendedApp | undefined>;\n  createRecommendedApp(app: InsertRecommendedApp): Promise<RecommendedApp>;\n  updateRecommendedApp(id: number, app: Partial<InsertRecommendedApp>): Promise<RecommendedApp | undefined>;\n  deleteRecommendedApp(id: number): Promise<boolean>;\n}\n\nexport class MemStorage implements IStorage {\n  private apiProviders: Map<number, ApiProvider>;\n  private recommendedApps: Map<number, RecommendedApp>;\n  private currentApiProviderId: number;\n  private currentRecommendedAppId: number;\n\n  constructor() {\n    this.apiProviders = new Map();\n    this.recommendedApps = new Map();\n    this.currentApiProviderId = 1;\n    this.currentRecommendedAppId = 1;\n    \n    // Initialize with real data from the design reference\n    this.initializeData();\n  }\n\n  private initializeData() {\n    // API Providers data\n    const providersData = [\n      {\n        name: \"chat01\",\n        displayName: \"chat01（推荐）(含邀请码)\",\n        url: \"https://chat01.ai/?ref=j45ikbTa\",\n        tags: [\"🔓\", \"✌\", \"🎁\", \"💰\", \"✔\"],\n        notes: \"支持pro,解决降智问题，每天免费2积分，聊天+api同站\",\n        isRecommended: true,\n        sortOrder: 1\n      },\n      {\n        name: \"siliconflow\",\n        displayName: \"cloud.siliconflow.cn(推荐/企业级)\",\n        url: \"https://cloud.siliconflow.cn/i/ZKV30bdG\",\n        tags: [\"🔓\", \"💪\", \"✌\", \"🎉\", \"🚀\", \"🚩\", \"✔\"],\n        notes: \"华为云昇腾服务，实名送14元，每日最多请求100次\",\n        isRecommended: true,\n        sortOrder: 2\n      },\n      {\n        name: \"voapi\",\n        displayName: \"VoAPI\",\n        url: \"https://demo.voapi.top\",\n        tags: [\"🆓\", \"😆\", \"💪\", \"✌\"],\n        notes: \"【全公益网站】余额每日清零\",\n        sortOrder: 3\n      },\n      {\n        name: \"burn-hair\",\n        displayName: \"头顶冒火\",\n        url: \"https://burn.hair\",\n        tags: [\"✌\", \"🎉\", \"😆\", \"🚀\"],\n        notes: \"赠 $0.3，每日签到得额度，支持高并发\",\n        sortOrder: 4\n      },\n      {\n        name: \"v3-api-mixed\",\n        displayName: \"V3 API（混合版）\",\n        url: \"https://api.v3.cm\",\n        tags: [\"🚀\", \"🔓\", \"💪\", \"🎁\", \"🎉\", \"✌\"],\n        notes: \"赠 $0.2，高并发，3折充值，超多模型\",\n        sortOrder: 5\n      },\n      {\n        name: \"v3-api-official\",\n        displayName: \"V3 API（官转版）\",\n        url: \"https://gf.gpt.ge\",\n        tags: [\"🚀\", \"🌹\", \"🔓\", \"💪\"],\n        notes: \"赠 $0.2，高并发，6折充值\",\n        sortOrder: 6\n      },\n      {\n        name: \"openai-hk\",\n        displayName: \"openai-hk\",\n        url: \"https://openai-hk.com/\",\n        tags: [\"🆓\", \"🔓\", \"🎉\", \"✌\", \"💪\", \"🚀\"],\n        notes: \"赠1元，超高并发，含GPT3.5公益版\",\n        sortOrder: 7\n      },\n      {\n        name: \"faucet-openkey\",\n        displayName: \"ChatGPT API 水龙头\",\n        url: \"https://faucet.openkey.cloud/\",\n        tags: [\"🆓\"],\n        notes: \"免费$1额度，3天有效期\",\n        sortOrder: 8\n      },\n      {\n        name: \"free-chatgpt-api\",\n        displayName: \"公益免费的ChatGPT API\",\n        url: \"https://github.com/popjane/free_chatgpt_api\",\n        tags: [\"🆓\"],\n        notes: \"公益免费\",\n        sortOrder: 9\n      },\n      {\n        name: \"gpt-api-free\",\n        displayName: \"GPT-API-free\",\n        url: \"https://github.com/chuyuewei/ChatGPT-API\",\n        tags: [\"🆓\", \"💪\"],\n        notes: \"支持 GPT-4，每天3次\",\n        sortOrder: 10\n      },\n      {\n        name: \"openkey\",\n        displayName: \"openkey\",\n        url: \"https://openkey.cloud/\",\n        tags: [\"🔓\", \"💪\", \"✌\", \"🚀\"],\n        notes: \"赠$0.2，支持多并发\",\n        sortOrder: 11\n      },\n      {\n        name: \"gptgod\",\n        displayName: \"gptgod.online\",\n        url: \"https://gptgod.online/\",\n        tags: [\"💪\", \"✌\", \"🎁\", \"💰\", \"🎉\", \"😆\"],\n        notes: \"按次计费，积分额度\",\n        sortOrder: 12\n      },\n      {\n        name: \"m3-ckit\",\n        displayName: \"m3.ckit.gold\",\n        url: \"https://m3.ckit.gold/\",\n        tags: [\"💰\", \"💪\", \"✌\"],\n        notes: \"3元/刀，注册送$0.1\",\n        sortOrder: 13\n      },\n      {\n        name: \"xiaotu-api\",\n        displayName: \"小兔api\",\n        url: \"https://api.aischat.xy\",\n        tags: [\"🆓\", \"💪\", \"✌\"],\n        notes: \"\",\n        sortOrder: 14\n      },\n      {\n        name: \"goapi-gptnb\",\n        displayName: \"goapi.gptnb.ai\",\n        url: \"https://goapi.gptnb.ai/\",\n        tags: [\"💪\", \"✌\", \"🎁\", \"💰\", \"🎉\"],\n        notes: \"\",\n        sortOrder: 15\n      },\n      {\n        name: \"api-aigc369\",\n        displayName: \"api.aigc369.com\",\n        url: \"https://api.aigc369.com/pricing\",\n        tags: [\"💪\", \"✌\", \"🎁\", \"💰\", \"🎉\"],\n        notes: \"\",\n        sortOrder: 16\n      },\n      {\n        name: \"api-mjdjourney\",\n        displayName: \"api.mjdjourney.cn\",\n        url: \"https://api.mjdjourney.cn/\",\n        tags: [\"💪\", \"✌\", \"🎁\", \"💰\", \"🎉\"],\n        notes: \"\",\n        sortOrder: 17\n      },\n      {\n        name: \"api-bltcy\",\n        displayName: \"api.bltcy.ai\",\n        url: \"https://api.bltcy.ai/\",\n        tags: [\"💪\", \"✌\", \"🎁\", \"💰\", \"🎉\"],\n        notes: \"\",\n        sortOrder: 18\n      },\n      {\n        name: \"4z-api\",\n        displayName: \"4Z API 中转站\",\n        url: \"https://zzzzapi.com/\",\n        tags: [\"🔓\", \"✌\", \"💪\", \"🎉\", \"🚀\"],\n        notes: \"华为云昇腾服务，支持GPT-4o、Claude 3.5，新用户赠100元额度，适合企业级高并发场景。\",\n        sortOrder: 19\n      },\n      {\n        name: \"jeniya-api\",\n        displayName: \"简易API中转站\",\n        url: \"https://jeniya.top/\",\n        tags: [\"🔓\", \"✌\", \"💪\", \"🎉\", \"🚀\"],\n        notes: \"聚合多模型，国内直连无限制，注册送100元测试额度。\",\n        sortOrder: 20\n      },\n      {\n        name: \"closeai\",\n        displayName: \"CloseAI\",\n        url: \"https://closeai-asia.com/\",\n        tags: [\"💰\", \"✌\", \"💪\", \"🎉\", \"🚀\"],\n        notes: \"企业级代理，支持GPT-4o、Claude 3.5，提供中文技术支持。\",\n        sortOrder: 21\n      },\n      {\n        name: \"yunjiang-ai\",\n        displayName: \"云鲸AI\",\n        url: \"https://api.atalk-ai.com/\",\n        tags: [\"🔓\", \"✌\", \"💪\", \"🎉\", \"🚀\"],\n        notes: \"聚合ChatGPT、Claude、文心一言，注册赠5元体验券。\",\n        sortOrder: 22\n      },\n      {\n        name: \"model-bridge\",\n        displayName: \"ModelBridge\",\n        url: \"https://model-bridge.okeeper.com/\",\n        tags: [\"🔓\", \"✌\", \"💪\", \"🎉\", \"🚀\"],\n        notes: \"国内免费代理，兼容OpenAI接口和国产模型（如文心一言）。\",\n        sortOrder: 23\n      },\n      {\n        name: \"uiui-api\",\n        displayName: \"UiUi API\",\n        url: \"https://sg.uiuiapi.com/\",\n        tags: [\"🔓\", \"✌\", \"💪\", \"🎉\", \"🚀\"],\n        notes: \"支持Claude 4、Gemini等模型，兼容OpenAI接口格式。\",\n        sortOrder: 24\n      },\n      {\n        name: \"laozhang-api\",\n        displayName: \"老张API中转服务\",\n        url: \"https://api.laozhang.ai/\",\n        tags: [\"🔓\", \"✌\", \"💪\", \"🎉\", \"🚀\"],\n        notes: \"支持Claude 3和GPT-4o，新用户赠20元额度，支持支付宝/微信支付。\",\n        sortOrder: 25\n      },\n      {\n        name: \"haijing-ai\",\n        displayName: \"海鲸AI聚合平台\",\n        url: \"https://ai.atalk-ai.com/\",\n        tags: [\"🔓\", \"✌\", \"💪\", \"🎉\", \"🚀\"],\n        notes: \"国内备案平台，支持多模型统一API接入。\",\n        sortOrder: 26\n      },\n      {\n        name: \"one-api\",\n        displayName: \"One API\",\n        url: \"https://one-api.ai/\",\n        tags: [\"🔓\", \"✌\", \"💪\", \"🎉\", \"🚀\"],\n        notes: \"开源接口管理系统，支持多模型分发和私有化部署。\",\n        sortOrder: 27\n      },\n      {\n        name: \"openrouter\",\n        displayName: \"OpenRouter\",\n        url: \"https://openrouter.ai/\",\n        tags: [\"🔓\", \"✌\", \"💪\", \"🎉\", \"🚀\"],\n        notes: \"支持293个模型（含OpenAI、Claude、Gemini），提供免费额度。\",\n        sortOrder: 28\n      },\n      {\n        name: \"gemini-proxy\",\n        displayName: \"Gemini API代理\",\n        url: \"https://gemini-proxy.com/\",\n        tags: [\"🔓\", \"✌\", \"🎉\", \"🚀\"],\n        notes: \"支持Google Gemini模型，兼容OpenAI接口，提供免费额度。\",\n        sortOrder: 29\n      },\n      {\n        name: \"deepseek-aggregator\",\n        displayName: \"DeepSeek API聚合\",\n        url: \"https://deepseek-aggregator.com/\",\n        tags: [\"🔓\", \"💪\", \"🎉\", \"🚀\"],\n        notes: \"聚合DeepSeek系列模型，提供免费测试额度。\",\n        sortOrder: 30\n      },\n      {\n        name: \"huggingface-api\",\n        displayName: \"Hugging Face模型代理\",\n        url: \"https://huggingface.co/inference-api/\",\n        tags: [\"🔓\", \"💪\", \"🎉\", \"🚀\"],\n        notes: \"支持开源模型（如Llama 3），提供免费额度和企业级服务。\",\n        sortOrder: 31\n      },\n      {\n        name: \"ai21-labs\",\n        displayName: \"AI21 Labs官方代理\",\n        url: \"https://studio.ai21.com/\",\n        tags: [\"💰\", \"✌\", \"💪\", \"🎉\"],\n        notes: \"支持Jurassic-2模型，适合自然语言处理任务。\",\n        sortOrder: 32\n      },\n      {\n        name: \"cohere-api\",\n        displayName: \"Cohere API代理\",\n        url: \"https://cohere.ai/\",\n        tags: [\"💰\", \"✌\", \"💪\", \"🎉\"],\n        notes: \"支持文本生成和分类模型，提供企业级API。\",\n        sortOrder: 33\n      },\n      {\n        name: \"ai-aggregator\",\n        displayName: \"AI API聚合平台\",\n        url: \"https://api.ai-aggregator.com/\",\n        tags: [\"🔓\", \"✌\", \"💪\", \"🎉\", \"🚀\"],\n        notes: \"聚合多模型，提供统一接口和负载均衡。\",\n        sortOrder: 34\n      },\n      {\n        name: \"ai-ls\",\n        displayName: \"AI.LS\",\n        url: \"https://ai.ls/\",\n        tags: [\"🆓\", \"✌\"],\n        notes: \"极简接口，GPT-3.5免费匿名使用\",\n        sortOrder: 35\n      },\n      {\n        name: \"openai120\",\n        displayName: \"OpenAI120\",\n        url: \"https://openai120.com/\",\n        tags: [\"🔓\", \"✌\", \"🎁\"],\n        notes: \"新用户送$3额度，单价同官方\",\n        sortOrder: 36\n      },\n      {\n        name: \"duckagi\",\n        displayName: \"DuckAGI\",\n        url: \"https://duckagi.com/\",\n        tags: [\"💰\", \"✌\", \"🎉\", \"🚀\"],\n        notes: \"多模态支持GPT-4o/Sora，适合AI绘图\",\n        sortOrder: 37\n      },\n      {\n        name: \"aihubmix\",\n        displayName: \"Aihubmix\",\n        url: \"https://aihubmix.com/\",\n        tags: [\"💰\", \"🎉\"],\n        notes: \"国产模型聚合（文心一言/通义千问）\",\n        sortOrder: 38\n      },\n      {\n        name: \"wokaai\",\n        displayName: \"WokaAI\",\n        url: \"https://wokaai.com/\",\n        tags: [\"✌\", \"🚩\", \"✔\"],\n        notes: \"上海企业运营，ICP备案双线路\",\n        sortOrder: 39\n      },\n      {\n        name: \"azapi\",\n        displayName: \"azapi\",\n        url: \"https://azapi.com.cn/\",\n        tags: [\"💰\", \"🚩\", \"✔\"],\n        notes: \"杭州企业备案，长期使用优惠\",\n        sortOrder: 40\n      },\n      {\n        name: \"claudeapi\",\n        displayName: \"ClaudeAPI\",\n        url: \"https://claudeapi.io/\",\n        tags: [\"💪\", \"🚀\", \"✔\"],\n        notes: \"Anthropic官方合作，支持文件解析\",\n        sortOrder: 41\n      },\n      {\n        name: \"gala-api\",\n        displayName: \"Gala API\",\n        url: \"https://galaapi.com/\",\n        tags: [\"🎉\", \"🚀\", \"✔\"],\n        notes: \"谷歌Gemini专用高速通道\",\n        sortOrder: 42\n      },\n      {\n        name: \"ai-ls\",\n        displayName: \"AI.LS\",\n        url: \"https://ai.ls/\",\n        tags: [\"🆓\", \"✌\"],\n        notes: \"极简接口，GPT-3.5免费匿名使用\",\n        sortOrder: 35\n      },\n      {\n        name: \"openai120\",\n        displayName: \"OpenAI120\",\n        url: \"https://openai120.com/\",\n        tags: [\"🔓\", \"✌\", \"🎁\"],\n        notes: \"新用户送$3额度，单价同官方\",\n        sortOrder: 36\n      },\n      {\n        name: \"duckagi\",\n        displayName: \"DuckAGI\",\n        url: \"https://duckagi.com/\",\n        tags: [\"💰\", \"✌\", \"🎉\", \"🚀\"],\n        notes: \"多模态支持GPT-4o/Sora，适合AI绘图\",\n        sortOrder: 37\n      },\n      {\n        name: \"aihubmix\",\n        displayName: \"Aihubmix\",\n        url: \"https://aihubmix.com/\",\n        tags: [\"💰\", \"🎉\"],\n        notes: \"国产模型聚合（文心一言/通义千问）\",\n        sortOrder: 38\n      },\n      {\n        name: \"wokaai\",\n        displayName: \"WokaAI\",\n        url: \"https://wokaai.com/\",\n        tags: [\"✌\"],\n        notes: \"优惠多，支持chatgpt\",\n        sortOrder: 39\n      },\n      {\n        name: \"azapi\",\n        displayName: \"azapi\",\n        url: \"https://azapi.com.cn/\",\n        tags: [\"💰\"],\n        notes: \"长期使用优惠\",\n        sortOrder: 40\n      },\n      {\n        name: \"claudeapi\",\n        displayName: \"ClaudeAPI\",\n        url: \"https://claudeapi.io/\",\n        tags: [\"💪\", \"🚀\"],\n        notes: \"Anthropic官方合作，支持文件解析\",\n        sortOrder: 41\n      },\n      {\n        name: \"gala-api\",\n        displayName: \"Gala API\",\n        url: \"https://galaapi.com/\",\n        tags: [\"🎉\", \"🚀\"],\n        notes: \"谷歌Gemini专用高速通道\",\n        sortOrder: 42\n      }\n    ];\n\n    providersData.forEach(data => {\n      this.createApiProvider({\n        ...data,\n        isActive: true,\n        isRecommended: data.isRecommended || false\n      });\n    });\n\n    // Recommended Apps data\n    const appsData = [\n      {\n        name: \"Cherry Studio\",\n        description: \"跨平台桌面端 + 移动端，集成主流 AI 云服务 + 本地模型。\",\n        githubUrl: \"https://github.com/CherryHQ/cherry-studio\",\n        icon: \"desktop\",\n        tags: [\"开源\", \"跨平台\"],\n        sortOrder: 1\n      },\n      {\n        name: \"ChatGPT-Next-Web\",\n        description: \"开源网页端 ChatGPT 前端，支持 API Key 与多用户协作。\",\n        githubUrl: \"https://github.com/Yidadaa/ChatGPT-Next-Web\",\n        icon: \"globe\",\n        tags: [\"开源\", \"网页端\"],\n        sortOrder: 2\n      },\n      {\n        name: \"LobeChat\",\n        description: \"支持视觉、语音交互和多模型切换，网页端 AI 会话框架。\",\n        githubUrl: \"https://github.com/lobehub/lobe-chat\",\n        icon: \"comments\",\n        tags: [\"开源\", \"多模态\"],\n        sortOrder: 3\n      },\n      {\n        name: \"BotGem\",\n        description: \"移动端优先设计，支持语音交流与 AI 好友系统。\",\n        websiteUrl: \"https://botgem.com/\",\n        icon: \"mobile\",\n        tags: [\"移动端\", \"语音\"],\n        sortOrder: 4\n      },\n      {\n        name: \"ChatBox\",\n        description: \"支持 iOS、Android 和桌面端，界面现代，功能完整。\",\n        githubUrl: \"https://github.com/Bin-Huang/chatbox\",\n        icon: \"message-square\",\n        tags: [\"跨平台\", \"现代界面\"],\n        sortOrder: 5\n      },\n      {\n        name: \"FastGPT\",\n        description: \"知识库 + 工作流集成，企业内训/客服场景首选。\",\n        githubUrl: \"https://github.com/labring/FastGPT\",\n        icon: \"zap\",\n        tags: [\"企业级\", \"知识库\"],\n        sortOrder: 6\n      }\n    ];\n\n    appsData.forEach(data => {\n      this.createRecommendedApp({\n        ...data,\n        isActive: true\n      });\n    });\n  }\n\n  async getApiProviders(): Promise<ApiProvider[]> {\n    return Array.from(this.apiProviders.values()).sort((a, b) => a.sortOrder - b.sortOrder);\n  }\n\n  async getApiProvider(id: number): Promise<ApiProvider | undefined> {\n    return this.apiProviders.get(id);\n  }\n\n  async createApiProvider(insertProvider: InsertApiProvider): Promise<ApiProvider> {\n    const id = this.currentApiProviderId++;\n    const provider: ApiProvider = { ...insertProvider, id };\n    this.apiProviders.set(id, provider);\n    return provider;\n  }\n\n  async updateApiProvider(id: number, updates: Partial<InsertApiProvider>): Promise<ApiProvider | undefined> {\n    const existing = this.apiProviders.get(id);\n    if (!existing) return undefined;\n    \n    const updated = { ...existing, ...updates };\n    this.apiProviders.set(id, updated);\n    return updated;\n  }\n\n  async deleteApiProvider(id: number): Promise<boolean> {\n    return this.apiProviders.delete(id);\n  }\n\n  async getRecommendedApps(): Promise<RecommendedApp[]> {\n    return Array.from(this.recommendedApps.values()).sort((a, b) => a.sortOrder - b.sortOrder);\n  }\n\n  async getRecommendedApp(id: number): Promise<RecommendedApp | undefined> {\n    return this.recommendedApps.get(id);\n  }\n\n  async createRecommendedApp(insertApp: InsertRecommendedApp): Promise<RecommendedApp> {\n    const id = this.currentRecommendedAppId++;\n    const app: RecommendedApp = { ...insertApp, id };\n    this.recommendedApps.set(id, app);\n    return app;\n  }\n\n  async updateRecommendedApp(id: number, updates: Partial<InsertRecommendedApp>): Promise<RecommendedApp | undefined> {\n    const existing = this.recommendedApps.get(id);\n    if (!existing) return undefined;\n    \n    const updated = { ...existing, ...updates };\n    this.recommendedApps.set(id, updated);\n    return updated;\n  }\n\n  async deleteRecommendedApp(id: number): Promise<boolean> {\n    return this.recommendedApps.delete(id);\n  }\n}\n\nexport const storage = new MemStorage();\n"
  },
  {
    "path": "website/server/vite.ts",
    "content": "import express, { type Express } from \"express\";\nimport fs from \"fs\";\nimport path from \"path\";\nimport { createServer as createViteServer, createLogger } from \"vite\";\nimport { type Server } from \"http\";\nimport viteConfig from \"../vite.config\";\nimport { nanoid } from \"nanoid\";\n\nconst viteLogger = createLogger();\n\nexport function log(message: string, source = \"express\") {\n  const formattedTime = new Date().toLocaleTimeString(\"en-US\", {\n    hour: \"numeric\",\n    minute: \"2-digit\",\n    second: \"2-digit\",\n    hour12: true,\n  });\n\n  console.log(`${formattedTime} [${source}] ${message}`);\n}\n\nexport async function setupVite(app: Express, server: Server) {\n  const serverOptions = {\n    middlewareMode: true,\n    hmr: { server },\n    allowedHosts: true,\n  };\n\n  const vite = await createViteServer({\n    ...viteConfig,\n    configFile: false,\n    customLogger: {\n      ...viteLogger,\n      error: (msg, options) => {\n        viteLogger.error(msg, options);\n        process.exit(1);\n      },\n    },\n    server: serverOptions,\n    appType: \"custom\",\n  });\n\n  app.use(vite.middlewares);\n  app.use(\"*\", async (req, res, next) => {\n    const url = req.originalUrl;\n\n    try {\n      const clientTemplate = path.resolve(\n        import.meta.dirname,\n        \"..\",\n        \"client\",\n        \"index.html\",\n      );\n\n      // always reload the index.html file from disk incase it changes\n      let template = await fs.promises.readFile(clientTemplate, \"utf-8\");\n      template = template.replace(\n        `src=\"/src/main.tsx\"`,\n        `src=\"/src/main.tsx?v=${nanoid()}\"`,\n      );\n      const page = await vite.transformIndexHtml(url, template);\n      res.status(200).set({ \"Content-Type\": \"text/html\" }).end(page);\n    } catch (e) {\n      vite.ssrFixStacktrace(e as Error);\n      next(e);\n    }\n  });\n}\n\nexport function serveStatic(app: Express) {\n  const distPath = path.resolve(import.meta.dirname, \"public\");\n\n  if (!fs.existsSync(distPath)) {\n    throw new Error(\n      `Could not find the build directory: ${distPath}, make sure to build the client first`,\n    );\n  }\n\n  app.use(express.static(distPath));\n\n  // fall through to index.html if the file doesn't exist\n  app.use(\"*\", (_req, res) => {\n    res.sendFile(path.resolve(distPath, \"index.html\"));\n  });\n}\n"
  },
  {
    "path": "website/shared/schema.ts",
    "content": "import { pgTable, text, serial, integer, boolean, jsonb } from \"drizzle-orm/pg-core\";\nimport { createInsertSchema } from \"drizzle-zod\";\nimport { z } from \"zod\";\n\nexport const apiProviders = pgTable(\"api_providers\", {\n  id: serial(\"id\").primaryKey(),\n  name: text(\"name\").notNull(),\n  displayName: text(\"display_name\").notNull(),\n  url: text(\"url\").notNull(),\n  tags: jsonb(\"tags\").notNull().$type<string[]>(),\n  notes: text(\"notes\"),\n  isActive: boolean(\"is_active\").notNull().default(true),\n  isRecommended: boolean(\"is_recommended\").notNull().default(false),\n  sortOrder: integer(\"sort_order\").notNull().default(0),\n});\n\nexport const recommendedApps = pgTable(\"recommended_apps\", {\n  id: serial(\"id\").primaryKey(),\n  name: text(\"name\").notNull(),\n  description: text(\"description\").notNull(),\n  githubUrl: text(\"github_url\"),\n  websiteUrl: text(\"website_url\"),\n  icon: text(\"icon\").notNull(),\n  tags: jsonb(\"tags\").notNull().$type<string[]>(),\n  isActive: boolean(\"is_active\").notNull().default(true),\n  sortOrder: integer(\"sort_order\").notNull().default(0),\n});\n\nexport const insertApiProviderSchema = createInsertSchema(apiProviders).omit({\n  id: true,\n});\n\nexport const insertRecommendedAppSchema = createInsertSchema(recommendedApps).omit({\n  id: true,\n});\n\nexport type ApiProvider = typeof apiProviders.$inferSelect;\nexport type InsertApiProvider = z.infer<typeof insertApiProviderSchema>;\nexport type RecommendedApp = typeof recommendedApps.$inferSelect;\nexport type InsertRecommendedApp = z.infer<typeof insertRecommendedAppSchema>;\n"
  },
  {
    "path": "website/tailwind.config.ts",
    "content": "import type { Config } from \"tailwindcss\";\n\nexport default {\n  darkMode: [\"class\"],\n  content: [\"./client/index.html\", \"./client/src/**/*.{js,jsx,ts,tsx}\"],\n  theme: {\n    extend: {\n      borderRadius: {\n        lg: \"var(--radius)\",\n        md: \"calc(var(--radius) - 2px)\",\n        sm: \"calc(var(--radius) - 4px)\",\n      },\n      colors: {\n        background: \"var(--background)\",\n        foreground: \"var(--foreground)\",\n        card: {\n          DEFAULT: \"var(--card)\",\n          foreground: \"var(--card-foreground)\",\n        },\n        popover: {\n          DEFAULT: \"var(--popover)\",\n          foreground: \"var(--popover-foreground)\",\n        },\n        primary: {\n          DEFAULT: \"var(--primary)\",\n          foreground: \"var(--primary-foreground)\",\n        },\n        secondary: {\n          DEFAULT: \"var(--secondary)\",\n          foreground: \"var(--secondary-foreground)\",\n        },\n        muted: {\n          DEFAULT: \"var(--muted)\",\n          foreground: \"var(--muted-foreground)\",\n        },\n        accent: {\n          DEFAULT: \"var(--accent)\",\n          foreground: \"var(--accent-foreground)\",\n        },\n        destructive: {\n          DEFAULT: \"var(--destructive)\",\n          foreground: \"var(--destructive-foreground)\",\n        },\n        border: \"var(--border)\",\n        input: \"var(--input)\",\n        ring: \"var(--ring)\",\n        chart: {\n          \"1\": \"var(--chart-1)\",\n          \"2\": \"var(--chart-2)\",\n          \"3\": \"var(--chart-3)\",\n          \"4\": \"var(--chart-4)\",\n          \"5\": \"var(--chart-5)\",\n        },\n        sidebar: {\n          DEFAULT: \"var(--sidebar-background)\",\n          foreground: \"var(--sidebar-foreground)\",\n          primary: \"var(--sidebar-primary)\",\n          \"primary-foreground\": \"var(--sidebar-primary-foreground)\",\n          accent: \"var(--sidebar-accent)\",\n          \"accent-foreground\": \"var(--sidebar-accent-foreground)\",\n          border: \"var(--sidebar-border)\",\n          ring: \"var(--sidebar-ring)\",\n        },\n      },\n      keyframes: {\n        \"accordion-down\": {\n          from: {\n            height: \"0\",\n          },\n          to: {\n            height: \"var(--radix-accordion-content-height)\",\n          },\n        },\n        \"accordion-up\": {\n          from: {\n            height: \"var(--radix-accordion-content-height)\",\n          },\n          to: {\n            height: \"0\",\n          },\n        },\n      },\n      animation: {\n        \"accordion-down\": \"accordion-down 0.2s ease-out\",\n        \"accordion-up\": \"accordion-up 0.2s ease-out\",\n      },\n    },\n  },\n  plugins: [require(\"tailwindcss-animate\"), require(\"@tailwindcss/typography\")],\n} satisfies Config;\n"
  },
  {
    "path": "website/tsconfig.json",
    "content": "{\n  \"include\": [\"client/src/**/*\", \"shared/**/*\", \"server/**/*\"],\n  \"exclude\": [\"node_modules\", \"build\", \"dist\", \"**/*.test.ts\"],\n  \"compilerOptions\": {\n    \"incremental\": true,\n    \"tsBuildInfoFile\": \"./node_modules/typescript/tsbuildinfo\",\n    \"noEmit\": true,\n    \"module\": \"ESNext\",\n    \"strict\": true,\n    \"lib\": [\"esnext\", \"dom\", \"dom.iterable\"],\n    \"jsx\": \"preserve\",\n    \"esModuleInterop\": true,\n    \"skipLibCheck\": true,\n    \"allowImportingTsExtensions\": true,\n    \"moduleResolution\": \"bundler\",\n    \"baseUrl\": \".\",\n    \"types\": [\"node\", \"vite/client\"],\n    \"paths\": {\n      \"@/*\": [\"./client/src/*\"],\n      \"@shared/*\": [\"./shared/*\"]\n    }\n  }\n}\n"
  },
  {
    "path": "website/vite.config.ts",
    "content": "import { defineConfig } from \"vite\";\nimport react from \"@vitejs/plugin-react\";\nimport path from \"path\";\nimport runtimeErrorOverlay from \"@replit/vite-plugin-runtime-error-modal\";\n\nexport default defineConfig({\n  plugins: [\n    react(),\n    runtimeErrorOverlay(),\n    ...(process.env.NODE_ENV !== \"production\" &&\n    process.env.REPL_ID !== undefined\n      ? [\n          await import(\"@replit/vite-plugin-cartographer\").then((m) =>\n            m.cartographer(),\n          ),\n        ]\n      : []),\n  ],\n  resolve: {\n    alias: {\n      \"@\": path.resolve(import.meta.dirname, \"client\", \"src\"),\n      \"@shared\": path.resolve(import.meta.dirname, \"shared\"),\n      \"@assets\": path.resolve(import.meta.dirname, \"attached_assets\"),\n    },\n  },\n  root: path.resolve(import.meta.dirname, \"client\"),\n  build: {\n    outDir: path.resolve(import.meta.dirname, \"dist/public\"),\n    emptyOutDir: true,\n  },\n  server: {\n    fs: {\n      strict: true,\n      deny: [\"**/.*\"],\n    },\n  },\n});\n"
  }
]