MeUtils 2025.2.18.19.56.22__py3-none-any.whl → 2025.2.25.18.30.35__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. {MeUtils-2025.2.18.19.56.22.dist-info → MeUtils-2025.2.25.18.30.35.dist-info}/METADATA +263 -263
  2. {MeUtils-2025.2.18.19.56.22.dist-info → MeUtils-2025.2.25.18.30.35.dist-info}/RECORD +49 -40
  3. examples/_openaisdk/4v.py +3 -2
  4. examples/_openaisdk/openai_chatfire.py +12 -3
  5. examples/_openaisdk/openai_files.py +11 -7
  6. examples/_openaisdk/openai_images.py +18 -13
  7. examples/_openaisdk/openai_jina.py +58 -0
  8. meutils/apis/fal/images.py +83 -19
  9. meutils/apis/fal/pd.py +13 -0
  10. meutils/apis/fal/videos.py +31 -12
  11. meutils/apis/images/recraft.py +9 -6
  12. meutils/apis/jimeng/common.py +5 -1
  13. meutils/apis/jimeng/images.py +19 -8
  14. meutils/apis/kling/api.py +1 -1
  15. meutils/apis/niutrans.py +2 -0
  16. meutils/apis/oneapi/token.py +0 -2
  17. meutils/apis/search/zhipu.py +80 -0
  18. meutils/apis/siliconflow/images.py +4 -1
  19. meutils/apis/sunoai/suno_api.py +42 -0
  20. meutils/apis/to_image/md.py +24 -2
  21. meutils/apis/translator/deeplx.py +2 -1
  22. meutils/apis/vidu/vidu_video.py +2 -1
  23. meutils/caches/acache.py +51 -7
  24. meutils/data/VERSION +1 -1
  25. meutils/data/oneapi/FOOTER.md +2 -2
  26. meutils/data/oneapi/NOTICE.md +1 -151
  27. meutils/data/oneapi/_NOTICE.md +140 -0
  28. meutils/decorators/contextmanagers.py +47 -4
  29. meutils/files/__init__.py +11 -0
  30. meutils/files/qwen_files.py +30 -0
  31. meutils/io/files_utils.py +2 -2
  32. meutils/llm/check_utils.py +2 -1
  33. meutils/llm/clients.py +5 -2
  34. meutils/llm/completions/qwenllm.py +45 -5
  35. meutils/llm/prompts/search_prompts.py +18 -0
  36. meutils/schemas/image_types.py +4 -1
  37. meutils/schemas/oneapi/common.py +35 -7
  38. meutils/schemas/openai_types.py +4 -3
  39. meutils/schemas/suno_types.py +1 -1
  40. meutils/schemas/task_types.py +1 -0
  41. meutils/schemas/vidu_types.py +18 -4
  42. meutils/serving/fastapi/dependencies/auth.py +8 -2
  43. meutils/serving/fastapi/dependencies/headers.py +31 -0
  44. meutils/str_utils/json_utils.py +1 -0
  45. meutils/str_utils/regular_expression.py +7 -2
  46. {MeUtils-2025.2.18.19.56.22.dist-info → MeUtils-2025.2.25.18.30.35.dist-info}/LICENSE +0 -0
  47. {MeUtils-2025.2.18.19.56.22.dist-info → MeUtils-2025.2.25.18.30.35.dist-info}/WHEEL +0 -0
  48. {MeUtils-2025.2.18.19.56.22.dist-info → MeUtils-2025.2.25.18.30.35.dist-info}/entry_points.txt +0 -0
  49. {MeUtils-2025.2.18.19.56.22.dist-info → MeUtils-2025.2.25.18.30.35.dist-info}/top_level.txt +0 -0
@@ -9,49 +9,113 @@
9
9
  # @Description : https://fal.ai/models/fal-ai/flux-pro/v1.1-ultra/api
10
10
 
11
11
  from meutils.pipe import *
12
+ from meutils.str_utils.regular_expression import parse_url
13
+
12
14
  from meutils.schemas.image_types import ImageRequest, FluxImageRequest, SDImageRequest, ImagesResponse
13
15
  from meutils.schemas.fal_types import FEISHU_URL
14
16
  from meutils.config_utils.lark_utils import get_next_token_for_polling
15
17
 
16
18
  from fal_client import AsyncClient, SyncClient
17
19
 
18
- DEFAULT_MODEL = "fal-ai/flux-pro/v1.1-ultra"
19
- MODELS = {
20
- "flux-1.1-pro-ultra": "fal-ai/flux-pro/v1.1-ultra",
21
- "flux-image-to-image": "fal-ai/flux/dev/image-to-image",
20
+ recraft_styles = "any, realistic_image, digital_illustration, vector_illustration, realistic_image/b_and_w, realistic_image/hard_flash, realistic_image/hdr, realistic_image/natural_light, realistic_image/studio_portrait, realistic_image/enterprise, realistic_image/motion_blur, realistic_image/evening_light, realistic_image/faded_nostalgia, realistic_image/forest_life, realistic_image/mystic_naturalism, realistic_image/natural_tones, realistic_image/organic_calm, realistic_image/real_life_glow, realistic_image/retro_realism, realistic_image/retro_snapshot, realistic_image/urban_drama, realistic_image/village_realism, realistic_image/warm_folk, digital_illustration/pixel_art, digital_illustration/hand_drawn, digital_illustration/grain, digital_illustration/infantile_sketch, digital_illustration/2d_art_poster, digital_illustration/handmade_3d, digital_illustration/hand_drawn_outline, digital_illustration/engraving_color, digital_illustration/2d_art_poster_2, digital_illustration/antiquarian, digital_illustration/bold_fantasy, digital_illustration/child_book, digital_illustration/child_books, digital_illustration/cover, digital_illustration/crosshatch, digital_illustration/digital_engraving, digital_illustration/expressionism, digital_illustration/freehand_details, digital_illustration/grain_20, digital_illustration/graphic_intensity, digital_illustration/hard_comics, digital_illustration/long_shadow, digital_illustration/modern_folk, digital_illustration/multicolor, digital_illustration/neon_calm, digital_illustration/noir, digital_illustration/nostalgic_pastel, digital_illustration/outline_details, digital_illustration/pastel_gradient, digital_illustration/pastel_sketch, digital_illustration/pop_art, digital_illustration/pop_renaissance, digital_illustration/street_art, digital_illustration/tablet_sketch, digital_illustration/urban_glow, digital_illustration/urban_sketching, digital_illustration/vanilla_dreams, digital_illustration/young_adult_book, digital_illustration/young_adult_book_2, vector_illustration/bold_stroke, vector_illustration/chemistry, vector_illustration/colored_stencil, vector_illustration/contour_pop_art, vector_illustration/cosmics, vector_illustration/cutout, vector_illustration/depressive, vector_illustration/editorial, vector_illustration/emotional_flat, vector_illustration/infographical, vector_illustration/marker_outline, vector_illustration/mosaic, vector_illustration/naivector, vector_illustration/roundish_flat, vector_illustration/segmented_colors, vector_illustration/sharp_contrast, vector_illustration/thin, vector_illustration/vector_photo, vector_illustration/vivid_shapes, vector_illustration/engraving, vector_illustration/line_art, vector_illustration/line_circuit, vector_illustration/linocut"
21
+
22
+ ideogram_styles = "auto, general, realistic, design, render_3D, anime"
22
23
 
23
- "recraft-v3": "fal-ai/recraft-v3",
24
- "ideogram-v2": "fal-ai/ideogram/v2",
25
- }
26
- mapper = "fal-ai/".removeprefix("fal-ai/")
24
+ # https://fal.ai/models/fal-ai/any-llm/playground
25
+ llms = "anthropic/claude-3.5-sonnet, anthropic/claude-3-5-haiku, anthropic/claude-3-haiku, google/gemini-pro-1.5, google/gemini-flash-1.5, google/gemini-flash-1.5-8b, meta-llama/llama-3.2-1b-instruct, meta-llama/llama-3.2-3b-instruct, meta-llama/llama-3.1-8b-instruct, meta-llama/llama-3.1-70b-instruct, openai/gpt-4o-mini, openai/gpt-4o, deepseek/deepseek-r1"
27
26
 
28
27
 
29
28
  async def generate(request: ImageRequest, token: Optional[str] = None):
30
29
  """https://fal.ai/models/fal-ai/flux-pro/v1.1-ultra/api#api-call-submit-request
31
30
  """
32
- token = token or await get_next_token_for_polling(feishu_url=FEISHU_URL)
33
- request.model = MODELS.get(request.model, DEFAULT_MODEL)
34
31
  logger.debug(request)
35
32
 
36
- data = await AsyncClient(key=token).run(
37
- application=request.model,
38
- arguments={
39
- "prompt": request.prompt,
40
- "seed": request.seed,
33
+ s = time.time()
34
+ token = token or await get_next_token_for_polling(feishu_url=FEISHU_URL)
35
+
36
+ arguments = request.model_dump(exclude_none=True)
37
+ width, height = request.size.split("x")
38
+ if request.model.startswith("fal-ai/recraft"): # https://fal.ai/models/fal-ai/recraft-v3/api#queue-submit
39
+ arguments = {
40
+ **arguments,
41
+ "image_size": {
42
+ "width": width,
43
+ "height": height
44
+ },
45
+ "style": request.style if str(request.style) in recraft_styles else "realistic_image",
46
+
47
+ "output_format": "png",
48
+ }
49
+ elif request.model.startswith(
50
+ "fal-ai/flux/dev/image-to-image"): # https://fal.ai/models/fal-ai/flux-pro/v1.1-ultra/api
51
+ urls = parse_url(request.prompt)
52
+ image_url = urls[-1]
53
+ prompt = request.prompt.replace(image_url, "")
54
+
55
+ arguments = {
56
+ **arguments,
57
+ "image_size": {
58
+ "width": width,
59
+ "height": height
60
+ },
41
61
  "num_images": request.n,
42
62
 
43
- "aspect_ratio": "16:9", # 21:9, 16:9, 4:3, 1:1, 3:4, 9:16, 9:21 ImageSize
63
+ "enable_safety_checker": False,
64
+ "safety_tolerance": "6",
65
+ "output_format": "png",
66
+ "seed": request.seed,
67
+
68
+ # image2image
69
+ "image_url": image_url,
70
+ "prompt": prompt,
71
+ "guidance_scale": request.guidance or 3.5,
72
+
73
+ **request.controls
74
+ }
75
+ elif request.model.startswith("fal-ai/flux"): # https://fal.ai/models/fal-ai/flux-pro/v1.1-ultra/api
76
+
77
+ arguments = {
78
+ **arguments,
79
+ "num_images": request.n,
44
80
 
45
81
  "enable_safety_checker": False,
46
82
  "safety_tolerance": "6",
47
83
  "output_format": "png",
84
+ "seed": request.seed,
85
+
86
+ "aspect_ratio": request.aspect_ratio or "1:1" # 21:9, 16:9, 4:3, 3:2, 1:1, 2:3, 3:4, 9:16, 9:21
87
+
48
88
  }
89
+
90
+ elif request.model.startswith("fal-ai/ideogram"):
91
+ arguments = {
92
+ **arguments,
93
+ "style": request.style if str(request.style) in ideogram_styles else "auto",
94
+
95
+ # 10:16, 16:10, 9:16, 16:9, 4:3, 3:4, 1:1, 1:3, 3:1, 3:2, 2:3
96
+ "aspect_ratio": request.aspect_ratio or "1:1",
97
+
98
+ "seed": request.seed,
99
+
100
+ }
101
+
102
+ data = await AsyncClient(key=token).run(
103
+ application=request.model,
104
+ arguments=arguments,
49
105
  )
50
106
 
51
- return ImagesResponse(data=data.get("images", data))
107
+ return ImagesResponse(data=data.get("images"), timings={"inference": time.time() - s})
52
108
 
53
109
 
54
110
  if __name__ == '__main__':
55
- pass
56
- request = ImageRequest(prompt='a dog')
111
+ model = "fal-ai/flux-pro/v1.1" # 0.04
112
+ # model = "fal-ai/flux-pro/v1.1-ultra"# 0.06
113
+ # model = "fal-ai/flux/dev/image-to-image" # 0.03 图生图
114
+ # model = "fal-ai/recraft-v3" # 0.04 变清晰
115
+ # model = "fal-ai/ideogram/v2" # 0.08
116
+ model = "fal-ai/ideogram/v2/turbo" # 0.05
117
+
118
+ # request = ImageRequest(prompt='https://oss.ffire.cc/files/kling_watermark.png The woman smiled', model=model)
119
+ request = ImageRequest(prompt='a cat', model=model)
120
+
57
121
  arun(generate(request))
meutils/apis/fal/pd.py ADDED
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env python
2
+ # -*- coding: utf-8 -*-
3
+ # @Project : AI. @by PyCharm
4
+ # @File : pd
5
+ # @Time : 2025/2/19 13:23
6
+ # @Author : betterme
7
+ # @WeChat : meutils
8
+ # @Software : PyCharm
9
+ # @Description :
10
+
11
+ from meutils.pipe import *
12
+
13
+ df = pd.read_csv('x.txt', sep='--', header=None)
@@ -50,34 +50,53 @@ async def get_task(task_id: str, token: Optional[str] = None):
50
50
  application = f"fal-ai/{model}"
51
51
 
52
52
  client = AsyncClient(key=token)
53
- response = await client.status(application, request_id, with_logs=False)
54
- logger.debug(response)
53
+ response = await client.status(application, request_id, with_logs=True)
55
54
 
56
- # response = await client.result(application, request_id)
57
- # client.AsyncRequestHandle(request_id='0b7ab6b8-c7dc-4f17-a655-4ee56dd0f864')
58
- return response
55
+ logger.debug(response.__class__.__name__) # Queued, InProgress, COMPLETED
59
56
 
57
+ if metrics := response.__dict__.get("metrics"): # {'inference_time': 17.29231595993042}
58
+ response = await client.result(application, request_id)
60
59
 
60
+ return response
61
61
 
62
62
 
63
63
  if __name__ == '__main__':
64
64
  model = "latentsync"
65
- model = "sync-lipsync"
65
+ # model = "sync-lipsync"
66
66
  audio_url = "https://oss.ffire.cc/files/lipsync.mp3"
67
67
  video_url = "https://oss.ffire.cc/files/lipsync.mp4"
68
+
69
+ audio_url = "https://oss-shanghai.sanwubeixin.cn/cache/file/20250218/173988875057269.mp3"
70
+ video_url = "https://oss.sanwubeixin.cn/material/test/output2.mp4"
68
71
  request = FalVideoRequest(
69
72
  model=model,
70
73
  audio_url=audio_url,
71
74
  video_url=video_url
72
75
  )
73
76
 
74
- r = arun(create_task(request))
75
-
77
+ #
78
+ # r = arun(create_task(request))
79
+ # logger.debug(f"{r.task_id, r.system_fingerprint}")
80
+ #
81
+ # task_id = r.task_id
82
+ # arun(get_task(task_id, r.system_fingerprint))
76
83
 
77
- task_id = r.task_id
78
- arun(get_task(task_id, r.system_fingerprint))
84
+ # task_id = "latentsync::b2350e2b-5a48-4390-9089-120fb74f6b7b"
85
+ # token = "843e6ba3-cfb1-4305-be0d-39e923295949:72bce9f9cd5257011ab18f335e2661d4"
86
+ #
87
+ # r = arun(get_task(task_id, token))
79
88
 
80
- # task_id="latentsync::d4133f01-0f5b-4213-abe4-d14abdb57e3f"
81
- # token = "3f712efa-a692-4e7f-9409-e6c505bab4e2:151a0b6093312cc8f66fc52b7c4c92a8"
89
+ # task_id, token = ('sync-lipsync::45b89e28-8b52-47cb-99de-9b68ce65b9b8',
90
+ # '843e6ba3-cfb1-4305-be0d-39e923295949:72bce9f9cd5257011ab18f335e2661d4')
91
+ #
92
+ # r = arun(get_task(task_id, token))
82
93
 
94
+ # task_id, token = ('latentsync::7246cb3b-55e8-490f-bcb1-f05d8c515350',
95
+ # '3f712efa-a692-4e7f-9409-e6c505bab4e2:151a0b6093312cc8f66fc52b7c4c92a8')
96
+ #
83
97
  # r = arun(get_task(task_id, token))
98
+
99
+ task_id, token = ("latentsync::a90be257-3c21-43b2-a05c-6274543c3d02",
100
+ '843e6ba3-cfb1-4305-be0d-39e923295949:72bce9f9cd5257011ab18f335e2661d4')
101
+
102
+ r = arun(get_task(task_id, token))
@@ -32,8 +32,7 @@ send_message = partial(
32
32
 
33
33
  @cache(ttl=10 * 60)
34
34
  @retrying()
35
- async def get_access_token(token: Optional[str] = None):
36
- token = token or await get_next_token_for_polling(feishu_url=FEISHU_URL, check_token=check_token, from_redis=True)
35
+ async def get_access_token(token: str):
37
36
  headers = {"cookie": token}
38
37
 
39
38
  async with httpx.AsyncClient(base_url="https://www.recraft.ai", headers=headers, timeout=60) as client:
@@ -45,6 +44,8 @@ async def get_access_token(token: Optional[str] = None):
45
44
 
46
45
  # @retrying()
47
46
  async def generate(request: RecraftImageRequest, token: Optional[str] = None):
47
+ token = token or await get_next_token_for_polling(feishu_url=FEISHU_URL, check_token=check_token, from_redis=True)
48
+
48
49
  token = await get_access_token(token)
49
50
  headers = {"Authorization": f"Bearer {token}"}
50
51
  # params = {"project_id": "26016b99-3ad0-413b-821b-5f884bd9454e"} # project_id 是否是必要的
@@ -109,7 +110,9 @@ async def check_token(token, threshold: float = 1):
109
110
  response = await client.get("/users/me")
110
111
  response.raise_for_status()
111
112
  data = response.json()
113
+ logger.debug(data)
112
114
  logger.debug(data["credits"])
115
+
113
116
  return data["credits"] >= threshold
114
117
  except Exception as e:
115
118
  logger.error(e)
@@ -130,7 +133,7 @@ if __name__ == '__main__':
130
133
  token = "__Host-next-auth.csrf-token=b6b37b10948a6156a1a39d09bd43ab6d0867fcd6001987531fe6f86f802bb0aa%7C3afdfd56119e801c5cb80dc96670031c85a2d9a02e8205f38fc5d6128e1a4075; _gcl_au=1.1.386131236.1736384852; _ga=GA1.1.282109674.1736384854; AMP_MKTG_7268c9db0f=JTdCJTdE; _fbp=fb.1.1736384856672.571916090953259055; _clck=2fa0yj%7C2%7Cfsf%7C0%7C1835; x-recraft-referral-code=1f1xoKVYB9; __Secure-next-auth.callback-url=https%3A%2F%2Fwww.recraft.ai%2Fprojects; _uetsid=1d264620ce2611efaf8a0f99cb3bbb99; _uetvid=1d2649e0ce2611efb597376fda548d79; AMP_7268c9db0f=JTdCJTIyZGV2aWNlSWQlMjIlM0ElMjJlMTcxNjRlMy0xMjU4LTQ3ZTYtYTJmYi1jN2JhM2FmNWRiZWUlMjIlMkMlMjJ1c2VySWQlMjIlM0ElMjJlYTNmNmY4NC0zNzNhLTQ0ODgtYTRjMi1mYjgxMzk1YzNiMzElMjIlMkMlMjJzZXNzaW9uSWQlMjIlM0ExNzM2Mzg0ODU2MzQxJTJDJTIyb3B0T3V0JTIyJTNBZmFsc2UlMkMlMjJsYXN0RXZlbnRUaW1lJTIyJTNBMTczNjM4NTAzMTczNyUyQyUyMmxhc3RFdmVudElkJTIyJTNBNjQlMkMlMjJwYWdlQ291bnRlciUyMiUzQTEzJTdE; _clsk=szrjt7%7C1736385032306%7C11%7C1%7Cq.clarity.ms%2Fcollect; _ga_ME15C3DGRL=GS1.1.1736384853.1.1.1736385032.0.0.0; __Secure-next-auth.session-token.0=eyJhbGciOiJkaXIiLCJlbmMiOiJBMjU2R0NNIn0..SyUWD5O3-8Fu7f9K.jbfQGmUTAstB_wL4cyqA7QcbWKp4AFMnouf-WtJnwaPC4gIfu7iuNkXmrvbfp2YsqFJzSIl-5MvZrXt-bhk-DJtwqAdPzTw6sSa33I3IHWSS3TVlVFc9Ze-HT_6dIeMpIiN-rCSNGdpmtkEJLp_3WrCSGPB0NbJLLL_MGg6cQdS5WYz4trehD8sPSQUgYlTw_VaMImqVZOxKujLLgmGfgYdV8nl9p-JmFHMbpfcgn-yXqLca8E50sQOWldPw0p4RqsYyByUANX1POJAW33rm9fsRDHEKtVxOtlW5Hy1jev__V9UqSrhcvH_OQREngiQGYbtD0qLogeUg-vbL0VUAL-9USzXIn2Una3lP04lp3m_NKldiSShXsHJT8RW8IAl7K28ILGilA1fgx0V09JFIHhM4fX-hrPzqoh-BuxaaiF5czEHTtTPLXmnV1UiQgZVmfgliI2e_r9J3WtF-SgSc1Il2cvwxAsp66p5cjixFbpj7AULPXndQniHhTiU9zgDDdv-fEf0arKzW2w0--zwSmYizXMMpNblgxZ9k51CdOBCAM9YGtzDaB-NSA8I9RuHzmgXMvT5GMZSiezuoLdRRcVpuJBz-XF0v9QoQz7SQt6aMaCCTa-fxee--nfYZELu1Uhh90StcuT84VOAlx-wg6FxPEDI6cjlVtKuzcN_RMVYbWKO2z5xLw4zlqyGBleRjt7hNNt-IeCbGuaDxgbUViwhNr_qdh-_ZjQlz_FL4rzlJwPrl6puOsydFF8NIy0MU9oBdelGTtG8LwzNnOW_hGdqEfhXfDP9mzv4Fs4kqGNQxvT0PU2NQ5hIOTb540yHqTGb3kihXPaZL4YregR2-UPRxOM1qmWwgRZ93d9m0BUplhO9s9U2hYoLhp01ID8kiNi2AWp0hRcalh6PwgqSdzgbif3IH8AcHRJpnV2pRSbD7k883O6ukkItWPE-ysv-ak_Hl8FR046xjDaX1ITtyrJmTzFqQ627PGuOt01RmsVMOb1IFCcx4Fr4AYwOMDY0RDk1YxIUUqU4kyMZMVlMrI_ITcrYshdJwdr4k3hNk51gS3QUrhIDnUq93mvUSidSUy_jX47H-ORf9Al5poN3vNJPye9ogASdqRr2psn1UpceMzrejXz_xDSBllWGlSyAmHDlXniKfzGSbRtqET9xRZfy7X0iOGd0WW2Sb9BkI2OE6h2abFkeSmTXJTMaZXhQ244XkhvDVnps1QX4mdSIa1Js0Pb73DcWLV5TR1sTVxm5h9c1l5r-YxWQ9hjF3A43_V0Jp9ATDlcPIjewTqAcPuuNhcQRR6i7pt2CadiFpfT-h7DA1PvPRo7ReySBzDK9VhnlvodflQugnxj5gsRljH6r43s4OrgpJwCtENl-_yw4jDJCCXkJwHfLpSKhLR6CFSM52vrMa9fWg7iW1C4HIVVqyqIwC98-CTe5jYDMKrX_g40oDZL3XEhFCTfzl5o_UfqXJEWlDKZ0D_Aig7iNLDOEq3cwK9QDiP4-bX6jtM1zkltpCY-HPpwTXbtV4iIP6usg9lSJgCDgJjaS39rpBVYSrj-Y_PtPlPW5rJMVkSnp_f_J7uAwQWnluuEpxrb0Ap-vF4Vk4q9gBESbnk3PBg8wfFPC1GesPI4HyG8Jy3oIss8pDXba6D70soJiozgBcPTSxdeDIP1CXsRN2wiItYHeyslQE-_egn8oezT9__8LyVrY8guv14Nu-WGPx3R9xzpHn4TPY3nJQ6bU9H0PlB0qmJLsSh6tWtJ0Yl8-NMlEKr9WkcjOJB-QpFiDEyw3V7r65U5b_BOaNpzRA5OUJ_ZmCfufmyfnHm8R6mE5wqrwUfmxYBRfP_w8_ix58zwTzFsLe7Fii5_J411vqxFHefcljnpgFgf1UIOoAPBUfygBTVdpdJcWzA2QXNI9lKxUIC6pLme9rpNlXE2bCE1cn74qA974x1gBjZ5B_FVsmkYhFRwSboi8ypRFA1F6EWwSNO-LUQH8uVbrDisjjjAX19xq_Sibwq5P-dZMY6aLCuInQjfWic5NGsjjwh4xtBv3FTyt1nvt9SonxdsJi_wvcjEoCVyP7PfYy5Eo-MkOpznzGYc9slQscUhKPihaB7wlAJZxe99tBUHLJI6XoI1o2Z3G4KGRK6PTO_THOTVFBylKTMbg_jvHw63TL4-LNlhJ2efmSjnEZqpGkgIUb8wYSoG3OR-v3H7WPvvAtJAs-NfvQXSGaFZ3O-LnStvyT869zXwP9U6_NZjml7gB9iA0cZVw4o5tAFI5DPVstJAqSrjIW59cpTxxDo2zeBdl8aq5FoKIZ63w8QebUeibLT8_lejsWQtg8RX4WrSTbuZN-gtCsMY4Q-TY4gJtVygtjz44QMzYDXq0G5mlqnPanLvR9tOfZODm8z87e355KdmD7pI305NimlYjMAFECfAaQN4G3oDZiDb85KkO92JXlVwWbo1xfbx4FTikedjY-BI1ErQB5gxTgPo252aw5r9fItydPBE_nuZU211tc41k8IF2F_cbSZ9tUjZz14yb4Ux4RWUdtHs3y7Jh9_5Pj0dnS3dEgJ-7jlhz-v2tmrcgzcEKqDPQGdhKfLl__AMM_11LqMuvj0boYiiaDx8DHN95J_d48um0YvB5IU3sQucEXiRK2j8FpAXc9ptQqPTGdSzz4VhIE0EIzZIV3QqqaRqH6ZEXcNuV_DXwl6HOjui78yu-rpqz50E9fxePaV5LHPbzXp_ZEOLrWonqo9ZAIHzWhCbVM_vMxK7CnrfmhW4ow8l71maoD0ToyTW7J0KbegCnEVyVhAF-IqYc98gq0vEbfgH42JKk07-8v1gVNQ6TZpAbtgajdrRe9XCuR58f_dt7_y8xWLXw_tINMB-x5MLNbdomfSMsit9Vfl29Yr8yD4KIkYhsfhl-nH-7ntrx4KkkLdLoNhKbhdI7o7NO1zdJ22ur7op4YlAWSNq5q-q2uhF3bKTkYhAIJ2FnPZpYmv7NoldLkAML79C7xtbZTJ0ZgXCjxzbEI50-9qvhEMSNm5AjZLrE3tTp6GVJWfIvjb3HmTvEAxR3rRefzzTaKW-MO9t3OurUPood1vkMR7oQzQY_n6DaZKUcxA6L8sK8s2MfEb78h_ZKeKDRAFsnspHdVTYf4xEu_SbXyDYbx2vBU2beXYdhzcdLWff32f3jioAf_q8hk2wKAcj2Spik7Ng-HPbme3XPD0w1b6d266bJ8GIWCUoGmJ9Wm0UalL-ZnoX16yN9El_wfOEoXBFWRe56Ur1ih6ZwZkcuCMZcnUAlXaL3JGgrxtwQjUtuSPSAo7kBZGIS7xXzFL7aJOi9ctqBAJVH0C3g8TJcW7ilF-qzEwrOoo1zWfLQpxMXhg8XKLDzOPAFBwyEOlDaRdoj20aE6NTeWST-X3QEufdM0PE0uB3FAhYWTPyILrAulrIsMJphGU-9sABotQs9apb8Vvekzou3oQ02Nr8n_CHVdDfE7m9I1lOxnB8Yz78oJhBs0WAbcZL9Vy-c-RVBauUMgceqSyQJ3uHR3iWsze4yeVOb4LE4nUxsfBMHQhW-Via3wFpInCCJxS3je2wtiyDTztuMNN8Mxn_GuTJ1i-KkDdvWiAL9c4zg_6HQfsMpLXQXpJ4Ovk-wUAV_NaW9NnVXHR-ygTcsf-BUHEV6dm0EPEk3tNVdlOTMDzXeYmpXn7xSSPuHglNcLnCzbmiANoqs1N5knV9_gVx49MLkYzE2rK_xdAFZUgiR4uujQ16mWNHtzrUUZOWmPu0HrAt2cJsz0snCfakahNceO3di-MQCDppMUnoSlq2ZnRcsMYu_n7mjOP6suimdawk9Ik1y_RpJ1O92UjKl63SqTtknADbwywiDiLr62V59YEUxKhGIaNrg; __Secure-next-auth.session-token.1=q9Nx6cKkfa0ZpdMRs7aQg5BCEByRK-upafTx1BRw9yA7R30AXoMtQfz6ExKBqsbpyVHqJFnLBQuZqJEi_Bmk34FeYJrUjD1ddsPmEex0ftUACPSugpdrgsTxc8CN0f4a8t_m8wTHxhQWbE5_GT-A4Hb4T68U9pDkzA1kWMVHkQ6h1x7HyW_Ykh1KXejgZFJBhdvv4dAKpv0ckYCNXwJVgVwCKGCNikx-ubtZ-5XDX5ZquUNzVEGpx1cr-F4e0-aw8CDQmdZ0Zh7VHV5DKL7SkQW20FHjpiK-J6gdkkjGFX7EybuEM1KCZ-KI_9hna9JzZc52f_yyoN05hqTzWmfh4aFeQL3j1nErMn23uiava2BfKIoQ59dKWOO5zos66El2TtIFerhUFJDyt8sUOcybCWsmmf05oSeLzHeaJYBA8j7SP.FYyhM198a9ZP-Ep6hZRQNQ"
131
134
  token = "__Host-next-auth.csrf-token=b6b37b10948a6156a1a39d09bd43ab6d0867fcd6001987531fe6f86f802bb0aa%7C3afdfd56119e801c5cb80dc96670031c85a2d9a02e8205f38fc5d6128e1a4075; _gcl_au=1.1.386131236.1736384852; _ga=GA1.1.282109674.1736384854; AMP_MKTG_7268c9db0f=JTdCJTdE; _fbp=fb.1.1736384856672.571916090953259055; _clck=2fa0yj%7C2%7Cfsf%7C0%7C1835; x-recraft-referral-code=1f1xoKVYB9; __Secure-next-auth.callback-url=https%3A%2F%2Fwww.recraft.ai%2Fprojects; _uetsid=1d264620ce2611efaf8a0f99cb3bbb99; _uetvid=1d2649e0ce2611efb597376fda548d79; __Secure-next-auth.session-token.0=eyJhbGciOiJkaXIiLCJlbmMiOiJBMjU2R0NNIn0..WqFwC8QbnjwUkMxi.RYqiKFIQTVwJF5azhoAlOscRiivJrpL5fRaArVfPstl4mOB0YTUtp3l7TMKbGEsM8nV2DW68eRarLqQeVjq0eKzD4MNuvuKy0y0phQTMs7vKlKCM5UgWMxz3Uz30f7GmH6s4D0aFDGbJ6upcsUqZ0BMwY2KkXId5uilh0jrDhinv5ZCIQA0o89Nf_lOcapGVsEi4OdYhe8fDDuhaI8x8TnkTQcDjwijc44WWUQg5vXJusYAVRbXR0-hO_fLl7verrBVKWPKXsP_tbRSk2TIqTavXoP-RcHI55R-vQD0G3lbl0hkjiDhWZ8SG2g3_KkbnF9XovoilxZpguNUSqLLHevldctBrMDG9vnoG6FRVwmPF8T5IxVYnkCb5IiyIJLMAOWlVlcNmKM2n2N-_iW21-skyqq0O0sUpukL0gFLp5UlpKtXUbTOMaD60Ja0D7n2THWO3yWrlTmXJ641igNxsAfb8iMuN9XpVSLTGmSVoojIQkbb41Br5ZmAdlH3D9X2u7cZD756HkOG4LhWp6rjaoUwDY1XBMjSxs9lOOGQGnr7xfmVC7fSWDuRhHxwF0C9PUbndo3zv12A437VASNXzuJ7W-nvBP0i7PUw09bKgYTsUyytFwBiRFW_Lj3l5Fcu0qrXQBosvdZvgS3QNEMqOWPWiyQBI5NatP8ZSQuquzvNDRt4typ5T6YP6NEqqMwSLRL6mwA1_ZquU78kygEUFYq5fUtUoWoW8CdbHsZe8DvN0fIhW2iAguey5hj7Dwg3xstOM-aDyRMbY-ML__zTi0w-TB0XzJ9NSXe8a1b3vvjzNqNWmeUwF4eT2KAloIvKRrlWZRC3OedxI8aRvoVGcnWqpRsvZNgUY3blfxG9lR1KrNgAcDhcRB3Si3APLlUT5Uv0MzfZKwWtZ16lLNmY6bRnlQO_IGRVvGWp0tXiwMAR6vXEhq3FqEOMy9W1JW2MVS9s_mpOrloRr4CIxtDbrE90Pjhm1wPzC43OMGsm2gxU8JTaRtWftnZ6EUlO2rski0Ep2Kl_iTwotDVPZY3RV9B8GWTfmJ8mU2EPTjlKcpeyPGiLdZkI4r5HGT6Bt9sv3JXQeU64ecmhbDEr9zrDVRDJlt3nGsQlDq21xkOsQw6nyFjg0cw_i5sGqkyLEQgkfVHGaNuUy_aP7us-DHeLCgusM0qFjsGh6TqY536AxlecGZr5Xh7FOEgVcNHfmT8gTRGPJuqMU_c8kyWqhihx_vm1dTTkHF0O4LJ3W9c-8sAQhsHvzsGGoEBkCi3TaTlBAcJ1_4ix1ITj21Ix1Udmc4cvNE5NRW_aBiwGQvrKlT7qvpxzzHZd-zpF2jAN78bGm6-jK2WSy59-y4FN9ZUrG1QwG5n-3rFiSl-pqRY3Bybx4ANnEU1cbf-0rnL-R3rcbCOEcMOf3CWc78PraUa7sqoV4tnmJdSwjmpVPmptOs2b9bbg6B7XqAsYX9PlkSAztLJQlVIUD4et0O1MOf5nSCmOG-x4cb1wtw8O2ZKea963732M9MUpiw9jBn2sAQbH5cufD0xlXGuVzn8gkDzOb007V018t--yJmbYcvDgMbp7VPESkQdtVMScn-jcpzNrdqDRIUjehEseVuULZhlv4HKopQjNrnyEenZb7kbeogISNKAa5zVKLKots1L9kTHkyziYdcv8bETD53c1CiIekupheQO32zXFc5KDeoTyQNi0O4KKpSCKSlp8GtmNt1q5--y8z1mmFru0xQeTcFG7rgm-q3u6lIQuxRM5n-hHdosYhRsJmX_AOlzw7UpagoV90hzxfGQwa5Oa9OHfoisF5-ueVsibMe-mqWct6OVV9Rke_7lPfjhVbQUS1-Y73MJJF1H5uW8b88GZqPIFxNTb8P-1ACFCWFpvCJRHjJ2rNP5AF1VtSKIgitmaNVwmqcwCwXOpGO7KqSqfKiIBGgik2t7T_joJjwZetvjpnZ-apNCJpmqtJc1rEfDGDBQvaXEuIJ3aB2nB1f4JNqxUatW9D_QMuLHvKmKPlRBQRtHMA7p-XFaJHQm4U-yhz75eGMCfcT7ik-3i8QNFJwwrZcWVbDNqdExmpV0hiE9fjgbmhU5OkoysPgrZfn0WSfo1Cdccb8WQuR8Kn_xj9cCqUjLm79mrsfUzLDsQOgIRBeiUoAH3oQKfI5Iqp2tquOHWb8SyZwENkpKPnipX_60G7BxcqpB5WI6-3MIilfH9itqdYYKImNncuVEzNZX-b2STHKxX1ESCgeb-Hq6SUuEwQtHK0lFnw_Jom8he6ShB-n4a2s6dBO4zT_awB4LZF42-ri7ewlONh2WzLTGW-lK7JNLPEfeXWR-jye7ALwGA2UEtXisMUhEMpuCt2La5EiCKBaw6deGygVbJ2t6dEbkSSEAoZONHctgqmZ9dNMaXC9Hyyo5sPKZPo8uXtJSslyHJlMvgY4W8Uj41IP3Umw1-j_FjYjWiOc5BFAvSbLczgWoXWqbcDa2plXnUmty9OTHw02dZb4opkhLi43ONSodwHqHGWyTgH3kdRhFYV-2uwkSVF8nZG0RHxEDGB3knN6HoHji2LJcn9TwZzOQDaG5sJzrVI12ZLPUx3KSxrygZ6d7KFJpXmi7jXe2kyExrO_HtpNebKq__h776GvuWsx887t2T-DoA1XFoNxbSWIDBaaRrrrMQnTubI7Dl6gs3ea7z2hmDFYcwrqb0r9bDBgx7yhSPjn3AgoRs43NYRe1gVoURcHduyFS6DM7wncDDMIyz3bgEtvJ4YPI2oPIH74MHDJOR1yUt6OmGMqIs_XbuekM9bi91iNAxwcIgdnYWTGUiR2Vk6O2VqqheOwAXn-_G16oGocsaLoOzu22ywuK6xNcleypBc_vyaPuoDmIlxxNvApurczDFHbTOvlq19G-CcP34gKlW_VLe_1KSA8W5cnH28yllZhzTUs14UpxLC6uV6VarxVqrUCLeWgvJ3Nc0pXiBE4ZwZuwWMzYWGSi2VtPeShJwhYpRlyt-AZLgXmNMpN4cGqxaFLhiD3m3M5r8ZzsBE_krksF4x-dfptxE18DRSZ5mQ9iF8BEl73VX5s88L4hDBZn9up6hAG-rTVVr3JOT85KYhvXfll92al7kgmYxNF3UVsHBTX8XxtiQx14wKm5gRwLtbBxeuD7HdU3cyqZgvrBrQlISH8p5ghqULI_BFIuXEN8uD52RE3vXrb9gUEMSAWeo7CS_xx-XwSVsfbnMBwzqFe7AcYDGfe38zpCi-oh9sCJjAAXN-KD40UZB7ld-kx3DrDjmRLnp1-gO0Sl4CKti9MFZboe_gxODqG070Cok0niSsoxJdLnfhcYw_JN5fWfhJOzTxRP7l4CXq74ji7ltw7N_EgYUzIONC3nAxZrU746soEvWcUNLmXyYEow3XWyTddMcenK7tLkveetyVXrQRnR7-n0y-WHKpA0dN8ZdnCM4j_z7wkoO4FN3GxGAL9Y0hi--9th4XbP8p_r6VLJ4SQNIuIKuyxRB6Y2NPFNnrOLlXuZiM9OUuFGO8Kz2qU0mPswV805wFCNh2bGNnSPOamizz4LernNK84t6_GM4NgoN7yTaBEX-Ng1EvnJhEfcZtwI3oSXBuLn7ufbWupHMJZfggEZ2FV5y3-w6SQymrpUSBnDZh1LpmibK1cGnJjAB7-1sWmTGUnV75j-qWMh97bPqJi8Uty5tYbgpulO-P4n1KTuCqGXbLDwINu_FNcmOEreQYJcEX1i0QOEoVblu5eJqC5kBPkBPEC1bVhNl3D2Ufdd3i2XCbxvfCoyc5eysl35Od1Hxst-KLZ4tmYI_pTNlI-JqwuKC2RUzJXVqiXpmaAk8jT592uFJs28jlLiB4TmWQ3L48kCnLaya0c_AFhGecdHEbbEy; __Secure-next-auth.session-token.1=twI76zjwWsf6cDBVpwTSlQGNTowWAosArlcPKymXnMkcNljStgeFkom9k95zpiXIDpFsiJB-PTLuGBj_3HmZUpEm5MuHUgbQKSFPio2l7wRW6a98uWicEzF4fcCjGz9OrDwBUnUxjcNnXue0alwa6AhF5T1B79ibZHjBtGq4IYsmt_l9mHR4wsRNXV0w_zCOhQfH1R8sczNff7eKcVnDo14FeadzZEqSNoKGU1C_6TZMOa7zzETGQPekh279ylKUaOZ9EshI_P3aRw71XNEdE2C-uOMZPuJIA3zPBvgYxdfppBXENTh8quyQAzHFmIMubPMg2zCNTD6ANvC5eTEH1B675sA9emI9DnC2UJVmNBJQPIpkncxQd98eaeYS0tHaUyzD7HQFJBFQOCmEh-ORdrJVoab1A36idPdzLusO0Tm1e.ZrEoUqMjNICG-4yAF6sAPw; AMP_7268c9db0f=JTdCJTIyZGV2aWNlSWQlMjIlM0ElMjJlMTcxNjRlMy0xMjU4LTQ3ZTYtYTJmYi1jN2JhM2FmNWRiZWUlMjIlMkMlMjJ1c2VySWQlMjIlM0ElMjJlYTNmNmY4NC0zNzNhLTQ0ODgtYTRjMi1mYjgxMzk1YzNiMzElMjIlMkMlMjJzZXNzaW9uSWQlMjIlM0ExNzM2Mzg0ODU2MzQxJTJDJTIyb3B0T3V0JTIyJTNBZmFsc2UlMkMlMjJsYXN0RXZlbnRUaW1lJTIyJTNBMTczNjM4NTAzMDcxOSUyQyUyMmxhc3RFdmVudElkJTIyJTNBNjElMkMlMjJwYWdlQ291bnRlciUyMiUzQTEyJTdE; _clsk=szrjt7%7C1736385030758%7C10%7C1%7Cq.clarity.ms%2Fcollect; _ga_ME15C3DGRL=GS1.1.1736384853.1.1.1736385031.0.0.0"
132
135
  token = "__Host-next-auth.csrf-token=b6b37b10948a6156a1a39d09bd43ab6d0867fcd6001987531fe6f86f802bb0aa%7C3afdfd56119e801c5cb80dc96670031c85a2d9a02e8205f38fc5d6128e1a4075; _gcl_au=1.1.386131236.1736384852; _ga=GA1.1.282109674.1736384854; AMP_MKTG_7268c9db0f=JTdCJTdE; _fbp=fb.1.1736384856672.571916090953259055; _clck=2fa0yj%7C2%7Cfsf%7C0%7C1835; x-recraft-referral-code=1f1xoKVYB9; __Secure-next-auth.callback-url=https%3A%2F%2Fwww.recraft.ai%2Fprojects; _uetsid=1d264620ce2611efaf8a0f99cb3bbb99; _uetvid=1d2649e0ce2611efb597376fda548d79; AMP_7268c9db0f=JTdCJTIyZGV2aWNlSWQlMjIlM0ElMjJlMTcxNjRlMy0xMjU4LTQ3ZTYtYTJmYi1jN2JhM2FmNWRiZWUlMjIlMkMlMjJ1c2VySWQlMjIlM0ElMjJlYTNmNmY4NC0zNzNhLTQ0ODgtYTRjMi1mYjgxMzk1YzNiMzElMjIlMkMlMjJzZXNzaW9uSWQlMjIlM0ExNzM2Mzg0ODU2MzQxJTJDJTIyb3B0T3V0JTIyJTNBZmFsc2UlMkMlMjJsYXN0RXZlbnRUaW1lJTIyJTNBMTczNjM4NTAzMTczNyUyQyUyMmxhc3RFdmVudElkJTIyJTNBNjQlMkMlMjJwYWdlQ291bnRlciUyMiUzQTEzJTdE; _clsk=szrjt7%7C1736385032306%7C11%7C1%7Cq.clarity.ms%2Fcollect; _ga_ME15C3DGRL=GS1.1.1736384853.1.1.1736385032.0.0.0; __Secure-next-auth.session-token.0=eyJhbGciOiJkaXIiLCJlbmMiOiJBMjU2R0NNIn0..SyUWD5O3-8Fu7f9K.jbfQGmUTAstB_wL4cyqA7QcbWKp4AFMnouf-WtJnwaPC4gIfu7iuNkXmrvbfp2YsqFJzSIl-5MvZrXt-bhk-DJtwqAdPzTw6sSa33I3IHWSS3TVlVFc9Ze-HT_6dIeMpIiN-rCSNGdpmtkEJLp_3WrCSGPB0NbJLLL_MGg6cQdS5WYz4trehD8sPSQUgYlTw_VaMImqVZOxKujLLgmGfgYdV8nl9p-JmFHMbpfcgn-yXqLca8E50sQOWldPw0p4RqsYyByUANX1POJAW33rm9fsRDHEKtVxOtlW5Hy1jev__V9UqSrhcvH_OQREngiQGYbtD0qLogeUg-vbL0VUAL-9USzXIn2Una3lP04lp3m_NKldiSShXsHJT8RW8IAl7K28ILGilA1fgx0V09JFIHhM4fX-hrPzqoh-BuxaaiF5czEHTtTPLXmnV1UiQgZVmfgliI2e_r9J3WtF-SgSc1Il2cvwxAsp66p5cjixFbpj7AULPXndQniHhTiU9zgDDdv-fEf0arKzW2w0--zwSmYizXMMpNblgxZ9k51CdOBCAM9YGtzDaB-NSA8I9RuHzmgXMvT5GMZSiezuoLdRRcVpuJBz-XF0v9QoQz7SQt6aMaCCTa-fxee--nfYZELu1Uhh90StcuT84VOAlx-wg6FxPEDI6cjlVtKuzcN_RMVYbWKO2z5xLw4zlqyGBleRjt7hNNt-IeCbGuaDxgbUViwhNr_qdh-_ZjQlz_FL4rzlJwPrl6puOsydFF8NIy0MU9oBdelGTtG8LwzNnOW_hGdqEfhXfDP9mzv4Fs4kqGNQxvT0PU2NQ5hIOTb540yHqTGb3kihXPaZL4YregR2-UPRxOM1qmWwgRZ93d9m0BUplhO9s9U2hYoLhp01ID8kiNi2AWp0hRcalh6PwgqSdzgbif3IH8AcHRJpnV2pRSbD7k883O6ukkItWPE-ysv-ak_Hl8FR046xjDaX1ITtyrJmTzFqQ627PGuOt01RmsVMOb1IFCcx4Fr4AYwOMDY0RDk1YxIUUqU4kyMZMVlMrI_ITcrYshdJwdr4k3hNk51gS3QUrhIDnUq93mvUSidSUy_jX47H-ORf9Al5poN3vNJPye9ogASdqRr2psn1UpceMzrejXz_xDSBllWGlSyAmHDlXniKfzGSbRtqET9xRZfy7X0iOGd0WW2Sb9BkI2OE6h2abFkeSmTXJTMaZXhQ244XkhvDVnps1QX4mdSIa1Js0Pb73DcWLV5TR1sTVxm5h9c1l5r-YxWQ9hjF3A43_V0Jp9ATDlcPIjewTqAcPuuNhcQRR6i7pt2CadiFpfT-h7DA1PvPRo7ReySBzDK9VhnlvodflQugnxj5gsRljH6r43s4OrgpJwCtENl-_yw4jDJCCXkJwHfLpSKhLR6CFSM52vrMa9fWg7iW1C4HIVVqyqIwC98-CTe5jYDMKrX_g40oDZL3XEhFCTfzl5o_UfqXJEWlDKZ0D_Aig7iNLDOEq3cwK9QDiP4-bX6jtM1zkltpCY-HPpwTXbtV4iIP6usg9lSJgCDgJjaS39rpBVYSrj-Y_PtPlPW5rJMVkSnp_f_J7uAwQWnluuEpxrb0Ap-vF4Vk4q9gBESbnk3PBg8wfFPC1GesPI4HyG8Jy3oIss8pDXba6D70soJiozgBcPTSxdeDIP1CXsRN2wiItYHeyslQE-_egn8oezT9__8LyVrY8guv14Nu-WGPx3R9xzpHn4TPY3nJQ6bU9H0PlB0qmJLsSh6tWtJ0Yl8-NMlEKr9WkcjOJB-QpFiDEyw3V7r65U5b_BOaNpzRA5OUJ_ZmCfufmyfnHm8R6mE5wqrwUfmxYBRfP_w8_ix58zwTzFsLe7Fii5_J411vqxFHefcljnpgFgf1UIOoAPBUfygBTVdpdJcWzA2QXNI9lKxUIC6pLme9rpNlXE2bCE1cn74qA974x1gBjZ5B_FVsmkYhFRwSboi8ypRFA1F6EWwSNO-LUQH8uVbrDisjjjAX19xq_Sibwq5P-dZMY6aLCuInQjfWic5NGsjjwh4xtBv3FTyt1nvt9SonxdsJi_wvcjEoCVyP7PfYy5Eo-MkOpznzGYc9slQscUhKPihaB7wlAJZxe99tBUHLJI6XoI1o2Z3G4KGRK6PTO_THOTVFBylKTMbg_jvHw63TL4-LNlhJ2efmSjnEZqpGkgIUb8wYSoG3OR-v3H7WPvvAtJAs-NfvQXSGaFZ3O-LnStvyT869zXwP9U6_NZjml7gB9iA0cZVw4o5tAFI5DPVstJAqSrjIW59cpTxxDo2zeBdl8aq5FoKIZ63w8QebUeibLT8_lejsWQtg8RX4WrSTbuZN-gtCsMY4Q-TY4gJtVygtjz44QMzYDXq0G5mlqnPanLvR9tOfZODm8z87e355KdmD7pI305NimlYjMAFECfAaQN4G3oDZiDb85KkO92JXlVwWbo1xfbx4FTikedjY-BI1ErQB5gxTgPo252aw5r9fItydPBE_nuZU211tc41k8IF2F_cbSZ9tUjZz14yb4Ux4RWUdtHs3y7Jh9_5Pj0dnS3dEgJ-7jlhz-v2tmrcgzcEKqDPQGdhKfLl__AMM_11LqMuvj0boYiiaDx8DHN95J_d48um0YvB5IU3sQucEXiRK2j8FpAXc9ptQqPTGdSzz4VhIE0EIzZIV3QqqaRqH6ZEXcNuV_DXwl6HOjui78yu-rpqz50E9fxePaV5LHPbzXp_ZEOLrWonqo9ZAIHzWhCbVM_vMxK7CnrfmhW4ow8l71maoD0ToyTW7J0KbegCnEVyVhAF-IqYc98gq0vEbfgH42JKk07-8v1gVNQ6TZpAbtgajdrRe9XCuR58f_dt7_y8xWLXw_tINMB-x5MLNbdomfSMsit9Vfl29Yr8yD4KIkYhsfhl-nH-7ntrx4KkkLdLoNhKbhdI7o7NO1zdJ22ur7op4YlAWSNq5q-q2uhF3bKTkYhAIJ2FnPZpYmv7NoldLkAML79C7xtbZTJ0ZgXCjxzbEI50-9qvhEMSNm5AjZLrE3tTp6GVJWfIvjb3HmTvEAxR3rRefzzTaKW-MO9t3OurUPood1vkMR7oQzQY_n6DaZKUcxA6L8sK8s2MfEb78h_ZKeKDRAFsnspHdVTYf4xEu_SbXyDYbx2vBU2beXYdhzcdLWff32f3jioAf_q8hk2wKAcj2Spik7Ng-HPbme3XPD0w1b6d266bJ8GIWCUoGmJ9Wm0UalL-ZnoX16yN9El_wfOEoXBFWRe56Ur1ih6ZwZkcuCMZcnUAlXaL3JGgrxtwQjUtuSPSAo7kBZGIS7xXzFL7aJOi9ctqBAJVH0C3g8TJcW7ilF-qzEwrOoo1zWfLQpxMXhg8XKLDzOPAFBwyEOlDaRdoj20aE6NTeWST-X3QEufdM0PE0uB3FAhYWTPyILrAulrIsMJphGU-9sABotQs9apb8Vvekzou3oQ02Nr8n_CHVdDfE7m9I1lOxnB8Yz78oJhBs0WAbcZL9Vy-c-RVBauUMgceqSyQJ3uHR3iWsze4yeVOb4LE4nUxsfBMHQhW-Via3wFpInCCJxS3je2wtiyDTztuMNN8Mxn_GuTJ1i-KkDdvWiAL9c4zg_6HQfsMpLXQXpJ4Ovk-wUAV_NaW9NnVXHR-ygTcsf-BUHEV6dm0EPEk3tNVdlOTMDzXeYmpXn7xSSPuHglNcLnCzbmiANoqs1N5knV9_gVx49MLkYzE2rK_xdAFZUgiR4uujQ16mWNHtzrUUZOWmPu0HrAt2cJsz0snCfakahNceO3di-MQCDppMUnoSlq2ZnRcsMYu_n7mjOP6suimdawk9Ik1y_RpJ1O92UjKl63SqTtknADbwywiDiLr62V59YEUxKhGIaNrg; __Secure-next-auth.session-token.1=q9Nx6cKkfa0ZpdMRs7aQg5BCEByRK-upafTx1BRw9yA7R30AXoMtQfz6ExKBqsbpyVHqJFnLBQuZqJEi_Bmk34FeYJrUjD1ddsPmEex0ftUACPSugpdrgsTxc8CN0f4a8t_m8wTHxhQWbE5_GT-A4Hb4T68U9pDkzA1kWMVHkQ6h1x7HyW_Ykh1KXejgZFJBhdvv4dAKpv0ckYCNXwJVgVwCKGCNikx-ubtZ-5XDX5ZquUNzVEGpx1cr-F4e0-aw8CDQmdZ0Zh7VHV5DKL7SkQW20FHjpiK-J6gdkkjGFX7EybuEM1KCZ-KI_9hna9JzZc52f_yyoN05hqTzWmfh4aFeQL3j1nErMn23uiava2BfKIoQ59dKWOO5zos66El2TtIFerhUFJDyt8sUOcybCWsmmf05oSeLzHeaJYBA8j7SP.FYyhM198a9ZP-Ep6hZRQNQ"
133
- token = "_gcl_au=1.1.906962865.1730362257; _ga=GA1.1.435165527.1730362257; _fbp=fb.1.1730362257600.714008794112161913; AMP_MKTG_7268c9db0f=JTdCJTdE; _tt_enable_cookie=1; _pin_unauth=dWlkPU0yWmxPR1JsWkRJdE5qZGlZeTAwTWpNeUxXRmpNVEV0TlRrd1l6RTNZelEwTldZMw; __zlcmid=1OVn8OoYVNvKEWM; __stripe_mid=d21b2291-edb8-4cb1-8fac-05c6a9493ca8d85a3c; _ga_ME15C3DGRL=deleted; _ttp=412qSInHGw3jjdyNR6K4tBIYmNZ.tt.1; __Host-next-auth.csrf-token=5a254fcd5cf01dbe6f4d38ff6653073673eb96145321a4aa4e032c1361db4067%7Cfcc1ced5fcc03aca73a9b3374bfaf0f518079e6802a706311c2428b8b12a5639; _clck=uflztg%7C2%7Cfsf%7C0%7C1765; __Secure-next-auth.callback-url=https%3A%2F%2Fwww.recraft.ai%2F; _ga_ME15C3DGRL=GS1.1.1736384021.94.1.1736384813.0.0.0; _uetsid=3bef14a0cd5c11ef8908d9361f23bf21; _uetvid=a8a766f0975f11ef9b7921e48a0cd258; AMP_7268c9db0f=JTdCJTIyZGV2aWNlSWQlMjIlM0ElMjI2OTE1YzI1My1jMTJjLTQ5ODYtYjM3Ni0xMTI3Y2ZmMTFlMjglMjIlMkMlMjJ1c2VySWQlMjIlM0ElMjJjNDdkY2ZiYi0yOWE5LTQ1Y2EtYWRiZS1hM2ZhYWZiODhkNzQlMjIlMkMlMjJzZXNzaW9uSWQlMjIlM0ExNzM2Mzg0MDIxMjg4JTJDJTIyb3B0T3V0JTIyJTNBZmFsc2UlMkMlMjJsYXN0RXZlbnRUaW1lJTIyJTNBMTczNjM4NDgxNTMzMSUyQyUyMmxhc3RFdmVudElkJTIyJTNBMTQ3JTJDJTIycGFnZUNvdW50ZXIlMjIlM0E0MiU3RA==; _clsk=lpjwif%7C1736384816977%7C21%7C1%7Cq.clarity.ms%2Fcollect; __Secure-next-auth.session-token.0=eyJhbGciOiJkaXIiLCJlbmMiOiJBMjU2R0NNIn0..i9IpV1p6GdtCwBJf.GhX0MZyY886Dpslr3HPr3QQrF4cLCeL14lby_VsLhOfc1VBDE5ZmRX6fYfPtHPJNfYIPlj8U83UVMZyNmiSeRCTLDKKht5oWGdbMS8Q6KCLYzpFtO3wgfROiWTy4Jaq2XdXvTJiFHpHtg4FNsDcKfD-zyCt6-ffuq7gTtKhWl3ie33vu2Y1dBksAadej9hGGsozwQZRju2GaNw2QpWdgbP-cYbojKSFxFkara0-_yZgXYtjlSNXpj-AXI6wmkDi701dyZPHS0i_eNRg4d36SMOLTWqPxtgk-0PjYKGAndHeLlrypt_4HS94WAy5_Ond46YIvFtY6MS5P0wQePXka_kj95uV7_Vj-aBNhcJhOjv7FP2TRvOqjx0aKIS6ilq6ljCIrAp4iC-P-uEpRWxQ7l4VwejsrM1_k8IzatOUFjNxhmTsGQG8t-CaN6zq0GI6SkSXlOj_X6jUIfu7aaT4nvzNM_yDz53P-H90mgl6-6KmHhldPRZPPwA6mOci1sZ2hQp4l4nZCSSXmrJ9KSEIhcqUM599xDL90bBmIyb0LMwa9smXavJFq0dlmjcqGGmfCWmriNf7eSw96ewhOT-bA-yNt7Igmsj0YAV59_FVBicRwPkMSZshfikl0Pxz_pmTQrSllF1WXeyCEflhqncXRXNnl1n23l3rC6XK72fyMX7Q4kB1G3stQpZ8BZ2jaoV4P9RmKWje_ruY30myXj4Kf8Hzh5YjzfxAdVv8aVCOceuAcQCaZzySFSAWV2R7XLONGCOiQqcRyHeP4KzEac-w_w_8AgOpn5Bt0vkzw_roK4WK13mNyrx-sLbAy-Pufuln_6V_hyJiYdPnC3kykTFveaeYNrSTrhOSMSTRWMwbO32apU-6a5l42FWZVQaVRTYw4IN7aOrhbqINzSN-yRlkze_4YfRUqIE6ip6r8OSjsu65WdmA2haUaTlPwSfsJh2zm-SlDRPUlZkUXO1rKlfWccdUarlAyX085fSxs3amQlg5SBe9ziyCH0-1FIY0fJN96dYrNcHXWxUYu01UKbR1IX27OhOj6gmgtUHeZZorJZ_Ce4fnuTfnK65Athovqjy0_U6JXwJoQ9T_we5IlYQ3Rv95ezdbA7HSY49F3PuCxpf_-QujriKIWTGRQ_KbJy3bOxv1dV7mmHvMBumNVOq3VIqyKS3NnjtD2fjGcGWh8sCViU6wOCTERI6lbxMsHL6oMKTvzQuIp80DgKyQOWO5LoIPKtpz4b0mf6A1Xncz0ProBBvL7ZIiFEpiiFztqQJigVTsRirTMOqViOqU4Eht6AIvIczsW6GyuOK7gCgty6RezCHQsSwXD0FfwpvxjCFZQZ4A4ZFatHCirBDv6djBdBJIOJoSVVkoN6_Q2E8U4C7J1J5UQYZZq1fm5xBjEwQBzdP18doD4q7KNsgQIjGU5ZMJsaZgUNAhjU-UyA3BwLXhtmpMGnx9G2Pxf11OgHOUUYKd-DsX4yFrelf0QFe6VI0TMz7V8xpJrW-BTYYmaCupxkyLmwRfTO_HDkbyKoZES2yiCFh-Vfkyxz2gLuBhhryczt4HogMh_CmuHcOWPv6TAuH4QDZpyBWzyThBx3ZKvLfxo87LwbQgRfoediXV2c9DEWTx-pBcMosr1L-GZQ1eTVDVhcmsVshVL9Nb-DYh7C7-d97aq1Wl06Ljsf74xzijQPTgQAMgqwdPOWBg_WvRZP_cxiiz2XsUbbjYW2uQeqFL8dhYmzr8t2ABPpP9_damETeR5bkYA2jOwF6sNwhe0uIXP4xjN2xqzJ4OnSE_zeh1L5bqRajroLnYbRsZ0QwBoqf7am51RFzcyZRvRPKxLbA3rRDqKun41AcC3usyrFw6wX1dBH9IBLfqwP4qVPlwMdpVkQuH6A0rawFDM7ulJ6uYWy5XuiSUGejnBt6LICYki0C3bgOV--932msjQlzwVcWPHGWP634teJ8do0UMDIlII9ogA307POi8j4Ab92QxWLt1DAe3bh-vBkuEvIzmiKvq3RjgP52ysvTlDZtqEi19RkVBJ55aBNAK84oddVNrYIv0-SZ736WxqtpqNQggOkwubG96a9IL2K0nM3lD-IweswFzhd5d2t2GIwDnkRWCn_3sMFblMFGsvof-dbcp2fKgB5BFFtel6DO8cKZiGrFTKNNaTUEIpQYFZueXZMDMhpGFmsbWcABXJAyQk4gl5DR0hY_-zRrEnaBQ5f_wquwpENKFl0tBzVKLi45F3jgrnMYAyyIR4GVrS4x2a3PIBFl2HPwDvPNfuP2lnICf6Bbeh84BhI_V2aCoaxur4OTuc4E1HUM_p0gLq0d3xVpVbmYlDSff7YyrnwP0FdaiTt0dcMKyoGL44W_WdvPete8U6hlNhGSySHp-srMFyl4eMliYAITeiRwwZuYjfnW95-kK1rTm6tiBlpBJcSLEaxe6iZTTJcEAm5MLO07jEny_C6thxrYPug_5Ih8SdM9DOEkqF0slCWne82S8x49dp0pMllCZJAvtdYQbEmtE2KjytyKU5ns6OiraQpFm16fQGpmu7HYQbBU0fwASerwXdMRa6e7lTVGLd2mdDoF9gBdQClA75LyaKdrPg7rkV4x2NOulsFsPSPxhyQl-r0jqc-7qMs0hCbKr8I7O04T5F8Jg0ZWvYvUCvbnfiW767XltnjN_hNy3zQDVjR-4XxlYWmq_wzj7a0U5r9MzISR_DsFEP-mI5qKXfNFUzatM0UmKs-m1YLxm3InlWaA0VH1W5pABHK-npbuHmUlQ5_HBvO0JK84P0iif9M2-KXIEOxzMPLOw9cjs0j98hETINMm2-_6AGcNVrqLAmxrgE9sREJ2YVSweVVxLzi0UvZnjPwOs4qAaM3O2IWy5UZ1cB6bFxAj2HvDBQZ3j04kPxT0Sl33MGQS0Td7J_9ap8r2IBQUof9bOGjjMZHV1YsIcHVC5vCT2EZCovmz1avFFW04o0B2DC-A1kTujPp4SWtxT33470WPSk1CMGK_tKv0w2ou6lTkdGdTWCTDA2uNMVZRGxYwGnGo1q0OkC_a60JlvzPTXbOVcfZu_lcATm-aLt60H9jHuCBmKEvg46B5Qc2TZW3Dwz2T7Tl125jkfPWYEBoVnqB7mNPzhZxaDY3sMd8I0O_FNeNRZ3BEqpJkNWIMOnf8aZ6nCoMw8DdpL1POGvAZ-XhedkAIICUkJ_SYbvho2lZ3oEIAFxl5arPmQPnIpW4Abry_PWYvZx7kVXA0frDjYZv89NlctrGKMBfyYZVKTRnoQkXf-K6JGCZcySJuuWOuADGQfNTarwuy6M9e7k83d-mFZTYHhllPQakN8xXZ2ExTBDIHH7D9y1qKoOwb22Lg8hjv7cD9uq21iZTmD2K45D4W76Yrz1rX3n8t1tv1l1HTSB3UeuoCGaT5LkCSDKsHhM5iTChuIfxVefYBZh9We-TiU8QyHOxud1zOpE8Op6Ky9dUaCnUl5YUxeDntgeceaqP20ZmjlwvADd6P8UOjvvq-uZAhSlJ9Q4rYmO4pP2lfaRuo-thyrowHwOETPC8kmsMcm43MqFCzNNqnyXDHuyggjexTrk8T0swpo-eeBpvElZcP9-U5bFbS5vyb5H4tOLspSo8JcxsRVT4b32plWTRT-EQpAosu5IQNO-MQAGKnwqgzwhiePc8_K-6QbfDaZ7UwvCxJBvp8Ql5NRgMAUiViLuxD4BkUaKXuouXp9UcvyW6qrJFHVzyDVjTKW7oG0lYLhRREePp3OLqLUH-upSEWFMnkOljpn_kE3W_F62fnyC-6YG25kGKhw8bMpIVaKLAfe0SXto8pKrQPb4cLKTTTPHXCz9PKtO1xE2qHIE2Ys1k7-JlkTK6AvoY6sI6t3EPL-1rXPmB8P; __Secure-next-auth.session-token.1=yFjlKz8Sy8-L5993eI09Y6KcuLf5lx4fC99u6YFtWp_BQLG0Mk0GI7RllqeDlxU-5QO9VYeBlTNh-sp8SJ7hkNv5hpMnWaCE-7sPMHLcJAFNA5Sx43a4aJglZFEkCI8RFe4HGAusm9qQG18PBByIKj_ZhLnsS9zXaGQ5YL7eX9QVWrpkowuA35WfksZp3mvwkGR_6LrmpR7kmmK2_C_X5e5SsXTXhUfrBT8r79I39P18D9E1S-hT31ETyajNNgw-u3BHbET4buRhT043W_c3x2RwIc6Fzs5DAeTUFR39e3_jT-ge_RIG5-1YRhvtEXHVUInRVeoYorqzN62JO-8RDeBNry6wUGR9O7QCLOH_a0w.976ySjYDq2pGONqc_zx8Ng"
136
+ token= "__Host-next-auth.csrf-token=14ca9d794219c34aca808cdc2a310d73ae76584a7bc746518742db0ac0baadd1%7C74c6e91fc8b1400a4035ce81d78e6a0516c8283e7c2a9104b3d75d93441a83ae; _gcl_au=1.1.526202796.1738463460; _ga=GA1.1.1626801434.1738463460; AMP_MKTG_7268c9db0f=JTdCJTdE; x-recraft-referral-code=7d7RbMefDM; __Secure-next-auth.callback-url=https%3A%2F%2Fwww.recraft.ai%2Fprojects; __Secure-next-auth.session-token.0=eyJhbGciOiJkaXIiLCJlbmMiOiJBMjU2R0NNIn0..GN6pvZZE1X-avzQn.7TBThGPGii6nH6hS8TWazy7XV9Mk22vd2sqPfoHKuEbesS_pITSQc1kUchGlB_HQ_Lx8EldQGvzeVbFil6mBb4tqjNxJFecSHeDgLubqE0u5ueA-ZF4rf6Xz44NGnx-zJr6iA_rD7319KiL4-WWm57Ds5UJ_jo410_018LlUuWme0G2RKMwPySVL3Jg8Zyma5Z-twK50W8WRkwp07xiCZFXIQK6wLu_TvBYBwjVFa0wNJmyRCirM9YHKOsqVMIKP38q679Cd8S9A0s2T7SjLDm_5rme6TtaGq7Xye0cZLuARf_h2oX79Rm3XDPWYXjEJ6OMpNnlB1uvslb8Lbq0GkVAEYJbgc5PgQ2aD7WjqX8omU1uj1HVIXxr3lxDuSyvBPz_16Fkf7wMOI_OVQDCujAh4hdyNGVJ-vBuybQ6yo0vYF0S5X2_lUJqcwchUtwDneBXUUl3kI8JiZf8YF0kROkqkW82bFycQDtaNNFtwdFWyVhC7_L7gYpYpk0QrFJ7MVN25J8xbggLVRKrl-9gZ-55I9IkmM-iAtSuvTzTvqc9NzzRnoRPBDuwPwyKok2TE93QnAPQIzUacXIdZdkjTue-jymc60QrjBRGTIsIC93KD67vYdEH8vb1V0fiiqS4MkGfSpMA4NFaTpRECwqGcNzLj6XTrLGzl8Z2RO9tBWxqtq2Qfggyb8Oxftsab8hTjarw2b8mSSeyy2mnh_sIZiwM5Pl4ZDSYX9TsCdqNnOXyIGEWZCb5fb1rKSALKHrt71QZJXRETZCfJB-ndqw8I3l8rOhKuW0iio58umegRJYyFsJ6UY___fjBLz-0AwqSecklqkt8WDSaymIqR79YiGVjHt_qKLS1M43nVnp5TFneV9yorWPL6Oa2R0TAjU2fWjiaUohlI4XPSNlRXSz9m5EvYKJvKxMdRnZdx7UeZn2rP-C7K5xcjURm0QwXrcWL883DhDiYWrE3Y0IoG-U1n4MhosGeVnJA7FYeOSlpHZs0Re7Aud9nrLo3lWxyRHM9mTjBOTnpRWP5xwAneyM52FT78-RkVBrcaXc60UyK8h1WIxmLDWPIIvDI-W4wlR0SYDRUP7t_8dFXT7NCZXSzskNFa9wmPPWvh4__CXXFWwW2J5X_x_6iLfsBX8C5KsPKeRNplhWJqKM-50Vwk5gM9JtYGjsguKWrAqPbacs-cuexbg-_WwU1trXv6hc28pMU2RJ8FNk4t7OCrhbuwt-PSdAO2bksP8QFKEez8w1mfptn3DN8mFaranAzgwdo-xD0v2Ew2C_oqoYUahxVrKMHqEYSd_bQnLylaftMfYGBNU0WuY7bcvRtJp3DGfQrHTF76ZA5AqgPKFwlmE_5pa-1xb5slX76bFAm1NKhgZZDpGyeqEobp_3u4yXhJTHVHYQuFHNFQm6ZDsepFh8SLR-dWlyrYsu3KHQUcZAMzOW4jiTc7SK37z03ONM5kgw2o_MRcdmvpIMBHCwuGjwLSUxCmora5cDKQY49gKWu778wfeUw-RJIdg4TZzsRM3OV3FnyN7koaWF-D5HdOP0H2v3zre9DtY5N-3_iIo1Fa9F1Pd59X3Oz1wpJ7Yjuam-mboCXgIfQ9q-dn4vGoxdqBqyvDM9IZV8N1MnjxoG6m3BOTdLR90aaYqHKSkDE3ks4oaE2CfGuhK0hHKcnXcEFXm81Mx-eJ90rFTmYOdlId0e19mk5tu-Cbj79MbBpx5cRfojiTqrQH-AIXXRa8aBr4QxAW_p1iDnAQ9owtX8dvbacg_VKhB0IOLlBaDfDmDAwBkvMWwBnaYThOsbIOWQhH-dPBndW8G7ycKJ2xtK0PHApsn0iAujAuPUTYeobNgKdfNHu5eXwaRltkuH8jvDbcxj5m4ajsVX7qA7N8uod6TIVyh_5Hvp1iRQHjtOC6_pI7hCnC_5B9mwaXsYPQqPiP-h7sv8CoG6KQ5UlE7_SkHXpfjEsI9RWETa8YPDTHek4k4bz0Y4VIIov_sBXsqLR3ZnNMdzsbCekfMqXtzgw6I1UqzzPVew4mA0J7qC3WHW6XK2a7sxnO4y-R4njEf7W6a8nEj4n6bwfKeozaQ_mvKVekVUR1ocjD94PYBzGb_DTpToeEz8f5RS6csXMWM1BORz2pF6N-mOH_H4g-0qGdIwh5rdRu2xcZX_VGR3_vVjvm2svnSvdKEsVn4cRcytt10iiDTPw-RQVW_DdkuXOK9CPN2WJDBtSkEEwLlNTHjRxPzamsnKB2fQe02suVPpU2dfF5qy4pKXLeKabT4Ky_Ih4Yb4ez6oy2fUknvKS2JKeorGk6lWrDGlyGX36IJO6fbDQogn5ba98E5IYWCKOknszOtT36QqAywyqja_dBRepAtI1YNN5DNNryH1AnF7d4q38l1O_PPbAXrk_taIAo225y-Cwsdp3f2hOINdAORsRa5GuFXeED1MOsFMpHX7C1atdGaZGi2ypZ6plvG70fxoVw9GLrWItUStCq5i8And6ZKXd815nI7yAW0lQv3RCBRqUuoWX5E3F8-bTv4aBlM4Q3gkh6_H2GhYYmRUwA8ASeCdEeOCw-kZ_wm742k99x2N65uBWLBe7T40zYWPGBafTxcPnBrcLw2xLlEIj2KeyZ7hYDhZdeoC5plS1Qxwxw2m53g8e8K_fOgELtMfB6mr32EdSjNqnx5WNZ7NNqq8ROj6vtfGK7y5cqC7ZkoKOkK6z9KO7pyDxZ9Mj221lQte7h7hzb676GiErrovAu2pCwWT9RVNUntK6mz2W7A97tjyKOz2VuLzhPBE_WAYyYSZ0Ykl4QKAU7cpmoaXNBs58YGm_H7cSOu3_4yEIuKh_O-pggiBfdxKKDiK3Mt7jeNV98-YCUlLmZEv5yWkjBsmm2LUEgX2w6DVUUUJwy5ongmXDktpViHLLMubj9PW5GGfJPsMuXEOfUTTL1C7wnMJzWzco4y11YmzRiSlCuKkPCMcT5_yhZvAZRyyrPUOBUftcOKUbBh4oBYIN3RbT1v4sMTjSGzYez52Sisb18InbQDM0zn0j88HRorWH6bxpKDb_PvmTebrhDIiWXbI3Zlm4NCQm7NZWicEFK-1fR46b5qRD80tp_cq8BWfECvvFfcT2NzO1rMhl6xIY5-TBWXIM6-qd1Pbd3xOdLRQPotxbZimS--dFBsLvrK3Ginax_mqc01AIXcjph23oQbQ9gnQzgtwicPafnQaOEcdR-moB9ca6oEShgymUyy_XcK6UdKpy4xI1yZsQ9omcquT_s8hzVrLEXwlwtUSzfqvH9pMCIjASWqMeRkfEojrjJd4th122hn2al7s2TbmPSXDOn0iHjh8N5aLcZbG_J9x6qwnpjMwDiGpU2Il3AlXuL0IaMFKukUbx_xKz4DoHsnJMMGsJfItAzyFbLPsPlVq3I97qwTZNUHqATjW3U9AO-PntTdK0OOSu3YbbJ2dk_A-SI1oK3O64Ie-u8rS2dFRmyUT_wYOcXL5cJ_-3HPz2xsO2SzRA7c8G-LsNCSSVSv9Vd5HBQhHA5IxsCptmFZ9OIkHFqeA5wcCYuhMHqSaC6kbPClyEExzaPsrJI6-SJUd86psoJn8dmn4I31WNf_5STzPBeii6qBYbLVIfiwXJckk0M-hvDeQfCyzRpKHeCslGkm6kziutEvfS0yZwZgDpBpGevyOcPCxYicpZSzUxEvsVCjtB9NBcIEHmm8Ho_JjiebQ3HcrchWFAYYU8XScsvkpfVqF71lut7ik7VOFcmQ3a35_zEA9kzYLKvmC49nyIMIkWDR5iCKW63rw2-6PzSTzSjf_xb_VADIYdat8a-i96mCbhtah6WH7Y5tTQKUYRWLUYib6kE8hwPy7jyHX0IMebioaklJKaU_G1tBYDsF4Q; __Secure-next-auth.session-token.1=12vFH4Zo9AA6uZzZrVWEaWBTWDlMDYiDUP5HUYoEOv3R3ksn-sPq93b2jISpNOW9RecN5E_5NXB76IfeH-VZauOwKzd4Kc37Mf6EM4gwXALfqMGsvFX8DlW6MkwbNqZ14WbE1pR_KhKVYrdB6ZX6J4ZlscRoqPB-A7GpvOtVPUComrZg00-evxSWcyKvLsCW1NNqqnXA-7J94rJJBdsS6j1c3s5KiCqB1Ptr1eTeWanjxkjNfSewVQqX6WVytsLnsVE9KqmJGZiz0zIFvnLPQwSv1Bg0IFzt8UF4J1PXrQaIbwIvqmNj7BU3589K2Rb58tarZoZ-ogxZG5ZneR1CWLSlRJDhsnOvAXubqD0EuT_POI7EXdrfsNiifr7knH_xxEu7iqxzpXsDMuaO_pxzwkPuKFtcxDkVOJH-TY5njugFS.Jodtt7brKicBj8c26v0T3A; _ga_ME15C3DGRL=GS1.1.1738463460.1.1.1738463490.0.0.0; _clck=1l7d1gy%7C2%7Cft3%7C0%7C1859; _clsk=1uwygz6%7C1738463492407%7C1%7C1%7Co.clarity.ms%2Fcollect; _uetsid=be5a5d90e10d11efbff71f781c6cba79; _uetvid=be5abc90e10d11ef9a96119e1652d011; AMP_7268c9db0f=JTdCJTIyZGV2aWNlSWQlMjIlM0ElMjI2ZTNiMzU3NC1lOThlLTQ2OWEtYWIzOS0xM2ZhM2M4NTdjNDglMjIlMkMlMjJ1c2VySWQlMjIlM0ElMjIyNzA0ZWQ4MC01YWExLTQ3YWUtOTRkYi0wNmQxZWZhODBjYTYlMjIlMkMlMjJzZXNzaW9uSWQlMjIlM0ExNzM4NDYzNDYxMjMzJTJDJTIyb3B0T3V0JTIyJTNBZmFsc2UlMkMlMjJsYXN0RXZlbnRUaW1lJTIyJTNBMTczODQ2MzUyMjQ1NSUyQyUyMmxhc3RFdmVudElkJTIyJTNBMTklMkMlMjJwYWdlQ291bnRlciUyMiUzQTMlN0Q="
134
137
  token = None
135
138
 
136
139
  # arun(get_access_token())
@@ -140,7 +143,7 @@ if __name__ == '__main__':
140
143
  "style": "any",
141
144
  "response_format": "url",
142
145
  "size": "1152x2048",
143
- "n": 2,
146
+ "n": 1,
144
147
  }
145
148
  request = RecraftImageRequest(
146
149
  # prompt='一条猫',
@@ -153,5 +156,5 @@ if __name__ == '__main__':
153
156
  # tokens = [token]
154
157
 
155
158
  # tokens = list(arun(aget_spreadsheet_values(feishu_url=FEISHU_URL, to_dataframe=True))[0]) | xfilter_
156
-
157
- # r = arun(check_token(tokens))
159
+ # #
160
+ # r = arun(check_token(tokens[0]))
@@ -88,6 +88,8 @@ async def check_token(token, threshold: int = 1):
88
88
  try:
89
89
  response = await get_credit(token)
90
90
  logger.debug(bjson(response))
91
+ # logger.error(f"{token}")
92
+
91
93
  credits = sum(response['data']['credit'].values())
92
94
  return credits >= threshold
93
95
  except Exception as e:
@@ -175,6 +177,8 @@ if __name__ == '__main__':
175
177
  token = "38d7d300b5e0a803431ef88d8d2acfef"
176
178
  token = "916fed81175f5186a2c05375699ea40d"
177
179
  token = "7c5e148d9fa858e3180c42f843c20454"
180
+ token = "eb4d120829cfd3ee957943f63d6152ed"
181
+ # arun(check_token(token))
178
182
 
179
183
  # print(arun(aget_spreadsheet_values(feishu_url=FEISHU_URL, to_dataframe=True))[0].tolist())
180
184
  tokens = arun(get_series(FEISHU_URL))
@@ -182,7 +186,7 @@ if __name__ == '__main__':
182
186
  # arun(check_token(token))
183
187
  for token in tokens:
184
188
  if not arun(check_token(token)):
185
- print(token)
189
+ logger.debug(f"无效 {token}")
186
190
 
187
191
  # arun(get_upload_token(token))
188
192
  #
@@ -7,9 +7,14 @@
7
7
  # @WeChat : meutils
8
8
  # @Software : PyCharm
9
9
  # @Description :
10
+ """
11
+ guidance 控制精细度 => sample_strength 0-1 数值越大生成的效果质量越好,耗时会更久
12
+
13
+ """
10
14
 
11
15
  from meutils.pipe import *
12
16
  from meutils.caches.redis_cache import cache
17
+ from meutils.decorators.retry import retrying
13
18
 
14
19
  from meutils.schemas.jimeng_types import BASE_URL, MODELS_MAP, FEISHU_URL
15
20
  from meutils.schemas.image_types import ImageRequest
@@ -137,7 +142,7 @@ async def create_draft_content(request: ImageRequest, token: str):
137
142
  "prompt": request.prompt,
138
143
  "negative_prompt": request.negative_prompt or "",
139
144
  "seed": request.seed or 426999300,
140
- "sample_strength": 0.5,
145
+ "sample_strength": request.guidance or 0.5, # 精细度
141
146
  "image_ratio": 1,
142
147
  "large_image_info": {
143
148
  "type": "",
@@ -170,6 +175,7 @@ async def create_draft_content(request: ImageRequest, token: str):
170
175
  return draft_content
171
176
 
172
177
 
178
+ @retrying(max_retries=3)
173
179
  async def create_task(request: ImageRequest, token: Optional[str] = None):
174
180
  token = token or await get_next_token_for_polling(FEISHU_URL, check_token)
175
181
 
@@ -203,7 +209,8 @@ async def create_task(request: ImageRequest, token: Optional[str] = None):
203
209
 
204
210
  data = response.json()
205
211
  logger.debug(bjson(data))
206
- if task_id := data.get("data", {}).get("aigc_data", {}).get("history_record_id"):
212
+
213
+ if task_id := (data.get("data") or {}).get("aigc_data", {}).get("history_record_id"):
207
214
  return TaskResponse(task_id=task_id, system_fingerprint=token)
208
215
  else:
209
216
 
@@ -217,10 +224,11 @@ async def create_task(request: ImageRequest, token: Optional[str] = None):
217
224
 
218
225
  raise HTTPException(
219
226
  status_code=status.HTTP_451_UNAVAILABLE_FOR_LEGAL_REASONS,
220
- detail="可能触发内容审核,请联系管理员"
227
+ detail=f"可能触发内容审核,请联系管理员:{data.get('errmsg')}"
221
228
  )
222
229
 
223
230
 
231
+ @retrying()
224
232
  async def get_task(task_id, token):
225
233
  url = "/mweb/v1/get_history_by_ids"
226
234
  headers = get_headers(url, token)
@@ -270,11 +278,14 @@ async def get_task(task_id, token):
270
278
  # @cache: todo: cache 积分异常消耗
271
279
  # @cache(ttl=3600)
272
280
  async def generate(request: ImageRequest):
281
+ # logger.debug(request)
282
+
273
283
  task_response = await create_task(request)
274
284
 
275
- for i in range(1, 10):
276
- await asyncio.sleep(max(10 / i, 1))
285
+ for i in range(1, 15):
286
+ await asyncio.sleep(max(15 / i, 5))
277
287
  response = await get_task(task_response.task_id, task_response.system_fingerprint)
288
+ logger.debug(f"{task_response.task_id, task_response.system_fingerprint}")
278
289
  logger.debug(response)
279
290
  if response.status.lower().startswith("fail"):
280
291
  raise HTTPException(
@@ -320,11 +331,11 @@ if __name__ == '__main__':
320
331
  data = {
321
332
  "model": "seededit",
322
333
  "prompt": "https://oss.ffire.cc/files/kling_watermark.png 让这个女人带上墨镜,衣服换个颜色",
323
- "size": "1024x1024"
334
+ "size": "1024x1024",
324
335
  }
325
- # arun(generate(ImageRequest(**data)))
336
+ arun(generate(ImageRequest(**data)))
326
337
 
327
- arun(generate(ImageRequest(prompt="做一个圣诞节的海报")))
338
+ # arun(generate(ImageRequest(prompt="做一个圣诞节的海报")))
328
339
  # prompt = "A plump Chinese beauty wearing a wedding dress revealing her skirt and underwear is swinging on the swing,Happy smile,cleavage,Exposed thighs,Spread your legs open,Extend your leg,panties,upskirt,Barefoot,sole"
329
340
  # request = ImageRequest(prompt=prompt)
330
341
  # task = arun(create_task(request))
meutils/apis/kling/api.py CHANGED
@@ -34,7 +34,7 @@ def encode_jwt_token(ak, sk):
34
34
 
35
35
  async def create_task(request: BaseModel, token: Optional[str] = None):
36
36
  # token = token or await get_next_token_for_polling(API_FEISHU_URL)
37
- token = "f042ce272aa7423d93dda0599bc5f332|e272cf7fe95145ec90ca947b8e29ef4c"
37
+ token = "2111f9eb7cf84576b775e06625eb65f1|e264fd49e39a4408a76e461937ee2926"
38
38
  ak, sk = token.split("|")
39
39
 
40
40
  headers = {
meutils/apis/niutrans.py CHANGED
@@ -46,6 +46,8 @@ async def translate(sentence, src_lan, tgt_lan, **kwargs):
46
46
 
47
47
  response = await client.post(path="/NiuTransServer/translation", cast_to=object, body=payload)
48
48
 
49
+ logger.debug(response)
50
+
49
51
  if isinstance(response, str) and "tgt_text" in response:
50
52
  data = json.loads(response)
51
53
  return data.get('tgt_text')
@@ -44,5 +44,3 @@ async def get_api_key_money(api_key):
44
44
  if __name__ == '__main__':
45
45
  arun(get_api_key_money(os.getenv("OPENAI_API_KEY_GUOCHAN")))
46
46
 
47
- arun(get_api_key_money("sk-1UNhOrvuJ4PeBBpsB202577c14114f7fA234F32d3e8dF767"))
48
- arun(get_api_key_money("sk-1UNhOrvuJ4PeBBpsB202577c14114f7fA234F32d3e8dF7677"))
@@ -0,0 +1,80 @@
1
+ #!/usr/bin/env python
2
+ # -*- coding: utf-8 -*-
3
+ # @Project : AI. @by PyCharm
4
+ # @File : zhipu
5
+ # @Time : 2025/2/19 20:42
6
+ # @Author : betterme
7
+ # @WeChat : meutils
8
+ # @Software : PyCharm
9
+ # @Description :
10
+
11
+ from meutils.pipe import *
12
+ from meutils.str_utils.json_utils import json_path
13
+ from meutils.llm.clients import AsyncOpenAI, chatfire_client, zhipuai_client, moonshot_client
14
+ from meutils.llm.openai_utils import to_openai_params
15
+ from meutils.schemas.openai_types import chat_completion, chat_completion_chunk, ChatCompletionRequest, CompletionUsage
16
+
17
+
18
+ class Completions(object):
19
+
20
+ def __init__(self, api_key: Optional[str] = None):
21
+ self.api_key = api_key
22
+
23
+ async def create(self, request: ChatCompletionRequest, search_result2md: bool = False):
24
+ request.stream = False
25
+ request.model = "web-search-pro"
26
+ request.messages = [{
27
+ "role": "user",
28
+ "content": request.last_content,
29
+ }]
30
+ data = to_openai_params(request)
31
+
32
+ search_completion = await zhipuai_client.chat.completions.create(**data)
33
+ logger.debug(search_completion.model_dump_json(indent=4))
34
+
35
+ if results := json_path(search_completion, '$..[keywords,query,search_result]'):
36
+ data = dict(zip(["keywords", "query", "search_result"], results))
37
+ if search_result2md:
38
+ global df
39
+
40
+ df = pd.DataFrame(data["search_result"])
41
+
42
+ df['title'] = [f"[{k}]({v})" for k, v in zip(df['title'], df['link'])]
43
+ df['media'] = [f"![{k}]({v})" for k, v in zip(df['media'], df['icon'])]
44
+
45
+ df = df[['title', 'media']]
46
+ df.index += 1
47
+ # {df_.to_markdown(index=False).replace('|:-', '|-').replace('-:|', '-|')}
48
+ data["search_result"] = df.to_markdown()
49
+ return data
50
+
51
+ async def query(self, q: str):
52
+ pass
53
+
54
+ # {
55
+ # "role": "user",
56
+ # "content": search_completion.model_dump_json(indent=4),
57
+ # }
58
+
59
+
60
+ if __name__ == '__main__':
61
+ model = "web-search-pro"
62
+ # model = "tencent-search"
63
+
64
+ request = ChatCompletionRequest(
65
+ # model="baichuan4-turbo",
66
+ # model="xx",
67
+ # model="deepseek-r1",
68
+ # model="deepseek-r1:1.5b",
69
+ model=model,
70
+
71
+ # model="moonshot-v1-8k",
72
+ # model="doubao",
73
+
74
+ messages=[
75
+ {"role": "user", "content": "《哪吒之魔童闹海》现在的票房是多少"}
76
+ ],
77
+
78
+ stream=True
79
+ )
80
+ arun(Completions().create(request, search_result2md=True))
@@ -25,6 +25,7 @@ FEISHU_URL = "https://xchatllm.feishu.cn/sheets/Bmjtst2f6hfMqFttbhLcdfRJnNf?shee
25
25
  FEISHU_URL_FREE = "https://xchatllm.feishu.cn/sheets/Bmjtst2f6hfMqFttbhLcdfRJnNf?sheet=xlvlrH"
26
26
 
27
27
  BASE_URL = os.getenv("SILICONFLOW_BASE_URL")
28
+ # BASE_URL = "https://api.siliconflow.cn/v1"
28
29
 
29
30
  DEFAULT_MODEL = "black-forest-labs/FLUX.1-schnell"
30
31
  MODELS = {
@@ -79,7 +80,7 @@ async def generate(request: ImageRequest, api_key: Optional[str] = None):
79
80
  ).get("data", request.prompt)
80
81
 
81
82
  request.model = MODELS.get(request.model, DEFAULT_MODEL)
82
- logger.debug(request)
83
+ # logger.debug(request)
83
84
 
84
85
  if any(i in request.model.lower() for i in {"pro-max", "pro"}):
85
86
  request.num_inference_steps = 20
@@ -165,3 +166,5 @@ if __name__ == '__main__':
165
166
 
166
167
  arun(generate(request))
167
168
 
169
+ # https://api.siliconflow.com/v1
170
+
@@ -0,0 +1,42 @@
1
+ #!/usr/bin/env python
2
+ # -*- coding: utf-8 -*-
3
+ # @Project : AI. @by PyCharm
4
+ # @File : suno_api
5
+ # @Time : 2025/2/25 14:16
6
+ # @Author : betterme
7
+ # @WeChat : meutils
8
+ # @Software : PyCharm
9
+ # @Description :
10
+
11
+ from meutils.pipe import *
12
+
13
+ # "https://api.chatfire.cn/suno/submit/music"
14
+
15
+ from openai import AsyncOpenAI
16
+ from meutils.schemas.suno_types import SunoAIRequest
17
+ from meutils.decorators.retry import retrying
18
+
19
+
20
+ @retrying() # 触发重试
21
+ async def get_task(task_id): # task_id 实际是 clip_ids, 必须指定token获取任务
22
+ client = AsyncOpenAI(base_url="https://api.chatfire.cn/suno")
23
+ response = await client.get(f"/fetch/{task_id}", cast_to=object)
24
+ return response
25
+
26
+
27
+ async def create_task(request: SunoAIRequest):
28
+ client = AsyncOpenAI(base_url="https://api.chatfire.cn/suno")
29
+
30
+ response = await client.post(
31
+ "/submit/music",
32
+ body=request.model_dump(exclude_none=True),
33
+ cast_to=object,
34
+
35
+ )
36
+
37
+ logger.debug(response)
38
+ return response.get("data")
39
+
40
+
41
+ if __name__ == '__main__':
42
+ pass