feat(network): implement a retry scheduler

👋
This PR equips the BoundedExecutor with  a single retry scheduler, as opposed to spawning one retrier per task (fixes MystenLabs/sui#5312).
Overview
The BoundedExecutor is a tokio runtime handle with an upper bound on the number of tasks it can run concurrently. This PR implements support for retries without letting tasks bypass the semaphore. To achieve this, we attach a background task (scheduler) to the BoundedExecutor, allowing clients to register retries following transient errors.
 The RetryManager is defined as:
/// Context consumed by the [`run_scheduler`] task.
struct RetryManager {
    /// Bounded execution semaphore.
    semaphore: Arc<Semaphore>,
    /// A queue of jobs eligible for execution.
    execution_queue: DelayQueue<Job>,
    /// A sink of failed jobs going to the scheduler.
    tx_new_jobs: Arc<mpsc::Sender<Job>>,
    /// A stream of failed jobs that need scheduling.
    rx_new_jobs: mpsc::Receiver<Job>,
}

It serves as context to a "scheduler" task that consumes it (RetryManager::run_scheduler(mut self, ...)). This task manages an execution_queue: DelayQueue<T> of jobs that need to be retried. Once a job is ready to be executed again, it is spawned on the InternalBoundedExecutor's semaphore.
Previously, each retry job had its own "retrier" attached to it. Now, jobs all share a single coordinator: the run_scheduler(...) background task.
The retry computations are defined through the Job struct:
/// A computation to be retried.
pub struct Job {
    /// A factory producing fresh tasks for polling.
    pub task_factory: Box<FutureFactory>,
    /// Retry policy specifying the backoff strategy as well as the max number of attempts.
    backoff: Backoff,
    /// Monotonic counter tracking the number of execution attempts.
    retry_counter: u32,
}

/// A `Future` factory producing unpolled futures, and implementing `Unpin`.
pub type FutureFactory = dyn FnMut() -> BoxFuture<'static, Result<(), RetryError>> + Send;

#[derive(Debug, Clone, Error)]
pub enum RetryError {
    /// The task has encountered a recoverable error, retrying continues if allowed by the policy.
    #[error("Transient error encountered.")]
    Transient,
    /// The task has encountered an unrecoverable error, retrying stops.
    #[error("Permanent error encountered, stopping retries.")]
    Permanent,
    /// The task has failed too many times, retrying stops.
    #[error("Maximum number of retries reached, stopping retries.")]
    Expired,
}

If more context is needed, you can read the discussion in MystenLabs/sui#5312, or ask me here!
TODOs:

[x] Scaffolding implementation of the scheduler
[x] Gate critical select! branches on acquiring a semaphore permit (~similar to MystenLabs/narwhal#724)
[x] Pick a backoff crate, @huitseeker mentioned simple-exponential which looks promising.
[x] Integrate with the BoundedExecutor
[x] Percolate backpressure to the client (via try_spawn_with_retries)
[x] Integrate with downstream consumers of spawn_with_retries
[x] docs
[x] tests / benchs
[x] cargo fmt
[ ] integrate with main (I'm aware that there are conflicts with main, but I would like to get some implementation ACKs already.)

Changes requiring increased scrutiny from reviewers:

The default buffered channel size: network::RETRY_CHANNEL_BUFFER_SIZE is set to 100. What do you think is a sensible value here?
The RetryConfig crate is removed in favor of<EMAIL_ADDRESS>retry attempts are no longer bound by a "max elapsed time since creation".
The scheduler's select! branch is gated on acquiring a semaphore permit as discussed previously. However,  we poll the execution queue and the semaphore sequentially because of limitations with DelayQueue::poll_expired.
spawn_with_retries returns a JoinHandle<Result<(), RetryError>> to the first attempt at running the computation. The onus is on the caller to embed a callback in the task factory passed to the retry manager.

@erwanor that's so much for your contribution! As we have moved Narwhal under https://github.com/MystenLabs/sui please re-open your PR there given it's still relevant


[BUG] Pull request template has stopped functioning

Description
Describe the bug:
Pull request template has stopped functioning
Expected behavior:
A proper template for everyone making a pull request
Actual behavior:
No template
Reproduction Steps
Steps to reproduce the behavior:

Go to 'Moksh'
Click on 'Pull requests'
Scroll down to 'any pull request'
See error

Expected result:
A clear and concise description of what you expected to happen at each step.
Actual result:
A clear and concise description of what actually happened at each step.
Screenshots

Additional Information
Device (please complete the following information):

OS: [e.g., Windows, macOS, Linux]
Browser [e.g., Chrome, Safari, Firefox]
Version [e.g., 22]

Additional context:
I would like to work on this issue

@akshitagupta15june can I start working on this issue?

yes


Consider adding Sharding, SPMDFullToShardShape and SPMDShardToFullShape ops

Currently they are implemented as custom calls, but they are playing a fundamental role in the interface to SPMD, so we might as well turn them into full-fledged ops.

SPMDFullToShardShape and SPMDShardToFullShape might actually be better in MLIR as an operator around a subregion, since they mark the boundary of an explicitly-sharded subcomputation.


Problem with multibitrate

Please some one help me, I can´t Im not bale to have multibitrate, I stream from a wirecast a RTMP, and i can see it in the clappr player but Im not able to have multibirate I have installed the multi level plugin for the clapper player.
Im very very noob, what im doing wrong?? show I install a extra feacture in my nginx? I have instaled the ffmpeg and the nginx-rtmp-module, should I install anything else??
this is my nginx.conf:
user www-data;
worker_processes  auto;
events {
worker_connections  1024;
}
rtmp {
server {
listen 1935;
chunk_size 4000;
application show {
live on;
exec ffmpeg -i rtmp://<IP_ADDRESS>/show/$name -async 1 -vsync -1
-c:v libx264 -c:a libvo_aacenc -b:v 256k -b:a 32k -vf "scale=480:trunc(ow/a/2)*2" -tune zerolatency -preset veryfast -crf 23 -f flv rtmp://<IP_ADDRESS>/hls/$name_low
-c:v libx264 -c:a libvo_aacenc -b:v 768k -b:a 96k -vf "scale=720:trunc(ow/a/2)*2" -tune zerolatency -preset veryfast -crf 23 -f flv rtmp://<IP_ADDRESS>/hls/$name_mid
-c:v libx264 -c:a libvo_aacenc -b:v 1024k -b:a 128k -vf "scale=960:trunc(ow/a/2)*2" -tune zerolatency -preset veryfast -crf 23 -f flv rtmp://<IP_ADDRESS>/hls/$name_high
-c:v libx264 -c:a libvo_aacenc -b:v 1920k -b:a 128k -vf "scale=1280:trunc(ow/a/2)*2" -tune zerolatency -preset veryfast -crf 23 -f flv rtmp://<IP_ADDRESS>/hls/$name_hd720
-c copy -f flv rtmp://<IP_ADDRESS>/show/$name_src;
}
application live {
live on;
hls on;
hls_path /mnt/hls/;
hls_fragment 3;
hls_playlist_length 60;
hls_variant _low BANDWIDTH=288000; # Low bitrate, sub-SD resolution
hls_variant _mid BANDWIDTH=448000; # Medium bitrate, SD resolution
hls_variant _high BANDWIDTH=1152000; # High bitrate, higher-than-SD resolution
hls_variant _hd720 BANDWIDTH=2048000; # High bitrate, HD 720p resolution
hls_variant _src BANDWIDTH=4096000; # Source bitrate, source resolution
}
}
}
http {
directio 512;
expires -1;
sendfile off;
charset utf-8;
include mime.types;
default_type application/octet-stream;
server_tokens off;
keepalive_timeout 20;
tcp_nopush on;
tcp_nodelay off;
server_name_in_redirect off;
types_hash_max_size 2048;
gzip on;
gzip_http_version 1.0;
gzip_comp_level 5;
gzip_min_length 512;
gzip_buffers 4 8k;
gzip_proxied any;
gzip_types
text/css
text/plain
text/x-component
application/javascript
application/json
application/xml
application/xhtml+xml
application/x-font-ttf
application/x-font-opentype
application/vnd.ms-fontobject
image/svg+xml
image/x-icon;
gzip_disable "msie6";
gzip_vary on;
server {
listen 8080;
location / {
root /home/ics/nginx/html/;
}
location /hls {
types {
application/vnd.apple.mpegurl m3u8;
}
root /mnt/;
add_header Cache-Control no-cache;
add_header Access-Control-Allow-Origin *;
}
}
server {
listen 80;
server_name_in_redirect off;
charset utf-8;
access_log	/usr/local/nginx/access.log;
error_log	/usr/local/nginx/error.log;
root /usr/local/nginx/html;
index index.php index.html;
location / {
try_files $uri $uri/ =404;
server_name_in_redirect off;
}
location ~ .php$ {
try_files $uri $uri/ /index.php;
fastcgi_split_path_info ^(.+.php)(/.+)$;
fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
}

Could you please post nginx error logs?


Removed ObserveStructuredMessagePolicy from being compiled into the Samples Packages

Removed ObserveStructuredMessagePolicy from being compiled into the Storage Samples Packages

API change check
API changes are not detected in this pull request.

/check-enforcer override


Automatic error report

<!---   *** BEFORE SUBMITTING: PASTE CLIPBOARD HERE TO COMPLETE YOUR REPORT ***   ---!>

I can't to use the numpy for showing the variable in spyder,the ERROR is 'ValueError: cannot set WRITEABLE flag to True of this array'.my Tensorflow versions is 2.3.1,which mean I need the unmpy versions is >=1.16

Hey @Wang-sirs, thanks for reporting. This is a duplicate of issue #20119, which was answered correctly by our bot.
Therefore, I'm going to close it.


Add visibility attribute for GCC and Clang + Add guard macros

Add visibility attribute for GCC and Clang + Add guard macros
Fix for modern compilers.
Add building of shared library option (BUILD_SHARED=ON).
Fix check to check for WIN32 and _WIN32
Fix for newer and older MSVC compilers (check for _MSC_VER and STDC_WANT_SECURE_LIB so it doesn't #define *_s in case of newer MSVC compiler).

Does the opentyrian2000 officially support these old OSes and compilers? If not, I'm disinclined to take the commits that rollback the later C++ features.

Does opentyrian officially support these old OSes and compilers? I would otherwise be disinclined to take the commits that rollback the later C++ features.

Yes I have Mac OS X 10.5 working
These old compilers support SDL2 with patches.
I am compiling An appropriate version.

I have built OpenTyrian2000 with MIDI support succesfully for Mac OS X 10.5.
Release page:
https://github.com/andyvand/opentyrian2000/releases/tag/2.2.0-MIDI

It looks good to me, but I should warn you: if the objective is to add support for old PowerPC Macs, that would require a ton of refactoring, as PowerPC is big-endian and nearly all the music formats we support are stored little-endian.

I have created an extra branch and reverted the code.
I have made some fixes to it.
oldos branch has the modified code for Mac OS X 10.5

Yeah, I think that would be your best bet, as there's no guarantee that this won't get updated in a way that's compatible with ancient compilers and break something. Thank you for all of your work on this!


(feature request) Support for Python 3.6 ? Or trick to backport type hints

Hi,
I have a project which uses new feature of Python 3.6 like f-string literal, and type hints.

I have been able to back port the f-string feature thanks to this module https://github.com/asottile/future-fstrings
but cannot find a way to backport type hints, I have errors like

  File "build/bdist.linux-x86_64/egg/parcoursup/propositions/Etablissement.py", line 50
    self.rangs: Dict[Candidat, int] = dict()
              ^
SyntaxError: invalid syntax

  File "build/bdist.linux-x86_64/egg/parcoursup/propositions/GroupeInternat.py", line 28
    nbJoursCampagne: int = 1  #: Le nombre de jours depuis l'ouverture de la campagne, 1 le premier jour.
                   ^
SyntaxError: invalid syntax

Is there a plan to support Python 3.6 anytime soon? Python 3.7 is already the new default version, and 3.5 starts to be old.
Thanks!
If Py3.6 is not planned to be supported soon, does anyone has a trick to back-port the type hints and make my builds work?
Thanks in advance!

3.6 is supported but you have to specify in the Yaml config. By default, our 3.x interpreter is 3.5.

@Naereen please see https://docs.readthedocs.io/en/latest/yaml-config.html#build-image

Oh, build: image: latest is actually required for Python 3.6?
Sorry it wasn't exactly clear, I tried again.

Ohh great it worked!! :trophy: Thanks a lot for your help!
(For instance https://parcoursuppy.readthedocs.io/fr/latest/parcoursup.ordreappel.AlgoOrdreAppel.html#module-parcoursup.ordreappel.AlgoOrdreAppel)


Emotiv pro premium license

Hi. We are using emotiv pro premium license to use the API. The license is right now installed in our desktop.
We want to change it to have license present in software installed in our laptop.
Can somebody help?

hi, please contact our customer support team to reset device for your
license.
On Tue, Apr 4, 2023, 17:25 rajatanand86 @.***> wrote:

Hi. We are using emotiv pro premium license to use the API. The license is
right now installed in our desktop.
We want to change it to have license present in software installed in our
laptop.
Can somebody help?
—
Reply to this email directly, view it on GitHub
https://github.com/Emotiv/cortex-v2-example/issues/199, or unsubscribe
https://github.com/notifications/unsubscribe-auth/AAMAFYUMFQXKUX3HASSPSKDW7PZIPANCNFSM6AAAAAAWSQDSWQ
.
You are receiving this because you are subscribed to this thread.Message
ID: @.***>

you can send to @.***
On Tue, Apr 4, 2023, 22:32 rajatanand86 @.***> wrote:

Can you please send customer support email?
—
Reply to this email directly, view it on GitHub
https://github.com/Emotiv/cortex-v2-example/issues/199#issuecomment-1496188635,
or unsubscribe
https://github.com/notifications/unsubscribe-auth/AAMAFYSTGL4F67MVAUCET43W7Q5HFANCNFSM6AAAAAAWSQDSWQ
.
You are receiving this because you commented.Message ID:
@.***>

Can't read this mail id. Please send to<EMAIL_ADDRESS>

Can't read this mail id. Please send to<EMAIL_ADDRESS>
I updated the comment.


PyPI version badge says "Maximum response size exceeded"

Hi!
We are having an issue with this PyPI version shieldbadge rendering wrong here: https://github.com/ccxt/ccxt#ccxt--cryptocurrency-exchange-trading-library

Here it is live:

It was working fine for a long while, then stopped displaying the version suddenly.
It would be great if anyone shed any light on how to fix this.
Thank you!

Hello. The message means pretty much what it says. We set a limit on the size of response we will accept as input. If we hit that limit, we stop the request. This prevents users from using the dynamic or endpoint badges to DoS us by giving us some arbitrarily large API response. At the moment we set that limit at 10Mb: https://github.com/badges/shields/blob/3e8cdf44be772b71cd5398e1336d270b8e89d994/config/default.yml#L34 Parsing 10Mb of JSON to write out an SVG with a single string on it seems a pretty reasonable upper bound.
Long story short, https://pypi.org/pypi/ccxt/json serves up more than 10Mb of JSON, so we fail.
$ curl --silent "https://pypi.org/pypi/ccxt/json" -w 'size: %{size_download}\n' -o /dev/null | sed 's/[^0-9]//g' | numfmt --to=iec
11M

so that's why it failing. This is an interesting case because I think this is the first time I've seen one of the upstream APIs we consume (as opposed to a user supplied input) exceed this limit.

@chris48s thanks for your explanation! We will try to reduce the size of that JSON.


AttributeError: SVGMobject object has no attribute 'file_path'

When running the SVGMobject Example code in the manual, I always get an error: SVGMobject object has no attribute 'file_path'.
Manim version: Manim Community v0.16.0.post0
There seems to be no problem with the old version, is it a bug in the new version?

Works for me. Any code you can share?
Do you do it like this?
SVGMobject("svgfile.svg")

@sugoidesune
Thanks! It is possible to write a full pathname, for example: "SVGMobject (". / assets / svg_file. svg ")" But it can't be written like this: "SVGMobject (" svg_file. svg ")".

Can't really reproduce anymore, has perhaps been fixed since. We'll look into it more if it is reported again.


Explicitly merge with .env.local

Closes #251 but with opt-in. I think it's too easy to forget about .env.local when targeting release build if you don't use CI
Readme update:
Local config
Sometimes you want temporary edit some config entries. It's pretty handy to use different file for that case and add it to .gitignore.
If there is no local config, nothing bad happens.
You can enable this feature by following the instructions below and creating .env.local where you override config with local modifications.
Be careful with release builds!
Here is how you can enbale
Android
List all needed targets
project.ext.useEnvLocalConfig = [
    debug: true
]

iOS
Add this to you pre-actions in needed schemes
echo "1" > /tmp/useenvlocal

Env variable
USE_ENV_LOCAL_CONFIG=1

@pedro Can you look this PR? I think this is a great feature.

Anything on this?

It's a great feature that create-react-app does by default.
I think very useful for all cases.

Any update here, it's a basic and useful feature ~

@luancurti would you be so kind to explain why you just closed this PR after 2 years without any comment?

@luancurti : Indeed, this is extremely useful.  +1 for reopening and finally merging this pull request.

+1 for reopening and merging this PR.

@luancurti can you please take a look at what happens here?

@escaton I'll take a look

Is this PR still alive? It would be very useful.


std namespace should be specified for transform

Fixes build with some VS and clang version.

it's surprising argument dependent lookup fails on those compilers, they must use raw pointers as the iterator type. Either way, thanks for the build fix


App does not remember window size after reopening

@muan @KMamedoff this could be easily done by electron-window-state

Is this still an issue? Seems to work for me on Windows. Do you mean after quit (completely closing app and reopening) or just when you toggle it with hotkeys? Here:

Can confirm, window size isn't remembered after completely closing the app (cmd Q) on Mac.


pull request for e2e test at 12/14/2016 05:58:23

:white_check_mark: Validation status: passed
For more details, please refer to the build report.
Note: If you changed an existing file name or deleted a file, broken links in other files to the deleted or renamed file are listed only in the full build report.


Indexing stuck when laptop goes to sleep

I'm having issues with indexing, which I believe is due to closing down my laptop while the process is still going. I'm on a M2 chip MacBook Pro.
I'm not able to interrupt the index process either, except through forcefully killing ord. This corrupts the index file, which means I have to start again...
Attaching some logs where the log level is set to trace. Right before the start of the line there's an enormous hex blob being printed, as the result of getblock. This happens at 2024-02-01T16:13:32Z, a full 90 minutes before the next line (the first line in the log below). I don't know the internals of ord, but it looks like we end up in a stuck state where we don't manage to pick up processing. As you can see I interrupt the processing with <CTRL-C>, but that does nothing. ord keeps printing idle interval checking for expired indefinitely, until I send another interrupt signal (corrupting the DB)
ord.log

Try waiting longer after that first ctrl-c. I haven't watched the logs but I've seen it take upwards of 30-60 minutes or more to shutdown gracefully on a similar system.

Yeah, shutting down sometimes works instantly but often it takes really long. The CTRL-C logic can be found in src/lib.rs on line 227. If you can find some thing we are doing wrong or could be done better please let me know :)


Mysterious Icon File in every Folder

Hey,
I have a mysterious Icon File in every folder. I just changed some js files in my plugin and after saving the js files I find this mysterious Icon File in every folder of my plugin (even in there where I didn't change anything).
I have no idea whats happening. Now I'm using Atom and everything is fine, but I would like to switch back.
Any idea?

What operating system?

thank you for answering, I solved the problem, it was about google drive.
Christian
Soulsites OÜ
Männimäe / 1
Kuusalu vlad
74626 Pudisoo Küla
Harju Maakond
E-Mail<EMAIL_ADDRESS>Mobil: +49<PHONE_NUMBER> (keine Supportnummer)

---- On  Wed, 11 Mar 2020 00:57:58 +0200 "Philip<EMAIL_ADDRESS>wrote ----
What operating system?
—
You are receiving this because you authored the thread.
Reply to this email directly, view it on GitHub, or unsubscribe.


Improve performance

Using the accept_{ev} in serialization gives a huge performance boost. This should be reimplemented. See https://github.com/chmp/serde_arrow/pull/16/commits/5e27233ecadee68cc4738cd43bec3930f0505bfc for details

implemented on main


[Italian] "san silvestro" and "notte di san silvestro" examples are failing

duckling.core=> (load!)
duckling.core=> (run)
...
:it$core: 534 examples, 2 failed.
...

cc @ibobo - can you take a look at this?

I have no failing examples... checked on my repository with the latest master merged and also on a fresh clone of the main repository

I found that two rules did the same thing (I restructured that part last night), maybe that's causing the problem on your part. Still I don't understand how my repo can work if your's failing... anyway, will send a new pull request in a few minutes.

Sorry... no luck... the <time> notte and <time> notte rules need to stay there. Hope you find the culprit.

Thanks for checking @ibobo.
I still have the issue using a fresh copy of the repo. Might be just my environment.
Someone else can confirm?

Works for me.

Please reopen if not working for you

I'm actually getting this failure (see below) using the maven dependency v. 0.4.23.
"not found" "san silvestro"
"not found" "notte di san silvestro"
I'm doing this while trying to call Duckling via Java.  I am experiencing other issues as well, which i'll open another ticket for, but wanted to add to this ticket.

@bisoldi: any update on this?

@FraBle No update.  We implemented Duckling and got it to run, though this issue still existed.  I don't think it was a fatal error, so we just left it.


Writing error

Issue missing word "the" in the phrase "You can download some of metaverses in version 1 from here or come back later for version 2."
File path /www_mapod4d_it/index.html
Row 145

The issue has been resolved in local repo. Closed #31


Caching

Hey, i am currently encountering an caching issue, caused by the dataloader, which is caching the requests automatically.
This is less of an issue and more of an feature request, to be able to configure caching, either per relation or at start.
I disabled caching by inserting an "clearAll()" after the batch request, but that's not very generic.
From my perspective caching should be configureable somehow

Are you using @Loader decorator? It takes DataLoader.Options as the second argument. Passing it setting cache option may solve your situation.

Yeah I thought of that too, but wouldn't that cause a lot of overhead in my code, since I always would have to specify a custom batchLoaderFn, which TypeormLoader does for me?
I will have to do that if there is no other option but I just wanted to ask if their could be a better option (in the future) 😄

Does adding DataLoader.Options to TypeormLoader solves your problem?
It is possible, however, I am not sure in what kind of cases it would be useful.
BTW, using Loader with BatchLoadFn itself does not cause more overhead than TypeormLoader.

I didn't find a way to replicate the logic of TypeormLoader with Loader easily.
How would I write sth like
@TypeormLoader((type) => Group, (group: Group) => group.parentId)
with Loader without rewriting the logic you implemented in TypeormLoader?
Passing DataLoader.Options via TypeormLoader would solve my caching problem i guess, but would cause the system to make multiple requests on duplicate entries i think (what i understood from the dataloader description).
A custom callback per TypeormLoader or per ApolloServerLoaderPlugin would be awesome in my case, so i can call .clearAll() after each batch request on the specific dataloader instance.
Thanks for your time btw :-)

What kind of relation are you using with @TypeornLoader? In case of ManyToOne the field resolver  can be like below:
@Resolver((of) => Group)
export class GroupResolver {
  @FieldResolver()
  @Loader<number, Parent>(async (ids) => {  // batchLoadFn
    const repository = getRepository(Parent);
    const parents = keyBy(await repository.findByIds(ids), "id");
    return ids.map((id) => parents[id]);
  })
  parent(@Root() root: Group) {
    return (dataloader: DataLoader<number, Parent>) =>
      dataloader.load(root.parentId);
  }
}

The code could be a bit different depending on the type of relation.
BTW I would like to know why you want to clear cache for each call of the field if possible.

Thanks for the code, I can probably solve my issue with that.
My problem:
When I edit the database, my application wont show the current data, because the dataloader is caching the old db entries so I need to somehow prevent caching without loosing too much performance.
So I read in the "Disable caching" section from dataloader
https://github.com/graphql/dataloader#disabling-cache
that a solution would be to clear the cache after each request.

It seems you may not need to clear cache because type-graphql-dataloader assigns individual dataLoader for each request.


v1.0.0 release

v1.0.0 release

[x] Create a release/v1.0.0 branch off of main for the release candidate.
Testing

[ ] Run functional_tests.yml workflow on release/v1.0.0.

[ ] Create a GitHub release of  release/v1.0.0 with a v1.0.0 tag.

[ ] Copy the release notes from the ## Unreleased section of CHANGELOG.md.

Git tag manipulation.

[ ] Create a git tag named v1.0.0 pointing to the release/v1.0.0 branch
[ ] Create a new git tag named v1.
[ ] Move the v1 tag to point to release/v1.0.0.

[ ] Verify action with uses<EMAIL_ADDRESS>in test repo as a sanity check.
Create a PR to:

[ ] Create a PR to update CHANGELOG.md with the latest release.
[ ] Update instances of leanprover/lean-action@{{MAJOR_SPECIFIC_RELEASE}} in README.md.

[ ] Post release announcement in general/lean-action Zulip topic.

Functional test pipelines for release/v1.0.0

Lean version v4.9.0
Lean version v4.9.1
Note that one test fails because lean4checker does not have a v4.9.1 tag
Lean version v4.10.0-rc2
Note that one test fails because lean4checker does not have a v4.10.0-rc2 tag


Make older versions available to install via Homebrew + reduce installation file size

Could you make all the older versions of Infer available to download via Homebrew?
I tried the latest version, 0.13.0, and it had a number of problems:

It reports many false positive warnings like "QUANDARY_TAINT_ERROR" whenever an Activity is launched in Android Java code. (There's no explanation of what those words mean anyway, so it's just cryptic messages with no meaning)
It reports false positive RESOURCE_LEAK for Java FileOutputStream or FileInputStream, similar to https://github.com/facebook/infer/issues/49 and https://github.com/facebook/infer/issues/619
It uses a huge excessive 1 GB of file storage space in /usr/local/Cellar/infer/0.13.0 (the Homebrew install location)

The older version 0.9.4 did not have any of these problems, but I was not able to revert back to it, even with the following guidelines:

https://stackoverflow.com/questions/3987683/homebrew-install-specific-version-of-formula
https://apple.stackexchange.com/questions/84403/how-to-use-homebrew-to-install-local-archive

Also, is there a way to reduce the disk space used for installing Infer? Version 0.9.4 consumed 548 MB in /usr/local/Cellar/infer/0.9.4 but this is still a huge amount for a source analysis tool.

Thanks for the feedback. Regarding the issues you found in infer itself:

You can disable quandary with --no-quandary. Quandary is a taint analysis engine. An example of report you get would be helpful to debug the issue in infer. (unless @sblackshear knows what that's about?)
For FileOutputStream and FileInputStream, the issues you mention are for older versions of infer too, did you notice a recent regression?

Regarding the 1GB install, it looks like Homebrew turns the many symlinks to the infer binaries into copies of it. I think this is because it installs infer via opam, and opam is known not to preserve symlinks (for portability). I'll see if we can update the formula.
Regarding the previous versions of infer, I'm not sure the issue is related to infer in particular. Maybe consider raising this issue with Homebrew.

Hi @jvillard
Are there any files we can manually delete inside /usr/local/Cellar/infer/ after installation? At least this could be used as a temporary workaround.
Regarding older versions of infer, is it possible you can provide links to the tar.gz files that Homebrew downloads? Then we could use something like brew install -f infer-0.9.4.tar.gz to install from a local file, as described here. I was not able to find these file links. The tar.xz files on the releases page do not work.

Actually, my assessment regarding the size of the installation was wrong, sorry. Looks like this is mostly the newer clang taking a lot of space. The clang binaries alone weigh 631M even though we strip all of them, then 311M of (stripped) libs. Infer itself is only 60M.
If you do not use the clang analyzers, you can decrease the install size a lot by passing the --without-clang option to brew install infer.
The tarballs for older versions of infer are on GitHub, as they were when these versions were published on Homebrew so I'm not sure what changed. What doesn't work? What are you running and what's the error?

Hi @jvillard
I tried this, and it doesn't work: I downloaded infer-osx-v<IP_ADDRESS>.tar.xz from the releases page. Then I did:
brew install -f infer-osx-v<IP_ADDRESS>.tar.xz

And it gives error:
"Error: No available formula with the name "infer-osx-v<IP_ADDRESS>.tar.xz"

Whereas if I grab the cached download of infer 0.13 from ~/Library/Caches/Homebrew/infer-0.13.0.sierra.bottle.tar.gz and then do:
brew install -f infer-0.13.0.sierra.bottle.tar.gz

then this seems to work fine, by saying "Warning: infer 0.13.0 is already installed".
Is it possible reveal the download links for these tar.gz files for all versions of Infer? It's doesn't appear to be the same as tar.xz files on the releases page.

I need to add more documentation/better error messages for the Quandary issue types in Java--thanks for pointing that out.


Basic example broken with chat-type OpenAI models

The bug
OpenAI chat models not compatible with the basic first example.
To Reproduce
Give a full working code snippet that can be pasted into a notebook cell or python file. Make sure to include the LLM load step so we know which model you are using.
import guidance

# set the default language model used to execute guidance programs
guidance.llm = guidance.llms.OpenAI("gpt-3.5-turbo")

# define a guidance program that adapts a proverb
program = guidance("""Tweak this proverb to apply to model instructions instead.

{{proverb}}
- {{book}} {{chapter}}:{{verse}}

UPDATED
Where there is no guidance{{gen 'rewrite' stop="\\n-"}}
- GPT {{gen 'chapter'}}:{{gen 'verse'}}""")

# execute the program on a specific proverb
executed_program = program(
    proverb="Where there is no guidance, a people falls,\nbut in an abundance of counselors there is safety.",
    book="Proverbs",
    chapter=11,
    verse=14
)

Output:
Tweak this proverb to apply to model instructions instead.

Where there is no guidance, a people falls,
but in an abundance of counselors there is safety.
- Proverbs 11:14

UPDATED
Where there is no guidance
Traceback (most recent call last):
  File "/home/ec2-user/SageMaker/custom-miniconda/miniconda/envs/custom_python39/lib/python3.9/site-packages/guidance/_program_executor.py", line 94, in run
    await self.visit(self.parse_tree)
  File "/home/ec2-user/SageMaker/custom-miniconda/miniconda/envs/custom_python39/lib/python3.9/site-packages/guidance/_program_executor.py", line 429, in visit
    visited_children.append(await self.visit(child, inner_next_node, inner_next_next_node, inner_prev_node, node, parent_node))
  File "/home/ec2-user/SageMaker/custom-miniconda/miniconda/envs/custom_python39/lib/python3.9/site-packages/guidance/_program_executor.py", line 429, in visit
    visited_children.append(await self.visit(child, inner_next_node, inner_next_next_node, inner_prev_node, node, parent_node))
  File "/home/ec2-user/SageMaker/custom-miniconda/miniconda/envs/custom_python39/lib/python3.9/site-packages/guidance/_program_executor.py", line 218, in visit
    visited_children = [await self.visit(child, next_node, next_next_node, prev_node, node, parent_node) for child in node.children]
  File "/home/ec2-user/SageMaker/custom-miniconda/miniconda/envs/custom_python39/lib/python3.9/site-packages/guidance/_program_executor.py", line 218, in <listcomp>
    visited_children = [await self.visit(child, next_node, next_next_node, prev_node, node, parent_node) for child in node.children]
  File "/home/ec2-user/SageMaker/custom-miniconda/miniconda/envs/custom_python39/lib/python3.9/site-packages/guidance/_program_executor.py", line 429, in visit
    visited_children.append(await self.visit(child, inner_next_node, inner_next_next_node, inner_prev_node, node, parent_node))
  File "/home/ec2-user/SageMaker/custom-miniconda/miniconda/envs/custom_python39/lib/python3.9/site-packages/guidance/_program_executor.py", line 292, in visit
    command_output = await command_function(*positional_args, **named_args)
  File "/home/ec2-user/SageMaker/custom-miniconda/miniconda/envs/custom_python39/lib/python3.9/site-packages/guidance/library/_gen.py", line 137, in gen
    gen_obj = await parser.llm_session(
  File "/home/ec2-user/SageMaker/custom-miniconda/miniconda/envs/custom_python39/lib/python3.9/site-packages/guidance/llms/_openai.py", line 520, in __call__
    out = self.llm.caller(**call_args)
  File "/home/ec2-user/SageMaker/custom-miniconda/miniconda/envs/custom_python39/lib/python3.9/site-packages/guidance/llms/_openai.py", line 307, in _library_call
    kwargs['messages'] = prompt_to_messages(kwargs['prompt'])
  File "/home/ec2-user/SageMaker/custom-miniconda/miniconda/envs/custom_python39/lib/python3.9/site-packages/guidance/llms/_openai.py", line 21, in prompt_to_messages
    assert prompt.endswith("<|im_start|>assistant\n"), "When calling OpenAI chat models you must generate only directly inside the assistant role! The OpenAI API does not currently support partial assistant prompting."
AssertionError: When calling OpenAI chat models you must generate only directly inside the assistant role! The OpenAI API does not currently support partial assistant prompting.

Error in program:  When calling OpenAI chat models you must generate only directly inside the assistant role! The OpenAI API does not currently support partial assistant prompting.
---------------------------------------------------------------------------
AssertionError                            Traceback (most recent call last)
Cell In[6], line 17
      7 program = guidance("""Tweak this proverb to apply to model instructions instead.
      8
      9 {{proverb}}
   (...)
     13 Where there is no guidance{{gen 'rewrite' stop="\\n-"}}
     14 - GPT {{gen 'chapter'}}:{{gen 'verse'}}""")
     16 # execute the program on a specific proverb
---> 17 executed_program = program(
     18     proverb="Where there is no guidance, a people falls,\nbut in an abundance of counselors there is safety.",
     19     book="Proverbs",
     20     chapter=11,
     21     verse=14
     22 )

File ~/SageMaker/custom-miniconda/miniconda/envs/custom_python39/lib/python3.9/site-packages/guidance/_program.py:233, in Program.__call__(self, **kwargs)
    231         return self._stream_run(loop, new_program)
    232     else:
--> 233         loop.run_until_complete(new_program.execute())
    235 return new_program

File ~/SageMaker/custom-miniconda/miniconda/envs/custom_python39/lib/python3.9/site-packages/nest_asyncio.py:90, in _patch_loop.<locals>.run_until_complete(self, future)
     87 if not f.done():
     88     raise RuntimeError(
     89         'Event loop stopped before Future completed.')
---> 90 return f.result()

File ~/SageMaker/custom-miniconda/miniconda/envs/custom_python39/lib/python3.9/asyncio/futures.py:201, in Future.result(self)
    199 self.__log_traceback = False
    200 if self._exception is not None:
--> 201     raise self._exception
    202 return self._result

File ~/SageMaker/custom-miniconda/miniconda/envs/custom_python39/lib/python3.9/asyncio/tasks.py:256, in Task.__step(***failed resolving arguments***)
    252 try:
    253     if exc is None:
    254         # We use the `send` method directly, because coroutines
    255         # don't have `__iter__` and `__next__` methods.
--> 256         result = coro.send(None)
    257     else:
    258         result = coro.throw(exc)

File ~/SageMaker/custom-miniconda/miniconda/envs/custom_python39/lib/python3.9/site-packages/guidance/_program.py:384, in Program.execute(self)
    382 else:
    383     with self.llm.session(asynchronous=True) as llm_session:
--> 384         await self._executor.run(llm_session)
    385 self._text = self._executor.prefix
    387 # delete the executor and so mark the program as not executing

File ~/SageMaker/custom-miniconda/miniconda/envs/custom_python39/lib/python3.9/site-packages/guidance/_program_executor.py:98, in ProgramExecutor.run(self, llm_session)
     96 print(traceback.format_exc())
     97 print("Error in program: ", e)
---> 98 raise e

File ~/SageMaker/custom-miniconda/miniconda/envs/custom_python39/lib/python3.9/site-packages/guidance/_program_executor.py:94, in ProgramExecutor.run(self, llm_session)
     88 self.llm_session = llm_session
     89 try:
     90     # first parse all the whitespace control
     91     # self.whitespace_control_visit(self.parse_tree)
     92
     93     # now execute the program
---> 94     await self.visit(self.parse_tree)
     95 except Exception as e:
     96     print(traceback.format_exc())

File ~/SageMaker/custom-miniconda/miniconda/envs/custom_python39/lib/python3.9/site-packages/guidance/_program_executor.py:429, in ProgramExecutor.visit(self, node, next_node, next_next_node, prev_node, parent_node, grandparent_node)
    427     else:
    428         inner_prev_node = prev_node
--> 429     visited_children.append(await self.visit(child, inner_next_node, inner_next_next_node, inner_prev_node, node, parent_node))
    430 # visited_children = [self.visit(child) for child in node.children]
    432 if len(visited_children) == 1:

File ~/SageMaker/custom-miniconda/miniconda/envs/custom_python39/lib/python3.9/site-packages/guidance/_program_executor.py:429, in ProgramExecutor.visit(self, node, next_node, next_next_node, prev_node, parent_node, grandparent_node)
    427     else:
    428         inner_prev_node = prev_node
--> 429     visited_children.append(await self.visit(child, inner_next_node, inner_next_next_node, inner_prev_node, node, parent_node))
    430 # visited_children = [self.visit(child) for child in node.children]
    432 if len(visited_children) == 1:

File ~/SageMaker/custom-miniconda/miniconda/envs/custom_python39/lib/python3.9/site-packages/guidance/_program_executor.py:218, in ProgramExecutor.visit(self, node, next_node, next_next_node, prev_node, parent_node, grandparent_node)
    216 # visit our children
    217 self.block_content.append([])
--> 218 visited_children = [await self.visit(child, next_node, next_next_node, prev_node, node, parent_node) for child in node.children]
    219 self.block_content.pop()
    220 out = "".join("" if c is None else str(c) for c in visited_children)

File ~/SageMaker/custom-miniconda/miniconda/envs/custom_python39/lib/python3.9/site-packages/guidance/_program_executor.py:218, in <listcomp>(.0)
    216 # visit our children
    217 self.block_content.append([])
--> 218 visited_children = [await self.visit(child, next_node, next_next_node, prev_node, node, parent_node) for child in node.children]
    219 self.block_content.pop()
    220 out = "".join("" if c is None else str(c) for c in visited_children)

File ~/SageMaker/custom-miniconda/miniconda/envs/custom_python39/lib/python3.9/site-packages/guidance/_program_executor.py:429, in ProgramExecutor.visit(self, node, next_node, next_next_node, prev_node, parent_node, grandparent_node)
    427     else:
    428         inner_prev_node = prev_node
--> 429     visited_children.append(await self.visit(child, inner_next_node, inner_next_next_node, inner_prev_node, node, parent_node))
    430 # visited_children = [self.visit(child) for child in node.children]
    432 if len(visited_children) == 1:

File ~/SageMaker/custom-miniconda/miniconda/envs/custom_python39/lib/python3.9/site-packages/guidance/_program_executor.py:292, in ProgramExecutor.visit(self, node, next_node, next_next_node, prev_node, parent_node, grandparent_node)
    290 if inspect.iscoroutinefunction(command_function):
    291     await asyncio.sleep(0) # give other coroutines a chance to run
--> 292     command_output = await command_function(*positional_args, **named_args)
    293 else:
    294     command_output = command_function(*positional_args, **named_args)

File ~/SageMaker/custom-miniconda/miniconda/envs/custom_python39/lib/python3.9/site-packages/guidance/library/_gen.py:137, in gen(name, stop, stop_regex, save_stop_text, max_tokens, n, stream, temperature, top_p, logprobs, pattern, hidden, list_append, save_prompt, token_healing, _parser_context)
    134 assert parser.llm_session is not None, "You must set an LLM for the program to use (use the `llm=` parameter) before you can use the `gen` command."
    136 # call the LLM
--> 137 gen_obj = await parser.llm_session(
    138     parser_prefix+prefix, stop=stop, stop_regex=stop_regex, max_tokens=max_tokens, n=n, pattern=pattern,
    139     temperature=temperature, top_p=top_p, logprobs=logprobs, cache_seed=cache_seed, token_healing=token_healing,
    140     echo=parser.program.logprobs is not None, stream=stream, caching=parser.program.caching
    141 )
    143 if n == 1:
    144     generated_value = prefix

File ~/SageMaker/custom-miniconda/miniconda/envs/custom_python39/lib/python3.9/site-packages/guidance/llms/_openai.py:520, in OpenAISession.__call__(self, prompt, stop, stop_regex, temperature, n, max_tokens, logprobs, top_p, echo, logit_bias, token_healing, pattern, stream, cache_seed, caching)
    518     if logit_bias is not None:
    519         call_args["logit_bias"] = {str(k): v for k,v in logit_bias.items()} # convert keys to strings since that's the open ai api's format
--> 520     out = self.llm.caller(**call_args)
    522 except openai.error.RateLimitError:
    523     await asyncio.sleep(3)

File ~/SageMaker/custom-miniconda/miniconda/envs/custom_python39/lib/python3.9/site-packages/guidance/llms/_openai.py:307, in OpenAI._library_call(self, **kwargs)
    304 assert openai.api_key is not None, "You must provide an OpenAI API key to use the OpenAI LLM. Either pass it in the constructor, set the OPENAI_API_KEY environment variable, or create the file ~/.openai_api_key with your key in it."
    306 if self.chat_mode:
--> 307     kwargs['messages'] = prompt_to_messages(kwargs['prompt'])
    308     del kwargs['prompt']
    309     del kwargs['echo']

File ~/SageMaker/custom-miniconda/miniconda/envs/custom_python39/lib/python3.9/site-packages/guidance/llms/_openai.py:21, in prompt_to_messages(prompt)
     18 def prompt_to_messages(prompt):
     19     messages = []
---> 21     assert prompt.endswith("<|im_start|>assistant\n"), "When calling OpenAI chat models you must generate only directly inside the assistant role! The OpenAI API does not currently support partial assistant prompting."
     23     pattern = r'<\|im_start\|>(\w+)(.*?)(?=<\|im_end\|>|$)'
     24     matches = re.findall(pattern, prompt, re.DOTALL)

AssertionError: When calling OpenAI chat models you must generate only directly inside the assistant role! The OpenAI API does not currently support partial assistant prompting.

System info (please complete the following information):

OS (e.g. Ubuntu, Windows 11, Mac OS, etc.): Mac OSX
Guidance Version (guidance.__version__): '0.0.56'

That is true, but a chat prompt would also fail on standard completion models, so either way the first example has to break on something :) ...if you think we can improve the error message I am all ears!

I see your point. However, there is a strong incentive to use OpenAI's chat model gpt-3.5-turbo instead of the text-davinci-003 due to the 10x cost reduction  in the chat variant. So, I was thinking, since behind the scenes, the chat models just construct a single prompt from the system and user prompts, then perhaps, the framework could also make some attempt to allow this flexibility in that if the user provides a single prompt, then perhaps it just goes into the user prompt with the system prompt either being empty, or being something generic. Conversely, if thee user and system prompts are provided separately and the model only accepts a single prompt, then perhaps the framework will add them with some appropriate section headings (ideally one that we know to be common to the variants of the provider, but does not have to be).
In this way, we can continue to benefit form Guidance at a cheaper cost. Does the motivation and what I am proposing make sense?

Generally, it seems like missed opportunity to limit the chat functionality so much. I also noticed that the gen inside assistant is completely neutered (e.g. does not even support pattern).  I am not sure of the implementation details, but I dont think there is a good fundamental reason why that should be the case?

I was thinking, if there is a good way to override the gen, then I can easily modify it to do what I need (i.e. make the chat model behave as if it was a regular completion model)

I am not sure I entirely follow but the issue here is a limitation of the OpenAI API, we can't give partial completions yet to the assistant role. This means all generations have to be done as the only subtag inside an assistant role. You can use the above style of prompt with a chat model, but you do have to put in chat tags and respect that limitation :) like this:
import guidance

# set the default language model used to execute guidance programs
guidance.llm = guidance.llms.OpenAI("gpt-3.5-turbo")

# define a guidance program that adapts a proverb
program = guidance("""
{{#system}}You are a helpful agent{{/system}}

{{#user}}Tweak this proverb to apply to model instructions instead.

{{proverb}}
- {{book}} {{chapter}}:{{verse}}

UPDATED
Where there is no guidance{{/user}}

{{#assistant}}{{gen 'rewrite' stop="\\n-"}}{{/assistant}}""")

# execute the program on a specific proverb
executed_program = program(
    proverb="Where there is no guidance, a people falls,\nbut in an abundance of counselors there is safety.",
    book="Proverbs",
    chapter=11,
    verse=14
)

Thank you very much for your patience and the example.
Could you possibly explain how I can adapt the json example to the chat model? Here is my attempt:
guidance.llm = guidance.llms.OpenAI("gpt-3.5-turbo")

valid_weapons = ["sword", "axe", "mace", "spear", "bow", "crossbow"]

# define a guidance program that adapts a proverb
program = guidance("""
{{#system}}You are a helpful agent{{/system}}

{{#user}}
Please generate character profile for an RPG game in JSON format.
{{/user}}

{{#assistant}}

```json
{
    "id": "{{id}}",
    "description": "{{description}}",
    "name": "{{gen 'name'}}",
    "age": {{gen 'age' pattern='[0-9]+' stop=','}},
    "armor": "{{#select 'armor'}}leather{{or}}chainmail{{or}}plate{{/select}}",
    "weapon": "{{select 'weapon' options=valid_weapons}}",
    "class": "{{gen 'class'}}",
    "mantra": "{{gen 'mantra' temperature=0.7}}",
    "strength": {{gen 'strength' pattern='[0-9]+' stop=','}},
    "items": [{{#geneach 'items' num_iterations=5 join=', '}}"{{gen 'this' temperature=0.7}}"{{/geneach}}]
}```"

{{/assistant}}""")

# execute the program on a specific proverb
executed_program = program(
    id="e1f491f7-7ab8-4dac-8c20-c92b5e7d883d",
    description="A quick and nimble fighter.",
)

leads to
AssertionError: When calling OpenAI chat models you must generate only directly inside the assistant role! The OpenAI API does not currently support partial assistant prompting.

I was hoping there is a way to tell the framework "here is a chat model but just use it as if it was not", meaning, under the hood, every time there is a gen, it will get restructured to get generation from the assistant role (or whatever the model interface requires)... In absence of that, what is the proper way to make the above example work?

To be honest, I think the best approach is what I mentioned before, to write a wrapper to treat the chat model interface as if it is a simple completion interface.

I also am confused by this. The docs are a bit lacking in terms of explaining the error. I'm not sure what partial completion vs other means exactly! How does the OpenAI api limit things here?
Also are there any docs for the handlebar gen patterns / DSL?

sam-cohan

Yeah, I had a look. It can be done, it would basically need rewriting the OpenAI class. https://github.com/microsoft/guidance/blob/main/guidance/llms/_openai.py
The main change would be to convert the prompt argument, to a single element array for messages coming in from a user.
It would only work for the simpler features of guidance, not the ones that need the logprobs for instance.  However, you can make the RPG and proverb example work (for instance) using this conversion.
If there's interest from the repository maintainers, I can do this over next weekend, but only if they think its okay with their vision for the project.

Thanks for your input @aabdullah-getguru . I was suggesting 1) but yeah I agree it would be useful for the project maintainers to give thumbs up on whether this is ok with them. If not, would love to know what workarounds they suggest...

is there an update on this?

I may be far off the mark, but it seems one key value of guidance is the re-use of keys/values in cache. I don't see how this is possible if using an api (like openai or anthropic). I would have thought this is only possible if running one's own llm... is that correct?

AssertionError: When calling OpenAI chat models you must generate only directly inside the assistant role! The OpenAI API does not currently support partial assistant prompting.

This means that you can have only one gen statement in the assistant role. You cannot have a second gen or any other statements. Based on my tests:

{{#assistant}} must be immediately followed by {{gen ... }}. No spaces, new lines or any characters in between.
{{gen ... }} must be followed by {{/assistant}} but you can have any plain text, spaces, new lines between them. However, you cannot have any library function like another gen, a select, if, etc.

I think the assertion also means that you cannot have any gen statement in other roles. But I'm not sure of this.
So the chat completions are limited to simple generations in the assistant role. You cannot do structured generations like the JSON @sam-cohan tried.
This is a HUGE bummer because I was able to successfully do structured JSON generations with the chat model using LongChain + Pydantic. So it should be possible and I was looking forward to replicating it in Guidance.
Why do we have this assertion? assert prompt.endswith("<|im_start|>assistant\n"), "When calling OpenAI chat...

hm,
FastAPI doesn't allow to send request body with GET request.
https://fastapi.tiangolo.com/tutorial/body/
also, some kind of specification of the URL, location header doesn't expected to be longer than 2048 characters
https://www.sistrix.com/ask-sistrix/technical-seo/site-structure/url-length-how-long-can-a-url-be#:~:text=The official documentation specifies a,must not exceed 2%2C048 characters.

URLs in XML sitemaps: maximum 2048 characters

as the conversation could be longer than 2048, especially if we consider to include some instruction to the LLM agent,
we should use POST instead of GET.

@sam-cohan @slundberg
Yeah, I had a look. There are two potential ways this could be done:
Approach 1.) Tweaking the OpenAI class, so you can use gpt3.5-turbo as a drop in replacement for davinci. https://github.com/microsoft/guidance/blob/main/guidance/llms/_openai.py
(Details below)

The main change would be to add a chat_mode called "completion_with_chat".
When this is set, and the user attempts to use a chat-model for simpler completion. Then on the line with the openai call, you instead convert the prompt argument, to a single element array for messages coming in from a user, to simulate conversation history.
You would also drop the logprobs argument which the chat api doesnt accept.
It would only work for the simpler features of guidance, not the ones that need the logprobs.  However, you can make the RPG and proverb example work (for instance) using this conversion. We'd probably want to log a warning message about some behaviors maybe being unsupported in this mode.

2.) Write a utility class that rewrites a completion targeted prompt to a chatgpt compatible one. Basically no text between the assistant opening/closing tags, they'd have to be manually pulled out into the previous user message.
If there's interest from the repository maintainers, I can open a PR for either approach over next weekend, but only if they think its okay with their vision for the project.

Could you elaborate more on this, please? I have only access to gpt3.5-turbo and need it to work on the RPG example. AFAIK in chat mode, only one gen statement is allowed inside the assistant role, such that one would can only generate a value (gen statement) per key. In order to fill a whole JSON I would need to add the key to the JSON and place the gen statement where its value should be generated, then after getting that result, update the json and append the next key and gen statement, repeat until done?

any support or updates for the newest guidance version?

any updates on this item please ?


[Feature request] raise PrismaClientKnownRequestError exceptions

When searching for an object that doesn't exist
await prisma.myModel.findUniqueOrThrow({
  where: {
    id: "does not exist",
  },
});

The error raised by prismock is an Error. Could be great if this was a PrismaClientKnownRequestError with a P2025 code.
I am using<EMAIL_ADDRESS>You can find a repo to reproduce here
Thanks anyway for the great job

Hello ! I opened a pull request that covers most of my use cases but meanwhile for those struggling with this, you can decorate the prismock delegates like this
import { Prisma } from '@prisma/client'
import { version as clientVersion } from<EMAIL_ADDRESS>import { PrismaClientKnownRequestError } from '@prisma/client/runtime/library'
import type { Delegate } from 'prismock/build/main/lib/delegate'
import { prisma } from './src/adapters/prisma/client'

jest.mock('@prisma/client', () => ({
  ...jest.requireActual('@prisma/client'),
  PrismaClient: jest.requireActual('prismock').PrismockClient,
}))

beforeAll(() => {
  /**
   * This patches prismock delegates to raise corresponding error
   * in case of entity not found exception
   */
  Prisma.dmmf.datamodel.models
    .map(({ name }) => ({
      name,
      delegateKey: name.replace(/(?:^\w|[A-Z]|\b\w)/g, (word, index) =>
        index === 0 ? word.toLowerCase() : word.toUpperCase()
      ),
    }))
    .forEach(({ name, delegateKey }) => {
      const delegate = prisma[
        delegateKey as keyof typeof prisma
      ] as unknown as Delegate

      const originalFindUniqueOrThrow = delegate.findUniqueOrThrow

      delegate.findUniqueOrThrow = async (
        ...args: Parameters<Delegate['findUniqueOrThrow']>
      ) => {
        try {
          return await originalFindUniqueOrThrow.apply(delegate, args)
        } catch {
          throw new PrismaClientKnownRequestError(`No ${name} found`, {
            code: 'P2025',
            clientVersion,
          })
        }
      }

      const originalFindFirstOrThrow = delegate.findFirstOrThrow

      delegate.findFirstOrThrow = async (
        ...args: Parameters<Delegate['findFirstOrThrow']>
      ) => {
        try {
          return await originalFindFirstOrThrow.apply(delegate, args)
        } catch {
          throw new PrismaClientKnownRequestError(`No ${name} found`, {
            code: 'P2025',
            clientVersion,
          })
        }
      }

      const originalUpdate = delegate.update

      delegate.update = async (...args: Parameters<Delegate['update']>) => {
        const updated = await originalUpdate.apply(delegate, args)

        if (!updated) {
          throw new PrismaClientKnownRequestError(`No ${name} found`, {
            code: 'P2025',
            clientVersion,
            meta: {
              cause: 'Record to update not found.',
              modelName: name,
            },
          })
        }

        return updated
      }

      const originalDelete = delegate.delete

      delegate.delete = async (...args: Parameters<Delegate['delete']>) => {
        try {
          return await originalDelete.apply(delegate, args)
        } catch {
          throw new PrismaClientKnownRequestError(`No ${name} found`, {
            code: 'P2025',
            clientVersion,
            meta: {
              cause: 'Record to delete does not exist.',
              modelName: name,
            },
          })
        }
      }
    })
})

Hello @paulsouche , huge thanks for your work. I believe I can close this issue as your PR #1105 is now closed


Docs algolia doesn't jump to search result

Describe the bug
I was searching for toHaveBeenCalledWith.
Used the cmd + k shortcut and pasted it in, result came up, I clicked on it and nothing happens. It navigates to https://vitest.dev/api/#tohavebeencalledwith which doesn't exist on that page.
Reproduction
https://user-images.githubusercontent.com/30958850/212980972-87a8a570-3d91-4f26-a5bb-5656cb6fc1af.mp4
System Info
n/a

Used Package Manager
npm
Validations

[X] Follow our Code of Conduct
[X] Read the Contributing Guidelines.
[X] Read the docs.
[X] Check that there isn't already an issue that reports the same bug to avoid creating a duplicate.
[X] Check that this is a concrete bug. For Q&A open a GitHub Discussion or join our Discord Chat Server.
[X] The provided reproduction is a minimal reproducible example of the bug.

API section was split into separate pages. algolia needs time to index it for the search functionality.

I see, I'll close this issue then.


Disable release workflow for v2

Motivation
v2 changes are being published with the latest tag so anyone that adds effection to their package will get v2 unless they specify otherwise.
Approach

~Disabled release workflow for v2 by commenting out the whole workflow~
Specify yarn publish --tag v2-beta command for the release workflow.

TODOs

[x] ~We need to do a release of v1 to take back the latest tag.~ Push the latest tags on all of the current versions of v1 effection packages.

 If we need it, it's in the git history.

Jonas pointed out that disabling the release workflow would stop the pre-release publishing. So I enabled the release workflow and added a tag flag to the publish command.


[test] Added _get_edit_form_inline_params for upstream tests

Allows me to add these tests in the sample_app with inline forms in organization (example openwisp_radius adds some inline forms!)

Coverage decreased (-0.2%) to 96.785% when pulling 5e123daf2ea1e9506558d7d3054745279c909289 on atb00ker:edit_param_upstream into 4f03d8ef3cc6a027e46d01a7ee7a6693c85581de on openwisp:master.

It's already merged in openwisp-users somehow, investigating.

Oh well: https://github.com/openwisp/openwisp-users/pull/135


fix incorrect nic name

Signed-off-by: Gao feng<EMAIL_ADDRESS>

@bergwolf
Hykins failed due to mount nfs failed, could you please check this? Thanks!
I0713 07:29:48.689520   10258 vm_console.go:96] SB[vm-gjFVAQMaPR] [CNL] hyper_modify_event modify event fd 3, 0x61e688, event 8193
I0713 07:29:49.259477   10258 vm_console.go:96] SB[vm-lOdpSnxhru] [CNL] mount.nfs4: rpc.statd is not running but is required for remote locking.
I0713 07:29:49.262624   10258 vm_console.go:96] SB[vm-lOdpSnxhru] [CNL] mount.nfs4: Either use '-o nolock' to keep locks local, or start statd.
I0713 07:29:49.277648   10258 vm_console.go:96] SB[vm-lOdpSnxhru] [CNL] mount.nfs4 -n <IP_ADDRESS>:/export /tmp//export cmd exit normally, status 32
I0713 07:29:49.281505   10258 vm_console.go:96] SB[vm-lOdpSnxhru] [CNL] cmd mount.nfs4 -n <IP_ADDRESS>:/export /tmp//export exit unexpectedly, status 8192
I0713 07:29:49.285639   10258 vm_console.go:96] SB[vm-lOdpSnxhru] [CNL] container sets up voulme failed
I0713 07:29:49.287730   10258 vm_console.go:96] SB[vm-lOdpSnxhru] [CNL] hyper send container inited event: error
I0713 07:29:49.289419   10258 vm_console.go:96] SB[vm-lOdpSnxhru] [CNL] wait for setup container rootfs failed
I0713 07:29:49.303818   10258 vm_console.go:96] SB[vm-lOdpSnxhru] [CNL] create child process pid=609 in the sandbox
I0713 07:29:49.314948   10258 vm_console.go:96] SB[vm-lOdpSnxhru] [CNL] fail to enter container ns: Bad file descriptor
I0713 07:29:49.315820   10258 vm_console.go:96] SB[vm-lOdpSnxhru] [CNL] hyper send enter container ns event: error

The code LGTM.

The hyeprhq/nfs-server-tester container failed to start as its hyperstart got HUP event after executing the first exec command. Then the nfs client container failed to connect to the nfs server.
07:29:29 I0713 07:29:30.440442   10258 vm_console.go:96] SB[vm-gjFVAQMaPR] [CNL] hyper_handle_event event EPOLLHUP or EPOLLERR, he 0x1721f48, fd 12, 10

It does not seem like hyperd closed the connection. There might be something wrong in exec cleanup code.

Let's track the CI failure at https://github.com/hyperhq/hyperstart/issues/317

retest this please, @hykins

hykins is running too slow and timed out. Maybe we should raise the time limit?

retest this please, @hykins


AnimationController : invalid overscroll value

Thank you for the awesome work.
I found an issue in latest version 3.0.4
The indicator is being bouncing up and down when i try to scroll while refreshing is ongoing.
══╡ EXCEPTION CAUGHT BY ANIMATION LIBRARY
╞═════════════════════════════════════════════════════════
The following assertion was thrown while notifying listeners for
AnimationController:
RangeMaintainingScrollPhysics.applyBoundaryConditions returned
invalid overscroll value.
The method was called to consider a change from 0.0 to -7.00854,
which is a delta of -7.0 units.
However, it returned an overscroll of 57.0 units, which has a
greater magnitude than the delta. The
applyBoundaryConditions method is only supposed to reduce the
possible range of movement, not
increase it.
The scroll extents are 0.0 .. 1145.0, and the viewport dimension is
679.0.

When the exception was thrown, this was the stack:
#0      ScrollPosition.applyBoundaryConditions.<anonymous closure>
(package:flutter/src/widgets/scroll_position.dart:481:9)
#1      ScrollPosition.applyBoundaryConditions
(package:flutter/src/widgets/scroll_position.dart:493:6)
#2      ScrollPosition.setPixels
(package:flutter/src/widgets/scroll_position.dart:262:33)
#3      ScrollPositionWithSingleContext.setPixels
(package:flutter/src/widgets/scroll_position_with_single_context.da
rt:82:18)
#4      DrivenScrollActivity._tick
(package:flutter/src/widgets/scroll_activity.dart:648:18)
#5      AnimationLocalListenersMixin.notifyListeners
(package:flutter/src/animation/listener_helpers.dart:155:19)
#6      AnimationController._tick
(package:flutter/src/animation/animation_controller.dart:830:5)
#7      Ticker._tick
(package:flutter/src/scheduler/ticker.dart:238:12)
#8      SchedulerBinding._invokeFrameCallback
(package:flutter/src/scheduler/binding.dart:1146:15)
#9      SchedulerBinding.handleBeginFrame.<anonymous closure>
(package:flutter/src/scheduler/binding.dart:1059:11)
#10     _LinkedHashMapMixin.forEach
(dart:collection-patch/compact_hash.dart:614:13)
#11     SchedulerBinding.handleBeginFrame
(package:flutter/src/scheduler/binding.dart:1057:17)
#12     SchedulerBinding._handleBeginFrame
(package:flutter/src/scheduler/binding.dart:976:5)
#16     _invoke1 (dart:ui/hooks.dart:170:10)
#17     PlatformDispatcher._beginFrame
(dart:ui/platform_dispatcher.dart:286:5)
#18     _beginFrame (dart:ui/hooks.dart:104:31)
(elided 3 frames from dart:async)

The AnimationController notifying listeners was:
  AnimationController#46a62(▶ -7.009; for DrivenScrollActivity)
═══════════════════════════════════════════════════════════════════
═════════════════════════════════

Another exception was thrown:
RangeMaintainingScrollPhysics.applyBoundaryConditions returned
invalid overscroll value.

Another exception was thrown:
RangeMaintainingScrollPhysics.applyBoundaryConditions returned
invalid overscroll value.

Another exception was thrown:
RangeMaintainingScrollPhysics.applyBoundaryConditions returned
invalid overscroll value.

Another exception was thrown:
RangeMaintainingScrollPhysics.applyBoundaryConditions returned
invalid overscroll value.

Another exception was thrown:
RangeMaintainingScrollPhysics.applyBoundaryConditions returned
invalid overscroll value.

Another exception was thrown:
RangeMaintainingScrollPhysics.applyBoundaryConditions returned
invalid overscroll value.

Another exception was thrown:
RangeMaintainingScrollPhysics.applyBoundaryConditions returned
invalid overscroll value.

Another exception was thrown:
RangeMaintainingScrollPhysics.applyBoundaryConditions returned
invalid overscroll value.

Another exception was thrown:
RangeMaintainingScrollPhysics.applyBoundaryConditions returned
invalid overscroll value.

Another exception was thrown:
RangeMaintainingScrollPhysics.applyBoundaryConditions returned
invalid overscroll value.

Another exception was thrown:
RangeMaintainingScrollPhysics.applyBoundaryConditions returned
invalid overscroll value.

Another exception was thrown:
RangeMaintainingScrollPhysics.applyBoundaryConditions returned
invalid overscroll value.

Another exception was thrown:
RangeMaintainingScrollPhysics.applyBoundaryConditions returned
invalid overscroll value.

Another exception was thrown:
RangeMaintainingScrollPhysics.applyBoundaryConditions returned
invalid overscroll value.

Another exception was thrown:
RangeMaintainingScrollPhysics.applyBoundaryConditions returned
invalid overscroll value.

Another exception was thrown:
RangeMaintainingScrollPhysics.applyBoundaryConditions returned
invalid overscroll value.

Can you give an example

I know it is too complicate usecase, so I just give you a simple diagram.
NestedScrollView(
   headerSliverBuilder: SliverOverlapAbsorber(
       handle: NestedScrollView.sliverOverlapAbsorberHandleFor(_),
       sliver: SliverAppBar(
          // has flexible title and pinned bottom
       )
   )
   body: NotificationListener( // which moves NestedScrollView's scroll position on CustomScrollView scroll update.
       PageView(
          EasyRefresh(
             CustomScrollView(
                 SliverPinnedOverlapInjector(
                          handle:
                              NestedScrollView.sliverOverlapAbsorberHandleFor(_)),
                 <EasyRefreshIndicatorHeader>,
                 Other slivers..
                 <EasyRefreshIndicatorFooter>,
             )
          )
      )
    )
)

It is fairly incomplete but i think you can guess some potential problems here.
Nevertheless i made a custom ScrollPhysics to prevent overscrolling while refreshing is ongoing and it worked.

class ConditionalScrollPhysics extends ScrollPhysics {
  const ConditionalScrollPhysics({
    required this.parent,
    required this.shouldAccept,
  }) : super(parent: parent);

  @override
  final ScrollPhysics parent;
  final bool Function(ScrollMetrics position) shouldAccept;

  @override
  ConditionalScrollPhysics applyTo(ScrollPhysics? ancestor) {
    return ConditionalScrollPhysics(
      parent: buildParent(ancestor) ?? parent,
      shouldAccept: shouldAccept,
    );
  }

  @override
  bool shouldAcceptUserOffset(ScrollMetrics position) {
    if (!shouldAccept(position)) return false;
    return super.shouldAcceptUserOffset(position);
  }

  @override
  double applyBoundaryConditions(ScrollMetrics position, double value) {
    var s = super.applyBoundaryConditions(position, value);
    return max(s, 0);
  }
}

and
CustomScrollView(
                  controller: scrollController,
                  physics: ConditionalScrollPhysics(
                    parent: RangeMaintainingScrollPhysics(),
                    shouldAccept: (e) {
                      return NOT_REFREHSING;
                    },
                  ),
...


Rename to --media-range-track-background-color

Related to #141
Rename --media-range-track-background to --media-range-track-background-color

Can you check the merge conflict? Is it that another var was changed in the table?

good call, we're using this in the mux-player's! heads up @cjpillsbury if this gets merged


Writing no longer works after updating to version 1.3.3 due to timeout

After updating firestarter to version 1.3.3 the write command fails with a timeout every time while other commands still work:
[frank@Mac:~]% pipx upgrade firestarter
upgraded package firestarter from 1.3.0 to 1.3.3 (location: /Users/frank/.local/pipx/venvs/firestarter)
[frank@Mac:~]% firestarter --version
Firestarter version: 1.3.3
[frank@Mac:~]% firestarter blank M27C1001
EPROM M27C1001 is blank.
[frank@Mac:~]% firestarter write M27C1001 tos_ger_C301937-006_EE.bin
Writing tos_ger_C301937-006_EE.bin to M27C1001
Error: Timeout, no response on /dev/cu.usbmodem146401
Error while writing: Timeout, no response on /dev/cu.usbmodem146401

This happens both on macOS (Intel iMac)  and also on Raspberry Pi OS Bookworm (RPI 4).

After upgrading firestarter to version 1.3.6 and the firmware to 1.3.5 it is now even worse.
Not even the blank check works anymore:
[frank@Mac:~]% pipx upgrade firestarter
upgraded package firestarter from 1.3.2 to 1.3.6 (location: /Users/frank/.local/pipx/venvs/firestarter)
[frank@Mac:~]% firestarter fw --install
Reading firmware version...
Current firmware version: 1.3.4, for controller: uno
New firmware version available: 1.3.5, for controller: uno
Installing firmware...
Downloading firmware...
Flashing firmware...
Firmware successfully updated.
[frank@Mac:~]% firestarter fw
Reading firmware version...
Current firmware version: 1.3.5, for controller: uno
You have the latest firmware version: 1.3.5, for controller: uno
[frank@Mac:~]% firestarter blank M27C1001
Error: Timeout, no response on /dev/cu.usbmodem146301
Traceback (most recent call last):
  File "/Users/frank/.local/bin/firestarter", line 8, in <module>
    sys.exit(main())
             ~~~~^^
  File "/Users/frank/.local/pipx/venvs/firestarter/lib/python3.13/site-packages/firestarter/main.py", line 204, in main
    return blank_check(args.eprom)
  File "/Users/frank/.local/pipx/venvs/firestarter/lib/python3.13/site-packages/firestarter/eprom_operations.py", line 292, in blank_check
    resp, info = wait_for_response(ser)
                 ~~~~~~~~~~~~~~~~~^^^^^
  File "/Users/frank/.local/pipx/venvs/firestarter/lib/python3.13/site-packages/firestarter/serial_comm.py", line 204, in wait_for_response
    raise Exception(msg)
Exception: Timeout, no response on /dev/cu.usbmodem146301
[frank@Mac:~]% firestarter write M27C1001 tos_ger_C301937-006_EE.bin
Writing tos_ger_C301937-006_EE.bin to M27C1001
Error: Timeout, no response on /dev/cu.usbmodem146301---------------------------------| 0.0%
Error while writing: Timeout, no response on /dev/cu.usbmodem146301

OK, after unplugging and re-plugging the USB cable now it seems to be working again with version 1.3.6 and fw 1.3.5:
[frank@Mac:~]% firestarter blank M27C1001
ERROR: Memory is not blank, at 0x000000, value: 0x00
Blank check failed for M27C1001
[frank@Mac:~]% firestarter write -b M27C1001 tos_ger_C301937-006_EE.bin
Writing tos_ger_C301937-006_EE.bin to M27C1001
Address: 0x1FE00 - 0x20000 |████████████████████████████████████████████████████████████| 100.0% - 35.25s

Write complete in: 35.25 seconds
[frank@Mac:~]% firestarter blank M27C1001
ERROR: Memory is not blank, at 0x000000, value: 0x00
Blank check failed for M27C1001
[frank@Mac:~]% firestarter read M27C1001
Reading EPROM M27C1001, saving to M27C1001.bin
Address: 0x1FE00 - 0x20000 |████████████████████████████████████████████████████████████| 100.0% - 14.82s

Read complete in: 14.83 seconds
Data saved to M27C1001.bin
[frank@Mac:~]% diff M27C1001.bin tos_ger_C301937-006_EE.bin
[frank@Mac:~]%

So it's the blank check that isn't working now?
On Fri, 13 Dec 2024, 19:06 Frank Danapfel, @.***> wrote:

OK, after unplugging and re-plugging the USB cable now it seems to be
working again with version 1.3.6 and fw 1.3.5:
@.:~]% firestarter blank M27C1001
ERROR: Memory is not blank, at 0x000000, value: 0x00
Blank check failed for M27C1001
@.:~]% firestarter write -b M27C1001 tos_ger_C301937-006_EE.bin
Writing tos_ger_C301937-006_EE.bin to M27C1001
Address: 0x1FE00 - 0x20000 |████████████████████████████████████████████████████████████| 100.0% - 35.25s
Write complete in: 35.25 seconds
@.:~]% firestarter blank M27C1001
ERROR: Memory is not blank, at 0x000000, value: 0x00
Blank check failed for M27C1001
@.:~]% firestarter read M27C1001
Reading EPROM M27C1001, saving to M27C1001.bin
Address: 0x1FE00 - 0x20000 |████████████████████████████████████████████████████████████| 100.0% - 14.82s
Read complete in: 14.83 seconds
Data saved to M27C1001.bin
@.:~]% diff M27C1001.bin tos_ger_C301937-006_EE.bin
@.:~]%
—
Reply to this email directly, view it on GitHub
https://github.com/henols/firestarter_app/issues/11#issuecomment-2541987061,
or unsubscribe
https://github.com/notifications/unsubscribe-auth/AATJAY76NABX3FL2ER7PLB32FMO2VAVCNFSM6AAAAABTPS67PSVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDKNBRHE4DOMBWGE
.
You are receiving this because you are subscribed to this thread.Message
ID: @.***>

So it's the blank check that isn't working now?

As mentioned in my previous comment after unplugging and replugging the Arduino USB connection to the Mac after the firmware update the blank check and also reading and writing work again without timeouts.

Perfect, happy to have fixed it without knowing...
Maybe it was a missmatch between app and fw.
On Sat, 14 Dec 2024, 10:59 Frank Danapfel, @.***> wrote:

So it's the blank check that isn't working now?
As mentioned in my previous comment after unplugging and replugging the
Arduino USB connection to the Mac after the firmware update the blank check
and also reading and writing work again without timeouts.
—
Reply to this email directly, view it on GitHub
https://github.com/henols/firestarter_app/issues/11#issuecomment-2543034349,
or unsubscribe
https://github.com/notifications/unsubscribe-auth/AATJAY3MGZOOTRB7BKVEMBL2FP6PLAVCNFSM6AAAAABTPS67PSVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDKNBTGAZTIMZUHE
.
You are receiving this because you commented.Message ID:
@.***>

Thanks for the clarification, will dig into it asap.
On Sat, 14 Dec 2024, 11:20 Frank Danapfel, @.***> wrote:

Sorry, spoke to soon, now the blank check is failing again consistently
even after unplugging and replugging the programmer multiple times with
latest firmware and app:
@.:~]% firestarter --version
Firestarter version: 1.3.6
@.:~]% firestarter fw
Reading firmware version...
Current firmware version: 1.3.5, for controller: uno
You have the latest firmware version: 1.3.5, for controller: uno
@.:~]% firestarter hw
Reading hardware revision...
Hardware revision: Rev2
@.:~]% firestarter vpp
Reading VPP voltage
VPP: 13.00v, Internal VCC: 4.92v^C
Prosess interrupted.
@.:~]% firestarter blank TMS27C010A
Error: Timeout, no response on /dev/cu.usbmodem146301
Traceback (most recent call last):
File "/Users/frank/.local/bin/firestarter", line 8, in
sys.exit(main())
~~~~^^
File "/Users/frank/.local/pipx/venvs/firestarter/lib/python3.13/site-packages/firestarter/main.py", line 204, in main
return blank_check(args.eprom)
File "/Users/frank/.local/pipx/venvs/firestarter/lib/python3.13/site-packages/firestarter/eprom_operations.py", line 292, in blank_check
resp, info = wait_for_response(ser)
~~~~~~~~~~~~~~~~~^^^^^
File "/Users/frank/.local/pipx/venvs/firestarter/lib/python3.13/site-packages/firestarter/serial_comm.py", line 204, in wait_for_response
raise Exception(msg)
Exception: Timeout, no response on /dev/cu.usbmodem146301
@.:~]%
If I switch back to version 1.3.2 of the firestarter app while keeping
fw1.3.5 the error no longer occurs:
@.:~]% firestarter --version
Firestarter version: 1.3.6
@.:~]% pipx uninstall firestarter
uninstalled firestarter! ✨ 🌟 ✨
@.:~]% pipx install firestarter==1.3.2
installed package firestarter 1.3.2, installed using Python 3.13.1
These apps are now globally available
- firestarter
done! ✨ 🌟 ✨
@.:~]% firestarter --version
Firestarter version: 1.3.2
@.***:~]% firestarter fw
Reading firmware version...
Current firmware version: 1.3.5, for controller: uno
You have the latest firmware version: 1.3.5, for controller: uno
@.:~]% firestarter blank TMS27C010A
EPROM TMS27C010A is blank.
@.:~]%
—
Reply to this email directly, view it on GitHub
https://github.com/henols/firestarter_app/issues/11#issuecomment-2543043430,
or unsubscribe
https://github.com/notifications/unsubscribe-auth/AATJAY37NVBBN2Y2DF6DCB32FQA7BAVCNFSM6AAAAABTPS67PSVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDKNBTGA2DGNBTGA
.
You are receiving this because you commented.Message ID:
@.***>

Changed the timeout for responses that do a blank check

Thank you! Just verified that it works again with version 1.3.7:
[frank@Mac:~]% pipx upgrade firestarter
upgraded package firestarter from 1.3.2 to 1.3.7 (location: /Users/frank/.local/pipx/venvs/firestarter)
[frank@Mac:~]% firestarter blank M27C1001
EPROM M27C1001 is blank.
[frank@Mac:~]%

Awesome! Keep up the good work on reporting buggs!


Select data mapped to escher

The user can select which individual sample to visualize the reaction scores for using Escher
The user can select (a) a particular subgroup of samples, and visualize the average reaction scores for that subgroup, or (b) the difference between the average scores of two subgroups – I believe Escher supports visualizing differences.

Implemented (2), not sure we actually want (1). Closing for now, but we can address (1) later if need be.


improve support for printing command usage

Allow the user to use "-h" or "help" before a command name to print it's usage.
Closes #211

I wonder why the Appveyor check was not run on this PR?  I and another have had issues getting it to pass on cmd/x edits.

Thanks!


Support multiple alert manager replicas

In this helm chart it looks like 1 url is ever used/considered: https://github.com/SigNoz/charts/blob/bb53857ff7deff14b779e18475bec32b790327ea/charts/signoz/templates/_helpers.tpl#L298
Ask:
When running multiple replicas of alert mamager (https://github.com/SigNoz/alertmanager) allow for any alerts to be sent to 1 or more configured replicas.
Taken from the Readme of the signoz fork of alertmanager it supports the overall ask of this issue, it shows how it expects prometheus to point at multiple alert manager instances:

To point your Prometheus 1.4, or later, instance to multiple Alertmanagers, configure them in your prometheus.yml configuration file, for example:

alerting:
  alertmanagers:
  - static_configs:
    - targets:
      - alertmanager1:9093
      - alertmanager2:9093
      - alertmanager3:9093

Important: Do not load balance traffic between Prometheus and its Alertmanagers, but instead point Prometheus to a list of all Alertmanagers. The Alertmanager implementation expects all alerts to be sent to all Alertmanagers to ensure high availability.

Here are more links to code where changes are likely needed:

https://github.com/SigNoz/charts/blob/bb53857ff7deff14b779e18475bec32b790327ea/charts/signoz/templates/query-service/statefulset.yaml#L134
https://github.com/SigNoz/charts/blob/bb53857ff7deff14b779e18475bec32b790327ea/charts/signoz/templates/query-service/configmap.yaml#L18

Hi @BryanFauble,
Thank you for opening this issue!
Would you be willing to contribute a PR for this?

Thanks @grandwizard28 ,
This is something that gives a trivial benefit so I don't want to spend time on it for now.
Something of a larger benefit that I started to look at was starting to consider how k8s secrets might be used to configure things like the clickhouse password. However, there was some more work to consider how stuff like the traces url could also be fed in as it includes the username/password as well:

https://github.com/SigNoz/charts/compare/main...BryanFauble:charts-signoz:main#
https://github.com/BryanFauble/charts-signoz/blob/7a29318aabc8bccab36a4db3aaf3bf7e71fb27df/charts/signoz/templates/_clickhouse.tpl#L234

The secretFrom stanza was something that the underlying clickhouse implementation is doing: https://altinity.com/blog/clickhouse-confidential-using-kubernetes-secrets-with-the-altinity-operator

Let's discuss this on a separate issue: https://github.com/SigNoz/charts/issues/525.
I'd like to keep this open for supporting multiple alert managers :)


Updated fabric.mod.json

changed the required depends so allow for future updates to fabric launcher

Superseeded by https://github.com/InsomniaKitten/Couplings/commit/ea614aa4cd4edd64ddba9c3df665ce88f4e1b70b


Github integration not available for products created before enabling the feature

Bug description
While setting up the Github integration in our Dojo I could only enable it for new products; existing product didn't show the github config form.
After setting SystemSettings.enable_github and configuring a github access token, I could not select it for existing product, but the option shows when creating a new product.
Steps to reproduce
Steps to reproduce the behavior:

Add new product
Go to Configuration > System Settings and check "Enable GITHUB integration"
Go to Configuration > Github and add Github token
Either
a. Open a new Product form, scroll down, notice the github config (see screenshot)
b. Edit the product from the first step, scroll down in the form, notice the github config missing.

Expected behavior
Show the github config form for existing products too.
Screenshots
This form is not showing while editing existing products:

Additional context (optional)
Suspicious code:
https://github.com/DefectDojo/django-DefectDojo/blob/4dfb3a43651846696823e2d3d7bd5ec485b54276/dojo/product/views.py#L899-L905
github_inst is always empty for existing products after enabling the feature, so it will never render the form for those given the condition in L899

slack thread

PR submitted: https://github.com/DefectDojo/django-DefectDojo/pull/7614


Update Set-ATPBuiltInProtectionRule.md

Need clarification that Dynamic Distribution Groups cannot be specified in Groups option of policies. They are accepted by command, but will not work as expected.
https://o365exchange.visualstudio.com/IP Engineering/_workitems/edit/3010772

Docs Build status updates of commit 71dff91:
:white_check_mark: Validation status: passed

File
Status
Preview URL
Details

exchange/exchange-ps/exchange/Set-ATPBuiltInProtectionRule.md
:white_check_mark:Succeeded
View (exchange-ps)

For more details, please refer to the build report.
Note: Broken links written as relative paths are included in the above build report. For broken links written as absolute paths or external URLs, see the broken link report.
For any questions, please:Try searching the docs.microsoft.com contributor guidesPost your question in the Docs support channel

@JohanFreelancer9

Docs Build status updates of commit 768269a:
:white_check_mark: Validation status: passed

File
Status
Preview URL
Details

exchange/exchange-ps/exchange/Set-ATPBuiltInProtectionRule.md
:white_check_mark:Succeeded
View (exchange-ps)

For more details, please refer to the build report.
Note: Broken links written as relative paths are included in the above build report. For broken links written as absolute paths or external URLs, see the broken link report.
For any questions, please:Try searching the docs.microsoft.com contributor guidesPost your question in the Docs support channel

Docs Build status updates of commit 811924d:
:white_check_mark: Validation status: passed

File
Status
Preview URL
Details

exchange/exchange-ps/exchange/Set-ATPBuiltInProtectionRule.md
:white_check_mark:Succeeded
View (exchange-ps)

For more details, please refer to the build report.
Note: Broken links written as relative paths are included in the above build report. For broken links written as absolute paths or external URLs, see the broken link report.
For any questions, please:Try searching the docs.microsoft.com contributor guidesPost your question in the Docs support channel


Promise timeout

Pull Request Test Coverage Report for Build 78

34 of 34 (100.0%)  changed or added relevant lines in 3 files are covered.
No unchanged relevant lines lost coverage.
Overall coverage increased (+0.1%) to 99.55%

Totals

Change from base Build 76:
0.1%

Covered Lines:
150

Relevant Lines:
151

💛  - Coveralls


new pages should have amp versions.

Currently on posts have amp versions on news. As of now ghost does not support /amp/ for pages.

Unless I'm missing something, it appears that Ghost now supports "built-in integration for Google AMP". Moreover, this is enabled by default.
It appears you can transform each post to an AMP version by adding /amp to the end of the URLs.
This appears to work with our posts so far.
See
https://www.freecodecamp.org/news/helm-charts-tutorial-the-kubernetes-package-manager-explained/
compared to
https://www.freecodecamp.org/news/helm-charts-tutorial-the-kubernetes-package-manager-explained/amp

Unless I'm missing something, it appears that Ghost now supports "built-in integration for Google AMP". Moreover, this is enabled by default.
It appears you can transform each post to an AMP version by adding /amp to the end of the URLs.
This appears to work with our posts so far.
See
https://www.freecodecamp.org/news/helm-charts-tutorial-the-kubernetes-package-manager-explained/
compared to
https://www.freecodecamp.org/news/helm-charts-tutorial-the-kubernetes-package-manager-explained/amp

Yes posts ( articles ) have amp version, but not pages. Initially we had many of our organizational pages ported to ghost. Since then we moved them to articles so this feature is not required on our side anymore.
I am closing this accordingly, please feel free to re-open if the issue has not been resolved.

Yes posts ( articles ) have amp version, but not pages. Initially we had many of our organizational pages ported to ghost. Since then we moved them to articles so this feature is not required on our side anymore.
I am closing this accordingly, please feel free to re-open if the issue has not been resolved.

Unsubscribe
On Sun, Jan 3, 2021, 1:41 PM Ahmad Abdolsaheb<EMAIL_ADDRESS>wrote:

Closed #37939 https://github.com/freeCodeCamp/freeCodeCamp/issues/37939.
—
You are receiving this because you are subscribed to this thread.
Reply to this email directly, view it on GitHub
https://github.com/freeCodeCamp/freeCodeCamp/issues/37939#event-4162699954,
or unsubscribe
https://github.com/notifications/unsubscribe-auth/AMS6FB6XGMD343Q74KJYX43SYC25XANCNFSM4J3APVTQ
.

Unsubscribe
On Sun, Jan 3, 2021, 1:41 PM Ahmad Abdolsaheb<EMAIL_ADDRESS>wrote:

Closed #37939 https://github.com/freeCodeCamp/freeCodeCamp/issues/37939.
—
You are receiving this because you are subscribed to this thread.
Reply to this email directly, view it on GitHub
https://github.com/freeCodeCamp/freeCodeCamp/issues/37939#event-4162699954,
or unsubscribe
https://github.com/notifications/unsubscribe-auth/AMS6FB6XGMD343Q74KJYX43SYC25XANCNFSM4J3APVTQ
.


Update to boost 1.85.0

https://www.boost.org/users/history/version_1_85_0.html

[ 85%] Building CXX object packages/pecos/src/CMakeFiles/pecos_src.dir/MeixnerOrthogPolynomial.cpp.o
In file included from /tmp/build/dakota-6.19.0-public-src-cli/src/dakota_preproc_util.cpp:11:
/tmp/build/dakota-6.19.0-public-src-cli/src/WorkdirHelper.hpp:100:48: error: no member named 'directory_iterator' in namespace 'boost::filesystem'
typedef boost::filter_iterator<MatchesWC, bfs::directory_iterator> glob_iterator;
                                          ~~~~~^

New boost version available;
https://www.boost.org/users/history/version_1_86_0.html


HDDS-4487. SCM can avoid using RETRIABLE_DATANODE_COMMAND for datanode deletion commands.

What changes were proposed in this pull request?
RETRIABLE_DATANODE_COMMAND are used to retry deletion commands to datanode in case of timeout. SCM can avoid using RETRIABLE_DATANODE_COMMAND for deletion commands because the service would be sending any pending transactions in the next iteration.
What is the link to the Apache JIRA
https://issues.apache.org/jira/browse/HDDS-4487
How was this patch tested?
Tested Manually

@aryangupta1998 Thanks for the contribution! I have committed the PR to master branch.

@aryangupta1998 RetriableDatanodeEventWatcher is currently created for watching over deletion command ACK. Can you please create a jira to remove that as well? I forgot to check that while reviewing the PR.


Document configuration options

In a similar, yet slightly different, vein as #369 I think it would be very helpful to have documentation on the kinds of configuration that is allowable in pyveg. For instance, it is unclear what the available options are for output_location_type or collections_to_use. A simple listing of all of the user-modifiable options that go in the configuration file would clear this up.

This is implemented in the new README.md and https://pyveg.readthedocs.io/en/latest/. Will close the issue now.


Update ruby base version and dependencies

redis-rb 4 and 5 changed how the reconnect works

Any chance we could get this merged and released?

@prognostikos Released as v1.3.0
Sorry this seems to have gotten lost within other tasks and idled around here.


Improve AND filter operator

Related issues: #9402, #8837
There are some improvements we want to do for AND filter operator:

Avoid scanning the docs from the low selectivity filter when applying AND
Skip using indexes when the selected docs are already very few. Using scan instead
When applying bitmap to a scanned operator, push down the limit to avoid full scan (or evaluate lazily)

Can you please see if docs can be iterated per the "order by" clause if the order by column also happens to be in the sorted column? This is useful if say, segments are sorted by the timestamp column but the query has "order by timestamp desc". In that case, in addition to limit pushdown applyAnd could passed a flag - ascOrDesc - to use either the forward or reverse bitmap iterator.

@ashishkf Good point! There are actually some discussion about providing reversed doc iterator in #8979. We should consider adding a method to return the reversed iterator, and evaluate applyAnd lazily.