googleapis / googleapis/python-aiplatform
rag.ask_contexts() cannot succeed: backend returns UNIMPLEMENTED on v1 and a generic INVALID_ARGUMENT on v1beta1. Is AskContexts allowlisted?
- Lingua principale
- Python
- Stelle
- 905
- Fork
- 465
- Merge medio
- 1g 13h
- PR unite (30g)
- 44
Descrizione
### Summary
`agentplatform` (shipped in `google-cloud-aiplatform`) exposes
`client.rag.ask_contexts()`. Every call returns `400 INVALID_ARGUMENT` with no
field named.
This does not appear to be a client defect. I checked the request the SDK builds
against the discovery schema and it matches. The same request sent by hand fails
identically, and the `v1` form of the method answers:
```
501 UNIMPLEMENTED
"Operation is not implemented, or supported, or enabled."
```
So the question is whether `AskContexts` requires allowlisting, and if so whether
the SDK should surface the method (or raise something more useful) until it is
generally served.
### Environment
- `google-cloud-aiplatform` 1.165.1 (also reproduced on 1.163.0)
- `google-genai` 2.16.0
- Python 3.13
- Regions tested: us-west1, us-central1, us-east4, europe-west4
### What I measured
Live RAG corpus in us-west1, 4 documents, state ACTIVE. Same credentials and
same client for every row.
| probe | result |
|---|---|
| `retrieve_contexts`, same corpus, creds, region | OK, 4 chunks |
| `ask_contexts()` via the SDK | 400 INVALID_ARGUMENT, no field named |
| raw REST, `.../locations/L:askContexts` | 400, identical |
| body `{"query": {...}}` only (minimal valid per schema) | 400 |
| body `{}` | 400 |
| body naming a corpus that does not exist | 400, identical to the valid one |
| body with an unknown field | 400 `Unknown name "zzz": Cannot find field` |
| us-central1, us-east4, europe-west4 | 400 in all three |
| same method on `v1` | **501 UNIMPLEMENTED** |
| control: `retrieveContexts` with `{}` | 400 `"request must set datasource."` |
Two rows are the interesting ones:
1. The endpoint **parses** the body, because it names an unknown field precisely.
2. It **never reaches corpus validation**, because a nonexistent corpus and a
valid corpus produce byte-identical errors.
And the control shows the RAG service returns specific, actionable errors in this
region when it is actually serving a method.
### The request the SDK builds is schema-correct
`GoogleCloudAiplatformV1beta1AskContextsRequest` declares exactly `{query, tools}`.
That is what the SDK sends, and the corpus does reach the server inside `tools`:
```python
from agentplatform._genai import rag, types as T
from google.genai import types as G
CORPUS = "projects/PROJECT/locations/us-west1/ragCorpora/CORPUS_ID"
tools = [G.Tool(retrieval=G.Retrieval(vertex_rag_store=G.VertexRagStore(
rag_resources=[G.VertexRagStoreRagResource(rag_corpus=CORPUS)])))]
params = T._AskContextsRequestParameters(
query=T.RagQuery(text="example question"),
config=T.AskContextsConfig(tools=tools))
d = rag._AskContextsRequestParameters_to_vertex(params)
d.pop("config", None) # the call site does this
print(sorted(d)) # ['query', 'tools']
print(CORPUS in str(d)) # True
```
### Reproduction
```python
import agentplatform
from agentplatform._genai import types as T
from google.genai import types as G
c = agentplatform.Client(project="PROJECT", location="us-west1")
CORPUS = "projects/PROJECT/locations/us-west1/ragCorpora/CORPUS_ID"
# works
c.rag.retrieve_contexts(
vertex_rag_store=G.VertexRagStore(
rag_resources=[G.VertexRagStoreRagResource(rag_corpus=CORPUS)]),
query=T.RagQuery(text="example question"))
# 400 INVALID_ARGUMENT, no field named
c.rag.ask_contexts(
query=T.RagQuery(text="example question"),
config=T.AskContextsConfig(tools=[G.Tool(retrieval=G.Retrieval(
vertex_rag_store=G.VertexRagStore(
rag_resources=[G.VertexRagStoreRagResource(rag_corpus=CORPUS)])))]))
```
And the v1 form, which is the clearest signal:
```
POST https://us-west1-aiplatform.googleapis.com/v1/projects/PROJECT/locations/us-west1:askContexts
{"query": {"text": "example question"}}
501 {"error": {"code": 501,
"message": "Operation is not implemented, or supported, or enabled.",
"status": "UNIMPLEMENTED"}}
```
### Questions
1. Is `AskContexts` allowlisted or otherwise gated? If so, what is the path to
enablement?
2. If it is not generally available, could the v1beta1 endpoint return the same
`UNIMPLEMENTED` that v1 returns, instead of a generic `INVALID_ARGUMENT` that
sends callers looking for a bad field?
### Note on a non-issue
While investigating I noticed the built path is
`projects/P/locations/L/:askContexts`, with a separator before the colon. That is
**not** the cause: `retrieve_contexts` builds `projects/P/locations/L/:retrieveContexts`
in exactly the same way and works. Mentioning it only so nobody else spends time
on it.
Guida per i contributori
Apri la guida per i contributori
Direzione di ricerca
Start by reading the agentplatform._genai.rag AskContexts request conversion and comparing it with the retrieve_contexts path; reproduce the v1beta1 and v1 responses described in the issue. Done means the service's allowlisting status and expected SDK behavior are established, with any proposed change backed by a focused test or documented response.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Valutazione
- Stack tecnologico
- python
- Ambito
- api, backend
- Tipo di issue
- Bug
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Stato di attività
- Attiva
- Chiarezza
- Abbastanza chiara
- Idoneità per principianti
- 38/100