Showing preview only (1,067K chars total). Download the full file or copy to clipboard to get everything.
Repository: AsyncFuncAI/deepwiki-open
Branch: main
Commit: 4c6a1f7899ae
Files: 109
Total size: 1.0 MB
Directory structure:
gitextract_27f935c4/
├── .dockerignore
├── .github/
│ └── workflows/
│ └── docker-build-push.yml
├── .gitignore
├── .python-version
├── .vscode/
│ └── launch.json
├── Dockerfile
├── Dockerfile-ollama-local
├── LICENSE
├── Ollama-instruction.md
├── README.es.md
├── README.fr.md
├── README.ja.md
├── README.kr.md
├── README.md
├── README.pt-br.md
├── README.ru.md
├── README.vi.md
├── README.zh-tw.md
├── README.zh.md
├── api/
│ ├── README.md
│ ├── __init__.py
│ ├── api.py
│ ├── azureai_client.py
│ ├── bedrock_client.py
│ ├── config/
│ │ ├── embedder.json
│ │ ├── embedder.json.bak
│ │ ├── embedder.ollama.json.bak
│ │ ├── embedder.openai_compatible.json.bak
│ │ ├── generator.json
│ │ ├── lang.json
│ │ └── repo.json
│ ├── config.py
│ ├── dashscope_client.py
│ ├── data_pipeline.py
│ ├── google_embedder_client.py
│ ├── logging_config.py
│ ├── main.py
│ ├── ollama_patch.py
│ ├── openai_client.py
│ ├── openrouter_client.py
│ ├── prompts.py
│ ├── pyproject.toml
│ ├── rag.py
│ ├── simple_chat.py
│ ├── tools/
│ │ └── embedder.py
│ └── websocket_wiki.py
├── docker-compose.yml
├── eslint.config.mjs
├── next.config.ts
├── package.json
├── postcss.config.mjs
├── pytest.ini
├── run.sh
├── src/
│ ├── app/
│ │ ├── [owner]/
│ │ │ └── [repo]/
│ │ │ ├── page.tsx
│ │ │ ├── slides/
│ │ │ │ └── page.tsx
│ │ │ └── workshop/
│ │ │ └── page.tsx
│ │ ├── api/
│ │ │ ├── auth/
│ │ │ │ ├── status/
│ │ │ │ │ └── route.ts
│ │ │ │ └── validate/
│ │ │ │ └── route.ts
│ │ │ ├── chat/
│ │ │ │ └── stream/
│ │ │ │ └── route.ts
│ │ │ ├── models/
│ │ │ │ └── config/
│ │ │ │ └── route.ts
│ │ │ └── wiki/
│ │ │ └── projects/
│ │ │ └── route.ts
│ │ ├── globals.css
│ │ ├── layout.tsx
│ │ ├── page.tsx
│ │ └── wiki/
│ │ └── projects/
│ │ └── page.tsx
│ ├── components/
│ │ ├── Ask.tsx
│ │ ├── ConfigurationModal.tsx
│ │ ├── Markdown.tsx
│ │ ├── Mermaid.tsx
│ │ ├── ModelSelectionModal.tsx
│ │ ├── ProcessedProjects.tsx
│ │ ├── TokenInput.tsx
│ │ ├── UserSelector.tsx
│ │ ├── WikiTreeView.tsx
│ │ ├── WikiTypeSelector.tsx
│ │ └── theme-toggle.tsx
│ ├── contexts/
│ │ └── LanguageContext.tsx
│ ├── hooks/
│ │ └── useProcessedProjects.ts
│ ├── i18n.ts
│ ├── messages/
│ │ ├── en.json
│ │ ├── es.json
│ │ ├── fr.json
│ │ ├── ja.json
│ │ ├── kr.json
│ │ ├── pt-br.json
│ │ ├── ru.json
│ │ ├── vi.json
│ │ ├── zh-tw.json
│ │ └── zh.json
│ ├── types/
│ │ ├── repoinfo.tsx
│ │ └── wiki/
│ │ ├── wikipage.tsx
│ │ └── wikistructure.tsx
│ └── utils/
│ ├── getRepoUrl.tsx
│ ├── urlDecoder.tsx
│ └── websocketClient.ts
├── tailwind.config.js
├── test/
│ ├── __init__.py
│ └── test_extract_repo_name.py
├── tests/
│ ├── README.md
│ ├── __init__.py
│ ├── api/
│ │ ├── __init__.py
│ │ └── test_api.py
│ ├── integration/
│ │ ├── __init__.py
│ │ └── test_full_integration.py
│ ├── run_tests.py
│ └── unit/
│ ├── __init__.py
│ ├── test_all_embedders.py
│ └── test_google_embedder.py
└── tsconfig.json
================================================
FILE CONTENTS
================================================
================================================
FILE: .dockerignore
================================================
# Git
.git
.gitignore
.github
# Node.js
node_modules
npm-debug.log
yarn-debug.log
yarn-error.log
# Next.js
.next
out
# Python cache files (but keep api/ directory)
__pycache__/
*.py[cod]
*$py.class
*.so
.Python
env/
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
*.egg-info/
.installed.cfg
*.egg
# Keep api/ directory but exclude cache
api/__pycache__/
api/*.pyc
# Environment variables
# .env is now allowed to be included in the build
.env.local
.env.development.local
.env.test.local
.env.production.local
# Docker
Dockerfile
docker-compose.yml
.dockerignore
# Misc
.DS_Store
*.pem
README.md
LICENSE
screenshots/
*.md
!api/README.md
================================================
FILE: .github/workflows/docker-build-push.yml
================================================
name: Build and Push Docker Image
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
# Allow manual trigger
workflow_dispatch:
env:
REGISTRY: ghcr.io
IMAGE_NAME: ${{ github.repository }}
concurrency:
# This concurrency group ensures that only one job in the group runs at a time.
# If a new job is triggered, the previous one will be canceled.
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
build-and-push:
strategy:
matrix:
include:
- os: ubuntu-latest
platform: linux/amd64
- os: ubuntu-24.04-arm
platform: linux/arm64
runs-on: ${{ matrix.os }}
permissions:
contents: read
packages: write
steps:
- name: Prepare environment for current platform
id: prepare
run: |
platform=${{ matrix.platform }}
echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV
echo "GHCR_IMAGE=ghcr.io/${GITHUB_REPOSITORY@L}" >> $GITHUB_ENV
- name: Checkout repository
uses: actions/checkout@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Log in to the Container registry
if: github.event_name != 'pull_request'
uses: docker/login-action@v3
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/metadata-action@v5
with:
images: ${{ env.GHCR_IMAGE }}
- name: Create empty .env file for build
run: touch .env
- name: Build and push Docker image
uses: docker/build-push-action@v6
id: build
with:
context: .
platforms: ${{ matrix.platform }}
push: ${{ github.event_name != 'pull_request' }}
annotations: ${{ steps.meta.outputs.annotations }}
labels: ${{ steps.meta.outputs.labels }}
outputs: type=image,name=${{ env.GHCR_IMAGE }},push-by-digest=true,name-canonical=true,push=${{ github.event_name != 'pull_request' }},oci-mediatypes=true
cache-from: type=gha,scope=${{ github.repository }}-${{ github.ref_name }}-${{ matrix.platform }}
cache-to: type=gha,mode=max,scope=${{ github.repository }}-${{ github.ref_name }}-${{ matrix.platform }}
- name: Export digest
run: |
mkdir -p /tmp/digests
digest="${{ steps.build.outputs.digest }}"
touch "/tmp/digests/${digest#sha256:}"
- name: Upload digest
uses: actions/upload-artifact@v4
with:
name: digests-${{ env.PLATFORM_PAIR }}
path: /tmp/digests/*
if-no-files-found: error
retention-days: 1
merge:
name: merge Docker manifests
runs-on: ubuntu-latest
if: github.event_name != 'pull_request'
permissions:
contents: read
packages: write
needs:
- build-and-push
steps:
- name: Prepare environment
id: prepare
run: |
echo "GHCR_IMAGE=ghcr.io/${GITHUB_REPOSITORY@L}" >> $GITHUB_ENV
- name: Download digests
uses: actions/download-artifact@v4
with:
path: /tmp/digests
pattern: digests-*
merge-multiple: true
- name: Docker meta
id: meta
uses: docker/metadata-action@v5
with:
images: ${{ env.GHCR_IMAGE }}
annotations: |
type=org.opencontainers.image.description,value=${{ github.event.repository.description || 'No description provided' }}
tags: |
type=semver,pattern={{version}}
type=semver,pattern={{major}}.{{minor}}
type=sha,format=short
type=ref,event=branch
type=ref,event=pr
latest
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
with:
driver-opts: |
network=host
- name: Login to GitHub Container Registry
uses: docker/login-action@v3
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Get execution timestamp with RFC3339 format
id: timestamp
run: |
echo "timestamp=$(date -u +"%Y-%m-%dT%H:%M:%SZ")" >> $GITHUB_OUTPUT
- name: Create manifest list and pushs
working-directory: /tmp/digests
id: manifest-annotate
continue-on-error: true
run: |
docker buildx imagetools create \
$(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \
--annotation='index:org.opencontainers.image.description=${{ github.event.repository.description }}' \
--annotation='index:org.opencontainers.image.created=${{ steps.timestamp.outputs.timestamp }}' \
--annotation='index:org.opencontainers.image.url=${{ github.event.repository.url }}' \
--annotation='index:org.opencontainers.image.source=${{ github.event.repository.url }}' \
$(printf '${{ env.GHCR_IMAGE }}@sha256:%s ' *)
- name: Create manifest list and push without annotations
if: steps.manifest-annotate.outcome == 'failure'
working-directory: /tmp/digests
run: |
docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \
$(printf '${{ env.GHCR_IMAGE }}@sha256:%s ' *)
- name: Inspect image
id: inspect
run: |
docker buildx imagetools inspect '${{ env.GHCR_IMAGE }}:${{ steps.meta.outputs.version }}'
================================================
FILE: .gitignore
================================================
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
# dependencies
/node_modules
/.pnp
.pnp.*
.yarn/*
!.yarn/patches
!.yarn/plugins
!.yarn/releases
!.yarn/versions
# Python
__pycache__/
*.py[cod]
*$py.class
*.so
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
api/logs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
*.egg-info/
.installed.cfg
*.egg
*.venv
# testing
/coverage
# next.js
/.next/
/out/
# production
/build
# misc
.DS_Store
*.pem
# debug
npm-debug.log*
yarn-debug.log*
yarn-error.log*
.pnpm-debug.log*
# env files (can opt-in for committing if needed)
.env*
# vercel
.vercel
# typescript
*.tsbuildinfo
next-env.d.ts
.idea/
# ignore adding self-signed certs
certs/
================================================
FILE: .python-version
================================================
3.12
================================================
FILE: .vscode/launch.json
================================================
{
"version": "0.2.0",
"configurations": [
{
"name": "Deepwiki-Open",
"type": "python",
"request": "launch",
"module": "uvicorn",
"args": [
"api.api:app",
"--reload",
"--port",
"8001"
],
"jinja": true,
"justMyCode": true
}
]
}
================================================
FILE: Dockerfile
================================================
# syntax=docker/dockerfile:1-labs
# Build argument for custom certificates directory
ARG CUSTOM_CERT_DIR="certs"
FROM node:20-alpine3.22 AS node_base
FROM node_base AS node_deps
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci --legacy-peer-deps
FROM node_base AS node_builder
WORKDIR /app
COPY --from=node_deps /app/node_modules ./node_modules
# Copy only necessary files for Next.js build
COPY package.json package-lock.json next.config.ts tsconfig.json tailwind.config.js postcss.config.mjs ./
COPY src/ ./src/
COPY public/ ./public/
# Increase Node.js memory limit for build and disable telemetry
ENV NODE_OPTIONS="--max-old-space-size=4096"
ENV NEXT_TELEMETRY_DISABLED=1
RUN NODE_ENV=production npm run build
FROM python:3.11-slim AS py_deps
WORKDIR /api
COPY api/pyproject.toml .
COPY api/poetry.lock .
RUN python -m pip install poetry==2.0.1 --no-cache-dir && \
poetry config virtualenvs.create true --local && \
poetry config virtualenvs.in-project true --local && \
poetry config virtualenvs.options.always-copy --local true && \
POETRY_MAX_WORKERS=10 poetry install --no-interaction --no-ansi --only main && \
poetry cache clear --all .
# Use Python 3.11 as final image
FROM python:3.11-slim
# Set working directory
WORKDIR /app
# Install Node.js and npm
RUN apt-get update && apt-get install -y \
curl \
gnupg \
git \
ca-certificates \
&& mkdir -p /etc/apt/keyrings \
&& curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg \
&& echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_20.x nodistro main" | tee /etc/apt/sources.list.d/nodesource.list \
&& apt-get update \
&& apt-get install -y nodejs \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
# Update certificates if custom ones were provided and copied successfully
RUN if [ -n "${CUSTOM_CERT_DIR}" ]; then \
mkdir -p /usr/local/share/ca-certificates && \
if [ -d "${CUSTOM_CERT_DIR}" ]; then \
cp -r ${CUSTOM_CERT_DIR}/* /usr/local/share/ca-certificates/ 2>/dev/null || true; \
update-ca-certificates; \
echo "Custom certificates installed successfully."; \
else \
echo "Warning: ${CUSTOM_CERT_DIR} not found. Skipping certificate installation."; \
fi \
fi
ENV PATH="/opt/venv/bin:$PATH"
# Copy Python dependencies
COPY --from=py_deps /api/.venv /opt/venv
COPY api/ ./api/
# Copy Node app
COPY --from=node_builder /app/public ./public
COPY --from=node_builder /app/.next/standalone ./
COPY --from=node_builder /app/.next/static ./.next/static
# Expose the port the app runs on
EXPOSE ${PORT:-8001} 3000
# Create a script to run both backend and frontend
RUN echo '#!/bin/bash\n\
# Load environment variables from .env file if it exists\n\
if [ -f .env ]; then\n\
export $(grep -v "^#" .env | xargs -r)\n\
fi\n\
\n\
# Check for required environment variables\n\
if [ -z "$OPENAI_API_KEY" ] || [ -z "$GOOGLE_API_KEY" ]; then\n\
echo "Warning: OPENAI_API_KEY and/or GOOGLE_API_KEY environment variables are not set."\n\
echo "These are required for DeepWiki to function properly."\n\
echo "You can provide them via a mounted .env file or as environment variables when running the container."\n\
fi\n\
\n\
# Start the API server in the background with the configured port\n\
python -m api.main --port ${PORT:-8001} &\n\
PORT=3000 HOSTNAME=0.0.0.0 node server.js &\n\
wait -n\n\
exit $?' > /app/start.sh && chmod +x /app/start.sh
# Set environment variables
ENV PORT=8001
ENV NODE_ENV=production
ENV SERVER_BASE_URL=http://localhost:${PORT:-8001}
# Create empty .env file (will be overridden if one exists at runtime)
RUN touch .env
# Command to run the application
CMD ["/app/start.sh"]
================================================
FILE: Dockerfile-ollama-local
================================================
# syntax=docker/dockerfile:1-labs
FROM node:20-alpine AS node_base
FROM node_base AS node_deps
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci --legacy-peer-deps
FROM node_base AS node_builder
WORKDIR /app
COPY --from=node_deps /app/node_modules ./node_modules
COPY --exclude=./api . .
RUN NODE_ENV=production npm run build
FROM python:3.11-slim AS py_deps
WORKDIR /api
COPY api/pyproject.toml .
COPY api/poetry.lock .
RUN python -m pip install poetry==2.0.1 --no-cache-dir && \
poetry config virtualenvs.create true --local && \
poetry config virtualenvs.in-project true --local && \
poetry config virtualenvs.options.always-copy --local true && \
POETRY_MAX_WORKERS=10 poetry install --no-interaction --no-ansi --only main && \
poetry cache clear --all .
FROM python:3.11-slim AS ollama_base
RUN apt-get update && apt-get install -y --no-install-recommends \
curl zstd && rm -rf /var/lib/apt/lists/*
# Detect architecture and download appropriate Ollama version
# ARG TARGETARCH can be set at build time with --build-arg TARGETARCH=arm64 or TARGETARCH=amd64
ARG TARGETARCH=arm64
RUN OLLAMA_ARCH="" && \
if [ "$TARGETARCH" = "arm64" ]; then \
echo "Building for ARM64 architecture." && \
OLLAMA_ARCH="arm64"; \
elif [ "$TARGETARCH" = "amd64" ]; then \
echo "Building for AMD64 architecture." && \
OLLAMA_ARCH="amd64"; \
else \
echo "Error: Unsupported architecture '$TARGETARCH'. Supported architectures are 'arm64' and 'amd64'." >&2 && \
exit 1; \
fi && \
(set -o pipefail; \
curl -fL "https://ollama.com/download/ollama-linux-${OLLAMA_ARCH}.tar.zst" \
| zstd -d | tar -x -C /usr)
RUN ollama serve > /dev/null 2>&1 & \
sleep 20 && \
ollama pull nomic-embed-text && \
ollama pull qwen3:1.7b
# Use Python 3.11 as final image
FROM python:3.11-slim
# Set working directory
WORKDIR /app
# Install Node.js and npm
RUN apt-get update && apt-get install -y \
curl \
gnupg \
git \
&& mkdir -p /etc/apt/keyrings \
&& curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg \
&& echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_20.x nodistro main" | tee /etc/apt/sources.list.d/nodesource.list \
&& apt-get update \
&& apt-get install -y nodejs \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
ENV PATH="/opt/venv/bin:$PATH"
# Copy Python dependencies
COPY --from=py_deps /api/.venv /opt/venv
COPY api/ ./api/
# Copy Node app
COPY --from=node_builder /app/public ./public
COPY --from=node_builder /app/.next/standalone ./
COPY --from=node_builder /app/.next/static ./.next/static
COPY --from=ollama_base /usr/bin/ollama /usr/local/bin/
COPY --from=ollama_base /root/.ollama /root/.ollama
# Expose the port the app runs on
EXPOSE ${PORT:-8001} 3000
# Create a script to run both backend and frontend
RUN echo '#!/bin/bash\n\
# Start ollama serve in background\n\
ollama serve > /dev/null 2>&1 &\n\
\n\
# Load environment variables from .env file if it exists\n\
if [ -f .env ]; then\n\
export $(grep -v "^#" .env | xargs -r)\n\
fi\n\
\n\
# Check for required environment variables\n\
if [ -z "$OPENAI_API_KEY" ] || [ -z "$GOOGLE_API_KEY" ]; then\n\
echo "Warning: OPENAI_API_KEY and/or GOOGLE_API_KEY environment variables are not set."\n\
echo "These are required for DeepWiki to function properly."\n\
echo "You can provide them via a mounted .env file or as environment variables when running the container."\n\
fi\n\
\n\
# Start the API server in the background with the configured port\n\
python -m api.main --port ${PORT:-8001} &\n\
PORT=3000 HOSTNAME=0.0.0.0 node server.js &\n\
wait -n\n\
exit $?' > /app/start.sh && chmod +x /app/start.sh
# Set environment variables
ENV PORT=8001
ENV NODE_ENV=production
ENV SERVER_BASE_URL=http://localhost:${PORT:-8001}
# Create empty .env file (will be overridden if one exists at runtime)
RUN touch .env
# Command to run the application
CMD ["/app/start.sh"]
================================================
FILE: LICENSE
================================================
MIT License
Copyright (c) 2024 Sheing Ng
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
================================================
FILE: Ollama-instruction.md
================================================
# Using DeepWiki with Ollama: Beginner's Guide
DeepWiki supports local AI models through Ollama, which is perfect if you want to:
- Run everything locally without relying on cloud APIs
- Avoid API costs from OpenAI or Google
- Have more privacy with your code analysis
## Step 1: Install Ollama
### For Windows
- Download Ollama from the [official website](https://ollama.com/download)
- Run the installer and follow the on-screen instructions
- After installation, Ollama will run in the background (check your system tray)
### For macOS
- Download Ollama from the [official website](https://ollama.com/download)
- Open the downloaded file and drag Ollama to your Applications folder
- Launch Ollama from your Applications folder
### For Linux
- Run the following command:
```bash
curl -fsSL https://ollama.com/install.sh | sh
```
## Step 2: Download Required Models
Open a terminal (Command Prompt or PowerShell on Windows) and run:
```bash
ollama pull nomic-embed-text
ollama pull qwen3:1.7b
```
The first command downloads the embedding model that DeepWiki uses to understand your code. The second downloads a small but capable language model for generating documentation.
## Step 3: Set Up DeepWiki
Clone the DeepWiki repository:
```bash
git clone https://github.com/AsyncFuncAI/deepwiki-open.git
cd deepwiki-open
```
Create a `.env` file in the project root:
```
# No need for API keys when using Ollama locally
PORT=8001
# Optionally, provide OLLAMA_HOST if Ollama is not local
OLLAMA_HOST=your_ollama_host # (default: http://localhost:11434)
```
Configure the Local Embedder for Ollama:
```
cp api/config/embedder.ollama.json.bak api/config/embedder.json
# overwrite api/config/embedder.json? (y/n [n]) y
```
Start the backend:
```bash
python -m pip install poetry==2.0.1 && poetry install
python -m api.main
```
Start the frontend:
```bash
npm install
npm run dev
```
## Step 4: Use DeepWiki with Ollama
1. Open http://localhost:3000 in your browser
2. Enter a GitHub, GitLab, or Bitbucket repository URL
3. Check the use "Local Ollama Model" option
4. Click "Generate Wiki"

## Alternative using Dockerfile
1. Configure the Local Embedder for Ollama:
```
cp api/config/embedder.ollama.json.bak api/config/embedder.json
# overwrite api/config/embedder.json? (y/n [n]) y
```
2. Build the docker image `docker build -f Dockerfile-ollama-local -t deepwiki:ollama-local .`
3. Run the container:
```bash
# For regular use
docker run -p 3000:3000 -p 8001:8001 --name deepwiki \
-v ~/.adalflow:/root/.adalflow \
-e OLLAMA_HOST=your_ollama_host \
deepwiki:ollama-local
# For local repository analysis
docker run -p 3000:3000 -p 8001:8001 --name deepwiki \
-v ~/.adalflow:/root/.adalflow \
-e OLLAMA_HOST=your_ollama_host \
-v /path/to/your/repo:/app/local-repos/repo-name \
deepwiki:ollama-local
```
4. When using local repositories in the interface: use `/app/local-repos/repo-name` as the local repository path.
5. Open http://localhost:3000 in your browser
Note: For Apple Silicon Macs, the Dockerfile automatically uses ARM64 binaries for better performance.
## How It Works
When you select "Use Local Ollama", DeepWiki will:
1. Use the `nomic-embed-text` model for creating embeddings of your code
2. Use the `qwen3:1.7b` model for generating documentation
3. Process everything locally on your machine
## Troubleshooting
### "Cannot connect to Ollama server"
- Make sure Ollama is running in the background. You can check by running `ollama list` in your terminal.
- Verify that Ollama is running on the default port (11434)
- Try restarting Ollama
### Slow generation
- Local models are typically slower than cloud APIs. Consider using a smaller repository or a more powerful computer.
- The `qwen3:1.7b` model is optimized for speed and quality balance. Larger models will be slower but may produce better results.
### Out of memory errors
- If you encounter memory issues, try using a smaller model like `phi3:mini` instead of larger models.
- Close other memory-intensive applications while running Ollama
## Advanced: Using Different Models
If you want to try different models, you can modify the `api/config/generator.json` file:
```python
"generator_ollama": {
"model_client": OllamaClient,
"model_kwargs": {
"model": "qwen3:1.7b", # Change this to another model
"options": {
"temperature": 0.7,
"top_p": 0.8,
}
},
},
```
You can replace `"model": "qwen3:1.7b"` with any model you've pulled with Ollama. For a list of available models, visit [Ollama's model library](https://ollama.com/library) or run `ollama list` in your terminal.
Similarly, you can change the embedding model:
```python
"embedder_ollama": {
"model_client": OllamaClient,
"model_kwargs": {
"model": "nomic-embed-text" # Change this to another embedding model
},
},
```
## Performance Considerations
### Hardware Requirements
For optimal performance with Ollama:
- **CPU**: 4+ cores recommended
- **RAM**: 8GB minimum, 16GB+ recommended
- **Storage**: 10GB+ free space for models
- **GPU**: Optional but highly recommended for faster processing
### Model Selection Guide
| Model | Size | Speed | Quality | Use Case |
|-------|------|-------|---------|----------|
| phi3:mini | 1.3GB | Fast | Good | Small projects, quick testing |
| qwen3:1.7b | 3.8GB | Medium | Better | Default, good balance |
| llama3:8b | 8GB | Slow | Best | Complex projects, detailed analysis |
## Limitations
When using Ollama with DeepWiki:
1. **No Internet Access**: The models run completely offline and cannot access external information
2. **Limited Context Window**: Local models typically have smaller context windows than cloud APIs
3. **Less Powerful**: Local models may not match the quality of the latest cloud models
## Conclusion
Using DeepWiki with Ollama gives you a completely local, private solution for code documentation. While it may not match the speed or quality of cloud-based solutions, it provides a free and privacy-focused alternative that works well for most projects.
Enjoy using DeepWiki with your local Ollama models!
================================================
FILE: README.es.md
================================================
# DeepWiki-Open

**DeepWiki** crea automáticamente wikis hermosas e interactivas para cualquier repositorio de GitHub, GitLab o BitBucket. ¡Solo ingresa el nombre de un repositorio y DeepWiki:
1. Analizará la estructura del código
2. Generará documentación completa
3. Creará diagramas visuales para explicar cómo funciona todo
4. Organizará todo en una wiki fácil de navegar
[](https://buymeacoffee.com/sheing)
[](https://x.com/sashimikun_void)
[](https://discord.com/invite/VQMBGR8u5v)
[English](./README.md) | [简体中文](./README.zh.md) | [繁體中文](./README.zh-tw.md) | [日本語](./README.ja.md) | [Español](./README.es.md) | [한국어](./README.kr.md) | [Tiếng Việt](./README.vi.md) | [Português Brasileiro](./README.pt-br.md) | [Français](./README.fr.md) | [Русский](./README.ru.md)
## ✨ Características
- **Documentación Instantánea**: Convierte cualquier repositorio de GitHub, GitLab o BitBucket en una wiki en segundos
- **Soporte para Repositorios Privados**: Accede de forma segura a repositorios privados con tokens de acceso personal
- **Análisis Inteligente**: Comprensión de la estructura y relaciones del código impulsada por IA
- **Diagramas Hermosos**: Diagramas Mermaid automáticos para visualizar la arquitectura y el flujo de datos
- **Navegación Sencilla**: Interfaz simple e intuitiva para explorar la wiki
- **Función de Preguntas**: Chatea con tu repositorio usando IA potenciada por RAG para obtener respuestas precisas
- **Investigación Profunda**: Proceso de investigación de múltiples turnos que examina a fondo temas complejos
- **Múltiples Proveedores de Modelos**: Soporte para Google Gemini, OpenAI, OpenRouter y modelos locales de Ollama
## 🚀 Inicio Rápido (¡Súper Fácil!)
### Opción 1: Usando Docker
```bash
# Clonar el repositorio
git clone https://github.com/AsyncFuncAI/deepwiki-open.git
cd deepwiki-open
# Crear un archivo .env con tus claves API
echo "GOOGLE_API_KEY=your_google_api_key" > .env
echo "OPENAI_API_KEY=your_openai_api_key" >> .env
# Opcional: Añadir clave API de OpenRouter si quieres usar modelos de OpenRouter
echo "OPENROUTER_API_KEY=your_openrouter_api_key" >> .env
# Ejecutar con Docker Compose
docker-compose up
```
(Los comandos de Docker anteriores, así como la configuración de `docker-compose.yml`, montan el directorio `~/.adalflow` de tu host en `/root/.adalflow` dentro del contenedor. Esta ruta se utiliza para almacenar:
- Repositorios clonados (`~/.adalflow/repos/`)
- Sus embeddings e índices (`~/.adalflow/databases/`)
- Contenido de wiki generado y cacheado (`~/.adalflow/wikicache/`)
Esto asegura que tus datos persistan incluso si el contenedor se detiene o se elimina.)
> 💡 **Dónde obtener estas claves:**
> - Obtén una clave API de Google en [Google AI Studio](https://makersuite.google.com/app/apikey)
> - Obtén una clave API de OpenAI en [OpenAI Platform](https://platform.openai.com/api-keys)
### Opción 2: Configuración Manual (Recomendada)
#### Paso 1: Configurar tus Claves API
Crea un archivo `.env` en la raíz del proyecto con estas claves:
```
GOOGLE_API_KEY=your_google_api_key
OPENAI_API_KEY=your_openai_api_key
# Opcional: Añade esto si quieres usar modelos de OpenRouter
OPENROUTER_API_KEY=your_openrouter_api_key
```
#### Paso 2: Iniciar el Backend
```bash
# Instalar dependencias de Python
python -m pip install poetry==2.0.1 && poetry install -C api
# Iniciar el servidor API
python -m api.main
```
#### Paso 3: Iniciar el Frontend
```bash
# Instalar dependencias de JavaScript
npm install
# o
yarn install
# Iniciar la aplicación web
npm run dev
# o
yarn dev
```
#### Paso 4: ¡Usar DeepWiki!
1. Abre [http://localhost:3000](http://localhost:3000) en tu navegador
2. Ingresa un repositorio de GitHub, GitLab o Bitbucket (como `https://github.com/openai/codex`, `https://github.com/microsoft/autogen`, `https://gitlab.com/gitlab-org/gitlab`, o `https://bitbucket.org/redradish/atlassian_app_versions`)
3. Para repositorios privados, haz clic en "+ Agregar tokens de acceso" e ingresa tu token de acceso personal de GitHub o GitLab
4. ¡Haz clic en "Generar Wiki" y observa la magia suceder!
## 🔍 Cómo Funciona
DeepWiki usa IA para:
1. Clonar y analizar el repositorio de GitHub, GitLab o Bitbucket (incluyendo repos privados con autenticación por token)
2. Crear embeddings del código para recuperación inteligente
3. Generar documentación con IA consciente del contexto (usando modelos de Google Gemini, OpenAI, OpenRouter o Ollama local)
4. Crear diagramas visuales para explicar las relaciones del código
5. Organizar todo en una wiki estructurada
6. Habilitar preguntas y respuestas inteligentes con el repositorio a través de la función de Preguntas
7. Proporcionar capacidades de investigación en profundidad con Investigación Profunda
```mermaid
graph TD
A[Usuario ingresa repo GitHub/GitLab/Bitbucket] --> AA{¿Repo privado?}
AA -->|Sí| AB[Agregar token de acceso]
AA -->|No| B[Clonar Repositorio]
AB --> B
B --> C[Analizar Estructura del Código]
C --> D[Crear Embeddings del Código]
D --> M{Seleccionar Proveedor de Modelo}
M -->|Google Gemini| E1[Generar con Gemini]
M -->|OpenAI| E2[Generar con OpenAI]
M -->|OpenRouter| E3[Generar con OpenRouter]
M -->|Ollama Local| E4[Generar con Ollama]
E1 --> E[Generar Documentación]
E2 --> E
E3 --> E
E4 --> E
D --> F[Crear Diagramas Visuales]
E --> G[Organizar como Wiki]
F --> G
G --> H[DeepWiki Interactiva]
classDef process stroke-width:2px;
classDef data stroke-width:2px;
classDef result stroke-width:2px;
classDef decision stroke-width:2px;
class A,D data;
class AA,M decision;
class B,C,E,F,G,AB,E1,E2,E3,E4 process;
class H result;
```
## 🛠️ Estructura del Proyecto
```
deepwiki/
├── api/ # Servidor API backend
│ ├── main.py # Punto de entrada de la API
│ ├── api.py # Implementación FastAPI
│ ├── rag.py # Generación Aumentada por Recuperación
│ ├── data_pipeline.py # Utilidades de procesamiento de datos
│ └── requirements.txt # Dependencias Python
│
├── src/ # App frontend Next.js
│ ├── app/ # Directorio app de Next.js
│ │ └── page.tsx # Página principal de la aplicación
│ └── components/ # Componentes React
│ └── Mermaid.tsx # Renderizador de diagramas Mermaid
│
├── public/ # Activos estáticos
├── package.json # Dependencias JavaScript
└── .env # Variables de entorno (crear este archivo)
```
## 🤖 Sistema de Selección de Modelos Basado en Proveedores
DeepWiki ahora implementa un sistema flexible de selección de modelos basado en proveedores que soporta múltiples proveedores de LLM:
### Proveedores y Modelos Soportados
- **Google**: Predeterminado `gemini-2.5-flash`, también soporta `gemini-2.5-flash-lite`, `gemini-2.5-pro`, etc.
- **OpenAI**: Predeterminado `gpt-5-nano`, también soporta `gpt-5`, `4o`, etc.
- **OpenRouter**: Acceso a múltiples modelos a través de una API unificada, incluyendo Claude, Llama, Mistral, etc.
- **Ollama**: Soporte para modelos de código abierto ejecutados localmente como `llama3`
### Variables de Entorno
Cada proveedor requiere sus correspondientes variables de entorno para las claves API:
```
# Claves API
GOOGLE_API_KEY=tu_clave_api_google # Requerida para modelos Google Gemini
OPENAI_API_KEY=tu_clave_api_openai # Requerida para modelos OpenAI
OPENROUTER_API_KEY=tu_clave_api_openrouter # Requerida para modelos OpenRouter
# Configuración de URL Base de OpenAI API
OPENAI_BASE_URL=https://punto-final-personalizado.com/v1 # Opcional, para endpoints personalizados de OpenAI API
# Directorio de Configuración
DEEPWIKI_CONFIG_DIR=/ruta/a/directorio/config/personalizado # Opcional, para ubicación personalizada de archivos de configuración
```
### Archivos de Configuración
DeepWiki utiliza archivos de configuración JSON para gestionar varios aspectos del sistema:
1. **`generator.json`**: Configuración para modelos de generación de texto
- Define los proveedores de modelos disponibles (Google, OpenAI, OpenRouter, Ollama)
- Especifica los modelos predeterminados y disponibles para cada proveedor
- Contiene parámetros específicos de los modelos como temperatura y top_p
2. **`embedder.json`**: Configuración para modelos de embeddings y procesamiento de texto
- Define modelos de embeddings para almacenamiento vectorial
- Contiene configuración del recuperador para RAG
- Especifica ajustes del divisor de texto para fragmentación de documentos
3. **`repo.json`**: Configuración para manejo de repositorios
- Contiene filtros de archivos para excluir ciertos archivos y directorios
- Define límites de tamaño de repositorio y reglas de procesamiento
Por defecto, estos archivos se encuentran en el directorio `api/config/`. Puedes personalizar su ubicación usando la variable de entorno `DEEPWIKI_CONFIG_DIR`.
### Selección de Modelos Personalizados para Proveedores de Servicios
La función de selección de modelos personalizados está diseñada específicamente para proveedores de servicios que necesitan:
- Puede ofrecer a los usuarios dentro de su organización una selección de diferentes modelos de IA
- Puede adaptarse rápidamente al panorama de LLM en rápida evolución sin cambios de código
- Puede soportar modelos especializados o ajustados que no están en la lista predefinida
Usted puede implementar sus ofertas de modelos seleccionando entre las opciones predefinidas o ingresando identificadores de modelos personalizados en la interfaz frontend.
### Configuración de URL Base para Canales Privados Empresariales
La configuración de base_url del Cliente OpenAI está diseñada principalmente para usuarios empresariales con canales API privados. Esta función:
- Permite la conexión a endpoints API privados o específicos de la empresa
- Permite a las organizaciones usar sus propios servicios LLM auto-alojados o desplegados a medida
- Soporta integración con servicios de terceros compatibles con la API de OpenAI
**Próximamente**: En futuras actualizaciones, DeepWiki soportará un modo donde los usuarios deberán proporcionar sus propias claves API en las solicitudes. Esto permitirá a los clientes empresariales con canales privados utilizar sus disposiciones API existentes sin compartir credenciales con el despliegue de DeepWiki.
## 🧩 Uso de modelos de embedding compatibles con OpenAI (por ejemplo, Alibaba Qwen)
Si deseas usar modelos de embedding compatibles con la API de OpenAI (como Alibaba Qwen), sigue estos pasos:
1. Sustituye el contenido de `api/config/embedder.json` por el de `api/config/embedder_openai_compatible.json`.
2. En el archivo `.env` de la raíz del proyecto, configura las variables de entorno necesarias, por ejemplo:
```
OPENAI_API_KEY=tu_api_key
OPENAI_BASE_URL=tu_endpoint_compatible_openai
```
3. El programa sustituirá automáticamente los placeholders de embedder.json por los valores de tus variables de entorno.
Así puedes cambiar fácilmente a cualquier servicio de embedding compatible con OpenAI sin modificar el código.
## 🤖 Funciones de Preguntas e Investigación Profunda
### Función de Preguntas
La función de Preguntas te permite chatear con tu repositorio usando Generación Aumentada por Recuperación (RAG):
- **Respuestas Conscientes del Contexto**: Obtén respuestas precisas basadas en el código real de tu repositorio
- **Potenciada por RAG**: El sistema recupera fragmentos de código relevantes para proporcionar respuestas fundamentadas
- **Transmisión en Tiempo Real**: Ve las respuestas mientras se generan para una experiencia más interactiva
- **Historial de Conversación**: El sistema mantiene el contexto entre preguntas para interacciones más coherentes
### Función de Investigación Profunda
Investigación Profunda lleva el análisis de repositorios al siguiente nivel con un proceso de investigación de múltiples turnos:
- **Investigación en Profundidad**: Explora a fondo temas complejos a través de múltiples iteraciones de investigación
- **Proceso Estructurado**: Sigue un plan de investigación claro con actualizaciones y una conclusión completa
- **Continuación Automática**: La IA continúa automáticamente la investigación hasta llegar a una conclusión (hasta 5 iteraciones)
- **Etapas de Investigación**:
1. **Plan de Investigación**: Describe el enfoque y los hallazgos iniciales
2. **Actualizaciones de Investigación**: Desarrolla las iteraciones anteriores con nuevas perspectivas
3. **Conclusión Final**: Proporciona una respuesta completa basada en todas las iteraciones
Para usar Investigación Profunda, simplemente activa el interruptor "Investigación Profunda" en la interfaz de Preguntas antes de enviar tu pregunta.
## 📱 Capturas de Pantalla

*La interfaz principal de DeepWiki*

*Acceso a repositorios privados con tokens de acceso personal*

*Investigación Profunda realiza investigaciones de múltiples turnos para temas complejos*
### Video de Demostración
[](https://youtu.be/zGANs8US8B4)
*¡Mira DeepWiki en acción!*
## ❓ Solución de Problemas
### Problemas con Claves API
- **"Faltan variables de entorno"**: Asegúrate de que tu archivo `.env` esté en la raíz del proyecto y contenga las claves API requeridas
- **"Clave API no válida"**: Verifica que hayas copiado la clave completa correctamente sin espacios adicionales
- **"Error de API OpenRouter"**: Verifica que tu clave API de OpenRouter sea válida y tenga créditos suficientes
### Problemas de Conexión
- **"No se puede conectar al servidor API"**: Asegúrate de que el servidor API esté ejecutándose en el puerto 8001
- **"Error CORS"**: La API está configurada para permitir todos los orígenes, pero si tienes problemas, intenta ejecutar tanto el frontend como el backend en la misma máquina
### Problemas de Generación
- **"Error al generar wiki"**: Para repositorios muy grandes, prueba primero con uno más pequeño
- **"Formato de repositorio no válido"**: Asegúrate de usar un formato de URL válido para GitHub, GitLab o Bitbucket
- **"No se pudo obtener la estructura del repositorio"**: Para repositorios privados, asegúrate de haber ingresado un token de acceso personal válido con los permisos apropiados
- **"Error de renderizado de diagrama"**: La aplicación intentará automáticamente arreglar los diagramas rotos
### Soluciones Comunes
1. **Reiniciar ambos servidores**: A veces un simple reinicio soluciona la mayoría de los problemas
2. **Revisar los registros de la consola**: Abre las herramientas de desarrollo del navegador para ver cualquier error de JavaScript
3. **Revisar los registros de la API**: Mira la terminal donde se ejecuta la API para ver errores de Python
## 🤝 Contribuir
¡Las contribuciones son bienvenidas! Siéntete libre de:
- Abrir issues para bugs o solicitudes de funciones
- Enviar pull requests para mejorar el código
- Compartir tus comentarios e ideas
## 📄 Licencia
Este proyecto está licenciado bajo la Licencia MIT - consulta el archivo [LICENSE](LICENSE) para más detalles.
## ⭐ Historial de Estrellas
[](https://star-history.com/#AsyncFuncAI/deepwiki-open&Date)
================================================
FILE: README.fr.md
================================================
# DeepWiki-Open

**DeepWiki** est ma propre tentative d’implémentation de DeepWiki, un outil qui crée automatiquement des wikis magnifiques et interactifs pour n’importe quel dépôt GitHub, GitLab ou Bitbucket ! Il suffit d’entrer un nom de dépôt, et DeepWiki :
1. Analyse la structure du code
2. Génère une documentation complète
3. Crée des diagrammes visuels pour expliquer le fonctionnement
4. Organise le tout dans un wiki facile à naviguer
[](https://buymeacoffee.com/sheing)
[](https://tip.md/sng-asyncfunc)
[](https://x.com/sashimikun_void)
[](https://discord.com/invite/VQMBGR8u5v)
[English](./README.md) | [简体中文](./README.zh.md) | [繁體中文](./README.zh-tw.md) | [日本語](./README.ja.md) | [Español](./README.es.md) | [한국어](./README.kr.md) | [Tiếng Việt](./README.vi.md) | [Português Brasileiro](./README.pt-br.md) | [Français](./README.fr.md) | [Русский](./README.ru.md)
## ✨ Fonctionnalités
- **Documentation instantanée** : Transforme un dépôt GitHub, GitLab ou Bitbucket en wiki en quelques secondes
- **Support des dépôts privés** : Accès sécurisé avec jetons d’accès personnels
- **Analyse intelligente** : Compréhension de la structure et des relations du code via l’IA
- **Diagrammes élégants** : Diagrammes Mermaid automatiques pour visualiser l’architecture et les flux de données
- **Navigation facile** : Interface simple et intuitive
- **Fonction “Ask”** : Posez des questions à votre dépôt avec une IA alimentée par RAG
- **DeepResearch** : Processus de recherche multi-étapes pour explorer des sujets complexes
- **Multiples fournisseurs de modèles IA** : Prise en charge de Google Gemini, OpenAI, OpenRouter, et Ollama local
## 🚀 Démarrage rapide (super facile !)
### Option 1 : Avec Docker
```bash
# Cloner le dépôt
git clone https://github.com/AsyncFuncAI/deepwiki-open.git
cd deepwiki-open
# Créer un fichier .env avec vos clés API
echo "GOOGLE_API_KEY=votre_clé_google" > .env
echo "OPENAI_API_KEY=votre_clé_openai" >> .env
# Facultatif : clé OpenRouter
echo "OPENROUTER_API_KEY=votre_clé_openrouter" >> .env
# Facultatif : hôte personnalisé Ollama
echo "OLLAMA_HOST=votre_hote_ollama" >> .env
# Facultatif : Azure OpenAI
echo "AZURE_OPENAI_API_KEY=votre_clé_azure" >> .env
echo "AZURE_OPENAI_ENDPOINT=votre_endpoint" >> .env
echo "AZURE_OPENAI_VERSION=version_api" >> .env
# Lancer avec Docker Compose
docker-compose up
```
Pour des instructions détaillées sur l’utilisation de DeepWiki avec Ollama et Docker, consultez [Ollama Instructions](Ollama-instruction.md).
> 💡 **Où obtenir ces clés :**
> - Obtenez une clé API Google depuis [Google AI Studio](https://makersuite.google.com/app/apikey)
> - Obtenez une clé API OpenAI depuis [OpenAI Platform](https://platform.openai.com/api-keys)
> - Obtenez les identifiants Azure OpenAI depuis [Azure Portal](https://portal.azure.com/) – créez une ressource Azure OpenAI et récupérez la clé API, l’endpoint et la version de l’API
### Option 2 : Installation manuelle (Recommandée)
#### Étape 1 : Configurez vos clés API
Créez un fichier `.env` à la racine du projet avec ces clés :
```
GOOGLE_API_KEY=votre_clé_google
OPENAI_API_KEY=votre_clé_openai
# Optionnel : Ajoutez ceci pour utiliser des modèles OpenRouter
OPENROUTER_API_KEY=votre_clé_openrouter
# Optionnel : Ajoutez ceci pour utiliser des modèles Azure OpenAI
AZURE_OPENAI_API_KEY=votre_clé_azure_openai
AZURE_OPENAI_ENDPOINT=votre_endpoint_azure_openai
AZURE_OPENAI_VERSION=votre_version_azure_openai
# Optionnel :Ajouter un hôte distant Ollama si il n'est pas local. défaut : http://localhost:11434
OLLAMA_HOST=votre_hote_ollama
```
#### Étape 2 : Démarrer le Backend
```bash
# Installer dépendances Python
python -m pip install poetry==2.0.1 && poetry install -C api
# Démarrer le serveur API
python -m api.main
```
#### Étape 3 : Démarrer le Frontend
```bash
# Installer les dépendances JavaScript
npm install
# ou
yarn install
# Démarrer le serveur web
npm run dev
# ou
yarn dev
```
#### Étape 4 : Utiliser DeepWiki!
1. Ouvrir [http://localhost:3000](http://localhost:3000) dans votre navigateur
2. Entrer l'adresse d'un dépôt GitHub, GitLab ou Bitbucket (comme `https://github.com/openai/codex`, `https://github.com/microsoft/autogen`, `https://gitlab.com/gitlab-org/gitlab`, or `https://bitbucket.org/redradish/atlassian_app_versions`)
3. Pour les dépôts privés, cliquez sur "+ Ajouter un jeton d'accès" et entrez votre jeton d’accès personnel GitHub ou GitLab.
4. Cliquez sur "Générer le Wiki" et regardez la magie opérer !
## 🔍 Comment ça marche
DeepWiki utilise l'IA pour :
1. Cloner et analyser le dépôt GitHub, GitLab ou Bitbucket (y compris les dépôts privés avec authentification par jeton d'accès)
2. Créer des embeddings du code pour une récupération intelligente
3. Générer de la documentation avec une IA sensible au contexte (en utilisant les modèles Google Gemini, OpenAI, OpenRouter, Azure OpenAI ou Ollama local)
4. Créer des diagrammes visuels pour expliquer les relations du code
5. Organiser le tout dans un wiki structuré
6. Permettre des questions-réponses intelligentes avec le dépôt grâce à la fonctionnalité Ask
7. Fournir des capacités de recherche approfondie avec DeepResearch
```mermaid
graph TD
A[Utilisateur entre un dépôt GitHub/GitLab/Bitbucket] --> AA{Dépôt privé?}
AA -->|Oui| AB[Ajouter un jeton d'accès]
AA -->|Non| B[Cloner le dépôt]
AB --> B
B --> C[Analyser la structure du code]
C --> D[Créer des Embeddings]
D --> M{Sélectionner le modèle}
M -->|Google Gemini| E1[Générer avec Gemini]
M -->|OpenAI| E2[Générer avec OpenAI]
M -->|OpenRouter| E3[Générer avec OpenRouter]
M -->|Local Ollama| E4[Générer avec Ollama]
M -->|Azure| E5[Générer avec Azure]
E1 --> E[Générer la documentation]
E2 --> E
E3 --> E
E4 --> E
E5 --> E
D --> F[Créer des diagrammes]
E --> G[Organiser en Wiki]
F --> G
G --> H[DeepWiki interactif]
classDef process stroke-width:2px;
classDef data stroke-width:2px;
classDef result stroke-width:2px;
classDef decision stroke-width:2px;
class A,D data;
class AA,M decision;
class B,C,E,F,G,AB,E1,E2,E3,E4,E5 process;
class H result;
```
## 🛠️ Structure du Projet
```
deepwiki/
├── api/ # Serveur API Backend
│ ├── main.py # Point d'entrée de l'API
│ ├── api.py # Implémentation FastAPI
│ ├── rag.py # Génération Augmentée par Récupération (RAG)
│ ├── data_pipeline.py # Utilitaires de traitement des données
│ └── requirements.txt # Dépendances Python
│
├── src/ # Application Frontend Next.js
│ ├── app/ # Répertoire de l'application Next.js
│ │ └── page.tsx # Page principale de l'application
│ └── components/ # Composants React
│ └── Mermaid.tsx # Rendu des diagrammes Mermaid
│
├── public/ # Ressources statiques
├── package.json # Dépendances JavaScript
└── .env # Variables d'environnement (à créer)
```
## 🤖 Système de sélection de modèles
DeepWiki implémente désormais un système de sélection de modèles flexible, qui prend en charge plusieurs fournisseurs de LLM :
### Fournisseurs et modèles pris en charge
- **Google** : Par défaut `gemini-2.5-flash`, prend également en charge `gemini-2.5-flash-lite`, `gemini-2.5-pro`, etc.
- **OpenAI** : Par défaut `gpt-5-nano`, prend également en charge `gpt-5`, `4o`, etc.
- **OpenRouter** : Accès à plusieurs modèles via une API unifiée, notamment Claude, Llama, Mistral, etc.
- **Azure OpenAI** : Par défaut `gpt-4o`, prend également en charge `o4-mini`, etc.
- **Ollama** : Prise en charge des modèles open source exécutés localement, tels que `llama3`.
### Variables d'environnement
Chaque fournisseur requiert les variables d'environnement de clé API correspondantes :
```
# API Keys
GOOGLE_API_KEY=votre_clé_google # Requis pour les modèles Google Gemini
OPENAI_API_KEY=votre_clé_openai # Requis pour les modèles OpenAI
OPENROUTER_API_KEY=votre_clé_openrouter # Requis pour les modèles OpenRouter
AZURE_OPENAI_API_KEY=votre_clé_azure_openai #Requis pour les modèles Azure OpenAI
AZURE_OPENAI_ENDPOINT=votre_endpoint_azure_openai #Requis pour les modèles Azure OpenAI
AZURE_OPENAI_VERSION=votre_version_azure_openai #Requis pour les modèles Azure OpenAI
# Configuration d'un endpoint OpenAI API personnalisé
OPENAI_BASE_URL=https://custom-api-endpoint.com/v1 # Optionnel, pour les endpoints API OpenAI personnalisés
# Hôte Ollama personnalisé
OLLAMA_HOST=votre_hôte_ollama # Optionnel, si Ollama n'est pas local. défaut: http://localhost:11434
# Répertoire de configuration
DEEPWIKI_CONFIG_DIR=/chemin/vers/dossier/de/configuration # Optionnel, pour personaliser le répertoire de stockage de la configuration
```
### Fichiers de Configuration
DeepWiki utilise des fichiers de configuration JSON pour gérer différents aspects du système :
1. **`generator.json`** : Configuration des modèles de génération de texte
- Définit les fournisseurs de modèles disponibles (Google, OpenAI, OpenRouter, Azure, Ollama)
- Spécifie les modèles par défaut et disponibles pour chaque fournisseur
- Contient des paramètres spécifiques aux modèles tels que la température et top_p
2. **`embedder.json`** : Configuration des modèles d'embedding et du traitement de texte
- Définit les modèles d'embedding pour le stockage vectoriel
- Contient la configuration du retriever pour RAG
- Spécifie les paramètres du séparateur de texte pour le chunking de documents
3. **`repo.json`** : Configuration de la gestion des dépôts
- Contient des filtres de fichiers pour exclure certains fichiers et répertoires
- Définit les limites de taille des dépôts et les règles de traitement
Par défaut, ces fichiers sont situés dans le répertoire `api/config/`. Vous pouvez personnaliser leur emplacement à l'aide de la variable d'environnement `DEEPWIKI_CONFIG_DIR`.
### Sélection de Modèles Personnalisés pour les Fournisseurs de Services
La fonctionnalité de sélection de modèles personnalisés est spécialement conçue pour les fournisseurs de services qui ont besoin de :
- Offrir plusieurs choix de modèles d'IA aux utilisateurs au sein de leur organisation
- S'adapter rapidement à l'évolution rapide du paysage des LLM sans modifications de code
- Prendre en charge des modèles spécialisés ou affinés qui ne figurent pas dans la liste prédéfinie
Les fournisseurs de services peuvent implémenter leurs offres de modèles en sélectionnant parmi les options prédéfinies ou en entrant des identifiants de modèles personnalisés dans l'interface utilisateur.
### Configuration de l'URL de base pour les canaux privés d'entreprise
La configuration `base_url` du client OpenAI est principalement conçue pour les utilisateurs d'entreprise disposant de canaux API privés. Cette fonctionnalité :
- Permet la connexion à des points de terminaison API privés ou spécifiques à l'entreprise.
- Permet aux organisations d'utiliser leurs propres services LLM auto-hébergés ou déployés sur mesure.
- Prend en charge l'intégration avec des services tiers compatibles avec l'API OpenAI.
**Bientôt disponible** : Dans les prochaines mises à jour, DeepWiki prendra en charge un mode où les utilisateurs devront fournir leurs propres clés API dans les requêtes. Cela permettra aux entreprises clientes disposant de canaux privés d'utiliser leurs accords API existants sans partager leurs informations d'identification avec le déploiement DeepWiki.
## 🧩 Utilisation de modèles d'embedding compatibles avec OpenAI (par exemple, Alibaba Qwen)
Si vous souhaitez utiliser des modèles d'embedding compatibles avec l'API OpenAI (comme Alibaba Qwen), suivez ces étapes :
1. Remplacez le contenu de `api/config/embedder.json` par celui de `api/config/embedder_openai_compatible.json`.
2. Dans votre fichier `.env` à la racine du projet, définissez les variables d'environnement appropriées, par exemple :
```
OPENAI_API_KEY=votre_clé_api
OPENAI_BASE_URL=votre_endpoint_compatible_openai
```
3. Le programme substituera automatiquement les espaces réservés dans `embedder.json` avec les valeurs de vos variables d'environnement.
Cela vous permet de passer facilement à n'importe quel service d'embedding compatible avec OpenAI sans modifications de code.
### Journalisation (Logging)
DeepWiki utilise le module `logging` intégré de Python pour la sortie de diagnostics. Vous pouvez configurer la verbosité et la destination du fichier journal via des variables d'environnement :
| Variable | Description | Valeur par défaut |
|-----------------|---------------------------------------------------------------------------|------------------------------|
| `LOG_LEVEL` | Niveau de journalisation (DEBUG, INFO, WARNING, ERROR, CRITICAL). | INFO |
| `LOG_FILE_PATH` | Chemin vers le fichier journal. Si défini, les journaux y seront écrits. | `api/logs/application.log` |
Pour activer la journalisation de débogage et diriger les journaux vers un fichier personnalisé :
```bash
export LOG_LEVEL=DEBUG
export LOG_FILE_PATH=./debug.log
python -m api.main
```
Ou avec Docker Compose:
```bash
LOG_LEVEL=DEBUG LOG_FILE_PATH=./debug.log docker-compose up
```
Lors de l'exécution avec Docker Compose, le répertoire `api/logs` du conteneur est lié à `./api/logs` sur votre hôte (voir la section `volumes` dans `docker-compose.yml`), ce qui garantit que les fichiers journaux persistent lors des redémarrages.
Vous pouvez également stocker ces paramètres dans votre fichier `.env` :
```bash
LOG_LEVEL=DEBUG
LOG_FILE_PATH=./debug.log
```
Puis exécutez simplement :
```bash
docker-compose up
```
**Considérations de sécurité concernant le chemin des journaux :** Dans les environnements de production, assurez-vous que le répertoire `api/logs` et tout chemin de fichier journal personnalisé sont sécurisés avec des permissions de système de fichiers et des contrôles d'accès appropriés. L'application s'assure que `LOG_FILE_PATH` se trouve dans le répertoire `api/logs` du projet afin d'empêcher le parcours de chemin ou les écritures non autorisées.
## 🛠️ Configuration Avancée
### Variables d'environnement
| Variable | Description | Requis | Note |
|-------------------------|-----------------------------------------------------------------|------------|----------------------------------------------------------------------------------------------------------|
| `GOOGLE_API_KEY` | Clé API Google Gemini pour la génération | Non | Requis uniquement si vous souhaitez utiliser les modèles Google Gemini |
| `OPENAI_API_KEY` | Clé API OpenAI pour les embeddings et la génération | Oui | Remarque : Ceci est requis même si vous n'utilisez pas les modèles OpenAI, car elle est utilisée pour les embeddings. |
| `OPENROUTER_API_KEY` | Clé API OpenRouter pour les modèles alternatifs | Non | Requis uniquement si vous souhaitez utiliser les modèles OpenRouter |
| `AZURE_OPENAI_API_KEY` | Clé API Azure OpenAI | Non | Requis uniquement si vous souhaitez utiliser les modèles Azure OpenAI |
| `AZURE_OPENAI_ENDPOINT` | Point de terminaison Azure OpenAI | Non | Requis uniquement si vous souhaitez utiliser les modèles Azure OpenAI |
| `AZURE_OPENAI_VERSION` | Version Azure OpenAI | Non | Requis uniquement si vous souhaitez utiliser les modèles Azure OpenAI |
| `OLLAMA_HOST` | Hôte Ollama (par défaut : http://localhost:11434) | Non | Requis uniquement si vous souhaitez utiliser un serveur Ollama externe |
| `PORT` | Port du serveur API (par défaut : 8001) | Non | Si vous hébergez l'API et le frontend sur la même machine, assurez-vous de modifier le port de `SERVER_BASE_URL` en conséquence |
| `SERVER_BASE_URL` | URL de base du serveur API (par défaut : http://localhost:8001) | Non | |
| `DEEPWIKI_AUTH_MODE` | Définir sur `true` ou `1` pour activer le mode verrouillé | Non | La valeur par défaut est `false`. Si activé, `DEEPWIKI_AUTH_CODE` est requis. |
| `DEEPWIKI_AUTH_CODE` | Le code requis pour la génération de wiki lorsque `DEEPWIKI_AUTH_MODE` est activé. | Non | Utilisé uniquement si `DEEPWIKI_AUTH_MODE` est `true` ou `1`. |
Si vous n'utilisez pas le mode Ollama, vous devez configurer une clé API OpenAI pour les embeddings. Les autres clés API ne sont requises que si vous configurez et utilisez des modèles des fournisseurs correspondants.
## Mode vérouillé
DeepWiki peut être configuré pour fonctionner en mode vérouillé, où la génération de wiki nécessite un code d'autorisation valide. Ceci est utile si vous souhaitez contrôler qui peut utiliser la fonctionnalité de génération.
Restreint l'initialisation du frontend et protège la suppression du cache, mais n'empêche pas complètement la génération backend si les points de terminaison de l'API sont atteints directement.
Pour activer le mode vérouillé, définissez les variables d'environnement suivantes :
- `DEEPWIKI_AUTH_MODE` : définissez cette variable sur `true` ou `1`. Une fois activée, l'interface affichera un champ de saisie pour le code d'autorisation.
- `DEEPWIKI_AUTH_CODE` : définissez cette variable sur le code secret souhaité. Restreint l'initialisation du frontend et protège la suppression du cache, mais n'empêche pas complètement la génération backend si les points de terminaison de l'API sont atteints directement.
Si `DEEPWIKI_AUTH_MODE` n'est pas défini ou est défini sur `false` (ou toute autre valeur que `true`/`1`), la fonctionnalité d'autorisation sera désactivée et aucun code ne sera requis.
### Configuration Docker
Vous pouvez utiliser Docker pour exécuter DeepWiki :
#### Exécution du conteneur
```bash
# Récupérer l'image depuis GitHub Container Registry
docker pull ghcr.io/asyncfuncai/deepwiki-open:latest
# Exécuter le conteneur avec les variables d'environnement
docker run -p 8001:8001 -p 3000:3000 \
-e GOOGLE_API_KEY=votre_clé_google \
-e OPENAI_API_KEY=votre_clé_openai \
-e OPENROUTER_API_KEY=votre_clé_openrouter \
-e OLLAMA_HOST=votre_hôte_ollama \
-e AZURE_OPENAI_API_KEY=votre_clé_azure_openai \
-e AZURE_OPENAI_ENDPOINT=votre_endpoint_azure_openai \
-e AZURE_OPENAI_VERSION=votre_version_azure_openai \
-v ~/.adalflow:/root/.adalflow \
ghcr.io/asyncfuncai/deepwiki-open:latest
```
Cette commande monte également `~/.adalflow` de votre hôte vers `/root/.adalflow` dans le conteneur. Ce chemin est utilisé pour stocker :
- Les dépôts clonés (`~/.adalflow/repos/`)
- Leurs embeddings et index (`~/.adalflow/databases/`)
- Le contenu wiki généré mis en cache (`~/.adalflow/wikicache/`)
Cela garantit que vos données persistent même si le conteneur est arrêté ou supprimé.
Vous pouvez également utiliser le fichier `docker-compose.yml` fourni :
```bash
# Modifiez d'abord le fichier .env avec vos clés API
docker-compose up
```
(Le fichier `docker-compose.yml` est préconfiguré pour monter `~/.adalflow` pour la persistance des données, de manière similaire à la commande `docker run` ci-dessus.)
#### Utilisation d'un fichier .env avec Docker
Vous pouvez également monter un fichier `.env` dans le conteneur :
```bash
# Créer un fichier .env avec vos clés API
echo "GOOGLE_API_KEY=votre_clé_google" > .env
echo "OPENAI_API_KEY=votre_clé_openai" >> .env
echo "OPENROUTER_API_KEY=votre_clé_openrouter" >> .env
echo "AZURE_OPENAI_API_KEY=votre_clé_azure_openai" >> .env
echo "AZURE_OPENAI_ENDPOINT=votre_endpoint_azure_openai" >> .env
echo "AZURE_OPENAI_VERSION=votre_version_azure_openai" >> .env
echo "OLLAMA_HOST=votre_hôte_ollama" >> .env
# Run the container with the .env file mounted
docker run -p 8001:8001 -p 3000:3000 \
-v $(pwd)/.env:/app/.env \
-v ~/.adalflow:/root/.adalflow \
ghcr.io/asyncfuncai/deepwiki-open:latest
```
Cette commande monte également `~/.adalflow` de votre hôte vers `/root/.adalflow` dans le conteneur. Ce chemin est utilisé pour stocker :
- Les dépôts clonés (`~/.adalflow/repos/`)
- Leurs embeddings et index (`~/.adalflow/databases/`)
- Le contenu wiki généré mis en cache (`~/.adalflow/wikicache/`)
Cela garantit que vos données persistent même si le conteneur est arrêté ou supprimé.
#### Construction de l'image Docker localement
If you want to build the Docker image locally:
```bash
# Clone the repository
git clone https://github.com/AsyncFuncAI/deepwiki-open.git
cd deepwiki-open
# Build the Docker image
docker build -t deepwiki-open .
# Run the container
docker run -p 8001:8001 -p 3000:3000 \
-e GOOGLE_API_KEY=votre_clé_google \
-e OPENAI_API_KEY=votre_clé_openai \
-e OPENROUTER_API_KEY=votre_clé_openrouter \
-e AZURE_OPENAI_API_KEY=votre_clé_azure_openai \
-e AZURE_OPENAI_ENDPOINT=votre_endpoint_azure_openai \
-e AZURE_OPENAI_VERSION=votre_version_azure_openai \
-e OLLAMA_HOST=votre_hôte_ollama \
deepwiki-open
```
#### Utilisation de certificats auto-signés dans Docker
Si vous êtes dans un environnement qui utilise des certificats auto-signés, vous pouvez les inclure dans la construction de l'image Docker :
1. Créez un répertoire pour vos certificats (le répertoire par défaut est `certs` à la racine de votre projet)
2. Copiez vos fichiers de certificats `.crt` ou `.pem` dans ce répertoire
3. Construisez l'image Docker :
```bash
# Construire avec le répertoire de certificats par défaut (certs)
docker build .
# Ou construire avec un répertoire de certificats personnalisé
docker build --build-arg CUSTOM_CERT_DIR=my-custom-certs .
```
### Détails du serveur API
Le serveur API fournit :
- Clonage et indexation des dépôts
- RAG (Retrieval Augmented Generation - Génération augmentée par récupération)
- Complétion de chat en streaming
Pour plus de détails, consultez le [README de l’API](./api/README.md).
## 🔌 Intégration OpenRouter
DeepWiki prend désormais en charge [OpenRouter](https://openrouter.ai/) en tant que fournisseur de modèles, vous donnant accès à des centaines de modèles d'IA via une seule API :
- **Options de modèles multiples** : accédez aux modèles d'OpenAI, Anthropic, Google, Meta, Mistral, et plus encore
- **Configuration simple** : ajoutez simplement votre clé API OpenRouter et sélectionnez le modèle que vous souhaitez utiliser
- **Rentabilité** : choisissez des modèles qui correspondent à votre budget et à vos besoins en termes de performances
- **Commutation facile** : basculez entre différents modèles sans modifier votre code
### Comment utiliser OpenRouter avec DeepWiki
1. **Obtenez une clé API** : inscrivez-vous sur [OpenRouter](https://openrouter.ai/) et obtenez votre clé API
2. **Ajouter à l'environnement** : ajoutez `OPENROUTER_API_KEY=votre_clé` à votre fichier `.env`
3. **Activer dans l'interface utilisateur** : cochez l'option "Utiliser l'API OpenRouter" sur la page d'accueil
4. **Sélectionnez le modèle** : choisissez parmi les modèles populaires tels que GPT-4o, Claude 3.5 Sonnet, Gemini 2.0, et plus encore
OpenRouter est particulièrement utile si vous souhaitez :
- Essayer différents modèles sans vous inscrire à plusieurs services
- Accéder à des modèles qui pourraient être restreints dans votre région
- Comparer les performances entre différents fournisseurs de modèles
- Optimiser le rapport coût/performance en fonction de vos besoins
## 🤖 Fonctionnalités Ask & DeepResearch
### Fonctionnalité Ask
La fonctionnalité Ask vous permet de discuter avec votre dépôt en utilisant la génération augmentée par récupération (RAG) :
- **Réponses sensibles au contexte** : obtenez des réponses précises basées sur le code réel de votre dépôt
- **Alimenté par RAG** : le système récupère des extraits de code pertinents pour fournir des réponses fondées
- **Streaming en temps réel** : visualisez les réponses au fur et à mesure de leur génération pour une expérience plus interactive
- **Historique des conversations** : le système conserve le contexte entre les questions pour des interactions plus cohérentes
### Fonctionnalité DeepResearch
DeepResearch fait passer l'analyse de référentiel au niveau supérieur avec un processus de recherche en plusieurs étapes :
- **Enquête approfondie** : explore en profondeur des sujets complexes grâce à de multiples itérations de recherche
- **Processus structuré** : suit un plan de recherche clair avec des mises à jour et une conclusion complète
- **Continuation automatique** : l'IA poursuit automatiquement la recherche jusqu'à ce qu'elle atteigne une conclusion (jusqu'à 5 itérations)
- **Étapes de la recherche** :
1. **Plan de recherche** : décrit l'approche et les premières conclusions
2. **Mises à jour de la recherche** : s'appuie sur les itérations précédentes avec de nouvelles informations
3. **Conclusion finale** : fournit une réponse complète basée sur toutes les itérations
Pour utiliser DeepResearch, activez simplement le commutateur "Deep Research" dans l'interface Ask avant de soumettre votre question.
## 📱 Captures d'écran

*L'interface principale de DeepWiki*

*Accédez aux dépôts privés avec des jetons d'accès personnels*

*DeepResearch effectue des recherches en plusieurs étapes pour des sujets complexes*
### Vidéo de démonstration
[](https://youtu.be/zGANs8US8B4)
*Regardez DeepWiki en action !*
## ❓ Dépannage
### Problèmes de clé API
- **"Variables d'environnement manquantes"** : assurez-vous que votre fichier `.env` se trouve à la racine du projet et qu'il contient les clés API requises.
- **"Clé API non valide"** : vérifiez que vous avez correctement copié la clé complète, sans espaces supplémentaires.
- **"Erreur d'API OpenRouter"** : vérifiez que votre clé API OpenRouter est valide et qu'elle dispose de crédits suffisants.
- **"Erreur d'API Azure OpenAI"** : vérifiez que vos informations d'identification Azure OpenAI (clé API, point de terminaison et version) sont correctes et que le service est correctement déployé.
### Problèmes de connexion
- **"Impossible de se connecter au serveur API"** : assurez-vous que le serveur API est en cours d'exécution sur le port 8001.
- **"Erreur CORS"** : l'API est configurée pour autoriser toutes les origines, mais si vous rencontrez des problèmes, essayez d'exécuter le frontend et le backend sur la même machine.
### Problèmes de génération
- **"Erreur lors de la génération du wiki"** : pour les très grands référentiels, essayez d'abord un référentiel plus petit.
- **"Format de référentiel non valide"** : assurez-vous que vous utilisez un format d'URL GitHub, GitLab ou Bitbucket valide.
- **"Impossible de récupérer la structure du référentiel"** : pour les référentiels privés, assurez-vous d'avoir saisi un jeton d'accès personnel valide avec les autorisations appropriées.
- **"Erreur de rendu du diagramme"** : l'application essaiera automatiquement de corriger les diagrammes cassés.
### Solutions courantes
1. **Redémarrez les deux serveurs** : parfois, un simple redémarrage résout la plupart des problèmes.
2. **Vérifiez les journaux de la console** : ouvrez les outils de développement du navigateur pour voir les erreurs JavaScript.
3. **Vérifiez les journaux de l'API** : consultez le terminal où l'API est en cours d'exécution pour les erreurs Python.
## 🤝 Contribution
Les contributions sont les bienvenues ! N'hésitez pas à :
- Ouvrir des issues pour les bugs ou les demandes de fonctionnalités
- Soumettre des pull requests pour améliorer le code
- Partager vos commentaires et vos idées
## 📄 Licence
Projet sous licence MIT – Voir le fichier [LICENSE](LICENSE).
## ⭐ Historique des stars
[](https://star-history.com/#AsyncFuncAI/deepwiki-open&Date)
================================================
FILE: README.ja.md
================================================
# DeepWiki-Open

**DeepWiki**は、GitHub、GitLab、または Bitbucket リポジトリのための美しくインタラクティブな Wiki を自動的に作成します!リポジトリ名を入力するだけで、DeepWiki は以下を行います:
1. コード構造を分析
2. 包括的なドキュメントを生成
3. すべての仕組みを説明する視覚的な図を作成
4. すべてを簡単に閲覧できる Wiki に整理
[](https://buymeacoffee.com/sheing)
[](https://x.com/sashimikun_void)
[](https://discord.com/invite/VQMBGR8u5v)
[English](./README.md) | [简体中文](./README.zh.md) | [繁體中文](./README.zh-tw.md) | [日本語](./README.ja.md) | [Español](./README.es.md) | [한국어](./README.kr.md) | [Tiếng Việt](./README.vi.md) | [Português Brasileiro](./README.pt-br.md) | [Français](./README.fr.md) | [Русский](./README.ru.md)
## ✨ 特徴
- **即時ドキュメント生成**: あらゆる GitHub、GitLab、または Bitbucket リポジトリを数秒で Wiki に変換
- **プライベートリポジトリ対応**: 個人アクセストークンを使用してプライベートリポジトリに安全にアクセス
- **スマート分析**: AI を活用したコード構造と関係の理解
- **美しい図表**: アーキテクチャとデータフローを視覚化する自動 Mermaid 図
- **簡単なナビゲーション**: Wiki を探索するためのシンプルで直感的なインターフェース
- **質問機能**: RAG 搭載 AI を使用してリポジトリとチャットし、正確な回答を得る
- **詳細調査**: 複雑なトピックを徹底的に調査する多段階研究プロセス
- **複数のモデルプロバイダー**: Google Gemini、OpenAI、OpenRouter、およびローカル Ollama モデルのサポート
## 🚀 クイックスタート(超簡単!)
### オプション 1: Docker を使用
```bash
# リポジトリをクローン
git clone https://github.com/AsyncFuncAI/deepwiki-open.git
cd deepwiki-open
# APIキーを含む.envファイルを作成
echo "GOOGLE_API_KEY=your_google_api_key" > .env
echo "OPENAI_API_KEY=your_openai_api_key" >> .env
# オプション: OpenRouterモデルを使用する場合はOpenRouter APIキーを追加
echo "OPENROUTER_API_KEY=your_openrouter_api_key" >> .env
# Docker Composeで実行
docker-compose up
```
(上記の Docker コマンドおよび`docker-compose.yml`の設定では、ホスト上の`~/.adalflow`ディレクトリをコンテナ内の`/root/.adalflow`にマウントします。このパスは以下のものを保存するために使用されます:
- クローンされたリポジトリ (`~/.adalflow/repos/`)
- それらのエンベディングとインデックス (`~/.adalflow/databases/`)
- 生成された Wiki のキャッシュ (`~/.adalflow/wikicache/`)
これにより、コンテナが停止または削除されてもデータが永続化されます。)
> 💡 **これらのキーの入手先:**
>
> - Google API キーは[Google AI Studio](https://makersuite.google.com/app/apikey)から取得
> - OpenAI API キーは[OpenAI Platform](https://platform.openai.com/api-keys)から取得
### オプション 2: 手動セットアップ(推奨)
#### ステップ 1: API キーの設定
プロジェクトのルートに`.env`ファイルを作成し、以下のキーを追加します:
```
GOOGLE_API_KEY=your_google_api_key
OPENAI_API_KEY=your_openai_api_key
# オプション: OpenRouterモデルを使用する場合は追加
OPENROUTER_API_KEY=your_openrouter_api_key
```
#### ステップ 2: バックエンドの起動
```bash
# Pythonの依存関係をインストール
python -m pip install poetry==2.0.1 && poetry install -C api
# APIサーバーを起動
python -m api.main
```
#### ステップ 3: フロントエンドの起動
```bash
# JavaScript依存関係をインストール
npm install
# または
yarn install
# Webアプリを起動
npm run dev
# または
yarn dev
```
#### ステップ 4: DeepWiki を使用!
1. ブラウザで[http://localhost:3000](http://localhost:3000)を開く
2. GitHub、GitLab、または Bitbucket リポジトリを入力(例:`https://github.com/openai/codex`、`https://github.com/microsoft/autogen`、`https://gitlab.com/gitlab-org/gitlab`、または`https://bitbucket.org/redradish/atlassian_app_versions`)
3. プライベートリポジトリの場合は、「+ アクセストークンを追加」をクリックして GitHub または GitLab の個人アクセストークンを入力
4. 「Wiki を生成」をクリックして、魔法が起こるのを見守りましょう!
## 🔍 仕組み
DeepWiki は AI を使用して:
1. GitHub、GitLab、または Bitbucket リポジトリをクローンして分析(トークン認証によるプライベートリポジトリを含む)
2. スマート検索のためのコードの埋め込みを作成
3. コンテキスト対応 AI でドキュメントを生成(Google Gemini、OpenAI、OpenRouter、またはローカル Ollama モデルを使用)
4. コードの関係を説明する視覚的な図を作成
5. すべてを構造化された Wiki に整理
6. 質問機能を通じてリポジトリとのインテリジェントな Q&A を可能に
7. 詳細調査機能で深い研究能力を提供
```mermaid
graph TD
A[ユーザーがGitHub/GitLab/Bitbucketリポジトリを入力] --> AA{プライベートリポジトリ?}
AA -->|はい| AB[アクセストークンを追加]
AA -->|いいえ| B[リポジトリをクローン]
AB --> B
B --> C[コード構造を分析]
C --> D[コード埋め込みを作成]
D --> M{モデルプロバイダーを選択}
M -->|Google Gemini| E1[Geminiで生成]
M -->|OpenAI| E2[OpenAIで生成]
M -->|OpenRouter| E3[OpenRouterで生成]
M -->|ローカルOllama| E4[Ollamaで生成]
E1 --> E[ドキュメントを生成]
E2 --> E
E3 --> E
E4 --> E
D --> F[視覚的な図を作成]
E --> G[Wikiとして整理]
F --> G
G --> H[インタラクティブなDeepWiki]
classDef process stroke-width:2px;
classDef data stroke-width:2px;
classDef result stroke-width:2px;
classDef decision stroke-width:2px;
class A,D data;
class AA,M decision;
class B,C,E,F,G,AB,E1,E2,E3,E4 process;
class H result;
```
## 🛠️ プロジェクト構造
```
deepwiki/
├── api/ # バックエンドAPIサーバー
│ ├── main.py # APIエントリーポイント
│ ├── api.py # FastAPI実装
│ ├── rag.py # 検索拡張生成
│ ├── data_pipeline.py # データ処理ユーティリティ
│ └── requirements.txt # Python依存関係
│
├── src/ # フロントエンドNext.jsアプリ
│ ├── app/ # Next.jsアプリディレクトリ
│ │ └── page.tsx # メインアプリケーションページ
│ └── components/ # Reactコンポーネント
│ └── Mermaid.tsx # Mermaid図レンダラー
│
├── public/ # 静的アセット
├── package.json # JavaScript依存関係
└── .env # 環境変数(作成する必要あり)
```
## 🛠️ 高度な設定
### 環境変数
| 変数 | 説明 | 必須 | 注意 |
| ----------------------------- | --------------------------------------------------------------- | ---- | ------------------------------------------------------------------------------------------------------------- |
| `GOOGLE_API_KEY` | AI 生成のための Google Gemini API キー | ◯ | |
| `OPENAI_API_KEY` | 埋め込みのための OpenAI API キー | ◯ | |
| `OPENROUTER_API_KEY` | 代替モデルのための OpenRouter API キー | ✗ | OpenRouter モデルを使用する場合にのみ必須です |
| `PORT` | API サーバーのポート(デフォルト:8001) | ✗ | API とフロントエンドを同じマシンでホストする場合、`NEXT_PUBLIC_SERVER_BASE_URL`のポートを適宜変更してください |
| `SERVER_BASE_URL` | API サーバーのベース URL(デフォルト:`http://localhost:8001`) | ✗ | |
### 設定ファイル
DeepWikiはシステムの様々な側面を管理するためにJSON設定ファイルを使用しています:
1. **`generator.json`**: テキスト生成モデルの設定
- 利用可能なモデルプロバイダー(Google、OpenAI、OpenRouter、Ollama)を定義
- 各プロバイダーのデフォルトおよび利用可能なモデルを指定
- temperatureやtop_pなどのモデル固有のパラメータを含む
2. **`embedder.json`**: 埋め込みモデルとテキスト処理の設定
- ベクトルストレージ用の埋め込みモデルを定義
- RAG用の検索設定を含む
- ドキュメントチャンク分割のためのテキスト分割設定を指定
3. **`repo.json`**: リポジトリ処理の設定
- 特定のファイルやディレクトリを除外するファイルフィルターを含む
- リポジトリサイズ制限と処理ルールを定義
デフォルトでは、これらのファイルは`api/config/`ディレクトリにあります。`DEEPWIKI_CONFIG_DIR`環境変数を使用して、その場所をカスタマイズできます。
### Docker セットアップ
Docker を使用して DeepWiki を実行できます:
```bash
# GitHub Container Registryからイメージをプル
docker pull ghcr.io/asyncfuncai/deepwiki-open:latest
# 環境変数を設定してコンテナを実行
docker run -p 8001:8001 -p 3000:3000 \
-e GOOGLE_API_KEY=your_google_api_key \
-e OPENAI_API_KEY=your_openai_api_key \
-e OPENROUTER_API_KEY=your_openrouter_api_key \
-v ~/.adalflow:/root/.adalflow \
ghcr.io/asyncfuncai/deepwiki-open:latest
```
このコマンドは、ホスト上の ~/.adalflow をコンテナ内の /root/.adalflow にマウントします。このパスは以下のものを保存するために使用されます:
- クローンされたリポジトリ (~/.adalflow/repos/)
- それらのエンベディングとインデックス (~/.adalflow/databases/)
- 生成された Wiki のキャッシュ (~/.adalflow/wikicache/)
これにより、コンテナが停止または削除されてもデータが永続化されます。
または、提供されている docker-compose.yml ファイルを使用します。
```bash
# まず.envファイルをAPIキーで編集
docker-compose up
```
(docker-compose.yml ファイルは、上記の docker run コマンドと同様に、データ永続化のために ~/.adalflow をマウントするように事前設定されています。)
#### Docker で.env ファイルを使用する
.env ファイルをコンテナにマウントすることもできます:
```bash
# APIキーを含む.envファイルを作成
echo "GOOGLE_API_KEY=your_google_api_key" > .env
echo "OPENAI_API_KEY=your_openai_api_key" >> .env
echo "OPENROUTER_API_KEY=your_openrouter_api_key" >> .env
# .envファイルをマウントしてコンテナを実行
docker run -p 8001:8001 -p 3000:3000 \
-v $(pwd)/.env:/app/.env \
-v ~/.adalflow:/root/.adalflow \
ghcr.io/asyncfuncai/deepwiki-open:latest
```
このコマンドは、ホスト上の ~/.adalflow をコンテナ内の /root/.adalflow にマウントします。このパスは以下のものを保存するために使用されます:
- クローンされたリポジトリ (~/.adalflow/repos/)
- それらのエンベディングとインデックス (~/.adalflow/databases/)
- 生成された Wiki のキャッシュ (~/.adalflow/wikicache/)
これにより、コンテナが停止または削除されてもデータが永続化されます。
#### Docker イメージをローカルでビルドする
Docker イメージをローカルでビルドしたい場合:
```bash
# リポジトリをクローン
git clone https://github.com/AsyncFuncAI/deepwiki-open.git
cd deepwiki-open
# Dockerイメージをビルド
docker build -t deepwiki-open .
# コンテナを実行
docker run -p 8001:8001 -p 3000:3000 \
-e GOOGLE_API_KEY=your_google_api_key \
-e OPENAI_API_KEY=your_openai_api_key \
-e OPENROUTER_API_KEY=your_openrouter_api_key \
deepwiki-open
```
# API サーバー詳細
API サーバーは以下を提供します:
- リポジトリのクローンとインデックス作成
- RAG(Retrieval Augmented Generation:検索拡張生成)
- ストリーミングチャット補完
詳細については、API README を参照してください。
## 🤖 プロバイダーベースのモデル選択システム
DeepWikiでは、複数のLLMプロバイダーをサポートする柔軟なプロバイダーベースのモデル選択システムを実装しています:
### サポートされているプロバイダーとモデル
- **Google**: デフォルトは `gemini-2.5-flash`、また `gemini-2.5-flash-lite`、`gemini-2.5-pro` などもサポート
- **OpenAI**: デフォルトは `gpt-5-nano`、また `gpt-5`、 `4o` などもサポート
- **OpenRouter**: Claude、Llama、Mistralなど、統一APIを通じて複数のモデルにアクセス
- **Ollama**: `llama3` などのローカルで実行するオープンソースモデルをサポート
### 環境変数
各プロバイダーには、対応するAPI鍵の環境変数が必要です:
```
# API鍵
GOOGLE_API_KEY=あなたのGoogle API鍵 # Google Geminiモデルに必要
OPENAI_API_KEY=あなたのOpenAI鍵 # OpenAIモデルに必要
OPENROUTER_API_KEY=あなたのOpenRouter鍵 # OpenRouterモデルに必要
# OpenAI APIベースURL設定
OPENAI_BASE_URL=https://カスタムAPIエンドポイント.com/v1 # オプション、カスタムOpenAI APIエンドポイント用
```
### サービスプロバイダー向けのカスタムモデル選択
カスタムモデル選択機能は、あなたの組織のユーザーに様々なAIモデルの選択肢を提供するために特別に設計されています:
- あなたは組織内のユーザーに様々なAIモデルの選択肢を提供できます
- あなたはコード変更なしで急速に進化するLLM環境に迅速に適応できます
- あなたは事前定義リストにない専門的またはファインチューニングされたモデルをサポートできます
サービスプロバイダーは、事前定義されたオプションから選択するか、フロントエンドインターフェースでカスタムモデル識別子を入力することで、モデル提供を実装できます。
### エンタープライズプライベートチャネル向けのベースURL設定
OpenAIクライアントのbase_url設定は、主にプライベートAPIチャネルを持つエンタープライズユーザー向けに設計されています。この機能は:
- プライベートまたは企業固有のAPIエンドポイントへの接続を可能に
- 組織が自己ホスト型または独自にデプロイされたLLMサービスを使用可能に
- サードパーティのOpenAI API互換サービスとの統合をサポート
**近日公開**: 将来のアップデートでは、ユーザーがリクエストで自分のAPI鍵を提供する必要があるモードをDeepWikiがサポートする予定です。これにより、プライベートチャネルを持つエンタープライズ顧客は、DeepWikiデプロイメントと認証情報を共有することなく、既存のAPI設定を使用できるようになります。
## 🔌 OpenRouter 連携
DeepWiki は、モデルプロバイダーとして OpenRouter をサポートするようになり、単一の API を通じて数百の AI モデルにアクセスできるようになりました。
- 複数のモデルオプション: OpenAI、Anthropic、Google、Meta、Mistralなど、統一APIを通じて複数のモデルにアクセス
- 簡単な設定: OpenRouter API キーを追加し、使用したいモデルを選択するだけ
- コスト効率: 予算とパフォーマンスのニーズに合ったモデルを選択
- 簡単な切り替え: コードを変更することなく、異なるモデル間を切り替え可能
### DeepWiki で OpenRouter を使用する方法
1. API キーを取得: OpenRouter でサインアップし、API キーを取得します
2. 環境に追加: .env ファイルに OPENROUTER_API_KEY=your_key を追加します
3. UI で有効化: ホームページの「OpenRouter API を使用」オプションをチェックします
4. モデルを選択: GPT-4o、Claude 3.5 Sonnet、Gemini 2.0 などの人気モデルから選択します
OpenRouter は特に以下のような場合に便利です:
- 複数のサービスにサインアップせずに異なるモデルを試したい
- お住まいの地域で制限されている可能性のあるモデルにアクセスしたい
- 異なるモデルプロバイダー間でパフォーマンスを比較したい
- ニーズに基づいてコストとパフォーマンスを最適化したい
## 🤖 質問と詳細調査機能
### 質問機能
質問機能を使用すると、検索拡張生成(RAG)を使用してリポジトリとチャットできます:
- **コンテキスト対応の回答**: リポジトリの実際のコードに基づいた正確な回答を取得
- **RAG 搭載**: システムは関連するコードスニペットを取得して根拠のある回答を提供
- **リアルタイムストリーミング**: よりインタラクティブな体験のために、生成されるレスポンスをリアルタイムで確認
- **会話履歴**: システムは質問間のコンテキストを維持し、より一貫性のあるインタラクションを実現
### 詳細調査機能
詳細調査は、複数ターンの研究プロセスでリポジトリ分析を次のレベルに引き上げます:
- **詳細な調査**: 複数の研究反復を通じて複雑なトピックを徹底的に探索
- **構造化されたプロセス**: 明確な研究計画、更新、包括的な結論を含む
- **自動継続**: AI は結論に達するまで自動的に研究を継続(最大 5 回の反復)
- **研究段階**:
1. **研究計画**: アプローチと初期調査結果の概要
2. **研究更新**: 新しい洞察を加えて前の反復を発展
3. **最終結論**: すべての反復に基づく包括的な回答を提供
詳細調査を使用するには、質問を送信する前に質問インターフェースの「詳細調査」スイッチをオンにするだけです。
## 📱 スクリーンショット

_DeepWiki のメインインターフェース_

_個人アクセストークンを使用したプライベートリポジトリへのアクセス_

_詳細調査は複雑なトピックに対して多段階の調査を実施_
### デモビデオ
[](https://youtu.be/zGANs8US8B4)
_DeepWiki の動作を見る!_
## ❓ トラブルシューティング
### API キーの問題
- **「環境変数が見つかりません」**: `.env`ファイルがプロジェクトのルートにあり、必要な API キーが含まれていることを確認
- **「API キーが無効です」**: キー全体が余分なスペースなしで正しくコピーされていることを確認
- **「OpenRouter API エラー」**: OpenRouter API キーが有効で、十分なクレジットがあることを確認
### 接続の問題
- **「API サーバーに接続できません」**: API サーバーがポート 8001 で実行されていることを確認
- **「CORS エラー」**: API はすべてのオリジンを許可するように設定されていますが、問題がある場合は、フロントエンドとバックエンドを同じマシンで実行してみてください
### 生成の問題
- **「Wiki の生成中にエラーが発生しました」**: 非常に大きなリポジトリの場合は、まず小さいものから試してみてください
- **「無効なリポジトリ形式」**: 有効な GitHub、GitLab、または Bitbucket URL の形式を使用していることを確認
- **「リポジトリ構造を取得できませんでした」**: プライベートリポジトリの場合、適切な権限を持つ有効な個人アクセストークンを入力したことを確認
- **「図のレンダリングエラー」**: アプリは自動的に壊れた図を修正しようとします
### 一般的な解決策
1. **両方のサーバーを再起動**: 単純な再起動でほとんどの問題が解決することがあります
2. **コンソールログを確認**: ブラウザの開発者ツールを開いて JavaScript エラーを確認
3. **API ログを確認**: API が実行されているターミナルで Python エラーを確認
## 🤝 貢献
貢献は歓迎します!以下のことを自由に行ってください:
- バグや機能リクエストの問題を開く
- コードを改善するためのプルリクエストを提出
- フィードバックやアイデアを共有
## 📄 ライセンス
このプロジェクトは MIT ライセンスの下でライセンスされています - 詳細は[LICENSE](LICENSE)ファイルを参照してください。
## ⭐ スター履歴
[](https://star-history.com/#AsyncFuncAI/deepwiki-open&Date)
================================================
FILE: README.kr.md
================================================
# DeepWiki-Open

**DeepWiki**는 제가 직접 구현한 프로젝트로, GitHub, GitLab 또는 BitBucket 저장소에 대해 아름답고 대화형 위키를 자동 생성합니다! 저장소 이름만 입력하면 DeepWiki가 다음을 수행합니다:
1. 코드 구조 분석
2. 포괄적인 문서 생성
3. 모든 작동 방식을 설명하는 시각적 다이어그램 생성
4. 이를 쉽게 탐색할 수 있는 위키로 정리
[](https://buymeacoffee.com/sheing)
[](https://x.com/sashimikun_void)
[](https://discord.com/invite/VQMBGR8u5v)
[English](./README.md) | [简体中文](./README.zh.md) | [繁體中文](./README.zh-tw.md) | [日本語](./README.ja.md) | [Español](./README.es.md) | [한국어](./README.kr.md) | [Tiếng Việt](./README.vi.md) | [Português Brasileiro](./README.pt-br.md) | [Français](./README.fr.md) | [Русский](./README.ru.md)
## ✨ 주요 기능
- **즉시 문서화**: 어떤 GitHub, GitLab 또는 BitBucket 저장소든 몇 초 만에 위키로 변환
- **비공개 저장소 지원**: 개인 액세스 토큰으로 비공개 저장소 안전하게 접근
- **스마트 분석**: AI 기반 코드 구조 및 관계 이해
- **아름다운 다이어그램**: 아키텍처와 데이터 흐름을 시각화하는 자동 Mermaid 다이어그램
- **쉬운 탐색**: 간단하고 직관적인 인터페이스로 위키 탐색 가능
- **Ask 기능**: RAG 기반 AI와 저장소에 대해 대화하며 정확한 답변 얻기
- **DeepResearch**: 복잡한 주제를 철저히 조사하는 다중 턴 연구 프로세스
- **다양한 모델 제공자 지원**: Google Gemini, OpenAI, OpenRouter, 로컬 Ollama 모델 지원
## 🚀 빠른 시작 (초간단!)
### 옵션 1: Docker 사용
```bash
# 저장소 클론
git clone https://github.com/AsyncFuncAI/deepwiki-open.git
cd deepwiki-open
# API 키를 포함한 .env 파일 생성
echo "GOOGLE_API_KEY=your_google_api_key" > .env
echo "OPENAI_API_KEY=your_openai_api_key" >> .env
# 선택 사항: OpenRouter 모델 사용 시 API 키 추가
echo "OPENROUTER_API_KEY=your_openrouter_api_key" >> .env
# Docker Compose로 실행
docker-compose up
```
> 💡 **API 키는 어디서 얻나요:**
> - [Google AI Studio](https://makersuite.google.com/app/apikey)에서 Google API 키 받기
> - [OpenAI 플랫폼](https://platform.openai.com/api-keys)에서 OpenAI API 키 받기
### 옵션 2: 수동 설정 (권장)
#### 1단계: API 키 설정
프로젝트 루트에 `.env` 파일을 만들고 다음 키들을 추가하세요:
```
GOOGLE_API_KEY=your_google_api_key
OPENAI_API_KEY=your_openai_api_key
# 선택 사항: OpenRouter 모델 사용 시 추가
OPENROUTER_API_KEY=your_openrouter_api_key
```
#### 2단계: 백엔드 시작
```bash
# Python 의존성 설치
python -m pip install poetry==2.0.1 && poetry install -C api
# API 서버 실행
python -m api.main
```
#### 3단계: 프론트엔드 시작
```bash
# JavaScript 의존성 설치
npm install
# 또는
yarn install
# 웹 앱 실행
npm run dev
# 또는
yarn dev
```
#### 4단계: DeepWiki 사용하기!
1. 브라우저에서 [http://localhost:3000](http://localhost:3000) 열기
2. GitHub, GitLab 또는 Bitbucket 저장소 입력 (예: `https://github.com/openai/codex`, `https://github.com/microsoft/autogen`, `https://gitlab.com/gitlab-org/gitlab`, `https://bitbucket.org/redradish/atlassian_app_versions`)
3. 비공개 저장소인 경우 "+ 액세스 토큰 추가" 클릭 후 GitHub 또는 GitLab 개인 액세스 토큰 입력
4. "Generate Wiki" 클릭 후 마법을 지켜보기!
## 🔍 작동 방식
DeepWiki는 AI를 사용하여 다음을 수행합니다:
1. GitHub, GitLab 또는 Bitbucket 저장소 복제 및 분석 (토큰 인증이 필요한 비공개 저장소 포함)
2. 스마트 검색을 위한 코드 임베딩 생성
3. 문맥 인지 AI로 문서 생성 (Google Gemini, OpenAI, OpenRouter 또는 로컬 Ollama 모델 사용)
4. 코드 관계를 설명하는 시각적 다이어그램 생성
5. 모든 것을 구조화된 위키로 정리
6. Ask 기능을 통한 저장소와의 지능형 Q&A 지원
7. DeepResearch로 심층 연구 기능 제공
```mermaid
graph TD
A[사용자가 GitHub/GitLab/Bitbucket 저장소 입력] --> AA{비공개 저장소인가?}
AA -->|예| AB[액세스 토큰 추가]
AA -->|아니오| B[저장소 복제]
AB --> B
B --> C[코드 구조 분석]
C --> D[코드 임베딩 생성]
D --> M{모델 제공자 선택}
M -->|Google Gemini| E1[Gemini로 생성]
M -->|OpenAI| E2[OpenAI로 생성]
M -->|OpenRouter| E3[OpenRouter로 생성]
M -->|로컬 Ollama| E4[Ollama로 생성]
E1 --> E[문서 생성]
E2 --> E
E3 --> E
E4 --> E
D --> F[시각적 다이어그램 생성]
E --> G[위키로 정리]
F --> G
G --> H[대화형 DeepWiki]
classDef process stroke-width:2px;
classDef data stroke-width:2px;
classDef result stroke-width:2px;
classDef decision stroke-width:2px;
class A,D data;
class AA,M decision;
class B,C,E,F,G,AB,E1,E2,E3,E4 process;
class H result;
```
## 🛠️ 프로젝트 구조
```
deepwiki/
├── api/ # 백엔드 API 서버
│ ├── main.py # API 진입점
│ ├── api.py # FastAPI 구현
│ ├── rag.py # Retrieval Augmented Generation
│ ├── data_pipeline.py # 데이터 처리 유틸리티
│ └── requirements.txt # Python 의존성
│
├── src/ # 프론트엔드 Next.js 앱
│ ├── app/ # Next.js 앱 디렉토리
│ │ └── page.tsx # 메인 애플리케이션 페이지
│ └── components/ # React 컴포넌트
│ └── Mermaid.tsx # Mermaid 다이어그램 렌더러
│
├── public/ # 정적 자산
├── package.json # JavaScript 의존성
└── .env # 환경 변수 (직접 생성)
```
## 🛠️ 고급 설정
### 환경 변수
| 변수명 | 설명 | 필수 | 비고 |
|----------|-------------|----------|------|
| `GOOGLE_API_KEY` | AI 생성용 Google Gemini API 키 | 예 |
| `OPENAI_API_KEY` | 임베딩용 OpenAI API 키 | 예 |
| `OPENROUTER_API_KEY` | 대체 모델용 OpenRouter API 키 | 아니오 | OpenRouter 모델 사용 시 필요 |
| `PORT` | API 서버 포트 (기본값: 8001) | 아니오 | API와 프론트엔드를 같은 머신에서 호스팅 시 `SERVER_BASE_URL`의 포트도 변경 필요 |
| `SERVER_BASE_URL` | API 서버 기본 URL (기본값: http://localhost:8001) | 아니오 |
### 설정 파일
DeepWiki는 시스템의 다양한 측면을 관리하기 위해 JSON 설정 파일을 사용합니다:
1. **`generator.json`**: 텍스트 생성 모델 설정
- 사용 가능한 모델 제공자(Google, OpenAI, OpenRouter, Ollama) 정의
- 각 제공자의 기본 및 사용 가능한 모델 지정
- temperature와 top_p 같은 모델별 매개변수 포함
2. **`embedder.json`**: 임베딩 모델 및 텍스트 처리 설정
- 벡터 저장소용 임베딩 모델 정의
- RAG를 위한 검색기 설정 포함
- 문서 청킹을 위한 텍스트 분할기 설정 지정
3. **`repo.json`**: 저장소 처리 설정
- 특정 파일 및 디렉토리를 제외하는 파일 필터 포함
- 저장소 크기 제한 및 처리 규칙 정의
기본적으로 이러한 파일은 `api/config/` 디렉토리에 위치합니다. `DEEPWIKI_CONFIG_DIR` 환경 변수를 사용하여 위치를 사용자 정의할 수 있습니다.
### Docker 설정
Docker를 사용하여 DeepWiki를 실행할 수 있습니다:
```bash
# GitHub 컨테이너 레지스트리에서 이미지 가져오기
docker pull ghcr.io/asyncfuncai/deepwiki-open:latest
# 환경 변수와 함께 컨테이너 실행
docker run -p 8001:8001 -p 3000:3000 \
-e GOOGLE_API_KEY=your_google_api_key \
-e OPENAI_API_KEY=your_openai_api_key \
-e OPENROUTER_API_KEY=your_openrouter_api_key \
-v ~/.adalflow:/root/.adalflow \
ghcr.io/asyncfuncai/deepwiki-open:latest
```
이 명령어는 또한 호스트의 `~/.adalflow`를 컨테이너의 `/root/.adalflow`에 마운트합니다. 이 경로는 다음을 저장하는 데 사용됩니다:
- 복제된 저장소 (`~/.adalflow/repos/`)
- 해당 저장소의 임베딩 및 인덱스 (`~/.adalflow/databases/`)
- 생성된 위키의 캐시 (`~/.adalflow/wikicache/`)
이를 통해 컨테이너가 중지되거나 제거되어도 데이터가 유지됩니다.
또는 제공된 `docker-compose.yml` 파일을 사용하세요:
```bash
# API 키가 포함된 .env 파일을 먼저 편집
docker-compose up
```
(`docker-compose.yml` 파일은 위의 `docker run` 명령어와 유사하게 데이터 지속성을 위해 `~/.adalflow`를 마운트하도록 미리 구성되어 있습니다.)
#### Docker에서 .env 파일 사용하기
.env 파일을 컨테이너에 마운트할 수도 있습니다:
```bash
# API 키가 포함된 .env 파일 생성
echo "GOOGLE_API_KEY=your_google_api_key" > .env
echo "OPENAI_API_KEY=your_openai_api_key" >> .env
echo "OPENROUTER_API_KEY=your_openrouter_api_key" >> .env
# .env 파일을 마운트하여 컨테이너 실행
docker run -p 8001:8001 -p 3000:3000 \
-v $(pwd)/.env:/app/.env \
-v ~/.adalflow:/root/.adalflow \
ghcr.io/asyncfuncai/deepwiki-open:latest
```
이 명령어는 또한 호스트의 `~/.adalflow`를 컨테이너의 `/root/.adalflow`에 마운트합니다. 이 경로는 다음을 저장하는 데 사용됩니다:
- 복제된 저장소 (`~/.adalflow/repos/`)
- 해당 저장소의 임베딩 및 인덱스 (`~/.adalflow/databases/`)
- 생성된 위키의 캐시 (`~/.adalflow/wikicache/`)
이를 통해 컨테이너가 중지되거나 제거되어도 데이터가 유지됩니다.
#### 로컬에서 Docker 이미지 빌드하기
로컬에서 Docker 이미지를 빌드하려면:
```bash
# 저장소 클론
git clone https://github.com/AsyncFuncAI/deepwiki-open.git
cd deepwiki-open
# Docker 이미지 빌드
docker build -t deepwiki-open .
# 컨테이너 실행
docker run -p 8001:8001 -p 3000:3000 \
-e GOOGLE_API_KEY=your_google_api_key \
-e OPENAI_API_KEY=your_openai_api_key \
-e OPENROUTER_API_KEY=your_openrouter_api_key \
deepwiki-open
```
### API 서버 상세 정보
API 서버는 다음을 제공합니다:
- 저장소 복제 및 인덱싱
- RAG (Retrieval Augmented Generation)
- 스트리밍 채팅 완성
자세한 내용은 [API README](./api/README.md)를 참조하세요.
## 🤖 제공자 기반 모델 선택 시스템
DeepWiki는 이제 여러 LLM 제공자를 지원하는 유연한 제공자 기반 모델 선택 시스템을 구현했습니다:
### 지원되는 제공자 및 모델
- **Google**: 기본값 `gemini-2.5-flash`, 또한 `gemini-2.5-flash-lite`, `gemini-2.5-pro` 등도 지원
- **OpenAI**: 기본값 `gpt-5-nano`, 또한 `gpt-5`, `4o` 등도 지원
- **OpenRouter**: Claude, Llama, Mistral 등 통합 API를 통해 다양한 모델 접근 가능
- **Ollama**: `llama3`와 같은 로컬에서 실행되는 오픈소스 모델 지원
### 환경 변수
각 제공자는 해당 API 키 환경 변수가 필요합니다:
```
# API 키
GOOGLE_API_KEY=귀하의_구글_API_키 # Google Gemini 모델에 필요
OPENAI_API_KEY=귀하의_OpenAI_키 # OpenAI 모델에 필요
OPENROUTER_API_KEY=귀하의_OpenRouter_키 # OpenRouter 모델에 필요
# OpenAI API 기본 URL 구성
OPENAI_BASE_URL=https://사용자정의_API_엔드포인트.com/v1 # 선택 사항, 사용자 정의 OpenAI API 엔드포인트용
```
### 서비스 제공자를 위한 사용자 정의 모델 선택
사용자 정의 모델 선택 기능은 다음이 필요한 서비스 제공자를 위해 특별히 설계되었습니다:
- 귀하는 조직 내 사용자에게 다양한 AI 모델 선택 옵션을 제공할 수 있습니다
- 귀하는 코드 변경 없이 빠르게 진화하는 LLM 환경에 신속하게 적응할 수 있습니다
- 귀하는 사전 정의된 목록에 없는 특수하거나 미세 조정된 모델을 지원할 수 있습니다
서비스 제공자는 사전 정의된 옵션에서 선택하거나 프론트엔드 인터페이스에서 사용자 정의 모델 식별자를 입력하여 모델 제공을 구현할 수 있습니다.
### 기업 전용 채널을 위한 기본 URL 구성
OpenAI 클라이언트의 base_url 구성은 주로 비공개 API 채널이 있는 기업 사용자를 위해 설계되었습니다. 이 기능은:
- 비공개 또는 기업 전용 API 엔드포인트 연결 가능
- 조직이 자체 호스팅되거나 사용자 정의 배포된 LLM 서비스 사용 가능
- 서드파티 OpenAI API 호환 서비스와의 통합 지원
**출시 예정**: 향후 업데이트에서 DeepWiki는 사용자가 요청에서 자신의 API 키를 제공해야 하는 모드를 지원할 예정입니다. 이를 통해 비공개 채널이 있는 기업 고객은 DeepWiki 배포와 자격 증명을 공유하지 않고도 기존 API 구성을 사용할 수 있습니다.
## 🔌 OpenRouter 통합
DeepWiki는 이제 [OpenRouter](https://openrouter.ai/)를 모델 제공자로 지원하여, 단일 API를 통해 수백 개의 AI 모델에 접근할 수 있습니다:
- **다양한 모델 옵션**: OpenAI, Anthropic, Google, Meta, Mistral 등 다양한 모델 이용 가능
- **간편한 설정**: OpenRouter API 키만 추가하고 원하는 모델 선택
- **비용 효율성**: 예산과 성능에 맞는 모델 선택 가능
- **손쉬운 전환**: 코드 변경 없이 다양한 모델 간 전환 가능
### DeepWiki에서 OpenRouter 사용법
1. **API 키 받기**: [OpenRouter](https://openrouter.ai/) 가입 후 API 키 획득
2. **환경 변수 추가**: `.env` 파일에 `OPENROUTER_API_KEY=your_key` 추가
3. **UI에서 활성화**: 홈페이지에서 "Use OpenRouter API" 옵션 체크
4. **모델 선택**: GPT-4o, Claude 3.5 Sonnet, Gemini 2.0 등 인기 모델 선택
OpenRouter는 특히 다음과 같은 경우 유용합니다:
- 여러 서비스에 가입하지 않고 다양한 모델 시도
- 지역 제한이 있는 모델 접근
- 모델 제공자별 성능 비교
- 비용과 성능 최적화
## 🤖 Ask 및 DeepResearch 기능
### Ask 기능
Ask 기능은 Retrieval Augmented Generation (RAG)을 사용해 저장소와 대화할 수 있습니다:
- **문맥 인지 답변**: 저장소 내 실제 코드 기반으로 정확한 답변 제공
- **RAG 기반**: 관련 코드 조각을 검색해 근거 있는 답변 생성
- **실시간 스트리밍**: 답변 생성 과정을 실시간으로 확인 가능
- **대화 기록 유지**: 질문 간 문맥을 유지해 더 일관된 대화 가능
### DeepResearch 기능
DeepResearch는 다중 턴 연구 프로세스를 통해 저장소 분석을 한층 심화합니다:
- **심층 조사**: 여러 연구 반복을 통해 복잡한 주제 철저히 탐구
- **구조화된 프로세스**: 연구 계획, 업데이트, 최종 결론 단계로 진행
- **자동 연속 진행**: AI가 최대 5회 반복해 연구를 계속 진행
- **연구 단계**:
1. **연구 계획**: 접근법과 초기 발견 사항 개요 작성
2. **연구 업데이트**: 이전 반복 내용을 바탕으로 새로운 통찰 추가
3. **최종 결론**: 모든 반복을 종합한 포괄적 답변 제공
DeepResearch를 사용하려면 질문 제출 전 Ask 인터페이스에서 "Deep Research" 스위치를 켜세요.
## 📱 스크린샷

*DeepWiki의 메인 인터페이스*

*개인 액세스 토큰으로 비공개 저장소 접근*

*DeepResearch는 복잡한 주제에 대해 다중 턴 조사를 수행*
### 데모 영상
[](https://youtu.be/zGANs8US8B4)
*DeepWiki 작동 영상 보기!*
## ❓ 문제 해결
### API 키 문제
- **"환경 변수 누락"**: `.env` 파일이 프로젝트 루트에 있고 필요한 API 키가 포함되어 있는지 확인
- **"API 키가 유효하지 않음"**: 키를 정확히 복사했는지, 공백이 없는지 확인
- **"OpenRouter API 오류"**: OpenRouter API 키가 유효하고 충분한 크레딧이 있는지 확인
### 연결 문제
- **"API 서버에 연결할 수 없음"**: API 서버가 포트 8001에서 실행 중인지 확인
- **"CORS 오류"**: API가 모든 출처를 허용하도록 설정되어 있지만 문제가 있으면 프론트엔드와 백엔드를 같은 머신에서 실행해 보세요
### 생성 문제
- **"위키 생성 오류"**: 아주 큰 저장소는 먼저 작은 저장소로 시도해 보세요
- **"잘못된 저장소 형식"**: 유효한 GitHub, GitLab 또는 Bitbucket URL 형식인지 확인
- **"저장소 구조를 가져올 수 없음"**: 비공개 저장소라면 적절한 권한의 개인 액세스 토큰을 입력했는지 확인
- **"다이어그램 렌더링 오류"**: 앱이 자동으로 다이어그램 오류를 수정하려 시도합니다
### 일반적인 해결법
1. **서버 둘 다 재시작**: 간단한 재시작으로 대부분 문제 해결
2. **콘솔 로그 확인**: 브라우저 개발자 도구에서 자바스크립트 오류 확인
3. **API 로그 확인**: API 실행 터미널에서 Python 오류 확인
## 🤝 기여
기여를 환영합니다! 다음을 자유롭게 해주세요:
- 버그나 기능 요청을 위한 이슈 열기
- 코드 개선을 위한 풀 리퀘스트 제출
- 피드백과 아이디어 공유
## 📄 라이선스
이 프로젝트는 MIT 라이선스 하에 있습니다 - 자세한 내용은 [LICENSE](LICENSE) 파일 참고.
## ⭐ 스타 히스토리
[](https://star-history.com/#AsyncFuncAI/deepwiki-open&Date)
================================================
FILE: README.md
================================================
### ⚠️ Announcement: Shifting focus to AsyncReview
---
**IMPORTANT UPDATE** DeepWiki-Open maintenance is ongoing, but primary active development is moving to **[AsyncReview](https://github.com/AsyncFuncAI/AsyncReview/)**. Thank you for the support on this project; please join me in the new repository for this year's primary effort.
---
---
# DeepWiki-Open

**DeepWiki** is my own implementation attempt of DeepWiki, automatically creates beautiful, interactive wikis for any GitHub, GitLab, or BitBucket repository! Just enter a repo name, and DeepWiki will:
1. Analyze the code structure
2. Generate comprehensive documentation
3. Create visual diagrams to explain how everything works
4. Organize it all into an easy-to-navigate wiki
[](https://buymeacoffee.com/sheing)
[](https://tip.md/sng-asyncfunc)
[](https://x.com/sashimikun_void)
[](https://discord.com/invite/VQMBGR8u5v)
[English](./README.md) | [简体中文](./README.zh.md) | [繁體中文](./README.zh-tw.md) | [日本語](./README.ja.md) | [Español](./README.es.md) | [한국어](./README.kr.md) | [Tiếng Việt](./README.vi.md) | [Português Brasileiro](./README.pt-br.md) | [Français](./README.fr.md) | [Русский](./README.ru.md)
## ✨ Features
- **Instant Documentation**: Turn any GitHub, GitLab or BitBucket repo into a wiki in seconds
- **Private Repository Support**: Securely access private repositories with personal access tokens
- **Smart Analysis**: AI-powered understanding of code structure and relationships
- **Beautiful Diagrams**: Automatic Mermaid diagrams to visualize architecture and data flow
- **Easy Navigation**: Simple, intuitive interface to explore the wiki
- **Ask Feature**: Chat with your repository using RAG-powered AI to get accurate answers
- **DeepResearch**: Multi-turn research process that thoroughly investigates complex topics
- **Multiple Model Providers**: Support for Google Gemini, OpenAI, OpenRouter, and local Ollama models
- **Flexible Embeddings**: Choose between OpenAI, Google AI, or local Ollama embeddings for optimal performance
## 🚀 Quick Start (Super Easy!)
### Option 1: Using Docker
```bash
# Clone the repository
git clone https://github.com/AsyncFuncAI/deepwiki-open.git
cd deepwiki-open
# Create a .env file with your API keys
echo "GOOGLE_API_KEY=your_google_api_key" > .env
echo "OPENAI_API_KEY=your_openai_api_key" >> .env
# Optional: Use Google AI embeddings instead of OpenAI (recommended if using Google models)
echo "DEEPWIKI_EMBEDDER_TYPE=google" >> .env
# Optional: Add OpenRouter API key if you want to use OpenRouter models
echo "OPENROUTER_API_KEY=your_openrouter_api_key" >> .env
# Optional: Add Ollama host if not local. defaults to http://localhost:11434
echo "OLLAMA_HOST=your_ollama_host" >> .env
# Optional: Add Azure API key, endpoint and version if you want to use azure openai models
echo "AZURE_OPENAI_API_KEY=your_azure_openai_api_key" >> .env
echo "AZURE_OPENAI_ENDPOINT=your_azure_openai_endpoint" >> .env
echo "AZURE_OPENAI_VERSION=your_azure_openai_version" >> .env
# Run with Docker Compose
docker-compose up
```
For detailed instructions on using DeepWiki with Ollama and Docker, see [Ollama Instructions](Ollama-instruction.md).
> 💡 **Where to get these keys:**
> - Get a Google API key from [Google AI Studio](https://makersuite.google.com/app/apikey)
> - Get an OpenAI API key from [OpenAI Platform](https://platform.openai.com/api-keys)
> - Get Azure OpenAI credentials from [Azure Portal](https://portal.azure.com/) - create an Azure OpenAI resource and get the API key, endpoint, and API version
### Option 2: Manual Setup (Recommended)
#### Step 1: Set Up Your API Keys
Create a `.env` file in the project root with these keys:
```
GOOGLE_API_KEY=your_google_api_key
OPENAI_API_KEY=your_openai_api_key
# Optional: Use Google AI embeddings (recommended if using Google models)
DEEPWIKI_EMBEDDER_TYPE=google
# Optional: Add this if you want to use OpenRouter models
OPENROUTER_API_KEY=your_openrouter_api_key
# Optional: Add this if you want to use Azure OpenAI models
AZURE_OPENAI_API_KEY=your_azure_openai_api_key
AZURE_OPENAI_ENDPOINT=your_azure_openai_endpoint
AZURE_OPENAI_VERSION=your_azure_openai_version
# Optional: Add Ollama host if not local. default: http://localhost:11434
OLLAMA_HOST=your_ollama_host
```
#### Step 2: Start the Backend
```bash
# Install Python dependencies
python -m pip install poetry==2.0.1 && poetry install -C api
# Start the API server
python -m api.main
```
#### Step 3: Start the Frontend
```bash
# Install JavaScript dependencies
npm install
# or
yarn install
# Start the web app
npm run dev
# or
yarn dev
```
#### Step 4: Use DeepWiki!
1. Open [http://localhost:3000](http://localhost:3000) in your browser
2. Enter a GitHub, GitLab, or Bitbucket repository (like `https://github.com/openai/codex`, `https://github.com/microsoft/autogen`, `https://gitlab.com/gitlab-org/gitlab`, or `https://bitbucket.org/redradish/atlassian_app_versions`)
3. For private repositories, click "+ Add access tokens" and enter your GitHub or GitLab personal access token
4. Click "Generate Wiki" and watch the magic happen!
## 🔍 How It Works
DeepWiki uses AI to:
1. Clone and analyze the GitHub, GitLab, or Bitbucket repository (including private repos with token authentication)
2. Create embeddings of the code for smart retrieval
3. Generate documentation with context-aware AI (using Google Gemini, OpenAI, OpenRouter, Azure OpenAI, or local Ollama models)
4. Create visual diagrams to explain code relationships
5. Organize everything into a structured wiki
6. Enable intelligent Q&A with the repository through the Ask feature
7. Provide in-depth research capabilities with DeepResearch
```mermaid
graph TD
A[User inputs GitHub/GitLab/Bitbucket repo] --> AA{Private repo?}
AA -->|Yes| AB[Add access token]
AA -->|No| B[Clone Repository]
AB --> B
B --> C[Analyze Code Structure]
C --> D[Create Code Embeddings]
D --> M{Select Model Provider}
M -->|Google Gemini| E1[Generate with Gemini]
M -->|OpenAI| E2[Generate with OpenAI]
M -->|OpenRouter| E3[Generate with OpenRouter]
M -->|Local Ollama| E4[Generate with Ollama]
M -->|Azure| E5[Generate with Azure]
E1 --> E[Generate Documentation]
E2 --> E
E3 --> E
E4 --> E
E5 --> E
D --> F[Create Visual Diagrams]
E --> G[Organize as Wiki]
F --> G
G --> H[Interactive DeepWiki]
classDef process stroke-width:2px;
classDef data stroke-width:2px;
classDef result stroke-width:2px;
classDef decision stroke-width:2px;
class A,D data;
class AA,M decision;
class B,C,E,F,G,AB,E1,E2,E3,E4,E5 process;
class H result;
```
## 🛠️ Project Structure
```
deepwiki/
├── api/ # Backend API server
│ ├── main.py # API entry point
│ ├── api.py # FastAPI implementation
│ ├── rag.py # Retrieval Augmented Generation
│ ├── data_pipeline.py # Data processing utilities
│ ├── pyproject.toml # Python dependencies (Poetry)
│ └── poetry.lock # Locked Python dependency versions
│
├── src/ # Frontend Next.js app
│ ├── app/ # Next.js app directory
│ │ └── page.tsx # Main application page
│ └── components/ # React components
│ └── Mermaid.tsx # Mermaid diagram renderer
│
├── public/ # Static assets
├── package.json # JavaScript dependencies
└── .env # Environment variables (create this)
```
## 🤖 Provider-Based Model Selection System
DeepWiki now implements a flexible provider-based model selection system supporting multiple LLM providers:
### Supported Providers and Models
- **Google**: Default `gemini-2.5-flash`, also supports `gemini-2.5-flash-lite`, `gemini-2.5-pro`, etc.
- **OpenAI**: Default `gpt-5-nano`, also supports `gpt-5`, `4o`, etc.
- **OpenRouter**: Access to multiple models via a unified API, including Claude, Llama, Mistral, etc.
- **Azure OpenAI**: Default `gpt-4o`, also supports `o4-mini`, etc.
- **Ollama**: Support for locally running open-source models like `llama3`
### Environment Variables
Each provider requires its corresponding API key environment variables:
```
# API Keys
GOOGLE_API_KEY=your_google_api_key # Required for Google Gemini models
OPENAI_API_KEY=your_openai_api_key # Required for OpenAI models
OPENROUTER_API_KEY=your_openrouter_api_key # Required for OpenRouter models
AZURE_OPENAI_API_KEY=your_azure_openai_api_key #Required for Azure OpenAI models
AZURE_OPENAI_ENDPOINT=your_azure_openai_endpoint #Required for Azure OpenAI models
AZURE_OPENAI_VERSION=your_azure_openai_version #Required for Azure OpenAI models
# OpenAI API Base URL Configuration
OPENAI_BASE_URL=https://custom-api-endpoint.com/v1 # Optional, for custom OpenAI API endpoints
# Ollama host
OLLAMA_HOST=your_ollama_host # Optional, if Ollama is not local. default: http://localhost:11434
# Configuration Directory
DEEPWIKI_CONFIG_DIR=/path/to/custom/config/dir # Optional, for custom config file location
```
### Configuration Files
DeepWiki uses JSON configuration files to manage various aspects of the system:
1. **`generator.json`**: Configuration for text generation models
- Defines available model providers (Google, OpenAI, OpenRouter, Azure, Ollama)
- Specifies default and available models for each provider
- Contains model-specific parameters like temperature and top_p
2. **`embedder.json`**: Configuration for embedding models and text processing
- Defines embedding models for vector storage
- Contains retriever configuration for RAG
- Specifies text splitter settings for document chunking
3. **`repo.json`**: Configuration for repository handling
- Contains file filters to exclude certain files and directories
- Defines repository size limits and processing rules
By default, these files are located in the `api/config/` directory. You can customize their location using the `DEEPWIKI_CONFIG_DIR` environment variable.
### Custom Model Selection for Service Providers
The custom model selection feature is specifically designed for service providers who need to:
- You can offer multiple AI model choices to users within your organization
- You can quickly adapt to the rapidly evolving LLM landscape without code changes
- You can support specialized or fine-tuned models that aren't in the predefined list
Service providers can implement their model offerings by selecting from the predefined options or entering custom model identifiers in the frontend interface.
### Base URL Configuration for Enterprise Private Channels
The OpenAI Client's base_url configuration is designed primarily for enterprise users with private API channels. This feature:
- Enables connection to private or enterprise-specific API endpoints
- Allows organizations to use their own self-hosted or custom-deployed LLM services
- Supports integration with third-party OpenAI API-compatible services
**Coming Soon**: In future updates, DeepWiki will support a mode where users need to provide their own API keys in requests. This will allow enterprise customers with private channels to use their existing API arrangements without sharing credentials with the DeepWiki deployment.
## 🧩 Using OpenAI-Compatible Embedding Models (e.g., Alibaba Qwen)
If you want to use embedding models compatible with the OpenAI API (such as Alibaba Qwen), follow these steps:
1. Replace the contents of `api/config/embedder.json` with those from `api/config/embedder_openai_compatible.json`.
2. In your project root `.env` file, set the relevant environment variables, for example:
```
OPENAI_API_KEY=your_api_key
OPENAI_BASE_URL=your_openai_compatible_endpoint
```
3. The program will automatically substitute placeholders in embedder.json with the values from your environment variables.
This allows you to seamlessly switch to any OpenAI-compatible embedding service without code changes.
## 🧠 Using Google AI Embeddings
DeepWiki now supports Google AI's latest embedding models as an alternative to OpenAI embeddings. This provides better integration when you're already using Google Gemini models for text generation.
### Features
- **Latest Model**: Uses Google's `text-embedding-004` model
- **Same API Key**: Uses your existing `GOOGLE_API_KEY` (no additional setup required)
- **Better Integration**: Optimized for use with Google Gemini text generation models
- **Task-Specific**: Supports semantic similarity, retrieval, and classification tasks
- **Batch Processing**: Efficient processing of multiple texts
### How to Enable Google AI Embeddings
**Option 1: Environment Variable (Recommended)**
Set the embedder type in your `.env` file:
```bash
# Your existing Google API key
GOOGLE_API_KEY=your_google_api_key
# Enable Google AI embeddings
DEEPWIKI_EMBEDDER_TYPE=google
```
**Option 2: Docker Environment**
```bash
docker run -p 8001:8001 -p 3000:3000 \
-e GOOGLE_API_KEY=your_google_api_key \
-e DEEPWIKI_EMBEDDER_TYPE=google \
-v ~/.adalflow:/root/.adalflow \
ghcr.io/asyncfuncai/deepwiki-open:latest
```
**Option 3: Docker Compose**
Add to your `.env` file:
```bash
GOOGLE_API_KEY=your_google_api_key
DEEPWIKI_EMBEDDER_TYPE=google
```
Then run:
```bash
docker-compose up
```
### Available Embedder Types
| Type | Description | API Key Required | Notes |
|------|-------------|------------------|-------|
| `openai` | OpenAI embeddings (default) | `OPENAI_API_KEY` | Uses `text-embedding-3-small` model |
| `google` | Google AI embeddings | `GOOGLE_API_KEY` | Uses `text-embedding-004` model |
| `ollama` | Local Ollama embeddings | None | Requires local Ollama installation |
### Why Use Google AI Embeddings?
- **Consistency**: If you're using Google Gemini for text generation, using Google embeddings provides better semantic consistency
- **Performance**: Google's latest embedding model offers excellent performance for retrieval tasks
- **Cost**: Competitive pricing compared to OpenAI
- **No Additional Setup**: Uses the same API key as your text generation models
### Switching Between Embedders
You can easily switch between different embedding providers:
```bash
# Use OpenAI embeddings (default)
export DEEPWIKI_EMBEDDER_TYPE=openai
# Use Google AI embeddings
export DEEPWIKI_EMBEDDER_TYPE=google
# Use local Ollama embeddings
export DEEPWIKI_EMBEDDER_TYPE=ollama
```
**Note**: When switching embedders, you may need to regenerate your repository embeddings as different models produce different vector spaces.
### Logging
DeepWiki uses Python's built-in `logging` module for diagnostic output. You can configure the verbosity and log file destination via environment variables:
| Variable | Description | Default |
|-----------------|--------------------------------------------------------------------|------------------------------|
| `LOG_LEVEL` | Logging level (DEBUG, INFO, WARNING, ERROR, CRITICAL). | INFO |
| `LOG_FILE_PATH` | Path to the log file. If set, logs will be written to this file. | `api/logs/application.log` |
To enable debug logging and direct logs to a custom file:
```bash
export LOG_LEVEL=DEBUG
export LOG_FILE_PATH=./debug.log
python -m api.main
```
Or with Docker Compose:
```bash
LOG_LEVEL=DEBUG LOG_FILE_PATH=./debug.log docker-compose up
```
When running with Docker Compose, the container's `api/logs` directory is bind-mounted to `./api/logs` on your host (see the `volumes` section in `docker-compose.yml`), ensuring log files persist across restarts.
Alternatively, you can store these settings in your `.env` file:
```bash
LOG_LEVEL=DEBUG
LOG_FILE_PATH=./debug.log
```
Then simply run:
```bash
docker-compose up
```
**Logging Path Security Considerations:** In production environments, ensure the `api/logs` directory and any custom log file path are secured with appropriate filesystem permissions and access controls. The application enforces that `LOG_FILE_PATH` resides within the project's `api/logs` directory to prevent path traversal or unauthorized writes.
## 🛠️ Advanced Setup
### Environment Variables
| Variable | Description | Required | Note |
|----------------------|--------------------------------------------------------------|----------|----------------------------------------------------------------------------------------------------------|
| `GOOGLE_API_KEY` | Google Gemini API key for AI generation and embeddings | No | Required for Google Gemini models and Google AI embeddings
| `OPENAI_API_KEY` | OpenAI API key for embeddings and models | Conditional | Required if using OpenAI embeddings or models |
| `OPENROUTER_API_KEY` | OpenRouter API key for alternative models | No | Required only if you want to use OpenRouter models |
| `AWS_ACCESS_KEY_ID` | AWS access key ID for Bedrock | No | Required for Bedrock if not using instance/role-based credentials |
| `AWS_SECRET_ACCESS_KEY` | AWS secret access key for Bedrock | No | Required for Bedrock if not using instance/role-based credentials |
| `AWS_SESSION_TOKEN` | AWS session token for Bedrock (STS) | No | Required when using temporary credentials |
| `AWS_REGION` | AWS region for Bedrock (default: `us-east-1`) | No | Used by Bedrock client |
| `AWS_ROLE_ARN` | AWS role ARN to assume for Bedrock | No | If set, the Bedrock client will call STS AssumeRole |
| `AZURE_OPENAI_API_KEY` | Azure OpenAI API key | No | Required only if you want to use Azure OpenAI models |
| `AZURE_OPENAI_ENDPOINT` | Azure OpenAI endpoint | No | Required only if you want to use Azure OpenAI models |
| `AZURE_OPENAI_VERSION` | Azure OpenAI version | No | Required only if you want to use Azure OpenAI models |
| `OLLAMA_HOST` | Ollama Host (default: http://localhost:11434) | No | Required only if you want to use external Ollama server |
| `DEEPWIKI_EMBEDDER_TYPE` | Embedder type: `openai`, `google`, `ollama`, or `bedrock` (default: `openai`) | No | Controls which embedding provider to use |
| `PORT` | Port for the API server (default: 8001) | No | If you host API and frontend on the same machine, make sure change port of `SERVER_BASE_URL` accordingly |
| `SERVER_BASE_URL` | Base URL for the API server (default: http://localhost:8001) | No |
| `DEEPWIKI_AUTH_MODE` | Set to `true` or `1` to enable authorization mode. | No | Defaults to `false`. If enabled, `DEEPWIKI_AUTH_CODE` is required. |
| `DEEPWIKI_AUTH_CODE` | The secret code required for wiki generation when `DEEPWIKI_AUTH_MODE` is enabled. | No | Only used if `DEEPWIKI_AUTH_MODE` is `true` or `1`. |
**API Key Requirements:**
- If using `DEEPWIKI_EMBEDDER_TYPE=openai` (default): `OPENAI_API_KEY` is required
- If using `DEEPWIKI_EMBEDDER_TYPE=google`: `GOOGLE_API_KEY` is required
- If using `DEEPWIKI_EMBEDDER_TYPE=ollama`: No API key required (local processing)
- If using `DEEPWIKI_EMBEDDER_TYPE=bedrock`: AWS credentials (or role-based credentials) are required
Other API keys are only required when configuring and using models from the corresponding providers.
## Authorization Mode
DeepWiki can be configured to run in an authorization mode, where wiki generation requires a valid authorization code. This is useful if you want to control who can use the generation feature.
Restricts frontend initiation and protects cache deletion, but doesn't fully prevent backend generation if API endpoints are hit directly.
To enable authorization mode, set the following environment variables:
- `DEEPWIKI_AUTH_MODE`: Set this to `true` or `1`. When enabled, the frontend will display an input field for the authorization code.
- `DEEPWIKI_AUTH_CODE`: Set this to the desired secret code. Restricts frontend initiation and protects cache deletion, but doesn't fully prevent backend generation if API endpoints are hit directly.
If `DEEPWIKI_AUTH_MODE` is not set or is set to `false` (or any other value than `true`/`1`), the authorization feature will be disabled, and no code will be required.
### Docker Setup
You can use Docker to run DeepWiki:
#### Running the Container
```bash
# Pull the image from GitHub Container Registry
docker pull ghcr.io/asyncfuncai/deepwiki-open:latest
# Run the container with environment variables
docker run -p 8001:8001 -p 3000:3000 \
-e GOOGLE_API_KEY=your_google_api_key \
-e OPENAI_API_KEY=your_openai_api_key \
-e OPENROUTER_API_KEY=your_openrouter_api_key \
-e OLLAMA_HOST=your_ollama_host \
-e AZURE_OPENAI_API_KEY=your_azure_openai_api_key \
-e AZURE_OPENAI_ENDPOINT=your_azure_openai_endpoint \
-e AZURE_OPENAI_VERSION=your_azure_openai_version \
-v ~/.adalflow:/root/.adalflow \
ghcr.io/asyncfuncai/deepwiki-open:latest
```
This command also mounts `~/.adalflow` on your host to `/root/.adalflow` in the container. This path is used to store:
- Cloned repositories (`~/.adalflow/repos/`)
- Their embeddings and indexes (`~/.adalflow/databases/`)
- Cached generated wiki content (`~/.adalflow/wikicache/`)
This ensures that your data persists even if the container is stopped or removed.
Or use the provided `docker-compose.yml` file:
```bash
# Edit the .env file with your API keys first
docker-compose up
```
(The `docker-compose.yml` file is pre-configured to mount `~/.adalflow` for data persistence, similar to the `docker run` command above.)
#### Using a .env file with Docker
You can also mount a .env file to the container:
```bash
# Create a .env file with your API keys
echo "GOOGLE_API_KEY=your_google_api_key" > .env
echo "OPENAI_API_KEY=your_openai_api_key" >> .env
echo "OPENROUTER_API_KEY=your_openrouter_api_key" >> .env
echo "AZURE_OPENAI_API_KEY=your_azure_openai_api_key" >> .env
echo "AZURE_OPENAI_ENDPOINT=your_azure_openai_endpoint" >> .env
echo "AZURE_OPENAI_VERSION=your_azure_openai_version" >>.env
echo "OLLAMA_HOST=your_ollama_host" >> .env
# Run the container with the .env file mounted
docker run -p 8001:8001 -p 3000:3000 \
-v $(pwd)/.env:/app/.env \
-v ~/.adalflow:/root/.adalflow \
ghcr.io/asyncfuncai/deepwiki-open:latest
```
This command also mounts `~/.adalflow` on your host to `/root/.adalflow` in the container. This path is used to store:
- Cloned repositories (`~/.adalflow/repos/`)
- Their embeddings and indexes (`~/.adalflow/databases/`)
- Cached generated wiki content (`~/.adalflow/wikicache/`)
This ensures that your data persists even if the container is stopped or removed.
#### Building the Docker image locally
If you want to build the Docker image locally:
```bash
# Clone the repository
git clone https://github.com/AsyncFuncAI/deepwiki-open.git
cd deepwiki-open
# Build the Docker image
docker build -t deepwiki-open .
# Run the container
docker run -p 8001:8001 -p 3000:3000 \
-e GOOGLE_API_KEY=your_google_api_key \
-e OPENAI_API_KEY=your_openai_api_key \
-e OPENROUTER_API_KEY=your_openrouter_api_key \
-e AZURE_OPENAI_API_KEY=your_azure_openai_api_key \
-e AZURE_OPENAI_ENDPOINT=your_azure_openai_endpoint \
-e AZURE_OPENAI_VERSION=your_azure_openai_version \
-e OLLAMA_HOST=your_ollama_host \
deepwiki-open
```
#### Using Self-Signed Certificates in Docker
If you're in an environment that uses self-signed certificates, you can include them in the Docker build:
1. Create a directory for your certificates (default is `certs` in your project root)
2. Copy your `.crt` or `.pem` certificate files into this directory
3. Build the Docker image:
```bash
# Build with default certificates directory (certs)
docker build .
# Or build with a custom certificates directory
docker build --build-arg CUSTOM_CERT_DIR=my-custom-certs .
```
### API Server Details
The API server provides:
- Repository cloning and indexing
- RAG (Retrieval Augmented Generation)
- Streaming chat completions
For more details, see the [API README](./api/README.md).
## 🔌 OpenRouter Integration
DeepWiki now supports [OpenRouter](https://openrouter.ai/) as a model provider, giving you access to hundreds of AI models through a single API:
- **Multiple Model Options**: Access models from OpenAI, Anthropic, Google, Meta, Mistral, and more
- **Simple Configuration**: Just add your OpenRouter API key and select the model you want to use
- **Cost Efficiency**: Choose models that fit your budget and performance needs
- **Easy Switching**: Toggle between different models without changing your code
### How to Use OpenRouter with DeepWiki
1. **Get an API Key**: Sign up at [OpenRouter](https://openrouter.ai/) and get your API key
2. **Add to Environment**: Add `OPENROUTER_API_KEY=your_key` to your `.env` file
3. **Enable in UI**: Check the "Use OpenRouter API" option on the homepage
4. **Select Model**: Choose from popular models like GPT-4o, Claude 3.5 Sonnet, Gemini 2.0, and more
OpenRouter is particularly useful if you want to:
- Try different models without signing up for multiple services
- Access models that might be restricted in your region
- Compare performance across different model providers
- Optimize for cost vs. performance based on your needs
## 🤖 Ask & DeepResearch Features
### Ask Feature
The Ask feature allows you to chat with your repository using Retrieval Augmented Generation (RAG):
- **Context-Aware Responses**: Get accurate answers based on the actual code in your repository
- **RAG-Powered**: The system retrieves relevant code snippets to provide grounded responses
- **Real-Time Streaming**: See responses as they're generated for a more interactive experience
- **Conversation History**: The system maintains context between questions for more coherent interactions
### DeepResearch Feature
DeepResearch takes repository analysis to the next level with a multi-turn research process:
- **In-Depth Investigation**: Thoroughly explores complex topics through multiple research iterations
- **Structured Process**: Follows a clear research plan with updates and a comprehensive conclusion
- **Automatic Continuation**: The AI automatically continues research until reaching a conclusion (up to 5 iterations)
- **Research Stages**:
1. **Research Plan**: Outlines the approach and initial findings
2. **Research Updates**: Builds on previous iterations with new insights
3. **Final Conclusion**: Provides a comprehensive answer based on all iterations
To use DeepResearch, simply toggle the "Deep Research" switch in the Ask interface before submitting your question.
## Screenshots

*The main interface of DeepWiki*

*Access private repositories with personal access tokens*

*DeepResearch conducts multi-turn investigations for complex topics*
### Demo Video
[](https://youtu.be/zGANs8US8B4)
*Watch DeepWiki in action!*
## ❓ Troubleshooting
### API Key Issues
- **"Missing environment variables"**: Make sure your `.env` file is in the project root and contains the required API keys
- **"API key not valid"**: Check that you've copied the full key correctly with no extra spaces
- **"OpenRouter API error"**: Verify your OpenRouter API key is valid and has sufficient credits
- **"Azure OpenAI API error"**: Verify your Azure OpenAI credentials (API key, endpoint, and version) are correct and the service is properly deployed
### Connection Problems
- **"Cannot connect to API server"**: Make sure the API server is running on port 8001
- **"CORS error"**: The API is configured to allow all origins, but if you're having issues, try running both frontend and backend on the same machine
### Generation Issues
- **"Error generating wiki"**: For very large repositories, try a smaller one first
- **"Invalid repository format"**: Make sure you're using a valid GitHub, GitLab or Bitbucket URL format
- **"Could not fetch repository structure"**: For private repositories, ensure you've entered a valid personal access token with appropriate permissions
- **"Diagram rendering error"**: The app will automatically try to fix broken diagrams
### Common Solutions
1. **Restart both servers**: Sometimes a simple restart fixes most issues
2. **Check console logs**: Open browser developer tools to see any JavaScript errors
3. **Check API logs**: Look at the terminal where the API is running for Python errors
## 🤝 Contributing
Contributions are welcome! Feel free to:
- Open issues for bugs or feature requests
- Submit pull requests to improve the code
- Share your feedback and ideas
## 📄 License
This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
## ⭐ Star History
[](https://star-history.com/#AsyncFuncAI/deepwiki-open&Date)
================================================
FILE: README.pt-br.md
================================================
# DeepWiki-Open

**DeepWiki** é minha própria tentativa de implementação do DeepWiki, que cria automaticamente wikis bonitas e interativas para qualquer repositório GitHub, GitLab ou BitBucket! Basta inserir o nome de um repositório, e o DeepWiki irá:
1. Analisar a estrutura do código
2. Gerar documentação abrangente
3. Criar diagramas visuais para explicar como tudo funciona
4. Organizar tudo em uma wiki fácil de navegar
[](https://buymeacoffee.com/sheing)
[](https://tip.md/sng-asyncfunc)
[](https://x.com/sashimikun_void)
[](https://discord.com/invite/VQMBGR8u5v)
[English](./README.md) | [简体中文](./README.zh.md) | [繁體中文](./README.zh-tw.md) | [日本語](./README.ja.md) | [Español](./README.es.md) | [한국어](./README.kr.md) | [Tiếng Việt](./README.vi.md) | [Português Brasileiro](./README.pt-br.md) | [Français](./README.fr.md) | [Русский](./README.ru.md)
## ✨ Recursos
- **Documentação Instantânea**: Transforme qualquer repositório GitHub, GitLab ou BitBucket em uma wiki em segundos
- **Suporte a Repositórios Privados**: Acesse repositórios privados com segurança usando tokens de acesso pessoal
- **Análise Inteligente**: Compreensão da estrutura e relacionamentos do código com IA
- **Diagramas Bonitos**: Diagramas Mermaid automáticos para visualizar arquitetura e fluxo de dados
- **Navegação Fácil**: Interface simples e intuitiva para explorar a wiki
- **Recurso de Perguntas**: Converse com seu repositório usando IA com RAG para obter respostas precisas
- **DeepResearch**: Processo de pesquisa em várias etapas que investiga minuciosamente tópicos complexos
- **Múltiplos Provedores de Modelos**: Suporte para Google Gemini, OpenAI, OpenRouter e modelos locais Ollama
## 🚀 Início Rápido (Super Fácil!)
### Opção 1: Usando Docker
```bash
# Clone o repositório
git clone https://github.com/AsyncFuncAI/deepwiki-open.git
cd deepwiki-open
# Crie um arquivo .env com suas chaves de API
echo "GOOGLE_API_KEY=sua_chave_api_google" > .env
echo "OPENAI_API_KEY=sua_chave_api_openai" >> .env
# Opcional: Adicione a chave API OpenRouter se quiser usar modelos OpenRouter
echo "OPENROUTER_API_KEY=sua_chave_api_openrouter" >> .env
# Opcional: Adicione o host Ollama se não for local. padrão: http://localhost:11434
echo "OLLAMA_HOST=seu_host_ollama" >> .env
# Execute com Docker Compose
docker-compose up
```
Para instruções detalhadas sobre como usar o DeepWiki com Ollama e Docker, veja [Instruções do Ollama (em inglês)](Ollama-instruction.md).
> 💡 **Onde obter essas chaves:**
> - Obtenha uma chave API Google no [Google AI Studio](https://makersuite.google.com/app/apikey)
> - Obtenha uma chave API OpenAI na [Plataforma OpenAI](https://platform.openai.com/api-keys)
### Opção 2: Configuração Manual (Recomendada)
#### Passo 1: Configure Suas Chaves API
Crie um arquivo `.env` na raiz do projeto com estas chaves:
```
GOOGLE_API_KEY=sua_chave_api_google
OPENAI_API_KEY=sua_chave_api_openai
# Opcional: Adicione isso se quiser usar modelos OpenRouter
OPENROUTER_API_KEY=sua_chave_api_openrouter
# Opcional: Adicione o host Ollama se não for local. padrão: http://localhost:11434
OLLAMA_HOST=seu_host_ollama
```
#### Passo 2: Inicie o Backend
```bash
# Instale as dependências Python
python -m pip install poetry==2.0.1 && poetry install -C api
# Inicie o servidor API
python -m api.main
```
#### Passo 3: Inicie o Frontend
```bash
# Instale as dependências JavaScript
npm install
# ou
yarn install
# Inicie o aplicativo web
npm run dev
# ou
yarn dev
```
#### Passo 4: Use o DeepWiki!
1. Abra [http://localhost:3000](http://localhost:3000) no seu navegador
2. Insira um repositório GitHub, GitLab ou Bitbucket (como `https://github.com/openai/codex`, `https://github.com/microsoft/autogen`, `https://gitlab.com/gitlab-org/gitlab`, ou `https://bitbucket.org/redradish/atlassian_app_versions`)
3. Para repositórios privados, clique em "+ Adicionar tokens de acesso" e insira seu token de acesso pessoal do GitHub ou GitLab
4. Clique em "Gerar Wiki" e veja a mágica acontecer!
## 🔍 Como Funciona
O DeepWiki usa IA para:
1. Clonar e analisar o repositório GitHub, GitLab ou Bitbucket (incluindo repositórios privados com autenticação por token)
2. Criar embeddings do código para recuperação inteligente
3. Gerar documentação com IA contextual (usando modelos Google Gemini, OpenAI, OpenRouter ou Ollama local)
4. Criar diagramas visuais para explicar relações de código
5. Organizar tudo em uma wiki estruturada
6. Permitir perguntas e respostas inteligentes com o repositório através do recurso de Perguntas
7. Fornecer capacidades de pesquisa aprofundada com DeepResearch
```mermaid
graph TD
A[Usuário insere repo GitHub/GitLab/Bitbucket] --> AA{Repo privado?}
AA -->|Sim| AB[Adicionar token de acesso]
AA -->|Não| B[Clonar Repositório]
AB --> B
B --> C[Analisar Estrutura do Código]
C --> D[Criar Embeddings do Código]
D --> M{Selecionar Provedor de Modelo}
M -->|Google Gemini| E1[Gerar com Gemini]
M -->|OpenAI| E2[Gerar com OpenAI]
M -->|OpenRouter| E3[Gerar com OpenRouter]
M -->|Ollama Local| E4[Gerar com Ollama]
E1 --> E[Gerar Documentação]
E2 --> E
E3 --> E
E4 --> E
D --> F[Criar Diagramas Visuais]
E --> G[Organizar como Wiki]
F --> G
G --> H[DeepWiki Interativo]
classDef process stroke-width:2px;
classDef data stroke-width:2px;
classDef result stroke-width:2px;
classDef decision stroke-width:2px;
class A,D data;
class AA,M decision;
class B,C,E,F,G,AB,E1,E2,E3,E4 process;
class H result;
```
## 🛠️ Estrutura do Projeto
```
deepwiki/
├── api/ # Servidor API backend
│ ├── main.py # Ponto de entrada da API
│ ├── api.py # Implementação FastAPI
│ ├── rag.py # Retrieval Augmented Generation
│ ├── data_pipeline.py # Utilitários de processamento de dados
│ └── requirements.txt # Dependências Python
│
├── src/ # Aplicativo Next.js frontend
│ ├── app/ # Diretório do aplicativo Next.js
│ │ └── page.tsx # Página principal do aplicativo
│ └── components/ # Componentes React
│ └── Mermaid.tsx # Renderizador de diagramas Mermaid
│
├── public/ # Ativos estáticos
├── package.json # Dependências JavaScript
└── .env # Variáveis de ambiente (crie este arquivo)
```
## 🤖 Sistema de Seleção de Modelos Baseado em Provedores
O DeepWiki agora implementa um sistema flexível de seleção de modelos baseado em provedores, suportando múltiplos provedores de LLM:
### Provedores e Modelos Suportados
- **Google**: Padrão `gemini-2.5-flash`, também suporta `gemini-2.5-flash-lite`, `gemini-2.5-pro`, etc.
- **OpenAI**: Padrão `gpt-5-nano`, também suporta `gpt-5`, `4o`, etc.
- **OpenRouter**: Acesso a múltiplos modelos via uma API unificada, incluindo Claude, Llama, Mistral, etc.
- **Ollama**: Suporte para modelos de código aberto executados localmente como `llama3`
### Variáveis de Ambiente
Cada provedor requer suas variáveis de ambiente de chave API correspondentes:
```
# Chaves API
GOOGLE_API_KEY=sua_chave_api_google # Necessária para modelos Google Gemini
OPENAI_API_KEY=sua_chave_api_openai # Necessária para modelos OpenAI
OPENROUTER_API_KEY=sua_chave_api_openrouter # Necessária para modelos OpenRouter
# Configuração de URL Base da API OpenAI
OPENAI_BASE_URL=https://endpoint-api-personalizado.com/v1 # Opcional, para endpoints de API OpenAI personalizados
# Host Ollama
OLLAMA_HOST=seu_host_ollama # Opcional, se Ollama não for local. padrão: http://localhost:11434
# Diretório de Configuração
DEEPWIKI_CONFIG_DIR=/caminho/para/dir/config/personalizado # Opcional, para localização personalizada de arquivos de configuração
```
### Arquivos de Configuração
O DeepWiki usa arquivos de configuração JSON para gerenciar vários aspectos do sistema:
1. **`generator.json`**: Configuração para modelos de geração de texto
- Define provedores de modelos disponíveis (Google, OpenAI, OpenRouter, Ollama)
- Especifica modelos padrão e disponíveis para cada provedor
- Contém parâmetros específicos de modelo como temperatura e top_p
2. **`embedder.json`**: Configuração para modelos de embedding e processamento de texto
- Define modelos de embedding para armazenamento de vetores
- Contém configuração do recuperador para RAG
- Especifica configurações do divisor de texto para divisão de documentos
3. **`repo.json`**: Configuração para manipulação de repositórios
- Contém filtros de arquivos para excluir certos arquivos e diretórios
- Define limites de tamanho de repositório e regras de processamento
Por padrão, esses arquivos estão localizados no diretório `api/config/`. Você pode personalizar sua localização usando a variável de ambiente `DEEPWIKI_CONFIG_DIR`.
### Seleção de Modelo Personalizado para Provedores de Serviço
O recurso de seleção de modelo personalizado é especificamente projetado para provedores de serviço que precisam:
- Oferecer múltiplas opções de modelo de IA para usuários dentro de sua organização
- Adaptar-se rapidamente ao panorama de LLM em rápida evolução sem mudanças de código
- Suportar modelos especializados ou ajustados que não estão na lista predefinida
Provedores de serviço podem implementar suas ofertas de modelo selecionando entre as opções predefinidas ou inserindo identificadores de modelo personalizados na interface do frontend.
### Configuração de URL Base para Canais Privados Empresariais
A configuração base_url do Cliente OpenAI é projetada principalmente para usuários empresariais com canais de API privados. Este recurso:
- Permite conexão a endpoints de API privados ou específicos da empresa
- Permite que organizações usem seus próprios serviços LLM auto-hospedados ou implantados personalizados
- Suporta integração com serviços compatíveis com a API OpenAI de terceiros
**Em Breve**: Em atualizações futuras, o DeepWiki suportará um modo onde os usuários precisam fornecer suas próprias chaves API nas solicitações. Isso permitirá que clientes empresariais com canais privados usem seus arranjos de API existentes sem compartilhar credenciais com a implantação do DeepWiki.
## 🤩 Usando Modelos de Embedding Compatíveis com OpenAI (ex., Alibaba Qwen)
Se você deseja usar modelos de embedding compatíveis com a API OpenAI (como Alibaba Qwen), siga estas etapas:
1. Substitua o conteúdo de `api/config/embedder.json` pelo de `api/config/embedder_openai_compatible.json`.
2. No arquivo `.env` da raiz do seu projeto, defina as variáveis de ambiente relevantes, por exemplo:
```
OPENAI_API_KEY=sua_chave_api
OPENAI_BASE_URL=seu_endpoint_compativel_openai
```
3. O programa substituirá automaticamente os espaços reservados em embedder.json pelos valores de suas variáveis de ambiente.
Isso permite que você mude perfeitamente para qualquer serviço de embedding compatível com OpenAI sem mudanças de código.
### Logging
O DeepWiki usa o módulo `logging` integrado do Python para saída de diagnóstico. Você pode configurar a verbosidade e o destino do arquivo de log via variáveis de ambiente:
| Variável | Descrição | Padrão |
|-----------------|--------------------------------------------------------------------|------------------------------|
| `LOG_LEVEL` | Nível de logging (DEBUG, INFO, WARNING, ERROR, CRITICAL). | INFO |
| `LOG_FILE_PATH` | Caminho para o arquivo de log. Se definido, logs serão escritos neste arquivo. | `api/logs/application.log` |
Para habilitar logging de depuração e direcionar logs para um arquivo personalizado:
```bash
export LOG_LEVEL=DEBUG
export LOG_FILE_PATH=./debug.log
python -m api.main
```
Ou com Docker Compose:
```bash
LOG_LEVEL=DEBUG LOG_FILE_PATH=./debug.log docker-compose up
```
Ao executar com Docker Compose, o diretório `api/logs` do container é montado em `./api/logs` no seu host (veja a seção `volumes` em `docker-compose.yml`), garantindo que os arquivos de log persistam entre reinicializações.
Alternativamente, você pode armazenar essas configurações no seu arquivo `.env`:
```bash
LOG_LEVEL=DEBUG
LOG_FILE_PATH=./debug.log
```
Então simplesmente execute:
```bash
docker-compose up
```
**Considerações de Segurança do Caminho de Logging:** Em ambientes de produção, garanta que o diretório `api/logs` e qualquer caminho de arquivo de log personalizado estejam protegidos com permissões de sistema de arquivos e controles de acesso apropriados. O aplicativo impõe que `LOG_FILE_PATH` resida dentro do diretório `api/logs` do projeto para evitar travessia de caminho ou escritas não autorizadas.
## 🔧 Configuração Avançada
### Variáveis de Ambiente
| Variável | Descrição | Obrigatória | Observação |
|----------------------|--------------------------------------------------------------|----------|----------------------------------------------------------------------------------------------------------|
| `GOOGLE_API_KEY` | Chave API Google Gemini para geração com IA | Não | Necessária apenas se você quiser usar modelos Google Gemini
| `OPENAI_API_KEY` | Chave API OpenAI para embeddings | Sim | Nota: Isso é necessário mesmo se você não estiver usando modelos OpenAI, pois é usado para embeddings. |
| `OPENROUTER_API_KEY` | Chave API OpenRouter para modelos alternativos | Não | Necessária apenas se você quiser usar modelos OpenRouter |
| `OLLAMA_HOST` | Host Ollama (padrão: http://localhost:11434) | Não | Necessária apenas se você quiser usar servidor Ollama externo |
| `PORT` | Porta para o servidor API (padrão: 8001) | Não | Se você hospedar API e frontend na mesma máquina, certifique-se de alterar a porta de `SERVER_BASE_URL` de acordo |
| `SERVER_BASE_URL` | URL base para o servidor API (padrão: http://localhost:8001) | Não |
| `DEEPWIKI_AUTH_MODE` | Defina como `true` ou `1` para habilitar o modo de autorização. | Não | Padrão é `false`. Se habilitado, `DEEPWIKI_AUTH_CODE` é necessário. |
| `DEEPWIKI_AUTH_CODE` | O código secreto necessário para geração de wiki quando `DEEPWIKI_AUTH_MODE` está habilitado. | Não | Usado apenas se `DEEPWIKI_AUTH_MODE` for `true` ou `1`. |
Se você não estiver usando o modo ollama, você precisa configurar uma chave API OpenAI para embeddings. Outras chaves API são necessárias apenas ao configurar e usar modelos dos provedores correspondentes.
## Modo de Autorização
O DeepWiki pode ser configurado para executar em um modo de autorização, onde a geração de wiki requer um código de autorização válido. Isso é útil se você quiser controlar quem pode usar o recurso de geração.
Restringe a iniciação do frontend e protege a exclusão de cache, mas não impede completamente a geração de backend se os endpoints da API forem acessados diretamente.
Para habilitar o modo de autorização, defina as seguintes variáveis de ambiente:
- `DEEPWIKI_AUTH_MODE`: Defina como `true` ou `1`. Quando habilitado, o frontend exibirá um campo de entrada para o código de autorização.
- `DEEPWIKI_AUTH_CODE`: Defina como o código secreto desejado. Restringe a iniciação do frontend e protege a exclusão de cache, mas não impede completamente a geração de backend se os endpoints da API forem acessados diretamente.
Se `DEEPWIKI_AUTH_MODE` não estiver definido ou estiver definido como `false` (ou qualquer outro valor diferente de `true`/`1`), o recurso de autorização será desativado, e nenhum código será necessário.
### Configuração Docker
Você pode usar Docker para executar o DeepWiki:
```bash
# Baixe a imagem do GitHub Container Registry
docker pull ghcr.io/asyncfuncai/deepwiki-open:latest
# Execute o container com variáveis de ambiente
docker run -p 8001:8001 -p 3000:3000 \
-e GOOGLE_API_KEY=sua_chave_api_google \
-e OPENAI_API_KEY=sua_chave_api_openai \
-e OPENROUTER_API_KEY=sua_chave_api_openrouter \
-e OLLAMA_HOST=seu_host_ollama \
-v ~/.adalflow:/root/.adalflow \
ghcr.io/asyncfuncai/deepwiki-open:latest
```
Este comando também monta `~/.adalflow` no seu host para `/root/.adalflow` no container. Este caminho é usado para armazenar:
- Repositórios clonados (`~/.adalflow/repos/`)
- Seus embeddings e índices (`~/.adalflow/databases/`)
- Conteúdo de wiki gerado em cache (`~/.adalflow/wikicache/`)
Isso garante que seus dados persistam mesmo se o container for parado ou removido.
Ou use o arquivo `docker-compose.yml` fornecido:
```bash
# Edite o arquivo .env com suas chaves API primeiro
docker-compose up
```
(O arquivo `docker-compose.yml` é pré-configurado para montar `~/.adalflow` para persistência de dados, similar ao comando `docker run` acima.)
#### Usando um arquivo .env com Docker
Você também pode montar um arquivo .env no container:
```bash
# Crie um arquivo .env com suas chaves API
echo "GOOGLE_API_KEY=sua_chave_api_google" > .env
echo "OPENAI_API_KEY=sua_chave_api_openai" >> .env
echo "OPENROUTER_API_KEY=sua_chave_api_openrouter" >> .env
echo "OLLAMA_HOST=seu_host_ollama" >> .env
# Execute o container com o arquivo .env montado
docker run -p 8001:8001 -p 3000:3000 \
-v $(pwd)/.env:/app/.env \
-v ~/.adalflow:/root/.adalflow \
ghcr.io/asyncfuncai/deepwiki-open:latest
```
Este comando também monta `~/.adalflow` no seu host para `/root/.adalflow` no container. Este caminho é usado para armazenar:
- Repositórios clonados (`~/.adalflow/repos/`)
- Seus embeddings e índices (`~/.adalflow/databases/`)
- Conteúdo de wiki gerado em cache (`~/.adalflow/wikicache/`)
Isso garante que seus dados persistam mesmo se o container for parado ou removido.
#### Construindo a imagem Docker localmente
Se você quiser construir a imagem Docker localmente:
```bash
# Clone o repositório
git clone https://github.com/AsyncFuncAI/deepwiki-open.git
cd deepwiki-open
# Construa a imagem Docker
docker build -t deepwiki-open .
# Execute o container
docker run -p 8001:8001 -p 3000:3000 \
-e GOOGLE_API_KEY=sua_chave_api_google \
-e OPENAI_API_KEY=sua_chave_api_openai \
-e OPENROUTER_API_KEY=sua_chave_api_openrouter \
-e OLLAMA_HOST=seu_host_ollama \
deepwiki-open
```
### Detalhes do Servidor API
O servidor API fornece:
- Clonagem e indexação de repositórios
- RAG (Retrieval Augmented Generation)
- Completions de chat com streaming
Para mais detalhes, veja o [README da API](./api/README.md).
## 🔌 Integração com OpenRouter
O DeepWiki agora suporta [OpenRouter](https://openrouter.ai/) como provedor de modelos, dando acesso a centenas de modelos de IA através de uma única API:
- **Múltiplas Opções de Modelos**: Acesse modelos da OpenAI, Anthropic, Google, Meta, Mistral e mais
- **Configuração Simples**: Apenas adicione sua chave API OpenRouter e selecione o modelo que deseja usar
- **Eficiência de Custo**: Escolha modelos que se adequem ao seu orçamento e necessidades de desempenho
- **Troca Fácil**: Alterne entre diferentes modelos sem alterar seu código
### Como Usar o OpenRouter com DeepWiki
1. **Obtenha uma Chave API**: Cadastre-se no [OpenRouter](https://openrouter.ai/) e obtenha sua chave API
2. **Adicione ao Ambiente**: Adicione `OPENROUTER_API_KEY=sua_chave` ao seu arquivo `.env`
3. **Habilite na UI**: Marque a opção "Usar API OpenRouter" na página inicial
4. **Selecione o Modelo**: Escolha entre modelos populares como GPT-4o, Claude 3.5 Sonnet, Gemini 2.0 e mais
O OpenRouter é particularmente útil se você quiser:
- Experimentar diferentes modelos sem se cadastrar em múltiplos serviços
- Acessar modelos que podem estar restritos em sua região
- Comparar desempenho entre diferentes provedores de modelos
- Otimizar custo vs. desempenho com base em suas necessidades
## 🤖 Recursos de Perguntas & DeepResearch
### Recurso de Perguntas
O recurso de Perguntas permite que você converse com seu repositório usando Retrieval Augmented Generation (RAG):
- **Respostas Contextuais**: Obtenha respostas precisas baseadas no código real em seu repositório
- **Alimentado por RAG**: O sistema recupera trechos de código relevantes para fornecer respostas fundamentadas
- **Streaming em Tempo Real**: Veja as respostas conforme são geradas para uma experiência mais interativa
- **Histórico de Conversação**: O sistema mantém contexto entre perguntas para interações mais coerentes
### Recurso DeepResearch
O DeepResearch leva a análise de repositórios a um novo nível com um processo de pesquisa em várias etapas:
- **Investigação Aprofundada**: Explora minuciosamente tópicos complexos através de múltiplas iterações de pesquisa
- **Processo Estruturado**: Segue um plano de pesquisa claro com atualizações e uma conclusão abrangente
- **Continuação Automática**: A IA continua automaticamente a pesquisa até chegar a uma conclusão (até 5 iterações)
- **Estágios de Pesquisa**:
1. **Plano de Pesquisa**: Descreve a abordagem e descobertas iniciais
2. **Atualizações de Pesquisa**: Construído sobre iterações anteriores com novos insights
3. **Conclusão Final**: Fornece uma resposta abrangente baseada em todas as iterações
Para usar o DeepResearch, simplesmente alterne o interruptor "Pesquisa Aprofundada" na interface de Perguntas antes de enviar sua pergunta.
## 📱 Capturas de Tela

*A interface principal do DeepWiki*

*Acesse repositórios privados com tokens de acesso pessoal*

*DeepResearch conduz investigações em várias etapas para tópicos complexos*
### Vídeo de Demonstração
[](https://youtu.be/zGANs8US8B4)
*Veja o DeepWiki em ação!*
## ❓ Solução de Problemas
### Problemas com Chaves API
- **"Variáveis de ambiente ausentes"**: Certifique-se de que seu arquivo `.env` está na raiz do projeto e contém as chaves API necessárias
- **"Chave API não válida"**: Verifique se você copiou a chave completa corretamente sem espaços extras
- **"Erro de API OpenRouter"**: Verifique se sua chave API OpenRouter é válida e tem créditos suficientes
### Problemas de Conexão
- **"Não é possível conectar ao servidor API"**: Certifique-se de que o servidor API está em execução na porta 8001
- **"Erro CORS"**: A API está configurada para permitir todas as origens, mas se você estiver tendo problemas, tente executar frontend e backend na mesma máquina
### Problemas de Geração
- **"Erro ao gerar wiki"**: Para repositórios muito grandes, tente um menor primeiro
- **"Formato de repositório inválido"**: Certifique-se de que está usando um formato de URL GitHub, GitLab ou Bitbucket válido
- **"Não foi possível buscar a estrutura do repositório"**: Para repositórios privados, certifique-se de ter inserido um token de acesso pessoal válido com as permissões apropriadas
- **"Erro de renderização de diagrama"**: O aplicativo tentará corrigir automaticamente diagramas quebrados
### Soluções Comuns
1. **Reinicie ambos os servidores**: Às vezes um simples reinicio resolve a maioria dos problemas
2. **Verifique os logs do console**: Abra as ferramentas de desenvolvedor do navegador para ver quaisquer erros JavaScript
3. **Verifique os logs da API**: Olhe o terminal onde a API está em execução para erros Python
## 🤝 Contribuindo
Contribuições são bem-vindas! Sinta-se à vontade para:
- Abrir issues para bugs ou solicitações de recursos
- Enviar pull requests para melhorar o código
- Compartilhar seu feedback e ideias
## 📄 Licença
Este projeto está licenciado sob a Licença MIT - veja o arquivo [LICENSE](LICENSE) para detalhes.
## ⭐ Histórico de Estrelas
[](https://star-history.com/#AsyncFuncAI/deepwiki-open&Date)
================================================
FILE: README.ru.md
================================================
# DeepWiki-Open

**DeepWiki** — это моя собственная реализация DeepWiki, автоматически создающая красивые, интерактивные вики по любому репозиторию на GitHub, GitLab или BitBucket! Просто укажите название репозитория, и DeepWiki выполнит:
1. Анализ структуры кода
2. Генерацию полноценной документации
3. Построение визуальных диаграмм, объясняющих работу системы
4. Организацию всего в удобную и структурированную вики
[](https://buymeacoffee.com/sheing)
[](https://tip.md/sng-asyncfunc)
[](https://x.com/sashimikun_void)
[](https://discord.com/invite/VQMBGR8u5v)
[English](./README.md) | [简体中文](./README.zh.md) | [繁體中文](./README.zh-tw.md) | [日本語](./README.ja.md) | [Español](./README.es.md) | [한국어](./README.kr.md) | [Tiếng Việt](./README.vi.md) | [Português Brasileiro](./README.pt-br.md) | [Français](./README.fr.md) | [Русский](./README.ru.md)
## ✨ Возможности
- **Мгновенная документация**: Превращение любого репозитория в вики за считанные секунды
- **Поддержка приватных репозиториев**: Безопасный доступ с помощью персональных токенов
- **Умный анализ**: Понимание структуры и взаимосвязей в коде с помощью ИИ
- **Красивые диаграммы**: Автоматическая генерация диаграмм Mermaid для отображения архитектуры и потоков данных
- **Простая навигация**: Интуитивный интерфейс для изучения вики
- **Функция “Спросить”**: Общение с репозиторием через ИИ, основанный на RAG, для получения точных ответов
- **DeepResearch**: Многошаговое исследование для глубокого анализа сложных тем
- **Поддержка различных провайдеров моделей**: Google Gemini, OpenAI, OpenRouter и локальные модели Ollama
## 🚀 Быстрый старт (максимально просто!)
### Вариант 1: С использованием Docker
```bash
# Клонируйте репозиторий
git clone https://github.com/AsyncFuncAI/deepwiki-open.git
cd deepwiki-open
# Создайте файл .env с вашими API-ключами
echo "GOOGLE_API_KEY=ваш_google_api_key" > .env
echo "OPENAI_API_KEY=ваш_openai_api_key" >> .env
# Необязательно: ключ OpenRouter
echo "OPENROUTER_API_KEY=ваш_openrouter_api_key" >> .env
# Необязательно: указать хост Ollama, если он не локальный (по умолчанию http://localhost:11434)
echo "OLLAMA_HOST=ваш_ollama_host" >> .env
# Необязательно: ключ и параметры Azure OpenAI
echo "AZURE_OPENAI_API_KEY=ваш_azure_api_key" >> .env
echo "AZURE_OPENAI_ENDPOINT=ваш_azure_endpoint" >> .env
echo "AZURE_OPENAI_VERSION=ваша_azure_version" >> .env
# Запуск через Docker Compose
docker-compose up
```
Подробную инструкцию по работе с Ollama и Docker см. в [Ollama Instructions](Ollama-instruction.md).
> 💡 **Где взять ключи API:**
> - [Google AI Studio](https://makersuite.google.com/app/apikey)
> - [OpenAI Platform](https://platform.openai.com/api-keys)
> - [Azure Portal](https://portal.azure.com/)
### Вариант 2: Ручная установка (рекомендуется)
#### Шаг 1: Установка ключей API
Создайте файл `.env` в корне проекта со следующим содержанием:
```
GOOGLE_API_KEY=ваш_google_api_key
OPENAI_API_KEY=ваш_openai_api_key
# Необязательно: для OpenRouter
OPENROUTER_API_KEY=ваш_openrouter_api_key
# Необязательно: для Azure OpenAI
AZURE_OPENAI_API_KEY=ваш_azure_api_key
AZURE_OPENAI_ENDPOINT=ваш_azure_endpoint
AZURE_OPENAI_VERSION=ваша_azure_version
# Необязательно: если Ollama не локальная
OLLAMA_HOST=ваш_ollama_host
```
#### Шаг 2: Запуск backend-сервера
```bash
# Установка зависимостей
python -m pip install poetry==2.0.1 && poetry install -C api
# Запуск API
python -m api.main
```
#### Шаг 3: Запуск frontend-интерфейса
```bash
# Установка JS-зависимостей
npm install
# или
yarn install
# Запуск веб-интерфейса
npm run dev
# или
yarn dev
```
#### Шаг 4: Используйте DeepWiki!
1. Откройте [http://localhost:3000](http://localhost:3000) в браузере
2. Введите URL репозитория (например, `https://github.com/openai/codex`)
3. Для приватных репозиториев нажмите “+ Add access tokens” и введите токен
4. Нажмите “Generate Wiki” и наблюдайте за магией!
## 🔍 Как это работает
DeepWiki использует искусственный интеллект, чтобы:
1. Клонировать и проанализировать репозиторий GitHub, GitLab или Bitbucket (включая приватные — с использованием токенов)
2. Создать эмбеддинги кода для интеллектуального поиска
3. Сгенерировать документацию с учетом контекста (с помощью Google Gemini, OpenAI, OpenRouter, Azure OpenAI или локальных моделей Ollama)
4. Построить визуальные диаграммы для отображения связей в коде
5. Организовать всё в структурированную вики
6. Включить интеллектуальное взаимодействие через функцию "Спросить"
7. Обеспечить углубленный анализ через DeepResearch
```mermaid
graph TD
A[Пользователь вводит ссылку на репозиторий] --> AA{Приватный репозиторий?}
AA -->|Да| AB[Добавить токен доступа]
AA -->|Нет| B[Клонировать репозиторий]
AB --> B
B --> C[Анализ структуры кода]
C --> D[Создание эмбеддингов]
D --> M{Выбор провайдера модели}
M -->|Google Gemini| E1[Генерация через Gemini]
M -->|OpenAI| E2[Генерация через OpenAI]
M -->|OpenRouter| E3[Генерация через OpenRouter]
M -->|Локальная Ollama| E4[Генерация через Ollama]
M -->|Azure| E5[Генерация через Azure]
E1 --> E[Создание документации]
E2 --> E
E3 --> E
E4 --> E
E5 --> E
D --> F[Создание диаграмм]
E --> G[Формирование вики]
F --> G
G --> H[Интерактивная DeepWiki]
classDef process stroke-width:2px;
classDef data stroke-width:2px;
classDef result stroke-width:2px;
classDef decision stroke-width:2px;
class A,D data;
class AA,M decision;
class B,C,E,F,G,AB,E1,E2,E3,E4,E5 process;
class H result;
```
## 🛠️ Структура проекта
```
deepwiki/
├── api/ # Backend API сервер
│ ├── main.py # Точка входа API
│ ├── api.py # Реализация через FastAPI
│ ├── rag.py # RAG: генерация с дополнением
│ ├── data_pipeline.py # Утилиты обработки данных
│ └── requirements.txt # Зависимости Python
│
├── src/ # Клиентское приложение на Next.js
│ ├── app/ # Каталог приложения Next.js
│ │ └── page.tsx # Главная страница приложения
│ └── components/ # React-компоненты
│ └── Mermaid.tsx # Рендеринг диаграмм Mermaid
│
├── public/ # Статические ресурсы
├── package.json # JS-зависимости
└── .env # Переменные окружения
```
## 🤖 Система выбора моделей по провайдерам
DeepWiki поддерживает гибкую систему выбора моделей от разных поставщиков:
### Поддерживаемые провайдеры и модели
- **Google**: По умолчанию `gemini-2.5-flash`, также доступны `gemini-2.5-flash-lite`, `gemini-2.5-pro`, и др.
- **OpenAI**: По умолчанию `gpt-5-nano`, также поддерживает `gpt-5`, `4o` и другие
- **OpenRouter**: Доступ к множеству моделей через единый API (Claude, Llama, Mistral и др.)
- **Azure OpenAI**: По умолчанию `gpt-4o`, поддерживаются и другие
- **Ollama**: Локальные open-source модели, например `llama3`
### Переменные окружения
Каждому провайдеру соответствуют свои ключи:
```bash
GOOGLE_API_KEY=... # Для моделей Google Gemini
OPENAI_API_KEY=... # Для моделей OpenAI
OPENROUTER_API_KEY=... # Для моделей OpenRouter
AZURE_OPENAI_API_KEY=... # Для моделей Azure
AZURE_OPENAI_ENDPOINT=...
AZURE_OPENAI_VERSION=...
# Кастомный адрес для OpenAI API
OPENAI_BASE_URL=https://ваш-кастомный-api/v1
# Хост Ollama
OLLAMA_HOST=http://localhost:11434
# Каталог конфигурации
DEEPWIKI_CONFIG_DIR=/путь/к/конфигурации
```
### Конфигурационные файлы
DeepWiki использует JSON-файлы для настройки:
1. **`generator.json`** — конфигурация генерации текста и моделей
2. **`embedder.json`** — настройки эмбеддингов и ретривера
3. **`repo.json`** — правила обработки репозиториев
По умолчанию хранятся в `api/config/`, путь можно изменить через `DEEPWIKI_CONFIG_DIR`.
### Кастомизация для сервис-провайдеров
Функция выбора модели позволяет:
- Предоставлять выбор моделей пользователям вашей системы
- Легко адаптироваться к новым LLM без изменения кода
- Поддерживать кастомные или специализированные модели
Пользователи могут выбрать модель через интерфейс или указать свой идентификатор.
### Настройка OpenAI base_url для корпоративных клиентов
Позволяет:
- Использовать приватные API OpenAI
- Подключаться к self-hosted решениям
- Интегрироваться с совместимыми сторонними сервисами
**Скоро**: DeepWiki получит режим, в котором пользователи будут указывать свои API-ключи напрямую в запросах — удобно для корпоративных решений.
## 🧩 Использование совместимых с OpenAI моделей (например, Alibaba Qwen)
Чтобы использовать модели эмбеддингов, совместимые с OpenAI:
1. Замените `api/config/embedder.json` на `embedder_openai_compatible.json`
2. В `.env` добавьте:
```bash
OPENAI_API_KEY=ваш_ключ
OPENAI_BASE_URL=совместимый_endpoint
```
Программа автоматически подставит значения из переменных окружения.
### Логирование
DeepWiki использует стандартный `logging` из Python. Настраивается через:
| Переменная | Описание | Значение по умолчанию |
|------------------|-----------------------------------------------|-------------------------------|
| `LOG_LEVEL` | Уровень логов (DEBUG, INFO, WARNING и т.д.) | INFO |
| `LOG_FILE_PATH` | Путь к файлу логов | `api/logs/application.log` |
Пример:
```bash
export LOG_LEVEL=DEBUG
export LOG_FILE_PATH=./debug.log
python -m api.main
```
Или через Docker Compose:
```bash
LOG_LEVEL=DEBUG LOG_FILE_PATH=./debug.log docker-compose up
```
Для постоянства логов при перезапуске контейнера `api/logs` монтируется в `./api/logs`.
Также можно указать переменные в `.env`:
```bash
LOG_LEVEL=DEBUG
LOG_FILE_PATH=./debug.log
```
И просто выполнить:
```bash
docker-compose up
```
**Безопасность логов:** в продакшене важно настроить права доступа к `api/logs`, чтобы исключить несанкционированный доступ или запись.
## 🛠️ Расширенная настройка
### Переменные окружения
| Переменная | Назначение | Обязательно | Примечание |
|--------------------------|------------------------------------------------------------------------|-------------|-----------------------------------------------------------------------------------------------|
| `GOOGLE_API_KEY` | Ключ API для Google Gemini | Нет | Только если используете модели от Google |
| `OPENAI_API_KEY` | Ключ API для OpenAI (нужен даже для эмбеддингов) | Да | Обязателен для генерации эмбеддингов |
| `OPENROUTER_API_KEY` | Ключ API для OpenRouter | Нет | Только если используете модели OpenRouter |
| `AZURE_OPENAI_API_KEY` | Ключ Azure OpenAI | Нет | Только если используете Azure |
| `AZURE_OPENAI_ENDPOINT` | Endpoint Azure | Нет | Только если используете Azure |
| `AZURE_OPENAI_VERSION` | Версия API Azure | Нет | Только если используете Azure |
| `OLLAMA_HOST` | Хост Ollama (по умолчанию http://localhost:11434) | Нет | Указывается при использовании внешнего сервера Ollama |
| `PORT` | Порт API-сервера (по умолчанию 8001) | Нет | Меняйте, если frontend и backend работают на одной машине |
| `SERVER_BASE_URL` | Базовый URL для API (по умолчанию http://localhost:8001) | Нет | |
| `DEEPWIKI_AUTH_MODE` | Включает режим авторизации (true или 1) | Нет | Если включён, потребуется код из `DEEPWIKI_AUTH_CODE` |
| `DEEPWIKI_AUTH_CODE` | Секретный код для запуска генерации | Нет | Только если включён режим авторизации |
Если не используете Ollama, обязательно настройте OpenAI API ключ.
## Режим авторизации
DeepWiki может быть запущен в режиме авторизации — для генерации вики потребуется ввести секретный код. Это полезно, если вы хотите ограничить доступ к функциональности.
Для включения:
- `DEEPWIKI_AUTH_MODE=true`
- `DEEPWIKI_AUTH_CODE=секретный_код`
Это ограничивает доступ с фронтенда и защищает кэш, но не блокирует прямые вызовы API.
### Запуск через Docker
Вы можете использовать Docker:
#### Запуск контейнера
```bash
docker pull ghcr.io/asyncfuncai/deepwiki-open:latest
docker run -p 8001:8001 -p 3000:3000 \
-e GOOGLE_API_KEY=... \
-e OPENAI_API_KEY=... \
-e OPENROUTER_API_KEY=... \
-e OLLAMA_HOST=... \
-e AZURE_OPENAI_API_KEY=... \
-e AZURE_OPENAI_ENDPOINT=... \
-e AZURE_OPENAI_VERSION=... \
-v ~/.adalflow:/root/.adalflow \
ghcr.io/asyncfuncai/deepwiki-open:latest
```
Каталог `~/.adalflow` содержит:
- Клонированные репозитории
- Эмбеддинги и индексы
- Сгенерированные кэшированные вики
#### Docker Compose
```bash
# Убедитесь, что .env заполнен
docker-compose up
```
#### Использование .env
```bash
echo "GOOGLE_API_KEY=..." > .env
...
docker run -p 8001:8001 -p 3000:3000 \
-v $(pwd)/.env:/app/.env \
-v ~/.adalflow:/root/.adalflow \
ghcr.io/asyncfuncai/deepwiki-open:latest
```
#### Локальная сборка Docker-образа
```bash
git clone https://github.com/AsyncFuncAI/deepwiki-open.git
cd deepwiki-open
docker build -t deepwiki-open .
docker run -p 8001:8001 -p 3000:3000 \
-e GOOGLE_API_KEY=... \
-e OPENAI_API_KEY=... \
... \
deepwiki-open
```
#### Самоподписанные сертификаты
1. Создайте каталог `certs` (или свой)
2. Поместите сертификаты `.crt` или `.pem`
3. Соберите образ:
```bash
docker build --build-arg CUSTOM_CERT_DIR=certs .
```
### Описание API
Сервер API:
- Клонирует и индексирует репозитории
- Реализует RAG
- Поддерживает потоковую генерацию
См. подробности в [API README](./api/README.md)
## 🔌 Интеграция с OpenRouter
Платформа [OpenRouter](https://openrouter.ai/) предоставляет доступ ко множеству моделей:
- **Много моделей**: OpenAI, Anthropic, Google, Meta и др.
- **Простая настройка**: достаточно API-ключа
- **Гибкость и экономия**: выбирайте модели по цене и производительности
- **Быстрое переключение**: без изменения кода
### Как использовать
1. Получите ключ на [OpenRouter](https://openrouter.ai/)
2. Добавьте `OPENROUTER_API_KEY=...` в `.env`
3. Активируйте в интерфейсе
4. Выберите модель (например GPT-4o, Claude 3.5, Gemini 2.0 и др.)
Подходит для:
- Тестирования разных моделей без регистрации в каждом сервисе
- Доступа к моделям в регионах с ограничениями
- Сравнения производительности
- Оптимизации затрат
## 🤖 Возможности Ask и DeepResearch
### Ask
- **Ответы по коду**: AI использует содержимое репозитория
- **RAG**: подбираются релевантные фрагменты
- **Потоковая генерация**: ответы формируются в реальном времени
- **История общения**: поддерживается контекст
### DeepResearch
Функция глубокого анализа:
- **Многошаговый подход**: AI сам исследует тему
- **Этапы исследования**:
1. План
2. Промежуточные результаты
3. Итоговый вывод
Активируется переключателем "Deep Research".
## 📱 Скриншоты

*Основной интерфейс DeepWiki*

*Доступ к приватным репозиториям*

*DeepResearch анализирует сложные темы*
### Видео-демо
[](https://youtu.be/zGANs8US8B4)
## ❓ Решение проблем
### Проблемы с API-ключами
- **“Отсутствуют переменные окружения”** — проверьте `.env`
- **“Неверный ключ”** — уберите пробелы
- **“Ошибка OpenRouter API”** — проверьте ключ и баланс
- **“Ошибка Azure API”** — проверьте ключ, endpoint и версию
### Проблемы с подключением
- **“Нет подключения к API”** — убедитесь, что сервер запущен на 8001
- **“CORS ошибка”** — пробуйте запускать frontend и backend на одной машине
### Ошибки генерации
- **“Ошибка генерации вики”** — попробуйте меньший репозиторий
- **“Неверный формат ссылки”** — используйте корректные ссылки
- **“Нет структуры репозитория”** — проверьте токен доступа
- **“Ошибка диаграмм”** — система попытается автоматически исправить
### Универсальные советы
1. Перезапустите frontend и backend
2. Проверьте консоль браузера
3. Проверьте логи API
## 🤝 Участие
Вы можете:
- Заводить issues
- Отправлять pull requests
- Делиться идеями
## 📄 Лицензия
Проект распространяется под лицензией MIT. См. файл [LICENSE](LICENSE)
## ⭐ История звёзд
[](https://star-history.com/#AsyncFuncAI/deepwiki-open&Date)
================================================
FILE: README.vi.md
================================================
# DeepWiki-Open

**Open DeepWiki** là 1 triển khai thay thế cho DeepWiki, tự động tạo ra các trang wiki cho bất kỳ Repository nào trên GitHub, GitLab hoặc BitBucket! Chỉ cần nhập đường dẫn Repository, và DeepWiki sẽ:
1. Phân tích cấu trúc mã nguồn
2. Tạo tài liệu đầy đủ và chi tiết
3. Tạo sơ đồ trực quan để giải thích cách mọi thứ hoạt động
4. Sắp xếp tất cả documents thành một wiki dễ hiểu
[](https://buymeacoffee.com/sheing)
[](https://x.com/sashimikun_void)
[](https://discord.com/invite/VQMBGR8u5v)
[English](./README.md) | [简体中文](./README.zh.md) | [繁體中文](./README.zh-tw.md) | [日本語](./README.ja.md) | [Español](./README.es.md) | [한국어](./README.kr.md) | [Tiếng Việt](./README.vi.md) | [Português Brasileiro](./README.pt-br.md) | [Français](./README.fr.md) | [Русский](./README.ru.md)
## ✨ Tính năng
- **Tạo Tài liệu tức thì**: Biến bất kỳ Repository GitHub, GitLab hoặc BitBucket nào thành wiki chỉ trong vài giây
- **Hỗ trợ Private Repository**: Truy cập Private Repository một cách an toàn với personal access tokens
- **Phân tích thông minh**: Hiểu cấu trúc và mối quan hệ của source codes nhờ AI
- **Tự động tạo Sơ đồ**: Tự động tạo sơ đồ Mermaid để trực quan hóa kiến trúc và luồng dữ liệu
- **Dễ dàng thao tác**:Giao diện wiki đơn giản, trực quan để khám phá
- **Trò chuyện với repository**: Trò chuyện với repo của bạn bằng AI (tích hợp RAG) để nhận câu trả lời chính xác
- **DeepResearch**:Quy trình Deep Research nhiều bước giúp phân tích kỹ lưỡng các chủ đề phức tạp
- **Hỗ trợ nhiều mô hình**: Hỗ trợ Google Gemini, OpenAI, OpenRouter, và local Ollama models
## 🚀 Bắt đầu (Siêu dễ :))
### Option 1: Sử dụng Docker
```bash
# Clone repository
git clone https://github.com/AsyncFuncAI/deepwiki-open.git
cd deepwiki-open
# Tạo .env file với API keys
echo "GOOGLE_API_KEY=your_google_api_key" > .env
echo "OPENAI_API_KEY=your_openai_api_key" >> .env
# Optional: Thêm OpenRouter API key nếu bạn muốn OpenRouter models
echo "OPENROUTER_API_KEY=your_openrouter_api_key" >> .env
# Run với Docker Compose
docker-compose up
```
> 💡 **Hướng dẫn lấy Keys**
> - Lấy Google API key từ [Google AI Studio](https://makersuite.google.com/app/apikey)
> - Lấy OpenAI API key từ [OpenAI Platform](https://platform.openai.com/api-keys)
### Option 2: Setup thủ công (Khuyên dùng)
#### Bước 1: Set Up API Keys
Tạo `.env` file trong thư mục gốc của project với những keys vừa tạo:
```
GOOGLE_API_KEY=your_google_api_key
OPENAI_API_KEY=your_openai_api_key
# Optional: Thêm OpenRouter API key nếu bạn muốn OpenRouter models
OPENROUTER_API_KEY=your_openrouter_api_key
```
#### Bước 2: Bắt đầu với Backend
```bash
# Cài đặt Python dependencies
python -m pip install poetry==2.0.1 && poetry install -C api
# Chạy API server
python -m api.main
```
#### Bước 3: Bắt đầu với Frontend
```bash
# Cài đặt JavaScript dependencies
npm install
# Hoặc
yarn install
# Chạy the web app
npm run dev
# Hoặc
yarn dev
```
#### Bước 4: Dùng DeepWiki!
1. Mở [http://localhost:3000](http://localhost:3000) trên trình duyệt
2. Nhập đường dẫn GitHub, GitLab, hoặt Bitbucket repository (ví dụ như `https://github.com/openai/codex`, `https://github.com/microsoft/autogen`, `https://gitlab.com/gitlab-org/gitlab`, hay `https://bitbucket.org/redradish/atlassian_app_versions`)
3. Cho private repositories, Nhấn "+ Add access tokens" và nhập your GitHub hoặt GitLab personal access token
4. Click "Generate Wiki" và xem kết quả!
## 🔍 Cách Open Deepwiki hoạt động
DeepWiki dùng AI để:
1. Clone và phân tích GitHub, GitLab, hoặc Bitbucket repository (bao gồm private repos với token authentication)
2. Tạo embeddings cho code (Rag support)
3. Tạo documentation với context-aware AI (dùng Google Gemini, OpenAI, OpenRouter, hay local Ollama models)
4. Tạo diagrams để giải thích code relationships
5. Organize thông tin thành 1 trang wiki
6. Cho phép Q&A với repository
7. Cung cấp khả năng DeepResearch
```mermaid
graph TD
A[User inputs GitHub/GitLab/Bitbucket repo] --> AA{Private repo?}
AA -->|Yes| AB[Add access token]
AA -->|No| B[Clone Repository]
AB --> B
B --> C[Analyze Code Structure]
C --> D[Create Code Embeddings]
D --> M{Select Model Provider}
M -->|Google Gemini| E1[Generate with Gemini]
M -->|OpenAI| E2[Generate with OpenAI]
M -->|OpenRouter| E3[Generate with OpenRouter]
M -->|Local Ollama| E4[Generate with Ollama]
E1 --> E[Generate Documentation]
E2 --> E
E3 --> E
E4 --> E
D --> F[Create Visual Diagrams]
E --> G[Organize as Wiki]
F --> G
G --> H[Interactive DeepWiki]
classDef process stroke-width:2px;
classDef data stroke-width:2px;
classDef result stroke-width:2px;
classDef decision stroke-width:2px;
class A,D data;
class AA,M decision;
class B,C,E,F,G,AB,E1,E2,E3,E4 process;
class H result;
```
## 🛠️ Cấu trúc dự án
```
deepwiki/
├── api/ # Backend API server
│ ├── main.py # API
│ ├── api.py # FastAPI
│ ├── rag.py # Retrieval Augmented Generation (RAG)
│ ├── data_pipeline.py # Data processing utilities
│ └── requirements.txt # Python dependencies
│
├── src/ # Frontend Next.js app
│ ├── app/ # Next.js app directory
│ │ └── page.tsx # Main application page
│ └── components/ # React components
│ └── Mermaid.tsx # Mermaid diagram renderer
│
├── public/ # Static assets
├── package.json # JavaScript dependencies
└── .env # Environment variables (create this)
```
## 🛠️ Cài đặt nâng cao
### Biến môi trường
| Biến môi trường | Mô tả | bắt buộc | ghi chú |
|----------|-------------|----------|------|
| `GOOGLE_API_KEY` | Google Gemini API key | Có |
| `OPENAI_API_KEY` | OpenAI API key | có |
| `OPENROUTER_API_KEY` | OpenRouter API key | không| Yêu cầu nếu bạn muốn dùng OpenRouter models |
| `PORT` | Port của API server (mặc định: 8001) | không | Nếu bạn muốn chạy API và frontend trên cùng 1 máy, hãy điều chỉnh Port `SERVER_BASE_URL` |
| `SERVER_BASE_URL` | Đường dẫnn mặt định của API server (mặc định: http://localhost:8001) | không |
### Cài Đặt với Docker
Bạn có thể dùng Docker để run DeepWiki:
```bash
# Pull Docker image từ GitHub Container Registry
docker pull ghcr.io/asyncfuncai/deepwiki-open:latest
# Chạy container với biến môi trường
docker run -p 8001:8001 -p 3000:3000 \
-e GOOGLE_API_KEY=your_google_api_key \
-e OPENAI_API_KEY=your_openai_api_key \
-e OPENROUTER_API_KEY=your_openrouter_api_key \
-v ~/.adalflow:/root/.adalflow \
ghcr.io/asyncfuncai/deepwiki-open:latest
```
Hoặc đơn giản hơn, sử dụng `docker-compose.yml` :
```bash
# Edit the .env file with your API keys first
docker-compose up
```
#### Sử dụng .env file với Docker
Bạn có thể "mount" .env file vào container:
```bash
# Tạo .env file với your API keys
echo "GOOGLE_API_KEY=your_google_api_key" > .env
echo "OPENAI_API_KEY=your_openai_api_key" >> .env
echo "OPENROUTER_API_KEY=your_openrouter_api_key" >> .env
# Run container với .env file
docker run -p 8001:8001 -p 3000:3000 \
-v $(pwd)/.env:/app/.env \
-v ~/.adalflow:/root/.adalflow \
ghcr.io/asyncfuncai/deepwiki-open:latest
```
#### Bạn có thể Building the Docker image trên máy cục bộ
```bash
# Clone repository
git clone https://github.com/AsyncFuncAI/deepwiki-open.git
cd deepwiki-open
# Build Docker image
docker build -t deepwiki-open .
# Chạy container
docker run -p 8001:8001 -p 3000:3000 \
-e GOOGLE_API_KEY=your_google_api_key \
-e OPENAI_API_KEY=your_openai_api_key \
-e OPENROUTER_API_KEY=your_openrouter_api_key \
deepwiki-open
```
### Chi tiết API Server
API server cung cấp:
- Repository cloning và indexing
- RAG (Retrieval Augmented Generation)
- Trò chuyện liên tục
Biết thêm chi tiết truy cập [ API README](./api/README.md).
## 🤖 Hệ thống lựa chọn mô hình dựa trên nhà cung cấp
DeepWiki hiện đã triển khai một hệ thống lựa chọn mô hình linh hoạt dựa trên nhiều nhà cung cấp LLM:
### Các nhà cung cấp và mô hình được hỗ trợ
- **Google**: Mặc định là `gemini-2.5-flash`, cũng hỗ trợ `gemini-2.5-flash-lite`, `gemini-2.5-pro`, v.v.
- **OpenAI**: Mặc định là `gpt-5-nano`, cũng hỗ trợ `gpt-5`, `4o`, v.v.
- **OpenRouter**: Truy cập nhiều mô hình qua một API thống nhất, bao gồm Claude, Llama, Mistral, v.v.
- **Ollama**: Hỗ trợ các mô hình mã nguồn mở chạy cục bộ như `llama3`
### Biến môi trường
Mỗi nhà cung cấp yêu cầu các biến môi trường API key tương ứng:
```
# API Keys
GOOGLE_API_KEY=google_api_key_của_bạn # Bắt buộc cho các mô hình Google Gemini
OPENAI_API_KEY=openai_key_của_bạn # Bắt buộc cho các mô hình OpenAI
OPENROUTER_API_KEY=openrouter_key_của_bạn # Bắt buộc cho các mô hình OpenRouter
# Cấu hình URL cơ sở cho OpenAI API
OPENAI_BASE_URL=https://endpoint-tùy-chỉnh.com/v1 # Tùy chọn, cho các điểm cuối API OpenAI tùy chỉnh
# Thư mục cấu hình
DEEPWIKI_CONFIG_DIR=/đường/dẫn/đến/thư_mục/cấu_hình # Tùy chọn, cho vị trí tệp cấu hình tùy chỉnh
```
### Tệp cấu hình
DeepWiki sử dụng các tệp cấu hình JSON để quản lý các khía cạnh khác nhau của hệ thống:
1. **`generator.json`**: Cấu hình cho các mô hình tạo văn bản
- Xác định các nhà cung cấp mô hình có sẵn (Google, OpenAI, OpenRouter, Ollama)
- Chỉ định các mô hình mặc định và có sẵn cho mỗi nhà cung cấp
- Chứa các tham số đặc thù cho mô hình như temperature và top_p
2. **`embedder.json`**: Cấu hình cho mô hình embedding và xử lý văn bản
- Xác định mô hình embedding cho lưu trữ vector
- Chứa cấu hình bộ truy xuất cho RAG
- Chỉ định cài đặt trình chia văn bản để phân đoạn tài liệu
3. **`repo.json`**: Cấu hình xử lý repository
- Chứa bộ lọc tệp để loại trừ một số tệp và thư mục nhất định
- Xác định giới hạn kích thước repository và quy tắc xử lý
Mặc định, các tệp này nằm trong thư mục `api/config/`. Bạn có thể tùy chỉnh vị trí của chúng bằng biến môi trường `DEEPWIKI_CONFIG_DIR`.
### Lựa chọn mô hình tùy chỉnh cho nhà cung cấp dịch vụ
Tính năng lựa chọn mô hình tùy chỉnh được thiết kế đặc biệt cho các nhà cung cấp dịch vụ cần:
- Bạn có thể cung cấp cho người dùng trong tổ chức của mình nhiều lựa chọn mô hình AI khác nhau
- Bạn có thể thích ứng nhanh chóng với môi trường LLM đang phát triển nhanh chóng mà không cần thay đổi mã
- Bạn có thể hỗ trợ các mô hình chuyên biệt hoặc được tinh chỉnh không có trong danh sách định nghĩa trước
Bạn có thể triển khai các mô hình cung cấp bằng cách chọn từ các tùy chọn định nghĩa trước hoặc nhập định danh mô hình tùy chỉnh trong giao diện người dùng.
### Cấu hình URL cơ sở cho các kênh riêng doanh nghiệp
Cấu hình base_url của OpenAI Client được thiết kế chủ yếu cho người dùng doanh nghiệp có các kênh API riêng. Tính năng này:
- Cho phép kết nối với các điểm cuối API riêng hoặc dành riêng cho doanh nghiệp
- Cho phép các tổ chức sử dụng dịch vụ LLM tự lưu trữ hoặc triển khai tùy chỉnh
- Hỗ trợ tích hợp với các dịch vụ tương thích API OpenAI của bên thứ ba
**Sắp ra mắt**: Trong các bản cập nhật tương lai, DeepWiki sẽ hỗ trợ chế độ mà người dùng cần cung cấp API key của riêng họ trong các yêu cầu. Điều này sẽ cho phép khách hàng doanh nghiệp có kênh riêng sử dụng cấu hình API hiện có mà không cần chia sẻ thông tin đăng nhập với triển khai DeepWiki.
## 🔌 Tích hợp OpenRouter
DeepWiki hiện đã hỗ trợ [OpenRouter](https://openrouter.ai/) làm nhà cung cấp mô hình, cho phép bạn truy cập hàng trăm mô hình AI thông qua một API duy nhất:
- **Nhiều tùy chọn mô hình**: Truy cập các mô hình từ OpenAI, Anthropic, Google, Meta, Mistral và nhiều nhà cung cấp khác
- **Cấu hình đơn giản**: Chỉ cần thêm khóa API của bạn từ OpenRouter và chọn mô hình bạn muốn sử dụng
- **Tiết kiệm chi phí**: Lựa chọn mô hình phù hợp với ngân sách và nhu cầu hiệu suất của bạn
- **Chuyển đổi dễ dàng**: Chuyển đổi giữa các mô hình khác nhau mà không cần thay đổi mã nguồn
### Cách sử dụng OpenRouter với DeepWiki
1. **Lấy API Key**: Đăng ký tại [OpenRouter](https://openrouter.ai/) và lấy khóa API
2. **Thêm vào biến môi trường**: Thêm `OPENROUTER_API_KEY=your_key` vào file `.env`
3. **Bật trong giao diện**: Chọn "Use OpenRouter API" trên trang chủ
4. **Chọn mô hình**: Lựa chọn từ các mô hình phổ biến như GPT-4o, Claude 3.5 Sonnet, Gemini 2.0 và nhiều hơn nữa
OpenRouter đặc biệt hữu ích nếu bạn muốn:
- Thử nhiều mô hình khác nhau mà không cần đăng ký nhiều dịch vụ
- Truy cập các mô hình có thể bị giới hạn tại khu vực của bạn
- So sánh hiệu năng giữa các nhà cung cấp mô hình khác nhau
- Tối ưu hóa chi phí so với hiệu suất dựa trên nhu cầu của bạn
## 🤖 Tính năng Hỏi & Nghiên cứu Sâu (DeepResearch)
### Tính năng Hỏi (Ask)
Tính năng Hỏi cho phép bạn trò chuyện với kho mã của mình bằng cách sử dụng kỹ thuật RAG (Retrieval Augmented Generation):
- **Phản hồi theo ngữ cảnh**: Nhận câu trả lời chính xác dựa trên mã thực tế trong kho của bạn
- **Ứng dụng RAG**: Hệ thống truy xuất các đoạn mã liên quan để tạo ra câu trả lời có cơ sở
- **Phản hồi theo thởi gian thực**: Xem câu trả lời được tạo ra trực tiếp, mang lại trải nghiệm tương tác hơn
- **Lưu lịch sử cuộc trò chuyện**: Hệ thống duy trì ngữ cảnh giữa các câu hỏi để cuộc đối thoại liền mạch hơn
### Tính năng DeepResearch
DeepResearch nâng tầm phân tích kho mã với quy trình nghiện cứu nhiểu vòng:
- **Ngieen cứu chuyên sâu**: Khám phá kỹ lưỡng các chủ đề phức tạp thông qua nhiểu vòng nghiện cứu
- **Quy trình có cấu trúc**: Tuân theo kế hoạch nghiện cứu rõ ràng với các bản cập nhật và kết luận tổng thể
- **Tự động tiếp tục**: AI sẽ tự động tiếp tục quá trình nghiện cứu cho đến khi đưa ra kết luận (tối đa 5 vòng)
- **Các giai đoạn nghiện cứu**:
1. **Kế hoạch nghiện cứu**: Phác thảo phương pháp và những phát hiện ban đầu
2. **Cập nhật nghiện cứu**: Bổ sung kiến thức mới qua từng vòng lặp
3. **Kết luận cuối cùng**: Đưa ra câu trả lời toàn diện dựa trên tất cả các vòng nghiện cứu
Để sử dụng DeepResearch, chỉ cần bật công tắc "Deep Research" trong giao diện Hỏi (Ask) trước khi gửi câu hỏi của bạn.
## 📱 Ảnh chụp màng hình

*Giao diện chính của DeepWiki*

*Truy cập kho riêng tư bằng Personal Access Token*

*DeepResearch thực hiện nghiện cứu nhiểu vòng cho các chủ đề phức tạp*
### Demo Video
[](https://youtu.be/zGANs8US8B4)
## ❓ Khắc phục sự cố
### Vấn đề với API Key
- **"Thiếu biến môi trường"**: Đảm bảo rằng file `.env` của bạn nằm ở thư mục gốc của dự án và chứa các API key cần thiết
- **"API key không hợp lệ"**: Kiểm tra lại xem bạn đã sao chép đầy đủ API key mà không có khoảng trắng thừa chưa
- **"Lỗi API OpenRouter"**: Xác minh rằng API key của OpenRouter là hợp lệ và có đủ tín dụng
### Vấn đề kết nối
- **"Không thể kết nối với máy chủ API"**: Đảm bảo máy chủ API đang chạy trên cổng 8001
- **"Lỗi CORS"**: API được cấu hình để cho phép tất cả các nguồn gốc, nhưng nếu gặp sự cố, thử chạy cả frontend và backend trên cùng một máy tính
### Vấn đề khi tạo nội dung
- **"Lỗi khi tạo wiki"**: Với các kho mã rất lớn, hãy thử trước với kho mã nhỏ hơn
- **"Định dạng kho mã không hợp lệ"**: Đảm bảo bạn đang sử dụng định dạng URL hợp lệ cho GitHub, GitLab hoặc Bitbucket
- **"Không thể lấy cấu trúc kho mã"**: Với các kho mã riêng tư, hãy đảm bảo bạn đã nhập token truy cập cá nhân hợp lệ và có quyền truy cập phù hợp
- **"Lỗi khi render sơ đồ"**: Ứng dụng sẽ tự động thử khắc phục các sơ đồ bị lỗi
### Các giải pháp phổ biến
1. **Khởi động lại cả hai máy chủ**: Đôi khi, một lần khởi động lại đơn giản có thể giải quyết hầu hết các vấn đề
2. **Kiểm tra nhật ký trình duyệt**: Mở công cụ phát triển của trình duyệt để xem các lỗi JavaScript
3. **Kiểm tra nhật ký API**: Xem các lỗi Python trong terminal nơi API đang chạy
## 🤝 Đóng góp
Chúng tôi hoan nghênh mọi đóng góp! Bạn có thể:
- Mở các vấn đề (issues) để báo lỗi hoặc yêu cầu tính năng
- Gửi pull request để cải thiện mã nguồn
- Chia sẻ phản hồi và ý tưởng của bạn
## 📄 Giấy phép
Dự án này được cấp phép theo Giấy phép MIT - xem file [LICENSE](LICENSE) để biết chi tiết.
## ⭐ Lịch sử
[](https://star-history.com/#AsyncFuncAI/deepwiki-open&Date)
================================================
FILE: README.zh-tw.md
================================================
# DeepWiki-Open

**DeepWiki** 可以為任何 GitHub、GitLab 或 BitBucket 程式碼儲存庫自動建立美觀、互動式的 Wiki!只需輸入儲存庫名稱,DeepWiki 將:
1. 分析程式碼結構
2. 產生全面的文件
3. 建立視覺化圖表解釋一切如何運作
4. 將所有內容整理成易於導覽的 Wiki
[](https://buymeacoffee.com/sheing)
[](https://tip.md/sng-asyncfunc)
[](https://x.com/sashimikun_void)
[](https://discord.com/invite/VQMBGR8u5v)
[English](./README.md) | [简体中文](./README.zh.md) | [繁體中文](./README.zh-tw.md) | [日本語](./README.ja.md) | [Español](./README.es.md) | [한국어](./README.kr.md) | [Tiếng Việt](./README.vi.md) | [Português Brasileiro](./README.pt-br.md) | [Français](./README.fr.md) | [Русский](./README.ru.md)
## ✨ 特點
- **即時文件**:幾秒鐘內將任何 GitHub、GitLab 或 BitBucket 儲存庫轉換為 Wiki
- **私人儲存庫支援**:使用個人存取權杖安全存取私人儲存庫
- **智慧分析**:AI 驅動的程式碼結構和關係理解
- **精美圖表**:自動產生 Mermaid 圖表視覺化架構和資料流
- **簡易導覽**:簡單、直觀的介面探索 Wiki
- **提問功能**:使用 RAG 驅動的 AI 與您的儲存庫聊天,取得準確答案
- **深度研究**:多輪研究過程,徹底調查複雜主題
- **多模型提供商**:支援 Google Gemini、OpenAI、OpenRouter 和本機 Ollama 模型
## 🚀 快速開始(超級簡單!)
### 選項 1:使用 Docker
```bash
# 複製儲存庫
git clone https://github.com/AsyncFuncAI/deepwiki-open.git
cd deepwiki-open
# 建立包含 API 金鑰的 .env 檔案
echo "GOOGLE_API_KEY=your_google_api_key" > .env
echo "OPENAI_API_KEY=your_openai_api_key" >> .env
# 可選:如果您想使用 OpenRouter 模型,新增 OpenRouter API 金鑰
echo "OPENROUTER_API_KEY=your_openrouter_api_key" >> .env
# 可選:如果 Ollama 不在本機執行,新增 Ollama 主機位址,預設為 http://localhost:11434
echo "OLLAMA_HOST=your_ollama_host" >> .env
# 使用 Docker Compose 執行
docker-compose up
```
有關使用 DeepWiki 搭配 Ollama 和 Docker 的詳細說明,請參閱 [Ollama 操作說明](Ollama-instruction.md)。
(上述 Docker 命令以及 `docker-compose.yml` 設定會掛載您主機上的 `~/.adalflow` 目錄到容器內的 `/root/.adalflow`。此路徑用於儲存:
- 複製的儲存庫 (`~/.adalflow/repos/`)
- 儲存庫的嵌入和索引 (`~/.adalflow/databases/`)
- 快取的已產生 Wiki 內容 (`~/.adalflow/wikicache/`)
這確保了即使容器停止或移除,您的資料也能持久保存。)
> 💡 **取得這些金鑰的地方:**
> - 從 [Google AI Studio](https://makersuite.google.com/app/apikey) 取得 Google API 金鑰
> - 從 [OpenAI Platform](https://platform.openai.com/api-keys) 取得 OpenAI API 金鑰
### 選項 2:手動設定(推薦)
#### 步驟 1:設定 API 金鑰
在專案根目錄建立一個 `.env` 檔案,包含以下金鑰:
```
GOOGLE_API_KEY=your_google_api_key
OPENAI_API_KEY=your_openai_api_key
# 可選:如果您想使用 OpenRouter 模型,新增此項
OPENROUTER_API_KEY=your_openrouter_api_key
# 可選:如果 Ollama 不在本機執行,新增 Ollama 主機位址,預設為 http://localhost:11434
OLLAMA_HOST=your_ollama_host
```
#### 步驟 2:啟動後端
```bash
# 安裝 Python 相依性
python -m pip install poetry==2.0.1 && poetry install -C api
# 啟動 API 伺服器
python -m api.main
```
#### 步驟 3:啟動前端
```bash
# 安裝 JavaScript 相依性
npm install
# 或
yarn install
# 啟動 Web 應用
npm run dev
# 或
yarn dev
```
#### 步驟 4:使用 DeepWiki!
1. 在瀏覽器中開啟 [http://localhost:3000](http://localhost:3000)
2. 輸入 GitHub、GitLab 或 Bitbucket 儲存庫(如 `https://github.com/openai/codex`、`https://github.com/microsoft/autogen`、`https://gitlab.com/gitlab-org/gitlab` 或 `https://bitbucket.org/redradish/atlassian_app_versions`)
3. 對於私人儲存庫,點擊「+ 新增存取權杖」並輸入您的 GitHub 或 GitLab 個人存取權杖
4. 點擊「產生 Wiki」,見證奇蹟的發生!
## 🔍 工作原理
DeepWiki 使用 AI 來:
1. 複製並分析 GitHub、GitLab 或 Bitbucket 儲存庫(包括使用權杖驗證的私人儲存庫)
2. 建立程式碼嵌入用於智慧檢索
3. 使用上下文感知 AI 產生文件(使用 Google Gemini、OpenAI、OpenRouter 或本機 Ollama 模型)
4. 建立視覺化圖表解釋程式碼關係
5. 將所有內容組織成結構化 Wiki
6. 透過提問功能實現與儲存庫的智慧問答
7. 透過深度研究功能提供深入研究能力
```mermaid
graph TD
A[使用者輸入 GitHub/GitLab/Bitbucket 儲存庫] --> AA{私人儲存庫?}
AA -->|是| AB[新增存取權杖]
AA -->|否| B[複製儲存庫]
AB --> B
B --> C[分析程式碼結構]
C --> D[建立程式碼嵌入]
D --> M{選擇模型提供商}
M -->|Google Gemini| E1[使用 Gemini 產生]
M -->|OpenAI| E2[使用 OpenAI 產生]
M -->|OpenRouter| E3[使用 OpenRouter 產生]
M -->|本機 Ollama| E4[使用 Ollama 產生]
E1 --> E[產生文件]
E2 --> E
E3 --> E
E4 --> E
D --> F[建立視覺化圖表]
E --> G[組織為 Wiki]
F --> G
G --> H[互動式 DeepWiki]
classDef process stroke-width:2px;
classDef data stroke-width:2px;
classDef result stroke-width:2px;
classDef decision stroke-width:2px;
class A,D data;
class AA,M decision;
class B,C,E,F,G,AB,E1,E2,E3,E4 process;
class H result;
```
## 🛠️ 專案結構
```
deepwiki/
├── api/ # 後端 API 伺服器
│ ├── main.py # API 進入點
│ ├── api.py # FastAPI 實作
│ ├── rag.py # 檢索增強產生
│ ├── data_pipeline.py # 資料處理工具
│ └── requirements.txt # Python 相依性
│
├── src/ # 前端 Next.js 應用
│ ├── app/ # Next.js 應用目錄
│ │ └── page.tsx # 主應用頁面
│ └── components/ # React 元件
│ └── Mermaid.tsx # Mermaid 圖表渲染器
│
├── public/ # 靜態資源
├── package.json # JavaScript 相依性
└── .env # 環境變數(需要建立)
```
## 🤖 基於提供商的模型選擇系統
DeepWiki 現在實作了靈活的基於提供商的模型選擇系統,支援多種 LLM 提供商:
### 支援的提供商和模型
- **Google**:預設 `gemini-2.5-flash`,也支援 `gemini-2.5-flash-lite`、`gemini-2.5-pro` 等
- **OpenAI**:預設 `gpt-5-nano`,也支援 `gpt-5`, `4o` 等
- **OpenRouter**:透過統一 API 存取多種模型,包括 Claude、Llama、Mistral 等
- **Ollama**:支援本機執行的開源模型,如 `llama3`
### 環境變數
每個提供商都需要對應的 API 金鑰環境變數:
```
# API 金鑰
GOOGLE_API_KEY=your_google_api_key # 使用 Google Gemini 模型時必需
OPENAI_API_KEY=your_openai_api_key # 使用 OpenAI 模型時必需
OPENROUTER_API_KEY=your_openrouter_api_key # 使用 OpenRouter 模型時必需
# OpenAI API 基礎 URL 設定
OPENAI_BASE_URL=https://custom-api-endpoint.com/v1 # 可選,用於自訂 OpenAI API 端點
# Ollama 主機
OLLAMA_HOST=your_ollama_host # 可選,如果 Ollama 不在本機執行,預設為 http://localhost:11434
# 設定檔目錄
DEEPWIKI_CONFIG_DIR=/path/to/custom/config/dir # 可選,用於自訂設定檔位置
```
### 設定檔
DeepWiki 使用 JSON 設定檔來管理系統的各個層面:
1. **`generator.json`**:文字產生模型設定
- 定義可用的模型提供商(Google、OpenAI、OpenRouter、Ollama)
- 指定每個提供商的預設和可用模型
- 包含模型特定參數,如 temperature 和 top_p
2. **`embedder.json`**:嵌入模型和文字處理設定
- 定義用於向量儲存的嵌入模型
- 包含用於 RAG 的檢索器設定
- 指定文件分塊的文字分割器設定
3. **`repo.json`**:儲存庫處理設定
- 包含排除特定檔案和目錄的檔案篩選器
- 定義儲存庫大小限制和處理規則
預設情況下,這些檔案位於 `api/config/` 目錄中。您可以使用 `DEEPWIKI_CONFIG_DIR` 環境變數自訂它們的位置。
### 為服務提供商設計的自訂模型選擇
自訂模型選擇功能專為需要以下功能的服務提供商設計:
- 您可以在組織內為使用者提供多種 AI 模型選擇
- 您可以快速適應快速發展的 LLM 領域,無需變更程式碼
- 您可以支援不在預定義清單中的專業或微調模型
服務提供商可以透過從預定義選項中選擇或在前端介面中輸入自訂模型識別符來實作其模型提供方案。
### 為企業私有通道設計的基礎 URL 設定
OpenAI 客戶端的 base_url 設定主要為擁有私有 API 通道的企業使用者設計。此功能:
- 支援連線到私有或企業特定的 API 端點
- 允許組織使用自己的自主託管或自訂部署的 LLM 服務
- 支援與第三方 OpenAI API 相容服務的整合
**即將推出**:在未來的更新中,DeepWiki 將支援一種模式,讓使用者需要在請求中提供自己的 API 金鑰。這將允許擁有私有通道的企業客戶使用其現有的 API 安排,而不必與 DeepWiki 部署共享憑證。
## 🧩 使用 OpenAI 相容的嵌入模型(如阿里巴巴 Qwen)
如果您想使用與 OpenAI API 相容的嵌入模型(如阿里巴巴 Qwen),請按照以下步驟操作:
1. 用 `api/config/embedder_openai_compatible.json` 的內容替換 `api/config/embedder.json` 的內容。
2. 在專案根目錄的 `.env` 檔案中,設定相關的環境變數,例如:
```
OPENAI_API_KEY=your_api_key
OPENAI_BASE_URL=your_openai_compatible_endpoint
```
3. 程式會自動用環境變數的值替換 embedder.json 中的預留位置。
這讓您可以無縫切換到任何 OpenAI 相容的嵌入服務,無需變更程式碼。
### 日誌記錄
DeepWiki 使用 Python 的內建 `logging` 模組進行診斷輸出。您可以透過環境變數設定詳細程度和日誌檔案目標:
| 變數 | 說明 | 預設值 |
|-----------------|----------------------------------------------------------------------|------------------------------|
| `LOG_LEVEL` | 日誌記錄等級(DEBUG、INFO、WARNING、ERROR、CRITICAL) | INFO |
| `LOG_FILE_PATH` | 日誌檔案的路徑。如果設定,日誌將寫入此檔案 | `api/logs/application.log` |
要啟用除錯日誌並將日誌導向自訂檔案:
```bash
export LOG_LEVEL=DEBUG
export LOG_FILE_PATH=./debug.log
python -m api.main
```
或使用 Docker Compose:
```bash
LOG_LEVEL=DEBUG LOG_FILE_PATH=./debug.log docker-compose up
```
使用 Docker Compose 執行時,容器的 `api/logs` 目錄會掛載到主機上的 `./api/logs`(請參閱 `docker-compose.yml` 中的 `volumes` 區段),確保日誌檔案在重新啟動後仍然存在。
您也可以將這些設定儲存在 `.env` 檔案中:
```bash
LOG_LEVEL=DEBUG
LOG_FILE_PATH=./debug.log
```
然後簡單執行:
```bash
docker-compose up
```
**日誌路徑安全性考量:** 在生產環境中,請確保 `api/logs` 目錄和任何自訂日誌檔案路徑都受到適當的檔案系統權限和存取控制保護。應用程式會強制要求 `LOG_FILE_PATH` 位於專案的 `api/logs` 目錄內,以防止路徑遍歷或未授權的寫入。
## 🛠️ 進階設定
### 環境變數
| 變數 | 說明 | 必需 | 備註 |
|----------------------|--------------------------------------------------------------|----------|----------------------------------------------------------------------------------------------------------|
| `GOOGLE_API_KEY` | Google Gemini API 金鑰,用於 AI 產生 | 否 | 只有在您想使用 Google Gemini 模型時才需要
| `OPENAI_API_KEY` | OpenAI API 金鑰,用於嵌入 | 是 | 備註:即使您不使用 OpenAI 模型,這個也是必需的,因為它用於嵌入 |
| `OPENROUTER_API_KEY` | OpenRouter API 金鑰,用於替代模型 | 否 | 只有在您想使用 OpenRouter 模型時才需要 |
| `OLLAMA_HOST` | Ollama 主機(預設:http://localhost:11434) | 否 | 只有在您想使用外部 Ollama 伺服器時才需要 |
| `PORT` | API 伺服器的連接埠(預設:8001) | 否 | 如果您在同一台機器上託管 API 和前端,請確保相應地變更 `SERVER_BASE_URL` 的連接埠 |
| `SERVER_BASE_URL` | API 伺服器的基礎 URL(預設:http://localhost:8001) | 否 |
| `DEEPWIKI_AUTH_MODE` | 設定為 `true` 或 `1` 以啟用授權模式 | 否 | 預設為 `false`。如果啟用,則需要 `DEEPWIKI_AUTH_CODE` |
| `DEEPWIKI_AUTH_CODE` | 當 `DEEPWIKI_AUTH_MODE` 啟用時,Wiki 產生所需的秘密代碼 | 否 | 只有在 `DEEPWIKI_AUTH_MODE` 為 `true` 或 `1` 時才使用 |
如果您不使用 ollama 模式,您需要設定 OpenAI API 金鑰用於嵌入。其他 API 金鑰只有在設定並使用對應提供商的模型時才需要。
## 授權模式
DeepWiki 可以設定為在授權模式下執行,在此模式下,Wiki 產生需要有效的授權代碼。如果您想控制誰可以使用產生功能,這會很有用。
限制前端啟動並保護快取刪除,但如果直接存取 API 端點,無法完全防止後端產生。
要啟用授權模式,請設定以下環境變數:
- `DEEPWIKI_AUTH_MODE`:將此設定為 `true` 或 `1`。啟用時,前端將顯示授權代碼的輸入欄位。
- `DEEPWIKI_AUTH_CODE`:將此設定為所需的秘密代碼。限制前端啟動並保護快取刪除,但如果直接存取 API 端點,無法完全防止後端產生。
如果未設定 `DEEPWIKI_AUTH_MODE` 或設定為 `false`(或除 `true`/`1` 以外的任何其他值),授權功能將被停用,不需要任何代碼。
### Docker 設定
您可以使用 Docker 來執行 DeepWiki:
```bash
# 從 GitHub Container Registry 拉取映像
docker pull ghcr.io/asyncfuncai/deepwiki-open:latest
# 使用環境變數執行容器
docker run -p 8001:8001 -p 3000:3000 \
-e GOOGLE_API_KEY=your_google_api_key \
-e OPENAI_API_KEY=your_openai_api_key \
-e OPENROUTER_API_KEY=your_openrouter_api_key \
-e OLLAMA_HOST=your_ollama_host \
-v ~/.adalflow:/root/.adalflow \
ghcr.io/asyncfuncai/deepwiki-open:latest
```
此命令也會將主機上的 `~/.adalflow` 掛載到容器中的 `/root/.adalflow`。此路徑用於儲存:
- 複製的儲存庫(`~/.adalflow/repos/`)
- 它們的嵌入和索引(`~/.adalflow/databases/`)
- 快取的已產生 Wiki 內容(`~/.adalflow/wikicache/`)
這確保即使容器停止或移除,您的資料也會持續存在。
或使用提供的 `docker-compose.yml` 檔案:
```bash
# 首先使用您的 API 金鑰編輯 .env 檔案
docker-compose up
```
(`docker-compose.yml` 檔案預先設定為掛載 `~/.adalflow` 以保持資料持續性,類似於上面的 `docker run` 命令。)
#### 在 Docker 中使用 .env 檔案
您也可以將 .env 檔案掛載到容器:
```bash
# 使用您的 API 金鑰建立 .env 檔案
echo "GOOGLE_API_KEY=your_google_api_key" > .env
echo "OPENAI_API_KEY=your_openai_api_key" >> .env
echo "OPENROUTER_API_KEY=your_openrouter_api_key" >> .env
echo "OLLAMA_HOST=your_ollama_host" >> .env
# 使用掛載的 .env 檔案執行容器
docker run -p 8001:8001 -p 3000:3000 \
-v $(pwd)/.env:/app/.env \
-v ~/.adalflow:/root/.adalflow \
ghcr.io/asyncfuncai/deepwiki-open:latest
```
此命令也會將主機上的 `~/.adalflow` 掛載到容器中的 `/root/.adalflow`。此路徑用於儲存:
- 複製的儲存庫(`~/.adalflow/repos/`)
- 它們的嵌入和索引(`~/.adalflow/databases/`)
- 快取的已產生 Wiki 內容(`~/.adalflow/wikicache/`)
這確保即使容器停止或移除,您的資料也會持續存在。
#### 在本機建置 Docker 映像
如果您想在本機建置 Docker 映像:
```bash
# 複製儲存庫
git clone https://github.com/AsyncFuncAI/deepwiki-open.git
cd deepwiki-open
# 建置 Docker 映像
docker build -t deepwiki-open .
# 執行容器
docker run -p 8001:8001 -p 3000:3000 \
-e GOOGLE_API_KEY=your_google_api_key \
-e OPENAI_API_KEY=your_openai_api_key \
-e OPENROUTER_API_KEY=your_openrouter_api_key \
-e OLLAMA_HOST=your_ollama_host \
deepwiki-open
```
### API 伺服器詳細資訊
API 伺服器提供:
- 儲存庫複製和索引
- RAG(檢索增強產生)
- 串流聊天完成
更多詳細資訊,請參閱 [API README](./api/README.md)。
## 🔌 OpenRouter 整合
DeepWiki 現在支援 [OpenRouter](https://openrouter.ai/) 作為模型提供商,讓您可以透過單一 API 存取數百個 AI 模型:
- **多種模型選項**:存取來自 OpenAI、Anthropic、Google、Meta、Mistral 等的模型
- **簡單設定**:只需新增您的 OpenRouter API 金鑰並選擇您想使用的模型
- **成本效益**:選擇符合您預算和效能需求的模型
- **輕鬆切換**:在不同模型之間切換,無需變更程式碼
### 如何在 DeepWiki 中使用 OpenRouter
1. **取得 API 金鑰**:在 [OpenRouter](https://openrouter.ai/) 註冊並取得您的 API 金鑰
2. **新增到環境**:在您的 `.env` 檔案中新增 `OPENROUTER_API_KEY=your_key`
3. **在 UI 中啟用**:在首頁勾選「使用 OpenRouter API」選項
4. **選擇模型**:從熱門模型中選擇,如 GPT-4o、Claude 3.5 Sonnet、Gemini 2.0 等
OpenRouter 特別適用於以下情況:
- 想嘗試不同模型而不用註冊多個服務
- 存取在您所在地區可能受限的模型
- 比較不同模型提供商的效能
- 根據您的需求最佳化成本與效能的平衡
## 🤖 提問和深度研究功能
### 提問功能
提問功能允許您使用檢索增強產生(RAG)與您的儲存庫聊天:
- **上下文感知回應**:基於儲存庫中實際程式碼取得準確答案
- **RAG 驅動**:系統檢索相關程式碼片段,提供有根據的回應
- **即時串流傳輸**:即時檢視產生的回應,取得更互動式的體驗
- **對話歷史**:系統在問題之間保持上下文,實現更連貫的互動
### 深度研究功能
深度研究透過多輪研究過程將儲存庫分析提升到新水平:
- **深入調查**:透過多次研究迭代徹底探索複雜主題
- **結構化過程**:遵循清晰的研究計畫,包含更新和全面結論
- **自動繼續**:AI 自動繼續研究直到達成結論(最多 5 次迭代)
- **研究階段**:
1. **研究計畫**:概述方法和初步發現
2. **研究更新**:在前一輪迭代基礎上增加新見解
3. **最終結論**:基於所有迭代提供全面答案
要使用深度研究,只需在提交問題前在提問介面中切換「深度研究」開關。
## 📱 螢幕截圖
### 主頁面

### Wiki 頁面

### 提問功能

### 深度研究

### 展示影片
[](https://youtu.be/zGANs8US8B4)
*觀看 DeepWiki 實際操作!*
## 🔧 配置選項
### 模型提供商
DeepWiki 支援多個 AI 模型提供商:
1. **Google Gemini**(預設)
- 快速且經濟實惠
- 良好的程式碼理解能力
2. **OpenAI**
- 高品質輸出
- 支援 GPT-4 和 GPT-3.5
3. **OpenRouter**
- 存取多個模型
- 靈活的定價選項
4. **本機 Ollama**
- 隱私保護
- 離線執行
- 需要本機設定
### Wiki 類型
- **全面型**:包含詳細分析、程式碼範例和完整文件
- **簡潔型**:專注於核心功能和關鍵見解
## 🌍 支援的平台
- **GitHub**:公開和私人儲存庫
- **GitLab**:GitLab.com 和自主託管實例
- **Bitbucket**:Atlassian 託管的儲存庫
## 📚 API 端點
### `/api/wiki_cache`
- **方法**:GET
- **描述**:檢索快取的 Wiki 資料
- **參數**:
- `repo`: 儲存庫識別符
- `platform`: git 平台(github、gitlab、bitbucket)
### `/export/wiki`
- **方法**:GET
- **描述**:匯出 Wiki 為 Markdown 或 JSON
- **參數**:
- `repo`: 儲存庫識別符
- `format`: 匯出格式(markdown、json)
## ❓ 故障排除
### API 金鑰問題
- **「缺少環境變數」**:確保您的 `.env` 檔案位於專案根目錄並包含所需的 API 金鑰
- **「API 金鑰無效」**:檢查您是否正確複製了完整金鑰,沒有多餘空格
- **「OpenRouter API 錯誤」**:驗證您的 OpenRouter API 金鑰有效且有足夠的額度
### 連線問題
- **「無法連線到 API 伺服器」**:確保 API 伺服器在連接埠 8001 上執行
- **「CORS 錯誤」**:API 設定為允許所有來源,但如果您遇到問題,請嘗試在同一台機器上執行前端和後端
### 產生問題
- **「產生 Wiki 時出錯」**:對於非常大的儲存庫,請先嘗試較小的儲存庫
- **「無效的儲存庫格式」**:確保您使用有效的 GitHub、GitLab 或 Bitbucket URL 格式
- **「無法擷取儲存庫結構」**:對於私人儲存庫,確保您輸入了具有適當權限的有效個人存取權杖
- **「圖表轉譯錯誤」**:應用程式將自動嘗試修復損壞的圖表
### 常見解決方案
1. **重新啟動兩個伺服器**:有時簡單的重新啟動可以解決大多數問題
2. **檢查主控台日誌**:開啟瀏覽器開發者工具查看任何 JavaScript 錯誤
3. **檢查 API 日誌**:查看執行 API 的終端中的 Python 錯誤
## 🤝 貢獻
我們歡迎各種形式的貢獻!無論是錯誤報告、功能請求還是程式碼貢獻。
### 開發設定
1. Fork 此儲存庫
2. 建立功能分支:`git checkout -b feature/amazing-feature`
3. 提交您的變更:`git commit -m 'Add amazing feature'`
4. 推送到分支:`git push origin feature/amazing-feature`
5. 開啟 Pull Request
### 新增新語言支援
1. 在 `src/messages/` 中新增新的翻譯檔案
2. 更新 `src/i18n.ts` 中的 `locales` 陣列
3. 建立相對應的 README 檔案
4. 測試翻譯
## 📄 授權
此專案根據 MIT 授權條款授權 - 詳情請參閱 [LICENSE](LICENSE) 檔案。
## 🙏 致謝
- 感謝所有貢獻者的努力
- 基於 Next.js、FastAPI 和各種開源
gitextract_27f935c4/ ├── .dockerignore ├── .github/ │ └── workflows/ │ └── docker-build-push.yml ├── .gitignore ├── .python-version ├── .vscode/ │ └── launch.json ├── Dockerfile ├── Dockerfile-ollama-local ├── LICENSE ├── Ollama-instruction.md ├── README.es.md ├── README.fr.md ├── README.ja.md ├── README.kr.md ├── README.md ├── README.pt-br.md ├── README.ru.md ├── README.vi.md ├── README.zh-tw.md ├── README.zh.md ├── api/ │ ├── README.md │ ├── __init__.py │ ├── api.py │ ├── azureai_client.py │ ├── bedrock_client.py │ ├── config/ │ │ ├── embedder.json │ │ ├── embedder.json.bak │ │ ├── embedder.ollama.json.bak │ │ ├── embedder.openai_compatible.json.bak │ │ ├── generator.json │ │ ├── lang.json │ │ └── repo.json │ ├── config.py │ ├── dashscope_client.py │ ├── data_pipeline.py │ ├── google_embedder_client.py │ ├── logging_config.py │ ├── main.py │ ├── ollama_patch.py │ ├── openai_client.py │ ├── openrouter_client.py │ ├── prompts.py │ ├── pyproject.toml │ ├── rag.py │ ├── simple_chat.py │ ├── tools/ │ │ └── embedder.py │ └── websocket_wiki.py ├── docker-compose.yml ├── eslint.config.mjs ├── next.config.ts ├── package.json ├── postcss.config.mjs ├── pytest.ini ├── run.sh ├── src/ │ ├── app/ │ │ ├── [owner]/ │ │ │ └── [repo]/ │ │ │ ├── page.tsx │ │ │ ├── slides/ │ │ │ │ └── page.tsx │ │ │ └── workshop/ │ │ │ └── page.tsx │ │ ├── api/ │ │ │ ├── auth/ │ │ │ │ ├── status/ │ │ │ │ │ └── route.ts │ │ │ │ └── validate/ │ │ │ │ └── route.ts │ │ │ ├── chat/ │ │ │ │ └── stream/ │ │ │ │ └── route.ts │ │ │ ├── models/ │ │ │ │ └── config/ │ │ │ │ └── route.ts │ │ │ └── wiki/ │ │ │ └── projects/ │ │ │ └── route.ts │ │ ├── globals.css │ │ ├── layout.tsx │ │ ├── page.tsx │ │ └── wiki/ │ │ └── projects/ │ │ └── page.tsx │ ├── components/ │ │ ├── Ask.tsx │ │ ├── ConfigurationModal.tsx │ │ ├── Markdown.tsx │ │ ├── Mermaid.tsx │ │ ├── ModelSelectionModal.tsx │ │ ├── ProcessedProjects.tsx │ │ ├── TokenInput.tsx │ │ ├── UserSelector.tsx │ │ ├── WikiTreeView.tsx │ │ ├── WikiTypeSelector.tsx │ │ └── theme-toggle.tsx │ ├── contexts/ │ │ └── LanguageContext.tsx │ ├── hooks/ │ │ └── useProcessedProjects.ts │ ├── i18n.ts │ ├── messages/ │ │ ├── en.json │ │ ├── es.json │ │ ├── fr.json │ │ ├── ja.json │ │ ├── kr.json │ │ ├── pt-br.json │ │ ├── ru.json │ │ ├── vi.json │ │ ├── zh-tw.json │ │ └── zh.json │ ├── types/ │ │ ├── repoinfo.tsx │ │ └── wiki/ │ │ ├── wikipage.tsx │ │ └── wikistructure.tsx │ └── utils/ │ ├── getRepoUrl.tsx │ ├── urlDecoder.tsx │ └── websocketClient.ts ├── tailwind.config.js ├── test/ │ ├── __init__.py │ └── test_extract_repo_name.py ├── tests/ │ ├── README.md │ ├── __init__.py │ ├── api/ │ │ ├── __init__.py │ │ └── test_api.py │ ├── integration/ │ │ ├── __init__.py │ │ └── test_full_integration.py │ ├── run_tests.py │ └── unit/ │ ├── __init__.py │ ├── test_all_embedders.py │ └── test_google_embedder.py └── tsconfig.json
SYMBOL INDEX (335 symbols across 53 files)
FILE: api/api.py
function get_adalflow_default_root_path (line 36) | def get_adalflow_default_root_path():
class WikiPage (line 40) | class WikiPage(BaseModel):
class ProcessedProjectEntry (line 51) | class ProcessedProjectEntry(BaseModel):
class RepoInfo (line 60) | class RepoInfo(BaseModel):
class WikiSection (line 69) | class WikiSection(BaseModel):
class WikiStructureModel (line 79) | class WikiStructureModel(BaseModel):
class WikiCacheData (line 90) | class WikiCacheData(BaseModel):
class WikiCacheRequest (line 101) | class WikiCacheRequest(BaseModel):
class WikiExportRequest (line 112) | class WikiExportRequest(BaseModel):
class Model (line 121) | class Model(BaseModel):
class Provider (line 128) | class Provider(BaseModel):
class ModelConfig (line 137) | class ModelConfig(BaseModel):
class AuthorizationConfig (line 144) | class AuthorizationConfig(BaseModel):
function get_lang_config (line 150) | async def get_lang_config():
function get_auth_status (line 154) | async def get_auth_status():
function validate_auth_code (line 161) | async def validate_auth_code(request: AuthorizationConfig):
function get_model_config (line 168) | async def get_model_config():
function export_wiki (line 228) | async def export_wiki(request: WikiExportRequest):
function get_local_repo_structure (line 276) | async def get_local_repo_structure(path: str = Query(None, description="...
function generate_markdown_export (line 322) | def generate_markdown_export(repo_url: str, pages: List[WikiPage]) -> str:
function generate_json_export (line 369) | def generate_json_export(repo_url: str, pages: List[WikiPage]) -> str:
function get_wiki_cache_path (line 408) | def get_wiki_cache_path(owner: str, repo: str, repo_type: str, language:...
function read_wiki_cache (line 413) | async def read_wiki_cache(owner: str, repo: str, repo_type: str, languag...
function save_wiki_cache (line 426) | async def save_wiki_cache(data: WikiCacheRequest) -> bool:
function get_cached_wiki (line 462) | async def get_cached_wiki(
function store_wiki_cache (line 487) | async def store_wiki_cache(request_data: WikiCacheRequest):
function delete_wiki_cache (line 505) | async def delete_wiki_cache(
function health_check (line 541) | async def health_check():
function root (line 550) | async def root():
function get_processed_projects (line 578) | async def get_processed_projects():
FILE: api/azureai_client.py
function get_first_message_content (line 75) | def get_first_message_content(completion: ChatCompletion) -> str:
function parse_stream_response (line 85) | def parse_stream_response(completion: ChatCompletionChunk) -> str:
function handle_streaming_response (line 90) | def handle_streaming_response(generator: Stream[ChatCompletionChunk]):
function get_all_messages_content (line 98) | def get_all_messages_content(completion: ChatCompletion) -> List[str]:
function get_probabilities (line 103) | def get_probabilities(completion: ChatCompletion) -> List[List[TokenLogP...
class AzureAIClient (line 118) | class AzureAIClient(ModelClient):
method __init__ (line 195) | def __init__(
method init_sync_client (line 233) | def init_sync_client(self):
method init_async_client (line 262) | def init_async_client(self):
method parse_chat_completion (line 303) | def parse_chat_completion(
method track_completion_usage (line 319) | def track_completion_usage(
method parse_embedding_response (line 335) | def parse_embedding_response(
method convert_inputs_to_api_kwargs (line 348) | def convert_inputs_to_api_kwargs(
method call (line 410) | def call(self, api_kwargs: Dict = {}, model_type: ModelType = ModelTyp...
method acall (line 437) | async def acall(
method from_dict (line 453) | def from_dict(cls: type[T], data: Dict[str, Any]) -> T:
method to_dict (line 460) | def to_dict(self) -> Dict[str, Any]:
FILE: api/bedrock_client.py
class BedrockClient (line 20) | class BedrockClient(ModelClient):
method __init__ (line 38) | def __init__(
method from_dict (line 76) | def from_dict(cls, data: Dict[str, Any]):
method to_dict (line 80) | def to_dict(self) -> Dict[str, Any]:
method __getstate__ (line 90) | def __getstate__(self):
method __setstate__ (line 103) | def __setstate__(self, state):
method init_sync_client (line 113) | def init_sync_client(self):
method init_async_client (line 154) | def init_async_client(self):
method _get_model_provider (line 163) | def _get_model_provider(self, model_id: str) -> str:
method _format_prompt_for_provider (line 183) | def _format_prompt_for_provider(self, provider: str, prompt: str, mess...
method _extract_response_text (line 250) | def _extract_response_text(self, provider: str, response: Dict[str, An...
method parse_embedding_response (line 276) | def parse_embedding_response(self, response: Any) -> EmbedderOutput:
method call (line 304) | def call(self, api_kwargs: Dict = None, model_type: ModelType = None) ...
method acall (line 436) | async def acall(self, api_kwargs: Dict = None, model_type: ModelType =...
method convert_inputs_to_api_kwargs (line 442) | def convert_inputs_to_api_kwargs(
FILE: api/config.py
function replace_env_placeholders (line 69) | def replace_env_placeholders(config: Union[Dict[str, Any], List[Any], st...
function load_json_config (line 100) | def load_json_config(filename):
function load_generator_config (line 124) | def load_generator_config():
function load_embedder_config (line 151) | def load_embedder_config():
function get_embedder_config (line 163) | def get_embedder_config():
function is_ollama_embedder (line 180) | def is_ollama_embedder():
function is_google_embedder (line 200) | def is_google_embedder():
function is_bedrock_embedder (line 220) | def is_bedrock_embedder():
function get_embedder_type (line 238) | def get_embedder_type():
function load_repo_config (line 255) | def load_repo_config():
function load_lang_config (line 259) | def load_lang_config():
function get_model_config (line 359) | def get_model_config(provider="google", model=None):
FILE: api/dashscope_client.py
function get_first_message_content (line 68) | def get_first_message_content(completion: ChatCompletion) -> str:
function parse_stream_response (line 91) | def parse_stream_response(completion: ChatCompletionChunk) -> str:
function handle_streaming_response (line 96) | def handle_streaming_response(generator: Stream[ChatCompletionChunk]):
class DashscopeClient (line 104) | class DashscopeClient(ModelClient):
method __init__ (line 120) | def __init__(
method _prepare_client_config (line 146) | def _prepare_client_config(self):
method init_sync_client (line 175) | def init_sync_client(self):
method init_async_client (line 186) | def init_async_client(self):
method parse_chat_completion (line 197) | def parse_chat_completion(
method track_completion_usage (line 271) | def track_completion_usage(
method parse_embedding_response (line 286) | def parse_embedding_response(
method convert_inputs_to_api_kwargs (line 305) | def convert_inputs_to_api_kwargs(
method call (line 391) | def call(self, api_kwargs: Dict = {}, model_type: ModelType = ModelTyp...
method acall (line 498) | async def acall(
method from_dict (line 614) | def from_dict(cls, data: Dict[str, Any]):
method to_dict (line 618) | def to_dict(self) -> Dict[str, Any]:
method __getstate__ (line 627) | def __getstate__(self):
method __setstate__ (line 640) | def __setstate__(self, state):
class DashScopeEmbedder (line 651) | class DashScopeEmbedder(DataComponent):
method __init__ (line 665) | def __init__(
method call (line 687) | def call(
method acall (line 707) | async def acall(
method _compose_model_kwargs (line 732) | def _compose_model_kwargs(self, **model_kwargs) -> Dict[str, object]:
class DashScopeBatchEmbedder (line 736) | class DashScopeBatchEmbedder(DataComponent):
method __init__ (line 739) | def __init__(self, embedder, batch_size: int = 100, embedding_cache_fi...
method call (line 748) | def call(
method __call__ (line 827) | def __call__(self, input: BatchEmbedderInputType, model_kwargs: Option...
class DashScopeToEmbeddings (line 834) | class DashScopeToEmbeddings(DataComponent):
method __init__ (line 837) | def __init__(self, embedder, batch_size: int = 100, force_recreate_db:...
method __call__ (line 844) | def __call__(self, input: List[Document]) -> List[Document]:
method _extra_repr (line 928) | def _extra_repr(self) -> str:
FILE: api/data_pipeline.py
function count_tokens (line 27) | def count_tokens(text: str, embedder_type: str = None, is_ollama_embedde...
function download_repo (line 72) | def download_repo(repo_url: str, local_path: str, repo_type: str = None,...
function read_all_documents (line 153) | def read_all_documents(path: str, embedder_type: str = None, is_ollama_e...
function prepare_data_pipeline (line 382) | def prepare_data_pipeline(embedder_type: str = None, is_ollama_embedder:...
function transform_documents_and_save_to_db (line 426) | def transform_documents_and_save_to_db(
function get_github_file_content (line 452) | def get_github_file_content(repo_url: str, file_path: str, access_token:...
function get_gitlab_file_content (line 529) | def get_gitlab_file_content(repo_url: str, file_path: str, access_token:...
function get_bitbucket_file_content (line 611) | def get_bitbucket_file_content(repo_url: str, file_path: str, access_tok...
function get_file_content (line 687) | def get_file_content(repo_url: str, file_path: str, repo_type: str = Non...
class DatabaseManager (line 712) | class DatabaseManager:
method __init__ (line 717) | def __init__(self):
method prepare_database (line 722) | def prepare_database(self, repo_url_or_path: str, repo_type: str = Non...
method reset_database (line 754) | def reset_database(self):
method _extract_repo_name_from_url (line 762) | def _extract_repo_name_from_url(self, repo_url_or_path: str, repo_type...
method _create_repo (line 777) | def _create_repo(self, repo_url_or_path: str, repo_type: str = None, a...
method prepare_db_index (line 831) | def prepare_db_index(self, embedder_type: str = None, is_ollama_embedd...
method prepare_retriever (line 915) | def prepare_retriever(self, repo_url_or_path: str, repo_type: str = No...
FILE: api/google_embedder_client.py
class GoogleEmbedderClient (line 20) | class GoogleEmbedderClient(ModelClient):
method __init__ (line 53) | def __init__(
method _initialize_client (line 69) | def _initialize_client(self):
method parse_embedding_response (line 78) | def parse_embedding_response(self, response) -> EmbedderOutput:
method convert_inputs_to_api_kwargs (line 161) | def convert_inputs_to_api_kwargs(
method call (line 211) | def call(self, api_kwargs: Dict = {}, model_type: ModelType = ModelTyp...
method acall (line 255) | async def acall(self, api_kwargs: Dict = {}, model_type: ModelType = M...
FILE: api/logging_config.py
class IgnoreLogChangeDetectedFilter (line 7) | class IgnoreLogChangeDetectedFilter(logging.Filter):
method filter (line 8) | def filter(self, record: logging.LogRecord):
function setup_logging (line 12) | def setup_logging(format: str = None):
FILE: api/main.py
function patched_watch (line 30) | def patched_watch(*args, **kwargs):
FILE: api/ollama_patch.py
class OllamaModelNotFoundError (line 17) | class OllamaModelNotFoundError(Exception):
function check_ollama_model_exists (line 21) | def check_ollama_model_exists(model_name: str, ollama_host: str = None) ...
class OllamaDocumentProcessor (line 62) | class OllamaDocumentProcessor(DataComponent):
method __init__ (line 67) | def __init__(self, embedder: adal.Embedder) -> None:
method __call__ (line 71) | def __call__(self, documents: Sequence[Document]) -> Sequence[Document]:
FILE: api/openai_client.py
function get_first_message_content (line 58) | def get_first_message_content(completion: ChatCompletion) -> str:
function estimate_token_count (line 70) | def estimate_token_count(text: str) -> int:
function parse_stream_response (line 87) | def parse_stream_response(completion: ChatCompletionChunk) -> str:
function handle_streaming_response (line 92) | def handle_streaming_response(generator: Stream[ChatCompletionChunk]):
function get_all_messages_content (line 100) | def get_all_messages_content(completion: ChatCompletion) -> List[str]:
function get_probabilities (line 105) | def get_probabilities(completion: ChatCompletion) -> List[List[TokenLogP...
class OpenAIClient (line 120) | class OpenAIClient(ModelClient):
method __init__ (line 161) | def __init__(
method init_sync_client (line 190) | def init_sync_client(self):
method init_async_client (line 198) | def init_async_client(self):
method parse_chat_completion (line 218) | def parse_chat_completion(
method track_completion_usage (line 239) | def track_completion_usage(
method parse_embedding_response (line 257) | def parse_embedding_response(
method convert_inputs_to_api_kwargs (line 270) | def convert_inputs_to_api_kwargs(
method parse_image_generation_response (line 384) | def parse_image_generation_response(self, response: List[Image]) -> Ge...
method call (line 411) | def call(self, api_kwargs: Dict = {}, model_type: ModelType = ModelTyp...
method acall (line 488) | async def acall(
method from_dict (line 521) | def from_dict(cls: type[T], data: Dict[str, Any]) -> T:
method to_dict (line 528) | def to_dict(self) -> Dict[str, Any]:
method _encode_image (line 538) | def _encode_image(self, image_path: str) -> str:
method _prepare_image_content (line 560) | def _prepare_image_content(
FILE: api/openrouter_client.py
class OpenRouterClient (line 19) | class OpenRouterClient(ModelClient):
method __init__ (line 39) | def __init__(self, *args, **kwargs) -> None:
method init_sync_client (line 45) | def init_sync_client(self):
method init_async_client (line 58) | def init_async_client(self):
method convert_inputs_to_api_kwargs (line 71) | def convert_inputs_to_api_kwargs(
method acall (line 112) | async def acall(self, api_kwargs: Dict = None, model_type: ModelType =...
method _process_completion_response (line 359) | def _process_completion_response(self, data: Dict) -> GeneratorOutput:
method _process_streaming_response (line 395) | def _process_streaming_response(self, response):
method _process_async_streaming_response (line 459) | async def _process_async_streaming_response(self, response):
FILE: api/rag.py
class UserQuery (line 15) | class UserQuery:
class AssistantResponse (line 19) | class AssistantResponse:
class DialogTurn (line 23) | class DialogTurn:
class CustomConversation (line 28) | class CustomConversation:
method __init__ (line 31) | def __init__(self):
method append_dialog_turn (line 34) | def append_dialog_turn(self, dialog_turn):
class Memory (line 51) | class Memory(adal.core.component.DataComponent):
method __init__ (line 54) | def __init__(self):
method call (line 59) | def call(self) -> Dict:
method add_dialog_turn (line 91) | def add_dialog_turn(self, user_query: str, assistant_response: str) ->...
class RAGAnswer (line 147) | class RAGAnswer(adal.DataClass):
class RAG (line 153) | class RAG(adal.Component):
method __init__ (line 157) | def __init__(self, provider="google", model=None, use_s3: bool = False...
method initialize_db_manager (line 246) | def initialize_db_manager(self):
method _validate_and_filter_embeddings (line 251) | def _validate_and_filter_embeddings(self, documents: List) -> List:
method prepare_retriever (line 345) | def prepare_retriever(self, repo_url_or_path: str, type: str = "github...
method call (line 416) | def call(self, query: str, language: str = "en") -> Tuple[List]:
FILE: api/simple_chat.py
class ChatMessage (line 52) | class ChatMessage(BaseModel):
class ChatCompletionRequest (line 56) | class ChatCompletionRequest(BaseModel):
function chat_completions_stream (line 77) | async def chat_completions_stream(request: ChatCompletionRequest):
function root (line 749) | async def root():
FILE: api/tools/embedder.py
function get_embedder (line 6) | def get_embedder(is_local_ollama: bool = False, use_google_embedder: boo...
FILE: api/websocket_wiki.py
class ChatMessage (line 36) | class ChatMessage(BaseModel):
class ChatCompletionRequest (line 40) | class ChatCompletionRequest(BaseModel):
function handle_websocket_chat (line 63) | async def handle_websocket_chat(websocket: WebSocket):
FILE: next.config.ts
constant TARGET_SERVER_BASE_URL (line 3) | const TARGET_SERVER_BASE_URL = process.env.SERVER_BASE_URL || 'http://lo...
method rewrites (line 36) | async rewrites() {
FILE: src/app/[owner]/[repo]/page.tsx
type WikiSection (line 19) | interface WikiSection {
type WikiPage (line 26) | interface WikiPage {
type WikiStructure (line 38) | interface WikiStructure {
function RepoWikiPage (line 177) | function RepoWikiPage() {
FILE: src/app/[owner]/[repo]/slides/page.tsx
type Slide (line 38) | interface Slide {
function SlidesPage (line 45) | function SlidesPage() {
FILE: src/app/[owner]/[repo]/workshop/page.tsx
function WorkshopPage (line 39) | function WorkshopPage() {
FILE: src/app/api/auth/status/route.ts
constant TARGET_SERVER_BASE_URL (line 3) | const TARGET_SERVER_BASE_URL = process.env.SERVER_BASE_URL || 'http://lo...
function GET (line 5) | async function GET() {
FILE: src/app/api/auth/validate/route.ts
constant TARGET_SERVER_BASE_URL (line 3) | const TARGET_SERVER_BASE_URL = process.env.SERVER_BASE_URL || 'http://lo...
function POST (line 5) | async function POST(request: NextRequest) {
FILE: src/app/api/chat/stream/route.ts
constant TARGET_SERVER_BASE_URL (line 5) | const TARGET_SERVER_BASE_URL = process.env.SERVER_BASE_URL || 'http://lo...
function POST (line 9) | async function POST(req: NextRequest) {
function OPTIONS (line 104) | async function OPTIONS() {
FILE: src/app/api/models/config/route.ts
constant TARGET_SERVER_BASE_URL (line 4) | const TARGET_SERVER_BASE_URL = process.env.SERVER_BASE_URL || 'http://lo...
function GET (line 6) | async function GET() {
function OPTIONS (line 39) | function OPTIONS() {
FILE: src/app/api/wiki/projects/route.ts
type ApiProcessedProject (line 4) | interface ApiProcessedProject {
type DeleteProjectCachePayload (line 14) | interface DeleteProjectCachePayload {
function isDeleteProjectCachePayload (line 22) | function isDeleteProjectCachePayload(obj: unknown): obj is DeleteProject...
constant PYTHON_BACKEND_URL (line 34) | const PYTHON_BACKEND_URL = process.env.PYTHON_BACKEND_HOST || 'http://lo...
constant PROJECTS_API_ENDPOINT (line 35) | const PROJECTS_API_ENDPOINT = `${PYTHON_BACKEND_URL}/api/processed_proje...
constant CACHE_API_ENDPOINT (line 36) | const CACHE_API_ENDPOINT = `${PYTHON_BACKEND_URL}/api/wiki_cache`;
function GET (line 38) | async function GET() {
function DELETE (line 75) | async function DELETE(request: Request) {
FILE: src/app/layout.tsx
function RootLayout (line 11) | function RootLayout({
FILE: src/app/page.tsx
constant DEMO_FLOW_CHART (line 17) | const DEMO_FLOW_CHART = `graph TD
constant DEMO_SEQUENCE_CHART (line 31) | const DEMO_SEQUENCE_CHART = `sequenceDiagram
function Home (line 45) | function Home() {
FILE: src/app/wiki/projects/page.tsx
function WikiProjectsPage (line 7) | function WikiProjectsPage() {
FILE: src/components/Ask.tsx
type Model (line 12) | interface Model {
type Provider (line 17) | interface Provider {
type Message (line 24) | interface Message {
type ResearchStage (line 29) | interface ResearchStage {
type AskProps (line 36) | interface AskProps {
FILE: src/components/ConfigurationModal.tsx
type ConfigurationModalProps (line 8) | interface ConfigurationModalProps {
function ConfigurationModal (line 63) | function ConfigurationModal({
FILE: src/components/Markdown.tsx
type MarkdownProps (line 9) | interface MarkdownProps {
method p (line 16) | p({ children, ...props }: { children?: React.ReactNode }) {
method h1 (line 19) | h1({ children, ...props }: { children?: React.ReactNode }) {
method h2 (line 22) | h2({ children, ...props }: { children?: React.ReactNode }) {
method h3 (line 45) | h3({ children, ...props }: { children?: React.ReactNode }) {
method h4 (line 48) | h4({ children, ...props }: { children?: React.ReactNode }) {
method ul (line 51) | ul({ children, ...props }: { children?: React.ReactNode }) {
method ol (line 54) | ol({ children, ...props }: { children?: React.ReactNode }) {
method li (line 57) | li({ children, ...props }: { children?: React.ReactNode }) {
method a (line 60) | a({ children, href, ...props }: { children?: React.ReactNode; href?: str...
method blockquote (line 73) | blockquote({ children, ...props }: { children?: React.ReactNode }) {
method table (line 83) | table({ children, ...props }: { children?: React.ReactNode }) {
method thead (line 92) | thead({ children, ...props }: { children?: React.ReactNode }) {
method tbody (line 95) | tbody({ children, ...props }: { children?: React.ReactNode }) {
method tr (line 98) | tr({ children, ...props }: { children?: React.ReactNode }) {
method th (line 101) | th({ children, ...props }: { children?: React.ReactNode }) {
method td (line 111) | td({ children, ...props }: { children?: React.ReactNode }) {
method code (line 114) | code(props: {
FILE: src/components/Mermaid.tsx
type MermaidProps (line 172) | interface MermaidProps {
FILE: src/components/ModelSelectionModal.tsx
type ModelSelectionModalProps (line 9) | interface ModelSelectionModalProps {
function ModelSelectionModal (line 48) | function ModelSelectionModal({
FILE: src/components/ProcessedProjects.tsx
type ProcessedProject (line 8) | interface ProcessedProject {
type ProcessedProjectsProps (line 18) | interface ProcessedProjectsProps {
function ProcessedProjects (line 25) | function ProcessedProjects({
FILE: src/components/TokenInput.tsx
type TokenInputProps (line 6) | interface TokenInputProps {
function TokenInput (line 16) | function TokenInput({
FILE: src/components/UserSelector.tsx
type Model (line 7) | interface Model {
type Provider (line 12) | interface Provider {
type ModelConfig (line 19) | interface ModelConfig {
type ModelSelectorProps (line 24) | interface ModelSelectorProps {
function UserSelector (line 46) | function UserSelector({
FILE: src/components/WikiTreeView.tsx
type WikiPage (line 7) | interface WikiPage {
type WikiSection (line 19) | interface WikiSection {
type WikiStructure (line 26) | interface WikiStructure {
type WikiTreeViewProps (line 35) | interface WikiTreeViewProps {
FILE: src/components/WikiTypeSelector.tsx
type WikiTypeSelectorProps (line 7) | interface WikiTypeSelectorProps {
FILE: src/components/theme-toggle.tsx
function ThemeToggle (line 5) | function ThemeToggle() {
FILE: src/contexts/LanguageContext.tsx
type Messages (line 7) | type Messages = Record<string, any>;
type LanguageContextType (line 8) | type LanguageContextType = {
function LanguageProvider (line 17) | function LanguageProvider({ children }: { children: ReactNode }) {
function useLanguage (line 196) | function useLanguage() {
FILE: src/hooks/useProcessedProjects.ts
type ProcessedProject (line 3) | interface ProcessedProject {
function useProcessedProjects (line 13) | function useProcessedProjects() {
FILE: src/types/repoinfo.tsx
type RepoInfo (line 1) | interface RepoInfo {
FILE: src/types/wiki/wikipage.tsx
type WikiPage (line 2) | interface WikiPage {
FILE: src/types/wiki/wikistructure.tsx
type WikiStructure (line 6) | interface WikiStructure {
FILE: src/utils/getRepoUrl.tsx
function getRepoUrl (line 3) | function getRepoUrl(repoInfo: RepoInfo): string {
FILE: src/utils/urlDecoder.tsx
function extractUrlDomain (line 1) | function extractUrlDomain(input: string): string | null {
function extractUrlPath (line 11) | function extractUrlPath(input: string): string | null {
FILE: src/utils/websocketClient.ts
constant SERVER_BASE_URL (line 7) | const SERVER_BASE_URL = process.env.SERVER_BASE_URL || 'http://localhost...
type ChatMessage (line 17) | interface ChatMessage {
type ChatCompletionRequest (line 22) | interface ChatCompletionRequest {
FILE: test/test_extract_repo_name.py
class TestExtractRepoNameFromUrl (line 21) | class TestExtractRepoNameFromUrl:
method setup_method (line 24) | def setup_method(self):
method test_extract_repo_name_github_standard_url (line 28) | def test_extract_repo_name_github_standard_url(self):
method test_extract_repo_name_gitlab_urls (line 47) | def test_extract_repo_name_gitlab_urls(self):
method test_extract_repo_name_bitbucket_urls (line 62) | def test_extract_repo_name_bitbucket_urls(self):
method test_extract_repo_name_local_paths (line 70) | def test_extract_repo_name_local_paths(self):
method test_extract_repo_name_current_implementation_bug (line 80) | def test_extract_repo_name_current_implementation_bug(self):
method test_extract_repo_name_edge_cases (line 105) | def test_extract_repo_name_edge_cases(self):
FILE: tests/api/test_api.py
function test_streaming_endpoint (line 5) | def test_streaming_endpoint(repo_url, query, file_path=None):
FILE: tests/integration/test_full_integration.py
function test_config_loading (line 13) | def test_config_loading():
function test_embedder_selection (line 44) | def test_embedder_selection():
function test_google_embedder_with_env (line 73) | def test_google_embedder_with_env():
function main (line 116) | def main():
FILE: tests/run_tests.py
function run_test_file (line 18) | def run_test_file(test_file):
function run_tests (line 41) | def run_tests(test_dirs):
function check_environment (line 84) | def check_environment():
function main (line 128) | def main():
FILE: tests/unit/test_all_embedders.py
class TestRunner (line 26) | class TestRunner:
method __init__ (line 27) | def __init__(self):
method run_test (line 33) | def run_test(self, test_func, test_name=None):
method run_test_class (line 51) | def run_test_class(self, test_class):
method run_parametrized_test (line 61) | def run_parametrized_test(self, test_func, parameters, test_name_base=...
method summary (line 70) | def summary(self):
class TestEmbedderConfiguration (line 84) | class TestEmbedderConfiguration:
method test_config_loading (line 87) | def test_config_loading(self):
method test_embedder_type_detection (line 103) | def test_embedder_type_detection(self):
method test_get_embedder_config (line 129) | def test_get_embedder_config(self, embedder_type=None):
class TestEmbedderFactory (line 146) | class TestEmbedderFactory:
method test_get_embedder_with_explicit_type (line 149) | def test_get_embedder_with_explicit_type(self):
method test_get_embedder_with_legacy_params (line 176) | def test_get_embedder_with_legacy_params(self):
method test_get_embedder_auto_detection (line 191) | def test_get_embedder_auto_detection(self):
class TestEmbedderClients (line 200) | class TestEmbedderClients:
method test_google_embedder_client (line 203) | def test_google_embedder_client(self):
method test_openai_embedder_via_adalflow (line 230) | def test_openai_embedder_via_adalflow(self):
class TestDataPipelineFunctions (line 251) | class TestDataPipelineFunctions:
method test_count_tokens (line 254) | def test_count_tokens(self, embedder_type=None):
method test_prepare_data_pipeline (line 272) | def test_prepare_data_pipeline(self, is_ollama=None):
class TestRAGIntegration (line 295) | class TestRAGIntegration:
method test_rag_initialization (line 298) | def test_rag_initialization(self):
method test_rag_embedder_type_detection (line 311) | def test_rag_embedder_type_detection(self):
class TestEnvironmentVariableHandling (line 324) | class TestEnvironmentVariableHandling:
method test_embedder_type_env_var (line 327) | def test_embedder_type_env_var(self, embedder_type=None):
method _test_single_embedder_type (line 340) | def _test_single_embedder_type(self, embedder_type):
class TestIssuesIdentified (line 371) | class TestIssuesIdentified:
method test_binary_assumptions_in_rag (line 374) | def test_binary_assumptions_in_rag(self):
method test_binary_assumptions_in_data_pipeline (line 392) | def test_binary_assumptions_in_data_pipeline(self):
function run_all_tests (line 417) | def run_all_tests():
FILE: tests/unit/test_google_embedder.py
function test_google_embedder_client (line 23) | def test_google_embedder_client():
function test_adalflow_embedder (line 76) | def test_adalflow_embedder():
function test_document_processing (line 111) | def test_document_processing():
function main (line 158) | def main():
Condensed preview — 109 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (1,097K chars).
[
{
"path": ".dockerignore",
"chars": 677,
"preview": "# Git\n.git\n.gitignore\n.github\n\n# Node.js\nnode_modules\nnpm-debug.log\nyarn-debug.log\nyarn-error.log\n\n# Next.js\n.next\nout\n\n"
},
{
"path": ".github/workflows/docker-build-push.yml",
"chars": 5838,
"preview": "name: Build and Push Docker Image\n\non:\n push:\n branches: [ main ]\n pull_request:\n branches: [ main ]\n # Allow m"
},
{
"path": ".gitignore",
"chars": 726,
"preview": "# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.\n\n# dependencies\n/node_modules\n/.pn"
},
{
"path": ".python-version",
"chars": 5,
"preview": "3.12\n"
},
{
"path": ".vscode/launch.json",
"chars": 414,
"preview": "{\n \"version\": \"0.2.0\",\n \"configurations\": [\n {\n \"name\": \"Deepwiki-Open\",\n \"type\": \"py"
},
{
"path": "Dockerfile",
"chars": 3844,
"preview": "# syntax=docker/dockerfile:1-labs\n\n# Build argument for custom certificates directory\nARG CUSTOM_CERT_DIR=\"certs\"\n\nFROM "
},
{
"path": "Dockerfile-ollama-local",
"chars": 4098,
"preview": "# syntax=docker/dockerfile:1-labs\n\nFROM node:20-alpine AS node_base\n\nFROM node_base AS node_deps\nWORKDIR /app\nCOPY packa"
},
{
"path": "LICENSE",
"chars": 1066,
"preview": "MIT License\n\nCopyright (c) 2024 Sheing Ng\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\n"
},
{
"path": "Ollama-instruction.md",
"chars": 6240,
"preview": "# Using DeepWiki with Ollama: Beginner's Guide\n\nDeepWiki supports local AI models through Ollama, which is perfect if yo"
},
{
"path": "README.es.md",
"chars": 15902,
"preview": "# DeepWiki-Open\n\n\n\n**DeepWiki** crea automáticamente wikis hermosas e int"
},
{
"path": "README.fr.md",
"chars": 29188,
"preview": "\n# DeepWiki-Open\n\n\n\n**DeepWiki** est ma propre tentative d’implémentation "
},
{
"path": "README.ja.md",
"chars": 13280,
"preview": "# DeepWiki-Open\n\n\n\n**DeepWiki**は、GitHub、GitLab、または Bitbucket リポジトリのための美しくインタラクテ"
},
{
"path": "README.kr.md",
"chars": 11835,
"preview": "# DeepWiki-Open\n\n\n\n**DeepWiki**는 제가 직접 구현한 프로젝트로, GitHub, GitLab 또는 BitBucke"
},
{
"path": "README.md",
"chars": 30464,
"preview": "\n### ⚠️ Announcement: Shifting focus to AsyncReview\n---\n\n**IMPORTANT UPDATE** DeepWiki-Open maintenance is ongoing, but "
},
{
"path": "README.pt-br.md",
"chars": 24676,
"preview": "# DeepWiki-Open\n\n\n\n**DeepWiki** é minha própria tentativa de implementação d"
},
{
"path": "README.ru.md",
"chars": 17840,
"preview": "# DeepWiki-Open\n\n\n\n**DeepWiki** — это моя собственная реализация DeepWiki, а"
},
{
"path": "README.vi.md",
"chars": 16686,
"preview": "# DeepWiki-Open\n\n\n\n**Open DeepWiki** là 1 triển khai thay thế cho DeepWiki, "
},
{
"path": "README.zh-tw.md",
"chars": 15400,
"preview": "# DeepWiki-Open\n\n\n\n**DeepWiki** 可以為任何 GitHub、GitLab 或 BitBucket 程式碼儲存庫自動建立美觀、互動式"
},
{
"path": "README.zh.md",
"chars": 9286,
"preview": "# DeepWiki-Open\n\n\n\n**DeepWiki**可以为任何GitHub、GitLab或BitBucket代码仓库自动创建美观、交互式的Wiki!只"
},
{
"path": "api/README.md",
"chars": 6660,
"preview": "# 🚀 DeepWiki API\n\nThis is the backend API for DeepWiki, providing smart code analysis and AI-powered documentation gener"
},
{
"path": "api/__init__.py",
"chars": 49,
"preview": "# Make the api package importable\n\n# api package\n"
},
{
"path": "api/api.py",
"chars": 23680,
"preview": "import os\nimport logging\nfrom fastapi import FastAPI, HTTPException, Query, Request, WebSocket\nfrom fastapi.middleware.c"
},
{
"path": "api/azureai_client.py",
"chars": 18758,
"preview": "\"\"\"AzureOpenAI ModelClient integration.\"\"\"\n\nimport os\nfrom typing import (\n Dict,\n Sequence,\n Optional,\n Lis"
},
{
"path": "api/bedrock_client.py",
"chars": 19266,
"preview": "\"\"\"AWS Bedrock ModelClient integration.\"\"\"\n\nimport os\nimport json\nimport logging\nimport boto3\nimport botocore\nimport bac"
},
{
"path": "api/config/embedder.json",
"chars": 863,
"preview": "{\n \"embedder\": {\n \"client_class\": \"OpenAIClient\",\n \"batch_size\": 500,\n \"model_kwargs\": {\n \"model\": \"text-"
},
{
"path": "api/config/embedder.json.bak",
"chars": 346,
"preview": "{\n \"embedder\": {\n \"client_class\": \"OpenAIClient\",\n \"batch_size\": 500,\n \"model_kwargs\": {\n \"model\": \"text-"
},
{
"path": "api/config/embedder.ollama.json.bak",
"chars": 384,
"preview": "{\n \"embedder_ollama\": {\n \"client_class\": \"OllamaClient\",\n \"model_kwargs\": {\n \"model\": \"nomic-embed-text\"\n "
},
{
"path": "api/config/embedder.openai_compatible.json.bak",
"chars": 577,
"preview": "{\n \"embedder\": {\n \"client_class\": \"OpenAIClient\",\n \"initialize_kwargs\": {\n \"api_key\": \"${OPENAI_API_KEY}\",\n "
},
{
"path": "api/config/generator.json",
"chars": 4454,
"preview": "{\n \"default_provider\": \"google\",\n \"providers\": {\n \"dashscope\": {\n \"default_model\": \"qwen-plus\",\n \"support"
},
{
"path": "api/config/lang.json",
"chars": 396,
"preview": "{\n \"supported_languages\": {\n \"en\": \"English\",\n \"ja\": \"Japanese (日本語)\",\n \"zh\": \"Mandarin Chinese (中文)\",\n \"zh"
},
{
"path": "api/config/repo.json",
"chars": 2400,
"preview": "{\n \"file_filters\": {\n \"excluded_dirs\": [\n \"./.venv/\", \n \"./venv/\", \n \"./env/\", \n \"./virtualenv/\""
},
{
"path": "api/config.py",
"chars": 15361,
"preview": "import os\nimport json\nimport logging\nimport re\nfrom pathlib import Path\nfrom typing import List, Union, Dict, Any\n\nlogge"
},
{
"path": "api/dashscope_client.py",
"chars": 38880,
"preview": "\"\"\"Dashscope (Alibaba Cloud) ModelClient integration.\"\"\"\n\nimport os\nimport pickle\nfrom typing import (\n Dict,\n Opt"
},
{
"path": "api/data_pipeline.py",
"chars": 42305,
"preview": "import adalflow as adal\nfrom adalflow.core.types import Document, List\nfrom adalflow.components.data_process import Text"
},
{
"path": "api/google_embedder_client.py",
"chars": 10415,
"preview": "\"\"\"Google AI Embeddings ModelClient integration.\"\"\"\n\nimport os\nimport logging\nimport backoff\nfrom typing import Dict, An"
},
{
"path": "api/logging_config.py",
"chars": 3198,
"preview": "import logging\nimport os\nfrom pathlib import Path\nfrom logging.handlers import RotatingFileHandler\n\n\nclass IgnoreLogChan"
},
{
"path": "api/main.py",
"chars": 2689,
"preview": "import os\nimport sys\nimport logging\nfrom dotenv import load_dotenv\n\n# Load environment variables from .env file\nload_dot"
},
{
"path": "api/ollama_patch.py",
"chars": 4572,
"preview": "from typing import Sequence, List\nfrom copy import deepcopy\nfrom tqdm import tqdm\nimport logging\nimport adalflow as adal"
},
{
"path": "api/openai_client.py",
"chars": 25583,
"preview": "\"\"\"OpenAI ModelClient integration.\"\"\"\n\nimport os\nimport base64\nfrom typing import (\n Dict,\n Sequence,\n Optional"
},
{
"path": "api/openrouter_client.py",
"chars": 28702,
"preview": "\"\"\"OpenRouter ModelClient integration.\"\"\"\n\nfrom typing import Dict, Sequence, Optional, Any, List\nimport logging\nimport "
},
{
"path": "api/prompts.py",
"chars": 9182,
"preview": "\"\"\"Module containing all prompts used in the DeepWiki project.\"\"\"\n\n# System prompt for RAG\nRAG_SYSTEM_PROMPT = r\"\"\"\nYou "
},
{
"path": "api/pyproject.toml",
"chars": 894,
"preview": "[project]\nname = \"open-deepwiki-api\"\nversion = \"1.0.0\"\ndescription = \"Backend API for DeepWiki, providing smart code ana"
},
{
"path": "api/rag.py",
"chars": 19503,
"preview": "import logging\nimport weakref\nimport re\nfrom dataclasses import dataclass\nfrom typing import Any, List, Tuple, Dict\nfrom"
},
{
"path": "api/simple_chat.py",
"chars": 40035,
"preview": "import logging\nimport os\nfrom typing import List, Optional\nfrom urllib.parse import unquote\n\nimport google.generativeai "
},
{
"path": "api/tools/embedder.py",
"chars": 2336,
"preview": "import adalflow as adal\n\nfrom api.config import configs, get_embedder_type\n\n\ndef get_embedder(is_local_ollama: bool = Fa"
},
{
"path": "api/websocket_wiki.py",
"chars": 48058,
"preview": "import logging\nimport os\nfrom typing import List, Optional, Dict, Any\nfrom urllib.parse import unquote\n\nimport google.ge"
},
{
"path": "docker-compose.yml",
"chars": 922,
"preview": "services:\n deepwiki:\n build:\n context: .\n dockerfile: Dockerfile\n ports:\n - \"${PORT:-8001}:${PORT:"
},
{
"path": "eslint.config.mjs",
"chars": 393,
"preview": "import { dirname } from \"path\";\nimport { fileURLToPath } from \"url\";\nimport { FlatCompat } from \"@eslint/eslintrc\";\n\ncon"
},
{
"path": "next.config.ts",
"chars": 1816,
"preview": "import type { NextConfig } from \"next\";\n\nconst TARGET_SERVER_BASE_URL = process.env.SERVER_BASE_URL || 'http://localhost"
},
{
"path": "package.json",
"chars": 1090,
"preview": "{\n \"name\": \"deepwiki-open\",\n \"version\": \"0.1.0\",\n \"private\": true,\n \"scripts\": {\n \"dev\": \"next dev --turbopack --"
},
{
"path": "postcss.config.mjs",
"chars": 81,
"preview": "const config = {\n plugins: [\"@tailwindcss/postcss\"],\n};\n\nexport default config;\n"
},
{
"path": "pytest.ini",
"chars": 360,
"preview": "[tool:pytest]\ntestpaths = test\npython_files = test_*.py *_test.py\npython_classes = Test*\npython_functions = test_*\naddop"
},
{
"path": "run.sh",
"chars": 18,
"preview": "uv run -m api.main"
},
{
"path": "src/app/[owner]/[repo]/page.tsx",
"chars": 100167,
"preview": "/* eslint-disable @typescript-eslint/no-unused-vars */\n'use client';\n\nimport Ask from '@/components/Ask';\nimport Markdow"
},
{
"path": "src/app/[owner]/[repo]/slides/page.tsx",
"chars": 46707,
"preview": "'use client';\n\nimport React, { useCallback, useState, useEffect, useRef, useMemo } from 'react';\nimport { useParams, use"
},
{
"path": "src/app/[owner]/[repo]/workshop/page.tsx",
"chars": 24888,
"preview": "'use client';\n\nimport React, { useCallback, useState, useEffect, useRef, useMemo } from 'react';\nimport { useParams, use"
},
{
"path": "src/app/api/auth/status/route.ts",
"chars": 843,
"preview": "import { NextResponse } from \"next/server\";\n\nconst TARGET_SERVER_BASE_URL = process.env.SERVER_BASE_URL || 'http://local"
},
{
"path": "src/app/api/auth/validate/route.ts",
"chars": 958,
"preview": "import { NextRequest, NextResponse } from \"next/server\";\n\nconst TARGET_SERVER_BASE_URL = process.env.SERVER_BASE_URL || "
},
{
"path": "src/app/api/chat/stream/route.ts",
"chars": 4375,
"preview": "import { NextRequest, NextResponse } from 'next/server';\n\n// The target backend server base URL, derived from environmen"
},
{
"path": "src/app/api/models/config/route.ts",
"chars": 1488,
"preview": "import { NextResponse } from 'next/server';\n\n// The target backend server base URL, derived from environment variable or"
},
{
"path": "src/app/api/wiki/projects/route.ts",
"chars": 4369,
"preview": "import { NextResponse } from 'next/server';\n\n// This should match the expected structure from your Python backend\ninterf"
},
{
"path": "src/app/globals.css",
"chars": 6229,
"preview": "@import \"tailwindcss\";\n\n/* Define dark mode variant */\n@custom-variant dark (&:where([data-theme=\"dark\"], [data-theme=\"d"
},
{
"path": "src/app/layout.tsx",
"chars": 1105,
"preview": "import type { Metadata } from \"next\";\nimport \"./globals.css\";\nimport { ThemeProvider } from \"next-themes\";\nimport { Lang"
},
{
"path": "src/app/page.tsx",
"chars": 25089,
"preview": "'use client';\n\nimport React, { useState, useEffect } from 'react';\nimport { useRouter } from 'next/navigation';\nimport L"
},
{
"path": "src/app/wiki/projects/page.tsx",
"chars": 430,
"preview": "'use client';\n\nimport React from 'react';\nimport ProcessedProjects from '@/components/ProcessedProjects';\nimport { useLa"
},
{
"path": "src/components/Ask.tsx",
"chars": 36078,
"preview": "'use client';\n\nimport React, {useState, useRef, useEffect} from 'react';\nimport {FaChevronLeft, FaChevronRight } from 'r"
},
{
"path": "src/components/ConfigurationModal.tsx",
"chars": 12253,
"preview": "'use client';\n\nimport React, { useState } from 'react';\nimport { useLanguage } from '@/contexts/LanguageContext';\nimport"
},
{
"path": "src/components/Markdown.tsx",
"chars": 8025,
"preview": "import React from 'react';\nimport ReactMarkdown from 'react-markdown';\nimport remarkGfm from 'remark-gfm';\nimport rehype"
},
{
"path": "src/components/Mermaid.tsx",
"chars": 16174,
"preview": "import React, { useEffect, useRef, useState } from 'react';\nimport mermaid from 'mermaid';\n// We'll use dynamic import f"
},
{
"path": "src/components/ModelSelectionModal.tsx",
"chars": 10755,
"preview": "'use client';\n\nimport React, {useEffect, useState} from 'react';\nimport {useLanguage} from '@/contexts/LanguageContext';"
},
{
"path": "src/components/ProcessedProjects.tsx",
"chars": 10734,
"preview": "'use client';\n\nimport React, { useState, useEffect, useMemo } from 'react';\nimport Link from 'next/link';\nimport { FaTim"
},
{
"path": "src/components/TokenInput.tsx",
"chars": 5068,
"preview": "'use client';\n\nimport React from 'react';\nimport { useLanguage } from '@/contexts/LanguageContext';\n\ninterface TokenInpu"
},
{
"path": "src/components/UserSelector.tsx",
"chars": 18226,
"preview": "'use client';\n\nimport React, { useState, useEffect } from 'react';\nimport { useLanguage } from '@/contexts/LanguageConte"
},
{
"path": "src/components/WikiTreeView.tsx",
"chars": 6183,
"preview": "'use client';\n\nimport React, { useState } from 'react';\nimport { FaChevronRight, FaChevronDown } from 'react-icons/fa';\n"
},
{
"path": "src/components/WikiTypeSelector.tsx",
"chars": 3167,
"preview": "'use client';\n\nimport React from 'react';\nimport { useLanguage } from '@/contexts/LanguageContext';\nimport { FaBookOpen,"
},
{
"path": "src/components/theme-toggle.tsx",
"chars": 2466,
"preview": "\"use client\";\n\nimport { useTheme } from \"next-themes\";\n\nexport default function ThemeToggle() {\n const { theme, setThem"
},
{
"path": "src/contexts/LanguageContext.tsx",
"chars": 7419,
"preview": "/* eslint-disable @typescript-eslint/no-explicit-any */\n'use client';\n\nimport React, { createContext, useContext, useSta"
},
{
"path": "src/hooks/useProcessedProjects.ts",
"chars": 1260,
"preview": "import { useState, useEffect } from 'react';\n\ninterface ProcessedProject {\n id: string;\n owner: string;\n repo: string"
},
{
"path": "src/i18n.ts",
"chars": 482,
"preview": "import { getRequestConfig } from 'next-intl/server';\n\n// Define the list of supported locales\nexport const locales = ['e"
},
{
"path": "src/messages/en.json",
"chars": 6769,
"preview": "{\n \"common\": {\n \"appName\": \"DeepWiki-Open\",\n \"tagline\": \"AI-powered documentation\",\n \"generateWiki\": \"Generate"
},
{
"path": "src/messages/es.json",
"chars": 6815,
"preview": "{\n \"common\": {\n \"appName\": \"DeepWiki-Open\",\n \"tagline\": \"Documentación impulsada por IA\",\n \"generateWiki\": \"Ge"
},
{
"path": "src/messages/fr.json",
"chars": 7776,
"preview": "{\n \"common\": {\n \"appName\": \"DeepWiki-Open\",\n \"tagline\": \"Documentation propulsée par l’IA\",\n \"generate"
},
{
"path": "src/messages/ja.json",
"chars": 4808,
"preview": "{\n \"common\": {\n \"appName\": \"DeepWiki-Open\",\n \"tagline\": \"AI駆動のドキュメンテーション\",\n \"generateWiki\": \"Wikiを生成\",\n \"pr"
},
{
"path": "src/messages/kr.json",
"chars": 5052,
"preview": "{\n \"common\": {\n \"appName\": \"DeepWiki-Open\",\n \"tagline\": \"AI 기반 문서화\",\n \"generateWiki\": \"위키 생성\",\n \""
},
{
"path": "src/messages/pt-br.json",
"chars": 7257,
"preview": "{\n \"common\": {\n \"appName\": \"DeepWiki-Open\",\n \"tagline\": \"Documentação com IA\",\n \"generateWiki\": \"Gerar Wiki\",\n"
},
{
"path": "src/messages/ru.json",
"chars": 7126,
"preview": "{\n \"common\": {\n \"appName\": \"DeepWiki-Open\",\n \"tagline\": \"Документация с поддержкой ИИ\",\n \"generateWiki\": \"Созд"
},
{
"path": "src/messages/vi.json",
"chars": 6257,
"preview": "{\n \"common\": {\n \"appName\": \"DeepWiki-Open\",\n \"tagline\": \"Tài liệu hỗ trợ bởi AI\",\n \"generateWiki\": \"Tạo Wiki\","
},
{
"path": "src/messages/zh-tw.json",
"chars": 4268,
"preview": "{\n \"common\": {\n \"appName\": \"DeepWiki-Open\",\n \"tagline\": \"AI 驅動的文件\",\n \"generateWiki\": \"產生 Wiki\",\n \"processin"
},
{
"path": "src/messages/zh.json",
"chars": 4279,
"preview": "{\n \"common\": {\n \"appName\": \"DeepWiki-Open\",\n \"tagline\": \"AI驱动的文档\",\n \"generateWiki\": \"生成Wiki\",\n \"processing\""
},
{
"path": "src/types/repoinfo.tsx",
"chars": 194,
"preview": "export interface RepoInfo {\n owner: string;\n repo: string;\n type: string;\n token: string | null;\n localPa"
},
{
"path": "src/types/wiki/wikipage.tsx",
"chars": 307,
"preview": "// Wiki Interfaces\nexport interface WikiPage {\n id: string;\n title: string;\n content: string;\n filePaths: string[];\n"
},
{
"path": "src/types/wiki/wikistructure.tsx",
"chars": 247,
"preview": "import { WikiPage } from \"./wikipage\";\n\n/**\n * @fileoverview This file defines the structure of a wiki page and its sect"
},
{
"path": "src/utils/getRepoUrl.tsx",
"chars": 470,
"preview": "import RepoInfo from \"@/types/repoinfo\";\n\nexport default function getRepoUrl(repoInfo: RepoInfo): string {\n console.log"
},
{
"path": "src/utils/urlDecoder.tsx",
"chars": 751,
"preview": "export function extractUrlDomain(input: string): string | null {\n try {\n const normalizedInput = input.startsW"
},
{
"path": "src/utils/websocketClient.ts",
"chars": 2164,
"preview": "/**\n * WebSocket client for chat completions\n * This replaces the HTTP streaming endpoint with a WebSocket connection\n *"
},
{
"path": "tailwind.config.js",
"chars": 197,
"preview": "module.exports = {\n darkMode: 'selector',\n content: [\n './src/pages/**/*.{js,ts,jsx,tsx,mdx}',\n './src/component"
},
{
"path": "test/__init__.py",
"chars": 47,
"preview": "# Test package for deepwiki-open data pipeline\n"
},
{
"path": "test/test_extract_repo_name.py",
"chars": 4843,
"preview": "#!/usr/bin/env python3\n\"\"\"\nFocused test script for the _extract_repo_name_from_url method\n\nRun this script to test only "
},
{
"path": "tests/README.md",
"chars": 3571,
"preview": "# DeepWiki Tests\n\nThis directory contains all tests for the DeepWiki project, organized by type and scope.\n\n## Directory"
},
{
"path": "tests/__init__.py",
"chars": 20,
"preview": "# Tests for DeepWiki"
},
{
"path": "tests/api/__init__.py",
"chars": 11,
"preview": "# API tests"
},
{
"path": "tests/api/test_api.py",
"chars": 2123,
"preview": "import requests\nimport json\nimport sys\n\ndef test_streaming_endpoint(repo_url, query, file_path=None):\n \"\"\"\n Test t"
},
{
"path": "tests/integration/__init__.py",
"chars": 19,
"preview": "# Integration tests"
},
{
"path": "tests/integration/test_full_integration.py",
"chars": 4818,
"preview": "#!/usr/bin/env python3\n\"\"\"Full integration test for Google AI embeddings.\"\"\"\n\nimport os\nimport sys\nimport json\nfrom path"
},
{
"path": "tests/run_tests.py",
"chars": 5134,
"preview": "#!/usr/bin/env python3\n\"\"\"\nTest runner for DeepWiki project.\n\nThis script provides a unified way to run all tests or spe"
},
{
"path": "tests/unit/__init__.py",
"chars": 12,
"preview": "# Unit tests"
},
{
"path": "tests/unit/test_all_embedders.py",
"chars": 20256,
"preview": "#!/usr/bin/env python3\n\"\"\"\nComprehensive test suite for all embedder types (OpenAI, Google, Ollama).\nThis test file vali"
},
{
"path": "tests/unit/test_google_embedder.py",
"chars": 6627,
"preview": "#!/usr/bin/env python3\n\"\"\"\nTest script to reproduce and fix Google embedder 'list' object has no attribute 'embedding' e"
},
{
"path": "tsconfig.json",
"chars": 602,
"preview": "{\n \"compilerOptions\": {\n \"target\": \"ES2017\",\n \"lib\": [\"dom\", \"dom.iterable\", \"esnext\"],\n \"allowJs\": true,\n "
}
]
About this extraction
This page contains the full source code of the AsyncFuncAI/deepwiki-open GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 109 files (1.0 MB), approximately 252.7k tokens, and a symbol index with 335 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.