Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/beta' into feature/JST-660/golem…
Browse files Browse the repository at this point in the history
…-errors

# Conflicts:
#	src/market/config.ts
#	src/market/index.ts
  • Loading branch information
mgordel committed Jan 23, 2024
2 parents fd4063c + 72ce86a commit fcc2704
Show file tree
Hide file tree
Showing 18 changed files with 163 additions and 89 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,7 @@ jobs:
uses: actions/setup-node@v3
with:
# Semantic release requires this as bare minimum
node-version: 18
node-version: 20

- name: Install dependencies
run: npm install
Expand Down
22 changes: 11 additions & 11 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -151,15 +151,15 @@ details.
### Limit price limits to filter out offers that are too expensive

```typescript
import { TaskExecutor, ProposalFilters } from "@golem-sdk/golem-js";
import { TaskExecutor, ProposalFilterFactory } from "@golem-sdk/golem-js";

const executor = await TaskExecutor.create({
// What do you want to run
package: "golem/alpine:3.18.2",

// How much you wish to spend
budget: 0.5,
proposalFilter: ProposalFilters.limitPriceFilter({
proposalFilter: ProposalFilterFactory.limitPriceFilter({
start: 1,
cpuPerSec: 1 / 3600,
envPerSec: 1 / 3600,
Expand All @@ -182,28 +182,28 @@ health-checks. Using this whitelist will increase the chance of working with a r
can also build up your own list of favourite providers and use it in a similar fashion.

```typescript
import { TaskExecutor, ProposalFilters, MarketHelpers } from "@golem-sdk/golem-js";
import { MarketHelpers, ProposalFilterFactory, TaskExecutor } from "@golem-sdk/golem-js";

// Collect the whitelist
const verifiedProviders = await MarketHelpers.getHealthyProvidersWhiteList();

// Prepare the whitelist filter
const whiteList = ProposalFilterFactory.allowProvidersById(verifiedProviders);

// Prepare the price filter
const acceptablePrice = ProposalFilters.limitPriceFilter({
const acceptablePrice = ProposalFilterFactory.limitPriceFilter({
start: 1,
cpuPerSec: 1 / 3600,
envPerSec: 1 / 3600,
});

// Collect the whitelist
const verifiedProviders = await MarketHelpers.getHealthyProvidersWhiteList();

// Prepare the whitelist filter
const whiteList = ProposalFilters.whiteListProposalIdsFilter(verifiedProviders);

const executor = await TaskExecutor.create({
// What do you want to run
package: "golem/alpine:3.18.2",

// How much you wish to spend
budget: 0.5,
proposalFilter: async (proposal) => (await acceptablePrice(proposal)) && (await whiteList(proposal)),
proposalFilter: (proposal) => acceptablePrice(proposal) && whiteList(proposal),

// Where you want to spend
payment: {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { TaskExecutor, ProposalFilters } from "@golem-sdk/golem-js";
import { TaskExecutor, ProposalFilterFactory } from "@golem-sdk/golem-js";

/**
* Example demonstrating how to use the predefined filter `whiteListProposalNamesFilter`,
* Example demonstrating how to use the predefined filter `allowProvidersByName`,
* which only allows offers from a provider whose name is in the array
*/

Expand All @@ -14,7 +14,7 @@ for (let i = 0; i < whiteListNames.length; i++) {
(async function main() {
const executor = await TaskExecutor.create({
package: "9a3b5d67b0b27746283cb5f287c13eab1beaa12d92a9f536b747c7ae",
proposalFilter: ProposalFilters.whiteListProposalNamesFilter(whiteListNames),
proposalFilter: ProposalFilterFactory.allowProvidersByName(whiteListNames),
yagnaOptions: { apiKey: "try_golem" },
});

Expand Down
6 changes: 3 additions & 3 deletions examples/strategy/blackListProvidersIds.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { TaskExecutor, ProposalFilters } from "@golem-sdk/golem-js";
import { TaskExecutor, ProposalFilterFactory } from "@golem-sdk/golem-js";

/**
* Example demonstrating how to use the predefined filter `blackListProposalIdsFilter`,
* Example demonstrating how to use the predefined filter `disallowProvidersById`,
* which blocking any proposal coming from a provider whose id is in the array
*/

Expand All @@ -14,7 +14,7 @@ const blackListProvidersIds = [
(async function main() {
const executor = await TaskExecutor.create({
package: "golem/alpine:latest",
proposalFilter: ProposalFilters.blackListProposalIdsFilter(blackListProvidersIds),
proposalFilter: ProposalFilterFactory.disallowProvidersById(blackListProvidersIds),
});

try {
Expand Down
6 changes: 3 additions & 3 deletions examples/strategy/blackListProvidersNames.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { TaskExecutor, ProposalFilters } from "@golem-sdk/golem-js";
import { TaskExecutor, ProposalFilterFactory } from "@golem-sdk/golem-js";

/**
* Example demonstrating how to use the predefined filter `blackListProposalNamesFilter`,
* Example demonstrating how to use the predefined filter `disallowProvidersByName`,
* which blocking any proposal coming from a provider whose name is in the array
*/

Expand All @@ -10,7 +10,7 @@ const blackListProvidersNames = ["provider-1", "golem-provider", "super-provider
(async function main() {
const executor = await TaskExecutor.create({
package: "golem/alpine:latest",
proposalFilter: ProposalFilters.blackListProposalNamesFilter(blackListProvidersNames),
proposalFilter: ProposalFilterFactory.disallowProvidersByName(blackListProvidersNames),
});

try {
Expand Down
6 changes: 3 additions & 3 deletions examples/strategy/blackListProvidersRegexp.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
import { TaskExecutor, ProposalFilters } from "@golem-sdk/golem-js";
import { TaskExecutor, ProposalFilterFactory } from "@golem-sdk/golem-js";

/**
* Example demonstrating how to use the predefined selector `blackListProposalRegexpFilter`,
* Example demonstrating how to use the predefined selector `disallowProvidersByNameRegex`,
* which blocking any proposal coming from a provider whose name match to the regexp
*/

(async function main() {
const executor = await TaskExecutor.create({
package: "golem/alpine:latest",
proposalFilter: ProposalFilters.blackListProposalRegexpFilter(/bad-provider*./),
proposalFilter: ProposalFilterFactory.disallowProvidersByNameRegex(/bad-provider*./),
});

try {
Expand Down
2 changes: 1 addition & 1 deletion examples/strategy/customProviderFilter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { ProposalFilter, TaskExecutor } from "@golem-sdk/golem-js";
* Example demonstrating how to write a custom proposal filter.
* In this case the proposal must include VPN access and must not be from "bad-provider"
*/
const myFilter: ProposalFilter = async (proposal) => {
const myFilter: ProposalFilter = (proposal) => {
return (
proposal.provider.name !== "bad-provider" || !proposal.properties["golem.runtime.capabilities"]?.includes("vpn")
);
Expand Down
48 changes: 48 additions & 0 deletions examples/strategy/dynamicProposalFilter.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
/**
* Example demonstrating how to write a custom dynamic proposal filter.
*
* By dynamic, we understand that the filter behaviour might change over time due to some conditions
*/

import { ProposalFilter, ProposalFilterFactory, TaskExecutor } from "@golem-sdk/golem-js";

const makeDynamicFilter: () => {
filter: ProposalFilter;
stopPolling: () => void;
} = () => {
let partnerProviderIds = [];

const loadPartners = () =>
fetch("https://provider-health.golem.network/v1/provider-whitelist")
.then((res) => res.json())
.then((list) => (partnerProviderIds = list))
.catch((err) => console.error("Issue when loading list of partners", err));

// Update your list of partners each 10s
const interval = setInterval(loadPartners, 10_000);

// Fire the load immediately
void loadPartners();

// Return the filter that will be called synchronously
return {
filter: ProposalFilterFactory.allowProvidersById(partnerProviderIds),
stopPolling: () => clearInterval(interval),
};
};

(async function main() {
const { filter, stopPolling } = makeDynamicFilter();
const executor = await TaskExecutor.create({
package: "golem/alpine:latest",
proposalFilter: filter,
});
try {
await executor.run(async (ctx) => console.log((await ctx.run("echo 'Hello World'")).stdout));
} catch (err) {
console.error("Task execution failed:", err);
} finally {
await executor.shutdown();
stopPolling();
}
})();
6 changes: 3 additions & 3 deletions examples/strategy/whiteListProvidersIds.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { TaskExecutor, ProposalFilters } from "@golem-sdk/golem-js";
import { TaskExecutor, ProposalFilterFactory } from "@golem-sdk/golem-js";

/**
* Example demonstrating how to use the predefined filter `whiteListProposalIdsFilter`,
* Example demonstrating how to use the predefined filter `allowProvidersById`,
* which only allows offers from a provider whose id is in the array
*/

Expand All @@ -14,7 +14,7 @@ const whiteListIds = [
(async function main() {
const executor = await TaskExecutor.create({
package: "golem/alpine:latest",
proposalFilter: ProposalFilters.whiteListProposalIdsFilter(whiteListIds),
proposalFilter: ProposalFilterFactory.allowProvidersById(whiteListIds),
});

try {
Expand Down
Loading

0 comments on commit fcc2704

Please sign in to comment.