Bug [@langchain/google-vertexai-web] 403 Forbidden
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:
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
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:
-
Check Credentials: Ensure that your Google Vertex AI credentials are correctly set up. The
authOptionsparameter should include valid credentials. Make sure the JSON string for the credentials is correctly formatted and contains all necessary fields. -
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_CREDENTIALSenvironment variable points to the correct path of your credentials file. -
API Key: If you are using an API Key for authentication, ensure that it is correctly set in the environment variable
API_KEYor passed directly to the constructor using theapiKeyattribute. -
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.
-
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.
-
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
It can be a bit finicky - I believe even things like whitespace can matter
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.
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:
- Specify
projectIdvia the parsed credentials (thus avoiding duplication of option 2) - Specify
GOOGLE_CLOUD_PROJECTenvironment variable per the JSON credentials stringproject_idfield