Actually, that was my mistake : I added 'required' to everything that wasn't already annotated but it turns out the correct annotation is in fact 'optional'.
If that's ok, I have suggestion about the .proto file : since most fields are 'optional', the generated code checks for the presence of all these fields all the time. I think setting fields that are always present to 'required' will result in simpler code and possibly smaller messages. However, such changes will break compatibility with existing clients.
It might also be possible to merge some fields together. For instance, in the 'Response' message, both fields 'error' and 'has_error' are implicitly declared 'optional'. The two could be merged in one single 'optional' field that is present only if there was an error.
Let me experiment a little longer with the client I'm writing and, if you'd like, I'll contribute what I have on github.