Compare commits

...

17 Commits

Author SHA1 Message Date
skunkworxdark
3cc54915e3 Bug fix to Metadata To Model & Metadata To SDXL Model for when no metadata found. 2024-02-26 17:48:06 +00:00
skunkworxdark
228497a375 Added new nodes Metadata To ControlNets, Metadata To IP-Adapters, Metadata To T2I-Adapters 2024-02-22 16:36:57 +00:00
skunkworxdark
d43cd17f0a meta to loras
- Added `Metadata to Loras`, `Metadata To SDXL LoRAs`.
- Added unet, clip and vae outputs to `Metadata To Model` & `Metadata To SDXL Model`
- Added default vae as an input to `Metadata to VAE`
2024-02-19 19:21:09 +00:00
skunkworxdark
e4f6a1078e add meta to vae
added metadata to vae
added model exists checks
2024-02-17 14:06:30 +00:00
skunkworxdark
e9da116642 Update metadata_linked.py
bug fix for metadata to model nodes
2024-02-16 21:55:00 +00:00
skunkworxdark
9024c2f11c updates 2024-02-15 22:31:45 +00:00
skunkworxdark
a1cf091f2e Revert "Revert "Merge branch 'main' into Metadata""
This reverts commit 47335ce4fd5e54e12faba192e2f95b0d9f524398.
2024-02-15 17:57:58 +00:00
skunkworxdark
a7ff82247c Revert "Merge branch 'main' into Metadata"
This reverts commit c117c392b878330f82ba4a5b489578021ad5d8e0, reversing
changes made to 095525125841ce302b7e1be368ecc958749dff52.
2024-02-15 17:57:58 +00:00
skunkworxdark
97e29cf595 add model,vae,seamless and metaToBool 2024-02-15 17:57:58 +00:00
skunkworxdark
e444e1272c checkin rename some files 2024-02-15 17:57:58 +00:00
skunkworxdark
f177798894 updates 2024-02-15 17:57:58 +00:00
skunkworxdark
cf6b2904b1 Added scheduler and updated some descriptions 2024-02-15 17:57:58 +00:00
skunkworxdark
2643f9aa30 Added custom validation 2024-02-15 17:57:57 +00:00
skunkworxdark
13449b96ef separate new metadata nodes in own py fil 2024-02-15 17:57:57 +00:00
psychedelicious
f36b5990ed fix(ui): do not provide auth headers for openapi.json 2024-02-15 10:38:26 -05:00
Millun Atluri
5706237ec7 {release} 3.7.0 (#5727)
## What type of PR is this? (check all applicable)

Release - Invoke 3.7.0

## Have you discussed this change with the InvokeAI team?
- [X] Yes
- [ ] No, because:

      
## Have you updated all relevant documentation?
- [X] Yes
- [ ] No


## Description
Invoke 3.7.0 Release

## QA Instructions, Screenshots, Recordings
Test Installer: 

[InvokeAI-installer-v3.7.0.zip](https://github.com/invoke-ai/InvokeAI/files/14298200/InvokeAI-installer-v3.7.0.zip)

<!-- 
Please provide steps on how to test changes, any hardware or 
software specifications as well as any other pertinent information. 
-->

## Merge Plan
Merge once approved
<!--
A merge plan describes how this PR should be handled after it is
approved.

Example merge plans:
- "This PR can be merged when approved"
- "This must be squash-merged when approved"
- "DO NOT MERGE - I will rebase and tidy commits before merging"
- "#dev-chat on discord needs to be advised of this change when it is
merged"

A merge plan is particularly important for large PRs or PRs that touch
the
database in any way.
-->

## Added/updated tests?

- [ ] Yes
- [X] No : _please replace this line with details on why tests
      have not been included_

## [optional] Are there any post deployment tasks we need to perform?
1. Release on PyPi
2. Release on GitHub
3. Announce on Discord
2024-02-15 07:59:20 -07:00
Millun Atluri
163b22a7b3 {release} 3.7.0 2024-02-15 07:34:31 -07:00
4 changed files with 1175 additions and 11 deletions

View File

@@ -0,0 +1,131 @@
from typing import Optional, Union
from invokeai.app.invocations.baseinvocation import (
BaseInvocationOutput,
Input,
InputField,
InvocationContext,
OutputField,
invocation,
invocation_output,
)
from invokeai.app.invocations.controlnet_image_processors import ControlField, ControlNetInvocation
from invokeai.app.invocations.ip_adapter import IPAdapterField, IPAdapterInvocation
from invokeai.app.invocations.t2i_adapter import T2IAdapterField, T2IAdapterInvocation
from invokeai.app.shared.fields import FieldDescriptions
def append_list(new_item, items, item_cls):
"""Add an item to an exiting item or list of items then output as a list of items."""
result = []
if items is None or (isinstance(items, list) and len(items) == 0):
pass
elif isinstance(items, item_cls):
result.append(items)
elif isinstance(items, list) and all(isinstance(i, item_cls) for i in items):
result.extend(items)
else:
raise ValueError(f"Invalid adapter list format: {items}")
result.append(new_item)
return result
@invocation_output("control_list_output")
class ControlListOutput(BaseInvocationOutput):
# Outputs
control_list: list[ControlField] = OutputField(description=FieldDescriptions.control)
@invocation(
"controlnet-linked",
title="ControlNet-Linked",
tags=["controlnet"],
category="controlnet",
version="1.1.0",
)
class ControlNetLinkedInvocation(ControlNetInvocation):
"""Collects ControlNet info to pass to other nodes."""
control_list: Optional[Union[ControlField, list[ControlField]]] = InputField(
default=None,
title="ControlNet-List",
input=Input.Connection,
ui_order=0,
)
def invoke(self, context: InvocationContext) -> ControlListOutput:
# Call parent
output = super().invoke(context).control
# Append the control output to the input list
control_list = append_list(output, self.control_list, ControlField)
return ControlListOutput(control_list=control_list)
@invocation_output("ip_adapter_list_output")
class IPAdapterListOutput(BaseInvocationOutput):
# Outputs
ip_adapter_list: list[IPAdapterField] = OutputField(
description=FieldDescriptions.ip_adapter, title="IP-Adapter-List"
)
@invocation(
"ip_adapter_linked",
title="IP-Adapter-Linked",
tags=["ip_adapter", "control"],
category="ip_adapter",
version="1.1.0",
)
class IPAdapterLinkedInvocation(IPAdapterInvocation):
"""Collects IP-Adapter info to pass to other nodes."""
ip_adapter_list: Optional[Union[IPAdapterField, list[IPAdapterField]]] = InputField(
description=FieldDescriptions.ip_adapter,
title="IP-Adapter-List",
default=None,
input=Input.Connection,
ui_order=0,
)
def invoke(self, context: InvocationContext) -> IPAdapterListOutput:
# Call parent
output = super().invoke(context).ip_adapter
# Append the control output to the input list
result = append_list(output, self.ip_adapter_list, IPAdapterField)
return IPAdapterListOutput(ip_adapter_list=result)
@invocation_output("ip_adapters_output")
class T2IAdapterListOutput(BaseInvocationOutput):
# Outputs
t2i_adapter_list: list[T2IAdapterField] = OutputField(
description=FieldDescriptions.t2i_adapter, title="T2I Adapter-List"
)
@invocation(
"t2i_adapter_linked",
title="T2I-Adapter-Linked",
tags=["t2i_adapter", "control"],
category="t2i_adapter",
version="1.0.0",
)
class T2IAdapterLinkedInvocation(T2IAdapterInvocation):
"""Collects T2I-Adapter info to pass to other nodes."""
t2i_adapter_list: Optional[Union[T2IAdapterField, list[T2IAdapterField]]] = InputField(
description=FieldDescriptions.ip_adapter,
title="T2I-Adapter",
default=None,
input=Input.Connection,
ui_order=0,
)
def invoke(self, context: InvocationContext) -> T2IAdapterListOutput:
# Call parent
output = super().invoke(context).t2i_adapter
# Append the control output to the input list
t2i_adapter_list = append_list(output, self.t2i_adapter_list, T2IAdapterField)
return T2IAdapterListOutput(t2i_adapter_list=t2i_adapter_list)

File diff suppressed because it is too large Load Diff

View File

@@ -52,10 +52,22 @@ const dynamicBaseQuery: BaseQueryFn<string | FetchArgs, unknown, FetchBaseQueryE
const baseUrl = $baseUrl.get();
const authToken = $authToken.get();
const projectId = $projectId.get();
const isOpenAPIRequest =
(args instanceof Object && args.url.includes('openapi.json')) ||
(typeof args === 'string' && args.includes('openapi.json'));
const fetchBaseQueryArgs: FetchBaseQueryArgs = {
baseUrl: baseUrl ? `${baseUrl}/api/v1` : `${window.location.href.replace(/\/$/, '')}/api/v1`,
prepareHeaders: (headers) => {
};
// When fetching the openapi.json, we need to remove circular references from the JSON.
if (isOpenAPIRequest) {
fetchBaseQueryArgs.jsonReplacer = getCircularReplacer();
}
// openapi.json isn't protected by authorization, but all other requests need to include the auth token and project id.
if (!isOpenAPIRequest) {
fetchBaseQueryArgs.prepareHeaders = (headers) => {
if (authToken) {
headers.set('Authorization', `Bearer ${authToken}`);
}
@@ -64,15 +76,7 @@ const dynamicBaseQuery: BaseQueryFn<string | FetchArgs, unknown, FetchBaseQueryE
}
return headers;
},
};
// When fetching the openapi.json, we need to remove circular references from the JSON.
if (
(args instanceof Object && args.url.includes('openapi.json')) ||
(typeof args === 'string' && args.includes('openapi.json'))
) {
fetchBaseQueryArgs.jsonReplacer = getCircularReplacer();
};
}
const rawBaseQuery = fetchBaseQuery(fetchBaseQueryArgs);

View File

@@ -1 +1 @@
__version__ = "3.6.3"
__version__ = "3.7.0"