Skip to content

Commit cc31658

Browse files
authored
flow state refactor (#1358)
this pull request refactors the flow state preventing bugs and unexpected behaviours
2 parents 6fc5811 + 8c523b3 commit cc31658

File tree

109 files changed

+3363
-11171
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

109 files changed

+3363
-11171
lines changed

Makefile

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,13 @@ run_frontend:
4545
@-kill -9 `lsof -t -i:3000`
4646
cd src/frontend && npm start
4747

48+
tests_frontend:
49+
ifeq ($(UI), true)
50+
cd src/frontend && ./run-tests.sh --ui
51+
else
52+
cd src/frontend && ./run-tests.sh
53+
endif
54+
4855
run_cli:
4956
poetry run langflow run --path src/frontend/build
5057

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[tool.poetry]
22
name = "langflow"
3-
version = "0.6.5a8"
3+
version = "0.6.5a9"
44
description = "A Python package with a built-in web application"
55
authors = ["Logspace <[email protected]>"]
66
maintainers = [

src/backend/langflow/api/v1/login.py

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from fastapi import APIRouter, Depends, HTTPException, status
1+
from fastapi import Request, Response, APIRouter, Depends, HTTPException, status
22
from fastapi.security import OAuth2PasswordRequestForm
33
from sqlmodel import Session
44

@@ -16,6 +16,7 @@
1616

1717
@router.post("/login", response_model=Token)
1818
async def login_to_get_access_token(
19+
response: Response,
1920
form_data: OAuth2PasswordRequestForm = Depends(),
2021
db: Session = Depends(get_session),
2122
# _: Session = Depends(get_current_active_user)
@@ -31,7 +32,10 @@ async def login_to_get_access_token(
3132
) from exc
3233

3334
if user:
34-
return create_user_tokens(user_id=user.id, db=db, update_last_login=True)
35+
tokens = create_user_tokens(user_id=user.id, db=db, update_last_login=True)
36+
response.set_cookie("refresh_token_lf", tokens["refresh_token"], httponly=True, secure=True, samesite="strict")
37+
response.set_cookie("access_token_lf", tokens["access_token"], httponly=False, secure=True, samesite="strict")
38+
return tokens
3539
else:
3640
raise HTTPException(
3741
status_code=status.HTTP_401_UNAUTHORIZED,
@@ -41,9 +45,13 @@ async def login_to_get_access_token(
4145

4246

4347
@router.get("/auto_login")
44-
async def auto_login(db: Session = Depends(get_session), settings_service=Depends(get_settings_service)):
48+
async def auto_login(
49+
response: Response, db: Session = Depends(get_session), settings_service=Depends(get_settings_service)
50+
):
4551
if settings_service.auth_settings.AUTO_LOGIN:
46-
return create_user_longterm_token(db)
52+
tokens = create_user_longterm_token(db)
53+
response.set_cookie("access_token_lf", tokens["access_token"], httponly=False, secure=True, samesite="strict")
54+
return tokens
4755

4856
raise HTTPException(
4957
status_code=status.HTTP_400_BAD_REQUEST,
@@ -55,12 +63,23 @@ async def auto_login(db: Session = Depends(get_session), settings_service=Depend
5563

5664

5765
@router.post("/refresh")
58-
async def refresh_token(token: str):
66+
async def refresh_token(request: Request, response: Response):
67+
token = request.cookies.get("refresh_token_lf")
5968
if token:
60-
return create_refresh_token(token)
69+
tokens = create_refresh_token(token)
70+
response.set_cookie("refresh_token_lf", tokens["refresh_token"], httponly=True, secure=True, samesite="strict")
71+
response.set_cookie("access_token_lf", tokens["access_token"], httponly=False, secure=True, samesite="strict")
72+
return tokens
6173
else:
6274
raise HTTPException(
6375
status_code=status.HTTP_401_UNAUTHORIZED,
6476
detail="Invalid refresh token",
6577
headers={"WWW-Authenticate": "Bearer"},
6678
)
79+
80+
81+
@router.post("/logout")
82+
async def logout(response: Response):
83+
response.delete_cookie("refresh_token_lf")
84+
response.delete_cookie("access_token_lf")
85+
return {"message": "Logout successful"}

src/backend/langflow/components/embeddings/AzureOpenAIEmbeddings.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,20 @@
22
from langchain.embeddings.base import Embeddings
33
from langchain_community.embeddings import AzureOpenAIEmbeddings
44

5+
56
class AzureOpenAIEmbeddingsComponent(CustomComponent):
67
display_name: str = "AzureOpenAIEmbeddings"
78
description: str = "Embeddings model from Azure OpenAI."
89
documentation: str = "https://python.langchain.com/docs/integrations/text_embedding/azureopenai"
910
beta = False
10-
11+
1112
API_VERSION_OPTIONS = [
1213
"2022-12-01",
1314
"2023-03-15-preview",
1415
"2023-05-15",
1516
"2023-06-01-preview",
1617
"2023-07-01-preview",
17-
"2023-08-01-preview"
18+
"2023-08-01-preview",
1819
]
1920

2021
def build_config(self):
@@ -39,10 +40,9 @@ def build_config(self):
3940
"required": True,
4041
"password": True,
4142
},
42-
"code": {
43-
"show": False
44-
},
43+
"code": {"show": False},
4544
}
45+
4646
def build(
4747
self,
4848
azure_endpoint: str,
@@ -52,13 +52,13 @@ def build(
5252
) -> Embeddings:
5353
try:
5454
embeddings = AzureOpenAIEmbeddings(
55-
azure_endpoint = azure_endpoint,
56-
deployment = azure_deployment,
57-
openai_api_version = api_version,
58-
openai_api_key = api_key,
55+
azure_endpoint=azure_endpoint,
56+
deployment=azure_deployment,
57+
openai_api_version=api_version,
58+
openai_api_key=api_key,
5959
)
6060

6161
except Exception as e:
6262
raise ValueError("Could not connect to AzureOpenAIEmbeddings API.") from e
63-
63+
6464
return embeddings

src/backend/langflow/components/embeddings/OllamaEmbeddings.py

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from langchain.embeddings.base import Embeddings
55
from langchain_community.embeddings import OllamaEmbeddings
66

7+
78
class OllamaEmbeddingsComponent(CustomComponent):
89
"""
910
A custom component for implementing an Embeddings Model using Ollama.
@@ -23,19 +24,15 @@ def build_config(self):
2324
"temperature": {"display_name": "Model Temperature"},
2425
"code": {"show": False},
2526
}
26-
27+
2728
def build(
2829
self,
2930
model: str = "llama2",
3031
base_url: str = "http://localhost:11434",
3132
temperature: Optional[float] = None,
3233
) -> Embeddings:
3334
try:
34-
output = OllamaEmbeddings(
35-
model=model,
36-
base_url=base_url,
37-
temperature=temperature
38-
) # type: ignore
35+
output = OllamaEmbeddings(model=model, base_url=base_url, temperature=temperature) # type: ignore
3936
except Exception as e:
4037
raise ValueError("Could not connect to Ollama API.") from e
41-
return output
38+
return output

src/backend/langflow/components/llms/AzureChatOpenAI.py

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -53,11 +53,7 @@ def build_config(self):
5353
"required": True,
5454
"advanced": True,
5555
},
56-
"api_key": {
57-
"display_name": "API Key",
58-
"required": True,
59-
"password": True
60-
},
56+
"api_key": {"display_name": "API Key", "required": True, "password": True},
6157
"temperature": {
6258
"display_name": "Temperature",
6359
"value": 0.7,
@@ -72,10 +68,9 @@ def build_config(self):
7268
"advanced": True,
7369
"info": "Maximum number of tokens to generate.",
7470
},
75-
"code": {
76-
"show": False
77-
},
71+
"code": {"show": False},
7872
}
73+
7974
def build(
8075
self,
8176
model: str,

src/backend/langflow/components/llms/OllamaLLM.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -150,10 +150,9 @@ def build(
150150
"top_k": top_k,
151151
"top_p": top_p,
152152
}
153-
154-
# None Value remove
155-
llm_params = {k: v for k, v in llm_params.items() if v is not None}
156153

154+
# None Value remove
155+
llm_params = {k: v for k, v in llm_params.items() if v is not None}
157156

158157
try:
159158
llm = Ollama(**llm_params)

src/backend/langflow/components/retrievers/VectaraSelfQueryRetriver.py

Lines changed: 16 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -15,29 +15,21 @@ class VectaraSelfQueryRetriverComponent(CustomComponent):
1515

1616
display_name: str = "Vectara Self Query Retriever for Vectara Vector Store"
1717
description: str = "Implementation of Vectara Self Query Retriever"
18-
documentation = (
19-
"https://python.langchain.com/docs/integrations/retrievers/self_query/vectara_self_query"
20-
)
18+
documentation = "https://python.langchain.com/docs/integrations/retrievers/self_query/vectara_self_query"
2119
beta = True
2220

2321
field_config = {
2422
"code": {"show": True},
25-
"vectorstore": {
26-
"display_name": "Vector Store",
27-
"info": "Input Vectara Vectore Store"
28-
},
29-
"llm": {
30-
"display_name": "LLM",
31-
"info": "For self query retriever"
32-
},
33-
"document_content_description":{
34-
"display_name": "Document Content Description",
23+
"vectorstore": {"display_name": "Vector Store", "info": "Input Vectara Vectore Store"},
24+
"llm": {"display_name": "LLM", "info": "For self query retriever"},
25+
"document_content_description": {
26+
"display_name": "Document Content Description",
3527
"info": "For self query retriever",
36-
},
28+
},
3729
"metadata_field_info": {
38-
"display_name": "Metadata Field Info",
39-
"info": "Each metadata field info is a string in the form of key value pair dictionary containing additional search metadata.\nExample input: {\"name\":\"speech\",\"description\":\"what name of the speech\",\"type\":\"string or list[string]\"}.\nThe keys should remain constant(name, description, type)",
40-
},
30+
"display_name": "Metadata Field Info",
31+
"info": 'Each metadata field info is a string in the form of key value pair dictionary containing additional search metadata.\nExample input: {"name":"speech","description":"what name of the speech","type":"string or list[string]"}.\nThe keys should remain constant(name, description, type)',
32+
},
4133
}
4234

4335
def build(
@@ -47,24 +39,19 @@ def build(
4739
llm: BaseLanguageModel,
4840
metadata_field_info: List[str],
4941
) -> BaseRetriever:
50-
5142
metadata_field_obj = []
5243

5344
for meta in metadata_field_info:
5445
meta_obj = json.loads(meta)
55-
if 'name' not in meta_obj or 'description' not in meta_obj or 'type' not in meta_obj :
56-
raise Exception('Incorrect metadata field info format.')
46+
if "name" not in meta_obj or "description" not in meta_obj or "type" not in meta_obj:
47+
raise Exception("Incorrect metadata field info format.")
5748
attribute_info = AttributeInfo(
58-
name = meta_obj['name'],
59-
description = meta_obj['description'],
60-
type = meta_obj['type'],
49+
name=meta_obj["name"],
50+
description=meta_obj["description"],
51+
type=meta_obj["type"],
6152
)
6253
metadata_field_obj.append(attribute_info)
6354

6455
return SelfQueryRetriever.from_llm(
65-
llm,
66-
vectorstore,
67-
document_content_description,
68-
metadata_field_obj,
69-
verbose=True
70-
)
56+
llm, vectorstore, document_content_description, metadata_field_obj, verbose=True
57+
)

src/backend/langflow/interface/chains/custom.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,9 @@ class SeriesCharacterChain(BaseCustomConversationChain):
6767
class MidJourneyPromptChain(BaseCustomConversationChain):
6868
"""MidJourneyPromptChain is a chain you can use to generate new MidJourney prompts."""
6969

70-
template: Optional[str] = """I want you to act as a prompt generator for Midjourney's artificial intelligence program.
70+
template: Optional[
71+
str
72+
] = """I want you to act as a prompt generator for Midjourney's artificial intelligence program.
7173
Your job is to provide detailed and creative descriptions that will inspire unique and interesting images from the AI.
7274
Keep in mind that the AI is capable of understanding a wide range of language and can interpret abstract concepts, so feel free to be as imaginative and descriptive as possible.
7375
For example, you could describe a scene from a futuristic city, or a surreal landscape filled with strange creatures.
@@ -81,7 +83,9 @@ class MidJourneyPromptChain(BaseCustomConversationChain):
8183

8284

8385
class TimeTravelGuideChain(BaseCustomConversationChain):
84-
template: Optional[str] = """I want you to act as my time travel guide. You are helpful and creative. I will provide you with the historical period or future time I want to visit and you will suggest the best events, sights, or people to experience. Provide the suggestions and any necessary information.
86+
template: Optional[
87+
str
88+
] = """I want you to act as my time travel guide. You are helpful and creative. I will provide you with the historical period or future time I want to visit and you will suggest the best events, sights, or people to experience. Provide the suggestions and any necessary information.
8589
Current conversation:
8690
{history}
8791
Human: {input}

src/frontend/harFiles/backend_12112023.har

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -284,7 +284,7 @@
284284
{ "name": "Accept-Language", "value": "en-US,en;q=0.9" },
285285
{ "name": "Authorization", "value": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJkMjUzYmZiYS02MzY4LTQ0ZGMtODVmNy0wZDZkYTllNDU5NjgiLCJleHAiOjE3MzM4NTY4OTh9.5MFFb0JCck3ITSKXbxhwO9yAscnXcwXNTV70ZYBRB20" },
286286
{ "name": "Connection", "value": "keep-alive" },
287-
{ "name": "Cookie", "value": "access_tkn_lflw=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJkMjUzYmZiYS02MzY4LTQ0ZGMtODVmNy0wZDZkYTllNDU5NjgiLCJleHAiOjE3MzM4NTY4OTh9.5MFFb0JCck3ITSKXbxhwO9yAscnXcwXNTV70ZYBRB20; refresh_tkn_lflw=auto" },
287+
{ "name": "Cookie", "value": "access_token_lf=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJkMjUzYmZiYS02MzY4LTQ0ZGMtODVmNy0wZDZkYTllNDU5NjgiLCJleHAiOjE3MzM4NTY4OTh9.5MFFb0JCck3ITSKXbxhwO9yAscnXcwXNTV70ZYBRB20; refresh_tkn_lflw=auto" },
288288
{ "name": "Host", "value": "localhost:3000" },
289289
{ "name": "Referer", "value": "http://localhost:3000/flows" },
290290
{ "name": "Sec-Fetch-Dest", "value": "empty" },
@@ -338,7 +338,7 @@
338338
{ "name": "Accept-Language", "value": "en-US,en;q=0.9" },
339339
{ "name": "Authorization", "value": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJkMjUzYmZiYS02MzY4LTQ0ZGMtODVmNy0wZDZkYTllNDU5NjgiLCJleHAiOjE3MzM4NTY4OTh9.5MFFb0JCck3ITSKXbxhwO9yAscnXcwXNTV70ZYBRB20" },
340340
{ "name": "Connection", "value": "keep-alive" },
341-
{ "name": "Cookie", "value": "access_tkn_lflw=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJkMjUzYmZiYS02MzY4LTQ0ZGMtODVmNy0wZDZkYTllNDU5NjgiLCJleHAiOjE3MzM4NTY4OTh9.5MFFb0JCck3ITSKXbxhwO9yAscnXcwXNTV70ZYBRB20; refresh_tkn_lflw=auto" },
341+
{ "name": "Cookie", "value": "access_token_lf=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJkMjUzYmZiYS02MzY4LTQ0ZGMtODVmNy0wZDZkYTllNDU5NjgiLCJleHAiOjE3MzM4NTY4OTh9.5MFFb0JCck3ITSKXbxhwO9yAscnXcwXNTV70ZYBRB20; refresh_tkn_lflw=auto" },
342342
{ "name": "Host", "value": "localhost:3000" },
343343
{ "name": "Referer", "value": "http://localhost:3000/flows" },
344344
{ "name": "Sec-Fetch-Dest", "value": "empty" },
@@ -392,7 +392,7 @@
392392
{ "name": "Accept-Language", "value": "en-US,en;q=0.9" },
393393
{ "name": "Authorization", "value": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJkMjUzYmZiYS02MzY4LTQ0ZGMtODVmNy0wZDZkYTllNDU5NjgiLCJleHAiOjE3MzM4NTY4OTh9.5MFFb0JCck3ITSKXbxhwO9yAscnXcwXNTV70ZYBRB20" },
394394
{ "name": "Connection", "value": "keep-alive" },
395-
{ "name": "Cookie", "value": "access_tkn_lflw=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJkMjUzYmZiYS02MzY4LTQ0ZGMtODVmNy0wZDZkYTllNDU5NjgiLCJleHAiOjE3MzM4NTY4OTh9.5MFFb0JCck3ITSKXbxhwO9yAscnXcwXNTV70ZYBRB20; refresh_tkn_lflw=auto" },
395+
{ "name": "Cookie", "value": "access_token_lf=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJkMjUzYmZiYS02MzY4LTQ0ZGMtODVmNy0wZDZkYTllNDU5NjgiLCJleHAiOjE3MzM4NTY4OTh9.5MFFb0JCck3ITSKXbxhwO9yAscnXcwXNTV70ZYBRB20; refresh_tkn_lflw=auto" },
396396
{ "name": "Host", "value": "localhost:3000" },
397397
{ "name": "Referer", "value": "http://localhost:3000/flows" },
398398
{ "name": "Sec-Fetch-Dest", "value": "empty" },
@@ -446,7 +446,7 @@
446446
{ "name": "Accept-Language", "value": "en-US,en;q=0.9" },
447447
{ "name": "Authorization", "value": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJkMjUzYmZiYS02MzY4LTQ0ZGMtODVmNy0wZDZkYTllNDU5NjgiLCJleHAiOjE3MzM4NTY4OTh9.5MFFb0JCck3ITSKXbxhwO9yAscnXcwXNTV70ZYBRB20" },
448448
{ "name": "Connection", "value": "keep-alive" },
449-
{ "name": "Cookie", "value": "access_tkn_lflw=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJkMjUzYmZiYS02MzY4LTQ0ZGMtODVmNy0wZDZkYTllNDU5NjgiLCJleHAiOjE3MzM4NTY4OTh9.5MFFb0JCck3ITSKXbxhwO9yAscnXcwXNTV70ZYBRB20; refresh_tkn_lflw=auto" },
449+
{ "name": "Cookie", "value": "access_token_lf=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJkMjUzYmZiYS02MzY4LTQ0ZGMtODVmNy0wZDZkYTllNDU5NjgiLCJleHAiOjE3MzM4NTY4OTh9.5MFFb0JCck3ITSKXbxhwO9yAscnXcwXNTV70ZYBRB20; refresh_tkn_lflw=auto" },
450450
{ "name": "Host", "value": "localhost:3000" },
451451
{ "name": "Referer", "value": "http://localhost:3000/flow/2920dde2-5c24-4fe0-9c06-ef86b5a16a99" },
452452
{ "name": "Sec-Fetch-Dest", "value": "empty" },
@@ -500,7 +500,7 @@
500500
{ "name": "Accept-Language", "value": "en-US,en;q=0.9" },
501501
{ "name": "Authorization", "value": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJkMjUzYmZiYS02MzY4LTQ0ZGMtODVmNy0wZDZkYTllNDU5NjgiLCJleHAiOjE3MzM4NTY4OTh9.5MFFb0JCck3ITSKXbxhwO9yAscnXcwXNTV70ZYBRB20" },
502502
{ "name": "Connection", "value": "keep-alive" },
503-
{ "name": "Cookie", "value": "access_tkn_lflw=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJkMjUzYmZiYS02MzY4LTQ0ZGMtODVmNy0wZDZkYTllNDU5NjgiLCJleHAiOjE3MzM4NTY4OTh9.5MFFb0JCck3ITSKXbxhwO9yAscnXcwXNTV70ZYBRB20; refresh_tkn_lflw=auto" },
503+
{ "name": "Cookie", "value": "access_token_lf=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJkMjUzYmZiYS02MzY4LTQ0ZGMtODVmNy0wZDZkYTllNDU5NjgiLCJleHAiOjE3MzM4NTY4OTh9.5MFFb0JCck3ITSKXbxhwO9yAscnXcwXNTV70ZYBRB20; refresh_tkn_lflw=auto" },
504504
{ "name": "Host", "value": "localhost:3000" },
505505
{ "name": "Referer", "value": "http://localhost:3000/flow/2920dde2-5c24-4fe0-9c06-ef86b5a16a99" },
506506
{ "name": "Sec-Fetch-Dest", "value": "empty" },
@@ -554,7 +554,7 @@
554554
{ "name": "Accept-Language", "value": "en-US,en;q=0.9" },
555555
{ "name": "Authorization", "value": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJkMjUzYmZiYS02MzY4LTQ0ZGMtODVmNy0wZDZkYTllNDU5NjgiLCJleHAiOjE3MzM4NTY4OTh9.5MFFb0JCck3ITSKXbxhwO9yAscnXcwXNTV70ZYBRB20" },
556556
{ "name": "Connection", "value": "keep-alive" },
557-
{ "name": "Cookie", "value": "access_tkn_lflw=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJkMjUzYmZiYS02MzY4LTQ0ZGMtODVmNy0wZDZkYTllNDU5NjgiLCJleHAiOjE3MzM4NTY4OTh9.5MFFb0JCck3ITSKXbxhwO9yAscnXcwXNTV70ZYBRB20; refresh_tkn_lflw=auto" },
557+
{ "name": "Cookie", "value": "access_token_lf=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJkMjUzYmZiYS02MzY4LTQ0ZGMtODVmNy0wZDZkYTllNDU5NjgiLCJleHAiOjE3MzM4NTY4OTh9.5MFFb0JCck3ITSKXbxhwO9yAscnXcwXNTV70ZYBRB20; refresh_tkn_lflw=auto" },
558558
{ "name": "Host", "value": "localhost:3000" },
559559
{ "name": "Referer", "value": "http://localhost:3000/flow/2920dde2-5c24-4fe0-9c06-ef86b5a16a99" },
560560
{ "name": "Sec-Fetch-Dest", "value": "empty" },

0 commit comments

Comments
 (0)