langchainjs icon indicating copy to clipboard operation
langchainjs copied to clipboard

Bug [@langchain/google-vertexai-web] 403 Forbidden

Open zrg-team opened this issue 10 months ago • 4 comments

Checked other resources

  • [x] I added a very descriptive title to this issue.
  • [x] I searched the LangChain.js documentation with the integrated search.
  • [x] I used the GitHub search to find a similar question and didn't find it.
  • [x] I am sure that this is a bug in LangChain.js rather than my code.
  • [x] The bug is not resolved by updating to the latest stable version of LangChain (or the specific integration package).

Example Code

The following code:

import { ChatVertexAI } from '@langchain/google-vertexai-web'


const model = new ChatVertexAI({
  authOptions: {
    credentials: JSON string
  },
  model: info?.llm?.name,
})

Request is failed as below:

Image

Image

Error Message and Stack Trace (if applicable)

No response

Description

  • I trying "@langchain/google-vertexai-web"
  • Expected: API call successfully

System Info

types: './index.d.ts',
  scripts: {
    build: 'yarn turbo:command build:internal --filter=langchain',
    'build:internal': 'yarn lc_build --create-entrypoints --pre --tree-shaking --gen-maps',
    'lint:eslint': 'NODE_OPTIONS=--max-old-space-size=4096 eslint --cache --ext .ts,.js src/',
    'lint:dpdm': 'dpdm --exit-code circular:1 --no-warning --no-tree src/*.ts src/**/*.ts',
    lint: 'yarn lint:eslint && yarn lint:dpdm',
    'lint:fix': 'yarn lint:eslint --fix && yarn lint:dpdm',
    precommit: 'lint-staged',
    clean: 'rm -rf .turbo dist/',
    prepack: 'yarn build',
    release: 'release-it --only-version --config .release-it.json',
    test: 'NODE_OPTIONS=--experimental-vm-modules jest --testPathIgnorePatterns=\\.int\\.test.ts --testTimeout 30000 --maxWorkers=50%',
    'test:watch': 'NODE_OPTIONS=--experimental-vm-modules jest --watch --testPathIgnorePatterns=\\.int\\.test.ts',
    'test:integration': 'NODE_OPTIONS=--experimental-vm-modules jest --testPathPattern=\\.int\\.test.ts --testTimeout 100000 --maxWorkers=50%',
    'test:single': 'NODE_OPTIONS=--experimental-vm-modules yarn run jest --config jest.config.cjs --testTimeout 100000',
    format: 'prettier --config .prettierrc --write "src"',
    'format:check': 'prettier --config .prettierrc --check "src"'
  },
  devDependencies: {
    '@faker-js/faker': '^7.6.0',
    '@jest/globals': '^29.5.0',
    '@langchain/anthropic': '*',
    '@langchain/aws': '*',
    '@langchain/cerebras': '*',
    '@langchain/cohere': '*',
    '@langchain/core': 'workspace:*',
    '@langchain/deepseek': '*',
    '@langchain/google-genai': '*',
    '@langchain/google-vertexai': '*',
    '@langchain/google-vertexai-web': '*',
    '@langchain/groq': '*',
    '@langchain/mistralai': '*',
    '@langchain/ollama': '*',
    '@langchain/scripts': '>=0.1.0 <0.2.0',
    '@swc/core': '^1.3.90',
    '@swc/jest': '^0.2.29',
    '@tsconfig/recommended': '^1.0.2',
    '@types/handlebars': '^4.1.0',
    '@types/html-to-text': '^9',
    '@types/js-yaml': '^4',
    '@types/jsdom': '^21.1.1',
    '@types/uuid': '^9',
    '@types/ws': '^8',
    '@typescript-eslint/eslint-plugin': '^5.58.0',
    '@typescript-eslint/parser': '^5.58.0',
    axios: '^0.26.0',
    cheerio: '1.0.0-rc.12',
    dotenv: '^16.0.3',
    dpdm: '^3.12.0',
    eslint: '^8.33.0',
    'eslint-config-airbnb-base': '^15.0.0',
    'eslint-config-prettier': '^8.6.0',
    'eslint-plugin-import': '^2.27.5',
    'eslint-plugin-jest': '^27.6.0',
    'eslint-plugin-no-instanceof': '^1.0.1',
    'eslint-plugin-prettier': '^4.2.1',
    handlebars: '^4.7.8',
    jest: '^29.5.0',
    'jest-environment-node': '^29.6.4',
    openai: '^4.41.1',
    peggy: '^3.0.2',
    prettier: '^2.8.3',
    'release-it': '^17.6.0',
    rimraf: '^5.0.1',
    rollup: '^3.19.1',
    'ts-jest': '^29.1.0',
    typeorm: '^0.3.20',
    typescript: '~5.1.6',
    wikipedia: '^2.1.2'
  },
  peerDependencies: {
    '@langchain/anthropic': '*',
    '@langchain/aws': '*',
    '@langchain/cerebras': '*',
    '@langchain/cohere': '*',
    '@langchain/core': '>=0.2.21 <0.4.0',
    '@langchain/deepseek': '*',
    '@langchain/google-genai': '*',
    '@langchain/google-vertexai': '*',
    '@langchain/google-vertexai-web': '*',
    '@langchain/groq': '*',
    '@langchain/mistralai': '*',
    '@langchain/ollama': '*',
    axios: '*',
    cheerio: '*',
    handlebars: '^4.7.8',
    peggy: '^3.0.2',
    typeorm: '*'
  },
  peerDependenciesMeta: {
    '@langchain/anthropic': {
      optional: true
    },
    '@langchain/aws': {
      optional: true
    },
    '@langchain/cerebras': {
      optional: true
    },
    '@langchain/cohere': {
      optional: true
    },
    '@langchain/deepseek': {
      optional: true
    },
    '@langchain/google-genai': {
      optional: true
    },
    '@langchain/google-vertexai': {
      optional: true
    },
    '@langchain/google-vertexai-web': {
      optional: true
    },
    '@langchain/groq': {
      optional: true
    },
    '@langchain/mistralai': {
      optional: true
    },
    '@langchain/ollama': {
      optional: true
    },
    axios: {
      optional: true
    },
    cheerio: {
      optional: true
    },
    handlebars: {
      optional: true
    },
    peggy: {
      optional: true
    },
    typeorm: {
      optional: true
    }
  },
  dependencies: {
    '@langchain/openai': '>=0.1.0 <0.5.0',
    '@langchain/textsplitters': '>=0.0.0 <0.2.0',
    'js-tiktoken': '^1.0.12',
    'js-yaml': '^4.1.0',
    jsonpointer: '^5.0.1',
    langsmith: '>=0.2.8 <0.4.0',
    'openapi-types': '^12.1.3',
    'p-retry': '4',
    uuid: '^10.0.0',
    yaml: '^2.2.1',
    zod: '^3.22.4',
    'zod-to-json-schema': '^3.22.3'
  },
  publishConfig: {
    access: 'public'
  },
  exports: {
    './load': {
      types: {
        import: './load.d.ts',
        require: './load.d.cts',
        default: './load.d.ts'
      },
      import: './load.js',
      require: './load.cjs'
    },
    './load/serializable': {
      types: {
        import: './load/serializable.d.ts',
        require: './load/serializable.d.cts',
        default: './load/serializable.d.ts'
      },
      import: './load/serializable.js',
      require: './load/serializable.cjs'
    },
    './agents': {
      types: {
        import: './agents.d.ts',
        require: './agents.d.cts',
        default: './agents.d.ts'
      },
      import: './agents.js',
      require: './agents.cjs'
    },
    './agents/load': {
      types: {
        import: './agents/load.d.ts',
        require: './agents/load.d.cts',
        default: './agents/load.d.ts'
      },
      import: './agents/load.js',
      require: './agents/load.cjs'
    },
    './agents/toolkits': {
      types: {
        import: './agents/toolkits.d.ts',
        require: './agents/toolkits.d.cts',
        default: './agents/toolkits.d.ts'
      },
      import: './agents/toolkits.js',
      require: './agents/toolkits.cjs'
    },
    './agents/toolkits/sql': {
      types: {
        import: './agents/toolkits/sql.d.ts',
        require: './agents/toolkits/sql.d.cts',
        default: './agents/toolkits/sql.d.ts'
      },
      import: './agents/toolkits/sql.js',
      require: './agents/toolkits/sql.cjs'
    },
    './agents/format_scratchpad': {
      types: {
        import: './agents/format_scratchpad.d.ts',
        require: './agents/format_scratchpad.d.cts',
        default: './agents/format_scratchpad.d.ts'
      },
      import: './agents/format_scratchpad.js',
      require: './agents/format_scratchpad.cjs'
    },
    './agents/format_scratchpad/openai_tools': {
      types: {
        import: './agents/format_scratchpad/openai_tools.d.ts',
        require: './agents/format_scratchpad/openai_tools.d.cts',
        default: './agents/format_scratchpad/openai_tools.d.ts'
      },
      import: './agents/format_scratchpad/openai_tools.js',
      require: './agents/format_scratchpad/openai_tools.cjs'
    },
    './agents/format_scratchpad/log': {
      types: {
        import: './agents/format_scratchpad/log.d.ts',
        require: './agents/format_scratchpad/log.d.cts',
        default: './agents/format_scratchpad/log.d.ts'
      },
      import: './agents/format_scratchpad/log.js',
      require: './agents/format_scratchpad/log.cjs'
    },
    './agents/format_scratchpad/xml': {
      types: {
        import: './agents/format_scratchpad/xml.d.ts',
        require: './agents/format_scratchpad/xml.d.cts',
        default: './agents/format_scratchpad/xml.d.ts'
      },
      import: './agents/format_scratchpad/xml.js',
      require: './agents/format_scratchpad/xml.cjs'
    },
    './agents/format_scratchpad/log_to_message': {
      types: {
        import: './agents/format_scratchpad/log_to_message.d.ts',
        require: './agents/format_scratchpad/log_to_message.d.cts',
        default: './agents/format_scratchpad/log_to_message.d.ts'
      },
      import: './agents/format_scratchpad/log_to_message.js',
      require: './agents/format_scratchpad/log_to_message.cjs'
    },
    './agents/react/output_parser': {
      types: {
        import: './agents/react/output_parser.d.ts',
        require: './agents/react/output_parser.d.cts',
        default: './agents/react/output_parser.d.ts'
      },
      import: './agents/react/output_parser.js',
      require: './agents/react/output_parser.cjs'
    },
    './agents/xml/output_parser': {
      types: {
        import: './agents/xml/output_parser.d.ts',
        require: './agents/xml/output_parser.d.cts',
        default: './agents/xml/output_parser.d.ts'
      },
      import: './agents/xml/output_parser.js',
      require: './agents/xml/output_parser.cjs'
    },
    './agents/openai/output_parser': {
      types: {
        import: './agents/openai/output_parser.d.ts',
        require: './agents/openai/output_parser.d.cts',
        default: './agents/openai/output_parser.d.ts'
      },
      import: './agents/openai/output_parser.js',
      require: './agents/openai/output_parser.cjs'
    },
    './tools': {
      types: {
        import: './tools.d.ts',
        require: './tools.d.cts',
        default: './tools.d.ts'
      },
      import: './tools.js',
      require: './tools.cjs'
    },
    './tools/chain': {
      types: {
        import: './tools/chain.d.ts',
        require: './tools/chain.d.cts',
        default: './tools/chain.d.ts'
      },
      import: './tools/chain.js',
      require: './tools/chain.cjs'
    },
    './tools/render': {
      types: {
        import: './tools/render.d.ts',
        require: './tools/render.d.cts',
        default: './tools/render.d.ts'
      },
      import: './tools/render.js',
      require: './tools/render.cjs'
    },
    './tools/retriever': {
      types: {
        import: './tools/retriever.d.ts',
        require: './tools/retriever.d.cts',
        default: './tools/retriever.d.ts'
      },
      import: './tools/retriever.js',
      require: './tools/retriever.cjs'
    },
    './tools/sql': {
      types: {
        import: './tools/sql.d.ts',
        require: './tools/sql.d.cts',
        default: './tools/sql.d.ts'
      },
      import: './tools/sql.js',
      require: './tools/sql.cjs'
    },
    './tools/webbrowser': {
      types: {
        import: './tools/webbrowser.d.ts',
        require: './tools/webbrowser.d.cts',
        default: './tools/webbrowser.d.ts'
      },
      import: './tools/webbrowser.js',
      require: './tools/webbrowser.cjs'
    },
    './chains': {
      types: {
        import: './chains.d.ts',
        require: './chains.d.cts',
        default: './chains.d.ts'
      },
      import: './chains.js',
      require: './chains.cjs'
    },
    './chains/combine_documents': {
      types: {
        import: './chains/combine_documents.d.ts',
        require: './chains/combine_documents.d.cts',
        default: './chains/combine_documents.d.ts'
      },
      import: './chains/combine_documents.js',
      require: './chains/combine_documents.cjs'
    },
    './chains/combine_documents/reduce': {
      types: {
        import: './chains/combine_documents/reduce.d.ts',
        require: './chains/combine_documents/reduce.d.cts',
        default: './chains/combine_documents/reduce.d.ts'
      },
      import: './chains/combine_documents/reduce.js',
      require: './chains/combine_documents/reduce.cjs'
    },
    './chains/history_aware_retriever': {
      types: {
        import: './chains/history_aware_retriever.d.ts',
        require: './chains/history_aware_retriever.d.cts',
        default: './chains/history_aware_retriever.d.ts'
      },
      import: './chains/history_aware_retriever.js',
      require: './chains/history_aware_retriever.cjs'
    },
    './chains/load': {
      types: {
        import: './chains/load.d.ts',
        require: './chains/load.d.cts',
        default: './chains/load.d.ts'
      },
      import: './chains/load.js',
      require: './chains/load.cjs'
    },
    './chains/openai_functions': {
      types: {
        import: './chains/openai_functions.d.ts',
        require: './chains/openai_functions.d.cts',
        default: './chains/openai_functions.d.ts'
      },
      import: './chains/openai_functions.js',
      require: './chains/openai_functions.cjs'
    },
    './chains/query_constructor': {
      types: {
        import: './chains/query_constructor.d.ts',
        require: './chains/query_constructor.d.cts',
        default: './chains/query_constructor.d.ts'
      },
      import: './chains/query_constructor.js',
      require: './chains/query_constructor.cjs'
    },
    './chains/query_constructor/ir': {
      types: {
        import: './chains/query_constructor/ir.d.ts',
        require: './chains/query_constructor/ir.d.cts',
        default: './chains/query_constructor/ir.d.ts'
      },
      import: './chains/query_constructor/ir.js',
      require: './chains/query_constructor/ir.cjs'
    },
    './chains/retrieval': {
      types: {
        import: './chains/retrieval.d.ts',
        require: './chains/retrieval.d.cts',
        default: './chains/retrieval.d.ts'
      },
      import: './chains/retrieval.js',
      require: './chains/retrieval.cjs'
    },
    './chains/sql_db': {
      types: {
        import: './chains/sql_db.d.ts',
        require: './chains/sql_db.d.cts',
        default: './chains/sql_db.d.ts'
      },
      import: './chains/sql_db.js',
      require: './chains/sql_db.cjs'
    },
    './chains/graph_qa/cypher': {
      types: {
        import: './chains/graph_qa/cypher.d.ts',
        require: './chains/graph_qa/cypher.d.cts',
        default: './chains/graph_qa/cypher.d.ts'
      },
      import: './chains/graph_qa/cypher.js',
      require: './chains/graph_qa/cypher.cjs'
    },
    './chat_models/universal': {
      types: {
        import: './chat_models/universal.d.ts',
        require: './chat_models/universal.d.cts',
        default: './chat_models/universal.d.ts'
      },
      import: './chat_models/universal.js',
      require: './chat_models/universal.cjs'
    },
    './embeddings/cache_backed': {
      types: {
        import: './embeddings/cache_backed.d.ts',
        require: './embeddings/cache_backed.d.cts',
        default: './embeddings/cache_backed.d.ts'
      },
      import: './embeddings/cache_backed.js',
      require: './embeddings/cache_backed.cjs'
    },
    './embeddings/fake': {
      types: {
        import: './embeddings/fake.d.ts',
        require: './embeddings/fake.d.cts',
        default: './embeddings/fake.d.ts'
      },
      import: './embeddings/fake.js',
      require: './embeddings/fake.cjs'
    },
    './vectorstores/memory': {
      types: {
        import: './vectorstores/memory.d.ts',
        require: './vectorstores/memory.d.cts',
        default: './vectorstores/memory.d.ts'
      },
      import: './vectorstores/memory.js',
      require: './vectorstores/memory.cjs'
    },
    './text_splitter': {
      types: {
        import: './text_splitter.d.ts',
        require: './text_splitter.d.cts',
        default: './text_splitter.d.ts'
      },
      import: './text_splitter.js',
      require: './text_splitter.cjs'
    },
    './memory': {
      types: {
        import: './memory.d.ts',
        require: './memory.d.cts',
        default: './memory.d.ts'
      },
      import: './memory.js',
      require: './memory.cjs'
    },
    './memory/chat_memory': {
      types: {
        import: './memory/chat_memory.d.ts',
        require: './memory/chat_memory.d.cts',
        default: './memory/chat_memory.d.ts'
      },
      import: './memory/chat_memory.js',
      require: './memory/chat_memory.cjs'
    },
    './document': {
      types: {
        import: './document.d.ts',
        require: './document.d.cts',
        default: './document.d.ts'
      },
      import: './document.js',
      require: './document.cjs'
    },
    './document_loaders/base': {
      types: {
        import: './document_loaders/base.d.ts',
        require: './document_loaders/base.d.cts',
        default: './document_loaders/base.d.ts'
      },
      import: './document_loaders/base.js',
      require: './document_loaders/base.cjs'
    },
    './document_loaders/fs/buffer': {
      types: {
        import: './document_loaders/fs/buffer.d.ts',
        require: './document_loaders/fs/buffer.d.cts',
        default: './document_loaders/fs/buffer.d.ts'
      },
      import: './document_loaders/fs/buffer.js',
      require: './document_loaders/fs/buffer.cjs'
    },
    './document_loaders/fs/directory': {
      types: {
        import: './document_loaders/fs/directory.d.ts',
        require: './document_loaders/fs/directory.d.cts',
        default: './document_loaders/fs/directory.d.ts'
      },
      import: './document_loaders/fs/directory.js',
      require: './document_loaders/fs/directory.cjs'
    },
    './document_loaders/fs/json': {
      types: {
        import: './document_loaders/fs/json.d.ts',
        require: './document_loaders/fs/json.d.cts',
        default: './document_loaders/fs/json.d.ts'
      },
      import: './document_loaders/fs/json.js',
      require: './document_loaders/fs/json.cjs'
    },
    './document_loaders/fs/multi_file': {
      types: {
        import: './document_loaders/fs/multi_file.d.ts',
        require: './document_loaders/fs/multi_file.d.cts',
        default: './document_loaders/fs/multi_file.d.ts'
      },
      import: './document_loaders/fs/multi_file.js',
      require: './document_loaders/fs/multi_file.cjs'
    },
    './document_loaders/fs/text': {
      types: {
        import: './document_loaders/fs/text.d.ts',
        require: './document_loaders/fs/text.d.cts',
        default: './document_loaders/fs/text.d.ts'
      },
      import: './document_loaders/fs/text.js',
      require: './document_loaders/fs/text.cjs'
    },
    './document_transformers/openai_functions': {
      types: {
        import: './document_transformers/openai_functions.d.ts',
        require: './document_transformers/openai_functions.d.cts',
        default: './document_transformers/openai_functions.d.ts'
      },
      import: './document_transformers/openai_functions.js',
      require: './document_transformers/openai_functions.cjs'
    },
    './sql_db': {
      types: {
        import: './sql_db.d.ts',
        require: './sql_db.d.cts',
        default: './sql_db.d.ts'
      },
      import: './sql_db.js',
      require: './sql_db.cjs'
    },
    './callbacks': {
      types: {
        import: './callbacks.d.ts',
        require: './callbacks.d.cts',
        default: './callbacks.d.ts'
      },
      import: './callbacks.js',
      require: './callbacks.cjs'
    },
    './output_parsers': {
      types: {
        import: './output_parsers.d.ts',
        require: './output_parsers.d.cts',
        default: './output_parsers.d.ts'
      },
      import: './output_parsers.js',
      require: './output_parsers.cjs'
    },
    './output_parsers/expression': {
      types: {
        import: './output_parsers/expression.d.ts',
        require: './output_parsers/expression.d.cts',
        default: './output_parsers/expression.d.ts'
      },
      import: './output_parsers/expression.js',
      require: './output_parsers/expression.cjs'
    },
    './retrievers/contextual_compression': {
      types: {
        import: './retrievers/contextual_compression.d.ts',
        require: './retrievers/contextual_compression.d.cts',
        default: './retrievers/contextual_compression.d.ts'
      },
      import: './retrievers/contextual_compression.js',
      require: './retrievers/contextual_compression.cjs'
    },
    './retrievers/document_compressors': {
      types: {
        import: './retrievers/document_compressors.d.ts',
        require: './retrievers/document_compressors.d.cts',
        default: './retrievers/document_compressors.d.ts'
      },
      import: './retrievers/document_compressors.js',
      require: './retrievers/document_compressors.cjs'
    },
    './retrievers/ensemble': {
      types: {
        import: './retrievers/ensemble.d.ts',
        require: './retrievers/ensemble.d.cts',
        default: './retrievers/ensemble.d.ts'
      },
      import: './retrievers/ensemble.js',
      require: './retrievers/ensemble.cjs'
    },
    './retrievers/multi_query': {
      types: {
        import: './retrievers/multi_query.d.ts',
        require: './retrievers/multi_query.d.cts',
        default: './retrievers/multi_query.d.ts'
      },
      import: './retrievers/multi_query.js',
      require: './retrievers/multi_query.cjs'
    },
    './retrievers/multi_vector': {
      types: {
        import: './retrievers/multi_vector.d.ts',
        require: './retrievers/multi_vector.d.cts',
        default: './retrievers/multi_vector.d.ts'
      },
      import: './retrievers/multi_vector.js',
      require: './retrievers/multi_vector.cjs'
    },
    './retrievers/parent_document': {
      types: {
        import: './retrievers/parent_document.d.ts',
        require: './retrievers/parent_document.d.cts',
        default: './retrievers/parent_document.d.ts'
      },
      import: './retrievers/parent_document.js',
      require: './retrievers/parent_document.cjs'
    },
    './retrievers/time_weighted': {
      types: {
        import: './retrievers/time_weighted.d.ts',
        require: './retrievers/time_weighted.d.cts',
        default: './retrievers/time_weighted.d.ts'
      },
      import: './retrievers/time_weighted.js',
      require: './retrievers/time_weighted.cjs'
    },
    './retrievers/document_compressors/chain_extract': {
      types: {
        import: './retrievers/document_compressors/chain_extract.d.ts',
        require: './retrievers/document_compressors/chain_extract.d.cts',
        default: './retrievers/document_compressors/chain_extract.d.ts'
      },
      import: './retrievers/document_compressors/chain_extract.js',
      require: './retrievers/document_compressors/chain_extract.cjs'
    },
    './retrievers/document_compressors/embeddings_filter': {
      types: {
        import: './retrievers/document_compressors/embeddings_filter.d.ts',
        require: './retrievers/document_compressors/embeddings_filter.d.cts',
        default: './retrievers/document_compressors/embeddings_filter.d.ts'
      },
      import: './retrievers/document_compressors/embeddings_filter.js',
      require: './retrievers/document_compressors/embeddings_filter.cjs'
    },
    './retrievers/hyde': {
      types: {
        import: './retrievers/hyde.d.ts',
        require: './retrievers/hyde.d.cts',
        default: './retrievers/hyde.d.ts'
      },
      import: './retrievers/hyde.js',
      require: './retrievers/hyde.cjs'
    },
    './retrievers/score_threshold': {
      types: {
        import: './retrievers/score_threshold.d.ts',
        require: './retrievers/score_threshold.d.cts',
        default: './retrievers/score_threshold.d.ts'
      },
      import: './retrievers/score_threshold.js',
      require: './retrievers/score_threshold.cjs'
    },
    './retrievers/self_query': {
      types: {
        import: './retrievers/self_query.d.ts',
        require: './retrievers/self_query.d.cts',
        default: './retrievers/self_query.d.ts'
      },
      import: './retrievers/self_query.js',
      require: './retrievers/self_query.cjs'
    },
    './retrievers/self_query/functional': {
      types: {
        import: './retrievers/self_query/functional.d.ts',
        require: './retrievers/self_query/functional.d.cts',
        default: './retrievers/self_query/functional.d.ts'
      },
      import: './retrievers/self_query/functional.js',
      require: './retrievers/self_query/functional.cjs'
    },
    './retrievers/matryoshka_retriever': {
      types: {
        import: './retrievers/matryoshka_retriever.d.ts',
        require: './retrievers/matryoshka_retriever.d.cts',
        default: './retrievers/matryoshka_retriever.d.ts'
      },
      import: './retrievers/matryoshka_retriever.js',
      require: './retrievers/matryoshka_retriever.cjs'
    },
    './cache/file_system': {
      types: {
        import: './cache/file_system.d.ts',
        require: './cache/file_system.d.cts',
        default: './cache/file_system.d.ts'
      },
      import: './cache/file_system.js',
      require: './cache/file_system.cjs'
    },
    './stores/doc/base': {
      types: {
        import: './stores/doc/base.d.ts',
        require: './stores/doc/base.d.cts',
        default: './stores/doc/base.d.ts'
      },
      import: './stores/doc/base.js',
      require: './stores/doc/base.cjs'
    },
    './stores/doc/in_memory': {
      types: {
        import: './stores/doc/in_memory.d.ts',
        require: './stores/doc/in_memory.d.cts',
        default: './stores/doc/in_memory.d.ts'
      },
      import: './stores/doc/in_memory.js',
      require: './stores/doc/in_memory.cjs'
    },
    './stores/file/in_memory': {
      types: {
        import: './stores/file/in_memory.d.ts',
        require: './stores/file/in_memory.d.cts',
        default: './stores/file/in_memory.d.ts'
      },
      import: './stores/file/in_memory.js',
      require: './stores/file/in_memory.cjs'
    },
    './stores/file/node': {
      types: {
        import: './stores/file/node.d.ts',
        require: './stores/file/node.d.cts',
        default: './stores/file/node.d.ts'
      },
      import: './stores/file/node.js',
      require: './stores/file/node.cjs'
    },
    './stores/message/in_memory': {
      types: {
        import: './stores/message/in_memory.d.ts',
        require: './stores/message/in_memory.d.cts',
        default: './stores/message/in_memory.d.ts'
      },
      import: './stores/message/in_memory.js',
      require: './stores/message/in_memory.cjs'
    },
    './storage/encoder_backed': {
      types: {
        import: './storage/encoder_backed.d.ts',
        require: './storage/encoder_backed.d.cts',
        default: './storage/encoder_backed.d.ts'
      },
      import: './storage/encoder_backed.js',
      require: './storage/encoder_backed.cjs'
    },
    './storage/in_memory': {
      types: {
        import: './storage/in_memory.d.ts',
        require: './storage/in_memory.d.cts',
        default: './storage/in_memory.d.ts'
      },
      import: './storage/in_memory.js',
      require: './storage/in_memory.cjs'
    },
    './storage/file_system': {
      types: {
        import: './storage/file_system.d.ts',
        require: './storage/file_system.d.cts',
        default: './storage/file_system.d.ts'
      },
      import: './storage/file_system.js',
      require: './storage/file_system.cjs'
    },
    './hub': {
      types: {
        import: './hub.d.ts',
        require: './hub.d.cts',
        default: './hub.d.ts'
      },
      import: './hub.js',
      require: './hub.cjs'
    },
    './hub/node': {
      types: {
        import: './hub/node.d.ts',
        require: './hub/node.d.cts',
        default: './hub/node.d.ts'
      },
      import: './hub/node.js',
      require: './hub/node.cjs'
    },
    './util/document': {
      types: {
        import: './util/document.d.ts',
        require: './util/document.d.cts',
        default: './util/document.d.ts'
      },
      import: './util/document.js',
      require: './util/document.cjs'
    },
    './util/math': {
      types: {
        import: './util/math.d.ts',
        require: './util/math.d.cts',
        default: './util/math.d.ts'
      },
      import: './util/math.js',
      require: './util/math.cjs'
    },
    './util/time': {
      types: {
        import: './util/time.d.ts',
        require: './util/time.d.cts',
        default: './util/time.d.ts'
      },
      import: './util/time.js',
      require: './util/time.cjs'
    },
    './experimental/autogpt': {
      types: {
        import: './experimental/autogpt.d.ts',
        require: './experimental/autogpt.d.cts',
        default: './experimental/autogpt.d.ts'
      },
      import: './experimental/autogpt.js',
      require: './experimental/autogpt.cjs'
    },
    './experimental/openai_assistant': {
      types: {
        import: './experimental/openai_assistant.d.ts',
        require: './experimental/openai_assistant.d.cts',
        default: './experimental/openai_assistant.d.ts'
      },
      import: './experimental/openai_assistant.js',
      require: './experimental/openai_assistant.cjs'
    },
    './experimental/openai_files': {
      types: {
        import: './experimental/openai_files.d.ts',
        require: './experimental/openai_files.d.cts',
        default: './experimental/openai_files.d.ts'
      },
      import: './experimental/openai_files.js',
      require: './experimental/openai_files.cjs'
    },
    './experimental/babyagi': {
      types: {
        import: './experimental/babyagi.d.ts',
        require: './experimental/babyagi.d.cts',
        default: './experimental/babyagi.d.ts'
      },
      import: './experimental/babyagi.js',
      require: './experimental/babyagi.cjs'
    },
    './experimental/generative_agents': {
      types: {
        import: './experimental/generative_agents.d.ts',
        require: './experimental/generative_agents.d.cts',
        default: './experimental/generative_agents.d.ts'
      },
      import: './experimental/generative_agents.js',
      require: './experimental/generative_agents.cjs'
    },
    './experimental/plan_and_execute': {
      types: {
        import: './experimental/plan_and_execute.d.ts',
        require: './experimental/plan_and_execute.d.cts',
        default: './experimental/plan_and_execute.d.ts'
      },
      import: './experimental/plan_and_execute.js',
      require: './experimental/plan_and_execute.cjs'
    },
    './experimental/chains/violation_of_expectations': {
      types: {
        import: './experimental/chains/violation_of_expectations.d.ts',
        require: './experimental/chains/violation_of_expectations.d.cts',
        default: './experimental/chains/violation_of_expectations.d.ts'
      },
      import: './experimental/chains/violation_of_expectations.js',
      require: './experimental/chains/violation_of_expectations.cjs'
    },
    './experimental/masking': {
      types: {
        import: './experimental/masking.d.ts',
        require: './experimental/masking.d.cts',
        default: './experimental/masking.d.ts'
      },
      import: './experimental/masking.js',
      require: './experimental/masking.cjs'
    },
    './experimental/prompts/custom_format': {
      types: {
        import: './experimental/prompts/custom_format.d.ts',
        require: './experimental/prompts/custom_format.d.cts',
        default: './experimental/prompts/custom_format.d.ts'
      },
      import: './experimental/prompts/custom_format.js',
      require: './experimental/prompts/custom_format.cjs'
    },
    './experimental/prompts/handlebars': {
      types: {
        import: './experimental/prompts/handlebars.d.ts',
        require: './experimental/prompts/handlebars.d.cts',
        default: './experimental/prompts/handlebars.d.ts'
      },
      import: './experimental/prompts/handlebars.js',
      require: './experimental/prompts/handlebars.cjs'
    },
    './evaluation': {
      types: {
        import: './evaluation.d.ts',
        require: './evaluation.d.cts',
        default: './evaluation.d.ts'
      },
      import: './evaluation.js',
      require: './evaluation.cjs'
    },
    './smith': {
      types: {
        import: './smith.d.ts',
        require: './smith.d.cts',
        default: './smith.d.ts'
      },
      import: './smith.js',
      require: './smith.cjs'
    },
    './runnables/remote': {
      types: {
        import: './runnables/remote.d.ts',
        require: './runnables/remote.d.cts',
        default: './runnables/remote.d.ts'
      },
      import: './runnables/remote.js',
      require: './runnables/remote.cjs'
    },
    './indexes': {
      types: {
        import: './indexes.d.ts',
        require: './indexes.d.cts',
        default: './indexes.d.ts'
      },
      import: './indexes.js',
      require: './indexes.cjs'
    },
    './schema/query_constructor': {
      types: {
        import: './schema/query_constructor.d.ts',
        require: './schema/query_constructor.d.cts',
        default: './schema/query_constructor.d.ts'
      },
      import: './schema/query_constructor.js',
      require: './schema/query_constructor.cjs'
    },
    './schema/prompt_template': {
      types: {
        import: './schema/prompt_template.d.ts',
        require: './schema/prompt_template.d.cts',
        default: './schema/prompt_template.d.ts'
      },
      import: './schema/prompt_template.js',
      require: './schema/prompt_template.cjs'
    },
    './package.json': './package.json'
  },
  gitHead: '3c53dcd561705ce3057d80271690d4cae4c236d4',
  dist: {
    integrity: 'sha512-+DQ4I2iy4b5sErkxo6jAkgmumvhgqLwLB2fmiGl3yDt8+VVZdB1MUULZMzf+6ubarNc7Mwn/sxHUqK4GhEndhg==',
    shasum: 'c6c8b17bf20c870795e31515f48abde7d13ccc9d',
    tarball: 'https://registry.npmjs.org/langchain/-/langchain-0.3.15.tgz',
    fileCount: 1349,
    unpackedSize: 2895629,
    signatures: [
      {
        keyid: 'SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U',
        sig: 'MEYCIQCsTMzu0iEH4cnSQCkaiME7fCbhiTQsjf07DGKe/YkvUAIhAIeXl0YsQLKiGjZbq3DDLL4MSCs3yTrlAG0M7kPZ2l5M'
      }
    ]
  },
  directories: {}
}
  • Node: v20.18.1

zrg-team avatar Feb 03 '25 16:02 zrg-team

The 403 Forbidden status code you're encountering when making requests to the Google AI Platform API using the @langchain/google-vertexai-web package typically indicates an issue with authentication or permissions. Here are some steps you can take to troubleshoot and resolve this issue:

  1. Check Credentials: Ensure that your Google Vertex AI credentials are correctly set up. The authOptions parameter should include valid credentials. Make sure the JSON string for the credentials is correctly formatted and contains all necessary fields.

  2. Environment Variables: Verify that the environment variables for your credentials are correctly set. If you are using a service account, ensure that the GOOGLE_APPLICATION_CREDENTIALS environment variable points to the correct path of your credentials file.

  3. API Key: If you are using an API Key for authentication, ensure that it is correctly set in the environment variable API_KEY or passed directly to the constructor using the apiKey attribute.

  4. Permissions: Check that the service account or API Key has the necessary permissions to access the Google AI Platform API. You may need to enable the API in your Google Cloud project and ensure that the account has the appropriate roles assigned.

  5. CORS Configuration: Since the request is being made from a web environment, ensure that CORS (Cross-Origin Resource Sharing) is properly configured on the server side to allow requests from your domain.

  6. Network Policies: Review any network policies or firewalls that might be blocking the request. Ensure that your network allows outbound requests to the Google API endpoint.

If these steps do not resolve the issue, you may need to review the specific error message returned by the API for more details on why the request is being denied.

To continue talking to Dosu, mention @dosu.


Help Dosu learn! Give it feedback: Great Response | Irrelevant Answer | Incorrect Sources | Too Verbose | Hallucination | Other

dosubot[bot] avatar Feb 03 '25 16:02 dosubot[bot]

It can be a bit finicky - I believe even things like whitespace can matter

jacoblee93 avatar Feb 04 '25 02:02 jacoblee93

A few things jump out at me:

  • This is running in a browser, which I'm not sure is a configuration we've tested for. I would expect it to work, but I'm not sure we've ever tested it.
  • If the browser headers are reporting correctly, there is no "Authorization" header, which is surprising.
  • Can you include the JSON string that was sent? (Masking out the sensitive information - mostly I want to see what fields are included and make sure the JSON is correctly formatted.) Having this as a console.log() would be best, to make sure it is actually available.
  • Was anything else logged in the JavaScript Console in the browser? I'm wondering if the web-auth-library had an issue that it reported.

I'll try to do some tests as well to see if I can duplicate.

afirstenberg avatar Feb 04 '25 12:02 afirstenberg

I'm using the Node.js entry point for Vertex AI by specifying authOptions to load from the environment (to avoid going down the JSON file route), and debugged a similar authentication issue related to missing project ID.

Posting here in case it helps for the Web entry point, it looks like it's related to the way the google auth library loads the projectId.

Before

import { ChatVertexAI } from '@langchain/google-vertexai-web'

// set via environment var elsewhere, but shown for completeness
process.env.GOOGLE_VERTEX_AI_CREDENTIALS='{"type":"service_account","project_id":"XXXX","private_key_id":"XXXX","private_key":"-----BEGIN PRIVATE KEY-----...","client_email":"[email protected]","client_id":"XXXX","auth_uri":"https://accounts.google.com/o/oauth2/auth","token_uri":"https://oauth2.googleapis.com/token","auth_provider_x509_cert_url":"https://www.googleapis.com/oauth2/v1/certs","client_x509_cert_url":"https://www.googleapis.com/robot/v1/metadata/x509/XXXX%40XXXX.iam.gserviceaccount.com","universe_domain":"googleapis.com"}'

const credentials = JSON.parse(process.env.GOOGLE_VERTEX_AI_CREDENTIALS);

return new ChatVertexAI({
  ...options,
  authOptions: {
    credentials,
  },
});

Result:

Unable to detect a Project Id in the current environment. 
To learn more about authentication and Google APIs, visit: 
https://cloud.google.com/docs/authentication/getting-started
    at GoogleAuth.findAndCacheProjectId (//node_modules/.pnpm/[email protected][email protected]/node_modules/google-auth-library/build/src/auth/googleauth.js:170:19)
Google Auth lookup logic (expand to view)

// entry point referring to the error stack:
/**
 * A private method for finding and caching a projectId.
 *
 * Supports environments in order of precedence:
 * - GCLOUD_PROJECT or GOOGLE_CLOUD_PROJECT environment variable
 * - GOOGLE_APPLICATION_CREDENTIALS JSON file
 * - Cloud SDK: `gcloud config config-helper --format json`
 * - GCE project ID from metadata server
 *
 * @returns projectId
 */
async findAndCacheProjectId() {
    let projectId = null;
    projectId || (projectId = await this.getProductionProjectId()); // read from the environment
    projectId || (projectId = await this.getFileProjectId()); // this is where the projectId comes from when using the recommended JSON file approach
    projectId || (projectId = await this.getDefaultServiceProjectId()); // runs a shell command using GCP cli
    projectId || (projectId = await this.getGCEProjectId()); // reads from GCP runtimes environment metadata
    projectId || (projectId = await this.getExternalAccountClientProjectId()); // read from external account
    if (projectId) {
        this._cachedProjectId = projectId;
        return projectId;
    }
    else {
        throw new Error(exports.GoogleAuthExceptionMessages.NO_PROJECT_ID_FOUND);
    }
}

// entry point 1
/**
 * Loads the project id from environment variables.
 * @api private
 */
getProductionProjectId() {
    return (process.env['GCLOUD_PROJECT'] ||
        process.env['GOOGLE_CLOUD_PROJECT'] ||
        process.env['gcloud_project'] ||
        process.env['google_cloud_project']);
}

// entry point 2
/**
 * Loads the project id from the GOOGLE_APPLICATION_CREDENTIALS json file.
 * @api private
 */
async getFileProjectId() {
    if (this.cachedCredential) {
        // Try to read the project ID from the cached credentials file
        return this.cachedCredential.projectId;
    }
    // Ensure the projectId is loaded from the keyFile if available.
    if (this.keyFilename) {
        const creds = await this.getClient();
        if (creds && creds.projectId) {
            return creds.projectId;
        }
    }
    // Try to load a credentials file and read its project ID
    const r = await this._tryGetApplicationCredentialsFromEnvironmentVariable();
    if (r) {
        return r.projectId;
    }
    else {
        return null;
    }
}

After

import { ChatVertexAI } from '@langchain/google-vertexai-web'

// set via environment  var elsewhere, but shown for completeness
process.env.GOOGLE_VERTEX_AI_CREDENTIALS='{"type":"service_account","project_id":"XXXX","private_key_id":"XXXX","private_key":"-----BEGIN PRIVATE KEY-----...","client_email":"[email protected]","client_id":"XXXX","auth_uri":"https://accounts.google.com/o/oauth2/auth","token_uri":"https://oauth2.googleapis.com/token","auth_provider_x509_cert_url":"https://www.googleapis.com/oauth2/v1/certs","client_x509_cert_url":"https://www.googleapis.com/robot/v1/metadata/x509/XXXX%40XXXX.iam.gserviceaccount.com","universe_domain":"googleapis.com"}'

const credentials = JSON.parse(process.env.GOOGLE_VERTEX_AI_CREDENTIALS);

return new ChatVertexAI({
  ...options,
  authOptions: {
    credentials,
    projectId: credentials.project_id,
  },
});

// -> successfully authenticates.

So there are 2 options when specifying the JSON credentials object manually:

  1. Specify projectId via the parsed credentials (thus avoiding duplication of option 2)
  2. Specify GOOGLE_CLOUD_PROJECT environment variable per the JSON credentials string project_id field

rifont avatar May 05 '25 12:05 rifont