Compare commits

...
4 Commits
Author SHA1 Message Date
gokayfem a5c55fd44b api key setup 2025-06-01 14:14:29 +03:00
Gökay Aydoğan 63cb3fcf0d Update pyproject.toml 2025-05-31 02:35:57 +03:00
gokayfem e1faa49e25 new workflow examples 2025-05-31 02:35:01 +03:00
Gökay Aydoğan c8c437b495 Merge pull request #22 from gokayfem/pr-21
Add Kontext
2025-05-31 02:09:04 +03:00
10 changed files with 586 additions and 411 deletions
@@ -0,0 +1,216 @@
{
"id": "80767774-d39b-4f73-a75a-3c1327f92316",
"revision": 0,
"last_node_id": 94,
"last_link_id": 199,
"nodes": [
{
"id": 93,
"type": "LoadImage",
"pos": [
2148.41357421875,
-644.6304931640625
],
"size": [
284.00726318359375,
497.4951477050781
],
"flags": {},
"order": 0,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "IMAGE",
"type": "IMAGE",
"links": [
198
]
},
{
"name": "MASK",
"type": "MASK",
"links": null
}
],
"properties": {
"Node name for S&R": "LoadImage"
},
"widgets_values": [
"image (24).png",
"image"
]
},
{
"id": 92,
"type": "LoadImage",
"pos": [
1846.3321533203125,
-654.7257080078125
],
"size": [
270,
510.1016845703125
],
"flags": {},
"order": 1,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "IMAGE",
"type": "IMAGE",
"links": [
197
]
},
{
"name": "MASK",
"type": "MASK",
"links": null
}
],
"properties": {
"Node name for S&R": "LoadImage"
},
"widgets_values": [
"image (25).png",
"image"
]
},
{
"id": 94,
"type": "PreviewImage",
"pos": [
2907.259765625,
-712.0502319335938
],
"size": [
660.7576293945312,
723.7353515625
],
"flags": {},
"order": 3,
"mode": 0,
"inputs": [
{
"name": "images",
"type": "IMAGE",
"link": 199
}
],
"outputs": [],
"properties": {
"Node name for S&R": "PreviewImage"
},
"widgets_values": []
},
{
"id": 91,
"type": "FluxProKontextMulti_fal",
"pos": [
2462.2119140625,
-595.9410400390625
],
"size": [
400,
364
],
"flags": {},
"order": 2,
"mode": 0,
"inputs": [
{
"name": "image_1",
"type": "IMAGE",
"link": 197
},
{
"name": "image_2",
"type": "IMAGE",
"link": 198
},
{
"name": "image_3",
"shape": 7,
"type": "IMAGE",
"link": null
},
{
"name": "image_4",
"shape": 7,
"type": "IMAGE",
"link": null
}
],
"outputs": [
{
"name": "IMAGE",
"type": "IMAGE",
"links": [
199
]
}
],
"properties": {
"Node name for S&R": "FluxProKontextMulti_fal"
},
"widgets_values": [
"Woman wearing this backpack on her way to jungle",
"9:16",
false,
3.5,
1,
"2",
"jpeg",
false,
2075416510,
"randomize"
]
}
],
"links": [
[
197,
92,
0,
91,
0,
"IMAGE"
],
[
198,
93,
0,
91,
1,
"IMAGE"
],
[
199,
91,
0,
94,
0,
"IMAGE"
]
],
"groups": [],
"config": {},
"extra": {
"ds": {
"scale": 0.863837598531476,
"offset": [
-1745.427153953069,
795.6355480141049
]
},
"frontendVersion": "1.18.10",
"ue_links": [],
"VHS_latentpreview": false,
"VHS_latentpreviewrate": 0,
"VHS_MetadataImage": true,
"VHS_KeepIntermediate": true
},
"version": 0.4
}
+261
View File
@@ -0,0 +1,261 @@
{
"id": "80767774-d39b-4f73-a75a-3c1327f92316",
"revision": 0,
"last_node_id": 97,
"last_link_id": 202,
"nodes": [
{
"id": 92,
"type": "LoadImage",
"pos": [
1846.3321533203125,
-654.7257080078125
],
"size": [
270,
510.1016845703125
],
"flags": {},
"order": 0,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "IMAGE",
"type": "IMAGE",
"links": [
200
]
},
{
"name": "MASK",
"type": "MASK",
"links": null
}
],
"properties": {
"Node name for S&R": "LoadImage"
},
"widgets_values": [
"image (25).png",
"image"
]
},
{
"id": 96,
"type": "LoadVideoURL",
"pos": [
2672.1376953125,
-645.724609375
],
"size": [
270,
266
],
"flags": {
"collapsed": false
},
"order": 2,
"mode": 0,
"inputs": [
{
"name": "url",
"type": "STRING",
"widget": {
"name": "url"
},
"link": 201
}
],
"outputs": [
{
"name": "frames",
"type": "IMAGE",
"links": [
202
]
},
{
"name": "frame_count",
"type": "INT",
"links": null
},
{
"name": "video_info",
"type": "VHS_VIDEOINFO",
"links": null
}
],
"properties": {
"Node name for S&R": "LoadVideoURL"
},
"widgets_values": [
"https://example.com/video.mp4",
0,
"Disabled",
512,
512,
0,
0,
1
]
},
{
"id": 97,
"type": "VHS_VideoCombine",
"pos": [
2995.218994140625,
-646.7775268554688
],
"size": [
215.01171875,
670.6875
],
"flags": {},
"order": 3,
"mode": 0,
"inputs": [
{
"name": "images",
"type": "IMAGE",
"link": 202
},
{
"name": "audio",
"shape": 7,
"type": "AUDIO",
"link": null
},
{
"name": "meta_batch",
"shape": 7,
"type": "VHS_BatchManager",
"link": null
},
{
"name": "vae",
"shape": 7,
"type": "VAE",
"link": null
}
],
"outputs": [
{
"name": "Filenames",
"type": "VHS_FILENAMES",
"links": null
}
],
"properties": {
"Node name for S&R": "VHS_VideoCombine"
},
"widgets_values": {
"frame_rate": 25,
"loop_count": 0,
"filename_prefix": "Veo2",
"format": "video/h265-mp4",
"pix_fmt": "yuv420p10le",
"crf": 22,
"save_metadata": false,
"pingpong": false,
"save_output": true,
"videopreview": {
"hidden": false,
"paused": false,
"params": {
"filename": "Veo2_00001.mp4",
"subfolder": "",
"type": "output",
"format": "video/h265-mp4",
"frame_rate": 25,
"workflow": "Veo2_00001.png",
"fullpath": "D:\\ComfyUI_windows_portable\\ComfyUI\\output\\Veo2_00001.mp4"
}
}
}
},
{
"id": 95,
"type": "Veo2ImageToVideo_fal",
"pos": [
2199.614990234375,
-652.0396118164062
],
"size": [
400,
200
],
"flags": {},
"order": 1,
"mode": 0,
"inputs": [
{
"name": "image",
"type": "IMAGE",
"link": 200
}
],
"outputs": [
{
"name": "STRING",
"type": "STRING",
"links": [
201
]
}
],
"properties": {
"Node name for S&R": "Veo2ImageToVideo_fal"
},
"widgets_values": [
"Woman slowly turning",
"auto",
"5s"
]
}
],
"links": [
[
200,
92,
0,
95,
0,
"IMAGE"
],
[
201,
95,
0,
96,
0,
"STRING"
],
[
202,
96,
0,
97,
0,
"IMAGE"
]
],
"groups": [],
"config": {},
"extra": {
"ds": {
"scale": 0.863837598531476,
"offset": [
-1694.469448600796,
792.8487236845591
]
},
"frontendVersion": "1.18.10",
"ue_links": [],
"VHS_latentpreview": false,
"VHS_latentpreviewrate": 0,
"VHS_MetadataImage": true,
"VHS_KeepIntermediate": true
},
"version": 0.4
}
@@ -1,390 +0,0 @@
{
"id": "e3b1097d-0ba0-4fb1-b1f9-510d5a9ee4b1",
"revision": 0,
"last_node_id": 65,
"last_link_id": 71,
"nodes": [
{
"id": 23,
"type": "LoadImage",
"pos": [
400,
830
],
"size": [
300,
370
],
"flags": {},
"order": 0,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "IMAGE",
"type": "IMAGE",
"links": [
60,
64
]
},
{
"name": "MASK",
"type": "MASK",
"links": null
}
],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.3.32",
"Node name for S&R": "LoadImage"
},
"widgets_values": [
"example.png",
"image"
]
},
{
"id": 63,
"type": "SaveImage",
"pos": [
1300,
1880
],
"size": [
300,
370
],
"flags": {
"collapsed": false
},
"order": 5,
"mode": 0,
"inputs": [
{
"name": "images",
"type": "IMAGE",
"link": 66
}
],
"outputs": [],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.3.32"
},
"widgets_values": [
"kontext-sample-t2i"
]
},
{
"id": 62,
"type": "SaveImage",
"pos": [
1310,
1330
],
"size": [
300,
370
],
"flags": {},
"order": 7,
"mode": 0,
"inputs": [
{
"name": "images",
"type": "IMAGE",
"link": 65
}
],
"outputs": [],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.3.32"
},
"widgets_values": [
"kontext-sample-i2i-multi"
]
},
{
"id": 24,
"type": "SaveImage",
"pos": [
1300,
830
],
"size": [
300,
370
],
"flags": {},
"order": 6,
"mode": 0,
"inputs": [
{
"name": "images",
"type": "IMAGE",
"link": 22
}
],
"outputs": [],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.3.32"
},
"widgets_values": [
"kontext-sample-i2i"
]
},
{
"id": 59,
"type": "FluxProKontextMulti_fal",
"pos": [
800,
1330
],
"size": [
400,
430
],
"flags": {},
"order": 4,
"mode": 0,
"inputs": [
{
"name": "image_1",
"type": "IMAGE",
"link": 64
},
{
"name": "image_2",
"type": "IMAGE",
"link": 70
},
{
"name": "image_3",
"shape": 7,
"type": "IMAGE",
"link": null
},
{
"name": "image_4",
"shape": 7,
"type": "IMAGE",
"link": null
}
],
"outputs": [
{
"name": "IMAGE",
"type": "IMAGE",
"links": [
65
]
}
],
"properties": {
"aux_id": "a-und-b/ComfyUI-fal-API",
"ver": "ec8880895d86bb5c720e167585b559e03fcf9024",
"Node name for S&R": "FluxProKontextMulti_fal"
},
"widgets_values": [
"",
"1:1",
false,
3.5,
1,
"2",
"jpeg",
false,
22,
"fixed"
]
},
{
"id": 61,
"type": "LoadImage",
"pos": [
400,
1350
],
"size": [
300,
370
],
"flags": {},
"order": 1,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "IMAGE",
"type": "IMAGE",
"links": [
70
]
},
{
"name": "MASK",
"type": "MASK",
"links": null
}
],
"properties": {
"cnr_id": "comfy-core",
"ver": "0.3.32",
"Node name for S&R": "LoadImage"
},
"widgets_values": [
"example.png",
"image"
]
},
{
"id": 22,
"type": "FluxProKontext_fal",
"pos": [
800,
830
],
"size": [
400,
370
],
"flags": {},
"order": 3,
"mode": 0,
"inputs": [
{
"name": "image",
"type": "IMAGE",
"link": 60
}
],
"outputs": [
{
"name": "IMAGE",
"type": "IMAGE",
"links": [
22
]
}
],
"properties": {
"aux_id": "a-und-b/ComfyUI-fal-API",
"ver": "975d555e29c2bec2e8ffa1aa33f5bdc686345024",
"Node name for S&R": "FluxProKontext_fal"
},
"widgets_values": [
"make it a 3d render",
"1:1",
false,
1,
1,
"6",
"png",
false,
41,
"fixed"
]
},
{
"id": 60,
"type": "FluxProKontextTextToImage_fal",
"pos": [
800,
1880
],
"size": [
400,
380
],
"flags": {},
"order": 2,
"mode": 0,
"inputs": [],
"outputs": [
{
"name": "IMAGE",
"type": "IMAGE",
"links": [
66
]
}
],
"properties": {
"aux_id": "a-und-b/ComfyUI-fal-API",
"ver": "ec8880895d86bb5c720e167585b559e03fcf9024",
"Node name for S&R": "FluxProKontextTextToImage_fal"
},
"widgets_values": [
"a childs drawing of grumpy cat",
"1:1",
false,
3.5,
1,
"2",
"jpeg",
false,
33,
"fixed"
]
}
],
"links": [
[
22,
22,
0,
24,
0,
"IMAGE"
],
[
60,
23,
0,
22,
0,
"IMAGE"
],
[
64,
23,
0,
59,
0,
"IMAGE"
],
[
65,
59,
0,
62,
0,
"IMAGE"
],
[
66,
60,
0,
63,
0,
"IMAGE"
],
[
70,
61,
0,
59,
1,
"IMAGE"
]
],
"groups": [],
"config": {},
"extra": {
"frontendVersion": "1.18.9"
},
"version": 0.4
}
+18 -3
View File
@@ -16,10 +16,25 @@ config = configparser.ConfigParser()
config.read(config_path)
try:
fal_key = config['API']['FAL_KEY']
os.environ["FAL_KEY"] = fal_key
if os.environ.get("FAL_KEY") is not None:
print("FAL_KEY found in environment variables")
fal_key = os.environ["FAL_KEY"]
else:
print("FAL_KEY not found in environment variables")
fal_key = config['API']['FAL_KEY']
print("FAL_KEY found in config.ini")
os.environ["FAL_KEY"] = fal_key
print("FAL_KEY set in environment variables")
# Check if FAL key is the default placeholder
if fal_key == "<your_fal_api_key_here>":
print("WARNING: You are using the default FAL API key placeholder!")
print("Please set your actual FAL API key in either:")
print("1. The config.ini file under [API] section")
print("2. Or as an environment variable named FAL_KEY")
print("Get your API key from: https://fal.ai/dashboard/keys")
except KeyError:
print("Error: FAL_KEY not found in config.ini")
print("Error: FAL_KEY not found in config.ini or environment variables")
# Create the client with API key
fal_client = SyncClient(key=fal_key)
+18 -3
View File
@@ -10,10 +10,25 @@ config = configparser.ConfigParser()
config.read(config_path)
try:
fal_key = config['API']['FAL_KEY']
os.environ["FAL_KEY"] = fal_key
if os.environ.get("FAL_KEY") is not None:
print("FAL_KEY found in environment variables")
fal_key = os.environ["FAL_KEY"]
else:
print("FAL_KEY not found in environment variables")
fal_key = config['API']['FAL_KEY']
print("FAL_KEY found in config.ini")
os.environ["FAL_KEY"] = fal_key
print("FAL_KEY set in environment variables")
# Check if FAL key is the default placeholder
if fal_key == "<your_fal_api_key_here>":
print("WARNING: You are using the default FAL API key placeholder!")
print("Please set your actual FAL API key in either:")
print("1. The config.ini file under [API] section")
print("2. Or as an environment variable named FAL_KEY")
print("Get your API key from: https://fal.ai/dashboard/keys")
except KeyError:
print("Error: FAL_KEY not found in config.ini")
print("Error: FAL_KEY not found in config.ini or environment variables")
# Create the client with API key
fal_client = SyncClient(key=fal_key)
+18 -3
View File
@@ -14,10 +14,25 @@ config = configparser.ConfigParser()
config.read(config_path)
try:
fal_key = config['API']['FAL_KEY']
os.environ["FAL_KEY"] = fal_key
if os.environ.get("FAL_KEY") is not None:
print("FAL_KEY found in environment variables")
fal_key = os.environ["FAL_KEY"]
else:
print("FAL_KEY not found in environment variables")
fal_key = config['API']['FAL_KEY']
print("FAL_KEY found in config.ini")
os.environ["FAL_KEY"] = fal_key
print("FAL_KEY set in environment variables")
# Check if FAL key is the default placeholder
if fal_key == "<your_fal_api_key_here>":
print("WARNING: You are using the default FAL API key placeholder!")
print("Please set your actual FAL API key in either:")
print("1. The config.ini file under [API] section")
print("2. Or as an environment variable named FAL_KEY")
print("Get your API key from: https://fal.ai/dashboard/keys")
except KeyError:
print("Error: FAL_KEY not found in config.ini")
print("Error: FAL_KEY not found in config.ini or environment variables")
# Create the client with API key
fal_client = SyncClient(key=fal_key)
+18 -3
View File
@@ -16,10 +16,25 @@ config = configparser.ConfigParser()
config.read(config_path)
try:
fal_key = config['API']['FAL_KEY']
os.environ["FAL_KEY"] = fal_key
if os.environ.get("FAL_KEY") is not None:
print("FAL_KEY found in environment variables")
fal_key = os.environ["FAL_KEY"]
else:
print("FAL_KEY not found in environment variables")
fal_key = config['API']['FAL_KEY']
print("FAL_KEY found in config.ini")
os.environ["FAL_KEY"] = fal_key
print("FAL_KEY set in environment variables")
# Check if FAL key is the default placeholder
if fal_key == "<your_fal_api_key_here>":
print("WARNING: You are using the default FAL API key placeholder!")
print("Please set your actual FAL API key in either:")
print("1. The config.ini file under [API] section")
print("2. Or as an environment variable named FAL_KEY")
print("Get your API key from: https://fal.ai/dashboard/keys")
except KeyError:
print("Error: FAL_KEY not found in config.ini")
print("Error: FAL_KEY not found in config.ini or environment variables")
# Create the client with API key
fal_client = SyncClient(key=fal_key)
+18 -5
View File
@@ -15,17 +15,30 @@ from fal_client.client import SyncClient
current_dir = os.path.dirname(os.path.abspath(__file__))
parent_dir = os.path.dirname(current_dir)
config_path = os.path.join(parent_dir, "config.ini")
config = configparser.ConfigParser()
config.read(config_path)
# First set environment variable
try:
fal_key = config['API']['FAL_KEY']
os.environ["FAL_KEY"] = fal_key
if os.environ.get("FAL_KEY") is not None:
print("FAL_KEY found in environment variables")
fal_key = os.environ["FAL_KEY"]
else:
print("FAL_KEY not found in environment variables")
fal_key = config['API']['FAL_KEY']
print("FAL_KEY found in config.ini")
os.environ["FAL_KEY"] = fal_key
print("FAL_KEY set in environment variables")
# Check if FAL key is the default placeholder
if fal_key == "<your_fal_api_key_here>":
print("WARNING: You are using the default FAL API key placeholder!")
print("Please set your actual FAL API key in either:")
print("1. The config.ini file under [API] section")
print("2. Or as an environment variable named FAL_KEY")
print("Get your API key from: https://fal.ai/dashboard/keys")
except KeyError:
print("Error: FAL_KEY not found in config.ini")
print("Error: FAL_KEY not found in config.ini or environment variables")
# Create the client with your API key
fal_client = SyncClient(key=fal_key)
+18 -3
View File
@@ -14,10 +14,25 @@ config = configparser.ConfigParser()
config.read(config_path)
try:
fal_key = config['API']['FAL_KEY']
os.environ["FAL_KEY"] = fal_key
if os.environ.get("FAL_KEY") is not None:
print("FAL_KEY found in environment variables")
fal_key = os.environ["FAL_KEY"]
else:
print("FAL_KEY not found in environment variables")
fal_key = config['API']['FAL_KEY']
print("FAL_KEY found in config.ini")
os.environ["FAL_KEY"] = fal_key
print("FAL_KEY set in environment variables")
# Check if FAL key is the default placeholder
if fal_key == "<your_fal_api_key_here>":
print("WARNING: You are using the default FAL API key placeholder!")
print("Please set your actual FAL API key in either:")
print("1. The config.ini file under [API] section")
print("2. Or as an environment variable named FAL_KEY")
print("Get your API key from: https://fal.ai/dashboard/keys")
except KeyError:
print("Error: FAL_KEY not found in config.ini")
print("Error: FAL_KEY not found in config.ini or environment variables")
# Create the client with API key
fal_client = SyncClient(key=fal_key)
+1 -1
View File
@@ -1,7 +1,7 @@
[project]
name = "fal-api"
description = "Custom nodes for using fal API. Video generation with Kling, Runway, Luma. Image generation with Flux. LLMs and VLMs OpenAI, Claude, Llama and Gemini."
version = "1.0.0"
version = "1.0.1"
license = {file = "LICENSE"}
dependencies = ["fal-client", "torch"]