google / google/adk-go

Session.State().Get/Set do not appear to work

Open
#324 5 comments 0 reactions 0 assignees View on GitHub
bug
Dominant language
Go
Stars
8.8k
Forks
1k
Avg merge
3d 18h
Merged PRs (30d)
88

Description

I tried the following basic get/set with both in-memory and database, neither work as expected and have the same output, notably they both show the state value just after being set, but it never seems to retain after the function return

> [!CAUTION]
> none of the state prefixes appear to work

Not sure if I'm doing something wrong, or there is a copy in the implementation which means this never makes it back to storage...?

```go
func sessionGetState(r *runtime.Runtime, c *runtime.Client, m *runtime.Message) {

var s StatePayload
if err := json.Unmarshal(m.Payload, &s); err != nil {
log.Printf("Error unmarshaling 'session.getState' payload: %v", err)
return
}

// lookup session
resp, err := r.S.Get(r.Ctx, &session.GetRequest{
AppName: r.AppName,
UserID: c.User,
SessionID: s.Sid,
})
if err != nil {
...
}

v, err := resp.Session.State().Get(s.Key)
if err != nil {
...
}
s.Val = v

// fmt.Println("mailing sessions", payload)
c.Mail("session.getState.resp", s)
}

func sessionPutState(r *runtime.Runtime, c *runtime.Client, m *runtime.Message) {
var s StatePayload
if err := json.Unmarshal(m.Payload, &s); err != nil {
log.Printf("Error unmarshaling 'session.getState' payload: %v", err)
return
}

// lookup session
resp, err := r.S.Get(r.Ctx, &session.GetRequest{
AppName: r.AppName,
UserID: c.User,
SessionID: s.Sid,
})
if err != nil {
...
}

err = resp.Session.State().Set(s.Key, s.Val)
if err != nil {
...
}

fmt.Println("session.state", maps.Collect(resp.Session.State().All()))
}
```

```
Received message type: session.state.put
sessionPutState {28b3c4f4-d140-4409-ad0c-56336ad4971c title testing}
State Set 28b3c4f4-d140-4409-ad0c-56336ad4971c title testing
session.state map[title:testing]
Received message type: session.get
sessionGet {"id":"28b3c4f4-d140-4409-ad0c-56336ad4971c"}
Received message type: session.state.put
sessionPutState {28b3c4f4-d140-4409-ad0c-56336ad4971c foo bar}
State Set 28b3c4f4-d140-4409-ad0c-56336ad4971c foo bar
session.state map[foo:bar]
Received message type: session.state.get
Error: session.getState.getState: state key does not exist
Received message type: session.state.put
sessionPutState {28b3c4f4-d140-4409-ad0c-56336ad4971c user:name verdverm}
State Set 28b3c4f4-d140-4409-ad0c-56336ad4971c user:name verdverm
session.state map[user:name:verdverm]
Received message type: session.state.get
Error: session.getState.getState: state key does not exist
```

Contributor guide

Open the contributing guide

Research direction

Reproduce the example using both the in-memory and database session implementations, starting with the Session.State().Set and Get calls in sessionPutState and sessionGetState. Inspect how state is persisted after the function returns; done means values set under each prefix can be retrieved by a later session.state.get request for both backends.

Written by the indexing model from the issue text.

Assessment

Tech stack
go
Domain
backend
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Quiet
Clarity
Mostly clear
Newbie friendliness
48/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.