diff --git a/.github/config/morphik.toml b/.github/config/morphik.toml new file mode 100644 index 00000000..f540f88b --- /dev/null +++ b/.github/config/morphik.toml @@ -0,0 +1,88 @@ +[api] +host = "0.0.0.0" +port = 8000 +reload = true + +[auth] +jwt_algorithm = "HS256" +dev_mode = true +dev_entity_id = "dev_user" +dev_entity_type = "developer" +dev_permissions = ["read", "write", "admin"] + +[registered_models] +openai_gpt4 = { model_name = "gpt-4" } +openai_gpt4-1 = { model_name = "gpt-4.1" } +openai_gpt4o = { model_name = "gpt-4o" } +openai_embedding = { model_name = "text-embedding-3-small" } +openai_embedding_large = { model_name = "text-embedding-3-large" } + +[agent] +model = "openai_gpt4-1" + +[completion] +model = "openai_gpt4o" +default_max_tokens = "1000" +default_temperature = 0.5 + +[document_analysis] +model = "openai_gpt4-1" + +[database] +provider = "postgres" +pool_size = 10 +max_overflow = 15 +pool_recycle = 3600 +pool_timeout = 10 +pool_pre_ping = true +max_retries = 3 +retry_delay = 1.0 + +[embedding] +model = "openai_embedding" +dimensions = 1536 +similarity_metric = "cosine" + +[parser] +chunk_size = 6000 +chunk_overlap = 300 +use_unstructured_api = false +use_contextual_chunking = false +contextual_chunking_model = "openai_gpt4-1" + +[parser.vision] +model = "openai_gpt4-1" +frame_sample_rate = -1 + +[reranker] +use_reranker = true +provider = "flag" +model_name = "BAAI/bge-reranker-large" +query_max_length = 256 +passage_max_length = 512 +use_fp16 = true +device = "cpu" + +[storage] +provider = "local" +storage_path = "./storage" + +[vector_store] +provider = "pgvector" + +[rules] +model = "openai_gpt4-1" +batch_size = 4096 + +[morphik] +enable_colpali = true +mode = "self_hosted" +api_domain = "api.morphik.ai" + +[redis] +host = "redis" +port = 6379 + +[graph] +model = "openai_gpt4-1" +enable_entity_resolution = true \ No newline at end of file diff --git a/.github/workflows/docker-build.yml b/.github/workflows/docker-build.yml index 3e932555..1672487b 100644 --- a/.github/workflows/docker-build.yml +++ b/.github/workflows/docker-build.yml @@ -14,6 +14,13 @@ jobs: - name: Checkout repository uses: actions/checkout@v4 + - name: Copy Docker config + run: | + echo "Using centralized Docker config from .github/config/morphik.toml" + cp .github/config/morphik.toml morphik.toml + echo "Config file updated:" + head -10 morphik.toml + - name: Free up disk space run: | sudo rm -rf /usr/share/dotnet @@ -55,160 +62,130 @@ jobs: # Use the local test tag instead of the registry tag IMAGE_TAG="morphik-core:test" echo "Testing image: $IMAGE_TAG" - - # Create a minimal config file for testing - cat > morphik.toml.test << 'EOF' - [api] - host = "0.0.0.0" - port = 8000 - reload = true - - [auth] - jwt_algorithm = "HS256" - dev_mode = true # Enabled by default for easier local development - dev_entity_id = "dev_user" # Default dev user ID - dev_entity_type = "developer" # Default dev entity type - dev_permissions = ["read", "write", "admin"] # Default dev permissions - - #### Registered models - [registered_models] - - # OpenAI models - openai_gpt4 = { model_name = "gpt-4" } - openai_gpt4-1 = { model_name = "gpt-4.1" } - openai_gpt4o = { model_name = "gpt-4o" } - - # Embedding models - openai_embedding = { model_name = "text-embedding-3-small" } - openai_embedding_large = { model_name = "text-embedding-3-large" } - - #### Component configurations #### - - [agent] - model = "openai_gpt4-1" - - [completion] - model = "openai_gpt4o" - default_max_tokens = "1000" - default_temperature = 0.5 - - [document_analysis] - model = "openai_gpt4-1" - - [database] - provider = "postgres" - # Connection pool settings - pool_size = 10 # Maximum number of connections in the pool - max_overflow = 15 # Maximum number of connections that can be created beyond pool_size - pool_recycle = 3600 # Time in seconds after which a connection is recycled (1 hour) - pool_timeout = 10 # Seconds to wait for a connection from the pool - pool_pre_ping = true # Check connection viability before using it from the pool - max_retries = 3 # Number of retries for database operations - retry_delay = 1.0 # Initial delay between retries in seconds - - [embedding] - model = "openai_embedding" # Reference to registered model - dimensions = 1536 - similarity_metric = "cosine" - - [parser] - chunk_size = 6000 - chunk_overlap = 300 - use_unstructured_api = false - use_contextual_chunking = false - contextual_chunking_model = "openai_gpt4-1" # Reference to a key in registered_models - - [parser.vision] - model = "openai_gpt4-1" # Reference to a key in registered_models - frame_sample_rate = -1 # Set to -1 to disable frame captioning - - [reranker] - use_reranker = true - provider = "flag" - model_name = "BAAI/bge-reranker-large" - query_max_length = 256 - passage_max_length = 512 - use_fp16 = true - device = "cpu" # use "cpu" if on docker and using a mac, "cuda" if cuda enabled device - - [storage] - provider = "local" - storage_path = "./storage" - - # [storage] - # provider = "aws-s3" - # region = "us-east-2" - # bucket_name = "morphik-s3-storage" - - [vector_store] - provider = "pgvector" - - [rules] - model = "openai_gpt4-1" - batch_size = 4096 - - [morphik] - enable_colpali = true - mode = "self_hosted" # "cloud" or "self_hosted" - api_domain = "api.morphik.ai" # API domain for cloud URIs - - [redis] - host = "redis" # use "redis" for docker - port = 6379 - - [graph] - model = "openai_gpt4-1" - enable_entity_resolution = true - - # Start container in detached mode with config mounted - CONTAINER_ID=$(docker run -d -p 8000:8000 \ - -e POSTGRES_URI="postgresql://morphik:morphik@localhost:5432/morphik" \ - -v "$(pwd)/morphik.toml.test:/app/morphik.toml" \ + + # Create a custom network for the containers to communicate + NETWORK_NAME="morphik-test-network" + docker network create $NETWORK_NAME + + # Start pgvector PostgreSQL container + echo "Starting pgvector PostgreSQL container..." + DB_CONTAINER_ID=$(docker run -d \ + --name pgvector-test \ + --network $NETWORK_NAME \ + -e POSTGRES_USER=morphik \ + -e POSTGRES_PASSWORD=morphik \ + -e POSTGRES_DB=morphik \ + -p 5432:5432 \ + ankane/pgvector:latest) + + # Wait for PostgreSQL to be ready + echo "Waiting for PostgreSQL to be ready..." + for i in {1..30}; do + if docker exec $DB_CONTAINER_ID pg_isready -U morphik -d morphik; then + echo "PostgreSQL is ready!" + break + fi + if [ $i -eq 30 ]; then + echo "PostgreSQL failed to start" + docker logs $DB_CONTAINER_ID + exit 1 + fi + sleep 1 + done + + # Enable pgvector extension + echo "Enabling pgvector extension..." + docker exec $DB_CONTAINER_ID psql -U morphik -d morphik -c 'CREATE EXTENSION IF NOT EXISTS vector;' + + # Start Redis container (NOTE: must be named "redis") + echo "Starting Redis container..." + REDIS_CONTAINER_ID=$(docker run -d \ + --name redis \ + --network $NETWORK_NAME \ + -p 6379:6379 \ + -v redis_data:/data \ + redis:7-alpine \ + redis-server --appendonly yes) + + # Wait for Redis to be ready + echo "Waiting for Redis to be ready..." + for i in {1..30}; do + if docker exec $REDIS_CONTAINER_ID redis-cli ping | grep -q PONG; then + echo "Redis is ready!" + break + fi + if [ $i -eq 30 ]; then + echo "Redis failed to start" + docker logs $REDIS_CONTAINER_ID + exit 1 + fi + sleep 1 + done + + # Start application container + echo "Starting application container..." + CONTAINER_ID=$(docker run -d \ + --network $NETWORK_NAME \ + -p 8000:8000 \ + -e POSTGRES_URI="postgresql+asyncpg://morphik:morphik@pgvector-test:5432/morphik" \ + -v "$(pwd)/morphik.toml:/app/morphik.toml" \ "$IMAGE_TAG") - + echo "Started container: $CONTAINER_ID" - - # Wait for server to be ready with 60 second timeout - timeout=60 + + # Wait for server to be ready + timeout=300 # long timeout required to load checkpoint shards interval=2 elapsed=0 - + echo "Waiting for server to be ready..." while [ $elapsed -lt $timeout ]; do if curl -f -s http://localhost:8000/ping > /dev/null 2>&1; then echo "✅ Server is responding to /ping endpoint" break fi - + echo "⏳ Waiting for server... (${elapsed}s/${timeout}s)" sleep $interval elapsed=$((elapsed + interval)) done - + # Check if we timed out if [ $elapsed -ge $timeout ]; then echo "❌ Server failed to respond within ${timeout} seconds" echo "Container logs:" docker logs "$CONTAINER_ID" - docker stop "$CONTAINER_ID" - docker rm "$CONTAINER_ID" + echo "Database logs:" + docker logs "$DB_CONTAINER_ID" + echo "Redis logs:" + docker logs "$REDIS_CONTAINER_ID" + docker stop "$CONTAINER_ID" "$DB_CONTAINER_ID" "$REDIS_CONTAINER_ID" || true + docker rm -f "$CONTAINER_ID" "$DB_CONTAINER_ID" "$REDIS_CONTAINER_ID" || true + docker network rm "$NETWORK_NAME" || true + docker volume rm redis_data 2>/dev/null || true exit 1 fi - + # Verify the response is actually 200 - HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:8000/ping) - if [ "$HTTP_CODE" = "200" ]; then - echo "✅ Health check passed - /ping returned HTTP $HTTP_CODE" - else - echo "❌ Health check failed - /ping returned HTTP $HTTP_CODE" + response_code=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:8000/ping) + if [ "$response_code" -ne 200 ]; then + echo "❌ Unexpected response code: $response_code" + echo "Container logs:" docker logs "$CONTAINER_ID" - docker stop "$CONTAINER_ID" - docker rm "$CONTAINER_ID" + echo "Database logs:" + docker logs "$DB_CONTAINER_ID" + echo "Redis logs:" + docker logs "$REDIS_CONTAINER_ID" + docker stop "$CONTAINER_ID" "$DB_CONTAINER_ID" "$REDIS_CONTAINER_ID" || true + docker rm -f "$CONTAINER_ID" "$DB_CONTAINER_ID" "$REDIS_CONTAINER_ID" || true + docker network rm "$NETWORK_NAME" || true + docker volume rm redis_data 2>/dev/null || true exit 1 fi - - # Clean up - echo "🧹 Cleaning up container" - docker stop "$CONTAINER_ID" - docker rm "$CONTAINER_ID" - echo "✅ Test completed successfully" \ No newline at end of file + + echo "✅ Tests passed!" + docker stop "$CONTAINER_ID" "$DB_CONTAINER_ID" "$REDIS_CONTAINER_ID" || true + docker rm -f "$CONTAINER_ID" "$DB_CONTAINER_ID" "$REDIS_CONTAINER_ID" || true + docker network rm "$NETWORK_NAME" || true + docker volume rm redis_data 2>/dev/null || true + echo "✅ Test completed successfully" \ No newline at end of file diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml index ed7f12ed..416ef627 100644 --- a/.github/workflows/docker-publish.yml +++ b/.github/workflows/docker-publish.yml @@ -4,6 +4,8 @@ on: push: branches: - main + # we publish our own config docker image from this branch + - feat/issue-158-publish-docker-image permissions: contents: read @@ -34,6 +36,13 @@ jobs: sudo docker builder prune -a --force df -h + - name: Copy Docker config + run: | + echo "Using centralized Docker config from .github/config/morphik.toml" + cp .github/config/morphik.toml morphik.toml + echo "Config file updated:" + head -10 morphik.toml + - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 diff --git a/docker-compose.yml b/docker-compose.yml index beb6fb96..31c662a0 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -40,9 +40,8 @@ services: condition: service_healthy config-check: condition: service_completed_successfully - ollama: - condition: service_started - required: false + # ollama: + # condition: service_started networks: - morphik-network env_file: @@ -70,9 +69,8 @@ services: condition: service_healthy config-check: condition: service_completed_successfully - ollama: - condition: service_started - required: false + # ollama: + # condition: service_started networks: - morphik-network env_file: diff --git a/docker/docker-entrypoint.sh b/docker/docker-entrypoint.sh new file mode 100755 index 00000000..b4969ece --- /dev/null +++ b/docker/docker-entrypoint.sh @@ -0,0 +1,58 @@ +#!/bin/bash +set -e + +# Copy default config if none exists +if [ ! -f /app/morphik.toml ]; then + cp /app/morphik.toml.default /app/morphik.toml +fi + +# Function to check PostgreSQL +check_postgres() { + if [ -n "$POSTGRES_URI" ]; then + # Extract connection details from POSTGRES_URI, which can be + # postgresql:// or postgresql+asyncpg:// + + # Using awk for more robust URI parsing that handles special characters + eval $(./parse-postgres-uri.py "$POSTGRES_URI") + + echo "Waiting for PostgreSQL..." + max_retries=30 + retries=0 + until PGPASSWORD=$PG_PASS pg_isready -h $PG_HOST -p $PG_PORT -U $PG_USER -d $PG_DB; do + retries=$((retries + 1)) + if [ $retries -eq $max_retries ]; then + echo "Error: PostgreSQL did not become ready in time" + exit 1 + fi + echo "Waiting for PostgreSQL... (Attempt $retries/$max_retries)" + sleep 2 + done + echo "PostgreSQL is ready!" + + # Verify database connection + # NOTE: preserve stderr for debugging + if ! PGPASSWORD=$PG_PASS psql -h $PG_HOST -p $PG_PORT -U $PG_USER -d $PG_DB -c "SELECT 1"; then + echo "Error: Could not connect to PostgreSQL database" + echo "POSTGRES_URI: $POSTGRES_URI" + echo "USER: $PG_USER" + echo "PASS: $PG_PASS" + echo "HOST: $PG_HOST" + echo "PORT: $PG_PORT" + echo "DB: $PG_DB" + exit 1 + fi + echo "PostgreSQL connection verified!" + fi +} + +# Check PostgreSQL +check_postgres + +# Check if command arguments were passed ($# is the number of arguments) +if [ $# -gt 0 ]; then + # If arguments exist, execute them (e.g., execute "arq core.workers...") + exec "$@" +else + # Otherwise, execute the default command (uv run start_server.py) + exec uv run uvicorn core.api:app --host $HOST --port $PORT --loop asyncio --http auto --ws auto --lifespan auto +fi \ No newline at end of file diff --git a/docker/morphik.toml.default b/docker/morphik.toml.default new file mode 100644 index 00000000..6c7b24ee --- /dev/null +++ b/docker/morphik.toml.default @@ -0,0 +1,41 @@ +[api] +host = "0.0.0.0" +port = 8000 +reload = false + +[auth] +jwt_algorithm = "HS256" +dev_mode = true +dev_entity_id = "dev_user" +dev_entity_type = "developer" +dev_permissions = ["read", "write", "admin"] + +[completion] +provider = "ollama" +model_name = "llama2" +base_url = "http://localhost:11434" + +[database] +provider = "postgres" + +[embedding] +provider = "ollama" +model_name = "nomic-embed-text" +dimensions = 768 +similarity_metric = "cosine" +base_url = "http://localhost:11434" + +[parser] +chunk_size = 1000 +chunk_overlap = 200 +use_unstructured_api = false + +[reranker] +use_reranker = false + +[storage] +provider = "local" +storage_path = "/app/storage" + +[vector_store] +provider = "pgvector" diff --git a/docker/parse-postgres-uri.py b/docker/parse-postgres-uri.py new file mode 100755 index 00000000..29f9a39a --- /dev/null +++ b/docker/parse-postgres-uri.py @@ -0,0 +1,102 @@ +#!/usr/bin/env python3 +import re +import sys +import urllib.parse +from typing import Dict + +def parse_postgres_uri(uri: str) -> Dict[str, str]: + """Parse a PostgreSQL connection URI into its components. + + Args: + uri: The PostgreSQL connection URI (e.g., 'postgresql://user:pass@host:port/db') + + Returns: + Dictionary containing the parsed components (USER, PASS, HOST, PORT, DB) + """ + # Default values + result = { + 'USER': '', + 'PASS': '', + 'HOST': '', + 'PORT': '5432', # Default PostgreSQL port + 'DB': 'postgres' # Default database name + } + + try: + # PostgreSQL URI pattern: + # postgresql[+driver]://[user[:password]@][netloc][:port][/dbname][?param1=value1&...] + pattern = r''' + ^ + postgresql(?:\+[a-z]+)?:// # scheme with optional driver + (?:([^:/?#@]+)(?::([^/?#@]*))?@)? # user:password@ + (?:([^:/?#]+)(?::(\d+))?)? # host:port + (?:/([^?#]*))? # /dbname + (?:\?([^#]*))? # ?query + $ + ''' + + match = re.match(pattern, uri.strip(), re.VERBOSE) + if not match: + raise ValueError("Invalid PostgreSQL URI format") + + user, password, host, port, dbname, query = match.groups() + + # Handle username and password + if user: + result['USER'] = urllib.parse.unquote(user) + if password: + result['PASS'] = urllib.parse.unquote(password) + + # Handle host and port + if host: + result['HOST'] = host + if port: + result['PORT'] = port + + # Handle database name + if dbname: + result['DB'] = urllib.parse.unquote(dbname) + + # Handle query parameters (e.g., for password in query string) + if query and not result['PASS']: + for param in query.split('&'): # type: ignore + if '=' in param: + key, value = param.split('=', 1) + if key.lower() == 'password': + result['PASS'] = urllib.parse.unquote(value) + break + + except Exception as e: + # If any error occurs, print the failure message and exit + print(f"Error parsing PostgreSQL URI: {e}", file=sys.stderr) + print("POSTGRES_URI_PARSE_FAILURE=1", file=sys.stderr) + sys.exit(1) + + return result + +def main(): + if len(sys.argv) != 2: + print("Usage: eval $(parse-postgres-uri.sh \"postgresql://user:pass@host:port/db\")", file=sys.stderr) + sys.exit(1) + + # Print default empty values first (for compatibility with original script) + print('PG_USER=""') + print('PG_PASS=""') + print('PG_HOST=""') + print('PG_PORT=""') + print('PG_DB=""') + + # Parse the URI and print the results + try: + components = parse_postgres_uri(sys.argv[1]) + for key, value in components.items(): + # Escape special characters in the value for shell compatibility + escaped_value = value.replace('"', '\\"').replace('`', '\\`').replace('$', '\\$') + print(f'PG_{key}="{escaped_value}"') + except Exception as e: + print(f'Error parsing PostgreSQL URI: {e}', file=sys.stderr) + print('POSTGRES_URI_PARSE_FAILURE=1') + sys.exit(1) + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/dockerfile b/dockerfile index 0d3c9d67..39f5a97c 100644 --- a/dockerfile +++ b/dockerfile @@ -100,97 +100,12 @@ ENV PORT=8000 ENV VIRTUAL_ENV=/app/.venv ENV PATH="/app/.venv/bin:/usr/local/bin:${PATH}" -# Create default configuration -RUN echo '[api]\n\ -host = "0.0.0.0"\n\ -port = 8000\n\ -reload = false\n\ -\n\ -[auth]\n\ -jwt_algorithm = "HS256"\n\ -dev_mode = true\n\ -dev_entity_id = "dev_user"\n\ -dev_entity_type = "developer"\n\ -dev_permissions = ["read", "write", "admin"]\n\ -\n\ -[completion]\n\ -provider = "ollama"\n\ -model_name = "llama2"\n\ -base_url = "http://localhost:11434"\n\ -\n\ -[database]\n\ -provider = "postgres"\n\ -\n\ -[embedding]\n\ -provider = "ollama"\n\ -model_name = "nomic-embed-text"\n\ -dimensions = 768\n\ -similarity_metric = "cosine"\n\ -base_url = "http://localhost:11434"\n\ -\n\ -[parser]\n\ -chunk_size = 1000\n\ -chunk_overlap = 200\n\ -use_unstructured_api = false\n\ -\n\ -[reranker]\n\ -use_reranker = false\n\ -\n\ -[storage]\n\ -provider = "local"\n\ -storage_path = "/app/storage"\n\ -\n\ -[vector_store]\n\ -provider = "pgvector"\n\ -' > /app/morphik.toml.default +# Copy our custom configuration as the default +COPY morphik.toml /app/morphik.toml.default # Create startup script -RUN echo '#!/bin/bash\n\ -set -e\n\ -\n\ -# Copy default config if none exists\n\ -if [ ! -f /app/morphik.toml ]; then\n\ - cp /app/morphik.toml.default /app/morphik.toml\n\ -fi\n\ -\n\ -# Function to check PostgreSQL\n\ -check_postgres() {\n\ - if [ -n "$POSTGRES_URI" ]; then\n\ - echo "Waiting for PostgreSQL..."\n\ - max_retries=30\n\ - retries=0\n\ - until PGPASSWORD=$PGPASSWORD pg_isready -h postgres -U morphik -d morphik; do\n\ - retries=$((retries + 1))\n\ - if [ $retries -eq $max_retries ]; then\n\ - echo "Error: PostgreSQL did not become ready in time"\n\ - exit 1\n\ - fi\n\ - echo "Waiting for PostgreSQL... (Attempt $retries/$max_retries)"\n\ - sleep 2\n\ - done\n\ - echo "PostgreSQL is ready!"\n\ - \n\ - # Verify database connection\n\ - if ! PGPASSWORD=$PGPASSWORD psql -h postgres -U morphik -d morphik -c "SELECT 1" > /dev/null 2>&1; then\n\ - echo "Error: Could not connect to PostgreSQL database"\n\ - exit 1\n\ - fi\n\ - echo "PostgreSQL connection verified!"\n\ - fi\n\ -}\n\ -\n\ -# Check PostgreSQL\n\ -check_postgres\n\ -\n\ -# Check if command arguments were passed ($# is the number of arguments)\n\ -if [ $# -gt 0 ]; then\n\ - # If arguments exist, execute them (e.g., execute "arq core.workers...")\n\ - exec "$@"\n\ -else\n\ - # Otherwise, execute the default command (uv run start_server.py)\n\ - exec uv run uvicorn core.api:app --host $HOST --port $PORT --loop asyncio --http auto --ws auto --lifespan auto\n\ -fi\n\ -' > /app/docker-entrypoint.sh && chmod +x /app/docker-entrypoint.sh +COPY docker/parse-postgres-uri.py /app/parse-postgres-uri.py +COPY docker/docker-entrypoint.sh /app/docker-entrypoint.sh # Copy application code # pyproject.toml is needed for uv to identify the project context for `uv run` diff --git a/morphik.toml b/morphik.toml index 231370c7..895bb4b1 100644 --- a/morphik.toml +++ b/morphik.toml @@ -13,8 +13,9 @@ dev_permissions = ["read", "write", "admin"] # Default dev permissions #### Registered models [registered_models] # OpenAI models +openai_gpt4 = { model_name = "gpt-4" } openai_gpt4-1 = { model_name = "gpt-4.1" } -openai_gpt4-1-mini = { model_name = "gpt-4.1-mini" } +openai_gpt4o = { model_name = "gpt-4o" } # Azure OpenAI models azure_gpt4 = { model_name = "gpt-4", api_base = "YOUR_AZURE_URL_HERE", api_version = "2023-05-15", deployment_id = "gpt-4-deployment" } @@ -32,21 +33,24 @@ ollama_qwen_vision = { model_name = "ollama_chat/qwen2.5vl:latest", api_base = " ollama_llama_vision = { model_name = "ollama_chat/llama3.2-vision", api_base = "http://localhost:11434", vision = true } ollama_embedding = { model_name = "ollama/nomic-embed-text", api_base = "http://localhost:11434" } +# Embedding models openai_embedding = { model_name = "text-embedding-3-small" } openai_embedding_large = { model_name = "text-embedding-3-large" } azure_embedding = { model_name = "text-embedding-ada-002", api_base = "YOUR_AZURE_URL_HERE", api_version = "2023-05-15", deployment_id = "embedding-ada-002" } - #### Component configurations #### [agent] -model = "ollama_qwen_vision" # Model for the agent logic +model = "openai_gpt4-1" [completion] -model = "ollama_qwen_vision" #"openai_gpt4-1-mini" # Reference to a key in registered_models +model = "openai_gpt4o" default_max_tokens = "1000" default_temperature = 0.5 +[document_analysis] +model = "openai_gpt4-1" + [database] provider = "postgres" # Connection pool settings @@ -59,8 +63,8 @@ max_retries = 3 # Number of retries for database operations retry_delay = 1.0 # Initial delay between retries in seconds [embedding] -model = "ollama_embedding" # Reference to registered model -dimensions = 768 +model = "openai_embedding" # Reference to registered model +dimensions = 1536 similarity_metric = "cosine" [parser] @@ -68,13 +72,10 @@ chunk_size = 6000 chunk_overlap = 300 use_unstructured_api = false use_contextual_chunking = false -contextual_chunking_model = "ollama_qwen_vision" # Reference to a key in registered_models - -[document_analysis] -model = "ollama_qwen_vision" # Reference to a key in registered_models +contextual_chunking_model = "openai_gpt4-1" # Reference to a key in registered_models [parser.vision] -model = "ollama_qwen_vision" # Reference to a key in registered_models +model = "openai_gpt4-1" # Reference to a key in registered_models frame_sample_rate = -1 # Set to -1 to disable frame captioning [reranker] @@ -84,7 +85,7 @@ model_name = "BAAI/bge-reranker-large" query_max_length = 256 passage_max_length = 512 use_fp16 = true -device = "mps" # use "cpu" if on docker and using a mac, "cuda" if cuda enabled device +device = "cpu" # use "cpu" if on docker and using a mac, "cuda" if cuda enabled device [storage] provider = "local" @@ -99,7 +100,7 @@ storage_path = "./storage" provider = "pgvector" [rules] -model = "ollama_qwen_vision" +model = "openai_gpt4-1" batch_size = 4096 [morphik] @@ -111,11 +112,11 @@ morphik_embedding_api_domain = "http://localhost:6000" # endpoint for multivect colpali_mode = "local" # "off", "local", or "api" [redis] -host = "localhost" # use "redis" for docker +host = "redis" # use "redis" for docker port = 6379 [graph] -model = "ollama_qwen_vision" +model = "openai_gpt4-1" enable_entity_resolution = true [telemetry]