diff --git a/docker/.env.example b/.devcontainer/.env.example similarity index 100% rename from docker/.env.example rename to .devcontainer/.env.example diff --git a/docker/Dockerfile b/.devcontainer/Dockerfile_v1 similarity index 100% rename from docker/Dockerfile rename to .devcontainer/Dockerfile_v1 diff --git a/.devcontainer/devcontainer.env b/.devcontainer/devcontainer.env new file mode 100644 index 0000000..6335e10 --- /dev/null +++ b/.devcontainer/devcontainer.env @@ -0,0 +1,8 @@ +ELASTICSEARCH_URL=http://host.docker.internal:9200 +DATABASE_URL=postgresql://postgres:brunix_pass@host.docker.internal:5432/postgres + +LANGFUSE_HOST=http://45.77.119.180 +LANGFUSE_PUBLIC_KEY=pk-lf-0e6db694-3e95-4dd4-aedf-5a2694267058 +LANGFUSE_SECRET_KEY=sk-lf-dbf28bb9-15bb-4d03-a8c3-05caa3e3905f +LLM_BASE_URL=http://host.docker.internal:11434 +OPENAI_API_KEY=MTswYuNlhhRLLw7EGSAz_ID9qeELinoB9x4zF8qVyQo4T3BlbkFJvS3HrA3Rqr0CtlET442uQ1nEiJtWD \ No newline at end of file diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 0000000..2cac9d9 --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,30 @@ +{ + "name": "brunix-assistance-engine", + "build": { + "dockerfile": "Dockerfile", + "dockerComposeFile": "docker-compose.yaml", + "context": "../" + }, + "runArgs": [ + "-p", + "50052:50051", + "--env-file", + ".devcontainer/devcontainer.env", + "--add-host", + "host.docker.internal:host-gateway" + ], + "customizations": { + "vscode": { + "extensions": [ + "quarto.quarto", + "ms-azuretools.vscode-docker", + "ms-python.python", + "ms-vscode-remote.remote-containers", + "yzhang.markdown-all-in-one", + "redhat.vscode-yaml", + "ms-toolsai.jupyter", + "hediet.vscode-drawio" + ] + } + } +} \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..240cf50 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,30 @@ +FROM python:3.11-slim + +ENV PYTHONDONTWRITEBYTECODE=1 +ENV PYTHONUNBUFFERED=1 + +WORKDIR /app + +COPY ./requirements.txt . + +RUN apt-get update && apt-get install -y --no-install-recommends \ + build-essential \ + curl \ + protobuf-compiler \ + && rm -rf /var/lib/apt/lists/* + +RUN pip install --no-cache-dir --upgrade pip +RUN pip install --no-cache-dir -r requirements.txt + +COPY ./protos ./protos +COPY ./src ./src + +RUN python -m grpc_tools.protoc \ + --proto_path=./protos \ + --python_out=./src \ + --grpc_python_out=./src \ + ./protos/brunix.proto + +EXPOSE 50051 + +CMD ["python", "src/server.py"] \ No newline at end of file diff --git a/docker/docker-compose.yaml b/docker-compose.yaml similarity index 100% rename from docker/docker-compose.yaml rename to docker-compose.yaml diff --git a/docker/protos/brunix.proto b/protos/brunix.proto similarity index 100% rename from docker/protos/brunix.proto rename to protos/brunix.proto diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..3f512f1 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,207 @@ +# This file was autogenerated by uv via the following command: +# uv export --format requirements-txt --no-hashes --no-dev -o requirements.txt +aiohappyeyeballs==2.6.1 + # via aiohttp +aiohttp==3.13.3 + # via langchain-community +aiosignal==1.4.0 + # via aiohttp +annotated-types==0.7.0 + # via pydantic +anyio==4.12.1 + # via httpx +attrs==25.4.0 + # via aiohttp +certifi==2026.1.4 + # via + # elastic-transport + # httpcore + # httpx + # requests +charset-normalizer==3.4.4 + # via requests +dataclasses-json==0.6.7 + # via langchain-community +elastic-transport==8.17.1 + # via elasticsearch +elasticsearch==8.19.3 + # via langchain-elasticsearch +frozenlist==1.8.0 + # via + # aiohttp + # aiosignal +greenlet==3.3.1 ; platform_machine == 'AMD64' or platform_machine == 'WIN32' or platform_machine == 'aarch64' or platform_machine == 'amd64' or platform_machine == 'ppc64le' or platform_machine == 'win32' or platform_machine == 'x86_64' + # via sqlalchemy +grpcio==1.78.0 + # via + # assistance-engine + # grpcio-reflection + # grpcio-tools +grpcio-reflection==1.78.0 + # via assistance-engine +grpcio-tools==1.78.0 + # via assistance-engine +h11==0.16.0 + # via httpcore +httpcore==1.0.9 + # via httpx +httpx==0.28.1 + # via + # langgraph-sdk + # langsmith +httpx-sse==0.4.3 + # via langchain-community +idna==3.11 + # via + # anyio + # httpx + # requests + # yarl +jsonpatch==1.33 + # via langchain-core +jsonpointer==3.0.0 + # via jsonpatch +langchain==1.2.10 + # via assistance-engine +langchain-classic==1.0.1 + # via langchain-community +langchain-community==0.4.1 + # via assistance-engine +langchain-core==1.2.12 + # via + # langchain + # langchain-classic + # langchain-community + # langchain-elasticsearch + # langchain-text-splitters + # langgraph + # langgraph-checkpoint + # langgraph-prebuilt +langchain-elasticsearch==1.0.0 + # via assistance-engine +langchain-text-splitters==1.1.0 + # via langchain-classic +langgraph==1.0.8 + # via langchain +langgraph-checkpoint==4.0.0 + # via + # langgraph + # langgraph-prebuilt +langgraph-prebuilt==1.0.7 + # via langgraph +langgraph-sdk==0.3.5 + # via langgraph +langsmith==0.7.1 + # via + # langchain-classic + # langchain-community + # langchain-core +marshmallow==3.26.2 + # via dataclasses-json +multidict==6.7.1 + # via + # aiohttp + # yarl +mypy-extensions==1.1.0 + # via typing-inspect +numpy==2.4.2 + # via + # elasticsearch + # langchain-community +orjson==3.11.7 + # via + # langgraph-sdk + # langsmith +ormsgpack==1.12.2 + # via langgraph-checkpoint +packaging==26.0 + # via + # langchain-core + # langsmith + # marshmallow +propcache==0.4.1 + # via + # aiohttp + # yarl +protobuf==6.33.5 + # via + # grpcio-reflection + # grpcio-tools +pydantic==2.12.5 + # via + # assistance-engine + # langchain + # langchain-classic + # langchain-core + # langgraph + # langsmith + # pydantic-settings +pydantic-core==2.41.5 + # via pydantic +pydantic-settings==2.12.0 + # via langchain-community +python-dateutil==2.9.0.post0 + # via elasticsearch +python-dotenv==1.2.1 + # via pydantic-settings +pyyaml==6.0.3 + # via + # langchain-classic + # langchain-community + # langchain-core +requests==2.32.5 + # via + # langchain-classic + # langchain-community + # langsmith + # requests-toolbelt +requests-toolbelt==1.0.0 + # via langsmith +setuptools==82.0.0 + # via grpcio-tools +simsimd==6.5.12 + # via elasticsearch +six==1.17.0 + # via python-dateutil +sqlalchemy==2.0.46 + # via + # langchain-classic + # langchain-community +tenacity==9.1.4 + # via + # langchain-community + # langchain-core +typing-extensions==4.15.0 + # via + # aiosignal + # anyio + # elasticsearch + # grpcio + # langchain-core + # pydantic + # pydantic-core + # sqlalchemy + # typing-inspect + # typing-inspection +typing-inspect==0.9.0 + # via dataclasses-json +typing-inspection==0.4.2 + # via + # pydantic + # pydantic-settings +urllib3==2.6.3 + # via + # elastic-transport + # requests +uuid-utils==0.14.0 + # via + # langchain-core + # langsmith +xxhash==3.6.0 + # via + # langgraph + # langsmith +yarl==1.22.0 + # via aiohttp +zstandard==0.25.0 + # via langsmith diff --git a/docker/src/server.py b/src/server.py similarity index 100% rename from docker/src/server.py rename to src/server.py